{"version":3,"sources":["node_modules/util/support/isBufferBrowser.js","node_modules/minimatch/minimatch.js","node_modules/path/path.js","node_modules/util/node_modules/inherits/inherits_browser.js","node_modules/lodash/lodash.js","node_modules/util/util.js","node_modules/brace-expansion/index.js","(webpack)/buildin/module.js","node_modules/concat-map/index.js","node_modules/balanced-match/index.js","node_modules/hammerjs/hammer.js","node_modules/rxjs/_esm2015/internal/util/isFunction.js","node_modules/rxjs/_esm2015/internal/config.js","node_modules/rxjs/_esm2015/internal/util/hostReportError.js","node_modules/rxjs/_esm2015/internal/Observer.js","node_modules/rxjs/_esm2015/internal/util/isArray.js","node_modules/rxjs/_esm2015/internal/util/isObject.js","node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js","node_modules/rxjs/_esm2015/internal/Subscription.js","node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js","node_modules/rxjs/_esm2015/internal/Subscriber.js","node_modules/rxjs/_esm2015/internal/symbol/observable.js","node_modules/rxjs/_esm2015/internal/util/identity.js","node_modules/rxjs/_esm2015/internal/util/pipe.js","node_modules/rxjs/_esm2015/internal/Observable.js","node_modules/rxjs/_esm2015/internal/util/toSubscriber.js","node_modules/rxjs/_esm2015/internal/util/canReportError.js","node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js","node_modules/rxjs/_esm2015/internal/SubjectSubscription.js","node_modules/rxjs/_esm2015/internal/Subject.js","node_modules/rxjs/_esm2015/internal/util/isScheduler.js","node_modules/rxjs/_esm2015/internal/operators/map.js","node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js","node_modules/rxjs/_esm2015/internal/symbol/iterator.js","node_modules/rxjs/_esm2015/internal/util/isArrayLike.js","node_modules/rxjs/_esm2015/internal/util/isPromise.js","node_modules/rxjs/_esm2015/internal/util/subscribeTo.js","node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js","node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js","node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js","node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js","node_modules/rxjs/_esm2015/internal/observable/from.js","node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js","node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js","node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js","node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js","node_modules/rxjs/_esm2015/internal/util/isIterable.js","node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js","node_modules/rxjs/_esm2015/internal/innerSubscribe.js","node_modules/rxjs/_esm2015/internal/operators/mergeMap.js","node_modules/rxjs/_esm2015/internal/operators/mergeAll.js","node_modules/rxjs/_esm2015/internal/observable/fromArray.js","node_modules/rxjs/_esm2015/internal/observable/merge.js","node_modules/rxjs/_esm2015/internal/operators/refCount.js","node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js","node_modules/rxjs/_esm2015/internal/operators/multicast.js","node_modules/rxjs/_esm2015/internal/operators/share.js","node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js","src/environments/environment.ts","node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js","node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/platform-browser.js","node_modules/rxjs/_esm2015/internal/observable/of.js","node_modules/rxjs/_esm2015/internal/operators/concatMap.js","node_modules/rxjs/_esm2015/internal/operators/filter.js","node_modules/@angular/common/__ivy_ngcc__/fesm2015/http.js","src/app/decorators/component-lookup.ts","node_modules/tslib/tslib.es6.js","src/app/configuration/api-mapping.ts","src/app/configuration/persona-types.ts","src/app/configuration/param-mapping.ts","src/app/configuration/default-params.ts","src/app/api/refresh-handler.service.ts","src/app/authentication/authentication.service.ts","src/app/filter_selection/filter-choices.service.ts","src/app/configuration/persona-levels.ts","src/app/configuration/nav-filter-selection.ts","src/app/filter_selection/details/detail-choices.service.ts","src/app/dashboards/selected-tab.service.ts","src/app/api/persona.service.ts","src/app/preferences/preference-selection.service.ts","src/app/navigation/navbar-builder.service.ts","src/app/control_tower/selected-manager.service.ts","src/app/configuration/param-logic.service.ts","src/app/business_review/md5.ts","node_modules/rxjs/_esm2015/internal/BehaviorSubject.js","node_modules/rxjs/_esm2015/internal/util/EmptyError.js","node_modules/rxjs/_esm2015/internal/OuterSubscriber.js","node_modules/rxjs/_esm2015/internal/InnerSubscriber.js","node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js","node_modules/rxjs/_esm2015/internal/observable/combineLatest.js","node_modules/rxjs/_esm2015/internal/observable/empty.js","node_modules/rxjs/_esm2015/internal/observable/defer.js","node_modules/rxjs/_esm2015/internal/operators/concatAll.js","node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js","node_modules/rxjs/_esm2015/internal/operators/takeLast.js","node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js","node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js","node_modules/rxjs/_esm2015/internal/operators/last.js","node_modules/rxjs/_esm2015/internal/operators/catchError.js","node_modules/rxjs/_esm2015/internal/operators/take.js","node_modules/rxjs/_esm2015/internal/operators/first.js","node_modules/rxjs/_esm2015/internal/operators/every.js","node_modules/rxjs/_esm2015/internal/operators/switchMap.js","node_modules/rxjs/_esm2015/internal/observable/concat.js","node_modules/rxjs/_esm2015/internal/operators/scan.js","node_modules/rxjs/_esm2015/internal/util/noop.js","node_modules/rxjs/_esm2015/internal/operators/tap.js","node_modules/rxjs/_esm2015/internal/operators/finalize.js","node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js","node_modules/rxjs/_esm2015/internal/operators/startWith.js","node_modules/rxjs/_esm2015/internal/operators/reduce.js","src/app/business_review/br-params.service.ts","src/app/api/parameter-resolver.service.ts","node_modules/rxjs/_esm2015/internal/observable/throwError.js","src/app/api/cached-response-repo.service.ts","src/app/api/stack-request.service.ts","src/app/api/request-handler.ts","src/app/api/api.service.ts","src/app/preferences/preference-api-connector.service.ts","src/app/business_review/br-history-range.service.ts","src/app/business_review/presentation-toggle-handler.service.ts","src/app/business_review/presentation-select.service.ts","src/app/business_review/detail-query-params.service.ts","src/app/business_review/nodatacheck.service.ts","src/app/tiles/base/base-tile.component.ts","src/app/tiles/base/tile.component.ts","src/app/api/state-handler/state-handler.component.html","src/app/api/state-handler/state-handler.component.ts","node_modules/rxjs/_esm2015/internal/scheduler/Action.js","node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js","node_modules/rxjs/_esm2015/internal/Scheduler.js","node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js","node_modules/rxjs/_esm2015/internal/scheduler/async.js","node_modules/rxjs/_esm2015/internal/operators/audit.js","node_modules/rxjs/_esm2015/internal/util/isNumeric.js","node_modules/rxjs/_esm2015/internal/observable/timer.js","node_modules/rxjs/_esm2015/internal/operators/auditTime.js","node_modules/@progress/kendo-charts/dist/es2015/common/constants.js","node_modules/@progress/kendo-charts/dist/es2015/common/is-array.js","node_modules/@progress/kendo-charts/dist/es2015/common/add-class.js","node_modules/@progress/kendo-charts/dist/es2015/common/remove-class.js","node_modules/@progress/kendo-drawing/dist/es2015/common/class.js","node_modules/@progress/kendo-drawing/dist/es2015/core/has-observers.js","node_modules/@progress/kendo-drawing/dist/es2015/util/defined.js","node_modules/@progress/kendo-drawing/dist/es2015/core/options-store.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-accessors.js","node_modules/@progress/kendo-drawing/dist/es2015/util/round.js","node_modules/@progress/kendo-drawing/dist/es2015/util/constants.js","node_modules/@progress/kendo-drawing/dist/es2015/util/rad.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/matrix.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/to-matrix.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/point.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/size.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/rect.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/transformation.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/transform.js","node_modules/@progress/kendo-drawing/dist/es2015/util/definition-id.js","node_modules/@progress/kendo-drawing/dist/es2015/util/value-or-default.js","node_modules/@progress/kendo-drawing/dist/es2015/util/is-transparent.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/element.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/ellipse-extreme-angles.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/circle.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/paintable.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/measurable.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-geometry.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/circle.js","node_modules/@progress/kendo-drawing/dist/es2015/util/deg.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/close.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/constants.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/close-or-less.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/arc.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/line-intersection.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/elements-array.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/geometry-elements-array.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/is-out-of-end-point.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/calculate-curve-at.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/to-cubic-polynomial.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/complex-number.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/solve-cubic-equation.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/has-roots-in-range.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/line-intersections-count.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-points.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/segment.js","node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/curve-intersections-count.js","node_modules/@progress/kendo-drawing/dist/es2015/util/last.js","node_modules/@progress/kendo-drawing/dist/es2015/parsing/shape-map.js","node_modules/@progress/kendo-drawing/dist/es2015/parsing/parse-path.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/utils/elements-bounding-box.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/utils/elements-clippend-bounding-box.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/path.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/arc.js","node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/lru-cache.js","node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/util.js","node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/text-metrics.js","node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/measure-text.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/text.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/image.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/traversable.js","node_modules/@progress/kendo-drawing/dist/es2015/util/append.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/group.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/translate-to-point.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/align-start.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/align-start-reverse.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/layout.js","node_modules/@progress/kendo-drawing/dist/es2015/shapes/rect.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/align-elements.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/align.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/v-align.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/stack-elements.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/create-stack-elements.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/stack.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/v-stack.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/wrap-elements.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/wrap.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/v-wrap.js","node_modules/@progress/kendo-drawing/dist/es2015/alignment/fit.js","node_modules/@progress/kendo-drawing/dist/es2015/gradients/stops-array.js","node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-options.js","node_modules/@progress/kendo-drawing/dist/es2015/gradients/gradient-stop.js","node_modules/@progress/kendo-drawing/dist/es2015/gradients/gradient.js","node_modules/@progress/kendo-drawing/dist/es2015/gradients/linear-gradient.js","node_modules/@progress/kendo-drawing/dist/es2015/gradients/radial-gradient.js","node_modules/@progress/kendo-drawing/dist/es2015/animations/easing-functions.js","node_modules/@progress/kendo-drawing/dist/es2015/util/now.js","node_modules/@progress/kendo-drawing/dist/es2015/util/limit-value.js","node_modules/@progress/kendo-drawing/dist/es2015/common/animation-frame.js","node_modules/@progress/kendo-drawing/dist/es2015/animations/animation-factory.js","node_modules/@progress/kendo-drawing/dist/es2015/animations/animation.js","node_modules/@progress/kendo-drawing/dist/es2015/parsing/path-parser.js","node_modules/@progress/kendo-drawing/dist/es2015/core/base-node.js","node_modules/@progress/kendo-drawing/dist/es2015/common/observable.js","node_modules/@progress/kendo-drawing/dist/es2015/util/element-styles.js","node_modules/@progress/kendo-drawing/dist/es2015/util/element-size.js","node_modules/@progress/kendo-drawing/dist/es2015/util/event-element.js","node_modules/@progress/kendo-drawing/dist/es2015/util/element-padding.js","node_modules/@progress/kendo-drawing/dist/es2015/util/element-offset.js","node_modules/@progress/kendo-drawing/dist/es2015/util/event-coordinates.js","node_modules/@progress/kendo-drawing/dist/es2015/util/element-scale.js","node_modules/@progress/kendo-drawing/dist/es2015/core/surface.js","node_modules/@progress/kendo-drawing/dist/es2015/common/log-to-console.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/utils/render-attribute.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/utils/render-all-attributes.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/utils/render-style.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/node-map.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/constants.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/utils/render-svg.js","node_modules/@progress/kendo-drawing/dist/es2015/common/support.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/gradient-stop-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/gradient-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/linear-gradient-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/radial-gradient-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/clip-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/definition-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/root-node.js","node_modules/@progress/kendo-drawing/dist/es2015/util/bind-events.js","node_modules/@progress/kendo-drawing/dist/es2015/util/unbind-events.js","node_modules/@progress/kendo-drawing/dist/es2015/core/constants.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/path-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/arc-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/circle-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/group-node.js","node_modules/@progress/kendo-drawing/dist/es2015/common/html-encode.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/image-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/multi-path-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/rect-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/text-node.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/surface.js","node_modules/@progress/kendo-drawing/dist/es2015/util/create-promise.js","node_modules/@progress/kendo-drawing/dist/es2015/util/promise-all.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/node-map.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/utils/render-path.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/group-node.js","node_modules/@progress/kendo-drawing/dist/es2015/common/throttle.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/root-node.js","node_modules/@progress/kendo-drawing/dist/es2015/search/quad-root.js","node_modules/@progress/kendo-drawing/dist/es2015/search/quad-node.js","node_modules/@progress/kendo-drawing/dist/es2015/search/shapes-quad-tree.js","node_modules/@progress/kendo-drawing/dist/es2015/common/color/named-colors.js","node_modules/@progress/kendo-drawing/dist/es2015/common/color/parse-color.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/path-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/arc-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/circle-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/image-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/multi-path-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/rect-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/text-node.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/surface.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/surface-cursor.js","node_modules/@progress/kendo-drawing/dist/es2015/surface-factory.js","node_modules/@progress/kendo-drawing/dist/es2015/surface.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/export-group.js","node_modules/@progress/kendo-drawing/dist/es2015/util/arabic-to-roman.js","node_modules/@progress/kendo-drawing/dist/es2015/util/encode-utf.js","node_modules/@progress/kendo-drawing/dist/es2015/util/encode-base64.js","node_modules/@progress/kendo-drawing/dist/es2015/util/merge-sort.js","node_modules/@progress/kendo-drawing/dist/es2015/canvas/export-image.js","node_modules/@progress/kendo-drawing/dist/es2015/svg/export-svg.js","node_modules/@progress/kendo-charts/dist/es2015/common/align-path-to-pixel.js","node_modules/@progress/kendo-charts/dist/es2015/common/clockwise.js","node_modules/@progress/kendo-charts/dist/es2015/common/is-number.js","node_modules/@progress/kendo-charts/dist/es2015/common/is-string.js","node_modules/@progress/kendo-charts/dist/es2015/common/convertable-to-number.js","node_modules/@progress/kendo-charts/dist/es2015/common/is-function.js","node_modules/@progress/kendo-charts/dist/es2015/common/deep-extend.js","node_modules/@progress/kendo-charts/dist/es2015/common/is-object.js","node_modules/@progress/kendo-charts/dist/es2015/common/style-value.js","node_modules/@progress/kendo-charts/dist/es2015/common/element-styles.js","node_modules/@progress/kendo-charts/dist/es2015/common/get-spacing.js","node_modules/@progress/kendo-charts/dist/es2015/services/intl-service.js","node_modules/@progress/kendo-charts/dist/es2015/services/format-service.js","node_modules/@progress/kendo-charts/dist/es2015/services/chart-service.js","node_modules/@progress/kendo-charts/dist/es2015/services/dom-events-builder.js","node_modules/@progress/kendo-charts/dist/es2015/services/template-service.js","node_modules/@progress/kendo-charts/dist/es2015/common/get-template.js","node_modules/@progress/kendo-charts/dist/es2015/common/getter.js","node_modules/@progress/kendo-charts/dist/es2015/common/grep.js","node_modules/@progress/kendo-charts/dist/es2015/common/has-classes.js","node_modules/@progress/kendo-charts/dist/es2015/common/hash-map.js","node_modules/@progress/kendo-charts/dist/es2015/common/in-array.js","node_modules/@progress/kendo-charts/dist/es2015/common/interpolate-value.js","node_modules/@progress/kendo-charts/dist/es2015/common/instance-observer.js","node_modules/@progress/kendo-charts/dist/es2015/common/map.js","node_modules/@progress/kendo-charts/dist/es2015/common/mousewheel-delta.js","node_modules/@progress/kendo-charts/dist/es2015/drawing-utils.js","node_modules/@progress/kendo-charts/dist/es2015/common/font-loader.js","node_modules/@progress/kendo-charts/dist/es2015/common/set-default-options.js","node_modules/@progress/kendo-charts/dist/es2015/common/sparse-array-limits.js","node_modules/@progress/kendo-charts/dist/es2015/common/find.js","node_modules/@progress/kendo-charts/dist/es2015/common/element-scale.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/auto-major-unit.js","node_modules/@progress/kendo-charts/dist/es2015/core/point.js","node_modules/@progress/kendo-charts/dist/es2015/core/box.js","node_modules/@progress/kendo-charts/dist/es2015/core/ring.js","node_modules/@progress/kendo-charts/dist/es2015/core/shape-builder.js","node_modules/@progress/kendo-charts/dist/es2015/core/chart-element.js","node_modules/@progress/kendo-charts/dist/es2015/core/box-element.js","node_modules/@progress/kendo-charts/dist/es2015/core/shape-element.js","node_modules/@progress/kendo-charts/dist/es2015/core/gradients.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/box-diff.js","node_modules/@progress/kendo-charts/dist/es2015/core/root-element.js","node_modules/@progress/kendo-charts/dist/es2015/core/float-element.js","node_modules/@progress/kendo-charts/dist/es2015/core/text.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/rect-to-box.js","node_modules/@progress/kendo-charts/dist/es2015/core/text-box.js","node_modules/@progress/kendo-charts/dist/es2015/core/title.js","node_modules/@progress/kendo-charts/dist/es2015/core/axis-label.js","node_modules/@progress/kendo-charts/dist/es2015/core/note.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/create-axis-tick.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/create-axis-grid-line.js","node_modules/@progress/kendo-charts/dist/es2015/core/axis.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/constants.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/absolute-date-diff.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/add-ticks.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/to-date.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/add-duration.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/start-of-week.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/floor-date.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/ceil-date.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/date-comparer.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/date-diff.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/to-time.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/date-equals.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/date-index.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/duration.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/parse-date.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/parse-dates.js","node_modules/@progress/kendo-charts/dist/es2015/date-utils/first-day.js","node_modules/@progress/kendo-charts/dist/es2015/core/category-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/constants.js","node_modules/@progress/kendo-charts/dist/es2015/core/date-category-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/floor.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/ceil.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/limit-coordinate.js","node_modules/@progress/kendo-charts/dist/es2015/core/numeric-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/auto-axis-min.js","node_modules/@progress/kendo-charts/dist/es2015/core/utils/auto-axis-max.js","node_modules/@progress/kendo-charts/dist/es2015/core/date-value-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/logarithmic-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/mixins/grid-lines-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/core/radar-category-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/polar-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/mixins/radar-numeric-axis-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/core/radar-numeric-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/radar-logarithmic-axis.js","node_modules/@progress/kendo-charts/dist/es2015/core/curve-processor.js","node_modules/@progress/kendo-charts/dist/es2015/chart/api-elements/chart-axis.js","node_modules/@progress/kendo-charts/dist/es2015/chart/api-elements/find-axis-by-name.js","node_modules/@progress/kendo-charts/dist/es2015/chart/api-elements/chart-pane.js","node_modules/@progress/kendo-charts/dist/es2015/chart/api-elements/chart-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/count-numbers.js","node_modules/@progress/kendo-charts/dist/es2015/chart/aggregates/aggregates.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/get-field.js","node_modules/@progress/kendo-charts/dist/es2015/chart/series-binder.js","node_modules/@progress/kendo-charts/dist/es2015/chart/error-bars/error-range-calculator.js","node_modules/@progress/kendo-charts/dist/es2015/chart/constants.js","node_modules/@progress/kendo-charts/dist/es2015/chart/error-bars/error-bar-base.js","node_modules/@progress/kendo-charts/dist/es2015/chart/error-bars/categorical-error-bar.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/eval-options.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/categories-count.js","node_modules/@progress/kendo-charts/dist/es2015/chart/categorical-chart.js","node_modules/@progress/kendo-drawing/dist/es2015/common/color/color.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/point-events-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/note-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/line-point.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/line-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/step-line-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/step-line-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/spline-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/line-chart-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/animations/clip-animation.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/any-has-z-index.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/clip-animation-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/line-chart/line-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/area-chart/area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/area-chart/step-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/area-chart/spline-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/area-chart/area-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/axis-group-range-tracker.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bar-chart/bar-label.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/has-gradient-overlay.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bar-chart/bar.js","node_modules/@progress/kendo-charts/dist/es2015/chart/layout/utils.js","node_modules/@progress/kendo-charts/dist/es2015/chart/layout/cluster-layout.js","node_modules/@progress/kendo-charts/dist/es2015/chart/layout/stack-wrap.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bar-chart/bar-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/candlestick-chart/candlestick.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/are-numbers.js","node_modules/@progress/kendo-charts/dist/es2015/chart/candlestick-chart/candlestick-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/box-plot-chart/box-plot.js","node_modules/@progress/kendo-charts/dist/es2015/chart/box-plot-chart/vertical-box-plot.js","node_modules/@progress/kendo-charts/dist/es2015/chart/box-plot-chart/box-plot-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/error-bars/scatter-error-bar.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/has-value.js","node_modules/@progress/kendo-charts/dist/es2015/chart/scatter-charts/scatter-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bubble-chart/bubble.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bubble-chart/bubble-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bullet-chart/target.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bullet-chart/bullet.js","node_modules/@progress/kendo-charts/dist/es2015/chart/bullet-chart/bullet-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/tooltip/base-tooltip.js","node_modules/@progress/kendo-charts/dist/es2015/chart/crosshair/crosshair-tooltip.js","node_modules/@progress/kendo-charts/dist/es2015/chart/crosshair/crosshair.js","node_modules/@progress/kendo-charts/dist/es2015/chart/chart-container.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pane.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/append-if-not-null.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/segment-visible.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/bind-segments.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/equals-ignore-case.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/filter-series-by-type.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/get-date-field.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/is-date-axis.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/single-item-or-array.js","node_modules/@progress/kendo-charts/dist/es2015/chart/utils/create-out-of-range-points.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/plotarea-base.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/plotarea-events-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/aggregates/series-aggregator.js","node_modules/@progress/kendo-charts/dist/es2015/chart/aggregates/default-aggregates.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-bar-chart/range-bar.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-bar-chart/range-bar-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/range-line-point.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/range-area-point.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/range-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/spline-range-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/step-range-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/range-area-chart/range-area-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/ohlc-chart/ohlc-point.js","node_modules/@progress/kendo-charts/dist/es2015/chart/ohlc-chart/ohlc-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/waterfall-chart/waterfall-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/waterfall-chart/waterfall-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/categorical-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/highlight.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pan-and-zoom/accept-key.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pan-and-zoom/to-chart-axis-ranges.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pan-and-zoom/pannable.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pan-and-zoom/zoom-selection.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pan-and-zoom/mousewheel-zoom.js","node_modules/@progress/kendo-charts/dist/es2015/chart/legend/legend-layout.js","node_modules/@progress/kendo-charts/dist/es2015/chart/legend/legend-item.js","node_modules/@progress/kendo-charts/dist/es2015/chart/legend/legend.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/plotarea-factory.js","node_modules/@progress/kendo-charts/dist/es2015/chart/selection.js","node_modules/@progress/kendo-charts/dist/es2015/chart/tooltip/tooltip.js","node_modules/@progress/kendo-charts/dist/es2015/chart/tooltip/shared-tooltip.js","node_modules/@progress/kendo-charts/dist/es2015/chart/animations/bar-chart-animation.js","node_modules/@progress/kendo-charts/dist/es2015/chart/animations/bubble-animation.js","node_modules/@progress/kendo-charts/dist/es2015/chart/animations/fade-in-animation.js","node_modules/@progress/kendo-charts/dist/es2015/chart/animations/pie-animation.js","node_modules/@progress/kendo-charts/dist/es2015/chart/scatter-charts/scatter-line-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/xy-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pie-chart/pie-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/mixins/pie-chart-mixin.js","node_modules/@progress/kendo-charts/dist/es2015/chart/pie-chart/pie-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/pie-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/donut-chart/donut-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/donut-chart/donut-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/polar-plotarea-base.js","node_modules/@progress/kendo-charts/dist/es2015/chart/polar-scatter-chart/polar-scatter-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/polar-line-chart/polar-line-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/polar-area-chart/spline-polar-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/polar-area-chart/polar-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/polar-area-chart/polar-area-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/polar-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-line-chart/radar-line-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-area-chart/spline-radar-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-area-chart/radar-area-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-area-chart/radar-area-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-bar-chart/radar-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/layout/radar-cluster-layout.js","node_modules/@progress/kendo-charts/dist/es2015/chart/layout/radar-stack-layout.js","node_modules/@progress/kendo-charts/dist/es2015/chart/radar-bar-chart/radar-bar-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/radar-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/funnel-chart/funnel-segment.js","node_modules/@progress/kendo-charts/dist/es2015/chart/funnel-chart/funnel-chart.js","node_modules/@progress/kendo-charts/dist/es2015/chart/register-charts.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/donut-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/plotarea/funnel-plotarea.js","node_modules/@progress/kendo-charts/dist/es2015/chart/chart.js","node_modules/@progress/kendo-charts/dist/es2015/sparkline/shared-tooltip.js","node_modules/@progress/kendo-charts/dist/es2015/sparkline/sparkline.js","node_modules/@progress/kendo-charts/dist/es2015/stock/fade-out-animation.js","node_modules/@progress/kendo-charts/dist/es2015/stock/navigator-hint.js","node_modules/@progress/kendo-charts/dist/es2015/stock/navigator.js","node_modules/@progress/kendo-charts/dist/es2015/stock/constants.js","node_modules/@progress/kendo-charts/dist/es2015/stock/stock-chart.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/constants.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/utils/pad.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/utils/build-label-element.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/utils/get-range.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/utils/unpad.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/gauge.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/linear-scale.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/pointer.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/linear-pointer.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/arrow-linear-pointer-animation.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/arrow-linear-pointer.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/bar-linear-pointer-animation.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/bar-linear-pointer.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/linear/linear-gauge.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/radial/radial-scale.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/radial/radial-pointer-animation.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/radial/radial-pointer.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/radial/radial-gauge.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/arc/arc-scale.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/arc/range-pointer-animation.js","node_modules/@progress/kendo-charts/dist/es2015/gauges/arc/range-pointer.js","node_modules/@progress/kendo-charts/dist/es2015/chart/base-theme.js","node_modules/@telerik/kendo-draggable/dist/es2015/main.js","node_modules/rxjs/_esm2015/internal/observable/fromEvent.js","node_modules/@progress/kendo-angular-common/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-popup-common/dist/es2015/owner-document.js","node_modules/@progress/kendo-popup-common/dist/es2015/window.js","node_modules/@progress/kendo-popup-common/dist/es2015/document.js","node_modules/@progress/kendo-popup-common/dist/es2015/scrollbar-width.js","node_modules/@progress/kendo-popup-common/dist/es2015/window-viewport.js","node_modules/@progress/kendo-popup-common/dist/es2015/bounding-offset.js","node_modules/@progress/kendo-popup-common/dist/es2015/offset-parent.js","node_modules/@progress/kendo-popup-common/dist/es2015/offset.js","node_modules/@progress/kendo-popup-common/dist/es2015/parents.js","node_modules/@progress/kendo-popup-common/dist/es2015/scroll-position.js","node_modules/@progress/kendo-popup-common/dist/es2015/element-scroll-position.js","node_modules/@progress/kendo-popup-common/dist/es2015/position-with-scroll.js","node_modules/@progress/kendo-popup-common/dist/es2015/position.js","node_modules/@progress/kendo-popup-common/dist/es2015/offset-parent-scroll-position.js","node_modules/@progress/kendo-popup-common/dist/es2015/parent-scroll-position.js","node_modules/@progress/kendo-popup-common/dist/es2015/restrict-to-view.js","node_modules/@progress/kendo-popup-common/dist/es2015/align-point.js","node_modules/@progress/kendo-popup-common/dist/es2015/siblings.js","node_modules/@angular/animations/__ivy_ngcc__/fesm2015/animations.js","node_modules/@progress/kendo-angular-popup/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-popup-common/dist/es2015/add-scroll.js","node_modules/@progress/kendo-popup-common/dist/es2015/align.js","node_modules/@progress/kendo-popup-common/dist/es2015/remove-scroll.js","node_modules/@progress/kendo-popup-common/dist/es2015/collision.js","node_modules/@progress/kendo-popup-common/dist/es2015/sibling-container.js","node_modules/rxjs/_esm2015/internal/operators/skip.js","node_modules/@progress/kendo-angular-l10n/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@telerik/kendo-intl/dist/es2015/common/is-string.js","node_modules/@telerik/kendo-intl/dist/es2015/errors.js","node_modules/@telerik/kendo-intl/dist/es2015/error-details.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/info.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/default-data.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/territory.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/date-field-name.js","node_modules/@telerik/kendo-intl/dist/es2015/common/constants.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/date-format-names.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/parse-range-date.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/currency.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/constants.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/first-day.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/weekend-range.js","node_modules/@telerik/kendo-intl/dist/es2015/cldr/number-symbols.js","node_modules/@telerik/kendo-intl/dist/es2015/common/is-negative-zero.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/format-currency-symbol.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/group-integer.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/is-currency-style.js","node_modules/@telerik/kendo-intl/dist/es2015/common/pad.js","node_modules/@telerik/kendo-intl/dist/es2015/common/round.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/standard-number-format.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/utils.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/custom-number-format.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/format-options.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/format-number.js","node_modules/@telerik/kendo-intl/dist/es2015/common/is-number.js","node_modules/@telerik/kendo-intl/dist/es2015/numbers/parse-number.js","node_modules/@telerik/kendo-intl/dist/es2015/common/format-string.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/date-pattern.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/date-name-type.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/format-names.js","node_modules/@telerik/kendo-intl/dist/es2015/common/is-date.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/constants.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/format-date.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/time-utils.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/parse-date.js","node_modules/@telerik/kendo-intl/dist/es2015/dates/split-date-format.js","node_modules/@telerik/kendo-intl/dist/es2015/format.js","node_modules/@progress/kendo-angular-intl/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-angular-charts/__ivy_ngcc__/dist/fesm2015/index.js","src/app/tiles/base/stacked-bar-line-chart/stacked-bar-line-chart.component.html","src/app/tiles/base/stacked-bar-line-chart/stacked-bar-line-chart.component.ts","src/app/tiles/base/text-indicators/text-indicators.component.html","src/app/tiles/base/text-indicators/text-indicators.component.ts","src/app/tiles/base/stacked-bar-chart-by-product/stacked-bar-chart-by-product.component.html","src/app/tiles/base/stacked-bar-chart-by-product/stacked-bar-chart-by-product.component.ts","src/app/tiles/base/top-stats-list/top-stats-list.component.html","src/app/tiles/base/top-stats-list/top-stats-list.component.ts","src/app/tiles/base/multi-api-tile.component.ts","src/app/tiles/base/vertical-split-text-indicators/vertical-split-text-indicators.component.html","src/app/tiles/base/vertical-split-text-indicators/vertical-split-text-indicators.component.ts","src/app/tiles/base/shape-indicators/shape-indicators.component.html","src/app/tiles/base/shape-indicators/shape-indicators.component.ts","node_modules/@progress/kendo-drawing/dist/es/common/class.js","node_modules/@progress/kendo-drawing/dist/es/core/has-observers.js","node_modules/@progress/kendo-drawing/dist/es/mixins/with-accessors.js","node_modules/@progress/kendo-drawing/dist/es/util/round.js","node_modules/@progress/kendo-drawing/dist/es/util/defined.js","node_modules/@progress/kendo-drawing/dist/es/util/constants.js","node_modules/@progress/kendo-drawing/dist/es/util/rad.js","node_modules/@progress/kendo-drawing/dist/es/geometry/matrix.js","node_modules/@progress/kendo-drawing/dist/es/geometry/point.js","node_modules/@progress/kendo-drawing/dist/es/geometry/to-matrix.js","node_modules/@progress/kendo-drawing/dist/es/geometry/size.js","node_modules/@progress/kendo-drawing/dist/es/geometry/rect.js","node_modules/@progress/kendo-drawing/dist/es/geometry/circle.js","node_modules/@progress/kendo-drawing/dist/es/geometry/math/ellipse-extreme-angles.js","src/app/tiles/base/pie-chart/pie-chart.component.html","src/app/tiles/base/pie-chart/pie-chart.component.ts","src/app/tiles/base/area-line-chart/area-line-chart.component.html","src/app/tiles/base/area-line-chart/area-line-chart.component.ts","src/app/tiles/base/multi-line-chart/multi-line-chart.component.html","src/app/tiles/base/multi-line-chart/multi-line-chart.component.ts","node_modules/@progress/pako-esm/dist/pako-esm2015.js","node_modules/@progress/kendo-drawing/dist/es2015/html/core.js","node_modules/@progress/kendo-angular-gauges/__ivy_ngcc__/dist/fesm2015/index.js","src/app/tiles/metrics/compliance-chart/compliance-chart.component.html","src/app/tiles/metrics/compliance-chart/compliance-chart.component.ts","src/app/tiles/metrics/nps/nps.component.ts","src/app/tiles/metrics/nps/nps.component.html","src/app/tiles/metrics/utilization-tpd/utilization-tpd.component.html","src/app/tiles/metrics/utilization-tpd/utilization-tpd.component.ts","src/app/tiles/placeholder/placeholder.component.ts","src/app/tiles/placeholder/placeholder.component.html","node_modules/@progress/kendo-data-query/dist/es2015/utils.js","node_modules/@progress/kendo-data-query/dist/es2015/filtering/filter-descriptor.interface.js","node_modules/@progress/kendo-data-query/dist/es2015/funcs.js","node_modules/@progress/kendo-data-query/dist/es2015/filtering/filter.operators.js","node_modules/@progress/kendo-data-query/dist/es2015/accessor.js","node_modules/@progress/kendo-data-query/dist/es2015/mvc/operators.js","node_modules/@progress/kendo-data-query/dist/es2015/filter-serialization.common.js","node_modules/@progress/kendo-data-query/dist/es2015/mvc/deserialization.js","node_modules/@progress/kendo-data-query/dist/es2015/sorting/sort-array.operator.js","node_modules/@progress/kendo-data-query/dist/es2015/transducers.js","node_modules/@progress/kendo-data-query/dist/es2015/grouping/aggregate.operators.js","node_modules/@progress/kendo-data-query/dist/es2015/filtering/filter-no-eval.js","node_modules/@progress/kendo-data-query/dist/es2015/filtering/filter-expression.factory.js","node_modules/@progress/kendo-data-query/dist/es2015/grouping/group.operators.js","node_modules/@progress/kendo-data-query/dist/es2015/sorting/sort.js","node_modules/@progress/kendo-data-query/dist/es2015/array.operators.js","node_modules/@fortawesome/free-solid-svg-icons/index.es.js","node_modules/rxjs/_esm2015/internal/observable/forkJoin.js","node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js","node_modules/rxjs/_esm2015/internal/observable/interval.js","node_modules/rxjs/_esm2015/internal/operators/takeUntil.js","node_modules/rxjs/_esm2015/internal/operators/debounceTime.js","node_modules/@progress/kendo-angular-inputs/node_modules/@progress/kendo-common/dist/es2015/util.js","node_modules/@progress/kendo-angular-inputs/node_modules/@progress/kendo-common/dist/es2015/support.js","node_modules/@progress/kendo-angular-inputs/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/rxjs/_esm2015/internal/operators/throttle.js","node_modules/rxjs/_esm2015/internal/operators/throttleTime.js","node_modules/rxjs/_esm2015/internal/operators/skipWhile.js","node_modules/@progress/kendo-common/dist/es2015/util.js","node_modules/@progress/kendo-common/dist/es2015/support.js","node_modules/@progress/kendo-common/dist/es2015/accessors/field-list.js","node_modules/@progress/kendo-common/dist/es2015/accessors/getter.js","node_modules/@progress/kendo-angular-dropdowns/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-angular-pager/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-angular-listview/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@fortawesome/fontawesome-svg-core/index.es.js","node_modules/@fortawesome/angular-fontawesome/__ivy_ngcc__/fesm2015/angular-fontawesome.js","src/app/ui_tools/autoselect-list/autoselect-list.component.html","src/app/ui_tools/autoselect-list/autoselect-list.component.ts","src/app/filter_selection/details/detail-account-filter/detail-account-filter.component.ts","src/app/filter_selection/details/detail-account-filter/detail-account-filter.component.html","src/app/filter_selection/details/detail-assay-filter/detail-assay-filter.component.ts","src/app/filter_selection/details/detail-assay-filter/detail-assay-filter.component.html","src/app/filter_selection/details/toggle-switches.ts","src/app/filter_selection/details/detail-capital-service-assay-switches-filter/detail-capital-service-assay-switches-filter.component.html","src/app/filter_selection/details/detail-capital-service-assay-switches-filter/detail-capital-service-assay-switches-filter.component.ts","src/app/filter_selection/details/detail-category-switches-filter/detail-category-switches-filter.component.html","src/app/filter_selection/details/detail-category-switches-filter/detail-category-switches-filter.component.ts","src/app/filter_selection/details/detail-customer-filter/detail-customer-filter.component.ts","src/app/filter_selection/details/detail-customer-filter/detail-customer-filter.component.html","src/app/filter_selection/details/detail-disease-state-filter/detail-disease-state-filter.component.ts","src/app/filter_selection/details/detail-disease-state-filter/detail-disease-state-filter.component.html","src/app/filter_selection/details/detail-product-line-filter/detail-product-line-filter.component.ts","src/app/filter_selection/details/detail-product-line-filter/detail-product-line-filter.component.html","src/app/business_review/snapshots/br-placeholder/br-placeholder.component.ts","src/app/business_review/snapshots/br-placeholder/br-placeholder.component.html","src/app/business_review/snapshots/br-stacked-bar-line-chart/br-stacked-bar-line-chart.component.html","src/app/business_review/snapshots/br-stacked-bar-line-chart/br-stacked-bar-line-chart.component.ts","src/app/business_review/snapshots/br-multi-line-chart/br-multi-line-chart.component.html","src/app/business_review/snapshots/br-multi-line-chart/br-multi-line-chart.component.ts","src/app/business_review/snapshots/br-multi-bar-chart/br-multi-bar-chart.component.html","src/app/business_review/snapshots/br-multi-bar-chart/br-multi-bar-chart.component.ts","src/app/business_review/snapshots/br-line-chart/br-line-chart.component.html","src/app/business_review/snapshots/br-line-chart/br-line-chart.component.ts","src/app/business_review/snapshots/br-pie-chart/br-pie-chart.component.html","src/app/business_review/snapshots/br-pie-chart/br-pie-chart.component.ts","src/app/business_review/snapshots/br-stacked-bar-chart-by-product/br-stacked-bar-chart-by-product.component.html","src/app/business_review/snapshots/br-stacked-bar-chart-by-product/br-stacked-bar-chart-by-product.component.ts","src/app/business_review/snapshots/br-text-indicator/br-text-indicator.component.ts","src/app/business_review/snapshots/br-text-indicator/br-text-indicator.component.html","src/app/business_review/snapshots/br-top-items/br-top-items.component.html","src/app/business_review/snapshots/br-top-items/br-top-items.component.ts","src/app/business_review/snapshots/br-example-pie-chart/br-example-pie-chart.component.html","src/app/business_review/snapshots/br-example-pie-chart/br-example-pie-chart.component.ts","src/app/business_review/snapshots/api-test/api-test.component.ts","src/app/business_review/snapshots/api-test/api-test.component.html","src/app/api/persona-options.service.ts","node_modules/rxjs/_esm2015/internal/observable/never.js","node_modules/rxjs/_esm2015/internal/Notification.js","node_modules/rxjs/_esm2015/internal/operators/delay.js","node_modules/rxjs/_esm2015/internal/util/isDate.js","node_modules/@angular/service-worker/__ivy_ngcc__/fesm2015/service-worker.js","node_modules/rxjs/_esm2015/internal/operators/publish.js","src/app/api/push-notification-service.ts","node_modules/msal/lib-es6/utils/CryptoUtils.js","node_modules/msal/lib-es6/utils/Constants.js","node_modules/msal/lib-es6/authority/Authority.js","node_modules/msal/lib-es6/error/AuthError.js","node_modules/msal/lib-es6/utils/StringUtils.js","node_modules/msal/lib-es6/error/ClientAuthError.js","node_modules/msal/lib-es6/error/ClientConfigurationError.js","node_modules/msal/lib-es6/ScopeSet.js","node_modules/msal/lib-es6/utils/UrlUtils.js","node_modules/msal/lib-es6/cache/AccessTokenKey.js","node_modules/msal/lib-es6/cache/AccessTokenValue.js","node_modules/msal/lib-es6/ServerRequestParameters.js","node_modules/msal/lib-es6/packageMetadata.js","node_modules/msal/lib-es6/XHRClient.js","node_modules/msal/lib-es6/authority/TrustedAuthority.js","node_modules/msal/lib-es6/Logger.js","node_modules/msal/lib-es6/ClientInfo.js","node_modules/msal/lib-es6/utils/TimeUtils.js","node_modules/msal/lib-es6/utils/TokenUtils.js","node_modules/msal/lib-es6/IdToken.js","node_modules/msal/lib-es6/cache/AccessTokenCacheItem.js","node_modules/msal/lib-es6/cache/BrowserStorage.js","node_modules/msal/lib-es6/utils/RequestUtils.js","node_modules/msal/lib-es6/cache/AuthCache.js","node_modules/msal/lib-es6/Account.js","node_modules/msal/lib-es6/utils/WindowUtils.js","node_modules/msal/lib-es6/utils/ResponseUtils.js","node_modules/msal/lib-es6/authority/AuthorityFactory.js","node_modules/msal/lib-es6/Configuration.js","node_modules/msal/lib-es6/error/ServerError.js","node_modules/msal/lib-es6/error/InteractionRequiredAuthError.js","node_modules/msal/lib-es6/AuthResponse.js","node_modules/msal/lib-es6/telemetry/TelemetryConstants.js","node_modules/msal/lib-es6/telemetry/ApiEvent.js","node_modules/msal/lib-es6/telemetry/TelemetryUtils.js","node_modules/msal/lib-es6/telemetry/TelemetryEvent.js","node_modules/msal/lib-es6/telemetry/DefaultEvent.js","node_modules/msal/lib-es6/telemetry/HttpEvent.js","node_modules/msal/lib-es6/telemetry/TelemetryManager.js","node_modules/msal/lib-es6/utils/AuthCacheUtils.js","node_modules/msal/lib-es6/UserAgentApplication.js","node_modules/@azure/msal-angular/__ivy_ngcc__/fesm2015/azure-msal-angular.js","node_modules/@progress/kendo-angular-tooltip/__ivy_ngcc__/dist/fesm2015/index.js","src/app/navigation/tool-selector/tool-selector.component.ts","src/app/navigation/tool-selector/tool-selector.component.html","node_modules/@progress/kendo-angular-buttons/__ivy_ngcc__/dist/fesm2015/index.js","src/app/navigation/bookmarks/bookmarks.component.html","src/app/navigation/bookmarks/bookmarks.component.ts","node_modules/@progress/kendo-angular-label/__ivy_ngcc__/dist/fesm2015/index.js","src/app/navigation/preferences/preferences.component.html","src/app/navigation/preferences/preferences.component.ts","src/app/configuration/personas.ts","src/app/filter_selection/tss-ambassador-selector/tss-ambassador-selector.component.ts","src/app/filter_selection/tss-ambassador-selector/tss-ambassador-selector.component.html","src/app/filter_selection/manager-selector/manager-selector.component.ts","src/app/filter_selection/manager-selector/manager-selector.component.html","src/app/filter_selection/cua-manager-selector/cua-manager-selector.component.ts","src/app/filter_selection/cua-manager-selector/cua-manager-selector.component.html","src/app/filter_selection/geo-location-selector/geo-location-selector.component.ts","src/app/filter_selection/geo-location-selector/geo-location-selector.component.html","src/app/filter_selection/manager-amb-selector/manager-amb-selector.component.ts","src/app/filter_selection/manager-amb-selector/manager-amb-selector.component.html","src/app/filter_selection/account-rep/account-rep.component.ts","src/app/filter_selection/account-rep/account-rep.component.html","src/app/api/state-handler-search/state-handler-search.component.html","src/app/api/state-handler-search/state-handler-search.component.ts","src/app/ui_tools/customer-select-list/customer-select-list.component.html","src/app/ui_tools/customer-select-list/customer-select-list.component.ts","src/app/filter_selection/ct-customer-selector/ct-customer-selector.component.ts","src/app/filter_selection/ct-customer-selector/ct-customer-selector.component.html","src/app/ui_tools/account-select-list/account-select-list.component.html","src/app/ui_tools/account-select-list/account-select-list.component.ts","src/app/filter_selection/ct-account-selector/ct-account-selector.component.ts","src/app/filter_selection/ct-account-selector/ct-account-selector.component.html","src/app/filter_selection/persona-selector/persona-selector.component.html","src/app/filter_selection/persona-selector/persona-selector.component.ts","src/app/filter_selection/toggle-switches/toggle-switch.component.ts","src/app/filter_selection/toggle-switches/customer-toggle/customer-toggle.component.html","src/app/filter_selection/toggle-switches/customer-toggle/customer-toggle.component.ts","src/app/filter_selection/toggle-switches/instrument-toggle/instrument-toggle.component.html","src/app/filter_selection/toggle-switches/instrument-toggle/instrument-toggle.component.ts","src/app/filter_selection/toggle-switches/track-toggle/track-toggle.component.html","src/app/filter_selection/toggle-switches/track-toggle/track-toggle.component.ts","src/app/filter_selection/toggle-switches/flagship-toggle/flagship-toggle.component.html","src/app/filter_selection/toggle-switches/flagship-toggle/flagship-toggle.component.ts","src/app/navigation/parameter-switches/parameter-switches.component.html","src/app/navigation/parameter-switches/parameter-switches.component.ts","src/app/filter_selection/customer-selector/customer-selector.component.ts","src/app/filter_selection/customer-selector/customer-selector.component.html","src/app/filter_selection/instrument-selector/instrument-selector.component.ts","src/app/filter_selection/instrument-selector/instrument-selector.component.html","src/app/filter_selection/sn-selector/sn-selector.component.ts","src/app/filter_selection/sn-selector/sn-selector.component.html","src/app/filter_selection/account/account.component.ts","src/app/filter_selection/account/account.component.html","src/app/filter_selection/persona-selector2/persona-selector2.component.html","src/app/filter_selection/persona-selector2/persona-selector2.component.ts","node_modules/@progress/kendo-angular-dialog/__ivy_ngcc__/dist/fesm2015/index.js","src/app/filter_selection/search-popup/search-popup.component.html","src/app/filter_selection/search-popup/search-popup.component.ts","src/app/navigation/dashboard-navbar/dashboard-navbar.component.html","src/app/navigation/dashboard-navbar/dashboard-navbar.component.ts","src/app/filter_selection/detail-persona-selector/detail-persona-selector.component.html","src/app/filter_selection/detail-persona-selector/detail-persona-selector.component.ts","src/app/navigation/metric-detail-navbar/metric-detail-navbar.component.html","src/app/navigation/metric-detail-navbar/metric-detail-navbar.component.ts","src/app/control_tower/ct-service.service.ts","src/app/filter_selection/ct-product-set-selector/ct-product-set-selector.component.html","src/app/filter_selection/ct-product-set-selector/ct-product-set-selector.component.ts","src/app/navigation/ct-navbar/ct-navbar.component.html","src/app/navigation/ct-navbar/ct-navbar.component.ts","src/app/navigation/alerts-navbar/alerts-navbar.component.ts","src/app/navigation/alerts-navbar/alerts-navbar.component.html","src/app/navigation/gs-alerts-navbar/gs-alerts-navbar.component.ts","src/app/navigation/gs-alerts-navbar/gs-alerts-navbar.component.html","src/app/navigation/metric-detail-no-filter/metric-detail-no-filter.component.html","src/app/navigation/metric-detail-no-filter/metric-detail-no-filter.component.ts","src/app/business_review/presentation-toggle-switch/presentation-toggle-switch.component.html","src/app/business_review/presentation-toggle-switch/presentation-toggle-switch.component.ts","src/app/business_review/br-navbar/br-navbar.component.html","src/app/business_review/br-navbar/br-navbar.component.ts","src/app/app.component.html","src/app/app.component.ts","src/app/configuration/service-metric-tile-reference-default-arrangement.ts","src/app/dashboards/tile-insert/tile-insert.component.ts","src/app/dashboards/tile-insert/tile-insert.component.html","src/app/dashboards/dashboard/dashboard.component.html","src/app/dashboards/dashboard/dashboard.component.ts","src/app/configuration/details/style1-pages.ts","src/app/details/grid.component.ts","src/app/configuration/details/row-parsers.ts","src/app/details/row_parsers/stack-keys.ts","src/app/details/row_parsers/stack-values.ts","src/app/details/row_parsers/stack-totals.ts","src/app/details/row_parsers/percents.ts","src/app/details/row_parsers/percent-goals.ts","src/app/details/row_parsers/point-values.ts","src/app/details/row-parser.service.ts","node_modules/rxjs/_esm2015/internal/observable/zip.js","node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js","node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js","node_modules/rxjs/_esm2015/internal/operators/bufferCount.js","node_modules/@progress/kendo-date-math/dist/es2015/clone-date.js","node_modules/@progress/kendo-date-math/dist/es2015/adjust-dst.js","node_modules/@progress/kendo-date-math/dist/es2015/add-days.js","node_modules/@progress/kendo-date-math/dist/es2015/create-date.js","node_modules/@progress/kendo-date-math/dist/es2015/get-date.js","node_modules/@progress/kendo-date-math/dist/es2015/is-equal.js","node_modules/@progress/kendo-date-math/dist/es2015/last-day-of-month.js","node_modules/@progress/kendo-date-math/dist/es2015/add-months.js","node_modules/@progress/kendo-date-math/dist/es2015/set-year.js","node_modules/@progress/kendo-date-math/dist/es2015/add-years.js","node_modules/@progress/kendo-date-math/dist/es2015/add-decades.js","node_modules/@progress/kendo-date-math/dist/es2015/add-centuries.js","node_modules/@progress/kendo-date-math/dist/es2015/normalize-year.js","node_modules/@progress/kendo-date-math/dist/es2015/first-decade-of-century.js","node_modules/@progress/kendo-date-math/dist/es2015/last-decade-of-century.js","node_modules/@progress/kendo-date-math/dist/es2015/first-year-of-decade.js","node_modules/@progress/kendo-date-math/dist/es2015/duration-in-centuries.js","node_modules/@progress/kendo-date-math/dist/es2015/last-year-of-decade.js","node_modules/@progress/kendo-date-math/dist/es2015/duration-in-decades.js","node_modules/@progress/kendo-date-math/dist/es2015/add-weeks.js","node_modules/@progress/kendo-date-math/dist/es2015/first-day-of-month.js","node_modules/@progress/kendo-date-math/dist/es2015/direction.enum.js","node_modules/@progress/kendo-date-math/dist/es2015/day-of-week.js","node_modules/@progress/kendo-date-math/dist/es2015/duration-in-months.js","node_modules/@progress/kendo-date-math/dist/es2015/set-month.js","node_modules/@progress/kendo-date-math/dist/es2015/first-month-of-year.js","node_modules/@progress/kendo-date-math/dist/es2015/last-month-of-year.js","node_modules/@progress/kendo-date-math/dist/es2015/duration-in-years.js","node_modules/@progress/kendo-date-math/dist/es2015/day.enum.js","node_modules/@progress/kendo-date-math/dist/es2015/prev-day-of-week.js","node_modules/@progress/kendo-date-math/dist/es2015/week-in-year.js","node_modules/@progress/kendo-date-math/dist/es2015/constants.js","node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js","node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js","node_modules/rxjs/_esm2015/internal/scheduler/queue.js","node_modules/rxjs/_esm2015/internal/operators/observeOn.js","node_modules/rxjs/_esm2015/internal/ReplaySubject.js","node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js","node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js","node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js","node_modules/rxjs/_esm2015/internal/operators/takeWhile.js","node_modules/@progress/kendo-angular-dateinputs/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-file-saver/dist/es2015/save-as.js","node_modules/@progress/kendo-ooxml/dist/es2015/services/intl-service.js","node_modules/@progress/kendo-ooxml/dist/es2015/services/template-service.js","node_modules/@progress/kendo-ooxml/dist/es2015/utils/getter.js","node_modules/@progress/kendo-ooxml/dist/es2015/utils/map.js","node_modules/@progress/kendo-ooxml/dist/es2015/excel-exporter.js","node_modules/@progress/jszip-esm/dist/jszip-esm2015.js","node_modules/@progress/kendo-ooxml/dist/es2015/utils/time.js","node_modules/@progress/kendo-ooxml/dist/es2015/ooxml.js","node_modules/@progress/kendo-ooxml/dist/es2015/utils/create-zip.js","node_modules/@progress/kendo-angular-excel-export/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-angular-grid/__ivy_ngcc__/dist/fesm2015/index.js","src/app/ui_tools/formatter/abbott-big-number-formatter-pipe.ts","src/app/details/style1-grid/style1-grid.component.html","src/app/details/style1-grid/style1-grid.component.ts","src/app/ui_tools/formatter/empty-value-mask-pipe.ts","src/app/details/set-values-grid/set-values-grid.component.html","src/app/details/set-values-grid/set-values-grid.component.ts","src/app/details/custom-grid/custom-grid.component.html","src/app/details/custom-grid/custom-grid.component.ts","src/app/details/custom-compliance-grid/custom-compliance-grid.component.html","src/app/details/custom-compliance-grid/custom-compliance-grid.component.ts","src/app/filter_selection/details/filter-insert/filter-insert.component.ts","src/app/filter_selection/details/filter-insert/filter-insert.component.html","src/app/details/style1/style1.component.html","src/app/details/style1/style1.component.ts","src/app/dashboards/customer/customer.component.html","src/app/dashboards/customer/customer.component.ts","src/app/dashboards/instruments/instruments.component.html","src/app/dashboards/instruments/instruments.component.ts","src/app/dashboards/ambassador/ambassador.component.html","src/app/dashboards/ambassador/ambassador.component.ts","node_modules/@progress/kendo-licensing/dist/index-esm.js","node_modules/@progress/kendo-angular-progressbar/__ivy_ngcc__/dist/fesm2015/index.js","node_modules/@progress/kendo-angular-layout/__ivy_ngcc__/dist/fesm2015/index.js","src/app/control_tower/customer-health-alerts-grid/customer-health-alerts-grid.component.html","src/app/control_tower/customer-health-alerts-grid/customer-health-alerts-grid.component.ts","src/app/control_tower/customer-health-grid/customer-health-grid.component.html","src/app/control_tower/customer-health-grid/customer-health-grid.component.ts","src/app/control_tower/customer-profile-info/customer-profile-info.component.html","src/app/control_tower/customer-profile-info/customer-profile-info.component.ts","src/app/control_tower/data-trend-chart/data-trend-chart.component.html","src/app/control_tower/data-trend-chart/data-trend-chart.component.ts","src/app/control_tower/data-trend-table/data-trend-table.component.html","src/app/control_tower/data-trend-table/data-trend-table.component.ts","src/app/control_tower/customer-data-trends/customer-data-trends.component.html","src/app/control_tower/customer-data-trends/customer-data-trends.component.ts","src/app/control_tower/ct-dashboard/ct-dashboard.component.html","src/app/control_tower/ct-dashboard/ct-dashboard.component.ts","src/app/alerts/alerts-grid/alerts-grid.component.html","src/app/alerts/alerts-grid/alerts-grid.component.ts","src/app/alerts/alerts-dashboard/alerts-dashboard.component.ts","src/app/alerts/alerts-dashboard/alerts-dashboard.component.html","src/app/configuration/details/style2-pages.ts","src/app/ui_tools/formatter/custom-date-formatter-pipe.ts","src/app/details/style2-grid/style2-grid.component.html","src/app/details/style2-grid/style2-grid.component.ts","src/app/details/style2/style2.component.html","src/app/details/style2/style2.component.ts","src/app/configuration/details/style3-pages.ts","src/app/details/style3-grid/style3-grid.component.html","src/app/details/style3-grid/style3-grid.component.ts","src/app/details/style3/style3.component.html","src/app/details/style3/style3.component.ts","src/app/configuration/details/style4-pages.ts","src/app/details/style4/style4.component.html","src/app/details/style4/style4.component.ts","src/app/details/service-contracts/service-contract-pages.ts","src/app/details/service-contracts/service-contracts-level2/service-contracts-level2.component.html","src/app/details/service-contracts/service-contracts-level2/service-contracts-level2.component.ts","src/app/details/service-contracts/service-contracts-level3/service-contracts-level3.component.html","src/app/details/service-contracts/service-contracts-level3/service-contracts-level3.component.ts","src/app/details/service-contracts/service-contracts-level4/service-contracts-level4.component.html","src/app/details/service-contracts/service-contracts-level4/service-contracts-level4.component.ts","src/app/details/uptime-customer-details/uptime-customer-details.component.html","src/app/details/uptime-customer-details/uptime-customer-details.component.ts","src/app/details/survey-comment-details/survey-comment-pages.ts","src/app/details/survey-comment-details/survey-comment-details.component.html","src/app/details/survey-comment-details/survey-comment-details.component.ts","src/app/details/customer-order-details/customer-order-details.component.html","src/app/details/customer-order-details/customer-order-details.component.ts","src/app/details/sgm-details/sgm-details.component.html","src/app/details/sgm-details/sgm-details.component.ts","src/app/details/predictive-alerts/predictive-alerts-level2/predictive-alerts-level2.component.html","src/app/details/predictive-alerts/predictive-alerts-level2/predictive-alerts-level2.component.ts","src/app/details/predictive-alerts/predictive-alerts-level3/predictive-alerts-level3.component.html","src/app/details/predictive-alerts/predictive-alerts-level3/predictive-alerts-level3.component.ts","src/app/details/rnps-survey-comment-details/rnps-survey-comment-details.component.html","src/app/details/rnps-survey-comment-details/rnps-survey-comment-details.component.ts","src/app/details/sales/sales-summary/sales-summary.component.html","src/app/details/sales/sales-summary/sales-summary.component.ts","src/app/details/sales/sales-details/sales-details.component.html","src/app/details/sales/sales-details/sales-details.component.ts","src/app/ui_tools/formatter/safe-html-pipe.ts","src/app/alerts/gs-alerts-dashboard/gs-alerts-dashboard.component.html","src/app/alerts/gs-alerts-dashboard/gs-alerts-dashboard.component.ts","src/app/business_review/configuration/dashboard-arrangement.ts","src/app/business_review/br-template-selection.service.ts","src/app/business_review/presentation-select/presentation-select.component.html","src/app/business_review/presentation-select/presentation-select.component.ts","src/app/business_review/search_options/br-location-selector/br-location-selector.component.html","src/app/business_review/search_options/br-location-selector/br-location-selector.component.ts","src/app/business_review/search_options/br-business-segment-selector/br-business-segment-selector.component.ts","src/app/business_review/search_options/br-business-segment-selector/br-business-segment-selector.component.html","src/app/business_review/ui-multi-column-list-select/ui-multi-column-list-select.component.html","src/app/business_review/ui-multi-column-list-select/ui-multi-column-list-select.component.ts","src/app/business_review/search_options/account-customer-selector/account-customer-selector.component.html","src/app/business_review/search_options/account-customer-selector/account-customer-selector.component.ts","src/app/business_review/search_options/br-history-range-selector/br-history-range-selector.component.html","src/app/business_review/search_options/br-history-range-selector/br-history-range-selector.component.ts","src/app/business_review/search_options/br-product-selector/br-product-selector.component.ts","src/app/business_review/search_options/br-product-selector/br-product-selector.component.html","src/app/business_review/search_options/br-servicing-group-selector/br-servicing-group-selector.component.ts","src/app/business_review/search_options/br-servicing-group-selector/br-servicing-group-selector.component.html","src/app/business_review/br-template-viewer/br-template-viewer.component.html","src/app/business_review/br-template-viewer/br-template-viewer.component.ts","src/app/business_review/br-template-editor/br-template-editor.component.html","src/app/business_review/br-template-editor/br-template-editor.component.ts","src/app/business_review/br-template-selector/br-template-selector.component.html","src/app/business_review/br-template-selector/br-template-selector.component.ts","src/app/business_review/filter-presentation-header/filter-presentation-header.component.html","src/app/business_review/filter-presentation-header/filter-presentation-header.component.ts","src/app/business_review/br-tile-insert/br-tile-insert.component.ts","src/app/business_review/br-tile-insert/br-tile-insert.component.html","src/app/business_review/filter-presentation-footer/filter-presentation-footer.component.html","src/app/business_review/filter-presentation-footer/filter-presentation-footer.component.ts","src/app/business_review/br-dashboard/br-dashboard.component.html","src/app/business_review/br-dashboard/br-dashboard.component.ts","src/app/business_review/configuration/details/expanded-view-pages.ts","src/app/business_review/detail_pages/br-expanded-chart-view/br-expanded-chart-view.component.html","src/app/business_review/detail_pages/br-expanded-chart-view/br-expanded-chart-view.component.ts","src/app/business_review/configuration/details/list-view-pages.ts","src/app/business_review/detail_pages/br-list-view/br-list-view.component.html","src/app/business_review/detail_pages/br-list-view/br-list-view.component.ts","src/app/business_review/system-comparison-pages/br-system-comparison-list-view/br-system-comparison-list-view.component.html","src/app/business_review/system-comparison-pages/br-system-comparison-list-view/br-system-comparison-list-view.component.ts","src/app/business_review/timeline-pages/br-timeline-view/br-timeline-view.component.html","src/app/business_review/timeline-pages/br-timeline-view/br-timeline-view.component.ts","src/app/business_review/configuration/details/ddt-config.ts","src/app/business_review/dynamic-data-table/dynamic-data-table.component.html","src/app/business_review/dynamic-data-table/dynamic-data-table.component.ts","src/app/business_review/ddt-loader/ddt-loader.component.html","src/app/business_review/ddt-loader/ddt-loader.component.ts","src/app/business_review/br-detail-component-viewer/br-detail-component-viewer.component.html","src/app/app-routing.module.ts","src/app/business_review/br-detail-component-viewer/br-detail-component-viewer.component.ts","node_modules/@angular/animations/__ivy_ngcc__/fesm2015/browser.js","node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/animations.js","src/app/app.module.ts","src/main.ts","$_lazy_route_resource lazy namespace object"],"names":["module","exports","arg","copy","fill","readUInt8","minimatch","Minimatch","path","sep","er","GLOBSTAR","expand","plTypes","open","close","reSpecials","split","reduce","set","c","slashSplit","ext","a","b","t","Object","keys","forEach","k","p","pattern","options","TypeError","nocomment","charAt","trim","match","this","join","regexp","negate","comment","empty","make","braceExpand","nobrace","filter","i","list","defaults","def","length","orig","m","prototype","debug","_made","parseNegate","globSet","console","error","globParts","map","s","si","parse","indexOf","negateOffset","nonegate","l","substr","isSub","noglobstar","stateChar","re","hasMagic","nocase","escaping","patternListStack","negativeLists","inClass","reClassStart","classStart","patternStart","dot","self","clearStateChar","qmark","len","noext","push","type","start","reStart","pl","pop","reEnd","cs","substring","RegExp","sp","SUBPARSE","tail","slice","replace","_","$1","$2","addPatternStart","n","nl","nlBefore","nlFirst","nlLast","nlAfter","openParensBefore","cleanAfter","dollar","flags","regExp","_glob","_src","makeRe","twoStar","ex","mm","f","nonull","partial","filename","file","matchBase","matchOne","flipNegate","fi","pi","fl","hit","fr","pr","swallowee","toLowerCase","Error","isWindows","process","platform","util","normalizeArray","parts","allowAboveRoot","res","trimArray","arr","lastIndex","end","splitDeviceRe","splitTailRe","win32","win32SplitPath","result","exec","device","result2","win32StatPath","isUnc","isAbsolute","normalizeUNCRoot","resolve","resolvedDevice","resolvedTail","resolvedAbsolute","arguments","env","cwd","isString","normalize","trailingSlash","test","paths","joined","relative","from","to","lowerFrom","lowerTo","toParts","lowerFromParts","lowerToParts","Math","min","samePartsLength","outputParts","concat","_makeLong","resolvedPath","dirname","root","dir","basename","extname","format","pathObject","isObject","base","pathString","allParts","name","delimiter","splitPathRe","posix","posixSplitPath","segment","fromParts","create","ctor","superCtor","super_","constructor","value","enumerable","writable","configurable","TempCtor","FUNC_ERROR_TEXT","PLACEHOLDER","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsBreak","rsCombo","rsDigits","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","reOptMod","rsModifier","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","parseInt","freeGlobal","global","freeSelf","Function","freeExports","nodeType","freeModule","moduleExports","freeProcess","nodeUtil","require","types","binding","e","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","apply","func","thisArg","args","call","arrayAggregator","array","setter","iteratee","accumulator","index","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","Array","arrayPush","values","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","key","baseFindIndex","fromIndex","fromRight","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","undefined","basePropertyOf","baseReduce","current","baseTimes","baseTrim","string","trimmedEndIndex","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","mapToArray","size","overArg","transform","replaceHolders","setToArray","setToPairs","stringSize","stringToArray","unescapeHtmlChar","runInContext","context","uid","pick","Date","String","arrayProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","idCounter","maskSrcKey","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","splice","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","setTimeout","nativeCeil","ceil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","max","nativeMin","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","isArray","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","add","Stack","data","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","skip","get","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","keysIn","getSymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneTypedArray","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","baseGet","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","parent","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","convert","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","isPartial","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","sort","objCriteria","criteria","othCriteria","ordersLength","compareAscending","basePickBy","baseSet","basePullAll","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","MAX_ARRAY_LENGTH","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","id","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","trailing","createCompounder","callback","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","newHolders","createRecurry","fn","reorder","createInverter","toIteratee","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","step","toFinite","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","toInteger","pair","noop","createToPairs","createWrap","srcBitmask","newBitmask","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrLength","arrStacked","arrValue","flatten","otherFunc","symbol","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","ctorString","isMaskable","stubFalse","otherArgs","oldArray","shortOut","reference","details","count","lastCalled","stamp","remaining","rand","memoize","charCodeAt","quote","subString","clone","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","find","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bind","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","debounced","isInvoking","cancel","flush","defer","delay","resolver","memoized","Cache","overArgs","transforms","funcsLength","partialRight","rearg","gt","gte","isError","isInteger","isNumber","lt","lte","toArray","next","done","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","isProto","merge","omit","CLONE_DEEP_FLAG","pickBy","prop","toPairs","toPairsIn","camelCase","word","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","over","overEvery","overSome","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","after","castArray","chunk","compact","cond","conforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","remove","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extend","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","target","position","escape","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNaN","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trimEnd","trimStart","truncate","omission","search","newEnd","unescape","uniqueId","prefix","each","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","isRight","view","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","formatRegExp","objects","inspect","str","x","Number","JSON","stringify","deprecate","msg","noDeprecation","warned","throwDeprecation","traceDeprecation","trace","debugEnviron","debugs","obj","opts","ctx","stylize","stylizeNoColor","colors","showHidden","_extend","customInspect","stylizeWithColor","formatValue","styleType","style","styles","recurseTimes","ret","primitive","simple","visibleKeys","hash","val","idx","getOwnPropertyNames","formatError","output","braces","toUTCString","formatProperty","prev","cur","desc","getOwnPropertyDescriptor","line","ar","objectToString","d","o","debuglog","NODE_DEBUG","pid","isNullOrUndefined","isPrimitive","months","timestamp","getHours","getMinutes","getSeconds","getDate","getMonth","log","inherits","origin","concatMap","balanced","isTop","expansions","pre","isNumericSequence","body","isAlphaSequence","isSequence","isOptions","post","escClose","parseCommaParts","postParts","shift","embrace","N","numeric","y","width","incr","abs","isPadded","fromCharCode","need","z","el","j","expansion","escSlash","escOpen","escComma","escPeriod","unescapeBraces","webpackPolyfill","children","xs","maybeMatch","r","reg","begs","beg","left","right","ai","bi","window","document","exportName","VENDOR_PREFIXES","TEST_ELEMENT","createElement","setTimeoutContext","timeout","bindFn","invokeArrayArg","deprecationMessage","warn","nextKey","dest","src","inherit","child","childP","baseP","_super","boolOrFn","ifUndefined","val1","val2","addEventListeners","handler","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parentNode","inStr","inArray","findByKey","uniqueArray","results","prefixed","camelProp","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","navigator","userAgent","PROPS_XY","PROPS_CLIENT_XY","Input","manager","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offsetDelta","prevDelta","prevInput","deltaX","deltaY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","rotation","maxPointers","velocity","velocityX","velocityY","direction","lastInterval","v","srcEvent","emit","recognize","clientX","clientY","p1","p2","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","TouchAction","Recognizer","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","Hammer","recognizers","preset","Manager","handlers","oldCssProps","inputClass","touchAction","toggleCssProps","item","recognizeWith","requireFailure","cssProps","compute","getTouchAction","hasPanX","hasPanY","preventDefaults","prevented","preventDefault","hasNone","DIRECTION_LEFT","DIRECTION_UP","preventSrc","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","inputDataClone","reset","attrTest","optionPointers","isRecognized","isValid","threshold","DIRECTION_HORIZONTAL","directionTest","hasMoved","validPointers","validMovement","validTime","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","force","stopped","curRecognizer","existing","on","events","off","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","_enable_super_gross_mode_that_will_cause_bad_things","hostReportError","err","closed","useDeprecatedSynchronousErrorHandling","UnsubscriptionError","UnsubscriptionErrorImpl","errors","Subscription","unsubscribe","_parentOrParents","_subscriptions","_ctorUnsubscribe","_unsubscribe","flattenUnsubscriptionErrors","sub","teardown","subscription","EMPTY","tmp","subscriptions","subscriptionIndex","errs","rxSubscriber","destinationOrNext","complete","super","syncErrorValue","syncErrorThrown","syncErrorThrowable","isStopped","destination","subscriber","_next","_error","_complete","_parentSubscriber","observerOrNext","_context","__tryOrSetError","__tryOrUnsub","wrappedComplete","observable","pipe","fns","pipeFromArray","Observable","subscribe","_isScalar","_subscribe","sink","nextOrObserver","_trySubscribe","observer","promiseCtor","getPromiseCtor","operations","ObjectUnsubscribedError","ObjectUnsubscribedErrorImpl","subject","observers","subscriberIndex","Subject","hasError","thrownError","isScheduler","schedule","project","lift","MapOperator","subscribeToArray","getSymbolIterator","isPromise","then","subscribeTo","obs","promise","return","scheduleArray","scheduler","notifyNext","notifyError","notifyComplete","innerValue","innerSubscribe","innerSubscriber","mergeMap","resultSelector","concurrent","POSITIVE_INFINITY","ii","MergeMapOperator","hasCompleted","active","_tryNext","_innerSub","ish","innerSubscription","mergeAll","fromArray","observables","refCount","RefCountOperator","connectable","_refCount","refCounter","connection","connect","sharedConnection","_connection","subjectFactory","_isComplete","getSubject","_subject","connectableObservableDescriptor","connectableProto","multicast","subjectOrSubjectFactory","selector","MulticastOperator","shareSubjectFactory","share","noSideEffects","makeParamDecorator","parentClass","metaCtor","propName","ParamDecoratorFactory","annotationInstance","ParamDecorator","annotation","cls","unusedKey","parameters","ngMetadataName","annotationCls","Inject","token","Optional","Self","SkipSelf","InjectFlags","getClosureSafeProperty","objWithPropertyToExtract","fillProperties","ɵɵdefineInjectable","providedIn","factory","defineInjectable","ɵɵdefineInjector","providers","getInjectableDef","getOwnDefinition","NG_PROV_DEF","NG_INJECTABLE_DEF","getInjectorDef","NG_INJ_DEF","NG_INJECTOR_DEF","ɵprov","ɵinj","NG_PROV_DEF_FALLBACK","ɵprovFallback","ngInjectableDef","ngInjectorDef","overriddenName","newLineIndex","concatStringsWithSpace","__forward_ref__","forwardRef","forwardRefFn","resolveForwardRef","isForwardRef","__globalThis","globalThis","__window","__self","WorkerGlobalScope","__global","_global","NG_COMP_DEF","ɵcmp","NG_DIR_DEF","ɵdir","NG_PIPE_DEF","ɵpipe","NG_MOD_DEF","ɵmod","NG_LOC_ID_DEF","ɵloc","NG_FACTORY_DEF","ɵfac","NG_ELEMENT_ID","__NG_ELEMENT_ID__","InjectionToken","_desc","INJECTOR","THROW_IF_NOT_FOUND","NEW_LINE","USE_VALUE","provide","useValue","_injectImplementation","_currentInjector","setCurrentInjector","injector","former","setInjectImplementation","impl","injectInjectorOnly","Default","injectRootLimpMode","ɵɵinject","inject","notFoundValue","injectableDef","injectArgs","meta","NullInjector","NgModuleRef","NgModuleFactory","addAllToArray","items","deepForEach","addToArray","removeFromArray","newArray","keyValueArraySet","keyValueArray","keyValueArrayIndexOf","value1","value2","keyValueArrayGet","middle","ChangeDetectionStrategy","OnPush","ViewEncapsulation$1","Emulated","Native","None","ShadowDom","EMPTY_OBJ","EMPTY_ARRAY","_renderCompCount","ɵɵdefineComponent","componentDefinition","typePrototype","declaredInputs","providersResolver","decls","vars","consts","ngContentSelectors","hostBindings","hostVars","hostAttrs","contentQueries","inputs","outputs","exportAs","onChanges","onInit","ngOnInit","doCheck","ngDoCheck","afterContentInit","ngAfterContentInit","afterContentChecked","ngAfterContentChecked","afterViewInit","ngAfterViewInit","afterViewChecked","ngAfterViewChecked","onDestroy","ngOnDestroy","onPush","changeDetection","directiveDefs","pipeDefs","selectors","viewQuery","features","encapsulation","setInput","schemas","tView","directiveTypes","feature","pipeTypes","invertObject","extractDirectiveDef","extractPipeDef","getComponentDef","autoRegisterModuleById","ɵɵdefineNgModule","bootstrap","declarations","transitiveCompileScopes","secondary","newLookup","minifiedKey","publicName","declaredName","ɵɵdefineDirective","ɵɵdefinePipe","pipeDef","pure","getFactoryDef","throwNotFound","getNgModuleDef","ngModuleDef","isLView","isLContainer","isContentQueryHost","tNode","isComponentHost","isDirectiveHost","isComponentDef","isRootView","DOCUMENT","getDocument","isProceduralRenderer","renderer","domRendererFactory3","createRenderer","hostElement","rendererType","unwrapRNode","getNativeByIndex","lView","getNativeByTNode","getTNode","load","getComponentLViewByIndex","nodeIndex","hostView","slotValue","readPatchedLView","isCreationMode","viewAttachedToChangeDetector","getConstant","resetPreOrderHookFlags","instructionState","lFrame","createLFrame","bindingsEnabled","checkNoChangesMode","getBindingsEnabled","getLView","getTView","ɵɵrestoreView","viewToRestore","contextLView","getPreviousOrParentTNode","previousOrParentTNode","setPreviousOrParentTNode","isParent","getIsParent","setIsNotParent","getCheckNoChangesMode","setCheckNoChangesMode","mode","getBindingRoot","bindingRootIndex","bindingStartIndex","getBindingIndex","bindingIndex","nextBindingIndex","incrementBindingIndex","setBindingRootForHostBindings","currentDirectiveIndex","getCurrentQueryIndex","currentQueryIndex","setCurrentQueryIndex","enterDI","newView","newLFrame","allocLFrame","enterView","currentLFrame","childLFrame","selectedIndex","elementDepthCount","currentNamespace","currentSanitizer","leaveViewLight","oldLFrame","leaveDI","leaveView","getSelectedIndex","setSelectedIndex","getSelectedTNode","registerPostOrderHooks","directiveStart","directiveEnd","directiveDef","contentHooks","contentCheckHooks","viewHooks","viewCheckHooks","destroyHooks","executeCheckHooks","hooks","callHooks","executeInitAndCheckHooks","initPhase","incrementInitPhaseFlags","currentView","currentNodeIndex","nodeIndexLimit","lastNodeIndexFound","callHook","isInitHook","hook","directive","NodeInjectorFactory","isViewProvider","injectImplementation","resolving","canSeeViewProviders","injectImpl","setUpAttributes","native","attrs","isProc","namespaceURI","attrName","attrVal","setAttribute","setAttributeNS","isAnimationProp","setProperty","isNameOnlyAttributeMarker","marker","mergeHostAttrs","dst","srcMarker","mergeHostAttribute","key1","key2","markerInsertPosition","dstValue","hasParentInjector","parentLocation","getParentInjectorIndex","getParentInjectorViewOffset","getParentInjectorView","location","startView","viewOffset","parentView","renderStringify","stringifyForError","defaultScheduler","requestAnimationFrame","ɵɵresolveWindow","ɵɵresolveDocument","maybeUnwrapFn","includeViewProviders","setIncludeViewProviders","oldValue","nextNgElementId","getOrCreateNodeInjectorForNode","existingInjectorIndex","getInjectorIndex","firstCreatePass","injectorIndex","insertBloom","blueprint","parentLoc","getParentInjectorLocation","parentIndex","parentLView","parentData","footer","hostTNode","diPublicInInjector","bloomBit","BLOOM_SIZE","mask","b6","b5","tData","getOrCreateInjectable","bloomHash","tokenId","NodeInjector","previousTView","hostTElementNode","Host","shouldSearchParent","bloomHasToken","instance","searchTokensOnInjector","NOT_FOUND","moduleInjector","previousInjectImplementation","currentTView","injectableIdx","locateDirectiveOrProvider","getNodeInjectable","canAccessViewProviders","isHostSpecialCase","nodeProviderIndexes","providerIndexes","tInjectables","injectablesStart","directivesStart","cptViewProvidersCount","endIndex","providerTokenOrDef","dirDef","previousIncludeViewProviders","directiveIndex","preOrderHooks","preOrderCheckHooks","injectorView","isFirstHostTNode","_tNode","_lView","ɵɵgetInheritedFactory","ɵɵgetFactoryOf","typeAny","injectorDef","getDebugContext","getOriginalError","defaultErrorLogger","ErrorHandler","_console","originalError","_findOriginalError","_findContext","errorLogger","SafeValueImpl","changingThisBreaksApplicationSecurity","SafeHtmlImpl","SafeStyleImpl","SafeScriptImpl","SafeUrlImpl","SafeResourceUrlImpl","unwrapSafeValue","allowSanitizationBypassAndThrow","actualType","getSanitizationBypassType","getTypeName","_devMode","_runModeLocked","isDevMode","InertBodyHelper","defaultDoc","inertDocument","implementation","createHTMLDocument","inertBodyElement","inertHtml","appendChild","innerHTML","querySelector","getInertBodyElement","DOMParser","_a","getInertBodyElement_DOMParser","getInertBodyElement_InertDocument","getInertBodyElement_XHR","html","encodeURI","xhr","XMLHttpRequest","responseType","send","response","removeChild","parseFromString","templateEl","inertBody","documentMode","stripCustomNsAttrs","elAttrs","attributes","removeAttribute","childNode","Node","ELEMENT_NODE","nextSibling","SAFE_URL_PATTERN","DATA_URL_PATTERN","_sanitizeUrl","url","tagSet","tags","sets","VOID_ELEMENTS","OPTIONAL_END_TAG_BLOCK_ELEMENTS","OPTIONAL_END_TAG_INLINE_ELEMENTS","OPTIONAL_END_TAG_ELEMENTS","VALID_ELEMENTS","URI_ATTRS","SRCSET_ATTRS","VALID_ATTRS","SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS","SanitizingHtmlSerializer","sanitizedSomething","buf","traverseContent","startElement","TEXT_NODE","firstChild","endElement","checkClobberedElement","tagName","nodeName","elAttr","srcset","encodeEntities","nextNode","compareDocumentPosition","DOCUMENT_POSITION_CONTAINED_BY","outerHTML","SURROGATE_PAIR_REGEXP","NON_ALPHANUMERIC_REGEXP","inertBodyHelper","_sanitizeHtml","unsafeHtmlInput","unsafeHtml","mXSSAttempts","parsedHtml","sanitizer","safeHtml","sanitizeChildren","getTemplateContent","content","SecurityContext","NONE","HTML","STYLE","SCRIPT","URL","RESOURCE_URL","SAFE_STYLE_VALUE","URL_RE","_sanitizeStyle","urlMatch","outsideSingle","outsideDouble","ɵɵsanitizeHtml","getSanitizer","sanitize","ɵɵsanitizeUrl","unsafeUrl","attachPatchData","throwMultipleComponentError","throwMixedMultiProviderError","classIndexOf","className","classToSearch","startingIndex","foundIndex","isCssClassMatching","cssClassToMatch","isProjectionMode","hasTagAndTypeMatch","currentSelector","isNodeMatchingSelector","nodeAttrs","nameOnlyMarkerIdx","skipToNextSelector","isPositive","selectorAttrValue","attrIndexInNode","findAttrIndexInNode","nodeAttrValue","compareAgainstClassName","isInlineTemplate","bindingsMode","maybeAttrName","isNodeMatchingSelectorList","isSelectorInSelectorList","selectorListLoop","currentSelectorInList","maybeWrapInNotSelector","isNegativeMode","stringifyCSSSelector","currentChunk","valueOrMarker","attrValue","NO_CHANGE","getLViewParent","ɵɵadvance","delta","selectIndexInternal","toTStylingRange","getTStylingRangePrev","tStylingRange","setTStylingRangePrevDuplicate","getTStylingRangeNext","setTStylingRangeNext","setTStylingRangeNextDuplicate","refreshContentQueries","queryStartIdx","directiveDefIdx","elementCreate","namespace","createElementNS","createLView","host","tHostNode","rendererFactory","getOrCreateTNode","adjustedIndex","createTNode","renderView","executeViewQueryFn","templateFn","executeTemplate","staticContentQueries","staticViewQueries","components","hostLView","renderComponent","refreshView","hooksInitPhaseCompleted","viewOrContainer","activeIndexFlag","embeddedLView","embeddedTView","refreshTransplantedViews","expandoInstructions","expandoStartIndex","currentElementIndex","instruction","refreshComponent","firstUpdatePass","renderComponentOrTemplate","normalExecutionPath","creationModeIsActive","begin","rf","prevSelectedIndex","executeContentQueries","createDirectivesInstances","initialInputs","isComponent","addComponentLogic","setInputsFromAttrs","expando","elementIndex","invokeHostBindingsInCreationMode","saveResolvedLocalsInData","viewData","localRefExtractor","localNames","localIndex","getOrCreateTComponentView","createTView","viewIndex","directives","pipes","initialViewLength","queries","cleanup","directiveRegistry","pipeRegistry","tParent","directiveStylingLast","propertyBindings","mergedAttrs","tViews","projectionNext","projection","residualStyles","classes","residualClasses","classBindings","styleBindings","generatePropertyAliases","inputAliasMap","propStore","internalName","elementPropertyInternal","nativeOnly","dataValue","setInputsForProperty","childComponentLView","resolveDirectives","localRefs","hasDirectives","registry","markAsComponentHost","unshift","exportsMap","totalDirectiveHostVars","initTNodeFlags","generateExpandoInstructionBlock","preOrderHooksFound","preOrderCheckHooksFound","baseResolveDirective","saveNameToExportMap","addHostBindingsToExpandoInstructions","defs","tNodeAttrs","inputsFromAttrs","inputsStore","outputsStore","directiveInputs","generateInitialInputs","growHostVarsSpace","directiveCount","providerCount","numberOfDirectives","directiveFactory","nodeInjectorFactory","componentView","addToViewTree","elementAttributeInternal","strValue","initialInputData","privateName","inputsToStore","createLContainer","hostNative","lContainer","declaredComponentLView","movedViews","movedLView","insertedComponentLView","movedTView","componentHostIdx","componentTView","lViewOrLContainer","markViewDirty","detectChangesInternal","handleError","detectChangesInRootView","rootContext","rootComponent","viewQueryFn","component","CLEAN_PROMISE","getLCleanup","getTViewCleanup","errorHandler","textBindingInternal","setValue","textContent","getLContainer","embeddedView","container","getContainerRenderParent","tViewNode","nativeParentNode","applyToElementOrContainer","lNodeToHandle","beforeNode","rNode","nativeAppendChild","nativeInsertBefore","isHostElement","nativeParent","renderParent","anchor","applyView","addRemoveViewFromContainer","insertMode","detachMovedView","declarationContainer","declaredViewIndex","detachView","removeIndex","indexInContainer","viewToDetach","declarationLContainer","removedLView","lQueries","destroyLView","destroyNode","rootView","cleanUpView","firstView","getParentState","tCleanup","lCleanup","idxOrTargetGetter","listener","useCaptureOrSubIdx","getRenderParent","parentTNode","insertBefore","nativeAppendOrInsertBefore","getNativeAnchorNode","getBeforeNodeForView","childEl","childTNode","anchorNode","viewIndexInContainer","nextViewIndex","firstTNodeOfView","getFirstNativeNode","tNodeType","elIcuContainerChild","rNodeOrLContainer","componentHost","firstProjectedTNode","applyNodes","isProjection","rawSlotValue","applyProjectionRecursive","tProjectionNode","componentLView","nodeToProjectOrRNodes","writeDirectStyle","cssText","writeDirectClass","ViewRef","_cdRefInjectingView","_appRef","_viewContainerRef","_tViewNode","collectNativeNodes","lNode","lViewInAContainer","lViewFirstChildTNode","firstProjectedNode","detach","cleanupFn","vcRef","appRef","RootViewRef","_view","R3ElementRef","R3TemplateRef","R3ViewContainerRef","createElementRef","ElementRefToken","createTemplateRef","TemplateRefToken","_declarationView","_declarationTContainer","elementRef","declarationViewLQueries","createEmbeddedView","viewRef","createContainerRef","ViewContainerRefToken","_lContainer","_hostTNode","_hostView","startTNode","templateRef","insert","componentFactory","projectableNodes","ngModuleRef","contextInjector","parentInjector","ngModule","componentRef","destroyed","allocateContainerIfNeeded","prevIdx","prevLContainer","prevVCRef","adjustedIdx","_adjustIndex","containerLength","insertView","attachToViewContainerRef","newIndex","viewRefsArr","detachedView","commentNode","createComment","ChangeDetectorRef","SWITCH_CHANGE_DETECTOR_REF_FACTORY","isPipe","INJECTOR_SCOPE","NOT_YET","CIRCULAR","EMPTY_ARRAY$2","NULL_INJECTOR","getNullInjector","createInjectorWithoutInjectorInstances","defType","additionalProviders","R3Injector","records","injectorDefTypes","_destroyed","dedupStack","provider","processProvider","processInjectorType","makeRecord","record","scope","assertNotDestroyed","service","previousInjector","injectableDefInScope","injectableDefOrInjectorDefFactory","hydrate","injectorErrorName","tokenPath","text","tokens","defOrWrappedDef","parents","isDuplicate","importTypesWithProviders","imported","defProviders","injectorType","ngModuleType","isTypeProvider","isValueProvider","providerToFactory","multi","multiRecord","paramLength","inheritedInjectableDef","typeName","unwrappedProvider","useFactory","deps","useExisting","classRef","useClass","ngModuleDetail","INJECTOR_IMPL","_resolveInjectorDefTypes","Injector","NULL","ANALYZE_FOR_ENTRY_COMPONENTS","componentResourceResolutionQueue","componentDefPendingResolution","unwrapResponse","computeStaticStyling","_symbolIterator","looseIdentical","WrappedValue","isWrapped","isListLikeIterable$1","isJsObject$1","updateBinding","getBinding","bindingUpdated","is","bindingUpdated2","exp1","exp2","different","bindingUpdated3","exp3","bindingUpdated4","exp4","ɵɵattribute","interpolation1","v0","suffix","interpolation2","i0","v1","interpolation3","i1","v2","ɵɵtemplate","attrsIndex","localRefsIndex","tViewConsts","embeddedTViewNode","ɵɵreference","ɵɵdirectiveInject","ɵɵinjectAttribute","attrNameToInject","attrsLength","ɵɵinvalidFactory","ɵɵproperty","setDirectiveInputsWhichShadowsStyling","isClassBased","ɵɵelementStart","elementStart","ɵɵelementEnd","elementEnd","ɵɵelement","ɵɵelementContainerStart","ɵɵelementContainerEnd","ɵɵelementContainer","ɵɵgetCurrentView","isObservable","ɵɵlistener","eventName","listenerFn","useCapture","eventTargetResolver","isTNodeDirectiveHost","processOutputs","resolved","lCleanupIndex","existingListener","tNodeIdx","cleanupEventName","listenerIdxInLCleanup","__ngLastListenerFn__","__ngNextListenerFn__","wrapListener","listen","executeListenerWithErrorHandling","wrapWithPreventDefault","wrapListenerIn_markDirtyAndPreventDefault","nextListenerFn","returnValue","ɵɵnextContext","level","nestingLevel","matchingProjectionSlotIndex","projectionSlots","wildcardNgContentIndex","ngProjectAsAttrVal","ngProjectAsAttrIdx","ɵɵprojectionDef","componentNode","projectionHeads","tails","componentChild","slotIndex","ɵɵprojection","selectorIndex","ɵɵpropertyInterpolate","ɵɵpropertyInterpolate1","interpolatedValue","ɵɵpropertyInterpolate2","ɵɵpropertyInterpolate3","EMPTY_ARRAY$3","markDuplicates","tStylingKey","isPrevDir","isClassBinding","tStylingAtIndex","cursor","foundDuplicate","tStyleRangeAtCursor","isStylingMatch","tStylingKeyCursor","parserState","textEnd","keyEnd","valueEnd","getLastParsedKey","getLastParsedValue","parseClassNameNext","startIndex","consumeWhitespace","parseStyleNext","ch","consumeSeparator","ch1","ch2","ch3","lastChIndex","consumeQuotedText","resetParserState","quoteCharCode","ɵɵstyleProp","checkStylingProperty","ɵɵclassProp","ɵɵstyleMap","checkStylingMap","styleKeyValueArraySet","styleStringParser","ɵɵclassMap","classStringParser","suffixOrSanitizer","stylingFirstUpdatePass","styleSanitizer","updateStyling","stringParser","hasStylingInputShadow","isInHostBindings","staticPrefix","oldKeyValueArray","newKeyValueArray","oldIndex","oldKey","newKey","setKey","styleKeyValueArray","unwrappedValue","isHostBindings","stylingKey","hostDirectiveDef","residual","collectStylingFromTAttrs","collectStylingFromDirectives","templateStylingKey","bindings","tStylingKeyWithStatic","isHostBinding","tBindings","tmplHead","tmplTail","isKeyDuplicateOfStatic","staticKeyValueArray","previousNode","currentDirective","desiredMarker","currentMarker","unsafeStyle","tRange","isStylingValuePresent","findStylingValue","isProcedural","addClass","classList","removeClass","removeStyle","removeProperty","setStyle","isPrevDirection","rawKey","containsStatics","isStylingMap","valueAtLViewIndex","currentValue","ɵɵtext","textNative","createText","createTextNode","ɵɵtextInterpolate","ɵɵtextInterpolate1","interpolated","ɵɵtextInterpolate2","ɵɵtextInterpolate3","ɵɵtextInterpolate5","i2","v3","i3","v4","ɵɵstyleMapInterpolate1","ɵɵhostProperty","LifecycleHooksFeature","rootTView","dirIndex","ɵɵInheritDefinitionFeature","definition","superType","shouldInheritFields","inheritanceChain","superDef","writeableDef","maybeUnwrapEmpty","superHostBindings","inheritHostBindings","superViewQuery","superContentQueries","inheritViewQuery","inheritContentQueries","animation","defData","ngInherit","prevViewQuery","prevContentQueries","prevHostBindings","SimpleChange","previousValue","firstChange","ɵɵNgOnChangesFeature","ngOnChanges","ngOnChangesSetInput","simpleChangesStore","getSimpleChangesStore","previousChange","resolveProvider$1","lInjectablesBlueprint","providerFactory","beginIndex","existingFactoryIndex","registerDestroyHooksIfSupported","existingProvidersFactoryIndex","existingViewProvidersFactoryIndex","doesProvidersFactoryExist","doesViewProvidersFactoryExist","factoryFn","componentProviders","multiFactoryAdd","multiViewProvidersFactoryResolver","multiProvidersFactoryResolver","contextIndex","multiFactory","isComponentProvider","lData","multiResolve","factories","componentCount","multiProviders","ɵɵProvidersFeature","viewProviders","processProvidersFn","ComponentFactory","_NullComponentFactoryResolver","ComponentFactoryResolver","ElementRef","nativeElement","SWITCH_ELEMENT_REF_FACTORY","RendererFactory2","RendererStyleFlags2","Important","DashCase","Renderer2","SWITCH_RENDERER2_FACTORY","nodeAtIndex","Sanitizer","Version","full","major","minor","patch","DefaultIterableDifferFactory","trackByFn","DefaultIterableDiffer","trackByIdentity","_linkedRecords","_unlinkedRecords","_previousItHead","_itHead","_itTail","_additionsHead","_additionsTail","_movesHead","_movesTail","_removalsHead","_removalsTail","_identityChangesHead","_identityChangesTail","_trackByFn","nextIt","nextRemove","addRemoveOffset","moveOffsets","getPreviousIndex","adjPreviousIndex","currentIndex","_nextRemoved","previousIndex","localMovePreviousIndex","localCurrentIndex","_nextPrevious","_nextAdded","_nextMoved","_nextIdentityChange","check","_reset","itemTrackBy","mayBeDirty","trackById","_verifyReinsertion","_addIdentityChange","_mismatch","_truncate","isDirty","nextRecord","previousRecord","_prev","_remove","_moveAfter","_reinsertAfter","_addAfter","IterableChangeRecord_","reinsertRecord","_addToMoves","_addToRemovals","_unlink","prevRecord","_prevRemoved","_insertAfter","_DuplicateMap","put","toIndex","_prevDup","_nextDup","_DuplicateItemRecordList","_head","_tail","atOrAfterIndex","duplicates","recordList","delete","moveOffset","DefaultKeyValueDifferFactory","DefaultKeyValueDiffer","_records","_mapHead","_appendAfter","_previousMapHead","_changesHead","_changesTail","_nextChanged","_forEach","_maybeAddToChanges","_getOrCreateRecordForKey","_insertBeforeOrAppend","KeyValueChangeRecord_","_addToAdditions","_addToChanges","IterableDiffers","copied","KeyValueDiffers","kv","keyValDiff","defaultIterableDiffers","defaultKeyValueDiffers","TemplateRef","SWITCH_TEMPLATE_REF_FACTORY","ViewContainerRef","SWITCH_VIEW_CONTAINER_REF_FACTORY","NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR","ComponentFactoryResolver$1","componentDef","ComponentFactory$1","toRefArray","nonMinified","templateName","SCHEDULER","componentType","isBoundToModule","rootSelectorOrNode","rootViewInjector","hostRenderer","elementName","hostRNode","elementOrSelector","selectRootElement","rElement","rootFlags","isIsolated","clean","playerHandler","rootLView","tElementNode","viewRenderer","createRootComponentView","nodesforSlot","hostFeatures","rootTNode","ComponentRef$1","_rootLView","destroyCbs","changeDetectorRef","tParentNode","u","localeEn","LOCALE_DATA","findLocaleData","locale","normalizedLocale","getLocaleData","parentLocale","ng","common","locales","LocaleDataIndex","LocaleId","DayPeriodsFormat","DayPeriodsStandalone","DaysFormat","DaysStandalone","MonthsFormat","MonthsStandalone","Eras","FirstDayOfWeek","WeekendRange","DateFormat","TimeFormat","DateTimeFormat","NumberSymbols","NumberFormats","CurrencyCode","CurrencySymbol","CurrencyName","Currencies","PluralCase","ExtraData","BINDING_REGEXP","ICU_REGEXP","generateBindingUpdateOpCodes","destinationNode","sanitizeFn","updateOpCodes","textParts","textValue","toMaskBit","ɵɵi18nAttributes","previousElementIndex","LOCALE_ID","setLocaleId","localeId","actual","expected","comparison","modules","NgModuleRef$1","_parent","_bootstrapComponents","componentFactoryResolver","ngLocaleIdDef","_r3Injector","injectFlags","NgModuleFactory$1","moduleType","registerNgModuleType","incoming","ɵɵpureFunction0","slotOffset","pureFn","ɵɵpureFunction1","exp","pureFunction1Internal","ɵɵpureFunction2","pureFunction2Internal","ɵɵpureFunction3","pureFunction3Internal","ɵɵpureFunction4","bindingRoot","getPureFunctionReturnValue","ɵɵpureFunction6","exp5","exp6","ɵɵpureFunction7","exp7","returnValueIndex","lastReturnValue","ɵɵpipe","pipeName","pipeFactory","pipeInstance","ɵɵpipeBind1","unwrapValue$1","isPure","ɵɵpipeBind2","ɵɵpipeBind3","unwrap","isAsync","__isAsync","generatorOrNext","schedulerFn","errorFn","completeFn","symbolIterator","QueryList","dirty","_results","changes","resultsTree","LQuery_","queryList","setDirty","LQueries_","tQueries","noOfInheritedQueries","viewLQueries","tQuery","getByIndex","indexInDeclarationView","dirtyQueriesWithMatches","getTQuery","TQueryMetadata_","descendants","isStatic","read","TQueries_","queriesForTemplateRef","childQueryIndex","tqueryClone","tquery","TQuery_","metadata","crossesNgTemplate","_appliesToNextNode","_declarationNodeIndex","isApplyingToNode","matchTNode","addMatch","declarationNodeIdx","matchTNodeWithReadOption","getIdxOfMatchingSelector","typePredicate","nodeMatchIdx","directiveOrProviderIdx","matchIdx","createResultForNode","matchingIdx","materializeViewResults","queryIndex","lQuery","tViewData","tQueryMatches","matchedNodeIdx","ɵɵqueryRefresh","collectQueryResults","lViewResults","embeddedLViews","notifyOnChanges","ɵɵstaticViewQuery","descend","viewQueryInternal","ɵɵviewQuery","createTQuery","createLQuery","ɵɵcontentQuery","contentQueryInternal","ɵɵstaticContentQuery","tViewContentQueries","ɵɵloadQuery","track","ɵɵtemplateRefExtractor","APP_INITIALIZER","ApplicationInitStatus","appInits","initialized","donePromise","rej","asyncInitPromises","initResult","catch","APP_ID","APP_ID_RANDOM_PROVIDER","_randomChar","PLATFORM_INITIALIZER","PLATFORM_ID","APP_BOOTSTRAP_LISTENER","Console","LOCALE_ID$1","DEFAULT_CURRENCY_CODE","ModuleWithComponentFactories","ngModuleFactory","componentFactories","Compiler_compileModuleSync__POST_R3__","Compiler_compileModuleSync","Compiler_compileModuleAsync","Compiler_compileModuleAndAllComponentsSync__POST_R3__","declaration","Compiler_compileModuleAndAllComponentsSync","Compiler_compileModuleAndAllComponentsAsync","Compiler","compileModuleSync","compileModuleAsync","compileModuleAndAllComponentsSync","compileModuleAndAllComponentsAsync","COMPILER_OPTIONS","scheduleMicroTask","Zone","NgZone","enableLongStackTrace","shouldCoalesceEventChangeDetection","hasPendingMacrotasks","hasPendingMicrotasks","isStable","onUnstable","onMicrotaskEmpty","onStable","onError","assertZonePatched","_nesting","_outer","_inner","fork","lastRequestAnimationFrameId","nativeRequestAnimationFrame","nativeCancelAnimationFrame","unpatchedRequestAnimationFrame","__symbol__","unpatchedCancelAnimationFrame","zone","maybeDelayChangeDetection","updateMicroTaskStatus","checkStable","onInvokeTask","delegate","task","applyThis","applyArgs","onEnter","invokeTask","onLeave","onInvoke","onHasTask","hasTaskState","hasTask","change","_hasPendingMicrotasks","microTask","macroTask","onHandleError","runOutsideAngular","isInAngularZone","run","scheduleEventTask","EMPTY_PAYLOAD","noop$1","runTask","cancelTask","runGuarded","NoopNgZone","Testability","_ngZone","_pendingCount","_isZoneStable","_didWork","_callbacks","taskTrackingZone","_watchAngularEvents","assertNotInAngularZone","_runCallbacksIfReady","cb","timeoutId","doneCb","pending","getPendingTasks","updateCb","macroTasks","creationLocation","addCallback","using","exactMatch","TestabilityRegistry","_applications","_testabilityGetter","addToWindow","testability","elem","findInAncestors","findTestabilityInTree","_NoopGetTestability","_platform","compileNgModuleFactory","moduleFactory","compilerProviders","part","compiler","globalNg","ɵcompilerFacade","resourceLoader","ResourceLoader","resourceResolver","componentResolved","urlMap","cachedResourceResolve","resp","promises","templateUrl","styleUrls","styleOffset","styleUrl","fullyResolved","ALLOW_MULTIPLE_PLATFORMS","NgProbeToken","createPlatformFactory","parentPlatformFactory","extraProviders","getPlatform","injectedProviders","PlatformRef","inits","requiredToken","_injector","_modules","_destroyListeners","ngZone","ngZoneOption","ngZoneEventCoalescing","ngZoneInjector","moduleRef","exceptionHandler","initStatus","runInitializers","_moduleDoBootstrap","compilerOptions","optionsReducer","bootstrapModuleFactory","ngDoBootstrap","objs","ApplicationRef","_zone","_exceptionHandler","_componentFactoryResolver","_initStatus","_bootstrapListeners","_views","_runningTick","_enforceNoNewChanges","_stable","componentTypes","tick","isCurrentlyStable","stableSub","unstableSub","assertInAngularZone","componentOrFactory","resolveComponentFactory","compRef","_unloadComponent","registerApplication","_loadComponent","detectChanges","checkNoChanges","attachToAppRef","detachFromAppRef","attachView","NgModuleFactoryLoader","SystemJsNgModuleLoaderConfig","DEFAULT_CONFIG","factoryPathPrefix","factoryPathSuffix","SystemJsNgModuleLoader","_compiler","config","_config","loadAndCompile","checkNotEmpty","factoryClassSuffix","modulePath","platformCore","APPLICATION_MODULE_PROVIDERS","queue","$localize","ApplicationModule","environment","_DOM","getDOM","PlatformLocation","useBrowserPlatformLocation","LOCATION_INITIALIZED","BrowserPlatformLocation","_doc","_init","getLocation","_history","getHistory","getBaseHref","getGlobalEventTarget","href","protocol","hostname","port","pathname","newPath","title","supportsState","pushState","replaceState","forward","back","createBrowserPlatformLocation","history","joinWithSlash","slashes","stripTrailingSlash","pathEndIdx","normalizeQueryParams","params","LocationStrategy","provideLocationStrategy","platformLocation","APP_BASE_HREF","PathLocationStrategy","_platformLocation","getBaseHrefFromDOM","_baseHref","onPopState","onHashChange","internal","includeHash","queryParams","externalUrl","prepareExternalUrl","HashLocationStrategy","Location","platformStrategy","_urlChangeListeners","_platformStrategy","browserBaseHref","_stripIndexHtml","getState","query","baseHref","_notifyUrlChangeListeners","onNext","onThrow","onReturn","createLocation","NumberFormatStyle","Decimal","Percent","Currency","Scientific","Plural","Zero","One","Two","Few","Many","Other","FormStyle","Format","Standalone","TranslationWidth","Narrow","Abbreviated","Wide","Short","FormatWidth","Medium","Long","Full","NumberSymbol","Group","List","PercentSign","PlusSign","MinusSign","Exponential","SuperscriptingExponent","PerMille","NaN","TimeSeparator","CurrencyDecimal","CurrencyGroup","getLocaleDateFormat","getLastDefinedValue","getLocaleTimeFormat","getLocaleDateTimeFormat","getLocaleNumberSymbol","getLocaleNumberFormat","checkFullData","extractTime","h","hours","minutes","ISO8601_DATE_REGEX","NAMED_FORMATS","DATE_FORMATS_SPLIT","ZoneWidth","ShortGMT","Extended","DateType","FullYear","Month","Hours","Minutes","Seconds","FractionalSeconds","Day","TranslationType","DayPeriods","Days","Months","formatDate","timezone","date","parsedNb","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","ms","getNamedFormat","shortTime","shortDate","formatDateTime","mediumTime","mediumDate","longTime","longDate","fullTime","fullDate","dateTimezoneOffset","getTimezoneOffset","timezoneToOffset","getTime","setMinutes","dateFormatter","DATE_FORMATS","formatter","dateStrGetter","dateGetter","weekGetter","timeZoneGetter","opt_values","padNumber","num","digits","minusSign","negWrap","neg","strNum","getFullYear","getMilliseconds","getDay","localeMinus","form","extended","formStyle","days","currentHours","currentMinutes","rules","rule","dayPeriods","hoursFrom","minutesFrom","hoursTo","minutesTo","amPm","monthBased","nbDaysBefore1stDayOfMonth","today","firstThurs","year","firstDayOfYear","THURSDAY","diff","datetime","fallback","requestedTimezoneOffset","NUMBER_FORMAT_REGEXP","formatNumberToLocaleString","groupSymbol","decimalSymbol","digitsInfo","isPercent","formattedText","isZero","parsedNumber","integerLen","zeros","numStr","exponent","MAX_DIGITS","fractionLen","minInt","minFraction","minFrac","maxFraction","maxFrac","minIntPart","minFractionPart","maxFractionPart","parseIntAutoRadix","fractionSize","roundAt","digit","dropTrailingZeros","minLen","carry","decimals","groups","lgSize","gSize","negPre","negSuf","posPre","posSuf","parseNumberFormat","patternParts","positive","negative","positiveParts","integer","fraction","trunkLen","pos","NgLocalization","NgLocaleLocalization","parseCookieValue","cookieStr","encodeURIComponent","cookie","eqIndex","cookieName","cookieValue","decodeURIComponent","NgClass","_iterableDiffers","_keyValueDiffers","_ngEl","_renderer","_iterableDiffer","_keyValueDiffer","_initialClasses","_rawClass","_removeClasses","_applyClasses","iterableChanges","_applyIterableChanges","keyValueChanges","_applyKeyValueChanges","forEachAddedItem","_toggleClass","forEachChangedItem","forEachRemovedItem","rawClassVal","klass","enabled","ngClass","NgForOfContext","$implicit","ngForOf","even","NgForOf","_viewContainer","_template","_differs","_ngForOf","_ngForOfDirty","_differ","ngForTrackBy","_applyChanges","insertTuples","forEachOperation","adjustedPreviousIndex","tuple","RecordViewTuple","move","_perViewChange","ilen","forEachIdentityChange","ngForTemplate","NgIf","NgIfContext","_thenTemplateRef","_elseTemplateRef","_thenViewRef","_elseViewRef","condition","ngIf","_updateView","assertTemplate","ngIfThen","ngIfElse","SwitchView","_templateRef","_created","created","NgSwitch","_defaultUsed","_caseCount","_lastCaseCheckIndex","_lastCasesMatched","_ngSwitch","_updateDefaultCases","_defaultViews","matched","useDefault","enforceState","ngSwitch","NgSwitchCase","viewContainer","_addCase","_matchCase","ngSwitchCase","NgSwitchDefault","_addDefault","NgStyle","_ngStyle","nameAndUnit","unit","_setStyle","ngStyle","NgTemplateOutlet","_viewRef","ngTemplateOutletContext","ngTemplateOutlet","_shouldRecreateView","viewContainerRef","_updateExistingContext","ctxChange","_hasContextShapeChanged","prevCtxKeys","currCtxKeys","invalidPipeArgumentError","DatePipe","DecimalPipe","_locale","strToNumber","PercentPipe","CommonModule","isPlatformBrowser","platformId","ViewportScroller","BrowserViewportScroller","supportScrollRestoration","scrollX","scrollY","scrollTo","elSelectedById","scrollToElement","elSelectedByName","scrollRestoration","rect","getBoundingClientRect","pageXOffset","top","pageYOffset","adapter","groupEnd","evt","getDefaultDocument","DocumentFragment","baseElement","getAttribute","urlParsingNode","performance","TRANSITION_ID","SERVER_TRANSITION_PROVIDERS","transitionId","dom","querySelectorAll","getter","getAllTestabilities","getAllRootElements","testabilities","didWork","decrement","didWork_","whenStable","getTestability","isShadowRoot","parentElement","EVENT_MANAGER_PLUGINS","EventManager","plugins","_eventNameToPlugin","_plugins","_findPluginFor","addGlobalEventListener","plugin","SharedStylesHost","_stylesSet","additions","onStylesAdded","DomSharedStylesHost","_hostNodes","_styleNodes","styleEl","hostNode","_addStylesToHost","styleNode","NAMESPACE_URIS","COMPONENT_REGEX","flattenStyles","compId","decoratePreventDefault","eventHandler","DomRendererFactory2","eventManager","sharedStylesHost","appId","rendererByCompId","defaultRenderer","EmulatedEncapsulationDomRenderer2","applyToHost","addStyles","newChild","refChild","oldChild","selectorOrNode","preserveContent","namespaceUri","removeAttributeNS","nodeValue","contentAttr","hostAttr","componentShortId","hostEl","shadowRoot","attachShadow","createShadowRoot","addHost","removeHost","nodeOrShadowRoot","DomEventsPlugin","MODIFIER_KEYS","_keyMap","_chromeNumKeyPadMap","MODIFIER_KEY_GETTERS","altKey","ctrlKey","metaKey","shiftKey","KeyEventsPlugin","parseEventName","parsedEvent","outsideHandler","eventCallback","getZone","onAndCancel","domEventName","_normalizeKey","fullKey","modifierName","keyIdentifier","modifierGetter","getEventFullKey","keyName","DomSanitizer","DomSanitizerImpl","platformBrowser","makeCurrent","BROWSER_MODULE_PROVIDERS","BrowserModule","parentModule","of","FilterOperator","HttpHandler","HttpBackend","HttpHeaders","headers","normalizedNames","lazyUpdate","lazyInit","maybeSetNormalizedName","op","lcName","copyFrom","applyUpdate","toDelete","HttpUrlEncodingCodec","standardEncoding","HttpParams","updates","cloneFrom","encoder","fromString","fromObject","rawParams","codec","param","eqIdx","decodeKey","decodeValue","eKey","encodeKey","encodeValue","isBlob","Blob","isFormData","FormData","HttpRequest","third","fourth","reportProgress","withCredentials","urlWithParams","qIdx","setHeaders","setParams","HttpEventType","Sent","UploadProgress","ResponseHeader","DownloadProgress","Response","User","HttpResponseBase","defaultStatus","defaultStatusText","status","statusText","ok","HttpHeaderResponse","HttpResponse","HttpErrorResponse","addBody","observe","HttpClient","req","events$","handle","res$","request","callbackParam","append","HttpInterceptorHandler","intercept","HTTP_INTERCEPTORS","NoopInterceptor","XSSI_PREFIX","XhrFactory","BrowserXhr","HttpXhrBackend","xhrFactory","build","setRequestHeader","detectedType","detectContentTypeHeader","reqBody","serializeBody","headerResponse","partialFromXhr","getAllResponseHeaders","responseURL","getResponseHeader","onLoad","responseText","originalBody","sentHeaders","onDownProgress","progressEvent","loaded","lengthComputable","total","partialText","onUpProgress","progress","upload","abort","XSRF_COOKIE_NAME","XSRF_HEADER_NAME","HttpXsrfTokenExtractor","HttpXsrfCookieExtractor","lastCookieString","lastToken","parseCount","cookieString","HttpXsrfInterceptor","tokenService","headerName","lcUrl","getToken","HttpInterceptingHandler","backend","interceptors","HttpClientXsrfModule","HttpClientModule","withOptions","ComponentLookupRegistry","extendStatics","setPrototypeOf","__proto__","__extends","__","__assign","__decorate","decorators","Reflect","decorate","__awaiter","_arguments","P","generator","fulfilled","rejected","__generator","g","label","sent","trys","ops","verb","DashboardMetricParams","DashboardMetricParamOrders","SGMMetricParams","AMBParams","ApiMapping","params_to_include","apiOverride","metric_id","months3","PersonaTypes","CuaManager","TSS","GEO","Customer","CtCustomer","CtAccount","ProductLine","SN","ManagerAmb","CuaAmb","CuaAmbManager","AccountRep","AbbottIdAmb","Amb","ManagerOverview","ManagersSpecifcAmb","Account","ParamSource","ParamMapping","appid","DefaultParams","sourceKey","apiParamName","appversion","loggedinuserisambmanager","AuthUserInfo","loggedinuserisambmanager_false","issuperuser","issuperuser_false","isSuperUser_false","issuperuser_true","abbottid","Persona","abbottid_amb","abbottid_chandsn","abbottid_auth","managerid","manageridHack","ParamLogic","managerid_amb","managerid_chandsn","managerid_auth","managerid_empty","orgname","orgname_empty","sgm_orgname","customersearch","FilterChoices","accountsearch","cuacustomersearch","cua_search_record_limit","productlinesearch","search_persona_menu_customerid","default","search_persona_menu_productlineid","customerid","customerid_all","customerdetail_id","ApiCallInstance","servicecontract_entitlementid","ordernumber","productlineid","productlineid_all","sn","isAMB","isAMBfalse","flagshipfalse","flagship","istrackfalse","openstar","openstartrue","istrack","metricid","months12","months6","culture","primary","Preferences","tertiary","isreagent","isfieldservicecontract","isother","isservice","iscapital","accountid","accountid_all","diseasestateid","assaysid","ln","detail_ln","band","isamb","abbottid_amb_filters","managerid_amb_filters","metricid_call","detail_customerid","detail_customerid_accountid","detail_productlineid","detail_accountid","DetailChoices","detail_assayid","detail_diseasestate","detail_iscapital","detail_isservice","detail_isreagent","detail_isfieldservicecontract","detail_isother","predictive_detail_sn","predictive_detail_customerid","predictive_detail_orgname","product_set_number","ct_persona_type","ct_persona_value","cua_persona_type","cua_persona_value","cua_uniqueCustomerKey","cua_primary","cua_secondary","cua_tertiary","cua_product_family_set","ct_customer_id","ct_primary","ct_secondary","ct_tertiary","startingrow","alerttype","isloadall","subscribe_endpoint","subscribe_expirationTime","subscribe_auth","subscribe_p256dh","requestTime","customerIdHack","br_tests","br_testo","br_testc","br_periods_to_show","BrParams","br_months","br_cust_bs","br_sg","br_org","br_location","br_locallevel","br_uck","br_pl","br_acct_cust_search","br_template_name","br_template_string","br_template_id","br_presentation_name","trigger_list_user_presentations_update","trigger_list_user_templates_update","force_call_via_unique_param","acct_pres_name","br_presentation_settings","br_presentation_id","br_period","br_show_sql","false","true","emptystring","orgnameAMT","cuasearchrecordlimit","testsearch","testorg","testcountry","RefreshHandlerService","keyIndex","apiRefreshCallbacks","apiChangeTriggers","apiRoutesForDebugging","refreshTreeConfig","changeTriggers","route","triggers","trigger","triggerCallbacks","checkIfChangeTriggerApplies","paramMappingKeys","paramMappingKey","changeTriggerKey","AuthenticationService","http","refreshHandlerService","devuser","isAuthActive","callbacks","callbackRefs","callbackPreReqs","pausedCallbacks","isAuthorized","pingAuth","formData","userInfoTemp","authorizedInfo","isAMBManager","isSuperUser","userInfo","callCallbacks","runPreReqsFor","ref","playCallback","preReq","FilterChoicesService","filterSelections","PersonaLevels","level1Service","apiCalls","mappingKey","level2ServiceCustomers","level2ServiceInstruments","level1Amb","ToolSelectionOptions","DashboardOptions","DetailChoicesService","displayCallbacks","holdUpdate","callDisplayCallbacks","getKeys","setFilter","callUpdateListenerByKey","keyI","SelectedTabService","selectedDashboard","PersonaService","auth","detailChoices","selectedTabService","serviceVsAmbState","authAbbottId","authUPI","authName","personaType","persona","personaLabel","customer","customerLabel","customerOverride","account","accountLabel","accountOverride","instrumentPersonaType","instrumentPersona","instrumentPersonaLabel","ambPersonaType","ambPersona","ambPersonaLabel","accountPersona","accountPersonaLabel","lastPersonaSave","lastPersonaAmbSave","onAuth","getUserInfo","upi","firstname","lastname","tmpServiceVsAmbState","setServiceVsAmbState","personatype","setPersonaOption","personaName","ambpersonatype","ambpersona","ambpersonaName","refreshDetailChoices","getLastSelectedTabInfo","controltower","instruments","ambassador","savePersona","savePersonaAmb","triggerPersonaChoiceUpdates","personaCall","personanameCall","personatypeCall","personaSaveKey","pn","pt","sendPut","loginid","personaname","httpHeaders","PreferenceSelectionService","preferences","arePreferencesLoaded","NavbarBuilderService","isVisible","isVisibleSubject","navbarChoiceSubject","navFilterSelectionSubject","navbarChoice","navFilterSelection","tickNavFilterSelectionSubject","SelectedManagerService","managerUpi","manager511","managerName","ParamLogicService","authService","personaService","preferenceSelectionService","navbarBuilderService","selectedManagerService","authUserInfo","lastSelectedTab","getNavbarChoice","getFilter","level2PersonaChoice","getLevel2Choice","customerSet","dashboard","getPersonaOption","getLevel1Choice","customerId","getManagerUpi","getPreference","isAuth","md5","RotateLeft","lValue","iShiftBits","AddUnsigned","lX","lY","lX4","lY4","lX8","lY8","lResult","FF","ac","GG","HH","II","WordToHex","lCount","WordToHexValue","WordToHexValue_temp","AA","BB","CC","DD","lWordCount","lMessageLength","lNumberOfWords_temp1","lNumberOfWords","lWordArray","lBytePosition","lByteCount","utftext","_value","getValue","EmptyError","EmptyErrorImpl","outerValue","outerIndex","innerIndex","innerSub","subscribeToResult","outerSubscriber","combineLatest","CombineLatestOperator","toRespond","unused","_outerValue","_tryResultSelector","observableFactory","concatAll","ArgumentOutOfRangeError","ArgumentOutOfRangeErrorImpl","takeLast","ring","throwIfEmpty","errorFactory","defaultErrorFactory","ThrowIfEmptyOperator","hasValue","defaultIfEmpty","DefaultIfEmptyOperator","hasDefaultValue","catchError","CatchOperator","caught","err2","_unsubscribeAndRecycle","EveryOperator","everyValueMatch","switchMap","SwitchMapOperator","scan","seed","hasSeed","ScanOperator","_seed","DoOperator","_tapNext","_tapError","_tapComplete","FinallyOperator","RouterEvent","NavigationStart","navigationTrigger","restoredState","NavigationEnd","urlAfterRedirects","NavigationCancel","reason","NavigationError","RoutesRecognized","GuardsCheckStart","GuardsCheckEnd","shouldActivate","ResolveStart","ResolveEnd","RouteConfigLoadStart","RouteConfigLoadEnd","ChildActivationStart","snapshot","routeConfig","ChildActivationEnd","ActivationStart","ActivationEnd","Scroll","routerEvent","ɵEmptyOutletComponent","ParamsAsMap","convertToParamMap","navigationCancelingError","defaultUrlMatcher","segments","segmentGroup","pathMatch","hasChildren","posParams","consumed","LoadedRouterConfig","routes","validateConfig","parentPath","getFullPath","fullPath","loadChildren","outlet","redirectTo","matcher","currentRoute","standardizeConfig","shallowEqual","k1","k2","equalArraysOrString","aItem","wrapIntoObservable","containsTree","containee","exact","equalSegmentGroups","equalPath","numberOfChildren","containsSegmentGroup","containsSegmentGroupHelper","containeePaths","UrlTree","fragment","_queryParamMap","DEFAULT_SERIALIZER","serialize","UrlSegmentGroup","serializePaths","UrlSegment","_parameterMap","serializePath","as","bs","mapChildrenIntoArray","childOutlet","UrlSerializer","DefaultUrlSerializer","UrlParser","parseRootSegment","parseQueryParams","parseFragment","tree","serializeSegment","strParams","encodeUriQuery","encodeUriString","encodeUriSegment","decode","decodeQuery","SEGMENT_RE","matchSegments","QUERY_PARAM_RE","QUERY_PARAM_VALUE_RE","consumeOptional","peekStartsWith","parseChildren","parseQueryParam","parseSegment","capture","parseParens","parseMatrixParams","parseParam","valueMatch","decodedKey","decodedVal","currentVal","allowPrimary","outletName","Tree","_root","pathFromRoot","findNode","findPath","cc","TreeNode","nodeChildrenAsMap","RouterState","setRouterState","createEmptyState","urlTree","activated","ActivatedRouteSnapshot","RouterStateSnapshot","emptyUrl","emptyParams","emptyData","emptyQueryParams","futureSnapshot","_futureSnapshot","_routerState","_paramMap","inheritedParamsDataResolve","paramsInheritanceStrategy","inheritingStartingFrom","curr","_resolvedData","urlSegment","lastPathIndex","_urlSegment","_lastPathIndex","_resolve","serializeNode","advanceActivatedRoute","currentSnapshot","nextSnapshot","equalParamsAndUrlSegments","isMatrixParams","command","outlets","segmentPath","oldSegmentGroup","newSegmentGroup","qp","replaceSegment","oldSegment","newSegment","Navigation","numberOfDoubleDots","commands","cmdWithOutlet","Position","processChildren","getPath","updateSegmentGroup","updateSegmentGroupChildren","currentCommandIndex","currentPathIndex","noMatch","pathIndex","commandIndex","compare","slicedCommands","createNewSegmentGroup","createNewSegmentChildren","ActivateRoutes","routeReuseStrategy","futureState","currState","forwardEvent","parentContexts","futureRoot","currRoot","deactivateChildRoutes","activateChildRoutes","futureNode","currNode","contexts","futureChild","childOutletName","deactivateRoutes","childName","deactivateRouteAndItsChildren","parentContext","future","getContext","shouldDetach","detachAndStoreRouteSubtree","deactivateRouteAndOutlet","onOutletDeactivated","deactivate","activateRoutes","getOrCreateContext","shouldAttach","stored","retrieve","onOutletReAttached","attachRef","attach","advanceActivatedRouteNodeAndItsChildren","_loadedConfig","cmpFactoryResolver","activateWith","isUrlTree","NoMatch","AbsoluteRedirect","absoluteRedirect","newTree","namedOutletsRedirect","configLoader","urlSerializer","allowRedirects","expandSegmentGroup","rootSegmentGroup","createUrlTree","noMatchError","rootCandidate","expandChildren","expandSegment","waitHead","waitTail","expandSegmentAgainstRoute","noLeftoversInUrl","getOutlet","matchSegmentAgainstRoute","expandSegmentAgainstRouteUsingRedirect","expandWildCardWithParamsAgainstRouteUsingRedirect","expandRegularSegmentAgainstRouteUsingRedirect","applyRedirectCommands","lineralizeSegments","newSegments","consumedSegments","lastChild","positionalParamSegments","rawSegmentGroup","cfg","rawSlicedSegments","getChildConfig","routerConfig","childModule","childConfig","slicedSegments","isEmptyPathRedirect","mergeTrivialChildren","primarySegmentGroup","canLoad","injectionToken","guardVal","shouldLoad","applyRedirectCreatreUrlTree","newRoot","createSegmentGroup","createQueryParams","redirectToParams","actualParams","sourceName","updatedSegments","createSegments","redirectToSegments","actualSegments","findPosParam","findOrReturn","redirectToUrlSegment","CanActivate","CanDeactivate","getAllRouteGuards","getChildRouteGuards","futurePath","checks","canDeactivateChecks","canActivateChecks","prevChildren","shouldRun","runGuardsAndResolvers","isActivated","INITIAL_VALUE","prioritizedGuardValue","acc","isPending","innerAcc","fireActivationStart","fireChildActivationStart","runCanActivate","futureRSS","futureARS","canActivate","runCanActivateChild","canActivateChildGuardsMapped","canActivateChild","guards","NoMatch$1","rootComponentType","relativeLinkResolution","split$1","processSegmentGroup","freeze","rootNode","routeState","inheritParamsAndData","routeNode","processSegment","nodes","names","routeWithSameOutletName","localeCompare","processSegmentAgainstRoute","rawSegment","getSourceSegmentGroup","getPathIndexShift","getResolve","_sourceSegment","_segmentIndexShift","emptyPathMatch","getOutlet$1","primarySegment","getResolver","switchTap","nextResult","DefaultRouteReuseStrategy","detachedTree","ROUTES","loader","onLoadStartListener","onLoadEndListener","loadModuleFactory","DefaultUrlHandlingStrategy","newUrlPart","wholeUrl","defaultErrorHandler","defaultMalformedUriErrorHandler","defaultRouterHook","runExtras","Router","rootContexts","lastSuccessfulNavigation","currentNavigation","navigationId","isNgZoneEnabled","malformedUriErrorHandler","navigated","lastSuccessfulId","beforePreactivation","afterPreactivation","urlHandlingStrategy","onSameUrlNavigation","urlUpdateStrategy","resetConfig","currentUrlTree","rawUrlTree","browserUrlTree","triggerEvent","routerState","transitions","currentRawUrl","extractedUrl","extract","rawUrl","extras","targetSnapshot","currentRouterState","targetRouterState","guardsResult","navigations","setupNavigations","processNavigations","eventsSubject","completed","errored","initialUrl","previousNavigation","urlTransition","shouldProcessUrl","transition","serializeUrl","finalUrl","serializer","skipLocationChange","setBrowserUrl","replaceUrl","routesRecognized","navStart","appliedUrlTree","guardsStart","currRSS","currARS","canDeactivate","guardsEnd","resetUrlToCurrentUrlTree","navCancel","resolveStart","resolvedData","resolveEnd","prevState","createNode","shouldReuseRoute","detachedRouteHandle","setFutureSnapshotsOfActivatedRoutes","activate","redirecting","resetStateAndUrl","mergedTree","scheduleNavigation","navError","ee","getTransition","setUpLocationChangeListener","navigateByUrl","locationSubscription","parseUrl","dispose","navigationExtras","relativeTo","preserveQueryParams","queryParamsHandling","preserveFragment","q","removeEmptyProps","nav","cmd","cmdIdx","urlPart","partIndex","toRoot","startingPosition","modifier","ci","dd","priorPromise","lastNavigation","setTransition","isCurrentPathEqualTo","go","storedState","storedUrl","RouterLink","router","tabIndex","preserve","attrBoolValue","onClick","routerLink","RouterLinkWithHref","locationStrategy","updateTargetUrlAndHref","$event","OutletContext","ChildrenOutletContexts","RouterOutlet","changeDetector","_activatedRoute","activateEvents","deactivateEvents","onChildOutletCreated","onChildOutletDestroyed","cmp","activatedRoute","childContexts","OutletInjector","createComponent","markForCheck","PreloadingStrategy","RouterPreloader","moduleLoader","preloadingStrategy","preload","processRoutes","preloadConfig","RouterScroller","viewportScroller","lastId","lastSource","restoredId","scrollPositionRestoration","anchorScrolling","setHistoryScrollRestoration","routerEventsSubscription","createScrollEvents","scrollEventsSubscription","consumeScrollEvents","getScrollPosition","scheduleScrollEvent","scrollToPosition","scrollToAnchor","ROUTER_CONFIGURATION","ROUTER_FORROOT_GUARD","ROUTER_PROVIDERS","enableTracing","logGroup","logGroupEnd","routerNgProbeToken","RouterModule","provideRoutes","provideForRootGuard","createRouterScroller","getAppInitializer","ROUTER_INITIALIZER","getBootstrapListener","scrollOffset","setOffset","platformLocationStrategy","useHash","RouterInitializer","initNavigation","resultOfPreactivationDone","isLegacyDisabled","isLegacyEnabled","initialNavigation","bootstrappedComponentRef","preloader","routerScroller","setUpPreloading","resetRootComponentType","appInitializer","bootstrapListener","BrParamsService","paramChanged","savedParams","org","locallevel","location_description","uck","product_description","sg","sg_description","cust_bs","cust_bs_description","acct_customer_query","list_user_presentations_update","list_user_templates_update","products_data","location_data","presentedName","presentationId","acct_cust_data","br_history_range_dashboard","br_history_range_detail","detailperiod","br_selected_template_name","br_selected_template_string","br_selected_template_id","dashboardState","dashboardUck","dashboardPresentedName","showSql","uuid","show_sql","brParamsDump","sourceParamKey","newSettings","ParameterResolverService","filterChoices","paramLogic","brParamsService","paramsToInclude","paramKey","isFilterSet","isParamReady","isPreferenceKeyValid","parameter","finalParams","paramValue","getParameter","dispatch","CachedResponseRepoService","activeRequest","StackRequestService","stacks","requestUniqueParams","paramsCopy","exemptParam","ruParams","routeY","requestUniqueParamsY","stackKey","RequestState","apiUrl","mockMode","Inactive","stateChangeCallbacks","cancelSubscribeCallsCount","cacheKey","stackRequest","clearActiveRequest","paramKeysToInclude","paramSourceKeyIndex","getSourceKeyForParamKey","callApi","filtersReady","getParametersForRoute","finalRoute","formatKey","isCached","responseData","getResponse","apiData","changeState","Complete","isActiveRequest","getActiveRequest","calcRoute","cancelSubscription","cacheResponse","Loading","cacheActiveRequest","NotCallable","Waiting","ApiService","requestHandlers","PreferenceApiConnectorService","apiService","parameterResolverService","loadComplete","requestHandler","sendRequest","onStateChange","setPreferences","getPreferences","triggerUpdates","onRefreshEvent","getRelativeParams","localcurrency","fahrenheit","celsius","displayorder","ambDisplayOrder","formData2","BrHistoryRange","historyRange","PresentationToggleHandlerService","toggleChanged","newState","PresentationSelectService","getPresentationSource","requestHandler2","callApiSource","refreshHandleKey","getUserPresentation","apiSource","apiDataIndex","DetailQueryParamsService","brHistoryRange","presentationToggleHandlerService","presentationSelectService","buildComplete","returnPathReady","returnUrl","returnParams","d2","completeUrl","getUUID","localStorage","setItem","uuidForReturnPath","getCompleteUrl","currentUrl","returnPathDetails","getItem","returnUrlKey","sessionKey","brParamsData","ckey","period","NodatacheckService","BaseTileComponent","preferenceApiConnectorService","detailQueryParamsService","nodatacheckService","showTitle","defaultPreferences","tileReference","prefKey","getQueryParams","TileComponent","setupPreferences","setApiCallResponse","cancelRefreshEvent","translateApiDataForChart","rangeData","apiObjectKey","dataexists","atLeastOneValueNotNull","num1","divisibleBy","StateHandlerComponent","noDataCheck","work","recycleAsyncId","requestAsyncId","setInterval","clearInterval","_execute","errorValue","Scheduler","SchedulerAction","scheduled","execute","AuditOperator","durationSelector","throttled","duration","clearThrottle","isNumeric","auditTime","dueTime","periodOrScheduler","due","ARC","BLACK","BOTTOM","CENTER","CIRCLE","DATE","FORMAT_REGEX","LEFT","MAX_VALUE","MIN_VALUE","RIGHT","TOP","VALUE","WHITE","X","Y","classArray","SPACE_REGEX","_observers","_suspended","field","removeObserver","addObserver","defined","member","_wrap","_set","optionsChange","composite","parentObj","fieldName","_clear","setAccessor","geometryChange","getAccessor","TBase","fields","capitalized","power","pow","DEG_TO_RAD","MAX_NUM","MIN_NUM","rad","degrees","Matrix","matrix","det","cos","sin","scaleX","scaleY","IDENTITY","toMatrix","transformation","originPoint","ZERO","rotate","point","translate","doRound","arg0","arg1","minX","minY","maxX","maxY","height","setOrigin","setSize","equals","_observerField","tl","topLeft","transformCopy","tr","topRight","br","bottomRight","bl","bottomLeft","fromPoints","rectOuter","expandCopy","rectInner","containsPoint","rect1","bottom","rect2","_matrix","multiplyCopy","_optionsChange","defId","definitionId","valueOrDefault","isTransparent","color","_initOptions","clip","parentMatrix","parentTransform","elementMatrix","combinedMatrix","bbox","_clippedBBox","intersect","visible","currentTransform","transformedPoint","_hasFill","_containsPoint","_isOnPath","_hasStroke","stroke","ellipseExtremeAngles","rx","ry","extremeX","extremeY","PI_DIV_2","radius","setCenter","setRadius","_pointAt","extremeAngles","minPoint","maxPoint","currentPointX","currentPointY","currentPoint","pointDistance","distanceTo","opacity","newFill","IDENTITY_MATRIX_HASH","matrixHash","_bboxCache","_matrixHash","_bbox","strokeWidth","geometryAccessor","geometry","_geometry","deg","radians","tolerance","closeOrLess","accessors","radiusX","radiusY","startAngle","endAngle","anticlockwise","xRotation","radian","curvePoints","pointAt","_arcInterval","intervalAngle","subIntervalsCount","subIntervalAngle","currentAngle","nextAngle","points","_intervalCurvePoints","cp1","cp2","endPoint","currentAngleX","bboxStartAngle","currentAngleY","oldStart","p1Derivative","_derivativeAt","p2Derivative","angleRad","pointRadius","startPoint","p0","p3","s1x","s2x","s1y","s2y","nx","ny","calculateAngle","inAngleRange","largeArc","swipe","arcParameters","x1","y1","x2","y2","cosine","sine","xT","yT","sign","xt2","yt2","rx2","ry2","constT","cxT","cyT","cx","cy","uX","uY","vX","vY","acos","angleCosine","signEndAngle","_splice","_change","elements","_add","howMany","_clearObserver","_setObserver","isOutOfEndPoint","controlPoint","calculateCurveAt","t1","toCubicPolynomial","real","img","cNumber","nthR","numberSign","solveCubicEquation","squareRoot","Q","b3a","y3","z1","z2","nthRoot","multiplyConstant","isReal","hasRootsInRange","rootField","polynomial","roots","lineIntersectionsCount","intersects","pointAccessor","controlIn","controlOut","toSegment","segmentAnchor","toSegmentAnchor","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","arrayLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","intersectionsCount","rayIntersection","intersectsRay","bboxTo","endSegment","p4","rotatedPoints","isOnPath","_isOnCurveTo","_isOnLineTo","toLineParamaters","isVertical","insertPosition","reflectionPoint","scaleCopy","quadraticToCubicControlPoints","scaledPoint","translateWith","isRelative","lineTo","curveTo","arcTo","previousCommand","lastControlIn","cubicControlPoints","SEGMENT_REGEX","SPLIT_REGEX","pathInstance","closePath","moveTo","elementsBoundingBox","applyTransform","boundingBox","elementBoundingBox","rawBBox","elementsClippedBoundingBox","clippedBBox","lineJoin","suspend","resume","lastSegment","arc","_addArcSegments","_intersectionsTo","pathWidth","_isOnPathTo","segmentBox","_size","_length","_map","newer","older","REPLACE_REGEX","normalizeText","objectKey","hashKey","DEFAULT_OPTIONS","baselineMarkerSize","defaultMeasureBox","TextMetrics","_cache","baseline","cachedResult","measureBox","box","baselineMarker","_baselineMarker","cloneNode","textStr","offsetWidth","offsetHeight","offsetTop","measureText","measure","font","_rect","childrenField","traverse","second","_reparent","childrenChange","newParent","translateToPoint","transofrm","align","axis","sizeField","alignStartReverse","alignContent","justifyContent","alignItems","spacing","orientation","lineSpacing","revers","forEachReverse","_fieldMap","fieldMap","groupsSizeField","groupAxis","groupsAxis","justifyAlign","_initMap","groupsSize","_initGroups","groupOrigin","elementOrigin","groupBox","groupStart","arrangeElements","groupIdx","lineSize","bboxes","scaledStart","newStart","_newGroup","addGroup","_addToGroup","alignElements","alignment","stackElements","stackAxis","otherAxis","previousBBox","createStackElements","vStack","wrapElements","maxSize","stackSize","addElementToStack","elementIdx","vWrap","elementSize","rectSize","optionsAccessor","stops","_createStops","_userSpace","userSpace","_radius","_fallbackFill","fallbackFill","swing","linear","easeOutElastic","asin","limitValue","animationFrameProxy","wnd","animationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","_items","_options","easing","finish","loop","_stopped","wallTime","easingPosition","multiPath","srcElement","childNodes","removeSelf","invalidate","getArray","_defaultPrevented","_events","one","eventNames","handlersIsFunction","original","unbind","sender","isDefaultPrevented","getComputedStyle","stylesArray","getPixels","eventElement","initialTouch","elementPadding","paddingLeft","paddingTop","documentElement","scrollTop","clientTop","scrollLeft","clientLeft","eventCoordinates","pageX","pageY","matrixRegexp","transformMatrix","matrixString","members","elementScale","_kendoExportVisual","exportVisual","_click","_handler","_mouseenter","_mouseleave","_mousemove","_visual","_enableTracking","domNode","_kendoNode","currentSize","_resize","getSize","_suspendedTracking","eventTarget","originalEvent","padding","_elementOffset","coord","inverseTransform","logToConsole","renderAttr","renderAllAttr","renderStyle","SVG_NS","renderSVG","svg","testFragment","testContainer","hasParser","chartDoc","importedDoc","adoptNode","browser","browserRxs","edge","webkit","safari","opera","msie","mozilla","agent","version","DefinitionMap","isDefinition","definitions","clearDefinitions","insertAt","createDefinitions","attachTo","domElement","render","setElement","renderChildren","css","updateDefinition","attr","removeAttr","mapTransform","allAttr","mapStyle","hasDefinitions","definitionChange","refUrl","mapDefinitions","skipBaseHref","baseUrl","getElementsByTagName","hashIndex","renderOffset","loadStops","stopNode","mapCoordinates","renderCoordinates","mapSpace","definitionMap","addDefinitions","removeDefinitions","addDefinition","mapItem","createDefinition","removeDefinition","firstElementChild","bindEvents","unbindEvents","DASH_ARRAYS","dash","longdash","dashdot","longdashdot","longdashdotdot","ATTRIBUTE_MAP","renderData","mapFill","mapStroke","transformChange","printPath","currentType","segmentType","printPoints","segmentStart","segmentEnd","renderLinecap","dashType","renderDashType","dashArray","lineCap","renderId","renderOpacity","renderStroke","renderFill","renderDefinitions","renderTransform","ampRegExp","ltRegExp","quoteRegExp","aposRegExp","gtRegExp","htmlEncode","mapPosition","mapSource","encode","renderPosition","renderSource","ENTITY_REGEX","decodeEntities","_element","innerText","setY","rtl","renderTextAnchor","renderContent","Arc","Circle","Image","MultiPath","Path","Rect","Text","_rootElement","ctm","getScreenCTM","click","mouseover","mouseout","resize","viewBox","_offset","draw","visual","createPromise","resolveFn","rejectFn","_state","promiseAll","renderPath","prevOut","bezierCurveTo","initClip","clearClip","beginPath","cors","loadElements","globalAlpha","opactity","save","setTransform","setClip","setOpacity","renderTo","restore","lastExecTime","elapsed","canvas","invalidateHandler","_invalidate","devicePixelRatio","fixedScale","_devicePixelRatio","_rescale","clearRect","shapes","shape","_quadNode","nodeRect","nodeBottomRight","pointShapes","inserted","inBounds","_initChildren","halfWidth","halfHeight","zIndexComparer","_zIndex","initRoots","rootMap","rootElements","sectorRoot","assignZindex","zIndex","levelWeight","bboxChange","_insertShape","elementsArray","_insert","sectors","getSectors","inRoot","bottomX","bottomY","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","matchNamedColor","colorNames","toBytes","toHex","rgb","toFixed","toCss","toCssRgba","parseColor","c1","c2","Bytes","RGB","HSV","HSL","toRGB","toHSV","toHSL","hex","hue2rgb","safe","renderPoints","setLineDash","setLineCap","setLineJoin","setFill","setStroke","hasFill","setGradientFill","fillStyle","gradient","createLinearGradient","createRadialGradient","addColorStop","strokeStyle","lineWidth","mozDash","webkitLineDash","loading","crossOrigin","onload","onerror","drawImage","textAlign","fillText","strokeText","_mouseTrackHandler","_trackMouse","_searchTree","_cursor","_surfacePoint","pointShape","rootElement","loadingStates","resolveDataURL","toDataURL","suspendTracking","resumeTracking","surface","_resetCursor","_shapeCursor","_current","_defaultCursor","_getCursor","_setCursor","currentShape","_currentShape","hasDocument","hasFeature","preferred","support","exportGroup","rootGroup","getOrigin","exportRoot","1","10","100","20","200","30","300","40","400","50","500","6","60","600","7","70","700","8","80","800","9","90","900","1000","arabicToRoman","roman","KEY_STR","encodeBase64","utfInput","code","hi","chr1","chr2","chr3","enc1","enc2","enc3","enc4","mergeSort","exportImage","surfaceOptions","display","image","exportSVG","raw","alignPathToPixel","clockwise","angle1","angle2","convertableToNumber","deepExtendOne","propInit","propValue","propType","destProp","deepExtend","styleValue","SIZE_STYLES_REGEX","isSizeField","getSpacing","defaultSpacing","parseDate","firstDay","userImplementation","FORMAT_REPLACE_REGEX","chart","_intlService","intlService","formatString","intl","placeholderFormat","Boolean","pannable","lock","compile","getTemplate","FIELD_REGEX","getterCache","indexAccessor","grep","hasClasses","classNames","HashMap","_key","handlerMap","callObserver","fnName","requiresHandlers","mousewheelDelta","wheelDelta","detail","elementOffset","fonts","fetchFonts","loadFonts","setDefaultOptions","sparseArrayLimits","autoMajorUnit","DEFAULT_PRECISION","relativeValue","scaleMultiplier","theta","cosT","sinT","targetBox","arrayPoint","targetCenter","dw","dh","shrink","r1","rotatePoint","r2","r3","r4","sizeFunc","innerRadius","newRadius","radianAngle","ax","ay","sector","midAndle","midPoint","hw","hh","sa","ca","vector","startVector","endVector","dist","allAngles","numericComparer","startAngleIndex","endAngleIndex","angles","wrapPoint","ShapeBuilder","Point","fromArc","innerEnd","initUserOptions","currentChild","reflow","getRoot","getService","chartService","childrenCount","createVisual","addVisual","createAnimation","renderComplete","chartElement","appendVisual","renderVisual","Animation","childVisual","noclip","clipRoot","stackRoot","stackVisual","isStackRoot","visuals","highlight","createHighlight","show","customVisual","_highlight","highlightOptions","highlightVisualArgs","getSender","series","dataItem","category","percentage","runningTotal","gradientOptions","overlay","createGradient","margin","shrinkToFit","hasSetSize","borderWidth","border","reflowPaddingBox","vAlign","paddingBox","unpad","contentBox","translateChildren","background","hasBox","fromRect","toRect","visualStyle","pointData","visualOptions","getElement","glass","sharpBevel","roundedBevel","roundedGlass","supportVML","sharpGlass","bubbleShadow","boxDiff","boxes","rootOptions","gradients","currentBox","createBackground","hashCode","drawingGradient","LinearGradient","usedSpace","currentStops","currentStop","RadialGradient","_initDirection","vertical","elementAxis","groupSizeField","elementSizeField","groupSpacing","elementSpacing","vSpacing","reflowChildren","maxGroupElementsSize","groupOptions","groupsCount","groupsStart","alignStart","groupElements","groupElementsCount","groupElementStart","groupSize","elementBox","groupElementsSize","DrawingText","rectToBox","ROWS_SPLIT_REGEX","_initContainer","_autoReflow","rows","floatElement","textOptions","rowIdx","visualFn","_boxReflow","visualBox","hasSize","visualContext","normalBox","rotatedBox","rotationTransform","getDefaultVisual","boxCenter","snapTo","defaultOptions","titleOptions","widget","alignRotation","rotationMatrix","rotationOrigin","alignAxis","distanceAxis","axisAnchor","distanceLeft","distanceRight","alignEnd","alignCenter","icon","childAlias","noteTemplate","auto","aliasFor","wrapperBox","lineStart","alignTo","linePoints","createLine","defaultVisual","eventArgs","createAxisTick","tickOptions","tickX","tickY","createAxisGridLine","gridLine","lineEnd","labels","majorTickSize","minorTickSize","minorTicks","minorTickType","majorTicks","majorTickType","initFields","_deferLabels","createLabels","createTitle","createNotes","labelsCount","labelOptions","clearLabels","normalizeLabelRotation","autoRotateLabels","labelsRange","createAxisLabel","clearTitle","mirror","axisX","axisY","visualSize","notes","parseNoteValue","note","createPlotBands","gridLines","_gridLines","lineGroup","lineBox","majorUnit","tickLineOptions","tickPositions","skipUnit","getMajorTickPositions","getMinorTickPositions","minorUnit","_alignLines","_lineGroup","createTicks","tickSize","_backgroundPath","plotBands","plotArea","_plotbandGroup","altAxis","pane","axes","slotX","slotY","getSlot","createPlotBandLabel","bandRect","textbox","labelTemplate","minorGridLines","majorGridLines","axisLineVisible","linePos","lineOptions","gridLinesVisual","sizeFn","titleSize","space","getActualTickSize","boxSize","maxLabelSize","labelSize","arrangeTitle","arrangeLabels","arrangeNotes","labelsBetweenTicks","getLabelsTickPositions","tickIx","labelTickIndex","firstTickPosition","nextTickPosition","positionStart","positionEnd","positionLabel","labelOffset","labelBox","labelX","labelY","slotWidth","autoRotateLabelAngle","slot","shouldRenderNote","hide","noteSlot","secondAxis","tmpl","defaultText","localeAuto","isPannable","maxLabelOffset","lastLabel","offsetField","startPosition","endPosition","maxStartOffset","maxEndOffset","startTick","endTick","rangeSize","minValue","maxValue","seriesMin","seriesMax","justified","axisCrossingValue","DAYS","YEARS","TIME_PER_UNIT","absoluteDateDiff","addTicks","ticks","adjustDST","addDuration","dateValue","weekStartDay","daysToSubtract","day","roundedDate","tzDiff","setSeconds","setMilliseconds","floorDate","ceilDate","dateComparer","dateDiff","toTime","dateEquals","timeIndex","baseUnit","dateIndex","baseUnitStep","startDate","parseDates","dates","_ticks","categories","srcCategories","definedMin","definedMax","totalRange","_seriesMax","rangeIndices","hideOutOfRangeLabels","valueAxis","firstLabel","getTicks","labelTicks","stepSize","indices","scaleOptions","tickIndices","positions","getHash","_hash","hasMinor","getTickPositions","filterOutOfRangePositions","slotBox","singleSlot","limittedSlot","categoryIndex","pointCategoryIndex","totalIndex","rate","totalRangeIndices","totalMin","totalMax","labelContext","dataItems","axisLabelText","hideOutOfRangeNotes","limitRange","rangeMin","rangeMax","_categoriesMap","totalCount","DateLabelFormats","milliseconds","seconds","weeks","years","BASE_UNITS","categoryRange","_range","EmptyDateRange","roundToBaseUnit","lowerEnd","roundToTotalStep","expandEnd","justifyEnd","valueStart","displayStart","displayEnd","_indices","minIdx","maxIdx","valueIndex","_values","valueRange","roundedStep","autoBaseUnit","startUnit","startStep","categoryLimits","span","autoBaseUnitSteps","maxDateGroups","autoUnit","unitSteps","nextStep","autoUnitIx","units","totalUnits","dataRange","_parsed","panning","userSetBaseUnit","userSetBaseUnitStep","maxDivisions","lastCategory","minDiff","categoryIx","TIME_PER_MONTH","displayRange","divisionOptions","dataRangeOptions","divisionRange","rangeLabels","valuesCount","dateAt","rounds","totalLimits","panRange","pointsRange","datesRange","indicesRange","displayIndices","fit","maxDiff","rangeDiff","autoBaseUnitStep","baseUnitIndex","stepIndex","createRangeLabels","arrangeRangeLabels","autoRotateRangeLabels","hideOverlappingLabels","rangeLabel","overlaps","firstRangeLabel","lastRangeLabel","dateFormats","createLabel","rotateLabel","dateRange","limitCoordinate","MIN_VALUE_RANGE","autoOptions","narrowRange","autoMin","narrow","axisMin","autoMax","axisMax","roundToMajorUnit","remainderClose","totalOptions","userOptions","userSetMin","userSetMax","userSetLimits","totalMajorUnit","stepValue","divisions","getDivisions","skipStep","valueOffset","translateRange","startValue","endValue","isValidRange","newRange","scaleRange","ratio","axisOptions","axisCrossingValues","baseUnitTime","actualUnits","unitsToAdd","timeRange","limittedRange","logMaxRemainder","throwNegativeValuesError","logMin","logMax","startEdge","floorMax","traverseMajorTicksPositions","tickPosition","traverseMinorTicksPositions","_lineOptions","minorOptions","_minorIntervalOptions","minorStep","acceptOptionsRange","acceptNewRange","createGridLines","majorAngles","minorAngles","skipMajor","majorGridLineAngles","renderMajorGridLines","minorGridLineAngles","renderMinorGridLines","renderGridLines","radiusCallback","circle","gridLineAngles","skipAngles","divs","intervals","altAxisVisible","alpha","reflowLabels","adjacentBox","skipOption","stepOption","divCount","divAngle","majorIntervals","minorAngle","minorRadius","plotBandSlot","createRing","totalDivs","slotAngle","fromValue","slotStart","instanceOptions","angularDistance","polarAxis","bandStyle","plotBandPoints","innerPoints","outerPoints","innerCircle","outerCircle","radarMajorGridLinePositions","radarMinorGridLinePositions","tickRadius","angleIx","midAngle","gamma","axisType","minorSkipStep","dataPoints","removeDuplicates","initialControlPoint","lastControlPoint","Segment","tangent","firstControlPoint","secondControlPoint","controlPoints","cp0","invertAxis","lineFunction","calculateFunction","xField","yField","restrict","switchOrientation","isLine","monotonic","isMonotonicByField","oldXField","restrictControlPoint","cp","xValue","yValue","_axis","getCategory","findAxisByName","prepareUserOptions","chartsVisual","chartContainer","_pane","_plotArea","backgroundVisual","_bgVisual","countNumbers","Aggregates","sumOrNull","avg","getField","row","SeriesBinder","_valueFields","_otherFields","_nullValue","_undefinedValue","seriesTypes","valueFields","otherFields","_makeValue","pointIx","fieldData","_bindFromArray","srcValueFields","sourceFields","srcPointFields","_bindFromObject","initialValue","srcFields","srcFieldName","canonicalFields","sourceFieldName","percentRegex","standardDeviationRegex","initGlobalRanges","deviationMatch","valueGetter","createValueGetter","average","getAverage","deviation","getStandardDeviation","multiple","errorRange","globalRange","standardError","getStandardError","binder","pointValue","percentValue","isSample","squareDifferenceSum","START_SCALE","BAR","COLUMN","LINE","PIE","VERTICAL_LINE","EQUALLY_SPACED_SERIES","MOUSEWHEEL","endCaps","valueBox","getAxis","centerBox","capsWidth","getCapsWidth","capValue","capStart","capEnd","createDefaultVisual","seriesValueAxis","evalOptions","dryRun","needsEval","excluded","categoriesCount","seriesCount","categoryAxis","seriesCategoryAxis","valueAxisRanges","categoryPoints","seriesPoints","seriesOptions","_evalSeries","traverseDataPoints","addValue","seriesIx","pointType","invertAxes","isStacked100","otherValues","categorySum","otherStack","isStacked","plotValue","prevValue","isStackedBar","otherValue","categoryAxisCrossingValue","axisName","stackName","pIx","plotRange","chartSeries","limitsCache","limits","stackLimits","errorTotals","errorBars","lowValue","highValue","seriesErrorRanges","getErrorRange","addPointErrorBar","stackedErrorRange","updateRange","errorBar","createPoint","owner","noteText","addErrorBar","_defaults","doEval","pointOptions","axisRange","namedValueAxes","categorySlots","chartPoints","currentSeries","categorySlot","valueSlot","pointSlot","aboveAxis","stackValue","reflowPoint","reflowCategories","limitPoints","limitPoint","limitSlot","axisIndex","_outOfRangeCallback","currentCategory","categoryAt","_bindPoint","outOfRangePoint","_bindCache","bindCache","bindPoint","Color","formats","resolvedColor","resolveColor","processor","channels","normalizeByte","padDigit","namedColors","percBrightness","hover","out","createNote","tooltipTracking","markers","_rendered","createMarker","labelText","brightness","markerBorder","_childBox","childBox","reflowLabel","noteTargetBox","markerBox","defaultColor","shadow","halfSize","clipBox","horizontalAlign","verticalAlign","horizontal","formatPointValue","toGeometryPoints","segmentVisual","coords","getNearestPoint","toGeometryPoint","lintPoint","stepAxis","stepDir","calculateStepPoints","previousPoint","stepPoint","curve","renderSegments","_segments","sortedPoints","sortPoints","pointCount","seriesMissingValues","createSegment","_addSegment","missingValues","allPoints","nearestPoint","nearestPointDistance","_setEnd","setX","AnimationFactory","register","anyHasZIndex","clipPath","_setChildrenAnimation","animationPoints","LineChart","updateStackRange","evalPointOptions","prevSegment","stackPoints","createFill","createStroke","_strokeSegments","createStrokeSegments","segmentsFromPoints","createStackSegments","strokeSegments","fillSegments","hasStackSegments","hasStackSegment","stackSegments","fillToAxes","fillPath","crossingValue","endSlot","firstPoint","lastPoint","curveProcessor","previousSegment","_gapStackPoints","_stackPoints","stackPoint","startIdx","endIdx","pointOffset","_outOfRangeMinPoint","currentSeriesIx","_previousSegmentPoint","gapStackPoint","_createGapStackPoint","segmentIx","seriesIdx","axisRanges","chartAxisRanges","chartRange","textBox","parentBox","hasGradientOverlay","rectVisual","createRect","strokeOpacity","getBorderColor","createGradientOverlay","baseColor","_brightness","borderColor","gap","slots","slotSize","positionAxis","negativeColor","cluster","clusterType","getStackWrap","stackGroup","wraps","stackWrap","_stackGroup","stackType","zeroSlot","childrenLength","_setAnimationOptions","pointVisual","ocSlot","lhSlot","realBody","lines","reflowNote","_mainVisual","mainVisual","createOverlay","createBody","createLines","drawLines","lineStyle","normalColor","tooltip","areNumbers","splitValue","downColor","whiskerSlot","boxSlot","q1","q3","reflowBoxSlot","reflowWhiskerSlot","medianSlot","median","meanSlot","meanPoints","calcMeanPoints","whiskerPoints","calcWhiskerPoints","medianPoints","calcMedianPoints","outliers","outerFence","outlierValue","markersBorder","reflowOutliers","renderOutliers","whiskers","filterOutliers","seriesAxes","_initFields","xAxisRanges","yAxisRanges","valueErrorField","lowField","highField","createMissingValue","xAxis","xAxisName","yAxis","yAxisName","xAxisRange","yAxisRange","namedXAxes","namedYAxes","highlightGroup","_maxSize","negativeValues","updateBubblesSize","animationOptions","minR","minSize","maxR","minArea","areaRatio","area","targetValueSlot","targetSlotX","targetSlotY","targetSlot","bodyVisual","tooltipAnchor","seriesItem","bulletOptions","bullet","pointColor","backgroundColor","paddingBottom","paddingRight","tooltipOptions","getStyle","notify","crosshair","formatService","initAxisName","stickyMode","formattedValue","getAnchor","moveLine","showAt","getBox","dim","axisLineBox","currentAxis","chartsBox","shouldClip","clipRect","_clipBox","unclipLabels","charts","overlapsBox","unclipElements","alignToClipBox","ID","buildTitle","removeAxis","removeChart","allAxes","vGridLines","hGridLines","notifyRender","axisValueField","paneIndex","appendIfNotNull","segmentVisible","pointVisibility","bindSegments","equalsIgnoreCase","filterSeriesByType","getDateField","isDateAxis","sampleCategory","dateCategory","singleItemOrArray","AREA_REGEX","findNext","hasItem","pointHasValue","outPoint","createOutOfRangePoints","hasMinPoint","hasMaxPoint","_outOfRangeMaxPoint","initSeries","legend","crosshairs","originalOptions","createPanes","createCrosshairs","paneDefaults","paneOptions","panes","panesLength","currentPane","currentCrosshair","matchingPane","findPane","appendAxis","axisToRemove","filteredAxes","appendChart","chartToRemove","filteredCharts","inactiveItems","inactiveItemsLabels","seriesVisible","visibleInLegend","itemLabelOptions","markerColor","xAxes","yAxes","paneIx","paneAxes","axisIx","any","seriesByPane","seriesPaneName","reflowPanes","detachLabels","reflowAxes","reflowCharts","panesArray","cleanGradients","removeCrosshairs","refresh","crossingAxes","crossingValues","valuesToAdd","targetAxis","targetCrossingValue","slotEdge","targetEdge","axisBox","xAnchor","yAnchor","xAnchorCrossings","yAnchorCrossings","leftAnchors","rightAnchors","topAnchors","bottomAnchors","paneId","paneAnchor","anchorCrossings","alignAxisTo","_overlap","_mirrored","groupAxes","axisGroupBox","overflowX","shrinked","overflowY","offsetX","paneBox","offsetY","reflowPaneAxes","alignAxes","shrinkAxisWidth","autoRotateAxisLabels","shrinkAxisHeight","fitAxes","groupedAxes","allPaneAxes","rotated","chartPane","remainingHeight","autoHeightPanes","percents","axesCount","axisA","axisB","multipath","chartsBoxes","bg","addBackgroundPaths","seriesIndex","filterPoints","detachAxisGroupLabels","labelAxisCount","labelAxis","createLabelAxis","appendAxisAt","isSingleAxis","_dispatchEvent","defaultAggregates","seriesFields","_seriesFields","rootAggregate","aggregate","_series","_binder","fieldAggregate","canonicalName","srcPoints","_bindPoints","firstDataItem","srcValues","_bindField","DefaultAggregates","aggregates","seriesType","fromOptions","toOptions","labelFrom","_createLabel","labelTo","plotLimits","initLabelsFormat","fromPoint","toPoint","copyFields","fromBox","toBox","positionLabels","fromLabelPosition","toLabelPosition","toPoints","fromSegments","fromPath","createCurveSegments","RangeAreaChart","fromSlot","toSlot","oPoints","cPoints","lhPoints","oSlot","cSlot","totalCategories","summary","prevPoint","AREA_SERIES","OUT_OF_RANGE_SERIES","namedCategoryAxes","valueAxisRangeTracker","stack100","createCategoryAxes","aggregateCategories","createCategoryAxesLabels","createCharts","createValueAxes","groupSeriesByPane","paneSeries","addToLegend","visibleSeries","filterVisibleSeries","groupSeriesByCategoryAxis","groupIx","createChartGroup","createAreaChart","createRangeAreaChart","createBarChart","createRangeBarChart","createBulletChart","createCandlestickChart","createBoxPlotChart","createOHLCChart","createWaterfallChart","createLineChart","srcSeries","processedSeries","_currentPointsCache","_seriesPointsCache","axisPane","categoryField","aggregateSeries","filterSeries","dataLength","currentRangeIndices","outOfRangePoints","categoriesHash","dateAxis","srcData","getFn","mapCategories","seriesSourcePoints","aggregator","categoryItem","categoryIdx","aggregatePoints","categoriesToAdd","firstSeries","categoryAxes","unique","axisSeries","groupSeries","barChart","stackableChartOptions","rangeColumnChart","bulletChart","lineChart","areaChart","rangeAreaChart","waterfallChart","categoryAxisName","categoryAxisIndex","centeredSeries","seriesAxis","isJustified","axisRequiresRounding","primaryAxis","tracker","defaultRange","baseOptions","defaultAxisRange","_eventCoordinates","pointPane","updateAxisOptions","targetOptions","_points","arrayPoints","toggleHighlight","hasHighlight","togglePointHighlight","toggleHandler","toggle","highlightVisual","acceptKey","mouseKey","toChartAxisRanges","ranges","_active","_panAxes","redraw","updatedAxes","pan","marquee","_marquee","marqueeColor","zoomPane","_zoomPane","paneByPoint","_zoomPaneClipBox","setStyles","_selectionPosition","selectionPosition","_updateAxisRanges","removeElement","startLocation","zoomRange","Layout","legendItem","createContainer","markerOptions","eventSink","_itemOverlay","_legendItemHover","pointIndex","_unsetActivePoint","createContainers","createLegendTitle","createItems","userAlign","itemsContainer","hasTitle","innerElement","legendBox","hasItems","containerCustomReflow","containerReflow","alignTarget","containerBox","createTitleLayout","appendTitleLayoutContent","layout","PlotAreaFactory","_registry","createDiv","closestHandle","_dateAxis","initOptions","createElements","_index","selection","leftMask","rightMask","leftHandle","rightHandle","selectionStyles","leftHandleHeight","rightHandleHeight","borderLeftWidth","borderRightWidth","mousewheel","_mousewheelHandler","_mousewheel","_domEvents","stopPropagation","_start","_move","_end","_tap","press","_press","gesturestart","_gesturestart","gesturechange","_gesturechange","gestureend","_gestureend","_mwTimeout","moveTarget","_rangeEventArgs","oldRange","rightClick","_toModelCoordinates","_slot","leftMaskWidth","rightMaskWidth","toValue","zDir","zoom","tooltipPoints","_slotAnchor","_defaultAnchor","shared","categoryText","categoryFormat","slotCenter","centerPoint","fromScale","fadeTo","missingValue","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","namedAxes","isLog","typeSamples","seriesAxisName","firstPointValue","inferredDate","xAxesOptions","yAxesOptions","createXYAxis","xValues","yValues","brightnessValue","themeLabels","theme","seriesDefaults","animationDelay","labelsOptions","labelsDistance","labelHeight","labelWidth","lp","createSegmentVisual","borderOptions","singleSegment","tooltipAlignment","RAD_30","RAD_60","createLegendItem","legendOptions","pointVisible","legendItems","seriesColors","colorsCount","anglePerValue","constantAngle","explode","segmentOptions","evalSegmentOptions","seriesConfigs","minWidth","halfMinWidth","defaultPadding","newBox","newBoxCenter","leftSideLabels","rightSideLabels","seriesConfig","labelComparator","leftLabelsReflow","rightLabelsReflow","distances","distanceBetweenLabels","distributeLabels","lr","firstBox","_takeDistance","amount","available","labelDistance","boxX","boxY","hAlignLabel","connectors","_connectorLines","connectorsColor","connectorLine","sr","crossing","pointInCircle","autoFit","pieCenter","bboxBottom","reverseValue","originalX","a1","a2","b1","b2","ub","ua","createPieChart","pieChart","holeSize","totalSize","seriesWithoutSize","createPolarAxis","createValueAxis","valueAxisOptions","axisDefaultRange","valueAxisBox","heightDiff","onCircle","_polarAxisCenter","centerSegment","xComparer","_hasMissingValuesGap","scatterChart","valueRadius","seriesSegments","isLastDataPoint","slotSector","childSector","RadarPlotArea","_hasBarCharts","_isStacked100","chartOptions","chartBox","createPath","totalHeight","firstSegment","maxSegment","lastUpperSide","previousOffset","previousHeight","nextSegment","nextPercentage","segmentSpacing","decreasingWidth","neckRatio","finalNarrow","labelPadding","dynamicSlope","dynamicSlopeReflow","constantSlopeReflow","dynamicHeight","COLOR","FIRST","MAX","createDonutChart","donutChart","createFunnelChart","funnelChart","errorLow","errorHigh","AXIS_NAMES","themeOptions","_initElement","_originalOptions","_theme","_initTheme","_initHandlers","_initSurface","bindCategories","preloadFonts","fontLoaded","_redraw","_attachEvents","_setElementClass","seriesCopies","aliases","alias","applyDefaults","applySeriesColors","chartArea","_selections","_destroySelections","_setupSelection","_noTransitionsRedraw","paneName","_model","seriesName","categoryName","pointByCategoryName","pointsBySeriesName","togglePointsHighlight","_sharedTooltip","_tooltip","findPoint","pointsByCategoryIndex","_surfaceWrap","renderAs","_destroySurface","Surface","_surfaceMouseenterHandler","_surfaceMouseleaveHandler","model","_getModel","_destroyView","setup","play","_createTooltip","_createPannable","_createZoomSelection","_createMousewheelZoom","triggerPaneRender","_navState","_cancelDomEvents","exportOptions","currentOptions","clearMissingValues","_pannable","zoomable","_zoomSelection","_mousewheelZoom","allowDrag","allowZoom","_dragZoomEnabled","_touchAction","_toggleDomEvents","drag","toggleDrag","toggleZoom","_createSharedTooltip","themeAxisDefaults","axisDefaults","mapAxisOptions","axisColor","seriesLength","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","seriesColor","_createPlotArea","_modelOptions","skipSeries","selections","select","_clickHandler","_mouseleaveHandler","_mouseover","_mouseout","_toDocumentCoordinates","_shouldAttachMouseMove","_toggleDragZoomEvents","_hoveredPoint","hovered","_stopChartHandlers","_gestureDistance","_zooming","mousewheelZoom","scaleDelta","updateRanges","_drawingChartElement","leave","backgroundContainsPoint","_startNavigation","_suppressHover","_endNavigation","onPane","totalDelta","chartEvent","findPointPane","closest","coordinates","_padding","_elementPadding","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","_getChartElement","activePoint","_activePoint","multipleSeries","hasInactiveOpacity","_hasInactiveOpacity","_updateHoveredPoint","_displayTooltip","_displayInactiveOpacity","_activeChartInstance","_updateSeriesOpacity","_applySeriesOpacity","highlightPoints","chartInstance","_chartInstanceFromPoint","inactivePoints","supportsPointInactiveOpacity","_getInactivePoints","_getInactiveOpacityForSeries","_getAllPointsOfType","hoveredPoint","resetOpacity","currSeries","defaultOpacity","_getDefaultOpacityForSeries","inactiveOpacity","activeSeries","hasDefaultInactiveOpacity","_mouseMoveTrackHandler","_mouseMoveTracking","seriesPoint","_trackCrosshairs","overPlotArea","_tooltipCategoryIx","_sharedHighlight","pointArgs","hoverArgs","hideCrosshairs","keepTooltipOpen","_redrawTimeout","autoBind","bindCategoryAxisFromSeries","uniqueCategories","bindable","onAxis","dataIx","dataRow","srcDates","rowCount","rowIx","colCount","colIx","transitionsState","pointsBySeriesIndex","applyOptions","updateMouseMoveHandler","_clearRedrawTimeout","bar","column","rangeColumn","verticalLine","pie","donut","verticalArea","scatter","scatterLine","bubble","candlestick","ohlc","boxPlot","verticalBullet","polarArea","polarLine","radarArea","radarLine","waterfall","DATA_FIELDS","fieldValue","originalValue","nullValue","NO_CROSSHAIR","wrapNumber","_initialWidth","stage","displayState","_autoWidth","inline","_calculateWidth","currentChart","pointsCount","pointWidth","_initialOpacity","div","chartPadding","scroll","scrollWidth","minPos","clearHideTimeout","_visible","visibility","tooltipStyle","marginTop","borderTopWidth","_hideTimeout","_hideAnimation","hideDelay","hint","chartObserver","_redrawSelf","initSelection","mainAxis","roundedRange","axisClone","ClonedObject","selectStart","selectEnd","filterAxes","silent","slavePanes","clearSeriesPointsCache","navigatorAxis","naviRange","inNavigator","liveDrag","redrawSlaves","showHint","fromIx","toIx","readSelection","_dragEnd","backgroundBox","_selectStart","_select","_selectEnd","__navi","naviOptions","attachAxes","attachSeries","valueAxes","justifyAxis","_collapse","autoBindElements","user","NAVIGATOR_AXIS","navigatorSeries","dateField","stockDefaults","destroyNavigator","setOptions","_fullRedraw","noTransitionsRedraw","_dirty","partialRedraw","_seriesCount","setRange","copyNavigatorCategories","DEGREE","buildLabelElement","styleGeometry","styleBox","getRange","contextService","surfaceElement","pointerValue","pointer","_setValueOptions","_visuals","allValues","arrayValues","_toggleTransitions","_surfaceSize","gaugeArea","_createGaugeArea","_createModel","_gaugeAreaMargin","currentTheme","areaGeometry","_surfaceElement","_getSize","defaultSize","_defaultSize","renderAxisTick","tickRenderOptions","renderTicks","tickGroup","renderLabels","scaleLine","renderLine","scaleTicks","renderRanges","linePath","_oldValue","repaint","trackSize","pointerHalfSize","pointerBox","pointerRangeBox","trackBox","toScale","translateX","translateY","_margin","elementOptions","getElementOptions","pointerShape","newPoints","oldPoints","speed","minSlot","sizeAxis","pointerPath","oldShape","renderTrack","trackOptions","bboxX","bboxY","_shrinkScaleWidth","_getBox","_alignElements","_shrinkElements","_buildVisual","_draw","scaleElements","plotAreaBox","scaleBox","overflow","drawTicks","tickAngles","getRadiusX","tickStart","tickEnd","rangeSegment","renderArc","labelElements","repositionRanges","labelsGroup","rangeDistance","isInside","hasLabelElements","ticksSize","hasRanges","setRadiusX","setRadiusY","paddingWidth","paddingHeight","labelAngle","labelPos","labelElement","prevLabelPos","labelTransform","rangeRadius","getRangeRadius","rangeSegments","segmentsCount","rangeGeom","rangePlaceholderColor","tickArc","majorTickAngles","allTicks","_tickDifference","minorTickAngles","normalizeTickAngles","tickCount","repositionTicks","newPoint","xDiff","yDiff","newAngle","oldAngle","setAngle","_renderNeedle","_renderCap","capSize","cap","needleColor","needlePath","capColor","arrow","_initialPlotArea","fitScale","alignScale","_buildPointers","getDiff","midDiff","oldDiff","staleFlag","getPlotBox","scaleArc","plotBbox","plotBox","plotBoxCenter","paddingX","paddingY","pointersArr","rangeLineCap","setEndAngle","setStartAngle","startColor","currentColor","placeholderRangeAngle","addRange","rangeColor","SANS","SANS12","SANS16","rangeArea","verticalRangeArea","outliersField","meanField","funnel","horizontalWaterfall","rangeBar","verticalBoxPlot","baseTheme","touchRegExp","normalizeEvent","Draggable","release","mouseOnly","_pressHandler","_dragHandler","_releaseHandler","_ignoreMouse","_mouseOnly","_touchstart","_touchmove","_touchend","_restoreMouse","_mousedown","_mouseup","_pointerdown","isPrimary","_pointermove","_pointerup","_unbindFromCurrent","_bindToCurrent","_usePointers","supportPointerEvent","fromEvent","setupSubscription","sourceObj","addListener","removeListener","isDocumentAvailable","isChanged","propertyName","skipFirstChange","isFirstChange","anyChanged","propertyNames","hasObservers","emitter","guid","DraggableDirective","enableDrag","kendoPress","kendoDrag","kendoRelease","toggleDraggable","destroyDraggable","draggable","bindTo","DraggableModule","EventsOutsideAngularDirective","EventsModule","resizeBatchService","acceptedSize","lastWidth","lastHeight","WRAP_STYLE","checkChanges","isScheduled","checkSize","expandChild","getPropertyValue","initSize","shrinkChild","EXPAND_CHILD_STYLE","HAS_OBSERVER","ResizeObserver","ResizeObserverService","resizeObserver","disconnect","ResizeBatchService","resolvedPromise","ResizeSensorComponent","rateLimit","serviceType","supported","resizeService","acceptSize","ResizeSensorModule","KendoInput","Keys","cachedWidth","scrollbarWidth","windowViewport","win","innerHeight","innerWidth","scrollHeight","clientHeight","offsetParent","until","scrollPosition","offsetParentElement","elementStyles","parentOffset","parentStyles","positionScale","viewPortSize","anchorSize","anchorAlignPoint","elementAlignPoint","marginToAdd","isBeforeAnchor","sibling","nextElementSibling","AnimationBuilder","timings","sequence","steps","stateChangeExpr","expr","NoopAnimationPlayer","_onDoneFns","_onStartFns","_onDestroyFns","_started","_finished","parentPlayer","totalTime","hasStarted","_onStart","triggerMicrotask","_onFinish","phaseName","methods","AnimationGroupPlayer","_players","players","doneCount","destroyCount","startCount","player","onDone","_onDestroy","onStart","pause","restart","timeAtPosition","setPosition","getPosition","beforeDestroy","PopupComponent_ng_template_3_Template","_c1","eitherRect","offset$$1","isWindowAvailable","OVERFLOW_REGEXP","overflowStyle","fun","called","hasRelativeStackingContext","isDifferent","scaleRect","STYLES","DOMService","addition","anchorRect","anchorAlign","elementRect","elementAlign","anchorHorizontal","anchorVertical","elementHorizontal","elementVertical","horizontalMargin","verticalMargin","viewport","getWindow","computedStyles","currentLocation","currentOffset","popup","collisions","viewPort","elementTop","elementLeft","elementHeight","elementWidth","viewPortHeight","viewPortWidth","isHorizontalFlip","isVerticalFlip","flippedHorizontal","flippedVertical","flipped","parentElements","hasAttribute","relativeContextElement","getRelativeContextElement","siblingElements","containerElement","siblings","zIndexStyle","clientWidth","zoomLevel","SCALE","AlignService","_dom","positionMode","hasOffsetParent","relativeRect","absoluteRect","scrollPos","elementScrollPosition","stackScale","stackScroll","stackingElementScroll","stackOffset","stackingElementOffset","removeScroll","addScroll","stackingOffset","PositionService","offsetAtPoint","anchorOffset","windowViewPort","restrictToView","addOffset","ResizeService","ScrollableService","parents$$1","scrollableParents","isDocument","isWindow","elemRect","boundingOffset","containerRect","animationTypes","transformOrigin","AnimationService","animationBuilder","statesFn","states","playStates","stopPlayer","DEFAULT_OFFSET","PopupComponent","_alignService","domService","_positionService","_resizeService","_scrollableService","animationService","animate","collision","popupAlign","copyAnchorStyles","anchorViewportLeave","positionChange","initialCheck","updateFixedClass","reposition","animationSubscriptions","onAnimationStart","onAnimationEnd","forElement","onScroll","setZIndex","copyFontStyles","unsubscribeReposition","repositionSubscription","_currentOffset","setContainerStyle","oldOffset","newOffset","oldLeft","oldTop","newLeft","newTop","contentContainer","resizeSensor","alignedOffset","alignElement","positionElement","isInViewPort","hasLeaveObservers","getFontStyles","_t","popupClass","onResize","POPUP_CONTAINER","PopupService","applicationRef","rootComponents","getComponentRootNode","rootViewContainer","contentFrom","popupComponentRef","appendPopup","appendTo","popupInstance","projectComponentInputs","popupElement","popupAnchorViewportLeave","popupClose","popupOpen","popupPositionChange","rootViewContainerNode","componentClass","getComponentFactory","PopupModule","SkipOperator","MessageService","ComponentMessages","notifyChanges","override","L10N_PREFIX","LocalizationService","messageService","_rtl","dictionary","shortKey","alt","IntlError","flattenValues","formattedMessage","formatMessage","cldr","en","_number","_cldrVersion","language","territory","numbers","symbols","decimal","percentSign","plusSign","exponential","superscriptingExponent","perMille","infinity","nan","timeSeparator","patterns","scientific","percent","currency","currencies","BGN","displayName","EUR","USD","localeCurrency","accounting","calendar","gmtFormat","gmtZeroFormat","D","M","F","G","T","dateTimeFormats","long","medium","short","availableFormats","Bh","Bhm","Bhms","E","EBhm","EBhms","Ed","Ehm","EHm","Ehms","EHms","Gy","GyMMM","GyMMMd","GyMMMEd","H","hm","Hm","hms","Hms","hmsv","Hmsv","hmv","Hmv","Md","MEd","MMM","MMMd","MMMEd","MMMMd","yM","yMd","yMEd","yMMM","yMMMd","yMMMEd","yMMMM","yQQQ","yQQQQ","timeFormats","abbreviated","wide","quarters","midnight","am","noon","pm","morning1","afternoon1","evening1","night1","eras","dateFields","era","quarter","month","week","weekday","dayperiod","hour","minute","millisecond","supplemental","likelySubtags","currencyData","region","US","_from","weekData","weekendStart","weekendEnd","getLocaleInfo","info","suffixes","fullName","script","NoLocale","localeTerritory","likelyName","variant","dateFieldName","NoDateFieldNames","fieldNameInfo","nameType","dateFormatNames","standAlone","lowerNameType","formatNames","parseRangeDate","NoCurrency","NoCurrencyDisplay","NoSupplementalCurrency","NoCurrencyRegion","NoValidCurrency","SYMBOL","GLOBAL_CURRENCIES","getCurrencyInfo","throwIfNoValid","currencyDisplayInfo","lengthComparer","regionCurrencies","latestValidUntil","latestValidUntilRange","latestStillValid","latestStillValidDate","_tender","_to","validFrom","validTo","stillValidDate","DAYS_OF_WEEK","NoWeekData","NoFirstDay","weekendRange","numberSymbols","isNegativeZero","formatCurrencySymbol","currencyDisplay","currencyInfo","groupInteger","decimalIndex","groupSizes","integerEnd","integerLength","newGroupSize","isCurrencyStyle","padString","trailingZeroRegex","literalRegExp","setStyleOptions","formatOptions","setFormatLiterals","literals","quoteChar","literal","trailingZerosRegExp","trailingPointRegExp","commaRegExp","placeholderIndex","index1","index2","standardFormatRegExp","formatAndPrecision","minimumFractionDigits","maximumFractionDigits","isCurrency","toExponential","currencyFractions","fractions","_digits","negativeZero","minimumIntegerDigits","useGrouping","hasNegativeFormat","zeroFormat","hasGroup","zeroIndex","sharpIndex","hasZero","hasSharp","trailingZeros","lastZero","trimRegex","lastZeroIndex","replacement","exponentRegExp","nonBreakingSpaceRegExp","cleanNegativePattern","negativeCurrency","currencyNumber","displays","cleanNumber","negativeSignIndex","isNegative","LENGHT_DELTA","PENALTIES","VALUE_FORMAT_LENGTH","TIME_SPECIFIERS_REGEX","DATE_OPTIONS_MAP","specifier","getSpecifier","hour12","STAND_ALONE_SPECIFIERS","specifiersRegex","resolvedFormats","getSpecifierRegex","skeletonSpecifiers","skeleton","character","findBestMatch","specifiers","specifiersLength","bestMatches","maxScore","currentFormat","score","bestMatch","matchSpecifier","datePattern","option","spcifier","timeStartIndex","dateSkeleton","timeSkeleton","dateNameType","formatLength","DATE_FIELD_MAP","dateFormatRegExp","formatMonth","formatQuarter","formatTimeZone","shortHours","optionalMinutes","localizedName","zZeroOffset","hoursMinutes","formatDayOfWeek","localeInfo","firstDayIndex","dayIndex","formatters","convertTimeZone","fromOffset","toOffset","fromLocalOffset","offsetDate","toLocalOffset","timeZoneOffsetRegExp","dateRegExp","offsetRegExp","numberRegExp","numberRegex","leadingSpacesRegex","trailingSpacesRegex","standardDateFormats","FORMATS_SEQUENCE","lookAhead","getNumber","regex","valueIdx","getIndexByName","nameLength","matchLength","checkLiteral","parseTimeZoneOffset","noSeparator","zLiteral","UTC","NoGMTInfo","hoursMatch","minutesMatch","hoursOffset","minutesOffset","parseMonth","parseDayOfWeek","dayOfWeek","currentYear","periodFormats","pmHour","shortFormat","invalid","addFormatSpaces","parseExact","hasTime","parseValue","tzoffset","parseFormats","NAME_TYPES","minLength","addLiteral","lastPart","isHour12","splitDateFormat","patternLength","DOCS_URL","errorSolutions","intlMethod","errorSolution","dateFormatNames$1","dateFieldName$1","firstDay$1","format$1","formatDate$1","formatNumber$1","numberSymbols$1","parseDate$1","parseNumber$1","splitDateFormat$1","toString$1","weekendRange$1","LOCALE_REGEX","cldrServiceFactory","IntlService","CldrIntlService","format$$1","IntlModule","TooltipPopupComponent_ng_template_0_1_ng_template_0_Template","TooltipPopupComponent_ng_template_0_1_Template","ctx_r299","seriesTooltipTemplateRef","seriesTooltipContext","TooltipPopupComponent_ng_template_0_2_ng_template_0_Template","TooltipPopupComponent_ng_template_0_2_Template","ctx_r300","seriesSharedTooltipTemplateRef","seriesSharedTooltipContext","TooltipPopupComponent_ng_template_0_Template","ctx_r296","popupClasses","TooltipPopupComponent_ng_template_2_Template","TooltipPopupComponent_ng_template_3_tr_4_td_1_Template","point_r310","TooltipPopupComponent_ng_template_3_tr_4_td_2_ng_container_1_Template","TooltipPopupComponent_ng_template_3_tr_4_td_2_ng_container_2_Template","TooltipPopupComponent_ng_template_3_tr_4_td_2_Template","TooltipPopupComponent_ng_template_3_tr_4_ng_template_4_Template","TooltipPopupComponent_ng_template_3_tr_4_Template","ctx_r319","colorMarker_r307","colorMarker","nameColumn_r308","nameColumn","TooltipPopupComponent_ng_template_3_Template","points_r304","categoryText_r305","colspan_r306","colspan","CrosshairTooltipComponent_ng_template_0_Template","ctx_r321","CrosshairTooltipsContainerComponent_kendo_chart_crosshair_tooltip_0_Template","key_r323","ctx_r322","popupSettings","ChartComponent_div_5_ng_template_1_Template","ChartComponent_div_5_Template","ctx_r325","donutCenterStyle","donutCenterTemplate","ChartComponentGenerated","configurationService","axisLabelClick","dragEnd","dragStart","legendItemHover","legendItemLeave","noteClick","noteHover","noteLeave","paneRender","plotAreaClick","plotAreaHover","plotAreaLeave","seriesClick","seriesHover","seriesOver","seriesLeave","zoomEnd","zoomStart","Change","ConfigurationService","initSource","onFastChange$","asObservable","onChange$","BaseEvent","PreventableEvent","LegendEvent","LegendItemClickEvent","NoteEvent","RenderEvent","_e","SeriesEvent","EVENT_MAP","InstanceEventService","DonutCenterTemplateDirective","ItemChange","CollectionService","onItemChange$","copyChanges","toSimpleChanges","CollectionItemComponent","collectionService","SeriesItemComponentGenerated","closeField","colorField","currentField","downColorField","errorHighField","errorLowField","explodeField","fromField","lowerField","medianField","noteTextField","openField","q1Field","q3Field","summaryField","toField","upperField","visibleInLegendField","xErrorHighField","xErrorLowField","yErrorHighField","yErrorLowField","SettingsComponent","configKey","SeriesTooltipComponentGenerated","SeriesTooltipComponent","markAsVisible","seriesTooltipTemplate","flag","SeriesItemComponent","pv","seriesTooltip","fontSize","fontFamily","ThemeService","readTheme","readDefaultTheme","queryColor","setColors","setFonts","setSeriesColors","destroyElement","mapColor","queryStyle","defaultFont","titleFont","labelFont","varName","hideTooltip","legendItemClick","showTooltip","TooltipTemplateService","seriesTemplates","sharedTemplate","SeriesTooltipTemplateDirective","SharedTooltipTemplateDirective","TooltipTemplatePoint","xLow","xHigh","yLow","yHigh","COLLISION","BaseTooltip","popupService","localizationService","popupRef","bodyFactory","TooltipPopupComponent","templateService","wrapperClass","getSharedTemplate","defaultSharedTooltipTemplate","sharedTemplateContext","pointTemplateRef","wrapPoints","defaultSeriesTooltipTemplate","mouseleaveSubscription","CrosshairTooltipComponent","AXES","CrosshairTooltipsContainerComponent","tooltipKeys","tooltipsMap","tooltipComponents","crossahirTooltipComponents","newMap","mapTooltips","removeTooltip","tooltips","axesCrosshairTooltipOptions","tooltipIdx","getTouch","domEvent","shouldBindGroup","groupNames","eventGroups","DomEvents","hammerInstance","eventHandlers","panstart","panmove","panend","pinchstart","pinchmove","pinchend","previousArgs","xLocation","yLocation","pointer1","pointer2","initialDelta","eventGroup","nameIdx","dateValueAxisFormats","HAMMER","ChartComponent","themeService","instanceEventService","resizeRateLimit","suppressTransitions","hostClasses","loadTheme","refreshWait","canRender","chartMouseleave","domSubscriptions","setDirection","intlChange","rtlChange","autoResize","resizeTimeout","redrawTimeout","findPaneByIndex","findPaneByName","instanceObserver","createInstance","_event","seriesComponents","toggleVisibility","togglePointVisibility","getDonutCenterStyle","crossahirTooltips","tooltipInstance","activeEmitter","updateDirection","createCrosshairTooltips","setChartAreaSize","updateOptions","relatedTarget","hideElements","containsElement","inZone","deferredRedraw","isRTL","tooltipMouseleave","CollectionComponent","processChanges","readItems","CategoryAxisItemComponentGenerated","CategoryAxisItemComponent","CategoryAxisComponentGenerated","CategoryAxisComponent","CategoryAxisLabelsComponentGenerated","CategoryAxisLabelsComponent","ChartAreaComponentGenerated","ChartAreaComponent","LegendComponentGenerated","LegendComponent","SeriesComponentGenerated","SeriesComponent","tooltipTemplateService","readTooltipTemplates","templates","setSeriesTemplates","SeriesHighlightComponentGenerated","SeriesHighlightComponent","TitleComponentGenerated","TitleComponent","ValueAxisItemComponentGenerated","ValueAxisItemComponent","ValueAxisComponentGenerated","ValueAxisComponent","YAxisItemComponentGenerated","YAxisItemComponent","YAxisComponentGenerated","YAxisComponent","ɵRootConfigurationService_BaseFactory","RootConfigurationService","EVENT_MAP$1","navigatorFilter","ɵStockInstanceEventService_BaseFactory","StockInstanceEventService","ChartModule","StockChartModule","SparklineModule","ChartsModule","StackedBarLineChartComponent","axis1LabelSegments","axis2LabelSegments","valueAxis1Label","valueAxis2Label","chartStackSeries","stackPosition","chartBarColor","stackcolors","chartStackGoalSeries","stackGoalPosition","stackgoalcolors","chartLineColor","chartCategories","chartDataItemKey","axis1Max","yleftmax","nextHighestNumberDivisibleBy","axis1MaxOption2","periodsToShow","chartDataColumn","xlabel","intValue","stackgoals","valueAxis1","axis2Source","yrightmax","axis2Max","valueAxis2","yaxisleftlabel","yaxisleftlabelcolor","yaxisrightlabel","yaxisrightlabelcolor","TextIndicatorsComponent","isDataFound","instrTotalQty","calculateTotalFromData","productLineInfo","Quantity","totalQuantity","lowerTitleColor","displayvalue","biggestCharCount","maxWidth","StackedBarChartByProductComponent","chartDataColumnKey","chartDataColumnColor","valueColor","TopStatsListComponent","MultiAPITileComponent","refreshHandleKeys","apiMappingLinks","apiMappingLink","VerticalSplitTextIndicatorsComponent","detailLinks","ShapeIndicatorsComponent","newOrder","orderByLabel","findItemByKey","charCount","Class","HasObservers","superclass","staticAccessors","arguments$1","defineProperties","Size","PieChartComponent","visualHandler","legendItemVisual","pieDataTemp","pieItem","bar_values","pieData","showGoal","circleGeometry","goalPercent","AreaLineChartComponent","onUpdate","buildChartOptions","isLocal","getIsLocalCurrency","seriesColorsList","linecolors","chartData","currencyDivideVal","currencyFormat","loop1","chartDataObj","dataItemKey","floatValue","roundVal","MultiLineChartComponent","rowColorOverrides","colorsByIndex","categoryList","seriesList","excludeLines","getLineColor","_has","shrinkBuf","subarray","fnTyped","arraySet","src_offs","dest_offs","flattenChunks","chunks","Buf8","Buf16","Uint16Array","Buf32","Int32Array","fnUntyped","typedOK","strApplyOK","strApplyUintOK","utf8len","table","string2buf","m_pos","str_len","buf_len","_buf2binstring","buf2string","c_len","utf16buf","utf8border","adler32","adler","s1","s2","crcTable","crc32","crc","inflate_fast","strm","_in","_out","dmax","wsize","whave","wnext","s_window","hold","bits","lcode","dcode","lmask","dmask","here","from_source","next_in","avail_in","next_out","avail_out","lencode","distcode","lenbits","distbits","dolen","dodist","sane","lbase","lext","dbase","dext","inflate_table","lens","lens_index","codes","table_index","here_bits","here_op","here_val","sym","used","huff","base_index","MAXBITS","offs","extra","extra_index","zswap32","InflateState","havedict","wbits","ncode","nlen","ndist","have","lendyn","distdyn","was","lenfix","distfix","virgin","fixedtables","updatewindow","inflate","last_bits","last_op","last_val","hbuf","order","inf_leave","xflags","os","extra_len","hcrc","total_out","total_in","data_type","inflateSetDictionary","dictLength","0","ZStream","GZheader","Inflate","chunkSize","windowBits","opt","ended","header","_mode","next_out_utf8","utf8str","dict","allowBufError","onEnd","onData","zero","static_ltree","static_dtree","_dist_code","_length_code","base_length","base_dist","static_l_desc","static_d_desc","static_bl_desc","extra_lbits","extra_dbits","extra_blbits","bl_order","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","TreeDesc","dyn_tree","stat_desc","max_code","d_code","put_short","w","pending_buf","send_bits","bi_valid","bi_buf","send_code","bi_reverse","gen_codes","bl_count","next_code","MAX_BITS","init_block","LITERALS","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","bi_windup","smaller","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lc","lx","d_buf","l_buf","build_tree","stree","heap_max","xbits","scan_tree","curlen","prevlen","nextlen","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block","stored_len","_tr_tally","lit_bufsize","errorCode","rank","zero$1","flush_pending","pending_out","flush_block_only","opt_lenb","static_lenb","max_blindex","black_mask","l_desc","d_desc","bl_desc","BL_CODES","strategy","lcodes","dcodes","blcodes","block_start","strstart","put_byte","putShortMSB","longest_match","cur_match","chain_length","max_chain_length","best_len","prev_length","nice_match","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","more","_w_size","window_size","hash_size","ins_h","hash_shift","hash_mask","deflate_stored","max_block_size","pending_buf_size","max_start","deflate_fast","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH$1","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","configurationTable","DeflateState","gzhead","gzindex","last_flush","w_bits","hash_bits","HEAP_SIZE$1","MAX_BITS$1","deflate","old_flush","bstate","STATIC_TREES","Deflate","memLevel","gzip","D_CODES","MAX_MATCH","LENGTH_CODES","L_CODES","avail","tmpDict","_dict_set","Element","kendo","diffOptions","hasChanges","valueChange","optionContext","CollectionChangesService","pointerColor","getColor","rangePlaceholder","textColor","SharedModule","collectionChangesService","GaugeComponent","updateMethod","setValues","updateCall","updateSize","readValues","GaugeAreaComponent","ɵGaugeAreaComponent_BaseFactory","LabelsComponent","ɵLabelsComponent_BaseFactory","RangeComponent","ɵRangeComponent_BaseFactory","ScaleComponent","ɵScaleComponent_BaseFactory","LinearGaugeComponent","LinearGaugeAreaComponent","LinearScaleComponent","LinearLabelsComponent","LinearRangeComponent","LinearRangesComponent","LinearGaugeModule","ComplianceChartComponent","complianceArea","extraSpace","majorUnitCount","minorUnitCount","gaugeData1","gaugeData2","compliance12Month","goal","getGaugeData","calcMax","compliantScaleFrom","compliantScaleTo","notCompliantScaleFrom","notCompliantScaleTo","NpsComponent","UtilizationTpdComponent","PlaceholderComponent","isPresent","isBlank","isCompositeFilterDescriptor","filters","ifElse","compose","normalizeOperator","descriptor","equal","equalto","ge","greater","greaterthan","greaterthanequal","isempty","isequalto","isgreaterthan","isgreaterthanorequalto","islessthan","islessthanorequalto","isnotempty","isnotequalto","isnull","le","less","lessthan","lessthanequal","ne","notequal","notequals","notequalto","notsubstringof","normalizeFilters","logic","pairwise","accessor","isNotEmpty","runOrEmpty","formatDescriptors","sanitizeDateLiterals","removeAfterDot","directionFormatter","formatSort","formatGroup","formatAggregates","formatDateValue","transformSkip","transformTake","transformGroup","transformSort","transformAggregates","filterFormatter","ignoreCase","g1","mapper","translateAggregate","translateAggregates","translateGroup","hasSubgroups","Member","HasSubgroups","Items","Key","compareDesc","descriptorAsFunc","_b","isTransformerResult","__value","operatorsMap","contains","doesnotcontain","doesnotendwith","doesnotstartwith","endswith","isnotnull","neq","startswith","transformCompositeFilter","combiner","itemProp","compileFilter","filterBy","normalizeGroups","descriptors","transformers","originalData","agg","groupValue","__position","aggregateResult","filteredData","fieldAccessor","aggregateName","aggregateAccessor","fieldAggregates","aggregateFunction","calc","NEGATIVE_INFINITY","cursor1","cursor2","skipCount","filterDescriptor","sortDescriptors","hasFilters","hasGroups","counter","reduced","faBookmark","iconName","faBorderAll","faChartBar","faCheck","faChevronDown","faChevronLeft","faChevronUp","faClinicMedical","faCog","faDesktop","faFilter","faFlag","faGlobeAmericas","faGripHorizontal","faHandHoldingMedical","faICursor","faInfoCircle","faLaptopMedical","faList","faListAlt","faMicroscope","faMortarPestle","faPlus","faSearch","faSquare","faStar","faSyringe","faTachometerAlt","faUser","faUserTag","faUserTie","faUsers","faVial","faWindowClose","forkJoinInternal","emitted","NG_VALUE_ACCESSOR","CHECKBOX_VALUE_ACCESSOR","CheckboxControlValueAccessor","_elementRef","onChange","onTouched","isDisabled","checked","DEFAULT_VALUE_ACCESSOR","COMPOSITION_BUFFER_MODE","DefaultValueAccessor","_compositionMode","_composing","getUserAgent","_handleInput","_compositionStart","_compositionEnd","AbstractControlDirective","control","valid","disabled","pristine","touched","untouched","statusChanges","valueChanges","getError","ControlContainer","ɵControlContainer_BaseFactory","unimplemented","NgControl","valueAccessor","_rawValidators","_rawAsyncValidators","AbstractControlStatus","cd","_cd","NgControlStatus","ngClassUntouched","ngClassTouched","ngClassPristine","ngClassDirty","ngClassValid","ngClassInvalid","ngClassPending","NgControlStatusGroup","isEmptyInputValue","NG_VALIDATORS","NG_ASYNC_VALIDATORS","EMAIL_REGEXP","nullValidator","regexStr","validators","presentValidators","_mergeErrors","toObservable","arrayOfErrors","normalizeValidator","validator","validate","normalizeAsyncValidator","NUMBER_VALUE_ACCESSOR","NumberValueAccessor","RADIO_VALUE_ACCESSOR","RadioControlRegistry","_accessors","_isSameGroup","fireUncheck","controlPair","_control","RadioControlValueAccessor","_checkName","_fn","writeValue","formControlName","_throwNameError","RANGE_VALUE_ACCESSOR","RangeValueAccessor","FormErrorExamples","ReactiveErrors","directiveName","SELECT_VALUE_ACCESSOR","_buildValueString","SelectControlValueAccessor","_optionMap","_idCounter","_compareWith","_getOptionId","valueString","_getOptionValue","compareWith","NgSelectOption","_registerOption","_setElementValue","ngValue","SELECT_MULTIPLE_VALUE_ACCESSOR","_buildValueString$1","SelectMultipleControlValueAccessor","optionSelectedStateSetter","ids","_setSelected","selected","selectedOptions","ɵNgSelectMultipleOption","controlPath","setUpControl","asyncValidator","composeAsync","registerOnChange","_pendingValue","_pendingChange","_pendingDirty","updateOn","updateControl","emitModelEvent","viewToModelUpdate","registerOnTouched","_pendingTouched","markAsTouched","setDisabledState","registerOnDisabledChange","registerOnValidatorChange","updateValueAndValidity","markAsDirty","emitModelToViewChange","messageEnd","composeValidators","composeAsyncValidators","isPropertyUpdated","viewModel","BUILTIN_ACCESSORS","selectValueAccessor","valueAccessors","defaultAccessor","builtinAccessor","customAccessor","coerceToValidator","validatorOrOpts","isOptionsObj","coerceToAsyncValidator","origAsyncValidator","asyncValidators","_onCollectionChange","_onDisabledChange","_updateOn","newValidator","onlySelf","_forEachChild","markAllAsTouched","markAsUntouched","_updateTouched","markAsPristine","_updatePristine","emitEvent","markAsPending","skipPristineCheck","_parentMarkedDirty","disable","_updateValue","_updateAncestors","changeFn","_setInitialStatus","_cancelExistingSubscription","_runValidator","_calculateStatus","_runAsyncValidator","ctrl","_updateTreeValidity","_allControlsDisabled","_asyncValidationSubscription","setErrors","_updateControlsErrors","controlToFind","FormGroup","controls","FormArray","_anyControlsHaveStatus","_anyControls","_anyControlsDirty","_anyControlsTouched","formState","FormControl","_onChange","_applyFormState","_setUpdateStrategy","_initObservables","emitViewToModelChange","_isBoxedValue","_setUpControls","setParent","_registerOnCollectionChange","registerControl","controlName","_checkAllValuesPresent","_throwIfControlMissing","patchValue","_reduceChildren","getRawValue","subtreeUpdated","updated","_syncPendingControls","_reduceValue","initValue","_registerControl","formDirectiveProvider","NgForm","submitted","_directives","ngSubmit","_findContainer","removeControl","resetForm","onSubmit","onReset","AbstractFormGroupDirective","_checkParentType","addFormGroup","formDirective","removeFormGroup","getFormGroup","_validators","_asyncValidators","ɵAbstractFormGroupDirective_BaseFactory","TemplateDrivenErrors","modelGroupProvider","NgModelGroup","modelGroupParentException","formControlBinding","resolvedPromise$1","NgModel","_registered","_checkForErrors","_setUpControl","_updateDisabled","_isStandalone","_setUpStandalone","addControl","standalone","formGroupNameException","modelParentException","missingNameException","disabledValue","ɵNgNoValidate","NG_MODEL_WITH_FORM_CONTROL_WARNING","formControlBinding$1","FormControlDirective","_ngModelWarningConfig","_ngModelWarningSent","disabledAttrWarning","warningConfig","_isControlChanged","_ngModelWarningSentOnce","ngModelWarning","ɵInternalFormsSharedModule","FormBuilder","controlsConfig","_reduceControls","_createControl","controlConfig","FormsModule","ReactiveFormsModule","warnOnNgModelWithFormControl","takeUntil","notifier","takeUntilSubscriber","notifierSubscription","seenValue","debounceTime","DebounceTimeOperator","debouncedSubscription","lastValue","clearDebounce","dispatchNext","debouncedNext","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","desktopBrowserRxs","mobileBrowserRxs","omini","omobile","firefox","mobilesafari","ie","chrome","testRx","rxs","dflt","browserInfo","mobileOS","minorVersion","majorVersion","flatVersion","cordova","PhoneGap","appMode","_c23","_c28","_c29","a0","a3","keydown","focus","blur","_c31","_c32","_c37","_c38","mouseleave","_c39","NumericTextBoxComponent_span_6_Template","ctx_r21","releaseArrow","arrowDirection","ArrowDirection","Up","increasePress","incrementTitle","Down","decreasePress","decrementTitle","_c40","DOMMouseScroll","_c41","a4","a5","a6","dragenter","paste","_c42","_c43","dragstart","_c48","TextBoxComponent_3_ng_template_0_Template","TextBoxComponent_3_Template","ctx_r32","prefixTemplate","TextBoxComponent_span_7_Template","errorIconClasses","TextBoxComponent_span_8_Template","successIconClasses","TextBoxComponent_span_9_Template","_r40","clearValue","ctx_r36","clearButtonClasses","TextBoxComponent_10_ng_template_0_Template","TextBoxComponent_10_Template","ctx_r37","suffixTemplate","_c49","areSame","requiresZoneOnBlur","ngControl","limitPrecision","fractionLength","toFixedPrecision","maxPrecision","invokeElementMethod","SwitchComponent","focusableId","readonly","tabindex","onFocus","onBlur","ngChange","ngTouched","handleFocus","focused","handleBlur","keyDownHandler","clickHandler","onLabel","offLabel","localizationChangeSubscription","keyCode","isEnabled","Space","Enter","changeValue","isFocused","ariaDisabled","ariaReadonly","ieClass","switchOnClass","switchOffClass","disabledClass","onLabelMessage","offLabelMessage","TextBoxDirective","inputElement","hostClass","onValueChange","autoFillStart","autoFillEnd","listeners","animationName","EXPONENT_REGEX","decimalPart","PARSABLE_OPTIONS","PARSABLE_DEFAULTS","NumericTextBoxComponent","autoCorrect","spinners","rangeValidation","selectOnFocus","inputValue","minValidateFn","maxValidateFn","_format","isPasted","mouseDown","ngValidatorChange","arrowPress","spinTimeout","handlePaste","handleInput","numericInput","selectionStart","selectionEnd","pressedKey","NumpadDecimal","replaceNumpadDotValue","formatInputValue","parseNumber","setSelection","parsedValue","restrictDecimals","limited","limitInputValue","hasTrailingZeros","setInputValue","updateValue","previousSelection","handleDragEnter","handleMouseDown","shouldSelectAll","selectAll","selectCaret","elementValue","handleKeyDown","ArrowDown","ArrowUp","addStep","handleWheel","parseOptions","verifySettings","minError","maxError","numericRegex","verifyValue","restrictModelValue","restrictedValue","numericWrap","spin","decimalSeparator","numberPattern","isInRange","enteredValue","limitedValue","selectToEnd","lengthChange","hasMax","hasMin","padLimit","replaceNext","correctedValue","paddedValue","tryPadValue","limitLength","zeroPadded","zeroPaddedNext","hasDecimals","stringValue","exponentMatch","formatNumber","parsed","partialValue","significantCharsInFormattedValue","formattedString","significantCharacters","adjustedSignificantChars","adjustSignificantChars","separatorIndex","matchedLeadingZeroes","lengthOfLeadingZeroesMatch","significantChars","leadingZeroes","numberOfLeadingZeroes","widgetClasses","NumericTextBoxMessages","ɵNumericTextBoxMessages_BaseFactory","increment","NumericTextBoxCustomMessagesComponent","ResultType","Result","Undefined","vs","Stream","inputCursor","controlCursor","char","Parser","stream","Literal","creator","rawMask","prompt","promptPlaceholder","rawLiteral","includeLiterals","parser","greedy","eof","MaskingService","maskTokens","unmaskTokens","rawTokens","validationTokens","mask$$1","tokenize","maskedValue","fold","rawValue","masked","splitPoint","maskRemoved","maskInserted","pasted","beforeChange","afterChange","unchanged","adjustPosition","caretChar","isLiteral","_token","peek","eat","Mask","eat_input","unliteral","unmask","maskTokenCreator","unmaskTokenCreator","rawTokenCreator","validationTokenCreator","MaskedTextBoxComponent","maskOnFocus","maskValidation","focusClick","defaultRules","emptyMask","updateInput","maskRaw","handleClick","setFocusSelection","updateService","_rules","maskInRange","maskInput","normalizeValue","extractChanges","validationValue","patternError","present","pasteHandler","hostDisabledClass","handleDragDrop","SlidersCommonModule","SliderModule","RangeSliderModule","Messages","ɵMessages_BaseFactory","LocalizedSwitchMessagesDirective","SwitchModule","LocalizedNumericTextBoxMessagesDirective","NumericTextBoxModule","MaskedTextBoxModule","TextBoxSuffixTemplateDirective","TextBoxPrefixTemplateDirective","TextBoxComponent","showSuccessIcon","showErrorIcon","clearButton","inputFocus","inputBlur","_isFocused","focusChangedProgrammatically","handleInputFocus","clearButtonClicked","handleInputBlur","checkClearButton","cursorInsideWrapper","tabbing","Tab","isFocusedElement","showClearButton","successIcon","errorIcon","clearButtonIcon","showErrorsInitial","showSuccessInitial","hasErrors","isSuccessful","TextBoxMessages","ɵTextBoxMessages_BaseFactory","LocalizedTextBoxMessagesDirective","TextBoxModule","ColorPickerModule","CheckBoxModule","RadioButtonModule","FormFieldModule","InputsModule","defaultThrottleConfig","ThrottleTimeOperator","_hasTrailingValue","_trailingValue","skipWhile","SkipWhileOperator","skipping","tryCallPredicate","ListComponent_div_0_1_ng_template_0_Template","ListComponent_div_0_1_Template","ctx_r25","fixedGroupTemplate","currentGroup","ListComponent_div_0_ng_template_2_Template","ctx_r26","ListComponent_div_0_Template","ctx_r19","virtual","itemHeight","ListComponent_5_ng_template_0_1_ng_template_0_Template","ListComponent_5_ng_template_0_1_Template","dataItem_r29","ctx_r31","ListComponent_5_ng_template_0_ng_template_2_Template","getText","_c7","ListComponent_5_ng_template_0_Template","itemIndex_r30","ctx_r28","startFrom","multipleSelection","optionPrefix","ListComponent_5_Template","ListComponent_6_ng_template_0_li_0_1_ng_template_0_Template","ListComponent_6_ng_template_0_li_0_1_Template","dataItem_r37","ctx_r41","groupTemplate","ListComponent_6_ng_template_0_li_0_ng_template_2_Template","ListComponent_6_ng_template_0_li_0_Template","ctx_r39","ListComponent_6_ng_template_0_li_1_1_ng_template_0_Template","ListComponent_6_ng_template_0_li_1_1_Template","ctx_r47","ListComponent_6_ng_template_0_li_1_ng_template_2_Template","ListComponent_6_ng_template_0_li_1_Template","ctx_r40","offsetIndex","ListComponent_6_ng_template_0_Template","ListComponent_6_Template","ListComponent_div_7_Template","ctx_r24","_c8","_c9","_c10","_c11","_c12","_c17","AutoCompleteComponent_span_4_Template","_r61","AutoCompleteComponent_span_5_Template","AutoCompleteComponent_ng_template_6_0_ng_template_0_Template","_c18","AutoCompleteComponent_ng_template_6_0_Template","ctx_r63","headerTemplate","AutoCompleteComponent_ng_template_6_div_3_ng_template_1_Template","AutoCompleteComponent_ng_template_6_div_3_ng_template_2_Template","ctx_r69","noDataText","AutoCompleteComponent_ng_template_6_div_3_Template","ctx_r65","noDataTemplate","AutoCompleteComponent_ng_template_6_4_ng_template_0_Template","AutoCompleteComponent_ng_template_6_4_Template","ctx_r66","footerTemplate","AutoCompleteComponent_ng_template_6_Template","_r72","pageChange","ctx_r57","listBoxId","valueField","listHeight","isOpen","AutoCompleteComponent_ng_template_8_Template","_r74","_c19","DropDownListComponent_5_ng_template_0_Template","DropDownListComponent_5_Template","ctx_r98","valueTemplate","DropDownListComponent_ng_template_6_Template","DropDownListComponent_ng_template_9_ng_template_0_Template","_r113","stopImmediatePropagation","filterText","handleFilter","onFilterFocus","blurFilterInput","ctx_r105","touchEnabled","ariaOwns","ariaActivedescendant","noDataLabel","DropDownListComponent_ng_template_9_ng_template_1_Template","ctx_r106","isDisabledDefaultItem","getDefaultItemText","DropDownListComponent_ng_template_9_ng_template_2_ng_template_1_Template","DropDownListComponent_ng_template_9_ng_template_2_Template","ctx_r107","itemTemplate","defaultItem","DropDownListComponent_ng_template_9_3_ng_template_0_Template","DropDownListComponent_ng_template_9_3_Template","ctx_r108","DropDownListComponent_ng_template_9_div_6_ng_template_1_Template","DropDownListComponent_ng_template_9_div_6_ng_template_2_Template","ctx_r122","DropDownListComponent_ng_template_9_div_6_Template","ctx_r110","DropDownListComponent_ng_template_9_7_ng_template_0_Template","DropDownListComponent_ng_template_9_7_Template","ctx_r111","DropDownListComponent_ng_template_9_Template","_r125","ctx_r101","filterable","textField","DropDownListComponent_ng_template_11_Template","_r127","_c35","MultiSelectComponent_span_7_Template","_r137","clearAll","MultiSelectComponent_span_8_Template","MultiSelectComponent_ng_template_9_0_ng_template_0_Template","MultiSelectComponent_ng_template_9_0_Template","ctx_r138","MultiSelectComponent_ng_template_9_div_1_2_ng_template_0_Template","MultiSelectComponent_ng_template_9_div_1_2_Template","ctx_r144","customItemTemplate","MultiSelectComponent_ng_template_9_div_1_ng_template_3_Template","MultiSelectComponent_ng_template_9_div_1_Template","_r145","ctx_r139","MultiSelectComponent_ng_template_9_div_4_ng_template_1_Template","MultiSelectComponent_ng_template_9_div_4_ng_template_2_Template","ctx_r149","MultiSelectComponent_ng_template_9_div_4_Template","ctx_r141","MultiSelectComponent_ng_template_9_5_ng_template_0_Template","MultiSelectComponent_ng_template_9_5_Template","ctx_r142","MultiSelectComponent_ng_template_9_Template","_r152","ctx_r133","allowCustom","MultiSelectComponent_ng_template_11_Template","_r154","TagListComponent_li_1_1_ng_template_0_Template","TagListComponent_li_1_1_Template","TagListComponent_li_1_ng_template_2_1_ng_template_0_Template","TagListComponent_li_1_ng_template_2_1_Template","tag_r156","ctx_r164","TagListComponent_li_1_ng_template_2_ng_template_2_Template","TagListComponent_li_1_ng_template_2_Template","ctx_r160","TagListComponent_li_1_ng_template_4_1_ng_template_0_Template","TagListComponent_li_1_ng_template_4_1_Template","ctx_r169","TagListComponent_li_1_ng_template_4_ng_template_2_Template","ctx_r170","tagProp","TagListComponent_li_1_ng_template_4_Template","ctx_r162","_c36","TagListComponent_li_1_Template","_r175","deleteTag","i_r157","_r159","_r161","ctx_r155","itemId","isGroupTag","isObjectArray","selectedIndices","extractedValues","usePrimitive","matchText","SearchBarComponent","localization","onNavigate","searchBarClass","_userInput","_previousValue","_placeholder","userInput","setInputSize","previousUserInput","suggestedText","caretIndex","caretAtEnd","writeInputValue","setInputSelection","activeElement","setSelectionRange","ArrowLeft","ArrowRight","Escape","Delete","Backspace","Home","End","lengthOf","placeholderLength","textLength","listId","tagListId","activeDescendant","role","handleKeydown","ItemTemplateDirective","HeaderTemplateDirective","FooterTemplateDirective","GroupTemplateDirective","FixedGroupTemplateDirective","SelectionService","onSelect","isSelected","newSelection","added","removed","focusedIndex","NavigationAction","DataService","grouped","groupIndices","_data","isGrouped","getGroupIndices","_flatData","itemIndex","itemAt","itemsCount","groupField","groupIndex","DisabledItemsService","dataService","itemDisabled","NavigationEvent","NavigationService","disabledItemsService","selectionService","enter","tab","esc","up","down","backspace","home","Open","Close","Esc","Left","Right","nextIndex","clampIndex","firstFocusableIndex","isIndexDisabled","NoDataTemplateDirective","FilterableDropDownComponentBase","ListItemDirective","ListComponent","cdr","lastLoaded","lastScrollTop","scrollToFocused","selectSubscription","scrollToItem","pageSize","scrollSubscription","prefetchData","findCurrentGroup","positionItems","elementFromPoint","firstVisibleItem","groupAt","itemGroup","visibleItems","trunc","prevPage","changePage","flatIndex","firstGroupHeaderInTargetedPage","scrollToIndex","contentScrollTop","itemOffsetTop","contentOffsetHeight","bottomDistance","DEFAULTS","normalizeVirtualizationSettings","AUTOCOMPLETE_VALUE_ACCESSOR","AutoCompleteComponent","navigationService","highlightFirst","filterChange","onChangeCallback","onTouchedCallback","popupMouseDownHandler","_popupSettings","_open","valueChangeSubject","subscribeEvents","resetSelection","wrapperOffsetWidth","popupHeight","containerClasses","hasMatch","suggest","backspacePressed","shouldOpen","_toggle","triggerPopupEvents","_virtualSettings","setMessages","destroyPopup","unsubscribeEvents","messagesTimeout","searchbar","popupWrapper","findIndexPredicate","togglePopup","currentTextLength","insensitiveMatch","valueHasChanged","valueChangeSubscription","hasChange","emitChange","changeSubscription","handleItemChange","focusSubscription","handleItemFocus","navigationSubscription","navigate","closeSubscription","enterSubscription","handleEnter","escSubscription","handleEscape","popupTemplate","listContainerClasses","optionsList","createPopup","maxIndex","itemText","handleNavigate","searchBarChange","suggestion","TOUCH_ENABLED","ValueTemplateDirective","DROPDOWNLIST_VALUE_ACCESSOR","DropDownListComponent","touchEnabled$$1","selectionChange","filterFocused","filterBlurred","wrapperFocused","wrapperBlurred","selectionSubscription","onMouseDown","wrapperWidth","providedTabIndex","setState","_previousDataItem","_valuePrimitive","firstIndex","hasSelected","focusedItemNotSelected","onKeyPress","localizationChangesSubscription","assignAriaDescribedBy","iconClass","isItemDisabled","confirm","valuePrimitive","updateState","itemFromEvent","onSelectionChange","shouldUsePrevious","shouldUseNewValue","clearFilter","openSubscription","filterBlurredSubscription","componentBlurredSubscription","componentBlur","currentOrDefault","valueFrom","charCode","typingTimeout","selectNext","isInLoop","splitIndex","loopMatch","nextMatch","findDataItem","ofSameType","clearState","trimmed","valueLabelId","keypress","focusComponent","blurComponent","widgetTabIndex","ariaExpanded","buttonClasses","CustomItemTemplateDirective","TagTemplateDirective","GroupTagTemplateDirective","RemoveTagEvent","MULTISELECT_VALUE_ACCESSOR","MultiSelectComponent","differs","tagPrefix","focusedTagIndex","autoClose","tagMapper","valueNormalizer","matchingValue","removeTag","selectedDataItems","customValueSubject","observableSubscriptions","closePopup","differ","valueChangeDetected","focusedListIndex","newItem","emitValueChange","addCustomValue","customValues","resolveDataItemFromTags","openPopup","searchTextAndFocus","navigateInput","selectValue","handleBackspace","tagData","removeGroupTag","removeSingleTag","createCustomValueStream","isClosed","isTagFocused","handleClose","handleUp","handleHome","handleEnd","handleDelete","handleRightKey","handleLeftKey","handleDownKey","customValueSubscription","dataItemValues","unselect","nextTick","normalizedValue","customItem","handleRemoveTag","startsFrom","tagTemplate","groupTagTemplate","wrapperMousedown","onSearchBarBlur","onSearchBarFocus","TagListComponent","TemplateContextDirective","insertedViewRef","templateContext","SelectableDirective","focusedClassName","selectedClassName","LocalizedMessagesDirective","SharedDirectivesModule","AutoCompleteModule","ComboBoxModule","FilterInputDirective","DropDownListModule","MultiSelectModule","DropDownsModule","PagerNumericButtonsComponent_option_1_Template","ctx_r182","pageLabel","PagerNumericButtonsComponent_option_2_Template","num_r188","ctx_r183","currentPage","PagerNumericButtonsComponent_option_3_Template","ctx_r184","PagerNumericButtonsComponent_li_5_Template","_r190","ctx_r189","ctx_r185","PagerNumericButtonsComponent_li_6_Template","_r193","num_r191","ctx_r186","PagerNumericButtonsComponent_li_7_Template","_r195","ctx_r194","ctx_r187","focusout","PagerComponent_ng_container_2_Template","ctx_r196","PagerComponent_ng_container_3_kendo_datapager_prev_buttons_1_Template","PagerComponent_ng_container_3_kendo_datapager_numeric_buttons_2_Template","buttonCount","PagerComponent_ng_container_3_kendo_datapager_input_3_Template","PagerComponent_ng_container_3_kendo_datapager_next_buttons_4_Template","PagerComponent_ng_container_3_kendo_datapager_info_5_Template","PagerComponent_ng_container_3_kendo_datapager_page_sizes_6_Template","pageSizeValues","PagerComponent_ng_container_3_Template","ctx_r197","previousNext","PageSizeChangeEvent","newPageSize","firstPage","lastPage","previousPage","nextPage","page","pageNumberInputTitle","itemsPerPage","PagerContextService","pageSizeChange","PagerElementComponent","pagerContext","PagerPrevButtonsComponent","textFor","PagerPageSizesComponent","_pageSizes","pageSizes","normalizedItems","dropDownList","dropdownlist","changePageSize","_r181","_r180","PagerTemplateDirective","PagerNumericButtonsComponent","numbersWrapClass","totalPages","reminder","pageText","valueAsNumber","onSelectChange","buttons","PagerNextButtonsComponent","PagerInputComponent","incomingValue","hasPages","PagerInfoComponent","currentPageText","maxItems","DEFAULT_PAGE_SIZE_VALUES","PagerComponent","pagerWrapClass","pagerClass","widgetClass","widgetRole","_templateContext","_pageSizeValues","resizeHandler","importedModules","PagerModule","ListViewComponent_0_ng_template_0_Template","ListViewComponent_0_Template","ListViewComponent_div_1_ng_template_1_Template","ListViewComponent_div_1_Template","ctx_r228","ListViewComponent_div_4_ng_template_1_Template","isLast","ListViewComponent_div_4_Template","dataItem_r239","index_r240","first_r241","last_r242","ctx_r230","itemClass","itemStyle","listItemRole","ListViewComponent_div_5_Template","ListViewComponent_6_ng_template_0_Template","ListViewComponent_6_Template","loaderTemplate","ListViewComponent_div_7_ng_template_1_Template","ListViewComponent_div_7_Template","ctx_r233","ListViewComponent_8_ng_template_0_Template","ListViewComponent_8_Template","ListViewComponent_ng_template_9_kendo_datapager_0_Template","_r250","handlePageChange","pagerClass_r247","ctx_r248","pagerSettings","ListViewComponent_ng_template_9_Template","pageable","msMatchesSelector","webkitMatchesSelector","isListViewItem","getListItemIndex","activeIndex","totalItemsCount","navigateToPrevious","navigateToNext","navigateTo","closestListViewItem","setActiveIndex","targetIndex","contender","ListViewNavigableItemDirective","updateNavigationState","updateTabIndex","updateFocusedState","isActive","LoaderTemplateDirective","DEFAULT_PAGER_SETTINGS","ListViewComponent","containerRole","scrollBottom","_navigable","handleContentScroll","navigable","removeNavigationListeners","addNavigationListeners","_pageable","focusIndex","listViewItems","scrollToContainerTop","removeKeydownListener","removeFocusInListener","handleFocusIn","removeFocusOutListener","handleFocusOut","containerStyle","containerClass","containerLabel","ListViewModule","_typeof","_defineProperty","_objectSpread","ownKeys","_slicedToArray","_arr","_n","_d","_s","_i","_WINDOW","_DOCUMENT","MutationObserver","_ref$userAgent","WINDOW","IS_DOM","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","FontAwesomeConfig","_ref","_ref2","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","shims","doScroll","readyState","asyncTimer","isNode","asyncSetTimer","setImmediate","asyncQueue","asyncFlush","asyncCall","invokeCallback","settled","handleThenable","fulfill","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","rejectPromise","onFulfillment","onRejection","race","meaninglessTransform","flipX","flipY","nextUniqueId","htmlEscape","joinStyles","styleName","transformIsMeaningful","transformForSvg","iconWidth","containerWidth","innerTranslate","innerScale","innerRotate","inner","ALL_SPACE","fillBlack","abstract","makeInlineSvgAbstract","_params$icons","icons","main","maskId","titleId","_params$watchable","watchable","found","isUploadedIcon","widthClass","attrClass","uploadedIconWidthStyle","explicitMaskId","mainPath","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","styleString","thisContext","defineIcons","_params$skipHooks","skipHooks","normalized","addPack","lookup","reducer","ligatures","ligature","hasRegular","shim","iconFromMapping","mapping","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","MissingIcon","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","asFoundIcon","vectorData","class","ensureCss","_cssInserted","headChildren","beforeChild","drc","fp","rc","dPatt","customPropPatt","rPatt","apiObject","abstractCreator","findIconDefinition","iconLookup","_iconLookup$prefix","library","Library","Constructor","protoProps","_this","_len","_pullDefinitions","_normalized$key","iconDefinition","_params$transform","_params$symbol","_params$mask","_params$maskId","_params$title","_params$titleId","_params$classes","_params$attributes","_params$styles","maybeIconDefinition","FaConfig","defaultPrefix","fallbackIcon","globalLibrary","FaIconLibrary","packs","pack","addIcons","faClassList","pulse","fixedWidth","inverse","stackItemSize","FaStackItemSizeDirective","FaIconComponent","iconLibrary","stackItem","iconToBeRendered","buildParams","renderIcon","iconSpec","getIconDefinition","globalDefinition","classOpts","parsedTransform","transformString","a11yRole","renderedIcon","renderedIconHTML","bypassSecurityTrustHtml","FontAwesomeModule","AutoselectListComponent","hasSearch","useCheckIcon","itemSelect","updateResults","loadMore","selectedOption","selectedItems","keyField","DetailAccountFilterComponent","detailChoicesService","refreshHandler","apiState","buildData","accountdetails","accountname","selectedItem","productLine","clearUpdateListener","setSelectedItem","DetailAssayFilterComponent","rawList","metricId","assay","assaysDetails","assays","diseaseState","ds","diseasestate","ToggleSwitches","updateListener","selectedValues","DetailCapitalServiceAssaySwitchesFilterComponent","DetailCategorySwitchesFilterComponent","DetailCustomerFilterComponent","rawCustomers","customers","addedCustomerIds","productlines","DetailDiseaseStateFilterComponent","diseaseStateDetails","asid","DetailProductLineFilterComponent","rawProductLines","productline","productname","addedProductLines","customerId2","BrPlaceholderComponent","BrStackedBarLineChartComponent","yAxisLabel","markUnits","valueSize","roundSizeStr","roundSize","roundUp","chartTopLimit","chartBottomLimit","yAxisMajorUnit","markUnitsPointCount","toTheNearest","dataFound","setHasData","BrMultiLineChartComponent","names2","axisassigments","tickCountRight","yrighttickcount","BrMultiBarChartComponent","periods","name1","name2","BrLineChartComponent","strYAxis","strYAxis2","strChartTitle","yAxisLabel2","BrPieChartComponent","BrStackedBarChartByProductComponent","BrTextIndicatorComponent","strScore","strColor","strSubTitle","subtitle","BrTopItemsComponent","overallColor","fieldColor","techColor","overallScore","fieldScore","techScore","BrExamplePieChartComponent","students","ApiTestComponent","apiCallIncrement","refreshCall","PersonaOptionsService","loadPersonaOptions","configType","apiCall","loadPersonaOptionList","NEVER","Notification","kind","do","undefinedValueNotification","completeNotification","delayFor","DelayOperator","notification","DelayMessage","_schedule","scheduleNotification","createNext","createComplete","ERR_SW_NOT_SUPPORTED","serviceWorker","controllerChanges","controller","controllerWithChanges","worker","registration","getRegistration","payload","sw","postMessage","toPromise","nonce","waitForStatus","eventsOfType","SwPush","subscriptionChanges","messages","notificationClicks","pushManager","workerDrivenSubscriptions","getSubscription","pushOptions","userVisibleOnly","decodeBase64","serverPublicKey","applicationServerKey","success","atob","SwUpdate","statusNonce","generateNonce","postMessageWithStatus","SwRegistrationOptions","ngswAppInitializer","readyToRegister$","registrationStrategy","stable","ngswCommChannelFactory","ServiceWorkerModule","PushNotificationService","subscribeRoute","sendRoute","ServerHashParamKeys","TemporaryCacheKeys","PersistentCacheKeys","ErrorCacheKeys","SSOTypes","CryptoUtils","createNewGuid","cryptoObj","crypto","getRandomValues","decimalToHex","guidHolder","guidResponse","isGuid","base64Encode","btoa","base64Decode","encodedString","deserialize","Constants","_popUpWidth","_popUpHeight","openidScope","profileScope","AuthorityType","BlacklistedEQParams","SID","LOGIN_HINT","PromptState","LOGIN","SELECT_ACCOUNT","CONSENT","AuthError","errorMessage","createUnexpectedError","errDesc","AuthErrorMessage","createNoWindowObjectError","StringUtils","validateAndParseJsonCacheKey","parsedKey","ClientAuthErrorMessage","ClientAuthError","createEndpointResolutionError","errDetail","createPopupWindowError","createTokenRenewalTimeoutError","createInvalidIdTokenError","idToken","createInvalidStateError","invalidState","actualState","createNonceMismatchError","invalidNonce","actualNonce","createLoginInProgressError","createAcquireTokenInProgressError","createUserCancelledError","createErrorInCallbackFunction","errorDesc","createUserLoginRequiredError","createUserDoesNotExistError","createClientInfoDecodingError","caughtError","createClientInfoNotPopulatedError","createIdTokenNullOrEmptyError","invalidRawTokenString","createIdTokenParsingError","caughtParsingError","createTokenEncodingError","incorrectlyEncodedToken","createInvalidInteractionTypeError","createCacheParseError","createBlockTokenRequestsInHiddenIframeError","ClientConfigurationErrorMessage","ClientConfigurationError","createNoSetConfigurationError","createStorageNotSupportedError","givenCacheLocation","createRedirectCallbacksNotSetError","createInvalidCallbackObjectError","callbackObject","createEmptyScopesArrayError","scopesValue","createScopesNonArrayError","createScopesRequiredError","createInvalidPromptError","promptValue","createClaimsRequestParsingError","claimsRequestParseError","createEmptyRequestError","createInvalidCorrelationIdError","createKnownAuthoritiesNotSetError","createInvalidAuthorityTypeError","createUntrustedAuthorityError","createTelemetryConfigError","requiredKeys","applicationName","applicationVersion","telemetryEmitter","createSsoSilentError","createInvalidAuthorityMetadataError","ScopeSet","isIntersectingScopes","cachedScopes","scopes","convertedCachedScopes","trimAndConvertArrayToLowerCase","requestScopes","containsScope","trimAndConvertToLowerCase","trimScopes","scopeVal","parseScope","scopeList","validateInputScope","scopesRequired","getScopeFromState","resourceDelimiter","appendScopes","reqScopes","reqExtraScopesToConsent","convertedExtraScopes","convertedReqScopes","onlyContainsOidcScopes","scopesCount","oidcScopesFound","containsAnyOidcScopes","containsOpenIdScope","containsProfileScope","onlyContainsClientId","clientId","appendDefaultScopes","extendedScopes","removeDefaultScopes","translateClientIdIfSingleScope","oidcScopes","UrlUtils","createNavigateUrl","serverRequestParams","createNavigationUrlString","authEndpoint","authorityInstance","AuthorizationEndpoint","redirectUri","xClientSku","xClientVer","claimsValue","queryParameters","extraQueryParameters","correlationId","getCurrentUrl","removeHashFromUrl","replaceTenantPath","tenantId","lowerCaseUrl","urlObject","GetUrlComponents","pathArray","PathSegments","ORGANIZATIONS","CONSUMERS","constructAuthorityUriFromObject","CanonicalizeUri","Protocol","HostNameAndPort","isCommonAuthority","authority","isOrganizationsAuthority","isConsumersAuthority","regEx","urlComponents","AbsolutePath","pathSegments","Search","urlRemoveQueryStringParameter","getHashFromUrl","urlStringOrFragment","hashIndex1","hashIndex2","urlContainsHash","urlString","deserializeHash","ERROR_DESCRIPTION","ERROR","ACCESS_TOKEN","ID_TOKEN","urlFragment","getHostFromUri","uri","utid","homeAccountIdentifier","AccessTokenValue","accessToken","expiresIn","ServerRequestParameters","CanonicalAuthority","populateQueryParams","adalIdTokenObject","silentCall","claimsRequest","isSSOParam","constructUnifiedCacheQueryParameter","addHintParameters","eQParams","generateQueryParametersString","idTokenObject","ssoType","ssoData","sid","userName","loginHint","upn","addSSOParameter","qParams","ssoParam","paramsString","domain_hint","determineResponseType","accountsMatch","responseTypeForMatchingAccounts","XhrClient","sendRequestAsync","enableCaching","jsonResponse","statusCode","TrustedAuthority","setTrustedAuthoritiesFromConfig","validateAuthority","knownAuthorities","getTrustedHostList","TrustedHostList","getAliases","authorityToVerify","telemetryManager","client","instanceDiscoveryEndpoint","httpEvent","createAndStartHttpEvent","DEFAULT_AUTHORITY","httpResponseStatus","stopEvent","serverErrorCode","setTrustedAuthoritiesFromNetwork","IsInTrustedHostList","LogLevel","Authority","authorityMetadata","IsValidationEnabled","validateAsUri","tenantDiscoveryResponse","isAdfs","authorityUrl","ADFS","canonicalAuthority","Adfs","CanonicalAuthorityUrlComponents","validateResolved","Tenant","EndSessionEndpoint","Issuer","hasCachedMetadata","canonicalAuthorityUrlComponents","DiscoverEndpoints","openIdConfigurationEndpoint","resolveEndpointsAsync","openIdConfigurationEndpointResponse","GetOpenIdConfigurationEndpoint","DefaultOpenIdConfigurationEndpoint","ClientInfo","rawClientInfo","decodedClientInfo","clientInfo","stripPolicyFromUid","_uid","_utid","createClientInfoFromIdToken","uidSegments","urlSegments","policy","encodeClientInfo","TimeUtils","parseExpiresIn","relativeNowMs","TokenUtils","decodeJwt","jwtToken","JWSPayload","JWSSig","validateExpirationIsWithinOffset","expiration","tokenRenewalOffsetSeconds","extractIdToken","encodedIdToken","decodedToken","base64Decoded","rawIdToken","claims","issuer","objectId","preferredName","homeObjectId","cloudInstance","AccessTokenCacheItem","BrowserStorage","cacheLocation","enableCookieStorage","setItemCookie","getItemCookie","removeItem","cName","cValue","expires","getCookieExpirationTime","clearItemCookie","cookieLifeDays","RequestUtils","validateRequest","isLoginCall","interactionType","extraScopesToConsent","validatePromptParameter","validateEQParameters","validateClaimsRequest","validateAndGenerateState","validateAndGenerateCorrelationId","userState","generateLibraryState","stateObject","ts","stateString","parseLibraryState","libraryState","interactionTypeRedirect","createRequestSignature","AuthCache","storeAuthStateInCookie","rollbackEnabled","migrateCacheEntries","clientInfoKey","cachePrefix","CLIENT_INFO","errorKey","errorDescKey","ERROR_DESC","idTokenValue","IDTOKEN","aud","values_1","duplicateCacheEntry","generateCacheKey","addInstanceId","adalIdToken","matchKeyForType","tokenType","accountMatches","tokenTypeMatches","resetCacheItems","storage","resetTempCacheItems","stateId","isTokenRenewalInProgress","tokenRenewalInProgress","INTERACTION_STATUS","REDIRECT_REQUEST","getAllTokensByType","matchedTokenKey","newAccessTokenCacheItem","getAllAccessTokens","getAllIdTokens","getAllTokens","accessTokens","idTokens","stateValue","renewStatus","generateTemporaryCacheKey","RENEW_STATUS","inProgress","clearMsalCookie","NONCE_IDTOKEN","STATE_LOGIN","LOGIN_REQUEST","STATE_ACQ_TOKEN","generateAcquireTokenAccountKey","accountId","ACQUIRE_TOKEN_ACCOUNT","generateAuthorityKey","AUTHORITY","tempCacheKey","accountIdentifier","idTokenClaims","createAccount","compareAccounts","WindowUtils","isInIframe","isInPopup","opener","generateFrameName","requestSignature","monitorIframeForHash","contentWindow","urlNavigate","logger","timeoutMark","verbose","intervalId","errorPii","POLLING_INTERVAL_MS","monitorPopupForHash","maxTicks","clearUrlFragment","loadFrame","frameName","timeoutMs","infoPii","frameHandle","loadFrameSync","addHiddenIFrame","iframeId","adalFrame","getElementById","ifr","insertAdjacentHTML","frames","removeHiddenIframe","iframe","getIframeWithHash","iframes","getPopups","openedWindows","getPopUpWithHash","trackPopup","closePopups","blockReloadInHiddenIframes","checkIfBackButtonIsPressed","cacheStorage","redirectCache","splitCache","ResponseUtils","setResponseIdToken","originalResponse","idTokenObj","expiresOn","buildAuthResponse","authResponse","serverAuthenticationRequest","accountState","AuthorityFactory","saveMetadataFromNetwork","metadataMap","getMetadata","saveMetadataFromConfig","authorityMetadataJson","parsedMetadata","authorization_endpoint","end_session_endpoint","CreateInstance","Logger","localCallback","Info","_c","piiLoggingEnabled","logMessage","logLevel","containsPii","executeCallback","warning","Warning","warningPii","Verbose","verbosePii","isPiiLoggingEnabled","DEFAULT_AUTH_OPTIONS","postLogoutRedirectUri","navigateToLoginRequestUrl","DEFAULT_CACHE_OPTIONS","DEFAULT_SYSTEM_OPTIONS","loadFrameTimeout","navigateFrameWait","DEFAULT_FRAMEWORK_OPTIONS","isAngular","unprotectedResources","protectedResourceMap","ServerError","createServerUnavailableError","createUnknownServerError","InteractionRequiredAuthErrorMessage","InteractionRequiredAuthError","isInteractionRequiredError","errorString","createLoginRequiredAuthError","createInteractionRequiredAuthError","createConsentRequiredAuthError","buildResponseStateOnly","fromCache","API_CODE","API_EVENT_IDENTIFIER","scrubTenantFromUri","pathParams","tenantPosition","hashPersonalIdentifier","valueToHash","prependEventNamePrefix","supportsBrowserPerformance","mark","TelemetryEvent","eventLabel","eventId","setElapsedTime","measureName","startMark","endMark","startTimestamp","perfStartMark","perfEndMark","clearMeasures","clearMarks","telemetryCorrelationId","DefaultEvent","eventCount","sdk","sdkVersion","networkInformation","connectionSpeed","getEventCount","EVENT_KEYS","mapEventIdentiferToCode","AcquireTokenSilent","AcquireTokenPopup","AcquireTokenRedirect","LoginPopup","LoginRedirect","Logout","ApiEvent","piiEnabled","apiEventIdentifier","apiCode","wasSuccessful","authorityType","promptType","HttpEvent","scrubbedUri","httpPath","apiVersion","httpMethod","requestIdHeader","speInfo","subErrorCode","TelemetryManager","completedEvents","inProgressEvents","eventCountByCorrelationId","onlySendFailureTelemetry","telemetryPlatform","libraryName","effectiveType","getTelemetrymanagerStub","startEvent","incrementEventCount","orphanedEvents","getOrphanedEvents","eventsToFlush","eventCountsToFlush","defaultEvent","eventsWithDefaultEvent","createAndStartApiEvent","apiEvent","stopAndFlushApiEvent","apiErrorCode","correlation","memo","eventKey","event_1","AuthCacheUtils","filterTokenCacheItemsByScope","tokenCacheItems","cacheItem","searchScopes","filterTokenCacheItemsByAuthority","filterTokenCacheItemsByDomain","requestDomain","UserAgentApplication","configuration","authResponseCallback","tokenReceivedCallback","errorReceivedCallback","system","framework","inCookie","getTelemetryManagerFromConfig","telemetry","activeRenewals","renewStates","callbackMappedToRenewStates","promiseMappedToRenewStates","msal","urlHash","getResponseState","handleRedirectAuthenticationResponse","getAuthorityInstance","handleRedirectCallback","authOrTokenCallback","redirectError","authErrorHandler","redirectResponse","authResponseHandler","interactionTypePopup","authErr","loginRedirect","userRequest","acquireTokenInteractive","acquireTokenRedirect","loginPopup","acquireTokenPopup","interactionProgress","stateOnlyResponse","getAccountState","getAccount","acquireTokenHelper","extractADALIdToken","tokenRequest","buildIDTokenRequest","silentLogin","acquireTokenSilent","acquireTokenAuthority","popUpWindow","loginStartPage","error_1","err_1","getTokenType","redirectStartPage","getRedirectUri","updateCacheEntries","response_mode_fragment","requestType","login","renewToken","registerCallback","popUpWidth","popUpHeight","handleAuthenticationResponse","broadcast","onRedirectNavigate","navigateWindow","ssoSilent","interactionTypeSilent","userContainedClaims","cacheResultResponse","err_2","forceRefresh","getCachedToken","renewIdToken","winLeft","screenLeft","screenX","winTop","screenTop","screenY","popupWindow","loadIframeTimeout","expectedState","error_2","logout","logoutAsync","requestCorrelationId","correlationIdParam","postLogoutQueryParam","error_3","clearCache","getPostLogoutRedirectUri","clearCacheForScope","accessTokenItems","isCallback","processCallBack","stateInfo","parentCallback","saveTokenFromHash","locationHash","tokenResponseCallback","loginRequestUrl","finalRedirectUrl","loginRequestUrlComponents","stateResponse","STATE","parsedState","unknown","stateMatch","silentAuthenticationState","statesInParentContext","getCachedIdToken","getCachedAccessToken","getTokenCacheItemByAuthority","filteredAuthorityItems","accessTokenCacheItem","idTokenCacheItems","idTokenCacheItem","evaluateTokenExpiration","scopeFilteredTokenCacheItems","aState","tokenCacheItem","prompt_none","saveToken","accessTokenKey","accessTokenValue","saveIdToken","idTokenResponse","saveAccessToken","accessTokenResponse","SCOPE","consentedScopes","accessTokenCacheItems","EXPIRES_IN","hashParams","authorityKey","acquireTokenAccountKey","LOGIN_ERROR","no_account","hashErrDesc","SESSION_STATE","populateAuthority","accountKey","acquireTokenAccountKey_noaccount","cachedAccount","acquireTokenAccount","cachedNonce","cachedAuthority","getAllAccounts","accounts","getUniqueAccounts","uniqueAccounts","CustomEvent","getCachedTokenInternal","accountObject","newAuthority","getScopesForEndpoint","endpoint","getLoginInProgress","setInteractionInProgress","setloginInProgress","loginInProgress","getAcquireTokenInProgress","setAcquireTokenInProgress","acquireTokenInProgress","getLogger","setLogger","reqRedirectUri","getCurrentConfiguration","setAccountCache","getAccountId","setAuthorityCache","BroadcastService","_msalSubject","msalItem$","MSALError","_errorDesc","_scopes","MSAL_CONFIG","MSAL_CONFIG_ANGULAR","MsalService","msalConfig","msalAngularConfig","broadcastService","errorParts","msalError","authError","frameworkProtectedResourceMap","keyMatchesEndpointArray","keyForEndpoint","MsalGuard","baseElements","pathUrl","popUp","consentScopes","getDestinationUrl","loginInteractively","defaultMsalAngularConfiguration","MsalModule_1","MsalModule","angularConfig","TooltipContentComponent_div_3_ng_template_1_Template","TooltipContentComponent_div_3_Template","ctx_r253","titleTemplate","TooltipContentComponent_ng_template_4_Template","TooltipContentComponent_ng_template_5_Template","templateString","TooltipContentComponent_div_6_Template","_r260","onCloseClick","ctx_r256","closeButtonTitle","TooltipContentComponent_div_7_Template","calloutPositionClass","TOOLTIP_SETTINGS","TooltipSettings","isDocumentNode","sel","getCenterOffset","containsItem","TooltipContentComponent","tooltipWidth","tooltipHeight","callout","calloutStyles","calloutSize","closable","dynamicRTLSubscription","closeTitle","offsetProperty","anchorCenter","contentCenter","cssClasses","cssPosition","TooltipDirective","tooltipWrapper","legacySettings","showAfter","validPositions","validShowOptions","anchorTitleSubscription","filterElement","hideElementTitle","mouseOverSubscription","onMouseOver","mouseOutSubscription","onMouseOut","showOn","showTimeout","showContent","popupMouseOutSubscription","closeClickSubscription","previousAnchor","verifyProperties","subscribeClick","mouseClickSubscription","popupPositionChangeSubscription","anchorRef","bindContent","contentComponent","alignSettings","popupMargin","inputcollision","tooltipClass","updateCalloutPosition","onMouseClick","tooltipTemplate","COMPONENT_MODULES","TooltipModule","ToolSelectorComponent","mycrl","toolOptions","ct","alerts","gsalerts","businessreview","toolOption","getToolOption","KendoButtonService","buttonLookChange","buttonClicked","buttonClicked$","look","ButtonDirective","toggleable","selectedChange","isIcon","isIconClass","_focused","_selected","iconSetter","addIcon","updateIconNode","iconClassName","imageUrl","addImgIcon","removeImageNode","toggleClass","isSpan","buttonLookChangeSubscription","togglable","toggleAriaPressed","_onButtonClick","setIconTextClasses","imageNode","iconNode","deferTimeout","unbindHandler","attribute","shouldSet","prependChild","insertIcon","removeIconNode","hasIcon","hasText","setSelected","roleSetter","classDisabled","classButton","classPrimary","isBare","isOutline","isClear","classActive","ButtonGroupComponent","_tabIndex","currentTabIndex","isSelectionSingle","navigateFocus","defocus","setButtonLook","newSelectionValue","getRole","wrapperTabIndex","stretchedClass","ButtonModule","ButtonGroupModule","ListModule","SplitButtonModule","DropDownButtonModule","ChipModule","ButtonsModule","BookmarksComponent","bkMenuViable","apiRoute","links","globallink","sortBookmarks","iValue","displayname","jValue","onToggle","screenWidth","LabelDirective","labelClass","getFocusableComponent","fileSelect","HTMLInputElement","hidden","for","setAriaLabelledby","clickListener","labelTarget","labelFor","FloatingLabelModule","LabelModule","PreferencesComponent","primaryDisabled","secondaryDisabled","tertiaryDisabled","getNavFilterSelectionSubject","requireOne","savePreferences","prefCurrencyChoices","countChecked","Personas","TssAmbassadorSelectorComponent","authSet","dataHasExtras","users","customizeData","user511","userUPI","onPersonaChoiceUpdate","getLabel","ManagerSelectorComponent","CuaManagerSelectorComponent","firstName","lastName","mgr511","mgrUpi","setManager","GeoLocationSelectorComponent","selectedTab","areaData","countryData","molecularOrgData","regionData","serviceManagerData","apiConfig","areas","countries","molecularorgs","regions","servicemanagers","getTypeOfSelectedItem","onSelectedChange","ManagerAmbSelectorComponent","getDataItemByKeyField","AccountRepComponent","acctRep511","acctRepUpi","StateHandlerSearchComponent","noResultsMessage","CustomerSelectListComponent","displayField","totalRecordsFound","totalRecordsReturned","customerName","customerNum","uniqueCustomerKey","CtCustomerSelectorComponent","setCustomerOverride","AccountSelectListComponent","acctEntityName","acctEntityId","CtAccountSelectorComponent","PersonaSelectorComponent","cdRef","menuViable","isService","lastSelectedDashboardTabInfo","selectedType","selectedValue","selectedLabel","menuText1","menuText2","updateSelections","onTabChange","getServiceVsAmbState","level1Choice","textPieces","buildPhrase","personaOptions","menuTabs","TssAmbassador","AmbManager","GeoLocation","personas","selectedPersona","ToggleSwitchComponent","stateOn","filterKey","CustomerToggleComponent","InstrumentToggleComponent","TrackToggleComponent","FlagshipToggleComponent","ParameterSwitchesComponent","CustomerSelectorComponent","customersrno","sub_label","city","InstrumentSelectorComponent","SnSelectorComponent","country","AccountComponent","PersonaSelector2Component","level2Choice","DialogActionsComponent_0_Template","DialogActionsComponent_ng_container_1_button_1_Template","_r122","action_r120","onButtonClick","buttonClass","DialogActionsComponent_ng_container_1_Template","ctx_r117","DialogActionsComponent_2_ng_template_0_Template","DialogActionsComponent_2_Template","DialogComponent_kendo_dialog_titlebar_4_Template","ctx_r124","DialogComponent_5_Template","DialogComponent_7_Template","DialogComponent_8_ng_template_0_Template","DialogComponent_8_Template","contentTemplate","DialogComponent_9_Template","DialogComponent_kendo_dialog_actions_10_Template","ctx_r129","actionsLayout","WindowTitleBarComponent_0_Template","WindowTitleBarComponent_1_ng_template_0_Template","WindowTitleBarComponent_1_Template","ctx_r132","WindowComponent_kendo_window_titlebar_3_Template","ctx_r134","titleBarTemplate","minimizeButtonTitle","maximizeButtonTitle","restoreButtonTitle","WindowComponent_4_Template","WindowComponent_div_5_1_Template","WindowComponent_div_5_2_ng_template_0_Template","WindowComponent_div_5_2_Template","WindowComponent_div_5_Template","ctx_r136","keepContent","WindowComponent_ng_template_6_div_0_Template","WindowComponent_ng_template_6_Template","resizeDirections","DialogActionsComponent","buttonGroupClassName","actionTemplate","DialogTitleBarComponent","focusableRegex","namesList","isFocusable","checkVisibility","validTabIndex","focusable","focusableSelector","RESIZE_DIRECTIONS","OFFSET_STYLES","createValueWithUnit","DialogCloseResult","DIALOG_LOCALIZATION_SERVICE","DialogComponent","_elRef","generateTitleId","handleActionButtonFocus","keepFocusWithinComponent","titlebarContent","handleInitialFocus","titlebarView","actionsView","primaryButton","autoFocusedElement","initiallyFocusedElement","shouldFocusPrimary","focusableActionButtons","getAllFocusableChildren","firstFocusable","lastFocusable","getLastFocusableElement","tabBeforeFirstFocusable","tabAfterLastFocusable","tabWithNoFocusable","minHeight","maxHeight","onComponentKeydown","DialogContentBase","dialog","dialogTitleBar","dialogActions","DialogContainerService","DialogInjector","getDialogRef","DialogService","containerService","initializeDialog","dialogRef","apiClose","preventAction","dialogRefParameter","hasContentTitle","hasContentActions","multipleTitles","multipleActions","titleNodes","actionNodes","newZIndex","resizable","createMoveStream","originalY","DragResizeService","stateChange","resizeStart","resizeEnd","lastAction","dragSubscription","state$$1","restoreOptions","dragStarted","currentPosition","ensureWidth","handleDrag","startOffsetAndPosition","resizeStarted","currentOffsetAndPosition","handleResize","old","newWidth","newHeight","style$$1","defaultState","maximizeState","storeOptions","minimizeState","clearHeight","windowOffset","ResizeHandleDirective","setDisplay","WindowTitleBarComponent","dragDirective","isDraggable","subscribeDrag","subscribeStateChange","unsubscribeDrag","unsubscribeState","titleBar","onDrag","stateSubscription","maximizeAction","restoreAction","handleArrow","handleStateChange","closeAction","minimizeAction","WindowComponent","navigation","widthChange","heightChange","topChange","leftChange","draged","resized","windowSubscription","setOption","restoreTitle","maximizeTitle","minimizeTitle","setNextZIndex","setInitialOffset","titleBarContent","titleBarView","applyManualState","updateAllOffset","dimension","currentZIndex","nextPossibleZIndex","nextZIndex","setRestoreOption","resizeHandles","onComponentFocus","onComponentBlur","styleMinWidth","styleMinHeight","stylePosition","wrapperMaximizedClass","wrapperMinimizedClass","showDefaultTitleBar","WindowMaximizeActionDirective","_service","buttonType","WindowMinimizeActionDirective","WindowCloseActionDirective","WindowRestoreActionDirective","WindowCloseResult","WindowContainerService","WindowInjector","getWindowRef","WindowService","windowRef","DialogModule","WindowModule","DialogsModule","SearchPopupComponent","searchValue","searchQuery","withSn","snlist","selectedKey","submit","getCurrentSelectedItems","selectTab","DashboardNavbarComponent","isAmbTabVisible","dashboardOption","closeSidebar","DetailPersonaSelectorComponent","onDisplayCallbacks","titles","detailAccountFilter","detailAssayFilter","detailCustomerIdFilter","detailDiseaseStateFilter","detailIsCapitalFilter","detailIsFieldServiceContractFilter","detailIsOtherFilter","detailIsReagentFilter","detailIsServiceFilter","detailProductLineFilter","getFilterSelections","applyFilters","clearFilters","MetricDetailNavbarComponent","navigateBackwardsLink","getNavigateBackwardsLink","CtServiceService","customerScopeChangeCallbacks","callbackScopeIndex","callbackIndex","customerSelectionChangeCallbacks","hasSetCustomerId","returnCustomer","customerScope","callCustomerScopeChangeCallbacks","callbackKey","callCustomerSelectionChangeCallbacks","returnCustomerParam","CtProductSetSelectorComponent","filterService","menuVisible","prdFamilySetDisplayVal","prdFamilySetId","prdFamilySetDefault","CtNavbarComponent","ctService","setCustomerScope","clickEvent","AlertsNavbarComponent","GsAlertsNavbarComponent","MetricDetailNoFilterComponent","PresentationToggleSwitchComponent","updateToggleState","BrNavbarComponent","getNavbarIsVisibleSubject","AppComponent","personaOptionsService","swPush","pushNotificationService","msalAuthService","isIframe","loggedIn","isAuthenticating","VAPID_PUBLIC_KEY","acquireTokenSuccessSubscription","id_token","initialLoad","loadPreferences","acquireTokenFailureSubscription","getNavbarChoiceSubject","navbar","getMSALSubject","loginSuccessSubscription","loginFailureSubscription","requestSubscription","addPushSubscriber","SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT","componentName","detailLink","axis2VisibleLabels","goalPercentageSlideLabel","useDataArray","preSpacing","renderForServiceContracts","TileInsertComponent","factoryResolver","loadDynamicComponent","dynamicComponentRef","DashboardComponent","arrangement","managerDataLoaded","preferencesLoaded","updateManagerIdHackLoadManagerListAndPreferences","setNavbarChoice","setNavFilterSelection","personaSelector","dashboardSelector","toolSelection","legacyCustomersFlag","myVsAllInstrumentsFlag","customerWTrackSystemsFlag","flagshipProductLinesFlag","bookmarksFlag","navigateBackwards","navigateBackwardsLabel","viewTitle","viewTitleText","viewSubtitle","viewSubtitleText","filtered","prefRequestHandler","updateManagerIdHackFixPersona","managerApiData","level1PersonaChoice","Style1Pages","serviceVsAmb","pageTitle","apiRequestHandler","exportFileName","level2DetailLink","dataCols","dataParse","stackIndex","stackGoalsIndex","dataRows","rowColors","description","dataValues","percentInstalled","numberInstalled","percentNotInstalled","numberNotInstalled","goalpercentage","valueColors","colorRowDescriptions","customStyle","percentHold","numberHold","quantity","percentOpen","numberOpen","percentClosed","numberClosed","percentGuaranteeAchieved","numberGuaranteeAchieved","percentGuaranteeNotAchieved","numberGuaranteeNotAchieved","percentNotEligible","numberNotEligible","subTitle","customValueIfBlank","currencyStyleForAMB","dataColsLocal","percentReagent","reagentUSD","amtdollar","percentCapital","capatalUSD","percentService","serviceUSD","percentOther","otherUSD","dataValuesLocal","reagentLocal","amtlocal","capitalLocal","serviceLocal","otherLocal","filterOnChildProperty","gridState","exportState","allData","updateGrid","gridData","inFilter","updateFiltersToHandleChildProperty","loadData","userWindowHeight","screen","availHeight","userWindowWidth","availWidth","detectMob","RowParsers","stackKeys","sourceData","stackValues","rowData","stackTotals","sourceItem","totals","devideBy","percentGoals","pointValues","RowParserService","rowParsers","ZipOperator","iterators","StaticIterator","stillUnsubscribed","shouldComplete","_tryresultSelector","isComplete","notifyInactive","checkIterators","switchMapTo","innerObservable","DistinctUntilChangedOperator","keySelector","hasKey","BufferCountOperator","bufferSize","startBufferEvery","subscriberClass","buffers","cloneDate","newDate","addDays","setDate","candidate","lastDayOfMonth","addMonths","expectedMonth","setMonth","setYear","addYears","addDecades","addCenturies","normalizeYear","firstDecadeOfCentury","lastDecadeOfCentury","firstYearOfDecade","durationInCenturies","lastYearOfDecade","durationInDecades","addWeeks","firstDayOfMonth","Direction","weekDay","Forward","newDay","durationInMonths","firstMonthOfYear","lastMonthOfYear","durationInYears","calcWeekInYear","firstWeekInYear","diffInMS","Monday","Backward","weekInYear","prevWeekDate","nextWeekDate","weekNumber","ObserveOnMessage","scheduleMessage","createError","windowTime","_infiniteTimeWindow","_bufferSize","_windowTime","nextInfiniteTimeWindow","nextTimeWindow","ReplayEvent","_getNow","_trimBufferThenGetEvents","eventsCount","spliceCount","cancelAnimationFrame","animationFrameScheduler","TakeWhileOperator","inclusive","nextOrComplete","predicateResult","NavigationComponent_li_4_ng_template_2_Template","date_r104","navigationTitle","NavigationComponent_li_4_ng_template_3_Template","activeView","NavigationComponent_li_4_Template","index_r105","ctx_r103","isRangeStart","activeViewValue","ViewListComponent_table_1_th_3_Template","name_r114","colWidth","ViewListComponent_table_1_Template","ctx_r109","weekNames","ViewListComponent_col_6_Template","ViewListComponent_tbody_7_Template","_r118","handleDateChange","date_r116","ctx_r112","cellUID","focusedDate","cellTemplateRef","weekNumberTemplateRef","CalendarComponent_kendo_calendar_navigation_2_Template","_r121","handleNavigation","onPageChange","ctx_r119","activeViewEnum","navigationItemTemplate","DateInputComponent_span_6_Template","ctx_r128","handleButtonClick","ctx_r125","DatePickerComponent_ng_template_10_ng_template_3_Template","DatePickerComponent_ng_template_10_Template","_r142","handleChange","mergeTime","bottomView","topView","cellTemplate","monthCellTemplate","yearCellTemplate","decadeCellTemplate","centuryCellTemplate","weekNumberTemplate","headerTitleTemplate","disabledDates","HeaderComponent_ng_template_1_Template","HeaderComponent_ng_template_2_Template","_c80","ViewComponent_ng_template_0_Template","ViewComponent_tr_2_Template","ctx_r175","colSpan","ViewComponent_tr_3_th_1_Template","name_r179","ViewComponent_tr_3_Template","ctx_r176","ViewComponent_tr_4_ng_template_1_td_0_ng_template_1_Template","row_r180","getWeekNumber","firstDate","ViewComponent_tr_4_ng_template_1_td_0_ng_template_2_Template","_c81","cellContext","ViewComponent_tr_4_ng_template_1_td_0_Template","getWeekNumberContext","ViewComponent_tr_4_ng_template_1_Template","_r173","ViewComponent_tr_4_ng_container_2_td_1_ng_template_2_Template","ViewComponent_tr_4_ng_container_2_td_1_3_ng_template_0_Template","ViewComponent_tr_4_ng_container_2_td_1_3_Template","cell_r190","ViewComponent_tr_4_ng_container_2_td_1_Template","ctx_r198","cellIndex_r191","rowIndex_r181","ctx_r192","getStyles","tableCellIndex","isRangeMid","isRangeEnd","ViewComponent_tr_4_ng_container_2_Template","ViewComponent_tr_4_Template","ctx_r177","Action","EMPTY_SELECTIONRANGE","MIN_DATE","MAX_DATE","setTime","dateInRange","getToday","shiftWeekNames","domContainerFactory","hasExistingValue","isInSelectionRange","selectionRange","EMPTY_DATA","ACTIONS","PrevView","NextView","FirstInView","LastInView","CenturyViewService","isActiveView","selectedDate","viewDate","cells","lastDate","isSelectedDateInRange","rowOffset","baseDate","cellOffset","cellDate","isWeekend","isRangeSplitEnd","isRangeSplitStart","isToday","cellTitle","aboveMin","belowMax","firstYear","viewsCount","viewsInRange","EMPTY_DATA$1","ACTIONS$1","DecadeViewService","EMPTY_DATA$2","ACTIONS$2","MonthViewService","isDateDisabled","firstMonthDate","firstMonthDay","lastMonthDate","lastMonthDay","cellDay","lowerBound","beginningOfPeriod","upperBound","abbrMonthNames","wideMonthNames","prependCell","EMPTY_DATA$3","ACTIONS$3","YearViewService","changedYear","candidateValue","CalendarViewEnum","services","decade","century","BusViewService","viewChanged","ul","li","td","th","tbody","thead","scrollable","navigationList","navElement","viewFactory","renderWeekHeader","viewElement","contentElement","getScrollable","monthView","yearView","decadeView","getBody","CalendarDOMService","calendarHeight","calculateHeights","hostContainer","batch","monthViewHeight","headerHeight","scrollableContentHeight","calendarWidth","monthViewWidth","scrollableContentWidth","yearViewHeight","scrollableYearContentHeight","yearViewWidth","decadeViewHeight","centuryViewHeight","decadeViewWidth","centuryViewWidth","navigationItemHeight","viewType","viewDimension","viewProp","hostClone","RowHeightService","rowHeight","detailRowHeight","offsets","heights","rowIndex","updateRowHeight","ScrollAction","PageAction","scrollObservable","firstLoaded","bottomOffset","topOffset","rowHeightService","lastScroll","offsetBufferRows","rowsForHeight","skipWithOffset","offsetSize","firstItemIndex","lastItemIndex","nonVisibleBuffer","SCROLLER_FACTORY_TOKEN","DEFAULT_SCROLLER_FACTORY","ScrollDirection","scrollModifiers","scrollNormalizers","scrollValidators","VirtualizationComponent","scrollerFactory","itemWidth","maxScrollDifference","scrollOffsetSize","scrollDuration","activeIndexChange","scrollChange","dispatcher","scroller","getContainerProperty","initServices","createRowHeightService","containerScrollSubscription","scroll$","emitActiveIndex","animationSubscription","containerScrollPosition","containerTop","containerBottom","containerOffsetSize","indexOffset","getContainerScrollDirection","scrollRange","scrollStep","modifyScroll","normalizeScroll","isScrollValid","containerScroll","maxScroll","containerMaxScroll","lastActiveIndex","containerScrollSize","wrapperClasses","horizontalClass","totalVertexLength","closestInScope","NavigationComponent","bus","indexToScroll","ensureHeights","maxViewHeight","intlSubscription","totalChanged","isInArray","datesList","getTake","virtualization","addToDate","getComponentClass","ViewListComponent","activeDateChange","cols","animateToIndex","minViewsToRender","showWeekNumbers","isMonthView","getWeekNames","getBottomOffset","viewHeight","rowLength","activeViewChanged","generateDates","date1","date2","activeDate","updateIndex","isIndexVisible","isListScrolled","getScrollableHeight","getComponentMonthClass","getComponentYearClass","getComponentDecadeClass","getComponentCenturyClass","headerTitleTemplateRef","setActiveDate","KEY_TO_ACTION","UpperView","LowerView","canMoveUp","moveUp","canMoveDown","moveDown","ScrollSyncService","magnitude","divideByMagnitude","powerByMagnitude","navScrolled","monthScrolled","navSubscription","scrollSiblingOf","viewSubscription","scrolledElement","siblingComponent","calculateScroll","scrollableElement","CellTemplateDirective","MonthCellTemplateDirective","YearCellTemplateDirective","DecadeCellTemplateDirective","CenturyCellTemplateDirective","WeekNumberCellTemplateDirective","HeaderTitleTemplateDirective","NavigationItemTemplateDirective","PickerService","sameDateSelected","dateCompletenessChange","minValidator","maxValidator","DisabledDatesService","disabledWeekDays","normalizedDisabledDates","notifyInvalidInput","notifyServiceChange","virtualizationProp","CALENDAR_VALUE_ACCESSOR","CALENDAR_RANGE_VALIDATORS","KENDO_INPUT_PROVIDER","CalendarComponent","scrollSyncService","disabledDatesService","pickerService","activeViewChange","activeViewDateChange","_min","_max","_focusedDate","onControlChange","onControlTouched","onValidatorChange","syncNavigation","setClasses","setAriaActivedescendant","initialize","bottomViewEnum","configure","viewChangeSubscription","verifyChanges","topViewEnum","sync","navigationView","unbindCallback","pageChangeSubscription","focusTarget","canNavigateDown","isSameDate","emitSameDate","emitBlur","emitFocus","isScrolled","arrowKeyPressed","focusedCellId","widgetId","calendarTabIndex","monthCellTemplateRef","yearCellTemplateRef","decadeCellTemplateRef","centuryCellTemplateRef","navigationItemTemplateRef","tmp_3_0","currVal_3","activeCellTemplate","incompleteDateValidator","incomplete","incompleteDate","Arrow","DATE_PART_REGEXP","TIME_PART_REGEXP","SHORT_PATTERN_LENGTH_REGEXP","unpadZero","formatPlaceholder","leadingZero","monthNames","typedMonthPart","knownParts","allFormatedMonths","allDayPeriods","sampleFormat","dateFormatString","setExisting","getExisting","currentChar","resetSegmentValue","resetLeadingZero","switchToNext","dateParts","baseFormat","replaced","currentMaxLength","parsedDate","matchMonth","dayPeriod","matchDayPeriod","isZeroCurrentChar","isAbbrMonth","partMap","incrementLeadingZero","middleNumber","monthNumber","patternValue","partPattern","peekDate","patternSatisfied","hasLeadingZero","setLeadingZero","peekValue","typedChar","monthAsNum","lowerChart","dateFormatParts","partLength","resultText","resultFormat","currentSymbol","DateInputComponent","ariaReadOnly","incompleteDateValidation","isPopupOpen","hasPopup","valueUpdate","formatSections","hasMousedown","focusedPriorToMousedown","isDateIncomplete","incompleteValidator","kendoDate","symbolsMap","dateSymbolMap","updateFormatSections","dateInput","verifyRange","isEqualToKendoDate","getDateObject","getKendoDate","updateElementValue","selectDateSegment","modifyDateSegmentValue","caret","modifyPart","putDateInRange","triggerChange","updateIncompleteValidationStatus","selectNearestSegment","previousFormatSymbol","selectionPresent","placeholderToggled","map$$1","texts","getTextAndFormat","showPlaceholder","isPosition","currentDate","mousewheelHandler","handleMouseWheel","switchDateSegment","updateOnPaste","oldTextOrigin","oldFormat","newTextOrigin","oldTextSeparator","oldText","newText","deletedSymbol","navigationOnly","switchPart","parsedPart","parsePart","handleMousedown","handleDragAndDrop","DatePickerComponent","readOnlyInput","disabledDatesValidation","popupUID","_show","disabledDatesValidateFn","pickerSubscriptions","handleSameSelection","handleDateCompletenessChange","_disabledDates","disabledDate","windowBlurSubscription","focusInput","toggleFocus","handleWindowBlur","currentTarget","handleInputChange","inputRole","handleIconClick","KForOfContext","kForOf","KForOf","kForTrackBy","viewContainerLength","tuples","kForTemplate","HeaderComponent","todayAvailable","l10nChange","setTodayAvailability","todayMessage","getTitle","moveToBottom","nextDate","isTodayInRange","handleTodayClick","WeekNamesService","includeWeekNumber","ViewComponent","weekService","cellEnter","cellLeave","disabledDatesChange","isHorizontal","updateData","currentCellIndex","unsubscribeCallback","rowCtx","firstWeekDateContext","activeRangeEnd","cellIndex","cellMouseoverHandler","mouseLeaveHandler","cell","closestCell","cellByIndex","emitCellLeave","CalendarCommonModule","TemplatesModule","CalendarMessages","ɵCalendarMessages_BaseFactory","CalendarLocalizedMessagesDirective","CalendarCustomMessagesComponent","VirtualizationModule","CalendarModule","DateInputMessages","ɵDateInputMessages_BaseFactory","DateInputLocalizedMessagesDirective","DateInputModule","DatePickerMessages","ɵDatePickerMessages_BaseFactory","DatePickerLocalizedMessagesDirective","DatePickerCustomMessagesComponent","DatePickerModule","saveAsBlob","fileName","blob","contentType","base64","msSaveBlob","saveAsDataURI","dataURI","createObjectURL","fileSaver","download","initMouseEvent","revokeObjectURL","postToProxy","proxyURL","proxyTarget","proxyData","defaultGroupHeaderTemplate","createArray","defaultItemId","external","nodebuffer","nodestream","_keyStr","stringToArrayLike","stringifyByChunk","fromCharCodeSupportsTypedArrays","uint8array","arrayLikeToString","getTypeOf","canUseApply","resultStr","applyFromCharCode","arrayLikeToArrayLike","arrayFrom","arrayTo","transformTo","outputType","checkSupport","inputType","arraybuffer","pretty","prepareContent","isOptimizedBinaryString","isBase64","FileReader","reader","readAsArrayBuffer","dataType","resultIndex","totalLength","GenericWorker","streamInfo","generatedError","extraStreamInfo","isPaused","isFinished","isLocked","_listeners","cleanUp","registerPrevious","mergeStreamInfo","processChunk","withError","me","_utf8len","utf8encode","utf8decode","Utf8DecodeWorker","leftOver","previousData","nextBoundary","usableData","Utf8EncodeWorker","ConvertWorker","destType","StreamHelper","mimeType","internalType","_internalType","_outputType","_mimeType","_worker","helper","updateCallback","dataArray","chunkType","resultType","remainingBytes","binary","createFolders","compression","compressionOptions","unixPermissions","dosPermissions","DataWorker","dataP","dataIsReady","_tickScheduled","_tickAndRepeat","_tick","DataLengthProbe","withStreamInfo","crc32wrapper","Crc32Probe","CompressedObject","compressedSize","uncompressedSize","compressedContent","uncompressWorker","that","uncompressedWorker","compressWorker","ZipObject","_dataBinary","askUnicodeString","_decompressWorker","isUnicodeString","internalStream","accumulate","magic","getCompressedWorker","createWorkerFrom","getContentWorker","arrayType","Uint32Array","_pako","_pakoAction","_pakoOptions","_createPako","compressions","STORE","DEFLATE","decToHex","dec","bytes","generateZipParts","streamedContent","streamingEnded","encodeFileName","dosTime","dosDate","useCustomEncoding","encodedFileName","utfEncodedFileName","encodedComment","utfEncodedComment","useUTF8ForFileName","useUTF8ForComment","extraFields","unicodePathExtraField","unicodeCommentExtraField","dataInfo","bitflag","extFileAttr","versionMadeBy","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCFullYear","getUTCMonth","getUTCDate","fileRecord","dirRecord","CENTRAL_FILE_HEADER","generateDataDescriptors","ZipFileWorker","streamFiles","bytesWritten","zipComment","zipPlatform","contentBuffer","dirRecords","currentSourceOffset","entriesCount","currentFile","_sources","currentFilePercent","remainingFiles","localDirLength","dirEnd","centralDirLength","CENTRAL_DIRECTORY_END","openedSource","closedSource","prepareNextSource","DataReader","checkIndex","setIndex","checkOffset","byteAt","readData","sig","dostime","readInt","ArrayReader","sig0","sig1","sig2","sig3","StringReader","Uint8ArrayReader","readerFor","ZipEntry","loadOptions","bitFlag","localExtraFieldsLength","fileNameLength","compressionMethod","decompressed","readString","readDate","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","localHeaderOffset","isEncrypted","readExtraFields","parseZIP64ExtraField","fileComment","madeBy","fileNameStr","extraReader","extraFieldId","extraFieldLength","extraFieldValue","decodeParamType","useUTF8","fileCommentStr","upath","findExtraFieldUnicodePath","fileNameByteArray","decodeFileName","ucomment","findExtraFieldUnicodeComment","commentByteArray","upathField","ucommentField","ZipEntries","files","expectedSignature","readAndCheckSignature","signature","askedIndex","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","decodeContent","zip64EndOfCentralSize","zip64ExtensibleData","extraDataSize","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","checkSignature","readLocalPart","handleUTF8","processAttributes","zip64","readCentralPart","lastIndexOfSignature","isSignature","endOfCentralDirOffset","readBlockEndOfCentral","readBlockZip64EndOfCentralLocator","readBlockZip64EndOfCentral","expectedEndOfCentralDirOffset","extraBytes","prepareReader","readEndOfCentral","readCentralDir","readLocalFiles","nodejsUtils","checkEntryCRC32","zipEntry","checkCRC32","optimizedBinaryString","isStream","zipEntries","fileAdd","zipObjectContent","forceTrailingSlash","parentFolder","folderAdd","lastSlash","createFolders$1","JSZip","newObj","relativePath","newFolder","kids","zipFileWorker","fileCompression","zipCompression","compressionName","_compressWorker","generateInternalStream","loadAsync","dateToJulianDays","BASE_DATE","MIME_TYPE","DATA_URL_PREFIX","DATA_URL_OPTIONS","BLOB_OPTIONS","ARRAYBUFFER_OPTIONS","toDataURI","thing","parseJSON","ESC","foreach","XMLHEAD","DRAWINGS_RELS_XML","rels","rel","rId","numChar","colIndex","letter","$ref","filterRowIndex","frozenRows","freezePane","rowSplit","toWidth","px","sharedStrings","borders","_strings","_styles","_borders","_validations","_comments","_drawings","drawings","_hyperlinks","hyperlinks","link","comments","sheetIndex","mergeCells","mergedCells","rowsByIndex","_source","sorted","sortByIndex","fillCells","_readCells","autoFilter","columns","validations","defaultCellStyleId","defaultCellStyle","_lookupStyle","lastRow","_getLastRow","lastCol","_getLastCol","frozenColumns","showGridLines","legacyDrawing","drawing","skipCustomHeight","columnWidth","columnIndex","autoWidth","ri","formula","spreadsheetFilters","sqref","showErrorMessage","allowBlank","showDropDown","errorTitle","formula1","formula2","colSplit","images","drw","parseRef","topLeftCell","col","colOffset","pixelsToExcel","imageId","uniqueCount","json","cellData","_cell","EMPTY_CELL","borderLeft","borderRight","borderTop","borderBottom","_lookupBorder","defStyle","borderId","displayValue","_lookupString","serial","cellName","validation","_addValidation","MAP_EXCEL_TYPE","MAP_EXCEL_OPERATOR","comparerType","allowNulls","showButton","messageTemplate","countData","greaterThanOrEqualTo","lessThanOrEqualTo","convertColor","$0","_images","_imgId","_sheets","sheets","docProps","folder","lastModifiedBy","modified","sheetCount","sheet","xl","media","imageFilename","sheetIds","filterNames","userNames","localSheetId","sheetName","localName","worksheets","drawingsRels","sheetRels","commentFiles","drawingFiles","sheetXML","toXML","relsXML","relsToXML","commentsXML","drawingsXML","hasFont","underline","bold","italic","fontInPt","fontInPx","fills","borderTemplate","fontId","fillId","numFmtId","indent","toZIP","generateAsync","generate","borderSideTemplate","getSpan","rowSpan","upperStr","insertCell","topLeftRef","spanCell","nextRow","insertCellAt","SPREADSHEET_CUSTOM_FILTER","customOperator","customValue","SPREADSHEET_DYNAMIC_FILTER","dynamicFilterType","SPREADSHEET_TOP_FILTER","SPREADSHEET_VALUE_FILTER","blanks","generators","custom","dynamic","doesnotmatch","quarter1","quarter2","quarter3","quarter4","january","february","march","april","may","june","july","august","september","october","november","december","updateContext","rootNodes","updateGroupHeaderContext","updateGroupFooterContext","updateFooterContext","destroyColumns","ExporterColumn","locked","headerCellOptions","cellOptions","groupHeaderCellOptions","groupFooterCellOptions","footerCellOptions","groupFooterTemplate","groupHeaderTemplate","groupHeaderColumnTemplate","workbookOptions","sourceColumns","exporterColumns","addColumns","exporterColumn","_trimColumns","allColumns","_leafColumns","_prepareColumn","_visibleColumns","hierarchy","hasGroupHeaderColumn","collapsible","_columns","_hierarchyRows","_rows","_freezePane","_filter","_depth","paddingCellOptions","_createPaddingCells","_groupHeaderCells","_dataRows","_footer","dataCells","cellIdx","_dataRow","itemLevel","hasFooter","_hasFooterTemplate","previousItemId","previousLevel","_hierarchyFooterRows","_hierarchyFooter","parentId","_prependHeaderRows","currentLevel","templateData","exportable","excel","firstCell","headerPaddingCellOptions","headerRows","_prepareHeaderRows","_headerRow","parentCell","parentRow","childRow","totalColSpan","_isColumnVisible","_headerDepth","workbook","ColumnBase","GroupHeaderTemplateDirective","GroupHeaderColumnTemplateDirective","GroupFooterTemplateDirective","ColumnComponent","ExcelExportModule","_c116","GridComponent_kendo_grid_toolbar_2_Template","GridComponent_kendo_grid_group_panel_3_Template","_r151","groupChange","groupableEmptyText","GridComponent_ng_template_6_div_0_div_1_Template","ctx_r154","lockedWidth","lockedLeafColumns","detailTemplate","lockedColumns","totalColumnLevels","showGroupPanel","reorderable","sortable","columnMenuOptions","columnMenuTemplate","leafColumns","GridComponent_ng_template_6_div_0_div_7_Template","ctx_r156","columnsContainer","unlockedWidth","_c117","GridComponent_ng_template_6_div_0_Template","ctx_r152","headerPadding","nonLockedWidth","virtualColumns","headerLeafColumns","headerColumns","GridComponent_ng_template_6_div_2_div_1_Template","ctx_r158","ariaRowCount","GridComponent_ng_template_6_div_2_Template","ctx_r153","nonLockedLeafColumns","GridComponent_ng_template_6_Template","notifyPageChange","notifyScrollBottom","contentScroll","ctx_r146","hideHeader","groupable","trackBy","selectable","noRecordsTemplate","rowClass","isVirtual","marqueeSelection","showFooter","GridComponent_ng_template_7_thead_2_Template","visibleColumns","GridComponent_ng_template_7_tfoot_4_Template","ctx_r165","GridComponent_ng_template_7_div_5_Template","GridComponent_ng_template_7_Template","ctx_r147","showGroupFooters","GridComponent_kendo_pager_8_Template","_r168","ctx_r148","pagerTemplate","GridComponent_kendo_grid_toolbar_9_Template","_c118","_c119","_c120","_c121","_c122","lockedKeydown","lockedScroll","lockedMousewheel","ListComponent_kendo_resize_sensor_8_Template","ListComponent_kendo_resize_sensor_9_Template","ListComponent_div_12_Template","ctx_r174","totalWidth","ListComponent_div_13_Template","_c123","FilterRowComponent_td_0_Template","FilterRowComponent_td_1_Template","FilterRowComponent_td_2_Template","column_r182","columnIndex_r183","ctx_r180","logicalRowIndex","lockedColumnsCount","filterLabel","_c124","FilterCellComponent_ng_template_0_ng_container_1_Template","FilterCellComponent_ng_template_0_ng_container_2_1_ng_template_0_Template","FilterCellComponent_ng_template_0_ng_container_2_1_Template","filterCellTemplateRef","FilterCellComponent_ng_template_0_ng_container_2_Template","FilterCellComponent_ng_template_0_Template","hasTemplate","_c125","_c126","_c127","FilterCellOperatorsComponent_kendo_dropdownlist_0_Template","_r192","dropdownKeydown","operators","_c128","_c129","ColGroupComponent_ng_template_0_col_0_Template","ColGroupComponent_ng_template_0_col_1_Template","ColGroupComponent_ng_template_0_col_2_Template","ColGroupComponent_ng_template_0_Template","columnsToRender","_c130","PagerComponent_ng_container_0_Template","ctx_r200","PagerComponent_ng_container_1_kendo_pager_prev_buttons_1_Template","PagerComponent_ng_container_1_kendo_pager_numeric_buttons_2_Template","PagerComponent_ng_container_1_kendo_pager_input_3_Template","PagerComponent_ng_container_1_kendo_pager_next_buttons_4_Template","PagerComponent_ng_container_1_kendo_pager_info_5_Template","PagerComponent_ng_container_1_kendo_pager_page_sizes_6_Template","PagerComponent_ng_container_1_Template","ctx_r201","_c131","_c132","_c133","_c134","_c135","_c136","_c137","PagerNumericButtonsComponent_li_1_Template","_r212","ctx_r211","ctx_r208","_c138","PagerNumericButtonsComponent_li_2_Template","_r215","num_r213","ctx_r209","PagerNumericButtonsComponent_li_3_Template","_r217","ctx_r216","ctx_r210","_c139","_c140","_c141","PagerPageSizesComponent_option_2_Template","ctx_r219","PagerPageSizesComponent_option_3_Template","page_r221","ctx_r220","getSelectedState","_c142","GroupHeaderComponent_ng_template_0_td_0_Template","GroupHeaderComponent_ng_template_0_Template","ctx_r223","prefixGroupCell","GroupHeaderComponent_td_1_ng_template_2_ng_template_1_Template","ctx_r229","groupTitle","formatForGroup","GroupHeaderComponent_td_1_ng_template_2_ng_template_2_Template","_c143","_c144","a7","expanded","GroupHeaderComponent_td_1_ng_template_2_Template","_r232","ctx_r231","toggleGroup","isExpanded","exp8","GroupHeaderComponent_td_1_Template","ctx_r224","skipGroupDecoration","logicalColSpan","groupSpan","ariaRole","_c145","GroupHeaderComponent_ng_container_2_td_1_ng_container_1_Template","column_r234","ctx_r236","groupHeaderColumnTemplateRef","GroupHeaderComponent_ng_container_2_td_1_Template","index_r235","GroupHeaderComponent_ng_container_2_Template","ctx_r225","groupHeaderColumns","_c146","lastTarget","GroupPanelComponent_ng_template_0_Template","ctx_r238","_c147","_c148","GroupPanelComponent_div_1_Template","_r244","directionChange","group_r241","index_r242","ctx_r239","groupTitles","GroupPanelComponent_div_2_Template","_c149","_c150","HeaderComponent_ng_template_0_tr_0_th_1_Template","HeaderComponent_ng_template_0_tr_0_th_2_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_filter_menu_1_Template","column_r256","ctx_r261","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_column_menu_2_Template","ctx_r262","columnMenu","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_0_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_1_Template","displayTitle","_c151","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_Template","headerTemplateRef","leafIndex","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_2_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_3_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_span_5_Template","ctx_r276","sortOrder","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_Template","_r281","_r273","onSortClick","ctx_r264","sortIcon","sortableLabel","showSortNumbering","sortStatus","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_5_Template","ctx_r265","selectAllCheckboxId","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_span_6_Template","ctx_r266","_c152","lastColumn","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_Template","_r286","onHeaderKeydown","ctx_r287","columnIndex_r257","last_r258","levelIndex_r250","ctx_r259","showFilterMenu","isFilterable","showColumnMenu","isFirstOnRow","logicalColumnIndex","rowspan","headerClass","headerStyle","sortState","isSortable","isCheckboxColumn","showSelectAll","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_kendo_grid_column_menu_1_Template","ctx_r289","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_2_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_3_Template","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_span_4_Template","ctx_r292","_c153","HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_Template","ctx_r260","HeaderComponent_ng_template_0_tr_0_ng_template_3_Template","isColumnGroupComponent","HeaderComponent_ng_template_0_tr_0_Template","ctx_r247","unlockedColumnsCount","columnsForLevel","trackByIndex","HeaderComponent_ng_template_0_tr_1_Template","HeaderComponent_ng_template_0_Template","ctx_r246","columnLevels","showFilterRow","FilterMenuComponent_ng_template_3_Template","_r302","_c154","FilterMenuContainerComponent_ng_container_3_Template","ctx_r304","childService","childFilter","FilterMenuContainerComponent_ng_container_4_1_ng_template_0_Template","FilterMenuContainerComponent_ng_container_4_1_Template","ctx_r306","filterMenuTemplateRef","FilterMenuContainerComponent_ng_container_4_Template","ctx_r305","StringFilterMenuComponent_kendo_dropdownlist_1_Template","_r311","logicChange","ctx_r308","logicOperators","StringFilterMenuComponent_kendo_grid_string_filter_menu_input_2_Template","ctx_r309","secondFilter","NumericFilterMenuComponent_kendo_dropdownlist_1_Template","_r315","ctx_r312","NumericFilterMenuComponent_kendo_grid_numeric_filter_menu_input_2_Template","ctx_r313","DateFilterMenuComponent_kendo_dropdownlist_1_Template","_r319","ctx_r316","DateFilterMenuComponent_kendo_grid_date_filter_menu_input_2_Template","ctx_r317","BooleanFilterMenuComponent_li_1_Template","_r323","item_r321","ctx_r320","idPrefix","radioId","ColumnListComponent_label_1_Template","column_r328","index_r329","ctx_r326","ColumnListComponent_div_2_Template","_r331","cancelChanges","applyChanges","ctx_r327","actionsClass","resetText","applyText","ColumnChooserComponent_ng_template_3_Template","_r337","onApply","ctx_r335","autoSync","allowHideAll","ColumnMenuChooserComponent_ng_template_1_Template","_r342","ctx_r340","ColumnMenuFilterComponent_ng_template_1_Template","_r345","ctx_r343","ColumnMenuItemComponent_span_1_Template","ColumnMenuItemComponent_div_3_Template","ctx_r347","contentState","_c155","ColumnMenuComponent_ng_template_3_Template","ctx_r350","_r351","columnMenuTemplateRef","ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_sort_0_Template","ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_lock_1_Template","ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_chooser_2_Template","_r358","onColumnsExpand","ctx_r355","expandedColumns","ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_filter_3_Template","_r360","onFilterExpand","ctx_r356","expandedFilter","ColumnMenuComponent_ng_template_5_Template","ctx_r352","hasSort","hasLock","hasColumnChooser","hasFilter","_c156","_c157","TableBodyComponent_ng_template_0_ng_template_1_td_0_Template","TableBodyComponent_ng_template_0_ng_template_1_Template","TableBodyComponent_ng_template_0_td_2_Template","addRowLogicalIndex","TableBodyComponent_ng_template_0_td_3_Template","column_r370","columnIndex_r371","ctx_r367","newDataItem","cssClass","logicalColIndex","TableBodyComponent_ng_template_0_Template","ctx_r362","trackByColumns","TableBodyComponent_tr_1_ng_template_2_Template","TableBodyComponent_tr_1_ng_container_3_Template","ctx_r373","noRecordsText","_c158","TableBodyComponent_tr_1_Template","ctx_r363","TableBodyComponent_ng_template_2_tr_0_Template","ctx_r380","item_r374","rowIndex_r375","ctx_r376","totalColumnsCount","groupHeaderSlaveCellsCount","TableBodyComponent_ng_template_2_tr_1_ng_template_1_td_0_Template","TableBodyComponent_ng_template_2_tr_1_ng_template_1_Template","TableBodyComponent_ng_template_2_tr_1_td_2_a_1_Template","_r389","toggleRow","ctx_r386","detailButtonStyles","detailButtonTitle","TableBodyComponent_ng_template_2_tr_1_td_2_Template","ctx_r391","ctx_r382","showIf","TableBodyComponent_ng_template_2_tr_1_td_3_Template","column_r392","columnIndex_r393","ctx_r394","ctx_r383","isSelectable","isEditingCell","cellSelectionService","isCellSelected","isAriaSelected","_c159","TableBodyComponent_ng_template_2_tr_1_Template","ctx_r395","ctx_r377","isOdd","isEditingRow","isRowSelected","TableBodyComponent_ng_template_2_tr_2_td_1_Template","TableBodyComponent_ng_template_2_tr_2_ng_template_4_Template","_c160","TableBodyComponent_ng_template_2_tr_2_Template","ctx_r399","ctx_r378","allColumnsSpan","columnsSpan","TableBodyComponent_ng_template_2_tr_3_ng_template_1_td_0_Template","TableBodyComponent_ng_template_2_tr_3_ng_template_1_Template","TableBodyComponent_ng_template_2_tr_3_td_2_Template","TableBodyComponent_ng_template_2_tr_3_td_3_ng_template_1_Template","_c161","TableBodyComponent_ng_template_2_tr_3_td_3_Template","column_r406","ctx_r409","ctx_r402","groupFooterTemplateRef","TableBodyComponent_ng_template_2_tr_3_Template","ctx_r379","footerColumns","TableBodyComponent_ng_template_2_Template","ctx_r364","isGroup","isParentGroupExpanded","showGroupHeader","isDataItem","isInExpandedGroup","isFooter","hideFooter","_c162","CellComponent_ng_container_1_ng_template_1_Template","CellComponent_ng_container_1_ng_template_2_ng_template_0_Template","childColumn_r418","CellComponent_ng_container_1_ng_template_2_Template","childColumns","CellComponent_ng_container_1_ng_template_3_Template","ctx_r415","CellComponent_ng_container_1_ng_template_4_Template","ctx_r416","selectionCheckboxId","CellComponent_ng_container_1_Template","ctx_r411","isSpanColumn","isBoundColumn","CellComponent_ng_container_2_1_ng_template_0_Template","CellComponent_ng_container_2_1_Template","ctx_r419","editTemplateRef","editTemplateContext","CellComponent_ng_container_2_ng_container_2_kendo_numerictextbox_1_Template","ctx_r422","formGroup","CellComponent_ng_container_2_ng_container_2_kendo_datepicker_2_Template","ctx_r423","CellComponent_ng_container_2_ng_container_2_input_3_Template","ctx_r424","CellComponent_ng_container_2_ng_container_2_input_4_Template","ctx_r425","CellComponent_ng_container_2_ng_container_2_Template","editor","CellComponent_ng_container_2_Template","ctx_r412","_c163","FooterComponent_ng_template_0_td_1_Template","FooterComponent_ng_template_0_td_2_Template","FooterComponent_ng_template_0_td_3_ng_template_1_Template","FooterComponent_ng_template_0_td_3_Template","column_r431","columnIndex_r432","ctx_r429","footerClass","footerStyle","footerTemplateRef","FooterComponent_ng_template_0_Template","ctx_r426","ToolbarComponent_0_ng_template_0_Template","ToolbarComponent_0_Template","ctx_r434","toolbarTemplateRef","DomEventsService","cellClick","cellMousedown","cellMouseup","focusIn","focusOut","windowBlur","EMPTY_REGEX","isUniversal","extractFormat","or","conditions","Skip","getIterator","msCancelRequestAnimationFrame","LocalDataChangesService","FocusRoot","alive","NODE_NAME_PREDICATES","matchesClasses","matchesNodeName","hasTabIndex","isFocusableWithTabKey","findElement","matchSelf","isInputTag","navigableRegex","DefaultFocusableElement","canFocus","CELL_CONTEXT","FocusableDirective","focusGroup","registerElement","unregisterElement","isNavigable","hasFocus","GridFocusableElement","focusCell","activeRow","activeCol","virtualCol","virtualRow","findRow","findCell","dataRowIndex","isActiveRange","prevColIndex","prevRowIndex","cellRange","rowRange","offsetRow","offsetCol","leafColumnsToRender","hasDetailTemplate","groupItem","prevRow","lastCellIndex","nextColIndex","nextRowIndex","nextCell","maxLogicalRowIndex","ItemMap","NavigationModel","modelCell","detailExpandCell","modelRow","rowCell","CellCloseEvent","isNewRow","EditService","editedIndices","keepEditCell","closingCell","changedSource","onChanged","newItemGroup","editable","editTemplate","preventCellClose","closeCell","editRow","isEditing","hasNewItem","cancelCell","keepCellTimeout","findByIndex","removeLast","GroupsService","isInitiallyCollapsed","rowState","isCollapsed","skipSelf","DetailCollapseEvent","DetailExpandEvent","DetailsService","userCallback","collapseRow","expandRow","eventArg","ScrollRequestService","requests","isInSameGrid","gridElement","matchHeaderCell","matchDataCell","matchFooterCell","matchCell","targetCell","isNavigationKey","PageUp","PageDown","isInput","NavigationViewport","pagerContextService","scrollRequestService","groupsService","detailsService","focusRoot","editService","focusableParent","cellKeydown","activeRowIndex","onStableSubscriber","subs","onCursorChanges","onFocusOut","onWindowBlur","leaveCell","onKeydown","onTabout","deactivateElements","pendingRowIndex","registerCell","virtualCell","activateVirtualCell","unregisterCell","registerRow","updateRow","unregisterRow","isCellFocusable","oldMode","focusInCell","focusInActiveRowContent","activateRow","alreadyActive","activateElements","enterCell","activeDataRow","behind","columnViewport","activeCell","focusAdjacentCell","announce","fwd","moveCursorFwd","moveCursorBwd","colIdx","moveLeft","moveRight","onCellKeydown","nextItemIndex","hasPager","firstRow","lastRowIndex","F2","defaultPrevented","onCursorKeydown","containsRow","onContentKeydown","localDataChangesService","lastSelectionStartIndex","currentSelection","selectAllChecked","dragging","addSubscriptions","checkboxOnly","selectableSettings","dragAndMultiple","iterator$$1","_selectAllState","rowArgs","rowSelected","addAllTo","selectedRows","deselectedRows","itemToToggle","removedItem","removeSubscriptions","mouseDownEventArgs","cellClickSubscription","mousedownSubscription","focusCellByElement","dataChangedSubscription","deselect","CellSelectionService","mouseUpEvent","dragSelectDeselect","lastSelectionItem","itemKey","columnKey","lastSelectionItemRowIndex","lastSelectionItemColIndex","selectedCellArgs","cellSelected","startRowIndex","startColIndex","endRowIndex","endColIndex","selectRange","selectedCells","deselectedCells","cellsToRemove","selectionStartRow","selectionStartCol","selectionEndRow","selectionEndCol","isInSelectionRect","GridMarqueeDirective","cellSelection","selectionStarted","enableMarquee","moveMarquee","pressArgs","pressTarget","dragEndSubscription","endSelection","initMarquee","marqueeElement","marqueeQuadrant","getMarqueeQuadrant","pointerX","pointerY","startX","startY","leftHalf","rightHalf","topHalf","bottomHalf","userSelection","EditTemplateDirective","ColumnMenuTemplateDirective","ColumnBase$1","matchesMedia","orderIndex","isColumnGroup","minResizableWidth","lockable","includeInChooser","headerTemplates","columnMenuTemplates","_width","autoSize","FilterCellTemplateDirective","FilterMenuTemplateDirective","isColumnComponent","filterCellTemplate","filterMenuTemplate","isSpanColumnComponent","SpanColumnComponent","_editable","_locked","expandColumns","childrenArray","expandColumnsWithSpan","sumProp","sumColumnWidths","validField","someLeafColumn","sortColumns","isInSpanColumn","ColumnGroupComponent","DetailTemplateDirective","_condition","canCreateElement","cachedPixelRatio","cachedScrollbarWidth","cachedRtlScrollLeft","BrowserSupportService","isGroupItem","flattenGroups","getIterator$1","footers","dataIndex","parentGroupIndex","skipHeader","GroupIterator","ItemIterator","ArrayIterator","Iterator","resultMap","_innerIterator","outputFooters","currentGroupIndex","_iterator","innerIterator","nextDataItem","footerItem","nextGroupItem","DataResultIterator","groupFooters","isGridDataResult","DataCollection","Selection","grid","selectedKeys","selectedKeysChange","getItemKey","getSelectionItem","selectionChangeSubscription","selectionKey","itemIdentifiers","getCellSelectionItemIndex","nonLockedColumns","totalLevels","lockedColumnsToRender","nonLockedColumnsToRender","hasGroupFooter","currentLevels","leafColumns$$1","containerLeafColumns","containerColumns","toRenderContainer","leaf","lists","forEachColumn","forEachLevel","filterHierarchy","children$$1","GroupInfoService","_columnList","columnForGroup","groupHeaderTemplateRef","ChangeNotificationService","NoRecordsTemplateDirective","syncRowsHeight","table1","table2","arr1","arr2","offsetHeight2","FilterService","PDFService","savePDF","drawPDF","exportClick","dataChanged","PDFExportEvent","SuspendService","browserMatchMedia","matchMedia","ResponsiveService","ExcelService","saveToExcel","ToolbarTemplateDirective","_position","headerSubscription","bodySubscription","sourceType","unregister","distinctUntilChanged","resizeSubscription","resizes","resizeArgs","ColumnResizingService","tables","trackColumns","deltaPercent","resizedColumns","tableMetadata","autoFitBatch","autoFitStart","onComplete","widths","hasFilterRow","PopupCloseEvent","SinglePopupService","onClose","attachClose","detachClose","removeClick","skipElement","appended","isTargetBefore","contains$2","targetRect","DragAndDropService","mouseEvent","targetFor","updateClass","updateLock","DragHintService","santizer","initCoords","targetStyles","safeTitle","initialTop","initialLeft","DropCueService","ColumnReorderService","ColumnReorderEvent","NavigationMetadata","IdService","ColumnInfoService","visibilityChange","lockedChange","columnRangeChange","filterSort","rootColumns","SortService","ColumnVisibilityChangeEvent","ColumnLockedChangeEvent","defaultTrackBy","handleExpandCollapseService","expandEmitter","collapseEmitter","isInEditedCell","GridComponent","supportService","groupInfoService","changeNotification","pdfService","responsiveService","excelService","columnResizingService","columnReorderService","columnInfoService","sortService","sortChange","dataStateChange","groupExpand","groupCollapse","detailExpand","detailCollapse","edit","cellClose","pdfExport","excelExport","columnResize","columnReorder","columnVisibilityChange","columnLockedChange","selectionDirective","columnList","hasGroupFooters","shouldGenerateColumns","_sort","_group","_skip","cachedWindowWidth","_rowSelected","_cellSelected","_rowClass","localizationSubscription","registerColumnsContainer","columnVisibilityChangeSubscription","columnLockedChangeSubscription","groupExpandCollapseSubscription","detailsServiceSubscription","filterSubscription","sortSubscription","attachStateChangesEmitter","attachEditHandlers","attachDomEventHandlers","pdfSubscription","emitPDFExportEvent","excelSubscription","saveAsExcel","columnsContainerChange","handleColumnResize","columnReorderSubscription","columnRangeChangeSubscription","onColumnRangeChange","toolbarTemplate","emptyText","_customDetailTemplate","detailTemplateChildren","_customNoRecordsTemplate","noRecordsTemplateChildren","customNoRecordsTemplate","_customPagerTemplate","pagerTemplateChildren","customPagerTemplate","_customToolbarTemplate","toolbarTemplateChildren","customToolbarTemplate","exporting","viewportColumns","leafViewportColumns","groupCellsWidth","toggleDetailRowLegacy","autoGenerateColumns","defaultSelection","initSelectionService","updateNavigationMetadata","onDataChange","syncHeaderHeight","isScrollable","attachScrollSync","shouldResetSelection","attachElementEventHandlers","applyAutoSize","columnsChangeSubscription","navigationMetadata","stateChangeSubscription","editServiceSubscription","columnsContainerChangeSubscription","detachElementEventHandlers","footerChangeSubscription","columnResizingSubscription","focusElementSubscription","registerEmitter","skipFocus","focusEditElement","addRow","columnInstance","editCell","containerSelector","setEditFocus","assertNavigable","focusNextCell","focusPrevCell","destIndex","changeContainer","updateColumnIndices","sourceColumnIndex","nextSourceIndex","toSkip","updateIndicesForLevel","colsForParentLevel","colsForLevel","cellSelectionMode","activeService","inactiveService","tryFocus","filter$$1","emitCRUDEvent","ariaRoot","resizeCheck","orientationSubscription","documentClickSubscription","shouldCloseCell","clickSubscription","keydownSubscription","focusInSubscription","focusOutSubscription","saveAsPDF","lockedHeader","notifyResize","oldWidth","addRowOffset","filterRowOffset","showPager","autoFitColumns","toAdd","lastFromGroup","offsetColumn","hasCallback","isDetailExpanded","selectableChanges","lockedClasses","virtualClasses","noScrollbarClass","navigatable","showTopToolbar","ariaColCount","showBottomToolbar","take$$1","ScrollBottomAction","firstItemOffset","nextTake","elementAt","rowAt","EMPTY_OBJECT","wheelDeltaY","VERTICAL_AXIS","maybeNativeElement","suspendService","columnInfo","columnsStartIdx","resizeSensors","containerScrollTop","handleRowSync","handleRowNavigationLocked","updateViewportColumns","handleInitialScrollToSkip","rebind","skipScroll","viewportWidthChange","resetNavigationViewport","attachContainerScroll","initResizeService","hasLockedContainer","lockedContainer","lockedTable","cleanupScroller","createScroller","lockedScrollTop","scrollDelta","expandDetail","collapseDetail","onContainerScroll","handleColumnScroll","rowViewport","startRow","endRow","startColumn","endColumn","scrollerSubscription","syncContainerHeight","sensor","scrollToVirtualRow","normalizeScrollLeft","elementScrollLeft","needsViewport","lastItemOffset","viewportStart","viewportEnd","lastItemDetailOverflows","setViewport","calculateViewportColumns","currentColumns","viewportColumnsWidth","columnsEndIdx","updateColumnViewport","columnUpdateFrame","lockedCount","setColumnViewport","normalizedScrollLeft","rtlScrollLeft","offsetLeft","hostRole","groupPanelEmpty","noRecords","pagerFirstPage","pagerLastPage","pagerPreviousPage","pagerNextPage","pagerPage","pagerItemsPerPage","pagerOf","pagerItems","pagerPageNumberInputTitle","filterEqOperator","filterNotEqOperator","filterIsNullOperator","filterIsNotNullOperator","filterIsEmptyOperator","filterIsNotEmptyOperator","filterStartsWithOperator","filterContainsOperator","filterNotContainsOperator","filterEndsWithOperator","filterGteOperator","filterGtOperator","filterLteOperator","filterLtOperator","filterIsTrue","filterIsFalse","filterBooleanAll","filterAfterOrEqualOperator","filterAfterOperator","filterBeforeOperator","filterBeforeOrEqualOperator","filterFilterButton","filterClearButton","filterAndLogic","filterOrLogic","unlock","sortAscending","sortDescending","sortedAscending","sortedDescending","sortedDefault","columnsApply","columnsReset","filterDateToday","filterDateToggle","filterNumericDecrement","filterNumericIncrement","FilterRowComponent","filterRowClass","cloneFilters","FilterCellComponent","operatorTexts","FilterOperatorBase","_text","refreshText","defaultOperator","rootFilter","trimFilterByField","filtersByField","removeFilter","localizeOperators$1","BaseFilterCellComponent","operatorList","_operators","defaultOperators","operationListSubscription","currentFilter","numericOperators","NumericFilterComponent","columnFormat","filterByField","localizationChange","NumericFilterCellComponent","filterDelay","showOperators","messageFor","composing","changeRequests","unsubscribeStart","unsubscribeEnd","subscribeChanges","unsubscribeChanges","changeRequestsSubscription","EMPTY_VALUE_OPERATORS","isEmptyValueOperator","FilterInputWrapperComponent","_operator","emptyValueOperator","filterInputDisabled","applyNoValueFilter","_defaultOperator","currentOperator","updateFilter","EMPTY_FILTER_OPERATORS","FilterCellWrapperComponent","applyFilter","overrideBaseClasses","onClear","stringOperators","StringFilterComponent","StringFilterCellComponent","FilterCellOperatorsComponent","clearText","dropdown","clearClick","clearKeydown","stringOperators$1","AutoCompleteFilterCellComponent","_valueField","BooleanFilterComponent","BooleanFilterCellComponent","dateOperators","DateFilterComponent","DateFilterCellComponent","ColGroupComponent","_item","LoadingComponent","loadingText","ResizableContainerDirective","_lockedWidth","attachResize","kendoGridResizableContainer","removeView","FocusGroup","registerGroup","unregisterGroup","focusableChildren","toggleState","LogicalCellDirective","idService","logicalSlaveCell","cellId","navigationChange","onNavigationChange","registerNoChanges","indexChange","rowIndexChange","registerChanges","updateElement","autoFocusCell","microtask","registerCellOnCurrentRow","isCellFocused","ariaColIndex","id$1","LogicalRowDirective","logicalSlaveRow","logicalSlaveCellsCount","logicalCellsCount","ariaRowIndex","FieldAccessorPipe","_match","columnsToResize","TableDirective","firstResize","initState","autoFitSubscription","registerTable","autoFitObservable","originalWidth","deltas","measureColumn","headerIndex","isParentSpan","isLastInSpan","FILTER_OPERATORS","ContainsFilterOperatorComponent","DoesNotContainFilterOperatorComponent","EndsWithFilterOperatorComponent","EqualFilterOperatorComponent","IsEmptyFilterOperatorComponent","IsNotEmptyFilterOperatorComponent","IsNotNullFilterOperatorComponent","IsNullFilterOperatorComponent","NotEqualFilterOperatorComponent","StartsWithFilterOperatorComponent","GreaterFilterOperatorComponent","GreaterOrEqualToFilterOperatorComponent","LessFilterOperatorComponent","LessOrEqualToFilterOperatorComponent","AfterFilterOperatorComponent","AfterEqFilterOperatorComponent","BeforeEqFilterOperatorComponent","BeforeFilterOperatorComponent","SharedFilterModule","FilterHostDirective","initComponent","FilterCellHostDirective","RowFilterModule","gridPagerClass","_r222","_r218","showInitialPageSize","importedModules$1","GroupHeaderComponent","hasDetails","groupCount","detailOffset","columnCount","groupItemClass","DropTargetDirective","withoutField","alreadyGrouped","indicatorRules","GroupPanelComponent","cue","dropTargets","attachTargets","currentTitles","targetSubscription","isGroupable","enterStream","leaveStream","dropStream","removeLock","canDrop","groupHeaderClass","GroupIndicatorComponent","groupIndicatorClass","toggleDirection","removeDescriptor","isDeleteButton","isSortIcon","skipButtons","elementUnderCursor","DraggableColumnDirective","updateTouchAction","performDrag","upEvent","notifyDrop","cursorElement","notifyDrag","cont","DragAndDropModule","GroupModule","allowUnsort","showIndexes","initialDirection","normalize$1","columnChooser","mergeObjects","inSameParent","reorderService","sortedFields","toggleSort","sortColumn","sortDescriptor","isTailing","canReorder","targetLocked","draggableLocked","toggleLock","trackMove","calculateBefore","normalizeTarget","firstSpan","levelColumns","targetElement","headerWidth","allLeafColumns","isInSpanColumn$1","ColumnHandleDirective","allLeafs","currentLeafs","ignore","isParentSpanColumn","measureColumns","shouldUpdate","initColumnWidth","resizeColumns","resizeStartWidth","sizeToFit","resizedColumn","tableDelta","updateWidth","resizeTable","leftStyle","rightStyle","SelectAllCheckboxDirective","selectAllChange","stateSet","destroyClick","isChecked","trident","selectAllState","updateAll","stateToBool","FilterMenuComponent","_r303","_r298","_r299","validFilters","findParent","parentLogicOfDefault","FilterMenuContainerComponent","parentService","_childFilter","FilterMenuInputWrapperComponent","_currentFilter","operatorChange","StringFilterMenuInputComponent","StringFilterMenuComponent","firstFilter","NumericFilterMenuComponent","NumericFilterMenuInputComponent","DateFilterMenuComponent","BooleanFilterMenuComponent","radioValue","FilterMenuHostDirective","DateFilterMenuInputComponent","picker","_r325","_r324","FilterMenuModule","ColumnListComponent","columnChange","unlockedCount","updateColumnState","hasFiltered","hasVisibleLocked","hasUnlockedFiltered","updateDisabled","forEachCheckBox","checkboxes","getElementsByClassName","hasLocked","checkedItems","checkbox","checkedUnlocked","filteredColumns","ColumnChooserComponent","leafNamedColumns","closeClick","changeVisibility","_r339","_r333","_r334","ColumnMenuService","closeMenu","ColumnMenuItemBase","ColumnMenuChooserComponent","collapse","ColumnMenuFilterComponent","ColumnMenuItemContentTemplateDirective","ColumnMenuItemComponent","itemClick","updateContentState","ColumnMenuSortComponent","sortedAsc","sortedDesc","ColumnMenuComponent","_r361","_r348","_r349","ColumnMenuLockComponent","unlockedRootCount","toggleHierarchy","allChanged","changeLocked","toggleColumn","ColumnMenuModule","importedModules$2","HeaderModule","CommandColumnComponent","CheckboxColumnComponent","SelectionCheckboxDirective","destroyKeyDown","onKeyDown","setCheckedState","toggleByIndex","TableBodyComponent","cellKeydownSubscription","cellKeydownHandler","trackByWrapper","viewItem","messageKey","hasEdited","absoluteRowIndex","mouseupSubscription","contextmenuSubscription","touchstartSubscription","touchendSubscription","touchSubscription","originalNoRecordText","clickTimeout","isEditedColumn","cellClickArgs","emitCellClick","isEdited","isEditedRow","CellComponent","_editTemplateContext","isCommand","_rowIndex","updateCellContext","isColumnEditable","editContext","columnContext","isFieldEditable","_changes","updateTemplateContext","commandCellClass","EditCommandDirective","commandClass","beginEdit","CancelCommandDirective","endEdit","SaveCommandDirective","RemoveCommandDirective","AddCommandDirective","beginAdd","importedModules$3","BodyModule","FooterComponent","importedModules$4","FooterModule","ToolbarComponent","GridModule","ExcelExportEvent","fetchComponentData","toExcelColumns","excelColumn","componentColumns","ExcelComponent","saveSubscription","dataSubscription","fetchData","exportData","saveFile","dataURL","forceProxy","ExcelCommandDirective","excelClass","ExcelModule","AbbottBigNumberFormatterPipe","Style1GridComponent","rowParserRegistry","rowFormatting","style1Pages","rowParserData","currentRouterLocation","buildGridData","dataColsConfig","rowParser","calculateInject","parseConfig","parserAttributes","dataRowKey","dataRowCheck","rowCol","numberType","injectArray","colRef","EmptyValueMaskPipe","valueIfBlank","SetValuesGridComponent","cellFormatting","CustomGridComponent","lowestRange","secondLowestRange","instrument","lowRangeNumberOfTests","lowRangeInstrumentsCount","secondLowestInstrumentCount","CustomComplianceGridComponent","FilterInsertComponent","Style1Component","ready","detailFilters","detailMetricId","CustomerComponent","InstrumentsComponent","Instrument","AmbassadorComponent","_0x456c2b","_0x328245","_0x3282","_0x97df7c","_0x5a5c","_0x5a5cad","_0x4f259a","_0x1b5199","_0xf176a0","_0x42848b","_0x544e1d","_0xc2d087","_0x4465a8","_0x56daec","_0x2bb26d","_0x10f781","_0x2b1641","_0x36436a","_0x49ba15","_0x15d2db","ProgressBarComponent_span_1_Template","ctx_r0","formattedLabelValue","ProgressBarComponent_span_6_Template","ctx_r3","packageMetadata","productName","productCodes","publishDate","licensingDocsUrl","adjustValueToRange","calculateRatio","extractValueFromChanges","ProgressBarBase","roleAttribute","indeterminate","_0x4a1050","_0x493c49","_0x2bf099","_0x3b8354","_0x5f3536","_0x28c95f","_0x354beb","_0x236cba","_0x1e1a8d","KendoLicensing","_0x232f89","_0x3be8d0","_0x22e53b","_0x2de868","_0x1c39ae","_0xf8b567","_0x3e1208","_0x11fad5","_0x40a89d","_progressRatio","dirAttribute","ariaMinAttribute","ariaMaxAttribute","ariaValueAttribute","reverseClass","indeterminateClass","ProgressBarComponent","animationEnd","labelPosition","defaultFormattedValue","numberParts","onePercent","isAnimationInProgress","isAnimationChanged","cancelCurrentAnimation","startAnimation","progressStatusElement","wrapperElement","progressStatusWrapperElement","getAnimationOptions","startTime","startSize","deltaSize","renderValueChange","resetProgress","stopAnimation","previousRatio","previousStatusWidth","previousStatusHeight","statusWidth","statusHeight","animationDuration","wrapperSize","progressCssStyle","progressCssClass","emptyCssStyle","emptyCssClass","isPositionStart","isPositionCenter","isPositionEnd","showLabel","isCompleted","statusWrapperWidth","statusWrapperHeight","MODULES","ProgressBarModule","TabStripComponent_ng_container_0_ng_container_1_Template","TabStripComponent_ng_container_0_ng_container_2_Template","TabStripComponent_ng_container_0_Template","_r41","_r43","TabStripComponent_ng_container_1_ng_container_1_Template","TabStripComponent_ng_container_1_ng_container_2_Template","TabStripComponent_ng_container_1_Template","TabStripComponent_ng_template_2_li_2_ng_template_4_Template","TabStripComponent_ng_template_2_li_2_Template","_r56","i_r52","onTabClick","tab_r51","ctx_r50","tabId","tabPanelId","tabTitle","TabStripComponent_ng_template_2_Template","_r58","ctx_r42","tabsAlignment","tabs","TabStripComponent_ng_template_4_ng_template_0_div_0_ng_template_1_Template","TabStripComponent_ng_template_4_ng_template_0_div_0_Template","ctx_r64","tab_r60","i_r61","ctx_r62","_animate","contentClass","tabContent","TabStripComponent_ng_template_4_ng_template_0_Template","ctx_r59","keepTabContent","TabStripComponent_ng_template_4_Template","StepperComponent_kendo_progressbar_3_Template","ctx_r76","progressAnimation","currentStep","progressBarStyling","CardActionsComponent_0_Template","CardActionsComponent_ng_container_1_button_1_Template","_r87","action_r85","CardActionsComponent_ng_container_1_Template","ctx_r82","CardActionsComponent_2_ng_template_0_Template","CardActionsComponent_2_Template","StepperStepComponent_2_ng_template_0_Template","StepperStepComponent_2_Template","stepTemplate","StepperStepComponent_ng_container_3_span_1_1_ng_template_0_Template","StepperStepComponent_ng_container_3_span_1_1_Template","indicatorTemplate","StepperStepComponent_ng_container_3_span_1_ng_container_2_span_1_Template","indicatorIconClasses","StepperStepComponent_ng_container_3_span_1_ng_container_2_span_2_Template","indicatorText","StepperStepComponent_ng_container_3_span_1_ng_container_2_Template","showIndicatorIcon","StepperStepComponent_ng_container_3_span_1_Template","transitionDuration","StepperStepComponent_ng_container_3_span_2_1_ng_template_0_Template","StepperStepComponent_ng_container_3_span_2_1_Template","ctx_r113","StepperStepComponent_ng_container_3_span_2_ng_container_2_span_1_Template","ctx_r116","StepperStepComponent_ng_container_3_span_2_ng_container_2_span_2_Template","validationIconClasses","StepperStepComponent_ng_container_3_span_2_ng_container_2_span_3_Template","ctx_r118","optionalText","StepperStepComponent_ng_container_3_span_2_ng_container_2_Template","ctx_r114","showLabelText","showLabelIcon","optional","StepperStepComponent_ng_container_3_span_2_Template","StepperStepComponent_ng_container_3_Template","ctx_r104","showIndicator","StepperListComponent_ng_container_0_Template","step_r120","idx_r121","maxStepWidth","maxStepHeight","stepType","cssStyle","hasItemIndex","indexAttr","TabContentDirective","TabTitleDirective","TabStripTabComponent","_tabContent","TabStripComponent","tabPosition","tabSelect","keyBindings","computedKeys","_height","invertKeys","prevNavigatableIndex","nextNavigatableIndex","firstNavigatableIndex","lastNavigatableIndex","justify","tabAlignment","inverted","tablist","isArrowUp","isArrowDown","isArrowLeft","isArrowRight","getTabIndex","tabHeadingContainers","skipTab","selectArgs","deactivateAll","tabsAtTop","tabsAtRight","tabsAtBottom","tabsAtLeft","StepperStepTemplateDirective","StepperLabelTemplateDirective","StepperIndicatorTemplateDirective","StepperActivateEvent","handlersRTL","StepperService","triggerValidation","focusedStepChange","stepper","currentIdx","focusedStep","focusPrevStep","focusNextStep","isStepDisabled","isPrevOrNextStep","onActivate","focusedIdx","StepperComponent","stepperService","displayStyle","currentStepChange","_steps","applyHostStyling","validateSteps","linearClass","stepsListStyling","CardComponent","widthStyle","CardHeaderComponent","CardBodyComponent","CardActionsComponent","startClass","endClass","centerClass","verticalClass","CardSeparatorDirective","CardTitleDirective","AvatarModule","CardModule","DrawerModule","PanelBarModule","SplitterModule","StepperStepComponent","isStepValid","shouldCheckValidity","onFocusedStepChange","handleValidityChecks","stepLink","_shouldCheckValidity","updateStepValidity","errorStepClass","successStepClass","tabIndexAttr","StepperListComponent","initDomEvents","domSubs","maxStepDimension","stepIdx","getStepIndex","targetAttr","StepperModule","TabStripModule","LayoutModule","CustomerHealthAlertsGridComponent","alertHelp","opened","refreshIndexes","showContextMenu","gsrUrl","export","onCellClick","stateChangeHandler","apiDataRow","dataColConfig","bgColorStyle","alertStyle","bgcolor","updateCustomerIdSelection","removeStateListener","setCustomerId","changeTo","type1","selectedPl","selectedSn","toggleTooltip","CustomerHealthGridComponent","colorLegend","npsLegend","columnSets","ia_cc","alinity_architect","overAllHealthScore","tnpsRawScore","snCountIA","snCountCC","testVolumeIA","testVolumeCC","testCompletionPercent","hardStopCount","qcFailPercent","retestPercent","openTicketCount","helpWindowTitle","helpActions","showOnlySingleCustomer","legends","apiLegendItem","textcolor","minVal","maxVal","pct","legendTitle","getCustomerScope","keeps","hideCols","removeItemFromArray","showCols","colsToHide","colKey","colsToShow","updateTooltipTitle","currentTooltip","activeTooltipLocation","CustomerProfileInfoComponent","selectedCustomerData","customerMyCRLLinkReady","myCRLCustomerId","customerChangeEventIndex","buildLegendInfo","getCustomerId","dataCol","clearCustomerSelectionChangeEvent","onCustomerSelectionChange","aohCustomerId","aohCustomerIdParts","customer_id","state2","response2","countryRequestHandler","countryState","countryResponse","countryIdsByName","aohCustomerLabel","getPersonaLabel","countryName","setReturnCustomer","DataTrendChartComponent","dataSetYMax","labelFormat","xaxisData","series1length","yaxisData","dataSet","legendColor","legendLabel","seriesArray","valueAxisArray","yaxisLabel","yleftmax2","yaxis2Data","dataSet2","tickCount2","axis2Max2","seriesLabel","yaxis2Label","chartComponent","axisMax2","DataTrendTableComponent","CustomerDataTrendsComponent","customerIsSelected","chartKeys","noData","gridKeys","openTooltip","CtDashboardComponent","refreshIndex","selectedCustomerName","showLoadingAccountMessage","showAccountNotFoundMessage","accountNumber","clearCustomer","getCustomerName","tabstrip","isReturnCustomerSet","getReturnCustomer","paramMap","accountUrlParam","accountRequestHandler","alertsCount","determineTab","customersCount","AlertsGridComponent","apolloAlertCount","davinciAlertCount","pomAlertCount","renderAlertTypeStyle","renderDetailsStyle","dataRecord","alertType","dialog_title","customerAddr","streetIndex","AlertsDashboardComponent","Style2Pages","backPageLabel","backPageLink","dataArrayKey","needEntireApiDataRecord","refLink","customDateFormat","inputFormat","outputFormat","renderAgedYNStyle","dataArraySplitColKey","renderCustomerNameNumStyle","dataArraySplitCols","arrayMappingKey","arrayMappingValue","drillDownCols","drillDownDetailsColName","drillDownDetailsLabel","drillDownDetailsLink","renderHitMissStyle","dateFormat","renderALC12MAStyle","renderCustomerStyleForAmbMetrics","CustomDateFormatterPipe","Style2GridComponent","style2Pages","colData","splitColData","arrayObjToSplit","rowKey","columnInfoExport","getColumnInfo","colName","drillDownLink","hrefRouterLink","Style2Component","Style3Pages","contextMenuFieldName","renderRefStyle","contextMenuItems","iconUrl","renderALStyle","alKey","alConnectableCompareKey","renderALConnectableStyle","renderMaintenanceScoreStyle","renderHCIHSIStyle","renderTSBDueStyle","Style3GridComponent","style3Pages","menuItems","alConnected","contextMenuItemArr","Style3Component","Style4Pages","groupItemsKey","groupFieldId","groupCountField","customerDetailsLink","groupHeaderColumn","addCustomerDetailsLink","groupFieldsToAppend","Style4Component","style4Pages","customername","titleText","objectToParse","groupRow","aggregateVal","ServiceContractStylePages","parentPageRequestHandler","entitlementLink","entitlementTermsLink","ServiceContractsLevel2Component","stylePages","parentState","parentApiData","subTitleText","contractexpNdays","getNavFilterSelection","ServiceContractsLevel3Component","apiDataRecord","customerNumber","serialNumber","contractnumber","currentRec","ServiceContractsLevel4Component","entitlementdesc","entitlementid","UptimeCustomerDetailsComponent","SurveyCommentPages","SurveyCommentDetailsComponent","interviewDate","CustomerOrderDetailsComponent","orderstatus","SGMDetailsComponent","PredictiveAlertsLevel2Component","PredictiveAlertsLevel3Component","countryCode","customerID","RnpsSurveyCommentDetailsComponent","rnpsScore","rnpsCategory","SalesSummaryComponent","reccount","totalrecords","disableLoadAll","isLocalCurrency","localCurrencyCode","loadDataForRows","updateNavFilterSelection","currencyCode","startingRow","createGrid","refKey","SalesDetailsComponent","SafeHtmlPipe","sanitized","GsAlertsDashboardComponent","docElement","DASHBOARD_ARRANGEMENT","BrTemplateSelectionService","templateChanged","templateDetails","templateId","PresentationSelectComponent","savePresentationSource","listPresentationsSource","listPresentationsData","selectPresentation","BrLocationSelectorComponent","data2","locationColumn","localLevelColumn","selectedOrg","buildLocationMenu","selectedLocation","buildLocalLevelMenu","selectedLocalLevel","getParamChangedListener","brParamKey","orgId","orgItem","org_names","locationId","locationItem","localLevelId","localLevelItem","relationships","forOrgId","getOrgItem","forLocationId","getLocationItem","locallevelId","getLocalLevelItem","display_name","buildLocationDescription","BrBusinessSegmentSelectorComponent","RequestStateComplete","presistedValue","Selected","UiMultiColumnListSelectComponent","bringSelectedToTop","valueChangeColumnSelected","valueChangeData","bringSelectedValuesToTop","selectedSortPriority","mockData","column_list","columnItem","post_selected","getSelectedItemsInColumn","columnSummery","postSelected","itemClickSelect","getSelectedValues","getColumnSelectedValues","exceptions","itemColumnId","descendantColumnId","descendantItemId","columnId","relationshipItem","selectedState","getColumnById","getColumnItemById","relationship","getItemRelationshipConfig","childItem","recursiveSetSelectedState","extra_items","reverseTree","reverseTreeItem","ancestors","getReverseColumnItemsForChild","ancestor","validSelectedTypes","Partial","returnItems","focusedInputItem","ss","single_select","refreshSelectionsAndExtraItems","removeExtraItems","finalChildLayerSelected","columnChildItem","getSelectedType","finalChildren","isColumnFinalChildColumn","getRecursiveFinalChildrenForColumnItem","filteredChildren","filteredItem","finalChildLayerSelectedItems","allSelected","partialSelected","fcItem","inFilteredChildren","finalChildForColumn","isItemASelectedChild","unselectColumnItems","AccountCustomerSelectorComponent","recommendedText","noSelections","firstCall","persistedChoices","getArrayOfPropertyFromObject","arrayOfObjects","glue","rmCustomerNumber","colL25","colL1","colL0","objectPropertyJoin","searchChange","presentedNameChange","BrHistoryRangeSelectorComponent","brHistoryRangeService","periodOptions","setHistoryRange","setMonths","BrProductSelectorComponent","valueChanged","BrServicingGroupSelectorComponent","lookForPersistedValue","tempItem","lookForPersistedValue2","presistedValue2","BrTemplateViewerComponent","stdKpiListData","stdKpiListSource","templateStringOrder","newListOrder","buildListOrder","orderItem","getStdKpiListItem","BrTemplateEditorComponent","faUp","faDown","defaultDashboard","saveUserTemplateSource","saveEditUserTemplateSource","recommended","saveEvent","cancelEvent","idSet","setIsVisible","selectedIds","isRecommended","nameChange","saveAs","setRecommended","BrTemplateSelectorComponent","brTemplateSelectionService","operation","userTemplatesData","template_string","listUserTemplatesSource","selectedTemplateString","stdKpiData","template_id","template_name","persistedId","persistedName","persistedString","persistedValue","updateSelectedTemplate","getSelectedTemplate","getOrderFromStdKpiList","FilterPresentationHeaderComponent","rangeLiteral","includePeriodRange","thumbnailMonths","singlePeriodHistory","minDaysInMonthToIncludePartialMonth","getStartDate","endDate","getEndDate","conditionallyIncludePartialMonth","addPartialMonth","BrTileInsertComponent","FilterPresentationFooterComponent","locationDescription","productDescription","businessSegment","servicingGroup","BrDashboardComponent","defaultOrder","stdKpiOrder","savedPresentations","presenetationState","slideTileReference","newPresentationStep","devApiTools","apiName","validationErrors","testComponentOptions","testComponentSelectedOption","showValidationMessages","noDataRegistryPrep","noDataRegistry","presentationToggleSubscription","getToggleChange","arranagementItem","findArrangementItemByApiSource","initial_route","metric_group_name","metric_name","templateSelectionSubscription","getTemplateSelectionChange","updateKpiOrder","nodatacheckSubscription","getChangedEvent","findArrangementItemById","validateSelections","withValidate","hasData","ExpandedViewPages","BrExpandedChartViewComponent","expandedViewPages","getCleanLocation","getBuildCompleteEvent","buildPersistedValuesFromQueryParams","getReturnLink","pathDetails","returnLink","processReturnLink","prepReturnParams","prepReturnLink","ListViewPages","apiTitle","apiFolder","apiChartType","apiDrillDown","BrListViewComponent","listViewPages","detailQueryCompleteSubscription","kpiConfig","routeUrl","apiDisplayTitle","CustomerName","returnLinkSubscription","queryParamsSubscription","buildPersistedValuesFromParams","routeUrlSubscription","BrSystemComparisonListViewComponent","multiDataRows","multiChartData","chartRowCount","chartLabels","multiChartCategories","multiChartSeries","colColor","included_in_chart","highestValue","ParentCustomer","colorCalc","chartMajorUnit","multiChartSeriesArray","customer_num","BrTimelineViewComponent","sCustomerName","multiChartSeriesTitle","DDTConfig","DynamicDataTableComponent","ddtConfig","dataTable","bg_color","DdtLoaderComponent","isLink","text_color","BrDetailComponentViewerComponent","AppRoutingModule","forRoot","optimizeGroupPlayer","normalizeKeyframes","driver","normalizer","keyframes","preStyles","postStyles","normalizedKeyframes","previousKeyframe","kf","isSameOffset","normalizedKeyframe","normalizedProp","normalizePropertyName","normalizeStyleValue","LINE_START","listenOnPlayer","copyAnimationEvent","makeAnimationEvent","triggerName","fromState","toState","getOrSetAsInMap","parseTimelineCommand","separatorPos","_contains","elm1","elm2","_matches","_query","_isNode","matchesSelector","mozMatchesSelector","oMatchesSelector","elm","_CACHED_BODY","_IS_WEBKIT","validateStyleProperty","matchesElement","invokeQuery","hypenatePropsObject","newProp","NoopAnimationDriver","previousPlayers","scrubberAccessRequested","AnimationDriver","NOOP","resolveTimingValue","_convertTimeValueToMS","resolveTiming","allowNegativeValues","delayMatch","easingVal","containsErrors","copyObj","copyStyles","readPrototype","getStyleAttributeString","writeStyleAttribute","styleAttrValue","formerStyles","eraseStyles","normalizeAnimationEntry","PARAM_REGEX","extractStyleParams","interpolateParams","localVal","iteratorToArray","allowPreviousPlayerStylesMerge","balancePreviousStylesIntoKeyframes","previousStyles","previousStyleProps","startingKeyframe","missingStyleProps","computeStyle","visitDslNode","visitor","visitTrigger","visitState","visitTransition","visitSequence","visitGroup","visitAnimate","visitKeyframes","visitStyle","visitReference","visitAnimateChild","visitAnimateRef","visitQuery","visitStagger","parseTransitionExpr","transitionValue","expressions","eventStr","makeLambdaFromStates","TRUE_BOOLEAN_VALUES","FALSE_BOOLEAN_VALUES","lhs","rhs","LHS_MATCH_BOOLEAN","RHS_MATCH_BOOLEAN","lhsMatch","rhsMatch","SELF_TOKEN_REGEX","buildAnimationAst","_driver","AnimationAstBuilderContext","_resetContextStyleTimingState","currentQuerySelector","collectedStyles","currentTime","queryCount","depCount","stateDef","styleAst","astParams","containsDynamicStyles","missingSubs","stylesObj","missingSubsArr","matchers","normalizeAnimationOptions","furthestTime","innerAst","timingAst","makeTimingAst","ast","currentAnimateTimings","styleMetadata","newStyleData","_styleAst","isEmptyStep","_makeStyleAst","_validateStyleAst","styleTuple","collectedEasing","styleData","styleMap","endTime","collectedEntry","updateCollectedStyle","totalKeyframesWithOffsets","offsetsOutOfOrder","keyframesOutOfRange","offsetVal","generatedOffset","animateDuration","durationUpToThisFrame","parentSelector","currentQuery","includeSelf","hasAmpersand","NG_TRIGGER_SELECTOR","originalSelector","currentTransition","createTimelineInstruction","preStyleProps","postStyleProps","subTimeline","ElementInstructionMap","instructions","existingInstructions","ENTER_TOKEN_REGEX","LEAVE_TOKEN_REGEX","buildAnimationTimelines","enterClassName","leaveClassName","startingStyles","finalStyles","subInstructions","AnimationTimelineBuilderVisitor","buildKeyframes","AnimationTimelineContext","currentTimeline","timelines","timeline","containsAnimation","allowOnlyTimelineStyles","elementInstructions","consume","innerContext","createSubContext","_visitSubInstructions","transformIntoNewTimeline","instructionTimings","appendInstructionToTimeline","subContextCount","snapshotCurrentStyles","DEFAULT_NOOP_PREVIOUS_NODE","delayNextStep","applyStylesToKeyframe","innerTimelines","mergeTimelineCollectedStyles","_visitTiming","incrementTime","getCurrentStyleProperties","forwardFrame","applyEmptyStep","innerTimeline","forwardTime","elms","currentQueryTotal","sameElementTimeline","maxTime","currentStaggerTime","startingTime","_enterClassName","_leaveClassName","initialTimeline","skipIfExists","newOptions","optionsToUpdate","newParams","paramsToUpdate","oldParams","newTime","_copyOptions","updatedTimings","builder","SubTimelineBuilder","stretchStartingKeyframe","_elementTimelineStylesLookup","_previousKeyframe","_currentKeyframe","_keyframes","_styleSummary","_pendingStyles","_backFill","_currentEmptyStepKeyframe","_localTimelineStyles","_globalTimelineStyles","_loadKeyframe","hasPreStyleStep","allStyles","allProperties","_updateStyle","details0","details1","finalKeyframes","keyframe","finalKeyframe","preProps","postProps","kf0","kf1","_stretchStartingKeyframe","newKeyframes","startingGap","newFirstKeyframe","oldFirstKeyframe","roundOffset","decimalPoints","mult","AnimationStyleNormalizer","WebAnimationsStyleNormalizer","userProvidedProperty","normalizedProperty","strVal","DIMENSIONAL_PROP_MAP","valAndSuffixMatch","createTransitionInstruction","isRemovalTransition","fromStyles","toStyles","queriedElements","AnimationTransitionFactory","_triggerName","_stateStyles","currentState","nextState","matchFns","stateName","backupStateStyler","stateStyler","backupStyles","buildStyles","nextOptions","skipAstBuild","transitionAnimationParams","currentStateStyles","nextAnimationParams","nextStateStyles","preStyleMap","postStyleMap","isRemoval","queriedElementsList","AnimationStateStyles","defaultParams","combinedParams","styleObj","AnimationTrigger","transitionFactories","balanceProperties","fallbackTransition","EMPTY_INSTRUCTION_MAP","bodyNode","_normalizer","_animations","_playersById","autoStylesMap","inst","_buildPlayer","_getPlayer","baseEvent","EMPTY_PLAYER_ARRAY","NULL_REMOVAL_STATE","namespaceId","setForRemoval","setForMove","hasAnimation","removedBeforeQueried","NULL_REMOVED_QUERIED_STATE","StateValue","isObj","DEFAULT_STATE_VALUE","AnimationTransitionNamespace","_engine","_triggers","_queue","_elementListeners","_hostClassName","phase","triggersWithStates","statesByElement","NG_TRIGGER_CLASSNAME","afterFlush","defaultToFallback","_getTrigger","absorbOptions","matchStyles","reportError","playersOnElement","playersByElement","queued","matchTransition","isFallbackTransition","totalQueuedPlayers","stateMap","elementPlayers","namespaces","fetchNamespacesByElement","ns","triggerLeaveAnimation","clearElementCache","afterFlushAnimationsDone","destroyAfterComplete","triggerStates","markElementAsRemoved","processLeaveNode","visitedTriggers","engine","childElementCount","_signalRemovalForInnerTriggers","containsPotentialParentTransition","totalAnimations","currentPlayers","playersByQueriedElement","prepareLeaveAnimationListeners","removalFlag","destroyInnerAnimations","_onRemovalComplete","microtaskId","markedForDestroy","d0","d1","containsData","newHostElements","disabledNodes","_namespaceLookup","_namespaceList","_flushFns","_whenQuietFns","namespacesByHostElement","collectedEnterElements","collectedLeaveElements","onRemovalComplete","_balanceNamespaceList","collectEnterElement","createNamespace","_fetchNamespace","elementStates","nsId","isElementNode","insertNode","removeNode","hostNS","subTimelines","skipBuildAst","destroyActiveAnimationsForElement","finishActiveQueriedAnimationOnElement","markElementAsDisabled","cleanupFns","_flushAnimations","quietFns","skippedPlayers","skippedPlayersMap","queuedInstructions","allPreStyleElements","allPostStyleElements","disabledElementsSet","nodesThatAreDisabled","allTriggerElements","enterNodeMap","buildRootMap","enterNodeMapIds","allLeaveNodes","mergedLeaveNodes","leaveNodesWithoutAnimations","leaveNodeMapIds","leaveNodeMap","allPlayers","erroneousTransitions","drainQueuedTransitions","nodeIsOrphaned","_buildInstruction","stringMap","setVal","allPreviousPlayersMap","animationElementMap","_beforeAnimationBuild","_getPreviousPlayers","prevPlayer","replaceNodes","replacePostStylesAsPre","postStylesMap","cloakAndComputeStyles","preStylesMap","rootPlayers","subPlayers","NO_PARENT_ANIMATION_ELEMENT_DETECTED","overrideTotalTime","parentWithAnimation","parentsToAdd","detectedParent","innerPlayer","_buildAnimation","setRealPlayer","parentPlayers","playersForElement","syncPlayerEvents","queriedPlayerResults","queriedInnerElements","queriedPlayers","activePlayers","removeNodesAfterAnimationDone","elementContainsData","isQueriedElement","toStateValue","queriedElementPlayers","isRemovalAnimation","targetNameSpaceId","targetTriggerName","timelineInstruction","realPlayer","getRealPlayer","allQueriedPlayers","allConsumedElements","allSubElements","allNewPlayers","finalPlayers","_flattenGroupPlayersRecur","wrappedPlayer","currentValues","_player","_containsRealPlayer","_queuedCallbacks","triggerCallback","_queueEvent","cloakElement","valuesMap","elementPropsMap","defaultStyle","cloakVals","failedElements","nodeSet","localRootMap","postEntry","preEntry","AnimationEngine","_triggerCache","_transitionEngine","_timelineEngine","componentId","registerTrigger","eventPhase","whenRenderingDone","packageNonAnimatableStyles","startStyles","endStyles","filterNonAnimatableStyles","SpecialCasedStyles","_startStyles","_endStyles","initialStyles","initialStylesByElement","_initialStyles","isNonAnimatableStyle","ElementAnimationStyleHandler","_name","_duration","_delay","_easing","_fillMode","_onDoneFn","_startTime","_eventFn","_handleCallback","anim","getAnimationStyle","setAnimationStyle","addRemoveAnimationEvent","playPauseAnimation","findIndexForAnimation","_ngTestManualTimestamp","elapsedTime","findMatchingTokenIndex","searchToken","doRemove","CssKeyframesPlayer","_finalStyles","_specialStyles","_buildStyler","_styler","_flushStartFns","_flushDoneFns","finished","_startingStyles","__initialized","CssKeyframesDriver","_count","_warningIssued","keyframeStr","kfElm","_notifyFaultyScrubber","previousCssKeyframePlayers","flatKeyframes","buildKeyframeElement","specialStyles","WebAnimationsPlayer","_initialized","_preparePlayerBeforeStart","domPlayer","_triggerWebAnimation","_finalKeyframe","_resetDomPlayerState","WebAnimationsDriver","_isNativeImpl","getElementAnimateFn","_cssKeyframesDriver","playerOptions","previousWebAnimationPlayers","BrowserAnimationBuilder","rootRenderer","_nextAnimationId","issueAnimationCommand","_id","RendererAnimationPlayer","_command","_listen","AnimationRendererFactory","_currentId","_microtaskId","_animationCallbacksBuffer","_rendererCache","_cdRecurDepth","BaseAnimationRenderer","AnimationRenderer","_scheduleCountTask","onInsert","onRemove","disableAnimations","dotIndex","scheduleListenerCallback","InjectableAnimationEngine","BROWSER_ANIMATIONS_PROVIDERS","BrowserAnimationsModule","isIE","AppModule","bootstrapModule","webpackEmptyAsyncContext"],"mappings":"qHAAAA,EAAOC,QAAU,SAAkBC,GACjC,OAAOA,GAAsB,iBAARA,GACI,mBAAbA,EAAIC,MACS,mBAAbD,EAAIE,MACc,mBAAlBF,EAAIG,mCCJlBL,EAAOC,QAAUK,EACjBA,EAAUC,UAAYA,EAEtB,IAAIC,EAAO,CAAEC,IAAK,KAClB,IACED,EAAO,EAAQ,QACf,MAAOE,IAET,IAAIC,EAAWL,EAAUK,SAAWJ,EAAUI,SAAW,GACrDC,EAAS,EAAQ,QAEjBC,EAAU,CACZ,IAAK,CAAEC,KAAM,YAAaC,MAAO,aACjC,IAAK,CAAED,KAAM,MAAOC,MAAO,MAC3B,IAAK,CAAED,KAAM,MAAOC,MAAO,MAC3B,IAAK,CAAED,KAAM,MAAOC,MAAO,MAC3B,IAAK,CAAED,KAAM,MAAOC,MAAO,MAoBzBC,EAAqB,kBAIdC,MAAM,IAAIC,QAAAA,SAAiBC,EAAKC,GAEvC,OADAD,EAAIC,IAAK,EACFD,IACN,IAIDE,EAAa,MAUjB,SAASC,EAAKC,EAAGC,GACfD,EAAIA,GAAK,GACTC,EAAIA,GAAK,GACT,IAAIC,EAAI,GAOR,OANAC,OAAOC,KAAKH,GAAGI,SAAAA,SAAkBC,GAC/BJ,EAAEI,GAAKL,EAAEK,MAEXH,OAAOC,KAAKJ,GAAGK,SAAAA,SAAkBC,GAC/BJ,EAAEI,GAAKN,EAAEM,MAEJJ,EAwBT,SAASnB,EAAWwB,EAAGC,EAASC,GAC9B,GAAuB,iBAAZD,EACT,MAAM,IAAIE,UAAU,gCAMtB,OAHKD,IAASA,EAAU,OAGnBA,EAAQE,WAAmC,MAAtBH,EAAQI,OAAO,MAKlB,KAAnBJ,EAAQK,OAA4B,KAANN,EAE3B,IAAIvB,EAAUwB,EAASC,GAASK,MAAMP,IAG/C,SAASvB,EAAWwB,EAASC,GAC3B,KAAMM,gBAAgB/B,GACpB,OAAO,IAAIA,EAAUwB,EAASC,GAGhC,GAAuB,iBAAZD,EACT,MAAM,IAAIE,UAAU,gCAGjBD,IAASA,EAAU,IACxBD,EAAUA,EAAQK,OAGD,MAAb5B,EAAKC,MACPsB,EAAUA,EAAQd,MAAMT,EAAKC,KAAK8B,KAAK,MAGzCD,KAAKN,QAAUA,EACfM,KAAKnB,IAAM,GACXmB,KAAKP,QAAUA,EACfO,KAAKE,OAAS,KACdF,KAAKG,QAAS,EACdH,KAAKI,SAAU,EACfJ,KAAKK,OAAQ,EAGbL,KAAKM,OAiGP,SAASC,EAAad,EAASC,GAY7B,GAXKA,IAEDA,EADEM,gBAAgB/B,EACR+B,KAAKN,QAEL,SAOS,KAHvBD,OAA6B,IAAZA,EACbO,KAAKP,QAAUA,GAGjB,MAAM,IAAIE,UAAU,qBAGtB,OAAID,EAAQc,UACTf,EAAQM,MAAM,UAER,CAACN,GAGHnB,EAAOmB,GA7MhBzB,EAAUyC,OACV,SAAiBhB,EAASC,GAExB,OADAA,EAAUA,GAAW,GACd,SAAUF,EAAGkB,EAAGC,GACrB,OAAO3C,EAAUwB,EAAGC,EAASC,KAiBjC1B,EAAU4C,SAAW,SAAUC,GAC7B,IAAKA,IAAQzB,OAAOC,KAAKwB,GAAKC,OAAQ,OAAO9C,EAE7C,IAAI+C,EAAO/C,EAEPgD,EAAI,SAAoBxB,EAAGC,EAASC,GACtC,OAAOqB,EAAK/C,UAAUwB,EAAGC,EAAST,EAAI6B,EAAKnB,KAO7C,OAJAsB,EAAE/C,UAAY,SAAoBwB,EAASC,GACzC,OAAO,IAAIqB,EAAK9C,UAAUwB,EAAST,EAAI6B,EAAKnB,KAGvCsB,GAGT/C,EAAU2C,SAAW,SAAUC,GAC7B,OAAKA,GAAQzB,OAAOC,KAAKwB,GAAKC,OACvB9C,EAAU4C,SAASC,GAAK5C,UADcA,GAmD/CA,EAAUgD,UAAUC,MAAQ,aAE5BjD,EAAUgD,UAAUX,KACpB,WAEE,IAAIN,KAAKmB,MAAT,CAEA,IAAI1B,EAAUO,KAAKP,QACfC,EAAUM,KAAKN,QAGnB,GAAKA,EAAQE,WAAmC,MAAtBH,EAAQI,OAAO,GAIzC,GAAKJ,EAAL,CAMAO,KAAKoB,cAGL,IAAIvC,EAAMmB,KAAKqB,QAAUrB,KAAKO,cAE1Bb,EAAQwB,QAAOlB,KAAKkB,MAAQI,QAAQC,OAExCvB,KAAKkB,MAAMlB,KAAKP,QAASZ,GAOzBA,EAAMmB,KAAKwB,UAAY3C,EAAI4C,KAAAA,SAAcC,GACvC,OAAOA,EAAE/C,MAAMI,MAGjBiB,KAAKkB,MAAMlB,KAAKP,QAASZ,GAGzBA,EAAMA,EAAI4C,KAAAA,SAAcC,EAAGC,EAAI9C,GAC7B,OAAO6C,EAAED,IAAIzB,KAAK4B,MAAO5B,QACxBA,MAEHA,KAAKkB,MAAMlB,KAAKP,QAASZ,GAGzBA,EAAMA,EAAI4B,QAAAA,SAAiBiB,GACzB,OAA6B,IAAtBA,EAAEG,SAAQ,MAGnB7B,KAAKkB,MAAMlB,KAAKP,QAASZ,GAEzBmB,KAAKnB,IAAMA,OAvCTmB,KAAKK,OAAQ,OAJbL,KAAKI,SAAU,IA8CnBnC,EAAUgD,UAAUG,YACpB,WACE,IAAI3B,EAAUO,KAAKP,QACfU,GAAS,EAET2B,EAAe,EAEnB,IAHc9B,KAAKN,QAGPqC,SAAZ,CAEA,IAAK,IAAIrB,EAAI,EAAGsB,EAAIvC,EAAQqB,OACxBJ,EAAIsB,GAA2B,MAAtBvC,EAAQI,OAAOa,GACxBA,IACFP,GAAUA,EACV2B,IAGEA,IAAc9B,KAAKP,QAAUA,EAAQwC,OAAOH,IAChD9B,KAAKG,OAASA,IAahBnC,EAAUuC,YAAc,SAAUd,EAASC,GACzC,OAAOa,EAAYd,EAASC,IAG9BzB,EAAUgD,UAAUV,YAAcA,EAsClCtC,EAAUgD,UAAUW,MAEpB,SAAgBnC,EAASyC,GACvB,GAAIzC,EAAQqB,OAAS,MACnB,MAAM,IAAInB,UAAU,uBAGtB,IAAID,EAAUM,KAAKN,QAGnB,IAAKA,EAAQyC,YAA0B,OAAZ1C,EAAkB,OAAOpB,EACpD,GAAgB,KAAZoB,EAAgB,MAAO,GAE3B,IAMI2C,EANAC,EAAK,GACLC,IAAa5C,EAAQ6C,OACrBC,GAAW,EAEXC,EAAmB,GACnBC,EAAgB,GAEhBC,GAAU,EACVC,GAAgB,EAChBC,GAAc,EAGdC,EAAqC,MAAtBrD,EAAQI,OAAO,GAAa,GAE7CH,EAAQqD,IAAM,iCACd,UACEC,EAAOhD,KAEX,SAASiD,IACP,GAAIb,EAAW,CAGb,OAAQA,GACN,IAAK,IACHC,GAzRCa,SA0RDZ,GAAW,EACb,MACA,IAAK,IACHD,GAhSE,OAiSFC,GAAW,EACb,MACA,QACED,GAAM,KAAOD,EAGjBY,EAAK9B,MAAM,uBAAwBkB,EAAWC,GAC9CD,GAAY,GAIhB,IAAK,IAAiCtD,EAA7B4B,EAAI,EAAGyC,EAAM1D,EAAQqB,OACzBJ,EAAIyC,IAASrE,EAAIW,EAAQI,OAAOa,IACjCA,IAIF,GAHAV,KAAKkB,MAAM,eAAgBzB,EAASiB,EAAG2B,EAAIvD,GAGvC0D,GAAY9D,EAAWI,GACzBuD,GAAM,KAAOvD,EACb0D,GAAW,OAIb,OAAQ1D,GACN,IAAK,IAGH,OAAO,EAET,IAAK,KACHmE,IACAT,GAAW,EACb,SAIA,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAKH,GAJAxC,KAAKkB,MAAM,6BAA8BzB,EAASiB,EAAG2B,EAAIvD,GAIrD6D,EAAS,CACX3C,KAAKkB,MAAM,cACD,MAANpC,GAAa4B,IAAMmC,EAAa,IAAG/D,EAAI,KAC3CuD,GAAMvD,EACN,SAMFkE,EAAK9B,MAAM,yBAA0BkB,GACrCa,IACAb,EAAYtD,EAIRY,EAAQ0D,OAAOH,IACrB,SAEA,IAAK,IACH,GAAIN,EAAS,CACXN,GAAM,IACN,SAGF,IAAKD,EAAW,CACdC,GAAM,MACN,SAGFI,EAAiBY,KAAK,CACpBC,KAAMlB,EACNmB,MAAO7C,EAAI,EACX8C,QAASnB,EAAGvB,OACZtC,KAAMD,EAAQ6D,GAAW5D,KACzBC,MAAOF,EAAQ6D,GAAW3D,QAI5BuB,KAAKkB,MAAM,eAAgBkB,EAD3BC,GAAoB,MAAdD,EAAoB,YAAc,OAExCA,GAAY,EACd,SAEA,IAAK,IACH,GAAIO,IAAYF,EAAiB3B,OAAQ,CACvCuB,GAAM,MACN,SAGFY,IACAX,GAAW,EACX,IAAImB,EAAKhB,EAAiBiB,MAG1BrB,GAAMoB,EAAGhF,MACO,MAAZgF,EAAGH,MACLZ,EAAcW,KAAKI,GAErBA,EAAGE,MAAQtB,EAAGvB,OAChB,SAEA,IAAK,IACH,GAAI6B,IAAYF,EAAiB3B,QAAU0B,EAAU,CACnDH,GAAM,MACNG,GAAW,EACX,SAGFS,IACAZ,GAAM,IACR,SAGA,IAAK,IAIH,GAFAY,IAEIN,EAAS,CACXN,GAAM,KAAOvD,EACb,SAGF6D,GAAU,EACVE,EAAanC,EACbkC,EAAeP,EAAGvB,OAClBuB,GAAMvD,EACR,SAEA,IAAK,IAKH,GAAI4B,IAAMmC,EAAa,IAAMF,EAAS,CACpCN,GAAM,KAAOvD,EACb0D,GAAW,EACX,SAKF,GAAIG,EAAS,CAQX,IAAIiB,EAAKnE,EAAQoE,UAAUhB,EAAa,EAAGnC,GAC3C,IACEoD,OAAO,IAAMF,EAAK,KAClB,MAAOxF,GAEP,IAAI2F,EAAK/D,KAAK4B,MAAMgC,EAAII,GACxB3B,EAAKA,EAAGJ,OAAO,EAAGW,GAAgB,MAAQmB,EAAG,GAAK,MAClDzB,EAAWA,GAAYyB,EAAG,GAC1BpB,GAAU,EACV,UAKJL,GAAW,EACXK,GAAU,EACVN,GAAMvD,EACR,SAEA,QAEEmE,IAEIT,EAEFA,GAAW,GACF9D,EAAWI,IACT,MAANA,GAAa6D,IAClBN,GAAM,MAGRA,GAAMvD,EAwBZ,IAjBI6D,IAKFiB,EAAKnE,EAAQwC,OAAOY,EAAa,GACjCkB,EAAK/D,KAAK4B,MAAMgC,EAAII,GACpB3B,EAAKA,EAAGJ,OAAO,EAAGW,GAAgB,MAAQmB,EAAG,GAC7CzB,EAAWA,GAAYyB,EAAG,IASvBN,EAAKhB,EAAiBiB,MAAOD,EAAIA,EAAKhB,EAAiBiB,MAAO,CACjE,IAAIO,EAAO5B,EAAG6B,MAAMT,EAAGD,QAAUC,EAAGjF,KAAKsC,QACzCd,KAAKkB,MAAM,eAAgBmB,EAAIoB,GAE/BQ,EAAOA,EAAKE,QAAQ,6BAAA,SAAuCC,EAAGC,EAAIC,GAYhE,OAXKA,IAEHA,EAAK,MASAD,EAAKA,EAAKC,EAAK,OAGxBtE,KAAKkB,MAAM,iBAAkB+C,EAAMA,EAAMR,EAAIpB,GAC7C,IAAIlD,EAAgB,MAAZsE,EAAGH,KAngBJJ,SAogBS,MAAZO,EAAGH,KAvgBC,OAwgBJ,KAAOG,EAAGH,KAEdhB,GAAW,EACXD,EAAKA,EAAG6B,MAAM,EAAGT,EAAGD,SAAWrE,EAAI,MAAQ8E,EAI7ChB,IACIT,IAEFH,GAAM,QAKR,IAAIkC,GAAkB,EACtB,OAAQlC,EAAGxC,OAAO,IAChB,IAAK,IACL,IAAK,IACL,IAAK,IAAK0E,GAAkB,EAQ9B,IAAK,IAAIC,EAAI9B,EAAc5B,OAAS,EAAG0D,GAAK,EAAGA,IAAK,CAClD,IAAIC,EAAK/B,EAAc8B,GAEnBE,EAAWrC,EAAG6B,MAAM,EAAGO,EAAGjB,SAC1BmB,EAAUtC,EAAG6B,MAAMO,EAAGjB,QAASiB,EAAGd,MAAQ,GAC1CiB,EAASvC,EAAG6B,MAAMO,EAAGd,MAAQ,EAAGc,EAAGd,OACnCkB,EAAUxC,EAAG6B,MAAMO,EAAGd,OAE1BiB,GAAUC,EAKV,IAAIC,EAAmBJ,EAAS/F,MAAM,KAAKmC,OAAS,EAChDiE,EAAaF,EACjB,IAAKnE,EAAI,EAAGA,EAAIoE,EAAkBpE,IAChCqE,EAAaA,EAAWZ,QAAQ,WAAY,IAI9C,IAAIa,EAAS,GACG,MAHhBH,EAAUE,IAGY7C,IAAU8B,IAC9BgB,EAAS,KAGX3C,EADYqC,EAAWC,EAAUE,EAAUG,EAASJ,EAgBtD,GATW,KAAPvC,GAAaC,IACfD,EAAK,QAAUA,GAGbkC,IACFlC,EAAKS,EAAeT,GAIlBH,IAAU8B,EACZ,MAAO,CAAC3B,EAAIC,GAMd,IAAKA,EACH,OA4SJ,SAAuBZ,GACrB,OAAOA,EAAEyC,QAAQ,SAAU,MAD7B,CA5SwB1E,GAGtB,IAAIwF,EAAQvF,EAAQ6C,OAAS,IAAM,GACnC,IACE,IAAI2C,EAAS,IAAIpB,OAAO,IAAMzB,EAAK,IAAK4C,GACxC,MAAO7G,GAKP,OAAO,IAAI0F,OAAO,MAMpB,OAHAoB,EAAOC,MAAQ1F,EACfyF,EAAOE,KAAO/C,EAEP6C,GA5WT,IAAIlB,EAAW,GA+WfhG,EAAUqH,OAAS,SAAU5F,EAASC,GACpC,OAAO,IAAIzB,EAAUwB,EAASC,GAAW,IAAI2F,UAG/CpH,EAAUgD,UAAUoE,OACpB,WACE,GAAIrF,KAAKE,SAA0B,IAAhBF,KAAKE,OAAkB,OAAOF,KAAKE,OAQtD,IAAIrB,EAAMmB,KAAKnB,IAEf,IAAKA,EAAIiC,OAEP,OADAd,KAAKE,QAAS,EACPF,KAAKE,OAEd,IAAIR,EAAUM,KAAKN,QAEf4F,EAAU5F,EAAQyC,WA1nBbe,SA2nBLxD,EAAQqD,IAtnBG,0CAIE,0BAonBbkC,EAAQvF,EAAQ6C,OAAS,IAAM,GAE/BF,EAAKxD,EAAI4C,KAAAA,SAAchC,GACzB,OAAOA,EAAQgC,KAAAA,SAAcjC,GAC3B,OAAQA,IAAMnB,EAAYiH,EACV,iBAAN9F,EA8PhB,SAAuBkC,GACrB,OAAOA,EAAEyC,QAAQ,2BAA4B,QAD/C,CA9P+C3E,GACvCA,EAAE4F,QACHnF,KAAK,UACPA,KAAK,KAIRoC,EAAK,OAASA,EAAK,KAGfrC,KAAKG,SAAQkC,EAAK,OAASA,EAAK,QAEpC,IACErC,KAAKE,OAAS,IAAI4D,OAAOzB,EAAI4C,GAC7B,MAAOM,GACPvF,KAAKE,QAAS,EAEhB,OAAOF,KAAKE,QAGdlC,EAAU+B,MAAQ,SAAUY,EAAMlB,EAASC,GAEzC,IAAI8F,EAAK,IAAIvH,EAAUwB,EADvBC,EAAUA,GAAW,IAQrB,OANAiB,EAAOA,EAAKF,QAAAA,SAAiBgF,GAC3B,OAAOD,EAAGzF,MAAM0F,MAEdD,EAAG9F,QAAQgG,SAAW/E,EAAKG,QAC7BH,EAAK0C,KAAK5D,GAELkB,GAGT1C,EAAUgD,UAAUlB,MACpB,SAAgB0F,EAAGE,GAIjB,GAHA3F,KAAKkB,MAAM,QAASuE,EAAGzF,KAAKP,SAGxBO,KAAKI,QAAS,OAAO,EACzB,GAAIJ,KAAKK,MAAO,MAAa,KAANoF,EAEvB,GAAU,MAANA,GAAaE,EAAS,OAAO,EAEjC,IAAIjG,EAAUM,KAAKN,QAGF,MAAbxB,EAAKC,MACPsH,EAAIA,EAAE9G,MAAMT,EAAKC,KAAK8B,KAAK,MAI7BwF,EAAIA,EAAE9G,MAAMI,GACZiB,KAAKkB,MAAMlB,KAAKP,QAAS,QAASgG,GAOlC,IAIIG,EACAlF,EALA7B,EAAMmB,KAAKnB,IAMf,IALAmB,KAAKkB,MAAMlB,KAAKP,QAAS,MAAOZ,GAK3B6B,EAAI+E,EAAE3E,OAAS,EAAGJ,GAAK,KAC1BkF,EAAWH,EAAE/E,IADgBA,KAK/B,IAAKA,EAAI,EAAGA,EAAI7B,EAAIiC,OAAQJ,IAAK,CAC/B,IAAIjB,EAAUZ,EAAI6B,GACdmF,EAAOJ,EAKX,GAJI/F,EAAQoG,WAAgC,IAAnBrG,EAAQqB,SAC/B+E,EAAO,CAACD,IAEA5F,KAAK+F,SAASF,EAAMpG,EAASkG,GAErC,QAAIjG,EAAQsG,aACJhG,KAAKG,OAMjB,OAAIT,EAAQsG,YACLhG,KAAKG,QAQdlC,EAAUgD,UAAU8E,SAAW,SAAUF,EAAMpG,EAASkG,GACtD,IAAIjG,EAAUM,KAAKN,QAEnBM,KAAKkB,MAAM,WACT,CAAE,KAAQlB,KAAM6F,KAAMA,EAAMpG,QAASA,IAEvCO,KAAKkB,MAAM,WAAY2E,EAAK/E,OAAQrB,EAAQqB,QAE5C,IAAK,IAAImF,EAAK,EACVC,EAAK,EACLC,EAAKN,EAAK/E,OACV2C,EAAKhE,EAAQqB,OACVmF,EAAKE,GAAQD,EAAKzC,EACnBwC,IAAMC,IAAM,CAChBlG,KAAKkB,MAAM,iBACX,IA2FIkF,EA3FA5G,EAAIC,EAAQyG,GACZT,EAAII,EAAKI,GAMb,GAJAjG,KAAKkB,MAAMzB,EAASD,EAAGiG,IAIb,IAANjG,EAAa,OAAO,EAExB,GAAIA,IAAMnB,EAAU,CAClB2B,KAAKkB,MAAM,WAAY,CAACzB,EAASD,EAAGiG,IAwBpC,IAAIY,EAAKJ,EACLK,EAAKJ,EAAK,EACd,GAAII,IAAO7C,EAAI,CAQb,IAPAzD,KAAKkB,MAAM,iBAOJ+E,EAAKE,EAAIF,IACd,GAAiB,MAAbJ,EAAKI,IAA4B,OAAbJ,EAAKI,KACzBvG,EAAQqD,KAA8B,MAAvB8C,EAAKI,GAAIpG,OAAO,GAAa,OAAO,EAEzD,OAAO,EAIT,KAAOwG,EAAKF,GAAI,CACd,IAAII,EAAYV,EAAKQ,GAKrB,GAHArG,KAAKkB,MAAM,mBAAoB2E,EAAMQ,EAAI5G,EAAS6G,EAAIC,GAGlDvG,KAAK+F,SAASF,EAAK3B,MAAMmC,GAAK5G,EAAQyE,MAAMoC,GAAKX,GAGnD,OAFA3F,KAAKkB,MAAM,wBAAyBmF,EAAIF,EAAII,IAErC,EAIP,GAAkB,MAAdA,GAAmC,OAAdA,IACrB7G,EAAQqD,KAA+B,MAAxBwD,EAAU1G,OAAO,GAAa,CAC/CG,KAAKkB,MAAM,gBAAiB2E,EAAMQ,EAAI5G,EAAS6G,GAC/C,MAIFtG,KAAKkB,MAAM,4CACXmF,IAOJ,SAAIV,IAEF3F,KAAKkB,MAAM,2BAA4B2E,EAAMQ,EAAI5G,EAAS6G,GACtDD,IAAOF,IAqBf,GAZiB,iBAAN3G,GAEP4G,EADE1G,EAAQ6C,OACJkD,EAAEe,gBAAkBhH,EAAEgH,cAEtBf,IAAMjG,EAEdQ,KAAKkB,MAAM,eAAgB1B,EAAGiG,EAAGW,KAEjCA,EAAMX,EAAE1F,MAAMP,GACdQ,KAAKkB,MAAM,gBAAiB1B,EAAGiG,EAAGW,KAG/BA,EAAK,OAAO,EAenB,GAAIH,IAAOE,GAAMD,IAAOzC,EAGtB,OAAO,EACF,GAAIwC,IAAOE,EAIhB,OAAOR,EACF,GAAIO,IAAOzC,EAMhB,OADoBwC,IAAOE,EAAK,GAAoB,KAAbN,EAAKI,GAK9C,MAAM,IAAIQ,MAAM,8CCx3BlB,IAAIC,EAAiC,UAArBC,QAAQC,SACpBC,EAAO,EAAQ,QAOnB,SAASC,EAAeC,EAAOC,GAE7B,IADA,IAAIC,EAAM,GACDvG,EAAI,EAAGA,EAAIqG,EAAMjG,OAAQJ,IAAK,CACrC,IAAIlB,EAAIuH,EAAMrG,GAGTlB,GAAW,MAANA,IAGA,OAANA,EACEyH,EAAInG,QAAkC,OAAxBmG,EAAIA,EAAInG,OAAS,GACjCmG,EAAIvD,MACKsD,GACTC,EAAI5D,KAAK,MAGX4D,EAAI5D,KAAK7D,IAIb,OAAOyH,EAKT,SAASC,EAAUC,GAGjB,IAFA,IAAIC,EAAYD,EAAIrG,OAAS,EACzByC,EAAQ,EACLA,GAAS6D,IACVD,EAAI5D,GADiBA,KAM3B,IADA,IAAI8D,EAAMD,EACHC,GAAO,IACRF,EAAIE,GADOA,KAKjB,OAAc,IAAV9D,GAAe8D,IAAQD,EAClBD,EACL5D,EAAQ8D,EACH,GACFF,EAAIjD,MAAMX,EAAO8D,EAAM,GAKhC,IAAIC,EACA,qEAGAC,EACA,gEAEAC,EAAQ,GAGZ,SAASC,EAAe7B,GAEtB,IAAI8B,EAASJ,EAAcK,KAAK/B,GAC5BgC,GAAUF,EAAO,IAAM,KAAOA,EAAO,IAAM,IAG3CG,EAAUN,EAAYI,KAFfD,EAAO,IAAM,IAMxB,MAAO,CAACE,EAHEC,EAAQ,GACHA,EAAQ,GACbA,EAAQ,IAIpB,SAASC,EAAc5J,GACrB,IAAIwJ,EAASJ,EAAcK,KAAKzJ,GAC5B0J,EAASF,EAAO,IAAM,GACtBK,IAAUH,GAAwB,MAAdA,EAAO,GAC/B,MAAO,CACLA,OAAQA,EACRG,MAAOA,EACPC,WAAYD,KAAWL,EAAO,GAC9BzD,KAAMyD,EAAO,IAIjB,SAASO,EAAiBL,GACxB,MAAO,OAASA,EAAOzD,QAAQ,WAAY,IAAIA,QAAQ,WAAY,MAIrEqD,EAAMU,QAAU,WAKd,IAJA,IAAIC,EAAiB,GACjBC,EAAe,GACfC,GAAmB,EAEd3H,EAAI4H,UAAUxH,OAAS,EAAGJ,IAAM,EAAGA,IAAK,CAC/C,IAAIxC,EAoBJ,GAnBIwC,GAAK,EACPxC,EAAOoK,UAAU5H,GACPyH,GAOVjK,EAAOyI,QAAQ4B,IAAI,IAAMJ,KAGZjK,EAAK+D,OAAO,EAAG,GAAGuE,gBAC3B2B,EAAe3B,cAAgB,OACjCtI,EAAOiK,EAAiB,MAX1BjK,EAAOyI,QAAQ6B,OAgBZ3B,EAAK4B,SAASvK,GACjB,MAAM,IAAIyB,UAAU,6CACf,GAAKzB,EAAL,CAIP,IAAIwJ,EAASI,EAAc5J,GACvB0J,EAASF,EAAOE,OAChBG,EAAQL,EAAOK,MACfC,EAAaN,EAAOM,WACpB/D,EAAOyD,EAAOzD,KAElB,KAAI2D,IACAO,GACAP,EAAOpB,gBAAkB2B,EAAe3B,iBAKvC2B,IACHA,EAAiBP,GAEdS,IACHD,EAAenE,EAAO,KAAOmE,EAC7BC,EAAmBL,GAGjBG,GAAkBE,GACpB,OAkBJ,OAZIN,IACFI,EAAiBF,EAAiBE,IAW5BA,GAAkBE,EAAmB,KAAO,KAHpDD,EAAetB,EAAesB,EAAazJ,MAAM,YAClB0J,GAAkBpI,KAAK,QAG/C,KAITuH,EAAMkB,UAAY,SAASxK,GACzB,IAAIwJ,EAASI,EAAc5J,GACvB0J,EAASF,EAAOE,OAChBG,EAAQL,EAAOK,MACfC,EAAaN,EAAOM,WACpB/D,EAAOyD,EAAOzD,KACd0E,EAAgB,UAAUC,KAAK3E,GAkBnC,OAfAA,EAAO6C,EAAe7C,EAAKtF,MAAM,YAAaqJ,GAAY/H,KAAK,QAEjD+H,IACZ/D,EAAO,KAELA,GAAQ0E,IACV1E,GAAQ,MAKN8D,IACFH,EAASK,EAAiBL,IAGrBA,GAAUI,EAAa,KAAO,IAAM/D,GAI7CuD,EAAMQ,WAAa,SAAS9J,GAC1B,OAAO4J,EAAc5J,GAAM8J,YAG7BR,EAAMvH,KAAO,WAEX,IADA,IAAI4I,EAAQ,GACHnI,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IAAK,CACzC,IAAI9C,EAAM0K,UAAU5H,GACpB,IAAKmG,EAAK4B,SAAS7K,GACjB,MAAM,IAAI+B,UAAU,0CAElB/B,GACFiL,EAAMxF,KAAKzF,GAIf,IAAIkL,EAASD,EAAM5I,KAAK,MAmBxB,MAJK,oBAAoB2I,KAAKC,EAAM,MAClCC,EAASA,EAAO3E,QAAQ,cAAe,OAGlCqD,EAAMkB,UAAUI,IASzBtB,EAAMuB,SAAW,SAASC,EAAMC,GAC9BD,EAAOxB,EAAMU,QAAQc,GACrBC,EAAKzB,EAAMU,QAAQe,GAanB,IAVA,IAAIC,EAAYF,EAAKxC,cACjB2C,EAAUF,EAAGzC,cAEb4C,EAAUlC,EAAU+B,EAAGtK,MAAM,OAE7B0K,EAAiBnC,EAAUgC,EAAUvK,MAAM,OAC3C2K,EAAepC,EAAUiC,EAAQxK,MAAM,OAEvCmC,EAASyI,KAAKC,IAAIH,EAAevI,OAAQwI,EAAaxI,QACtD2I,EAAkB3I,EACbJ,EAAI,EAAGA,EAAII,EAAQJ,IAC1B,GAAI2I,EAAe3I,KAAO4I,EAAa5I,GAAI,CACzC+I,EAAkB/I,EAClB,MAIJ,GAAuB,GAAnB+I,EACF,OAAOR,EAGT,IAAIS,EAAc,GAClB,IAAShJ,EAAI+I,EAAiB/I,EAAI2I,EAAevI,OAAQJ,IACvDgJ,EAAYrG,KAAK,MAKnB,OAFAqG,EAAcA,EAAYC,OAAOP,EAAQlF,MAAMuF,KAE5BxJ,KAAK,OAI1BuH,EAAMoC,UAAY,SAAS1L,GAEzB,IAAK2I,EAAK4B,SAASvK,GACjB,OAAOA,EAET,IAAKA,EACH,MAAO,GAGT,IAAI2L,EAAerC,EAAMU,QAAQhK,GAEjC,MAAI,gBAAgB0K,KAAKiB,GAGhB,UAAYA,EACV,aAAajB,KAAKiB,GAGpB,eAAiBA,EAAahG,UAAU,GAG1C3F,GAITsJ,EAAMsC,QAAU,SAAS5L,GACvB,IAAIwJ,EAASD,EAAevJ,GACxB6L,EAAOrC,EAAO,GACdsC,EAAMtC,EAAO,GAEjB,OAAKqC,GAASC,GAKVA,IAEFA,EAAMA,EAAI/H,OAAO,EAAG+H,EAAIlJ,OAAS,IAG5BiJ,EAAOC,GARL,KAYXxC,EAAMyC,SAAW,SAAS/L,EAAMc,GAC9B,IAAIyG,EAAIgC,EAAevJ,GAAM,GAK7B,OAHIc,GAAOyG,EAAExD,QAAQ,EAAIjD,EAAI8B,UAAY9B,IACvCyG,EAAIA,EAAExD,OAAO,EAAGwD,EAAE3E,OAAS9B,EAAI8B,SAE1B2E,GAIT+B,EAAM0C,QAAU,SAAShM,GACvB,OAAOuJ,EAAevJ,GAAM,IAI9BsJ,EAAM2C,OAAS,SAASC,GACtB,IAAKvD,EAAKwD,SAASD,GACjB,MAAM,IAAIzK,UACN,wDAA0DyK,GAMhE,IAAKvD,EAAK4B,SAFC2B,EAAWL,MAAQ,IAG5B,MAAM,IAAIpK,UACN,+DACOyK,EAAWL,MAIxB,IAAIC,EAAMI,EAAWJ,IACjBM,EAAOF,EAAWE,MAAQ,GAC9B,OAAKN,EAGDA,EAAIA,EAAIlJ,OAAS,KAAO0G,EAAMrJ,IACzB6L,EAAMM,EAERN,EAAMxC,EAAMrJ,IAAMmM,EALhBA,GASX9C,EAAM5F,MAAQ,SAAS2I,GACrB,IAAK1D,EAAK4B,SAAS8B,GACjB,MAAM,IAAI5K,UACN,uDAAyD4K,GAG/D,IAAIC,EAAW/C,EAAe8C,GAC9B,IAAKC,GAAgC,IAApBA,EAAS1J,OACxB,MAAM,IAAInB,UAAU,iBAAmB4K,EAAa,KAEtD,MAAO,CACLR,KAAMS,EAAS,GACfR,IAAKQ,EAAS,GAAKA,EAAS,GAAGtG,MAAM,GAAI,GACzCoG,KAAME,EAAS,GACfxL,IAAKwL,EAAS,GACdC,KAAMD,EAAS,GAAGtG,MAAM,EAAGsG,EAAS,GAAG1J,OAAS0J,EAAS,GAAG1J,UAKhE0G,EAAMrJ,IAAM,KACZqJ,EAAMkD,UAAY,IAKlB,IAAIC,EACA,gEACAC,EAAQ,GAGZ,SAASC,EAAejF,GACtB,OAAO+E,EAAYhD,KAAK/B,GAAU1B,MAAM,GAM1C0G,EAAM1C,QAAU,WAId,IAHA,IAAI2B,EAAe,GACfxB,GAAmB,EAEd3H,EAAI4H,UAAUxH,OAAS,EAAGJ,IAAM,IAAM2H,EAAkB3H,IAAK,CACpE,IAAIxC,EAAQwC,GAAK,EAAK4H,UAAU5H,GAAKiG,QAAQ6B,MAG7C,IAAK3B,EAAK4B,SAASvK,GACjB,MAAM,IAAIyB,UAAU,6CACVzB,IAIZ2L,EAAe3L,EAAO,IAAM2L,EAC5BxB,EAA+B,MAAZnK,EAAK,IAU1B,OAASmK,EAAmB,IAAM,KAHlCwB,EAAe/C,EAAe+C,EAAalL,MAAM,MAClB0J,GAAkBpI,KAAK,OAEG,KAK3D2K,EAAMlC,UAAY,SAASxK,GACzB,IAAI8J,EAAa4C,EAAM5C,WAAW9J,GAC9ByK,EAAgBzK,GAAkC,MAA1BA,EAAKA,EAAK4C,OAAS,GAY/C,OATA5C,EAAO4I,EAAe5I,EAAKS,MAAM,MAAOqJ,GAAY/H,KAAK,OAE3C+H,IACZ9J,EAAO,KAELA,GAAQyK,IACVzK,GAAQ,MAGF8J,EAAa,IAAM,IAAM9J,GAInC0M,EAAM5C,WAAa,SAAS9J,GAC1B,MAA0B,MAAnBA,EAAK2B,OAAO,IAIrB+K,EAAM3K,KAAO,WAEX,IADA,IAAI/B,EAAO,GACFwC,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IAAK,CACzC,IAAIoK,EAAUxC,UAAU5H,GACxB,IAAKmG,EAAK4B,SAASqC,GACjB,MAAM,IAAInL,UAAU,0CAElBmL,IAIA5M,GAHGA,EAGK,IAAM4M,EAFNA,GAMd,OAAOF,EAAMlC,UAAUxK,IAMzB0M,EAAM7B,SAAW,SAASC,EAAMC,GAC9BD,EAAO4B,EAAM1C,QAAQc,GAAM/G,OAAO,GAClCgH,EAAK2B,EAAM1C,QAAQe,GAAIhH,OAAO,GAO9B,IALA,IAAI8I,EAAY7D,EAAU8B,EAAKrK,MAAM,MACjCyK,EAAUlC,EAAU+B,EAAGtK,MAAM,MAE7BmC,EAASyI,KAAKC,IAAIuB,EAAUjK,OAAQsI,EAAQtI,QAC5C2I,EAAkB3I,EACbJ,EAAI,EAAGA,EAAII,EAAQJ,IAC1B,GAAIqK,EAAUrK,KAAO0I,EAAQ1I,GAAI,CAC/B+I,EAAkB/I,EAClB,MAIJ,IAAIgJ,EAAc,GAClB,IAAShJ,EAAI+I,EAAiB/I,EAAIqK,EAAUjK,OAAQJ,IAClDgJ,EAAYrG,KAAK,MAKnB,OAFAqG,EAAcA,EAAYC,OAAOP,EAAQlF,MAAMuF,KAE5BxJ,KAAK,MAI1B2K,EAAMhB,UAAY,SAAS1L,GACzB,OAAOA,GAIT0M,EAAMd,QAAU,SAAS5L,GACvB,IAAIwJ,EAASmD,EAAe3M,GACxB6L,EAAOrC,EAAO,GACdsC,EAAMtC,EAAO,GAEjB,OAAKqC,GAASC,GAKVA,IAEFA,EAAMA,EAAI/H,OAAO,EAAG+H,EAAIlJ,OAAS,IAG5BiJ,EAAOC,GARL,KAYXY,EAAMX,SAAW,SAAS/L,EAAMc,GAC9B,IAAIyG,EAAIoF,EAAe3M,GAAM,GAK7B,OAHIc,GAAOyG,EAAExD,QAAQ,EAAIjD,EAAI8B,UAAY9B,IACvCyG,EAAIA,EAAExD,OAAO,EAAGwD,EAAE3E,OAAS9B,EAAI8B,SAE1B2E,GAITmF,EAAMV,QAAU,SAAShM,GACvB,OAAO2M,EAAe3M,GAAM,IAI9B0M,EAAMT,OAAS,SAASC,GACtB,IAAKvD,EAAKwD,SAASD,GACjB,MAAM,IAAIzK,UACN,wDAA0DyK,GAMhE,IAAKvD,EAAK4B,SAFC2B,EAAWL,MAAQ,IAG5B,MAAM,IAAIpK,UACN,+DACOyK,EAAWL,MAMxB,OAFUK,EAAWJ,IAAMI,EAAWJ,IAAMY,EAAMzM,IAAM,KAC7CiM,EAAWE,MAAQ,KAKhCM,EAAMhJ,MAAQ,SAAS2I,GACrB,IAAK1D,EAAK4B,SAAS8B,GACjB,MAAM,IAAI5K,UACN,uDAAyD4K,GAG/D,IAAIC,EAAWK,EAAeN,GAC9B,IAAKC,GAAgC,IAApBA,EAAS1J,OACxB,MAAM,IAAInB,UAAU,iBAAmB4K,EAAa,KAMtD,OAJAC,EAAS,GAAKA,EAAS,IAAM,GAC7BA,EAAS,GAAKA,EAAS,IAAM,GAC7BA,EAAS,GAAKA,EAAS,IAAM,GAEtB,CACLT,KAAMS,EAAS,GACfR,IAAKQ,EAAS,GAAKA,EAAS,GAAGtG,MAAM,GAAI,GACzCoG,KAAME,EAAS,GACfxL,IAAKwL,EAAS,GACdC,KAAMD,EAAS,GAAGtG,MAAM,EAAGsG,EAAS,GAAG1J,OAAS0J,EAAS,GAAG1J,UAKhE8J,EAAMzM,IAAM,IACZyM,EAAMF,UAAY,IAIhBhN,EAAOC,QADL+I,EACec,EAEAoD,EAEnBlN,EAAOC,QAAQiN,MAAQA,EACvBlN,EAAOC,QAAQ6J,MAAQA,sBCjnBrB9J,EAAOC,QAFoB,mBAAlByB,OAAO4L,OAEC,SAAkBC,EAAMC,GACvCD,EAAKE,OAASD,EACdD,EAAKhK,UAAY7B,OAAO4L,OAAOE,EAAUjK,UAAW,CAClDmK,YAAa,CACXC,MAAOJ,EACPK,YAAY,EACZC,UAAU,EACVC,cAAc,MAMH,SAAkBP,EAAMC,GACvCD,EAAKE,OAASD,EACd,IAAIO,EAAW,aACfA,EAASxK,UAAYiK,EAAUjK,UAC/BgK,EAAKhK,UAAY,IAAIwK,EACrBR,EAAKhK,UAAUmK,YAAcH,mCCpBjC,GAAA,IAAA,GAAA,WAWE,IAUIS,EAAkB,sBAUlBC,EAAc,yBAgDdC,EAAY,CACd,CAAC,MA9BiB,KA+BlB,CAAC,OAtCkB,GAuCnB,CAAC,UAtCsB,GAuCvB,CAAC,QArCmB,GAsCpB,CAAC,aArCyB,IAsC1B,CAAC,OAjCkB,KAkCnB,CAAC,UAtCqB,IAuCtB,CAAC,eAtC2B,IAuC5B,CAAC,QArCmB,MAyClBC,EAAU,qBACVC,EAAW,iBAEXC,EAAU,mBACVC,EAAU,gBAEVC,EAAW,iBACXC,EAAU,oBACVC,EAAS,6BACTC,EAAS,eACTC,EAAY,kBAEZC,EAAY,kBAGZC,EAAY,kBACZC,EAAS,eACTC,EAAY,kBACZC,EAAY,kBAEZC,EAAa,mBAGbC,EAAiB,uBACjBC,EAAc,oBACdC,EAAa,wBACbC,EAAa,wBACbC,EAAU,qBACVC,EAAW,sBACXC,EAAW,sBACXC,EAAW,sBAEXC,EAAY,uBACZC,EAAY,uBAGZC,EAAuB,iBACvBC,EAAsB,qBACtBC,EAAwB,gCAGxBC,EAAgB,4BAChBC,EAAkB,WAClBC,EAAmB7J,OAAO2J,EAAcG,QACxCC,EAAqB/J,OAAO4J,EAAgBE,QAG5CE,EAAW,mBACXC,EAAa,kBACbC,EAAgB,mBAGhBC,EAAe,mDACfC,EAAgB,QAChBC,EAAa,mGAMbC,EAAe,sBACfC,EAAkBvK,OAAOsK,EAAaR,QAGtCU,EAAc,OAGdC,EAAe,KAGfC,EAAgB,4CAChBC,EAAgB,oCAChBC,EAAiB,QAGjBC,EAAc,4CAYdC,EAA6B,mBAG7BC,GAAe,WAMfC,GAAe,kCAGfC,GAAU,OAGVC,GAAa,qBAGbC,GAAa,aAGbC,GAAe,8BAGfC,GAAY,cAGZC,GAAW,mBAGXC,GAAU,8CAGVC,GAAY,OAGZC,GAAoB,yBAOpBC,GAAeC,gDASfC,GAAeC,8OAKfC,GAAU,IAAMF,GAAe,IAC/BG,GAAU,IAAML,GAAe,IAC/BM,GAAW,OAEXC,GAAU,8BACVC,GAAS,oBAAuBN,GAAeI,GAAtC,qEACTG,GAAS,2BAETC,GAAc,qBACdC,GAAa,kCACbC,GAAa,qCACbC,GAAU,8BAIVC,GAAc,MAAQP,GAAU,IAAMC,GAAS,IAC/CO,GAAc,MAAQF,GAAU,IAAML,GAAS,IAG/CQ,GAZa,MAAQX,GAAU,IAAMI,GAY1BQ,KAKXC,GAJW,oBAIQF,GAHP,gBAAwB,CAACN,GAAaC,GAAYC,IAAYnQ,KAAK,KAAnE,qBAA2FuQ,GAAW,KAIlHG,GAAU,MAAQ,CAtBN,oBAsBkBR,GAAYC,IAAYnQ,KAAK,KAAO,IAAMyQ,GACxEE,GAAW,MAAQ,CAACV,GAAcL,GAAU,IAAKA,GAASM,GAAYC,GA3B3D,qBA2BiFnQ,KAAK,KAAO,IAGxG4Q,GAAS/M,OA/BA,YA+Be,KAMxBgN,GAAchN,OAAO+L,GAAS,KAG9BkB,GAAYjN,OAAOmM,GAAS,MAAQA,GAAS,KAAOW,GAAWF,GAAO,KAGtEM,GAAgBlN,OAAO,CACzBuM,GAAU,IAAMN,GAAhBM,yCAA0D,CAACT,GAASS,GAAS,KAAKpQ,KAAK,KAAO,IAC9FsQ,GAAAA,yCAA8C,CAACX,GAASS,GAAUC,GAAa,KAAKrQ,KAAK,KAAO,IAChGoQ,GAAU,IAAMC,GAAhBD,sCACAA,GAAAA,sCAtBe,mDADA,mDA0BfP,GACAa,IACA1Q,KAAK,KAAM,KAGTgR,GAAenN,OAAO,0BAA+B0L,GAA/B,mBAGtB0B,GAAmB,qEAGnBC,GAAe,CACjB,QAAS,SAAU,WAAY,OAAQ,QAAS,eAAgB,eAChE,WAAY,YAAa,aAAc,aAAc,MAAO,OAAQ,SACpE,UAAW,SAAU,MAAO,SAAU,SAAU,YAAa,aAC7D,oBAAqB,cAAe,cAAe,UACnD,IAAK,eAAgB,WAAY,WAAY,cAI3CC,IAAmB,EAGnBC,GAAiB,GACrBA,GAAevE,GAAcuE,GAAetE,GAC5CsE,GAAerE,GAAWqE,GAAepE,GACzCoE,GAAenE,GAAYmE,GAAelE,GAC1CkE,GA5LsB,8BA4LYA,GAAejE,GACjDiE,GAAehE,IAAa,EAC5BgE,GAAexF,GAAWwF,GAAevF,GACzCuF,GAAezE,GAAkByE,GAAetF,GAChDsF,GAAexE,GAAewE,GAAerF,GAC7CqF,GAAepF,GAAYoF,GAAenF,GAC1CmF,GAAejF,GAAUiF,GAAehF,GACxCgF,GAAe/E,GAAa+E,GAAe9E,GAC3C8E,GAAe7E,GAAU6E,GAAe5E,GACxC4E,GAAe1E,IAAc,EAG7B,IAAI2E,GAAgB,GACpBA,GAAczF,GAAWyF,GAAcxF,GACvCwF,GAAc1E,GAAkB0E,GAAczE,GAC9CyE,GAAcvF,GAAWuF,GAActF,GACvCsF,GAAcxE,GAAcwE,GAAcvE,GAC1CuE,GAActE,GAAWsE,GAAcrE,GACvCqE,GAAcpE,GAAYoE,GAAclF,GACxCkF,GAAcjF,GAAaiF,GAAchF,GACzCgF,GAAc/E,GAAa+E,GAAc9E,GACzC8E,GAAc7E,GAAa6E,GAAc5E,GACzC4E,GAAcnE,GAAYmE,GAlNJ,8BAmNtBA,GAAclE,GAAakE,GAAcjE,IAAa,EACtDiE,GAAcrF,GAAYqF,GAAcpF,GACxCoF,GAAc3E,IAAc,EAG5B,IA4EI4E,GAAgB,CAClB,KAAM,KACN,IAAK,IACL,KAAM,IACN,KAAM,IACN,SAAU,QACV,SAAU,SAIRC,GAAiBC,WACjBC,GAAeC,SAGfC,GAA8B,iBAAVC,QAAsBA,QAAUA,OAAOzS,SAAWA,QAAUyS,OAGhFC,GAA0B,iBAAR9O,MAAoBA,MAAQA,KAAK5D,SAAWA,QAAU4D,KAGxE+G,GAAO6H,IAAcE,IAAYC,SAAS,cAATA,GAGjCC,GAA4CrU,IAAYA,EAAQsU,UAAYtU,EAG5EuU,GAAaF,IAAgC,iBAAVtU,GAAsBA,IAAWA,EAAOuU,UAAYvU,EAGvFyU,GAAgBD,IAAcA,GAAWvU,UAAYqU,GAGrDI,GAAcD,IAAiBP,GAAWjL,QAG1C0L,GAAY,WACd,IAIE,OAFYH,IAAcA,GAAWI,SAAWJ,GAAWI,QAAQ,QAAQC,OAOpEH,IAAeA,GAAYI,SAAWJ,GAAYI,QAAQ,QACjE,MAAOC,KAXK,GAeZC,GAAoBL,IAAYA,GAASM,cACzCC,GAAaP,IAAYA,GAASQ,OAClCC,GAAYT,IAAYA,GAASU,MACjCC,GAAeX,IAAYA,GAASY,SACpCC,GAAYb,IAAYA,GAASc,MACjCC,GAAmBf,IAAYA,GAASgB,aAc5C,SAASC,GAAMC,EAAMC,EAASC,GAC5B,OAAQA,EAAK3S,QACX,KAAK,EAAG,OAAOyS,EAAKG,KAAKF,GACzB,KAAK,EAAG,OAAOD,EAAKG,KAAKF,EAASC,EAAK,IACvC,KAAK,EAAG,OAAOF,EAAKG,KAAKF,EAASC,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAOF,EAAKG,KAAKF,EAASC,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAOF,EAAKD,MAAME,EAASC,GAa7B,SAASE,GAAgBC,EAAOC,EAAQC,EAAUC,GAIhD,IAHA,IAAIC,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,SAE9BkT,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GAClBH,EAAOE,EAAa1I,EAAOyI,EAASzI,GAAQuI,GAE9C,OAAOG,EAYT,SAASE,GAAUL,EAAOE,GAIxB,IAHA,IAAIE,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,SAE9BkT,EAAQlT,IAC8B,IAAzCgT,EAASF,EAAMI,GAAQA,EAAOJ,KAIpC,OAAOA,EAYT,SAASM,GAAeN,EAAOE,GAG7B,IAFA,IAAIhT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OAEhCA,MAC0C,IAA3CgT,EAASF,EAAM9S,GAASA,EAAQ8S,KAItC,OAAOA,EAaT,SAASO,GAAWP,EAAOQ,GAIzB,IAHA,IAAIJ,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,SAE9BkT,EAAQlT,GACf,IAAKsT,EAAUR,EAAMI,GAAQA,EAAOJ,GAClC,OAAO,EAGX,OAAO,EAYT,SAASS,GAAYT,EAAOQ,GAM1B,IALA,IAAIJ,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACnCwT,EAAW,EACX5M,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdI,EAAU/I,EAAO2I,EAAOJ,KAC1BlM,EAAO4M,KAAcjJ,GAGzB,OAAO3D,EAYT,SAAS6M,GAAcX,EAAOvI,GAE5B,QADsB,MAATuI,IAAoBA,EAAM9S,SACpB0T,GAAYZ,EAAOvI,EAAO,IAAM,EAYrD,SAASoJ,GAAkBb,EAAOvI,EAAOqJ,GAIvC,IAHA,IAAIV,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,SAE9BkT,EAAQlT,GACf,GAAI4T,EAAWrJ,EAAOuI,EAAMI,IAC1B,OAAO,EAGX,OAAO,EAYT,SAASW,GAASf,EAAOE,GAKvB,IAJA,IAAIE,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACnC4G,EAASkN,MAAM9T,KAEVkT,EAAQlT,GACf4G,EAAOsM,GAASF,EAASF,EAAMI,GAAQA,EAAOJ,GAEhD,OAAOlM,EAWT,SAASmN,GAAUjB,EAAOkB,GAKxB,IAJA,IAAId,GAAS,EACTlT,EAASgU,EAAOhU,OAChBiU,EAASnB,EAAM9S,SAEVkT,EAAQlT,GACf8S,EAAMmB,EAASf,GAASc,EAAOd,GAEjC,OAAOJ,EAeT,SAASoB,GAAYpB,EAAOE,EAAUC,EAAakB,GACjD,IAAIjB,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OAKvC,IAHImU,GAAanU,IACfiT,EAAcH,IAAQI,MAEfA,EAAQlT,GACfiT,EAAcD,EAASC,EAAaH,EAAMI,GAAQA,EAAOJ,GAE3D,OAAOG,EAeT,SAASmB,GAAiBtB,EAAOE,EAAUC,EAAakB,GACtD,IAAInU,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OAIvC,IAHImU,GAAanU,IACfiT,EAAcH,IAAQ9S,IAEjBA,KACLiT,EAAcD,EAASC,EAAaH,EAAM9S,GAASA,EAAQ8S,GAE7D,OAAOG,EAaT,SAASoB,GAAUvB,EAAOQ,GAIxB,IAHA,IAAIJ,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,SAE9BkT,EAAQlT,GACf,GAAIsT,EAAUR,EAAMI,GAAQA,EAAOJ,GACjC,OAAO,EAGX,OAAO,EAUT,IAAIwB,GAAYC,GAAa,UAmC7B,SAASC,GAAYC,EAAYnB,EAAWoB,GAC1C,IAAI9N,EAOJ,OANA8N,EAASD,GAAAA,SAAqBlK,EAAOoK,EAAKF,GACxC,GAAInB,EAAU/I,EAAOoK,EAAKF,GAExB,OADA7N,EAAS+N,GACF,KAGJ/N,EAcT,SAASgO,GAAc9B,EAAOQ,EAAWuB,EAAWC,GAIlD,IAHA,IAAI9U,EAAS8S,EAAM9S,OACfkT,EAAQ2B,GAAaC,EAAY,GAAK,GAElCA,EAAY5B,MAAYA,EAAQlT,GACtC,GAAIsT,EAAUR,EAAMI,GAAQA,EAAOJ,GACjC,OAAOI,EAGX,OAAQ,EAYV,SAASQ,GAAYZ,EAAOvI,EAAOsK,GACjC,OAAOtK,GAAUA,EAidnB,SAAuBuI,EAAOvI,EAAOsK,GAInC,IAHA,IAAI3B,EAAQ2B,EAAY,EACpB7U,EAAS8S,EAAM9S,SAEVkT,EAAQlT,GACf,GAAI8S,EAAMI,KAAW3I,EACnB,OAAO2I,EAGX,OAAQ,EATV,CAhdoBJ,EAAOvI,EAAOsK,GAC5BD,GAAc9B,EAAOiC,GAAWF,GAatC,SAASG,GAAgBlC,EAAOvI,EAAOsK,EAAWjB,GAIhD,IAHA,IAAIV,EAAQ2B,EAAY,EACpB7U,EAAS8S,EAAM9S,SAEVkT,EAAQlT,GACf,GAAI4T,EAAWd,EAAMI,GAAQ3I,GAC3B,OAAO2I,EAGX,OAAQ,EAUV,SAAS6B,GAAUxK,GACjB,OAAOA,GAAUA,EAYnB,SAAS0K,GAASnC,EAAOE,GACvB,IAAIhT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAOA,EAAUkV,GAAQpC,EAAOE,GAAYhT,EA1yBpC,IAozBV,SAASuU,GAAaI,GACpB,OAAO,SAASQ,GACd,OAAiB,MAAVA,OAl3BPC,EAk3BoCD,EAAOR,IAW/C,SAASU,GAAeF,GACtB,OAAO,SAASR,GACd,OAAiB,MAAVQ,OA/3BPC,EA+3BoCD,EAAOR,IAiB/C,SAASW,GAAWb,EAAYzB,EAAUC,EAAakB,EAAWO,GAMhE,OALAA,EAASD,GAAAA,SAAqBlK,EAAO2I,EAAOuB,GAC1CxB,EAAckB,GACTA,GAAY,EAAO5J,GACpByI,EAASC,EAAa1I,EAAO2I,EAAOuB,MAEnCxB,EAgCT,SAASiC,GAAQpC,EAAOE,GAKtB,IAJA,IAAIpM,EACAsM,GAAS,EACTlT,EAAS8S,EAAM9S,SAEVkT,EAAQlT,GAAQ,CACvB,IAAIuV,EAAUvC,EAASF,EAAMI,SA57B7BkC,IA67BIG,IACF3O,OA97BFwO,IA87BWxO,EAAuB2O,EAAW3O,EAAS2O,GAGxD,OAAO3O,EAYT,SAAS4O,GAAU9R,EAAGsP,GAIpB,IAHA,IAAIE,GAAS,EACTtM,EAASkN,MAAMpQ,KAEVwP,EAAQxP,GACfkD,EAAOsM,GAASF,EAASE,GAE3B,OAAOtM,EAyBT,SAAS6O,GAASC,GAChB,OAAOA,EACHA,EAAOtS,MAAM,EAAGuS,GAAgBD,GAAU,GAAGrS,QAAQmK,EAAa,IAClEkI,EAUN,SAASE,GAAUnD,GACjB,OAAO,SAASlI,GACd,OAAOkI,EAAKlI,IAchB,SAASsL,GAAWV,EAAQW,GAC1B,OAAOjC,GAASiC,GAAAA,SAAgBnB,GAC9B,OAAOQ,EAAOR,MAYlB,SAASoB,GAASC,EAAOrB,GACvB,OAAOqB,EAAMC,IAAItB,GAYnB,SAASuB,GAAgBC,EAAYC,GAInC,IAHA,IAAIlD,GAAS,EACTlT,EAASmW,EAAWnW,SAEfkT,EAAQlT,GAAU0T,GAAY0C,EAAYD,EAAWjD,GAAQ,IAAM,IAC5E,OAAOA,EAYT,SAASmD,GAAcF,EAAYC,GAGjC,IAFA,IAAIlD,EAAQiD,EAAWnW,OAEhBkT,KAAWQ,GAAY0C,EAAYD,EAAWjD,GAAQ,IAAM,IACnE,OAAOA,EAWT,SAASoD,GAAaxD,EAAOyD,GAI3B,IAHA,IAAIvW,EAAS8S,EAAM9S,OACf4G,EAAS,EAEN5G,KACD8S,EAAM9S,KAAYuW,KAClB3P,EAGN,OAAOA,EAWT,IAAI4P,GAAenB,GAjxBG,CAEpB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IACnC,OAAQ,KAAM,OAAQ,KACtB,OAAQ,KAAM,OAAQ,KACtB,OAAQ,KAER,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAC1B,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACtF,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACtF,OAAU,IAAM,OAAU,IAC1B,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,KAAM,OAAU,KAC1B,OAAU,KAAM,OAAU,KAC1B,OAAU,KAAM,OAAU,MAouBxBoB,GAAiBpB,GAhuBH,CAChB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,UAouBP,SAASqB,GAAiBC,GACxB,MAAO,KAAOlG,GAAckG,GAsB9B,SAASC,GAAWlB,GAClB,OAAOvF,GAAarI,KAAK4N,GAsC3B,SAASmB,GAAWlW,GAClB,IAAIuS,GAAS,EACTtM,EAASkN,MAAMnT,EAAImW,MAKvB,OAHAnW,EAAInC,SAAAA,SAAiB+L,EAAOoK,GAC1B/N,IAASsM,GAAS,CAACyB,EAAKpK,MAEnB3D,EAWT,SAASmQ,GAAQtE,EAAMuE,GACrB,OAAO,SAASla,GACd,OAAO2V,EAAKuE,EAAUla,KAa1B,SAASma,GAAenE,EAAOyD,GAM7B,IALA,IAAIrD,GAAS,EACTlT,EAAS8S,EAAM9S,OACfwT,EAAW,EACX5M,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACd3I,IAAUgM,GAAehM,IAAUM,IACrCiI,EAAMI,GAASrI,EACfjE,EAAO4M,KAAcN,GAGzB,OAAOtM,EAUT,SAASsQ,GAAWnZ,GAClB,IAAImV,GAAS,EACTtM,EAASkN,MAAM/V,EAAI+Y,MAKvB,OAHA/Y,EAAIS,SAAAA,SAAiB+L,GACnB3D,IAASsM,GAAS3I,KAEb3D,EAUT,SAASuQ,GAAWpZ,GAClB,IAAImV,GAAS,EACTtM,EAASkN,MAAM/V,EAAI+Y,MAKvB,OAHA/Y,EAAIS,SAAAA,SAAiB+L,GACnB3D,IAASsM,GAAS,CAAC3I,EAAOA,MAErB3D,EAoDT,SAASwQ,GAAW1B,GAClB,OAAOkB,GAAWlB,GAiDpB,SAAqBA,GAEnB,IADA,IAAI9O,EAASqJ,GAAU3J,UAAY,EAC5B2J,GAAUnI,KAAK4N,MAClB9O,EAEJ,OAAOA,EALT,CAhDkB8O,GACZpB,GAAUoB,GAUhB,SAAS2B,GAAc3B,GACrB,OAAOkB,GAAWlB,GAmDpB,SAAwBA,GACtB,OAAOA,EAAOzW,MAAMgR,KAAc,GADpC,CAlDqByF,GA7kBrB,SAAsBA,GACpB,OAAOA,EAAO7X,MAAM,IADtB,CA8kBmB6X,GAWnB,SAASC,GAAgBD,GAGvB,IAFA,IAAIxC,EAAQwC,EAAO1V,OAEZkT,KAAWzF,EAAa3F,KAAK4N,EAAO3W,OAAOmU,MAClD,OAAOA,EAUT,IAAIoE,GAAmBjC,GA38BH,CAClB,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,QAAS,MAk4gBP/R,GAt3ee,SAAUiU,EAAaC,GAIxC,IA6BMC,EA7BF3D,GAHJ0D,EAAqB,MAAXA,EAAkBvO,GAAO3F,GAAExD,SAASmJ,GAAK3K,SAAUkZ,EAASlU,GAAEoU,KAAKzO,GAAMoH,MAG/DyD,MAChB6D,EAAOH,EAAQG,KACfhS,GAAQ6R,EAAQ7R,MAChBsL,GAAWuG,EAAQvG,SACnBxI,GAAO+O,EAAQ/O,KACfnK,GAASkZ,EAAQlZ,OACjB0E,GAASwU,EAAQxU,OACjB4U,GAASJ,EAAQI,OACjB/Y,GAAY2Y,EAAQ3Y,UAGpBgZ,GAAa/D,EAAM3T,UAEnB2X,GAAcxZ,GAAO6B,UAGrB4X,GAAaP,EAAQ,sBAGrBQ,GAPY/G,GAAS9Q,UAOI8X,SAGzBC,GAAiBJ,GAAYI,eAG7BC,GAAY,EAGZC,IACEX,EAAM,SAAS5Q,KAAKkR,IAAcA,GAAWxZ,MAAQwZ,GAAWxZ,KAAK8Z,UAAY,KACvE,iBAAmBZ,EAAO,GAQtCa,GAAuBR,GAAYG,SAGnCM,GAAmBP,GAAapF,KAAKtU,IAGrCka,GAAUvP,GAAK3F,EAGfmV,GAAazV,GAAO,IACtBgV,GAAapF,KAAKsF,IAAgB7U,QAAQiK,EAAc,QACvDjK,QAAQ,yDAA0D,SAAW,KAI5EqV,GAASrH,GAAgBmG,EAAQkB,YAr9CnCtD,EAs9CEuD,GAASnB,EAAQmB,OACjBC,GAAapB,EAAQoB,WACrBC,GAAcH,GAASA,GAAOG,iBAx9ChCzD,EAy9CE0D,GAAe/B,GAAQzY,GAAOya,eAAgBza,IAC9C0a,GAAe1a,GAAO4L,OACtB+O,GAAuBnB,GAAYmB,qBACnCC,GAASrB,GAAWqB,OACpBC,GAAmBR,GAASA,GAAOS,wBA79CrChE,EA89CEiE,GAAcV,GAASA,GAAOW,cA99ChClE,EA+9CEmE,GAAiBZ,GAASA,GAAOa,iBA/9CnCpE,EAi+CEqE,GAAkB,WACpB,IACE,IAAIhH,EAAOiH,GAAUpb,GAAQ,kBAE7B,OADAmU,EAAK,GAAI,GAAI,IACNA,EACP,MAAOd,KALW,GASlBgI,GAAkBnC,EAAQoC,eAAiB3Q,GAAK2Q,cAAgBpC,EAAQoC,aACxEC,GAASlC,GAAQA,EAAKmC,MAAQ7Q,GAAK0O,KAAKmC,KAAOnC,EAAKmC,IACpDC,GAAgBvC,EAAQwC,aAAe/Q,GAAK+Q,YAAcxC,EAAQwC,WAGlEC,GAAaxR,GAAKyR,KAClBC,GAAc1R,GAAK2R,MACnBC,GAAmB/b,GAAOgc,sBAC1BC,GAAiB7B,GAASA,GAAO8B,cAl/CnCpF,EAm/CEqF,GAAiBjD,EAAQkD,SACzBC,GAAa9C,GAAW1Y,KACxByb,GAAa7D,GAAQzY,GAAOC,KAAMD,IAClCuc,GAAYpS,GAAKqS,IACjBC,GAAYtS,GAAKC,IACjBsS,GAAYrD,EAAKmC,IACjBmB,GAAiBzD,EAAQ3G,SACzBqK,GAAezS,GAAK0S,OACpBC,GAAgBvD,GAAWwD,QAG3BC,GAAW5B,GAAUlC,EAAS,YAC9B+D,GAAM7B,GAAUlC,EAAS,OACzBgE,GAAU9B,GAAUlC,EAAS,WAC7BiE,GAAM/B,GAAUlC,EAAS,OACzBkE,GAAUhC,GAAUlC,EAAS,WAC7BmE,GAAejC,GAAUpb,GAAQ,UAGjCsd,GAAUF,IAAW,IAAIA,GAGzBG,GAAY,GAGZC,GAAqBC,GAAST,IAC9BU,GAAgBD,GAASR,IACzBU,GAAoBF,GAASP,IAC7BU,GAAgBH,GAASN,IACzBU,GAAoBJ,GAASL,IAG7BU,GAAczD,GAASA,GAAOxY,eAnhDhCiV,EAohDEiH,GAAgBD,GAAcA,GAAYE,aAphD5ClH,EAqhDEmH,GAAiBH,GAAcA,GAAYnE,cArhD7C7C,EA8oDF,SAASoH,GAAOjS,GACd,GAAIkS,GAAalS,KAAWmS,GAAQnS,MAAYA,aAAiBoS,IAAc,CAC7E,GAAIpS,aAAiBqS,GACnB,OAAOrS,EAET,GAAI2N,GAAetF,KAAKrI,EAAO,eAC7B,OAAOsS,GAAatS,GAGxB,OAAO,IAAIqS,GAAcrS,GAW3B,IAAIuS,GAAc,WAChB,SAAS3H,KACT,OAAO,SAAS4H,GACd,IAAKxT,GAASwT,GACZ,MAAO,GAET,GAAI/D,GACF,OAAOA,GAAa+D,GAEtB5H,EAAOhV,UAAY4c,EACnB,IAAInW,EAAS,IAAIuO,EAEjB,OADAA,EAAOhV,eA7qDTiV,EA8qDSxO,GAZO,GAqBlB,SAASoW,MAWT,SAASJ,GAAcrS,EAAO0S,GAC5B/d,KAAKge,YAAc3S,EACnBrL,KAAKie,YAAc,GACnBje,KAAKke,YAAcH,EACnB/d,KAAKme,UAAY,EACjBne,KAAKoe,gBAvsDLlI,EAuxDF,SAASuH,GAAYpS,GACnBrL,KAAKge,YAAc3S,EACnBrL,KAAKie,YAAc,GACnBje,KAAKqe,QAAU,EACfre,KAAKse,cAAe,EACpBte,KAAKue,cAAgB,GACrBve,KAAKwe,cA9tDc,WA+tDnBxe,KAAKye,UAAY,GAgHnB,SAASC,GAAKC,GACZ,IAAI3K,GAAS,EACTlT,EAAoB,MAAX6d,EAAkB,EAAIA,EAAQ7d,OAG3C,IADAd,KAAK4e,UACI5K,EAAQlT,GAAQ,CACvB,IAAI+d,EAAQF,EAAQ3K,GACpBhU,KAAKnB,IAAIggB,EAAM,GAAIA,EAAM,KAiG7B,SAASC,GAAUH,GACjB,IAAI3K,GAAS,EACTlT,EAAoB,MAAX6d,EAAkB,EAAIA,EAAQ7d,OAG3C,IADAd,KAAK4e,UACI5K,EAAQlT,GAAQ,CACvB,IAAI+d,EAAQF,EAAQ3K,GACpBhU,KAAKnB,IAAIggB,EAAM,GAAIA,EAAM,KA8G7B,SAASE,GAASJ,GAChB,IAAI3K,GAAS,EACTlT,EAAoB,MAAX6d,EAAkB,EAAIA,EAAQ7d,OAG3C,IADAd,KAAK4e,UACI5K,EAAQlT,GAAQ,CACvB,IAAI+d,EAAQF,EAAQ3K,GACpBhU,KAAKnB,IAAIggB,EAAM,GAAIA,EAAM,KAiG7B,SAASG,GAASlK,GAChB,IAAId,GAAS,EACTlT,EAAmB,MAAVgU,EAAiB,EAAIA,EAAOhU,OAGzC,IADAd,KAAKif,SAAW,IAAIF,KACX/K,EAAQlT,GACfd,KAAKkf,IAAIpK,EAAOd,IA6CpB,SAASmL,GAAMR,GACb,IAAIS,EAAOpf,KAAKif,SAAW,IAAIH,GAAUH,GACzC3e,KAAK4X,KAAOwH,EAAKxH,KAqGnB,SAASyH,GAAchU,EAAOiU,GAC5B,IAAIC,EAAQ/B,GAAQnS,GAChBmU,GAASD,GAASE,GAAYpU,GAC9BqU,GAAUH,IAAUC,GAASlE,GAASjQ,GACtCsU,GAAUJ,IAAUC,IAAUE,GAAUrM,GAAahI,GACrDuU,EAAcL,GAASC,GAASE,GAAUC,EAC1CjY,EAASkY,EAActJ,GAAUjL,EAAMvK,OAAQ4X,IAAU,GACzD5X,EAAS4G,EAAO5G,OAEpB,IAAK,IAAI2U,KAAOpK,GACTiU,IAAatG,GAAetF,KAAKrI,EAAOoK,IACvCmK,IAEQ,UAAPnK,GAECiK,IAAkB,UAAPjK,GAA0B,UAAPA,IAE9BkK,IAAkB,UAAPlK,GAA0B,cAAPA,GAA8B,cAAPA,IAEtDoK,GAAQpK,EAAK3U,KAElB4G,EAAOrE,KAAKoS,GAGhB,OAAO/N,EAUT,SAASoY,GAAYlM,GACnB,IAAI9S,EAAS8S,EAAM9S,OACnB,OAAOA,EAAS8S,EAAMmM,GAAW,EAAGjf,EAAS,SAj5E7CoV,EA45EF,SAAS8J,GAAgBpM,EAAOpP,GAC9B,OAAOyb,GAAYC,GAAUtM,GAAQuM,GAAU3b,EAAG,EAAGoP,EAAM9S,SAU7D,SAASsf,GAAaxM,GACpB,OAAOqM,GAAYC,GAAUtM,IAY/B,SAASyM,GAAiBpK,EAAQR,EAAKpK,SAp7ErC6K,IAq7EK7K,IAAwBiV,GAAGrK,EAAOR,GAAMpK,SAr7E7C6K,IAs7EK7K,KAAyBoK,KAAOQ,KACnCsK,GAAgBtK,EAAQR,EAAKpK,GAcjC,SAASmV,GAAYvK,EAAQR,EAAKpK,GAChC,IAAIoV,EAAWxK,EAAOR,GAChBuD,GAAetF,KAAKuC,EAAQR,IAAQ6K,GAAGG,EAAUpV,UAv8EvD6K,IAw8EK7K,GAAyBoK,KAAOQ,IACnCsK,GAAgBtK,EAAQR,EAAKpK,GAYjC,SAASqV,GAAa9M,EAAO6B,GAE3B,IADA,IAAI3U,EAAS8S,EAAM9S,OACZA,KACL,GAAIwf,GAAG1M,EAAM9S,GAAQ,GAAI2U,GACvB,OAAO3U,EAGX,OAAQ,EAcV,SAAS6f,GAAepL,EAAY1B,EAAQC,EAAUC,GAIpD,OAHA6M,GAASrL,GAAAA,SAAqBlK,EAAOoK,EAAKF,GACxC1B,EAAOE,EAAa1I,EAAOyI,EAASzI,GAAQkK,MAEvCxB,EAYT,SAAS8M,GAAW5K,EAAQrI,GAC1B,OAAOqI,GAAU6K,GAAWlT,EAAQvO,GAAKuO,GAASqI,GAyBpD,SAASsK,GAAgBtK,EAAQR,EAAKpK,GACzB,aAAPoK,GAAsB8E,GACxBA,GAAetE,EAAQR,EAAK,CAC1B,cAAgB,EAChB,YAAc,EACd,MAASpK,EACT,UAAY,IAGd4K,EAAOR,GAAOpK,EAYlB,SAAS0V,GAAO9K,EAAQpN,GAMtB,IALA,IAAImL,GAAS,EACTlT,EAAS+H,EAAM/H,OACf4G,EAASkN,EAAM9T,GACfkgB,EAAiB,MAAV/K,IAEFjC,EAAQlT,GACf4G,EAAOsM,GAASgN,OAhjFlB9K,EAgjFqC+K,GAAIhL,EAAQpN,EAAMmL,IAEvD,OAAOtM,EAYT,SAASyY,GAAUe,EAAQC,EAAOC,GAShC,OARIF,GAAWA,SA/jFfhL,IAgkFMkL,IACFF,EAASA,GAAUE,EAAQF,EAASE,QAjkFxClL,IAmkFMiL,IACFD,EAASA,GAAUC,EAAQD,EAASC,IAGjCD,EAmBT,SAASG,GAAUhW,EAAOiW,EAASC,EAAY9L,EAAKQ,EAAQuL,GAC1D,IAAI9Z,EACA+Z,EArkFc,EAqkFLH,EACTI,EArkFc,EAqkFLJ,EACTK,EArkFiB,EAqkFRL,EAKb,GAHIC,IACF7Z,EAASuO,EAASsL,EAAWlW,EAAOoK,EAAKQ,EAAQuL,GAASD,EAAWlW,SAjmFvE6K,IAmmFIxO,EACF,OAAOA,EAET,IAAK2C,GAASgB,GACZ,OAAOA,EAET,IAAIkU,EAAQ/B,GAAQnS,GACpB,GAAIkU,EAAAA,CAEF,GADA7X,EA68GJ,SAAwBkM,GACtB,IAAI9S,EAAS8S,EAAM9S,OACf4G,EAAS,IAAIkM,EAAMxI,YAAYtK,GAOnC,OAJIA,GAA6B,iBAAZ8S,EAAM,IAAkBoF,GAAetF,KAAKE,EAAO,WACtElM,EAAOsM,MAAQJ,EAAMI,MACrBtM,EAAOka,MAAQhO,EAAMgO,OAEhBla,EATT,CA78G4B2D,IACnBoW,EACH,OAAOvB,GAAU7U,EAAO3D,OAErB,CACL,IAAIma,EAAMC,GAAOzW,GACb0W,EAASF,GAAO3V,GAAW2V,GAAO1V,EAEtC,GAAImP,GAASjQ,GACX,OAAO2W,GAAY3W,EAAOoW,GAE5B,GAAII,GAAOvV,GAAauV,GAAOhW,GAAYkW,IAAW9L,EAAAA,CAEpD,GADAvO,EAAUga,GAAUK,EAAU,GAAKE,GAAgB5W,IAC9CoW,EACH,OAAOC,EA+nEf,SAAuB9T,EAAQqI,GAC7B,OAAO6K,GAAWlT,EAAQsU,GAAatU,GAASqI,GADlD,CA9nE0B5K,EAnH1B,SAAsB4K,EAAQrI,GAC5B,OAAOqI,GAAU6K,GAAWlT,EAAQuU,GAAOvU,GAASqI,GADtD,CAmH8CvO,EAAQ2D,IAknEtD,SAAqBuC,EAAQqI,GAC3B,OAAO6K,GAAWlT,EAAQwU,GAAWxU,GAASqI,GADhD,CAjnEwB5K,EAAOwV,GAAWnZ,EAAQ2D,QAEvC,CACL,IAAKiG,GAAcuQ,GACjB,OAAO5L,EAAS5K,EAAQ,GAE1B3D,EA49GN,SAAwBuO,EAAQ4L,EAAKJ,GACnC,IAAIY,EAAOpM,EAAO7K,YAClB,OAAQyW,GACN,KAAKjV,EACH,OAAO0V,GAAiBrM,GAE1B,KAAKlK,EACL,KAAKC,EACH,OAAO,IAAIqW,GAAMpM,GAEnB,KAAKpJ,EACH,OA5nDN,SAAuB0V,EAAUd,GAC/B,IAAIe,EAASf,EAASa,GAAiBC,EAASC,QAAUD,EAASC,OACnE,OAAO,IAAID,EAASnX,YAAYoX,EAAQD,EAASE,WAAYF,EAASG,YAFxE,CA4nD2BzM,EAAQwL,GAE/B,KAAK3U,EAAY,KAAKC,EACtB,KAAKC,EAAS,KAAKC,EAAU,KAAKC,EAClC,KAAKC,EAAU,IA5/LC,6BA4/LqB,KAAKC,EAAW,KAAKC,EACxD,OAAOsV,GAAgB1M,EAAQwL,GAEjC,KAAKrV,EACH,OAAO,IAAIiW,EAEb,KAAKhW,EACL,KAAKI,EACH,OAAO,IAAI4V,EAAKpM,GAElB,KAAK1J,EACH,OA/nDN,SAAqBrM,GACnB,IAAIwH,EAAS,IAAIxH,EAAOkL,YAAYlL,EAAO0N,OAAQmB,GAAQpH,KAAKzH,IAEhE,OADAwH,EAAON,UAAYlH,EAAOkH,UACnBM,EAHT,CA+nDyBuO,GAErB,KAAKzJ,EACH,OAAO,IAAI6V,EAEb,KAAK3V,EACH,OAvnDGyQ,GAAgB/d,GAAO+d,GAAczJ,KAunDrBuC,IAvnDqC,IAulD9D,CA59G8B5K,EAAOwW,EAAKJ,IAIxCD,IAAUA,EAAQ,IAAIrC,IACtB,IAAIyD,EAAUpB,EAAMP,IAAI5V,GACxB,GAAIuX,EACF,OAAOA,EAETpB,EAAM3iB,IAAIwM,EAAO3D,GAEbyL,GAAM9H,GACRA,EAAM/L,SAAAA,SAAiBujB,GACrBnb,EAAOwX,IAAImC,GAAUwB,EAAUvB,EAASC,EAAYsB,EAAUxX,EAAOmW,OAE9DzO,GAAM1H,IACfA,EAAM/L,SAAAA,SAAiBujB,EAAUpN,GAC/B/N,EAAO7I,IAAI4W,EAAK4L,GAAUwB,EAAUvB,EAASC,EAAY9L,EAAKpK,EAAOmW,OAIzE,IAII5K,EAAQ2I,OA1pFZrJ,GAspFeyL,EACVD,EAASoB,GAAeC,GACxBrB,EAASS,GAAS9iB,IAEkBgM,GASzC,OARA4I,GAAU2C,GAASvL,GAAAA,SAAgBwX,EAAUpN,GACvCmB,IAEFiM,EAAWxX,EADXoK,EAAMoN,IAIRrC,GAAY9Y,EAAQ+N,EAAK4L,GAAUwB,EAAUvB,EAASC,EAAY9L,EAAKpK,EAAOmW,OAEzE9Z,EAyBT,SAASsb,GAAe/M,EAAQrI,EAAQgJ,GACtC,IAAI9V,EAAS8V,EAAM9V,OACnB,GAAc,MAAVmV,EACF,OAAQnV,EAGV,IADAmV,EAAS7W,GAAO6W,GACTnV,KAAU,CACf,IAAI2U,EAAMmB,EAAM9V,GAEZuK,EAAQ4K,EAAOR,GAEnB,QAvsFFS,IAusFO7K,KAAyBoK,KAAOQ,MAAa7B,EAHlCxG,EAAO6H,IAGqCpK,GAC1D,OAAO,EAGX,OAAO,EAaT,SAAS4X,GAAU1P,EAAM2P,EAAMzP,GAC7B,GAAmB,mBAARF,EACT,MAAM,IAAI5T,GAAU+L,GAEtB,OAAOoP,IAAAA,WAAwBvH,EAAKD,WA5tFpC4C,EA4tFqDzC,KAAUyP,GAcjE,SAASC,GAAevP,EAAOkB,EAAQhB,EAAUY,GAC/C,IAAIV,GAAS,EACToP,EAAW7O,GACX8O,GAAW,EACXviB,EAAS8S,EAAM9S,OACf4G,EAAS,GACT4b,EAAexO,EAAOhU,OAE1B,IAAKA,EACH,OAAO4G,EAELoM,IACFgB,EAASH,GAASG,EAAQ4B,GAAU5C,KAElCY,GACF0O,EAAW3O,GACX4O,GAAW,GAEJvO,EAAOhU,QAtvFG,MAuvFjBsiB,EAAWvM,GACXwM,GAAW,EACXvO,EAAS,IAAIkK,GAASlK,IAExByO,EACA,OAASvP,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdwP,EAAuB,MAAZ1P,EAAmBzI,EAAQyI,EAASzI,GAGnD,GADAA,EAASqJ,GAAwB,IAAVrJ,EAAeA,EAAQ,EAC1CgY,GAAYG,GAAaA,EAAU,CAErC,IADA,IAAIC,EAAcH,EACXG,KACL,GAAI3O,EAAO2O,KAAiBD,EAC1B,SAASD,EAGb7b,EAAOrE,KAAKgI,QAEJ+X,EAAStO,EAAQ0O,EAAU9O,IACnChN,EAAOrE,KAAKgI,GAGhB,OAAO3D,EAjkCT4V,GAAOoG,iBAAmB,CAQxB,OAAU5V,EAQV,SAAYC,EAQZ,YAAeC,EAQf,SAAY,GAQZ,QAAW,CAQT,EAAKsP,MAKTA,GAAOrc,UAAY6c,GAAW7c,WACbmK,YAAckS,IAE/BI,GAAczc,UAAY2c,GAAWE,GAAW7c,YACxBmK,YAAcsS,IAsHtCD,GAAYxc,UAAY2c,GAAWE,GAAW7c,YACxBmK,YAAcqS,GAoGpCiB,GAAKzd,UAAU2d,MAvEf,WACE5e,KAAKif,SAAWxC,GAAeA,GAAa,MAAQ,GACpDzc,KAAK4X,KAAO,GAsEd8G,GAAKzd,UAAkB,OAzDvB,SAAoBwU,GAClB,IAAI/N,EAAS1H,KAAK+W,IAAItB,WAAezV,KAAKif,SAASxJ,GAEnD,OADAzV,KAAK4X,MAAQlQ,EAAS,EAAI,EACnBA,GAuDTgX,GAAKzd,UAAUggB,IA3Cf,SAAiBxL,GACf,IAAI2J,EAAOpf,KAAKif,SAChB,GAAIxC,GAAc,CAChB,IAAI/U,EAAS0X,EAAK3J,GAClB,MAp7De,8BAo7DR/N,OAl8DTwO,EAk8DiDxO,EAEjD,OAAOsR,GAAetF,KAAK0L,EAAM3J,GAAO2J,EAAK3J,QAp8D7CS,GA0+DFwI,GAAKzd,UAAU8V,IA1Bf,SAAiBtB,GACf,IAAI2J,EAAOpf,KAAKif,SAChB,OAAOxC,QAl9DPvG,IAk9DuBkJ,EAAK3J,GAAsBuD,GAAetF,KAAK0L,EAAM3J,IAyB9EiJ,GAAKzd,UAAUpC,IAZf,SAAiB4W,EAAKpK,GACpB,IAAI+T,EAAOpf,KAAKif,SAGhB,OAFAjf,KAAK4X,MAAQ5X,KAAK+W,IAAItB,GAAO,EAAI,EACjC2J,EAAK3J,GAAQgH,SAl+DbvG,IAk+D6B7K,EAp9DZ,4BAo9DoDA,EAC9DrL,MAyHT8e,GAAU7d,UAAU2d,MApFpB,WACE5e,KAAKif,SAAW,GAChBjf,KAAK4X,KAAO,GAmFdkH,GAAU7d,UAAkB,OAvE5B,SAAyBwU,GACvB,IAAI2J,EAAOpf,KAAKif,SACZjL,EAAQ0M,GAAatB,EAAM3J,GAE/B,QAAIzB,EAAQ,IAIRA,GADYoL,EAAKte,OAAS,EAE5Bse,EAAK1b,MAELsW,GAAOtG,KAAK0L,EAAMpL,EAAO,KAEzBhU,KAAK4X,KACA,KA0DTkH,GAAU7d,UAAUggB,IA9CpB,SAAsBxL,GACpB,IAAI2J,EAAOpf,KAAKif,SACZjL,EAAQ0M,GAAatB,EAAM3J,GAE/B,OAAOzB,EAAQ,OApjEfkC,EAojE+BkJ,EAAKpL,GAAO,IA2C7C8K,GAAU7d,UAAU8V,IA/BpB,SAAsBtB,GACpB,OAAOiL,GAAa1gB,KAAKif,SAAUxJ,IAAQ,GA+B7CqJ,GAAU7d,UAAUpC,IAlBpB,SAAsB4W,EAAKpK,GACzB,IAAI+T,EAAOpf,KAAKif,SACZjL,EAAQ0M,GAAatB,EAAM3J,GAQ/B,OANIzB,EAAQ,KACRhU,KAAK4X,KACPwH,EAAK/b,KAAK,CAACoS,EAAKpK,KAEhB+T,EAAKpL,GAAO,GAAK3I,EAEZrL,MA2GT+e,GAAS9d,UAAU2d,MAtEnB,WACE5e,KAAK4X,KAAO,EACZ5X,KAAKif,SAAW,CACd,KAAQ,IAAIP,GACZ,IAAO,IAAKrC,IAAOyC,IACnB,OAAU,IAAIJ,KAkElBK,GAAS9d,UAAkB,OArD3B,SAAwBwU,GACtB,IAAI/N,EAASic,GAAW3jB,KAAMyV,GAAa,OAAEA,GAE7C,OADAzV,KAAK4X,MAAQlQ,EAAS,EAAI,EACnBA,GAmDTqX,GAAS9d,UAAUggB,IAvCnB,SAAqBxL,GACnB,OAAOkO,GAAW3jB,KAAMyV,GAAKwL,IAAIxL,IAuCnCsJ,GAAS9d,UAAU8V,IA3BnB,SAAqBtB,GACnB,OAAOkO,GAAW3jB,KAAMyV,GAAKsB,IAAItB,IA2BnCsJ,GAAS9d,UAAUpC,IAdnB,SAAqB4W,EAAKpK,GACxB,IAAI+T,EAAOuE,GAAW3jB,KAAMyV,GACxBmC,EAAOwH,EAAKxH,KAIhB,OAFAwH,EAAKvgB,IAAI4W,EAAKpK,GACdrL,KAAK4X,MAAQwH,EAAKxH,MAAQA,EAAO,EAAI,EAC9B5X,MA2DTgf,GAAS/d,UAAUie,IAAMF,GAAS/d,UAAUoC,KAnB5C,SAAqBgI,GAEnB,OADArL,KAAKif,SAASpgB,IAAIwM,EA1tED,6BA2tEVrL,MAkBTgf,GAAS/d,UAAU8V,IANnB,SAAqB1L,GACnB,OAAOrL,KAAKif,SAASlI,IAAI1L,IAuG3B8T,GAAMle,UAAU2d,MA3EhB,WACE5e,KAAKif,SAAW,IAAIH,GACpB9e,KAAK4X,KAAO,GA0EduH,GAAMle,UAAkB,OA9DxB,SAAqBwU,GACnB,IAAI2J,EAAOpf,KAAKif,SACZvX,EAAS0X,EAAa,OAAE3J,GAG5B,OADAzV,KAAK4X,KAAOwH,EAAKxH,KACVlQ,GA0DTyX,GAAMle,UAAUggB,IA9ChB,SAAkBxL,GAChB,OAAOzV,KAAKif,SAASgC,IAAIxL,IA8C3B0J,GAAMle,UAAU8V,IAlChB,SAAkBtB,GAChB,OAAOzV,KAAKif,SAASlI,IAAItB,IAkC3B0J,GAAMle,UAAUpC,IArBhB,SAAkB4W,EAAKpK,GACrB,IAAI+T,EAAOpf,KAAKif,SAChB,GAAIG,aAAgBN,GAAW,CAC7B,IAAI8E,EAAQxE,EAAKH,SACjB,IAAK5C,IAAQuH,EAAM9iB,OAAS+iB,IAG1B,OAFAD,EAAMvgB,KAAK,CAACoS,EAAKpK,IACjBrL,KAAK4X,OAASwH,EAAKxH,KACZ5X,KAETof,EAAOpf,KAAKif,SAAW,IAAIF,GAAS6E,GAItC,OAFAxE,EAAKvgB,IAAI4W,EAAKpK,GACdrL,KAAK4X,KAAOwH,EAAKxH,KACV5X,MAscT,IAAI4gB,GAAWkD,GAAeC,IAU1BC,GAAgBF,GAAeG,IAAiB,GAWpD,SAASC,GAAU3O,EAAYnB,GAC7B,IAAI1M,GAAS,EAKb,OAJAkZ,GAASrL,GAAAA,SAAqBlK,EAAO2I,EAAOuB,GAE1C,OADA7N,IAAW0M,EAAU/I,EAAO2I,EAAOuB,MAG9B7N,EAaT,SAASyc,GAAavQ,EAAOE,EAAUY,GAIrC,IAHA,IAAIV,GAAS,EACTlT,EAAS8S,EAAM9S,SAEVkT,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdqC,EAAUvC,EAASzI,GAEvB,GAAe,MAAXgL,SA/0FNH,IA+0F0BsN,EACfnN,GAAYA,IAAY+N,GAAS/N,GAClC3B,EAAW2B,EAASmN,IAE1B,IAAIA,EAAWnN,EACX3O,EAAS2D,EAGjB,OAAO3D,EAuCT,SAAS2c,GAAW9O,EAAYnB,GAC9B,IAAI1M,EAAS,GAMb,OALAkZ,GAASrL,GAAAA,SAAqBlK,EAAO2I,EAAOuB,GACtCnB,EAAU/I,EAAO2I,EAAOuB,IAC1B7N,EAAOrE,KAAKgI,MAGT3D,EAcT,SAAS4c,GAAY1Q,EAAO2Q,EAAOnQ,EAAWoQ,EAAU9c,GACtD,IAAIsM,GAAS,EACTlT,EAAS8S,EAAM9S,OAKnB,IAHAsT,IAAcA,EAAYqQ,IAC1B/c,IAAWA,EAAS,MAEXsM,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACduQ,EAAQ,GAAKnQ,EAAU/I,GACrBkZ,EAAQ,EAEVD,GAAYjZ,EAAOkZ,EAAQ,EAAGnQ,EAAWoQ,EAAU9c,GAEnDmN,GAAUnN,EAAQ2D,GAEVmZ,IACV9c,EAAOA,EAAO5G,QAAUuK,GAG5B,OAAO3D,EAcT,IAAIgd,GAAUC,KAYVC,GAAeD,IAAc,GAUjC,SAASZ,GAAW9N,EAAQnC,GAC1B,OAAOmC,GAAUyO,GAAQzO,EAAQnC,EAAUzU,IAW7C,SAAS4kB,GAAgBhO,EAAQnC,GAC/B,OAAOmC,GAAU2O,GAAa3O,EAAQnC,EAAUzU,IAYlD,SAASwlB,GAAc5O,EAAQW,GAC7B,OAAOvC,GAAYuC,GAAAA,SAAgBnB,GACjC,OAAOqP,GAAW7O,EAAOR,OAY7B,SAASsP,GAAQ9O,EAAQ/X,GAMvB,IAHA,IAAI8V,EAAQ,EACRlT,GAHJ5C,EAAO8mB,GAAS9mB,EAAM+X,IAGJnV,OAED,MAAVmV,GAAkBjC,EAAQlT,GAC/BmV,EAASA,EAAOgP,GAAM/mB,EAAK8V,OAE7B,OAAQA,GAASA,GAASlT,EAAUmV,OA3/FpCC,EAygGF,SAASgP,GAAejP,EAAQkP,EAAUC,GACxC,IAAI1d,EAASyd,EAASlP,GACtB,OAAOuH,GAAQvH,GAAUvO,EAASmN,GAAUnN,EAAQ0d,EAAYnP,IAUlE,SAASoP,GAAWha,GAClB,OAAa,MAATA,OAthGJ6K,IAuhGS7K,EAn7FM,qBARL,gBA67FFgP,IAAkBA,MAAkBjb,GAAOiM,GA23FrD,SAAmBA,GACjB,IAAIia,EAAQtM,GAAetF,KAAKrI,EAAOgP,IACnCwH,EAAMxW,EAAMgP,IAEhB,IACEhP,EAAMgP,SAz5LRnE,EA05LE,IAAIqP,GAAW,EACf,MAAO9S,IAET,IAAI/K,EAAS0R,GAAqB1F,KAAKrI,GAQvC,OAPIka,IACED,EACFja,EAAMgP,IAAkBwH,SAEjBxW,EAAMgP,KAGV3S,EAjBT,CA13FgB2D,GA+5GhB,SAAwBA,GACtB,OAAO+N,GAAqB1F,KAAKrI,GADnC,CA95GqBA,GAYrB,SAASma,GAAOna,EAAOoa,GACrB,OAAOpa,EAAQoa,EAWjB,SAASC,GAAQzP,EAAQR,GACvB,OAAiB,MAAVQ,GAAkB+C,GAAetF,KAAKuC,EAAQR,GAWvD,SAASkQ,GAAU1P,EAAQR,GACzB,OAAiB,MAAVQ,GAAkBR,KAAOrW,GAAO6W,GA0BzC,SAAS2P,GAAiBC,EAAQ/R,EAAUY,GAS1C,IARA,IAAI0O,EAAW1O,EAAaD,GAAoBF,GAC5CzT,EAAS+kB,EAAO,GAAG/kB,OACnBglB,EAAYD,EAAO/kB,OACnBilB,EAAWD,EACXE,EAASpR,EAAMkR,GACfG,EAAYC,EAAAA,EACZxe,EAAS,GAENqe,KAAY,CACjB,IAAInS,EAAQiS,EAAOE,GACfA,GAAYjS,IACdF,EAAQe,GAASf,EAAO8C,GAAU5C,KAEpCmS,EAAYpK,GAAUjI,EAAM9S,OAAQmlB,GACpCD,EAAOD,IAAarR,IAAeZ,GAAahT,GAAU,KAAO8S,EAAM9S,QAAU,KAC7E,IAAIke,GAAS+G,GAAYnS,QA1mG/BsC,EA6mGAtC,EAAQiS,EAAO,GAEf,IAAI7R,GAAS,EACTmS,EAAOH,EAAO,GAElBzC,EACA,OAASvP,EAAQlT,GAAU4G,EAAO5G,OAASmlB,GAAW,CACpD,IAAI5a,EAAQuI,EAAMI,GACdwP,EAAW1P,EAAWA,EAASzI,GAASA,EAG5C,GADAA,EAASqJ,GAAwB,IAAVrJ,EAAeA,EAAQ,IACxC8a,EACEtP,GAASsP,EAAM3C,GACfJ,EAAS1b,EAAQ8b,EAAU9O,IAC5B,CAEL,IADAqR,EAAWD,IACFC,GAAU,CACjB,IAAIjP,EAAQkP,EAAOD,GACnB,KAAMjP,EACED,GAASC,EAAO0M,GAChBJ,EAASyC,EAAOE,GAAWvC,EAAU9O,IAE3C,SAAS6O,EAGT4C,GACFA,EAAK9iB,KAAKmgB,GAEZ9b,EAAOrE,KAAKgI,IAGhB,OAAO3D,EA+BT,SAAS0e,GAAWnQ,EAAQ/X,EAAMuV,GAGhC,IAAIF,EAAiB,OADrB0C,EAASoQ,GAAOpQ,EADhB/X,EAAO8mB,GAAS9mB,EAAM+X,KAEMA,EAASA,EAAOgP,GAAMqB,GAAKpoB,KACvD,OAAe,MAARqV,OA/qGP2C,EA+qGkC5C,GAAMC,EAAM0C,EAAQxC,GAUxD,SAAS8S,GAAgBlb,GACvB,OAAOkS,GAAalS,IAAUga,GAAWha,IAAUQ,EAuCrD,SAAS2a,GAAYnb,EAAOoa,EAAOnE,EAASC,EAAYC,GACtD,OAAInW,IAAUoa,IAGD,MAATpa,GAA0B,MAAToa,IAAmBlI,GAAalS,KAAWkS,GAAakI,GACpEpa,GAAUA,GAASoa,GAAUA,EAmBxC,SAAyBxP,EAAQwP,EAAOnE,EAASC,EAAYkF,EAAWjF,GACtE,IAAIkF,EAAWlJ,GAAQvH,GACnB0Q,EAAWnJ,GAAQiI,GACnBmB,EAASF,EAAW5a,EAAWgW,GAAO7L,GACtC4Q,EAASF,EAAW7a,EAAWgW,GAAO2D,GAKtCqB,GAHJF,EAASA,GAAU/a,EAAUS,EAAYsa,IAGhBta,EACrBya,GAHJF,EAASA,GAAUhb,EAAUS,EAAYua,IAGhBva,EACrB0a,EAAYJ,GAAUC,EAE1B,GAAIG,GAAa1L,GAASrF,GAAS,CACjC,IAAKqF,GAASmK,GACZ,OAAO,EAETiB,GAAW,EACXI,GAAW,EAEb,GAAIE,IAAcF,EAEhB,OADAtF,IAAUA,EAAQ,IAAIrC,IACduH,GAAYrT,GAAa4C,GAC7BgR,GAAYhR,EAAQwP,EAAOnE,EAASC,EAAYkF,EAAWjF,GA81EnE,SAAoBvL,EAAQwP,EAAO5D,EAAKP,EAASC,EAAYkF,EAAWjF,GACtE,OAAQK,GACN,KAAKhV,EACH,GAAKoJ,EAAOyM,YAAc+C,EAAM/C,YAC3BzM,EAAOwM,YAAcgD,EAAMhD,WAC9B,OAAO,EAETxM,EAASA,EAAOuM,OAChBiD,EAAQA,EAAMjD,OAEhB,KAAK5V,EACH,QAAKqJ,EAAOyM,YAAc+C,EAAM/C,aAC3B+D,EAAU,IAAI/M,GAAWzD,GAAS,IAAIyD,GAAW+L,KAKxD,KAAK1Z,EACL,KAAKC,EACL,KAAKK,EAGH,OAAOiU,IAAIrK,GAASwP,GAEtB,KAAKxZ,EACH,OAAOgK,EAAOxL,MAAQgb,EAAMhb,MAAQwL,EAAOiR,SAAWzB,EAAMyB,QAE9D,KAAK3a,EACL,KAAKE,EAIH,OAAOwJ,GAAWwP,EAAQ,GAE5B,KAAKrZ,EACH,IAAI+a,EAAUxP,GAEhB,KAAKnL,EAIH,GAFA2a,IAAYA,EAAUnP,IAElB/B,EAAO2B,MAAQ6N,EAAM7N,QA3nLN,EAwnLH0J,GAId,OAAO,EAGT,IAAIsB,EAAUpB,EAAMP,IAAIhL,GACxB,GAAI2M,EACF,OAAOA,GAAW6C,EAEpBnE,GAloLqB,EAqoLrBE,EAAM3iB,IAAIoX,EAAQwP,GAClB,IAAI/d,EAASuf,GAAYE,EAAQlR,GAASkR,EAAQ1B,GAAQnE,EAASC,EAAYkF,EAAWjF,GAE1F,OADAA,EAAc,OAAEvL,GACTvO,EAET,KAAKgF,EACH,GAAIyQ,GACF,OAAOA,GAAczJ,KAAKuC,IAAWkH,GAAczJ,KAAK+R,GAG9D,OAAO,EA9DT,CA71EmBxP,EAAQwP,EAAOmB,EAAQtF,EAASC,EAAYkF,EAAWjF,GAExE,KAvvGuB,EAuvGjBF,GAAiC,CACrC,IAAI8F,EAAeN,GAAY9N,GAAetF,KAAKuC,EAAQ,eACvDoR,EAAeN,GAAY/N,GAAetF,KAAK+R,EAAO,eAE1D,GAAI2B,GAAgBC,EAAc,CAChC,IAAIC,EAAeF,EAAenR,EAAO5K,QAAU4K,EAC/CsR,EAAeF,EAAe5B,EAAMpa,QAAUoa,EAGlD,OADAjE,IAAUA,EAAQ,IAAIrC,IACfsH,EAAUa,EAAcC,EAAcjG,EAASC,EAAYC,IAGtE,QAAKwF,IAGLxF,IAAUA,EAAQ,IAAIrC,IA05ExB,SAAsBlJ,EAAQwP,EAAOnE,EAASC,EAAYkF,EAAWjF,GACnE,IAAIgG,EAjqLmB,EAiqLPlG,EACZmG,EAAW1E,GAAW9M,GACtByR,EAAYD,EAAS3mB,OAIzB,GAAI4mB,GAHW3E,GAAW0C,GACD3kB,SAEM0mB,EAC7B,OAAO,EAGT,IADA,IAAIxT,EAAQ0T,EACL1T,KAAS,CACd,IAAIyB,EAAMgS,EAASzT,GACnB,KAAMwT,EAAY/R,KAAOgQ,EAAQzM,GAAetF,KAAK+R,EAAOhQ,IAC1D,OAAO,EAIX,IAAIkS,EAAanG,EAAMP,IAAIhL,GACvB2R,EAAapG,EAAMP,IAAIwE,GAC3B,GAAIkC,GAAcC,EAChB,OAAOD,GAAclC,GAASmC,GAAc3R,EAE9C,IAAIvO,GAAS,EACb8Z,EAAM3iB,IAAIoX,EAAQwP,GAClBjE,EAAM3iB,IAAI4mB,EAAOxP,GAGjB,IADA,IAAI4R,EAAWL,IACNxT,EAAQ0T,GAAW,CAE1B,IAAIjH,EAAWxK,EADfR,EAAMgS,EAASzT,IAEX8T,EAAWrC,EAAMhQ,GAErB,GAAI8L,EACF,IAAIwG,EAAWP,EACXjG,EAAWuG,EAAUrH,EAAUhL,EAAKgQ,EAAOxP,EAAQuL,GACnDD,EAAWd,EAAUqH,EAAUrS,EAAKQ,EAAQwP,EAAOjE,GAGzD,UAnuLFtL,IAmuLQ6R,EACGtH,IAAaqH,GAAYrB,EAAUhG,EAAUqH,EAAUxG,EAASC,EAAYC,GAC7EuG,GACD,CACLrgB,GAAS,EACT,MAEFmgB,IAAaA,EAAkB,eAAPpS,GAE1B,GAAI/N,IAAWmgB,EAAU,CACvB,IAAIG,EAAU/R,EAAO7K,YACjB6c,EAAUxC,EAAMra,YAGhB4c,GAAWC,KACV,gBAAiBhS,MAAU,gBAAiBwP,IACzB,mBAAXuC,GAAyBA,aAAmBA,GACjC,mBAAXC,GAAyBA,aAAmBA,IACvDvgB,GAAS,GAKb,OAFA8Z,EAAc,OAAEvL,GAChBuL,EAAc,OAAEiE,GACT/d,EA9DT,CAz5EsBuO,EAAQwP,EAAOnE,EAASC,EAAYkF,EAAWjF,IA1CrE,CAjByBnW,EAAOoa,EAAOnE,EAASC,EAAYiF,GAAahF,IAmFzE,SAAS0G,GAAYjS,EAAQrI,EAAQua,EAAW5G,GAC9C,IAAIvN,EAAQmU,EAAUrnB,OAClBA,EAASkT,EACToU,GAAgB7G,EAEpB,GAAc,MAAVtL,EACF,OAAQnV,EAGV,IADAmV,EAAS7W,GAAO6W,GACTjC,KAAS,CACd,IAAIoL,EAAO+I,EAAUnU,GACrB,GAAKoU,GAAgBhJ,EAAK,GAClBA,EAAK,KAAOnJ,EAAOmJ,EAAK,MACtBA,EAAK,KAAMnJ,GAEnB,OAAO,EAGX,OAASjC,EAAQlT,GAAQ,CAEvB,IAAI2U,GADJ2J,EAAO+I,EAAUnU,IACF,GACXyM,EAAWxK,EAAOR,GAClB4S,EAAWjJ,EAAK,GAEpB,GAAIgJ,GAAgBhJ,EAAK,GAAA,CACvB,QAp1GJlJ,IAo1GQuK,KAA4BhL,KAAOQ,GACrC,OAAO,MAEJ,CACL,IAAIuL,EAAQ,IAAIrC,GAChB,GAAIoC,EACF,IAAI7Z,EAAS6Z,EAAWd,EAAU4H,EAAU5S,EAAKQ,EAAQrI,EAAQ4T,GAEnE,UA51GJtL,IA41GUxO,EACE8e,GAAY6B,EAAU5H,EAAU6H,EAA+C/G,EAAYC,GAC3F9Z,GAEN,OAAO,GAIb,OAAO,EAWT,SAAS6gB,GAAald,GACpB,SAAKhB,GAASgB,KA05FEkI,EA15FiBlI,EA25FxB6N,IAAeA,MAAc3F,MAx5FxBuR,GAAWzZ,GAASkO,GAAarK,IAChCtG,KAAKiU,GAASxR,IAs5F/B,IAAkBkI,EA12FlB,SAASiV,GAAand,GAGpB,MAAoB,mBAATA,EACFA,EAEI,MAATA,EACKod,GAEW,iBAATpd,EACFmS,GAAQnS,GACXqd,GAAoBrd,EAAM,GAAIA,EAAM,IACpCsd,GAAYtd,GAEXud,GAASvd,GAUlB,SAASwd,GAAS5S,GAChB,IAAK6S,GAAY7S,GACf,OAAOyF,GAAWzF,GAEpB,IAAIvO,EAAS,GACb,IAAK,IAAI+N,KAAOrW,GAAO6W,GACjB+C,GAAetF,KAAKuC,EAAQR,IAAe,eAAPA,GACtC/N,EAAOrE,KAAKoS,GAGhB,OAAO/N,EAkCT,SAASqhB,GAAO1d,EAAOoa,GACrB,OAAOpa,EAAQoa,EAWjB,SAASuD,GAAQzT,EAAYzB,GAC3B,IAAIE,GAAS,EACTtM,EAASuhB,GAAY1T,GAAcX,EAAMW,EAAWzU,QAAU,GAKlE,OAHA8f,GAASrL,GAAAA,SAAqBlK,EAAOoK,EAAKF,GACxC7N,IAASsM,GAASF,EAASzI,EAAOoK,EAAKF,MAElC7N,EAUT,SAASihB,GAAY/a,GACnB,IAAIua,EAAYe,GAAatb,GAC7B,OAAwB,GAApBua,EAAUrnB,QAAeqnB,EAAU,GAAG,GACjCgB,GAAwBhB,EAAU,GAAG,GAAIA,EAAU,GAAG,IAExD,SAASlS,GACd,OAAOA,IAAWrI,GAAUsa,GAAYjS,EAAQrI,EAAQua,IAY5D,SAASO,GAAoBxqB,EAAMmqB,GACjC,OAAIe,GAAMlrB,IAASmrB,GAAmBhB,GAC7Bc,GAAwBlE,GAAM/mB,GAAOmqB,GAEvC,SAASpS,GACd,IAAIwK,EAAWQ,GAAIhL,EAAQ/X,GAC3B,YAzhHFgY,IAyhHUuK,GAA0BA,IAAa4H,EAC3CiB,GAAMrT,EAAQ/X,GACdsoB,GAAY6B,EAAU5H,EAAU6H,IAexC,SAASiB,GAAUtT,EAAQrI,EAAQ4b,EAAUjI,EAAYC,GACnDvL,IAAWrI,GAGf8W,GAAQ9W,GAAAA,SAAiBya,EAAU5S,GAEjC,GADA+L,IAAUA,EAAQ,IAAIrC,IAClB9U,GAASge,IA+BjB,SAAuBpS,EAAQrI,EAAQ6H,EAAK+T,EAAUC,EAAWlI,EAAYC,GAC3E,IAAIf,EAAWiJ,GAAQzT,EAAQR,GAC3B4S,EAAWqB,GAAQ9b,EAAQ6H,GAC3BmN,EAAUpB,EAAMP,IAAIoH,GAExB,GAAIzF,EACFvC,GAAiBpK,EAAQR,EAAKmN,OADhC,CAIA,IAAI+G,EAAWpI,EACXA,EAAWd,EAAU4H,EAAW5S,EAAM,GAAKQ,EAAQrI,EAAQ4T,QAzlH/DtL,EA4lHImN,OA5lHJnN,IA4lHeyT,EAEf,GAAItG,EAAU,CACZ,IAAI9D,EAAQ/B,GAAQ6K,GAChB3I,GAAUH,GAASjE,GAAS+M,GAC5BuB,GAAWrK,IAAUG,GAAUrM,GAAagV,GAEhDsB,EAAWtB,EACP9I,GAASG,GAAUkK,EACjBpM,GAAQiD,GACVkJ,EAAWlJ,EAEJoJ,GAAkBpJ,GACzBkJ,EAAWzJ,GAAUO,GAEdf,GACP2D,GAAW,EACXsG,EAAW3H,GAAYqG,GAAU,IAE1BuB,GACPvG,GAAW,EACXsG,EAAWhH,GAAgB0F,GAAU,IAGrCsB,EAAW,GAGNG,GAAczB,IAAa5I,GAAY4I,IAC9CsB,EAAWlJ,EACPhB,GAAYgB,GACdkJ,EAAWI,GAActJ,GAEjBpW,GAASoW,KAAaqE,GAAWrE,KACzCkJ,EAAW1H,GAAgBoG,KAI7BhF,GAAW,EAGXA,IAEF7B,EAAM3iB,IAAIwpB,EAAUsB,GACpBF,EAAUE,EAAUtB,EAAUmB,EAAUjI,EAAYC,GACpDA,EAAc,OAAE6G,IAElBhI,GAAiBpK,EAAQR,EAAKkU,IA3DhC,CA9BoB1T,EAAQrI,EAAQ6H,EAAK+T,EAAUD,GAAWhI,EAAYC,OAEjE,CACH,IAAImI,EAAWpI,EACXA,EAAWmI,GAAQzT,EAAQR,GAAM4S,EAAW5S,EAAM,GAAKQ,EAAQrI,EAAQ4T,QArjH/EtL,OAAAA,IAwjHQyT,IACFA,EAAWtB,GAEbhI,GAAiBpK,EAAQR,EAAKkU,MAE/BxH,IAwFL,SAAS6H,GAAQpW,EAAOpP,GACtB,IAAI1D,EAAS8S,EAAM9S,OACnB,GAAKA,EAIL,OAAO+e,GADPrb,GAAKA,EAAI,EAAI1D,EAAS,EACJA,GAAU8S,EAAMpP,QA3pHlC0R,EAuqHF,SAAS+T,GAAY1U,EAAY2U,EAAWC,GAExCD,EADEA,EAAUppB,OACA6T,GAASuV,GAAAA,SAAoBpW,GACvC,OAAI0J,GAAQ1J,GACH,SAASzI,GACd,OAAO0Z,GAAQ1Z,EAA2B,IAApByI,EAAShT,OAAegT,EAAS,GAAKA,IAGzDA,KAGG,CAAC2U,IAGf,IAAIzU,GAAS,EAUb,OATAkW,EAAYvV,GAASuV,EAAWxT,GAAU0T,OAnxF9C,SAAoBxW,EAAOyW,GACzB,IAAIvpB,EAAS8S,EAAM9S,OAGnB,IADA8S,EAAM0W,MAAAA,SAyxF+BrU,EAAQwP,GACzC,OA04BJ,SAAyBxP,EAAQwP,EAAO0E,GAOtC,IANA,IAAInW,GAAS,EACTuW,EAActU,EAAOuU,SACrBC,EAAchF,EAAM+E,SACpB1pB,EAASypB,EAAYzpB,OACrB4pB,EAAeP,EAAOrpB,SAEjBkT,EAAQlT,GAAQ,CACvB,IAAI4G,EAASijB,GAAiBJ,EAAYvW,GAAQyW,EAAYzW,IAC9D,GAAItM,EACF,OAAIsM,GAAS0W,EACJhjB,EAGFA,GAAmB,QADdyiB,EAAOnW,IACiB,EAAI,GAU5C,OAAOiC,EAAOjC,MAAQyR,EAAMzR,MAxB9B,CA14B2BiC,EAAQwP,EAAO0E,MAzxFnCrpB,KACL8S,EAAM9S,GAAU8S,EAAM9S,GAAQuK,MAEhC,OAAOuI,EAPT,CAqxFiBoV,GAAQzT,GAAAA,SAAqBlK,EAAOoK,EAAKF,GAIpD,MAAO,CAAE,SAHMZ,GAASuV,GAAAA,SAAoBpW,GAC1C,OAAOA,EAASzI,MAEa,QAAW2I,EAAO,MAAS3I,OAgC9D,SAASuf,GAAW3U,EAAQpN,EAAOuL,GAKjC,IAJA,IAAIJ,GAAS,EACTlT,EAAS+H,EAAM/H,OACf4G,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAI5C,EAAO2K,EAAMmL,GACb3I,EAAQ0Z,GAAQ9O,EAAQ/X,GAExBkW,EAAU/I,EAAOnN,IACnB2sB,GAAQnjB,EAAQsd,GAAS9mB,EAAM+X,GAAS5K,GAG5C,OAAO3D,EA2BT,SAASojB,GAAYlX,EAAOkB,EAAQhB,EAAUY,GAC5C,IAAI7S,EAAU6S,EAAaoB,GAAkBtB,GACzCR,GAAS,EACTlT,EAASgU,EAAOhU,OAChBqlB,EAAOvS,EAQX,IANIA,IAAUkB,IACZA,EAASoL,GAAUpL,IAEjBhB,IACFqS,EAAOxR,GAASf,EAAO8C,GAAU5C,OAE1BE,EAAQlT,GAKf,IAJA,IAAI6U,EAAY,EACZtK,EAAQyJ,EAAOd,GACfwP,EAAW1P,EAAWA,EAASzI,GAASA,GAEpCsK,EAAY9T,EAAQskB,EAAM3C,EAAU7N,EAAWjB,KAAgB,GACjEyR,IAASvS,GACXoG,GAAOtG,KAAKyS,EAAMxQ,EAAW,GAE/BqE,GAAOtG,KAAKE,EAAO+B,EAAW,GAGlC,OAAO/B,EAYT,SAASmX,GAAWnX,EAAOoX,GAIzB,IAHA,IAAIlqB,EAAS8S,EAAQoX,EAAQlqB,OAAS,EAClCsG,EAAYtG,EAAS,EAElBA,KAAU,CACf,IAAIkT,EAAQgX,EAAQlqB,GACpB,GAAIA,GAAUsG,GAAa4M,IAAUiX,EAAU,CAC7C,IAAIA,EAAWjX,EACX6L,GAAQ7L,GACVgG,GAAOtG,KAAKE,EAAOI,EAAO,GAE1BkX,GAAUtX,EAAOI,IAIvB,OAAOJ,EAYT,SAASmM,GAAWoB,EAAOC,GACzB,OAAOD,EAAQlG,GAAYe,MAAkBoF,EAAQD,EAAQ,IAkC/D,SAASgK,GAAW3U,EAAQhS,GAC1B,IAAIkD,EAAS,GACb,IAAK8O,GAAUhS,EAAI,GAAKA,EA9yHL,iBA+yHjB,OAAOkD,EAIT,EAAA,CACMlD,EAAI,IACNkD,GAAU8O,IAEZhS,EAAIyW,GAAYzW,EAAI,MAElBgS,GAAUA,SAELhS,GAET,OAAOkD,EAWT,SAAS0jB,GAAS7X,EAAMhQ,GACtB,OAAO8nB,GAAYC,GAAS/X,EAAMhQ,EAAOklB,IAAWlV,EAAO,IAU7D,SAASgY,GAAWhW,GAClB,OAAOuK,GAAYhL,GAAOS,IAW5B,SAASiW,GAAejW,EAAY/Q,GAClC,IAAIoP,EAAQkB,GAAOS,GACnB,OAAO0K,GAAYrM,EAAOuM,GAAU3b,EAAG,EAAGoP,EAAM9S,SAalD,SAAS+pB,GAAQ5U,EAAQ/X,EAAMmN,EAAOkW,GACpC,IAAKlX,GAAS4L,GACZ,OAAOA,EAST,IALA,IAAIjC,GAAS,EACTlT,GAHJ5C,EAAO8mB,GAAS9mB,EAAM+X,IAGJnV,OACdsG,EAAYtG,EAAS,EACrB2qB,EAASxV,EAEI,MAAVwV,KAAoBzX,EAAQlT,GAAQ,CACzC,IAAI2U,EAAMwP,GAAM/mB,EAAK8V,IACjB2V,EAAWte,EAEf,GAAY,cAARoK,GAA+B,gBAARA,GAAiC,cAARA,EAClD,OAAOQ,EAGT,GAAIjC,GAAS5M,EAAW,CACtB,IAAIqZ,EAAWgL,EAAOhW,QA57H1BS,KA67HIyT,EAAWpI,EAAaA,EAAWd,EAAUhL,EAAKgW,QA77HtDvV,KA+7HMyT,EAAWtf,GAASoW,GAChBA,EACCZ,GAAQ3hB,EAAK8V,EAAQ,IAAM,GAAK,IAGzCwM,GAAYiL,EAAQhW,EAAKkU,GACzB8B,EAASA,EAAOhW,GAElB,OAAOQ,EAWT,IAAIyV,GAAehP,GAAqB,SAASnJ,EAAM6L,GAErD,OADA1C,GAAQ7d,IAAI0U,EAAM6L,GACX7L,GAFoBkV,GAazBkD,GAAmBpR,GAA4B,SAAShH,EAAMiD,GAChE,OAAO+D,GAAehH,EAAM,WAAY,CACtC,cAAgB,EAChB,YAAc,EACd,MAASqY,GAASpV,GAClB,UAAY,KALwBiS,GAgBxC,SAASoD,GAAYtW,GACnB,OAAO0K,GAAYnL,GAAOS,IAY5B,SAASuW,GAAUlY,EAAOrQ,EAAO8D,GAC/B,IAAI2M,GAAS,EACTlT,EAAS8S,EAAM9S,OAEfyC,EAAQ,IACVA,GAASA,EAAQzC,EAAS,EAAKA,EAASyC,IAE1C8D,EAAMA,EAAMvG,EAASA,EAASuG,GACpB,IACRA,GAAOvG,GAETA,EAASyC,EAAQ8D,EAAM,EAAMA,EAAM9D,IAAW,EAC9CA,KAAW,EAGX,IADA,IAAImE,EAASkN,EAAM9T,KACVkT,EAAQlT,GACf4G,EAAOsM,GAASJ,EAAMI,EAAQzQ,GAEhC,OAAOmE,EAYT,SAASqkB,GAASxW,EAAYnB,GAC5B,IAAI1M,EAMJ,OAJAkZ,GAASrL,GAAAA,SAAqBlK,EAAO2I,EAAOuB,GAE1C,QADA7N,EAAS0M,EAAU/I,EAAO2I,EAAOuB,SAG1B7N,EAeX,SAASskB,GAAgBpY,EAAOvI,EAAO4gB,GACrC,IAAIC,EAAM,EACNC,EAAgB,MAATvY,EAAgBsY,EAAMtY,EAAM9S,OAEvC,GAAoB,iBAATuK,GAAqBA,GAAUA,GAAS8gB,GAn/H3BC,WAm/H0D,CAChF,KAAOF,EAAMC,GAAM,CACjB,IAAIE,EAAOH,EAAMC,IAAU,EACvB3I,EAAW5P,EAAMyY,GAEJ,OAAb7I,IAAsBY,GAASZ,KAC9ByI,EAAczI,GAAYnY,EAAUmY,EAAWnY,GAClD6gB,EAAMG,EAAM,EAEZF,EAAOE,EAGX,OAAOF,EAET,OAAOG,GAAkB1Y,EAAOvI,EAAOod,GAAUwD,GAgBnD,SAASK,GAAkB1Y,EAAOvI,EAAOyI,EAAUmY,GACjD,IAAIC,EAAM,EACNC,EAAgB,MAATvY,EAAgB,EAAIA,EAAM9S,OACrC,GAAa,IAATqrB,EACF,OAAO,EAST,IALA,IAAII,GADJlhB,EAAQyI,EAASzI,KACQA,EACrBmhB,EAAsB,OAAVnhB,EACZohB,EAAcrI,GAAS/Y,GACvBqhB,OA7lIJxW,IA6lIqB7K,EAEd6gB,EAAMC,GAAM,CACjB,IAAIE,EAAMpR,IAAaiR,EAAMC,GAAQ,GACjC3I,EAAW1P,EAASF,EAAMyY,IAC1BM,OAlmINzW,IAkmIqBsN,EACfoJ,EAAyB,OAAbpJ,EACZqJ,EAAiBrJ,GAAaA,EAC9BsJ,EAAc1I,GAASZ,GAE3B,GAAI+I,EACF,IAAIQ,EAASd,GAAcY,OAE3BE,EADSL,EACAG,IAAmBZ,GAAcU,GACjCH,EACAK,GAAkBF,IAAiBV,IAAeW,GAClDH,EACAI,GAAkBF,IAAiBC,IAAcX,IAAea,IAChEF,IAAaE,IAGbb,EAAczI,GAAYnY,EAAUmY,EAAWnY,GAEtD0hB,EACFb,EAAMG,EAAM,EAEZF,EAAOE,EAGX,OAAOxQ,GAAUsQ,EA1jICC,YAskIpB,SAASY,GAAepZ,EAAOE,GAM7B,IALA,IAAIE,GAAS,EACTlT,EAAS8S,EAAM9S,OACfwT,EAAW,EACX5M,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdwP,EAAW1P,EAAWA,EAASzI,GAASA,EAE5C,IAAK2I,IAAUsM,GAAGkD,EAAU2C,GAAO,CACjC,IAAIA,EAAO3C,EACX9b,EAAO4M,KAAwB,IAAVjJ,EAAc,EAAIA,GAG3C,OAAO3D,EAWT,SAASulB,GAAa5hB,GACpB,MAAoB,iBAATA,EACFA,EAEL+Y,GAAS/Y,GAxmIP,KA2mIEA,EAWV,SAAS6hB,GAAa7hB,GAEpB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAImS,GAAQnS,GAEV,OAAOsJ,GAAStJ,EAAO6hB,IAAgB,GAEzC,GAAI9I,GAAS/Y,GACX,OAAOgS,GAAiBA,GAAe3J,KAAKrI,GAAS,GAEvD,IAAI3D,EAAU2D,EAAQ,GACtB,MAAkB,KAAV3D,GAAkB,EAAI2D,IAAU,EAAA,EAAa,KAAO3D,EAY9D,SAASylB,GAASvZ,EAAOE,EAAUY,GACjC,IAAIV,GAAS,EACToP,EAAW7O,GACXzT,EAAS8S,EAAM9S,OACfuiB,GAAW,EACX3b,EAAS,GACTye,EAAOze,EAEX,GAAIgN,EACF2O,GAAW,EACXD,EAAW3O,QAER,GAAI3T,GAjtIU,IAitIkB,CACnC,IAAIjC,EAAMiV,EAAW,KAAOsZ,GAAUxZ,GACtC,GAAI/U,EACF,OAAOmZ,GAAWnZ,GAEpBwkB,GAAW,EACXD,EAAWvM,GACXsP,EAAO,IAAInH,QAGXmH,EAAOrS,EAAW,GAAKpM,EAEzB6b,EACA,OAASvP,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdwP,EAAW1P,EAAWA,EAASzI,GAASA,EAG5C,GADAA,EAASqJ,GAAwB,IAAVrJ,EAAeA,EAAQ,EAC1CgY,GAAYG,GAAaA,EAAU,CAErC,IADA,IAAI6J,EAAYlH,EAAKrlB,OACdusB,KACL,GAAIlH,EAAKkH,KAAe7J,EACtB,SAASD,EAGTzP,GACFqS,EAAK9iB,KAAKmgB,GAEZ9b,EAAOrE,KAAKgI,QAEJ+X,EAAS+C,EAAM3C,EAAU9O,KAC7ByR,IAASze,GACXye,EAAK9iB,KAAKmgB,GAEZ9b,EAAOrE,KAAKgI,IAGhB,OAAO3D,EAWT,SAASwjB,GAAUjV,EAAQ/X,GAGzB,OAAiB,OADjB+X,EAASoQ,GAAOpQ,EADhB/X,EAAO8mB,GAAS9mB,EAAM+X,aAEUA,EAAOgP,GAAMqB,GAAKpoB,KAapD,SAASovB,GAAWrX,EAAQ/X,EAAMqvB,EAAShM,GACzC,OAAOsJ,GAAQ5U,EAAQ/X,EAAMqvB,EAAQxI,GAAQ9O,EAAQ/X,IAAQqjB,GAc/D,SAASiM,GAAU5Z,EAAOQ,EAAWqZ,EAAQ7X,GAI3C,IAHA,IAAI9U,EAAS8S,EAAM9S,OACfkT,EAAQ4B,EAAY9U,GAAU,GAE1B8U,EAAY5B,MAAYA,EAAQlT,IACtCsT,EAAUR,EAAMI,GAAQA,EAAOJ,KAEjC,OAAO6Z,EACH3B,GAAUlY,EAAQgC,EAAY,EAAI5B,EAAS4B,EAAY5B,EAAQ,EAAIlT,GACnEgrB,GAAUlY,EAAQgC,EAAY5B,EAAQ,EAAI,EAAK4B,EAAY9U,EAASkT,GAa1E,SAAS0Z,GAAiBriB,EAAOsiB,GAC/B,IAAIjmB,EAAS2D,EAIb,OAHI3D,aAAkB+V,KACpB/V,EAASA,EAAO2D,SAEX2J,GAAY2Y,GAAAA,SAAkBjmB,EAAQkmB,GAC3C,OAAOA,EAAOra,KAAKD,MAAMsa,EAAOpa,QAASqB,GAAU,CAACnN,GAASkmB,EAAOna,SACnE/L,GAaL,SAASmmB,GAAQhI,EAAQ/R,EAAUY,GACjC,IAAI5T,EAAS+kB,EAAO/kB,OACpB,GAAIA,EAAS,EACX,OAAOA,EAASqsB,GAAStH,EAAO,IAAM,GAKxC,IAHA,IAAI7R,GAAS,EACTtM,EAASkN,EAAM9T,KAEVkT,EAAQlT,GAIf,IAHA,IAAI8S,EAAQiS,EAAO7R,GACf+R,GAAY,IAEPA,EAAWjlB,GACdilB,GAAY/R,IACdtM,EAAOsM,GAASmP,GAAezb,EAAOsM,IAAUJ,EAAOiS,EAAOE,GAAWjS,EAAUY,IAIzF,OAAOyY,GAAS7I,GAAY5c,EAAQ,GAAIoM,EAAUY,GAYpD,SAASoZ,GAAclX,EAAO9B,EAAQiZ,GAMpC,IALA,IAAI/Z,GAAS,EACTlT,EAAS8V,EAAM9V,OACfktB,EAAalZ,EAAOhU,OACpB4G,EAAS,KAEJsM,EAAQlT,GAEfitB,EAAWrmB,EAAQkP,EAAM5C,GADbA,EAAQga,EAAalZ,EAAOd,QAr3I1CkC,GAw3IA,OAAOxO,EAUT,SAASumB,GAAoB5iB,GAC3B,OAAOwe,GAAkBxe,GAASA,EAAQ,GAU5C,SAAS6iB,GAAa7iB,GACpB,MAAuB,mBAATA,EAAsBA,EAAQod,GAW9C,SAASzD,GAAS3Z,EAAO4K,GACvB,OAAIuH,GAAQnS,GACHA,EAEF+d,GAAM/d,EAAO4K,GAAU,CAAC5K,GAAS8iB,GAAapV,GAAS1N,IAYhE,IAAI+iB,GAAWhD,GAWf,SAASiD,GAAUza,EAAOrQ,EAAO8D,GAC/B,IAAIvG,EAAS8S,EAAM9S,OAEnB,OADAuG,OAt7IA6O,IAs7IM7O,EAAoBvG,EAASuG,GAC1B9D,GAAS8D,GAAOvG,EAAU8S,EAAQkY,GAAUlY,EAAOrQ,EAAO8D,GASrE,IAAIqT,GAAeD,IAAmB,SAAS6T,GAC7C,OAAOvkB,GAAK2Q,aAAa4T,IAW3B,SAAStM,GAAYQ,EAAQf,GAC3B,GAAIA,EACF,OAAOe,EAAOte,QAEhB,IAAIpD,EAAS0hB,EAAO1hB,OAChB4G,EAASiS,GAAcA,GAAY7Y,GAAU,IAAI0hB,EAAOpX,YAAYtK,GAGxE,OADA0hB,EAAO3kB,KAAK6J,GACLA,EAUT,SAAS4a,GAAiBiM,GACxB,IAAI7mB,EAAS,IAAI6mB,EAAYnjB,YAAYmjB,EAAY7L,YAErD,OADA,IAAIhJ,GAAWhS,GAAQ7I,IAAI,IAAI6a,GAAW6U,IACnC7mB,EAgDT,SAASib,GAAgB6L,EAAY/M,GACnC,IAAIe,EAASf,EAASa,GAAiBkM,EAAWhM,QAAUgM,EAAWhM,OACvE,OAAO,IAAIgM,EAAWpjB,YAAYoX,EAAQgM,EAAW/L,WAAY+L,EAAW1tB,QAW9E,SAAS6pB,GAAiBtf,EAAOoa,GAC/B,GAAIpa,IAAUoa,EAAO,CACnB,IAAIgJ,OAhiJNvY,IAgiJqB7K,EACfmhB,EAAsB,OAAVnhB,EACZqjB,EAAiBrjB,GAAUA,EAC3BohB,EAAcrI,GAAS/Y,GAEvBshB,OAriJNzW,IAqiJqBuP,EACfmH,EAAsB,OAAVnH,EACZoH,EAAiBpH,GAAUA,EAC3BqH,EAAc1I,GAASqB,GAE3B,IAAMmH,IAAcE,IAAgBL,GAAephB,EAAQoa,GACtDgH,GAAeE,GAAgBE,IAAmBD,IAAcE,GAChEN,GAAaG,GAAgBE,IAC5B4B,GAAgB5B,IACjB6B,EACH,OAAO,EAET,IAAMlC,IAAcC,IAAgBK,GAAezhB,EAAQoa,GACtDqH,GAAe2B,GAAgBC,IAAmBlC,IAAcC,GAChEG,GAAa6B,GAAgBC,IAC5B/B,GAAgB+B,IACjB7B,EACH,OAAQ,EAGZ,OAAO,EAuDT,SAAS8B,GAAYlb,EAAMmb,EAAUC,EAASC,GAU5C,IATA,IAAIC,GAAa,EACbC,EAAavb,EAAK3S,OAClBmuB,EAAgBJ,EAAQ/tB,OACxBouB,GAAa,EACbC,EAAaP,EAAS9tB,OACtBsuB,EAAczT,GAAUqT,EAAaC,EAAe,GACpDvnB,EAASkN,EAAMua,EAAaC,GAC5BC,GAAeP,IAEVI,EAAYC,GACnBznB,EAAOwnB,GAAaN,EAASM,GAE/B,OAASH,EAAYE,IACfI,GAAeN,EAAYC,KAC7BtnB,EAAOmnB,EAAQE,IAActb,EAAKsb,IAGtC,KAAOK,KACL1nB,EAAOwnB,KAAezb,EAAKsb,KAE7B,OAAOrnB,EAcT,SAAS4nB,GAAiB7b,EAAMmb,EAAUC,EAASC,GAWjD,IAVA,IAAIC,GAAa,EACbC,EAAavb,EAAK3S,OAClByuB,GAAgB,EAChBN,EAAgBJ,EAAQ/tB,OACxB0uB,GAAc,EACdC,EAAcb,EAAS9tB,OACvBsuB,EAAczT,GAAUqT,EAAaC,EAAe,GACpDvnB,EAASkN,EAAMwa,EAAcK,GAC7BJ,GAAeP,IAEVC,EAAYK,GACnB1nB,EAAOqnB,GAAatb,EAAKsb,GAG3B,IADA,IAAIha,EAASga,IACJS,EAAaC,GACpB/nB,EAAOqN,EAASya,GAAcZ,EAASY,GAEzC,OAASD,EAAeN,IAClBI,GAAeN,EAAYC,KAC7BtnB,EAAOqN,EAAS8Z,EAAQU,IAAiB9b,EAAKsb,MAGlD,OAAOrnB,EAWT,SAASwY,GAAUtS,EAAQgG,GACzB,IAAII,GAAS,EACTlT,EAAS8M,EAAO9M,OAGpB,IADA8S,IAAUA,EAAQgB,EAAM9T,MACfkT,EAAQlT,GACf8S,EAAMI,GAASpG,EAAOoG,GAExB,OAAOJ,EAaT,SAASkN,GAAWlT,EAAQgJ,EAAOX,EAAQsL,GACzC,IAAImO,GAASzZ,EACbA,IAAWA,EAAS,IAKpB,IAHA,IAAIjC,GAAS,EACTlT,EAAS8V,EAAM9V,SAEVkT,EAAQlT,GAAQ,CACvB,IAAI2U,EAAMmB,EAAM5C,GAEZ2V,EAAWpI,EACXA,EAAWtL,EAAOR,GAAM7H,EAAO6H,GAAMA,EAAKQ,EAAQrI,QArtJxDsI,OAAAA,IAwtJMyT,IACFA,EAAW/b,EAAO6H,IAEhBia,EACFnP,GAAgBtK,EAAQR,EAAKkU,GAE7BnJ,GAAYvK,EAAQR,EAAKkU,GAG7B,OAAO1T,EAmCT,SAAS0Z,GAAiB9b,EAAQ+b,GAChC,OAAO,SAASra,EAAYzB,GAC1B,IAAIP,EAAOiK,GAAQjI,GAAc5B,GAAkBgN,GAC/C5M,EAAc6b,EAAcA,IAAgB,GAEhD,OAAOrc,EAAKgC,EAAY1B,EAAQuW,GAAYtW,EAAU,GAAIC,IAW9D,SAAS8b,GAAeC,GACtB,OAAO1E,IAAAA,SAAkBnV,EAAQ8Z,GAC/B,IAAI/b,GAAS,EACTlT,EAASivB,EAAQjvB,OACjBygB,EAAazgB,EAAS,EAAIivB,EAAQjvB,EAAS,QAxxJjDoV,EAyxJM8Z,EAAQlvB,EAAS,EAAIivB,EAAQ,QAzxJnC7Z,EAoyJE,IATAqL,EAAcuO,EAAShvB,OAAS,GAA0B,mBAAdygB,GACvCzgB,IAAUygB,QA5xJjBrL,EA+xJM8Z,GAASC,GAAeF,EAAQ,GAAIA,EAAQ,GAAIC,KAClDzO,EAAazgB,EAAS,OAhyJ1BoV,EAgyJ0CqL,EACtCzgB,EAAS,GAEXmV,EAAS7W,GAAO6W,KACPjC,EAAQlT,GAAQ,CACvB,IAAI8M,EAASmiB,EAAQ/b,GACjBpG,GACFkiB,EAAS7Z,EAAQrI,EAAQoG,EAAOuN,GAGpC,OAAOtL,KAYX,SAAS6N,GAAetO,EAAUI,GAChC,OAAO,SAASL,EAAYzB,GAC1B,GAAkB,MAAdyB,EACF,OAAOA,EAET,IAAK0T,GAAY1T,GACf,OAAOC,EAASD,EAAYzB,GAM9B,IAJA,IAAIhT,EAASyU,EAAWzU,OACpBkT,EAAQ4B,EAAY9U,GAAU,EAC9BovB,EAAW9wB,GAAOmW,IAEdK,EAAY5B,MAAYA,EAAQlT,KACa,IAA/CgT,EAASoc,EAASlc,GAAQA,EAAOkc,KAIvC,OAAO3a,GAWX,SAASoP,GAAc/O,GACrB,OAAO,SAASK,EAAQnC,EAAUqR,GAMhC,IALA,IAAInR,GAAS,EACTkc,EAAW9wB,GAAO6W,GAClBW,EAAQuO,EAASlP,GACjBnV,EAAS8V,EAAM9V,OAEZA,KAAU,CACf,IAAI2U,EAAMmB,EAAMhB,EAAY9U,IAAWkT,GACvC,IAA+C,IAA3CF,EAASoc,EAASza,GAAMA,EAAKya,GAC/B,MAGJ,OAAOja,GAgCX,SAASka,GAAgBC,GACvB,OAAO,SAAS5Z,GAGd,IAAIS,EAAaS,GAFjBlB,EAASuC,GAASvC,IAGd2B,GAAc3B,QAp4JpBN,EAu4JMuB,EAAMR,EACNA,EAAW,GACXT,EAAO3W,OAAO,GAEdwwB,EAAWpZ,EACXoX,GAAUpX,EAAY,GAAGhX,KAAK,IAC9BuW,EAAOtS,MAAM,GAEjB,OAAOuT,EAAI2Y,KAAgBC,GAW/B,SAASC,GAAiBC,GACxB,OAAO,SAAS/Z,GACd,OAAOxB,GAAYwb,GAAMC,GAAOja,GAAQrS,QAAQ0M,GAAQ,KAAM0f,EAAU,KAY5E,SAASG,GAAWrO,GAClB,OAAO,WAIL,IAAI5O,EAAOnL,UACX,OAAQmL,EAAK3S,QACX,KAAK,EAAG,OAAO,IAAIuhB,EACnB,KAAK,EAAG,OAAO,IAAIA,EAAK5O,EAAK,IAC7B,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,IACtC,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC/C,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACxD,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACjE,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC1E,KAAK,EAAG,OAAO,IAAI4O,EAAK5O,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAErF,IAAIkd,EAAc/S,GAAWyE,EAAKphB,WAC9ByG,EAAS2a,EAAK/O,MAAMqd,EAAald,GAIrC,OAAOpJ,GAAS3C,GAAUA,EAASipB,GAgDvC,SAASC,GAAWC,GAClB,OAAO,SAAStb,EAAYnB,EAAWuB,GACrC,IAAIua,EAAW9wB,GAAOmW,GACtB,IAAK0T,GAAY1T,GAAa,CAC5B,IAAIzB,EAAWsW,GAAYhW,EAAW,GACtCmB,EAAalW,GAAKkW,GAClBnB,EAAY,SAASqB,GAAO,OAAO3B,EAASoc,EAASza,GAAMA,EAAKya,IAElE,IAAIlc,EAAQ6c,EAActb,EAAYnB,EAAWuB,GACjD,OAAO3B,GAAS,EAAIkc,EAASpc,EAAWyB,EAAWvB,GAASA,QAt/J9DkC,GAigKF,SAAS4a,GAAWlb,GAClB,OAAOmb,IAAAA,SAAkBC,GACvB,IAAIlwB,EAASkwB,EAAMlwB,OACfkT,EAAQlT,EACRmwB,EAASvT,GAAczc,UAAUiwB,KAKrC,IAHItb,GACFob,EAAM7U,UAEDnI,KAAS,CACd,IAAIT,EAAOyd,EAAMhd,GACjB,GAAmB,mBAART,EACT,MAAM,IAAI5T,GAAU+L,GAEtB,GAAIulB,IAAWE,GAAgC,WAArBC,GAAY7d,GACpC,IAAI4d,EAAU,IAAIzT,GAAc,IAAI,GAIxC,IADA1J,EAAQmd,EAAUnd,EAAQlT,IACjBkT,EAAQlT,GAAQ,CAGvB,IAAIuwB,EAAWD,GAFf7d,EAAOyd,EAAMhd,IAGToL,EAAmB,WAAZiS,EAAwBC,GAAQ/d,QAxhK/C2C,EA8hKMib,EAJE/R,GAAQmS,GAAWnS,EAAK,KACX,KAAXA,EAAK,KACJA,EAAK,GAAGte,QAAqB,GAAXse,EAAK,GAElB+R,EAAQC,GAAYhS,EAAK,KAAK9L,MAAM6d,EAAS/R,EAAK,IAElC,GAAf7L,EAAKzS,QAAeywB,GAAWhe,GACtC4d,EAAQE,KACRF,EAAQD,KAAK3d,GAGrB,OAAO,WACL,IAAIE,EAAOnL,UACP+C,EAAQoI,EAAK,GAEjB,GAAI0d,GAA0B,GAAf1d,EAAK3S,QAAe0c,GAAQnS,GACzC,OAAO8lB,EAAQK,MAAMnmB,GAAOA,QAK9B,IAHA,IAAI2I,EAAQ,EACRtM,EAAS5G,EAASkwB,EAAMhd,GAAOV,MAAMtT,KAAMyT,GAAQpI,IAE9C2I,EAAQlT,GACf4G,EAASspB,EAAMhd,GAAON,KAAK1T,KAAM0H,GAEnC,OAAOA,MAwBb,SAAS+pB,GAAale,EAAM+N,EAAS9N,EAASob,EAAUC,EAAS6C,EAAeC,EAAcC,EAAQC,EAAKC,GACzG,IAAIC,EApiKY,IAoiKJzQ,EACR0Q,EA5iKa,EA4iKJ1Q,EACT2Q,EA5iKiB,EA4iKL3Q,EACZwN,EAAsB,GAAVxN,EACZ4Q,EAtiKa,IAsiKJ5Q,EACTe,EAAO4P,OAhlKX/b,EAglKmCwa,GAAWnd,GA6C9C,OA3CA,SAAS4d,IAKP,IAJA,IAAIrwB,EAASwH,UAAUxH,OACnB2S,EAAOmB,EAAM9T,GACbkT,EAAQlT,EAELkT,KACLP,EAAKO,GAAS1L,UAAU0L,GAE1B,GAAI8a,EACF,IAAIzX,EAAc8a,GAAUhB,GACxBiB,EAAehb,GAAa3D,EAAM4D,GASxC,GAPIuX,IACFnb,EAAOkb,GAAYlb,EAAMmb,EAAUC,EAASC,IAE1C4C,IACFje,EAAO6b,GAAiB7b,EAAMie,EAAeC,EAAc7C,IAE7DhuB,GAAUsxB,EACNtD,GAAahuB,EAASgxB,EAAO,CAC/B,IAAIO,EAAata,GAAetE,EAAM4D,GACtC,OAAOib,GACL/e,EAAM+N,EAASmQ,GAAcN,EAAQ9Z,YAAa7D,EAClDC,EAAM4e,EAAYT,EAAQC,EAAKC,EAAQhxB,GAG3C,IAAI6vB,EAAcqB,EAASxe,EAAUxT,KACjCuyB,EAAKN,EAAYtB,EAAYpd,GAAQA,EAczC,OAZAzS,EAAS2S,EAAK3S,OACV8wB,EACFne,EAAO+e,GAAQ/e,EAAMme,GACZM,GAAUpxB,EAAS,GAC5B2S,EAAK0I,UAEH4V,GAASF,EAAM/wB,IACjB2S,EAAK3S,OAAS+wB,GAEZ7xB,MAAQA,OAAS+J,IAAQ/J,gBAAgBmxB,IAC3CoB,EAAKlQ,GAAQqO,GAAW6B,IAEnBA,EAAGjf,MAAMqd,EAAald,IAajC,SAASgf,GAAe5e,EAAQ6e,GAC9B,OAAO,SAASzc,EAAQnC,GACtB,OAh/DJ,SAAsBmC,EAAQpC,EAAQC,EAAUC,GAI9C,OAHAgQ,GAAW9N,GAAAA,SAAiB5K,EAAOoK,EAAKQ,GACtCpC,EAAOE,EAAaD,EAASzI,GAAQoK,EAAKQ,MAErClC,EAJT,CAg/DwBkC,EAAQpC,EAAQ6e,EAAW5e,GAAW,KAY9D,SAAS6e,GAAoBC,EAAUC,GACrC,OAAO,SAASxnB,EAAOoa,GACrB,IAAI/d,EACJ,QAzpKFwO,IAypKM7K,QAzpKN6K,IAypK6BuP,EACzB,OAAOoN,EAKT,QA/pKF3c,IA4pKM7K,IACF3D,EAAS2D,QA7pKb6K,IA+pKMuP,EAAqB,CACvB,QAhqKJvP,IAgqKQxO,EACF,OAAO+d,EAEW,iBAATpa,GAAqC,iBAAToa,GACrCpa,EAAQ6hB,GAAa7hB,GACrBoa,EAAQyH,GAAazH,KAErBpa,EAAQ4hB,GAAa5hB,GACrBoa,EAAQwH,GAAaxH,IAEvB/d,EAASkrB,EAASvnB,EAAOoa,GAE3B,OAAO/d,GAWX,SAASorB,GAAWC,GAClB,OAAOhC,IAAAA,SAAkB7G,GAEvB,OADAA,EAAYvV,GAASuV,EAAWxT,GAAU0T,OACnCgB,IAAAA,SAAkB3X,GACvB,IAAID,EAAUxT,KACd,OAAO+yB,EAAU7I,GAAAA,SAAoBpW,GACnC,OAAOR,GAAMQ,EAAUN,EAASC,YAexC,SAASuf,GAAclyB,EAAQmyB,GAG7B,IAAIC,GAFJD,OA7sKA/c,IA6sKQ+c,EAAsB,IAAM/F,GAAa+F,IAEzBnyB,OACxB,GAAIoyB,EAAc,EAChB,OAAOA,EAAc/H,GAAW8H,EAAOnyB,GAAUmyB,EAEnD,IAAIvrB,EAASyjB,GAAW8H,EAAOlY,GAAWja,EAASoX,GAAW+a,KAC9D,OAAOvb,GAAWub,GACd5E,GAAUlW,GAAczQ,GAAS,EAAG5G,GAAQb,KAAK,IACjDyH,EAAOxD,MAAM,EAAGpD,GA6CtB,SAASqyB,GAAYvd,GACnB,OAAO,SAASrS,EAAO8D,EAAK+rB,GAa1B,OAZIA,GAAuB,iBAARA,GAAoBnD,GAAe1sB,EAAO8D,EAAK+rB,KAChE/rB,EAAM+rB,OAtwKVld,GAywKE3S,EAAQ8vB,GAAS9vB,QAzwKnB2S,IA0wKM7O,GACFA,EAAM9D,EACNA,EAAQ,GAER8D,EAAMgsB,GAAShsB,GA57CrB,SAAmB9D,EAAO8D,EAAK+rB,EAAMxd,GAKnC,IAJA,IAAI5B,GAAS,EACTlT,EAAS6a,GAAUZ,IAAY1T,EAAM9D,IAAU6vB,GAAQ,IAAK,GAC5D1rB,EAASkN,EAAM9T,GAEZA,KACL4G,EAAOkO,EAAY9U,IAAWkT,GAASzQ,EACvCA,GAAS6vB,EAEX,OAAO1rB,EATT,CA+7CqBnE,EAAO8D,EADxB+rB,OAhxKFld,IAgxKSkd,EAAsB7vB,EAAQ8D,EAAM,GAAK,EAAKgsB,GAASD,GAC3Bxd,IAWvC,SAAS0d,GAA0BV,GACjC,OAAO,SAASvnB,EAAOoa,GAKrB,MAJsB,iBAATpa,GAAqC,iBAAToa,IACvCpa,EAAQkoB,GAASloB,GACjBoa,EAAQ8N,GAAS9N,IAEZmN,EAASvnB,EAAOoa,IAqB3B,SAAS6M,GAAc/e,EAAM+N,EAASkS,EAAUnc,EAAa7D,EAASob,EAAUC,EAAS+C,EAAQC,EAAKC,GACpG,IAAI2B,EArxKc,EAqxKJnS,EAMdA,GAAYmS,EAzxKQ,GACM,GAJF,GA6xKxBnS,KAAamS,EAzxKa,GADN,OA6xKlBnS,IAAW,GAEb,IAAIoS,EAAU,CACZngB,EAAM+N,EAAS9N,EAVCigB,EAAU7E,OA3zK5B1Y,EAyzKiBud,EAAU5E,OAzzK3B3Y,EA4zKuBud,OA5zKvBvd,EA4zK6C0Y,EAFvB6E,OA1zKtBvd,EA0zK4C2Y,EAYzB+C,EAAQC,EAAKC,GAG5BpqB,EAAS8rB,EAASlgB,WAz0KtB4C,EAy0KuCwd,GAKvC,OAJInC,GAAWhe,IACbogB,GAAQjsB,EAAQgsB,GAElBhsB,EAAO2P,YAAcA,EACduc,GAAgBlsB,EAAQ6L,EAAM+N,GAUvC,SAASuS,GAAYzD,GACnB,IAAI7c,EAAOhK,GAAK6mB,GAChB,OAAO,SAASlP,EAAQ4S,GAGtB,GAFA5S,EAASqS,GAASrS,IAClB4S,EAAyB,MAAbA,EAAoB,EAAIjY,GAAUkY,GAAUD,GAAY,OACnDvY,GAAe2F,GAAS,CAGvC,IAAI8S,GAAQjb,GAASmI,GAAU,KAAKviB,MAAM,KAI1C,SADAq1B,GAAQjb,GAFIxF,EAAKygB,EAAK,GAAK,MAAQA,EAAK,GAAKF,KAEnB,KAAKn1B,MAAM,MACvB,GAAK,MAAQq1B,EAAK,GAAKF,IAEvC,OAAOvgB,EAAK2N,IAWhB,IAAIkM,GAAc7Q,IAAQ,EAAIvE,GAAW,IAAIuE,GAAI,CAAC,EAAE,KAAK,IAxzK5C,EAAA,EAwzKsE,SAASzH,GAC1F,OAAO,IAAIyH,GAAIzH,IAD2Dmf,GAW5E,SAASC,GAAc/O,GACrB,OAAO,SAASlP,GACd,IAAI4L,EAAMC,GAAO7L,GACjB,OAAI4L,GAAOzV,EACFuL,GAAW1B,GAEhB4L,GAAOrV,EACFyL,GAAWhC,GAn6I1B,SAAqBA,EAAQW,GAC3B,OAAOjC,GAASiC,GAAAA,SAAgBnB,GAC9B,MAAO,CAACA,EAAKQ,EAAOR,OAFxB,CAq6IyBQ,EAAQkP,EAASlP,KA6BxC,SAASke,GAAW5gB,EAAM+N,EAAS9N,EAASob,EAAUC,EAAS+C,EAAQC,EAAKC,GAC1E,IAAIG,EAl4KiB,EAk4KL3Q,EAChB,IAAK2Q,GAA4B,mBAAR1e,EACvB,MAAM,IAAI5T,GAAU+L,GAEtB,IAAI5K,EAAS8tB,EAAWA,EAAS9tB,OAAS,EAS1C,GARKA,IACHwgB,IAAW,GACXsN,EAAWC,OA16Kb3Y,GA46KA2b,OA56KA3b,IA46KM2b,EAAoBA,EAAMlW,GAAUoY,GAAUlC,GAAM,GAC1DC,OA76KA5b,IA66KQ4b,EAAsBA,EAAQiC,GAAUjC,GAChDhxB,GAAU+tB,EAAUA,EAAQ/tB,OAAS,EAx4KX,GA04KtBwgB,EAAmC,CACrC,IAAIoQ,EAAgB9C,EAChB+C,EAAe9C,EAEnBD,EAAWC,OAp7Kb3Y,EAs7KA,IAAIkJ,EAAO6S,OAt7KX/b,EAs7KmCob,GAAQ/d,GAEvCmgB,EAAU,CACZngB,EAAM+N,EAAS9N,EAASob,EAAUC,EAAS6C,EAAeC,EAC1DC,EAAQC,EAAKC,GAkBf,GAfI1S,GA26BN,SAAmBA,EAAMxR,GACvB,IAAI0T,EAAUlC,EAAK,GACfgV,EAAaxmB,EAAO,GACpBymB,EAAa/S,EAAU8S,EAS3B,KAReC,EAAa,KAr0MZ,KAw0MZD,GA50Mc,GA40MmB9S,GAx0MrB,KAy0MZ8S,GAx0Mc,KAw0MmB9S,GAAgClC,EAAK,GAAGte,QAAU8M,EAAO,IAC5E,KAAdwmB,GAAqDxmB,EAAO,GAAG9M,QAAU8M,EAAO,IA90MlE,GA80M0E0T,GAI1F,OAAOlC,EAr1MQ,EAw1MbgV,IACFhV,EAAK,GAAKxR,EAAO,GAEjBymB,GA31Me,EA21MD/S,EAA2B,EAz1MnB,GA41MxB,IAAIjW,EAAQuC,EAAO,GACnB,GAAIvC,EAAO,CACT,IAAIujB,EAAWxP,EAAK,GACpBA,EAAK,GAAKwP,EAAWD,GAAYC,EAAUvjB,EAAOuC,EAAO,IAAMvC,EAC/D+T,EAAK,GAAKwP,EAAW7W,GAAeqH,EAAK,GAAIzT,GAAeiC,EAAO,IAGrEvC,EAAQuC,EAAO,MAGbwR,EAAK,IADLwP,EAAWxP,EAAK,IACKkQ,GAAiBV,EAAUvjB,EAAOuC,EAAO,IAAMvC,EACpE+T,EAAK,GAAKwP,EAAW7W,GAAeqH,EAAK,GAAIzT,GAAeiC,EAAO,KAGrEvC,EAAQuC,EAAO,MAEbwR,EAAK,GAAK/T,GAv2MI,IA02MZ+oB,IACFhV,EAAK,GAAgB,MAAXA,EAAK,GAAaxR,EAAO,GAAKiO,GAAUuD,EAAK,GAAIxR,EAAO,KAGrD,MAAXwR,EAAK,KACPA,EAAK,GAAKxR,EAAO,IAGnBwR,EAAK,GAAKxR,EAAO,GACjBwR,EAAK,GAAKiV,EAlDZ,CA16BcX,EAAStU,GAErB7L,EAAOmgB,EAAQ,GACfpS,EAAUoS,EAAQ,GAClBlgB,EAAUkgB,EAAQ,GAClB9E,EAAW8E,EAAQ,GACnB7E,EAAU6E,EAAQ,KAClB5B,EAAQ4B,EAAQ,QAr8KhBxd,IAq8KqBwd,EAAQ,GACxBzB,EAAY,EAAI1e,EAAKzS,OACtB6a,GAAU+X,EAAQ,GAAK5yB,EAAQ,KAEX,GAAVwgB,IACZA,IAAW,IAERA,GA56KY,GA46KDA,EAGd5Z,EA56KgB,GA26KP4Z,GA16Ka,IA06KiBA,EApgB3C,SAAqB/N,EAAM+N,EAASwQ,GAClC,IAAIzP,EAAOqO,GAAWnd,GAwBtB,OAtBA,SAAS4d,IAMP,IALA,IAAIrwB,EAASwH,UAAUxH,OACnB2S,EAAOmB,EAAM9T,GACbkT,EAAQlT,EACRuW,EAAc8a,GAAUhB,GAErBnd,KACLP,EAAKO,GAAS1L,UAAU0L,GAE1B,IAAI6a,EAAW/tB,EAAS,GAAK2S,EAAK,KAAO4D,GAAe5D,EAAK3S,EAAS,KAAOuW,EACzE,GACAU,GAAetE,EAAM4D,GAGzB,IADAvW,GAAU+tB,EAAQ/tB,QACLgxB,EACX,OAAOQ,GACL/e,EAAM+N,EAASmQ,GAAcN,EAAQ9Z,iBA79J3CnB,EA89JMzC,EAAMob,OA99JZ3Y,OAAAA,EA89J2C4b,EAAQhxB,GAEjD,IAAIyxB,EAAMvyB,MAAQA,OAAS+J,IAAQ/J,gBAAgBmxB,EAAW9O,EAAO9O,EACrE,OAAOD,GAAMif,EAAIvyB,KAAMyT,IAvB3B,CAqgByBF,EAAM+N,EAASwQ,GA16KlB,IA26KRxQ,GAA2C,IAAXA,GAAqDuN,EAAQ/tB,OAG9F2wB,GAAane,WAn9KxB4C,EAm9KyCwd,GA9O3C,SAAuBngB,EAAM+N,EAAS9N,EAASob,GAC7C,IAAIoD,EAtsKa,EAssKJ1Q,EACTe,EAAOqO,GAAWnd,GAkBtB,OAhBA,SAAS4d,IAQP,IAPA,IAAIpC,GAAa,EACbC,EAAa1mB,UAAUxH,OACvBouB,GAAa,EACbC,EAAaP,EAAS9tB,OACtB2S,EAAOmB,EAAMua,EAAaH,GAC1BuD,EAAMvyB,MAAQA,OAAS+J,IAAQ/J,gBAAgBmxB,EAAW9O,EAAO9O,IAE5D2b,EAAYC,GACnB1b,EAAKyb,GAAaN,EAASM,GAE7B,KAAOF,KACLvb,EAAKyb,KAAe5mB,YAAYymB,GAElC,OAAOzb,GAAMif,EAAIP,EAASxe,EAAUxT,KAAMyT,IAlB9C,CA4O2BF,EAAM+N,EAAS9N,EAASob,QAJ/C,IAAIlnB,EAhmBR,SAAoB6L,EAAM+N,EAAS9N,GACjC,IAAIwe,EA90Ja,EA80JJ1Q,EACTe,EAAOqO,GAAWnd,GAMtB,OAJA,SAAS4d,IACP,IAAIoB,EAAMvyB,MAAQA,OAAS+J,IAAQ/J,gBAAgBmxB,EAAW9O,EAAO9O,EACrE,OAAOgf,EAAGjf,MAAM0e,EAASxe,EAAUxT,KAAMsI,YAN7C,CAgmB4BiL,EAAM+N,EAAS9N,GASzC,OAAOogB,IADMxU,EAAOsM,GAAciI,IACJjsB,EAAQgsB,GAAUngB,EAAM+N,GAexD,SAASgT,GAAuB7T,EAAU4H,EAAU5S,EAAKQ,GACvD,YAt+KAC,IAs+KIuK,GACCH,GAAGG,EAAU7H,GAAYnD,MAAUuD,GAAetF,KAAKuC,EAAQR,GAC3D4S,EAEF5H,EAiBT,SAAS8T,GAAoB9T,EAAU4H,EAAU5S,EAAKQ,EAAQrI,EAAQ4T,GAOpE,OANInX,GAASoW,IAAapW,GAASge,KAEjC7G,EAAM3iB,IAAIwpB,EAAU5H,GACpB8I,GAAU9I,EAAU4H,OA//KtBnS,EA+/K2Cqe,GAAqB/S,GAC9DA,EAAc,OAAE6G,IAEX5H,EAYT,SAAS+T,GAAgBnpB,GACvB,OAAOye,GAAcze,QA/gLrB6K,EA+gL0C7K,EAgB5C,SAAS4b,GAAYrT,EAAO6R,EAAOnE,EAASC,EAAYkF,EAAWjF,GACjE,IAAIgG,EApgLmB,EAogLPlG,EACZmT,EAAY7gB,EAAM9S,OAClBglB,EAAYL,EAAM3kB,OAEtB,GAAI2zB,GAAa3O,KAAe0B,GAAa1B,EAAY2O,GACvD,OAAO,EAGT,IAAIC,EAAalT,EAAMP,IAAIrN,GACvBgU,EAAapG,EAAMP,IAAIwE,GAC3B,GAAIiP,GAAc9M,EAChB,OAAO8M,GAAcjP,GAASmC,GAAchU,EAE9C,IAAII,GAAS,EACTtM,GAAS,EACTye,EAlhLqB,EAkhLb7E,EAAoC,IAAItC,QA/iLpD9I,EAqjLA,IAJAsL,EAAM3iB,IAAI+U,EAAO6R,GACjBjE,EAAM3iB,IAAI4mB,EAAO7R,KAGRI,EAAQygB,GAAW,CAC1B,IAAIE,EAAW/gB,EAAMI,GACjB8T,EAAWrC,EAAMzR,GAErB,GAAIuN,EACF,IAAIwG,EAAWP,EACXjG,EAAWuG,EAAU6M,EAAU3gB,EAAOyR,EAAO7R,EAAO4N,GACpDD,EAAWoT,EAAU7M,EAAU9T,EAAOJ,EAAO6R,EAAOjE,GAE1D,QA9jLFtL,IA8jLM6R,EAAwB,CAC1B,GAAIA,EACF,SAEFrgB,GAAS,EACT,MAGF,GAAIye,EAAAA,CACF,IAAKhR,GAAUsQ,GAAAA,SAAgBqC,EAAU/B,GACnC,IAAKlP,GAASsP,EAAMJ,KACf4O,IAAa7M,GAAYrB,EAAUkO,EAAU7M,EAAUxG,EAASC,EAAYC,IAC/E,OAAO2E,EAAK9iB,KAAK0iB,MAEjB,CACNre,GAAS,EACT,YAEG,GACDitB,IAAa7M,IACXrB,EAAUkO,EAAU7M,EAAUxG,EAASC,EAAYC,GACpD,CACL9Z,GAAS,EACT,OAKJ,OAFA8Z,EAAc,OAAE5N,GAChB4N,EAAc,OAAEiE,GACT/d,EA0KT,SAASqpB,GAASxd,GAChB,OAAO8X,GAAYC,GAAS/X,OArwL5B2C,EAqwL6C0e,IAAUrhB,EAAO,IAUhE,SAASwP,GAAW9M,GAClB,OAAOiP,GAAejP,EAAQ5W,GAAM+iB,IAWtC,SAASU,GAAa7M,GACpB,OAAOiP,GAAejP,EAAQkM,GAAQD,IAUxC,IAAIoP,GAAW5U,GAAiB,SAASnJ,GACvC,OAAOmJ,GAAQuE,IAAI1N,IADI0gB,GAWzB,SAAS7C,GAAY7d,GAKnB,IAJA,IAAI7L,EAAU6L,EAAK9I,KAAO,GACtBmJ,EAAQ+I,GAAUjV,GAClB5G,EAASkY,GAAetF,KAAKiJ,GAAWjV,GAAUkM,EAAM9S,OAAS,EAE9DA,KAAU,CACf,IAAIse,EAAOxL,EAAM9S,GACb+zB,EAAYzV,EAAK7L,KACrB,GAAiB,MAAbshB,GAAqBA,GAAathB,EACpC,OAAO6L,EAAK3U,KAGhB,OAAO/C,EAUT,SAASyqB,GAAU5e,GAEjB,OADayF,GAAetF,KAAK4J,GAAQ,eAAiBA,GAAS/J,GACrD8D,YAchB,SAAS+S,KACP,IAAI1iB,EAAS4V,GAAOxJ,UAAYA,GAEhC,OADApM,EAASA,IAAWoM,GAAW0U,GAAe9gB,EACvCY,UAAUxH,OAAS4G,EAAOY,UAAU,GAAIA,UAAU,IAAMZ,EAWjE,SAASic,GAAWliB,EAAKgU,GACvB,IAgYiBpK,EACb/H,EAjYA8b,EAAO3d,EAAIwd,SACf,OAiYgB,WADZ3b,SADa+H,EA/XAoK,KAiYmB,UAARnS,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAV+H,EACU,OAAVA,GAlYD+T,EAAmB,iBAAP3J,EAAkB,SAAW,QACzC2J,EAAK3d,IAUX,SAASynB,GAAajT,GAIpB,IAHA,IAAIvO,EAASrI,GAAK4W,GACdnV,EAAS4G,EAAO5G,OAEbA,KAAU,CACf,IAAI2U,EAAM/N,EAAO5G,GACbuK,EAAQ4K,EAAOR,GAEnB/N,EAAO5G,GAAU,CAAC2U,EAAKpK,EAAOge,GAAmBhe,IAEnD,OAAO3D,EAWT,SAAS8S,GAAUvE,EAAQR,GACzB,IAAIpK,EAlxJR,SAAkB4K,EAAQR,GACxB,OAAiB,MAAVQ,OAxnCLC,EAwnCkCD,EAAOR,GAD7C,CAkxJyBQ,EAAQR,GAC7B,OAAO8S,GAAald,GAASA,OA14L7B6K,EA+6LF,IAAIkM,GAAcjH,GAA+B,SAASlF,GACxD,OAAc,MAAVA,EACK,IAETA,EAAS7W,GAAO6W,GACT5B,GAAY8G,GAAiBlF,IAAAA,SAAkB6e,GACpD,OAAO/a,GAAqBrG,KAAKuC,EAAQ6e,QANRC,GAiBjC7S,GAAgB/G,GAA+B,SAASlF,GAE1D,IADA,IAAIvO,EAAS,GACNuO,GACLpB,GAAUnN,EAAQ0a,GAAWnM,IAC7BA,EAAS2D,GAAa3D,GAExB,OAAOvO,GAN8BqtB,GAgBnCjT,GAASuD,GA2Eb,SAAS2P,GAAQ/e,EAAQ/X,EAAM+2B,GAO7B,IAJA,IAAIjhB,GAAS,EACTlT,GAHJ5C,EAAO8mB,GAAS9mB,EAAM+X,IAGJnV,OACd4G,GAAS,IAEJsM,EAAQlT,GAAQ,CACvB,IAAI2U,EAAMwP,GAAM/mB,EAAK8V,IACrB,KAAMtM,EAAmB,MAAVuO,GAAkBgf,EAAQhf,EAAQR,IAC/C,MAEFQ,EAASA,EAAOR,GAElB,OAAI/N,KAAYsM,GAASlT,EAChB4G,KAET5G,EAAmB,MAAVmV,EAAiB,EAAIA,EAAOnV,SAClBo0B,GAASp0B,IAAW+e,GAAQpK,EAAK3U,KACjD0c,GAAQvH,IAAWwJ,GAAYxJ,IA6BpC,SAASgM,GAAgBhM,GACvB,MAAqC,mBAAtBA,EAAO7K,aAA8B0d,GAAY7S,GAE5D,GADA2H,GAAWhE,GAAa3D,IA8E9B,SAASwO,GAAcpZ,GACrB,OAAOmS,GAAQnS,IAAUoU,GAAYpU,OAChC4O,IAAoB5O,GAASA,EAAM4O,KAW1C,SAAS4F,GAAQxU,EAAOvK,GACtB,IAAIwC,SAAc+H,EAGlB,SAFAvK,EAAmB,MAAVA,EAhnMU,iBAgnM0BA,KAGlC,UAARwC,GACU,UAARA,GAAoB8L,GAASxG,KAAKyC,KAChCA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,EAAQvK,EAajD,SAASmvB,GAAe5kB,EAAO2I,EAAOiC,GACpC,IAAK5L,GAAS4L,GACZ,OAAO,EAET,IAAI3S,SAAc0Q,EAClB,SAAY,UAAR1Q,EACK2lB,GAAYhT,IAAW4J,GAAQ7L,EAAOiC,EAAOnV,QACrC,UAARwC,GAAoB0Q,KAASiC,IAE7BqK,GAAGrK,EAAOjC,GAAQ3I,GAa7B,SAAS+d,GAAM/d,EAAO4K,GACpB,GAAIuH,GAAQnS,GACV,OAAO,EAET,IAAI/H,SAAc+H,EAClB,QAAY,UAAR/H,GAA4B,UAARA,GAA4B,WAARA,GAC/B,MAAT+H,IAAiB+Y,GAAS/Y,KAGvB6C,EAActF,KAAKyC,KAAW4C,EAAarF,KAAKyC,IAC1C,MAAV4K,GAAkB5K,KAASjM,GAAO6W,GAyBvC,SAASsb,GAAWhe,GAClB,IAAI8d,EAAWD,GAAY7d,GACvBkS,EAAQnI,GAAO+T,GAEnB,GAAoB,mBAAT5L,KAAyB4L,KAAY5T,GAAYxc,WAC1D,OAAO,EAET,GAAIsS,IAASkS,EACX,OAAO,EAET,IAAIrG,EAAOkS,GAAQ7L,GACnB,QAASrG,GAAQ7L,IAAS6L,EAAK,IA7S5BhD,IAAY0F,GAAO,IAAI1F,GAAS,IAAI+Y,YAAY,MAAQtoB,GACxDwP,IAAOyF,GAAO,IAAIzF,KAAQjQ,GAC1BkQ,IAv3LU,oBAu3LCwF,GAAOxF,GAAQpU,YAC1BqU,IAAOuF,GAAO,IAAIvF,KAAQ/P,GAC1BgQ,IAAWsF,GAAO,IAAItF,KAAY7P,KACrCmV,GAAS,SAASzW,GAChB,IAAI3D,EAAS2d,GAAWha,GACpBgX,EAAO3a,GAAU4E,EAAYjB,EAAMD,iBA19LzC8K,EA29LMkf,EAAa/S,EAAOxF,GAASwF,GAAQ,GAEzC,GAAI+S,EACF,OAAQA,GACN,KAAKxY,GAAoB,OAAO/P,EAChC,KAAKiQ,GAAe,OAAO1Q,EAC3B,KAAK2Q,GAAmB,MAn4LjB,mBAo4LP,KAAKC,GAAe,OAAOxQ,EAC3B,KAAKyQ,GAAmB,OAAOtQ,EAGnC,OAAOjF,IA+SX,IAAI2tB,GAAaxc,GAAaiM,GAAawQ,GAS3C,SAASxM,GAAYzd,GACnB,IAAIgX,EAAOhX,GAASA,EAAMD,YAG1B,OAAOC,KAFqB,mBAARgX,GAAsBA,EAAKphB,WAAc2X,IAa/D,SAASyQ,GAAmBhe,GAC1B,OAAOA,GAAUA,IAAUhB,GAASgB,GAYtC,SAAS8d,GAAwB1T,EAAK4S,GACpC,OAAO,SAASpS,GACd,OAAc,MAAVA,GAGGA,EAAOR,KAAS4S,SA/zMzBnS,IAg0MKmS,GAA2B5S,KAAOrW,GAAO6W,KAsIhD,SAASqV,GAAS/X,EAAMhQ,EAAOuU,GAE7B,OADAvU,EAAQoY,QAv8MRzF,IAu8MkB3S,EAAuBgQ,EAAKzS,OAAS,EAAKyC,EAAO,GAC5D,WAML,IALA,IAAIkQ,EAAOnL,UACP0L,GAAS,EACTlT,EAAS6a,GAAUlI,EAAK3S,OAASyC,EAAO,GACxCqQ,EAAQgB,EAAM9T,KAETkT,EAAQlT,GACf8S,EAAMI,GAASP,EAAKlQ,EAAQyQ,GAE9BA,GAAS,EAET,IADA,IAAIuhB,EAAY3gB,EAAMrR,EAAQ,KACrByQ,EAAQzQ,GACfgyB,EAAUvhB,GAASP,EAAKO,GAG1B,OADAuhB,EAAUhyB,GAASuU,EAAUlE,GACtBN,GAAMC,EAAMvT,KAAMu1B,IAY7B,SAASlP,GAAOpQ,EAAQ/X,GACtB,OAAOA,EAAK4C,OAAS,EAAImV,EAAS8O,GAAQ9O,EAAQ6V,GAAU5tB,EAAM,GAAI,IAaxE,SAASs0B,GAAQ5e,EAAOoX,GAKtB,IAJA,IAAIyJ,EAAY7gB,EAAM9S,OAClBA,EAAS+a,GAAUmP,EAAQlqB,OAAQ2zB,GACnCe,EAAWtV,GAAUtM,GAElB9S,KAAU,CACf,IAAIkT,EAAQgX,EAAQlqB,GACpB8S,EAAM9S,GAAU+e,GAAQ7L,EAAOygB,GAAae,EAASxhB,QAx/MvDkC,EA0/MA,OAAOtC,EAWT,SAAS8V,GAAQzT,EAAQR,GACvB,IAAY,gBAARA,GAAgD,mBAAhBQ,EAAOR,KAIhC,aAAPA,EAIJ,OAAOQ,EAAOR,GAiBhB,IAAIke,GAAU8B,GAAS/J,IAUnB5Q,GAAaD,IAAiB,SAAStH,EAAM2P,GAC/C,OAAOnZ,GAAK+Q,WAAWvH,EAAM2P,IAW3BmI,GAAcoK,GAAS9J,IAY3B,SAASiI,GAAgBzC,EAASuE,EAAWpU,GAC3C,IAAI1T,EAAU8nB,EAAY,GAC1B,OAAOrK,GAAY8F,EA1brB,SAA2BvjB,EAAQ+nB,GACjC,IAAI70B,EAAS60B,EAAQ70B,OACrB,IAAKA,EACH,OAAO8M,EAET,IAAIxG,EAAYtG,EAAS,EAGzB,OAFA60B,EAAQvuB,IAActG,EAAS,EAAI,KAAO,IAAM60B,EAAQvuB,GACxDuuB,EAAUA,EAAQ11B,KAAKa,EAAS,EAAI,KAAO,KACpC8M,EAAOzJ,QAAQqK,EAAe,uBAAyBmnB,EAAU,UAR1E,CA0bgD/nB,EAqHhD,SAA2B+nB,EAASrU,GAOlC,OANArN,GAAUrI,GAAAA,SAAoBooB,GAC5B,IAAI3oB,EAAQ,KAAO2oB,EAAK,GACnB1S,EAAU0S,EAAK,KAAQzf,GAAcohB,EAAStqB,IACjDsqB,EAAQtyB,KAAKgI,MAGVsqB,EAAQrL,OAPjB,CA3qBA,SAAwB1c,GACtB,IAAI7N,EAAQ6N,EAAO7N,MAAM0O,GACzB,OAAO1O,EAAQA,EAAM,GAAGpB,MAAM+P,GAAkB,GAFlD,CAsjByFd,GAAS0T,KAYlG,SAASmU,GAASliB,GAChB,IAAIqiB,EAAQ,EACRC,EAAa,EAEjB,OAAO,WACL,IAAIC,EAAQha,KACRia,EApiNK,IAoiNmBD,EAAQD,GAGpC,GADAA,EAAaC,EACTC,EAAY,EAAA,CACd,KAAMH,GAziNE,IA0iNN,OAAOttB,UAAU,QAGnBstB,EAAQ,EAEV,OAAOriB,EAAKD,WA/lNd4C,EA+lN+B5N,YAYjC,SAAS2X,GAAYrM,EAAOgE,GAC1B,IAAI5D,GAAS,EACTlT,EAAS8S,EAAM9S,OACfsG,EAAYtG,EAAS,EAGzB,IADA8W,OAhnNA1B,IAgnNO0B,EAAqB9W,EAAS8W,IAC5B5D,EAAQ4D,GAAM,CACrB,IAAIoe,EAAOjW,GAAW/L,EAAO5M,GACzBiE,EAAQuI,EAAMoiB,GAElBpiB,EAAMoiB,GAAQpiB,EAAMI,GACpBJ,EAAMI,GAAS3I,EAGjB,OADAuI,EAAM9S,OAAS8W,EACRhE,EAUT,IAtTMlM,GAOAoP,GA+SFqX,IAtTEzmB,GAASuuB,IAAAA,SAsT2Bzf,GACxC,IAAI9O,EAAS,GAOb,OAN6B,KAAzB8O,EAAO0f,WAAW,IACpBxuB,EAAOrE,KAAK,IAEdmT,EAAOrS,QAAQgK,GAAAA,SAAqBpO,EAAOmhB,EAAQiV,EAAOC,GACxD1uB,EAAOrE,KAAK8yB,EAAQC,EAAUjyB,QAAQ0K,GAAc,MAASqS,GAAUnhB,MAElE2H,KAAAA,SA9T6B+N,GAIlC,OAh0MiB,MA6zMbqB,GAAMc,MACRd,GAAM8H,QAEDnJ,KAGLqB,GAAQpP,GAAOoP,MACZpP,IAgUT,SAASud,GAAM5Z,GACb,GAAoB,iBAATA,GAAqB+Y,GAAS/Y,GACvC,OAAOA,EAET,IAAI3D,EAAU2D,EAAQ,GACtB,MAAkB,KAAV3D,GAAkB,EAAI2D,IAAU,EAAA,EAAa,KAAO3D,EAU9D,SAASmV,GAAStJ,GAChB,GAAY,MAARA,EAAc,CAChB,IACE,OAAOuF,GAAapF,KAAKH,GACzB,MAAOd,IACT,IACE,OAAQc,EAAO,GACf,MAAOd,KAEX,MAAO,GA4BT,SAASkL,GAAawT,GACpB,GAAIA,aAAmB1T,GACrB,OAAO0T,EAAQkF,QAEjB,IAAI3uB,EAAS,IAAIgW,GAAcyT,EAAQnT,YAAamT,EAAQjT,WAI5D,OAHAxW,EAAOuW,YAAciC,GAAUiR,EAAQlT,aACvCvW,EAAOyW,UAAagT,EAAQhT,UAC5BzW,EAAO0W,WAAa+S,EAAQ/S,WACrB1W,EAsIT,IAAI4uB,GAAalL,IAAAA,SAAkBxX,EAAOkB,GACxC,OAAO+U,GAAkBjW,GACrBuP,GAAevP,EAAO0Q,GAAYxP,EAAQ,EAAG+U,IAAmB,IAChE,MA6BF0M,GAAenL,IAAAA,SAAkBxX,EAAOkB,GAC1C,IAAIhB,EAAWwS,GAAKxR,GAIpB,OAHI+U,GAAkB/V,KACpBA,OA13NFoC,GA43NO2T,GAAkBjW,GACrBuP,GAAevP,EAAO0Q,GAAYxP,EAAQ,EAAG+U,IAAmB,GAAOO,GAAYtW,EAAU,IAC7F,MA0BF0iB,GAAiBpL,IAAAA,SAAkBxX,EAAOkB,GAC5C,IAAIJ,EAAa4R,GAAKxR,GAItB,OAHI+U,GAAkBnV,KACpBA,OA35NFwB,GA65NO2T,GAAkBjW,GACrBuP,GAAevP,EAAO0Q,GAAYxP,EAAQ,EAAG+U,IAAmB,QA95NpE3T,EA85NsFxB,GAClF,MAsON,SAAS+hB,GAAU7iB,EAAOQ,EAAWuB,GACnC,IAAI7U,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAIkT,EAAqB,MAAb2B,EAAoB,EAAIoe,GAAUpe,GAI9C,OAHI3B,EAAQ,IACVA,EAAQ2H,GAAU7a,EAASkT,EAAO,IAE7B0B,GAAc9B,EAAOwW,GAAYhW,EAAW,GAAIJ,GAsCzD,SAAS0iB,GAAc9iB,EAAOQ,EAAWuB,GACvC,IAAI7U,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAIkT,EAAQlT,EAAS,EAOrB,YAhsOAoV,IA0rOIP,IACF3B,EAAQ+f,GAAUpe,GAClB3B,EAAQ2B,EAAY,EAChBgG,GAAU7a,EAASkT,EAAO,GAC1B6H,GAAU7H,EAAOlT,EAAS,IAEzB4U,GAAc9B,EAAOwW,GAAYhW,EAAW,GAAIJ,GAAO,GAiBhE,SAAS4gB,GAAQhhB,GAEf,OADsB,MAATA,GAAoBA,EAAM9S,OACvBwjB,GAAY1Q,EAAO,GAAK,GAgG1C,SAAS+iB,GAAK/iB,GACZ,OAAQA,GAASA,EAAM9S,OAAU8S,EAAM,QApzOvCsC,EA83OF,IAAI0gB,GAAexL,IAAAA,SAAkBvF,GACnC,IAAIgR,EAASliB,GAASkR,EAAQoI,IAC9B,OAAQ4I,EAAO/1B,QAAU+1B,EAAO,KAAOhR,EAAO,GAC1CD,GAAiBiR,GACjB,MA0BFC,GAAiB1L,IAAAA,SAAkBvF,GACrC,IAAI/R,EAAWwS,GAAKT,GAChBgR,EAASliB,GAASkR,EAAQoI,IAO9B,OALIna,IAAawS,GAAKuQ,GACpB/iB,OAj6OFoC,EAm6OE2gB,EAAOnzB,MAEDmzB,EAAO/1B,QAAU+1B,EAAO,KAAOhR,EAAO,GAC1CD,GAAiBiR,EAAQzM,GAAYtW,EAAU,IAC/C,MAwBFijB,GAAmB3L,IAAAA,SAAkBvF,GACvC,IAAInR,EAAa4R,GAAKT,GAClBgR,EAASliB,GAASkR,EAAQoI,IAM9B,OAJAvZ,EAAkC,mBAAdA,EAA2BA,OAn8O/CwB,IAq8OE2gB,EAAOnzB,MAEDmzB,EAAO/1B,QAAU+1B,EAAO,KAAOhR,EAAO,GAC1CD,GAAiBiR,OAx8OrB3gB,EAw8OwCxB,GACpC,MAoCN,SAAS4R,GAAK1S,GACZ,IAAI9S,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAOA,EAAS8S,EAAM9S,EAAS,QA/+O/BoV,EAskPF,IAAI8gB,GAAO5L,GAAS6L,IAsBpB,SAASA,GAAQrjB,EAAOkB,GACtB,OAAQlB,GAASA,EAAM9S,QAAUgU,GAAUA,EAAOhU,OAC9CgqB,GAAYlX,EAAOkB,GACnBlB,EAqFN,IAAIsjB,GAASnG,IAAAA,SAAkBnd,EAAOoX,GACpC,IAAIlqB,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACnC4G,EAASqZ,GAAOnN,EAAOoX,GAM3B,OAJAD,GAAWnX,EAAOe,GAASqW,GAAAA,SAAkBhX,GAC3C,OAAO6L,GAAQ7L,EAAOlT,IAAWkT,EAAQA,KACxCsW,KAAKK,KAEDjjB,KA2ET,SAASyU,GAAQvI,GACf,OAAgB,MAATA,EAAgBA,EAAQsI,GAAcxI,KAAKE,GAkapD,IAAIujB,GAAQ/L,IAAAA,SAAkBvF,GAC5B,OAAOsH,GAAS7I,GAAYuB,EAAQ,EAAGgE,IAAmB,OA0BxDuN,GAAUhM,IAAAA,SAAkBvF,GAC9B,IAAI/R,EAAWwS,GAAKT,GAIpB,OAHIgE,GAAkB/V,KACpBA,OAxsQFoC,GA0sQOiX,GAAS7I,GAAYuB,EAAQ,EAAGgE,IAAmB,GAAOO,GAAYtW,EAAU,OAwBrFujB,GAAYjM,IAAAA,SAAkBvF,GAChC,IAAInR,EAAa4R,GAAKT,GAEtB,OADAnR,EAAkC,mBAAdA,EAA2BA,OApuQ/CwB,EAquQOiX,GAAS7I,GAAYuB,EAAQ,EAAGgE,IAAmB,QAruQ1D3T,EAquQ4ExB,MAgG9E,SAAS4iB,GAAM1jB,GACb,IAAMA,IAASA,EAAM9S,OACnB,MAAO,GAET,IAAIA,EAAS,EAOb,OANA8S,EAAQS,GAAYT,GAAAA,SAAgB2jB,GAClC,GAAI1N,GAAkB0N,GAEpB,OADAz2B,EAAS6a,GAAU4b,EAAMz2B,OAAQA,IAC1B,KAGJwV,GAAUxV,GAAAA,SAAiBkT,GAChC,OAAOW,GAASf,EAAOyB,GAAarB,OAyBxC,SAASwjB,GAAU5jB,EAAOE,GACxB,IAAMF,IAASA,EAAM9S,OACnB,MAAO,GAET,IAAI4G,EAAS4vB,GAAM1jB,GACnB,OAAgB,MAAZE,EACKpM,EAEFiN,GAASjN,GAAAA,SAAiB6vB,GAC/B,OAAOjkB,GAAMQ,OAn3QfoC,EAm3QoCqhB,MAwBtC,IAAIE,GAAUrM,IAAAA,SAAkBxX,EAAOkB,GACrC,OAAO+U,GAAkBjW,GACrBuP,GAAevP,EAAOkB,GACtB,MAqBF4iB,GAAMtM,IAAAA,SAAkBvF,GAC1B,OAAOgI,GAAQxZ,GAAYwR,EAAQgE,QA0BjC8N,GAAQvM,IAAAA,SAAkBvF,GAC5B,IAAI/R,EAAWwS,GAAKT,GAIpB,OAHIgE,GAAkB/V,KACpBA,OAj8QFoC,GAm8QO2X,GAAQxZ,GAAYwR,EAAQgE,IAAoBO,GAAYtW,EAAU,OAwB3E8jB,GAAUxM,IAAAA,SAAkBvF,GAC9B,IAAInR,EAAa4R,GAAKT,GAEtB,OADAnR,EAAkC,mBAAdA,EAA2BA,OA79Q/CwB,EA89QO2X,GAAQxZ,GAAYwR,EAAQgE,SA99QnC3T,EA89QkExB,MAmBhEmjB,GAAMzM,GAASkM,IA6DfQ,GAAU1M,IAAAA,SAAkBvF,GAC9B,IAAI/kB,EAAS+kB,EAAO/kB,OAChBgT,EAAWhT,EAAS,EAAI+kB,EAAO/kB,EAAS,QAhjR5CoV,EAmjRA,OADApC,EAA8B,mBAAZA,GAA0B+R,EAAOniB,MAAOoQ,QAljR1DoC,EAmjROshB,GAAU3R,EAAQ/R,MAkC3B,SAASikB,GAAM1sB,GACb,IAAI3D,EAAS4V,GAAOjS,GAEpB,OADA3D,EAAOwW,WAAY,EACZxW,EAsDT,SAASwpB,GAAK7lB,EAAO2sB,GACnB,OAAOA,EAAY3sB,GAmBrB,IAAI4sB,GAAYlH,IAAAA,SAAkBloB,GAChC,IAAI/H,EAAS+H,EAAM/H,OACfyC,EAAQzC,EAAS+H,EAAM,GAAK,EAC5BwC,EAAQrL,KAAKge,YACbga,EAAc,SAAS/hB,GAAU,OAAO8K,GAAO9K,EAAQpN,IAE3D,QAAI/H,EAAS,GAAKd,KAAKie,YAAYnd,SAC7BuK,aAAiBoS,IAAiBoC,GAAQtc,KAGhD8H,EAAQA,EAAMnH,MAAMX,GAAQA,GAASzC,EAAS,EAAI,KAC5Cmd,YAAY5a,KAAK,CACrB,KAAQ6tB,GACR,KAAQ,CAAC8G,GACT,aAhrRF9hB,IAkrRO,IAAIwH,GAAcrS,EAAOrL,KAAKke,WAAWgT,MAAAA,SAActd,GAI5D,OAHI9S,IAAW8S,EAAM9S,QACnB8S,EAAMvQ,UAprRV6S,GAsrRStC,MAZA5T,KAAKkxB,KAAK8G,MA+PjBE,GAAUvI,IAAAA,SAA0BjoB,EAAQ2D,EAAOoK,GACjDuD,GAAetF,KAAKhM,EAAQ+N,KAC5B/N,EAAO+N,GAET8K,GAAgB7Y,EAAQ+N,EAAK,MAuI7B0iB,GAAOvH,GAAW6F,IAqBlB2B,GAAWxH,GAAW8F,IA2G1B,SAASp3B,GAAQiW,EAAYzB,GAE3B,OADW0J,GAAQjI,GAActB,GAAY2M,IACjCrL,EAAY6U,GAAYtW,EAAU,IAuBhD,SAASukB,GAAa9iB,EAAYzB,GAEhC,OADW0J,GAAQjI,GAAcrB,GAAiB8P,IACtCzO,EAAY6U,GAAYtW,EAAU,IA0BhD,IAAIwkB,GAAU3I,IAAAA,SAA0BjoB,EAAQ2D,EAAOoK,GACjDuD,GAAetF,KAAKhM,EAAQ+N,GAC9B/N,EAAO+N,GAAKpS,KAAKgI,GAEjBkV,GAAgB7Y,EAAQ+N,EAAK,CAACpK,OAsE9BktB,GAAYnN,IAAAA,SAAkB7V,EAAYrX,EAAMuV,GAClD,IAAIO,GAAS,EACT+N,EAAwB,mBAAR7jB,EAChBwJ,EAASuhB,GAAY1T,GAAcX,EAAMW,EAAWzU,QAAU,GAKlE,OAHA8f,GAASrL,GAAAA,SAAqBlK,GAC5B3D,IAASsM,GAAS+N,EAASzO,GAAMpV,EAAMmN,EAAOoI,GAAQ2S,GAAW/a,EAAOnN,EAAMuV,MAEzE/L,KA+BL8wB,GAAQ7I,IAAAA,SAA0BjoB,EAAQ2D,EAAOoK,GACnD8K,GAAgB7Y,EAAQ+N,EAAKpK,MA6C/B,SAAS5J,GAAI8T,EAAYzB,GAEvB,OADW0J,GAAQjI,GAAcZ,GAAWqU,IAChCzT,EAAY6U,GAAYtW,EAAU,IAkFhD,IAAI2kB,GAAY9I,IAAAA,SAA0BjoB,EAAQ2D,EAAOoK,GACvD/N,EAAO+N,EAAM,EAAI,GAAGpS,KAAKgI,MAAAA,WACX,MAAO,CAAC,GAAI,OAmSxBqtB,GAAStN,IAAAA,SAAkB7V,EAAY2U,GACzC,GAAkB,MAAd3U,EACF,MAAO,GAET,IAAIzU,EAASopB,EAAUppB,OAMvB,OALIA,EAAS,GAAKmvB,GAAe1a,EAAY2U,EAAU,GAAIA,EAAU,IACnEA,EAAY,GACHppB,EAAS,GAAKmvB,GAAe/F,EAAU,GAAIA,EAAU,GAAIA,EAAU,MAC5EA,EAAY,CAACA,EAAU,KAElBD,GAAY1U,EAAY+O,GAAY4F,EAAW,GAAI,OAqBxDtP,GAAMD,IAAU,WAClB,OAAO5Q,GAAK0O,KAAKmC,OA0DnB,SAASiX,GAAIte,EAAM/O,EAAGwrB,GAGpB,OAFAxrB,EAAIwrB,OA51TJ9Z,EA41TwB1R,EAEjB2vB,GAAW5gB,EAvzTF,SAvChB2C,OAAAA,OAAAA,OAAAA,EA61TA1R,EAAK+O,GAAa,MAAL/O,EAAa+O,EAAKzS,OAAS0D,GAqB1C,SAASm0B,GAAOn0B,EAAG+O,GACjB,IAAI7L,EACJ,GAAmB,mBAAR6L,EACT,MAAM,IAAI5T,GAAU+L,GAGtB,OADAlH,EAAIuvB,GAAUvvB,GACP,WAOL,QANMA,EAAI,IACRkD,EAAS6L,EAAKD,MAAMtT,KAAMsI,YAExB9D,GAAK,IACP+O,OA73TJ2C,GA+3TSxO,GAuCX,IAAIkxB,GAAOxN,IAAAA,SAAkB7X,EAAMC,EAASob,GAC1C,IAAItN,EAv4Ta,EAw4TjB,GAAIsN,EAAS9tB,OAAQ,CACnB,IAAI+tB,EAAU9W,GAAe6W,EAAUuD,GAAUyG,KACjDtX,GAr4TkB,GAu4TpB,OAAO6S,GAAW5gB,EAAM+N,EAAS9N,EAASob,EAAUC,MAgDlDgK,GAAUzN,IAAAA,SAAkBnV,EAAQR,EAAKmZ,GAC3C,IAAItN,EAAUwX,EACd,GAAIlK,EAAS9tB,OAAQ,CACnB,IAAI+tB,EAAU9W,GAAe6W,EAAUuD,GAAU0G,KACjDvX,GA37TkB,GA67TpB,OAAO6S,GAAW1e,EAAK6L,EAASrL,EAAQ2Y,EAAUC,MAsJpD,SAASkK,GAASxlB,EAAM2P,EAAMxjB,GAC5B,IAAIs5B,EACAC,EACAC,EACAxxB,EACAyxB,EACAC,EACAC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTlJ,GAAW,EAEf,GAAmB,mBAAR9c,EACT,MAAM,IAAI5T,GAAU+L,GAUtB,SAAS8tB,EAAWC,GAClB,IAAIhmB,EAAOulB,EACPxlB,EAAUylB,EAKd,OAHAD,EAAWC,OAnpUb/iB,EAopUEmjB,EAAiBI,EACjB/xB,EAAS6L,EAAKD,MAAME,EAASC,GAI/B,SAASimB,EAAYD,GAMnB,OAJAJ,EAAiBI,EAEjBN,EAAUre,GAAW6e,EAAczW,GAE5BoW,EAAUE,EAAWC,GAAQ/xB,EAatC,SAASkyB,EAAaH,GACpB,IAAII,EAAoBJ,EAAOL,EAM/B,YAnrUFljB,IAmrUUkjB,GAA+BS,GAAqB3W,GACzD2W,EAAoB,GAAON,GANJE,EAAOJ,GAM8BH,EAGjE,SAASS,IACP,IAAIF,EAAO7e,KACX,GAAIgf,EAAaH,GACf,OAAOK,EAAaL,GAGtBN,EAAUre,GAAW6e,EA3BvB,SAAuBF,GACrB,IAEIM,EAAc7W,GAFMuW,EAAOL,GAI/B,OAAOG,EACH1d,GAAUke,EAAab,GAJDO,EAAOJ,IAK7BU,EAPN,CA2BmDN,IAGnD,SAASK,EAAaL,GAKpB,OAJAN,OAjsUFjjB,EAqsUMma,GAAY2I,EACPQ,EAAWC,IAEpBT,EAAWC,OAxsUb/iB,EAysUSxO,GAeT,SAASsyB,IACP,IAAIP,EAAO7e,KACPqf,EAAaL,EAAaH,GAM9B,GAJAT,EAAW1wB,UACX2wB,EAAWj5B,KACXo5B,EAAeK,EAEXQ,EAAY,CACd,QAjuUJ/jB,IAiuUQijB,EACF,OAAOO,EAAYN,GAErB,GAAIG,EAIF,OAFA7e,GAAaye,GACbA,EAAUre,GAAW6e,EAAczW,GAC5BsW,EAAWJ,GAMtB,YA9uUFljB,IA2uUMijB,IACFA,EAAUre,GAAW6e,EAAczW,IAE9Bxb,EAIT,OA3GAwb,EAAOqQ,GAASrQ,IAAS,EACrB7Y,GAAS3K,KACX45B,IAAY55B,EAAQ45B,QAEpBJ,GADAK,EAAS,YAAa75B,GACHic,GAAU4X,GAAS7zB,EAAQw5B,UAAY,EAAGhW,GAAQgW,EACrE7I,EAAW,aAAc3wB,IAAYA,EAAQ2wB,SAAWA,GAoG1D2J,EAAUE,OApCV,gBA5sUAhkB,IA6sUMijB,GACFze,GAAaye,GAEfE,EAAiB,EACjBL,EAAWI,EAAeH,EAAWE,OAjtUvCjjB,GAivUA8jB,EAAUG,MA7BV,WACE,YArtUFjkB,IAqtUSijB,EAAwBzxB,EAASoyB,EAAalf,OA6BhDof,EAqBT,IAAII,GAAQhP,IAAAA,SAAkB7X,EAAME,GAClC,OAAOwP,GAAU1P,EAAM,EAAGE,MAsBxB4mB,GAAQjP,IAAAA,SAAkB7X,EAAM2P,EAAMzP,GACxC,OAAOwP,GAAU1P,EAAMggB,GAASrQ,IAAS,EAAGzP,MAqE9C,SAASwiB,GAAQ1iB,EAAM+mB,GACrB,GAAmB,mBAAR/mB,GAAmC,MAAZ+mB,GAAuC,mBAAZA,EAC3D,MAAM,IAAI36B,GAAU+L,GAEtB,IAAI6uB,EAAW,WACb,IAAI9mB,EAAOnL,UACPmN,EAAM6kB,EAAWA,EAAShnB,MAAMtT,KAAMyT,GAAQA,EAAK,GACnDqD,EAAQyjB,EAASzjB,MAErB,GAAIA,EAAMC,IAAItB,GACZ,OAAOqB,EAAMmK,IAAIxL,GAEnB,IAAI/N,EAAS6L,EAAKD,MAAMtT,KAAMyT,GAE9B,OADA8mB,EAASzjB,MAAQA,EAAMjY,IAAI4W,EAAK/N,IAAWoP,EACpCpP,GAGT,OADA6yB,EAASzjB,MAAQ,IAAKmf,GAAQuE,OAASzb,IAChCwb,EA0BT,SAASp6B,GAAOiU,GACd,GAAwB,mBAAbA,EACT,MAAM,IAAIzU,GAAU+L,GAEtB,OAAO,WACL,IAAI+H,EAAOnL,UACX,OAAQmL,EAAK3S,QACX,KAAK,EAAG,OAAQsT,EAAUV,KAAK1T,MAC/B,KAAK,EAAG,OAAQoU,EAAUV,KAAK1T,KAAMyT,EAAK,IAC1C,KAAK,EAAG,OAAQW,EAAUV,KAAK1T,KAAMyT,EAAK,GAAIA,EAAK,IACnD,KAAK,EAAG,OAAQW,EAAUV,KAAK1T,KAAMyT,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE9D,OAAQW,EAAUd,MAAMtT,KAAMyT,IAlClCwiB,GAAQuE,MAAQzb,GA2FhB,IAAI0b,GAAWrM,IAAAA,SAAkB7a,EAAMmnB,GAKrC,IAAIC,GAJJD,EAAmC,GAArBA,EAAW55B,QAAe0c,GAAQkd,EAAW,IACvD/lB,GAAS+lB,EAAW,GAAIhkB,GAAU0T,OAClCzV,GAAS2P,GAAYoW,EAAY,GAAIhkB,GAAU0T,QAEtBtpB,OAC7B,OAAOsqB,IAAAA,SAAkB3X,GAIvB,IAHA,IAAIO,GAAS,EACTlT,EAAS+a,GAAUpI,EAAK3S,OAAQ65B,KAE3B3mB,EAAQlT,GACf2S,EAAKO,GAAS0mB,EAAW1mB,GAAON,KAAK1T,KAAMyT,EAAKO,IAElD,OAAOV,GAAMC,EAAMvT,KAAMyT,SAqCzB9N,GAAUylB,IAAAA,SAAkB7X,EAAMqb,GAEpC,OAAOuF,GAAW5gB,EAn+UE,QArCpB2C,EAwgVsD0Y,EADxC7W,GAAe6W,EAAUuD,GAAUxsB,SAoC/Ci1B,GAAexP,IAAAA,SAAkB7X,EAAMqb,GAEzC,OAAOuF,GAAW5gB,EAvgVQ,QAtC1B2C,EA6iV4D0Y,EAD9C7W,GAAe6W,EAAUuD,GAAUyI,SA0B/CC,GAAQ9J,IAAAA,SAAkBxd,EAAMyX,GAClC,OAAOmJ,GAAW5gB,EA/hVA,SAxClB2C,OAAAA,OAAAA,EAukV0E8U,MAia5E,SAAS1K,GAAGjV,EAAOoa,GACjB,OAAOpa,IAAUoa,GAAUpa,GAAUA,GAASoa,GAAUA,EA0B1D,IAAIqV,GAAKxH,GAA0B9N,IAyB/BuV,GAAMzH,IAAAA,SAAmCjoB,EAAOoa,GAClD,OAAOpa,GAASoa,KAqBdhG,GAAc8G,GAAgB,WAAa,OAAOje,UAApB,IAAsCie,GAAkB,SAASlb,GACjG,OAAOkS,GAAalS,IAAU2N,GAAetF,KAAKrI,EAAO,YACtD0O,GAAqBrG,KAAKrI,EAAO,WA0BlCmS,GAAU5I,EAAM4I,QAmBhB7K,GAAgBD,GAAoBgE,GAAUhE,IA75PlD,SAA2BrH,GACzB,OAAOkS,GAAalS,IAAUga,GAAWha,IAAUuB,GAu7PrD,SAASqc,GAAY5d,GACnB,OAAgB,MAATA,GAAiB6pB,GAAS7pB,EAAMvK,UAAYgkB,GAAWzZ,GA4BhE,SAASwe,GAAkBxe,GACzB,OAAOkS,GAAalS,IAAU4d,GAAY5d,GA0C5C,IAAIiQ,GAAWD,IAAkBia,GAmB7BziB,GAASD,GAAa8D,GAAU9D,IAxgQpC,SAAoBvH,GAClB,OAAOkS,GAAalS,IAAUga,GAAWha,IAAUW,GA+qQrD,SAASgvB,GAAQ3vB,GACf,IAAKkS,GAAalS,GAChB,OAAO,EAET,IAAIwW,EAAMwD,GAAWha,GACrB,OAAOwW,GAAO5V,GA9yWF,yBA8yWc4V,GACC,iBAAjBxW,EAAM6b,SAA4C,iBAAd7b,EAAMZ,OAAqBqf,GAAcze,GAkDzF,SAASyZ,GAAWzZ,GAClB,IAAKhB,GAASgB,GACZ,OAAO,EAIT,IAAIwW,EAAMwD,GAAWha,GACrB,OAAOwW,GAAO3V,GAAW2V,GAAO1V,GA32WrB,0BA22W+B0V,GA/1W/B,kBA+1WkDA,EA6B/D,SAASoZ,GAAU5vB,GACjB,MAAuB,iBAATA,GAAqBA,GAAS0oB,GAAU1oB,GA6BxD,SAAS6pB,GAAS7pB,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GAj8Wf,iBA69WrB,SAAShB,GAASgB,GAChB,IAAI/H,SAAc+H,EAClB,OAAgB,MAATA,IAA0B,UAAR/H,GAA4B,YAARA,GA2B/C,SAASia,GAAalS,GACpB,OAAgB,MAATA,GAAiC,iBAATA,EAoBjC,IAAI0H,GAAQD,GAAY4D,GAAU5D,IA5xQlC,SAAmBzH,GACjB,OAAOkS,GAAalS,IAAUyW,GAAOzW,IAAUe,GA6+QjD,SAAS8uB,GAAS7vB,GAChB,MAAuB,iBAATA,GACXkS,GAAalS,IAAUga,GAAWha,IAAUgB,EA+BjD,SAASyd,GAAcze,GACrB,IAAKkS,GAAalS,IAAUga,GAAWha,IAAUiB,EAC/C,OAAO,EAET,IAAIuR,EAAQjE,GAAavO,GACzB,GAAc,OAAVwS,EACF,OAAO,EAET,IAAIwE,EAAOrJ,GAAetF,KAAKmK,EAAO,gBAAkBA,EAAMzS,YAC9D,MAAsB,mBAARiX,GAAsBA,aAAgBA,GAClDvJ,GAAapF,KAAK2O,IAAShJ,GAoB/B,IAAIpG,GAAWD,GAAe0D,GAAU1D,IA59QxC,SAAsB3H,GACpB,OAAOkS,GAAalS,IAAUga,GAAWha,IAAUkB,GA6gRjD4G,GAAQD,GAAYwD,GAAUxD,IAngRlC,SAAmB7H,GACjB,OAAOkS,GAAalS,IAAUyW,GAAOzW,IAAUmB,GAqhRjD,SAAS/D,GAAS4C,GAChB,MAAuB,iBAATA,IACVmS,GAAQnS,IAAUkS,GAAalS,IAAUga,GAAWha,IAAUoB,EAoBpE,SAAS2X,GAAS/Y,GAChB,MAAuB,iBAATA,GACXkS,GAAalS,IAAUga,GAAWha,IAAUqB,EAoBjD,IAAI2G,GAAeD,GAAmBsD,GAAUtD,IAvjRhD,SAA0B/H,GACxB,OAAOkS,GAAalS,IAClB6pB,GAAS7pB,EAAMvK,WAAauQ,GAAegU,GAAWha,KA6oRtD8vB,GAAK7H,GAA0BvK,IAyB/BqS,GAAM9H,IAAAA,SAAmCjoB,EAAOoa,GAClD,OAAOpa,GAASoa,KA0BlB,SAAS4V,GAAQhwB,GACf,IAAKA,EACH,MAAO,GAET,GAAI4d,GAAY5d,GACd,OAAO5C,GAAS4C,GAAS8M,GAAc9M,GAAS6U,GAAU7U,GAE5D,GAAI8O,IAAe9O,EAAM8O,IACvB,OAv8VN,SAAyBC,GAIvB,IAHA,IAAIgF,EACA1X,EAAS,KAEJ0X,EAAOhF,EAASkhB,QAAQC,MAC/B7zB,EAAOrE,KAAK+b,EAAK/T,OAEnB,OAAO3D,EAPT,CAu8V6B2D,EAAM8O,OAE/B,IAAI0H,EAAMC,GAAOzW,GAGjB,OAFWwW,GAAOzV,EAASuL,GAAckK,GAAOrV,EAASwL,GAAalD,IAE1DzJ,GA0Bd,SAASgoB,GAAShoB,GAChB,OAAKA,GAGLA,EAAQkoB,GAASloB,MAzkYN,EAAA,GA0kYeA,KAAU,EAAA,EAxkYtB,uBAykYAA,EAAQ,GAAK,EAAI,GAGxBA,GAAUA,EAAQA,EAAQ,EAPd,IAAVA,EAAcA,EAAQ,EAoCjC,SAAS0oB,GAAU1oB,GACjB,IAAI3D,EAAS2rB,GAAShoB,GAClBmwB,EAAY9zB,EAAS,EAEzB,OAAOA,GAAWA,EAAU8zB,EAAY9zB,EAAS8zB,EAAY9zB,EAAU,EA8BzE,SAAS+zB,GAASpwB,GAChB,OAAOA,EAAQ8U,GAAU4T,GAAU1oB,GAAQ,EAxoYxB,YAwoY+C,EA0BpE,SAASkoB,GAASloB,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAI+Y,GAAS/Y,GACX,OA1qYI,IA4qYN,GAAIhB,GAASgB,GAAQ,CACnB,IAAIoa,EAAgC,mBAAjBpa,EAAM+R,QAAwB/R,EAAM+R,UAAY/R,EACnEA,EAAQhB,GAASob,GAAUA,EAAQ,GAAMA,EAE3C,GAAoB,iBAATpa,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQkL,GAASlL,GACjB,IAAIqwB,EAAWzsB,GAAWrG,KAAKyC,GAC/B,OAAQqwB,GAAYvsB,GAAUvG,KAAKyC,GAC/BqG,GAAarG,EAAMnH,MAAM,GAAIw3B,EAAW,EAAI,GAC3C1sB,GAAWpG,KAAKyC,GAvrYf,KAurY+BA,EA2BvC,SAAS0e,GAAc1e,GACrB,OAAOyV,GAAWzV,EAAO8W,GAAO9W,IAsDlC,SAAS0N,GAAS1N,GAChB,OAAgB,MAATA,EAAgB,GAAK6hB,GAAa7hB,GAqC3C,IAAIswB,GAAS9L,IAAAA,SAAwB5Z,EAAQrI,GAC3C,GAAIkb,GAAYlb,IAAWqb,GAAYrb,GACrCkT,GAAWlT,EAAQvO,GAAKuO,GAASqI,QAGnC,IAAK,IAAIR,KAAO7H,EACVoL,GAAetF,KAAK9F,EAAQ6H,IAC9B+K,GAAYvK,EAAQR,EAAK7H,EAAO6H,OAoClCmmB,GAAW/L,IAAAA,SAAwB5Z,EAAQrI,GAC7CkT,GAAWlT,EAAQuU,GAAOvU,GAASqI,MAgCjC4lB,GAAehM,IAAAA,SAAwB5Z,EAAQrI,EAAQ4b,EAAUjI,GACnET,GAAWlT,EAAQuU,GAAOvU,GAASqI,EAAQsL,MA+BzCua,GAAajM,IAAAA,SAAwB5Z,EAAQrI,EAAQ4b,EAAUjI,GACjET,GAAWlT,EAAQvO,GAAKuO,GAASqI,EAAQsL,MAoBvCwa,GAAKhL,GAAShQ,IA8DdngB,GAAWwqB,IAAAA,SAAkBnV,EAAQ8Z,GACvC9Z,EAAS7W,GAAO6W,GAEhB,IAAIjC,GAAS,EACTlT,EAASivB,EAAQjvB,OACjBkvB,EAAQlvB,EAAS,EAAIivB,EAAQ,QA/iZjC7Z,EAqjZA,IAJI8Z,GAASC,GAAeF,EAAQ,GAAIA,EAAQ,GAAIC,KAClDlvB,EAAS,KAGFkT,EAAQlT,GAMf,IALA,IAAI8M,EAASmiB,EAAQ/b,GACjB4C,EAAQuL,GAAOvU,GACfouB,GAAc,EACdC,EAAcrlB,EAAM9V,SAEfk7B,EAAaC,GAAa,CACjC,IAAIxmB,EAAMmB,EAAMolB,GACZ3wB,EAAQ4K,EAAOR,SA7jZvBS,IA+jZQ7K,GACCiV,GAAGjV,EAAOuN,GAAYnD,MAAUuD,GAAetF,KAAKuC,EAAQR,MAC/DQ,EAAOR,GAAO7H,EAAO6H,IAK3B,OAAOQ,KAsBLimB,GAAe9Q,IAAAA,SAAkB3X,GAEnC,OADAA,EAAKpQ,UA7lZL6S,EA6lZqBqe,IACdjhB,GAAM6oB,QA9lZbjmB,EA8lZmCzC,MAgSrC,SAASwN,GAAIhL,EAAQ/X,EAAM20B,GACzB,IAAInrB,EAAmB,MAAVuO,OA/3ZbC,EA+3Z0C6O,GAAQ9O,EAAQ/X,GAC1D,YAh4ZAgY,IAg4ZOxO,EAAuBmrB,EAAenrB,EA4D/C,SAAS4hB,GAAMrT,EAAQ/X,GACrB,OAAiB,MAAV+X,GAAkB+e,GAAQ/e,EAAQ/X,EAAMynB,IAqBjD,IAAIyW,GAAS3J,IAAAA,SAAwB/qB,EAAQ2D,EAAOoK,GACrC,MAATpK,GACyB,mBAAlBA,EAAM0N,WACf1N,EAAQ+N,GAAqB1F,KAAKrI,IAGpC3D,EAAO2D,GAASoK,IACfmW,GAASnD,KA4BR4T,GAAW5J,IAAAA,SAAwB/qB,EAAQ2D,EAAOoK,GACvC,MAATpK,GACyB,mBAAlBA,EAAM0N,WACf1N,EAAQ+N,GAAqB1F,KAAKrI,IAGhC2N,GAAetF,KAAKhM,EAAQ2D,GAC9B3D,EAAO2D,GAAOhI,KAAKoS,GAEnB/N,EAAO2D,GAAS,CAACoK,KAElB2U,IAoBCkS,GAASlR,GAAShF,IA8BtB,SAAS/mB,GAAK4W,GACZ,OAAOgT,GAAYhT,GAAUoJ,GAAcpJ,GAAU4S,GAAS5S,GA0BhE,SAASkM,GAAOlM,GACd,OAAOgT,GAAYhT,GAAUoJ,GAAcpJ,GAAQ,GAloTrD,SAAoBA,GAClB,IAAK5L,GAAS4L,GACZ,OA09FJ,SAAsBA,GACpB,IAAIvO,EAAS,GACb,GAAc,MAAVuO,EACF,IAAK,IAAIR,KAAOrW,GAAO6W,GACrBvO,EAAOrE,KAAKoS,GAGhB,OAAO/N,EAPT,CA19FwBuO,GAEtB,IAAIsmB,EAAUzT,GAAY7S,GACtBvO,EAAS,GAEb,IAAK,IAAI+N,KAAOQ,GACD,eAAPR,IAAyB8mB,GAAYvjB,GAAetF,KAAKuC,EAAQR,KACrE/N,EAAOrE,KAAKoS,GAGhB,OAAO/N,EAZT,CAkoTwEuO,GAuGxE,IAAIumB,GAAQ3M,IAAAA,SAAwB5Z,EAAQrI,EAAQ4b,GAClDD,GAAUtT,EAAQrI,EAAQ4b,MAkCxB2S,GAAYtM,IAAAA,SAAwB5Z,EAAQrI,EAAQ4b,EAAUjI,GAChEgI,GAAUtT,EAAQrI,EAAQ4b,EAAUjI,MAuBlCkb,GAAO1L,IAAAA,SAAkB9a,EAAQpN,GACnC,IAAInB,EAAS,GACb,GAAc,MAAVuO,EACF,OAAOvO,EAET,IAAI+Z,GAAS,EACb5Y,EAAQ8L,GAAS9L,GAAAA,SAAgB3K,GAG/B,OAFAA,EAAO8mB,GAAS9mB,EAAM+X,GACtBwL,IAAWA,EAASvjB,EAAK4C,OAAS,GAC3B5C,KAET4iB,GAAW7K,EAAQ6M,GAAa7M,GAASvO,GACrC+Z,IACF/Z,EAAS2Z,GAAU3Z,EAAQg1B,EAAwDlI,KAGrF,IADA,IAAI1zB,EAAS+H,EAAM/H,OACZA,KACLoqB,GAAUxjB,EAAQmB,EAAM/H,IAE1B,OAAO4G,KA4CL8Q,GAAOuY,IAAAA,SAAkB9a,EAAQpN,GACnC,OAAiB,MAAVoN,EAAiB,GAnmT1B,SAAkBA,EAAQpN,GACxB,OAAO+hB,GAAW3U,EAAQpN,GAAAA,SAAgBwC,EAAOnN,GAC/C,OAAOorB,GAAMrT,EAAQ/X,MAFzB,CAmmTwC+X,EAAQpN,MAqBhD,SAAS8zB,GAAO1mB,EAAQ7B,GACtB,GAAc,MAAV6B,EACF,MAAO,GAET,IAAIW,EAAQjC,GAASmO,GAAa7M,IAAAA,SAAkB2mB,GAClD,MAAO,CAACA,MAGV,OADAxoB,EAAYgW,GAAYhW,GACjBwW,GAAW3U,EAAQW,GAAAA,SAAgBvL,EAAOnN,GAC/C,OAAOkW,EAAU/I,EAAOnN,EAAK,OA4IjC,IAAI2+B,GAAU3I,GAAc70B,IA0BxBy9B,GAAY5I,GAAc/R,IA4K9B,SAASrN,GAAOmB,GACd,OAAiB,MAAVA,EAAiB,GAAKU,GAAWV,EAAQ5W,GAAK4W,IAkNvD,IAAI8mB,GAAYzM,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GAEtD,OADAgpB,EAAOA,EAAKx2B,cACLkB,GAAUsM,EAAQipB,GAAWD,GAAQA,MAkB9C,SAASC,GAAWzmB,GAClB,OAAO0mB,GAAWnkB,GAASvC,GAAQhQ,eAqBrC,SAASiqB,GAAOja,GAEd,OADAA,EAASuC,GAASvC,KACDA,EAAOrS,QAAQkL,GAASiI,IAAcnT,QAAQ2M,GAAa,IAsH9E,IAAIqsB,GAAY7M,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GACtD,OAAOtM,GAAUsM,EAAQ,IAAM,IAAMgpB,EAAKx2B,iBAuBxC42B,GAAY9M,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GACtD,OAAOtM,GAAUsM,EAAQ,IAAM,IAAMgpB,EAAKx2B,iBAoBxC62B,GAAalN,GAAgB,eA0N7BmN,GAAYhN,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GACtD,OAAOtM,GAAUsM,EAAQ,IAAM,IAAMgpB,EAAKx2B,iBAgExC+2B,GAAYjN,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GACtD,OAAOtM,GAAUsM,EAAQ,IAAM,IAAMkpB,GAAWF,MAsiB9CQ,GAAYlN,IAAAA,SAA0B5oB,EAAQs1B,EAAMhpB,GACtD,OAAOtM,GAAUsM,EAAQ,IAAM,IAAMgpB,EAAKS,iBAoBxCP,GAAa/M,GAAgB,eAqBjC,SAASK,GAAMha,EAAQ/W,EAASuwB,GAI9B,OAHAxZ,EAASuC,GAASvC,QA/6dlBN,KAg7dAzW,EAAUuwB,OAh7dV9Z,EAg7d8BzW,GAnyblC,SAAwB+W,GACtB,OAAOtF,GAAiBtI,KAAK4N,GAD/B,CAsyb4BA,GA1jb5B,SAAsBA,GACpB,OAAOA,EAAOzW,MAAMiR,KAAkB,GADxC,CA0jbmDwF,GAzrcnD,SAAoBA,GAClB,OAAOA,EAAOzW,MAAM4O,IAAgB,GADtC,CAyrcwE6H,GAE7DA,EAAOzW,MAAMN,IAAY,GA2BlC,IAAIi+B,GAAUtS,IAAAA,SAAkB7X,EAAME,GACpC,IACE,OAAOH,GAAMC,OAl9df2C,EAk9dgCzC,GAC9B,MAAOhB,GACP,OAAOuoB,GAAQvoB,GAAKA,EAAI,IAAIhM,GAAMgM,OA8BlCkrB,GAAU5M,IAAAA,SAAkB9a,EAAQ2nB,GAKtC,OAJA3pB,GAAU2pB,GAAAA,SAAsBnoB,GAC9BA,EAAMwP,GAAMxP,GACZ8K,GAAgBtK,EAAQR,EAAKmjB,GAAK3iB,EAAOR,GAAMQ,OAE1CA,KAqGT,SAAS2V,GAASvgB,GAChB,OAAO,WACL,OAAOA,GAkDX,IAAIwyB,GAAO/M,KAuBPgN,GAAYhN,IAAW,GAkB3B,SAASrI,GAASpd,GAChB,OAAOA,EA6CT,SAASyI,GAASP,GAChB,OAAOiV,GAA4B,mBAARjV,EAAqBA,EAAO8N,GAAU9N,EAjte/C,IAwzepB,IAAIwqB,GAAS3S,IAAAA,SAAkBltB,EAAMuV,GACnC,OAAO,SAASwC,GACd,OAAOmQ,GAAWnQ,EAAQ/X,EAAMuV,OA2BhCuqB,GAAW5S,IAAAA,SAAkBnV,EAAQxC,GACvC,OAAO,SAASvV,GACd,OAAOkoB,GAAWnQ,EAAQ/X,EAAMuV,OAwCpC,SAASwqB,GAAMhoB,EAAQrI,EAAQlO,GAC7B,IAAIkX,EAAQvX,GAAKuO,GACbgwB,EAAc/Y,GAAcjX,EAAQgJ,GAEzB,MAAXlX,GACE2K,GAASuD,KAAYgwB,EAAY98B,SAAW8V,EAAM9V,UACtDpB,EAAUkO,EACVA,EAASqI,EACTA,EAASjW,KACT49B,EAAc/Y,GAAcjX,EAAQvO,GAAKuO,KAE3C,IAAImqB,IAAU1tB,GAAS3K,IAAY,UAAWA,IAAcA,EAAQq4B,OAChEhW,EAAS+C,GAAW7O,GAqBxB,OAnBAhC,GAAU2pB,GAAAA,SAAsBxN,GAC9B,IAAI7c,EAAO3F,EAAOwiB,GAClBna,EAAOma,GAAc7c,EACjBwO,IACF9L,EAAOhV,UAAUmvB,GAAc,WAC7B,IAAIrS,EAAW/d,KAAKke,UACpB,GAAI6Z,GAASha,EAAU,CACrB,IAAIrW,EAASuO,EAAOjW,KAAKge,aACrB2P,EAAUjmB,EAAOuW,YAAciC,GAAUlgB,KAAKie,aAIlD,OAFA0P,EAAQtqB,KAAK,CAAE,KAAQkQ,EAAM,KAAQjL,UAAW,QAAW2N,IAC3DvO,EAAOwW,UAAYH,EACZrW,EAET,OAAO6L,EAAKD,MAAM2C,EAAQpB,GAAU,CAAC7U,KAAKqL,SAAU/C,iBAKnD2N,EAmCT,SAASge,MAiDT,IAAIiK,GAAOpL,GAAWne,IA8BlBwpB,GAAYrL,GAAW3e,IAiCvBiqB,GAAWtL,GAAW3d,IAwB1B,SAASyT,GAAS1qB,GAChB,OAAOkrB,GAAMlrB,GAAQmX,GAAa4P,GAAM/mB,IAh3X1C,SAA0BA,GACxB,OAAO,SAAS+X,GACd,OAAO8O,GAAQ9O,EAAQ/X,IAF3B,CAg3XoEA,GAuEpE,IAAImgC,GAAQlL,KAsCRmL,GAAanL,IAAY,GAoB7B,SAAS4B,KACP,MAAO,GAgBT,SAASO,KACP,OAAO,EA+JT,IA2oBM1nB,GA3oBFsR,GAAMyT,IAAAA,SAA6B4L,EAAQC,GAC7C,OAAOD,EAASC,IACf,GAuBCxjB,GAAO6Y,GAAY,QAiBnB4K,GAAS9L,IAAAA,SAA6B+L,EAAUC,GAClD,OAAOD,EAAWC,IACjB,GAuBCzjB,GAAQ2Y,GAAY,SAwKpB+K,GAAWjM,IAAAA,SAA6BkM,EAAYC,GACtD,OAAOD,EAAaC,IACnB,GAuBCC,GAAQlL,GAAY,SAiBpBmL,GAAWrM,IAAAA,SAA6BsM,EAASC,GACnD,OAAOD,EAAUC,IAChB,GAgmBH,OA1iBA5hB,GAAO6hB,MAp6MP,SAAe36B,EAAG+O,GAChB,GAAmB,mBAARA,EACT,MAAM,IAAI5T,GAAU+L,GAGtB,OADAlH,EAAIuvB,GAAUvvB,GACP,WACL,KAAMA,EAAI,EACR,OAAO+O,EAAKD,MAAMtT,KAAMsI,aA85M9BgV,GAAOuU,IAAMA,GACbvU,GAAOqe,OAASA,GAChBre,GAAOse,SAAWA,GAClBte,GAAOue,aAAeA,GACtBve,GAAOwe,WAAaA,GACpBxe,GAAOye,GAAKA,GACZze,GAAOqb,OAASA,GAChBrb,GAAOsb,KAAOA,GACdtb,GAAOqgB,QAAUA,GACjBrgB,GAAOub,QAAUA,GACjBvb,GAAO8hB,UAl8KP,WACE,IAAK92B,UAAUxH,OACb,MAAO,GAET,IAAIuK,EAAQ/C,UAAU,GACtB,OAAOkV,GAAQnS,GAASA,EAAQ,CAACA,IA87KnCiS,GAAOya,MAAQA,GACfza,GAAO+hB,MApgTP,SAAezrB,EAAOgE,EAAMoY,GAExBpY,GADGoY,EAAQC,GAAerc,EAAOgE,EAAMoY,QA5uNzC9Z,IA4uNkD0B,GACzC,EAEA+D,GAAUoY,GAAUnc,GAAO,GAEpC,IAAI9W,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,IAAKA,GAAU8W,EAAO,EACpB,MAAO,GAMT,IAJA,IAAI5D,EAAQ,EACRM,EAAW,EACX5M,EAASkN,EAAMmG,GAAWja,EAAS8W,IAEhC5D,EAAQlT,GACb4G,EAAO4M,KAAcwX,GAAUlY,EAAOI,EAAQA,GAAS4D,GAEzD,OAAOlQ,GAo/ST4V,GAAOgiB,QAl+SP,SAAiB1rB,GAMf,IALA,IAAII,GAAS,EACTlT,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACnCwT,EAAW,EACX5M,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACd3I,IACF3D,EAAO4M,KAAcjJ,GAGzB,OAAO3D,GAu9ST4V,GAAO3T,OA97SP,WACE,IAAI7I,EAASwH,UAAUxH,OACvB,IAAKA,EACH,MAAO,GAMT,IAJA,IAAI2S,EAAOmB,EAAM9T,EAAS,GACtB8S,EAAQtL,UAAU,GAClB0L,EAAQlT,EAELkT,KACLP,EAAKO,EAAQ,GAAK1L,UAAU0L,GAE9B,OAAOa,GAAU2I,GAAQ5J,GAASsM,GAAUtM,GAAS,CAACA,GAAQ0Q,GAAY7Q,EAAM,KAm7SlF6J,GAAOiiB,KA3tCP,SAAc3b,GACZ,IAAI9iB,EAAkB,MAAT8iB,EAAgB,EAAIA,EAAM9iB,OACnC4xB,EAAatI,KASjB,OAPAxG,EAAS9iB,EAAc6T,GAASiP,GAAAA,SAAgBoQ,GAC9C,GAAsB,mBAAXA,EAAK,GACd,MAAM,IAAIr0B,GAAU+L,GAEtB,MAAO,CAACgnB,EAAWsB,EAAK,IAAKA,EAAK,OAJlB,GAOX5I,IAAAA,SAAkB3X,GAEvB,IADA,IAAIO,GAAS,IACJA,EAAQlT,GAAQ,CACvB,IAAIkzB,EAAOpQ,EAAM5P,GACjB,GAAIV,GAAM0gB,EAAK,GAAIh0B,KAAMyT,GACvB,OAAOH,GAAM0gB,EAAK,GAAIh0B,KAAMyT,QA4sCpC6J,GAAOkiB,SA9qCP,SAAkB5xB,GAChB,OAz5YF,SAAsBA,GACpB,IAAIgJ,EAAQvX,GAAKuO,GACjB,OAAO,SAASqI,GACd,OAAO+M,GAAe/M,EAAQrI,EAAQgJ,IAH1C,CAy5YsByK,GAAUzT,EA/ieZ,KA6tgBpB0P,GAAOsO,SAAWA,GAClBtO,GAAO4a,QAAUA,GACjB5a,GAAOtS,OAtuHP,SAAgB/J,EAAWw+B,GACzB,IAAI/3B,EAASkW,GAAW3c,GACxB,OAAqB,MAAdw+B,EAAqB/3B,EAASmZ,GAAWnZ,EAAQ+3B,IAquH1DniB,GAAOoiB,MAzuMP,SAASA,EAAMnsB,EAAMue,EAAO9B,GAE1B,IAAItoB,EAASysB,GAAW5gB,EA7+TN,OAnClB2C,OAAAA,OAAAA,OAAAA,OAAAA,EA+gUA4b,EAAQ9B,OA/gUR9Z,EA+gU4B4b,GAG5B,OADApqB,EAAO2P,YAAcqoB,EAAMroB,YACpB3P,GAsuMT4V,GAAOqiB,WA7rMP,SAASA,EAAWpsB,EAAMue,EAAO9B,GAE/B,IAAItoB,EAASysB,GAAW5gB,EAzhUA,QApCxB2C,OAAAA,OAAAA,OAAAA,OAAAA,EA4jUA4b,EAAQ9B,OA5jUR9Z,EA4jU4B4b,GAG5B,OADApqB,EAAO2P,YAAcsoB,EAAWtoB,YACzB3P,GA0rMT4V,GAAOyb,SAAWA,GAClBzb,GAAO1c,SAAWA,GAClB0c,GAAO4e,aAAeA,GACtB5e,GAAO8c,MAAQA,GACf9c,GAAO+c,MAAQA,GACf/c,GAAOgZ,WAAaA,GACpBhZ,GAAOiZ,aAAeA,GACtBjZ,GAAOkZ,eAAiBA,GACxBlZ,GAAOsiB,KAt0SP,SAAchsB,EAAOpP,EAAGwrB,GACtB,IAAIlvB,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAKA,EAIEgrB,GAAUlY,GADjBpP,EAAKwrB,QAh8NL9Z,IAg8Nc1R,EAAmB,EAAIuvB,GAAUvvB,IACnB,EAAI,EAAIA,EAAG1D,GAH9B,IAo0SXwc,GAAOuiB,UArySP,SAAmBjsB,EAAOpP,EAAGwrB,GAC3B,IAAIlvB,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAKA,EAKEgrB,GAAUlY,EAAO,GADxBpP,EAAI1D,GADJ0D,EAAKwrB,QAl+NL9Z,IAk+Nc1R,EAAmB,EAAIuvB,GAAUvvB,KAEhB,EAAI,EAAIA,GAJ9B,IAmySX8Y,GAAOwiB,eAzvSP,SAAwBlsB,EAAOQ,GAC7B,OAAQR,GAASA,EAAM9S,OACnB0sB,GAAU5Z,EAAOwW,GAAYhW,EAAW,IAAI,GAAM,GAClD,IAuvSNkJ,GAAOyiB,UAjtSP,SAAmBnsB,EAAOQ,GACxB,OAAQR,GAASA,EAAM9S,OACnB0sB,GAAU5Z,EAAOwW,GAAYhW,EAAW,IAAI,GAC5C,IA+sSNkJ,GAAOxf,KA/qSP,SAAc8V,EAAOvI,EAAO9H,EAAO8D,GACjC,IAAIvG,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAKA,GAGDyC,GAAyB,iBAATA,GAAqB0sB,GAAerc,EAAOvI,EAAO9H,KACpEA,EAAQ,EACR8D,EAAMvG,GAzvIV,SAAkB8S,EAAOvI,EAAO9H,EAAO8D,GACrC,IAAIvG,EAAS8S,EAAM9S,OAWnB,KATAyC,EAAQwwB,GAAUxwB,IACN,IACVA,GAASA,EAAQzC,EAAS,EAAKA,EAASyC,IAE1C8D,OA32FA6O,IA22FO7O,GAAqBA,EAAMvG,EAAUA,EAASizB,GAAU1sB,IACrD,IACRA,GAAOvG,GAETuG,EAAM9D,EAAQ8D,EAAM,EAAIo0B,GAASp0B,GAC1B9D,EAAQ8D,GACbuM,EAAMrQ,KAAW8H,EAEnB,OAAOuI,EAfT,CA2vIkBA,EAAOvI,EAAO9H,EAAO8D,IAN5B,IA6qSXiW,GAAO7c,OA3vOP,SAAgB8U,EAAYnB,GAE1B,OADWoJ,GAAQjI,GAAclB,GAAcgQ,IACnC9O,EAAY6U,GAAYhW,EAAW,KA0vOjDkJ,GAAO0iB,QAvqOP,SAAiBzqB,EAAYzB,GAC3B,OAAOwQ,GAAY7iB,GAAI8T,EAAYzB,GAAW,IAuqOhDwJ,GAAO2iB,YAhpOP,SAAqB1qB,EAAYzB,GAC/B,OAAOwQ,GAAY7iB,GAAI8T,EAAYzB,GAhkSxB,EAAA,IAgtgBbwJ,GAAO4iB,aAxnOP,SAAsB3qB,EAAYzB,EAAUyQ,GAE1C,OADAA,OAlpSArO,IAkpSQqO,EAAsB,EAAIwP,GAAUxP,GACrCD,GAAY7iB,GAAI8T,EAAYzB,GAAWyQ,IAunOhDjH,GAAOsX,QAAUA,GACjBtX,GAAO6iB,YAviSP,SAAqBvsB,GAEnB,OADsB,MAATA,GAAoBA,EAAM9S,OACvBwjB,GAAY1Q,EA7qOjB,EAAA,GA6qOoC,IAsiSjD0J,GAAO8iB,aA/gSP,SAAsBxsB,EAAO2Q,GAE3B,OADsB,MAAT3Q,GAAoBA,EAAM9S,OAKhCwjB,GAAY1Q,EADnB2Q,OAlwOArO,IAkwOQqO,EAAsB,EAAIwP,GAAUxP,IAFnC,IA6gSXjH,GAAO+iB,KAz9LP,SAAc9sB,GACZ,OAAO4gB,GAAW5gB,EA5wUD,MAqugBnB+J,GAAOugB,KAAOA,GACdvgB,GAAOwgB,UAAYA,GACnBxgB,GAAOgjB,UA3/RP,SAAmB1c,GAKjB,IAJA,IAAI5P,GAAS,EACTlT,EAAkB,MAAT8iB,EAAgB,EAAIA,EAAM9iB,OACnC4G,EAAS,KAEJsM,EAAQlT,GAAQ,CACvB,IAAIkzB,EAAOpQ,EAAM5P,GACjBtM,EAAOssB,EAAK,IAAMA,EAAK,GAEzB,OAAOtsB,GAm/RT4V,GAAOijB,UA38GP,SAAmBtqB,GACjB,OAAiB,MAAVA,EAAiB,GAAK4O,GAAc5O,EAAQ5W,GAAK4W,KA28G1DqH,GAAOkjB,YAj7GP,SAAqBvqB,GACnB,OAAiB,MAAVA,EAAiB,GAAK4O,GAAc5O,EAAQkM,GAAOlM,KAi7G5DqH,GAAOgb,QAAUA,GACjBhb,GAAOmjB,QA56RP,SAAiB7sB,GAEf,OADsB,MAATA,GAAoBA,EAAM9S,OACvBgrB,GAAUlY,EAAO,GAAI,GAAK,IA26R5C0J,GAAOsZ,aAAeA,GACtBtZ,GAAOwZ,eAAiBA,GACxBxZ,GAAOyZ,iBAAmBA,GAC1BzZ,GAAO8e,OAASA,GAChB9e,GAAO+e,SAAWA,GAClB/e,GAAOib,UAAYA,GACnBjb,GAAOxJ,SAAWA,GAClBwJ,GAAOkb,MAAQA,GACflb,GAAOje,KAAOA,GACdie,GAAO6E,OAASA,GAChB7E,GAAO7b,IAAMA,GACb6b,GAAOojB,QA1rGP,SAAiBzqB,EAAQnC,GACvB,IAAIpM,EAAS,GAMb,OALAoM,EAAWsW,GAAYtW,EAAU,GAEjCiQ,GAAW9N,GAAAA,SAAiB5K,EAAOoK,EAAKQ,GACtCsK,GAAgB7Y,EAAQoM,EAASzI,EAAOoK,EAAKQ,GAAS5K,MAEjD3D,GAorGT4V,GAAOqjB,UArpGP,SAAmB1qB,EAAQnC,GACzB,IAAIpM,EAAS,GAMb,OALAoM,EAAWsW,GAAYtW,EAAU,GAEjCiQ,GAAW9N,GAAAA,SAAiB5K,EAAOoK,EAAKQ,GACtCsK,GAAgB7Y,EAAQ+N,EAAK3B,EAASzI,EAAOoK,EAAKQ,OAE7CvO,GA+oGT4V,GAAOsjB,QAphCP,SAAiBhzB,GACf,OAAO+a,GAAYtH,GAAUzT,EAxveX,KA4wgBpB0P,GAAOujB,gBAh/BP,SAAyB3iC,EAAMmqB,GAC7B,OAAOK,GAAoBxqB,EAAMmjB,GAAUgH,EA7xezB,KA6wgBpB/K,GAAO2Y,QAAUA,GACjB3Y,GAAOkf,MAAQA,GACflf,GAAO6e,UAAYA,GACnB7e,GAAOygB,OAASA,GAChBzgB,GAAO0gB,SAAWA,GAClB1gB,GAAO2gB,MAAQA,GACf3gB,GAAOnd,OAASA,GAChBmd,GAAOwjB,OAzzBP,SAAgBt8B,GAEd,OADAA,EAAIuvB,GAAUvvB,GACP4mB,IAAAA,SAAkB3X,GACvB,OAAOuW,GAAQvW,EAAMjP,OAuzBzB8Y,GAAOmf,KAAOA,GACdnf,GAAOyjB,OAnhGP,SAAgB9qB,EAAQ7B,GACtB,OAAOuoB,GAAO1mB,EAAQ9V,GAAOiqB,GAAYhW,MAmhG3CkJ,GAAO0jB,KA73LP,SAAcztB,GACZ,OAAOolB,GAAO,EAAGplB,IA63LnB+J,GAAO2jB,QAr4NP,SAAiB1rB,EAAY2U,EAAWC,EAAQ6F,GAC9C,OAAkB,MAAdza,EACK,IAEJiI,GAAQ0M,KACXA,EAAyB,MAAbA,EAAoB,GAAK,CAACA,IAGnC1M,GADL2M,EAAS6F,OAj7ST9Z,EAi7S6BiU,KAE3BA,EAAmB,MAAVA,EAAiB,GAAK,CAACA,IAE3BF,GAAY1U,EAAY2U,EAAWC,KA23N5C7M,GAAO4gB,KAAOA,GACd5gB,GAAOmd,SAAWA,GAClBnd,GAAO6gB,UAAYA,GACnB7gB,GAAO8gB,SAAWA,GAClB9gB,GAAO3X,QAAUA,GACjB2X,GAAOsd,aAAeA,GACtBtd,GAAOmb,UAAYA,GACnBnb,GAAO9E,KAAOA,GACd8E,GAAOqf,OAASA,GAChBrf,GAAOsL,SAAWA,GAClBtL,GAAO4jB,WA/rBP,SAAoBjrB,GAClB,OAAO,SAAS/X,GACd,OAAiB,MAAV+X,OA7nfTC,EA6nfsC6O,GAAQ9O,EAAQ/X,KA8rBxDof,GAAO0Z,KAAOA,GACd1Z,GAAO2Z,QAAUA,GACjB3Z,GAAO6jB,UApsRP,SAAmBvtB,EAAOkB,EAAQhB,GAChC,OAAQF,GAASA,EAAM9S,QAAUgU,GAAUA,EAAOhU,OAC9CgqB,GAAYlX,EAAOkB,EAAQsV,GAAYtW,EAAU,IACjDF,GAksRN0J,GAAO8jB,YAxqRP,SAAqBxtB,EAAOkB,EAAQJ,GAClC,OAAQd,GAASA,EAAM9S,QAAUgU,GAAUA,EAAOhU,OAC9CgqB,GAAYlX,EAAOkB,OAxpPvBoB,EAwpP0CxB,GACtCd,GAsqRN0J,GAAO4Z,OAASA,GAChB5Z,GAAO+gB,MAAQA,GACf/gB,GAAOghB,WAAaA,GACpBhhB,GAAOud,MAAQA,GACfvd,GAAO+jB,OAxvNP,SAAgB9rB,EAAYnB,GAE1B,OADWoJ,GAAQjI,GAAclB,GAAcgQ,IACnC9O,EAAYpV,GAAOiqB,GAAYhW,EAAW,MAuvNxDkJ,GAAOgkB,OAzmRP,SAAgB1tB,EAAOQ,GACrB,IAAI1M,EAAS,GACb,IAAMkM,IAASA,EAAM9S,OACnB,OAAO4G,EAET,IAAIsM,GAAS,EACTgX,EAAU,GACVlqB,EAAS8S,EAAM9S,OAGnB,IADAsT,EAAYgW,GAAYhW,EAAW,KAC1BJ,EAAQlT,GAAQ,CACvB,IAAIuK,EAAQuI,EAAMI,GACdI,EAAU/I,EAAO2I,EAAOJ,KAC1BlM,EAAOrE,KAAKgI,GACZ2f,EAAQ3nB,KAAK2Q,IAIjB,OADA+W,GAAWnX,EAAOoX,GACXtjB,GAwlRT4V,GAAOikB,KAluLP,SAAchuB,EAAMhQ,GAClB,GAAmB,mBAARgQ,EACT,MAAM,IAAI5T,GAAU+L,GAGtB,OAAO0f,GAAS7X,EADhBhQ,OAvmVA2S,IAumVQ3S,EAAsBA,EAAQwwB,GAAUxwB,KA+tLlD+Z,GAAOnB,QAAUA,GACjBmB,GAAOkkB,WAhtNP,SAAoBjsB,EAAY/Q,EAAGwrB,GAOjC,OALExrB,GADGwrB,EAAQC,GAAe1a,EAAY/Q,EAAGwrB,QAxnT3C9Z,IAwnToD1R,GAC9C,EAEAuvB,GAAUvvB,IAELgZ,GAAQjI,GAAcyK,GAAkBwL,IACvCjW,EAAY/Q,IA0sN1B8Y,GAAOze,IAv6FP,SAAaoX,EAAQ/X,EAAMmN,GACzB,OAAiB,MAAV4K,EAAiBA,EAAS4U,GAAQ5U,EAAQ/X,EAAMmN,IAu6FzDiS,GAAOmkB,QA54FP,SAAiBxrB,EAAQ/X,EAAMmN,EAAOkW,GAEpC,OADAA,EAAkC,mBAAdA,EAA2BA,OA97a/CrL,EA+7aiB,MAAVD,EAAiBA,EAAS4U,GAAQ5U,EAAQ/X,EAAMmN,EAAOkW,IA24FhEjE,GAAOokB,QA1rNP,SAAiBnsB,GAEf,OADWiI,GAAQjI,GAAc6K,GAAeyL,IACpCtW,IAyrNd+H,GAAOpZ,MAhjRP,SAAe0P,EAAOrQ,EAAO8D,GAC3B,IAAIvG,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAKA,GAGDuG,GAAqB,iBAAPA,GAAmB4oB,GAAerc,EAAOrQ,EAAO8D,IAChE9D,EAAQ,EACR8D,EAAMvG,IAGNyC,EAAiB,MAATA,EAAgB,EAAIwwB,GAAUxwB,GACtC8D,OAtyPF6O,IAsyPQ7O,EAAoBvG,EAASizB,GAAU1sB,IAExCykB,GAAUlY,EAAOrQ,EAAO8D,IAVtB,IA8iRXiW,GAAOob,OAASA,GAChBpb,GAAOqkB,WAx3QP,SAAoB/tB,GAClB,OAAQA,GAASA,EAAM9S,OACnBksB,GAAepZ,GACf,IAs3QN0J,GAAOskB,aAn2QP,SAAsBhuB,EAAOE,GAC3B,OAAQF,GAASA,EAAM9S,OACnBksB,GAAepZ,EAAOwW,GAAYtW,EAAU,IAC5C,IAi2QNwJ,GAAO3e,MA5hEP,SAAe6X,EAAQqrB,EAAWC,GAKhC,OAJIA,GAAyB,iBAATA,GAAqB7R,GAAezZ,EAAQqrB,EAAWC,KACzED,EAAYC,OArzcd5rB,IAuzcA4rB,OAvzcA5rB,IAuzcQ4rB,EAxvcW,WAwvc8BA,IAAU,IAI3DtrB,EAASuC,GAASvC,MAEQ,iBAAbqrB,GACO,MAAbA,IAAsB5uB,GAAS4uB,OAEpCA,EAAY3U,GAAa2U,KACPnqB,GAAWlB,GACpB6X,GAAUlW,GAAc3B,GAAS,EAAGsrB,GAGxCtrB,EAAO7X,MAAMkjC,EAAWC,GAZtB,IAuhEXxkB,GAAOykB,OAnsLP,SAAgBxuB,EAAMhQ,GACpB,GAAmB,mBAARgQ,EACT,MAAM,IAAI5T,GAAU+L,GAGtB,OADAnI,EAAiB,MAATA,EAAgB,EAAIoY,GAAUoY,GAAUxwB,GAAQ,GACjD6nB,IAAAA,SAAkB3X,GACvB,IAAIG,EAAQH,EAAKlQ,GACbgyB,EAAYlH,GAAU5a,EAAM,EAAGlQ,GAKnC,OAHIqQ,GACFiB,GAAU0gB,EAAW3hB,GAEhBN,GAAMC,EAAMvT,KAAMu1B,OAwrL7BjY,GAAOrZ,KAl1QP,SAAc2P,GACZ,IAAI9S,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAOA,EAASgrB,GAAUlY,EAAO,EAAG9S,GAAU,IAi1QhDwc,GAAO0kB,KArzQP,SAAcpuB,EAAOpP,EAAGwrB,GACtB,OAAMpc,GAASA,EAAM9S,OAIdgrB,GAAUlY,EAAO,GADxBpP,EAAKwrB,QAjiQL9Z,IAiiQc1R,EAAmB,EAAIuvB,GAAUvvB,IAChB,EAAI,EAAIA,GAH9B,IAozQX8Y,GAAO2kB,UArxQP,SAAmBruB,EAAOpP,EAAGwrB,GAC3B,IAAIlvB,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,OAAKA,EAKEgrB,GAAUlY,GADjBpP,EAAI1D,GADJ0D,EAAKwrB,QAnkQL9Z,IAmkQc1R,EAAmB,EAAIuvB,GAAUvvB,KAEnB,EAAI,EAAIA,EAAG1D,GAJ9B,IAmxQXwc,GAAO4kB,eAzuQP,SAAwBtuB,EAAOQ,GAC7B,OAAQR,GAASA,EAAM9S,OACnB0sB,GAAU5Z,EAAOwW,GAAYhW,EAAW,IAAI,GAAO,GACnD,IAuuQNkJ,GAAO6kB,UAjsQP,SAAmBvuB,EAAOQ,GACxB,OAAQR,GAASA,EAAM9S,OACnB0sB,GAAU5Z,EAAOwW,GAAYhW,EAAW,IACxC,IA+rQNkJ,GAAO8kB,IApuPP,SAAa/2B,EAAO2sB,GAElB,OADAA,EAAY3sB,GACLA,GAmuPTiS,GAAO+kB,SA9oLP,SAAkB9uB,EAAM2P,EAAMxjB,GAC5B,IAAI45B,GAAU,EACVjJ,GAAW,EAEf,GAAmB,mBAAR9c,EACT,MAAM,IAAI5T,GAAU+L,GAMtB,OAJIrB,GAAS3K,KACX45B,EAAU,YAAa55B,IAAYA,EAAQ45B,QAAUA,EACrDjJ,EAAW,aAAc3wB,IAAYA,EAAQ2wB,SAAWA,GAEnD0I,GAASxlB,EAAM2P,EAAM,CAC1B,QAAWoW,EACX,QAAWpW,EACX,SAAYmN,KAioLhB/S,GAAO4T,KAAOA,GACd5T,GAAO+d,QAAUA,GACjB/d,GAAOuf,QAAUA,GACjBvf,GAAOwf,UAAYA,GACnBxf,GAAOglB,OArfP,SAAgBj3B,GACd,OAAImS,GAAQnS,GACHsJ,GAAStJ,EAAO4Z,IAElBb,GAAS/Y,GAAS,CAACA,GAAS6U,GAAUiO,GAAapV,GAAS1N,MAkfrEiS,GAAOyM,cAAgBA,GACvBzM,GAAOxF,UA10FP,SAAmB7B,EAAQnC,EAAUC,GACnC,IAAIwL,EAAQ/B,GAAQvH,GAChBssB,EAAYhjB,GAASjE,GAASrF,IAAW5C,GAAa4C,GAG1D,GADAnC,EAAWsW,GAAYtW,EAAU,GACd,MAAfC,EAAqB,CACvB,IAAIsO,EAAOpM,GAAUA,EAAO7K,YAE1B2I,EADEwuB,EACYhjB,EAAQ,IAAI8C,EAAO,GAE1BhY,GAAS4L,IACF6O,GAAWzC,GAAQzE,GAAWhE,GAAa3D,IAG3C,GAMlB,OAHCssB,EAAYtuB,GAAY8P,IAAY9N,GAAAA,SAAiB5K,EAAO2I,EAAOiC,GAClE,OAAOnC,EAASC,EAAa1I,EAAO2I,EAAOiC,MAEtClC,GAuzFTuJ,GAAOklB,MArnLP,SAAejvB,GACb,OAAOse,GAAIte,EAAM,IAqnLnB+J,GAAO6Z,MAAQA,GACf7Z,GAAO8Z,QAAUA,GACjB9Z,GAAO+Z,UAAYA,GACnB/Z,GAAOmlB,KAzmQP,SAAc7uB,GACZ,OAAQA,GAASA,EAAM9S,OAAUqsB,GAASvZ,GAAS,IAymQrD0J,GAAOolB,OA/kQP,SAAgB9uB,EAAOE,GACrB,OAAQF,GAASA,EAAM9S,OAAUqsB,GAASvZ,EAAOwW,GAAYtW,EAAU,IAAM,IA+kQ/EwJ,GAAOqlB,SAxjQP,SAAkB/uB,EAAOc,GAEvB,OADAA,EAAkC,mBAAdA,EAA2BA,OA9yQ/CwB,EA+yQQtC,GAASA,EAAM9S,OAAUqsB,GAASvZ,OA/yQ1CsC,EA+yQ4DxB,GAAc,IAujQ5E4I,GAAOslB,MAhyFP,SAAe3sB,EAAQ/X,GACrB,OAAiB,MAAV+X,GAAwBiV,GAAUjV,EAAQ/X,IAgyFnDof,GAAOga,MAAQA,GACfha,GAAOka,UAAYA,GACnBla,GAAOulB,OApwFP,SAAgB5sB,EAAQ/X,EAAMqvB,GAC5B,OAAiB,MAAVtX,EAAiBA,EAASqX,GAAWrX,EAAQ/X,EAAMgwB,GAAaX,KAowFzEjQ,GAAOwlB,WAzuFP,SAAoB7sB,EAAQ/X,EAAMqvB,EAAShM,GAEzC,OADAA,EAAkC,mBAAdA,EAA2BA,OAlob/CrL,EAmobiB,MAAVD,EAAiBA,EAASqX,GAAWrX,EAAQ/X,EAAMgwB,GAAaX,GAAUhM,IAwuFnFjE,GAAOxI,OAASA,GAChBwI,GAAOylB,SAhrFP,SAAkB9sB,GAChB,OAAiB,MAAVA,EAAiB,GAAKU,GAAWV,EAAQkM,GAAOlM,KAgrFzDqH,GAAOma,QAAUA,GACjBna,GAAOkT,MAAQA,GACflT,GAAO0lB,KA3mLP,SAAc33B,EAAO8lB,GACnB,OAAOxrB,GAAQuoB,GAAaiD,GAAU9lB,IA2mLxCiS,GAAOoa,IAAMA,GACbpa,GAAOqa,MAAQA,GACfra,GAAOsa,QAAUA,GACjBta,GAAOua,IAAMA,GACbva,GAAO2lB,UAj3PP,SAAmBrsB,EAAO9B,GACxB,OAAOgZ,GAAclX,GAAS,GAAI9B,GAAU,GAAI0L,KAi3PlDlD,GAAO4lB,cA/1PP,SAAuBtsB,EAAO9B,GAC5B,OAAOgZ,GAAclX,GAAS,GAAI9B,GAAU,GAAI+V,KA+1PlDvN,GAAOwa,QAAUA,GAGjBxa,GAAOqB,QAAUke,GACjBvf,GAAO6lB,UAAYrG,GACnBxf,GAAO8lB,OAASxH,GAChBte,GAAO+lB,WAAaxH,GAGpBoC,GAAM3gB,GAAQA,IAKdA,GAAO4B,IAAMA,GACb5B,GAAOogB,QAAUA,GACjBpgB,GAAOyf,UAAYA,GACnBzf,GAAO2f,WAAaA,GACpB3f,GAAOtC,KAAOA,GACdsC,GAAOgmB,MAprFP,SAAepiB,EAAQC,EAAOC,GAa5B,YAlubAlL,IAstbIkL,IACFA,EAAQD,EACRA,OAxtbFjL,QAAAA,IA0tbIkL,IAEFA,GADAA,EAAQmS,GAASnS,KACCA,EAAQA,EAAQ,QA5tbpClL,IA8tbIiL,IAEFA,GADAA,EAAQoS,GAASpS,KACCA,EAAQA,EAAQ,GAE7BhB,GAAUoT,GAASrS,GAASC,EAAOC,IAwqF5C9D,GAAO+Y,MA7jLP,SAAehrB,GACb,OAAOgW,GAAUhW,EArzVI,IAk3gBvBiS,GAAOimB,UApgLP,SAAmBl4B,GACjB,OAAOgW,GAAUhW,EAAOqxB,IAogL1Bpf,GAAOkmB,cAr+KP,SAAuBn4B,EAAOkW,GAE5B,OAAOF,GAAUhW,EAAOqxB,EADxBnb,EAAkC,mBAAdA,EAA2BA,OAx6V/CrL,IA64gBFoH,GAAOmmB,UA7hLP,SAAmBp4B,EAAOkW,GAExB,OAAOF,GAAUhW,EAz1VI,EAw1VrBkW,EAAkC,mBAAdA,EAA2BA,OAj3V/CrL,IA84gBFoH,GAAOomB,WA18KP,SAAoBztB,EAAQrI,GAC1B,OAAiB,MAAVA,GAAkBoV,GAAe/M,EAAQrI,EAAQvO,GAAKuO,KA08K/D0P,GAAOmT,OAASA,GAChBnT,GAAOqmB,UA1xCP,SAAmBt4B,EAAOwnB,GACxB,OAAiB,MAATxnB,GAAiBA,GAAUA,EAASwnB,EAAexnB,GA0xC7DiS,GAAOmhB,OAASA,GAChBnhB,GAAOsmB,SAz9EP,SAAkBptB,EAAQqtB,EAAQC,GAChCttB,EAASuC,GAASvC,GAClBqtB,EAAS3W,GAAa2W,GAEtB,IAAI/iC,EAAS0V,EAAO1V,OAKhBuG,EAJJy8B,OA97bA5tB,IA87bW4tB,EACPhjC,EACAqf,GAAU4T,GAAU+P,GAAW,EAAGhjC,GAItC,OADAgjC,GAAYD,EAAO/iC,SACA,GAAK0V,EAAOtS,MAAM4/B,EAAUz8B,IAAQw8B,GA+8EzDvmB,GAAOgD,GAAKA,GACZhD,GAAOymB,OAj7EP,SAAgBvtB,GAEd,OADAA,EAASuC,GAASvC,KACA3I,EAAmBjF,KAAK4N,GACtCA,EAAOrS,QAAQuJ,EAAiB6J,IAChCf,GA86EN8G,GAAO0mB,aA55EP,SAAsBxtB,GAEpB,OADAA,EAASuC,GAASvC,KACAnI,EAAgBzF,KAAK4N,GACnCA,EAAOrS,QAAQiK,EAAc,QAC7BoI,GAy5EN8G,GAAO2mB,MA57OP,SAAe1uB,EAAYnB,EAAW4b,GACpC,IAAIzc,EAAOiK,GAAQjI,GAAcpB,GAAa+P,GAI9C,OAHI8L,GAASC,GAAe1a,EAAYnB,EAAW4b,KACjD5b,OA79RF8B,GA+9RO3C,EAAKgC,EAAY6U,GAAYhW,EAAW,KAw7OjDkJ,GAAO6a,KAAOA,GACd7a,GAAOmZ,UAAYA,GACnBnZ,GAAO4mB,QArxHP,SAAiBjuB,EAAQ7B,GACvB,OAAOkB,GAAYW,EAAQmU,GAAYhW,EAAW,GAAI2P,KAqxHxDzG,GAAO8a,SAAWA,GAClB9a,GAAOoZ,cAAgBA,GACvBpZ,GAAO6mB,YAjvHP,SAAqBluB,EAAQ7B,GAC3B,OAAOkB,GAAYW,EAAQmU,GAAYhW,EAAW,GAAI6P,KAivHxD3G,GAAOpC,MAAQA,GACfoC,GAAOhe,QAAUA,GACjBge,GAAO+a,aAAeA,GACtB/a,GAAO8mB,MArtHP,SAAenuB,EAAQnC,GACrB,OAAiB,MAAVmC,EACHA,EACAyO,GAAQzO,EAAQmU,GAAYtW,EAAU,GAAIqO,KAmtHhD7E,GAAO+mB,WAtrHP,SAAoBpuB,EAAQnC,GAC1B,OAAiB,MAAVmC,EACHA,EACA2O,GAAa3O,EAAQmU,GAAYtW,EAAU,GAAIqO,KAorHrD7E,GAAOgnB,OArpHP,SAAgBruB,EAAQnC,GACtB,OAAOmC,GAAU8N,GAAW9N,EAAQmU,GAAYtW,EAAU,KAqpH5DwJ,GAAOinB,YAxnHP,SAAqBtuB,EAAQnC,GAC3B,OAAOmC,GAAUgO,GAAgBhO,EAAQmU,GAAYtW,EAAU,KAwnHjEwJ,GAAO2D,IAAMA,GACb3D,GAAOwd,GAAKA,GACZxd,GAAOyd,IAAMA,GACbzd,GAAOvG,IAzgHP,SAAad,EAAQ/X,GACnB,OAAiB,MAAV+X,GAAkB+e,GAAQ/e,EAAQ/X,EAAMwnB,KAygHjDpI,GAAOgM,MAAQA,GACfhM,GAAOqZ,KAAOA,GACdrZ,GAAOmL,SAAWA,GAClBnL,GAAO8F,SA5pOP,SAAkB7N,EAAYlK,EAAOsK,EAAWqa,GAC9Cza,EAAa0T,GAAY1T,GAAcA,EAAaT,GAAOS,GAC3DI,EAAaA,IAAcqa,EAAS+D,GAAUpe,GAAa,EAE3D,IAAI7U,EAASyU,EAAWzU,OAIxB,OAHI6U,EAAY,IACdA,EAAYgG,GAAU7a,EAAS6U,EAAW,IAErClN,GAAS8M,GACXI,GAAa7U,GAAUyU,EAAW1T,QAAQwJ,EAAOsK,IAAc,IAC7D7U,GAAU0T,GAAYe,EAAYlK,EAAOsK,IAAc,GAmpOhE2H,GAAOzb,QA9lSP,SAAiB+R,EAAOvI,EAAOsK,GAC7B,IAAI7U,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAIkT,EAAqB,MAAb2B,EAAoB,EAAIoe,GAAUpe,GAI9C,OAHI3B,EAAQ,IACVA,EAAQ2H,GAAU7a,EAASkT,EAAO,IAE7BQ,GAAYZ,EAAOvI,EAAO2I,IAslSnCsJ,GAAOknB,QAlqFP,SAAiBtjB,EAAQ3d,EAAO8D,GAS9B,OARA9D,EAAQ8vB,GAAS9vB,QA5wbjB2S,IA6wbI7O,GACFA,EAAM9D,EACNA,EAAQ,GAER8D,EAAMgsB,GAAShsB,GArsVnB,SAAqB6Z,EAAQ3d,EAAO8D,GAClC,OAAO6Z,GAAUrF,GAAUtY,EAAO8D,IAAQ6Z,EAASvF,GAAUpY,EAAO8D,GADtE,CAusVE6Z,EAASqS,GAASrS,GACS3d,EAAO8D,IA0pFpCiW,GAAOgf,OAASA,GAChBhf,GAAOmC,YAAcA,GACrBnC,GAAOE,QAAUA,GACjBF,GAAO3K,cAAgBA,GACvB2K,GAAO2L,YAAcA,GACrB3L,GAAOuM,kBAAoBA,GAC3BvM,GAAOmnB,UAtwKP,SAAmBp5B,GACjB,OAAiB,IAAVA,IAA4B,IAAVA,GACtBkS,GAAalS,IAAUga,GAAWha,IAAUU,GAqwKjDuR,GAAOhC,SAAWA,GAClBgC,GAAOzK,OAASA,GAChByK,GAAOonB,UA7sKP,SAAmBr5B,GACjB,OAAOkS,GAAalS,IAA6B,IAAnBA,EAAM4G,WAAmB6X,GAAcze,IA6sKvEiS,GAAOqnB,QAzqKP,SAAiBt5B,GACf,GAAa,MAATA,EACF,OAAO,EAET,GAAI4d,GAAY5d,KACXmS,GAAQnS,IAA0B,iBAATA,GAA4C,mBAAhBA,EAAM2O,QAC1DsB,GAASjQ,IAAUgI,GAAahI,IAAUoU,GAAYpU,IAC1D,OAAQA,EAAMvK,OAEhB,IAAI+gB,EAAMC,GAAOzW,GACjB,GAAIwW,GAAOzV,GAAUyV,GAAOrV,EAC1B,OAAQnB,EAAMuM,KAEhB,GAAIkR,GAAYzd,GACd,OAAQwd,GAASxd,GAAOvK,OAE1B,IAAK,IAAI2U,KAAOpK,EACd,GAAI2N,GAAetF,KAAKrI,EAAOoK,GAC7B,OAAO,EAGX,OAAO,GAqpKT6H,GAAOsnB,QAtnKP,SAAiBv5B,EAAOoa,GACtB,OAAOe,GAAYnb,EAAOoa,IAsnK5BnI,GAAOunB,YAnlKP,SAAqBx5B,EAAOoa,EAAOlE,GAEjC,IAAI7Z,GADJ6Z,EAAkC,mBAAdA,EAA2BA,OAx2W/CrL,GAy2W0BqL,EAAWlW,EAAOoa,QAz2W5CvP,EA02WA,YA12WAA,IA02WOxO,EAAuB8e,GAAYnb,EAAOoa,OA12WjDvP,EA02WmEqL,KAAgB7Z,GAilKrF4V,GAAO0d,QAAUA,GACjB1d,GAAO9B,SA1hKP,SAAkBnQ,GAChB,MAAuB,iBAATA,GAAqBkQ,GAAelQ,IA0hKpDiS,GAAOwH,WAAaA,GACpBxH,GAAO2d,UAAYA,GACnB3d,GAAO4X,SAAWA,GAClB5X,GAAOvK,MAAQA,GACfuK,GAAOwnB,QA11JP,SAAiB7uB,EAAQrI,GACvB,OAAOqI,IAAWrI,GAAUsa,GAAYjS,EAAQrI,EAAQsb,GAAatb,KA01JvE0P,GAAOynB,YAvzJP,SAAqB9uB,EAAQrI,EAAQ2T,GAEnC,OADAA,EAAkC,mBAAdA,EAA2BA,OA5oX/CrL,EA6oXOgS,GAAYjS,EAAQrI,EAAQsb,GAAatb,GAAS2T,IAszJ3DjE,GAAO0nB,MAvxJP,SAAe35B,GAIb,OAAO6vB,GAAS7vB,IAAUA,IAAUA,GAoxJtCiS,GAAO2nB,SAvvJP,SAAkB55B,GAChB,GAAIgqB,GAAWhqB,GACb,MAAM,IAAI5E,GAtsXM,mEAwsXlB,OAAO8hB,GAAald,IAovJtBiS,GAAO4nB,MAxsJP,SAAe75B,GACb,OAAgB,MAATA,GAwsJTiS,GAAO6nB,OAjuJP,SAAgB95B,GACd,OAAiB,OAAVA,GAiuJTiS,GAAO4d,SAAWA,GAClB5d,GAAOjT,SAAWA,GAClBiT,GAAOC,aAAeA,GACtBD,GAAOwM,cAAgBA,GACvBxM,GAAOrK,SAAWA,GAClBqK,GAAO8nB,cArlJP,SAAuB/5B,GACrB,OAAO4vB,GAAU5vB,IAAUA,IA9zXR,kBA8zXsCA,GA9zXtC,kBAm5gBrBiS,GAAOnK,MAAQA,GACfmK,GAAO7U,SAAWA,GAClB6U,GAAO8G,SAAWA,GAClB9G,GAAOjK,aAAeA,GACtBiK,GAAO+nB,YAn/IP,SAAqBh6B,GACnB,YA/9XA6K,IA+9XO7K,GAm/ITiS,GAAOgoB,UA/9IP,SAAmBj6B,GACjB,OAAOkS,GAAalS,IAAUyW,GAAOzW,IAAUsB,GA+9IjD2Q,GAAOioB,UA38IP,SAAmBl6B,GACjB,OAAOkS,GAAalS,IAn6XP,oBAm6XiBga,GAAWha,IA28I3CiS,GAAOrd,KAz/RP,SAAc2T,EAAOiuB,GACnB,OAAgB,MAATjuB,EAAgB,GAAK6H,GAAW/H,KAAKE,EAAOiuB,IAy/RrDvkB,GAAO6f,UAAYA,GACnB7f,GAAOgJ,KAAOA,GACdhJ,GAAOkoB,YAh9RP,SAAqB5xB,EAAOvI,EAAOsK,GACjC,IAAI7U,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAIkT,EAAQlT,EAKZ,YAjhPAoV,IA6gPIP,IAEF3B,GADAA,EAAQ+f,GAAUpe,IACF,EAAIgG,GAAU7a,EAASkT,EAAO,GAAK6H,GAAU7H,EAAOlT,EAAS,IAExEuK,GAAUA,EArvMrB,SAA2BuI,EAAOvI,EAAOsK,GAEvC,IADA,IAAI3B,EAAQ2B,EAAY,EACjB3B,KACL,GAAIJ,EAAMI,KAAW3I,EACnB,OAAO2I,EAGX,OAAOA,EAPT,CAsvM0BJ,EAAOvI,EAAO2I,GAChC0B,GAAc9B,EAAOiC,GAAW7B,GAAO,IAq8R7CsJ,GAAO8f,UAAYA,GACnB9f,GAAO+f,WAAaA,GACpB/f,GAAO6d,GAAKA,GACZ7d,GAAO8d,IAAMA,GACb9d,GAAO1B,IAhfP,SAAahI,GACX,OAAQA,GAASA,EAAM9S,OACnBqjB,GAAavQ,EAAO6U,GAAUjD,SA9+flCtP,GA69gBFoH,GAAOmoB,MApdP,SAAe7xB,EAAOE,GACpB,OAAQF,GAASA,EAAM9S,OACnBqjB,GAAavQ,EAAOwW,GAAYtW,EAAU,GAAI0R,SA3ggBlDtP,GA89gBFoH,GAAOooB,KAjcP,SAAc9xB,GACZ,OAAOmC,GAASnC,EAAO6U,KAiczBnL,GAAOqoB,OAvaP,SAAgB/xB,EAAOE,GACrB,OAAOiC,GAASnC,EAAOwW,GAAYtW,EAAU,KAua/CwJ,GAAO9T,IAlZP,SAAaoK,GACX,OAAQA,GAASA,EAAM9S,OACnBqjB,GAAavQ,EAAO6U,GAAUM,SAhlgBlC7S,GAi+gBFoH,GAAOsoB,MAtXP,SAAehyB,EAAOE,GACpB,OAAQF,GAASA,EAAM9S,OACnBqjB,GAAavQ,EAAOwW,GAAYtW,EAAU,GAAIiV,SA7mgBlD7S,GAk+gBFoH,GAAOyX,UAAYA,GACnBzX,GAAOgY,UAAYA,GACnBhY,GAAOuoB,WAztBP,WACE,MAAO,IAytBTvoB,GAAOwoB,WAzsBP,WACE,MAAO,IAysBTxoB,GAAOyoB,SAzrBP,WACE,OAAO,GAyrBTzoB,GAAOshB,SAAWA,GAClBthB,GAAO0oB,IA77RP,SAAapyB,EAAOpP,GAClB,OAAQoP,GAASA,EAAM9S,OAAUkpB,GAAQpW,EAAOmgB,GAAUvvB,SA5iP1D0R,GAy+gBFoH,GAAO2oB,WAliCP,WAIE,OAHIl8B,GAAK3F,IAAMpE,OACb+J,GAAK3F,EAAIkV,IAEJtZ,MA+hCTsd,GAAO2W,KAAOA,GACd3W,GAAO1C,IAAMA,GACb0C,GAAO4oB,IAj5EP,SAAa1vB,EAAQ1V,EAAQmyB,GAC3Bzc,EAASuC,GAASvC,GAGlB,IAAI2vB,GAFJrlC,EAASizB,GAAUjzB,IAEMoX,GAAW1B,GAAU,EAC9C,IAAK1V,GAAUqlC,GAAarlC,EAC1B,OAAO0V,EAET,IAAI6V,GAAOvrB,EAASqlC,GAAa,EACjC,OACEnT,GAAc/X,GAAYoR,GAAM4G,GAChCzc,EACAwc,GAAcjY,GAAWsR,GAAM4G,IAs4EnC3V,GAAO8oB,OA32EP,SAAgB5vB,EAAQ1V,EAAQmyB,GAC9Bzc,EAASuC,GAASvC,GAGlB,IAAI2vB,GAFJrlC,EAASizB,GAAUjzB,IAEMoX,GAAW1B,GAAU,EAC9C,OAAQ1V,GAAUqlC,EAAYrlC,EACzB0V,EAASwc,GAAclyB,EAASqlC,EAAWlT,GAC5Czc,GAq2EN8G,GAAO+oB,SA30EP,SAAkB7vB,EAAQ1V,EAAQmyB,GAChCzc,EAASuC,GAASvC,GAGlB,IAAI2vB,GAFJrlC,EAASizB,GAAUjzB,IAEMoX,GAAW1B,GAAU,EAC9C,OAAQ1V,GAAUqlC,EAAYrlC,EACzBkyB,GAAclyB,EAASqlC,EAAWlT,GAASzc,EAC5CA,GAq0EN8G,GAAO3L,SA1yEP,SAAkB6E,EAAQ8vB,EAAOtW,GAM/B,OALIA,GAAkB,MAATsW,EACXA,EAAQ,EACCA,IACTA,GAASA,GAEJvqB,GAAehD,GAASvC,GAAQrS,QAAQmK,EAAa,IAAKg4B,GAAS,IAqyE5EhpB,GAAOrB,OA1rFP,SAAgBkF,EAAOC,EAAOmlB,GA2B5B,GA1BIA,GAA+B,kBAAZA,GAAyBtW,GAAe9O,EAAOC,EAAOmlB,KAC3EnlB,EAAQmlB,OAxzbVrwB,QAAAA,IA0zbIqwB,IACkB,kBAATnlB,GACTmlB,EAAWnlB,EACXA,OA7zbJlL,GA+zb2B,kBAATiL,IACdolB,EAAWplB,EACXA,OAj0bJjL,SAAAA,IAo0bIiL,QAp0bJjL,IAo0b2BkL,GACzBD,EAAQ,EACRC,EAAQ,IAGRD,EAAQkS,GAASlS,QAz0bnBjL,IA00bMkL,GACFA,EAAQD,EACRA,EAAQ,GAERC,EAAQiS,GAASjS,IAGjBD,EAAQC,EAAO,CACjB,IAAIolB,EAAOrlB,EACXA,EAAQC,EACRA,EAAQolB,EAEV,GAAID,GAAYplB,EAAQ,GAAKC,EAAQ,EAAG,CACtC,IAAI4U,EAAOha,KACX,OAAOH,GAAUsF,EAAS6U,GAAQ5U,EAAQD,EAAQ3P,GAAe,QAAUwkB,EAAO,IAAIl1B,OAAS,KAAOsgB,GAExG,OAAOrB,GAAWoB,EAAOC,IAupF3B9D,GAAO1e,OA5+NP,SAAgB2W,EAAYzB,EAAUC,GACpC,IAAIR,EAAOiK,GAAQjI,GAAcP,GAAcoB,GAC3CnB,EAAY3M,UAAUxH,OAAS,EAEnC,OAAOyS,EAAKgC,EAAY6U,GAAYtW,EAAU,GAAIC,EAAakB,EAAW2L,KAy+N5EtD,GAAOmpB,YAh9NP,SAAqBlxB,EAAYzB,EAAUC,GACzC,IAAIR,EAAOiK,GAAQjI,GAAcL,GAAmBkB,GAChDnB,EAAY3M,UAAUxH,OAAS,EAEnC,OAAOyS,EAAKgC,EAAY6U,GAAYtW,EAAU,GAAIC,EAAakB,EAAW+O,KA68N5E1G,GAAOopB,OA/wEP,SAAgBlwB,EAAQhS,EAAGwrB,GAMzB,OAJExrB,GADGwrB,EAAQC,GAAezZ,EAAQhS,EAAGwrB,QArucvC9Z,IAqucgD1R,GAC1C,EAEAuvB,GAAUvvB,GAET2mB,GAAWpS,GAASvC,GAAShS,IA0wEtC8Y,GAAOnZ,QApvEP,WACE,IAAIsP,EAAOnL,UACPkO,EAASuC,GAAStF,EAAK,IAE3B,OAAOA,EAAK3S,OAAS,EAAI0V,EAASA,EAAOrS,QAAQsP,EAAK,GAAIA,EAAK,KAivEjE6J,GAAO5V,OAtoGP,SAAgBuO,EAAQ/X,EAAM20B,GAG5B,IAAI7e,GAAS,EACTlT,GAHJ5C,EAAO8mB,GAAS9mB,EAAM+X,IAGJnV,OAOlB,IAJKA,IACHA,EAAS,EACTmV,OAx3aFC,KA03aSlC,EAAQlT,GAAQ,CACvB,IAAIuK,EAAkB,MAAV4K,OA33adC,EA23a2CD,EAAOgP,GAAM/mB,EAAK8V,UA33a7DkC,IA43aM7K,IACF2I,EAAQlT,EACRuK,EAAQwnB,GAEV5c,EAAS6O,GAAWzZ,GAASA,EAAMqI,KAAKuC,GAAU5K,EAEpD,OAAO4K,GAonGTqH,GAAOyhB,MAAQA,GACfzhB,GAAOjF,aAAeA,EACtBiF,GAAOqpB,OA15NP,SAAgBpxB,GAEd,OADWiI,GAAQjI,GAAcuK,GAAcyL,IACnChW,IAy5Nd+H,GAAO1F,KA/0NP,SAAcrC,GACZ,GAAkB,MAAdA,EACF,OAAO,EAET,GAAI0T,GAAY1T,GACd,OAAO9M,GAAS8M,GAAc2C,GAAW3C,GAAcA,EAAWzU,OAEpE,IAAI+gB,EAAMC,GAAOvM,GACjB,OAAIsM,GAAOzV,GAAUyV,GAAOrV,EACnB+I,EAAWqC,KAEbiR,GAAStT,GAAYzU,QAq0N9Bwc,GAAOggB,UAAYA,GACnBhgB,GAAOspB,KA/xNP,SAAcrxB,EAAYnB,EAAW4b,GACnC,IAAIzc,EAAOiK,GAAQjI,GAAcJ,GAAY4W,GAI7C,OAHIiE,GAASC,GAAe1a,EAAYnB,EAAW4b,KACjD5b,OA/tTF8B,GAiuTO3C,EAAKgC,EAAY6U,GAAYhW,EAAW,KA2xNjDkJ,GAAOupB,YAhsRP,SAAqBjzB,EAAOvI,GAC1B,OAAO2gB,GAAgBpY,EAAOvI,IAgsRhCiS,GAAOwpB,cApqRP,SAAuBlzB,EAAOvI,EAAOyI,GACnC,OAAOwY,GAAkB1Y,EAAOvI,EAAO+e,GAAYtW,EAAU,KAoqR/DwJ,GAAOypB,cAjpRP,SAAuBnzB,EAAOvI,GAC5B,IAAIvK,EAAkB,MAAT8S,EAAgB,EAAIA,EAAM9S,OACvC,GAAIA,EAAQ,CACV,IAAIkT,EAAQgY,GAAgBpY,EAAOvI,GACnC,GAAI2I,EAAQlT,GAAUwf,GAAG1M,EAAMI,GAAQ3I,GACrC,OAAO2I,EAGX,OAAQ,GA0oRVsJ,GAAO0pB,gBArnRP,SAAyBpzB,EAAOvI,GAC9B,OAAO2gB,GAAgBpY,EAAOvI,GAAO,IAqnRvCiS,GAAO2pB,kBAzlRP,SAA2BrzB,EAAOvI,EAAOyI,GACvC,OAAOwY,GAAkB1Y,EAAOvI,EAAO+e,GAAYtW,EAAU,IAAI,IAylRnEwJ,GAAO4pB,kBAtkRP,SAA2BtzB,EAAOvI,GAEhC,GADsB,MAATuI,GAAoBA,EAAM9S,OAC3B,CACV,IAAIkT,EAAQgY,GAAgBpY,EAAOvI,GAAO,GAAQ,EAClD,GAAIiV,GAAG1M,EAAMI,GAAQ3I,GACnB,OAAO2I,EAGX,OAAQ,GA+jRVsJ,GAAOigB,UAAYA,GACnBjgB,GAAO6pB,WA3oEP,SAAoB3wB,EAAQqtB,EAAQC,GAOlC,OANAttB,EAASuC,GAASvC,GAClBstB,EAAuB,MAAZA,EACP,EACA3jB,GAAU4T,GAAU+P,GAAW,EAAGttB,EAAO1V,QAE7C+iC,EAAS3W,GAAa2W,GACfrtB,EAAOtS,MAAM4/B,EAAUA,EAAWD,EAAO/iC,SAAW+iC,GAqoE7DvmB,GAAO0hB,SAAWA,GAClB1hB,GAAO8pB,IAzUP,SAAaxzB,GACX,OAAQA,GAASA,EAAM9S,OACnBkV,GAAQpC,EAAO6U,IACf,GAuUNnL,GAAO+pB,MA7SP,SAAezzB,EAAOE,GACpB,OAAQF,GAASA,EAAM9S,OACnBkV,GAAQpC,EAAOwW,GAAYtW,EAAU,IACrC,GA2SNwJ,GAAOgqB,SA7hEP,SAAkB9wB,EAAQ9W,EAASswB,GAIjC,IAAIuX,EAAWjqB,GAAOoG,iBAElBsM,GAASC,GAAezZ,EAAQ9W,EAASswB,KAC3CtwB,OAj/cFwW,GAm/cAM,EAASuC,GAASvC,GAClB9W,EAAUm8B,GAAa,GAAIn8B,EAAS6nC,EAAUjT,IAE9C,IAIIkT,EACAC,EALAC,EAAU7L,GAAa,GAAIn8B,EAAQgoC,QAASH,EAASG,QAASpT,IAC9DqT,EAActoC,GAAKqoC,GACnBE,EAAgBjxB,GAAW+wB,EAASC,GAIpC3zB,EAAQ,EACR6zB,EAAcnoC,EAAQmoC,aAAev4B,GACrC1B,EAAS,WAGTk6B,EAAehkC,IAChBpE,EAAQqkC,QAAUz0B,IAAW1B,OAAS,IACvCi6B,EAAYj6B,OAAS,KACpBi6B,IAAgB75B,EAAgBc,GAAeQ,IAAW1B,OAAS,KACnElO,EAAQqoC,UAAYz4B,IAAW1B,OAAS,KACzC,KAMEo6B,EAAY,kBACbhvB,GAAetF,KAAKhU,EAAS,cACzBA,EAAQsoC,UAAY,IAAI7jC,QAAQ,MAAO,KACvC,6BAA+BiN,GAAmB,KACnD,KAENoF,EAAOrS,QAAQ2jC,GAAAA,SAAuB/nC,EAAOkoC,EAAaC,EAAkBC,EAAiBC,EAAerzB,GAsB1G,OArBAmzB,IAAqBA,EAAmBC,GAGxCv6B,GAAU4I,EAAOtS,MAAM8P,EAAOe,GAAQ5Q,QAAQoL,GAAmBiI,IAG7DywB,IACFT,GAAa,EACb55B,GAAU,YAAcq6B,EAAc,UAEpCG,IACFX,GAAe,EACf75B,GAAU,OAASw6B,EAAgB,eAEjCF,IACFt6B,GAAU,iBAAmBs6B,EAAmB,+BAElDl0B,EAAQe,EAAShV,EAAMe,OAIhBf,KAGT6N,GAAU,OAIV,IAAIy6B,EAAWrvB,GAAetF,KAAKhU,EAAS,aAAeA,EAAQ2oC,SACnE,GAAKA,EAAAA,CAKA,GAAIz5B,EAA2BhG,KAAKy/B,GACvC,MAAM,IAAI5hC,GA3idmB,2DAsid7BmH,EAAS,iBAAmBA,EAAS,QASvCA,GAAU65B,EAAe75B,EAAOzJ,QAAQmJ,EAAsB,IAAMM,GACjEzJ,QAAQoJ,EAAqB,MAC7BpJ,QAAQqJ,EAAuB,OAGlCI,EAAS,aAAey6B,GAAY,OAAS,SAC1CA,EACG,GACA,wBAEJ,qBACCb,EACI,mBACA,KAEJC,EACG,uFAEA,OAEJ75B,EACA,gBAEF,IAAIlG,EAASg2B,IAAAA,WACX,OAAO3rB,GAAS41B,EAAaK,EAAY,UAAYp6B,GAClD0F,WAnldL4C,EAmldsB0xB,MAMtB,GADAlgC,EAAOkG,OAASA,EACZotB,GAAQtzB,GACV,MAAMA,EAER,OAAOA,GA46DT4V,GAAOgrB,MApsBP,SAAe9jC,EAAGsP,GAEhB,IADAtP,EAAIuvB,GAAUvvB,IACN,GAAKA,EA5wfM,iBA6wfjB,MAAO,GAET,IAAIwP,EA1wfe,WA2wfflT,EAAS+a,GAAUrX,EA3wfJ,YA8wfnBA,GA9wfmB,WAixfnB,IADA,IAAIkD,EAAS4O,GAAUxV,EAHvBgT,EAAWsW,GAAYtW,MAIdE,EAAQxP,GACfsP,EAASE,GAEX,OAAOtM,GAsrBT4V,GAAO+V,SAAWA,GAClB/V,GAAOyW,UAAYA,GACnBzW,GAAOme,SAAWA,GAClBne,GAAOirB,QAx5DP,SAAiBl9B,GACf,OAAO0N,GAAS1N,GAAO7E,eAw5DzB8W,GAAOiW,SAAWA,GAClBjW,GAAOkrB,cApuIP,SAAuBn9B,GACrB,OAAOA,EACH8U,GAAU4T,GAAU1oB,IAlvYL,iBAAA,kBAmvYJ,IAAVA,EAAcA,EAAQ,GAkuI7BiS,GAAOvE,SAAWA,GAClBuE,GAAOmrB,QAn4DP,SAAiBp9B,GACf,OAAO0N,GAAS1N,GAAOoyB,eAm4DzBngB,GAAOxd,KA12DP,SAAc0W,EAAQyc,EAAOjD,GAE3B,IADAxZ,EAASuC,GAASvC,MACHwZ,QAzqdf9Z,IAyqdwB+c,GACtB,OAAO1c,GAASC,GAElB,IAAKA,KAAYyc,EAAQ/F,GAAa+F,IACpC,OAAOzc,EAET,IAAIS,EAAakB,GAAc3B,GAC3BU,EAAaiB,GAAc8a,GAI/B,OAAO5E,GAAUpX,EAHLD,GAAgBC,EAAYC,GAC9BC,GAAcF,EAAYC,GAAc,GAETjX,KAAK,KA81DhDqd,GAAOorB,QAx0DP,SAAiBlyB,EAAQyc,EAAOjD,GAE9B,IADAxZ,EAASuC,GAASvC,MACHwZ,QA5sdf9Z,IA4sdwB+c,GACtB,OAAOzc,EAAOtS,MAAM,EAAGuS,GAAgBD,GAAU,GAEnD,IAAKA,KAAYyc,EAAQ/F,GAAa+F,IACpC,OAAOzc,EAET,IAAIS,EAAakB,GAAc3B,GAG/B,OAAO6X,GAAUpX,EAAY,EAFnBE,GAAcF,EAAYkB,GAAc8a,IAAU,GAEvBhzB,KAAK,KA8zD5Cqd,GAAOqrB,UAxyDP,SAAmBnyB,EAAQyc,EAAOjD,GAEhC,IADAxZ,EAASuC,GAASvC,MACHwZ,QA7udf9Z,IA6udwB+c,GACtB,OAAOzc,EAAOrS,QAAQmK,EAAa,IAErC,IAAKkI,KAAYyc,EAAQ/F,GAAa+F,IACpC,OAAOzc,EAET,IAAIS,EAAakB,GAAc3B,GAG/B,OAAO6X,GAAUpX,EAFLD,GAAgBC,EAAYkB,GAAc8a,KAElBhzB,KAAK,KA8xD3Cqd,GAAOsrB,SAtvDP,SAAkBpyB,EAAQ9W,GACxB,IAAIoB,EAnvdmB,GAovdnB+nC,EAnvdqB,MAqvdzB,GAAIx+B,GAAS3K,GAAU,CACrB,IAAImiC,EAAY,cAAeniC,EAAUA,EAAQmiC,UAAYA,EAC7D/gC,EAAS,WAAYpB,EAAUq0B,GAAUr0B,EAAQoB,QAAUA,EAC3D+nC,EAAW,aAAcnpC,EAAUwtB,GAAaxtB,EAAQmpC,UAAYA,EAItE,IAAI1C,GAFJ3vB,EAASuC,GAASvC,IAEK1V,OACvB,GAAI4W,GAAWlB,GAAS,CACtB,IAAIS,EAAakB,GAAc3B,GAC/B2vB,EAAYlvB,EAAWnW,OAEzB,GAAIA,GAAUqlC,EACZ,OAAO3vB,EAET,IAAInP,EAAMvG,EAASoX,GAAW2wB,GAC9B,GAAIxhC,EAAM,EACR,OAAOwhC,EAET,IAAInhC,EAASuP,EACToX,GAAUpX,EAAY,EAAG5P,GAAKpH,KAAK,IACnCuW,EAAOtS,MAAM,EAAGmD,GAEpB,QAzzdA6O,IAyzdI2rB,EACF,OAAOn6B,EAASmhC,EAKlB,GAHI5xB,IACF5P,GAAQK,EAAO5G,OAASuG,GAEtB4L,GAAS4uB,GAAAA,CACX,GAAIrrB,EAAOtS,MAAMmD,GAAKyhC,OAAOjH,GAAY,CACvC,IAAI9hC,EACA8D,EAAY6D,EAMhB,IAJKm6B,EAAUhwB,SACbgwB,EAAY/9B,GAAO+9B,EAAUj0B,OAAQmL,GAAShK,GAAQpH,KAAKk6B,IAAc,MAE3EA,EAAUz6B,UAAY,EACdrH,EAAQ8hC,EAAUl6B,KAAK9D,IAC7B,IAAIklC,EAAShpC,EAAMiU,MAErBtM,EAASA,EAAOxD,MAAM,OA30d1BgS,IA20d6B6yB,EAAuB1hC,EAAM0hC,SAEnD,GAAIvyB,EAAO3U,QAAQqrB,GAAa2U,GAAYx6B,IAAQA,EAAK,CAC9D,IAAI2M,EAAQtM,EAAO89B,YAAY3D,GAC3B7tB,GAAS,IACXtM,EAASA,EAAOxD,MAAM,EAAG8P,IAG7B,OAAOtM,EAASmhC,GAksDlBvrB,GAAO0rB,SA5qDP,SAAkBxyB,GAEhB,OADAA,EAASuC,GAASvC,KACA7I,EAAiB/E,KAAK4N,GACpCA,EAAOrS,QAAQsJ,EAAe2K,IAC9B5B,GAyqDN8G,GAAO2rB,SAvpBP,SAAkBC,GAChB,IAAI5a,IAAOrV,GACX,OAAOF,GAASmwB,GAAU5a,GAspB5BhR,GAAOkgB,UAAYA,GACnBlgB,GAAO4f,WAAaA,GAGpB5f,GAAO6rB,KAAO7pC,GACdge,GAAO8rB,UAAY/Q,GACnB/a,GAAO+rB,MAAQ1S,GAEfsH,GAAM3gB,IACA1P,GAAS,GACbmW,GAAWzG,IAAAA,SAAiB/J,EAAM6c,GAC3BpX,GAAetF,KAAK4J,GAAOrc,UAAWmvB,KACzCxiB,GAAOwiB,GAAc7c,MAGlB3F,IACH,CAAE,OAAS,IAWjB0P,GAAOgsB,QA/ihBK,UAkjhBZr1B,GAAU,CAAC,OAAQ,UAAW,QAAS,aAAc,UAAW,iBAAA,SAA0Bmc,GACxF9S,GAAO8S,GAAY/Y,YAAciG,MAInCrJ,GAAU,CAAC,OAAQ,SAAA,SAAkBmc,EAAYpc,GAC/CyJ,GAAYxc,UAAUmvB,GAAc,SAAS5rB,GAC3CA,OA5jhBF0R,IA4jhBM1R,EAAkB,EAAImX,GAAUoY,GAAUvvB,GAAI,GAElD,IAAIkD,EAAU1H,KAAKse,eAAiBtK,EAChC,IAAIyJ,GAAYzd,MAChBA,KAAKq2B,QAUT,OARI3uB,EAAO4W,aACT5W,EAAO8W,cAAgB3C,GAAUrX,EAAGkD,EAAO8W,eAE3C9W,EAAO+W,UAAUpb,KAAK,CACpB,KAAQwY,GAAUrX,EAvghBL,YAwghBb,KAAQ4rB,GAAc1oB,EAAO2W,QAAU,EAAI,QAAU,MAGlD3W,GAGT+V,GAAYxc,UAAUmvB,EAAa,SAAW,SAAS5rB,GACrD,OAAOxE,KAAKmc,UAAUiU,GAAY5rB,GAAG2X,cAKzClI,GAAU,CAAC,SAAU,MAAO,cAAA,SAAuBmc,EAAYpc,GAC7D,IAAI1Q,EAAO0Q,EAAQ,EACfu1B,EAjihBe,GAiihBJjmC,GA/hhBG,GA+hhByBA,EAE3Cma,GAAYxc,UAAUmvB,GAAc,SAAStc,GAC3C,IAAIpM,EAAS1H,KAAKq2B,QAMlB,OALA3uB,EAAO6W,cAAclb,KAAK,CACxB,SAAY+mB,GAAYtW,EAAU,GAClC,KAAQxQ,IAEVoE,EAAO4W,aAAe5W,EAAO4W,cAAgBirB,EACtC7hC,MAKXuM,GAAU,CAAC,OAAQ,SAAA,SAAkBmc,EAAYpc,GAC/C,IAAIw1B,EAAW,QAAUx1B,EAAQ,QAAU,IAE3CyJ,GAAYxc,UAAUmvB,GAAc,WAClC,OAAOpwB,KAAKwpC,GAAU,GAAGn+B,QAAQ,OAKrC4I,GAAU,CAAC,UAAW,SAAA,SAAkBmc,EAAYpc,GAClD,IAAIy1B,EAAW,QAAUz1B,EAAQ,GAAK,SAEtCyJ,GAAYxc,UAAUmvB,GAAc,WAClC,OAAOpwB,KAAKse,aAAe,IAAIb,GAAYzd,MAAQA,KAAKypC,GAAU,OAItEhsB,GAAYxc,UAAUq+B,QAAU,WAC9B,OAAOt/B,KAAKS,OAAOgoB,KAGrBhL,GAAYxc,UAAUk3B,KAAO,SAAS/jB,GACpC,OAAOpU,KAAKS,OAAO2T,GAAWuiB,QAGhClZ,GAAYxc,UAAUm3B,SAAW,SAAShkB,GACxC,OAAOpU,KAAKmc,UAAUgc,KAAK/jB,IAG7BqJ,GAAYxc,UAAUs3B,UAAYnN,IAAAA,SAAkBltB,EAAMuV,GACxD,MAAmB,mBAARvV,EACF,IAAIuf,GAAYzd,MAElBA,KAAKyB,KAAAA,SAAa4J,GACvB,OAAO+a,GAAW/a,EAAOnN,EAAMuV,SAInCgK,GAAYxc,UAAUogC,OAAS,SAASjtB,GACtC,OAAOpU,KAAKS,OAAON,GAAOiqB,GAAYhW,MAGxCqJ,GAAYxc,UAAUiD,MAAQ,SAASX,EAAO8D,GAC5C9D,EAAQwwB,GAAUxwB,GAElB,IAAImE,EAAS1H,KACb,OAAI0H,EAAO4W,eAAiB/a,EAAQ,GAAK8D,EAAM,GACtC,IAAIoW,GAAY/V,IAErBnE,EAAQ,EACVmE,EAASA,EAAOu6B,WAAW1+B,GAClBA,IACTmE,EAASA,EAAOk4B,KAAKr8B,SAvphBvB2S,IAyphBI7O,IAEFK,GADAL,EAAM0sB,GAAU1sB,IACD,EAAIK,EAAOm4B,WAAWx4B,GAAOK,EAAOs6B,KAAK36B,EAAM9D,IAEzDmE,IAGT+V,GAAYxc,UAAUihC,eAAiB,SAAS9tB,GAC9C,OAAOpU,KAAKmc,UAAUgmB,UAAU/tB,GAAW+H,WAG7CsB,GAAYxc,UAAUo6B,QAAU,WAC9B,OAAOr7B,KAAKgiC,KAtmhBO,aA0mhBrBje,GAAWtG,GAAYxc,WAAAA,SAAoBsS,EAAM6c,GAC/C,IAAIsZ,EAAgB,qCAAqC9gC,KAAKwnB,GAC1DuZ,EAAU,kBAAkB/gC,KAAKwnB,GACjCwZ,EAAatsB,GAAOqsB,EAAW,QAAwB,QAAdvZ,EAAuB,QAAU,IAAOA,GACjFyZ,EAAeF,GAAW,QAAQ/gC,KAAKwnB,GAEtCwZ,IAGLtsB,GAAOrc,UAAUmvB,GAAc,WAC7B,IAAI/kB,EAAQrL,KAAKge,YACbvK,EAAOk2B,EAAU,CAAC,GAAKrhC,UACvBwhC,EAASz+B,aAAiBoS,GAC1B3J,EAAWL,EAAK,GAChBs2B,EAAUD,GAAUtsB,GAAQnS,GAE5B2sB,EAAc,SAAS3sB,GACzB,IAAI3D,EAASkiC,EAAWt2B,MAAMgK,GAAQzI,GAAU,CAACxJ,GAAQoI,IACzD,OAAQk2B,GAAW5rB,EAAYrW,EAAO,GAAKA,GAGzCqiC,GAAWL,GAAoC,mBAAZ51B,GAA6C,GAAnBA,EAAShT,SAExEgpC,EAASC,GAAU,GAErB,IAAIhsB,EAAW/d,KAAKke,UAChB8rB,IAAahqC,KAAKie,YAAYnd,OAC9BmpC,EAAcJ,IAAiB9rB,EAC/BmsB,EAAWJ,IAAWE,EAE1B,IAAKH,GAAgBE,EAAS,CAC5B1+B,EAAQ6+B,EAAW7+B,EAAQ,IAAIoS,GAAYzd,MAC3C,IAAI0H,EAAS6L,EAAKD,MAAMjI,EAAOoI,GAE/B,OADA/L,EAAOuW,YAAY5a,KAAK,CAAE,KAAQ6tB,GAAM,KAAQ,CAAC8G,GAAc,aA1shBnE9hB,IA2shBW,IAAIwH,GAAchW,EAAQqW,GAEnC,OAAIksB,GAAeC,EACV32B,EAAKD,MAAMtT,KAAMyT,IAE1B/L,EAAS1H,KAAKkxB,KAAK8G,GACZiS,EAAeN,EAAUjiC,EAAO2D,QAAQ,GAAK3D,EAAO2D,QAAW3D,QAK1EuM,GAAU,CAAC,MAAO,OAAQ,QAAS,OAAQ,SAAU,YAAA,SAAqBmc,GACxE,IAAI7c,EAAOoF,GAAWyX,GAClB+Z,EAAY,0BAA0BvhC,KAAKwnB,GAAc,MAAQ,OACjEyZ,EAAe,kBAAkBjhC,KAAKwnB,GAE1C9S,GAAOrc,UAAUmvB,GAAc,WAC7B,IAAI3c,EAAOnL,UACX,GAAIuhC,IAAiB7pC,KAAKke,UAAW,CACnC,IAAI7S,EAAQrL,KAAKqL,QACjB,OAAOkI,EAAKD,MAAMkK,GAAQnS,GAASA,EAAQ,GAAIoI,GAEjD,OAAOzT,KAAKmqC,IAAAA,SAAoB9+B,GAC9B,OAAOkI,EAAKD,MAAMkK,GAAQnS,GAASA,EAAQ,GAAIoI,UAMrDsQ,GAAWtG,GAAYxc,WAAAA,SAAoBsS,EAAM6c,GAC/C,IAAIwZ,EAAatsB,GAAO8S,GACxB,GAAIwZ,EAAY,CACd,IAAIn0B,EAAMm0B,EAAWn/B,KAAO,GACvBuO,GAAetF,KAAKiJ,GAAWlH,KAClCkH,GAAUlH,GAAO,IAEnBkH,GAAUlH,GAAKpS,KAAK,CAAE,KAAQ+sB,EAAY,KAAQwZ,QAItDjtB,GAAU8U,QAnvhBRvb,EAiCqB,GAkthB+BzL,MAAQ,CAAC,CAC7D,KAAQ,UACR,UArvhBAyL,IAyvhBFuH,GAAYxc,UAAUo1B,MAh9dtB,WACE,IAAI3uB,EAAS,IAAI+V,GAAYzd,KAAKge,aAOlC,OANAtW,EAAOuW,YAAciC,GAAUlgB,KAAKie,aACpCvW,EAAO2W,QAAUre,KAAKqe,QACtB3W,EAAO4W,aAAete,KAAKse,aAC3B5W,EAAO6W,cAAgB2B,GAAUlgB,KAAKue,eACtC7W,EAAO8W,cAAgBxe,KAAKwe,cAC5B9W,EAAO+W,UAAYyB,GAAUlgB,KAAKye,WAC3B/W,GAy8dT+V,GAAYxc,UAAUkb,QA97dtB,WACE,GAAInc,KAAKse,aAAc,CACrB,IAAI5W,EAAS,IAAI+V,GAAYzd,MAC7B0H,EAAO2W,SAAW,EAClB3W,EAAO4W,cAAe,OAEtB5W,EAAS1H,KAAKq2B,SACPhY,UAAY,EAErB,OAAO3W,GAs7dT+V,GAAYxc,UAAUoK,MA36dtB,WACE,IAAIuI,EAAQ5T,KAAKge,YAAY3S,QACzBrB,EAAMhK,KAAKqe,QACXkB,EAAQ/B,GAAQ5J,GAChBw2B,EAAUpgC,EAAM,EAChByqB,EAAYlV,EAAQ3L,EAAM9S,OAAS,EACnCupC,EA8pIN,SAAiB9mC,EAAO8D,EAAKqzB,GAI3B,IAHA,IAAI1mB,GAAS,EACTlT,EAAS45B,EAAW55B,SAEfkT,EAAQlT,GAAQ,CACvB,IAAIse,EAAOsb,EAAW1mB,GAClB4D,EAAOwH,EAAKxH,KAEhB,OAAQwH,EAAK9b,MACX,IAAK,OAAaC,GAASqU,EAAM,MACjC,IAAK,YAAavQ,GAAOuQ,EAAM,MAC/B,IAAK,OAAavQ,EAAMwU,GAAUxU,EAAK9D,EAAQqU,GAAO,MACtD,IAAK,YAAarU,EAAQoY,GAAUpY,EAAO8D,EAAMuQ,IAGrD,MAAO,CAAE,MAASrU,EAAO,IAAO8D,GAflC,CA9pIqB,EAAGotB,EAAWz0B,KAAKye,WAClClb,EAAQ8mC,EAAK9mC,MACb8D,EAAMgjC,EAAKhjC,IACXvG,EAASuG,EAAM9D,EACfyQ,EAAQo2B,EAAU/iC,EAAO9D,EAAQ,EACjC2mB,EAAYlqB,KAAKue,cACjB+rB,EAAapgB,EAAUppB,OACvBwT,EAAW,EACXi2B,EAAY1uB,GAAU/a,EAAQd,KAAKwe,eAEvC,IAAKe,IAAW6qB,GAAW3V,GAAa3zB,GAAUypC,GAAazpC,EAC7D,OAAO4sB,GAAiB9Z,EAAO5T,KAAKie,aAEtC,IAAIvW,EAAS,GAEb6b,EACA,KAAOziB,KAAYwT,EAAWi2B,GAAW,CAMvC,IAHA,IAAIC,GAAa,EACbn/B,EAAQuI,EAHZI,GAAShK,KAKAwgC,EAAYF,GAAY,CAC/B,IAAIlrB,EAAO8K,EAAUsgB,GAEjBlnC,EAAO8b,EAAK9b,KACZkgB,GAAW1P,EAFAsL,EAAKtL,UAEIzI,GAExB,GA7zDY,GA6zDR/H,EACF+H,EAAQmY,OACH,IAAKA,EAAU,CACpB,GAj0Da,GAi0DTlgB,EACF,SAASigB,EAET,MAAMA,GAIZ7b,EAAO4M,KAAcjJ,EAEvB,OAAO3D,GAg4dT4V,GAAOrc,UAAU86B,GAAK9D,GACtB3a,GAAOrc,UAAU82B,MA1iQjB,WACE,OAAOA,GAAM/3B,OA0iQfsd,GAAOrc,UAAUwpC,OA7gQjB,WACE,OAAO,IAAI/sB,GAAc1d,KAAKqL,QAASrL,KAAKke,YA6gQ9CZ,GAAOrc,UAAUq6B,KAp/PjB,gBA7wREplB,IA8wRIlW,KAAKoe,aACPpe,KAAKoe,WAAaid,GAAQr7B,KAAKqL,UAEjC,IAAIkwB,EAAOv7B,KAAKme,WAAane,KAAKoe,WAAWtd,OAG7C,MAAO,CAAE,KAAQy6B,EAAM,MAFXA,OAlxRZrlB,EAkxR+BlW,KAAKoe,WAAWpe,KAAKme,eAg/PtDb,GAAOrc,UAAUuwB,MA77PjB,SAAsBnmB,GAIpB,IAHA,IAAI3D,EACA2e,EAASrmB,KAENqmB,aAAkBvI,IAAY,CACnC,IAAIuY,EAAQ1Y,GAAa0I,GACzBgQ,EAAMlY,UAAY,EAClBkY,EAAMjY,gBA50RRlI,EA60RMxO,EACFujB,EAASjN,YAAcqY,EAEvB3uB,EAAS2uB,EAEX,IAAIpL,EAAWoL,EACfhQ,EAASA,EAAOrI,YAGlB,OADAiN,EAASjN,YAAc3S,EAChB3D,GA66PT4V,GAAOrc,UAAUkb,QAt5PjB,WACE,IAAI9Q,EAAQrL,KAAKge,YACjB,GAAI3S,aAAiBoS,GAAa,CAChC,IAAIitB,EAAUr/B,EAUd,OATIrL,KAAKie,YAAYnd,SACnB4pC,EAAU,IAAIjtB,GAAYzd,QAE5B0qC,EAAUA,EAAQvuB,WACV8B,YAAY5a,KAAK,CACvB,KAAQ6tB,GACR,KAAQ,CAAC/U,IACT,aAx3RJjG,IA03RS,IAAIwH,GAAcgtB,EAAS1qC,KAAKke,WAEzC,OAAOle,KAAKkxB,KAAK/U,KAw4PnBmB,GAAOrc,UAAU0pC,OAASrtB,GAAOrc,UAAUmc,QAAUE,GAAOrc,UAAUoK,MAv3PtE,WACE,OAAOqiB,GAAiB1tB,KAAKge,YAAahe,KAAKie,cAy3PjDX,GAAOrc,UAAUooC,MAAQ/rB,GAAOrc,UAAU01B,KAEtCxc,KACFmD,GAAOrc,UAAUkZ,IAj+PnB,WACE,OAAOna,OAk+PFsd,GAh3eU,GA83ejBvT,GAAK3F,EAAIA,QA1xhBP8R,KA8xhBF,GAAA,WACE,OAAO9R,KACR,KAAA,EAAA,EAAA,EAAA,MAAA,EAAA,QAAA,KAaHsP,KAAK1T,sDCnyhBP,IAAI4qC,EAAe,WACnBjtC,EAAQwM,OAAS,SAAS1E,GACxB,IAAKgD,EAAShD,GAAI,CAEhB,IADA,IAAIolC,EAAU,GACLnqC,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IACpCmqC,EAAQxnC,KAAKynC,EAAQxiC,UAAU5H,KAEjC,OAAOmqC,EAAQ5qC,KAAK,KAGlBS,EAAI,EAmBR,IAnBA,IACI+S,EAAOnL,UACPnF,EAAMsQ,EAAK3S,OACXiqC,EAAMryB,OAAOjT,GAAGtB,QAAQymC,GAAAA,SAAuBI,GACjD,GAAU,OAANA,EAAY,MAAO,IACvB,GAAItqC,GAAKyC,EAAK,OAAO6nC,EACrB,OAAQA,GACN,IAAK,KAAM,OAAOtyB,OAAOjF,EAAK/S,MAC9B,IAAK,KAAM,OAAOuqC,OAAOx3B,EAAK/S,MAC9B,IAAK,KACH,IACE,OAAOwqC,KAAKC,UAAU13B,EAAK/S,MAC3B,MAAO0D,GACP,MAAO,aAEX,QACE,OAAO4mC,MAGJA,EAAIv3B,EAAK/S,GAAIA,EAAIyC,EAAK6nC,EAAIv3B,IAAO/S,GACpCykC,EAAO6F,KAAO3gC,EAAS2gC,GACzBD,GAAO,IAAMC,EAEbD,GAAO,IAAMD,EAAQE,GAGzB,OAAOD,GAOTptC,EAAQytC,UAAY,SAAS7Y,EAAI8Y,GAE/B,GAAIhG,EAAYxzB,OAAOlL,SACrB,OAAO,WACL,OAAOhJ,EAAQytC,UAAU7Y,EAAI8Y,GAAK/3B,MAAMtT,KAAMsI,YAIlD,IAA8B,IAA1B3B,QAAQ2kC,cACV,OAAO/Y,EAGT,IAAIgZ,GAAS,EAeb,OAdA,WACE,IAAKA,EAAQ,CACX,GAAI5kC,QAAQ6kC,iBACV,MAAM,IAAI/kC,MAAM4kC,GACP1kC,QAAQ8kC,iBACjBnqC,QAAQoqC,MAAML,GAEd/pC,QAAQC,MAAM8pC,GAEhBE,GAAS,EAEX,OAAOhZ,EAAGjf,MAAMtT,KAAMsI,aAO1B,IACIqjC,EADAC,EAAS,GA6Bb,SAASd,EAAQe,EAAKC,GAEpB,IAAIC,EAAM,CACR5lB,KAAM,GACN6lB,QAASC,GAkBX,OAfI3jC,UAAUxH,QAAU,IAAGirC,EAAIxnB,MAAQjc,UAAU,IAC7CA,UAAUxH,QAAU,IAAGirC,EAAIG,OAAS5jC,UAAU,IAC9Cm8B,EAAUqH,GAEZC,EAAII,WAAaL,EACRA,GAETnuC,EAAQyuC,QAAQL,EAAKD,GAGnBzG,EAAY0G,EAAII,cAAaJ,EAAII,YAAa,GAC9C9G,EAAY0G,EAAIxnB,SAAQwnB,EAAIxnB,MAAQ,GACpC8gB,EAAY0G,EAAIG,UAASH,EAAIG,QAAS,GACtC7G,EAAY0G,EAAIM,iBAAgBN,EAAIM,eAAgB,GACpDN,EAAIG,SAAQH,EAAIC,QAAUM,GACvBC,EAAYR,EAAKF,EAAKE,EAAIxnB,OAoCnC,SAAS+nB,EAAiBvB,EAAKyB,GAC7B,IAAIC,EAAQ3B,EAAQ4B,OAAOF,GAE3B,OAAIC,EACK,QAAY3B,EAAQoB,OAAOO,GAAO,GAAK,IAAM1B,EAC7C,QAAYD,EAAQoB,OAAOO,GAAO,GAAK,IAEvC1B,EAKX,SAASkB,EAAelB,EAAKyB,GAC3B,OAAOzB,EAeT,SAASwB,EAAYR,EAAK1gC,EAAOshC,GAG/B,GAAIZ,EAAIM,eACJhhC,GACAyZ,EAAWzZ,EAAMy/B,UAEjBz/B,EAAMy/B,UAAYntC,EAAQmtC,WAExBz/B,EAAMD,aAAeC,EAAMD,YAAYnK,YAAcoK,GAAQ,CACjE,IAAIuhC,EAAMvhC,EAAMy/B,QAAQ6B,EAAcZ,GAItC,OAHKtjC,EAASmkC,KACZA,EAAML,EAAYR,EAAKa,EAAKD,IAEvBC,EAIT,IAAIC,EA+FN,SAAyBd,EAAK1gC,GAC5B,GAAIg6B,EAAYh6B,GACd,OAAO0gC,EAAIC,QAAQ,YAAa,aAClC,GAAIvjC,EAAS4C,GAAQ,CACnB,IAAIyhC,EAAS,IAAO5B,KAAKC,UAAU9/B,GAAOlH,QAAQ,SAAU,IAClBA,QAAQ,KAAM,OACdA,QAAQ,OAAQ,KAAO,IACjE,OAAO4nC,EAAIC,QAAQc,EAAQ,UAE7B,OAAI5R,EAAS7vB,GACJ0gC,EAAIC,QAAQ,GAAK3gC,EAAO,UAC7Bo5B,EAAUp5B,GACL0gC,EAAIC,QAAQ,GAAK3gC,EAAO,WAE7B85B,EAAO95B,GACF0gC,EAAIC,QAAQ,OAAQ,aAD7B,EAdF,CA/FkCD,EAAK1gC,GACrC,GAAIwhC,EACF,OAAOA,EAIT,IAAIxtC,EAAOD,OAAOC,KAAKgM,GACnB0hC,EApCN,SAAqBn5B,GACnB,IAAIo5B,EAAO,GAMX,OAJAp5B,EAAMtU,SAAAA,SAAiB2tC,EAAKC,GAC1BF,EAAKC,IAAO,KAGPD,EAPT,CAoCgC3tC,GAQ9B,GANI0sC,EAAII,aACN9sC,EAAOD,OAAO+tC,oBAAoB9hC,IAKhC2vB,EAAQ3vB,KACJhM,EAAKwC,QAAQ,YAAc,GAAKxC,EAAKwC,QAAQ,gBAAkB,GACrE,OAAOurC,EAAY/hC,GAIrB,GAAoB,IAAhBhM,EAAKyB,OAAc,CACrB,GAAIgkB,EAAWzZ,GAEb,OAAO0gC,EAAIC,QAAQ,aADR3gC,EAAMZ,KAAO,KAAOY,EAAMZ,KAAO,IACJ,IAAK,WAE/C,GAAIwI,EAAS5H,GACX,OAAO0gC,EAAIC,QAAQloC,OAAO7C,UAAU8X,SAASrF,KAAKrI,GAAQ,UAE5D,GAAIwH,EAAOxH,GACT,OAAO0gC,EAAIC,QAAQvzB,KAAKxX,UAAU8X,SAASrF,KAAKrI,GAAQ,QAE1D,GAAI2vB,EAAQ3vB,GACV,OAAO+hC,EAAY/hC,GAIvB,IA2CIgiC,EA3CA/iC,EAAO,GAAIsJ,GAAQ,EAAO05B,EAAS,CAAC,IAAK,KA6B7C,OA1BI9vB,EAAQnS,KACVuI,GAAQ,EACR05B,EAAS,CAAC,IAAK,MAIbxoB,EAAWzZ,KAEbf,EAAO,cADCe,EAAMZ,KAAO,KAAOY,EAAMZ,KAAO,IACf,KAIxBwI,EAAS5H,KACXf,EAAO,IAAMxG,OAAO7C,UAAU8X,SAASrF,KAAKrI,IAI1CwH,EAAOxH,KACTf,EAAO,IAAMmO,KAAKxX,UAAUssC,YAAY75B,KAAKrI,IAI3C2vB,EAAQ3vB,KACVf,EAAO,IAAM8iC,EAAY/hC,IAGP,IAAhBhM,EAAKyB,QAAkB8S,GAAyB,GAAhBvI,EAAMvK,OAItC6rC,EAAe,EACb15B,EAAS5H,GACJ0gC,EAAIC,QAAQloC,OAAO7C,UAAU8X,SAASrF,KAAKrI,GAAQ,UAEnD0gC,EAAIC,QAAQ,WAAY,YAInCD,EAAI5lB,KAAK9iB,KAAKgI,GAIZgiC,EADEz5B,EAsCN,SAAqBm4B,EAAK1gC,EAAOshC,EAAcI,EAAa1tC,GAE1D,IADA,IAAIguC,EAAS,GACJ3sC,EAAI,EAAGsB,EAAIqJ,EAAMvK,OAAQJ,EAAIsB,IAAKtB,EACrCsY,EAAe3N,EAAOqN,OAAOhY,IAC/B2sC,EAAOhqC,KAAKmqC,EAAezB,EAAK1gC,EAAOshC,EAAcI,EACjDr0B,OAAOhY,IAAI,IAEf2sC,EAAOhqC,KAAK,IAShB,OANAhE,EAAKC,SAAAA,SAAiBmW,GACfA,EAAI1V,MAAM,UACbstC,EAAOhqC,KAAKmqC,EAAezB,EAAK1gC,EAAOshC,EAAcI,EACjDt3B,GAAK,OAGN43B,EAhBT,CArCyBtB,EAAK1gC,EAAOshC,EAAcI,EAAa1tC,GAEnDA,EAAKoC,KAAAA,SAAagU,GACzB,OAAO+3B,EAAezB,EAAK1gC,EAAOshC,EAAcI,EAAat3B,EAAK7B,MAItEm4B,EAAI5lB,KAAKziB,MA6GX,SAA8B2pC,EAAQ/iC,EAAMgjC,GAQ1C,OANaD,EAAOzuC,QAAAA,SAAgB6uC,EAAMC,GAGxC,OADIA,EAAI7rC,QAAQ,MACT4rC,EAAOC,EAAIvpC,QAAQ,kBAAmB,IAAIrD,OAAS,IACzD,GAEU,GACJwsC,EAAO,IACG,KAAThjC,EAAc,GAAKA,EAAO,OAC3B,IACA+iC,EAAOptC,KAAK,SACZ,IACAqtC,EAAO,GAGTA,EAAO,GAAKhjC,EAAO,IAAM+iC,EAAOptC,KAAK,MAAQ,IAAMqtC,EAAO,GAjBnE,CA3G8BD,EAAQ/iC,EAAMgjC,IAxBjCA,EAAO,GAAKhjC,EAAOgjC,EAAO,GA+CrC,SAASF,EAAY/hC,GACnB,MAAO,IAAM5E,MAAMxF,UAAU8X,SAASrF,KAAKrI,GAAS,IAwBtD,SAASmiC,EAAezB,EAAK1gC,EAAOshC,EAAcI,EAAat3B,EAAK7B,GAClE,IAAInJ,EAAMsgC,EAAK4C,EAsCf,IArCAA,EAAOvuC,OAAOwuC,yBAAyBviC,EAAOoK,IAAQ,CAAEpK,MAAOA,EAAMoK,KAC5DwL,IAEL8pB,EAAMgB,EAAIC,QADR2B,EAAK9uC,IACW,kBAEA,WAFmB,WAKnC8uC,EAAK9uC,MACPksC,EAAMgB,EAAIC,QAAQ,WAAY,YAG7BhzB,EAAe+zB,EAAat3B,KAC/BhL,EAAO,IAAMgL,EAAM,KAEhBs1B,IACCgB,EAAI5lB,KAAKtkB,QAAQ8rC,EAAKtiC,OAAS,GAE/B0/B,EADE5F,EAAOwH,GACHJ,EAAYR,EAAK4B,EAAKtiC,MAAO,MAE7BkhC,EAAYR,EAAK4B,EAAKtiC,MAAOshC,EAAe,IAE5C9qC,QAAQ,OAAS,IAErBkpC,EADEn3B,EACIm3B,EAAIpsC,MAAM,MAAM8C,KAAAA,SAAaosC,GACjC,MAAO,KAAOA,KACb5tC,KAAK,MAAMgC,OAAO,GAEf,KAAO8oC,EAAIpsC,MAAM,MAAM8C,KAAAA,SAAaosC,GACxC,MAAO,MAAQA,KACd5tC,KAAK,OAIZ8qC,EAAMgB,EAAIC,QAAQ,aAAc,YAGhC3G,EAAY56B,GAAO,CACrB,GAAImJ,GAAS6B,EAAI1V,MAAM,SACrB,OAAOgrC,GAETtgC,EAAOygC,KAAKC,UAAU,GAAK11B,IAClB1V,MAAM,iCACb0K,EAAOA,EAAKxI,OAAO,EAAGwI,EAAK3J,OAAS,GACpC2J,EAAOshC,EAAIC,QAAQvhC,EAAM,UAEzBA,EAAOA,EAAKtG,QAAQ,KAAM,OACdA,QAAQ,OAAQ,KAChBA,QAAQ,WAAY,KAChCsG,EAAOshC,EAAIC,QAAQvhC,EAAM,WAI7B,OAAOA,EAAO,KAAOsgC,EA2BvB,SAASvtB,EAAQswB,GACf,OAAOl5B,MAAM4I,QAAQswB,GAIvB,SAASrJ,EAAU7mC,GACjB,MAAsB,kBAARA,EAIhB,SAASunC,EAAOvnC,GACd,OAAe,OAARA,EAST,SAASs9B,EAASt9B,GAChB,MAAsB,iBAARA,EAIhB,SAAS6K,EAAS7K,GAChB,MAAsB,iBAARA,EAShB,SAASynC,EAAYznC,GACnB,YAAe,IAARA,EAIT,SAASqV,EAAS5Q,GAChB,OAAOgI,EAAShI,IAA8B,oBAAvB0rC,EAAe1rC,GAIxC,SAASgI,EAASzM,GAChB,MAAsB,iBAARA,GAA4B,OAARA,EAIpC,SAASiV,EAAOm7B,GACd,OAAO3jC,EAAS2jC,IAA4B,kBAAtBD,EAAeC,GAIvC,SAAShT,EAAQvoB,GACf,OAAOpI,EAASoI,KACW,mBAAtBs7B,EAAet7B,IAA2BA,aAAahM,OAI9D,SAASqe,EAAWlnB,GAClB,MAAsB,mBAARA,EAgBhB,SAASmwC,EAAeE,GACtB,OAAO7uC,OAAO6B,UAAU8X,SAASrF,KAAKu6B,GAIxC,SAAS/H,EAAI1hC,GACX,OAAOA,EAAI,GAAK,IAAMA,EAAEuU,SAAS,IAAMvU,EAAEuU,SAAS,IApbpDpb,EAAQuwC,SAAW,SAASrvC,GAI1B,GAHIwmC,EAAYsG,KACdA,EAAehlC,QAAQ4B,IAAI4lC,YAAc,IAC3CtvC,EAAMA,EAAI4+B,eACLmO,EAAO/sC,GACV,GAAI,IAAIiF,OAAO,MAAQjF,EAAM,MAAO,KAAK+J,KAAK+iC,GAAe,CAC3D,IAAIyC,EAAMznC,QAAQynC,IAClBxC,EAAO/sC,GAAO,WACZ,IAAIwsC,EAAM1tC,EAAQwM,OAAOmJ,MAAM3V,EAAS2K,WACxChH,QAAQC,MAAM,YAAa1C,EAAKuvC,EAAK/C,SAGvCO,EAAO/sC,GAAO,aAGlB,OAAO+sC,EAAO/sC,IAoChBlB,EAAQmtC,QAAUA,EAIlBA,EAAQoB,OAAS,CACf,KAAS,CAAC,EAAG,IACb,OAAW,CAAC,EAAG,IACf,UAAc,CAAC,EAAG,IAClB,QAAY,CAAC,EAAG,IAChB,MAAU,CAAC,GAAI,IACf,KAAS,CAAC,GAAI,IACd,MAAU,CAAC,GAAI,IACf,KAAS,CAAC,GAAI,IACd,KAAS,CAAC,GAAI,IACd,MAAU,CAAC,GAAI,IACf,QAAY,CAAC,GAAI,IACjB,IAAQ,CAAC,GAAI,IACb,OAAW,CAAC,GAAI,KAIlBpB,EAAQ4B,OAAS,CACf,QAAW,OACX,OAAU,SACV,QAAW,SACX,UAAa,OACb,KAAQ,OACR,OAAU,QACV,KAAQ,UAER,OAAU,OAkRZ/uC,EAAQ6f,QAAUA,EAKlB7f,EAAQ8mC,UAAYA,EAKpB9mC,EAAQwnC,OAASA,EAKjBxnC,EAAQ0wC,kBAHR,SAA2BzwC,GACzB,OAAc,MAAPA,GAOTD,EAAQu9B,SAAWA,EAKnBv9B,EAAQ8K,SAAWA,EAKnB9K,EAAQymB,SAHR,SAAkBxmB,GAChB,MAAsB,iBAARA,GAOhBD,EAAQ0nC,YAAcA,EAKtB1nC,EAAQsV,SAAWA,EAKnBtV,EAAQ0M,SAAWA,EAKnB1M,EAAQkV,OAASA,EAMjBlV,EAAQq9B,QAAUA,EAKlBr9B,EAAQmnB,WAAaA,EAUrBnnB,EAAQ2wC,YARR,SAAqB1wC,GACnB,OAAe,OAARA,GACe,kBAARA,GACQ,iBAARA,GACQ,iBAARA,GACQ,iBAARA,QACQ,IAARA,GAIhBD,EAAQ2d,SAAW,EAAQ,QAY3B,IAAIizB,EAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACxD,MAAO,MAAO,OAG5B,SAASC,IACP,IAAIR,EAAI,IAAIv1B,KACRghB,EAAO,CAACyM,EAAI8H,EAAES,YACNvI,EAAI8H,EAAEU,cACNxI,EAAI8H,EAAEW,eAAe1uC,KAAK,KACtC,MAAO,CAAC+tC,EAAEY,UAAWL,EAAOP,EAAEa,YAAapV,GAAMx5B,KAAK,KAqCxD,SAAS+Y,EAAe6yB,EAAKjP,GAC3B,OAAOx9B,OAAO6B,UAAU+X,eAAetF,KAAKm4B,EAAKjP,GAjCnDj/B,EAAQmxC,IAAM,WACZxtC,QAAQwtC,IAAI,UAAWN,IAAa7wC,EAAQwM,OAAOmJ,MAAM3V,EAAS2K,aAiBpE3K,EAAQoxC,SAAW,EAAQ,QAE3BpxC,EAAQyuC,QAAU,SAAS4C,EAAQ9vB,GAEjC,IAAKA,IAAQ7U,EAAS6U,GAAM,OAAO8vB,EAInC,IAFA,IAAI3vC,EAAOD,OAAOC,KAAK6f,GACnBxe,EAAIrB,EAAKyB,OACNJ,KACLsuC,EAAO3vC,EAAKqB,IAAMwe,EAAI7f,EAAKqB,IAE7B,OAAOsuC,yBCpkBT,IAAIC,EAAY,EAAQ,QACpBC,EAAW,EAAQ,QAEvBxxC,EAAOC,QA6DP,SAAmBotC,GACjB,OAAKA,GASoB,OAArBA,EAAI9oC,OAAO,EAAG,KAChB8oC,EAAM,SAAWA,EAAI9oC,OAAO,IAwBhC,SAAS3D,EAAOysC,EAAKoE,GACnB,IAAIC,EAAa,GAEbpuC,EAAIkuC,EAAS,IAAK,IAAKnE,GAC3B,IAAK/pC,GAAK,MAAM4H,KAAK5H,EAAEquC,KAAM,MAAO,CAACtE,GAErC,IAaIvmC,EAbA8qC,EAAoB,iCAAiC1mC,KAAK5H,EAAEuuC,MAC5DC,EAAkB,uCAAuC5mC,KAAK5H,EAAEuuC,MAChEE,EAAaH,GAAqBE,EAClCE,EAAY1uC,EAAEuuC,KAAK1tC,QAAQ,MAAQ,EACvC,IAAK4tC,IAAeC,EAElB,OAAI1uC,EAAE2uC,KAAK5vC,MAAM,SAERzB,EADPysC,EAAM/pC,EAAEquC,IAAM,IAAMruC,EAAEuuC,KAAOK,EAAW5uC,EAAE2uC,MAGrC,CAAC5E,GAIV,GAAI0E,EACFjrC,EAAIxD,EAAEuuC,KAAK5wC,MAAM,aAGjB,GAAiB,KADjB6F,EArFJ,SAASqrC,EAAgB9E,GACvB,IAAKA,EACH,MAAO,CAAC,IAEV,IAAIhkC,EAAQ,GACR/F,EAAIkuC,EAAS,IAAK,IAAKnE,GAE3B,IAAK/pC,EACH,OAAO+pC,EAAIpsC,MAAM,KAEnB,IACI4wC,EAAOvuC,EAAEuuC,KACTI,EAAO3uC,EAAE2uC,KACTnwC,EAHMwB,EAAEquC,IAGA1wC,MAAM,KAElBa,EAAEA,EAAEsB,OAAO,IAAM,IAAMyuC,EAAO,IAC9B,IAAIO,EAAYD,EAAgBF,GAQhC,OAPIA,EAAK7uC,SACPtB,EAAEA,EAAEsB,OAAO,IAAMgvC,EAAUC,QAC3BvwC,EAAE6D,KAAKiQ,MAAM9T,EAAGswC,IAGlB/oC,EAAM1D,KAAKiQ,MAAMvM,EAAOvH,GAEjBuH,EAxBT,CAqFwB/F,EAAEuuC,OAChBzuC,QAGa,KADjB0D,EAAIlG,EAAOkG,EAAE,IAAI,GAAO/C,IAAIuuC,IACtBlvC,OAIJ,OAHI6uC,EAAO3uC,EAAE2uC,KAAK7uC,OACdxC,EAAO0C,EAAE2uC,MAAM,GACf,CAAC,KACOluC,KAAAA,SAAajC,GACvB,OAAOwB,EAAEquC,IAAM7qC,EAAE,GAAKhF,KAU9B,IAKIywC,EALAZ,EAAMruC,EAAEquC,IACRM,EAAO3uC,EAAE2uC,KAAK7uC,OACdxC,EAAO0C,EAAE2uC,MAAM,GACf,CAAC,IAIL,GAAIF,EAAY,CACd,IAAIzE,EAAIkF,EAAQ1rC,EAAE,IACd2rC,EAAID,EAAQ1rC,EAAE,IACd4rC,EAAQ7mC,KAAKqS,IAAIpX,EAAE,GAAG1D,OAAQ0D,EAAE,GAAG1D,QACnCuvC,EAAmB,GAAZ7rC,EAAE1D,OACTyI,KAAK+mC,IAAIJ,EAAQ1rC,EAAE,KACnB,EACAoE,EAAOwyB,EACG+U,EAAInF,IAEhBqF,IAAS,EACTznC,EAAOmyB,GAET,IAAImL,EAAM1hC,EAAEoiC,KAAK2J,GAEjBN,EAAI,GAEJ,IAAK,IAAIvvC,EAAIsqC,EAAGpiC,EAAKlI,EAAGyvC,GAAIzvC,GAAK2vC,EAAM,CACrC,IAAIvxC,EACJ,GAAI0wC,EAEQ,QADV1wC,EAAI4Z,OAAO83B,aAAa9vC,MAEtB5B,EAAI,SAGN,GADAA,EAAI4Z,OAAOhY,GACPwlC,EAAK,CACP,IAAIuK,EAAOL,EAAQtxC,EAAEgC,OACrB,GAAI2vC,EAAO,EAAG,CACZ,IAAIC,EAAI,IAAI97B,MAAM67B,EAAO,GAAGxwC,KAAK,KAE/BnB,EADE4B,EAAI,EACF,IAAMgwC,EAAI5xC,EAAEoF,MAAM,GAElBwsC,EAAI5xC,GAIhBmxC,EAAE5sC,KAAKvE,SAGTmxC,EAAIhB,EAAUzqC,GAAAA,SAAYmsC,GAAM,OAAOryC,EAAOqyC,GAAI,MAGpD,IAAK,IAAIC,EAAI,EAAGA,EAAIX,EAAEnvC,OAAQ8vC,IAC5B,IAAK,IAAIrxC,EAAI,EAAGA,EAAIowC,EAAK7uC,OAAQvB,IAAK,CACpC,IAAIsxC,EAAYxB,EAAMY,EAAEW,GAAKjB,EAAKpwC,KAC7B4vC,GAASM,GAAcoB,IAC1BzB,EAAW/rC,KAAKwtC,GAItB,OAAOzB,EAnGT,CAlFA,SAAsBrE,GACpB,OAAOA,EAAIpsC,MAAM,QAAQsB,KAAK6wC,GACnBnyC,MAAM,OAAOsB,KAAK8wC,GAClBpyC,MAAM,OAAOsB,KAAK2vC,GAClBjxC,MAAM,OAAOsB,KAAK+wC,GAClBryC,MAAM,OAAOsB,KAAKgxC,GAL/B,CA6D6BlG,IAAM,GAAMtpC,IAAIyvC,IAZlC,IA7DX,IAAIJ,EAAW,UAAUvnC,KAAK0S,SAAS,KACnC80B,EAAU,SAASxnC,KAAK0S,SAAS,KACjC2zB,EAAW,UAAUrmC,KAAK0S,SAAS,KACnC+0B,EAAW,UAAUznC,KAAK0S,SAAS,KACnCg1B,EAAY,WAAW1nC,KAAK0S,SAAS,KAEzC,SAASi0B,EAAQnF,GACf,OAAOp5B,SAASo5B,EAAK,KAAOA,EACxBp5B,SAASo5B,EAAK,IACdA,EAAI7U,WAAW,GAWrB,SAASgb,EAAenG,GACtB,OAAOA,EAAIpsC,MAAMmyC,GAAU7wC,KAAK,MACrBtB,MAAMoyC,GAAS9wC,KAAK,KACpBtB,MAAMixC,GAAU3vC,KAAK,KACrBtB,MAAMqyC,GAAU/wC,KAAK,KACrBtB,MAAMsyC,GAAWhxC,KAAK,KAuDnC,SAAS+vC,EAAQjF,GACf,MAAO,IAAMA,EAAM,IAErB,SAASwF,EAASI,GAChB,MAAO,SAAS/nC,KAAK+nC,GAGvB,SAASvV,EAAI16B,EAAGyvC,GACd,OAAOzvC,GAAKyvC,EAEd,SAASpV,EAAIr6B,EAAGyvC,GACd,OAAOzvC,GAAKyvC,uBChGdzyC,EAAOC,QAAU,SAASD,GAoBzB,OAnBKA,EAAOyzC,kBACXzzC,EAAO0tC,UAAY,aACnB1tC,EAAOmL,MAAQ,GAEVnL,EAAO0zC,WAAU1zC,EAAO0zC,SAAW,IACxChyC,OAAOmb,eAAe7c,EAAQ,SAAU,CACvC4N,YAAY,EACZ2V,IAAK,WACJ,OAAOvjB,EAAOsE,KAGhB5C,OAAOmb,eAAe7c,EAAQ,KAAM,CACnC4N,YAAY,EACZ2V,IAAK,WACJ,OAAOvjB,EAAOgD,KAGhBhD,EAAOyzC,gBAAkB,GAEnBzzC,uBCpBRA,EAAOC,QAAU,SAAU0zC,EAAI9e,GAE3B,IADA,IAAItrB,EAAM,GACDvG,EAAI,EAAGA,EAAI2wC,EAAGvwC,OAAQJ,IAAK,CAChC,IAAIsqC,EAAIzY,EAAG8e,EAAG3wC,GAAIA,GACd8c,EAAQwtB,GAAI/jC,EAAI5D,KAAKiQ,MAAMrM,EAAK+jC,GAC/B/jC,EAAI5D,KAAK2nC,GAElB,OAAO/jC,GAGX,IAAIuW,EAAU5I,MAAM4I,SAAW,SAAU6zB,GACrC,MAA8C,mBAAvCjyC,OAAO6B,UAAU8X,SAASrF,KAAK29B,uCCT1C,SAASnC,EAASjwC,EAAGC,EAAG6rC,GAClB9rC,aAAa6E,SAAQ7E,EAAIqyC,EAAWryC,EAAG8rC,IACvC7rC,aAAa4E,SAAQ5E,EAAIoyC,EAAWpyC,EAAG6rC,IAE3C,IAAIwG,EAAIlT,EAAMp/B,EAAGC,EAAG6rC,GAEpB,OAAOwG,GAAK,CACVhuC,MAAOguC,EAAE,GACTlqC,IAAKkqC,EAAE,GACPlC,IAAKtE,EAAI7mC,MAAM,EAAGqtC,EAAE,IACpBhC,KAAMxE,EAAI7mC,MAAMqtC,EAAE,GAAKtyC,EAAE6B,OAAQywC,EAAE,IACnC5B,KAAM5E,EAAI7mC,MAAMqtC,EAAE,GAAKryC,EAAE4B,SAI7B,SAASwwC,EAAWE,EAAKzG,GACvB,IAAI/pC,EAAI+pC,EAAIhrC,MAAMyxC,GAClB,OAAOxwC,EAAIA,EAAE,GAAK,KAIpB,SAASq9B,EAAMp/B,EAAGC,EAAG6rC,GACnB,IAAI0G,EAAMC,EAAKC,EAAMC,EAAOlqC,EACxBmqC,EAAK9G,EAAIlpC,QAAQ5C,GACjB6yC,EAAK/G,EAAIlpC,QAAQ3C,EAAG2yC,EAAK,GACzBnxC,EAAImxC,EAER,GAAIA,GAAM,GAAKC,EAAK,EAAG,CAIrB,IAHAL,EAAO,GACPE,EAAO5G,EAAIjqC,OAEJJ,GAAK,IAAMgH,GACZhH,GAAKmxC,GACPJ,EAAKpuC,KAAK3C,GACVmxC,EAAK9G,EAAIlpC,QAAQ5C,EAAGyB,EAAI,IACA,GAAf+wC,EAAK3wC,OACd4G,EAAS,CAAE+pC,EAAK/tC,MAAOouC,KAEvBJ,EAAMD,EAAK/tC,OACDiuC,IACRA,EAAOD,EACPE,EAAQE,GAGVA,EAAK/G,EAAIlpC,QAAQ3C,EAAGwB,EAAI,IAG1BA,EAAImxC,EAAKC,GAAMD,GAAM,EAAIA,EAAKC,EAG5BL,EAAK3wC,SACP4G,EAAS,CAAEiqC,EAAMC,IAIrB,OAAOlqC,EAxDThK,EAAOC,QAAUuxC,EAqBjBA,EAAS7Q,MAAQA,wBCtBjB,IAAA,GAKA,SAAU0T,EAAQC,EAAUC,EAAY/7B,GACtC,aAEF,IA+FIylB,EA/FAuW,EAAkB,CAAC,GAAI,SAAU,MAAO,KAAM,KAAM,KACpDC,EAAeH,EAASI,cAAc,OAItCrT,EAAQx1B,KAAKw1B,MACbuR,EAAM/mC,KAAK+mC,IACX11B,EAAMnC,KAAKmC,IASf,SAASy3B,EAAkB9f,EAAI+f,EAASh6B,GACpC,OAAOwC,WAAWy3B,EAAOhgB,EAAIja,GAAUg6B,GAY3C,SAASE,EAAe50C,EAAK20B,EAAIja,GAC7B,QAAI1D,MAAM4I,QAAQ5f,KACdurC,EAAKvrC,EAAK0a,EAAQia,GAAKja,IAChB,GAWf,SAAS6wB,EAAK0C,EAAKzxB,EAAU9B,GACzB,IAAI5X,EAEJ,GAAKmrC,EAIL,GAAIA,EAAIvsC,QACJusC,EAAIvsC,QAAQ8a,EAAU9B,QACnB,QAvDX,IAuDeuzB,EAAI/qC,OAEX,IADAJ,EAAI,EACGA,EAAImrC,EAAI/qC,QACXsZ,EAAS1G,KAAK4E,EAASuzB,EAAInrC,GAAIA,EAAGmrC,GAClCnrC,SAGJ,IAAKA,KAAKmrC,EACNA,EAAI7yB,eAAetY,IAAM0Z,EAAS1G,KAAK4E,EAASuzB,EAAInrC,GAAIA,EAAGmrC,GAYvE,SAAST,EAAUrN,EAAQtzB,EAAMyc,GAC7B,IAAIurB,EAAqB,sBAAwBhoC,EAAO,KAAOyc,EAAU,SACzE,OAAO,WACH,IAAIzU,EAAI,IAAIhM,MAAM,mBACd+a,EAAQ/O,GAAKA,EAAE+O,MAAQ/O,EAAE+O,MAAMrd,QAAQ,kBAAmB,IACzDA,QAAQ,cAAe,IACvBA,QAAQ,6BAA8B,kBAAoB,sBAE3D2qC,EAAMiD,EAAOzwC,UAAYywC,EAAOzwC,QAAQoxC,MAAQX,EAAOzwC,QAAQwtC,KAInE,OAHIA,GACAA,EAAIp7B,KAAKq+B,EAAOzwC,QAASmxC,EAAoBjxB,GAE1Cuc,EAAOzqB,MAAMtT,KAAMsI,YAa9BqzB,EADyB,mBAAlBv8B,OAAOu8B,OACL,SAAgBkI,GACrB,GAAIA,MAAAA,EACA,MAAM,IAAIlkC,UAAU,8CAIxB,IADA,IAAI0tC,EAASjuC,OAAOykC,GACX7vB,EAAQ,EAAGA,EAAQ1L,UAAUxH,OAAQkT,IAAS,CACnD,IAAIpG,EAAStF,UAAU0L,GACvB,GAAIpG,MAAAA,EACA,IAAK,IAAI+kC,KAAW/kC,EACZA,EAAOoL,eAAe25B,KACtBtF,EAAOsF,GAAW/kC,EAAO+kC,IAKzC,OAAOtF,GAGFjuC,OAAOu8B,OAWpB,IAAIyH,EAASgI,GAAAA,SAA0BwH,EAAMC,EAAKrW,GAG9C,IAFA,IAAIn9B,EAAOD,OAAOC,KAAKwzC,GACnBnyC,EAAI,EACDA,EAAIrB,EAAKyB,UACP07B,GAAUA,QAtIvB,IAsIgCoW,EAAKvzC,EAAKqB,OAC9BkyC,EAAKvzC,EAAKqB,IAAMmyC,EAAIxzC,EAAKqB,KAE7BA,IAEJ,OAAOkyC,IACR,SAAU,iBASTpW,EAAQ4O,GAAAA,SAAyBwH,EAAMC,GACvC,OAAOzP,EAAOwP,EAAMC,GAAK,KAC1B,QAAS,iBAQZ,SAASC,EAAQC,EAAOzoC,EAAMm1B,GAC1B,IACIuT,EADAC,EAAQ3oC,EAAKrJ,WAGjB+xC,EAASD,EAAM9xC,UAAY7B,OAAO4L,OAAOioC,IAClC7nC,YAAc2nC,EACrBC,EAAOE,OAASD,EAEZxT,GACA9D,EAAOqX,EAAQvT,GAUvB,SAAS8S,EAAOhgB,EAAIja,GAChB,OAAO,WACH,OAAOia,EAAGjf,MAAMgF,EAAShQ,YAWjC,SAAS6qC,EAASlG,EAAKx5B,GACnB,MA1LgB,mBA0LLw5B,EACAA,EAAI35B,MAAMG,GAAOA,EAAK,SAjMrC,EAiMkEA,GAEvDw5B,EASX,SAASmG,EAAYC,EAAMC,GACvB,YA7MJ,IA6MYD,EAAsBC,EAAOD,EASzC,SAASE,EAAkB1P,EAAQtxB,EAAOihC,GACtCrK,EAAKsK,EAASlhC,IAAAA,SAAiBjP,GAC3BugC,EAAO6P,iBAAiBpwC,EAAMkwC,GAAS,MAU/C,SAASG,EAAqB9P,EAAQtxB,EAAOihC,GACzCrK,EAAKsK,EAASlhC,IAAAA,SAAiBjP,GAC3BugC,EAAO+P,oBAAoBtwC,EAAMkwC,GAAS,MAWlD,SAASK,EAAUC,EAAMztB,GACrB,KAAOytB,GAAM,CACT,GAAIA,GAAQztB,EACR,OAAO,EAEXytB,EAAOA,EAAKC,WAEhB,OAAO,EASX,SAASC,EAAMjJ,EAAK5S,GAChB,OAAO4S,EAAIlpC,QAAQs2B,IAAS,EAQhC,SAASsb,EAAS1I,GACd,OAAOA,EAAIjrC,OAAOnB,MAAM,QAU5B,SAASs1C,EAAQpB,EAAK1a,EAAM+b,GACxB,GAAIrB,EAAIhxC,UAAYqyC,EAChB,OAAOrB,EAAIhxC,QAAQs2B,GAGnB,IADA,IAAIz3B,EAAI,EACDA,EAAImyC,EAAI/xC,QAAQ,CACnB,GAAKozC,GAAarB,EAAInyC,GAAGwzC,IAAc/b,IAAW+b,GAAarB,EAAInyC,KAAOy3B,EACtE,OAAOz3B,EAEXA,IAEJ,OAAQ,EAShB,SAAS26B,EAAQwQ,GACb,OAAOj3B,MAAM3T,UAAUiD,MAAMwP,KAAKm4B,EAAK,GAU3C,SAASsI,EAAYtB,EAAKp9B,EAAK6U,GAK3B,IAJA,IAAI8pB,EAAU,GACVt/B,EAAS,GACTpU,EAAI,EAEDA,EAAImyC,EAAI/xC,QAAQ,CACnB,IAAImsC,EAAMx3B,EAAMo9B,EAAInyC,GAAG+U,GAAOo9B,EAAInyC,GAC9BuzC,EAAQn/B,EAAQm4B,GAAO,GACvBmH,EAAQ/wC,KAAKwvC,EAAInyC,IAErBoU,EAAOpU,GAAKusC,EACZvsC,IAaJ,OAVI4pB,IAII8pB,EAHC3+B,EAGS2+B,EAAQ9pB,MAAAA,SAA8BrrB,EAAGC,GAC/C,OAAOD,EAAEwW,GAAOvW,EAAEuW,MAHZ2+B,EAAQ9pB,QAQnB8pB,EASX,SAASC,EAASxI,EAAKjjB,GAKnB,IAJA,IAAIsgB,EAAQtM,EACR0X,EAAY1rB,EAAS,GAAG6U,cAAgB7U,EAAS1kB,MAAM,GAEvDxD,EAAI,EACDA,EAAIwxC,EAAgBpxC,QAAQ,CAI/B,IAFA87B,GADAsM,EAASgJ,EAAgBxxC,IACPwoC,EAASoL,EAAY1rB,KAE3BijB,EACR,OAAOjP,EAEXl8B,KASR,IAAI6zC,EAAY,EAUhB,SAASC,EAAoBC,GACzB,IAAIC,EAAMD,EAAQE,eAAiBF,EACnC,OAAQC,EAAIE,aAAeF,EAAIG,cAAgB9C,EAGnD,IAEI+C,EAAiB,iBAAkB/C,EACnCgD,OA1XJ,IA0X6BV,EAAStC,EAAQ,gBAC1CiD,EAAqBF,GAJN,wCAIoClsC,KAAKqsC,UAAUC,WAwBlEC,EAAW,CAAC,IAAK,KACjBC,EAAkB,CAAC,UAAW,WASlC,SAASC,EAAMC,EAAS/kB,GACpB,IAAIvtB,EAAOhD,KACXA,KAAKs1C,QAAUA,EACft1C,KAAKuwB,SAAWA,EAChBvwB,KAAKy0C,QAAUa,EAAQb,QACvBz0C,KAAK6jC,OAASyR,EAAQ51C,QAAQ61C,YAI9Bv1C,KAAKw1C,WAAa,SAASC,GACnBtC,EAASmC,EAAQ51C,QAAQg2C,OAAQ,CAACJ,KAClCtyC,EAAKwwC,QAAQiC,IAIrBz1C,KAAK21C,OA4DT,SAASC,EAAaN,EAASO,EAAWj0B,GACtC,IAAIk0B,EAAcl0B,EAAMm0B,SAASj1C,OAC7Bk1C,EAAqBp0B,EAAMq0B,gBAAgBn1C,OAC3Co1C,EAvGU,EAuGCL,GAA4BC,EAAcE,GAAuB,EAC5EG,EAAuB,GAAZN,GAA2CC,EAAcE,GAAuB,EAE/Fp0B,EAAMs0B,UAAYA,EAClBt0B,EAAMu0B,UAAYA,EAEdD,IACAZ,EAAQc,QAAU,IAKtBx0B,EAAMi0B,UAAYA,EAiBtB,SAA0BP,EAAS1zB,GAC/B,IAAIw0B,EAAUd,EAAQc,QAClBL,EAAWn0B,EAAMm0B,SACjBM,EAAiBN,EAASj1C,OAGzBs1C,EAAQE,aACTF,EAAQE,WAAaC,EAAqB30B,IAI1Cy0B,EAAiB,IAAMD,EAAQI,cAC/BJ,EAAQI,cAAgBD,EAAqB30B,GACnB,IAAnBy0B,IACPD,EAAQI,eAAgB,GAG5B,IAAIF,EAAaF,EAAQE,WACrBE,EAAgBJ,EAAQI,cACxBC,EAAeD,EAAgBA,EAAcE,OAASJ,EAAWI,OAEjEA,EAAS90B,EAAM80B,OAASC,EAAUZ,GACtCn0B,EAAMg1B,UAAYh8B,IAClBgH,EAAMi1B,UAAYj1B,EAAMg1B,UAAYN,EAAWM,UAE/Ch1B,EAAMk1B,MAAQC,EAASN,EAAcC,GACrC90B,EAAMo1B,SAAWC,EAAYR,EAAcC,GA0B/C,SAAwBN,EAASx0B,GAC7B,IAAI80B,EAAS90B,EAAM80B,OACf3hC,EAASqhC,EAAQc,aAAe,GAChCC,EAAYf,EAAQe,WAAa,GACjCC,EAAYhB,EAAQgB,WAAa,GA5LvB,IA8LVx1B,EAAMi0B,WA5LE,IA4L2BuB,EAAUvB,YAC7CsB,EAAYf,EAAQe,UAAY,CAC5BnM,EAAGoM,EAAUC,QAAU,EACvBlH,EAAGiH,EAAUE,QAAU,GAG3BviC,EAASqhC,EAAQc,YAAc,CAC3BlM,EAAG0L,EAAO1L,EACVmF,EAAGuG,EAAOvG,IAIlBvuB,EAAMy1B,OAASF,EAAUnM,GAAK0L,EAAO1L,EAAIj2B,EAAOi2B,GAChDppB,EAAM01B,OAASH,EAAUhH,GAAKuG,EAAOvG,EAAIp7B,EAAOo7B,GAnBpD,CAxBmBiG,EAASx0B,GACxBA,EAAM21B,gBAAkBC,EAAa51B,EAAMy1B,OAAQz1B,EAAM01B,QAEzD,IAuNc/zC,EAAO8D,EAvNjBowC,EAAkBC,EAAY91B,EAAMi1B,UAAWj1B,EAAMy1B,OAAQz1B,EAAM01B,QACvE11B,EAAM+1B,iBAAmBF,EAAgBzM,EACzCppB,EAAMg2B,iBAAmBH,EAAgBtH,EACzCvuB,EAAM61B,gBAAmBnH,EAAImH,EAAgBzM,GAAKsF,EAAImH,EAAgBtH,GAAMsH,EAAgBzM,EAAIyM,EAAgBtH,EAEhHvuB,EAAMi2B,MAAQrB,GAkNAjzC,EAlNyBizC,EAAcT,SAmN9CkB,GADc5vC,EAlN0C0uC,GAmNxC,GAAI1uC,EAAI,GAAI+tC,GAAmB6B,EAAY1zC,EAAM,GAAIA,EAAM,GAAI6xC,IAnNX,EAC3ExzB,EAAMk2B,SAAWtB,EAsMrB,SAAqBjzC,EAAO8D,GACxB,OAAO0vC,EAAS1vC,EAAI,GAAIA,EAAI,GAAI+tC,GAAmB2B,EAASxzC,EAAM,GAAIA,EAAM,GAAI6xC,GADpF,CAtMiDoB,EAAcT,SAAUA,GAAY,EAEjFn0B,EAAMm2B,YAAe3B,EAAQgB,UAAsCx1B,EAAMm0B,SAASj1C,OAC9Es1C,EAAQgB,UAAUW,YAAen2B,EAAMm0B,SAASj1C,OAASs1C,EAAQgB,UAAUW,YADtCn2B,EAAMm0B,SAASj1C,OAwC5D,SAAkCs1C,EAASx0B,GACvC,IAEIo2B,EAAUC,EAAWC,EAAWC,EAFhC7xB,EAAO8vB,EAAQgC,cAAgBx2B,EAC/Bi1B,EAAYj1B,EAAMg1B,UAAYtwB,EAAKswB,UAGvC,GArNe,GAqNXh1B,EAAMi0B,YAA8BgB,EA1NrB,SAlYvB,IA4lB4EvwB,EAAK0xB,UAAyB,CAClG,IAAIX,EAASz1B,EAAMy1B,OAAS/wB,EAAK+wB,OAC7BC,EAAS11B,EAAM01B,OAAShxB,EAAKgxB,OAE7Be,EAAIX,EAAYb,EAAWQ,EAAQC,GACvCW,EAAYI,EAAErN,EACdkN,EAAYG,EAAElI,EACd6H,EAAY1H,EAAI+H,EAAErN,GAAKsF,EAAI+H,EAAElI,GAAMkI,EAAErN,EAAIqN,EAAElI,EAC3CgI,EAAYX,EAAaH,EAAQC,GAEjClB,EAAQgC,aAAex2B,OAGvBo2B,EAAW1xB,EAAK0xB,SAChBC,EAAY3xB,EAAK2xB,UACjBC,EAAY5xB,EAAK4xB,UACjBC,EAAY7xB,EAAK6xB,UAGrBv2B,EAAMo2B,SAAWA,EACjBp2B,EAAMq2B,UAAYA,EAClBr2B,EAAMs2B,UAAYA,EAClBt2B,EAAMu2B,UAAYA,EA3BtB,CArC6B/B,EAASx0B,GAGlC,IAAIiiB,EAASyR,EAAQb,QACjBZ,EAAUjyB,EAAM02B,SAASzU,OAAQA,KACjCA,EAASjiB,EAAM02B,SAASzU,QAE5BjiB,EAAMiiB,OAASA,EAjDnB,CAdqByR,EAAS1zB,GAG1B0zB,EAAQiD,KAAK,eAAgB32B,GAE7B0zB,EAAQkD,UAAU52B,GAClB0zB,EAAQc,QAAQgB,UAAYx1B,EA0HhC,SAAS20B,EAAqB30B,GAK1B,IAFA,IAAIm0B,EAAW,GACXr1C,EAAI,EACDA,EAAIkhB,EAAMm0B,SAASj1C,QACtBi1C,EAASr1C,GAAK,CACV+3C,QAAS1Z,EAAMnd,EAAMm0B,SAASr1C,GAAG+3C,SACjCC,QAAS3Z,EAAMnd,EAAMm0B,SAASr1C,GAAGg4C,UAErCh4C,IAGJ,MAAO,CACHk2C,UAAWh8B,IACXm7B,SAAUA,EACVW,OAAQC,EAAUZ,GAClBsB,OAAQz1B,EAAMy1B,OACdC,OAAQ11B,EAAM01B,QAStB,SAASX,EAAUZ,GACf,IAAIM,EAAiBN,EAASj1C,OAG9B,GAAuB,IAAnBu1C,EACA,MAAO,CACHrL,EAAGjM,EAAMgX,EAAS,GAAG0C,SACrBtI,EAAGpR,EAAMgX,EAAS,GAAG2C,UAK7B,IADA,IAAI1N,EAAI,EAAGmF,EAAI,EAAGzvC,EAAI,EACfA,EAAI21C,GACPrL,GAAK+K,EAASr1C,GAAG+3C,QACjBtI,GAAK4F,EAASr1C,GAAGg4C,QACjBh4C,IAGJ,MAAO,CACHsqC,EAAGjM,EAAMiM,EAAIqL,GACblG,EAAGpR,EAAMoR,EAAIkG,IAWrB,SAASqB,EAAYb,EAAW7L,EAAGmF,GAC/B,MAAO,CACHnF,EAAGA,EAAI6L,GAAa,EACpB1G,EAAGA,EAAI0G,GAAa,GAU5B,SAASW,EAAaxM,EAAGmF,GACrB,OAAInF,IAAMmF,EAzTO,EA6TbG,EAAItF,IAAMsF,EAAIH,GACPnF,EAAI,EA7TE,EACC,EA8TXmF,EAAI,EA7TI,EACE,GAsUrB,SAAS8G,EAAY0B,EAAIC,EAAIhiC,GACpBA,IACDA,EAAQu+B,GAEZ,IAAInK,EAAI4N,EAAGhiC,EAAM,IAAM+hC,EAAG/hC,EAAM,IAC5Bu5B,EAAIyI,EAAGhiC,EAAM,IAAM+hC,EAAG/hC,EAAM,IAEhC,OAAOrN,KAAKsvC,KAAM7N,EAAIA,EAAMmF,EAAIA,GAUpC,SAAS4G,EAAS4B,EAAIC,EAAIhiC,GAMtB,OALKA,IACDA,EAAQu+B,GAIc,IAAnB5rC,KAAKuvC,MADJF,EAAGhiC,EAAM,IAAM+hC,EAAG/hC,EAAM,IADxBgiC,EAAGhiC,EAAM,IAAM+hC,EAAG/hC,EAAM,KAEArN,KAAKwvC,GA1TzC1D,EAAMp0C,UAAY,CAKduyC,QAAS,aAKTmC,KAAM,WACF31C,KAAKg5C,MAAQzF,EAAkBvzC,KAAKy0C,QAASz0C,KAAKg5C,KAAMh5C,KAAKw1C,YAC7Dx1C,KAAKi5C,UAAY1F,EAAkBvzC,KAAK6jC,OAAQ7jC,KAAKi5C,SAAUj5C,KAAKw1C,YACpEx1C,KAAKk5C,OAAS3F,EAAkBiB,EAAoBx0C,KAAKy0C,SAAUz0C,KAAKk5C,MAAOl5C,KAAKw1C,aAMxF2D,QAAS,WACLn5C,KAAKg5C,MAAQrF,EAAqB3zC,KAAKy0C,QAASz0C,KAAKg5C,KAAMh5C,KAAKw1C,YAChEx1C,KAAKi5C,UAAYtF,EAAqB3zC,KAAK6jC,OAAQ7jC,KAAKi5C,SAAUj5C,KAAKw1C,YACvEx1C,KAAKk5C,OAASvF,EAAqBa,EAAoBx0C,KAAKy0C,SAAUz0C,KAAKk5C,MAAOl5C,KAAKw1C,cA4T/F,IAAI4D,EAAkB,CAClBC,UA/Xc,EAgYdC,UA/Xa,EAgYbC,QA/XY,GA0YhB,SAASC,IACLx5C,KAAKg5C,KATkB,YAUvBh5C,KAAKk5C,MATiB,oBAWtBl5C,KAAKy5C,SAAU,EAEfpE,EAAM/hC,MAAMtT,KAAMsI,WAGtBwqC,EAAQ0G,EAAYnE,EAAO,CAKvB7B,QAAS,SAAmBiC,GACxB,IAAII,EAAYuD,EAAgB3D,EAAGnyC,MA3ZzB,EA8ZNuyC,GAAyC,IAAdJ,EAAGiE,SAC9B15C,KAAKy5C,SAAU,GA9ZV,EAiaL5D,GAAuC,IAAbJ,EAAGkE,QAC7B9D,EAjaI,GAqaH71C,KAAKy5C,UAraF,EAyaJ5D,IACA71C,KAAKy5C,SAAU,GAGnBz5C,KAAKuwB,SAASvwB,KAAKs1C,QAASO,EAAW,CACnCE,SAAU,CAACN,GACXQ,gBAAiB,CAACR,GAClBmE,YAvbW,QAwbXtB,SAAU7C,QAKtB,IAAIoE,EAAoB,CACpBC,YAzbc,EA0bdC,YAzba,EA0bbC,UAzbY,EA0bZC,cAzbe,EA0bfC,WA1be,GA8bfC,EAAyB,CACzBC,EAzcmB,QA0cnBC,EAzciB,MA0cjBC,EAzcmB,QA0cnBC,EAzcoB,UA4cpBC,EAAyB,cACzBC,EAAwB,sCAa5B,SAASC,KACL16C,KAAKg5C,KAAOwB,EACZx6C,KAAKk5C,MAAQuB,EAEbpF,EAAM/hC,MAAMtT,KAAMsI,WAElBtI,KAAK26C,MAAS36C,KAAKs1C,QAAQc,QAAQwE,cAAgB,GAhBnD7I,EAAO8I,iBAAmB9I,EAAO+I,eACjCN,EAAyB,gBACzBC,EAAwB,6CAiB5B3H,EAAQ4H,GAAmBrF,EAAO,CAK9B7B,QAAS,SAAmBiC,GACxB,IAAIkF,EAAQ36C,KAAK26C,MACbI,GAAgB,EAEhBC,EAAsBvF,EAAGnyC,KAAKkD,cAAcrC,QAAQ,KAAM,IAC1D0xC,EAAYgE,EAAkBmB,GAC9BpB,EAAcO,EAAuB1E,EAAGmE,cAAgBnE,EAAGmE,YAE3DqB,EAnfW,SAmfArB,EAGXsB,EAAajH,EAAQ0G,EAAOlF,EAAG0F,UAAW,aA/epC,EAkfNtF,IAA0C,IAAdJ,EAAGiE,QAAgBuB,GAC3CC,EAAa,IACbP,EAAMt3C,KAAKoyC,GACXyF,EAAaP,EAAM75C,OAAS,GAEb,GAAZ+0C,IACPkF,GAAgB,GAIhBG,EAAa,IAKjBP,EAAMO,GAAczF,EAEpBz1C,KAAKuwB,SAASvwB,KAAKs1C,QAASO,EAAW,CACnCE,SAAU4E,EACV1E,gBAAiB,CAACR,GAClBmE,YAAaA,EACbtB,SAAU7C,IAGVsF,GAEAJ,EAAM3gC,OAAOkhC,EAAY,OAKrC,IAAIE,GAAyB,CACzBC,WAlhBc,EAmhBdC,UAlhBa,EAmhBbC,SAlhBY,EAmhBZC,YAlhBe,GA6hBnB,SAASC,KACLz7C,KAAKi5C,SATwB,aAU7Bj5C,KAAKk5C,MATwB,4CAU7Bl5C,KAAK07C,SAAU,EAEfrG,EAAM/hC,MAAMtT,KAAMsI,WAsCtB,SAASqzC,GAAuBlG,EAAInyC,GAChC,IAAIs4C,EAAMvgB,EAAQoa,EAAGoG,SACjBC,EAAUzgB,EAAQoa,EAAGsG,gBAMzB,OAJW,GAAPz4C,IACAs4C,EAAMzH,EAAYyH,EAAIjyC,OAAOmyC,GAAU,cAAc,IAGlD,CAACF,EAAKE,GA3CjBhJ,EAAQ2I,GAAkBpG,EAAO,CAC7B7B,QAAS,SAAmBiC,GACxB,IAAInyC,EAAO83C,GAAuB3F,EAAGnyC,MAOrC,GAjjBU,IA6iBNA,IACAtD,KAAK07C,SAAU,GAGd17C,KAAK07C,QAAV,CAIA,IAAIG,EAAUF,GAAuBjoC,KAAK1T,KAAMy1C,EAAInyC,GAGzC,GAAPA,GAAqCu4C,EAAQ,GAAG/6C,OAAS+6C,EAAQ,GAAG/6C,QAAW,IAC/Ed,KAAK07C,SAAU,GAGnB17C,KAAKuwB,SAASvwB,KAAKs1C,QAAShyC,EAAM,CAC9ByyC,SAAU8F,EAAQ,GAClB5F,gBAAiB4F,EAAQ,GACzBjC,YAtkBW,QAukBXtB,SAAU7C,QAsBtB,IAAIuG,GAAkB,CAClBX,WAvlBc,EAwlBdC,UAvlBa,EAwlBbC,SAvlBY,EAwlBZC,YAvlBe,GAimBnB,SAASS,KACLj8C,KAAKi5C,SARiB,4CAStBj5C,KAAKk8C,UAAY,GAEjB7G,EAAM/hC,MAAMtT,KAAMsI,WA0BtB,SAAS6zC,GAAW1G,EAAInyC,GACpB,IAAI84C,EAAa/gB,EAAQoa,EAAGoG,SACxBK,EAAYl8C,KAAKk8C,UAGrB,GAAW,EAAP54C,GAA2D,IAAtB84C,EAAWt7C,OAEhD,OADAo7C,EAAUE,EAAW,GAAGC,aAAc,EAC/B,CAACD,EAAYA,GAGxB,IAAI17C,EACA47C,EACAP,EAAiB1gB,EAAQoa,EAAGsG,gBAC5BQ,EAAuB,GACvB1Y,EAAS7jC,KAAK6jC,OAQlB,GALAyY,EAAgBF,EAAW37C,QAAAA,SAAgB+7C,GACvC,OAAO3I,EAAU2I,EAAM3Y,OAAQA,MAppBrB,IAwpBVvgC,EAEA,IADA5C,EAAI,EACGA,EAAI47C,EAAcx7C,QACrBo7C,EAAUI,EAAc57C,GAAG27C,aAAc,EACzC37C,IAMR,IADAA,EAAI,EACGA,EAAIq7C,EAAej7C,QAClBo7C,EAAUH,EAAer7C,GAAG27C,aAC5BE,EAAqBl5C,KAAK04C,EAAer7C,IAIlC,GAAP4C,UACO44C,EAAUH,EAAer7C,GAAG27C,YAEvC37C,IAGJ,OAAK67C,EAAqBz7C,OAInB,CAEHqzC,EAAYmI,EAAc3yC,OAAO4yC,GAAuB,cAAc,GACtEA,QAPJ,EAwBJ,SAASE,KACLpH,EAAM/hC,MAAMtT,KAAMsI,WAElB,IAAIkrC,EAAUjB,EAAOvyC,KAAKwzC,QAASxzC,MACnCA,KAAKw8C,MAAQ,IAAIP,GAAWj8C,KAAKs1C,QAAS9B,GAC1CxzC,KAAK08C,MAAQ,IAAIlD,EAAWx5C,KAAKs1C,QAAS9B,GAE1CxzC,KAAK28C,aAAe,KACpB38C,KAAK48C,YAAc,GAqCvB,SAASC,GAAchH,EAAWiH,GAnvBhB,EAovBVjH,GACA71C,KAAK28C,aAAeG,EAAU7G,gBAAgB,GAAGoG,WACjDU,GAAarpC,KAAK1T,KAAM88C,IACL,GAAZjH,GACPkH,GAAarpC,KAAK1T,KAAM88C,GAIhC,SAASC,GAAaD,GAClB,IAAIN,EAAQM,EAAU7G,gBAAgB,GAEtC,GAAIuG,EAAMH,aAAer8C,KAAK28C,aAAc,CACxC,IAAIK,EAAY,CAAChS,EAAGwR,EAAM/D,QAAStI,EAAGqM,EAAM9D,SAC5C14C,KAAK48C,YAAYv5C,KAAK25C,GACtB,IAAIC,EAAMj9C,KAAK48C,YAOf9hC,YAAAA,WALI,IAAIpa,EAAIu8C,EAAIp7C,QAAQm7C,GAChBt8C,GAAK,GACLu8C,EAAIjjC,OAAOtZ,EAAG,KAnEV,OA0EpB,SAASw8C,GAAiBJ,GAEtB,IADA,IAAI9R,EAAI8R,EAAUxE,SAASG,QAAStI,EAAI2M,EAAUxE,SAASI,QAClDh4C,EAAI,EAAGA,EAAIV,KAAK48C,YAAY97C,OAAQJ,IAAK,CAC9C,IAAIvB,EAAIa,KAAK48C,YAAYl8C,GACrBy8C,EAAK5zC,KAAK+mC,IAAItF,EAAI7rC,EAAE6rC,GAAIoS,EAAK7zC,KAAK+mC,IAAIH,EAAIhxC,EAAEgxC,GAChD,GAAIgN,GA9ES,IA8EeC,GA9Ef,GA+ET,OAAO,EAGf,OAAO,EA3KXtK,EAAQmJ,GAAY5G,EAAO,CACvB7B,QAAS,SAAoBiC,GACzB,IAAInyC,EAAO04C,GAAgBvG,EAAGnyC,MAC1Bu4C,EAAUM,GAAWzoC,KAAK1T,KAAMy1C,EAAInyC,GACnCu4C,GAIL77C,KAAKuwB,SAASvwB,KAAKs1C,QAAShyC,EAAM,CAC9ByyC,SAAU8F,EAAQ,GAClB5F,gBAAiB4F,EAAQ,GACzBjC,YA7nBW,QA8nBXtB,SAAU7C,OA0FtB3C,EAAQ2J,GAAiBpH,EAAO,CAO5B7B,QAAS,SAAoB8B,EAAS+H,EAAYC,GAC9C,IACIC,EA/tBW,SA+tBAD,EAAU1D,YAEzB,KAAI2D,GAAWD,EAAUE,oBAAsBF,EAAUE,mBAAmBC,kBAA5E,CAKA,GAxuBe,SAguBAH,EAAU1D,YASrBiD,GAAcnpC,KAAK1T,KAAMq9C,EAAYC,QAClC,GAAIC,GAAWL,GAAiBxpC,KAAK1T,KAAMs9C,GAC9C,OAGJt9C,KAAKuwB,SAAS+kB,EAAS+H,EAAYC,KAMvCnE,QAAS,WACLn5C,KAAKw8C,MAAMrD,UACXn5C,KAAK08C,MAAMvD,aA0CnB,IAAIuE,GAAwBrJ,EAASlC,EAAa1F,MAAO,eACrDkR,QA9pCJ,IA8pC0BD,GAStBE,GA4IJ,WACI,IAAKD,GACD,OAAO,EAEX,IAAIE,EAAW,GACXC,EAAc/L,EAAOgM,KAAOhM,EAAOgM,IAAIC,SAO3C,MANA,CAAC,OAAQ,eAAgB,QAAS,QAAS,cAAe,QAAQ1+C,SAAAA,SAAiB2tC,GAI/E4Q,EAAS5Q,IAAO6Q,GAAc/L,EAAOgM,IAAIC,SAAS,eAAgB/Q,MAE/D4Q,EAZX,GAnIA,SAASI,GAAY3I,EAASjqC,GAC1BrL,KAAKs1C,QAAUA,EACft1C,KAAKnB,IAAIwM,GAyLb,SAAS6yC,GAAWx+C,GAChBM,KAAKN,QAAUi8B,EAAO,GAAI37B,KAAKY,SAAUlB,GAAW,IAEpDM,KAAKsuB,GApgCEimB,IAsgCPv0C,KAAKs1C,QAAU,KAGft1C,KAAKN,QAAQg2C,OAAStC,EAAYpzC,KAAKN,QAAQg2C,QAAQ,GAEvD11C,KAAKm+C,MAxBY,EA0BjBn+C,KAAKo+C,aAAe,GACpBp+C,KAAKq+C,YAAc,GAqOvB,SAASC,GAASH,GACd,OA5PkB,GA4PdA,EACO,SA/PG,EAgQHA,EACA,MAlQK,EAmQLA,EACA,OArQG,EAsQHA,EACA,QAEJ,GAQX,SAASI,GAAapG,GAClB,OAnuCiB,IAmuCbA,EACO,OAruCI,GAsuCJA,EACA,KAzuCM,GA0uCNA,EACA,OA1uCO,GA2uCPA,EACA,QAEJ,GASX,SAASqG,GAA6BC,EAAiBC,GACnD,IAAIpJ,EAAUoJ,EAAWpJ,QACzB,OAAIA,EACOA,EAAQr0B,IAAIw9B,GAEhBA,EAQX,SAASE,KACLT,GAAW5qC,MAAMtT,KAAMsI,WA6D3B,SAASs2C,KACLD,GAAerrC,MAAMtT,KAAMsI,WAE3BtI,KAAK6+C,GAAK,KACV7+C,KAAK8+C,GAAK,KA4Ed,SAASC,KACLJ,GAAerrC,MAAMtT,KAAMsI,WAsC/B,SAAS02C,KACLd,GAAW5qC,MAAMtT,KAAMsI,WAEvBtI,KAAKi/C,OAAS,KACdj/C,KAAKk/C,OAAS,KAmElB,SAASC,KACLR,GAAerrC,MAAMtT,KAAMsI,WA8B/B,SAAS82C,KACLT,GAAerrC,MAAMtT,KAAMsI,WA2D/B,SAAS+2C,KACLnB,GAAW5qC,MAAMtT,KAAMsI,WAIvBtI,KAAKs/C,OAAQ,EACbt/C,KAAKu/C,SAAU,EAEfv/C,KAAKi/C,OAAS,KACdj/C,KAAKk/C,OAAS,KACdl/C,KAAK41B,MAAQ,EAqGjB,SAAS4pB,GAAO/K,EAAS/0C,GAGrB,OAFAA,EAAUA,GAAW,IACb+/C,YAAcrM,EAAY1zC,EAAQ+/C,YAAaD,GAAO5+C,SAAS8+C,QAChE,IAAIC,GAAQlL,EAAS/0C,GAiIhC,SAASigD,GAAQlL,EAAS/0C,GAzwD1B,IAA6B41C,EA0wDzBt1C,KAAKN,QAAUi8B,EAAO,GAAI6jB,GAAO5+C,SAAUlB,GAAW,IAEtDM,KAAKN,QAAQ61C,YAAcv1C,KAAKN,QAAQ61C,aAAed,EAEvDz0C,KAAK4/C,SAAW,GAChB5/C,KAAKo2C,QAAU,GACfp2C,KAAKy/C,YAAc,GACnBz/C,KAAK6/C,YAAc,GAEnB7/C,KAAKy0C,QAAUA,EACfz0C,KAAK4hB,MArwDE,KAfkB0zB,EAoxDQt1C,MAlxDRN,QAAQogD,aAItB/K,EACA2F,GACA1F,EACAiH,GACCnH,EAGD2H,GAFAjD,IAIOlE,EAASM,GAswD3B51C,KAAK+/C,YAAc,IAAI9B,GAAYj+C,KAAMA,KAAKN,QAAQqgD,aAEtDC,GAAehgD,MAAM,GAErBmpC,EAAKnpC,KAAKN,QAAQ+/C,aAAAA,SAAsBQ,GACpC,IAAIvB,EAAa1+C,KAAKkf,IAAI,IAAK+gC,EAAK,GAAIA,EAAK,KAC7CA,EAAK,IAAMvB,EAAWwB,cAAcD,EAAK,IACzCA,EAAK,IAAMvB,EAAWyB,eAAeF,EAAK,MAC3CjgD,MA4PP,SAASggD,GAAe1K,EAASp2B,GAC7B,IAII0d,EAJA6X,EAAUa,EAAQb,QACjBA,EAAQhI,QAIbtD,EAAKmM,EAAQ51C,QAAQ0gD,UAAAA,SAAmB/0C,EAAOZ,GAC3CmyB,EAAOyX,EAASI,EAAQhI,MAAOhiC,GAC3ByU,GACAo2B,EAAQuK,YAAYjjB,GAAQ6X,EAAQhI,MAAM7P,GAC1C6X,EAAQhI,MAAM7P,GAAQvxB,GAEtBopC,EAAQhI,MAAM7P,GAAQ0Y,EAAQuK,YAAYjjB,IAAS,MAGtD1d,IACDo2B,EAAQuK,YAAc,KAp0C9B5B,GAAYh9C,UAAY,CAKpBpC,IAAK,SAASwM,GAzBS,WA2BfA,IACAA,EAAQrL,KAAKqgD,WAGb1C,IAAuB39C,KAAKs1C,QAAQb,QAAQhI,OAASmR,GAAiBvyC,KACtErL,KAAKs1C,QAAQb,QAAQhI,MAAMiR,IAAyBryC,GAExDrL,KAAK2tB,QAAUtiB,EAAM7E,cAAc1G,QAMvC+iC,OAAQ,WACJ7iC,KAAKnB,IAAImB,KAAKs1C,QAAQ51C,QAAQqgD,cAOlCM,QAAS,WACL,IAAI1yB,EAAU,GAMd,OALAwb,EAAKnpC,KAAKs1C,QAAQmK,aAAAA,SAAsBf,GAChCvL,EAASuL,EAAWh/C,QAAQg2C,OAAQ,CAACgJ,MACrC/wB,EAAUA,EAAQhkB,OAAO+0C,EAAW4B,sBAgEpD,SAA2B3yB,GAEvB,GAAIqmB,EAAMrmB,EAnHU,QAoHhB,MApHgB,OAuHpB,IAAI4yB,EAAUvM,EAAMrmB,EAtHC,SAuHjB6yB,EAAUxM,EAAMrmB,EAtHC,SA4HrB,OAAI4yB,GAAWC,EA9HK,OAmIhBD,GAAWC,EACJD,EAnIU,QACA,QAsIjBvM,EAAMrmB,EAzIkB,gBAAA,eADR,OAmHxB,CA7DiCA,EAAQ1tB,KAAK,OAO1CwgD,gBAAiB,SAAS7+B,GACtB,IAAI02B,EAAW12B,EAAM02B,SACjBH,EAAYv2B,EAAM21B,gBAGtB,GAAIv3C,KAAKs1C,QAAQc,QAAQsK,UACrBpI,EAASqI,qBADb,CAKA,IAAIhzB,EAAU3tB,KAAK2tB,QACfizB,EAAU5M,EAAMrmB,EAtEJ,UAsEoCiwB,GAAkC,KAClF4C,EAAUxM,EAAMrmB,EArEH,WAqEoCiwB,GArEpC,SAsEb2C,EAAUvM,EAAMrmB,EAvEH,WAuEoCiwB,GAvEpC,SAyEjB,GAAIgD,GAG6C,IAA1Bh/B,EAAMm0B,SAASj1C,QACd8gB,EAAMo1B,SAAW,GAChBp1B,EAAMi1B,UAAY,IAGnC,OAIR,IAAI0J,IAAWC,EAKf,OAAII,GACCJ,GAj3BcK,EAi3BH1I,GACXoI,GAj3BYO,GAi3BD3I,EACLn4C,KAAK+gD,WAAWzI,QAH3B,IAWJyI,WAAY,SAASzI,GACjBt4C,KAAKs1C,QAAQc,QAAQsK,WAAY,EACjCpI,EAASqI,mBA+GjBzC,GAAWj9C,UAAY,CAKnBL,SAAU,GAOV/B,IAAK,SAASa,GAKV,OAJAi8B,EAAO37B,KAAKN,QAASA,GAGrBM,KAAKs1C,SAAWt1C,KAAKs1C,QAAQyK,YAAYld,SAClC7iC,MAQXkgD,cAAe,SAASzB,GACpB,GAAIjM,EAAeiM,EAAiB,gBAAiBz+C,MACjD,OAAOA,KAGX,IAAIo+C,EAAep+C,KAAKo+C,aAMxB,OAJKA,GADLK,EAAkBD,GAA6BC,EAAiBz+C,OAC9BsuB,MAC9B8vB,EAAaK,EAAgBnwB,IAAMmwB,EACnCA,EAAgByB,cAAclgD,OAE3BA,MAQXghD,kBAAmB,SAASvC,GACxB,OAAIjM,EAAeiM,EAAiB,oBAAqBz+C,QAIzDy+C,EAAkBD,GAA6BC,EAAiBz+C,aACzDA,KAAKo+C,aAAaK,EAAgBnwB,KAJ9BtuB,MAafmgD,eAAgB,SAAS1B,GACrB,GAAIjM,EAAeiM,EAAiB,iBAAkBz+C,MAClD,OAAOA,KAGX,IAAIq+C,EAAcr+C,KAAKq+C,YAMvB,OAJ+C,IAA3CpK,EAAQoK,EADZI,EAAkBD,GAA6BC,EAAiBz+C,SAE5Dq+C,EAAYh7C,KAAKo7C,GACjBA,EAAgB0B,eAAengD,OAE5BA,MAQXihD,mBAAoB,SAASxC,GACzB,GAAIjM,EAAeiM,EAAiB,qBAAsBz+C,MACtD,OAAOA,KAGXy+C,EAAkBD,GAA6BC,EAAiBz+C,MAChE,IAAIgU,EAAQigC,EAAQj0C,KAAKq+C,YAAaI,GAItC,OAHIzqC,GAAS,GACThU,KAAKq+C,YAAYrkC,OAAOhG,EAAO,GAE5BhU,MAOXkhD,mBAAoB,WAChB,OAAOlhD,KAAKq+C,YAAYv9C,OAAS,GAQrCqgD,iBAAkB,SAAS1C,GACvB,QAASz+C,KAAKo+C,aAAaK,EAAgBnwB,KAQ/CiqB,KAAM,SAAS32B,GACX,IAAI5e,EAAOhD,KACPm+C,EAAQn+C,KAAKm+C,MAEjB,SAAS5F,EAAK6I,GACVp+C,EAAKsyC,QAAQiD,KAAK6I,EAAOx/B,GAIzBu8B,EArJM,GAsJN5F,EAAKv1C,EAAKtD,QAAQ0hD,MAAQ9C,GAASH,IAGvC5F,EAAKv1C,EAAKtD,QAAQ0hD,OAEdx/B,EAAMy/B,iBACN9I,EAAK32B,EAAMy/B,iBAIXlD,GAhKM,GAiKN5F,EAAKv1C,EAAKtD,QAAQ0hD,MAAQ9C,GAASH,KAU3CmD,QAAS,SAAS1/B,GACd,GAAI5hB,KAAKuhD,UACL,OAAOvhD,KAAKu4C,KAAK32B,GAGrB5hB,KAAKm+C,MA7KM,IAoLfoD,QAAS,WAEL,IADA,IAAI7gD,EAAI,EACDA,EAAIV,KAAKq+C,YAAYv9C,QAAQ,CAChC,KAAkC,GAA5Bd,KAAKq+C,YAAY39C,GAAGy9C,OACtB,OAAO,EAEXz9C,IAEJ,OAAO,GAOX83C,UAAW,SAAS8E,GAGhB,IAAIkE,EAAiB7lB,EAAO,GAAI2hB,GAGhC,IAAKnK,EAASnzC,KAAKN,QAAQg2C,OAAQ,CAAC11C,KAAMwhD,IAGtC,OAFAxhD,KAAKyhD,aACLzhD,KAAKm+C,MA3ME,IAgNM,GAAbn+C,KAAKm+C,QACLn+C,KAAKm+C,MAvNI,GA0Nbn+C,KAAKm+C,MAAQn+C,KAAK2G,QAAQ66C,GAIT,GAAbxhD,KAAKm+C,OACLn+C,KAAKshD,QAAQE,IAWrB76C,QAAS,SAAS22C,KAOlBgD,eAAgB,aAOhBmB,MAAO,cA8DX3O,EAAQ6L,GAAgBT,GAAY,CAKhCt9C,SAAU,CAKNm1C,SAAU,GASd2L,SAAU,SAAS9/B,GACf,IAAI+/B,EAAiB3hD,KAAKN,QAAQq2C,SAClC,OAA0B,IAAnB4L,GAAwB//B,EAAMm0B,SAASj1C,SAAW6gD,GAS7Dh7C,QAAS,SAASib,GACd,IAAIu8B,EAAQn+C,KAAKm+C,MACbtI,EAAYj0B,EAAMi0B,UAElB+L,EAAuB,EAARzD,EACf0D,EAAU7hD,KAAK0hD,SAAS9/B,GAG5B,OAAIggC,IAlzCO,EAkzCU/L,IAA6BgM,GAvVpC,GAwVH1D,EACAyD,GAAgBC,EArzCnB,EAszCAhM,EA5VE,EA6VKsI,EA/VL,EAgWOA,EA/VL,EAkWDA,EAnWD,EAKC,MAiXnBrL,EAAQ8L,GAAeD,GAAgB,CAKnC/9C,SAAU,CACNwgD,MAAO,MACPU,UAAW,GACX/L,SAAU,EACVoC,UA50CY4J,IA+0ChBzB,eAAgB,WACZ,IAAInI,EAAYn4C,KAAKN,QAAQy4C,UACzBxqB,EAAU,GAOd,OA11CmBkzB,EAo1Cf1I,GACAxqB,EAAQtqB,KA9jBK,SAtxBAy9C,GAs1Cb3I,GACAxqB,EAAQtqB,KAlkBK,SAokBVsqB,GAGXq0B,cAAe,SAASpgC,GACpB,IAAIliB,EAAUM,KAAKN,QACfuiD,GAAW,EACXjL,EAAWp1B,EAAMo1B,SACjBmB,EAAYv2B,EAAMu2B,UAClBnN,EAAIppB,EAAMy1B,OACVlH,EAAIvuB,EAAM01B,OAed,OAZMa,EAAYz4C,EAAQy4C,YAt2CP0I,EAu2CXnhD,EAAQy4C,WACRA,EAAmB,IAANnN,EA92CR,EA82CqCA,EAAI,EA72CzC,EACC,EA62CNiX,EAAWjX,GAAKhrC,KAAK6+C,GACrB7H,EAAWztC,KAAK+mC,IAAI1uB,EAAMy1B,UAE1Bc,EAAmB,IAANhI,EAl3CR,EAk3CqCA,EAAI,EA/2C3C,EACE,GA+2CL8R,EAAW9R,GAAKnwC,KAAK8+C,GACrB9H,EAAWztC,KAAK+mC,IAAI1uB,EAAM01B,UAGlC11B,EAAMu2B,UAAYA,EACX8J,GAAYjL,EAAWt3C,EAAQoiD,WAAa3J,EAAYz4C,EAAQy4C,WAG3EuJ,SAAU,SAAS9/B,GACf,OAAO+8B,GAAe19C,UAAUygD,SAAShuC,KAAK1T,KAAM4hB,KAva1C,EAwaL5hB,KAAKm+C,SAxaA,EAwa0Bn+C,KAAKm+C,QAAwBn+C,KAAKgiD,cAAcpgC,KAGxF22B,KAAM,SAAS32B,GAEX5hB,KAAK6+C,GAAKj9B,EAAMy1B,OAChBr3C,KAAK8+C,GAAKl9B,EAAM01B,OAEhB,IAAIa,EAAYoG,GAAa38B,EAAMu2B,WAE/BA,IACAv2B,EAAMy/B,gBAAkBrhD,KAAKN,QAAQ0hD,MAAQjJ,GAEjDn4C,KAAKkzC,OAAOqF,KAAK7kC,KAAK1T,KAAM4hB,MAcpCkxB,EAAQiM,GAAiBJ,GAAgB,CAKrC/9C,SAAU,CACNwgD,MAAO,QACPU,UAAW,EACX/L,SAAU,GAGduK,eAAgB,WACZ,MAAO,CAzoBS,SA4oBpBoB,SAAU,SAAS9/B,GACf,OAAO5hB,KAAKkzC,OAAOwO,SAAShuC,KAAK1T,KAAM4hB,KAClCrY,KAAK+mC,IAAI1uB,EAAMi2B,MAAQ,GAAK73C,KAAKN,QAAQoiD,WApdpC,EAodiD9hD,KAAKm+C,QAGpE5F,KAAM,SAAS32B,GACS,IAAhBA,EAAMi2B,QAENj2B,EAAMy/B,gBAAkBrhD,KAAKN,QAAQ0hD,OADzBx/B,EAAMi2B,MAAQ,EAAI,KAAO,QAGzC73C,KAAKkzC,OAAOqF,KAAK7kC,KAAK1T,KAAM4hB,MAiBpCkxB,EAAQkM,GAAiBd,GAAY,CAKjCt9C,SAAU,CACNwgD,MAAO,QACPrL,SAAU,EACVtc,KAAM,IACNqoB,UAAW,GAGfxB,eAAgB,WACZ,MAAO,CAtrBS,SAyrBpB35C,QAAS,SAASib,GACd,IAAIliB,EAAUM,KAAKN,QACfwiD,EAAgBtgC,EAAMm0B,SAASj1C,SAAWpB,EAAQq2C,SAClDoM,EAAgBvgC,EAAMo1B,SAAWt3C,EAAQoiD,UACzCM,EAAYxgC,EAAMi1B,UAAYn3C,EAAQ+5B,KAM1C,GAJAz5B,KAAKk/C,OAASt9B,GAITugC,IAAkBD,GAAoC,GAAlBtgC,EAAMi0B,YAA2CuM,EACtFpiD,KAAKyhD,aACF,GAn+CG,EAm+CC7/B,EAAMi0B,UACb71C,KAAKyhD,QACLzhD,KAAKi/C,OAAS5M,GAAAA,WACVryC,KAAKm+C,MA1gBH,EA2gBFn+C,KAAKshD,YACN5hD,EAAQ+5B,KAAMz5B,WACd,GAv+CC,EAu+CG4hB,EAAMi0B,UACb,OA9gBM,EAghBV,OA7gBW,IAghBf4L,MAAO,WACH/mC,aAAa1a,KAAKi/C,SAGtB1G,KAAM,SAAS32B,GAvhBD,IAwhBN5hB,KAAKm+C,QAILv8B,GAt/CI,EAs/CMA,EAAMi0B,UAChB71C,KAAKs1C,QAAQiD,KAAKv4C,KAAKN,QAAQ0hD,MAAQ,KAAMx/B,IAE7C5hB,KAAKk/C,OAAOtI,UAAYh8B,IACxB5a,KAAKs1C,QAAQiD,KAAKv4C,KAAKN,QAAQ0hD,MAAOphD,KAAKk/C,aAevDpM,EAAQqM,GAAkBR,GAAgB,CAKtC/9C,SAAU,CACNwgD,MAAO,SACPU,UAAW,EACX/L,SAAU,GAGduK,eAAgB,WACZ,MAAO,CAvvBS,SA0vBpBoB,SAAU,SAAS9/B,GACf,OAAO5hB,KAAKkzC,OAAOwO,SAAShuC,KAAK1T,KAAM4hB,KAClCrY,KAAK+mC,IAAI1uB,EAAMk2B,UAAY93C,KAAKN,QAAQoiD,WAlkBnC,EAkkBgD9hD,KAAKm+C,UAcvErL,EAAQsM,GAAiBT,GAAgB,CAKrC/9C,SAAU,CACNwgD,MAAO,QACPU,UAAW,GACX9J,SAAU,GACVG,UAAW4J,GACXhM,SAAU,GAGduK,eAAgB,WACZ,OAAO1B,GAAc39C,UAAUq/C,eAAe5sC,KAAK1T,OAGvD0hD,SAAU,SAAS9/B,GACf,IACIo2B,EADAG,EAAYn4C,KAAKN,QAAQy4C,UAW7B,OARgB,GAAZA,EACAH,EAAWp2B,EAAM61B,gBArjDFoJ,EAsjDR1I,EACPH,EAAWp2B,EAAM+1B,iBAtjDJmJ,GAujDN3I,IACPH,EAAWp2B,EAAMg2B,kBAGd53C,KAAKkzC,OAAOwO,SAAShuC,KAAK1T,KAAM4hB,IACnCu2B,EAAYv2B,EAAM21B,iBAClB31B,EAAMo1B,SAAWh3C,KAAKN,QAAQoiD,WAC9BlgC,EAAMm2B,aAAe/3C,KAAKN,QAAQq2C,UAClCzF,EAAI0H,GAAYh4C,KAAKN,QAAQs4C,UAzkDzB,EAykDqCp2B,EAAMi0B,WAGvD0C,KAAM,SAAS32B,GACX,IAAIu2B,EAAYoG,GAAa38B,EAAM21B,iBAC/BY,GACAn4C,KAAKs1C,QAAQiD,KAAKv4C,KAAKN,QAAQ0hD,MAAQjJ,EAAWv2B,GAGtD5hB,KAAKs1C,QAAQiD,KAAKv4C,KAAKN,QAAQ0hD,MAAOx/B,MA2B9CkxB,EAAQuM,GAAenB,GAAY,CAK/Bt9C,SAAU,CACNwgD,MAAO,MACPrL,SAAU,EACVsM,KAAM,EACNC,SAAU,IACV7oB,KAAM,IACNqoB,UAAW,EACXS,aAAc,IAGlBjC,eAAgB,WACZ,MAAO,CAh2BiB,iBAm2B5B35C,QAAS,SAASib,GACd,IAAIliB,EAAUM,KAAKN,QAEfwiD,EAAgBtgC,EAAMm0B,SAASj1C,SAAWpB,EAAQq2C,SAClDoM,EAAgBvgC,EAAMo1B,SAAWt3C,EAAQoiD,UACzCU,EAAiB5gC,EAAMi1B,UAAYn3C,EAAQ+5B,KAI/C,GAFAz5B,KAAKyhD,QAzoDK,EA2oDL7/B,EAAMi0B,WAA4C,IAAf71C,KAAK41B,MACzC,OAAO51B,KAAKyiD,cAKhB,GAAIN,GAAiBK,GAAkBN,EAAe,CAClD,GAhpDI,GAgpDAtgC,EAAMi0B,UACN,OAAO71C,KAAKyiD,cAGhB,IAAIC,GAAgB1iD,KAAKs/C,OAAS19B,EAAMg1B,UAAY52C,KAAKs/C,MAAQ5/C,EAAQ4iD,SACrEK,GAAiB3iD,KAAKu/C,SAAWtI,EAAYj3C,KAAKu/C,QAAS39B,EAAM80B,QAAUh3C,EAAQ6iD,aAgBvF,GAdAviD,KAAKs/C,MAAQ19B,EAAMg1B,UACnB52C,KAAKu/C,QAAU39B,EAAM80B,OAEhBiM,GAAkBD,EAGnB1iD,KAAK41B,OAAS,EAFd51B,KAAK41B,MAAQ,EAKjB51B,KAAKk/C,OAASt9B,EAKG,GADF5hB,KAAK41B,MAAQl2B,EAAQ2iD,KAIhC,OAAKriD,KAAKkhD,sBAGNlhD,KAAKi/C,OAAS5M,GAAAA,WACVryC,KAAKm+C,MAltBX,EAmtBMn+C,KAAKshD,YACN5hD,EAAQ4iD,SAAUtiD,MAttBvB,GAEA,EAytBV,OAttBW,IAytBfyiD,YAAa,WAIT,OAHAziD,KAAKi/C,OAAS5M,GAAAA,WACVryC,KAAKm+C,MA3tBE,KA4tBRn+C,KAAKN,QAAQ4iD,SAAUtiD,MA5tBf,IAguBfyhD,MAAO,WACH/mC,aAAa1a,KAAKi/C,SAGtB1G,KAAM,WAvuBQ,GAwuBNv4C,KAAKm+C,QACLn+C,KAAKk/C,OAAO0D,SAAW5iD,KAAK41B,MAC5B51B,KAAKs1C,QAAQiD,KAAKv4C,KAAKN,QAAQ0hD,MAAOphD,KAAKk/C,YAoBvDM,GAAOlW,QAAU,QAMjBkW,GAAO5+C,SAAW,CAOdiiD,WAAW,EAQX9C,YAl9BuB,UAw9BvBrK,QAAQ,EASRH,YAAa,KAObuK,WAAY,KAOZJ,OAAQ,CAEJ,CAACP,GAAkB,CAACzJ,QAAQ,IAC5B,CAACqJ,GAAiB,CAACrJ,QAAQ,GAAQ,CAAC,WACpC,CAAC0J,GAAiB,CAACjH,UArwDA0I,IAswDnB,CAACjC,GAAe,CAACzG,UAtwDE0I,GAswDgC,CAAC,UACpD,CAACxB,IACD,CAACA,GAAe,CAAC+B,MAAO,YAAaiB,KAAM,GAAI,CAAC,QAChD,CAACrD,KAQLoB,SAAU,CAMN0C,WAAY,OAOZC,YAAa,OASbC,aAAc,OAOdC,eAAgB,OAOhBC,SAAU,OAQVC,kBAAmB,kBAoC3BxD,GAAQ1+C,UAAY,CAMhBpC,IAAK,SAASa,GAaV,OAZAi8B,EAAO37B,KAAKN,QAASA,GAGjBA,EAAQqgD,aACR//C,KAAK+/C,YAAYld,SAEjBnjC,EAAQ61C,cAERv1C,KAAK4hB,MAAMu3B,UACXn5C,KAAK4hB,MAAMiiB,OAASnkC,EAAQ61C,YAC5Bv1C,KAAK4hB,MAAM+zB,QAER31C,MASXojD,KAAM,SAASC,GACXrjD,KAAKo2C,QAAQkN,QAAUD,EA5Db,EADP,GAsEP7K,UAAW,SAAS8E,GAChB,IAAIlH,EAAUp2C,KAAKo2C,QACnB,IAAIA,EAAQkN,QAAZ,CAOA,IAAI5E,EAFJ1+C,KAAK+/C,YAAYU,gBAAgBnD,GAGjC,IAAImC,EAAcz/C,KAAKy/C,YAKnB8D,EAAgBnN,EAAQmN,gBAIvBA,GAAkBA,GAz8Bb,EAy8B8BA,EAAcpF,SAClDoF,EAAgBnN,EAAQmN,cAAgB,MAI5C,IADA,IAAI7iD,EAAI,EACDA,EAAI++C,EAAY3+C,QACnB49C,EAAae,EAAY/+C,GA9FnB,IAsGF01C,EAAQkN,SACHC,GAAiB7E,GAAc6E,IAChC7E,EAAWyC,iBAAiBoC,GAGhC7E,EAAW+C,QAFX/C,EAAWlG,UAAU8E,IAOpBiG,GAAoC,GAAnB7E,EAAWP,QAC7BoF,EAAgBnN,EAAQmN,cAAgB7E,GAE5Ch+C,MASRugB,IAAK,SAASy9B,GACV,GAAIA,aAAsBR,GACtB,OAAOQ,EAIX,IADA,IAAIe,EAAcz/C,KAAKy/C,YACd/+C,EAAI,EAAGA,EAAI++C,EAAY3+C,OAAQJ,IACpC,GAAI++C,EAAY/+C,GAAGhB,QAAQ0hD,OAAS1C,EAChC,OAAOe,EAAY/+C,GAG3B,OAAO,MASXwe,IAAK,SAASw/B,GACV,GAAIlM,EAAekM,EAAY,MAAO1+C,MAClC,OAAOA,KAIX,IAAIwjD,EAAWxjD,KAAKihB,IAAIy9B,EAAWh/C,QAAQ0hD,OAS3C,OARIoC,GACAxjD,KAAKshC,OAAOkiB,GAGhBxjD,KAAKy/C,YAAYp8C,KAAKq7C,GACtBA,EAAWpJ,QAAUt1C,KAErBA,KAAK+/C,YAAYld,SACV6b,GAQXpd,OAAQ,SAASod,GACb,GAAIlM,EAAekM,EAAY,SAAU1+C,MACrC,OAAOA,KAMX,GAHA0+C,EAAa1+C,KAAKihB,IAAIy9B,GAGN,CACZ,IAAIe,EAAcz/C,KAAKy/C,YACnBzrC,EAAQigC,EAAQwL,EAAaf,IAElB,IAAX1qC,IACAyrC,EAAYzlC,OAAOhG,EAAO,GAC1BhU,KAAK+/C,YAAYld,UAIzB,OAAO7iC,MASXyjD,GAAI,SAASC,EAAQlQ,GACjB,QAp5ER,IAo5EYkQ,QAp5EZ,IAu5EYlQ,EAAJ,CAIA,IAAIoM,EAAW5/C,KAAK4/C,SAKpB,OAJAzW,EAAKsK,EAASiQ,IAAAA,SAAkBtC,GAC5BxB,EAASwB,GAASxB,EAASwB,IAAU,GACrCxB,EAASwB,GAAO/9C,KAAKmwC,MAElBxzC,OASX2jD,IAAK,SAASD,EAAQlQ,GAClB,QA16ER,IA06EYkQ,EAAJ,CAIA,IAAI9D,EAAW5/C,KAAK4/C,SAQpB,OAPAzW,EAAKsK,EAASiQ,IAAAA,SAAkBtC,GACvB5N,EAGDoM,EAASwB,IAAUxB,EAASwB,GAAOpnC,OAAOi6B,EAAQ2L,EAASwB,GAAQ5N,GAAU,UAFtEoM,EAASwB,MAKjBphD,OAQXu4C,KAAM,SAAS6I,EAAOhiC,GAEdpf,KAAKN,QAAQmjD,WAkEzB,SAAyBzB,EAAOhiC,GAC5B,IAAIwkC,EAAe5R,EAAS6R,YAAY,SACxCD,EAAaE,UAAU1C,GAAO,GAAM,GACpCwC,EAAaG,QAAU3kC,EACvBA,EAAKykB,OAAOmgB,cAAcJ,GAJ9B,CAjE4BxC,EAAOhiC,GAI3B,IAAIwgC,EAAW5/C,KAAK4/C,SAASwB,IAAUphD,KAAK4/C,SAASwB,GAAOl9C,QAC5D,GAAK07C,GAAaA,EAAS9+C,OAA3B,CAIAse,EAAK9b,KAAO89C,EACZhiC,EAAKuhC,eAAiB,WAClBvhC,EAAKk5B,SAASqI,kBAIlB,IADA,IAAIjgD,EAAI,EACDA,EAAIk/C,EAAS9+C,QAChB8+C,EAASl/C,GAAG0e,GACZ1e,MAQRy4C,QAAS,WACLn5C,KAAKy0C,SAAWuL,GAAehgD,MAAM,GAErCA,KAAK4/C,SAAW,GAChB5/C,KAAKo2C,QAAU,GACfp2C,KAAK4hB,MAAMu3B,UACXn5C,KAAKy0C,QAAU,OAyCvB9Y,EAAO6jB,GAAQ,CACXyE,YAtoEc,EAuoEdC,WAtoEa,EAuoEbC,UAtoEY,EAuoEZC,aAtoEe,EAwoEfC,eAlrCiB,EAmrCjBC,YAlrCc,EAmrCdC,cAlrCgB,EAmrChBC,YAlrCc,EAmrCdC,iBAnrCc,EAorCdC,gBAlrCkB,GAmrClBC,aAlrCe,GAorCfC,eA9oEiB,EA+oEjB/D,eA9oEiB,EA+oEjBgE,gBA9oEkB,EA+oElB/D,aA9oEe,EA+oEfgE,eA9oEiB,GA+oEjB/C,qBA7oEuBlB,EA8oEvBkE,mBA7oEqBjE,GA8oErBkE,cA7oEgBjD,GA+oEhBpC,QAASA,GACTtK,MAAOA,EACP4I,YAAaA,GAEbhC,WAAYA,GACZzC,WAAYA,EACZkB,kBAAmBA,GACnB+B,gBAAiBA,GACjBhB,iBAAkBA,GAElByC,WAAYA,GACZS,eAAgBA,GAChBsG,IAAK5F,GACL6F,IAAKtG,GACLuG,MAAO/F,GACPgG,MAAOrG,GACPsG,OAAQlG,GACRmG,MAAOtG,GAEPyE,GAAIlQ,EACJoQ,IAAKhQ,EACLxK,KAAMA,EACN3M,MAAOA,EACP4G,OAAQA,EACRzH,OAAQA,EACRmX,QAASA,EACTP,OAAQA,EACR8B,SAAUA,UAKsB,IAAXtC,EAAyBA,EAA0B,oBAAT/uC,KAAuBA,KAAO,IACtFw8C,OAASA,QAjkFpB,KAokFI,GAAA,WACI,OAAOA,KACV,KAAA,EAAA,EAAA,EAAA,MAAA,EAAA,QAAA,GAtkFL,CA6kFGzN,OAAQC,s6ICllFJ,SAASltB,EAAWkmB,GACvB,MAAoB,mBAANA,+ZCDlB,IAAIua,GAAsD,EACnD,MAAM,EAAS,CAClBjpC,aAASpG,EACT,0CAA0C7K,GACtC,GAAIA,EAAO,CACP,MAAM9J,EAAQ,IAAIkF,MAClBnF,QAAQoxC,KAAK,gGAAkGnxC,EAAMigB,YAEhH+jC,GACLjkD,QAAQwtC,IAAI,wDAEhByW,EAAsDl6C,GAE1D,4CACI,OAAOk6C,ICdR,SAASC,EAAgBC,GAC5B3qC,WAAW,KAAQ,MAAM2qC,GAAQ,GCC9B,MAAMplD,EAAQ,CACjBqlD,QAAQ,EACR,KAAKr6C,KACL,MAAMo6C,GACF,GAAI,EAAOE,sCACP,MAAMF,EAGND,EAAgBC,IAGxB,cCbSjoC,EAAU,KAAO5I,MAAM4I,SAAW,CAAEwtB,GAAMA,GAAyB,iBAAbA,EAAElqC,QAA9C,GCAhB,SAASuJ,EAAS2gC,GACrB,OAAa,OAANA,GAA2B,iBAANA,ECDhC,MAaa4a,EAbmB,MAC5B,SAASC,EAAwBC,GAO7B,OANAr/C,MAAMiN,KAAK1T,MACXA,KAAKknB,QAAU4+B,EACX,GAAGA,EAAOhlD,kDACpBglD,EAAOrkD,IAAI,CAACgkD,EAAK/kD,IAAM,GAAGA,EAAI,MAAM+kD,EAAI1sC,cAAc9Y,KAAK,UAAY,GACjED,KAAKyK,KAAO,sBACZzK,KAAK8lD,OAASA,EACP9lD,KAGX,OADA6lD,EAAwB5kD,UAAY7B,OAAO4L,OAAOvE,MAAMxF,WACjD4kD,GAXqB,GCIzB,IAAA,EAAA,YAAME,EACT,YAAYC,GACRhmD,KAAK0lD,QAAS,EACd1lD,KAAKimD,iBAAmB,KACxBjmD,KAAKkmD,eAAiB,KAClBF,IACAhmD,KAAKmmD,kBAAmB,EACxBnmD,KAAKomD,aAAeJ,GAG5B,cACI,IAAIF,EACJ,GAAI9lD,KAAK0lD,OACL,OAEJ,IAAI,iBAAEO,EAAgB,iBAAEE,EAAgB,aAAEC,EAAY,eAAEF,GAAmBlmD,KAI3E,GAHAA,KAAK0lD,QAAS,EACd1lD,KAAKimD,iBAAmB,KACxBjmD,KAAKkmD,eAAiB,KAClBD,aAA4BF,EAC5BE,EAAiB3kB,OAAOthC,WAEvB,GAAyB,OAArBimD,EACL,IAAK,IAAIjyC,EAAQ,EAAGA,EAAQiyC,EAAiBnlD,SAAUkT,EACpCiyC,EAAiBjyC,GACzBstB,OAAOthC,MAGtB,GAAI8kB,EAAWshC,GAAe,CACtBD,IACAnmD,KAAKomD,kBAAelwC,GAExB,IACIkwC,EAAa1yC,KAAK1T,MAEtB,MAAOyS,GACHqzC,EAASrzC,aAAamzC,EAAsBS,EAA4B5zC,EAAEqzC,QAAU,CAACrzC,IAG7F,GAAI+K,EAAQ0oC,GAAiB,CACzB,IAAIlyC,GAAS,EACT7Q,EAAM+iD,EAAeplD,OACzB,OAASkT,EAAQ7Q,GAAK,CAClB,MAAMmjD,EAAMJ,EAAelyC,GAC3B,GAAI3J,EAASi8C,GACT,IACIA,EAAIN,cAER,MAAOvzC,GACHqzC,EAASA,GAAU,GACfrzC,aAAamzC,EACbE,EAASA,EAAOn8C,OAAO08C,EAA4B5zC,EAAEqzC,SAGrDA,EAAOziD,KAAKoP,KAMhC,GAAIqzC,EACA,MAAM,IAAIF,EAAoBE,GAGtC,IAAIS,GACA,IAAIC,EAAeD,EACnB,IAAKA,EACD,OAAOR,EAAaU,MAExB,cAAeF,GACX,IAAK,WACDC,EAAe,IAAIT,EAAaQ,GACpC,IAAK,SACD,GAAIC,IAAiBxmD,MAAQwmD,EAAad,QAA8C,mBAA7Bc,EAAaR,YACpE,OAAOQ,EAEN,GAAIxmD,KAAK0lD,OAEV,OADAc,EAAaR,cACNQ,EAEN,KAAMA,aAAwBT,GAAe,CAC9C,MAAMW,EAAMF,EACZA,EAAe,IAAIT,EACnBS,EAAaN,eAAiB,CAACQ,GAEnC,MACJ,QACI,MAAM,IAAIjgD,MAAM,yBAA2B8/C,EAAW,2BAG9D,IAAI,iBAAEN,GAAqBO,EAC3B,GAAyB,OAArBP,EACAO,EAAaP,iBAAmBjmD,UAE/B,GAAIimD,aAA4BF,EAAc,CAC/C,GAAIE,IAAqBjmD,KACrB,OAAOwmD,EAEXA,EAAaP,iBAAmB,CAACA,EAAkBjmD,UAElD,CAAA,IAAwC,IAApCimD,EAAiBpkD,QAAQ7B,MAI9B,OAAOwmD,EAHPP,EAAiB5iD,KAAKrD,MAK1B,MAAM2mD,EAAgB3mD,KAAKkmD,eAO3B,OANsB,OAAlBS,EACA3mD,KAAKkmD,eAAiB,CAACM,GAGvBG,EAActjD,KAAKmjD,GAEhBA,EAEX,OAAOA,GACH,MAAMG,EAAgB3mD,KAAKkmD,eAC3B,GAAIS,EAAe,CACf,MAAMC,EAAoBD,EAAc9kD,QAAQ2kD,IACrB,IAAvBI,GACAD,EAAc3sC,OAAO4sC,EAAmB,YAKxDb,EAAaU,MAAS,SAAUpmD,GAE5B,OADAA,EAAMqlD,QAAS,EACRrlD,EAFW,CAGpB,IAAI0lD,MAhIC,GAiIP,SAASM,EAA4BP,GACjC,OAAOA,EAAOlnD,OAAO,CAACioD,EAAMpB,IAAQoB,EAAKl9C,OAAQ87C,aAAeG,EAAuBH,EAAIK,OAASL,GAAM,ICtIvG,MAAMqB,EAAe,KAAyB,mBAAXrtC,OACpCA,OAAO,gBACP,kBAAoBlQ,KAAK0S,SAFH,GCMrB,MAAM,UAAmB,EAC5B,YAAY8qC,EAAmBxlD,EAAOylD,GAMlC,OALAC,QACAjnD,KAAKknD,eAAiB,KACtBlnD,KAAKmnD,iBAAkB,EACvBnnD,KAAKonD,oBAAqB,EAC1BpnD,KAAKqnD,WAAY,EACT/+C,UAAUxH,QACd,KAAK,EACDd,KAAKsnD,YAAcjnD,EACnB,MACJ,KAAK,EACD,IAAK0mD,EAAmB,CACpB/mD,KAAKsnD,YAAcjnD,EACnB,MAEJ,GAAiC,iBAAtB0mD,EAAgC,CACnCA,aAA6B,GAC7B/mD,KAAKonD,mBAAqBL,EAAkBK,mBAC5CpnD,KAAKsnD,YAAcP,EACnBA,EAAkB7nC,IAAIlf,QAGtBA,KAAKonD,oBAAqB,EAC1BpnD,KAAKsnD,YAAc,IAAI,EAAetnD,KAAM+mD,IAEhD,MAER,QACI/mD,KAAKonD,oBAAqB,EAC1BpnD,KAAKsnD,YAAc,IAAI,EAAetnD,KAAM+mD,EAAmBxlD,EAAOylD,IAIlF,CAACF,KAAwB,OAAO9mD,KAChC,cAAcs7B,EAAM/5B,EAAOylD,GACvB,MAAMO,EAAa,IAAI,EAAWjsB,EAAM/5B,EAAOylD,GAE/C,OADAO,EAAWH,oBAAqB,EACzBG,EAEX,KAAKl8C,GACIrL,KAAKqnD,WACNrnD,KAAKwnD,MAAMn8C,GAGnB,MAAMo6C,GACGzlD,KAAKqnD,YACNrnD,KAAKqnD,WAAY,EACjBrnD,KAAKynD,OAAOhC,IAGpB,WACSzlD,KAAKqnD,YACNrnD,KAAKqnD,WAAY,EACjBrnD,KAAK0nD,aAGb,cACQ1nD,KAAK0lD,SAGT1lD,KAAKqnD,WAAY,EACjBJ,MAAMjB,eAEV,MAAM36C,GACFrL,KAAKsnD,YAAYhsB,KAAKjwB,GAE1B,OAAOo6C,GACHzlD,KAAKsnD,YAAY/lD,MAAMkkD,GACvBzlD,KAAKgmD,cAET,YACIhmD,KAAKsnD,YAAYN,WACjBhnD,KAAKgmD,cAET,yBACI,MAAM,iBAAEC,GAAqBjmD,KAM7B,OALAA,KAAKimD,iBAAmB,KACxBjmD,KAAKgmD,cACLhmD,KAAK0lD,QAAS,EACd1lD,KAAKqnD,WAAY,EACjBrnD,KAAKimD,iBAAmBA,EACjBjmD,MAGR,MAAM,UAAuB,EAChC,YAAY2nD,EAAmBC,EAAgBrmD,EAAOylD,GAGlD,IAAI1rB,EAFJ2rB,QACAjnD,KAAK2nD,kBAAoBA,EAEzB,IAAIrvC,EAAUtY,KACV8kB,EAAW8iC,GACXtsB,EAAOssB,EAEFA,IACLtsB,EAAOssB,EAAetsB,KACtB/5B,EAAQqmD,EAAermD,MACvBylD,EAAWY,EAAeZ,SACtBY,IAAmBvnD,IACnBiY,EAAUlZ,OAAO4L,OAAO48C,GACpB9iC,EAAWxM,EAAQ0tC,cACnBhmD,KAAKkf,IAAI5G,EAAQ0tC,YAAYptB,KAAKtgB,IAEtCA,EAAQ0tC,YAAchmD,KAAKgmD,YAAYptB,KAAK54B,QAGpDA,KAAK6nD,SAAWvvC,EAChBtY,KAAKwnD,MAAQlsB,EACbt7B,KAAKynD,OAASlmD,EACdvB,KAAK0nD,UAAYV,EAErB,KAAK37C,GACD,IAAKrL,KAAKqnD,WAAarnD,KAAKwnD,MAAO,CAC/B,MAAM,kBAAEG,GAAsB3nD,KACzB,EAAO2lD,uCAA0CgC,EAAkBP,mBAG/DpnD,KAAK8nD,gBAAgBH,EAAmB3nD,KAAKwnD,MAAOn8C,IACzDrL,KAAKgmD,cAHLhmD,KAAK+nD,aAAa/nD,KAAKwnD,MAAOn8C,IAO1C,MAAMo6C,GACF,IAAKzlD,KAAKqnD,UAAW,CACjB,MAAM,kBAAEM,GAAsB3nD,MACxB,sCAAE2lD,GAA0C,EAClD,GAAI3lD,KAAKynD,OACA9B,GAA0CgC,EAAkBP,oBAK7DpnD,KAAK8nD,gBAAgBH,EAAmB3nD,KAAKynD,OAAQhC,GACrDzlD,KAAKgmD,gBALLhmD,KAAK+nD,aAAa/nD,KAAKynD,OAAQhC,GAC/BzlD,KAAKgmD,oBAOR,GAAK2B,EAAkBP,mBAQpBzB,GACAgC,EAAkBT,eAAiBzB,EACnCkC,EAAkBR,iBAAkB,GAGpC3B,EAAgBC,GAEpBzlD,KAAKgmD,kBAfuC,CAE5C,GADAhmD,KAAKgmD,cACDL,EACA,MAAMF,EAEVD,EAAgBC,KAc5B,WACI,IAAKzlD,KAAKqnD,UAAW,CACjB,MAAM,kBAAEM,GAAsB3nD,KAC9B,GAAIA,KAAK0nD,UAAW,CAChB,MAAMM,EAAkB,IAAMhoD,KAAK0nD,UAAUh0C,KAAK1T,KAAK6nD,UAClD,EAAOlC,uCAA0CgC,EAAkBP,oBAKpEpnD,KAAK8nD,gBAAgBH,EAAmBK,GACxChoD,KAAKgmD,gBALLhmD,KAAK+nD,aAAaC,GAClBhoD,KAAKgmD,oBAQThmD,KAAKgmD,eAIjB,aAAazzB,EAAIlnB,GACb,IACIknB,EAAG7e,KAAK1T,KAAK6nD,SAAUx8C,GAE3B,MAAOo6C,GAEH,GADAzlD,KAAKgmD,cACD,EAAOL,sCACP,MAAMF,EAGND,EAAgBC,IAI5B,gBAAgBp/B,EAAQkM,EAAIlnB,GACxB,IAAK,EAAOs6C,sCACR,MAAM,IAAIl/C,MAAM,YAEpB,IACI8rB,EAAG7e,KAAK1T,KAAK6nD,SAAUx8C,GAE3B,MAAOo6C,GACH,OAAI,EAAOE,uCACPt/B,EAAO6gC,eAAiBzB,EACxBp/B,EAAO8gC,iBAAkB,GAClB,IAGP3B,EAAgBC,IACT,GAGf,OAAO,EAEX,eACI,MAAM,kBAAEkC,GAAsB3nD,KAC9BA,KAAK6nD,SAAW,KAChB7nD,KAAK2nD,kBAAoB,KACzBA,EAAkB3B,eC1NnB,MAAM,EAAa,KAAyB,mBAAXvsC,QAAyBA,OAAOwuC,YAAc,eAA5D,GCAnB,SAAS,EAASjd,GACrB,OAAOA,ECAJ,SAASkd,KAAQC,GACpB,OAAOC,EAAcD,GAElB,SAASC,EAAcD,GAC1B,OAAmB,IAAfA,EAAIrnD,OACG,EAEQ,IAAfqnD,EAAIrnD,OACGqnD,EAAI,GAER,SAAevmC,GAClB,OAAOumC,EAAIvpD,OAAO,CAAC6uC,EAAMlb,IAAOA,EAAGkb,GAAO7rB,ICP3C,IAAA,EAAA,YAAMymC,EACT,YAAYC,GACRtoD,KAAKuoD,WAAY,EACbD,IACAtoD,KAAKwoD,WAAaF,GAG1B,KAAK11B,GACD,MAAMq1B,EAAa,IAAII,EAGvB,OAFAJ,EAAWr6C,OAAS5N,KACpBioD,EAAWr1B,SAAWA,EACfq1B,EAEX,UAAUL,EAAgBrmD,EAAOylD,GAC7B,MAAM,SAAEp0B,GAAa5yB,KACfyoD,ECjBP,SAAsBC,EAAgBnnD,EAAOylD,GAChD,GAAI0B,EAAgB,CAChB,GAAIA,aAA0B,EAC1B,OAAOA,EAEX,GAAIA,EAAe5B,GACf,OAAO4B,EAAe5B,KAG9B,OAAK4B,GAAmBnnD,GAAUylD,EAG3B,IAAI,EAAW0B,EAAgBnnD,EAAOylD,GAFlC,IAAI,EAAW3mD,GAVvB,CDiB2BunD,EAAgBrmD,EAAOylD,GASjD,GAPIyB,EAAKvpC,IADL0T,EACSA,EAASlf,KAAK+0C,EAAMzoD,KAAK4N,QAGzB5N,KAAK4N,QAAW,EAAO+3C,wCAA0C8C,EAAKrB,mBAC3EpnD,KAAKwoD,WAAWC,GAChBzoD,KAAK2oD,cAAcF,IAEvB,EAAO9C,uCACH8C,EAAKrB,qBACLqB,EAAKrB,oBAAqB,EACtBqB,EAAKtB,iBACL,MAAMsB,EAAKvB,eAIvB,OAAOuB,EAEX,cAAcA,GACV,IACI,OAAOzoD,KAAKwoD,WAAWC,GAE3B,MAAOhD,GACC,EAAOE,wCACP8C,EAAKtB,iBAAkB,EACvBsB,EAAKvB,eAAiBzB,GE7C/B,SAAwBmD,GAC3B,KAAOA,GAAU,CACb,MAAM,OAAElD,EAAM,YAAE4B,EAAW,UAAED,GAAcuB,EAC3C,GAAIlD,GAAU2B,EACV,OAAO,EAGPuB,EADKtB,GAAeA,aAAuB,EAChCA,EAGA,KAGnB,OAAO,EAbJ,CF+CwBmB,GACfA,EAAKlnD,MAAMkkD,GAGXnkD,QAAQoxC,KAAK+S,IAIzB,QAAQnqB,EAAMutB,GAEV,OAAO,IADPA,EAAcC,EAAeD,IACN,CAAC3gD,EAASm5B,KAC7B,IAAImlB,EACJA,EAAexmD,KAAKsoD,UAAWj9C,IAC3B,IACIiwB,EAAKjwB,GAET,MAAOo6C,GACHpkB,EAAOokB,GACHe,GACAA,EAAaR,gBAGtB3kB,EAAQn5B,KAGnB,WAAWq/C,GACP,MAAM,OAAE35C,GAAW5N,KACnB,OAAO4N,GAAUA,EAAO06C,UAAUf,GAEtC,CAAC,KACG,OAAOvnD,KAEX,QAAQ+oD,GACJ,OAA0B,IAAtBA,EAAWjoD,OACJd,KAEJooD,EAAcW,EAAdX,CAA0BpoD,MAErC,UAAU6oD,GAEN,OAAO,IADPA,EAAcC,EAAeD,IACN,CAAC3gD,EAASm5B,KAC7B,IAAIh2B,EACJrL,KAAKsoD,UAAWtd,GAAM3/B,EAAQ2/B,EAAIya,GAAQpkB,EAAOokB,GAAM,IAAMv9C,EAAQmD,cAIjFg9C,EAAWr9C,OAAUs9C,GACV,IAAID,EAAWC,MA1FnB,GA4FP,SAASQ,EAAeD,GAIpB,GAHKA,IACDA,EAAc,EAAOvsC,SAAWA,UAE/BusC,EACD,MAAM,IAAIpiD,MAAM,yBAEpB,OAAOoiD,EGxGX,MAUaG,EAVuB,MAChC,SAASC,IAIL,OAHAxiD,MAAMiN,KAAK1T,MACXA,KAAKknB,QAAU,sBACflnB,KAAKyK,KAAO,0BACLzK,KAGX,OADAipD,EAA4BhoD,UAAY7B,OAAO4L,OAAOvE,MAAMxF,WACrDgoD,GARyB,GCC7B,MAAM,UAA4B,EACrC,YAAYC,EAAS3B,GACjBN,QACAjnD,KAAKkpD,QAAUA,EACflpD,KAAKunD,WAAaA,EAClBvnD,KAAK0lD,QAAS,EAElB,cACI,GAAI1lD,KAAK0lD,OACL,OAEJ1lD,KAAK0lD,QAAS,EACd,MAAMwD,EAAUlpD,KAAKkpD,QACfC,EAAYD,EAAQC,UAE1B,GADAnpD,KAAKkpD,QAAU,MACVC,GAAkC,IAArBA,EAAUroD,QAAgBooD,EAAQ7B,WAAa6B,EAAQxD,OACrE,OAEJ,MAAM0D,EAAkBD,EAAUtnD,QAAQ7B,KAAKunD,aACtB,IAArB6B,GACAD,EAAUnvC,OAAOovC,EAAiB,ICfvC,MAAM,UAA0B,EACnC,YAAY9B,GACRL,MAAMK,GACNtnD,KAAKsnD,YAAcA,GAGpB,IAAA,EAAA,YAAM+B,UAAgB,EACzB,cACIpC,QACAjnD,KAAKmpD,UAAY,GACjBnpD,KAAK0lD,QAAS,EACd1lD,KAAKqnD,WAAY,EACjBrnD,KAAKspD,UAAW,EAChBtpD,KAAKupD,YAAc,KAEvB,CAACzC,KACG,OAAO,IAAI,EAAkB9mD,MAEjC,KAAK4yB,GACD,MAAMs2B,EAAU,IAAI,EAAiBlpD,KAAMA,MAE3C,OADAkpD,EAAQt2B,SAAWA,EACZs2B,EAEX,KAAK79C,GACD,GAAIrL,KAAK0lD,OACL,MAAM,IAAIsD,EAEd,IAAKhpD,KAAKqnD,UAAW,CACjB,MAAM,UAAE8B,GAAcnpD,KAChBmD,EAAMgmD,EAAUroD,OAChBjD,EAAOsrD,EAAUjlD,QACvB,IAAK,IAAIxD,EAAI,EAAGA,EAAIyC,EAAKzC,IACrB7C,EAAK6C,GAAG46B,KAAKjwB,IAIzB,MAAMo6C,GACF,GAAIzlD,KAAK0lD,OACL,MAAM,IAAIsD,EAEdhpD,KAAKspD,UAAW,EAChBtpD,KAAKupD,YAAc9D,EACnBzlD,KAAKqnD,WAAY,EACjB,MAAM,UAAE8B,GAAcnpD,KAChBmD,EAAMgmD,EAAUroD,OAChBjD,EAAOsrD,EAAUjlD,QACvB,IAAK,IAAIxD,EAAI,EAAGA,EAAIyC,EAAKzC,IACrB7C,EAAK6C,GAAGa,MAAMkkD,GAElBzlD,KAAKmpD,UAAUroD,OAAS,EAE5B,WACI,GAAId,KAAK0lD,OACL,MAAM,IAAIsD,EAEdhpD,KAAKqnD,WAAY,EACjB,MAAM,UAAE8B,GAAcnpD,KAChBmD,EAAMgmD,EAAUroD,OAChBjD,EAAOsrD,EAAUjlD,QACvB,IAAK,IAAIxD,EAAI,EAAGA,EAAIyC,EAAKzC,IACrB7C,EAAK6C,GAAGsmD,WAEZhnD,KAAKmpD,UAAUroD,OAAS,EAE5B,cACId,KAAKqnD,WAAY,EACjBrnD,KAAK0lD,QAAS,EACd1lD,KAAKmpD,UAAY,KAErB,cAAc5B,GACV,GAAIvnD,KAAK0lD,OACL,MAAM,IAAIsD,EAGV,OAAO/B,MAAM0B,cAAcpB,GAGnC,WAAWA,GACP,GAAIvnD,KAAK0lD,OACL,MAAM,IAAIsD,EAET,OAAIhpD,KAAKspD,UACV/B,EAAWhmD,MAAMvB,KAAKupD,aACf,EAAa9C,OAEfzmD,KAAKqnD,WACVE,EAAWP,WACJ,EAAaP,QAGpBzmD,KAAKmpD,UAAU9lD,KAAKkkD,GACb,IAAI,EAAoBvnD,KAAMunD,IAG7C,eACI,MAAMU,EAAa,IAAI,EAEvB,OADAA,EAAWr6C,OAAS5N,KACbioD,UAGfoB,EAAQr+C,OAAS,CAACs8C,EAAa15C,IACpB,IAAI,EAAiB05C,EAAa15C,MA/FtC,GAiGA,MAAM,UAAyB,EAClC,YAAY05C,EAAa15C,GACrBq5C,QACAjnD,KAAKsnD,YAAcA,EACnBtnD,KAAK4N,OAASA,EAElB,KAAKvC,GACD,MAAM,YAAEi8C,GAAgBtnD,KACpBsnD,GAAeA,EAAYhsB,MAC3BgsB,EAAYhsB,KAAKjwB,GAGzB,MAAMo6C,GACF,MAAM,YAAE6B,GAAgBtnD,KACpBsnD,GAAeA,EAAY/lD,OAC3BvB,KAAKsnD,YAAY/lD,MAAMkkD,GAG/B,WACI,MAAM,YAAE6B,GAAgBtnD,KACpBsnD,GAAeA,EAAYN,UAC3BhnD,KAAKsnD,YAAYN,WAGzB,WAAWO,GACP,MAAM,OAAE35C,GAAW5N,KACnB,OAAI4N,EACO5N,KAAK4N,OAAO06C,UAAUf,GAGtB,EAAad,OC3IzB,SAAS+C,EAAYn+C,GACxB,OAAOA,GAAmC,mBAAnBA,EAAMo+C,SCA1B,SAAS,EAAIC,EAASl2C,GACzB,OAAO,SAAsB5F,GACzB,GAAuB,mBAAZ87C,EACP,MAAM,IAAI/pD,UAAU,8DAExB,OAAOiO,EAAO+7C,KAAK,IAAIC,EAAYF,EAASl2C,KAG7C,MAAMo2C,EACT,YAAYF,EAASl2C,GACjBxT,KAAK0pD,QAAUA,EACf1pD,KAAKwT,QAAUA,EAEnB,KAAK+zC,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,EAAcf,EAAYvnD,KAAK0pD,QAAS1pD,KAAKwT,WAGjF,MAAM,UAAsB,EACxB,YAAY8zC,EAAaoC,EAASl2C,GAC9ByzC,MAAMK,GACNtnD,KAAK0pD,QAAUA,EACf1pD,KAAK41B,MAAQ,EACb51B,KAAKwT,QAAUA,GAAWxT,KAE9B,MAAMqL,GACF,IAAI3D,EACJ,IACIA,EAAS1H,KAAK0pD,QAAQh2C,KAAK1T,KAAKwT,QAASnI,EAAOrL,KAAK41B,SAEzD,MAAO6vB,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3BzlD,KAAKsnD,YAAYhsB,KAAK5zB,IClCvB,MAAMmiD,EAAoBj2C,GAAW2zC,IACxC,IAAK,IAAI7mD,EAAI,EAAGyC,EAAMyQ,EAAM9S,OAAQJ,EAAIyC,IAAQokD,EAAW7B,OAAQhlD,IAC/D6mD,EAAWjsB,KAAK1nB,EAAMlT,IAE1B6mD,EAAWP,YCJR,SAAS8C,IACZ,MAAsB,mBAAXrwC,QAA0BA,OAAOW,SAGrCX,OAAOW,SAFH,aAIR,MAAM,EAAW0vC,ICNX7gC,EAAgB+hB,GAAMA,GAAyB,iBAAbA,EAAElqC,QAAoC,mBAANkqC,ECAxE,SAAS+e,EAAU1+C,GACtB,QAASA,GAAoC,mBAApBA,EAAMi9C,WAAkD,mBAAfj9C,EAAM2+C,KCQrE,MAAMC,EAAeviD,IACxB,GAAMA,GAA+C,mBAA9BA,EAAO,GAC1B,OCV8BmkC,EDUDnkC,ECVU6/C,IAC3C,MAAM2C,EAAMre,EAAI,KAChB,GAA6B,mBAAlBqe,EAAI5B,UACX,MAAM,IAAI3oD,UAAU,kEAGpB,OAAOuqD,EAAI5B,UAAUf,IDMpB,GAAIt+B,EAAYvhB,GACjB,OAAOmiD,EAAiBniD,GAEvB,GAAIqiD,EAAUriD,GACf,OEhB2ByiD,EFgBDziD,EEhBc6/C,IAC5C4C,EAAQH,KAAM3+C,IACLk8C,EAAW7B,SACZ6B,EAAWjsB,KAAKjwB,GAChBk8C,EAAWP,aAEfvB,GAAQ8B,EAAWhmD,MAAMkkD,IACxBuE,KAAK,KAAMxE,GACT+B,GFUF,GAAM7/C,GAA6C,mBAA5BA,EAAO,GAC/B,OGnB4BwoB,EHmBDxoB,EGnBe6/C,IAC9C,MAAMntC,EAAW8V,EAAS,KAC1B,OAAG,CACC,IAAI+vB,EACJ,IACIA,EAAO7lC,EAASkhB,OAEpB,MAAOmqB,GAEH,OADA8B,EAAWhmD,MAAMkkD,GACV8B,EAEX,GAAItH,EAAK1kB,KAAM,CACXgsB,EAAWP,WACX,MAGJ,GADAO,EAAWjsB,KAAK2kB,EAAK50C,OACjBk8C,EAAW7B,OACX,MAUR,MAP+B,mBAApBtrC,EAASgwC,QAChB7C,EAAWroC,IAAI,KACP9E,EAASgwC,QACThwC,EAASgwC,WAId7C,GHNF,CACD,MAAMl8C,EAAQhB,EAAS3C,GAAU,oBAAsB,IAAIA,KAG3D,MAAM,IAAI/H,UAFE,gBAAgB0L,8FGvBD,IAAC6kB,EDADi6B,EDAGte,GGC/B,SAASwe,EAAczoC,EAAO0oC,GACjC,OAAO,IAAI,EAAW/C,IAClB,MAAMjB,EAAM,IAAI,EAChB,IAAI5lD,EAAI,EAWR,OAVA4lD,EAAIpnC,IAAIorC,EAAUb,UAAAA,WACV/oD,IAAMkhB,EAAM9gB,QAIhBymD,EAAWjsB,KAAK1Z,EAAMlhB,MACjB6mD,EAAW7B,QACZY,EAAIpnC,IAAIlf,KAAKypD,aALblC,EAAWP,eAQZV,ICbR,SAAS,EAAK1kC,EAAO0oC,GACxB,OAAKA,ECIF,SAAmB1oC,EAAO0oC,GAC7B,GAAa,MAAT1oC,EAAe,CACf,GCTD,SAA6BA,GAChC,OAAOA,GAA6C,mBAA7BA,EAAM,GAD1B,CDSyBA,GACpB,OERL,SAA4BA,EAAO0oC,GACtC,OAAO,IAAI,EAAW/C,IAClB,MAAMjB,EAAM,IAAI,EAShB,OARAA,EAAIpnC,IAAIorC,EAAUb,SAAS,KACvB,MAAMxB,EAAarmC,EAAM,KACzB0kC,EAAIpnC,IAAI+oC,EAAWK,UAAU,CACzB,KAAKj9C,GAASi7C,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAMlC,EAAWjsB,KAAKjwB,MAC/D,MAAMo6C,GAAOa,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAMlC,EAAWhmD,MAAMkkD,MAC/D,WAAaa,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAMlC,EAAWP,oBAG1DV,IAXR,CFQ+B1kC,EAAO0oC,GAEhC,GAAIP,EAAUnoC,GACf,OGZL,SAAyBA,EAAO0oC,GACnC,OAAO,IAAI,EAAW/C,IAClB,MAAMjB,EAAM,IAAI,EAShB,OARAA,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAM7nC,EAAMooC,KAAK3+C,IACxCi7C,EAAIpnC,IAAIorC,EAAUb,SAAS,KACvBlC,EAAWjsB,KAAKjwB,GAChBi7C,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAMlC,EAAWP,iBAEjDvB,IACCa,EAAIpnC,IAAIorC,EAAUb,SAAS,IAAMlC,EAAWhmD,MAAMkkD,SAE/Ca,IAXR,CHY4B1kC,EAAO0oC,GAE7B,GAAIrhC,EAAYrH,GACjB,OAAOyoC,EAAczoC,EAAO0oC,GAE3B,GIlBN,SAAoB1oC,GACvB,OAAOA,GAA2C,mBAA3BA,EAAM,GAD1B,CJkBqBA,IAA2B,iBAAVA,EACjC,OKjBL,SAA0BA,EAAO0oC,GACpC,IAAK1oC,EACD,MAAM,IAAInb,MAAM,2BAEpB,OAAO,IAAI,EAAW8gD,IAClB,MAAMjB,EAAM,IAAI,EAChB,IAAIlsC,EAgCJ,OA/BAksC,EAAIpnC,IAAI,KACA9E,GAAuC,mBAApBA,EAASgwC,QAC5BhwC,EAASgwC,WAGjB9D,EAAIpnC,IAAIorC,EAAUb,SAAS,KACvBrvC,EAAWwH,EAAM,KACjB0kC,EAAIpnC,IAAIorC,EAAUb,UAAAA,WACd,GAAIlC,EAAW7B,OACX,OAEJ,IAAIr6C,EACAkwB,EACJ,IACI,MAAM7zB,EAAS0S,EAASkhB,OACxBjwB,EAAQ3D,EAAO2D,MACfkwB,EAAO7zB,EAAO6zB,KAElB,MAAOkqB,GAEH,YADA8B,EAAWhmD,MAAMkkD,GAGjBlqB,EACAgsB,EAAWP,YAGXO,EAAWjsB,KAAKjwB,GAChBrL,KAAKypD,mBAIVnD,IAtCR,CLiB6B1kC,EAAO0oC,GAGvC,MAAM,IAAI3qD,WAAqB,OAAViiB,UAAyBA,GAASA,GAAS,sBAf7D,CDGkBA,EAAO0oC,GANpB1oC,aAAiB,EACVA,EAEJ,IAAI,EAAWqoC,EAAYroC,IOLnC,MAAM,UAA8B,EACvC,YAAYyE,GACR4gC,QACAjnD,KAAKqmB,OAASA,EAElB,MAAMhb,GACFrL,KAAKqmB,OAAOkkC,WAAWl/C,GAE3B,OAAO9J,GACHvB,KAAKqmB,OAAOmkC,YAAYjpD,GACxBvB,KAAKgmD,cAET,YACIhmD,KAAKqmB,OAAOokC,iBACZzqD,KAAKgmD,eAsBN,MAAM,UAA8B,EACvC,WAAW0E,GACP1qD,KAAKsnD,YAAYhsB,KAAKovB,GAE1B,YAAYjF,GACRzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAE3B,iBACIzlD,KAAKsnD,YAAYN,YAclB,SAAS2D,EAAejjD,EAAQkjD,GACnC,GAAIA,EAAgBlF,OAChB,OAEJ,GAAIh+C,aAAkB,EAClB,OAAOA,EAAO4gD,UAAUsC,GAE5B,IAAIpE,EACJ,IACIA,EAAeyD,EAAYviD,EAAZuiD,CAAoBW,GAEvC,MAAOrpD,GACHqpD,EAAgBrpD,MAAMA,GAE1B,OAAOilD,ECxEJ,SAASqE,EAASnB,EAASoB,EAAgBC,EAAa9f,OAAO+f,mBAClE,MAA8B,mBAAnBF,EACCl9C,GAAWA,EAAOs6C,KAAK2C,EAAS,CAAC5rD,EAAGyB,IAAM,EAAKgpD,EAAQzqD,EAAGyB,IAAIwnD,KAAK,EAAI,CAAChpD,EAAG+rD,IAAOH,EAAe7rD,EAAGC,EAAGwB,EAAGuqD,KAAOF,KAE1F,iBAAnBD,IACZC,EAAaD,GAETl9C,GAAWA,EAAO+7C,KAAK,IAAIuB,EAAiBxB,EAASqB,KAE1D,MAAMG,EACT,YAAYxB,EAASqB,EAAa9f,OAAO+f,mBACrChrD,KAAK0pD,QAAUA,EACf1pD,KAAK+qD,WAAaA,EAEtB,KAAKnC,EAAUh7C,GACX,OAAOA,EAAO06C,UAAU,IAAI,EAAmBM,EAAU5oD,KAAK0pD,QAAS1pD,KAAK+qD,cAG7E,MAAM,UAA2B,EACpC,YAAYzD,EAAaoC,EAASqB,EAAa9f,OAAO+f,mBAClD/D,MAAMK,GACNtnD,KAAK0pD,QAAUA,EACf1pD,KAAK+qD,WAAaA,EAClB/qD,KAAKmrD,cAAe,EACpBnrD,KAAKwiB,OAAS,GACdxiB,KAAKorD,OAAS,EACdprD,KAAKgU,MAAQ,EAEjB,MAAM3I,GACErL,KAAKorD,OAASprD,KAAK+qD,WACnB/qD,KAAKqrD,SAAShgD,GAGdrL,KAAKwiB,OAAOnf,KAAKgI,GAGzB,SAASA,GACL,IAAI3D,EACJ,MAAMsM,EAAQhU,KAAKgU,QACnB,IACItM,EAAS1H,KAAK0pD,QAAQr+C,EAAO2I,GAEjC,MAAOyxC,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3BzlD,KAAKorD,SACLprD,KAAKsrD,UAAU5jD,GAEnB,UAAU6jD,GACN,MAAMX,EAAkB,IAAI,EAAsB5qD,MAC5CsnD,EAActnD,KAAKsnD,YACzBA,EAAYpoC,IAAI0rC,GAChB,MAAMY,EAAoBb,EAAeY,EAAKX,GAC1CY,IAAsBZ,GACtBtD,EAAYpoC,IAAIssC,GAGxB,YACIxrD,KAAKmrD,cAAe,EACA,IAAhBnrD,KAAKorD,QAAuC,IAAvBprD,KAAKwiB,OAAO1hB,QACjCd,KAAKsnD,YAAYN,WAErBhnD,KAAKgmD,cAET,WAAW0E,GACP1qD,KAAKsnD,YAAYhsB,KAAKovB,GAE1B,iBACI,MAAMloC,EAASxiB,KAAKwiB,OACpBxiB,KAAKorD,SACD5oC,EAAO1hB,OAAS,EAChBd,KAAKwnD,MAAMhlC,EAAOutB,SAEG,IAAhB/vC,KAAKorD,QAAgBprD,KAAKmrD,cAC/BnrD,KAAKsnD,YAAYN,YC5EtB,SAASyE,EAASV,EAAa9f,OAAO+f,mBACzC,OAAOH,EAAS,EAAUE,GCAvB,SAASW,EAAU9pC,EAAO0oC,GAC7B,OAAKA,EAIMD,EAAczoC,EAAO0oC,GAHrB,IAAI,EAAWT,EAAiBjoC,ICDxC,SAAS4a,KAASmvB,GACrB,IAAIZ,EAAa9f,OAAO+f,kBACpBV,EAAY,KACZhkC,EAAOqlC,EAAYA,EAAY7qD,OAAS,GAU5C,OATI0oD,EAAYljC,IACZgkC,EAAYqB,EAAYjoD,MACpBioD,EAAY7qD,OAAS,GAAoD,iBAAxC6qD,EAAYA,EAAY7qD,OAAS,KAClEiqD,EAAaY,EAAYjoD,QAGR,iBAAT4iB,IACZykC,EAAaY,EAAYjoD,OAEX,OAAd4mD,GAA6C,IAAvBqB,EAAY7qD,QAAgB6qD,EAAY,aAAc,EACrEA,EAAY,GAEhBF,EAASV,EAATU,CAAqBC,EAAUC,EAAarB,ICnBhD,SAASsB,KACZ,OAAO,SAAkCh+C,GACrC,OAAOA,EAAO+7C,KAAK,IAAIkC,GAAiBj+C,KAGhD,MAAMi+C,GACF,YAAYC,GACR9rD,KAAK8rD,YAAcA,EAEvB,KAAKvE,EAAY35C,GACb,MAAM,YAAEk+C,GAAgB9rD,KACxB8rD,EAAYC,YACZ,MAAMC,EAAa,IAAI,GAAmBzE,EAAYuE,GAChDtF,EAAe54C,EAAO06C,UAAU0D,GAItC,OAHKA,EAAWtG,SACZsG,EAAWC,WAAaH,EAAYI,WAEjC1F,GAGf,MAAM,WAA2B,EAC7B,YAAYc,EAAawE,GACrB7E,MAAMK,GACNtnD,KAAK8rD,YAAcA,EAEvB,eACI,MAAM,YAAEA,GAAgB9rD,KACxB,IAAK8rD,EAED,YADA9rD,KAAKisD,WAAa,MAGtBjsD,KAAK8rD,YAAc,KACnB,MAAMF,EAAWE,EAAYC,UAC7B,GAAIH,GAAY,EAEZ,YADA5rD,KAAKisD,WAAa,MAItB,GADAH,EAAYC,UAAYH,EAAW,EAC/BA,EAAW,EAEX,YADA5rD,KAAKisD,WAAa,MAGtB,MAAM,WAAEA,GAAejsD,KACjBmsD,EAAmBL,EAAYM,YACrCpsD,KAAKisD,WAAa,MACdE,GAAsBF,GAAcE,IAAqBF,GACzDE,EAAiBnG,eC1CtB,MAAM,WAA8B,EACvC,YAAYp4C,EAAQy+C,GAChBpF,QACAjnD,KAAK4N,OAASA,EACd5N,KAAKqsD,eAAiBA,EACtBrsD,KAAK+rD,UAAY,EACjB/rD,KAAKssD,aAAc,EAEvB,WAAW/E,GACP,OAAOvnD,KAAKusD,aAAajE,UAAUf,GAEvC,aACI,MAAM2B,EAAUlpD,KAAKwsD,SAIrB,OAHKtD,IAAWA,EAAQ7B,YACpBrnD,KAAKwsD,SAAWxsD,KAAKqsD,kBAElBrsD,KAAKwsD,SAEhB,UACI,IAAIP,EAAajsD,KAAKosD,YAWtB,OAVKH,IACDjsD,KAAKssD,aAAc,EACnBL,EAAajsD,KAAKosD,YAAc,IAAI,EACpCH,EAAW/sC,IAAIlf,KAAK4N,OACf06C,UAAU,IAAI,GAAsBtoD,KAAKusD,aAAcvsD,QACxDisD,EAAWvG,SACX1lD,KAAKosD,YAAc,KACnBH,EAAa,EAAaxF,QAG3BwF,EAEX,WACI,OAAO,IAAA,CAAsBjsD,OAG9B,MAAMysD,GAAkC,MAC3C,MAAMC,EAAmB,GAAsBzrD,UAC/C,MAAO,CACH2xB,SAAU,CAAEvnB,MAAO,MACnB0gD,UAAW,CAAE1gD,MAAO,EAAGE,UAAU,GACjCihD,SAAU,CAAEnhD,MAAO,KAAME,UAAU,GACnC6gD,YAAa,CAAE/gD,MAAO,KAAME,UAAU,GACtCi9C,WAAY,CAAEn9C,MAAOqhD,EAAiBlE,YACtC8D,YAAa,CAAEjhD,MAAOqhD,EAAiBJ,YAAa/gD,UAAU,GAC9DghD,WAAY,CAAElhD,MAAOqhD,EAAiBH,YACtCL,QAAS,CAAE7gD,MAAOqhD,EAAiBR,SACnCN,SAAU,CAAEvgD,MAAOqhD,EAAiBd,YAXG,GAc/C,MAAM,WAA8B,EAChC,YAAYtE,EAAawE,GACrB7E,MAAMK,GACNtnD,KAAK8rD,YAAcA,EAEvB,OAAOrG,GACHzlD,KAAKomD,eACLa,MAAMQ,OAAOhC,GAEjB,YACIzlD,KAAK8rD,YAAYQ,aAAc,EAC/BtsD,KAAKomD,eACLa,MAAMS,YAEV,eACI,MAAMoE,EAAc9rD,KAAK8rD,YACzB,GAAIA,EAAa,CACb9rD,KAAK8rD,YAAc,KACnB,MAAMG,EAAaH,EAAYM,YAC/BN,EAAYC,UAAY,EACxBD,EAAYU,SAAW,KACvBV,EAAYM,YAAc,KACtBH,GACAA,EAAWjG,gBC7EpB,SAAS2G,GAAUC,EAAyBC,GAC/C,OAAO,SAAmCj/C,GACtC,IAAIy+C,EASJ,GAPIA,EADmC,mBAA5BO,EACUA,EAGA,WACb,OAAOA,GAGS,mBAAbC,EACP,OAAOj/C,EAAO+7C,KAAK,IAAImD,GAAkBT,EAAgBQ,IAE7D,MAAMf,EAAc1sD,OAAO4L,OAAO4C,EAAQ6+C,IAG1C,OAFAX,EAAYl+C,OAASA,EACrBk+C,EAAYO,eAAiBA,EACtBP,GAGR,MAAMgB,GACT,YAAYT,EAAgBQ,GACxB7sD,KAAKqsD,eAAiBA,EACtBrsD,KAAK6sD,SAAWA,EAEpB,KAAKtF,EAAY35C,GACb,MAAM,SAAEi/C,GAAa7sD,KACfkpD,EAAUlpD,KAAKqsD,iBACf7F,EAAeqG,EAAS3D,GAASZ,UAAUf,GAEjD,OADAf,EAAatnC,IAAItR,EAAO06C,UAAUY,IAC3B1C,GC5Bf,SAASuG,KACL,OAAO,IAAI,EAER,SAASC,KACZ,OAAQp/C,GAAWg+C,IAAAA,CAAWe,GAAUI,GAAVJ,CAA+B/+C,ICkBjE,SAASq/C,GAAc16B,GACnB,MAAO,CAAExZ,SAAUwZ,GAAKxZ,WAyD5B,SAASm0C,GAAmBziD,EAAMmM,EAAOu2C,GACrC,OAAOF,GAAc,KACjB,MAAMG,EAZd,SAA0Bx2C,GACtB,OAAO,YAAiBnD,GACpB,GAAImD,EAAO,CACP,MAAM9B,EAAS8B,KAASnD,GACxB,IAAK,MAAM45C,KAAYv4C,EACnB9U,KAAKqtD,GAAYv4C,EAAOu4C,KALxC,CAY0Cz2C,GAClC,SAAS02C,KAAyB75C,GAC9B,GAAIzT,gBAAgBstD,EAEhB,OADAF,EAAS95C,MAAMtT,KAAMyT,GACdzT,KAEX,MAAMutD,EAAqB,IAAID,KAAyB75C,GAExD,OADA+5C,EAAeC,WAAaF,EACrBC,EACP,SAASA,EAAeE,EAAKC,EAAW35C,GAGpC,MAAM45C,EAAaF,EAAI10C,eA5DpB,kBA6DC00C,EAAc,eACdtuD,OAAOmb,eAAemzC,EA9DvB,iBA8DwC,CAAEriD,MAAO,KAAgB,eAGpE,KAAOuiD,EAAW9sD,QAAUkT,GACxB45C,EAAWvqD,KAAK,MAGpB,OADCuqD,EAAW55C,GAAS45C,EAAW55C,IAAU,IAAI3Q,KAAKkqD,GAC5CG,GAQf,OALIP,IACAG,EAAsBrsD,UAAY7B,OAAO4L,OAAOmiD,EAAYlsD,YAEhEqsD,EAAsBrsD,UAAU4sD,eAAiBpjD,EACjD6iD,EAAsBQ,cAAgBR,EAC/BA,IAgDf,MAYMS,GAASb,GAAmB,SARjCc,IAAAA,CAAaA,MAAAA,KAwBRC,GAAWf,GAAmB,YAgB9BgB,GAAOhB,GAAmB,QAgB1BiB,GAAWjB,GAAmB,YAmDpC,IAAIkB,GACJ,SAAWA,UAGPA,EAAYA,EAAqB,QAAI,GAAK,UAK1CA,EAAYA,EAAkB,KAAI,GAAK,OAEvCA,EAAYA,EAAkB,KAAI,GAAK,OAEvCA,EAAYA,EAAsB,SAAI,GAAK,WAE3CA,EAAYA,EAAsB,SAAI,GAAK,WAdpCA,EAAX,CAeG,IASH,SAASC,GAAuBC,GAC5B,IAAK,IAAI74C,KAAO64C,EACZ,GAAIA,EAAyB74C,KAAS44C,GAClC,OAAO54C,EAGf,MAAMhP,MAAM,qDAQhB,SAAS8nD,GAAe1qB,EAAQj2B,GAC5B,IAAK,MAAM6H,KAAO7H,EACVA,EAAOoL,eAAevD,KAASouB,EAAO7qB,eAAevD,KACrDouB,EAAOpuB,GAAO7H,EAAO6H,IA4BjC,SAAS+4C,GAAmB1iB,GACxB,MAAO,CACHkiB,MAAOliB,EAAKkiB,MAAOS,WAAY3iB,EAAK2iB,YAAc,KAAMC,QAAS5iB,EAAK4iB,QACtErjD,WAAO6K,GAQf,MAAMy4C,GAAmBH,GAqBzB,SAASI,GAAiBlvD,GACtB,MAAO,CACHgvD,QAAShvD,EAAQgvD,QAASG,UAAWnvD,EAAQmvD,WAAa,GAAInnB,QAAShoC,EAAQgoC,SAAW,IASlG,SAASonB,GAAiBxrD,GACtB,OAAOyrD,GAAiBzrD,EAAMA,EAAK0rD,MAC/BD,GAAiBzrD,EAAMA,EAAK2rD,KAapC,SAASF,GAAiBzrD,EAAMzC,GAC5B,OAAOA,GAAOA,EAAImtD,QAAU1qD,EAAOzC,EAAM,KA6C7C,SAASquD,GAAe5rD,GACpB,OAAOA,IAASA,EAAK0V,eAAem2C,KAAe7rD,EAAK0V,eAAeo2C,KACnE9rD,EAAK6rD,IACL,KAER,MAAMH,GAAcX,GAAuB,CAAEgB,WAAOhB,KAC9Cc,GAAad,GAAuB,CAAEiB,UAAMjB,KAO5CkB,GAAuBlB,GAAuB,CAAEmB,mBAAenB,KAE/DY,GAAoBZ,GAAuB,CAAEoB,gBAAiBpB,KAC9De,GAAkBf,GAAuB,CAAEqB,cAAerB,KAShE,SAASljB,GAAU6iB,GACf,GAAqB,iBAAVA,EACP,OAAOA,EAEX,GAAIp5C,MAAM4I,QAAQwwC,GACd,MAAO,IAAMA,EAAMvsD,IAAI0pC,IAAWlrC,KAAK,MAAQ,IAEnD,GAAa,MAAT+tD,EACA,MAAO,GAAKA,EAEhB,GAAIA,EAAM2B,eACN,MAAO,GAAG3B,EAAM2B,eAEpB,GAAI3B,EAAMvjD,KACN,MAAO,GAAGujD,EAAMvjD,KAEpB,MAAMxD,EAAM+mD,EAAMj1C,WAClB,GAAW,MAAP9R,EACA,MAAO,GAAKA,EAEhB,MAAM2oD,EAAe3oD,EAAIpF,QAAQ,MACjC,OAAyB,IAAlB+tD,EAAsB3oD,EAAMA,EAAIpD,UAAU,EAAG+rD,GAUxD,SAASC,GAAuBl3B,EAAQwG,GACpC,OAAkB,MAAVxG,GAA6B,KAAXA,EACX,OAAVwG,EAAiB,GAAKA,EACZ,MAATA,GAA2B,KAAVA,EAAgBxG,EAASA,EAAS,IAAMwG,EAoBnE,MAAM2wB,GAAkBzB,GAAuB,CAAEyB,gBAAiBzB,KAelE,SAAS0B,GAAWC,GAMhB,OALA,EAAoCF,gBAAkBC,GACtD,EAAoCh3C,SAAW,WAGjC,OAAOoyB,GAAUnrC,SACxB,EAkBX,SAASiwD,GAAkB3sD,GACvB,OAAO4sD,GAAa5sD,GAAQA,IAASA,EAOzC,SAAS4sD,GAAa39B,GAClB,MAAqB,mBAAPA,GAAqBA,EAAGvZ,eAAe82C,KACjDv9B,EAAGu9B,kBAAoBC,GAU/B,MAAMI,GAAqC,oBAAfC,YAA8BA,WACpDC,GAA6B,oBAAXte,QAA0BA,OAC5Cue,GAAyB,oBAATttD,MAAqD,oBAAtButD,mBACjDvtD,gBAAgButD,mBAAqBvtD,KACnCwtD,GAA6B,oBAAX3+C,QAA0BA,OAI5C4+C,GAAUN,IAAgBK,IAAYH,IAAYC,GAwDlDI,GAAcrC,GAAuB,CAAEsC,UAAMtC,KAE7CuC,GAAavC,GAAuB,CAAEwC,UAAMxC,KAE5CyC,GAAczC,GAAuB,CAAE0C,WAAO1C,KAE9C2C,GAAa3C,GAAuB,CAAE4C,UAAM5C,KAE5C6C,GAAgB7C,GAAuB,CAAE8C,UAAM9C,KAE/C+C,GAAiB/C,GAAuB,CAAEgD,UAAMhD,KAQhDiD,GAAgBjD,GAAuB,CAAEkD,kBAAmBlD,KA0HlE,MAAMmD,GAKF,YAAYC,EAAO/xD,GACfM,KAAKyxD,MAAQA,EAIbzxD,KAAK6tD,eAAiB,iBACH7tD,KAAKqvD,gBAAQn5C,EACV,iBAAXxW,EAIP,KAA4B6xD,kBAAoB7xD,OAE/BwW,IAAZxW,IACcM,KAAKqvD,WAAQb,GAAmB,CAC/CR,MAAOhuD,KACPyuD,WAAY/uD,EAAQ+uD,YAAc,OAClCC,QAAShvD,EAAQgvD,WAO7B,WAAa,MAAO,kBAAkB1uD,KAAKyxD,OAwC/C,MAAMC,GAAW,IAAIF,GAAe,YAAgC,GAI9DG,GAFsB,GAQtBC,GAAW,OAOXC,GAAYxD,GAAuB,CAAEyD,QAASp5C,OAAQq5C,SAF/C1D,KAUb,IAqBI2D,GArBAC,QAAmB/7C,EAKvB,SAASg8C,GAAmBC,GAExB,MAAMC,EAASH,GAEf,OADAA,GAAmBE,EACZC,EAkBX,SAASC,GAAwBC,GAE7B,MAAMrnC,EAAW+mC,GAEjB,OADAA,GAAwBM,EACjBrnC,EAQX,SAASsnC,GAAmBvE,EAAO/oD,EAAQmpD,GAAYoE,SACnD,QAAyBt8C,IAArB+7C,GACA,MAAM,IAAIxrD,MAAM,qDAEf,OAAyB,OAArBwrD,GACEQ,GAAmBzE,OAAO93C,EAAWjR,GAGrCgtD,GAAiBhxC,IAAI+sC,EAAO/oD,EAAQmpD,GAAYH,SAAW,UAAO/3C,EAAWjR,GAS5F,SAASytD,GAAS1E,EAAO/oD,EAAQmpD,GAAYoE,SACzC,OAAQR,IAAyBO,IAAoBtC,GAAkBjC,GAAQ/oD,GAmDnF,MAAM0tD,GAASD,GAaf,SAASD,GAAmBzE,EAAO4E,EAAe3tD,GAE9C,MAAM4tD,EAAgB/D,GAAiBd,GACvC,GAAI6E,GAA6C,QAA5BA,EAAcpE,WAC/B,YAA+Bv4C,IAAxB28C,EAAcxnD,MAAsBwnD,EAAcxnD,MAAQwnD,EAAcnE,UAC3EmE,EAAcxnD,MAEtB,GAAIpG,EAAQmpD,GAAYH,SACpB,OAAO,KACX,QAAsB/3C,IAAlB08C,EACA,OAAOA,EACX,MAAM,IAAInsD,MAAM,wBAAwB0kC,GAAU6iB,OAMtD,SAAS8E,GAAWvgD,GAEhB,MAAMkB,EAAO,GACb,IAAK,IAAI/S,EAAI,EAAGA,EAAI6R,EAAMzR,OAAQJ,IAAK,CAEnC,MAAM9C,EAAMqyD,GAAkB19C,EAAM7R,IACpC,GAAIkU,MAAM4I,QAAQ5f,GAAM,CACpB,GAAmB,IAAfA,EAAIkD,OACJ,MAAM,IAAI2F,MAAM,wCAGpB,IAAInD,OAAO4S,EAEPjR,EAAQmpD,GAAYoE,QACxB,IAAK,IAAI5hB,EAAI,EAAGA,EAAIhzC,EAAIkD,OAAQ8vC,IAAK,CAEjC,MAAMmiB,EAAOn1D,EAAIgzC,GACbmiB,aAAgB9E,IAAoC,aAAxB8E,EAAKlF,gBAAiCkF,IAAS9E,GAC3EhpD,GAASmpD,GAAYH,SAEhB8E,aAAgB5E,IAAoC,aAAxB4E,EAAKlF,gBAAiCkF,IAAS5E,GAChFlpD,GAASmpD,GAAYD,SAEhB4E,aAAgB7E,IAAgC,SAAxB6E,EAAKlF,gBAA6BkF,IAAS7E,GACxEjpD,GAASmpD,GAAYF,KAGrB5qD,EADKyvD,aAAgBhF,IAAUgF,IAAShF,GACjCgF,EAAK/E,MAGL+E,EAGft/C,EAAKpQ,KAAKqvD,GAAS,EAA2BztD,SAG9CwO,EAAKpQ,KAAKqvD,GAAS90D,IAG3B,OAAO6V,EAEX,MAAMu/C,GAMF,IAAIhF,EAAO4E,EAAgBjB,IACvB,GAAIiB,IAAkBjB,GAAoB,CAMtC,MAAMpwD,EAAQ,IAAIkF,MAAM,sCAAsC0kC,GAAU6iB,OAExE,MADAzsD,EAAMkJ,KAAO,oBACPlJ,EAEV,OAAOqxD,GAoHf,MAAMK,IAkDN,MAAMC,IAoHN,SAASC,GAAcC,EAAOjsD,GAC1B,IAAK,IAAIzG,EAAI,EAAGA,EAAI0yD,EAAMtyD,OAAQJ,IAC9ByG,EAAI9D,KAAK+vD,EAAM1yD,IA0BvB,SAAS2yD,GAAYzxC,EAAO2Q,GACxB3Q,EAAMtiB,QAAQ+L,GAASuJ,MAAM4I,QAAQnS,GAASgoD,GAAYhoD,EAAOknB,GAAMA,EAAGlnB,IAE9E,SAASioD,GAAWnsD,EAAK6M,EAAO3I,GAExB2I,GAAS7M,EAAIrG,OACbqG,EAAI9D,KAAKgI,GAGTlE,EAAI6S,OAAOhG,EAAO,EAAG3I,GAG7B,SAASkoD,GAAgBpsD,EAAK6M,GAE1B,OAAIA,GAAS7M,EAAIrG,OAAS,EACfqG,EAAIzD,MAGJyD,EAAI6S,OAAOhG,EAAO,GAAG,GAGpC,SAASw/C,GAAS57C,EAAMvM,GACpB,MAAM1K,EAAO,GACb,IAAK,IAAID,EAAI,EAAGA,EAAIkX,EAAMlX,IACtBC,EAAK0C,KAAKgI,GAEd,OAAO1K,EAkJX,SAAS8yD,GAAiBC,EAAej+C,EAAKpK,GAC1C,IAAI2I,EAAQ2/C,GAAqBD,EAAej+C,GAShD,OARIzB,GAAS,EAET0/C,EAAsB,EAAR1/C,GAAa3I,GAG3B2I,GAASA,EA/FjB,SAAsBJ,EAAOI,EAAO4/C,EAAQC,GAExC,IAAIxsD,EAAMuM,EAAM9S,OAChB,GAAIuG,GAAO2M,EAEPJ,EAAMvQ,KAAKuwD,EAAQC,QAElB,GAAY,IAARxsD,EAELuM,EAAMvQ,KAAKwwD,EAAQjgD,EAAM,IACzBA,EAAM,GAAKggD,MAEV,CAGD,IAFAvsD,IACAuM,EAAMvQ,KAAKuQ,EAAMvM,EAAM,GAAIuM,EAAMvM,IAC1BA,EAAM2M,GAETJ,EAAMvM,GAAOuM,EADOvM,EAAM,GAE1BA,IAEJuM,EAAMI,GAAS4/C,EACfhgD,EAAMI,EAAQ,GAAK6/C,GArB3B,CAgGqBH,EAAe1/C,EAAOyB,EAAKpK,IAErC2I,EASX,SAAS8/C,GAAiBJ,EAAej+C,GACrC,MAAMzB,EAAQ2/C,GAAqBD,EAAej+C,GAClD,GAAIzB,GAAS,EAET,OAAO0/C,EAAsB,EAAR1/C,GAc7B,SAAS2/C,GAAqBD,EAAej+C,GACzC,OAqCJ,SAA6B7B,EAAOvI,EAAO0kC,GAEvC,IAAIxsC,EAAQ,EACR8D,EAAMuM,EAAM9S,QAxC+B,EAyC/C,KAAOuG,IAAQ9D,GAAO,CAClB,MAAMwwD,EAASxwD,GAAU8D,EAAM9D,GAAU,GACnC8S,EAAUzC,EAAMmgD,GA3CqB,GA4C3C,GAAI1oD,IAAUgL,EACV,OAAQ09C,GA7C+B,EA+ClC19C,EAAUhL,EACfhE,EAAM0sD,EAGNxwD,EAAQwwD,EAAS,EAGzB,QAAS1sD,GAtDsC,GAqCnD,CArC+BqsD,EAAej+C,GAsE9C,MAAMu+C,GAAuB,iBAAG,CAO5BC,OAAQ,EAKRzB,QAAS,UAEbwB,EAAwBA,EAAwBC,QAAU,SAC1DD,EAAwBA,EAAwBxB,SAAW,YAf9B,GA+EvB0B,GAAmB,iBAAG,CASxBC,SAAU,EASVC,OAAQ,EAIRC,KAAM,EAQNC,UAAW,UAEfJ,EAAoBA,EAAoBC,UAAY,WACpDD,EAAoBA,EAAoBE,QAAU,SAClDF,EAAoBA,EAAoBG,MAAQ,OAChDH,EAAoBA,EAAoBI,WAAa,cAnC5B,GAiDnBC,GAAY,GAEZC,GAAc,GAiBpB,IAAIC,GAAmB,EAoBvB,SAASC,GAAkBC,GACvB,OAAO1H,GAAc,KAQjB,MAAM3pD,EAAOqxD,EAAoBrxD,KAE3BsxD,EAAgBtxD,EAAKrC,UAErB4zD,EAAiB,GAEjBh0D,EAAM,CACRyC,KAAMA,EACNwxD,kBAAmB,KACnBC,MAAOJ,EAAoBI,MAC3BC,KAAML,EAAoBK,KAC1BtG,QAAS,KACTpnB,SAAUqtB,EAAoBrtB,UAAY,KAC1C2tB,OAAQN,EAAoBM,QAAU,KACtCC,mBAAoBP,EAAoBO,mBACxCC,aAAcR,EAAoBQ,cAAgB,KAClDC,SAAUT,EAAoBS,UAAY,EAC1CC,UAAWV,EAAoBU,WAAa,KAC5CC,eAAgBX,EAAoBW,gBAAkB,KACtDT,eAAgBA,EAChBU,OAAQ,KAERC,QAAS,KAETC,SAAUd,EAAoBc,UAAY,KAC1CC,UAAW,KACXC,OAAQf,EAAcgB,UAAY,KAClCC,QAASjB,EAAckB,WAAa,KACpCC,iBAAkBnB,EAAcoB,oBAAsB,KACtDC,oBAAqBrB,EAAcsB,uBAAyB,KAC5DC,cAAevB,EAAcwB,iBAAmB,KAChDC,iBAAkBzB,EAAc0B,oBAAsB,KACtDC,UAAW3B,EAAc4B,aAAe,KACxCC,OAAQ9B,EAAoB+B,kBAAoB1C,GAAwBC,OACxE0C,cAAe,KAEfC,SAAU,KAEVC,UAAWlC,EAAoBkC,WAAarC,GAC5CsC,UAAWnC,EAAoBmC,WAAa,KAC5CC,SAA6BpC,EAA6B,UAAK,KAC/Dv1C,KAAMu1C,EAAoBv1C,MAAQ,GAGlC43C,cAAerC,EAAoBqC,eAAiB9C,GAAoBC,SACxE7lC,GAAI,IACJoe,OAAQioB,EAAoBjoB,QAAU8nB,GACtCpwD,EAAG,KACH6yD,SAAU,KACVC,QAASvC,EAAoBuC,SAAW,KACxCC,MAAO,MAGLC,EAAoCzC,EAA+B,WAEnE0C,EAAU1C,EAAoBoC,SAE9BO,EAA+B3C,EAA0B,MAsB/D,OArBA9zD,EAAIytB,IAAMmmC,KACV5zD,EAAI00D,OAASgC,GAAa5C,EAAoBY,OAAQV,GAClDh0D,EAAI20D,QAAU+B,GAAa5C,EAAoBa,SAC/C6B,GAAWA,EAAQ/3D,QAIlBizB,GAAOA,EAAG1xB,IACfA,EAAI81D,cAAgBS,EAChB,KAGiC,mBAAnBA,EAAgCA,IAAmBA,GAC5D31D,IAAI+1D,IACT,KACJ32D,EAAI+1D,SAAWU,EACX,KAG4B,mBAAdA,EAA2BA,IAAcA,GAAW71D,IAAIg2D,IACtE,KACG,IA0Bf,SAASD,GAAoBl0D,GAMzB,OAJYo0D,GAAgBp0D,IAqNhC,SAAyBA,GACrB,OAAOA,EAAKstD,KAAe,KAD/B,CArNyDttD,GAUzD,SAASm0D,GAAen0D,GAMpB,OA6MJ,SAAoBA,GAChB,OAAOA,EAAKwtD,KAAgB,KADhC,CAjN2BxtD,GAO3B,MAAMq0D,GAAyB,GAO/B,SAASC,GAAiB/2D,GAEtB,MAAMoG,EAAM,CACR3D,KAAMzC,EAAIyC,KACVu0D,UAAWh3D,EAAIg3D,WAAarD,GAC5BsD,aAAcj3D,EAAIi3D,cAAgBtD,GAClC9sB,QAAS7mC,EAAI6mC,SAAW8sB,GACxB72D,QAASkD,EAAIlD,SAAW62D,GACxBuD,wBAAyB,KACzBb,QAASr2D,EAAIq2D,SAAW,KACxB5oC,GAAIztB,EAAIytB,IAAM,MAQlB,OANc,MAAVztB,EAAIytB,IACJ2+B,GAAc,KAGN0K,GAA0C92D,EAAO,IAA2CA,EAAW,OAE5G,EAqFX,SAAS02D,GAAa1rB,EAAKmsB,GACvB,GAAW,MAAPnsB,EACA,OAAO,GAEX,MAAMosB,EAAY,GAClB,IAAK,MAAMC,KAAersB,EACtB,GAAIA,EAAI7yB,eAAek/C,GAAc,CAEjC,IAAIC,EAAgCtsB,EAAIqsB,GAEpCE,EAAeD,EACfvjD,MAAM4I,QAAQ26C,KACdC,EAAeD,EAAW,GAC1BA,EAAaA,EAAW,IAE5BF,EAAUE,GAAcD,EACpBF,IACCA,EAAUG,GAAc,GAIrC,OAAOF,EAmBX,MAAMI,GAAoB,GAmB1B,SAASC,GAAaC,GAClB,MAAO,CACHj1D,KAAMi1D,EAAQj1D,KACdmH,KAAM8tD,EAAQ9tD,KACdikD,QAAS,KACT8J,MAAuB,IAAjBD,EAAQC,KACdjC,UAAWgC,EAAQj1D,KAAKrC,UAAUu1D,aAAe,MAWzD,SAASkB,GAAgBp0D,GACrB,OAAOA,EAAKotD,KAAgB,KAwBhC,SAAS+H,GAAcn1D,EAAMo1D,GAMzB,OAJsBp1D,EAAK0V,eAAeo4C,IAInB9tD,EAAK8tD,IAAkB,KAQlD,SAASuH,GAAer1D,EAAMo1D,GAE1B,MAAME,EAAct1D,EAAK0tD,KAAe,KACxC,IAAK4H,IAAiC,IAAlBF,EAChB,MAAM,IAAIjyD,MAAM,QAAQ0kC,GAAU7nC,0CAEtC,OAAOs1D,EAipBX,SAASC,GAAQxtD,GACb,OAAOuJ,MAAM4I,QAAQnS,IAAiC,iBAAhBA,EAlG7B,GAyGb,SAASytD,GAAaztD,GAClB,OAAOuJ,MAAM4I,QAAQnS,KAA0B,IAAhBA,EA1GtB,GAgHb,SAAS0tD,GAAmBC,GACxB,OAAmD,IAA7B,EAAdA,EAAM/zD,OAMlB,SAASg0D,GAAgBD,GACrB,OAAmD,IAA7B,EAAdA,EAAM/zD,OAMlB,SAASi0D,GAAgBF,GACrB,OAAmD,IAA7B,EAAdA,EAAM/zD,OAOlB,SAASk0D,GAAet4D,GACpB,OAA+C,OAAxC,EAA2BymC,SAMtC,SAAS8xB,GAAWv1B,GAChB,OAA8C,IAAtB,IAAhBA,EAhqBE,IAw4Bd,IAAIw1B,QAAWnjD,EAmBf,SAASojD,KACL,YAAiBpjD,IAAbmjD,GACOA,GAEkB,oBAAbrnB,SACLA,cADN,EAkET,SAASunB,GAAqBC,GAC1B,QAAU,EAAsC,OA8JpD,MAOMC,GAAsB,CACxBC,eAHJ,CAACC,EAAaC,IAA0BN,MA0LxC,SAASO,GAAYxuD,GACjB,KAAOuJ,MAAM4I,QAAQnS,IACjBA,EAA2BA,EAr0CtB,GAu0CT,OAAO,EAuCX,SAASyuD,GAAiB9lD,EAAO+lD,GAC7B,OAAOF,GAAYE,EAAM/lD,EAt0CP,KAi1CtB,SAASgmD,GAAiBhB,EAAOe,GAM7B,OAFaF,GAAYE,EAAMf,EAAMhlD,QA8BzC,SAASimD,GAAS9C,EAAOnjD,GAGrB,OAA0BmjD,EAAM/3C,KAAKpL,EAt3CnB,IA+3CtB,SAASkmD,GAAK7vB,EAAMr2B,GAEhB,OAAOq2B,EAAKr2B,EAj4CM,IAw4CtB,SAASmmD,GAAyBC,EAAWC,GAIzC,MAAMC,EAAYD,EAASD,GAG3B,OADcvB,GAAQyB,GAAaA,EAAYA,EAv7CtC,GAw8Cb,SAASC,GAAiB12B,GAEtB,MAAMx4B,EAVV,SAAyBw4B,GAErB,OAAOA,EAA4B,eAAK,KAF5C,CAUkCA,GAC9B,OAAIx4B,EACOuJ,MAAM4I,QAAQnS,GAASA,EAAQ,EAA6B0uD,MAEhE,KAOX,SAASS,GAAenwB,GACpB,OAAgD,IAA1B,EAAdA,EAl9CE,IA49Cd,SAASowB,GAA6BpwB,GAClC,OAA8C,MAAxB,IAAdA,EA79CE,IA8+Cd,SAASqwB,GAAYzF,EAAQjhD,GACzB,OAAkB,OAAXihD,GAA4B,MAATjhD,EAAgB,KAA6CihD,EAAOjhD,GAOlG,SAAS2mD,GAAuBZ,GAC5BA,EAv9CwB,IAu9CK,EAoLjC,MAAMa,GAAmB,CACrBC,OAAQC,GAAa,MACrBC,iBAAiB,EACjBC,oBAAoB,GAuBxB,SAASC,KACL,OAAOL,GAAiBG,gBAoD5B,SAASG,KACL,OAAON,GAAiBC,OAAOd,MAMnC,SAASoB,KACL,OAAOP,GAAiBC,OAAO1D,MAcnC,SAASiE,GAAcC,GACnBT,GAAiBC,OAAOS,aAAe,EAK3C,SAASC,KACL,OAAOX,GAAiBC,OAAOW,sBAOnC,SAASC,GAAyBzC,EAAO0C,GACrCd,GAAiBC,OAAOW,sBAAwBxC,EAChD4B,GAAiBC,OAAOa,SAAWA,EAKvC,SAASC,KACL,OAAOf,GAAiBC,OAAOa,SAKnC,SAASE,KACLhB,GAAiBC,OAAOa,UAAW,EAiBvC,SAASG,KAEL,OAAOjB,GAAiBI,mBAM5B,SAASc,GAAsBC,GAC3BnB,GAAiBI,mBAAqBe,EAM1C,SAASC,KAEL,MAAMnB,EAASD,GAAiBC,OAEhC,IAAI7mD,EAAQ6mD,EAAOoB,iBAInB,OAHe,IAAXjoD,IACAA,EAAQ6mD,EAAOoB,iBAAmBpB,EAAO1D,MAAM+E,mBAE5CloD,EAKX,SAASmoD,KACL,OAAOvB,GAAiBC,OAAOuB,aAYnC,SAASC,KACL,OAAOzB,GAAiBC,OAAOuB,eAMnC,SAASE,GAAsB1mC,GAE3B,MAAMilC,EAASD,GAAiBC,OAE1B7mD,EAAQ6mD,EAAOuB,aAErB,OADAvB,EAAOuB,aAAevB,EAAOuB,aAAexmC,EACrC5hB,EAcX,SAASuoD,GAA8BN,EAAkBO,GAErD,MAAM3B,EAASD,GAAiBC,OAChCA,EAAOuB,aAAevB,EAAOoB,iBAAmBA,EAChDpB,EAAO2B,sBAAwBA,EAcnC,SAASC,KACL,OAAO7B,GAAiBC,OAAO6B,kBAMnC,SAASC,GAAqBtxD,GAC1BuvD,GAAiBC,OAAO6B,kBAAoBrxD,EAQhD,SAASuxD,GAAQC,EAAS7D,GAGtB,MAAM8D,EAAYC,KAClBnC,GAAiBC,OAASiC,EAC1BA,EAAUtB,sBAAwB,EAClCsB,EAAU/C,MAAQ8C,EActB,SAASG,GAAUH,EAAS7D,GAGxB,MAAM8D,EAAYC,KAcZ5F,EAAQ0F,EA18DJ,GA28DVjC,GAAiBC,OAASiC,EAC1BA,EAAUtB,sBAAwB,EAClCsB,EAAU/C,MAAQ8C,EAClBC,EAAU3F,MAAQA,EAClB2F,EAAUxB,aAAe,EACzBwB,EAAUV,aAAejF,EAAM+E,kBAMnC,SAASa,KAEL,MAAME,EAAgBrC,GAAiBC,OAEjCqC,EAAgC,OAAlBD,EAAyB,KAAOA,EAAclqB,MAGlE,OADkC,OAAhBmqB,EAAuBpC,GAAamC,GAAiBC,EAO3E,SAASpC,GAAaz0C,GAElB,MAAMw0C,EAAS,CACXW,sBAAuB,KAEvBE,UAAU,EAEV3B,MAAO,KAEP5C,MAAO,KAEPgG,cAAe,EAEf7B,aAAc,KAEd8B,kBAAmB,EAEnBC,iBAAkB,KAElBC,iBAAkB,KAElBd,uBAAwB,EAExBP,kBAAmB,EAEnBG,cAAe,EAEfM,kBAAmB,EAEnBr2C,OAAQ,EAER0sB,MAAO,MAGX,OADW,OAAX1sB,IAAoBA,EAAO0sB,MAAQ8nB,GAC5BA,EAYX,SAAS0C,KAEL,MAAMC,EAAY5C,GAAiBC,OAInC,OAHAD,GAAiBC,OAAS2C,EAAUn3C,OACpCm3C,EAAUhC,sBAAwB,KAClCgC,EAAUzD,MAAQ,KACXyD,EASX,MAAMC,GAAUF,GAUhB,SAASG,KAEL,MAAMF,EAAYD,KAClBC,EAAU9B,UAAW,EACrB8B,EAAUrG,MAAQ,KAClBqG,EAAUL,cAAgB,EAC1BK,EAAUlC,aAAe,KACzBkC,EAAUJ,kBAAoB,EAC9BI,EAAUhB,uBAAyB,EACnCgB,EAAUH,iBAAmB,KAC7BG,EAAUF,iBAAmB,KAC7BE,EAAUvB,kBAAoB,EAC9BuB,EAAUpB,cAAgB,EAC1BoB,EAAUd,kBAAoB,EAiClC,SAASiB,KACL,OAAO/C,GAAiBC,OAAOsC,cAanC,SAASS,GAAiB5pD,GACtB4mD,GAAiBC,OAAOsC,cAAgBnpD,EAM5C,SAAS6pD,KAEL,MAAMhD,EAASD,GAAiBC,OAChC,OAAOZ,GAASY,EAAO1D,MAAO0D,EAAOsC,eAwHzC,SAASW,GAAuB3G,EAAO6B,GAKnC,IAAK,IAAIt4D,EAAIs4D,EAAM+E,eAAgB12D,EAAM2xD,EAAMgF,aAAct9D,EAAI2G,EAAK3G,IAAK,CAEvE,MAAMu9D,EAAkC9G,EAAM/3C,KAAK1e,GAC/Cu9D,EAAalI,mBACZoB,EAAM+G,eAAiB/G,EAAM+G,aAAe,KAAK76D,MAAM3C,EAAGu9D,EAAalI,kBAExEkI,EAAahI,uBACZkB,EAAM+G,eAAiB/G,EAAM+G,aAAe,KAAK76D,KAAK3C,EAAGu9D,EAAahI,sBACtEkB,EAAMgH,oBAAsBhH,EAAMgH,kBAAoB,KAAK96D,KAAK3C,EAAGu9D,EAAahI,sBAEjFgI,EAAa9H,gBACZgB,EAAMiH,YAAcjH,EAAMiH,UAAY,KAAK/6D,MAAM3C,EAAGu9D,EAAa9H,eAElE8H,EAAa5H,oBACZc,EAAMiH,YAAcjH,EAAMiH,UAAY,KAAK/6D,KAAK3C,EAAGu9D,EAAa5H,mBAChEc,EAAMkH,iBAAmBlH,EAAMkH,eAAiB,KAAKh7D,KAAK3C,EAAGu9D,EAAa5H,mBAEjD,MAA1B4H,EAAa1H,YACZY,EAAMmH,eAAiBnH,EAAMmH,aAAe,KAAKj7D,KAAK3C,EAAGu9D,EAAa1H,YAqCnF,SAASgI,GAAkBxE,EAAOyE,EAAOpE,GACrCqE,GAAU1E,EAAOyE,EAAO,EAA4BpE,GAgBxD,SAASsE,GAAyB3E,EAAOyE,EAAOG,EAAWvE,IAEnC,EAAfL,EArzEK,MAqzE0C4E,GAChDF,GAAU1E,EAAOyE,EAAOG,EAAWvE,GAQ3C,SAASwE,GAAwB7E,EAAO4E,GAIpC,IAAI15D,EAAQ80D,EAl0EF,IAm0EG,EAAR90D,KAAwC05D,IACzC15D,GAAS,KACTA,GAAS,EACT80D,EAt0EM,GAs0ES90D,GAkBvB,SAASw5D,GAAUI,EAAa13D,EAAKw3D,EAAWG,GAG5C,MAIMC,EAAqC,MAApBD,EAA2BA,GAAoB,EAEtE,IAAIE,EAAqB,EACzB,IAAK,IAAIt+D,OAP+BwV,IAArB4oD,EACqB,MAAnCD,EA5zEmB,IA6zEpB,EAKqBn+D,EAAIyG,EAAIrG,OAAQJ,IAGrC,GAAoB,iBADYyG,EAAIzG,EAAI,GAAA,CAGpC,GADAs+D,EAAwC73D,EAAIzG,GACpB,MAApBo+D,GAA4BE,GAAsBF,EAClD,WAKe33D,EAAIzG,GAAK,IAExBm+D,EA/0EY,KA+0EwB,QACpCG,EAAqBD,IAAqC,GAAnBA,KACvCE,GAASJ,EAAaF,EAAWx3D,EAAKzG,GACtCm+D,EAl1EY,KAm1E4B,WAAnCA,EAn1EO,KAm1E4En+D,EAChF,GAEZA,IAaZ,SAASu+D,GAASJ,EAAaF,EAAWx3D,EAAKzG,GAE3C,MAAMw+D,EAAa/3D,EAAIzG,GAAK,EAEtBy+D,EAA0Bh4D,EAAIzG,EAAI,GAIlC0+D,EAAYP,EAFKK,GAAc/3D,EAAIzG,GAAwByG,EAAIzG,IAGjEw+D,EAE8BL,EA94ExB,IA84E8C,GAI/CA,EAl3Ee,KAk3EqB,KACf,EAArBA,EAn5EC,MAm5EoDF,IACtDE,EAp5EE,IAo5EoB,KACtBM,EAAKzrD,KAAK0rD,IAIdD,EAAKzrD,KAAK0rD,GAwIlB,MAAMC,GAMF,YAAY3Q,EAIZ4Q,EAAgBC,GACZv/D,KAAK0uD,QAAUA,EAKf1uD,KAAKw/D,WAAY,EACjBx/D,KAAKy/D,oBAAsBH,EAC3Bt/D,KAAK0/D,WAAaH,GAwL1B,SAASI,GAAgBnG,EAAUoG,EAAQC,GAEvC,MAAMC,EAASvG,GAAqBC,GAEpC,IAAI94D,EAAI,EACR,KAAOA,EAAIm/D,EAAM/+D,QAAQ,CAErB,MAAMuK,EAAQw0D,EAAMn/D,GACpB,GAAqB,iBAAV2K,EAAoB,CAG3B,GAAc,IAAVA,EACA,MAIJ3K,IAEA,MAAMq/D,EAAkCF,EAAMn/D,KAExCs/D,EAA8BH,EAAMn/D,KAEpCu/D,EAA6BJ,EAAMn/D,KAEzCo/D,EACI,EAAgCI,aAAaN,EAAQI,EAAUC,EAASF,GACxEH,EAAOO,eAAeJ,EAAcC,EAAUC,OAEjD,CAGD,MAAMD,EAAW,EAEXC,EAAUJ,IAAQn/D,GAGpB0/D,GAAgBJ,GACZF,GACA,EAAgCO,YAAYT,EAAQI,EAAUC,GAIlEH,EACI,EAAgCI,aAAaN,EAAQI,EAAU,GAC/DJ,EAAOM,aAAaF,EAAU,GAEtCt/D,KAOR,OAAOA,EASX,SAAS4/D,GAA0BC,GAC/B,OAAkB,IAAXA,GAA0C,IAAXA,GACvB,IAAXA,EAMR,SAASH,GAAgB31D,GAIrB,OAA8B,KAAvBA,EAAKyrB,WAAW,GAW3B,SAASsqC,GAAeC,EAAK5tB,GACzB,GAAY,OAARA,GAA+B,IAAfA,EAAI/xC,aAGnB,GAAY,OAAR2/D,GAA+B,IAAfA,EAAI3/D,OAEzB2/D,EAAM5tB,EAAI3uC,YAET,CAED,IAAIw8D,GAAa,EACjB,IAAK,IAAIhgE,EAAI,EAAGA,EAAImyC,EAAI/xC,OAAQJ,IAAK,CAEjC,MAAMu/C,EAAOpN,EAAInyC,GACG,iBAATu/C,EACPygB,EAAYzgB,EAGM,IAAdygB,GAMAC,GAAmBF,EAAKC,EAAW,EAA2B,MAH1C,IAAfA,GACS,IAAdA,EAEuF7tB,IAAMnyC,GAIzB,OAKpF,OAAO+/D,EAYX,SAASE,GAAmBF,EAAKF,EAAQK,EAAMC,EAAMx1D,GAEjD,IAAI3K,EAAI,EAGJogE,EAAuBL,EAAI3/D,OAE/B,IAAgB,IAAZy/D,EACAO,GAAwB,OAGxB,KAAOpgE,EAAI+/D,EAAI3/D,QAAQ,CAEnB,MAAMigE,EAAWN,EAAI//D,KACrB,GAAwB,iBAAbqgE,EAAuB,CAC9B,GAAIA,IAAaR,EAAQ,CACrBO,GAAwB,EACxB,MAEC,GAAIC,EAAWR,EAAQ,CAExBO,EAAuBpgE,EAAI,EAC3B,QAMhB,KAAOA,EAAI+/D,EAAI3/D,QAAQ,CAEnB,MAAMm/C,EAAOwgB,EAAI//D,GACjB,GAAoB,iBAATu/C,EAGP,MAEC,GAAIA,IAAS2gB,EAAM,CAEpB,GAAa,OAATC,EAIA,YAHc,OAAVx1D,IACAo1D,EAAI//D,EAAI,GAAK2K,IAIhB,GAAIw1D,IAASJ,EAAI//D,EAAI,GAEtB,YADA+/D,EAAI//D,EAAI,GAAK,GAKrBA,IACa,OAATmgE,GACAngE,IACU,OAAV2K,GACA3K,KAGsB,IAA1BogE,IACAL,EAAIzmD,OAAO8mD,EAAsB,EAAGP,GACpC7/D,EAAIogE,EAAuB,GAE/BL,EAAIzmD,OAAOtZ,IAAK,EAAGkgE,GACN,OAATC,GACAJ,EAAIzmD,OAAOtZ,IAAK,EAAGmgE,GAET,OAAVx1D,GACAo1D,EAAIzmD,OAAOtZ,IAAK,EAAG2K,GAc3B,SAAS21D,GAAkBC,GACvB,OA5fuB,IA4fhBA,EAMX,SAASC,GAAuBD,GAC5B,OAAoE,MAA7D,EAMX,SAASE,GAA4BF,GACjC,OAAO,GAA8D,GAWzE,SAASG,GAAsBC,EAAUC,GAErC,IAAIC,EAAaJ,GAA4BE,GAEzCG,EAAaF,EAKjB,KAAOC,EAAa,GAChBC,EAAgCA,EAv8Ff,IAw8FjBD,IAEJ,OAAOC,EAeX,SAASC,GAAgBp2D,GACrB,MAAqB,iBAAVA,EACAA,EACE,MAATA,EACO,GACJ,GAAKA,EAShB,SAASq2D,GAAkBr2D,GACvB,MAAqB,mBAAVA,EACAA,EAAMZ,MAAQY,EAAM0N,WACV,iBAAV1N,GAA+B,MAATA,GAAuC,mBAAfA,EAAM/H,KACpD+H,EAAM/H,KAAKmH,MAAQY,EAAM/H,KAAKyV,WAElC0oD,GAAgBp2D,GAE3B,MAOMs2D,GAJN,MAAwC,oBAA1BC,uBAAyCA,uBACnD9mD,YACF8d,KAAK63B,IAFP,GAWA,SAASoR,GAAgBptB,GACrB,MAAO,CAAEhqC,KAAM,SAAUo5B,OAAQ4Q,EAAQE,cAAcC,aAQ3D,SAASktB,GAAkBrtB,GACvB,MAAO,CAAEhqC,KAAM,WAAYo5B,OAAQ4Q,EAAQE,eAiC/C,SAASotB,GAAc12D,GACnB,OAAIA,aAAiB0G,SACV1G,IAGAA,EA8Cf,IAAI22D,IAAuB,EAK3B,SAASC,GAAwB5pB,GAE7B,MAAM6pB,EAAWF,GAEjB,OADAA,GAAuB3pB,EAChB6pB,EAeX,IAAIC,GAAkB,EAsDtB,SAASC,GAA+BpJ,EAAOqB,GAE3C,MAAMgI,EAAwBC,GAAiBtJ,EAAOqB,GACtD,IAA+B,IAA3BgI,EACA,OAAOA,EAGX,MAAMlL,EAAQkD,EA5sGJ,GA6sGNlD,EAAMoL,kBACNvJ,EAAMwJ,cAAgBnI,EAASv5D,OAC/B2hE,GAAYtL,EAAM/3C,KAAM45C,GACxByJ,GAAYpI,EAAU,MACtBoI,GAAYtL,EAAMuL,UAAW,OAGjC,MAAMC,EAAYC,GAA0B5J,EAAOqB,GAE7CmI,EAAgBxJ,EAAMwJ,cAG5B,GAAIxB,GAAkB2B,GAAY,CAE9B,MAAME,EAAc3B,GAAuByB,GAErCG,EAAc1B,GAAsBuB,EAAWtI,GAE/C0I,EAAgCD,EA/tGhC,GA+tGwD,KAG9D,IAAK,IAAIpiE,EAAI,EAAGA,EAAI,EAAGA,IACnB25D,EAASmI,EAAgB9hE,GAAKoiE,EAAYD,EAAcniE,GAAKqiE,EAAWF,EAAcniE,GAI9F,OADA25D,EAASmI,EAxzBW,GAwzBwBG,EACrCH,EAOX,SAASC,GAAYt7D,EAAK67D,GACtB77D,EAAI9D,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG2/D,GAOrC,SAASV,GAAiBtJ,EAAOqB,GAC7B,OAA6B,IAAzBrB,EAAMwJ,eAGLxJ,EAAM3yC,QAAU2yC,EAAM3yC,OAAOm8C,gBAAkBxJ,EAAMwJ,eAGH,MAAnDnI,EAASrB,EAAMwJ,cA/0BC,IAg1BR,EAGDxJ,EAAMwJ,cAYrB,SAASI,GAA0B5J,EAAO3uB,GACtC,GAAI2uB,EAAM3yC,SAA0C,IAAhC2yC,EAAM3yC,OAAOm8C,cAC7B,OAA0BxJ,EAAM3yC,OAAqB,cAMzD,IAAI48C,EAAY54B,EA3wGL,GA6wGPk3B,EAAa,EACjB,KAAO0B,IAA0C,IAA7BA,EAAUT,eAE1BS,GADA54B,EAA0BA,EA7vGT,KA8vGEA,EAhxGZ,GAgxG2B,KAClCk3B,IAEJ,OAAO0B,EACHA,EAAUT,cAAiBjB,GAAc,IACrB,EAW5B,SAAS2B,GAAmBV,EAAerL,EAAOnJ,IAjJlD,SAAkBwU,EAAerL,EAAO7zD,GAGpC,IAAIgrB,EAAqB,iBAAThrB,EAAoB,EAA4BguD,IAAiBhuD,EAAK4yB,WAAW,IAAM,EAG7F,MAAN5H,IACAA,EAAK,EAA4BgjC,IAAiB6Q,MAKtD,MAAMgB,EA3BSC,IA2BE90C,EAKX+0C,EAAO,GAAKF,EAMZG,EAAgB,GAAXH,EAELI,EAAgB,GAAXJ,EAELK,EAA2BrM,EAAW,KANtB,IAAXgM,EAQPG,EAAMC,EAAMC,EAAMhB,EAAgB,IAAMa,EAASG,EAAMhB,EAAgB,IAAMa,EACxEE,EAAMC,EAAMhB,EAAgB,IAAMa,EAASG,EAAMhB,EAAgB,IAAMa,EAG5EC,EAAMC,EAAMC,EAAMhB,EAAgB,IAAMa,EAASG,EAAMhB,EAAgB,IAAMa,EACxEE,EAAMC,EAAMhB,EAAgB,IAAMa,EAASG,EAAMhB,IAAkBa,EAlChF,CAkJab,EAAerL,EAAOnJ,GAqGnC,SAASyV,GAAsBzK,EAAOe,EAAO/L,EAAO/oD,EAAQmpD,GAAYoE,QAASI,GAC7E,GAAc,OAAVoG,EAAgB,CAEhB,MAAM0K,EAsRd,SAA+B1V,GAE3B,GAAqB,iBAAVA,EACP,OAAOA,EAAM93B,WAAW,IAAM,EAGlC,MAAMytC,EAAU,EAA6BrS,IAE7C,MAA2B,iBAAZqS,GAAwBA,EAAU,EAviBlCP,IAuiBuCO,EAAuBA,EARjF,CAtRgD3V,GAGxC,GAAyB,mBAAd0V,EAA0B,CACjC9G,GAAQ7C,EAAOf,GACf,IAEI,MAAM3tD,EAAQq4D,IACd,GAAa,MAATr4D,GAAmBpG,EAAQmpD,GAAYH,SAIvC,OAAO5iD,EAHP,MAAM,IAAI5E,MAAM,mBAAmBi7D,GAAkB1T,eAOzDyP,WAGH,GAAwB,iBAAbiG,EAAuB,CACnC,IAAmB,IAAfA,EAEA,OAAO,IAAuBE,GAAa5K,EAAOe,GAOtD,IAAI8J,EAAgB,KAEhBrB,EAAgBF,GAAiBtJ,EAAOe,GAExCkH,GAh/BW,EAk/BX6C,EAAmB7+D,EAAQmpD,GAAY2V,KAAOhK,EAx5G3B,IApBpB,GA46G2F,KAkB9F,MAduB,IAAnByI,GAAwBv9D,EAAQmpD,GAAYD,YAC5C8S,GAAoC,IAAnBuB,EAAuBI,GAA0B5J,EAAOe,GACrEA,EAAMyI,EA9gCF,GA+gCHwB,GAAmB/+D,GAAO,IAI3B4+D,EAAgB9J,EAj8GtB,GAk8GMyI,EAAgBtB,GAAuBD,GACvClH,EAAQqH,GAAsBH,EAAgBlH,IAL9CyI,GAAiB,IAUC,IAAnBA,GAAsB,CACzBvB,EAAiBlH,EAAMyI,EA3hCf,GA8hCR,MAAMrL,EAAQ4C,EA58GhB,GA68GE,GAAIkK,GAAcP,EAAWlB,EAAerL,EAAM/3C,MAAO,CAKrD,MAAM8kD,EAAWC,GAAuB3B,EAAezI,EAAO/L,EAAO6V,EAAe5+D,EAAO6+D,GAC3F,GAAII,IAAaE,GACb,OAAOF,EAGXF,GAAmB/+D,EAAO80D,EAv9GhC,GAu9G6C36C,KAAKojD,EA3iClD,KA2iC6EsB,IACvEG,GAAcP,EAAWlB,EAAezI,IAGxC8J,EAAgB1M,EAChBqL,EAAgBtB,GAAuBD,GACvClH,EAAQqH,GAAsBH,EAAgBlH,IAM9CyI,GAAiB,IASjC,GAJIv9D,EAAQmpD,GAAYH,eAA8B/3C,IAAlB08C,IAEhCA,EAAgB,MAEoC,IAAnD3tD,GAASmpD,GAAYF,KAAOE,GAAY2V,OAAc,CAEvD,MAAMM,EAAiBtK,EA99GZ,GAm+GLuK,EAA+BjS,QAAwBn8C,GAC7D,IACI,OAAImuD,EACOA,EAAepjD,IAAI+sC,EAAO4E,EAAe3tD,EAAQmpD,GAAYH,UAG7DwE,GAAmBzE,EAAO4E,EAAe3tD,EAAQmpD,GAAYH,kBAIxEoE,GAAwBiS,IAGhC,GAAIr/D,EAAQmpD,GAAYH,SACpB,OAAO2E,EAGP,MAAM,IAAInsD,MAAM,4BAA4Bi7D,GAAkB1T,OAItE,MAAMoW,GAAY,GAWlB,SAASD,GAAuB3B,EAAezI,EAAO/L,EAAO6V,EAAe5+D,EAAO6+D,GAE/E,MAAMS,EAAexK,EArhHX,GAuhHJf,EAA2BuL,EAAanlD,KAAKojD,EA3mCzC,GAooCJgC,EAAgBC,GAA0BzL,EAAOuL,EAAcvW,EArBrB,MAAjB6V,EAQ1B5K,GAAgBD,IAAUgJ,GAO1B6B,GAAiBU,GAAgC,IAAfvL,EAAM11D,KAIlB2B,EAAQmpD,GAAY2V,MAASD,IAAqB9K,GAG7E,OAAsB,OAAlBwL,EACOE,GAAkB3K,EAAOwK,EAAcC,EAAe,GAGtDJ,GAcf,SAASK,GAA0BzL,EAAO7B,EAAOnJ,EAAO2W,EAAwBC,GAE5E,MAAMC,EAAsB7L,EAAM8L,gBAE5BC,EAAe5N,EAAM/3C,KAErB4lD,EAAyC,MAAtBH,EAEnBI,EAAkBjM,EAAM+E,eAIxBmH,EAAwBL,GAAuB,GAK/CM,EAAWP,EAAoBI,EAAmBE,EAPnClM,EAAMgF,aAQ3B,IAAK,IAAIt9D,EAJaikE,EAAyBK,EAAmBA,EAAmBE,EAIzDxkE,EAAIykE,EAAUzkE,IAAK,CAE3C,MAAM0kE,EAAwCL,EAAarkE,GAC3D,GAAIA,EAAIukE,GAAmBjX,IAAUoX,GACjC1kE,GAAKukE,GAAmB,EAA0C3hE,OAAS0qD,EAC3E,OAAOttD,EAGf,GAAIkkE,EAAmB,CAEnB,MAAMS,EAA4BN,EAAaE,GAC/C,GAAII,GAAUlM,GAAekM,IAAWA,EAAO/hE,OAAS0qD,EACpD,OAAOiX,EAGf,OAAO,KAcX,SAASP,GAAkB3K,EAAO5C,EAAOnjD,EAAOglD,GAE5C,IAAI3tD,EAAQ0uD,EAAM/lD,GAElB,MAAMwvD,EAAQrM,EAAM/3C,KACpB,GAAc/T,aAl+BQg0D,GAk+BA,CAElB,MAAM3Q,EAAUrjD,EAChB,GAAIqjD,EAAQ8Q,UACR,MAAM,IAAI/4D,MAAM,oBAAoBi7D,GAAkB8B,EAAMxvD,KAGhE,MAAMsxD,EAA+BrD,GAAwBvT,EAAQ+Q,qBAGrE,IAAI6E,EAFJ5V,EAAQ8Q,WAAY,EAGhB9Q,EAAQgR,aACR4E,EAA+BjS,GAAwB3D,EAAQgR,aAEnE9C,GAAQ7C,EAAOf,GACf,IACI3tD,EAAQ0uD,EAAM/lD,GAAS06C,EAAQA,aAAQx4C,EAAWstD,EAAOzJ,EAAOf,GAO5D7B,EAAMoL,iBAAmBvuD,GAASglD,EAAM+E,gBAx8CxD,SAA+BwH,EAAgBtH,EAAc9G,GAEzD,MAAM,UAAEzB,EAAS,OAAEC,EAAM,QAAEE,GAAYoI,EACnCvI,KACCyB,EAAMqO,gBAAkBrO,EAAMqO,cAAgB,KAAKniE,KAAKkiE,EAAgB7P,IACxEyB,EAAMsO,qBAAuBtO,EAAMsO,mBAAqB,KAAKpiE,KAAKkiE,EAAgB7P,IAEnFC,IACCwB,EAAMqO,gBAAkBrO,EAAMqO,cAAgB,KAAKniE,MAAMkiE,EAAgB5P,GAE1EE,KACCsB,EAAMqO,gBAAkBrO,EAAMqO,cAAgB,KAAKniE,KAAKkiE,EAAgB1P,IACxEsB,EAAMsO,qBAAuBtO,EAAMsO,mBAAqB,KAAKpiE,KAAKkiE,EAAgB1P,IAZ3F,CA08CsC7hD,EAA0BwvD,EAAMxvD,GAAUmjD,WAIhEzI,EAAQgR,YACRrN,GAAwBiS,GAC5BrC,GAAwBqD,GACxB5W,EAAQ8Q,WAAY,EACpB/B,MAGR,OAAOpyD,EA8BX,SAAS44D,GAAcP,EAAWlB,EAAekD,GAK7C,MAIMpC,EAAiB,GAAZI,EAELH,EAAiB,GAAZG,EAKX,IAAIr4D,EAWJ,OATIA,EAXmB,IAAZq4D,EAWCJ,EAAMC,EAAKmC,EAAalD,EAAgB,GAAKkD,EAAalD,EAAgB,GAC7Ee,EAAKmC,EAAalD,EAAgB,GAAKkD,EAAalD,EAAgB,GAGjEc,EAAMC,EAAKmC,EAAalD,EAAgB,GAAKkD,EAAalD,EAAgB,GAC7Ee,EAAKmC,EAAalD,EAAgB,GAAKkD,EAAalD,MAInDn3D,EAtBG,GAAKq4D,GA8BtB,SAASM,GAAmB/+D,EAAO0gE,GAC/B,QAAS1gE,EAAQmpD,GAAYF,MAAWjpD,EAAQmpD,GAAY2V,MAAQ4B,GAExE,MAAM/B,GAKF,YAAYgC,EAAQC,GAChB7lE,KAAK4lE,OAASA,EACd5lE,KAAK6lE,OAASA,EAOlB,IAAI7X,EAAO4E,GACP,OAAO6Q,GAAsBzjE,KAAK4lE,OAAQ5lE,KAAK6lE,OAAQ7X,OAAO93C,EAAW08C,IAiDjF,SAASkT,GAAsBxiE,GAC3B,OAAO2pD,GAAc,KAKjB,MAAMpvC,EAA2Bze,OAAOya,eAAevW,EAAKrC,WAAuB,YAE7EytD,EAAU,EAA6B0C,KApCrD,SAAS2U,EAAeziE,GAEpB,MAAM0iE,EAAU,EAChB,GAAI9V,GAAa5sD,GACb,MAAO,KAKH,MAAMorD,EAAUqX,EAAe9V,GAAkB+V,IACjD,OAAOtX,EAAUA,IAAY,MAIrC,IAAIA,EAAU+J,GAAcuN,GAC5B,GAAgB,OAAZtX,EAAkB,CAElB,MAAMuX,EAAc/W,GAAe8W,GACnCtX,EAAUuX,GAAeA,EAAYvX,QAEzC,OAAOA,GAAW,KApBtB,CAoCuF7wC,GAC/E,OAAgB,OAAZ6wC,EACOA,EAWNvvD,GAAM,IAAIA,IAuCvB,SAAS+mE,GAAgB3kE,GACrB,OAAO,EAAgD,eAM3D,SAAS4kE,GAAiB5kE,GACtB,OAAO,EAAiD,gBAc5D,SAAS6kE,GAAmB9kE,KAAYwT,GAChBxT,EAAe,SAAKwT,GAiC5C,MAAMuxD,GACF,cAIIrmE,KAAKsmE,SAAWhlE,QAMpB,YAAYC,GAER,MAAMglE,EAAgBvmE,KAAKwmE,mBAAmBjlE,GAExC+W,EAAUtY,KAAKymE,aAAallE,GAI5BmlE,EA7Dd,SAAwBnlE,GACpB,OAAO,EAAyC,eAAK6kE,GADzD,CA6D2C7kE,GACnCmlE,EAAY1mE,KAAKsmE,SAAU,QAAS/kE,GAChCglE,GACAG,EAAY1mE,KAAKsmE,SAAU,iBAAkBC,GAE7CjuD,GACAouD,EAAY1mE,KAAKsmE,SAAU,gBAAiBhuD,GAQpD,aAAa/W,GACT,OAAIA,EACO2kE,GAAgB3kE,GAAS2kE,GAAgB3kE,GAC5CvB,KAAKymE,aAAaN,GAAiB5kE,IAEpC,KAOX,mBAAmBA,GAEf,IAAIkR,EAAI0zD,GAAiB5kE,GACzB,KAAOkR,GAAK0zD,GAAiB1zD,IACzBA,EAAI0zD,GAAiB1zD,GAEzB,OAAOA,GA6Hf,MAAMk0D,GAIF,YAAYC,GACR5mE,KAAK4mE,sCAAwCA,EAKjD,WACI,MAAO,0CAA0C5mE,KAAK4mE,sCAClD,sCAYZ,MAAMC,WAAqBF,GAIvB,cAAgB,MAAO,QAE3B,MAAMG,WAAsBH,GAIxB,cAAgB,MAAO,SAE3B,MAAMI,WAAuBJ,GAIzB,cAAgB,MAAO,UAE3B,MAAMK,WAAoBL,GAItB,cAAgB,MAAO,OAE3B,MAAMM,WAA4BN,GAI9B,cAAgB,MAAO,eAO3B,SAASO,GAAgB77D,GACrB,OAAOA,aAAiBs7D,GAAsDt7D,EAA8C,sCACxH,EAOR,SAAS87D,GAAgC97D,EAAO/H,GAE5C,MAAM8jE,EAAaC,GAA0Bh8D,GAC7C,GAAkB,MAAd+7D,GAAsBA,IAAe9jE,EAAM,CAE3C,GAAmB,gBAAf8jE,GAA2D,QAAT9jE,EAClD,OAAO,EACX,MAAM,IAAImD,MAAM,mBAAmBnD,YAAe8jE,uCAEtD,OAAOA,IAAe9jE,EAM1B,SAAS+jE,GAA0Bh8D,GAC/B,OAAOA,aAAiBs7D,IAAoCt7D,EAAMi8D,eAAmB,KA4EzF,IAAIC,IAAW,EACXC,IAAiB,EASrB,SAASC,KAEL,OADAD,IAAiB,EACVD,GAuCX,MAAMG,GAIF,YAAYC,GACR3nE,KAAK2nE,WAAaA,EAClB3nE,KAAK4nE,cAAgB5nE,KAAK2nE,WAAWE,eAAeC,mBAAmB,sBAEvE,IAAIC,EAAmB/nE,KAAK4nE,cAAcr4B,KAC1C,GAAwB,MAApBw4B,EAA0B,CAI1B,MAAMC,EAAYhoE,KAAK4nE,cAAcx1B,cAAc,QACnDpyC,KAAK4nE,cAAcK,YAAYD,GAC/BD,EAAmB/nE,KAAK4nE,cAAcx1B,cAAc,QACpD41B,EAAUC,YAAYF,GAE1BA,EAAiBG,UAAY,wDACzBH,EAAiBI,eAAkBJ,EAAiBI,cAAc,QAMtEJ,EAAiBG,UAAY,mEAOrBloE,KAAKooE,oBANTL,EAAiBI,eAAiBJ,EAAiBI,cAAc,YAiK7E,WACI,IACI,QAAS,OAA8BE,UAE3C,MAAOC,GACH,OAAO,GALf,GA3J2CtoE,KAAKuoE,8BAKbvoE,KAAKwoE,mCAf5BxoE,KAAKooE,oBAAsBpoE,KAAKyoE,wBAyBxC,wBAAwBC,GAIpBA,EAAO,0BAA4BA,EAAO,UAC1C,IACIA,EAAOC,UAAUD,GAErB,MAAOJ,GACH,OAAO,KAGX,MAAMM,EAAM,IAAIC,eAChBD,EAAIE,aAAe,WACnBF,EAAIpqE,KAAK,MAAO,gCAAkCkqE,GAAM,GACxDE,EAAIG,UAAK7yD,GAET,MAAMq5B,EAAOq5B,EAAII,SAASz5B,KAE1B,OADAA,EAAK05B,YAA+B15B,EAAgB,YAC7CA,EAUX,8BAA8Bm5B,GAI1BA,EAAO,0BAA4BA,EAAO,UAC1C,IAEI,MAAMn5B,GAAAA,IAA8B,OAC/B84B,WACAa,gBAAgBR,EAAM,aACjB,KAEV,OADAn5B,EAAK05B,YAA+B15B,EAAgB,YAC7CA,EAEX,MAAO+4B,GACH,OAAO,MAYf,kCAAkCI,GAG9B,MAAMS,EAAanpE,KAAK4nE,cAAcx1B,cAAc,YACpD,GAAI,YAAa+2B,EAEb,OADAA,EAAWjB,UAAYQ,EAChBS,EAUX,MAAMC,EAAYppE,KAAK4nE,cAAcx1B,cAAc,QAOnD,OANAg3B,EAAUlB,UAAYQ,EAGE1oE,KAAiB,WAAEqpE,cACvCrpE,KAAKspE,mBAAmBF,GAErBA,EAaX,mBAAmBz4B,GAEf,MAAM44B,EAAU54B,EAAG64B,WAEnB,IAAK,IAAI9oE,EAAI6oE,EAAQzoE,OAAS,EAAG,EAAIJ,EAAGA,IAAK,CAEzC,MAEMs/D,EAFSuJ,EAAQtpB,KAAKv/C,GAEiB+J,KAC5B,cAAbu1D,GAAyD,IAA7BA,EAASn+D,QAAQ,SAC7C8uC,EAAG84B,gBAAgBzJ,GAI3B,IAAI0J,EAA+B/4B,EAAc,WACjD,KAAO+4B,GACCA,EAAUz3D,WAAa03D,KAAKC,cAC5B5pE,KAAKspE,mBAAmB,GAC5BI,EAAYA,EAAUG,aAuElC,MAAMC,GAAmB,8DAQnBC,GAAmB,uIAKzB,SAASC,GAAaC,GAElB,OADAA,EAAMvxD,OAAOuxD,IACLlqE,MAAM+pE,KAAqBG,EAAIlqE,MAAMgqE,IAClCE,GACPxC,MACAnmE,QAAQoxC,KAAK,wCAAwCu3B,uCAElD,UAAYA,GAwBvB,SAASC,GAAOC,GAEZ,MAAMljE,EAAM,GACZ,IAAK,MAAM9H,KAAKgrE,EAAKxrE,MAAM,KACvBsI,EAAI9H,IAAK,EACb,OAAO8H,EAMX,SAAS,MAASmjE,GAEd,MAAMnjE,EAAM,GACZ,IAAK,MAAMvF,KAAK0oE,EACZ,IAAK,MAAM/xB,KAAK32C,EACRA,EAAEsX,eAAeq/B,KACjBpxC,EAAIoxC,IAAK,GAGrB,OAAOpxC,EAQX,MAAMojE,GAAgBH,GAAO,0BAIvBI,GAAkCJ,GAAO,kDAEzCK,GAAmCL,GAAO,SAE1CM,GAA4B,GAAMD,GAAkCD,IAYpEG,GAAiB,GAAMJ,GATN,GAAMC,GAAiCJ,GAAO,oMAK7C,GAAMK,GAAkCL,GAAO,+LAIMM,IAGvEE,GAAYR,GAAO,gEAGnBS,GAAeT,GAAO,UAuBtBU,GAAc,GAAMF,GAAWC,GArBlBT,GAAO,idAOPA,GAAO,6qBAqBpBW,GAA8CX,GAAO,yBAK3D,MAAMY,GACF,cAGI9qE,KAAK+qE,oBAAqB,EAC1B/qE,KAAKgrE,IAAM,GAMf,iBAAiBr6B,GAKb,IAAIt6B,EAA6Bs6B,EAAc,WAE3Cs6B,GAAkB,EACtB,KAAO50D,GAWH,GAVIA,EAAQpE,WAAa03D,KAAKC,aAC1BqB,EAAkBjrE,KAAKkrE,aAAa,GAE/B70D,EAAQpE,WAAa03D,KAAKwB,UAC/BnrE,KAAKizB,MAAyB5c,EAAkB,WAIhDrW,KAAK+qE,oBAAqB,EAE1BE,GAAmB50D,EAAQ+0D,WAC3B/0D,EAA6BA,EAAmB,gBAGpD,KAAOA,GAAS,CAERA,EAAQpE,WAAa03D,KAAKC,cAC1B5pE,KAAKqrE,WAAW,GAGpB,IAAI/vC,EAAOt7B,KAAKsrE,sBAAsBj1D,EAA4BA,EAAoB,aACtF,GAAIilB,EAAM,CACNjlB,EAAUilB,EACV,MAEJjlB,EAAUrW,KAAKsrE,sBAAsBj1D,EAA4BA,EAAmB,YAG5F,OAAOrW,KAAKgrE,IAAI/qE,KAAK,IAWzB,aAAaw0C,GAET,MAAM82B,EAAU92B,EAAQ+2B,SAAShlE,cACjC,IAAKikE,GAAezxD,eAAeuyD,GAE/B,OADAvrE,KAAK+qE,oBAAqB,GAClBF,GAA4C7xD,eAAeuyD,GAEvEvrE,KAAKgrE,IAAI3nE,KAAK,KACdrD,KAAKgrE,IAAI3nE,KAAKkoE,GAEd,MAAMhC,EAAU90B,EAAQ+0B,WACxB,IAAK,IAAI9oE,EAAI,EAAGA,EAAI6oE,EAAQzoE,OAAQJ,IAAK,CAErC,MAAM+qE,EAASlC,EAAQtpB,KAAKv/C,GAEtBs/D,EAAW,EAA4Bv1D,KAEvC0W,EAAQ6+C,EAASx5D,cACvB,IAAKokE,GAAY5xD,eAAemI,GAAQ,CACpCnhB,KAAK+qE,oBAAqB,EAC1B,SAGJ,IAAI1/D,EAAQ,EAA4BA,MAEpCq/D,GAAUvpD,KACV9V,EAAQ2+D,GAAa3+D,IACrBs/D,GAAaxpD,KAjMLuqD,EAkMergE,EAAvBA,GAjMZqgE,EAAShzD,OAAOgzD,IACF/sE,MAAM,KAAK8C,IAIxBiqE,GAAW1B,GAAa0B,EAAO5rE,SAAUG,KAAK,OA6LvCD,KAAKgrE,IAAI3nE,KAAK,IAAK28D,EAAU,KAAM2L,GAAetgE,GAAQ,KAnMtE,IAAwBqgE,EAsMhB,OADA1rE,KAAKgrE,IAAI3nE,KAAK,MACP,EAOX,WAAWgT,GAEP,MAAMk1D,EAAUl1D,EAAQm1D,SAAShlE,cAC7BikE,GAAezxD,eAAeuyD,KAAalB,GAAcrxD,eAAeuyD,KACxEvrE,KAAKgrE,IAAI3nE,KAAK,MACdrD,KAAKgrE,IAAI3nE,KAAKkoE,GACdvrE,KAAKgrE,IAAI3nE,KAAK,MAQtB,MAAM4vB,GAASjzB,KAAKgrE,IAAI3nE,KAAKsoE,GAAe14C,IAM5C,sBAAsB6gB,EAAM83B,GACxB,GAAIA,IACC93B,EAAK+3B,wBAAwBD,GAC1BjC,KAAKmC,kCAAoCnC,KAAKmC,+BAClD,MAAM,IAAIrlE,MAAM,6DAA6D,EAA4BslE,WAE7G,OAAOH,GAcf,MAAMI,GAAwB,kCAGxBC,GAA0B,gBAQhC,SAASN,GAAetgE,GACpB,OAAOA,EAAMlH,QAAQ,KAAM,SACtBA,QAAQ6nE,IAAAA,SAIHjsE,GAKN,MAAO,MAAyB,MAHrBA,EAAMm2B,WAAW,GAGN,QADVn2B,EAAMm2B,WAAW,GACmB,OAAU,OAAW,OAEpE/xB,QAAQ8nE,IAAAA,SAIHlsE,GAAS,MAAO,KAAOA,EAAMm2B,WAAW,GAAK,OAClD/xB,QAAQ,KAAM,QACdA,QAAQ,KAAM,QAGvB,IAAI+nE,GAQJ,SAASC,GAAcxE,EAAYyE,GAE/B,IAAIrE,EAAmB,KACvB,IACImE,GAAkBA,IAAmB,IAAIxE,GAAgBC,GAGzD,IAAI0E,EAAaD,EAAkB1zD,OAAO0zD,GAAmB,GAC7DrE,EAAmBmE,GAAgB9D,oBAAoBiE,GAIvD,IAAIC,EAAe,EAEfC,EAAaF,EACjB,EAAG,CACC,GAAqB,IAAjBC,EACA,MAAM,IAAI7lE,MAAM,yDAEpB6lE,IACAD,EAAaE,EACbA,EAAa,EAAsCrE,UACnDH,EAAmBmE,GAAgB9D,oBAAoBiE,SAClDA,IAAeE,GAExB,MAAMC,EAAY,IAAI1B,GAEhB2B,EAAWD,EAAUE,iBAAoCC,GAAmB,IAA4C5E,GAI9H,OAHIN,MAAe+E,EAAUzB,oBACzBzpE,QAAQoxC,KAAK,mFAEV+5B,UAIP,GAAI1E,EAAkB,CAElB,MAAM1hD,EAASsmD,GAAmB5E,IAAqBA,EACvD,KAAO1hD,EAAO+kD,YACV/kD,EAAO4iD,YAAY5iD,EAAO+kD,cAS1C,SAASuB,GAAmBh8B,GACxB,MAAO,YAAa,GAQxB,SAA2BA,GACvB,OAAOA,EAAG1+B,WAAa03D,KAAKC,cAAgC,aAAhBj5B,EAAG66B,SADnD,CARuE76B,GAC/DA,EAAGi8B,QACH,KAuBR,MAAMC,GAAe,iBAAG,CACpBC,KAAM,EACNC,KAAM,EACNC,MAAO,EACPC,OAAQ,EACRC,IAAK,EACLC,aAAc,UAElBN,EAAgBA,EAAgBC,MAAQ,OACxCD,EAAgBA,EAAgBE,MAAQ,OACxCF,EAAgBA,EAAgBG,OAAS,QACzCH,EAAgBA,EAAgBI,QAAU,SAC1CJ,EAAgBA,EAAgBK,KAAO,MACvCL,EAAgBA,EAAgBM,cAAgB,iBAb3B,GA+CfC,GAAmB,IAAItpE,OAAO,oMAEhB,KAoBdupE,GAAS,mBAkCf,SAASC,GAAejiE,GAEpB,KADAA,EAAQqN,OAAOrN,GAAOvL,QAElB,MAAO,GAIX,MAAMytE,EAAWliE,EAAMtL,MAAMstE,IAC7B,OAAKE,GAAYvD,GAAauD,EAAS,MAAQA,EAAS,IACpDliE,EAAMtL,MAAMqtE,KAhCpB,SAA2B/hE,GAEvB,IAAImiE,GAAgB,EAEhBC,GAAgB,EACpB,IAAK,IAAI/sE,EAAI,EAAGA,EAAI2K,EAAMvK,OAAQJ,IAAK,CAEnC,MAAM5B,EAAIuM,EAAMxL,OAAOa,GACb,MAAN5B,GAAc2uE,EACdD,GAAiBA,EAEN,MAAN1uE,GAAa0uE,IAClBC,GAAiBA,GAGzB,OAAOD,GAAiBC,EAf5B,CAgC2DpiE,GAC5CA,GAEPo8D,MACAnmE,QAAQoxC,KAAK,0CAA0CrnC,wCAEpD,UAyCX,SAASqiE,GAAerB,GAEpB,MAAMG,EAAYmB,KAClB,OAAInB,EACOA,EAAUoB,SAASf,GAAgBE,KAAMV,IAAe,GAE/DlF,GAAgCkF,EAAY,QACrCnF,GAAgBmF,GAEpBF,GAAc7S,KAAemI,GAAgB4K,IA4CxD,SAASwB,GAAcC,GAEnB,MAAMtB,EAAYmB,KAClB,OAAInB,EACOA,EAAUoB,SAASf,GAAgBK,IAAKY,IAAc,GAE7D3G,GAAgC2G,EAAW,OACpC5G,GAAgB4G,GAEpB9D,GAAavI,GAAgBqM,IA4JxC,SAASH,KAEL,MAAM5T,EAAQmB,KACd,OAAOnB,GAASA,EAluKF,IA09KlB,SAASgU,GAAgBlqC,EAAQzkB,GAC7BykB,EAA4B,cAAIzkB,EAkMpC,SAAS4uD,GAA4BhV,GACjC,MAAM,IAAIvyD,MAAM,+CAA+CuyD,EAAMuS,SAKzE,SAAS0C,KACL,MAAM,IAAIxnE,MAAM,oDAu6BpB,SAASynE,GAAaC,EAAWC,EAAeC,GAG5C,IAAIhnE,EAAM8mE,EAAUrtE,OACpB,OAAa,CAET,MAAMwtE,EAAaH,EAAUtsE,QAAQusE,EAAeC,GACpD,IAAoB,IAAhBC,EACA,OAAOA,EACX,GAAmB,IAAfA,GAAoBH,EAAUj4C,WAAWo4C,EAAa,IAAM,GAAgB,CAG5E,MAAMxtE,EAASstE,EAActtE,OAC7B,GAAIwtE,EAAaxtE,IAAWuG,GACxB8mE,EAAUj4C,WAAWo4C,EAAaxtE,IAAW,GAE7C,OAAOwtE,EAIfD,EAAgBC,EAAa,GAsBrC,SAASC,GAAmB1O,EAAO2O,EAAiBC,GAQhD,IAAI/tE,EAAI,EACR,KAAOA,EAAIm/D,EAAM/+D,QAAQ,CAErB,IAAIm/C,EAAO4f,EAAMn/D,KACjB,GAAI+tE,GAA6B,UAATxuB,EAAAA,CAEpB,GADAA,EAA0B4f,EAAMn/D,IAC8B,IAA1DwtE,GAAajuB,EAAKz5C,cAAegoE,EAAiB,GAClD,OAAO,OAGV,GAAa,IAATvuB,EAA0B,CAE/B,KAAOv/C,EAAIm/D,EAAM/+D,QAAwC,iBAAtBm/C,EAAO4f,EAAMn/D,OAE5C,GAAIu/C,EAAKz5C,gBAAkBgoE,EACvB,OAAO,EAEf,OAAO,GAGf,OAAO,EAiBX,SAASE,GAAmB1V,EAAO2V,EAAiBF,GAKhD,OAAOE,KAHiC,IAAf3V,EAAM11D,MAA+BmrE,EAE1DzV,EAAMuS,QA3De,eAuE7B,SAASqD,GAAuB5V,EAAOnM,EAAU4hB,GAG7C,IAAI1S,EAAO,EAEX,MAAM8S,EAAY7V,EAAM6G,OAAS,GAG3BiP,EA2MV,SAAgCD,GAC5B,IAAK,IAAInuE,EAAI,EAAGA,EAAImuE,EAAU/tE,OAAQJ,IAGlC,GAAI4/D,GADauO,EAAUnuE,IAEvB,OAAOA,EAGf,OAAOmuE,EAAU/tE,OARrB,CA3MqD+tE,GAIjD,IAAIE,GAAqB,EACzB,IAAK,IAAIruE,EAAI,EAAGA,EAAImsD,EAAS/rD,OAAQJ,IAAK,CAEtC,MAAM2V,EAAUw2C,EAASnsD,GACzB,GAAuB,iBAAZ2V,EAAAA,CAaX,IAAI04D,EAEJ,GAAW,EAAPhT,EAAAA,CAEA,GADAA,EAAO,EAA2B,EAAPA,EACX,KAAZ1lD,IAAmBq4D,GAAmB1V,EAAO3iD,EAASo4D,IAC1C,KAAZp4D,GAAsC,IAApBw2C,EAAS/rD,OAAc,CACzC,GAAIkuE,GAAWjT,GACX,OAAO,EACXgT,GAAqB,OAGxB,CAED,MAAME,EAA2B,EAAPlT,EAAuB1lD,EAAUw2C,IAAWnsD,GAGtE,GAAY,EAAPq7D,GAAyC,OAAhB/C,EAAM6G,MAAgB,CAChD,IAAK0O,GAAmBvV,EAAM6G,MAAO,EAAwC4O,GAAmB,CAC5F,GAAIO,GAAWjT,GACX,OAAO,EACXgT,GAAqB,EAEzB,SAGJ,MAIMG,EAAkBC,GAFC,EAAPpT,EAAwB,QAAU1lD,EAEEw4D,EAJf,GAAd7V,EAAM11D,MA7Hd,gBA6H2C01D,EAAMuS,QAIiBkD,GACnF,IAAyB,IAArBS,EAAwB,CACxB,GAAIF,GAAWjT,GACX,OAAO,EACXgT,GAAqB,EACrB,SAEJ,GAA0B,KAAtBE,EAA0B,CAE1B,IAAIG,EAEAA,EADAF,EAAkBJ,EACF,GAOoBD,EAAUK,EAAkB,GAAM1oE,cAG1E,MAAM6oE,EAAiC,EAAPtT,EAAuBqT,EAAgB,KACvE,GAAIC,IACsF,IAAtFnB,GAAamB,EAAyB,EAAwC,IACvE,EAAPtT,GAA4BkT,IAAsBG,EAAe,CACjE,GAAIJ,GAAWjT,GACX,OAAO,EACXgT,GAAqB,SArEjC,CAEI,IAAKA,IAAuBC,GAAWjT,KAAUiT,GAAW34D,GACxD,OAAO,EAIX,GAAI04D,GAAsBC,GAAW34D,GACjC,SACJ04D,GAAqB,EACrBhT,EAAO,EAAyC,EAAPA,GAgEjD,OAAOiT,GAAWjT,IAASgT,EAM/B,SAASC,GAAWjT,GAChB,OAAgC,IAAjB,EAAPA,GAgCZ,SAASoT,GAAoB1kE,EAAMo1D,EAAOyP,EAAkBb,GACxD,GAAc,OAAV5O,EACA,OAAQ,EAEZ,IAAIn/D,EAAI,EACR,GAAI+tE,IAAqBa,EAAkB,CAEvC,IAAIC,GAAe,EACnB,KAAO7uE,EAAIm/D,EAAM/+D,QAAQ,CAErB,MAAM0uE,EAAgB3P,EAAMn/D,GAC5B,GAAI8uE,IAAkB/kE,EAClB,OAAO/J,EAEN,GAAsB,IAAlB8uE,GAAwD,IAAlBA,EAC3CD,GAAe,MAEd,CAAA,GAAsB,IAAlBC,GAAuD,IAAlBA,EAAkC,CAE5E,IAAInkE,EAAQw0D,IAAQn/D,GAGpB,KAAwB,iBAAV2K,GACVA,EAAQw0D,IAAQn/D,GAEpB,SAEC,GAAsB,IAAlB8uE,EAEL,MAEC,GAAsB,IAAlBA,EAAwC,CAE7C9uE,GAAK,EACL,UAGJA,GAAK6uE,EAAe,EAAI,EAG5B,OAAQ,EAGR,OAsDR,SAAgC1P,EAAOp1D,GAEnC,IAAI/J,EAAIm/D,EAAMh+D,QAAQ,GACtB,GAAInB,GAAK,EAEL,IADAA,IACOA,EAAIm/D,EAAM/+D,QAAQ,CACrB,GAAI++D,EAAMn/D,KAAO+J,EACb,OAAO/J,EACXA,IAGR,OAAQ,EAXZ,CAtDsCm/D,EAAOp1D,GAS7C,SAASglE,GAA2BzW,EAAOnM,EAAU4hB,GAAmB,GACpE,IAAK,IAAI/tE,EAAI,EAAGA,EAAImsD,EAAS/rD,OAAQJ,IACjC,GAAIkuE,GAAuB5V,EAAOnM,EAASnsD,GAAI+tE,GAC3C,OAAO,EAGf,OAAO,EA0DX,SAASiB,GAAyB7iB,EAAUlsD,GACxCgvE,EAAkB,IAAK,IAAIjvE,EAAI,EAAGA,EAAIC,EAAKG,OAAQJ,IAAK,CAEpD,MAAMkvE,EAAwBjvE,EAAKD,GACnC,GAAImsD,EAAS/rD,SAAW8uE,EAAsB9uE,OAA9C,CAGA,IAAK,IAAI8vC,EAAI,EAAGA,EAAIic,EAAS/rD,OAAQ8vC,IACjC,GAAIic,EAASjc,KAAOg/B,EAAsBh/B,GACtC,SAAS++B,EAGjB,OAAO,GAEX,OAAO,EAOX,SAASE,GAAuBC,EAAgBzwC,GAC5C,OAAOywC,EAAiB,QAAUzwC,EAAMv/B,OAAS,IAAMu/B,EAM3D,SAAS0wC,GAAqBljB,GAE1B,IAAInlD,EAA4BmlD,EAAS,GAErCnsD,EAAI,EAEJq7D,EAAO,EAEPiU,EAAe,GAEfF,GAAiB,EACrB,KAAOpvE,EAAImsD,EAAS/rD,QAAQ,CAExB,IAAImvE,EAAgBpjB,EAASnsD,GAC7B,GAA6B,iBAAlBuvE,EACP,GAAW,EAAPlU,EAA0B,CAE1B,MAAMmU,EAA+BrjB,IAAWnsD,GAChDsvE,GACI,IAAMC,GAAiBC,EAAUpvE,OAAS,EAAI,KAAOovE,EAAY,IAAM,IAAM,SAErE,EAAPnU,EACLiU,GAAgB,IAAMC,EAEV,EAAPlU,IACLiU,GAAgB,IAAMC,OAqBL,KAAjBD,GAAwBhB,GAAWiB,KACnCvoE,GAAUmoE,GAAuBC,EAAgBE,GACjDA,EAAe,IAEnBjU,EAAOkU,EAGPH,EAAiBA,IAAmBd,GAAWjT,GAEnDr7D,IAKJ,MAHqB,KAAjBsvE,IACAtoE,GAAUmoE,GAAuBC,EAAgBE,IAE9CtoE,EA+EX,MAAMyoE,GAA2F,GAajG,SAASC,GAAerW,GAGpB,MAAM1zC,EAAS0zC,EAhnOJ,GAinOX,OAAOjB,GAAazyC,GAA6BA,EAjnOtC,GAinOyDA,EAgExE,SAASgqD,GAAUC,GAEfC,GAAoBpV,KAAYD,KAAYyC,KAAqB2S,EAAOzU,MAoB5E,SAAS0U,GAAoBpZ,EAAO4C,EAAO/lD,EAAOgnD,GAK9C,IAAKA,EAGD,GADgF,IAAhC,EAAfjB,EAhtO3B,IAitOuB,CAEzB,MAAM0L,EAAqBtO,EAAMsO,mBACN,OAAvBA,GACAlH,GAAkBxE,EAAO0L,EAAoBzxD,OAGhD,CAED,MAAMwxD,EAAgBrO,EAAMqO,cACN,OAAlBA,GACA9G,GAAyB3E,EAAOyL,EAAe,EAA4BxxD,GAQvF4pD,GAAiB5pD,GAufrB,SAASw8D,GAAgB/iC,EAAMnS,GAG3B,OAA2BmS,GAAQ,GAAsBnS,GAAQ,EAMrE,SAASm1C,GAAqBC,GAE1B,OAAQ,GAA6D,GAAuB,MA0BhG,SAASC,GAA8BD,GAEnC,OAAuF,EAA5D,EAM/B,SAASE,GAAqBF,GAE1B,OAAoE,OAA5D,IAAuF,EAOnG,SAASG,GAAqBH,EAAep1C,GAGzC,OAAwF,OAA5D,EACxBA,GAAQ,EAehB,SAASw1C,GAA8BJ,GAEnC,OAAuF,EAA5D,EA4wC/B,SAASK,GAAsB5Z,EAAO4C,GAElC,MAAMzE,EAAiB6B,EAAM7B,eAC7B,GAAuB,OAAnBA,EACA,IAAK,IAAI50D,EAAI,EAAGA,EAAI40D,EAAex0D,OAAQJ,GAAK,EAAG,CAE/C,MAAMswE,EAAgB1b,EAAe50D,GAE/BuwE,EAAkB3b,EAAe50D,EAAI,GAC3C,IAAyB,IAArBuwE,EAAwB,CAExB,MAAMhT,EAAkC9G,EAAM/3C,KAAK6xD,GAGnDtU,GAAqBqU,GACF/S,EAA4B,eAAE,EAAgBlE,EAAMkX,GAAkBA,KAkCzG,SAASC,GAAczmE,EAAM+uD,EAAU2X,GACnC,OAAI5X,GAAqBC,GACdA,EAASpnB,cAAc3nC,EAAM0mE,GAGf,OAAdA,EAAqB3X,EAASpnB,cAAc3nC,GAC/C+uD,EAAS4X,gBAAgBD,EAAW1mE,GAiBhD,SAAS4mE,GAAYvO,EAAa3L,EAAO7+C,EAASrT,EAAOqsE,EAAMC,EAAWC,EAAiBhY,EAAUgT,EAAWra,GAE5G,MAAM4H,EAA+E5C,EAAMuL,UAAUx+D,QAiBrG,OAhBA61D,EAjoSS,GAioSKuX,EACdvX,EA9nSU,GA8nSa,IAAR90D,EACf01D,GAAuBZ,GACvBA,EA9nSW,GA8nSKA,EAtmSK,IAsmSqB+I,EAC1C/I,EArnSY,GAqnSKzhD,EACjByhD,EAlnSqB,IAknSyByX,GAAmB1O,GAAeA,EAlnS3D,IAonSrB/I,EAlnSa,IAknSyBP,GAAYsJ,GAAeA,EAlnSpD,IAonSb/I,EAlnSc,IAknSKyS,GAAa1J,GAAeA,EAlnSjC,KAknS2D,KACzE/I,EAznSe,GAynS0B5H,GAAY2Q,GAAeA,EAznSrD,IAynSgF,KAC/F/I,EAhoSW,GAgoSKwX,EAEhBxX,EA9mS+B,IA+mSb,GAAd5C,EAAM7zD,KAA2B,EA/mSN,IA+mSqEy2D,EAE7FA,EAWX,SAAS0X,GAAiBta,EAAOoa,EAAWv9D,EAAO1Q,EAAMmH,EAAMo1D,GAG3D,MAAM6R,EAAgB19D,EAtnSJ,GAwnSZglD,EAA2B7B,EAAM/3C,KAAKsyD,IAchD,SAA4Bva,EAAOoa,EAAWG,EAAepuE,EAAMmH,EAAMo1D,GAErE,MAAMrE,EAAwBD,KAExBG,EAAWC,KAEXt1C,EAASq1C,EAAWF,EAAwBA,GAAyBA,EAAsBn1C,OAQ3F2yC,EAAQ7B,EAAM/3C,KAAKsyD,GACrBC,GAAYxa,EALS9wC,GAAUA,IAAWkrD,EAEP,EAA8B,KAGjCjuE,EAAMouE,EAAejnE,EAAMo1D,GAiB/D,OAbyB,OAArB1I,EAAMiU,aACNjU,EAAMiU,WAAapS,GAEnBwC,KACIE,GAA2C,MAA/BF,EAAsBzoB,OAChB,OAAjBimB,EAAM3yC,QAAkD,IAA/Bm1C,EAAsBl4D,KAI1Co4D,IACNF,EAAsBlgC,KAAO09B,GAH7BwC,EAAsBzoB,MAAQimB,GAM/BA,EAhCX,CAb2B7B,EAAOoa,EAAWG,EAAepuE,EAAMmH,EAAMo1D,GAEpE,OADApE,GAAyBzC,GAAO,GACzB,EAgHX,SAAS4Y,GAAWza,EAAO4C,EAAOzhD,GAE9B0kD,GAAUjD,EAAOA,EA1wSN,IA2wSX,IAEI,MAAMjD,EAAYK,EAAML,UACN,OAAdA,GACA+a,GAAmB,EAAgB/a,EAAWx+C,GAKlD,MAAMw5D,EAAa3a,EAAM7vB,SACN,OAAfwqC,GACAC,GAAgB5a,EAAO4C,EAAO+X,EAAY,EAAgBx5D,GAO1D6+C,EAAMoL,kBACNpL,EAAMoL,iBAAkB,GAKxBpL,EAAM6a,sBACNjB,GAAsB5Z,EAAO4C,GAK7B5C,EAAM8a,mBACNJ,GAAmB,EAAmC1a,EAAgB,UAAG7+C,GAI7E,MAAM45D,EAAa/a,EAAM+a,WACN,OAAfA,GAhOZ,SAA+BC,EAAWD,GACtC,IAAK,IAAIxxE,EAAI,EAAGA,EAAIwxE,EAAWpxE,OAAQJ,IACnC0xE,GAAgBD,EAAWD,EAAWxxE,IAF9C,CAiOkCq5D,EAAOmY,WAIjCnY,EA5zSM,KA4zSU,EAChB2D,MAiBR,SAAS2U,GAAYlb,EAAO4C,EAAO+X,EAAYx5D,GAG3C,MAAMrT,EAAQ80D,EAj1SJ,GAk1SV,GAAsC,MAAzB,IAAR90D,GACD,OACJ+3D,GAAUjD,EAAOA,EA50SN,IA80SX,MAAMiB,EAAqBa,KAC3B,IACIlB,GAAuBZ,GAv/OpBa,GAAiBC,OAAOuB,aAw/OXjF,EAAM+E,kBACH,OAAf4V,GACAC,GAAgB5a,EAAO4C,EAAO+X,EAAY,EAAgBx5D,GAG9D,MAAMg6D,EAAmE,IAAhC,EAARrtE,GAGjC,IAAK+1D,EACD,GAAIsX,EAAyB,CAEzB,MAAM7M,EAAqBtO,EAAMsO,mBACN,OAAvBA,GACAlH,GAAkBxE,EAAO0L,EAAoB,UAGhD,CAED,MAAMD,EAAgBrO,EAAMqO,cACN,OAAlBA,GACA9G,GAAyB3E,EAAOyL,EAAe,EAA4B,MAE/E5G,GAAwB7E,EAAO,GAUvC,GA8xCR,SAAqCA,GAEjC,IAAIwY,EAAkBxY,EAnoVP,IAooVf,KAA2B,OAApBwY,GAA0B,CAI7B,IAAIC,EACJ,GAAI1Z,GAAayZ,KACZC,EAAkBD,EAvoUV,KAuoU4C,IAChD,EAAqC,CAC1C,IAAK,IAAI7xE,EAvnUW,EAunUkBA,EAAI6xE,EAAgBzxE,OAAQJ,IAAK,CAEnE,MAAM+xE,EAAmCF,EAAgB7xE,GAEnDgyE,EAAgBD,EAxqVxB,GA0qVMhY,GAA6BgY,IAC7BJ,GAAYK,EAAeD,EAAeC,EAAcprC,SAA6BmrC,EA7pVzF,IAgqVuD,IAApC,EAAlBD,IAIDG,GAAyBJ,EAAoCxY,EAppV1C,KAupV3BwY,EAAkBA,EA/qVb,IAmpVb,CAryCoCxY,GAEC,OAAzB5C,EAAM7B,gBACNyb,GAAsB5Z,EAAO4C,IAI5BiB,EACD,GAAIsX,EAAyB,CAEzB,MAAMnU,EAAoBhH,EAAMgH,kBACN,OAAtBA,GACAI,GAAkBxE,EAAOoE,OAG5B,CAED,MAAMD,EAAe/G,EAAM+G,aACN,OAAjBA,GACAQ,GAAyB3E,EAAOmE,EAAc,GAElDU,GAAwB7E,EAAO,IAha/C,SAAuD5C,EAAO4C,GAE1D,IAEI,MAAM6Y,EAAsBzb,EAAMyb,oBAClC,GAA4B,OAAxBA,EAA8B,CAE9B,IAAI3W,EAAmB9E,EAAM0b,kBAEzBrW,GAAyB,EAEzBsW,GAAuB,EAQ3B,IAAK,IAAIpyE,EAAI,EAAGA,EAAIkyE,EAAoB9xE,OAAQJ,IAAK,CAEjD,MAAMqyE,EAAcH,EAAoBlyE,GACb,iBAAhBqyE,EACHA,GAAe,GAQfD,EAAsB,EAAIC,EAC1BnV,GAAiBkV,GAIjB7W,GA7lNW,EA4lN+B2W,IAAsBlyE,GAEhE87D,EAAwBP,GAMxBA,GAAoB8W,GAKJ,OAAhBA,IACAxW,GAA8BN,EAAkBO,GAGhDuW,EAAY,EADIhZ,EAAMyC,KAS1BA,eAMZoB,IAAkB,IAlE1B,CAmasDzG,EAAO4C,GAGrD,MAAMmY,EAAa/a,EAAM+a,WACN,OAAfA,GAlUZ,SAAgCC,EAAWD,GACvC,IAAK,IAAIxxE,EAAI,EAAGA,EAAIwxE,EAAWpxE,OAAQJ,IACnCsyE,GAAiBb,EAAWD,EAAWxxE,IAF/C,CAmUmCq5D,EAAOmY,GAMlC,MAAMpb,EAAYK,EAAML,UAMxB,GALkB,OAAdA,GACA+a,GAAmB,EAAgB/a,EAAWx+C,IAI7C0iD,EACD,GAAIsX,EAAyB,CAEzB,MAAMjU,EAAiBlH,EAAMkH,eACN,OAAnBA,GACAE,GAAkBxE,EAAOsE,OAG5B,CAED,MAAMD,EAAYjH,EAAMiH,UACN,OAAdA,GACAM,GAAyB3E,EAAOqE,EAAW,GAE/CQ,GAAwB7E,EAAO,IAGT,IAA1B5C,EAAM8b,kBAON9b,EAAM8b,iBAAkB,GAQvBjY,IACDjB,EA57SE,KA47Sc,YAIpB2D,MAWR,SAASwV,GAA0B/b,EAAO4C,EAAO+X,EAAYx5D,GAEzD,MAAMk5D,EAAkBzX,EA77SH,IA+7SfoZ,GAAuBtX,KAEvBuX,EAAuB5Y,GAAeT,GAC5C,IACQoZ,IAAwBC,GAAwB5B,EAAgB6B,OAChE7B,EAAgB6B,QAEhBD,GACAxB,GAAWza,EAAO4C,EAAOzhD,GAE7B+5D,GAAYlb,EAAO4C,EAAO+X,EAAYx5D,WAGlC66D,IAAwBC,GAAwB5B,EAAgBnqE,KAChEmqE,EAAgBnqE,OAa5B,SAAS0qE,GAAgB5a,EAAO4C,EAAO+X,EAAYwB,EAAIh7D,GAEnD,MAAMi7D,EAAoB5V,KAC1B,IACIC,IAAkB,GACT,EAAL0V,GAAuBvZ,EAAMj5D,OA18SnB,IA68SVyvE,GAAoBpZ,EAAO4C,EAAO,EAAG8B,MAEzCiW,EAAWwB,EAAIh7D,WAGfslD,GAAiB2V,IAYzB,SAASC,GAAsBrc,EAAO6B,EAAOe,GACzC,GAAIhB,GAAmBC,GAAQ,CAE3B,MAEM3xD,EAAM2xD,EAAMgF,aAClB,IAAK,IAAIuH,EAHKvM,EAAM+E,eAGawH,EAAiBl+D,EAAKk+D,IAAkB,CAErE,MAAM1kE,EAAyBs2D,EAAM/3C,KAAKmmD,GACtC1kE,EAAIy0D,gBACJz0D,EAAIy0D,eAAe,EAAgByE,EAAMwL,GAAiBA,KAY1E,SAASkO,GAA0Btc,EAAO4C,EAAOf,GACxCiC,OAquBT,SAAkC9D,EAAO4C,EAAOf,EAAO4G,GAEnD,MAAMr8D,EAAQy1D,EAAM+E,eAEd12D,EAAM2xD,EAAMgF,aACb7G,EAAMoL,iBACPH,GAA+BpJ,EAAOe,GAE1CgU,GAAgBnO,EAAQ7F,GAExB,MAAM2Z,EAAgB1a,EAAM0a,cAC5B,IAAK,IAAIhzE,EAAI6C,EAAO7C,EAAI2G,EAAK3G,IAAK,CAE9B,MAAMG,EAAyBs2D,EAAM/3C,KAAK1e,GAEpCizE,EAAcxa,GAAet4D,GAC/B8yE,GAEAC,GAAkB7Z,EAAO,EAA4B,GAGzD,MAAMqF,EAAYsF,GAAkB3K,EAAO5C,EAAOz2D,EAAGs4D,GACrD+U,GAAgB3O,EAAWrF,GACL,OAAlB2Z,GACAG,GAAmB9Z,EAAOr5D,EAAI6C,EAAO67D,EAAWv+D,EAAKm4D,EAAO,GAE5D2a,IAEsBxZ,GAAyBnB,EAAMhlD,MAAO+lD,GA/wUxD,GAgxUqBqF,IA7BrC,CAnuB6BjI,EAAO4C,EAAOf,EAAOgB,GAAiBhB,EAAOe,IACpB,MAA/B,IAAdf,EAAM/zD,QAywBf,SAAsCkyD,EAAO4C,EAAOf,GAEhD,MAAMz1D,EAAQy1D,EAAM+E,eAEd12D,EAAM2xD,EAAMgF,aAEZ8V,EAA6B3c,EAA0B,oBAEvDoL,EAAkBpL,EAAMoL,gBAExBwR,EAAe/a,EAAMhlD,MA3wUT,GA4wUlB,IACI4pD,GAAiBmW,GACjB,IAAK,IAAIrzE,EAAI6C,EAAO7C,EAAI2G,EAAK3G,IAAK,CAE9B,MAAMG,EAAyBs2D,EAAM/3C,KAAK1e,GAEpC0+D,EAAYrF,EAAMr5D,GACC,OAArBG,EAAIs0D,cAA0C,IAAjBt0D,EAAIu0D,UAAoC,OAAlBv0D,EAAIw0D,UACvD2e,GAAiCnzE,EAAKu+D,GAEjCmD,GACLuR,EAAQzwE,KAAK,eAKrBu6D,IAAkB,IA3B1B,CAxwBqCzG,EAAO4C,EAAOf,IAWnD,SAASib,GAAyBC,EAAUlb,EAAOmb,EAAoBna,IAEnE,MAAMoa,EAAapb,EAAMob,WACzB,GAAmB,OAAfA,EAAqB,CAErB,IAAIC,EAAarb,EAAMhlD,MAAQ,EAC/B,IAAK,IAAItT,EAAI,EAAGA,EAAI0zE,EAAWtzE,OAAQJ,GAAK,EAAG,CAE3C,MAAMsT,EAA2BogE,EAAW1zE,EAAI,GAE1C2K,GAAmB,IAAX2I,EACVmgE,EAAkB,EAA4BD,GAC9CA,EAASlgE,GACbkgE,EAASG,KAAgBhpE,IAWrC,SAASipE,GAA0BzzE,GAC/B,OAAOA,EAAIs2D,QACNt2D,EAAIs2D,MAAQod,GAAY,GAAoB,EAAG1zE,EAAIymC,SAAUzmC,EAAIk0D,MAAOl0D,EAAIm0D,KAAMn0D,EAAI81D,cAAe91D,EAAI+1D,SAAU/1D,EAAIi2D,UAAWj2D,EAAIq2D,QAASr2D,EAAIo0D,SAiB5J,SAASsf,GAAYjxE,EAAMkxE,EAAW1C,EAAY/c,EAAOC,EAAMyf,EAAYC,EAAO5d,EAAWI,EAASjC,GAGlG,MAAMiH,EAljTY,GAkjTwBnH,EAKpC4f,EAAoBzY,EAAoBlH,EAExC0N,EAsEV,SAA6BxG,EAAmByY,GAE5C,MAAMjS,EAA+C,GACrD,IAAK,IAAIhiE,EAAI,EAAGA,EAAIi0E,EAAmBj0E,IACnCgiE,EAAUr/D,KAAK3C,EAAIw7D,EAAoB,KAAOiU,IAElD,OAAO,EANX,CAtE0CjU,EAAmByY,GACzD,OAAOjS,EAjmTG,GAgoTN,CACIp/D,KAAMA,EACNgrB,GAAIkmD,EACJ9R,UAAWA,EACXp7B,SAAUwqC,EACV8C,QAAS,KACT9d,UAAWA,EACXhjB,KAAM,KACN10B,KAAMsjD,EAAUx+D,QAAQpG,KAAK,KAAMo+D,GACnCA,kBAAmBA,EACnB2W,kBAAmB8B,EACnB/B,oBAAqB,KACrBrQ,iBAAiB,EACjB0Q,iBAAiB,EACjBhB,mBAAmB,EACnBD,sBAAsB,EACtBxM,cAAe,KACfC,mBAAoB,KACpBvH,aAAc,KACdC,kBAAmB,KACnBC,UAAW,KACXC,eAAgB,KAChBC,aAAc,KACduW,QAAS,KACTvf,eAAgB,KAChB4c,WAAY,KACZ4C,kBAAyC,mBAAfL,EAA4BA,IAAeA,EACrEM,aAA+B,mBAAVL,EAAuBA,IAAUA,EACtDtJ,WAAY,KACZlU,QAASA,EACTjC,OAAQA,GAmHpB,SAAS0c,GAAYxa,EAAO6d,EAAS1xE,EAAMouE,EAAenG,EAAS1L,GAI/D,MA2BI,CACIv8D,KAAMA,EACN0Q,MAAO09D,EACPlP,cA/BYwS,EAAUA,EAAQxS,eAAiB,EAgC/CzE,gBAAiB,EACjBC,cAAe,EACfiX,sBAAuB,EACvBC,iBAAkB,KAClBjwE,MAAO,EACP6/D,gBAAiB,EACjByG,QAASA,EACT1L,MAAOA,EACPsV,YAAa,KACbf,WAAY,KACZV,mBAAex9D,EACfq/C,OAAQ,KACRC,QAAS,KACT4f,OAAQ,KACR95C,KAAM,KACN+5C,eAAgB,KAChBtiC,MAAO,KACP1sB,OAAQ2uD,EACRM,WAAY,KACZ5oC,OAAQ,KACR6oC,oBAAgBr/D,EAChBs/D,QAAS,KACTC,qBAAiBv/D,EACjBw/D,cAAe,EACfC,cAAe,GAS3B,SAASC,GAAwBC,EAAe5E,EAAiB6E,GAC7D,IAAK,IAAI3d,KAAc0d,EACnB,GAAIA,EAAc78D,eAAem/C,GAAa,CAG1C,MAAM4d,EAAeF,EAAc1d,IAFnC2d,EAA0B,OAAdA,EAAqB,GAAKA,GAGxB98D,eAAem/C,GACzB2d,EAAU3d,GAAY90D,KAAK4tE,EAAiB8E,GAG3CD,EAAU3d,GAAc,CAAC8Y,EAAiB8E,GAIvD,OAAOD,EAqFX,SAASE,GAAwB7e,EAAO6B,EAAOe,EAAO1M,EAAUhiD,EAAOmuD,EAAUgT,EAAWyJ,GAGxF,MAAMxhC,EAA6BulB,GAAiBhB,EAAOe,GAE3D,IAEImc,EAFA54B,EAAY0b,EAAMzD,QAGjB0gB,GAA2B,MAAb34B,IAAsB44B,EAAY54B,EAAU+P,KAC3D8oB,GAAqBhf,EAAO4C,EAAOmc,EAAW7oB,EAAUhiD,GACpD4tD,GAAgBD,IA0C5B,SAA2Be,EAAOya,GAG9B,MAAM4B,EAAsBjc,GAAyBqa,EAAWza,GAC7B,GAA7Bqc,EA9+TI,KA++TNA,EA/+TM,IA++TwB,IALtC,CAzC8Brc,EAAOf,EAAMhlD,QAKf,IAAfglD,EAAM11D,OACX+pD,EA5CR,SAAqB5iD,GACjB,MAAa,UAATA,EACO,YACE,QAATA,EACO,UACE,eAATA,EACO,aACE,cAATA,EACO,YACE,aAATA,EACO,WACE,aAATA,EACO,WACJA,EAbX,CA4C+B4iD,GAYvBhiD,EAAqB,MAAbmhE,EAAwCA,EAAUnhE,EAAO2tD,EAAMuS,SAAW,GAAIle,GAAehiD,EACjGkuD,GAAqBC,GACrBA,EAAS6G,YAAY,EAA8BhT,EAAUhiD,GAEvD+0D,GAAgB/S,KACtB,EAA+BgT,YAAc,EAA+BA,YAAYhT,EAAUhiD,GAC9F,EAA+BgiD,GAAYhiD,IAwK3D,SAASgrE,GAAkBlf,EAAO4C,EAAOf,EAAOsd,GAK5C,IAAIC,GAAgB,EACpB,GAAItb,KAAsB,CAEtB,MAAMtE,EAsOd,SAAiCQ,EAAO+c,EAAUlb,GAI9C,MAAMwd,EAAWrf,EAAM2d,kBAEvB,IAAIl0C,EAAU,KACd,GAAI41C,EACA,IAAK,IAAI91E,EAAI,EAAGA,EAAI81E,EAAS11E,OAAQJ,IAAK,CAEtC,MAAMG,EAAyB21E,EAAS91E,GACpC+uE,GAA2BzW,EAA0Bn4D,EAAc,WAA0B,KAC7F+/B,IAAYA,EAA2C,IACvDsiC,GAAmBd,GAA+BpJ,EAAOkb,GAAW/c,EAAOt2D,EAAIyC,MAC3E61D,GAAet4D,IACG,EAAdm4D,EAAM/zD,OACN+oE,GAA4BhV,GAChCyd,GAAoBtf,EAAO6B,GAE3Bp4B,EAAQ81C,QAAQ71E,IAGhB+/B,EAAQv9B,KAAKxC,IAK7B,OAAO+/B,EA3BX,CAtOsDu2B,EAAO4C,EAAOf,GAEtD2d,EAA2B,OAAdL,EAAqB,KAAO,CAAE,IAAK,GACtD,GAAsB,OAAlB3f,EAAwB,CAExB,IAAIigB,EAAyB,EAC7BL,GAAgB,EAChBM,GAAe7d,EAAO7B,EAAM/3C,KAAKte,OAAQ61D,EAAc71D,QAOvD,IAAK,IAAIJ,EAAI,EAAGA,EAAIi2D,EAAc71D,OAAQJ,IAAK,CAE3C,MAAMG,EAAM81D,EAAcj2D,GACtBG,EAAIi0D,mBACJj0D,EAAIi0D,kBAAkBj0D,GAE9Bi2E,GAAgC3f,EAAO6B,EAAOrC,EAAc71D,QAE5D,IAAIi2E,GAAqB,EAErBC,GAA0B,EAC9B,IAAK,IAAIt2E,EAAI,EAAGA,EAAIi2D,EAAc71D,OAAQJ,IAAK,CAE3C,MAAMG,EAAM81D,EAAcj2D,GAG1Bs4D,EAAMmc,YAAc3U,GAAexH,EAAMmc,YAAat0E,EAAIw0D,WAC1D4hB,GAAqB9f,EAAO4C,EAAOl5D,GACnCq2E,GAAuC/f,EAAW,KAAEr2D,OAAS,EAAGD,EAAK81E,GAC1C,OAAvB91E,EAAIy0D,iBACJ0D,EAAM/zD,OAAS,GACM,OAArBpE,EAAIs0D,cAA2C,OAAlBt0D,EAAIw0D,WAAuC,IAAjBx0D,EAAIu0D,WAC3D4D,EAAM/zD,OAAS,MAGd8xE,IAAuBl2E,EAAI60D,WAAa70D,EAAI80D,QAAU90D,EAAIg1D,YAI1DsB,EAAMqO,gBAAkBrO,EAAMqO,cAAgB,KAAKniE,KAAK21D,EAAMhlD,MA/oU7D,IAgpUF+iE,GAAqB,GAEpBC,IAA4Bn2E,EAAI60D,YAAa70D,EAAIg1D,WACjDsB,EAAMsO,qBAAuBtO,EAAMsO,mBAAqB,KAAKpiE,KAAK21D,EAAMhlD,MAnpUvE,IAopUFgjE,GAA0B,GAE9BG,GAAqChgB,EAAOt2D,GAC5C+1E,GAA0B/1E,EAAIu0D,UAlV9C,SAAyC+B,EAAO6B,GAG5C,MAEM3xD,EAAM2xD,EAAMgF,aAEZoZ,EAAOjgB,EAAM/3C,KAEbi4D,EAAare,EAAM6G,MAEnByX,EAAyD,GAE/D,IAAIC,EAAc,KAEdC,EAAe,KACnB,IAAK,IAAI92E,EAbKs4D,EAAM+E,eAaAr9D,EAAI2G,EAAK3G,IAAK,CAE9B,MAAMu9D,EAAkCmZ,EAAK12E,GAEvC+2E,EAAkBxZ,EAAa1I,OACrC+hB,EAAgBj0E,KAAoB,OAAfg0E,EAAsBK,GAAsBD,EAAiBJ,GAAc,MAChGE,EAAc3B,GAAwB6B,EAAiB/2E,EAAG62E,GAC1DC,EAAe5B,GAAwB3X,EAAazI,QAAS90D,EAAG82E,GAEhD,OAAhBD,IACIA,EAAYv+D,eAAe,WAC3BggD,EAAM/zD,OAAS,IAEfsyE,EAAYv+D,eAAe,WAC3BggD,EAAM/zD,OAAS,KAGvB+zD,EAAM0a,cAAgB4D,EACtBte,EAAMzD,OAASgiB,EACfve,EAAMxD,QAAUgiB,EAnCpB,CAoV4CrgB,EAAO6B,GACvC2e,GAAkBxgB,EAAO4C,EAAO6c,GAEhCD,GA+NZ,SAAiC3d,EAAOsd,EAAWK,GAC/C,GAAIL,EAAW,CAEX,MAAMlC,EAAapb,EAAMob,WACe,GAIxC,IAAK,IAAI1zE,EAAI,EAAGA,EAAI41E,EAAUx1E,OAAQJ,GAAK,EAAG,CAE1C,MAAMsT,EAAQ2iE,EAAWL,EAAU51E,EAAI,IACvC,GAAa,MAATsT,EACA,MAAM,IAAIvN,MAAM,mBAAmB6vE,EAAU51E,EAAI,kBACrD0zE,EAAW/wE,KAAKizE,EAAU51E,GAAIsT,KAb1C,CA9NoCglD,EAAOsd,EAAWK,GAIlD,OADA3d,EAAMmc,YAAc3U,GAAexH,EAAMmc,YAAanc,EAAM6G,OACrD0W,EASX,SAASY,GAAqChgB,EAAOt2D,GAGjD,MAAMizE,EAA6B3c,EAA0B,oBAS7D2c,EAAQzwE,KAAKxC,EAAIs0D,cAGA,IADAt0D,EAAIu0D,UAEjB0e,EAAQzwE,KAAKxC,EAAIu0D,UAezB,SAASuiB,GAAkBxgB,EAAO4C,EAAOnkC,GAGrC,IAAK,IAAIl1B,EAAI,EAAGA,EAAIk1B,EAAOl1B,IACvBq5D,EAAM12D,KAAK8sE,IACXhZ,EAAMuL,UAAUr/D,KAAK8sE,IACrBhZ,EAAM/3C,KAAK/b,KAAK,MAuFxB,SAAS2wE,GAAiCnzE,EAAKu+D,GAClB,OAArBv+D,EAAIs0D,cACet0D,EAAiB,aAAE,EAAgBu+D,GAa9D,SAAS0X,GAAgC3f,EAAO6B,EAAO4e,GAMnD,MAAM7D,EA3zUY,GA2zUmB/a,EAAMhlD,MAIrC6jE,EAAgB1gB,EAAM/3C,KAAKte,QAFkB,MAAxBk4D,EAAM8L,kBAGhC3N,EAAMyb,sBAAwBzb,EAAMyb,oBAAsB,KAAKvvE,KAAK0wE,EAAc8D,EAAeD,GA+CtG,SAASnB,GAAoBtf,EAAO8L,GAEhCA,EAAUh+D,OAAS,GAClBkyD,EAAM+a,aAAe/a,EAAM+a,WAAiD,KAAK7uE,KAAK4/D,EAAUjvD,OAkCrG,SAASkjE,GAAoBljE,EAAOnT,EAAK81E,GACrC,GAAIA,EAAY,CACZ,GAAI91E,EAAI40D,SACJ,IAAK,IAAI/0D,EAAI,EAAGA,EAAIG,EAAI40D,SAAS30D,OAAQJ,IACrCi2E,EAAW91E,EAAI40D,SAAS/0D,IAAMsT,EAGlCmlD,GAAet4D,KACf81E,EAAW,IAAM3iE,IAW7B,SAAS6iE,GAAe7d,EAAOhlD,EAAO8jE,GAElC9e,EAAM/zD,OAAS,EAEf+zD,EAAM+E,eAAiB/pD,EACvBglD,EAAMgF,aAAehqD,EAAQ8jE,EAC7B9e,EAAM8L,gBAAkB9wD,EAS5B,SAASijE,GAAqB9f,EAAO+c,EAAUrzE,GAC3Cs2D,EAAM/3C,KAAK/b,KAAKxC,GAEhB,MAAMk3E,EAAmBl3E,EAAI6tD,UAAY,EAA2BA,QAAU+J,GAAc53D,EAAIyC,OAE1F00E,EAAsB,IAAI3Y,GAAoB0Y,EAAkB5e,GAAet4D,GAAM,MAC3Fs2D,EAAMuL,UAAUr/D,KAAK20E,GACrB9D,EAAS7wE,KAAK20E,GASlB,SAASpE,GAAkB7Z,EAAOkJ,EAAWpiE,GAEzC,MAAM++D,EAA4B5F,GAAiBiJ,EAAWlJ,GAExD5C,EAAQmd,GAA0BzzE,GAIlC2wE,EAAkBzX,EAn+UH,IAq+Ufke,EAAgBC,GAAcne,EAAOsX,GAAYtX,EAAO5C,EAAO,KAAMt2D,EAAI41D,OAAS,GAAiB,GAAsBmJ,EAAQ,EAAgC4R,EAAiBA,EAAgB9X,eAAekG,EAAQ/+D,KAG/Nk5D,EAAMkJ,EAAUjvD,OAASikE,EAW7B,SAASE,GAAyBnf,EAAOe,EAAOtvD,EAAMY,EAAOmhE,EAAW2E,GAIpE,MAAM18B,EAA6BulB,GAAiBhB,EAAOe,GAErDP,EAAWO,EAv/UJ,IAw/Ub,GAAa,MAAT1uD,EAEAkuD,GAAqBC,GAAYA,EAASiQ,gBAAgBh1B,EAAShqC,EAAM0mE,GACrE18B,EAAQg1B,gBAAgBh/D,OAE3B,CAGD,MAAM2tE,EAAwB,MAAb5L,EAAoB/K,GAAgBp2D,GAASmhE,EAAUnhE,EAAO2tD,EAAMuS,SAAW,GAAI9gE,GAChG8uD,GAAqBC,GACrBA,EAAS0G,aAAazrB,EAAShqC,EAAM2tE,EAAUjH,GAG/CA,EAAY18B,EAAQ0rB,eAAegR,EAAW1mE,EAAM2tE,GAChD3jC,EAAQyrB,aAAaz1D,EAAM2tE,IAgB3C,SAASvE,GAAmB9Z,EAAOwL,EAAgBrB,EAAUrjE,EAAKm4D,EAAOqf,GAErE,MAAM3E,EAAgB,EAAsCnO,GAC5D,GAAsB,OAAlBmO,EAAwB,CAExB,MAAMzc,EAAWp2D,EAAIo2D,SACrB,IAAK,IAAIv2D,EAAI,EAAGA,EAAIgzE,EAAc5yE,QAAS,CAEvC,MAAMq3D,EAAaub,EAAchzE,KAE3B43E,EAAc5E,EAAchzE,KAE5B2K,EAAQqoE,EAAchzE,KACX,OAAbu2D,EACmBp2D,EAAa,SAAEqjE,EAAU74D,EAAO8sD,EAAYmgB,GAG/D,EAAgCA,GAAejtE,IAyB/D,SAASqsE,GAAsBniB,EAAQsK,GAEnC,IAAI0Y,EAAgB,KAEhB73E,EAAI,EACR,KAAOA,EAAIm/D,EAAM/+D,QAAQ,CAErB,MAAMk/D,EAAWH,EAAMn/D,GACvB,GAAiB,IAAbs/D,EAKC,GAAiB,IAAbA,EAAJ,CAML,GAAwB,iBAAbA,EACP,MACAzK,EAAOv8C,eAAe,KACA,OAAlBu/D,IACAA,EAAgB,IACpBA,EAAcl1E,KAAK,EAA+BkyD,EAAO,GAAmDsK,EAAMn/D,EAAI,KAE1HA,GAAK,OAXDA,GAAK,OALLA,GAAK,EAkBb,OAAO63E,EAkBX,SAASC,GAAiBC,EAAY5Z,EAAae,EAAQ5G,GAevD,OAVmB,IAAmCpkD,MAAO6jE,GAC7D,GACA,EACA5Z,EACA,KACA,KACA7F,EACA4G,EACA,MAmDJ,SAAS+S,GAAyB+F,EAAYC,GAE1C,MAAMC,EAAgCF,EArqUtB,GAuqUhB,IAAK,IAAIh4E,EAAI,EAAGA,EAAIk4E,EAAW93E,OAAQJ,IAAK,CAExC,MAAMm4E,EAAgCD,EAAWl4E,GAK3Co4E,EAHyCD,EAtsVxC,GAAA,GA0BoB,IAkrV3B,GAAIC,IAA2BH,GAOmE,IAA1B,GAAhCG,EArtVlC,IAstV8B,CAM5B,MAAMC,EAAaF,EA9tVrB,GAguVExG,GAAY0G,EAAYF,EAAYE,EAAWzxC,SAA6BuxC,EAltV5E,MA+tVhB,SAAS7F,GAAiBb,EAAW6G,GAGjC,MAAMf,EAAgB9d,GAAyB6e,EAAkB7G,GAEjE,GAAI1X,GAA6Bwd,IACN,GAAvBA,EAjvVM,GAivV0D,CAEhE,MAAMgB,EAAiBhB,EArvVjB,GAsvVN5F,GAAY4G,EAAgBhB,EAAegB,EAAe3xC,SAAU2wC,EAxuV5D,KAgvVhB,SAAS7F,GAAgBD,EAAW6G,GAGhC,MAAMf,EAAgB9d,GAAyB6e,EAAkB7G,GAE3D8G,EAAiBhB,EAnwVb,IAmyVd,SAA+B9gB,EAAO4C,GAClC,IAAK,IAAIr5D,EAAIq5D,EAAMj5D,OAAQJ,EAAIy2D,EAAMuL,UAAU5hE,OAAQJ,IACnDq5D,EAAM12D,KAAK8zD,EAAMuL,UAAUhiE,IAFnC,CA/B0Bu4E,EAAgBhB,GACtCrG,GAAWqH,EAAgBhB,EAAeA,EAvvV9B,IAqyVhB,SAASC,GAAcne,EAAOmf,GAY1B,OAPInf,EAhyVW,IAiyVQA,EA/xVR,IApBN,GAmzV0Cmf,EAG/Cnf,EApyVW,IAoyVSmf,EAExBnf,EApyVe,IAoyVKmf,EACbA,EAgBX,SAASC,GAAcpf,GACnB,KAAOA,GAAO,CACVA,EA/0VM,IA+0VU,GAEhB,MAAM1zC,EAAS+pD,GAAerW,GAE9B,GAAIX,GAAWW,KAAW1zC,EACtB,OAAO0zC,EAGXA,EAAQ,EAEZ,OAAO,KAuEX,SAASqf,GAAsBjiB,EAAO4C,EAAOzhD,GAEzC,MAAMk5D,EAAkBzX,EAl5VH,IAm5VjByX,EAAgB6B,OAChB7B,EAAgB6B,QACpB,IACIhB,GAAYlb,EAAO4C,EAAO5C,EAAM7vB,SAAUhvB,GAE9C,MAAO/W,GAEH,MADA83E,GAAYtf,EAAOx4D,GACbA,UAGFiwE,EAAgBnqE,KAChBmqE,EAAgBnqE,OAS5B,SAASiyE,GAAwBvf,IAzCjC,SAAyBwf,GACrB,IAAK,IAAI74E,EAAI,EAAGA,EAAI64E,EAAYrH,WAAWpxE,OAAQJ,IAAK,CAEpD,MAAM84E,EAAgBD,EAAYrH,WAAWxxE,GAEvCq5D,EAA2BQ,GAAiBif,GAE5CriB,EAAQ4C,EAv5VR,GAw5VNmZ,GAA0B/b,EAAO4C,EAAO5C,EAAM7vB,SAAUkyC,IARhE,CA0CuCzf,EA56VvB,IAw9VhB,SAAS8X,GAAmB5sE,EAAOw0E,EAAaC,GAE5C/c,GAAqB,GACrB8c,EAAYx0E,EAAOy0E,GA+CvB,MAAMC,GA7jEN,KAAMr9D,QAAQpU,QAAQ,MAAtB,GAkkEA,SAAS0xE,GAAYvvC,GAEjB,OAAOA,EAnhWK,KAmhWaA,EAnhWb,GAmhW0D,IAM1E,SAASwvC,GAAgB1iB,GACrB,OAAOA,EAAM0d,UAAY1d,EAAM0d,QAAuC,IAoB1E,SAASwE,GAAYtf,EAAOx4D,GAExB,MAAM4wD,EAAW4H,EA5iWF,GA8iWT+f,EAAe3nB,EAAWA,EAASlxC,IAAIolD,GAAc,MAAQ,KACnEyT,GAAgBA,EAAaT,YAAY93E,GAa7C,SAAS40E,GAAqBhf,EAAO4C,EAAOxE,EAAQ4C,EAAY9sD,GAC5D,IAAK,IAAI3K,EAAI,EAAGA,EAAI60D,EAAOz0D,QAAS,CAEhC,MAAMkT,EAA2BuhD,EAAO70D,KAElC43E,EAAiC/iB,EAAO70D,KAExCwjE,EAAWnK,EAAM/lD,GAGjBnT,EAAyBs2D,EAAM/3C,KAAKpL,GACrB,OAAjBnT,EAAIo2D,SACep2D,EAAa,SAAEqjE,EAAU74D,EAAO8sD,EAAYmgB,GAG/DpU,EAASoU,GAAejtE,GAWpC,SAAS0uE,GAAoBhgB,EAAO/lD,EAAO3I,GAIvC,MAAMopC,EAAgDqlB,GAAiB9lD,EAAO+lD,GAIxEP,EAAWO,EA1lWJ,IA2lWbR,GAAqBC,GAAYA,EAASwgB,SAASvlC,EAASppC,GAASopC,EAAQwlC,YAAc5uE,EAe/F,SAAS6uE,GAAclhB,EAAOmhB,GAG1B,MAAMC,EAA+BD,EA7nW1B,GA8nWX,OAAqB,IAAjBnhB,EAAMhlD,MAGC8kD,GAAashB,GAAaA,EAAY,KAKtCA,EAUf,SAASC,GAAyBC,EAAWjwC,GAEzC,MAAM+vC,EAAYF,GAAcI,EAAWjwC,GAC3C,OAAO+vC,EAAYG,GAAiBlwC,EAnoWvB,IAmoWuC+vC,EApnVzC,IAonV8D,KA0B7E,SAASI,GAA0B5sD,EAAQ4rC,EAAUnzC,EAAQo0D,EAAeC,GAKxE,GAAqB,MAAjBD,EAAuB,CAEvB,IAAI/B,EAEA/E,GAAc,EAId7a,GAAa2hB,GACb/B,EAAa+B,EAER5hB,GAAQ4hB,KACb9G,GAAc,EAEd8G,EAAmCA,EAtsWlC,IAysWL,MAAME,EAAQ9gB,GAAY4gB,GAEX,IAAX7sD,GAAwC,OAAXvH,EACX,MAAdq0D,EACAE,GAAkBphB,EAAUnzC,EAAQs0D,GAGpCE,GAAmBrhB,EAAUnzC,EAAQs0D,EAAOD,GAAc,MAG9C,IAAX9sD,GAAwC,OAAXvH,EAClCw0D,GAAmBrhB,EAAUnzC,EAAQs0D,EAAOD,GAAc,MAE1C,IAAX9sD,EAitBjB,SAA0B4rC,EAAUmhB,EAAOG,GAEvC,MAAMC,EAAeR,GAAiB/gB,EAAUmhB,GAC5CI,GAvKR,SAA2BvhB,EAAUnzC,EAAQ0sB,EAAO+nC,GAC5CvhB,GAAqBC,GACrBA,EAASyP,YAAY5iD,EAAQ0sB,EAAO+nC,GAGpCz0D,EAAO4iD,YAAYl2B,GAL3B,CAwK0BymB,EAAUuhB,EAAcJ,EAAOG,GAJzD,CAhtB6BthB,EAAUmhB,EAAOhH,GAElB,IAAX/lD,GAEc,EAA4C,YAAE+sD,GAEnD,MAAdjC,GAy2BZ,SAAwBlf,EAAU5rC,EAAQ8qD,EAAYsC,EAAcN,GAGhE,MAAMO,EAASvC,EApiXJ,GA8iXPuC,IAPWphB,GAAY6e,IAYvB8B,GAA0B5sD,EAAQ4rC,EAAUwhB,EAAcC,EAAQP,GAEtE,IAAK,IAAIh6E,EA3iXmB,EA2iXUA,EAAIg4E,EAAW53E,OAAQJ,IAAK,CAE9D,MAAMq5D,EAA2B2e,EAAWh4E,GAC5Cw6E,GAAUnhB,EA3lYJ,GA2lYkBA,EAAOP,EAAU5rC,EAAQotD,EAAcC,IAvBvE,CAx2B2BzhB,EAAU5rC,EAAQ8qD,EAAYryD,EAAQq0D,IAsBjE,SAASS,GAA2BhkB,EAAO4C,EAAOqhB,EAAYV,GAE1D,MAAMM,EAAeX,GAA4CljB,EAAW,KAAG4C,GAE3EihB,GAKAE,GAAU/jB,EAAO4C,EAHAA,EApuWR,IAsuWMqhB,EAAa,EAAiB,EACHJ,EAAcN,GA6JhE,SAASW,GAAgBC,EAAsBvhB,GAI3C,MAAM6e,EAAgC0C,EA73VtB,GA+3VVC,EAAoB3C,EAAW/2E,QAAQk4D,GAC7C6e,EAAW5+D,OAAOuhE,EAAmB,GAYzC,SAASC,GAAW9C,EAAY+C,GAC5B,GAAI/C,EAAW53E,QA/3Va,EAg4VxB,OAEJ,MAAM46E,EAl4VsB,EAk4VuBD,EAE7CE,EAAejD,EAAWgD,GAChC,GAAIC,EAAc,CAEd,MAAMC,EAAwBD,EAp5WP,IAq5WO,OAA1BC,GAAkCA,IAA0BlD,GAC5D2C,GAAgBO,EAAuBD,GAEvCF,EAAc,IACd/C,EAAWgD,EAAmB,GAn7W7B,GAm7W2DC,EAn7W3D,IAs7WL,MAAME,EAAetoB,GAAgBmlB,EA/4Vb,EA+4VmD+C,GAC3EN,GAA2BQ,EA77WrB,GA67W0CA,GAAc,EAAO,MAGrE,MAAMG,EAAWD,EAx7WT,GAy7WS,OAAbC,GACAA,EAASN,WAAWK,EAl8WlB,IAo8WNF,EAh8WO,GAg8WgB,KACvBA,EA/7WK,GA+7WgB,KAErBA,EAr8WM,KAq8WiB,IAE3B,OAAOA,EAsBX,SAASI,GAAa5kB,EAAO4C,GACzB,KAAqB,IAAfA,EA99WI,IA89WiC,CAEvC,MAAMP,EAAWO,EA98WR,IA+8WLR,GAAqBC,IAAaA,EAASwiB,aAC3Cd,GAAU/jB,EAAO4C,EAAOP,EAAU,EAAiB,KAAM,MA9MrE,SAAyByiB,GAGrB,IAAI/C,EAAoB+C,EAjwWT,IAkwWf,IAAK/C,EACD,OAAOgD,GAAYD,EA3xWb,GA2xW8BA,GAExC,KAAO/C,GAAmB,CAEtB,IAAI59C,EAAO,KACX,GAAIu9B,GAAQqgB,GAER59C,EAAO49C,EA1wWA,QA4wWN,CAID,MAAMiD,EAAYjD,EA3vVE,GA4vVhBiD,IACA7gD,EAAO6gD,GAEf,IAAK7gD,EAAM,CAGP,KAAO49C,IAAsB,EAzyW5B,IAyyW4EA,IAAsB+C,GAC/FpjB,GAAQqgB,IAAsBgD,GAAYhD,EAhzW5C,GAgzWsEA,GACpEA,EAAoBkD,GAAelD,EAAmB+C,GAEhC,OAAtB/C,IACAA,EAAoB+C,GACxBpjB,GAAQqgB,IAAsBgD,GAAYhD,EArzWxC,GAqzWkEA,GACpE59C,EAAO49C,GAAqB,EAhzW3B,GAkzWLA,EAAoB59C,GAlC5B,CAgNwBy+B,IAexB,SAASqiB,GAAelD,EAAmB+C,GAEvC,IAAIjjB,EACJ,OAAIH,GAAQqgB,KAAuBlgB,EAAQkgB,EA9+WhC,KA++WQ,IAAflgB,EAAM11D,KAGC42E,GAAc,EAA4BhB,GAI1CA,EA5/WA,KA4/W8B+C,EAAW,KAAO/C,EA5/WhD,GAwgXf,SAASgD,GAAY/kB,EAAO4C,GACxB,KAAqB,IAAfA,EA3gXI,IA2gXiC,CAGvCA,EA9gXM,KA8gXU,IAMhBA,EAphXM,IAohXU,IAqFxB,SAA2B5C,EAAO4C,GAE9B,IAAIuE,EACJ,GAAa,MAATnH,GAAwD,OAAtCmH,EAAenH,EAAMmH,cACvC,IAAK,IAAI59D,EAAI,EAAGA,EAAI49D,EAAax9D,OAAQJ,GAAK,EAAG,CAE7C,MAAM4X,EAAUyhD,EAAyBuE,EAAa59D,IAEhD4X,aAAmB+mD,IACDf,EAAa59D,EAAI,GAAMgT,KAAK4E,IAThE,CApF0B6+C,EAAO4C,GAiCjC,SAAyB5C,EAAO4C,GAE5B,MAAMsiB,EAAWllB,EAAM0d,QACvB,GAAiB,OAAbwH,EAAmB,CAEnB,MAAMC,EAA8BviB,EAjjX5B,GAkjXR,IAAK,IAAIr5D,EAAI,EAAGA,EAAI27E,EAASv7E,OAAS,EAAGJ,GAAK,EAC1C,GAA2B,iBAAhB27E,EAAS37E,GAAiB,CAGjC,MAAM67E,EAAoBF,EAAS37E,EAAI,GAEjCmjC,EAAsC,mBAAtB04C,EAClBA,EAAkBxiB,GAClBF,GAAYE,EAAMwiB,IAEhBC,EAAWF,EAASD,EAAS37E,EAAI,IAEjC+7E,EAAqBJ,EAAS37E,EAAI,GACN,kBAAvB+7E,EAEP54C,EAAO+P,oBAAoByoC,EAAS37E,GAAI87E,EAAUC,GAG9CA,GAAsB,EAEtBH,EAASG,KAITH,GAAUG,GAAoBz2B,cAGtCtlD,GAAK,OAML27E,EAAS37E,GAAGgT,KADI4oE,EAASD,EAAS37E,EAAI,KAI9Cq5D,EAtlXQ,GAslXS,MA1CzB,CAhCwB5C,EAAO4C,GAEvB,MAAMkJ,EAAYlJ,EAhhXX,GAkhXHkJ,GAAgC,IAAnBA,EAAU3/D,MACvBi2D,GAAqBQ,EAzgXhB,MA2gXeA,EA3gXf,IA2gXkC5gB,UAG3C,MAAMmiC,EAAuBvhB,EAlgXN,IAogXvB,GAA6B,OAAzBuhB,GAAiCxiB,GAAaiB,EAhiX3C,IAgiX2D,CAE1DuhB,IAAyBvhB,EAliX1B,IAmiXCshB,GAAgBC,EAAsBvhB,GAI1C,MAAM+hB,EAAW/hB,EAniXb,GAoiXa,OAAb+hB,GACAA,EAASN,WAAWrkB,KA4FpC,SAASulB,GAAgBvlB,EAAO6B,EAAO6F,GAInC,IAAI8d,EAAc3jB,EAAM3yC,OACxB,KAAsB,MAAfs2D,IAA6C,IAArBA,EAAYr5E,MAClB,IAArBq5E,EAAYr5E,OAEZq5E,GADA3jB,EAAQ2jB,GACYt2D,OAIxB,GAAmB,MAAfs2D,EAAqB,CAErB,MAAM1Z,EAA+BpE,EA7oX9B,GA8oXP,OAAuB,IAAnBoE,EAAU3/D,KAQH+2E,GAAyB,EAAgCxb,GAMzDA,EAxqXN,GAgrXL,GAHkB7F,GAAwB,IAAfA,EAAM11D,MAGF,EAAd01D,EAAM/zD,MACnB,OAA0B+0D,GAAiBhB,EAAO6F,GAAwB,WAG9E,GAAwB,EAApB8d,EAAY13E,MAAiC,CAE7C,MAAMu+D,EAAQrM,EAAM/3C,KAId43C,EAAoCwM,EAFTA,EAAMmZ,EAAY3oE,OAEG+pD,gBAAmB/G,cAOzE,GAAIA,IAAkB9C,GAAoBI,WACtC0C,IAAkB9C,GAAoBE,OACtC,OAAO,KAGf,OAA0B4F,GAAiB2iB,EAAa9d,GAahE,SAASgc,GAAmBrhB,EAAUnzC,EAAQ0sB,EAAO2nC,GAE7CnhB,GAAqBC,GACrBA,EAASojB,aAAav2D,EAAQ0sB,EAAO2nC,GAGrCr0D,EAAOu2D,aAAa7pC,EAAO2nC,GAAY,GAS/C,SAASE,GAAkBphB,EAAUnzC,EAAQ0sB,GAGrCwmB,GAAqBC,GACrBA,EAASyO,YAAY5hD,EAAQ0sB,GAG7B1sB,EAAO4hD,YAAYl1B,GAU3B,SAAS8pC,GAA2BrjB,EAAUnzC,EAAQ0sB,EAAO2nC,GACtC,OAAfA,EACAG,GAAmBrhB,EAAUnzC,EAAQ0sB,EAAO2nC,GAG5CE,GAAkBphB,EAAUnzC,EAAQ0sB,GAyB5C,SAASwnC,GAAiB/gB,EAAU1lB,GAChC,OAA2BylB,GAAqBC,GAAYA,EAASzlB,WAAWD,GAAQA,EAAKC,WAkBjG,SAAS+oC,GAAoBH,EAAa5iB,GACtC,GAAyB,IAArB4iB,EAAYr5E,KAAuB,CAEnC,MAAMo1E,EAAawB,GAAc,EAAkCngB,GACnE,OAAmB,OAAf2e,EACO,KAGJqE,GADOrE,EAAW72E,QAAQk4D,EA5vWT,GAAA,EA6vWW2e,GAElC,OAAyB,IAArBiE,EAAYr5E,MACI,IAArBq5E,EAAYr5E,KACL02D,GAAiB2iB,EAAa5iB,GAElC,KAaX,SAASkO,GAAY9Q,EAAO4C,EAAOijB,EAASC,GAExC,MAAMjC,EAAe0B,GAAgBvlB,EAAO8lB,EAAYljB,GACxD,GAAoB,MAAhBihB,EAAsB,CAEtB,MAAMxhB,EAAWO,EA9yXR,IAkzXHmjB,EAAaJ,GAFCG,EAAW52D,QAA6B0zC,EA1zXrD,GA4zX6CA,GACpD,GAAInlD,MAAM4I,QAAQw/D,GACd,IAAK,IAAIt8E,EAAI,EAAGA,EAAIs8E,EAAQl8E,OAAQJ,IAChCm8E,GAA2BrjB,EAAUwhB,EAAcgC,EAAQt8E,GAAIw8E,QAInEL,GAA2BrjB,EAAUwhB,EAAcgC,EAASE,IAgExE,SAASH,GAAqBI,EAAsBzE,GAEhD,MAAM0E,EAl2WsB,EAk2WoBD,EAAuB,EACvE,GAAIC,EAAgB1E,EAAW53E,OAAQ,CAEnC,MAAMi5D,EAA2B2e,EAAW0E,GAEtCC,EAAmBtjB,EAp5XnB,GAo5XgCqR,WACtC,GAAyB,OAArBiS,EACA,OA7DZ,SAASC,EAAmBvjB,EAAOf,GAC/B,GAAc,OAAVA,EAAgB,CAGhB,MAAMukB,EAAYvkB,EAAM11D,KACxB,GAAkB,IAAdi6E,EACA,OAAOvjB,GAAiBhB,EAAOe,GAE9B,GAAkB,IAAdwjB,EACL,OAAOR,IAAsB,EAAGhjB,EAAMf,EAAMhlD,QAE3C,GAAkB,IAAdupE,GAAwD,IAAdA,EAAoC,CAEnF,MAAMC,EAAsBxkB,EAAMjmB,MAClC,GAA4B,OAAxByqC,EACA,OAAOF,EAAmBvjB,EAAOyjB,GAEhC,CAED,MAAMC,EAAoB1jB,EAAMf,EAAMhlD,OACtC,OAAI8kD,GAAa2kB,GACNV,IAAsB,EAAGU,GAGzB5jB,GAAY4jB,IAI1B,CAED,MAAMxF,EAAgBle,EAz1XC,IA21XjB2jB,EAAmCzF,EA/2XtC,GAi3XGzW,EAAa4O,GAAe6H,GAE5B0F,EAA0CD,EAA0B,WAAqB1kB,EAAiB,YAChH,OAA2B,MAAvB2kB,EACOL,EAAmB,EAAiCK,GAGpDL,EAAmBvjB,EAAOf,EAAM19B,OAInD,OAAO,KA7CX,CA6DsCy+B,EAAOsjB,GAGzC,OAAO3E,EAt3WI,GAq5Wf,SAASkF,GAAWpkB,EAAU5rC,EAAQorC,EAAOe,EAAOihB,EAAcN,EAAYmD,GAC1E,KAAgB,MAAT7kB,GAAe,CAIlB,MAAM8kB,EAAe/jB,EAAMf,EAAMhlD,OAE3BupE,EAAYvkB,EAAM11D,KACpBu6E,GACe,IAAXjwD,IACAkwD,GAAgB/P,GAAgBlU,GAAYikB,GAAe/jB,GAC3Df,EAAM/zD,OAAS,GAGqB,KAAzB,GAAd+zD,EAAM/zD,SACW,IAAds4E,GAAwD,IAAdA,GAC1CK,GAAWpkB,EAAU5rC,EAAQorC,EAAMjmB,MAAOgnB,EAAOihB,EAAcN,GAAY,GAC3EF,GAA0B5sD,EAAQ4rC,EAAUwhB,EAAc8C,EAAcpD,IAErD,IAAd6C,EACLQ,GAAyBvkB,EAAU5rC,EAAQmsC,EAAO,EAA4BihB,EAAcN,GAI5FF,GAA0B5sD,EAAQ4rC,EAAUwhB,EAAc8C,EAAcpD,IAGhF1hB,EAAQ6kB,EAAe7kB,EAAMqc,eAAiBrc,EAAM19B,MA2B5D,SAAS4/C,GAAU/jB,EAAO4C,EAAOP,EAAU5rC,EAAQotD,EAAcN,GAI7DkD,GAAWpkB,EAAU5rC,EADoBupC,EAAW,KAAEpkB,MACVgnB,EAAOihB,EAAcN,GAAY,GAuCjF,SAASqD,GAAyBvkB,EAAU5rC,EAAQmsC,EAAOikB,EAAiBhD,EAAcN,GAEtF,MAAMuD,EAAiBlkB,EA7/XQ,IAmgYzBmkB,EAJmCD,EAnhY9B,GAuhYkF,WAAED,EAAgB1I,YAC/G,GAAI1gE,MAAM4I,QAAQ0gE,GAMd,IAAK,IAAIx9E,EAAI,EAAGA,EAAIw9E,EAAsBp9E,OAAQJ,IAG9C85E,GAA0B5sD,EAAQ4rC,EAAUwhB,EAD9BkD,EAAsBx9E,GAC6Bg6E,QAQrEkD,GAAWpkB,EAAU5rC,EAHDswD,EAE+BD,EA9iY5C,GA+iY8DjD,EAAcN,GAAY,GAoHvG,SAASyD,GAAiB3kB,EAAU/kB,EAAS9qB,GAErC4vC,GAAqBC,GACrBA,EAAS0G,aAAazrB,EAAS,QAAS9qB,GAGxC,EAA+B8iB,MAAM2xC,QAAUz0D,EAevD,SAAS00D,GAAiB7kB,EAAU/kB,EAAS9qB,GAErC4vC,GAAqBC,GACJ,KAAb7vC,EAEA6vC,EAASiQ,gBAAgBh1B,EAAS,SAGlC+kB,EAAS0G,aAAazrB,EAAS,QAAS9qB,GAI5C8qB,EAAQ05B,UAAYxkD,EAgE5B,MAAM20D,GAKF,YAAYzY,EAAQ0Y,GAChBv+E,KAAK6lE,OAASA,EACd7lE,KAAKu+E,oBAAsBA,EAC3Bv+E,KAAKw+E,QAAU,KACfx+E,KAAKy+E,kBAAoB,KAIzBz+E,KAAK0+E,WAAa,KAKtB,gBAEI,MAAM3kB,EAAQ/5D,KAAK6lE,OACnB,OAAmB,MAAf9L,EA/xYC,GAgmZb,SAAS4kB,EAAmBxnB,EAAO4C,EAAOf,EAAOtxD,EAAQm2E,GAAe,GACpE,KAAiB,OAAV7kB,GAAgB,CAGnB,MAAM4lB,EAAQ7kB,EAAMf,EAAMhlD,OAO1B,GANc,OAAV4qE,GACAl3E,EAAOrE,KAAKw2D,GAAY+kB,IAKxB9lB,GAAa8lB,GACb,IAAK,IAAIl+E,EA7jYW,EA6jYkBA,EAAIk+E,EAAM99E,OAAQJ,IAAK,CAEzD,MAAMm+E,EAAoBD,EAAMl+E,GAE1Bo+E,EAAuBD,EA9mZ/B,GA8mZwDzT,WACzB,OAAzB0T,GACAH,EAAmBE,EAhnZzB,GAgnZmDA,EAAmBC,EAAsBp3E,GAKlG,MAAM61E,EAAYvkB,EAAM11D,KACxB,GAAkB,IAAdi6E,GAAwD,IAAdA,EAC1CoB,EAAmBxnB,EAAO4C,EAAOf,EAAMjmB,MAAOrrC,QAE7C,GAAkB,IAAd61E,EAAkC,CAEvC,MAAMtF,EAAgBle,EA7lZC,IA+lZjB2jB,EAAmCzF,EAnnZtC,GAqnZGzW,EAAa4O,GAAe6H,GAElC,IAAI8G,EAAyCrB,EAA0B,WAAqB1kB,EAAiB,YAClF,OAAvB+lB,GAA8C,OAAfvd,GAC/Bmd,EAAmBnd,EAnoZrB,GAmoZwCA,EAAYud,EAAoBr3E,GAAQ,GAGtFsxD,EAAQ6kB,EAAe7kB,EAAMqc,eAAiBrc,EAAM19B,KAExD,OAAO5zB,EA1CX,CA9TsCqyD,EAhyYxB,GAgyYsCA,EADHA,EArxYlC,GAsxYsDhnB,MAAO,IAE7D,GAKX,cAAgB,OAA0B/yC,KAAK6lE,OAzxYnC,GA6xYZ,gBACI,OAAsD,MAAzB,IAArB7lE,KAAK6lE,OA1yYP,IA+yYV,UACI,GAAI7lE,KAAKw+E,QACLx+E,KAAKw+E,QAAQhD,WAAWx7E,WAEvB,GAAIA,KAAKy+E,kBAAmB,CAE7B,MAAMzqE,EAAQhU,KAAKy+E,kBAAkB58E,QAAQ7B,MACzCgU,GAAS,GACThU,KAAKy+E,kBAAkBO,OAAOhrE,GAElChU,KAAKy+E,kBAAoB,KAE7B1C,GAAa/7E,KAAK6lE,OA7zYZ,GA6zY2B7lE,KAAK6lE,QAM1C,UAAUt1C,GAnkFd,IAAwB4mC,EAAO4C,EAAOklB,EAAd9nB,EAmkFiBn3D,KAAK6lE,OAn0YhC,GAgwTwBoZ,EAmkFoC1uD,EAlkFtEqpD,GAD2B7f,EAmkF8B/5D,KAAK6lE,QAlkF3CxiE,KAAK47E,GACpB9nB,EAAMoL,iBACNsX,GAAgB1iB,GAAO9zD,KAAwB02D,EAvvTvC,GAuvTwDj5D,OAAS,EAAG,MAomFhF,eAAiBq4E,GAAcn5E,KAAKu+E,qBAAuBv+E,KAAK6lE,QAsDhE,SAAW7lE,KAAK6lE,OA35YN,KA25YuB,IAyDjC,WAAa7lE,KAAK6lE,OAp9YR,IAo9YyB,IAuBnC,gBAAkBuT,GAAsBp5E,KAAK6lE,OA7+YnC,GA6+YkD7lE,KAAK6lE,OAAQ7lE,KAAKsY,SAQ9E,kBAljDJ,SAAgC6+C,EAAO9sB,EAAM/xB,GACzCwjD,IAAsB,GACtB,IACIsd,GAAsBjiB,EAAO9sB,EAAM/xB,WAGnCwjD,IAAsB,IAN9B,CAkjD8C97D,KAAK6lE,OAr/YrC,GAq/YoD7lE,KAAK6lE,OAAQ7lE,KAAKsY,SAKhF,yBAAyB4mE,GACrB,GAAIl/E,KAAKw+E,QACL,MAAM,IAAI/3E,MAAM,iEAEpBzG,KAAKy+E,kBAAoBS,EAK7B,mBA9vCJ,IAAiCnlB,EA+vCzB/5D,KAAKw+E,QAAU,KA9vCnBtD,GA+vCqBl7E,KAAK6lE,OArgZhB,GAqwWmB9L,EAgwCY/5D,KAAK6lE,OA/vCtB9L,EAlvWX,IAkvW4B,EAAgB,KAAM,MAqwC/D,eAAeolB,GACX,GAAIn/E,KAAKy+E,kBACL,MAAM,IAAIh4E,MAAM,qDAEpBzG,KAAKw+E,QAAUW,GA8CvB,MAAMC,WAAoBd,GAItB,YAAYe,GACRp4B,MAAMo4B,GACNr/E,KAAKq/E,MAAQA,EAKjB,gBAAkB/F,GAAwBt5E,KAAKq/E,OAI/C,kBAtnDJ,SAAkCtlB,GAC9B+B,IAAsB,GACtB,IACIwd,GAAwBvf,WAGxB+B,IAAsB,IAN9B,CAsnDgD97D,KAAKq/E,OAIjD,cAAgB,OAAO,MA0E3B,IAAIC,GAiBAC,GAuEAC,GA/EJ,SAASC,GAAiBC,EAAiB1mB,EAAO3uB,GAK9C,OAJKi1C,KACDA,GAAe,cAAyBI,KAGrC,IAAIJ,GAAgCtlB,GAAiBhB,EAAO3uB,IAyBvE,SAASs1C,GAAkBC,EAAkBF,EAAiBzc,EAAW5I,GAwCrE,OAvCKklB,KACDA,GAAgB,cAA0BK,EAMtC,YAAYC,EAAkBC,EAAwBC,GAClD94B,QACAjnD,KAAK6/E,iBAAmBA,EACxB7/E,KAAK8/E,uBAAyBA,EAC9B9/E,KAAK+/E,WAAaA,EAMtB,mBAAmBznE,GAEf,MAAMo6D,EAAmC1yE,KAAK8/E,uBAA8B,OAEtErN,EAAgBpB,GAAYrxE,KAAK6/E,iBAAkBnN,EAAep6D,EAAS,GAAsB,KAAMo6D,EAAc5+B,MAI3H2+B,EA3rZe,IAyrZezyE,KAAK6/E,iBAAiB7/E,KAAK8/E,uBAAuB9rE,OAIhF,MAAMgsE,EAA0BhgF,KAAK6/E,iBArtZrC,GAstZgC,OAA5BG,IACAvN,EAvtZJ,GAutZ6BuN,EAAwBC,mBAAmBvN,IAExEd,GAAWc,EAAeD,EAAen6D,GAEzC,MAAM4nE,EAAU,IAAI5B,GAAQ7L,GAE5B,OADAyN,EAAQxB,WAAgCjM,EA1tZzC,GA2tZQyN,KAII,IAAnBjd,EAAU3/D,KAEH,IAAIi8E,GAAcllB,EAAU,EAAgColB,GAAiBC,EAAiBzc,EAAW5I,IAGzG,KA2Bf,SAAS8lB,GAAmBC,EAAuBV,EAAiBzc,EAAW5I,GA2N3E,IAAIqe,EA1NC8G,KACDA,GAAqB,cAA+BY,EAMhD,YAAYC,EAAaC,EAAYC,GACjCt5B,QACAjnD,KAAKqgF,YAAcA,EACnBrgF,KAAKsgF,WAAaA,EAClBtgF,KAAKugF,UAAYA,EAKrB,cACI,OAAOd,GAAiBC,EAAiB1/E,KAAKsgF,WAAYtgF,KAAKugF,WAKnE,eAAiB,OAAO,IAAI3c,GAAa5jE,KAAKsgF,WAAYtgF,KAAKugF,WAK/D,qBAEI,MAAMtf,EAAiB2B,GAA0B5iE,KAAKsgF,WAAYtgF,KAAKugF,WAEjE/e,EAAaJ,GAAsBH,EAAgBjhE,KAAKugF,WAExD5D,EA9kBtB,SAAgCtb,EAAUC,EAAWkf,GAEjD,GAAIA,EAAWn6D,SAA+C,IAArCm6D,EAAWn6D,OAAOm8C,cAAsB,CAG7D,MAAMA,EAAgBge,EAAWn6D,OAAOm8C,cAExC,IAAIxJ,EAAQwnB,EAAWn6D,OAGvB,KAAuB,MAAhB2yC,EAAM3yC,QAAkBm8C,GAAiBxJ,EAAM3yC,OAAOm8C,eACzDxJ,EAAQA,EAAM3yC,OAElB,OAAO2yC,EAGX,IAAIuI,EAAaJ,GAA4BE,GAGzCG,EAAaF,EAEbqb,EAAiCrb,EAxuY1B,GA0uYX,KAAOC,EAAa,GAChBC,EAAgCA,EAztYf,IA0tYjBmb,EAAiCnb,EA5uY1B,GA6uYPD,IAEJ,OAAOob,EA5BX,CA8kB2D1b,EAAgBjhE,KAAKugF,UAAWvgF,KAAKsgF,YAChF,OAAQtf,GAAkBC,IAAkC,MAAf0b,EAEzC,IAAI/Y,GAAa+Y,EAAanb,GAD9B,IAAIoC,GAAa,KAAM5jE,KAAKugF,WAMpC,QACI,KAAOvgF,KAAKc,OAAS,GACjBd,KAAKshC,OAAOthC,KAAKc,OAAS,GAOlC,IAAIkT,GACA,OAAuC,OAAhChU,KAAKqgF,YAxxYV,IAwxYgErgF,KAAKqgF,YAxxYrE,GAwxY8FrsE,IAAU,KAK9G,aAAe,OAAOhU,KAAKqgF,YAAYv/E,OArxYnB,EA6xYpB,mBAAmB2/E,EAAanoE,EAAStE,GAErC,MAAMksE,EAAUO,EAAYR,mBAAmB3nE,GAAW,IAE1D,OADAtY,KAAK0gF,OAAOR,EAASlsE,GACdksE,EAWX,gBAAgBS,EAAkB3sE,EAAOm+C,EAAUyuB,EAAkBC,GAEjE,MAAMC,EAAkB3uB,GAAYnyD,KAAK+gF,eACzC,IAAKF,GAAmE,MAApD,EAAwCG,UAAoBF,EAAiB,CAK7F,MAAMp5E,EAASo5E,EAAgB7/D,IAAIgyC,GAAa,MAC5CvrD,IACAm5E,EAAcn5E,GAItB,MAAMu5E,EAAeN,EAAiB31E,OAAO81E,EAAiBF,OAAkB1qE,EAAW2qE,GAE3F,OADA7gF,KAAK0gF,OAAOO,EAAa5mB,SAAUrmD,GAC5BitE,EAOX,OAAOf,EAASlsE,GAEZ,MAAM+lD,EAA2B,EAAsC,OAEjE5C,EAAQ4C,EAp3ZhB,GAq3ZE,GAAImmB,EAAQgB,UACR,MAAM,IAAIz6E,MAAM,sDAGpB,GADAzG,KAAKmhF,4BAj5WVroB,GAk5WiCiB,EAr3Z7B,IAq3ZqC,CAGhC,MAAMqnB,EAAUphF,KAAK6B,QAAQq+E,GAK7B,IAAiB,IAAbkB,EACAphF,KAAKg/E,OAAOoC,OAEX,CAED,MAAMC,EAAoCtnB,EAl4ZnD,GAu4ZeunB,EAAY,IAAI9B,GAAmB6B,EAAmCA,EAj4ZrF,GAi4Z+GA,EAv4Z/G,IAw4ZSC,EAAUtC,OAAOsC,EAAUz/E,QAAQq+E,KAI3C,MAAMqB,EAAcvhF,KAAKwhF,aAAaxtE,GAOtC,OA9kDhB,SAAoBmjD,EAAO4C,EAAO2e,EAAY1kE,GAI1C,MAAM0nE,EAhyVsB,EAgyVuB1nE,EAE7CytE,EAAkB/I,EAAW53E,OAC/BkT,EAAQ,IAER0kE,EAAWgD,EAAmB,GA50WzB,GA40WoC3hB,GAEzC/lD,EAAQytE,EAvyVgB,GAwyVxB1nB,EA/0WK,GA+0WS2e,EAAWgD,GACzBpoB,GAAWolB,EAzyVa,EAyyVyB1kE,EAAO+lD,KAGxD2e,EAAWr1E,KAAK02D,GAChBA,EAp1WK,GAo1WS,MAElBA,EAx1WW,GAw1WK2e,EAGhB,MAAMkD,EAAwB7hB,EA/zWH,IAg0WG,OAA1B6hB,GAAkClD,IAAekD,GAmBzD,SAAwBN,EAAsBvhB,GAI1C,MAAM6e,EAAa0C,EAx1VH,GA61VVxC,EAHwC/e,EAr3WnC,GAAA,GA0BoB,IAi2W8D,KAA1B,GAAhC+e,EA73WzB,KAg4WyB/e,EAp2WJ,MAs2WI+e,IAK3BwC,EA92VS,IA82V6B,GAG3B,OAAf1C,EACA0C,EA92VY,GA82VwB,CAACvhB,GAGrC6e,EAAWv1E,KAAK02D,GA7BxB,CAlBuB6hB,EAAuB7hB,GAI1C,MAAM+hB,EAAW/hB,EA71WL,GA81WK,OAAb+hB,GACAA,EAAS4F,WAAWvqB,GAGxB4C,EAx2WU,IAw2WM,IAjCpB,CAwkD2B5C,EAAO4C,EAAO/5D,KAAKqgF,YAAakB,GAG3CpG,GAA2BhkB,EAAO4C,GAAO,EADtBgjB,GAAqBwE,EAAavhF,KAAKqgF,cAE1D,EAA+BsB,yBAAyB3hF,MACxDszD,GAA8BtzD,KAAKqgF,YAj3YjC,GAi3Y2DkB,EAAarB,GACnEA,EAOX,KAAKA,EAAS0B,GACV,GAAI1B,EAAQgB,UACR,MAAM,IAAIz6E,MAAM,oDAEpB,OAAOzG,KAAK0gF,OAAOR,EAAS0B,GAMhC,QAAQ1B,GAEJ,MAAM2B,EAAc7hF,KAAKqgF,YAr4YvB,GAs4YF,OAAuB,OAAhBwB,EAAuBA,EAAYhgF,QAAQq+E,IAAY,EAMlE,OAAOlsE,GACHhU,KAAKmhF,4BAEL,MAAMI,EAAcvhF,KAAKwhF,aAAaxtE,GAAQ,IAAA,SAl+C1C0kE,EAAY+C,GAE5B,MAAMqG,EAAetG,GAAW9C,EAAY+C,GAC5CqG,GAAgB/F,GAAa+F,EAr9WnB,GAq9WwCA,IA+9CQ,CACnC9hF,KAAKqgF,YAAakB,GAC7BhuB,GAAmCvzD,KAAKqgF,YAj5YtC,GAi5YgEkB,GAMtE,OAAOvtE,GACHhU,KAAKmhF,4BAEL,MAAMI,EAAcvhF,KAAKwhF,aAAaxtE,GAAQ,GAExCq2B,EAAOmxC,GAAWx7E,KAAKqgF,YAAakB,GAG1C,OADoBl3C,GAA0F,MAAlFkpB,GAAmCvzD,KAAKqgF,YA95YlE,GA85Y4FkB,GACzE,IAAIjD,GAAQ,GAA6B,KAQlE,aAAatqE,EAAO+7B,EAAQ,GACxB,OAAa,MAAT/7B,EACOhU,KAAKc,OAASivC,EAOlB/7B,EAMX,4BACwC,OAAhChU,KAAKqgF,YAv7YP,KAw7YErgF,KAAKqgF,YAx7YP,GAw7YgC,OAS9C,MAAM/lB,EAAYD,EAAS4I,EAAUjvD,OACrC,GAAI8kD,GAAawB,GAEboe,EAAape,EAl+WrB,SAAkCoe,EAAY1kE,GAC1C0kE,EA7+BiB,IA6+BU1kE,EAD/B,CAm+WiC0kE,OAExB,CAED,IAAIqJ,EAKJ,GAAuB,IAAnB9e,EAAU3/D,KACVy+E,EAAiCloB,GAAYS,QAU7C,GANAynB,EAAc1nB,EAp+ZT,IAo+Z4B2nB,cAAwC,IAMrE5oB,GAAWiB,GAAW,CAEtB,MAAMb,EAAWa,EA5+ZhB,IA8+ZKoe,EAAgCze,GAAiBiJ,EAAW5I,GAGlEwgB,GAAmBrhB,EADQ+gB,GAAiB/gB,EAAUif,GACgBsJ,EA7uCtF,SAA2BvoB,EAAU1lB,GACjC,OAAOylB,GAAqBC,GAAYA,EAASqQ,YAAY/1B,GAAQA,EAAK+1B,YAD9E,CA6uCqHrQ,EAAUif,SAG/GxQ,GAAY5N,EAxgad,GAwga+BA,EAAU0nB,EAAa9e,GAG5D5I,EAAS4I,EAAUjvD,OAAS0kE,EACxBF,GAAiBle,EAAWD,EAAU0nB,EAAa9e,GACvDiV,GAAc7d,EAAUqe,GAE5B,OAAO,IAAI8G,GAAmB9G,EAAYzV,EAAW5I,sBAuHnD4nB,UAMNA,EAAkB1wB,kBAAoB,IAGhC2wB,WAuEN,MASMA,GAzMN,SAAiCC,GAAS,GACtC,OAUJ,SAAuBnpB,EAAOe,EAAOooB,GAKjC,IADyBA,GAAUlpB,GAAgBD,GAC9B,CAIjB,MAAMif,EAAgB9d,GAAyBnB,EAAMhlD,MAAO+lD,GAC5D,OAAO,IAAIukB,GAAQrG,EAAeA,GAEjC,OAAmB,IAAfjf,EAAM11D,MAA2C,IAAf01D,EAAM11D,MAC9B,IAAf01D,EAAM11D,MAAoD,IAAf01D,EAAM11D,KAK1C,IAAIg7E,GADevkB,EAphaC,IAqhaWA,GAEnC,KApBX,CAVyBwB,KAA4BL,KAAYinB,IAu1B3DC,GAAiB,IAAI5wB,GAAe,uBAWpC6wB,GAAU,GASVC,GAAW,GAEXC,GAAgB,GAKtB,IAAIC,QAAgBtsE,EAIpB,SAASusE,KAIL,YAHsBvsE,IAAlBssE,KACAA,GAAgB,IAAIxvB,IAEjBwvB,GA2CX,SAASE,GAAuCC,EAASt8D,EAAS,KAAMu8D,EAAsB,KAAMn4E,GAChG,OAAO,IAAIo4E,GAAWF,EAASC,EAAqBv8D,GAAUo8D,KAAmBh4E,GAErF,MAAMo4E,GAOF,YAAYhiF,EAAK+hF,EAAqBv8D,EAAQzY,EAAS,MACnD5N,KAAKqmB,OAASA,EAMdrmB,KAAK8iF,QAAU,IAAIzmE,IAInBrc,KAAK+iF,iBAAmB,IAAIxmE,IAI5Bvc,KAAKu2D,UAAY,IAAIh6C,IACrBvc,KAAKgjF,YAAa,EAElB,MAAMC,EAAa,GAInBL,GAAuBvvB,GAAYuvB,EAInCM,GAAYljF,KAAKmjF,gBAAgBD,EAAUriF,EAAK+hF,IAChDvvB,GAAY,CAACxyD,GAIbolE,GAAejmE,KAAKojF,oBAAoBnd,EAAa,GAAIgd,IAEzDjjF,KAAK8iF,QAAQjkF,IAAI6yD,GAAU2xB,QAAWntE,EAAWlW,OAIjD,MAAMsjF,EAAStjF,KAAK8iF,QAAQ7hE,IAAImhE,IAChCpiF,KAAKujF,MAAkB,MAAVD,EAAiBA,EAAOj4E,MAAQ,KAE7CrL,KAAK4N,OAASA,IAA0B,iBAAR/M,EAAmB,KAAOsqC,GAAUtqC,IAMxE,gBAAkB,OAAOb,KAAKgjF,WAQ9B,UACIhjF,KAAKwjF,qBAELxjF,KAAKgjF,YAAa,EAClB,IAEIhjF,KAAKu2D,UAAUj3D,QAIfmkF,GAAWA,EAAQjtB,uBAInBx2D,KAAK8iF,QAAQlkE,QACb5e,KAAKu2D,UAAU33C,QACf5e,KAAK+iF,iBAAiBnkE,SAU9B,IAAIovC,EAAO4E,EAAgBjB,GAAoB1sD,EAAQmpD,GAAYoE,SAC/DxyD,KAAKwjF,qBAGL,MAAME,EAAmBxxB,GAAmBlyD,MAC5C,IAEI,KAAMiF,EAAQmpD,GAAYD,UAAW,CAGjC,IAAIm1B,EAAStjF,KAAK8iF,QAAQ7hE,IAAI+sC,GAC9B,QAAe93C,IAAXotE,EAAsB,CAItB,MAAMziF,GAghBG,mBADEwK,EA/gBuB2iD,IAihB5B,iBAAV3iD,GAAsBA,aAAiBmmD,KAjhBS1C,GAAiBd,GAIzDs1B,EAHAziF,GAAOb,KAAK2jF,qBAAqB9iF,GAGxBwiF,GAAWO,GAAkC51B,GAAQq0B,IAGrD,KAEbriF,KAAK8iF,QAAQjkF,IAAImvD,EAAOs1B,GAG5B,GAAc,MAAVA,EACA,OAAOtjF,KAAK6jF,QAAQ71B,EAAOs1B,GAYnC,OANuBr+E,EAAQmpD,GAAYF,KAAsBu0B,KAAdziF,KAAKqmB,QAMpCpF,IAAI+sC,EAHxB4E,EAAiB3tD,EAAQmpD,GAAYH,UAAa2E,IAAkBjB,GAChE,KACAiB,GAGR,MAAOngD,GACH,GAAe,sBAAXA,EAAEhI,KAA8B,CAIhC,IAFagI,EAAoB,gBAAIA,EAAoB,iBAAK,IACzDikE,QAAQvrC,GAAU6iB,IACnB01B,EAEA,MAAMjxE,EAIN,OAhsepB,SAA4BA,EAAGu7C,EAAO81B,EAAmBl2E,GAErD,MAAMm2E,EAAYtxE,EAAoB,gBAOtC,MANIu7C,EAAY,UACZ+1B,EAAUrN,QAAQ1oB,EAAY,UAElCv7C,EAAEyU,QAYN,SAAqB88D,EAAMn4C,EAAKi4C,EAAmBl2E,EAAS,MACxDo2E,EAAOA,GAA2B,OAAnBA,EAAKnkF,OAAO,IA9OX,UA8O0BmkF,EAAKnkF,OAAO,GAAoBmkF,EAAK/hF,OAAO,GAAK+hF,EAE3F,IAAI1rE,EAAU6yB,GAAUU,GACxB,GAAIj3B,MAAM4I,QAAQquB,GACdvzB,EAAUuzB,EAAIpqC,IAAI0pC,IAAWlrC,KAAK,aAEjC,GAAmB,iBAAR4rC,EAAkB,CAE9B,IAAI9kC,EAAQ,GACZ,IAAK,IAAI0O,KAAOo2B,EACZ,GAAIA,EAAI7yB,eAAevD,GAAM,CAEzB,IAAIpK,EAAQwgC,EAAIp2B,GAChB1O,EAAM1D,KAAKoS,EAAM,KAAwB,iBAAVpK,EAAqB6/B,KAAKC,UAAU9/B,GAAS8/B,GAAU9/B,KAG9FiN,EAAU,IAAIvR,EAAM9G,KAAK,SAE7B,MAAO,GAAG6jF,IAAoBl2E,EAAS,IAAMA,EAAS,IAAM,MAAM0K,OAAa0rE,EAAK7/E,QAAQytD,GAAU,UAnB1G,CAZ4B,KAAOn/C,EAAEyU,QAAS68D,EAAWD,EAAmBl2E,GACxE6E,EAAe,YAAIsxE,EACnBtxE,EAAoB,gBAAI,KAClBA,EATV,CAgse8CA,EAAGu7C,EAAO,kBAAmBhuD,KAAK4N,QAIhE,MAAM6E,UAKVy/C,GAAmBwxB,GAge/B,IAA+Br4E,EAzd3B,2BAA6BrL,KAAK+iF,iBAAiBzjF,QAInDqjF,GAAW3iF,KAAKihB,IAAI0hE,IAIpB,WAEI,MAAMsB,EAAS,GASf,OAPgBjkF,KAAK8iF,QACbxjF,QAAQ,CAKf+4C,EAAG2V,IAAUi2B,EAAO5gF,KAAK8nC,GAAU6iB,KAC7B,cAAci2B,EAAOhkF,KAAK,SAMrC,qBACI,GAAID,KAAKgjF,WACL,MAAM,IAAIv8E,MAAM,wCAiBxB,oBAAoBy9E,EAAiBC,EAASlB,GAE1C,KADAiB,EAAkBj0B,GAAkBi0B,IAEhC,OAAO,EAMX,IAAIrjF,EAAMquD,GAAeg1B,GAGzB,MAAMlD,EAAmB,MAAPngF,GAAgB,EAAuCmgF,eAAY9qE,EAK/EysE,OAAwBzsE,IAAb8qE,EAA0B,EAAyCA,EAa9EoD,GAA+C,IAAjCnB,EAAWphF,QAAQ8gF,GAOvC,QAJiBzsE,IAAb8qE,IACAngF,EAAMquD,GAAe8xB,IAGd,MAAPngF,EACA,OAAO,EAIX,GAAmB,MAAfA,EAAI6mC,UAAoB08C,EAAa,CAOrC,IAAIC,EAFJpB,EAAW5/E,KAAKs/E,GAGhB,IACItvB,GAAYxyD,EAAI6mC,QAIhB48C,IACQtkF,KAAKojF,oBAAoBkB,EAAUH,EAASlB,UACX/sE,IAA7BmuE,IACAA,EAA2B,IAG/BA,EAAyBhhF,KAAKihF,eAW1C,QAAiCpuE,IAA7BmuE,EACA,IAAK,IAAI3jF,EAAI,EAAGA,EAAI2jF,EAAyBvjF,OAAQJ,IAAK,CACtD,MAAM,SAAEsgF,EAAQ,UAAEnyB,GAAcw1B,EAAyB3jF,GACzD2yD,GAAY,EAIZ6vB,GAAYljF,KAAKmjF,gBAAgBD,EAAUlC,EAAUnyB,GAAa0zB,MAM9EviF,KAAK+iF,iBAAiB7jE,IAAIyjE,GAC1B3iF,KAAK8iF,QAAQjkF,IAAI8jF,EAASU,GAAWxiF,EAAI6tD,QAAS2zB,KAGlD,MAAMkC,EAAe1jF,EAAIguD,UACzB,GAAoB,MAAhB01B,IAAyBH,EAAa,CAEtC,MAAMI,EAAe,EACrBnxB,GAAYkxB,EAIZrB,GAAYljF,KAAKmjF,gBAAgBD,EAAUsB,EAAcD,IAE7D,YAAqBruE,IAAb8qE,QACiD9qE,IAArD,EAAuC24C,UAU/C,gBAAgBq0B,EAAUuB,EAAc51B,GAKpC,IAAIb,EAAQ02B,GAFZxB,EAAWjzB,GAAkBizB,IAEUA,EAAWjzB,GAAkBizB,GAAYA,EAASpxB,SAGzF,MAAMwxB,EAkLd,SAA0BJ,EAAUuB,EAAc51B,GAC9C,OAAI81B,GAAgBzB,GACTG,QAAWntE,EAAWgtE,EAASnxB,UAK/BsxB,GADSuB,GAAkB1B,EAAUuB,EAAc51B,GAC/BwzB,IAPnC,CAlLwCa,EAAUuB,EAAc51B,GACxD,GAAK61B,GAAexB,KAAgC,IAAnBA,EAAS2B,MAsBrC,CAED,MAAMrhC,EAAWxjD,KAAK8iF,QAAQ7hE,IAAI+sC,GAC9BxK,QAA+BttC,IAAnBstC,EAASqhC,OACrB5W,SA1BkD,CAItD,IAAI6W,EAAc9kF,KAAK8iF,QAAQ7hE,IAAI+sC,GAC/B82B,OAE0B5uE,IAAtB4uE,EAAYD,OACZ5W,MAIJ6W,EAAczB,QAAWntE,EAAWmsE,IAAS,GAC7CyC,EAAYp2B,QAAU,IAGhBoE,GAA8B,EAAuC,OAC3E9yD,KAAK8iF,QAAQjkF,IAAImvD,EAAO82B,IAE5B92B,EAAQk1B,EACW4B,EAAkB,MAAEzhF,KAAK6/E,GAShDljF,KAAK8iF,QAAQjkF,IAAImvD,EAAOs1B,GAS5B,QAAQt1B,EAAOs1B,GAwQnB,IAAsBj4E,EA7Pd,OAVIi4E,EAAOj4E,QAAUi3E,GA1nR7B,SAAoCt0B,GAChC,MAAM,IAAIvnD,MAAM,yCAAyCunD,GAD7D,CA2nRuC7iB,GAAU6iB,IAEhCs1B,EAAOj4E,QAAUg3E,KACtBiB,EAAOj4E,MAAQi3E,GACfgB,EAAOj4E,MAA2Bi4E,EAAe,WAEzB,iBAAjBA,EAAOj4E,OAAsBi4E,EAAOj4E,OAiQlC,QADCA,EAhQuDi4E,EAAOj4E,QAiQtC,iBAAVA,GACwB,mBAA7C,EAA6BmrD,aAjQhCx2D,KAAKu2D,UAAUr3C,IAAIokE,EAAOj4E,OAEJi4E,EAAa,MAO3C,qBAAqBziF,GACjB,QAAKA,EAAI4tD,aAG0B,iBAAnB5tD,EAAI4tD,WACU,QAAnB5tD,EAAI4tD,YAAyB5tD,EAAI4tD,aAAezuD,KAAKujF,MAGrDvjF,KAAK+iF,iBAAiBhsE,IAAIlW,EAAI4tD,cA8CjD,SAASm1B,GAAkC51B,GAGvC,MAAM6E,EAAgB/D,GAAiBd,GAEjCU,EAA4B,OAAlBmE,EAAyBA,EAAcnE,QAAU+J,GAAczK,GAC/E,GAAgB,OAAZU,EACA,OAAOA,EAKX,MAAMuX,EAAc/W,GAAelB,GACnC,GAAoB,OAAhBiY,EACA,OAAOA,EAAYvX,QAIvB,GAAIV,aAAiBwD,GACjB,MAAM,IAAI/qD,MAAM,SAAS0kC,GAAU6iB,0CAGvC,GAAIA,aAAiBj8C,SACjB,OASR,SAAyCi8C,GAGrC,MAAM+2B,EAAc/2B,EAAMltD,OAC1B,GAAIikF,EAAc,EAAG,CAEjB,MAAMtxE,EAAO+/C,GAASuxB,EAAa,KACnC,MAAM,IAAIt+E,MAAM,oCAAoC0kC,GAAU6iB,QAAYv6C,EAAKxT,KAAK,WAQxF,MAAM+kF,EArrgBV,SAAmC1hF,GAE/B,MAAMzC,EAAMyC,IAASA,EAAK0rD,KAAgB1rD,EAAK2rD,KAC1C3rD,EAAKisD,KAAyBjsD,EAAKisD,OACxC,GAAI1uD,EAAK,CACL,MAAMokF,EAYd,SAAqB3hF,GAOjB,GAAIA,EAAK0V,eAAe,QACpB,OAAO1V,EAAKmH,KAEhB,MAAM1K,GAAS,GAAKuD,GAAMvD,MAAM,yBAChC,OAAiB,OAAVA,EAAiB,GAAKA,EAAM,GAXvC,CAZqCuD,GAK7B,OAFAhC,QAAQoxC,KAAK,4CAA4CuyC,mJACiBA,aACnEpkF,EAGP,OAAO,KAbf,CAqrgB6DmtD,GACzD,OAA+B,OAA3Bg3B,EACO,IAGDA,EAAuBt2B,QAAQ,GAG9B,IAGD,IAAI,EA1BlB,CAT+CV,GAG3C,MAAM,IAAIvnD,MAAM,eA2DpB,SAASm+E,GAAkB1B,EAAUuB,EAAc51B,GAE/C,IAAIH,OAAUx4C,EACd,GAAIwuE,GAAexB,GAAW,CAE1B,MAAMgC,EAAoBj1B,GAAkBizB,GAC5C,OAAOzqB,GAAcysB,IAAsBtB,GAAkCsB,GAG7E,GAAIP,GAAgBzB,GAChBx0B,EAAU,IAGJuB,GAAkBizB,EAASnxB,eAEhC,IAgEc1mD,EAhEQ63E,IAiEZ,EAA6BiC,WAhExCz2B,EAAU,IAGJw0B,EAASiC,cAAcryB,GAAWowB,EAASkC,MAAQ,UAExD,GAmDb,SAA4B/5E,GACxB,SAAUA,IAAS,EAA6Bg6E,aADpD,CAnDoCnC,GACxBx0B,EAAU,IAGJgE,GAASzC,GAAkBizB,EAASmC,kBAEzC,CAED,MAAMC,EAAWr1B,GAAkBizB,IAC9B,EAAgCqC,UAAYrC,EAASpxB,UAI1D,GAHKwzB,GA9xRjB,SAAmCb,EAAc51B,EAAWq0B,GAExD,IAAIsC,EAAiB,GAWrB,MAVIf,GAAgB51B,IAOhB22B,EACI,6DANmB32B,EAAUptD,IAIjC42C,GAAKA,GAAK6qC,EAAW,IAAMA,EAAW,IAAM,OAEoCjjF,KAAK,UAEnF,IAAIwG,MAAM,sCAAsC0kC,GAAUs5C,MAAmBe,GAbvF,CA+xR0Cf,EAAc51B,EAAWq0B,IAoEnE,SAAiB73E,GACb,QAAS,EAA6B+5E,KAD1C,CAlEwBlC,GAOR,OAAOzqB,GAAc6sB,IAAa1B,GAAkC0B,GANpE52B,EAAU,IAGJ,IAAI,KAAcoE,GAAWowB,EAASkC,OAyC5D,IAA2B/5E,EAlCvB,OAAOqjD,EASX,SAAS20B,GAAW30B,EAASrjD,EAAOw5E,GAAQ,GACxC,MAAO,CACHn2B,QAASA,EACTrjD,MAAOA,EACPw5E,MAAOA,EAAQ,QAAK3uE,GAO5B,SAASyuE,GAAgBt5E,GACrB,OAAiB,OAAVA,GAAkC,iBAATA,GAAqBwmD,MAAaxmD,EAoBtE,SAASq5E,GAAer5E,GACpB,MAAwB,mBAAVA,EAyDlB,MAAMo6E,GAJN,SAAkC52B,EAAWxoC,EAAQ5b,GACjD,OAlqBJ,SAAwBk4E,EAASt8D,EAAS,KAAMu8D,EAAsB,KAAMn4E,GAExE,MAAM0nD,EAAWuwB,GAAuCC,EAASt8D,EAAQu8D,EAAqBn4E,GAE9F,OADA0nD,EAASuzB,2BACFvzB,EAJX,CAkqB0B,CAAE1nD,KAAMA,GAAQ4b,EAAQwoC,EAAWpkD,uBA6BvDk7E,EAMF,cAAcjmF,EAAS2mB,GACnB,OAAIzR,MAAM4I,QAAQ9d,GACP+lF,GAAc/lF,EAAS2mB,EAAQ,IAG/Bo/D,GAAc/lF,EAAQmvD,UAAWnvD,EAAQ2mB,OAAQ3mB,EAAQ+K,MAAQ,YAIpFk7E,EAASh0B,mBAAqBA,GAC9Bg0B,EAASC,KAAO,IAAI5yB,GAED2yB,EAASt2B,WAAQb,GAAmB,CACnDR,MAAO23B,EACPl3B,WAAY,MACZC,QAAS,IAGHgE,GAAShB,MAMnBi0B,EAASp0B,mBAAqB,QAm1D9B,MAAMs0B,GAA+B,IAAIr0B,GAAe,6BA0PxD,IAAIs0B,GAAmC,IAAIzpE,IAG3C,MAAM0pE,GAAgC,IAAIxpE,IA4D1C,SAASypE,GAAehd,GACpB,MAA0B,iBAAZA,EAAuBA,EAAWA,EAASgb,OAwB7D,SAASiC,GAAqBjtB,EAAO6G,GAIjC,IAAInzB,EAASssB,EAAMtsB,OAEf8oC,EAAUxc,EAAMwc,QAEhBzZ,EAAO,EACX,IAAK,IAAIr7D,EAAI,EAAGA,EAAIm/D,EAAM/+D,OAAQJ,IAAK,CAEnC,MAAM2K,EAAQw0D,EAAMn/D,GACC,iBAAV2K,EACP0wD,EAAO1wD,EAEM,GAAR0wD,EACLyZ,EAAU3lB,GAAuB2lB,EAAS,GAE7B,GAARzZ,IAKLrvB,EAASmjB,GAAuBnjB,EAHlB,EAGkC,KADVmzB,IAAQn/D,GACsB,MAGjE,OAAXgsC,IAAoBssB,EAAMtsB,OAASA,GACvB,OAAZ8oC,IAAqBxc,EAAMwc,QAAUA,GAUzC,IAAI0Q,GAAkB,KACtB,SAAS,KACL,IAAKA,GAAiB,CAClB,MAAMzsE,EAASg3C,GAAgB,OAC/B,GAAIh3C,GAAUA,EAAOW,SACjB8rE,GAAkBzsE,EAAOW,aAExB,CAED,MAAM/a,EAAOD,OAAO+tC,oBAAoB9wB,IAAIpb,WAC5C,IAAK,IAAIP,EAAI,EAAGA,EAAIrB,EAAKyB,SAAUJ,EAAG,CAClC,MAAM+U,EAAMpW,EAAKqB,GACL,YAAR+U,GAA6B,SAARA,GACrB4G,IAAIpb,UAAUwU,KAAS4G,IAAIpb,UAAmB,UAC9CilF,GAAkBzwE,KAKlC,OAAOywE,GA4DX,SAASC,GAAelnF,EAAGC,GACvB,OAAOD,IAAMC,GAAkB,iBAAND,GAA+B,iBAANC,GAAkB8lC,MAAM/lC,IAAM+lC,MAAM9lC,GAuE1F,MAAMknF,GAIF,YAAY/6E,GAASrL,KAAK0qC,QAAUr/B,EAMpC,YAAYA,GAAS,OAAO,IAAI+6E,GAAa/6E,GAQ7C,cAAcA,GAAS,OAAO+6E,GAAaC,UAAUh7E,GAASA,EAAMq/B,QAAUr/B,EAM9E,iBAAiBA,GAAS,OAAOA,aAAiB+6E,IAatD,SAASE,GAAqBz6C,GAC1B,QAAK06C,GAAa16C,KAEXj3B,MAAM4I,QAAQquB,MACdA,aAAexvB,MACd,OAAuBwvB,GAmDnC,SAAS06C,GAAat4C,GAClB,OAAa,OAANA,IAA4B,mBAANA,GAAiC,iBAANA,GAgB5D,SAASu4C,GAAczsB,EAAOqC,EAAc/wD,GACxC,OAAO0uD,EAAMqC,GAAgB/wD,EAQjC,SAASo7E,GAAW1sB,EAAOqC,GAIvB,OAAOrC,EAAMqC,GAejB,SAASsqB,GAAe3sB,EAAOqC,EAAc/wD,GAMzC,OAAIjM,OAAOunF,GADM5sB,EAAMqC,GACC/wD,KAoBpB0uD,EAAMqC,GAAgB/wD,GACf,GAWf,SAASu7E,GAAgB7sB,EAAOqC,EAAcyqB,EAAMC,GAEhD,MAAMC,EAAYL,GAAe3sB,EAAOqC,EAAcyqB,GACtD,OAAOH,GAAe3sB,EAAOqC,EAAe,EAAG0qB,IAASC,EAW5D,SAASC,GAAgBjtB,EAAOqC,EAAcyqB,EAAMC,EAAMG,GAEtD,MAAMF,EAAYH,GAAgB7sB,EAAOqC,EAAcyqB,EAAMC,GAC7D,OAAOJ,GAAe3sB,EAAOqC,EAAe,EAAG6qB,IAASF,EAY5D,SAASG,GAAgBntB,EAAOqC,EAAcyqB,EAAMC,EAAMG,EAAME,GAE5D,MAAMJ,EAAYH,GAAgB7sB,EAAOqC,EAAcyqB,EAAMC,GAC7D,OAAOF,GAAgB7sB,EAAOqC,EAAe,EAAG6qB,EAAME,IAASJ,EAsBnE,SAASK,GAAY38E,EAAMY,EAAOmhE,EAAW2E,GAEzC,MAAMpX,EAAQmB,KAWd,OARIwrB,GAAe3sB,EADEsC,KACmBhxD,KAEtB8vD,KAGdgd,GADcta,KACkB9D,EAAOtvD,EAAMY,EAAOmhE,EAAW2E,IAG5DiW,GAuDX,SAASC,GAAettB,EAAO7wB,EAAQo+C,EAAIC,GAGvC,OADkBb,GAAe3sB,EAAOsC,KAAoBirB,GACzCp+C,EAASu4B,GAAgB6lB,GAAMC,EAASpX,GAY/D,SAASqX,GAAeztB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIH,GAE/C,MAEMR,EAAYH,GAAgB7sB,EAFboC,KAEkCmrB,EAAII,GAE3D,OADAprB,GAAsB,GACfyqB,EAAY79C,EAASu4B,GAAgB6lB,GAAMG,EAAKhmB,GAAgBimB,GAAMH,EAASpX,GAc1F,SAASwX,GAAe5tB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIN,GAEvD,MAEMR,EAAYC,GAAgBjtB,EAFboC,KAEkCmrB,EAAII,EAAIG,GAE/D,OADAvrB,GAAsB,GACfyqB,EACH79C,EAASu4B,GAAgB6lB,GAAMG,EAAKhmB,GAAgBimB,GAAME,EAAKnmB,GAAgBomB,GAAMN,EACrFpX,GA4sBR,SAAS2X,GAAW9zE,EAAO89D,EAAY/c,EAAOC,EAAMuW,EAASwc,EAAYC,EAAgB7T,GAErF,MAAMpa,EAAQmB,KAER/D,EAAQgE,KAERuW,EAAgB19D,EA1+jBJ,GA4+jBZglD,EAAQ7B,EAAMoL,gBAlDxB,SAAiCvuD,EAAOmjD,EAAO4C,EAAO+X,EAAY/c,EAAOC,EAAMuW,EAASwc,EAAYC,GAIhG,MAAMC,EAAc9wB,EAAMlC,OAGpB+D,EAAQyY,GAAiBta,EAAO4C,EA99jB3B,GA89jB0C/lD,EAAO,EAAmBu3D,GAAW,KAAM7Q,GAAYutB,EAAaF,IACzH1R,GAAkBlf,EAAO4C,EAAOf,EAAO0B,GAAYutB,EAAaD,IAChElqB,GAAuB3G,EAAO6B,GAE9B,MAAM0Z,EAAgB1Z,EAAMoc,OAASb,GAAY,GAAmB,EAAGzC,EAAY/c,EAAOC,EAAMmC,EAAM2d,kBAAmB3d,EAAM4d,aAAc,KAAM5d,EAAMD,QAAS+wB,GAE5JC,EAAuCvW,GAAYxa,EAAO,KAAM,GAAe,EAAG,KAAM,MAO9F,OANA+wB,EAAkB1lB,cAAgBxJ,EAAMwJ,cACxCkQ,EAAc5+B,KAAOo0C,EACC,OAAlB/wB,EAAMyd,UACNzd,EAAMyd,QAAQttC,SAAS6vB,EAAO6B,GAC9B0Z,EAAckC,QAAUzd,EAAMyd,QAAQlC,cAAc1Z,IAEjDA,EApBX,CAmDgChlD,EAAOmjD,EAAO4C,EAAO+X,EAAY/c,EAAOC,EAAMuW,EAASwc,EAAYC,GACxE7wB,EAAM/3C,KAAKsyD,GAClCjW,GAAyBzC,GAAO,GAEhC,MAAM54D,EAAU25D,EApgkBH,IAogkBmBioB,cAAwC,IACxE/Z,GAAY9Q,EAAO4C,EAAO35D,EAAS44D,GACnC+U,GAAgB3tE,EAAS25D,GACzBme,GAAcne,EAAOA,EAAM2X,GAAiB8G,GAAiBp4E,EAAS25D,EAAO35D,EAAS44D,IAClFE,GAAgBF,IAChBya,GAA0Btc,EAAO4C,EAAOf,GAEtB,MAAlBgvB,GACA/T,GAAyBla,EAAOf,EAAOmb,GA4I/C,SAASgU,GAAYn0E,GAGjB,OAAOkmD,GAr3gBAU,GAAiBC,OAAOS,aAq3gBLtnD,GAc9B,SAASo0E,GAAkBp6B,EAAO/oD,EAAQmpD,GAAYoE,SAElD,MAAMuH,EAAQmB,KAGd,OAAa,MAATnB,EACOrH,GAAS1E,EAAO/oD,GAGpBw+D,GADOlI,KAC2CxB,EAAO9J,GAAkBjC,GAAQ/oD,GAS9F,SAASojF,GAAkBC,GACvB,OAj4dJ,SAA6BtvB,EAAOsvB,GAGhC,GAAyB,UAArBA,EACA,OAAOtvB,EAAMwc,QAEjB,GAAyB,UAArB8S,EACA,OAAOtvB,EAAMtsB,OAGjB,MAAMmzB,EAAQ7G,EAAM6G,MACpB,GAAIA,EAAO,CAEP,MAAM0oB,EAAc1oB,EAAM/+D,OAE1B,IAAIJ,EAAI,EACR,KAAOA,EAAI6nF,GAAa,CAEpB,MAAMl9E,EAAQw0D,EAAMn/D,GAEpB,GAAI4/D,GAA0Bj1D,GAC1B,MAEJ,GAAc,IAAVA,EAKA3K,GAAQ,OAEP,GAAqB,iBAAV2K,EAGZ,IADA3K,IACOA,EAAI6nF,GAAmC,iBAAb1oB,EAAMn/D,IACnCA,QAGH,CAAA,GAAI2K,IAAUi9E,EACf,OAA0BzoB,EAAMn/D,EAAI,GAGpCA,GAAQ,IAIpB,OAAO,KA7CX,CAi4d+B66D,KAA4B+sB,GAe3D,SAASE,KAGL,MAAM,IAAI/hF,MADiF,WA4B/F,SAASgiF,GAAWp7B,EAAUhiD,EAAOmhE,GAEjC,MAAMzS,EAAQmB,KAWd,OARIwrB,GAAe3sB,EADEsC,KACmBhxD,IAKpC2qE,GAHc7a,KAEA0C,KACwB9D,EAAO1M,EAAUhiD,EAAO0uD,EAnvkBrD,IAmvkBsEyS,GAAW,GAGvFic,GAYX,SAASC,GAAsCvxB,EAAO6B,EAAOe,EAAO1uD,EAAOs9E,GAEvE,MAEM//D,EAAW+/D,EAAe,QAAU,QAE1CxS,GAAqBhf,EAAO4C,EAJMf,EAAa,OAILpwC,GAAWA,EAAUvd,GAqDnE,SAASu9E,GAAe50E,EAAOvJ,EAAMs9E,EAAYC,GAE7C,MAAMjuB,EAAQmB,KAER/D,EAAQgE,KAERuW,EAhzkBY,GAgzkBoB19D,EAKhCwlD,EAAWO,EAx0kBJ,IA00kBP6F,EAAS7F,EAAM2X,GAAiBR,GAAczmE,EAAM+uD,EApsgBnDoB,GAAiBC,OAAOwC,kBAssgBzBrE,EAAQ7B,EAAMoL,gBAlDxB,SAAqCvuD,EAAOmjD,EAAO4C,EAAO6F,EAAQn1D,EAAMs9E,EAAYC,GAIhF,MAAMC,EAAc9wB,EAAMlC,OAEpB4K,EAAQnF,GAAYutB,EAAaF,GAEjC/uB,EAAQyY,GAAiBta,EAAO4C,EA5ykB3B,GA4ykB0C/lD,EAAO,EAAiBvJ,EAAMo1D,GAUnF,OARsBwW,GAAkBlf,EAAO4C,EAAOf,EAAO0B,GAAYutB,EAAaD,IAE5D,OAAtBhvB,EAAMmc,aACN8Q,GAAqBjtB,EAAOA,EAAMmc,aAEhB,OAAlBhe,EAAMyd,SACNzd,EAAMyd,QAAQiU,aAAa1xB,EAAO6B,GAE/BA,EAlBX,CAmDoChlD,EAAOmjD,EAAO4C,EAAO6F,EAAQn1D,EAAMs9E,EAAYC,GACxD7wB,EAAM/3C,KAAKsyD,GAClCjW,GAAyBzC,GAAO,GAEhC,MAAMmc,EAAcnc,EAAMmc,YACN,OAAhBA,GACAxV,GAAgBnG,EAAUoG,EAAQuV,GAGtC,MAAMK,EAAUxc,EAAMwc,QACN,OAAZA,GACA6I,GAAiB7kB,EAAUoG,EAAQ4V,GAGvC,MAAM9oC,EAASssB,EAAMtsB,OACN,OAAXA,GACAyxC,GAAiB3kB,EAAUoG,EAAQlzB,GAEvCu7B,GAAY9Q,EAAO4C,EAAO6F,EAAQ5G,GAIH,IAjshBxB4B,GAAiBC,OAAOuC,mBAkshB3B2Q,GAAgBnO,EAAQ7F,GA5rhB5Ba,GAAiBC,OAAOuC,oBA+rhBpBlE,GAAgBF,KAChBya,GAA0Btc,EAAO4C,EAAOf,GACxCwa,GAAsBrc,EAAO6B,EAAOe,IAEjB,OAAnBiuB,GACA/T,GAAyBla,EAAOf,GASxC,SAAS8vB,KAEL,IAAIttB,EAAwBD,KAExBI,KACAC,MAIAJ,EAA2CA,EAA6B,OACxEC,GAAyBD,GAAuB,IAGpD,MAAMxC,EAAQwC,EApthBdZ,GAAiBC,OAAOuC,oBAwthBxB,MAAMjG,EAAQgE,KACVhE,EAAMoL,kBACNzE,GAAuB3G,EAAOqE,GAC1BzC,GAAmByC,IACArE,EAAc,QAAE4xB,WAAWvtB,IAGhC,OAAlBxC,EAAMwc,SAx4Xd,SAAuBxc,GACnB,OAAkD,IAA5B,GAAdA,EAAM/zD,OADlB,CAw4XgD+zD,IACxC0vB,GAAsCvxB,EAAO6B,EAAOkC,KAAYlC,EAAMwc,SAAS,GAE9D,OAAjBxc,EAAMtsB,QAl3Xd,SAAuBssB,GACnB,OAAkD,IAA5B,GAAdA,EAAM/zD,OADlB,CAk3X+C+zD,IACvC0vB,GAAsCvxB,EAAO6B,EAAOkC,KAAYlC,EAAMtsB,QAAQ,GActF,SAASs8C,GAAUh1E,EAAOvJ,EAAMs9E,EAAYC,GACxCY,GAAe50E,EAAOvJ,EAAMs9E,EAAYC,GACxCc,KAqGJ,SAASG,GAAwBj1E,EAAO+zE,EAAYC,GAEhD,MAAMjuB,EAAQmB,KAER/D,EAAQgE,KAERuW,EAAgB19D,EAz/kBJ,GA6/kBZglD,EAAQ7B,EAAMoL,gBA9CxB,SAA8CvuD,EAAOmjD,EAAO4C,EAAOguB,EAAYC,GAG3E,MAAMC,EAAc9wB,EAAMlC,OAEpB4K,EAAQnF,GAAYutB,EAAaF,GAEjC/uB,EAAQyY,GAAiBta,EAAO4C,EAn/kB3B,GAm/kB0C/lD,EAAO,EAA0B,eAAgB6rD,GAYtG,OATc,OAAVA,GACAomB,GAAqBjtB,EAAO6G,GAIhCwW,GAAkBlf,EAAO4C,EAAOf,EADd0B,GAAYutB,EAAaD,IAErB,OAAlB7wB,EAAMyd,SACNzd,EAAMyd,QAAQiU,aAAa1xB,EAAO6B,GAE/BA,EAnBX,CA+C6ChlD,EAAOmjD,EAAO4C,EAAOguB,EAAYC,GACnD7wB,EAAM/3C,KAAKsyD,GAClCjW,GAAyBzC,GAAO,GAGhC,MAAM4G,EAAS7F,EAAM2X,GACjB3X,EAvhlBS,IAuhlBOioB,cAA2C,IAC/D/Z,GAAY9Q,EAAO4C,EAAO6F,EAAQ5G,GAClC+U,GAAgBnO,EAAQ7F,GACpBb,GAAgBF,KAChBya,GAA0Btc,EAAO4C,EAAOf,GACxCwa,GAAsBrc,EAAO6B,EAAOe,IAElB,MAAlBiuB,GACA/T,GAAyBla,EAAOf,GASxC,SAASkwB,KAEL,IAAI1tB,EAAwBD,KAE5B,MAAMpE,EAAQgE,KACVQ,KACAC,MAIAJ,EAA2CA,EAA6B,OACxEC,GAAyBD,GAAuB,IAGhDrE,EAAMoL,kBACNzE,GAAuB3G,EAAOqE,GAC1BzC,GAAmByC,IACArE,EAAc,QAAE4xB,WAAWvtB,IAe1D,SAAS2tB,GAAmBn1E,EAAO+zE,EAAYC,GAC3CiB,GAAwBj1E,EAAO+zE,EAAYC,GAC3CkB,KAyJJ,SAASE,KACL,OAA6CluB,KAajD,SAAS,GAAUrvB,GAGf,QAASA,GAA2B,mBAAbA,EAAIme,KAK/B,SAASq/B,GAAax9C,GAGlB,QAASA,GAAgC,mBAAlBA,EAAIyc,UAuB/B,SAASghC,GAAWC,EAAWC,EAAYC,GAAa,EAAOC,GAE3D,MAAM3vB,EAAQmB,KAER/D,EAAQgE,KAERnC,EAAQuC,KAEd,OAsFJ,SAA0BpE,EAAO4C,EAAOP,EAAUR,EAAOuwB,EAAWC,EAAYC,GAAa,EAAOC,GAEhG,MAAMC,EAAuBzwB,GAAgBF,GAIvCqjB,EAFkBllB,EAAMoL,kBAEOpL,EAAM0d,UAAY1d,EAAM0d,QAAU,KAKjEyH,EAAW1C,GAAY7f,GAG7B,IAAI6vB,GAAiB,EAErB,GAAmB,IAAf5wB,EAAM11D,KAA0B,CAEhC,MAAMs8D,EAA4B5F,GAAiBhB,EAAOe,GAEpD8vB,EAAWH,EAAsBA,EAAoB9pB,GAAU,GAE/D/7B,EAASgmD,EAAShmD,QAAU+7B,EAE5BkqB,EAAgBxN,EAASx7E,OAEzBy7E,EAAoBmN,EAKrB7jB,GAAW6jB,EAAoB7vB,GAAYgM,EAAO7M,EAAMhlD,SAAS6vB,OAClEm1B,EAAMhlD,MAGV,GAAIulD,GAAqBC,GAAW,CAYhC,IAAIuwB,EAAmB,KAUvB,IAHKL,GAAuBC,IACxBI,EA/FhB,SAA8B5yB,EAAO4C,EAAOwvB,EAAWS,GAEnD,MAAM3N,EAAWllB,EAAM0d,QACvB,GAAgB,MAAZwH,EACA,IAAK,IAAI37E,EAAI,EAAGA,EAAI27E,EAASv7E,OAAS,EAAGJ,GAAK,EAAG,CAE7C,MAAMupF,EAAmB5N,EAAS37E,GAClC,GAAIupF,IAAqBV,GAAalN,EAAS37E,EAAI,KAAOspF,EAAU,CAKhE,MAAM1N,EAA8BviB,EA71lBpC,GA+1lBMmwB,EAAwB7N,EAAS37E,EAAI,GAC3C,OAAO47E,EAASx7E,OAASopF,EAAwB5N,EAAS4N,GAAyB,KAOvD,iBAArBD,IACPvpF,GAAK,GAIjB,OAAO,KA3BX,CA+FwDy2D,EAAO4C,EAAOwvB,EAAWvwB,EAAMhlD,QAElD,OAArB+1E,GAMuB,EAAwCI,sBAAwBJ,GACxEK,qBAAuBZ,EACtC,EAAwCW,qBAAuBX,EAC/DI,GAAiB,MAEhB,CAIDJ,EAAaa,GAAarxB,EAAOe,EAAOyvB,GAAY,GAEpD,MAAMvK,EAAYzlB,EAAS8wB,OAAOT,EAASp/E,MAAQo5B,EAAQ0lD,EAAWC,GAEtElN,EAASj5E,KAAKmmF,EAAYvK,GAC1B5C,GAAYA,EAASh5E,KAAKkmF,EAAWhN,EAAmBuN,EAAeA,EAAgB,SAI3FN,EAAaa,GAAarxB,EAAOe,EAAOyvB,GAAY,GACpD3lD,EAAO6P,iBAAiB61C,EAAWC,EAAYC,GAE/CnN,EAASj5E,KAAKmmF,GACdnN,GAAYA,EAASh5E,KAAKkmF,EAAWhN,EAAmBuN,EAAeL,GAK/E,MAAMj0B,EAAUwD,EAAMxD,QAEtB,IAAI5+C,EACJ,GAAIgzE,GAA8B,OAAZp0B,IAAqB5+C,EAAQ4+C,EAAQ+zB,IAAa,CAEpE,MAAMttD,EAAcrlB,EAAM9V,OAC1B,GAAIm7B,EACA,IAAK,IAAIv7B,EAAI,EAAGA,EAAIu7B,EAAav7B,GAAK,EAAG,CAErC,MAYM8lD,EAPoBuT,EALOnjD,EAAMlW,IAGlBkW,EAAMlW,EAAI,IASH4nD,UAAUkhC,GAEhCt8C,EAAMovC,EAASx7E,OACrBw7E,EAASj5E,KAAKmmF,EAAYhjC,GAC1B61B,GAAYA,EAASh5E,KAAKkmF,EAAWvwB,EAAMhlD,MAAOk5B,IAAOA,EAAM,MAnH/E,CAvFqBiqB,EAAO4C,EAAOA,EA1xlBlB,IA0xlBmCf,EAAOuwB,EAAWC,EAAYC,EAAYC,GACnFJ,GAoNX,SAASiB,GAAiCxwB,EAAOyvB,EAAY/2E,GACzD,IAEI,OAAyB,IAAlB+2E,EAAW/2E,GAEtB,MAAOlR,GAEH,OADA83E,GAAYtf,EAAOx4D,IACZ,GAcf,SAAS8oF,GAAarxB,EAAOe,EAAOyvB,EAAYgB,GAG5C,OAAO,SAIEC,EAA0Ch4E,GAG/C,GAAIA,IAAMV,SACN,OAAOy3E,EAKX,MAAMloB,EAA0B,EAAdtI,EAAM/zD,MACpBk1D,GAAyBnB,EAAMhlD,MAAO+lD,GACtCA,EAE2C,IAA3B,GAAfA,EA1imBC,KA2imBFof,GAAc7X,GAGlB,IAAI55D,EAAS6iF,GAAiCxwB,EAAOyvB,EAAY/2E,GAI7Di4E,EAAiB,EAAiEN,qBACtF,KAAOM,GAEHhjF,EAAS6iF,GAAiCxwB,EAAO2wB,EAAgBj4E,IAAM/K,EACvEgjF,EAAiB,EAAsCN,qBAO3D,OALII,IAAqC,IAAX9iF,IAC1B+K,EAAEkuC,iBAEFluC,EAAEk4E,aAAc,GAEbjjF,GA4Bf,SAASkjF,GAAcC,EAAQ,GAC3B,OA9hiBJ,SAAyBA,GAIrB,OAFqBjwB,GAAiBC,OAAOS,aASjD,SAAqBwvB,EAAcjsB,GAC/B,KAAOisB,EAAe,GAElBjsB,EAAiCA,EAhjEhB,IAijEjBisB,IAEJ,OAAOjsB,EANX,CARoBgsB,EAA0BjwB,GAAiBC,OAAoB,eAnjEnE,GAgjEhB,CA8hiB2BgwB,GAmB3B,SAASE,GAA4B/xB,EAAOgyB,GAExC,IAAIC,EAAyB,KAE7B,MAAMC,EA1uYV,SAA+BlyB,GAE3B,MAAM6V,EAAY7V,EAAM6G,MACxB,GAAiB,MAAbgP,EAAmB,CAEnB,MAAMsc,EAAqBtc,EAAUhtE,QAAQ,GAG7C,GAAiC,IAAP,EAArBspF,GACD,OAA0Btc,EAAUsc,EAAqB,GAGjE,OAAO,KAZX,CA0uYqDnyB,GACjD,IAAK,IAAIt4D,EAAI,EAAGA,EAAIsqF,EAAgBlqF,OAAQJ,IAAK,CAE7C,MAAM45D,EAAY0wB,EAAgBtqF,GAGlC,GAAkB,MAAd45D,EAAAA,CAMJ,GAA2B,OAAvB4wB,EACAzb,GAA2BzW,EAAOsB,GAAkC,GACpEoV,GAAyBwb,EAAoB5wB,GAC7C,OAAO55D,OARPuqF,EAAyBvqF,EAWjC,OAAOuqF,EAwBX,SAASG,GAAgBJ,GAErB,MAAMK,EAAmCnwB,KAjomBV,IApBpB,GAspmBX,IAAKmwB,EAAc/V,WAAY,CAI3B,MAEMgW,EAAkBD,EAAc/V,WAClC9hB,GAHuBw3B,EAAkBA,EAAgBlqF,OAAS,EAGrC,MAE3ByqF,EAAQD,EAAgBpnF,QAE9B,IAAIsnF,EAAiBH,EAAct4C,MACnC,KAA0B,OAAnBy4C,GAAyB,CAE5B,MAAMC,EAAYT,EAAkBD,GAA4BS,EAAgBR,GAAmB,EACjF,OAAdS,IACIF,EAAME,GACaF,EAAME,GAAapW,eAAiBmW,EAGvDF,EAAgBG,GAAaD,EAEjCD,EAAME,GAAaD,GAEvBA,EAAiBA,EAAelwD,OAuB5C,SAASowD,GAAatxB,EAAWuxB,EAAgB,EAAG9rB,GAEhD,MAAM9F,EAAQmB,KAER/D,EAAQgE,KAER6iB,EAAkBvM,GAAiBta,EAAO4C,EA3smBrC,GA2smBoDK,EAAW,EAAoB,KAAMyF,GAAS,MAE1E,OAA/Bme,EAAgB1I,aAChB0I,EAAgB1I,WAAaqW,GAEjC/vB,KA3tOJ,SAAyBzE,EAAO4C,EAAOikB,GASnCD,GAPiBhkB,EA7+XJ,IAo/XsB,EAAgBA,EAAOikB,EALrCtB,GAAgBvlB,EAAO6mB,EAAiBjkB,GAI5C+iB,GAFGkB,EAAgB33D,QAA6B0zC,EA3/XtD,GA6/XuCA,IARtD,CA+tOwB5C,EAAO4C,EAAOikB,GAoCtC,SAAS4N,GAAsBv+B,EAAUi6B,EAAI9a,GAEzC,OADAqf,GAAuBx+B,EAAU,GAAIi6B,EAAI,GAAI9a,GACtCof,GA8BX,SAASC,GAAuBx+B,EAAUnkB,EAAQo+C,EAAIC,EAAQ/a,GAE1D,MAAMzS,EAAQmB,KAER4wB,EAAoBzE,GAAettB,EAAO7wB,EAAQo+C,EAAIC,GAS5D,OARIuE,IAAsB3b,IAKtB6F,GAHc7a,KAEA0C,KACwB9D,EAAO1M,EAAUy+B,EAAmB/xB,EAxxmBjE,IAwxmBkFyS,GAAW,GAGnGqf,GAgCX,SAASE,GAAuB1+B,EAAUnkB,EAAQo+C,EAAIG,EAAIC,EAAIH,EAAQ/a,GAElE,MAAMzS,EAAQmB,KAER4wB,EAAoBtE,GAAeztB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIH,GASpE,OARIuE,IAAsB3b,IAKtB6F,GAHc7a,KAEA0C,KACwB9D,EAAO1M,EAAUy+B,EAAmB/xB,EAr0mBjE,IAq0mBkFyS,GAAW,GAGnGuf,GAmCX,SAASC,GAAuB3+B,EAAUnkB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIN,EAAQ/a,GAE1E,MAAMzS,EAAQmB,KAER4wB,EAAoBnE,GAAe5tB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIN,GAS5E,OARIuE,IAAsB3b,IAKtB6F,GAHc7a,KAEA0C,KACwB9D,EAAO1M,EAAUy+B,EAAmB/xB,EAr3mBjE,IAq3mBkFyS,GAAW,GAGnGwf,GAqVX,MACMC,GAAgB,GA0WtB,SAASC,GAAe1oB,EAAO2oB,EAAan4E,EAAOo4E,EAAWC,GAE1D,MAAMC,EAAqC9oB,EAAMxvD,EAAQ,GAEnDjB,EAAwB,OAAhBo5E,EAEd,IAAII,EAASH,EAAY3b,GAAqB6b,GAAmB1b,GAAqB0b,GAElFE,GAAiB,EAMrB,KAAkB,IAAXD,KAAoC,IAAnBC,GAA4Bz5E,IAAQ,CAGxD,MAEM05E,EAAyCjpB,EAAM+oB,EAAS,GAC1DG,GAH6ClpB,EAAM+oB,GAGbJ,KACtCK,GAAiB,EACjBhpB,EAAM+oB,EAAS,GAAKH,EAAYtb,GAA8B2b,GAC1D9b,GAA8B8b,IAEtCF,EAASH,EAAY3b,GAAqBgc,GACtC7b,GAAqB6b,GAEzBD,IAEAhpB,EAAMxvD,EAAQ,GAAKo4E,EAAYzb,GAA8B2b,GACzDxb,GAA8Bwb,IAsB1C,SAASI,GAAeC,EAAmBR,GAGvC,OAA0B,OAAtBQ,GAEe,MAAfR,IAECv3E,MAAM4I,QAAQmvE,GAAqBA,EAAkB,GAAKA,KACvDR,MAICv3E,MAAM4I,QAAQmvE,IAA6C,iBAAhBR,IAGzCx4B,GAAqBg5B,EAAmBR,IAC3C,EAkDZ,MAAMS,GAAc,CAChBC,QAAS,EACTp3E,IAAK,EACLq3E,OAAQ,EACRzhF,MAAO,EACP0hF,SAAU,GAOd,SAASC,GAAiBhJ,GACtB,OAAOA,EAAKngF,UAAU+oF,GAAYn3E,IAAKm3E,GAAYE,QAOvD,SAASG,GAAmBjJ,GACxB,OAAOA,EAAKngF,UAAU+oF,GAAYvhF,MAAOuhF,GAAYG,UAkCzD,SAASG,GAAmBlJ,EAAMhwE,GAE9B,MAAM3M,EAAMulF,GAAYC,QACxB,OAAIxlF,IAAQ2M,GACA,GAEZA,EAAQ44E,GAAYE,OAsFxB,SAA2B9I,EAAMmJ,EAAYhoB,GACzC,KAAOgoB,EAAahoB,GAAY6e,EAAK9tD,WAAWi3D,GAAc,IAC1DA,IAEJ,OAAOA,EAJX,CAtFmDnJ,EAAM4I,GAAYn3E,IAAMzB,EAAO3M,GACvE+lF,GAAkBpJ,EAAMhwE,EAAO3M,IAmC1C,SAASgmF,GAAerJ,EAAMmJ,GAE1B,MAAM9lF,EAAMulF,GAAYC,QAExB,IAAI74E,EAAQ44E,GAAYn3E,IAAM23E,GAAkBpJ,EAAMmJ,EAAY9lF,GAClE,OAAIA,IAAQ2M,GAEA,GAEZA,EAAQ44E,GAAYE,OAuDxB,SAAyB9I,EAAMmJ,EAAYhoB,GAEvC,IAAImoB,EACJ,KAAOH,EAAahoB,IACwB,MAAtCmoB,EAAKtJ,EAAK9tD,WAAWi3D,KAAyC,KAAPG,KAC7C,GAANA,IAA8B,MAAqB,GAANA,IAA8B,KACjFH,IAEJ,OAAOA,EARX,CAvDiDnJ,EAAMhwE,EAAO3M,GAC1D2M,EAAQu5E,GAAiBvJ,EAAMhwE,EAAO3M,GACtC2M,EAAQ44E,GAAYvhF,MAAQ+hF,GAAkBpJ,EAAMhwE,EAAO3M,GAC3D2M,EAAQ44E,GAAYG,SAyFxB,SAA2B/I,EAAMmJ,EAAYhoB,GAEzC,IAAIqoB,GAAO,EAGPC,GAAO,EAGPC,GAAO,EAGPhtF,EAAIysF,EAEJQ,EAAcjtF,EAClB,KAAOA,EAAIykE,GAAU,CAEjB,MAAMmoB,EAAKtJ,EAAK9tD,WAAWx1B,KAC3B,GAAW,KAAP4sF,EACA,OAAOK,EAEK,KAAPL,GAAuC,KAAPA,EACrCK,EAAcjtF,EAAIktF,GAAkB5J,EAAMsJ,EAAI5sF,EAAGykE,GAE5CgoB,IACLzsF,EAAI,GACI,KAARgtF,GACQ,KAARD,GAA8B,KAARD,GAA6B,KAAPF,EAC5CK,EAAcjtF,EAAIktF,GAAkB5J,EAAM,GAAsBtjF,EAAGykE,GAE9DmoB,EAAK,KAEVK,EAAcjtF,GAElBgtF,EAAMD,EACNA,EAAMD,EACNA,GAAY,GAANF,EAEV,OAAOK,EArCX,CAzFqD3J,EAAMhwE,EAAO3M,GACvDkmF,GAAiBvJ,EAAMhwE,EAAO3M,IAOzC,SAASwmF,GAAiB7J,GACtB4I,GAAYn3E,IAAM,EAClBm3E,GAAYE,OAAS,EACrBF,GAAYvhF,MAAQ,EACpBuhF,GAAYG,SAAW,EACvBH,GAAYC,QAAU7I,EAAKljF,OAW/B,SAASssF,GAAkBpJ,EAAMmJ,EAAYhoB,GACzC,KAAOgoB,EAAahoB,GAAY6e,EAAK9tD,WAAWi3D,IAAe,IAC3DA,IAEJ,OAAOA,EA2CX,SAASI,GAAiBvJ,EAAMmJ,EAAYhoB,EAAUtjC,GAQlD,OAPAsrD,EAAaC,GAAkBpJ,EAAMmJ,EAAYhoB,IAChCA,GAIbgoB,IAEGA,EA0DX,SAASS,GAAkB5J,EAAM8J,EAAeX,EAAYhoB,GAExD,IAAIqoB,GAAO,EAGPx5E,EAAQm5E,EACZ,KAAOn5E,EAAQmxD,GAAU,CAErB,MAAMmoB,EAAKtJ,EAAK9tD,WAAWliB,KAC3B,GAAIs5E,GAAMQ,GAAyB,KAARN,EACvB,OAAOx5E,EAKPw5E,EAHM,IAANF,GAAqC,KAARE,EAGvB,EAGAF,EAGd,MACI,IAAI7mF,MA4DZ,SAASsnF,GAAYnxD,EAAMvxB,EAAOk8E,GAE9B,OADAyG,GAAqBpxD,EAAMvxB,EAAOk8E,GAAQ,GACnCwG,GAkBX,SAASE,GAAY9f,EAAW9iE,GAE5B,OADA2iF,GAAqB7f,EAAW9iE,EAAO,MAAM,GACtC4iF,GAsBX,SAASC,GAAWxhD,GAChByhD,GAAgBC,GAAuBC,GAAmB3hD,GAAQ,GAYtE,SAAS2hD,GAAkB36B,EAAeswB,GACtC,IAAK,IAAItjF,EApTb,SAAoBsjF,GAEhB,OADA6J,GAAiB7J,GACVqJ,GAAerJ,EAAMoJ,GAAkBpJ,EAAM,EAAG4I,GAAYC,UAFvE,CAoT4B7I,GAAOtjF,GAAK,EAAGA,EAAI2sF,GAAerJ,EAAMtjF,GAC5D0tF,GAAsB16B,EAAes5B,GAAiBhJ,GAAOiJ,GAAmBjJ,IAsBxF,SAASsK,GAAW9Y,GAChB2Y,GAAgB16B,GAAkB86B,GAAmB/Y,GAAS,GAYlE,SAAS+Y,GAAkB76B,EAAeswB,GACtC,IAAK,IAAItjF,EAnYb,SAAwBsjF,GAEpB,OADA6J,GAAiB7J,GACVkJ,GAAmBlJ,EAAMoJ,GAAkBpJ,EAAM,EAAG4I,GAAYC,UAF3E,CAmYgC7I,GAAOtjF,GAAK,EAAGA,EAAIwsF,GAAmBlJ,EAAMtjF,GACpE+yD,GAAiBC,EAAes5B,GAAiBhJ,IAAO,GAYhE,SAASgK,GAAqBpxD,EAAMvxB,EAAOmjF,EAAmB7F,GAE1D,MAAM5uB,EAAQmB,KAER/D,EAAQgE,KAKRiB,EAAeE,GAAsB,GAI3C,GAHInF,EAAM8b,iBACNwb,GAAuBt3B,EAAOv6B,EAAMw/B,EAAcusB,GAElDt9E,IAAU8kE,IAAauW,GAAe3sB,EAAOqC,EAAc/wD,GAAQ,CAInE,IAAIqjF,EACqB,MAArBF,IACIE,EA99kBhB,WAII,MAAM7zB,EAASD,GAAiBC,OAChC,OAAkB,OAAXA,EAAkB,KAAOA,EAAOyC,iBAL3C,MA+9kBgBkxB,EAAoB,GAK5BG,GAAcx3B,EADmBA,EAAM/3C,KAAKu+C,KAxmpB9B,IAympBc5D,EAAOA,EA5npB1B,IA4npB2Cn9B,EAAMm9B,EAAMqC,EAAe,GAurBvF,SAA4C/wD,EAAOmjF,GAc/C,OAba,MAATnjF,IAGkC,mBAAtBmjF,EAEZnjF,EAAQmjF,EAAkBnjF,GAEQ,iBAAtBmjF,EACZnjF,GAAgBmjF,EAEM,iBAAVnjF,IACZA,EAAQ8/B,GAAU+7B,GAAgB77D,MAE/BA,EAdX,CAvrB+HA,EAAOmjF,GAAoB7F,EAAcvsB,IAgBxK,SAAS+xB,GAAgB16B,EAAkBm7B,EAAcvjF,EAAOs9E,GAE5D,MAAMxxB,EAAQgE,KAERiB,EAAeE,GAAsB,GACvCnF,EAAM8b,iBACNwb,GAAuBt3B,EAAO,KAAMiF,EAAcusB,GAGtD,MAAM5uB,EAAQmB,KACd,GAAI7vD,IAAU8kE,IAAauW,GAAe3sB,EAAOqC,EAAc/wD,GAAQ,CAInE,MAAM2tD,EAA2B7B,EAAM/3C,KAAKu+C,KAvopB9B,IAwopBd,GAAIkxB,GAAsB71B,EAAO2vB,KAAkBmG,GAAiB33B,EAAOiF,GAAe,CAgBtF,IAAI2yB,EAAepG,EAAe3vB,EAAMwc,QAAUxc,EAAMtsB,OAGnC,OAAjBqiD,IAEA1jF,EAAQwkD,GAAuBk/B,EAAc1jF,GAAgB,KAIjEq9E,GAAsCvxB,EAAO6B,EAAOe,EAAO1uD,EAAOs9E,QAua9E,SAA0BxxB,EAAO6B,EAAOe,EAAOP,EAAUw1B,EAAkBC,EAAkBtG,EAAcvsB,GACnG,IAA0C+T,KAE1C6e,EAAmB,IAGvB,IAAIE,EAAW,EAEXtN,EAAW,EAEXuN,EAAS,EAAIH,EAAiBluF,OAASkuF,EAAiB,GAAK,KAE7DI,EAAS,EAAIH,EAAiBnuF,OAASmuF,EAAiB,GAAK,KACjE,KAAkB,OAAXE,GAA8B,OAAXC,GAAiB,CAIvC,MAAMltB,EAAWgtB,EAAWF,EAAiBluF,OAASkuF,EAAiBE,EAAW,QAAKh5E,EAEjFyT,EAAWi4D,EAAWqN,EAAiBnuF,OAASmuF,EAAiBrN,EAAW,QAAK1rE,EAEvF,IAAIm5E,EAAS,KAETrV,OAAW9jE,EACXi5E,IAAWC,GAEXF,GAAY,EACZtN,GAAY,EACR1f,IAAav4C,IACb0lE,EAASD,EACTpV,EAAWrwD,IAGC,OAAXylE,GAA8B,OAAXD,GAAmBA,EAAS,GAKpDD,GAAY,EACZG,EAASF,IAOTvN,GAAY,EACZyN,EAASD,EACTpV,EAAWrwD,GAEA,OAAX0lE,GACAV,GAAcx3B,EAAO6B,EAAOe,EAAOP,EAAU61B,EAAQrV,EAAU2O,EAAcvsB,GAEjF+yB,EAASD,EAAWF,EAAiBluF,OAASkuF,EAAiBE,GAAY,KAC3EE,EAASxN,EAAWqN,EAAiBnuF,OAASmuF,EAAiBrN,GAAY,MAtDnF,CApa6BzqB,EAAO6B,EAAOe,EAAOA,EAvrpBjC,IAurpBkDA,EAAMqC,EAAe,GAAIrC,EAAMqC,EAAe,GAqWjH,SAAgC3I,EAAkBm7B,EAAcvjF,GAC5D,GAAa,MAATA,GAAuD,KAAVA,EAC7C,OAAO,GAEX,MAAMikF,EAAqB,GAErBC,EAAoCroB,GAAgB77D,GAC1D,GAAIuJ,MAAM4I,QAAQ+xE,GACd,IAAK,IAAI7uF,EAAI,EAAGA,EAAI6uF,EAAezuF,OAAQJ,IACvC+yD,EAAiB67B,EAAoBC,EAAe7uF,IAAI,QAG3D,GAA8B,iBAAnB6uF,EACZ,IAAK,MAAM95E,KAAO85E,EACVA,EAAev2E,eAAevD,IAC9Bg+C,EAAiB67B,EAAoB75E,EAAK85E,EAAe95E,QAIlC,iBAAnB85E,GACZX,EAAaU,EAAoBC,GAMrC,OAAOD,EA1BX,CArW6I77B,EAAkBm7B,EAAcvjF,GAAQs9E,EAAcvsB,IAWnM,SAAS0yB,GAAiB33B,EAAOiF,GAE7B,OAAOA,GAAgBjF,EAAM0b,kBAYjC,SAAS4b,GAAuBt3B,EAAOg1B,EAAa/vB,EAAcusB,GAG9D,MAAMnlB,EAAQrM,EAAM/3C,KACpB,GAAgC,OAA5BokD,EAAMpH,EAAe,GAAa,CAOlC,MAAMpD,EAA2BwK,EAAM7F,KAxspBzB,IA0spBR6xB,EAAiBV,GAAiB33B,EAAOiF,GAC3CyyB,GAAsB71B,EAAO2vB,IAAiC,OAAhBwD,IAAyBqD,IAKvErD,GAAc,GAElBA,EAmBR,SAAgC3oB,EAAOxK,EAAOy2B,EAAY9G,GAEtD,MAAM+G,EA+PV,SAA6BlsB,GAEzB,MAAMhH,EA/nmBC5B,GAAiBC,OAAO2B,sBAgomB/B,OAAkC,IAA3BA,EAA+B,KAA0BgH,EAAMhH,GAH1E,CA/PiDgH,GAE7C,IAAImsB,EAAWhH,EAAe3vB,EAAMyc,gBAAkBzc,EAAMuc,eAC5D,GAAyB,OAArBma,EAMqJ,KAAlE/G,EAAe3vB,EAAM0c,cAAgB1c,EAAM2c,iBAM1H8Z,EAAaG,GADbH,EAAaI,GAA6B,KAAMrsB,EAAOxK,EAAOy2B,EAAY9G,GACxB3vB,EAAM6G,MAAO8oB,GAE/DgH,EAAW,UAGd,CAID,MAAM1a,EAAuBjc,EAAMic,qBAGnC,IADyE,IAA1BA,GAA+BzR,EAAMyR,KAA0Bya,EAI1G,GAFAD,EACII,GAA6BH,EAAkBlsB,EAAOxK,EAAOy2B,EAAY9G,GAC5D,OAAbgH,EAAmB,CAQnB,IAAIG,EAuCpB,SAAoCtsB,EAAOxK,EAAO2vB,GAE9C,MAAMoH,EAAWpH,EAAe3vB,EAAM0c,cAAgB1c,EAAM2c,cAC5D,GAAuC,IAAnC/E,GAAqBmf,GAIzB,OAA0BvsB,EAAMiN,GAAqBsf,IAPzD,CAvCoEvsB,EAAOxK,EAAO2vB,QACvCzyE,IAAvB45E,GAAoCl7E,MAAM4I,QAAQsyE,KAIlDA,EAAqBD,GAA6B,KAAMrsB,EAAOxK,EAAO82B,EAAmB,GAAkCnH,GAC3HmH,EACIF,GAAyBE,EAAoB92B,EAAM6G,MAAO8oB,GA8FlF,SAAoCnlB,EAAOxK,EAAO2vB,EAAcwD,GAI5D3oB,EAAMiN,GAFWkY,EAAe3vB,EAAM0c,cAAgB1c,EAAM2c,gBAEpBwW,EAJ5C,CA7F+C3oB,EAAOxK,EAAO2vB,EAAcmH,SAS3DH,EAqGhB,SAAyBnsB,EAAOxK,EAAO2vB,GAEnC,IAAIgH,OAAWz5E,EAEf,MAAM8nD,EAAehF,EAAMgF,aAK3B,IAAK,IAAIt9D,EAAI,EAAIs4D,EAAMic,qBAAsBv0E,EAAIs9D,EAAct9D,IAG3DivF,EAA8BC,GAAyBD,EADrBnsB,EAAM9iE,GAAM20D,UAC0BszB,GAE5E,OAA0BiH,GAAyBD,EAAU32B,EAAM6G,MAAO8oB,GAd9E,CArG2CnlB,EAAOxK,EAAO2vB,GAOrD,YAHiBzyE,IAAby5E,IACAhH,EAAgB3vB,EAAMyc,gBAAkBka,EAAa32B,EAAMuc,eAAiBoa,GAEzEF,EAhEX,CAnB6CjsB,EAAOxK,EAAOmzB,EAAaxD,GAv1BxE,SAA+BnlB,EAAOxK,EAAOg3B,EAAuBh8E,EAAOi8E,EAAe5D,GAGtF,IAAI6D,EAAY7D,EAAiBrzB,EAAM0c,cAAgB1c,EAAM2c,cAEzDwa,EAAW1f,GAAqByf,GAEhCE,EAAWxf,GAAqBsf,GACpC1sB,EAAMxvD,GAASg8E,EAEf,IAEI7D,EAFAkE,GAAyB,EAG7B,GAAIz7E,MAAM4I,QAAQwyE,GAAwB,CAGtC,MAAMM,EAAsB,EAC5BnE,EAAcmE,EAAoB,IAEd,OAAhBnE,GACAx4B,GAAqB28B,EAAqB,GAAoC,KAE9ED,GAAyB,QAI7BlE,EAAc6D,EAElB,GAAIC,EAOA,GAHyC,IAAbG,EAGH,CAGrB,MAAMG,EAAe9f,GAAwCjN,EAAM2sB,EAAW,IAC9E3sB,EAAMxvD,EAAQ,GAAKw8D,GAAgB+f,EAAcJ,GAG5B,IAAjBI,IAEA/sB,EAAM+sB,EAAe,GACjB1f,GAAwCrN,EAAM+sB,EAAe,GAAMv8E,IAG3EwvD,EAAM2sB,EAAW,GAvtY+D,OAutYlB3sB,EAAM2sB,EAAW,GAAMn8E,GAttY5E,QAytYTwvD,EAAMxvD,EAAQ,GAAKw8D,GAAgB2f,EAAU,GAG5B,IAAbA,IAEA3sB,EAAM2sB,EAAW,GAAKtf,GAAwCrN,EAAM2sB,EAAW,GAAMn8E,IAGzFm8E,EAAWn8E,OAMfwvD,EAAMxvD,EAAQ,GAAKw8D,GAAgB4f,EAAU,GAE5B,IAAbD,EACAA,EAAWn8E,EAIXwvD,EAAM4sB,EAAW,GAAKvf,GAAwCrN,EAAM4sB,EAAW,GAAMp8E,GAEzFo8E,EAAWp8E,EAIXq8E,IACA7sB,EAAMxvD,EAAQ,GAAK28D,GAAiDnN,EAAMxvD,EAAQ,KAEtFk4E,GAAe1oB,EAAO2oB,EAAan4E,GAAO,GAC1Ck4E,GAAe1oB,EAAO2oB,EAAan4E,GAAO,GAqB9C,SAAwCglD,EAAOmzB,EAAa3oB,EAAOxvD,EAAOq4E,GAEtE,MAAMsD,EAAWtD,EAAiBrzB,EAAMyc,gBAAkBzc,EAAMuc,eAChD,MAAZoa,GAA6D,iBAAfxD,GAC9Cx4B,GAAqBg8B,EAAUxD,IAAgB,IAE/C3oB,EAAMxvD,EAAQ,GAAK88D,GAAiDtN,EAAMxvD,EAAQ,KAN1F,CApBmCglD,EAAOmzB,EAAa3oB,EAAOxvD,EAAOq4E,GACjE6D,EAAY1f,GAAgB2f,EAAUC,GAClC/D,EACArzB,EAAM0c,cAAgBwa,EAGtBl3B,EAAM2c,cAAgBua,EAzF9B,CAw1B8B1sB,EAAOxK,EAAOmzB,EAAa/vB,EAAcozB,EAAgB7G,IA6MvF,SAASkH,GAA6BH,EAAkBlsB,EAAOxK,EAAOy2B,EAAY9G,GAI9E,IAAI6H,EAAmB,KAEvB,MAAMxyB,EAAehF,EAAMgF,aAE3B,IAAIiX,EAAuBjc,EAAMic,qBAOjC,KAN8B,IAA1BA,EACAA,EAAuBjc,EAAM+E,eAG7BkX,IAEGA,EAAuBjX,IAC1BwyB,EAAsChtB,EAAMyR,GAE5Cwa,EAAaG,GAAyBH,EAAYe,EAAiBn7B,UAAWszB,GAC1E6H,IAAqBd,IAEzBza,IAQJ,OANyB,OAArBya,IAIA12B,EAAMic,qBAAuBA,GAE1Bwa,EAUX,SAASG,GAAyBH,EAAY5vB,EAAO8oB,GAEjD,MAAM8H,EAAgB9H,EAAe,EAAkB,EAEvD,IAAI+H,GAAiB,EACrB,GAAc,OAAV7wB,EACA,IAAK,IAAIn/D,EAAI,EAAGA,EAAIm/D,EAAM/+D,OAAQJ,IAAK,CAEnC,MAAMu/C,EAA0B4f,EAAMn/D,GAClB,iBAATu/C,EACPywC,EAAgBzwC,EAGZywC,IAAkBD,IACb77E,MAAM4I,QAAQiyE,KACfA,OAA4Bv5E,IAAfu5E,EAA2B,GAAK,CAAoB,GAAIA,IAEzEh8B,GAAiB,EAAiCxT,IAAM0oC,GAAsB9oB,IAAQn/D,KAKtG,YAAsBwV,IAAfu5E,EAA2B,KAAOA,EAkF7C,SAASrB,GAAsB16B,EAAej+C,EAAKpK,GAr4fnD,IAAoCuxB,GAChB,sBADgBA,EAs4fDnnB,IAr4fgB,oBAATmnB,GAAuC,eAATA,GACvD,iBAATA,GAAoC,gBAATA,GAAmC,wBAATA,GAC5C,sBAATA,GAAyC,WAATA,GAA8B,eAATA,GAC5C,cAATA,GAAiC,qBAATA,GAAwC,mBAATA,GAC9C,cAATA,GAAiC,aAATA,KAk4fxBvxB,EAnigBR,SAAyBslF,GAErB,MAAMnkB,EAAYmB,KAClB,OAAInB,EACOA,EAAUoB,SAASf,GAAgBG,MAAO2jB,IAAgB,GAEjExpB,GAAgCwpB,EAAa,SACtCzpB,GAAgBypB,GAEpBrjB,GAAe7L,GAAgBkvB,IAT1C,CAmigBgCtlF,IAE5BooD,GAAiBC,EAAej+C,EAAKpK,GAgGzC,SAASsjF,GAAcx3B,EAAO6B,EAAOe,EAAOP,EAAU58B,EAAMvxB,EAAOs9E,EAAcvsB,GAC7E,GAAmB,IAAfpD,EAAM11D,KAGN,OAGJ,MAAMkgE,EAAQrM,EAAM/3C,KAEdwxE,EAA4BptB,EAAMpH,EAAe,GAKlDy0B,GAx6aD,IADgE,EAs6aVD,GACtDE,GAAiBttB,EAAOxK,EAAOe,EAAOn9B,EAAMg0C,GAAqBggB,GAASjI,QAC1EzyE,KAGK26E,GAAsBxlF,IA59anC,SAAuCqlE,GAEnC,OACI,IADgE,EAA5D,GAFZ,CA89a8CkgB,KAE9BvlF,EAAQylF,GAAiBttB,EAAO,KAAMzJ,EAAOn9B,EAAMw/B,EAAcusB,IArmSjF,SAAsBnvB,EAAUmvB,EAAchO,EAAO/9C,EAAMvxB,GAEvD,MAAM0lF,EAAex3B,GAAqBC,GAC1C,GAAImvB,EAEKt9E,EAWG0lF,EACA,EAAgCC,SAASrW,EAAO/9C,GAIhD,EAA6Bq0D,UAAU/xE,IAAI0d,GAd3Cm0D,EACA,EAAgCG,YAAYvW,EAAO/9C,GAGnD,EAA6Bq0D,UAAU3vD,OAAO1E,OAcrD,CAID,MAAM33B,GAA8B,GAAtB23B,EAAK/6B,QAAQ,UAAaqU,EAAY,EACvC,MAAT7K,EAEI0lF,EACA,EAAgCI,YAAYxW,EAAO/9C,EAAM33B,GAGzD,EAA6BwnC,MAAM2kD,eAAex0D,GAKlDm0D,EACA,EAAgCM,SAAS1W,EAAO/9C,EAAMvxB,EAAOpG,GAI7D,EAA6BwnC,MAAM4zB,YAAYzjC,EAAMvxB,IA9CrE,CA0mSqBmuD,EAAUmvB,EADU7uB,GAAiB6D,KAAoB5D,GAC1Bn9B,EAAMvxB,IAmC1D,SAASylF,GAAiBttB,EAAOxK,EAAOe,EAAOn9B,EAAM5oB,EAAO20E,GAOxD,MAAM2I,EAA4B,OAAVt4B,EAExB,IAAI3tD,OAAQ6K,EACZ,KAAOlC,EAAQ,GAAG,CAEd,MAAMu9E,EAA4B/tB,EAAMxvD,GAElCw9E,EAAkB58E,MAAM4I,QAAQ+zE,GAGhC97E,EAAM+7E,EAAkB,EAA8B,GAAKD,EAE3DE,EAAuB,OAARh8E,EAErB,IAAIi8E,EAAoB33B,EAAM/lD,EAAQ,GAClC09E,IAAsBvhB,KAQtBuhB,EAAoBD,EAAexF,QAAgB/1E,GAGvD,IAAIy7E,EAAeF,EAAe39B,GAAiB49B,EAAmB90D,GAClEnnB,IAAQmnB,EAAO80D,OAAoBx7E,EAIvC,GAHIs7E,IAAoBX,GAAsBc,KAC1CA,EAAe79B,GAAiB,EAA6Bl3B,IAE7Di0D,GAAsBc,KACtBtmF,EAAQsmF,EACJL,GACA,OAAOjmF,EAIf,MAAMulF,EAA4BptB,EAAMxvD,EAAQ,GAChDA,EAAQs9E,EAAkB7gB,GAAqBmgB,GAAUhgB,GAAqBggB,GAElF,GAAc,OAAV53B,EAAgB,CAIhB,IAAI22B,EAAWhH,EAAe3vB,EAAMyc,gBAAkBzc,EAAMuc,eAC5C,MAAZoa,IACAtkF,EAAQyoD,GAAiB,EAA+Bl3B,IAGhE,OAAOvxB,EASX,SAASwlF,GAAsBxlF,GAK3B,YAAiB6K,IAAV7K,EAoCX,SAASwjF,GAAsB71B,EAAO2vB,GAClC,OAA4F,IAApF3vB,EAAM/zD,OAAS0jF,EAAe,GAAyB,KAiBnE,SAASiJ,GAAO59E,EAAO3I,EAAQ,IAE3B,MAAM0uD,EAAQmB,KAER/D,EAAQgE,KAERuW,EAAgB19D,EAl1qBJ,GAs1qBZglD,EAAQ7B,EAAMoL,gBAChBkP,GAAiBta,EAAO4C,EAp3qBjB,GAo3qBgC/lD,EAAO,EAAiB,KAAM,MAClDmjD,EAAM/3C,KAAKsyD,GAE5BmgB,EAAa93B,EAAM2X,GA5pU7B,SAAwBrmE,EAAOmuD,GAG3B,OAAOD,GAAqBC,GAAYA,EAASs4B,WAAWzmF,GACxDmuD,EAASu4B,eAAe1mF,GAJhC,CA4pU6DA,EAAO0uD,EA72qBnD,KA82qBbkO,GAAY9Q,EAAO4C,EAAO83B,EAAY74B,GAEtCyC,GAAyBzC,GAAO,GA6BpC,SAASg5B,GAAkB1K,GAEvB,OADA2K,GAAmB,GAAI3K,EAAI,IACpB0K,GAwBX,SAASC,GAAmB/oD,EAAQo+C,EAAIC,GAEpC,MAAMxtB,EAAQmB,KAERg3B,EAAe7K,GAAettB,EAAO7wB,EAAQo+C,EAAIC,GAIvD,OAHI2K,IAAiB/hB,IACjB4J,GAAoBhgB,EAAO4D,KAAoB,GAE5Cs0B,GA0BX,SAASE,GAAmBjpD,EAAQo+C,EAAIG,EAAIC,EAAIH,GAE5C,MAAMxtB,EAAQmB,KAERg3B,EAAe1K,GAAeztB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIH,GAI/D,OAHI2K,IAAiB/hB,IACjB4J,GAAoBhgB,EAAO4D,KAAoB,GAE5Cw0B,GA6BX,SAASC,GAAmBlpD,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIN,GAEpD,MAAMxtB,EAAQmB,KAERg3B,EAAevK,GAAe5tB,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIN,GAIvE,OAHI2K,IAAiB/hB,IACjB4J,GAAoBhgB,EAAO4D,KAAoB,GAE5Cy0B,GAwEX,SAASC,GAAmBnpD,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIyK,EAAIC,EAAIC,EAAIC,EAAIlL,GAEpE,MAAMxtB,EAAQmB,KAERg3B,EA5uIV,SAAwBn4B,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIyK,EAAIC,EAAIC,EAAIC,EAAIlL,GAEvE,MAAMnrB,EAAeD,KAErB,IAAI4qB,EAAYG,GAAgBntB,EAAOqC,EAAckrB,EAAII,EAAIG,EAAI0K,GAGjE,OAFAxL,EAAYL,GAAe3sB,EAAOqC,EAAe,EAAGq2B,IAAO1L,EAC3DzqB,GAAsB,GACfyqB,EACH79C,EAASu4B,GAAgB6lB,GAAMG,EAAKhmB,GAAgBimB,GAAME,EAAKnmB,GAAgBomB,GAAMyK,EACjF7wB,GAAgB8wB,GAAMC,EAAK/wB,GAAgBgxB,GAAMlL,EACrDpX,GAVR,CA4uIwCpW,EAAO7wB,EAAQo+C,EAAIG,EAAIC,EAAIE,EAAIC,EAAIyK,EAAIC,EAAIC,EAAIC,EAAIlL,GAIvF,OAHI2K,IAAiB/hB,IACjB4J,GAAoBhgB,EAAO4D,KAAoB,GAE5C00B,GAmhBX,SAASK,GAAuBxpD,EAAQo+C,EAAIC,GAKxC2G,GAD0B7G,GAFZnsB,KAEkChyB,EAAQo+C,EAAIC,IA2qBhE,SAASoL,GAAetlC,EAAUhiD,EAAOmhE,GAErC,MAAMzS,EAAQmB,KAWd,OARIwrB,GAAe3sB,EADEsC,KACmBhxD,IAKpC2qE,GAHc7a,KAEA0C,KACwB9D,EAAO1M,EAAUhiD,EAAO0uD,EAlxtBrD,IAkxtBsEyS,GAAW,GAGvFmmB,GAs1BX,SAASC,GAAsBlZ,EAAW74E,GAEtC,MAAMgyF,EAA+Bt4B,GAAiBmf,GAjovB5C,GAmovBJoZ,EAAWD,EAAUzzE,KAAKte,OAAS,EAGzCg9D,GAAuB+0B,EAAW,CAAqB90B,eAAgB+0B,EAAU90B,aAAc80B,EAAW,IAyC9G,SAASC,GAA2BC,GAEhC,IAAIC,EAXG7zF,OAAOya,eAWem5E,EAAW1vF,KAXNrC,WAAWmK,YAazC8nF,GAAsB,EAE1B,MAAMC,EAAmB,CAACH,GAC1B,KAAOC,GAAW,CAEd,IAAIG,OAAWl9E,EACf,GAAIijD,GAAe65B,GAEfI,EAAWH,EAAUtiC,WAAQsiC,EAAUpiC,cAEtC,CACD,GAAIoiC,EAAUtiC,UACV,MAAM,IAAIlqD,MAAM,wCAGpB2sF,EAAWH,EAAUpiC,UAEzB,GAAIuiC,EAAU,CACV,GAAIF,EAAqB,CACrBC,EAAiB9vF,KAAK+vF,GAItB,MAAMC,EAAe,EACrBA,EAAa99B,OAAS+9B,GAAiBN,EAAWz9B,QAClD89B,EAAax+B,eAAiBy+B,GAAiBN,EAAWn+B,gBAC1Dw+B,EAAa79B,QAAU89B,GAAiBN,EAAWx9B,SAGnD,MAAM+9B,EAAoBH,EAASj+B,aACnCo+B,GAAqBC,GAAoBR,EAAYO,GAGrD,MAAME,EAAiBL,EAASt8B,UAE1B48B,EAAsBN,EAAS99B,eASrC,GARAm+B,GAAkBE,GAAiBX,EAAYS,GAC/CC,GAAuBE,GAAsBZ,EAAYU,GAEzDnlC,GAAeykC,EAAWz9B,OAAQ69B,EAAS79B,QAC3ChH,GAAeykC,EAAWn+B,eAAgBu+B,EAASv+B,gBACnDtG,GAAeykC,EAAWx9B,QAAS49B,EAAS59B,SAGxC2D,GAAei6B,IAAaA,EAASh0E,KAAKy0E,UAAW,CAIrD,MAAMC,EAAU,EAAkC10E,KAClD00E,EAAQD,WAAaC,EAAQD,WAAa,IAAIlqF,OAAOypF,EAASh0E,KAAKy0E,WAIvER,EAAap9B,oBACTo9B,EAAap9B,qBAAuBm9B,EAASn9B,oBACjDo9B,EAAat9B,iBAAmBi9B,EAAWj9B,kBAAoBq9B,EAASr9B,iBACxEs9B,EAAah9B,iBAAmB28B,EAAW38B,kBAAoB+8B,EAAS/8B,iBACxEg9B,EAAal9B,cAAgB68B,EAAW78B,eAAiBi9B,EAASj9B,cAClEk9B,EAAax9B,QAAUm9B,EAAWn9B,SAAWu9B,EAASv9B,QACtDw9B,EAAa98B,UAAYy8B,EAAWz8B,WAAa68B,EAAS78B,UAC1D88B,EAAa19B,OAASq9B,EAAWr9B,QAAUy9B,EAASz9B,OAIxD,MAAMoB,EAAWq8B,EAASr8B,SAC1B,GAAIA,EACA,IAAK,IAAIr2D,EAAI,EAAGA,EAAIq2D,EAASj2D,OAAQJ,IAAK,CAEtC,MAAM22D,EAAUN,EAASr2D,GACrB22D,GAAWA,EAAQ08B,WACnB,EAA+Bf,GAS/B37B,IAAY07B,KACZG,GAAsB,IAKtCD,EAAY7zF,OAAOya,eAAeo5E,IAY1C,SAAyCE,GAErC,IAAI/9B,EAAW,EAEXC,EAAY,KAEhB,IAAK,IAAI30D,EAAIyyF,EAAiBryF,OAAS,EAAGJ,GAAK,EAAGA,IAAK,CAEnD,MAAMG,EAAMsyF,EAAiBzyF,GAE7BG,EAAIu0D,SAAYA,GAAYv0D,EAAIu0D,SAEhCv0D,EAAIw0D,UACAmL,GAAe3/D,EAAIw0D,UAAWA,EAAYmL,GAAenL,EAAWx0D,EAAIw0D,aAbpF,CAVoC89B,GA8BpC,SAASG,GAAiBjoF,GACtB,OAAIA,IAAUkpD,GACH,GAEFlpD,IAAUmpD,GACR,GAGAnpD,EAQf,SAASsoF,GAAiBX,EAAYS,GAElC,MAAMO,EAAgBhB,EAAWl8B,UAE7Bk8B,EAAWl8B,UADXk9B,EACuB,CAKtB1gB,EAAIvnC,KACD0nD,EAAengB,EAAIvnC,GACnBioD,EAAc1gB,EAAIvnC,IAIC0nD,EAQ/B,SAASG,GAAsBZ,EAAYU,GAEvC,MAAMO,EAAqBjB,EAAW19B,eAElC09B,EAAW19B,eADX2+B,EAC4B,CAM3B3gB,EAAIvnC,EAAKw5B,KACNmuB,EAAoBpgB,EAAIvnC,EAAKw5B,GAC7B0uB,EAAmB3gB,EAAIvnC,EAAKw5B,IAIJmuB,EAQpC,SAASF,GAAoBR,EAAYO,GAErC,MAAMW,EAAmBlB,EAAW79B,aAEhC69B,EAAW79B,aADX++B,EAC0B,CAKzB5gB,EAAIvnC,KACDwnD,EAAkBjgB,EAAIvnC,GACtBmoD,EAAiB5gB,EAAIvnC,IAICwnD,EAsGlC,MAAMY,GACF,YAAYC,EAAezC,EAAc0C,GACrCr0F,KAAKo0F,cAAgBA,EACrBp0F,KAAK2xF,aAAeA,EACpB3xF,KAAKq0F,YAAcA,EAKvB,gBAAkB,OAAOr0F,KAAKq0F,aAmClC,SAASC,GAAqBtB,GACtBA,EAAW1vF,KAAKrC,UAAUszF,cAC1BvB,EAAW/7B,SAAWu9B,GACtB,EAAkC9+B,UAY/B,WAMH,MAAM++B,EAAqBC,GAAsB10F,MAE3CqW,EAAUo+E,GAAsBA,EAAmBp+E,QACzD,GAAIA,EAAS,CAET,MAAM4U,EAAW,EAAwCA,SACzD,GAAIA,IAAaspC,GACb,EAAwCtpC,SAAW5U,OAKnD,IAAK,IAAIZ,KAAOY,EACZ4U,EAASxV,GAAOY,EAAQZ,GAGhC,EAAwCY,QAAU,KAClDrW,KAAKu0F,YAAYl+E,MAa7B,SAASm+E,GAAoBtwB,EAAU74D,EAAO8sD,EAAYmgB,GAEtD,MAAMmc,EAAqBC,GAAsBxwB,IA2BrD,SAA+BA,EAAUvpB,GACrC,OAAOupB,EAA6B,oBAAIvpB,EAD5C,CA1B8BupB,EAAU,CAAEj5C,SAAUspC,GAAWl+C,QAAS,OAE9DA,EAAUo+E,EAAmBp+E,UAAYo+E,EAAmBp+E,QAAU,IAEtE4U,EAAWwpE,EAAmBxpE,SAE9BmtC,EAAmCp4D,KAAqB,eAAEm4D,GAE1Dw8B,EAAiB1pE,EAASmtC,GAChC/hD,EAAQ+hD,GAAgB,IAAI+7B,GAAaQ,GAAkBA,EAAehD,aAActmF,EAAO4f,IAAaspC,IAC5G,EAAgC+jB,GAAejtE,EAQnD,SAASqpF,GAAsBxwB,GAC3B,OAAOA,EAA6B,qBAAK,KAmE7C,SAAS0wB,GAAkB1R,EAAUne,EAAc8vB,EAAuBlhB,EAAarU,GAEnF,GADA4jB,EAAWjzB,GAAkBizB,GACzBtuE,MAAM4I,QAAQ0lE,GAId,IAAK,IAAIxiF,EAAI,EAAGA,EAAIwiF,EAASpiF,OAAQJ,IACjCk0F,GAAkB1R,EAASxiF,GAAIqkE,EAAc8vB,EAAuBlhB,EAAarU,OAGpF,CAED,MAAMnI,EAAQgE,KAERpB,EAAQmB,KAEd,IAAIlN,EAAQ02B,GAAexB,GAAYA,EAAWjzB,GAAkBizB,EAASpxB,SAEzEgjC,EAAkBlQ,GAAkB1B,GAExC,MAAMlqB,EAAQuC,KAERw5B,EAAqC,MAAxB/7B,EAAM8L,gBAEnBK,EAAWnM,EAAM+E,eAEjBmH,EAAwBlM,EAAM8L,iBAAmB,GACvD,GAAI4f,GAAexB,KAAcA,EAAS2B,MAAO,CAG7C,MAAMn2B,EAAU,IAAI2Q,GAAoBy1B,EAAiBx1B,EAAgB8oB,IAEnE4M,EAAuBnzF,GAAQmsD,EAAO+W,EAAczF,EAAiBy1B,EAAaA,EAAa7vB,EAAuBC,IAC9F,IAA1B6vB,GACA9xB,GAAmBd,GAA+B,EAA4BrI,GAAQ5C,EAAOnJ,GAC7FinC,GAAgC99B,EAAO+rB,EAAUne,EAAajkE,QAC9DikE,EAAa1hE,KAAK2qD,GAClBgL,EAAM+E,iBACN/E,EAAMgF,eACFsB,IACAtG,EAAM8L,iBAAmB,OAE7B+vB,EAAsBxxF,KAAKqrD,GAC3BqL,EAAM12D,KAAKqrD,KAGXmmC,EAAsBG,GAAwBtmC,EAC9CqL,EAAMi7B,GAAwBtmC,OAGjC,CAsBD,MAAMwmC,EAAgCrzF,GAAQmsD,EAAO+W,EAAcgwB,EAAa7vB,EAAuBC,GAEjGgwB,EAAoCtzF,GAAQmsD,EAAO+W,EAAcgwB,EAAYA,EAAa7vB,GAE1FkwB,EAA4BF,GAAiC,GAC/DL,EAAsBK,GAEpBG,EAAgCF,GAAqC,GACvEN,EAAsBM,GAC1B,GAAI71B,IAAmB+1B,IAClB/1B,IAAmB81B,EAA2B,CAE/ClyB,GAAmBd,GAA+B,EAA4BrI,GAAQ5C,EAAOnJ,GAE7F,MAAMU,EAmJtB,SAAsB4mC,EAAWthF,EAAOsrD,EAAgBqU,EAAaluE,GAEjE,MAAMipD,EAAU,IAAI2Q,GAAoBi2B,EAAWh2B,EAAgB8oB,IAKnE,OAJA15B,EAAQm2B,MAAQ,GAChBn2B,EAAQ16C,MAAQA,EAChB06C,EAAQ6mC,mBAAqB,EAC7BC,GAAgB9mC,EAASjpD,EAAGkuE,IAAgBrU,GACrC5Q,EAPX,CAnJ6C4Q,EAAiBm2B,GAAoCC,GAA+Bb,EAAsB/zF,OAAQw+D,EAAgBqU,EAAamhB,IACvKx1B,GAAkB+1B,IACnBR,EAAsBM,GAAmCL,gBAAkBpmC,GAE/EumC,GAAgC99B,EAAO+rB,EAAUne,EAAajkE,QAC9DikE,EAAa1hE,KAAK2qD,GAClBgL,EAAM+E,iBACN/E,EAAMgF,eACFsB,IACAtG,EAAM8L,iBAAmB,OAE7B+vB,EAAsBxxF,KAAKqrD,GAC3BqL,EAAM12D,KAAKqrD,QAIXumC,GAAgC99B,EAAO+rB,EAAUgS,GAAiC,EAC9EA,EACAC,GACJK,GAAgB,EAA2Cl2B,EAAiB61B,EAAoCD,GAAgCJ,GAAkBx1B,GAAkBqU,IAEnLrU,GAAkBqU,GAAe0hB,GACfR,EAAsBM,GAAsD,uBAY/G,SAASF,GAAgC99B,EAAO+rB,EAAUyS,GAGtD,GAD+BjR,GAAexB,IACAA,EAhvTRqC,SAgvTmB,CAErD,MAEM/uB,GAFa,EAAgC+uB,UAAYrC,GAAUjiF,UAE3Cu1D,YAC1BA,IACCW,EAAMmH,eAAiBnH,EAAMmH,aAAe,KAAKj7D,KAAKsyF,EAAcn/B,IAWjF,SAASg/B,GAAgBI,EAAclnC,EAASmnC,GACzBD,EAAmB,MAAEvyF,KAAKqrD,GACzCmnC,GACmBD,EAAgC,qBAW3D,SAAS/zF,GAAQo+C,EAAM94C,EAAKksE,EAAOhsE,GAC/B,IAAK,IAAI3G,EAAI2yE,EAAO3yE,EAAI2G,EAAK3G,IACzB,GAAIyG,EAAIzG,KAAOu/C,EACX,OAAOv/C,EAEf,OAAQ,EAWZ,SAASg1F,GAA8BtxF,EAAGo/D,EAAOsyB,EAAO98B,GACpD,OAAO+8B,GAAgC/1F,KAAW,MAAG,IAazD,SAASy1F,GAAkCrxF,EAAGo/D,EAAOzJ,EAAOf,GAExD,MAAMg9B,EAA+Bh2F,KAAW,MAEhD,IAAI0H,EACJ,GAAI1H,KAAK80F,gBAAiB,CAEtB,MAAMmB,EAAoCj2F,KAAK80F,gBAAmC,mBAE5EoB,EAAiBxxB,GAAkB3K,EAAOA,EAr1wB1C,GAq1wB8F/5D,KAAqB,gBAAQ,MAAGg5D,GAEpItxD,EAASwuF,EAAehyF,MAAM,EAAG+xF,GAEjCF,GAAaC,EAAWtuF,GAExB,IAAK,IAAIhH,EAAIu1F,EAAgBv1F,EAAIw1F,EAAep1F,OAAQJ,IACpDgH,EAAOrE,KAAK6yF,EAAex1F,SAI/BgH,EAAS,GAETquF,GAAaC,EAAWtuF,GAE5B,OAAOA,EAQX,SAASquF,GAAaC,EAAWtuF,GAC7B,IAAK,IAAIhH,EAAI,EAAGA,EAAIs1F,EAAUl1F,OAAQJ,IAGlCgH,EAAOrE,MAAKqrD,EAD0CsnC,EAAUt1F,OAGpE,OAAOgH,EA4DX,SAASyuF,GAAmBtnC,EAAWunC,EAAgB,IACnD,OAICpD,IACGA,EAAWl+B,kBACP,CAKCj0D,EAAKw1F,IA3TlB,SAA2Bx1F,EAAKguD,EAAWunC,GAEvC,MAAMj/B,EAAQgE,KACd,GAAIhE,EAAMoL,gBAAiB,CAEvB,MAAMoR,EAAcxa,GAAet4D,GAEnC+zF,GAAkBwB,EAAej/B,EAAM/3C,KAAM+3C,EAAMuL,UAAWiR,GAAa,GAE3EihB,GAAkB/lC,EAAWsI,EAAM/3C,KAAM+3C,EAAMuL,UAAWiR,GAAa,IAT/E,CA4TyC9yE,EACzBw1F,EAAqBA,EAAmBxnC,GAAaA,EACrDunC,IA3ahB,GAA4CrC,WAAY,EAwgBxD,MAAMuC,IAqEN,MAAMC,GAMF,wBAAwB7c,GACpB,MAtBR,SAAiCA,GAE7B,MAAMn4E,EAAQkF,MAAM,kCAAkC0kC,GAAUuuC,oDAEhE,OADA,EAA4C,YAAIA,EACzCn4E,EAJX,CAsBsCm4E,uBAahC8c,UAENA,EAAyB5Q,KAAO,IAAI2Q,wBAmJ9BE,EAIF,YAAYC,GACR12F,KAAK02F,cAAgBA,UAO7BD,EAAWllC,kBAAoB,IAGzBolC,GAA2BF,SAiCjC,MAIME,GAtqYN,SAA0BjX,GACtB,OAAOD,GAAiBC,EAAiBnkB,KAA4BL,OA0tYzE,MAAM07B,IA+BN,MAAMC,GAAmB,iBAAG,CAOxBC,UAAW,EAIXC,SAAU,UAEdF,EAAoBA,EAAoBC,WAAa,YACrDD,EAAoBA,EAAoBE,UAAY,aAd3B,sBA+BnBC,UAMNA,EAAUzlC,kBAAoB,IAGxB0lC,WAoMN,MAIMA,GAtjYN,WAII,MAAMl9B,EAAQmB,KAIRg8B,EAAc/8B,GAFNoB,KAEqCvnD,MAAO+lD,GAC1D,OAvBJ,SAA8B1vB,GAE1B,MAAMmvB,EAAWnvB,EA1iaJ,IA2iab,GAAIkvB,GAAqBC,GACrB,OAAO,EAGP,MAAM,IAAI/yD,MAAM,gEAPxB,CAuBgCoyD,GAAQq+B,GAAeA,EAAcn9B,uBA0jY/Do9B,UAGaA,EAAU9nC,WAAQb,GAAmB,CACpDR,MAAOmpC,EACP1oC,WAAY,OACZC,QAAS,IAGH,aAkCV,MAAM0oC,GAIF,YAAYC,GACRr3F,KAAKq3F,KAAOA,EACZr3F,KAAKs3F,MAAQD,EAAK14F,MAAM,KAAK,GAC7BqB,KAAKu3F,MAAQF,EAAK14F,MAAM,KAAK,GAC7BqB,KAAKw3F,MAAQH,EAAK14F,MAAM,KAAKuF,MAAM,GAAGjE,KAAK,MAiBnD,MAAMqpC,GAAU,IAAI8tD,GAAQ,SAO5B,MAAMK,GACF,eAKA,SAAS5rD,GAAO,OAAOy6C,GAAqBz6C,GAM5C,OAAO6rD,GACH,OAAO,IAAIC,GAAsBD,IAIzC,MAAME,GAAkB,CAKvB5jF,EAAOisC,IAASA,EAOjB,MAAM03C,GAIF,YAAYD,GACR13F,KAAKc,OAAS,EAEdd,KAAK63F,eAAiB,KAEtB73F,KAAK83F,iBAAmB,KACxB93F,KAAK+3F,gBAAkB,KACvB/3F,KAAKg4F,QAAU,KACfh4F,KAAKi4F,QAAU,KACfj4F,KAAKk4F,eAAiB,KACtBl4F,KAAKm4F,eAAiB,KACtBn4F,KAAKo4F,WAAa,KAClBp4F,KAAKq4F,WAAa,KAClBr4F,KAAKs4F,cAAgB,KACrBt4F,KAAKu4F,cAAgB,KAErBv4F,KAAKw4F,qBAAuB,KAC5Bx4F,KAAKy4F,qBAAuB,KAC5Bz4F,KAAK04F,WAAahB,GAAaE,GAMnC,YAAYrlE,GAER,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKg4F,QAAoB,OAAX1U,EAAiBA,EAASA,EAAO97B,MACzDj1B,EAAG+wD,GAOX,iBAAiB/wD,GAEb,IAAIomE,EAAS34F,KAAKg4F,QAEdY,EAAa54F,KAAKs4F,cAElBO,EAAkB,EAElBC,EAAc,KAClB,KAAOH,GAAUC,GAAY,CAIzB,MAAMtV,GAAUsV,GACZD,GACuBA,EAAoB,aACnCI,GAAiBH,EAAYC,EAAiBC,GACtD,EACAF,EAEEI,EAAmBD,GAAiBzV,EAAQuV,EAAiBC,GAE7DG,EAAe3V,EAAO2V,aAE5B,GAAI3V,IAAWsV,EACXC,IACAD,EAAaA,EAAWM,kBAIxB,GADAP,EAAS,EAA4BnxC,MACT,MAAxB87B,EAAO6V,cACPN,QAEC,CAEIC,IACDA,EAAc,IAElB,MAAMM,EAAyBJ,EAAmBH,EAE5CQ,EAAoB,EAAoCR,EAC9D,GAAIO,GAA0BC,EAAmB,CAC7C,IAAK,IAAI34F,EAAI,EAAGA,EAAI04F,EAAwB14F,IAAK,CAE7C,MAAMqU,EAASrU,EAAIo4F,EAAYh4F,OAASg4F,EAAYp4F,GAAMo4F,EAAYp4F,GAAK,EAErEsT,EAAQe,EAASrU,EACnB24F,GAAqBrlF,GAASA,EAAQolF,IACtCN,EAAYp4F,GAAKqU,EAAS,GAKlC+jF,EADsBxV,EAAO6V,eACAE,EAAoBD,GAIzDJ,IAAqBC,GACrB1mE,EAAG+wD,EAAQ0V,EAAkBC,IAQzC,oBAAoB1mE,GAEhB,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAK+3F,gBAA4B,OAAXzU,EAAiBA,EAASA,EAAOgW,cACjE/mE,EAAG+wD,GAOX,iBAAiB/wD,GAEb,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKk4F,eAA2B,OAAX5U,EAAiBA,EAASA,EAAOiW,WAChEhnE,EAAG+wD,GAOX,iBAAiB/wD,GAEb,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKo4F,WAAuB,OAAX9U,EAAiBA,EAASA,EAAOkW,WAC5DjnE,EAAG+wD,GAOX,mBAAmB/wD,GAEf,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKs4F,cAA0B,OAAXhV,EAAiBA,EAASA,EAAO4V,aAC/D3mE,EAAG+wD,GAOX,sBAAsB/wD,GAElB,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKw4F,qBAAiC,OAAXlV,EAAiBA,EAASA,EAAOmW,oBACtElnE,EAAG+wD,GAOX,KAAK/tE,GAGD,GAFkB,MAAdA,IACAA,EAAa,KACZ+wE,GAAqB/wE,GACtB,MAAM,IAAI9O,MAAM,yBAAyB0kC,GAAU51B,8CAEvD,OAAIvV,KAAK05F,MAAMnkF,GACJvV,KAGA,KAMf,aAKA,MAAMuV,GACFvV,KAAK25F,SAEL,IAII3lF,EAEAisC,EAEA25C,EARAtW,EAAStjF,KAAKg4F,QAEd6B,GAAa,EAOjB,GAAIjlF,MAAM4I,QAAQjI,GAAa,CAC3B,KAA4BzU,OAASyU,EAAWzU,OAChD,IAAK,IAAIkT,EAAQ,EAAGA,EAAQhU,KAAKc,OAAQkT,IACrCisC,EAAO1qC,EAAWvB,GAClB4lF,EAAc55F,KAAK04F,WAAW1kF,EAAOisC,GACtB,OAAXqjC,GAAoB6C,GAAe7C,EAAOwW,UAAWF,IAKjDC,IAEAvW,EAAStjF,KAAK+5F,mBAAmBzW,EAAQrjC,EAAM25C,EAAa5lF,IAE3DmyE,GAAe7C,EAAOrjC,KAAMA,IAC7BjgD,KAAKg6F,mBAAmB1W,EAAQrjC,KATpCqjC,EAAStjF,KAAKi6F,UAAU3W,EAAQrjC,EAAM25C,EAAa5lF,GACnD6lF,GAAa,GAUjBvW,EAASA,EAAO97B,WAIpBxzC,EAAQ,EAx5QpB,SAA2B63B,EAAKtZ,GAC5B,GAAI3d,MAAM4I,QAAQquB,GACd,IAAK,IAAInrC,EAAI,EAAGA,EAAImrC,EAAI/qC,OAAQJ,IAC5B6xB,EAAGsZ,EAAInrC,QAGV,CAED,MAAM0Z,EAAWyxB,EAAI,QAErB,IAAIoU,EACJ,OAAUA,EAAO7lC,EAASkhB,QAAY,MAClC/I,EAAG0tB,EAAK50C,QAZpB,CAy5Q8BkK,EAIjB0qC,IACG25C,EAAc55F,KAAK04F,WAAW1kF,EAAOisC,GACtB,OAAXqjC,GAAoB6C,GAAe7C,EAAOwW,UAAWF,IAKjDC,IAEAvW,EAAStjF,KAAK+5F,mBAAmBzW,EAAQrjC,EAAM25C,EAAa5lF,IAE3DmyE,GAAe7C,EAAOrjC,KAAMA,IAC7BjgD,KAAKg6F,mBAAmB1W,EAAQrjC,KATpCqjC,EAAStjF,KAAKi6F,UAAU3W,EAAQrjC,EAAM25C,EAAa5lF,GACnD6lF,GAAa,GAUjBvW,EAASA,EAAO97B,MAChBxzC,MAEJ,KAA4BlT,OAASkT,EAIzC,OAFAhU,KAAKk6F,UAAU5W,GACf,KAA4B/tE,WAAaA,EAClCvV,KAAKm6F,QAQhB,cACI,OAA+B,OAAxBn6F,KAAKk4F,gBAA+C,OAApBl4F,KAAKo4F,YACjB,OAAvBp4F,KAAKs4F,eAAwD,OAA9Bt4F,KAAKw4F,qBAW5C,SACI,GAAIx4F,KAAKm6F,QAAS,CAEd,IAAI7W,EAEA8W,EACJ,IAAK9W,EAAStjF,KAAK+3F,gBAAkB/3F,KAAKg4F,QAAoB,OAAX1U,EAAiBA,EAASA,EAAO97B,MAChF87B,EAAOgW,cAAgBhW,EAAO97B,MAElC,IAAK87B,EAAStjF,KAAKk4F,eAA2B,OAAX5U,EAAiBA,EAASA,EAAOiW,WAChEjW,EAAO6V,cAAgB7V,EAAO2V,aAGlC,IADAj5F,KAAKk4F,eAAiBl4F,KAAKm4F,eAAiB,KACvC7U,EAAStjF,KAAKo4F,WAAuB,OAAX9U,EAAiBA,EAAS8W,EACrD9W,EAAO6V,cAAgB7V,EAAO2V,aAC9BmB,EAAa9W,EAAOkW,WAExBx5F,KAAKo4F,WAAap4F,KAAKq4F,WAAa,KACpCr4F,KAAKs4F,cAAgBt4F,KAAKu4F,cAAgB,KAC1Cv4F,KAAKw4F,qBAAuBx4F,KAAKy4F,qBAAuB,MAoBhE,UAAUnV,EAAQrjC,EAAM25C,EAAa5lF,GAGjC,IAAIqmF,EAkCJ,OAjCe,OAAX/W,EACA+W,EAAiBr6F,KAAKi4F,SAGtBoC,EAAiB/W,EAAOgX,MAExBt6F,KAAKu6F,QAAQjX,IAIF,QADfA,EAAiC,OAAxBtjF,KAAK63F,eAA0B,KAAO73F,KAAK63F,eAAe52E,IAAI24E,EAAa5lF,KAI3EmyE,GAAe7C,EAAOrjC,KAAMA,IAC7BjgD,KAAKg6F,mBAAmB1W,EAAQrjC,GACpCjgD,KAAKw6F,WAAWlX,EAAQ+W,EAAgBrmF,IAKzB,QADfsvE,EAAmC,OAA1BtjF,KAAK83F,iBAA4B,KAAO93F,KAAK83F,iBAAiB72E,IAAI24E,EAAa,QAI/EzT,GAAe7C,EAAOrjC,KAAMA,IAC7BjgD,KAAKg6F,mBAAmB1W,EAAQrjC,GACpCjgD,KAAKy6F,eAAenX,EAAQ+W,EAAgBrmF,IAI5CsvE,EACItjF,KAAK06F,UAAU,IAAIC,GAAsB16C,EAAM25C,GAAcS,EAAgBrmF,GAGlFsvE,EAkCX,mBAAmBA,EAAQrjC,EAAM25C,EAAa5lF,GAE1C,IAAI4mF,EAA2C,OAA1B56F,KAAK83F,iBAA4B,KAAO93F,KAAK83F,iBAAiB72E,IAAI24E,EAAa,MAQpG,OAPuB,OAAnBgB,EACAtX,EAAStjF,KAAKy6F,eAAeG,EAAmCtX,EAAa,MAAGtvE,GAE3EsvE,EAAO2V,cAAgBjlF,IAC5BsvE,EAAO2V,aAAejlF,EACtBhU,KAAK66F,YAAYvX,EAAQtvE,IAEtBsvE,EAWX,UAAUA,GAEN,KAAkB,OAAXA,GAAiB,CAEpB,MAAM8W,EAAa9W,EAAO97B,MAC1BxnD,KAAK86F,eAAe96F,KAAK+6F,QAAQzX,IACjCA,EAAS8W,EAEiB,OAA1Bp6F,KAAK83F,kBACL93F,KAAK83F,iBAAiBl5E,QAEE,OAAxB5e,KAAKm4F,iBACLn4F,KAAKm4F,eAAeoB,WAAa,MAEb,OAApBv5F,KAAKq4F,aACLr4F,KAAKq4F,WAAWmB,WAAa,MAEZ,OAAjBx5F,KAAKi4F,UACLj4F,KAAKi4F,QAAQzwC,MAAQ,MAEE,OAAvBxnD,KAAKu4F,gBACLv4F,KAAKu4F,cAAcW,aAAe,MAEJ,OAA9Bl5F,KAAKy4F,uBACLz4F,KAAKy4F,qBAAqBgB,oBAAsB,MAUxD,eAAenW,EAAQ0X,EAAYhnF,GACD,OAA1BhU,KAAK83F,kBACL93F,KAAK83F,iBAAiBx2D,OAAOgiD,GAGjC,MAAM71C,EAAO61C,EAAO2X,aAEd3/D,EAAOgoD,EAAO4V,aAepB,OAda,OAATzrD,EACAztC,KAAKs4F,cAAgBh9D,EAGrBmS,EAAKyrD,aAAe59D,EAEX,OAATA,EACAt7B,KAAKu4F,cAAgB9qD,EAGrBnS,EAAK2/D,aAAextD,EAExBztC,KAAKk7F,aAAa5X,EAAQ0X,EAAYhnF,GACtChU,KAAK66F,YAAYvX,EAAQtvE,GAClBsvE,EASX,WAAWA,EAAQ0X,EAAYhnF,GAI3B,OAHAhU,KAAK+6F,QAAQzX,GACbtjF,KAAKk7F,aAAa5X,EAAQ0X,EAAYhnF,GACtChU,KAAK66F,YAAYvX,EAAQtvE,GAClBsvE,EASX,UAAUA,EAAQ0X,EAAYhnF,GAa1B,OAZAhU,KAAKk7F,aAAa5X,EAAQ0X,EAAYhnF,GAIlChU,KAAKm4F,eAHmB,OAAxBn4F,KAAKm4F,eAGiBn4F,KAAKk4F,eAAiB5U,EAMtBtjF,KAAKm4F,eAAeoB,WAAajW,EAEpDA,EASX,aAAaA,EAAQ0X,EAAYhnF,GAU7B,MAAMsnB,EAAsB,OAAf0/D,EAAsBh7F,KAAKg4F,QAAUgD,EAAWxzC,MAuB7D,OAnBA87B,EAAO97B,MAAQlsB,EACfgoD,EAAOgX,MAAQU,EACF,OAAT1/D,EACAt7B,KAAKi4F,QAAU3U,EAGfhoD,EAAKg/D,MAAQhX,EAEE,OAAf0X,EACAh7F,KAAKg4F,QAAU1U,EAGf0X,EAAWxzC,MAAQ87B,EAEK,OAAxBtjF,KAAK63F,iBACL73F,KAAK63F,eAAiB,IAAIsD,IAE9Bn7F,KAAK63F,eAAeuD,IAAI9X,GACxBA,EAAO2V,aAAejlF,EACfsvE,EAOX,QAAQA,GACJ,OAAOtjF,KAAK86F,eAAe96F,KAAK+6F,QAAQzX,IAO5C,QAAQA,GACwB,OAAxBtjF,KAAK63F,gBACL73F,KAAK63F,eAAev2D,OAAOgiD,GAG/B,MAAM71C,EAAO61C,EAAOgX,MAEdh/D,EAAOgoD,EAAO97B,MAgBpB,OAZa,OAAT/Z,EACAztC,KAAKg4F,QAAU18D,EAGfmS,EAAK+Z,MAAQlsB,EAEJ,OAATA,EACAt7B,KAAKi4F,QAAUxqD,EAGfnS,EAAKg/D,MAAQ7sD,EAEV61C,EAQX,YAAYA,EAAQ+X,GAGhB,OAAI/X,EAAO6V,gBAAkBkC,IAMzBr7F,KAAKq4F,WAHe,OAApBr4F,KAAKq4F,WAGar4F,KAAKo4F,WAAa9U,EAKlBtjF,KAAKq4F,WAAWmB,WAAalW,GAVxCA,EAmBf,eAAeA,GAoBX,OAnB8B,OAA1BtjF,KAAK83F,mBACL93F,KAAK83F,iBAAmB,IAAIqD,IAEhCn7F,KAAK83F,iBAAiBsD,IAAI9X,GAC1BA,EAAO2V,aAAe,KACtB3V,EAAO4V,aAAe,KACK,OAAvBl5F,KAAKu4F,eAGLv4F,KAAKu4F,cAAgBv4F,KAAKs4F,cAAgBhV,EAC1CA,EAAO2X,aAAe,OAMtB3X,EAAO2X,aAAej7F,KAAKu4F,cAC3Bv4F,KAAKu4F,cAAgBv4F,KAAKu4F,cAAcW,aAAe5V,GAEpDA,EAQX,mBAAmBA,EAAQrjC,GAQvB,OAPAqjC,EAAOrjC,KAAOA,EAEVjgD,KAAKy4F,qBADyB,OAA9Bz4F,KAAKy4F,qBACuBz4F,KAAKw4F,qBAAuBlV,EAG5BtjF,KAAKy4F,qBAAqBgB,oBAAsBnW,EAEzEA,GAkFf,MAAMqX,GAKF,YAAY16C,EAAM65C,GACd95F,KAAKigD,KAAOA,EACZjgD,KAAK85F,UAAYA,EACjB95F,KAAKi5F,aAAe,KACpBj5F,KAAKm5F,cAAgB,KAIrBn5F,KAAKs5F,cAAgB,KAIrBt5F,KAAKs6F,MAAQ,KAIbt6F,KAAKwnD,MAAQ,KAIbxnD,KAAKs7F,SAAW,KAIhBt7F,KAAKu7F,SAAW,KAIhBv7F,KAAKi7F,aAAe,KAIpBj7F,KAAKk5F,aAAe,KAIpBl5F,KAAKu5F,WAAa,KAIlBv5F,KAAKw5F,WAAa,KAIlBx5F,KAAKy5F,oBAAsB,MAmEnC,MAAM+B,GACF,cAIIx7F,KAAKy7F,MAAQ,KAIbz7F,KAAK07F,MAAQ,KASjB,IAAIpY,GACmB,OAAftjF,KAAKy7F,OACLz7F,KAAKy7F,MAAQz7F,KAAK07F,MAAQpY,EAC1BA,EAAOiY,SAAW,KAClBjY,EAAOgY,SAAW,OAMCt7F,KAAW,MAAEu7F,SAAWjY,EAC3CA,EAAOgY,SAAWt7F,KAAK07F,MACvBpY,EAAOiY,SAAW,KAClBv7F,KAAK07F,MAAQpY,GAUrB,IAAIwW,EAAW6B,GAEX,IAAIrY,EACJ,IAAKA,EAAStjF,KAAKy7F,MAAkB,OAAXnY,EAAiBA,EAASA,EAAOiY,SACvD,IAAwB,OAAnBI,GAA2BA,GAAqCrY,EAAoB,eACrF6C,GAAe7C,EAAOwW,UAAWA,GACjC,OAAOxW,EAGf,OAAO,KASX,OAAOA,GAkBH,MAAM71C,EAAO61C,EAAOgY,SAEdhgE,EAAOgoD,EAAOiY,SAapB,OAZa,OAAT9tD,EACAztC,KAAKy7F,MAAQngE,EAGbmS,EAAK8tD,SAAWjgE,EAEP,OAATA,EACAt7B,KAAK07F,MAAQjuD,EAGbnS,EAAKggE,SAAW7tD,EAEE,OAAfztC,KAAKy7F,OAkBpB,MAAMN,GACF,cACIn7F,KAAKyB,IAAM,IAAI4a,IAMnB,IAAIinE,GAEA,MAAM7tE,EAAM6tE,EAAOwW,UAEnB,IAAI8B,EAAa57F,KAAKyB,IAAIwf,IAAIxL,GACzBmmF,IACDA,EAAa,IAAIJ,GACjBx7F,KAAKyB,IAAI5C,IAAI4W,EAAKmmF,IAEtBA,EAAW18E,IAAIokE,GAYnB,IAAIwW,EAAW6B,GAEX,MAEME,EAAa77F,KAAKyB,IAAIwf,IAFhB64E,GAGZ,OAAO+B,EAAaA,EAAW56E,IAAI64E,EAAW6B,GAAkB,KASpE,OAAOrY,GAEH,MAAM7tE,EAAM6tE,EAAOwW,UAOnB,OALsC95F,KAAKyB,IAAIwf,IAAIxL,GAEpC6rB,OAAOgiD,IAClBtjF,KAAKyB,IAAIq6F,OAAOrmF,GAEb6tE,EAKX,cAAgB,OAAyB,IAAlBtjF,KAAKyB,IAAImW,KAIhC,QAAU5X,KAAKyB,IAAImd,SAYvB,SAASm6E,GAAiB94C,EAAM44C,EAAiBC,GAE7C,MAAMK,EAAgBl5C,EAAKk5C,cAC3B,GAAsB,OAAlBA,EACA,OAAOA,EAEX,IAAI4C,EAAa,EAIjB,OAHIjD,GAAeK,EAAgBL,EAAYh4F,SAC3Ci7F,EAAajD,EAAYK,IAEtBA,EAAgBN,EAAkBkD,EAW7C,MAAMC,GACF,eAKA,SAASnwD,GAAO,OAAOA,aAAexvB,KAAOkqE,GAAa16C,GAK1D,SAAW,OAAO,IAAIowD,IAK1B,MAAMA,GACF,cACIj8F,KAAKk8F,SAAW,IAAI7/E,IACpBrc,KAAKm8F,SAAW,KAEhBn8F,KAAKo8F,aAAe,KACpBp8F,KAAKq8F,iBAAmB,KACxBr8F,KAAKs8F,aAAe,KACpBt8F,KAAKu8F,aAAe,KACpBv8F,KAAKk4F,eAAiB,KACtBl4F,KAAKm4F,eAAiB,KACtBn4F,KAAKs4F,cAAgB,KACrBt4F,KAAKu4F,cAAgB,KAKzB,cACI,OAA+B,OAAxBv4F,KAAKk4F,gBAAiD,OAAtBl4F,KAAKs8F,cACjB,OAAvBt8F,KAAKs4F,cAMb,YAAY/lE,GAER,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKm8F,SAAqB,OAAX7Y,EAAiBA,EAASA,EAAO97B,MAC1Dj1B,EAAG+wD,GAOX,oBAAoB/wD,GAEhB,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKq8F,iBAA6B,OAAX/Y,EAAiBA,EAASA,EAAOgW,cAClE/mE,EAAG+wD,GAOX,mBAAmB/wD,GAEf,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKs8F,aAAyB,OAAXhZ,EAAiBA,EAASA,EAAOkZ,aAC9DjqE,EAAG+wD,GAOX,iBAAiB/wD,GAEb,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKk4F,eAA2B,OAAX5U,EAAiBA,EAASA,EAAOiW,WAChEhnE,EAAG+wD,GAOX,mBAAmB/wD,GAEf,IAAI+wD,EACJ,IAAKA,EAAStjF,KAAKs4F,cAA0B,OAAXhV,EAAiBA,EAASA,EAAO4V,aAC/D3mE,EAAG+wD,GAOX,KAAK7hF,GACD,GAAKA,EAAAA,CAGA,KAAMA,aAAe4a,KAAOkqE,GAAa9kF,IAC1C,MAAM,IAAIgF,MAAM,yBAAyB0kC,GAAU1pC,+CAHnDA,EAAM,IAAI4a,IAKd,OAAOrc,KAAK05F,MAAMj4F,GAAOzB,KAAO,KAKpC,aAOA,MAAMyB,GACFzB,KAAK25F,SAEL,IAAI/c,EAAe58E,KAAKm8F,SAoBxB,GAnBAn8F,KAAKo8F,aAAe,KACpBp8F,KAAKy8F,SAASh7F,EAAK,CAKlB4J,EAAOoK,KACJ,GAAImnE,GAAgBA,EAAannE,MAAQA,EACrCzV,KAAK08F,mBAAmB9f,EAAcvxE,GACtCrL,KAAKo8F,aAAexf,EACpBA,EAAeA,EAAap1B,UAE3B,CAED,MAAM87B,EAAStjF,KAAK28F,yBAAyBlnF,EAAKpK,GAClDuxE,EAAe58E,KAAK48F,sBAAsBhgB,EAAc0G,MAI5D1G,EAAc,CACVA,EAAa0d,QACb1d,EAAa0d,MAAM9yC,MAAQ,MAE/BxnD,KAAKs4F,cAAgB1b,EACrB,IAAK,IAAI0G,EAAS1G,EAAyB,OAAX0G,EAAiBA,EAASA,EAAO4V,aACzD5V,IAAWtjF,KAAKm8F,WAChBn8F,KAAKm8F,SAAW,MAEpBn8F,KAAKk8F,SAASJ,OAAOxY,EAAO7tE,KAC5B6tE,EAAO4V,aAAe5V,EAAO97B,MAC7B87B,EAAO8Q,cAAgB9Q,EAAOqO,aAC9BrO,EAAOqO,aAAe,KACtBrO,EAAOgX,MAAQ,KACfhX,EAAO97B,MAAQ,KAQvB,OAJIxnD,KAAKu8F,eACLv8F,KAAKu8F,aAAaC,aAAe,MACjCx8F,KAAKm4F,iBACLn4F,KAAKm4F,eAAeoB,WAAa,MAC9Bv5F,KAAKm6F,QAchB,sBAAsBxhE,EAAQ2qD,GAC1B,GAAI3qD,EAAQ,CAER,MAAM8U,EAAO9U,EAAO2hE,MAWpB,OAVAhX,EAAO97B,MAAQ7uB,EACf2qD,EAAOgX,MAAQ7sD,EACf9U,EAAO2hE,MAAQhX,EACX71C,IACAA,EAAK+Z,MAAQ87B,GAEb3qD,IAAW34B,KAAKm8F,WAChBn8F,KAAKm8F,SAAW7Y,GAEpBtjF,KAAKo8F,aAAezjE,EACbA,EAUX,OARI34B,KAAKo8F,cACLp8F,KAAKo8F,aAAa50C,MAAQ87B,EAC1BA,EAAOgX,MAAQt6F,KAAKo8F,cAGpBp8F,KAAKm8F,SAAW7Y,EAEpBtjF,KAAKo8F,aAAe9Y,EACb,KAQX,yBAAyB7tE,EAAKpK,GAC1B,GAAIrL,KAAKk8F,SAASnlF,IAAItB,GAAM,CAExB,MAAM6tE,EAA4BtjF,KAAKk8F,SAASj7E,IAAIxL,GACpDzV,KAAK08F,mBAAmBpZ,EAAQj4E,GAEhC,MAAMoiC,EAAO61C,EAAOgX,MAEdh/D,EAAOgoD,EAAO97B,MASpB,OARI/Z,IACAA,EAAK+Z,MAAQlsB,GAEbA,IACAA,EAAKg/D,MAAQ7sD,GAEjB61C,EAAO97B,MAAQ,KACf87B,EAAOgX,MAAQ,KACRhX,EAGX,MAAMA,EAAS,IAAIuZ,GAAsBpnF,GAIzC,OAHAzV,KAAKk8F,SAASr9F,IAAI4W,EAAK6tE,GACvBA,EAAOqO,aAAetmF,EACtBrL,KAAK88F,gBAAgBxZ,GACdA,EAMX,SACI,GAAItjF,KAAKm6F,QAAS,CAEd,IAAI7W,EAGJ,IADAtjF,KAAKq8F,iBAAmBr8F,KAAKm8F,SACxB7Y,EAAStjF,KAAKq8F,iBAA6B,OAAX/Y,EAAiBA,EAASA,EAAO97B,MAClE87B,EAAOgW,cAAgBhW,EAAO97B,MAIlC,IAAK87B,EAAStjF,KAAKs8F,aAAyB,OAAXhZ,EAAiBA,EAASA,EAAOkZ,aAC9DlZ,EAAO8Q,cAAgB9Q,EAAOqO,aAElC,IAAKrO,EAAStjF,KAAKk4F,eAA0B,MAAV5U,EAAgBA,EAASA,EAAOiW,WAC/DjW,EAAO8Q,cAAgB9Q,EAAOqO,aAElC3xF,KAAKs8F,aAAet8F,KAAKu8F,aAAe,KACxCv8F,KAAKk4F,eAAiBl4F,KAAKm4F,eAAiB,KAC5Cn4F,KAAKs4F,cAAgB,MAU7B,mBAAmBhV,EAAQ35D,GAClBw8D,GAAex8D,EAAU25D,EAAOqO,gBACjCrO,EAAO8Q,cAAgB9Q,EAAOqO,aAC9BrO,EAAOqO,aAAehoE,EACtB3pB,KAAK+8F,cAAczZ,IAQ3B,gBAAgBA,GACgB,OAAxBtjF,KAAKk4F,eACLl4F,KAAKk4F,eAAiBl4F,KAAKm4F,eAAiB7U,GAGzBtjF,KAAoB,eAAEu5F,WAAajW,EACtDtjF,KAAKm4F,eAAiB7U,GAQ9B,cAAcA,GACgB,OAAtBtjF,KAAKs8F,aACLt8F,KAAKs8F,aAAet8F,KAAKu8F,aAAejZ,GAGrBtjF,KAAkB,aAAEw8F,aAAelZ,EACtDtjF,KAAKu8F,aAAejZ,GAW5B,SAASz3C,EAAKtZ,GACNsZ,aAAexvB,IACfwvB,EAAIvsC,QAAQizB,GAGZnzB,OAAOC,KAAKwsC,GAAKvsC,QAIjBC,GAAKgzB,EAAGsZ,EAAItsC,GAAIA,KA2D5B,MAAMs9F,GAIF,YAAYpnF,GACRzV,KAAKyV,IAAMA,EACXzV,KAAKo0F,cAAgB,KACrBp0F,KAAK2xF,aAAe,KAIpB3xF,KAAKs5F,cAAgB,KAIrBt5F,KAAKwnD,MAAQ,KAIbxnD,KAAKs6F,MAAQ,KAIbt6F,KAAKu5F,WAAa,KAIlBv5F,KAAKk5F,aAAe,KAIpBl5F,KAAKw8F,aAAe,yBAyMtBQ,EAIF,YAAYhH,GACRh2F,KAAKg2F,UAAYA,EAOrB,cAAcA,EAAW3vE,GACrB,GAAc,MAAVA,EAAgB,CAEhB,MAAM42E,EAAS52E,EAAO2vE,UAAU9xF,QAChC8xF,EAAYA,EAAUrsF,OAAOszF,GAEjC,OAAO,IAAID,EAAgBhH,GAwB/B,cAAcA,GACV,MAAO,CACHlkC,QAASkrC,EACT7X,WAIC9+D,IACG,IAAKA,EAID,MAAM,IAAI5f,MAAM,2DAEpB,OAAOu2F,EAAgBhyF,OAAOgrF,EAAW3vE,IAG7C++D,KAAM,CAAC,CAAC4X,EAAiB,IAAI7uC,GAAY,IAAIF,MAOrD,KAAK/9B,GAED,MAAMw+B,EAAU1uD,KAAKg2F,UAAU79D,KAI/B1yB,GAAKA,EAAEu4C,SAAS9tB,IAChB,GAAe,MAAXw+B,EACA,OAAOA,EAGP,MAAM,IAAIjoD,MAAM,2CAA2CypB,eA6BtC5sB,EA7BoF4sB,EA8B1G5sB,EAAW,aAAYA,MADlC,IAAiCA,UAxBd05F,EAAgB3tC,WAAQb,GAAmB,CAC1DR,MAAOgvC,EACPvuC,WAAY,OACZC,QAAS,IAGH,IAAIsuC,EAAgB,CAAC,IAAIvF,4BAmJ7ByF,EAIF,YAAYlH,GACRh2F,KAAKg2F,UAAYA,EAQrB,cAAcA,EAAW3vE,GACrB,GAAIA,EAAQ,CAER,MAAM42E,EAAS52E,EAAO2vE,UAAU9xF,QAChC8xF,EAAYA,EAAUrsF,OAAOszF,GAEjC,OAAO,IAAIC,EAAgBlH,GAyB/B,cAAcA,GACV,MAAO,CACHlkC,QAASorC,EACT/X,WAIC9+D,IACG,IAAKA,EAGD,MAAM,IAAI5f,MAAM,2DAEpB,OAAOy2F,EAAgBlyF,OAAOgrF,EAAW3vE,IAG7C++D,KAAM,CAAC,CAAC8X,EAAiB,IAAI/uC,GAAY,IAAIF,MAOrD,KAAKkvC,GAED,MAAMzuC,EAAU1uD,KAAKg2F,UAAU79D,KAI/B1yB,GAAKA,EAAEu4C,SAASm/C,IAChB,GAAIzuC,EACA,OAAOA,EAEX,MAAM,IAAIjoD,MAAM,2CAA2C02F,cAIhDD,EAAgB7tC,WAAQb,GAAmB,CAC1DR,MAAOkvC,EACPzuC,WAAY,OACZC,QAAS,IAGH,IAAIwuC,EAAgB,CAAC,IAAIlB,aAwBnC,MAAMoB,GAAa,CAAC,IAAIpB,IAOlBqB,GAAyB,IAAIL,GAFd,CAAC,IAAIvF,KAIpB6F,GAAyB,IAAIJ,GAAgBE,uBA2B7CG,UAMNA,EAAYhsC,kBAAoB,IAG1BisC,GAA4BD,EAAa9G,UAiC/C,MAIM+G,GArldN,SAA2B5d,EAAkBF,GACzC,OAAOC,GAAkBC,EAAkBF,EAAiBnkB,KAA4BL,0BA2mdtFuiC,UAMNA,EAAiBlsC,kBAAoB,IAG/BmsC,GAAkCD,EAAkBhH,UAiI1D,MAIMiH,GAnrdN,SAAgCtd,EAAuBV,GAGnD,OAAOS,GAAmBC,EAAuBV,EADRnkB,KACwCL,OAksjB/EyiC,GAAwC,GAkS9C,MAAMC,WAAmCpH,GAIrC,YAAYxV,GACR/5B,QACAjnD,KAAKghF,SAAWA,EAOpB,wBAAwBtH,GAGpB,MAAMmkB,EAAkCnmC,GAAgBgiB,GACxD,OAAO,IAAIokB,GAAmBD,EAAc79F,KAAKghF,WAczD,SAAS+c,GAAWt8F,GAEhB,MAAMmS,EAAQ,GACd,IAAK,IAAIoqF,KAAev8F,EAChBA,EAAIuX,eAAeglF,IAGnBpqF,EAAMvQ,KAAK,CAAEgqD,SADI5rD,EAAIu8F,GACYC,aAAcD,IAGvD,OAAOpqF,EAgBX,MAAMsqF,GAAY,IAAI1sC,GAAe,kBAAmB,CACpD/C,WAAY,OACZC,QAAS,IAGHiT,KAoCV,MAAMm8B,WAA2BxH,GAK7B,YAAYuH,EAAc7c,GACtB/5B,QACAjnD,KAAK69F,aAAeA,EACpB79F,KAAKghF,SAAWA,EAChBhhF,KAAKm+F,cAAgBN,EAAav6F,KAClCtD,KAAK6sD,SAAoCgxC,EAAahnC,UA1yvBtCp1D,IAAIsuE,IAAsB9vE,KAAK,KA2yvB/CD,KAAKk1D,mBACD2oC,EAAa3oC,mBAAqB2oC,EAAa3oC,mBAAqB,GACxEl1D,KAAKo+F,kBAAoBpd,EAK7B,aACI,OAAO+c,GAAW/9F,KAAK69F,aAAatoC,QAKxC,cACI,OAAOwoC,GAAW/9F,KAAK69F,aAAaroC,SASxC,OAAOrD,EAAUyuB,EAAkByd,EAAoBrd,GAGnD,MAAMsd,GAFNtd,EAAWA,GAAYhhF,KAAKghF,UAhEpC,SAA+Bsd,EAAkBj6B,GAC7C,MAAO,CACHpjD,IAAK,CAOJ+sC,EAAO4E,EAAe3tD,KAEnB,MAAMoG,EAAQizF,EAAiBr9E,IAAI+sC,EAAO,GAA4D/oD,GACtG,OAAIoG,IAAUsyF,IACV/qC,IAAkB+qC,GAMXtyF,EAEJg5D,EAAepjD,IAAI+sC,EAAO4E,EAAe3tD,KArB5D,CAkEkEktD,EAAU6uB,EAAS7uB,UAAYA,EAEnFqf,EAAqC8sB,EAAiBr9E,IAAI21E,GAAkBn9B,IAE5E+S,EAAY8xB,EAAiBr9E,IAAIk2E,GAAW,MAE5CoH,EAAe/sB,EAAgB9X,eAAe,KAAM15D,KAAK69F,cAIzDW,EAAiCx+F,KAAK69F,aAAahnC,UAAU,GAAG,IAAQ,MAExE4nC,EAAYJ,EAxqqB1B,SAA2B7kC,EAAUklC,EAAmB1nC,GACpD,GAAIuC,GAAqBC,GAIrB,OAAOA,EAASmlC,kBAAkBD,EADV1nC,IAAkB9C,GAAoBI,WAIlE,IAAIsqC,EAAwC,iBAAtBF,EACCllC,EAAS2O,cAAcu2B,GAC1CA,EAOJ,OADAE,EAAS3kB,YAAc,GAChB2kB,EAjBX,CAyqqB8BL,EAAcF,EAAoBr+F,KAAK69F,aAAa7mC,eACtEka,GAAcstB,EAAahtB,EAAgB9X,eAAe,KAAM15D,KAAK69F,cAtGjF,SAAwBW,GAEpB,MAAM/zF,EAAO+zF,EAAYh4F,cACzB,MAAgB,QAATiE,EA1+7BW,6BA0+7BgC,SAATA,EAx+7BnB,iCAw+7ByD,KAHnF,CAsG+G+zF,IAEjGK,EAAY7+F,KAAK69F,aAAapnC,OAAS,IACzC,IAMEqoC,EAA2C,iBAAvBT,GACtB,kCAAkCz1F,KAAKy1F,GAErC9kB,EA5xOH,CACHrH,WAAY,GACZ5nB,UAAwBqX,GACxBo9B,MAAOplB,GACPqlB,cAAgC,KAChC/5F,MAAO,GA0xOD4tF,EAAYte,GAAY,GAAe,EAAG,KAAM,EAAG,EAAG,KAAM,KAAM,KAAM,KAAM,MAE9E0qB,EAAY5tB,GAAY,KAAMwhB,EAAWtZ,EAAaslB,EAAW,KAAM,KAAMrtB,EAAiB+sB,EAAc/xB,EAAW8xB,GAQ7H,IAAI5kB,EAEAwlB,EAJJliC,GAAUiiC,EAAW,MAKrB,IAEI,MAAMhnB,EAl4OlB,SAAiC0C,EAAO95E,EAAKo7E,EAAUzK,EAAiB+sB,EAAc/xB,GAElF,MAAMrV,EAAQ8kB,EArhvBJ,GAuhvBVA,EAAS,IAAqBtB,EAE9B,MAAM3hB,EAAQyY,GAAiBta,EAAO,KAAM,EAAG,EAAiB,KAAM,MAEhEge,EAAcnc,EAAMmc,YAAct0E,EAAIw0D,UACxB,OAAhB8f,IACA8Q,GAAqBjtB,EAAOmc,GACd,OAAVwF,IACAhb,GAAgB4+B,EAAc5jB,EAAOxF,GACf,OAAlBnc,EAAMwc,SACN6I,GAAiBkgB,EAAc5jB,EAAO3hB,EAAMwc,SAE3B,OAAjBxc,EAAMtsB,QACNyxC,GAAiBogB,EAAc5jB,EAAO3hB,EAAMtsB,UAKxD,MAAMyyD,EAAe3tB,EAAgB9X,eAAeihB,EAAO95E,GAErDo3E,EAAgB5G,GAAY4K,EAAU3H,GAA0BzzE,GAAM,KAAMA,EAAI41D,OAAS,GAAiB,GAAsBwlB,EApgvBpH,IAogvB6IjjB,EAAOwY,EAAiB2tB,OA02OzJC,GAl2O9B,OAPIjoC,EAAMoL,kBACNW,GAAmBd,GAA+BpJ,EAAOijB,GAAW9kB,EAAOt2D,EAAIyC,MAC/EmzE,GAAoBtf,EAAO6B,GAC3B6d,GAAe7d,EAAOijB,EAASn7E,OAAQ,IAE3Co3E,GAAc+D,EAAUhE,GAEjBgE,EA5gvBW,IA4gvBehE,EAhCrC,CAk4O0DwmB,EAAWz+F,KAAK69F,aAAcoB,EAAWztB,EAAiB+sB,GACxG,GAAIE,EACA,GAAIJ,EACA1+B,GAAgB4+B,EAAcE,EAAW,CAAC,aAAcn1D,GAAQ+tD,WAE/D,CAID,MAAM,MAAEx3B,EAAK,QAAE2V,GA92vBnC,SAA4C3oB,GAExC,MAAMgT,EAAQ,GAER2V,EAAU,GAEhB,IAAI90E,EAAI,EAEJq7D,EAAO,EACX,KAAOr7D,EAAImsD,EAAS/rD,QAAQ,CAExB,IAAImvE,EAAgBpjB,EAASnsD,GAC7B,GAA6B,iBAAlBuvE,EACM,IAATlU,EACsB,KAAlBkU,GACApQ,EAAMx8D,KAAK4sE,EAAkCpjB,IAAWnsD,IAG9C,IAATq7D,GACLyZ,EAAQnyE,KAAK4sE,OAGhB,CAID,IAAKjB,GAAWjT,GACZ,MACJA,EAAOkU,EAEXvvE,IAEJ,MAAO,CAAEm/D,MAAAA,EAAO2V,QAAAA,GAhCpB,CA82vBkFx1E,KAAK69F,aAAahnC,UAAU,IACtFgJ,GACAF,GAAgB4+B,EAAcE,EAAW5+B,GAEzC2V,GAAWA,EAAQ10E,OAAS,GAC5Bu9E,GAAiBkgB,EAAcE,EAAWjpB,EAAQv1E,KAAK,MAInEi/F,EAAkCjlC,GAASglC,EAv69BzC,GAu69B2D,GACzDre,IAIAse,EAAa5pB,WACTsL,EAAiBn/E,IAIhB49F,GAA0BzqF,MAAM5L,KAAKq2F,KAK9C3lB,EAt3OZ,SAA6BzB,EAAe4lB,EAAcoB,EAAW1lB,EAAa+lB,GAE9E,MAAMnoC,EAAQ8nC,EAlkvBJ,GAqkvBJvlB,EA79aV,SAAkCviB,EAAO4C,EAAOl5D,GAE5C,MAAM0+F,EAAYhkC,KACdpE,EAAMoL,kBACF1hE,EAAIi0D,mBACJj0D,EAAIi0D,kBAAkBj0D,GAC1Bi2E,GAAgC3f,EAAOooC,EAAW,GAClDtoB,GAAqB9f,EAAO4C,EAAOl5D,IAGvC,MAAMu+D,EAAYsF,GAAkB3K,EAAO5C,EAAO4C,EAAMj5D,OAAS,EAAG,GACpEitE,GAAgB3O,EAAWrF,GAE3B,MAAM6F,EAAS5F,GAAiBulC,EAAWxlC,GAI3C,OAHI6F,GACAmO,GAAgBnO,EAAQ7F,GAErBqF,EAjBX,CA69a+CjI,EAAO8nC,EAAWpB,GAC7DtkB,EAAYrH,WAAW7uE,KAAKq2E,GAC5BzB,EAzjvBY,GAyjvBayB,EACzB4lB,GAAgBA,EAAahgG,QAI5B+3D,GAAYA,EAAQqiB,EAAWmkB,IAG5BA,EAAavoC,gBACbuoC,EAAavoC,eAAe,EAAgBokB,EAAWulB,EAAUn+F,OAAS,GAG9E,MAAMy+F,EAAYhkC,KAClB,GAAIpE,EAAMoL,kBACyB,OAA9Bs7B,EAAa1oC,cAAoD,OAA3B0oC,EAAaxoC,WAAqB,CAGzEuI,GADqB2hC,EAAUvrF,MAhjvBjB,IAmjvBd,MAAM6+E,EAAYoM,EA1lvBZ,GA2lvBN9nB,GAAqC0b,EAAWgL,GAChDlmB,GAAkBkb,EAAWoM,EAAWpB,EAAazoC,UACrD4e,GAAiC6pB,EAAcnkB,GAEnD,OAAOA,EA/BX,CAs3O4CzB,EAAej4E,KAAK69F,aAAcoB,EAAW1lB,EAAa,CAACqZ,KAC3FhhB,GAAWihB,EAAWoM,EAAW,cAGjCvhC,KAGJ,MAAMujB,EAAe,IAAIue,GAAex/F,KAAKm+F,cAAezkB,EAAW+F,GAAiBgX,GAAYyI,EAAcD,GAAYA,EAAWC,GAMzI,OALKb,IAAsBS,IAGJ7d,EAAa5mB,SAAoB,WAAEtnB,MAAQmsD,GAE3Dje,GA4Cf,MAAMue,WAxhNN,QAgiNI,YAAYrB,EAAej6B,EAAU7C,EAAUo+B,EAAY75B,GACvD3e,QACAjnD,KAAKqhE,SAAWA,EAChBrhE,KAAKy/F,WAAaA,EAClBz/F,KAAK4lE,OAASA,EACd5lE,KAAK0/F,WAAa,GAClB1/F,KAAKkkE,SAAWA,EAChBlkE,KAAKq6D,SAAWr6D,KAAK2/F,kBAAoB,IAAIvgB,GAAYqgB,GACzDz/F,KAAKq6D,SAASqkB,WAzyrBtB,SAAgCvnB,EAAOyoC,EAAa5rF,EAAO+lD,GAIvD,IAAIf,EAAQ7B,EAAMrjB,KAOlB,OANa,MAATklB,IAGA7B,EAAMrjB,KAAOklB,EAA2B2Y,GAAYxa,EAiyrBiB,KAhyrBrE,GAgyrB4E,EAhyrBvD,KAAM,OAExB4C,EAvtSI,GAutSY,EAX3B,CAyyrB0D0lC,EA//9B5C,GA+/9B+D,EAAM,EAAIA,GAC/Ez/F,KAAKm+F,cAAgBA,EAKzB,eAAiB,OAAO,IAAIv6B,GAAa5jE,KAAK4lE,OAAQ5lE,KAAKy/F,YAI3D,UACQz/F,KAAK0/F,aACL1/F,KAAK0/F,WAAWpgG,QAIhBizB,GAAMA,KACNvyB,KAAK0/F,WAAa,MACjB1/F,KAAKq6D,SAAS6mB,WAAalhF,KAAKq6D,SAASlhB,WAOlD,UAAU5oB,GACFvwB,KAAK0/F,YACL1/F,KAAK0/F,WAAWr8F,KAAKktB,IAoEjC,MAAMsvE,QAAI3pF,EAcV,IAAI4pF,GAAW,CACX,KACA,CAAC,CAAC,IAAK,KAAM,CAAC,KAAM,MAAOD,IAC3B,CAAC,CAAC,KAAM,MAAOA,GAAGA,IAClB,CACI,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAChF,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACnE,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEzCA,GACA,CACI,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACxD,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC9E,CACI,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAC1E,UAAW,WAAY,aAG/BA,GACA,CAAC,CAAC,IAAK,KAAM,CAAC,KAAM,MAAO,CAAC,gBAAiB,gBAC7C,EACA,CAAC,EAAG,GACJ,CAAC,SAAU,WAAY,YAAa,mBACpC,CAAC,SAAU,YAAa,cAAe,kBACvC,CAAC,WAAYA,GAAG,eAAkBA,IAClC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAAK,SAAK,SAAK,MAAO,KAC1D,CAAC,YAAa,SAAU,eAAa,OACrC,MACA,IACA,YACA,GAvCJ,SAAgBr7F,GAEZ,IAAI9D,EAAI6I,KAAK2R,MAAM3R,KAAK+mC,IAAI9rC,IAExB6zC,EAAI7zC,EAAEuU,WAAW5U,QAAQ,YAAa,IAAIrD,OAC9C,OAAU,IAANJ,GAAiB,IAAN23C,EACJ,EACJ,IA6CX,IAAI0nD,GAAc,GA6BlB,SAASC,GAAeC,GAEpB,MAAMC,EA4HV,SAAyBD,GACrB,OAAOA,EAAOz5F,cAAcrC,QAAQ,KAAM,KAD9C,CA5H6C87F,GAEzC,IAAIlgG,EAAQogG,GAAcD,GAC1B,GAAIngG,EACA,OAAOA,EAIX,MAAMqgG,EAAeF,EAAiBvhG,MAAM,KAAK,GAEjD,GADAoB,EAAQogG,GAAcC,GAClBrgG,EACA,OAAOA,EAEX,GAAqB,OAAjBqgG,EACA,OAAON,GAEX,MAAM,IAAIr5F,MAAM,uCAAuCw5F,OAkC3D,SAASE,GAAcD,GAKnB,OAJMA,KAAoBH,KACtBA,GAAYG,GAAoBzvC,GAAQ4vC,IAAM5vC,GAAQ4vC,GAAGC,QAAU7vC,GAAQ4vC,GAAGC,OAAOC,SACjF9vC,GAAQ4vC,GAAGC,OAAOC,QAAQL,IAE3BH,GAAYG,GAUvB,MAAMM,GAAe,iBAAG,CACpBC,SAAU,EACVC,iBAAkB,EAClBC,qBAAsB,EACtBC,WAAY,EACZC,eAAgB,EAChBC,aAAc,EACdC,iBAAkB,EAClBC,KAAM,EACNC,eAAgB,EAChBC,aAAc,EACdC,WAAY,GACZC,WAAY,GACZC,eAAgB,GAChBC,cAAe,GACfC,cAAe,GACfC,aAAc,GACdC,eAAgB,GAChBC,aAAc,GACdC,WAAY,GACZC,WAAY,GACZC,UAAW,WAEfrB,EAAgBA,EAAgBC,UAAY,WAC5CD,EAAgBA,EAAgBE,kBAAoB,mBACpDF,EAAgBA,EAAgBG,sBAAwB,uBACxDH,EAAgBA,EAAgBI,YAAc,aAC9CJ,EAAgBA,EAAgBK,gBAAkB,iBAClDL,EAAgBA,EAAgBM,cAAgB,eAChDN,EAAgBA,EAAgBO,kBAAoB,mBACpDP,EAAgBA,EAAgBQ,MAAQ,OACxCR,EAAgBA,EAAgBS,gBAAkB,iBAClDT,EAAgBA,EAAgBU,cAAgB,eAChDV,EAAgBA,EAAgBW,YAAc,aAC9CX,EAAgBA,EAAgBY,YAAc,aAC9CZ,EAAgBA,EAAgBa,gBAAkB,iBAClDb,EAAgBA,EAAgBc,eAAiB,gBACjDd,EAAgBA,EAAgBe,eAAiB,gBACjDf,EAAgBA,EAAgBgB,cAAgB,eAChDhB,EAAgBA,EAAgBiB,gBAAkB,iBAClDjB,EAAgBA,EAAgBkB,cAAgB,eAChDlB,EAAgBA,EAAgBmB,YAAc,aAC9CnB,EAAgBA,EAAgBoB,YAAc,aAC9CpB,EAAgBA,EAAgBqB,WAAa,cA3CxB,GAsHfC,GAAiB,2BAEjBC,GAAa,uDAoQnB,SAASC,GAA6Bj3D,EAAKk3D,EAAiBjiC,EAAUkiC,EAAa,MAE/E,MAAMC,EAAgB,CAAC,KAAM,MAGvBC,EAAYr3D,EAAIpsC,MAAMmjG,IAE5B,IAAIz+B,EAAO,EACX,IAAK,IAAIzyB,EAAI,EAAGA,EAAIwxD,EAAUthG,OAAQ8vC,IAAK,CAEvC,MAAMyxD,EAAYD,EAAUxxD,GAC5B,GAAQ,EAAJA,EAAO,CAGP,MAAMwrB,EAAezqD,SAAS0wF,EAAW,IACzCF,EAAc9+F,MAAM,EAAI+4D,GACxBiH,GAAci/B,GAAUlmC,OAEL,KAAdimC,GAELF,EAAc9+F,KAAKg/F,GAU3B,OAPAF,EAAc9+F,KAAK4+F,GAAmB,GACjCjiC,EAAW,EAAe,IAC3BA,GACAmiC,EAAc9+F,KAAK28D,EAAUkiC,GAEjCC,EAAc,GAAK9+B,EACnB8+B,EAAc,GAAKA,EAAcrhG,OAAS,EACnCqhG,EA2CX,SAASG,GAAUlmC,GACf,OAAO,GAAK7yD,KAAKC,IAAI4yD,EAAc,IAkxBvC,SAASmmC,GAAiBvuF,EAAOc,IAgBjC,SAAiCilD,EAAO5C,EAAOnjD,EAAOc,GAElD,MAEM0tF,EAFkBjnC,KAEqBvnD,MA57gC3B,GA87gCZmuF,EAAgB,GACtB,IAAK,IAAIzhG,EAAI,EAAGA,EAAIoU,EAAOhU,OAAQJ,GAAK,EAAG,CAEvC,MAAMs/D,EAAWlrD,EAAOpU,GAIlBqG,EAFU+N,EAAOpU,EAAI,GAEL/B,MAAMojG,IAC5B,IAAK,IAAInxD,EAAI,EAAGA,EAAI7pC,EAAMjG,OAAQ8vC,IAAK,CAEnC,MAAMvlC,EAAQtE,EAAM6pC,GACpB,GAAQ,EAAJA,EAGA,MAAM,IAAInqC,MAAM,uDAEf,GAAc,KAAV4E,EAIL,GADqBA,EAAMtL,MAAM+hG,IAEzB3qC,EAAMoL,iBAAyD,OAAtCpL,EAAM/3C,KAAKpL,EAn9gCtC,KAo9gCEm/C,GAAc6uC,GAA6B32F,EAAOm3F,EAAsBxiC,GAAWmiC,OAGtF,CAED,MAAMnpC,EAAQiB,GAAS9C,EAAOqrC,GAGX,IAAfxpC,EAAM11D,MACN60E,GAAyBnf,EAAOe,EAAOiG,EAAU30D,EAAO,KAAM,MAIlE,MAAM6qE,EAA6B,OAAjBld,EAAMzD,QAAmByD,EAAMzD,OAAOyK,GACpDkW,GACAC,GAAqBhf,EAAO4C,EAAOmc,EAAWlW,EAAU30D,KAWxE8rD,EAAMoL,iBAAyD,OAAtCpL,EAAM/3C,KAAKpL,EA9+gCtB,MA++gCdmjD,EAAM/3C,KAAKpL,EA/+gCG,IA++gCsBmuF,GAvD5C,CAdkBjnC,KAEAC,KAEwBnnD,EAAOc,GA2YjD,IAAI2tF,GAzgDsB,QAkhD1B,SAASC,GAAYC,GA/ujCrB,IAAuBC,EAAQv3D,EAAAA,EAgvjCH,kCA/ujCV,OADKu3D,EAgvjCLD,IA3ujClB,SAAoBt3D,EAAKu3D,EAAQC,EAAUC,GACvC,MAAM,IAAIr8F,MAAM,oBAAoB4kC,EACL,wBAA0Cu3D,eAF7E,CAHmBv3D,EAAKu3D,GA+ujCI,iBAAbD,IACPF,GAAYE,EAASn8F,cAAcrC,QAAQ,KAAM,MAwBzD,MAAM4+F,GAAU,IAAI1mF,IAkFpB,MAAM2mF,WAAsB/vC,GAKxB,YAAYwxB,EAAcwe,GACtBh8C,QACAjnD,KAAKijG,QAAUA,EAEfjjG,KAAKkjG,qBAAuB,GAC5BljG,KAAKmyD,SAAWnyD,KAChBA,KAAK0/F,WAAa,GAOlB1/F,KAAKmjG,yBAA2B,IAAIvF,GAA2B59F,MAE/D,MAAM44D,EAAcD,GAAe8rB,GAG7B2e,EAAiC3e,EAlgiCRvzB,KAAkB,KAmgiCjDkyC,GAAiBV,GAAYU,GAC7BpjG,KAAKkjG,qBAAuBnhC,GAAc,EAAiClK,WAC3E73D,KAAKqjG,YAAiC3gB,GAAuC+B,EAAcwe,EAAS,CAChG,CAAEnxC,QAASmB,GAAalB,SAAU/xD,MAClC,CAAE8xD,QAAS0kC,GAA0BzkC,SAAU/xD,KAAKmjG,2BACrDh4D,GAAUs5C,IAIbzkF,KAAKqjG,YAAY3d,2BACjB1lF,KAAKkkE,SAAWlkE,KAAKihB,IAAIwjE,GAQ7B,IAAIz2B,EAAO4E,EAAgB+yB,GAASh0B,mBAAoB2xC,EAAcl1C,GAAYoE,SAC9E,OAAIxE,IAAU23B,IAAY33B,IAAUiF,IAAejF,IAAU0D,GAClD1xD,KAEJA,KAAKqjG,YAAYpiF,IAAI+sC,EAAO4E,EAAe0wC,GAKtD,UAGI,MAAMnxC,EAAWnyD,KAAKqjG,aACrBlxC,EAAS+uB,WAAa/uB,EAAShZ,UACbn5C,KAAgB,WAAEV,QAIrCizB,GAAMA,KACNvyB,KAAK0/F,WAAa,KAMtB,UAAUnvE,GAEavwB,KAAgB,WAAEqD,KAAKktB,IAsBlD,MAAMgzE,WAA0BrwC,GAI5B,YAAYswC,GACRv8C,QACAjnD,KAAKwjG,WAAaA,EAGE,OADA7qC,GAAe6qC,IAxJ3C,SAASC,EAAqBhf,GAC1B,GAA6B,OAAzBA,EAAaxzB,UAAK3iC,GAAa,CAE/B,MAAMA,EAAKm2D,EAAaxzB,UAAK3iC,IAAAA,SAZJA,EAAIhrB,EAAMogG,GACvC,GAAIpgG,GAAQA,IAASogG,EACjB,MAAM,IAAIj9F,MAAM,mCAAmC6nB,OAAQ6c,GAAU7nC,SAAY6nC,GAAU7nC,EAAKmH,UAUnE6jB,CAGLA,EADYy0E,GAAQ9hF,IAAIqN,GACVm2D,GACtCse,GAAQlkG,IAAIyvB,EAAIm2D,GAGpB,IAAI/8C,EAAU+8C,EAAaxzB,UAAKvpB,QAC5BA,aAAmB31B,WACnB21B,EAAUA,KAEVA,GACAA,EAAQpoC,QAIRoB,GAAK+iG,EAAqB,IAnBlC,CAiLiC,GAO7B,OAAO1iB,GACH,OAAO,IAAIiiB,GAAchjG,KAAKwjG,WAAYziB,IAuHlD,SAAS4iB,GAAgBC,EAAYC,EAAQrwF,GAEzC,MAAM4oD,EAAeJ,KAAmB4nC,EAElC7pC,EAAQmB,KACd,OAAOnB,EAAMqC,KAAkB+T,GAC3BqW,GAAczsB,EAAOqC,EAAc5oD,EAAUqwF,EAAOnwF,KAAKF,GAAWqwF,KACpEpd,GAAW1sB,EAAOqC,GAc1B,SAAS0nC,GAAgBF,EAAYC,EAAQE,EAAKvwF,GAC9C,OAAOwwF,GAAsB9oC,KAAYc,KAAkB4nC,EAAYC,EAAQE,EAAKvwF,GAexF,SAASywF,GAAgBL,EAAYC,EAAQhd,EAAMC,EAAMtzE,GACrD,OAAO0wF,GAAsBhpC,KAAYc,KAAkB4nC,EAAYC,EAAQhd,EAAMC,EAAMtzE,GAgB/F,SAAS2wF,GAAgBP,EAAYC,EAAQhd,EAAMC,EAAMG,EAAMzzE,GAC3D,OAAO4wF,GAAsBlpC,KAAYc,KAAkB4nC,EAAYC,EAAQhd,EAAMC,EAAMG,EAAMzzE,GAiBrG,SAAS6wF,GAAgBT,EAAYC,EAAQhd,EAAMC,EAAMG,EAAME,EAAM3zE,GACjE,OAyOJ,SAA+BumD,EAAOuqC,EAAaV,EAAYC,EAAQhd,EAAMC,EAAMG,EAAME,EAAM3zE,GAE3F,MAAM4oD,EAAekoC,EAAcV,EACnC,OAAO1c,GAAgBntB,EAAOqC,EAAcyqB,EAAMC,EAAMG,EAAME,GAC1DX,GAAczsB,EAAOqC,EAAe,EAAG5oD,EAAUqwF,EAAOnwF,KAAKF,EAASqzE,EAAMC,EAAMG,EAAME,GAAQ0c,EAAOhd,EAAMC,EAAMG,EAAME,IACzHod,GAA2BxqC,EAAOqC,EAAe,GALzD,CAzOiClB,KAAYc,KAAkB4nC,EAAYC,EAAQhd,EAAMC,EAAMG,EAAME,EAAM3zE,GA+C3G,SAASgxF,GAAgBZ,EAAYC,EAAQhd,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,EAAMlxF,GAE7E,MAAM4oD,EAAeJ,KAAmB4nC,EAElC7pC,EAAQmB,KAER6rB,EAAYG,GAAgBntB,EAAOqC,EAAcyqB,EAAMC,EAAMG,EAAME,GACzE,OAAOP,GAAgB7sB,EAAOqC,EAAe,EAAGqoC,EAAMC,IAAS3d,EAC3DP,GAAczsB,EAAOqC,EAAe,EAAG5oD,EACnCqwF,EAAOnwF,KAAKF,EAASqzE,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,GACnDb,EAAOhd,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,IACzCje,GAAW1sB,EAAOqC,EAAe,GAoBzC,SAASuoC,GAAgBf,EAAYC,EAAQhd,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,EAAME,EAAMpxF,GAEnF,MAAM4oD,EAAeJ,KAAmB4nC,EAElC7pC,EAAQmB,KAEd,IAAI6rB,EAAYG,GAAgBntB,EAAOqC,EAAcyqB,EAAMC,EAAMG,EAAME,GACvE,OAAOH,GAAgBjtB,EAAOqC,EAAe,EAAGqoC,EAAMC,EAAME,IAAS7d,EACjEP,GAAczsB,EAAOqC,EAAe,EAAG5oD,EACnCqwF,EAAOnwF,KAAKF,EAASqzE,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,EAAME,GACzDf,EAAOhd,EAAMC,EAAMG,EAAME,EAAMsd,EAAMC,EAAME,IAC/Cne,GAAW1sB,EAAOqC,EAAe,GA8DzC,SAASmoC,GAA2BxqC,EAAO8qC,GAGvC,MAAMC,EAAkB/qC,EAAM8qC,GAC9B,OAAOC,IAAoB30B,QAAYj6D,EAAY4uF,EAcvD,SAASd,GAAsBjqC,EAAOuqC,EAAaV,EAAYC,EAAQE,EAAKvwF,GAExE,MAAM4oD,EAAekoC,EAAcV,EACnC,OAAOld,GAAe3sB,EAAOqC,EAAc2nC,GACvCvd,GAAczsB,EAAOqC,EAAe,EAAG5oD,EAAUqwF,EAAOnwF,KAAKF,EAASuwF,GAAOF,EAAOE,IACpFQ,GAA2BxqC,EAAOqC,EAAe,GAezD,SAAS8nC,GAAsBnqC,EAAOuqC,EAAaV,EAAYC,EAAQhd,EAAMC,EAAMtzE,GAE/E,MAAM4oD,EAAekoC,EAAcV,EACnC,OAAOhd,GAAgB7sB,EAAOqC,EAAcyqB,EAAMC,GAC9CN,GAAczsB,EAAOqC,EAAe,EAAG5oD,EAAUqwF,EAAOnwF,KAAKF,EAASqzE,EAAMC,GAAQ+c,EAAOhd,EAAMC,IACjGyd,GAA2BxqC,EAAOqC,EAAe,GAgBzD,SAASgoC,GAAsBrqC,EAAOuqC,EAAaV,EAAYC,EAAQhd,EAAMC,EAAMG,EAAMzzE,GAErF,MAAM4oD,EAAekoC,EAAcV,EACnC,OAAO5c,GAAgBjtB,EAAOqC,EAAcyqB,EAAMC,EAAMG,GACpDT,GAAczsB,EAAOqC,EAAe,EAAG5oD,EAAUqwF,EAAOnwF,KAAKF,EAASqzE,EAAMC,EAAMG,GAAQ4c,EAAOhd,EAAMC,EAAMG,IAC7Gsd,GAA2BxqC,EAAOqC,EAAe,GAkEzD,SAAS2oC,GAAO/wF,EAAOgxF,GAEnB,MAAM7tC,EAAQgE,KAEd,IAAI5C,EAEJ,MAAMmZ,EAAgB19D,EAlhjCJ,GAmhjCdmjD,EAAMoL,iBACNhK,EA2BR,SAAsB9tD,EAAM+rE,GACxB,GAAIA,EACA,IAAK,IAAI91E,EAAI81E,EAAS11E,OAAS,EAAGJ,GAAK,EAAGA,IAAK,CAE3C,MAAM63D,EAAUie,EAAS91E,GACzB,GAAI+J,IAAS8tD,EAAQ9tD,KACjB,OAAO8tD,EAInB,MAAM,IAAI9xD,MAAM,aAAagE,0BAVjC,CA3B+Bu6F,EAAU7tC,EAAM4d,cACvC5d,EAAM/3C,KAAKsyD,GAAiBnZ,EACxBA,EAAQhC,YACPY,EAAMmH,eAAiBnH,EAAMmH,aAAe,KAAKj7D,KAAKquE,EAAenZ,EAAQhC,YAIlFgC,EAA6BpB,EAAM/3C,KAAKsyD,GAG5C,MAAMuzB,EAAc1sC,EAAQ7J,UAAY6J,EAAQ7J,QAAU+J,GAAcF,EAAQj1D,OAE1EghE,EAA+BjS,GAAwB+1B,IAEvD8c,EAAeD,IAGrB,OAFA5yC,GAAwBiS,GAr7e5B,SAAenN,EAAO4C,EAAO/lD,EAAO3I,GAIhC,MAAMqmE,EAAgB19D,EAlnkBJ,GAmnkBd09D,GAAiBva,EAAM/3C,KAAKte,SAC5Bq2D,EAAM/3C,KAAKsyD,GAAiB,KAC5Bva,EAAMuL,UAAUgP,GAAiB,MAErC3X,EAAM2X,GAAiBrmE,EAT3B,CAs7eU8rD,EAAO+D,KAAYlnD,EAAOkxF,GACzBA,EAmCX,SAASC,GAAYnxF,EAAO4vF,EAAYlc,GAEpC,MAAM3tB,EAAQmB,KAERgqC,EAAehrC,GAAKH,EAAO/lD,GACjC,OAAOoxF,GAAcrrC,EAAOsrC,GAAOtrC,EAAO/lD,GACtCgwF,GAAsBjqC,EAAOiC,KAAkB4nC,EAAYsB,EAAaptF,UAAW4vE,EAAIwd,GACvFA,EAAaptF,UAAU4vE,IAgB/B,SAAS4d,GAAYtxF,EAAO4vF,EAAYlc,EAAIG,GAExC,MAAM9tB,EAAQmB,KAERgqC,EAAehrC,GAAKH,EAAO/lD,GACjC,OAAOoxF,GAAcrrC,EAAOsrC,GAAOtrC,EAAO/lD,GACtCkwF,GAAsBnqC,EAAOiC,KAAkB4nC,EAAYsB,EAAaptF,UAAW4vE,EAAIG,EAAIqd,GAC3FA,EAAaptF,UAAU4vE,EAAIG,IAiBnC,SAAS0d,GAAYvxF,EAAO4vF,EAAYlc,EAAIG,EAAI0K,GAE5C,MAAMx4B,EAAQmB,KAERgqC,EAAehrC,GAAKH,EAAO/lD,GACjC,OAAOoxF,GAAcrrC,EAAOsrC,GAAOtrC,EAAO/lD,GAASowF,GAAsBrqC,EAAOiC,KAAkB4nC,EAAYsB,EAAaptF,UAAW4vE,EAAIG,EAAI0K,EAAI2S,GAC9IA,EAAaptF,UAAU4vE,EAAIG,EAAI0K,IAqDvC,SAAS8S,GAAOtrC,EAAO/lD,GACnB,OAA2B+lD,EA1tjCjB,GA0tjC8B36C,KAAKpL,EAnrjC3B,IAmrjCqDwkD,KAW3E,SAAS4sC,GAAcrrC,EAAOpwC,GAS1B,OARIy8D,GAAaC,UAAU18D,KACvBA,EAAWy8D,GAAaof,OAAO77E,GAK/BowC,EAD+BoC,MACCgU,IAE7BxmD,EA4DX,MAAM,WAAqB,EASvB,YAAY87E,GAAU,GAClBx+C,QACAjnD,KAAK0lG,UAAYD,EAOrB,KAAKp6F,GAAS47C,MAAM3rB,KAAKjwB,GAUzB,UAAUs6F,EAAiBpkG,EAAOylD,GAE9B,IAAI4+C,EAEAC,EAIHpgD,GAAQ,KAELqgD,EAAa,IAGX,KACFH,GAA8C,iBAApBA,GAC1BC,EAAc5lG,KAAK0lG,UAIlBr6F,IACGyP,WAAW,IAGL6qF,EAAgBrqE,KAAKjwB,KAK9BA,IAAYs6F,EAAgBrqE,KAAKjwB,IAC9Bs6F,EAAgBpkG,QAChBskG,EAAU7lG,KAAK0lG,UAIdjgD,IAAU3qC,WAAW,IAGhB6qF,EAAgBpkG,MAAMkkD,KAKvBA,IAAUkgD,EAAgBpkG,MAAMkkD,KAErCkgD,EAAgB3+C,WAChB8+C,EAAa9lG,KAAK0lG,UAAY,KAGtB5qF,WAAW,IAGb6qF,EAAgB3+C,aAClB,KAGQ2+C,EAAgB3+C,eAIhC4+C,EAAc5lG,KAAK0lG,UAIlBr6F,IAAYyP,WAAW,IAGlB6qF,EAAgBt6F,KAKjBA,IAAYs6F,EAAgBt6F,IAC7B9J,IACAskG,EACI7lG,KAAK0lG,UAIJjgD,IAAU3qC,WAAW,IAGhBvZ,EAAMkkD,KAIXA,IAAUlkD,EAAMkkD,KAErBuB,IACA8+C,EACI9lG,KAAK0lG,UAAY,KAGT5qF,WAAW,IAGbksC,MAAmB,KAGjBA,OAIpB,MAAMyB,EAAOxB,MAAMqB,UAAUs9C,EAAaC,EAASC,GAInD,OAHIH,aAA2B,GAC3BA,EAAgBzmF,IAAIupC,GAEjBA,GAqBf,SAASs9C,KACL,OAA2B,KAA2D,SAAE,QA6B5F,MAAMC,GACF,cACIhmG,KAAKimG,OAAQ,EACbjmG,KAAKkmG,SAAW,GAChBlmG,KAAKmmG,QAAU,IAAI,GACnBnmG,KAAKc,OAAS,EAMd,MAAMg0B,EAAS,KAETjX,EAA2BmoF,GAAoB,UAChDnoF,EAAMiX,KACPjX,EAAMiX,GAAUixE,IASxB,IAAIxzE,GAAM,OAAOvyB,KAAKkmG,SAASzkG,IAAI8wB,GAOnC,OAAOA,GACH,OAAOvyB,KAAKkmG,SAASzlG,OAAO8xB,GAQhC,KAAKA,GACD,OAAOvyB,KAAKkmG,SAAS/tE,KAAK5F,GAU9B,OAAOA,EAAIojB,GACP,OAAO31C,KAAKkmG,SAAStnG,OAAO2zB,EAAIojB,GAQpC,QAAQpjB,GAAMvyB,KAAKkmG,SAAS5mG,QAAQizB,GAOpC,KAAKA,GACD,OAAOvyB,KAAKkmG,SAASt/D,KAAKrU,GAM9B,UAAY,OAAOvyB,KAAKkmG,SAAShiG,QAIjC,WAAa,OAAOlE,KAAKkmG,SAASntF,WASlC,MAAMqtF,GACFpmG,KAAKkmG,SAx5lCb,SAAStxE,EAAQj0B,EAAM8/D,QACPvqD,IAARuqD,IACAA,EAAM9/D,GACV,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAKG,OAAQJ,IAAK,CAClC,IAAIu/C,EAAOt/C,EAAKD,GACZkU,MAAM4I,QAAQyiC,IAEVwgB,IAAQ9/D,IAGR8/D,EAAM9/D,EAAKuD,MAAM,EAAGxD,IAExBk0B,EAAQqrB,EAAMwgB,IAETA,IAAQ9/D,GACb8/D,EAAIp9D,KAAK48C,GAGjB,OAAOwgB,EAlBX,CAw5lCgC2lC,GACxB,KAA4BH,OAAQ,EACpC,KAA4BnlG,OAASd,KAAKkmG,SAASplG,OACnD,KAA4BwlB,KAAOtmB,KAAKkmG,SAASlmG,KAAKc,OAAS,GAC/D,KAA4BuoC,MAAQrpC,KAAKkmG,SAAS,GAMtD,kBAAwClmG,KAAc,QAAEu4C,KAAKv4C,MAK7D,WAAa,KAA4BimG,OAAQ,EAKjD,UACwBjmG,KAAc,QAAEgnD,WAChBhnD,KAAc,QAAEgmD,eA0pB5C,MAAMqgD,GAIF,YAAYC,GACRtmG,KAAKsmG,UAAYA,EACjBtmG,KAAK4gC,QAAU,KAKnB,QAAU,OAAO,IAAIylE,GAAQrmG,KAAKsmG,WAIlC,WAAatmG,KAAKsmG,UAAUC,YAQhC,MAAMC,GAIF,YAAY5xB,EAAU,IAClB50E,KAAK40E,QAAUA,EAMnB,mBAAmBzd,GAEf,MAAMsvC,EAAWtvC,EAAMyd,QACvB,GAAiB,OAAb6xB,EAAmB,CAEnB,MAAMC,EAAgD,OAAzBvvC,EAAM7B,eAA0B6B,EAAM7B,eAAe,GAAKmxC,EAAS3lG,OAE1F6lG,EAAe,GAKrB,IAAK,IAAIjmG,EAAI,EAAGA,EAAIgmG,EAAsBhmG,IAAK,CAE3C,MAAMkmG,EAASH,EAASI,WAAWnmG,GAGnCimG,EAAatjG,KADQrD,KAAK40E,QAAQgyB,EAAOE,wBACVzwE,SAEnC,OAAO,IAAImwE,GAAUG,GAEzB,OAAO,KAMX,WAAWxvC,GAASn3D,KAAK+mG,wBAAwB5vC,GAKjD,WAAWA,GAASn3D,KAAK+mG,wBAAwB5vC,GAMjD,wBAAwBA,GACpB,IAAK,IAAIz2D,EAAI,EAAGA,EAAIV,KAAK40E,QAAQ9zE,OAAQJ,IACD,OAAhCsmG,GAAU7vC,EAAOz2D,GAAGkgC,SACpB5gC,KAAK40E,QAAQl0E,GAAG6lG,YAShC,MAAMU,GAOF,YAAY7yF,EAAW8yF,EAAaC,EAAUC,EAAO,MACjDpnG,KAAKoU,UAAYA,EACjBpU,KAAKknG,YAAcA,EACnBlnG,KAAKmnG,SAAWA,EAChBnnG,KAAKonG,KAAOA,GAapB,MAAMC,GAIF,YAAYzyB,EAAU,IAClB50E,KAAK40E,QAAUA,EAOnB,aAAazd,EAAO6B,GAEhB,IAAK,IAAIt4D,EAAI,EAAGA,EAAIV,KAAK40E,QAAQ9zE,OAAQJ,IACrCV,KAAK40E,QAAQl0E,GAAGmoF,aAAa1xB,EAAO6B,GAO5C,WAAWA,GACP,IAAK,IAAIt4D,EAAI,EAAGA,EAAIV,KAAK40E,QAAQ9zE,OAAQJ,IACrCV,KAAK40E,QAAQl0E,GAAGqoF,WAAW/vB,GAOnC,cAAcA,GAEV,IAAIsuC,EAAwB,KAC5B,IAAK,IAAI5mG,EAAI,EAAGA,EAAIV,KAAKc,OAAQJ,IAAK,CAElC,MAAM6mG,EAA4C,OAA1BD,EAAiCA,EAAsBxmG,OAAS,EAElF0mG,EAAcxnG,KAAK6mG,WAAWnmG,GAAGgyE,cAAc1Z,EAAOuuC,GACxDC,IACAA,EAAYV,uBAAyBpmG,EACP,OAA1B4mG,EACAA,EAAsBjkG,KAAKmkG,GAG3BF,EAAwB,CAACE,IAIrC,OAAiC,OAA1BF,EAAiC,IAAID,GAAUC,GAAyB,KAOnF,SAASnwC,EAAO6B,GAEZ,IAAK,IAAIt4D,EAAI,EAAGA,EAAIV,KAAK40E,QAAQ9zE,OAAQJ,IACrCV,KAAK40E,QAAQl0E,GAAG4mC,SAAS6vB,EAAO6B,GAOxC,WAAWhlD,GAEP,OAAOhU,KAAK40E,QAAQ5gE,GAKxB,aAAe,OAAOhU,KAAK40E,QAAQ9zE,OAKnC,MAAM2mG,GAAUznG,KAAK40E,QAAQvxE,KAAKokG,IAStC,MAAMC,GAKF,YAAYC,EAAUvtC,GAAY,GAC9Bp6D,KAAK2nG,SAAWA,EAChB3nG,KAAK4gC,QAAU,KACf5gC,KAAK8mG,wBAA0B,EAC/B9mG,KAAK4nG,mBAAoB,EAMzB5nG,KAAK6nG,oBAAqB,EAC1B7nG,KAAK8nG,sBAAwB1tC,EAOjC,aAAajD,EAAO6B,GACZh5D,KAAK+nG,iBAAiB/uC,IACtBh5D,KAAKgoG,WAAW7wC,EAAO6B,GAO/B,WAAWA,GACHh5D,KAAK8nG,wBAA0B9uC,EAAMhlD,QACrChU,KAAK6nG,oBAAqB,GAQlC,SAAS1wC,EAAO6B,GAASh5D,KAAK6oF,aAAa1xB,EAAO6B,GAMlD,cAAcA,EAAOuuC,GACjB,OAAIvnG,KAAK+nG,iBAAiB/uC,IACtBh5D,KAAK4nG,mBAAoB,EAGzB5nG,KAAKioG,UAAUjvC,EAAMhlD,MAAOuzF,GACrB,IAAIG,GAAQ1nG,KAAK2nG,WAErB,KAOX,iBAAiB3uC,GACb,GAAIh5D,KAAK6nG,qBAAoD,IAA9B7nG,KAAK2nG,SAAST,YAAuB,CAEhE,MAAMgB,EAAqBloG,KAAK8nG,sBAEhC,IAAIzhF,EAAS2yC,EAAM3yC,OAWnB,KAAkB,OAAXA,GAAmC,IAAhBA,EAAO/iB,MAC7B+iB,EAAOrS,QAAUk0F,GACjB7hF,EAASA,EAAOA,OAEpB,OAAO6hF,KAAmC,OAAX7hF,EAAkBA,EAAOrS,OAAS,GAErE,OAAOhU,KAAK6nG,mBAQhB,WAAW1wC,EAAO6B,GACd,GAAIpkD,MAAM4I,QAAQxd,KAAK2nG,SAASvzF,WAAY,CAExC,MAAMggE,EAAap0E,KAAK2nG,SAASvzF,UACjC,IAAK,IAAI1T,EAAI,EAAGA,EAAI0zE,EAAWtzE,OAAQJ,IACnCV,KAAKmoG,yBAAyBhxC,EAAO6B,EAAOovC,GAAyBpvC,EAAOob,EAAW1zE,SAG1F,CAED,MAAM2nG,EAAmCroG,KAAK2nG,SAAmB,UAC7DU,IAAkB9K,GACC,IAAfvkC,EAAM11D,MACNtD,KAAKmoG,yBAAyBhxC,EAAO6B,GAAQ,GAIjDh5D,KAAKmoG,yBAAyBhxC,EAAO6B,EAAOyL,GAA0BzL,EAAO7B,EAAOkxC,GAAe,GAAO,KAWtH,yBAAyBlxC,EAAO6B,EAAOsvC,GACnC,GAAqB,OAAjBA,EAAuB,CAEvB,MAAMlB,EAAOpnG,KAAK2nG,SAASP,KAC3B,GAAa,OAATA,EACA,GAAIA,IAAS3Q,IAAc2Q,IAAS3J,IAChC2J,IAAS7J,IAA8B,IAAfvkC,EAAM11D,KAC9BtD,KAAKioG,SAASjvC,EAAMhlD,OAAQ,OAE3B,CAED,MAAMu0F,EAAyB9jC,GAA0BzL,EAAO7B,EAAOiwC,GAAM,GAAO,GACrD,OAA3BmB,GACAvoG,KAAKioG,SAASjvC,EAAMhlD,MAAOu0F,QAKnCvoG,KAAKioG,SAASjvC,EAAMhlD,MAAOs0F,IAUvC,SAASte,EAAUwe,GACM,OAAjBxoG,KAAK4gC,QACL5gC,KAAK4gC,QAAU,CAACopD,EAAUwe,GAG1BxoG,KAAK4gC,QAAQv9B,KAAK2mF,EAAUwe,IAsCxC,SAASJ,GAAyBpvC,EAAOnM,GAErC,MAAMunB,EAAapb,EAAMob,WACzB,GAAmB,OAAfA,EACA,IAAK,IAAI1zE,EAAI,EAAGA,EAAI0zE,EAAWtzE,OAAQJ,GAAK,EACxC,GAAI0zE,EAAW1zE,KAAOmsD,EAClB,OAA0BunB,EAAW1zE,EAAI,GAIrD,OAAO,KAuBX,SAAS+nG,GAAoB1uC,EAAOf,EAAO0vC,EAAatB,GACpD,OAAqB,IAAjBsB,EAjBR,SAAiC1vC,EAAO6F,GACpC,OAAmB,IAAf7F,EAAM11D,MAA2C,IAAf01D,EAAM11D,KACjCm8E,GAAiBgX,GAAYz9B,EAAO6F,GAEvB,IAAf7F,EAAM11D,KACJq8E,GAAkB4d,GAAa9G,GAAYz9B,EAAO6F,GAEtD,KAPX,CAmBuC7F,EAAOe,IAEhB,IAAjB2uC,EAeb,SAA4B3uC,EAAOf,EAAOouC,GACtC,OAAIA,IAAS3Q,GACFhX,GAAiBgX,GAAYz9B,EAAOe,GAEtCqtC,IAAS7J,GACP5d,GAAkB4d,GAAa9G,GAAYz9B,EAAOe,GAEpDqtC,IAAS3J,GAEPtd,GAAmBsd,GAAkBhH,GAAY,EAA4B18B,QAFnF,EAPT,CAbkCA,EAAOf,EAAOouC,GAIjC1iC,GAAkB3K,EAAOA,EA1pmC1B,GA0pmCwC2uC,EAAa,GAoCnE,SAASC,GAAuBxxC,EAAO4C,EAAO6sC,EAAQgC,GAElD,MAAMC,EAA+C9uC,EAxrmCzC,GAwrmCkE,QAAE6uC,GAChF,GAAuB,OAAnBC,EAAOjoE,QAAkB,CAEzB,MAAMkoE,EAAY3xC,EAAM/3C,KAElB2pF,EAAmCnC,EAAe,QAElDl/F,EAAS,GACf,IAAK,IAAIhH,EAAI,EAAGA,EAAIqoG,EAAcjoG,OAAQJ,GAAK,EAAG,CAE9C,MAAMsoG,EAAiBD,EAAcroG,GAKjCgH,EAAOrE,KAJP2lG,EAAiB,EAIL,KAMAP,GAAoB1uC,EADC+uC,EAAUE,GACGD,EAAcroG,EAAI,GAAIkmG,EAAOe,SAASP,OAG5FyB,EAAOjoE,QAAUl5B,EAErB,OAAOmhG,EAAOjoE,QAkElB,SAASqoE,GAAe3C,GAEpB,MAAMvsC,EAAQmB,KAER/D,EAAQgE,KAERytC,EAAansC,KACnBE,GAAqBisC,EAAa,GAElC,MAAMhC,EAASI,GAAU7vC,EAAOyxC,GAChC,GAAItC,EAAUL,OAAUzrC,GAAeT,KAAW6sC,EAAOe,SAASR,SAAW,CACzE,GAAuB,OAAnBP,EAAOhmE,QACP0lE,EAAU7kD,MAAM,QAEf,CAED,MAAM/5C,EAASk/F,EAAOgB,kBAtElC,SAASsB,EAAoB/xC,EAAO4C,EAAO6uC,EAAYlhG,GAEnD,MAAMk/F,EAA4BzvC,EAAc,QAAE0vC,WAAW+B,GAEvDG,EAAgBnC,EAAOhmE,QAC7B,GAAsB,OAAlBmoE,EAAwB,CAExB,MAAMI,EAAeR,GAAuBxxC,EAAO4C,EAAO6sC,EAAQgC,GAClE,IAAK,IAAIloG,EAAI,EAAGA,EAAIqoG,EAAcjoG,OAAQJ,GAAK,EAAG,CAE9C,MAAMspF,EAAW+e,EAAcroG,GAC/B,GAAIspF,EAAW,EACXtiF,EAAOrE,KAAwB8lG,EAAazoG,EAAI,QAE/C,CAED,MAAM6mG,EAAkBwB,EAAcroG,EAAI,GAEpCk7E,EAA2C7hB,GAAOiwB,GAGxD,IAAK,IAAItpF,EA9slCO,EA8slCsBA,EAAIk7E,EAAsB96E,OAAQJ,IAAK,CAEzE,MAAM+xE,EAAgBmJ,EAAsBl7E,GACxC+xE,EA9tmCO,MA8tmCmCA,EA1vmCnD,IA2vmCSy2B,EAAoBz2B,EA/vmC9B,GA+vmCoDA,EAAe80B,EAAiB7/F,GAKlF,GAA2C,OAAvCk0E,EArulCA,GAqulC6C,CAE7C,MAAMwtB,EAAoCxtB,EAvulC1C,GAwulCA,IAAK,IAAIl7E,EAAI,EAAGA,EAAI0oG,EAAetoG,OAAQJ,IAAK,CAE5C,MAAM+xE,EAAgB22B,EAAe1oG,GACrCwoG,EAAoBz2B,EA1wmC9B,GA0wmCoDA,EAAe80B,EAAiB7/F,OAM9F,OAAOA,EA1CX,CAuEoCyvD,EAAO4C,EAAO6uC,EAAY,IAC9CD,GAAuBxxC,EAAO4C,EAAO6sC,EAAQgC,GACjDtC,EAAU7kD,MAAM/5C,GAChB4+F,EAAU+C,kBAEd,OAAO,EAEX,OAAO,EAaX,SAASC,GAAkBl1F,EAAWm1F,EAASnC,GAC3CoC,GAAkBruC,KAAYD,KAAY9mD,EAAWm1F,EAASnC,GAAM,GAaxE,SAASqC,GAAYr1F,EAAWm1F,EAASnC,GACrCoC,GAAkBruC,KAAYD,KAAY9mD,EAAWm1F,EAASnC,GAAM,GAYxE,SAASoC,GAAkBryC,EAAO4C,EAAO3lD,EAAWm1F,EAASnC,EAAMD,GAC3DhwC,EAAMoL,kBACNmnC,GAAavyC,EAAO,IAAI8vC,GAAgB7yF,EAAWm1F,EAASpC,EAAUC,IAAQ,GAC1ED,IACAhwC,EAAM8a,mBAAoB,IAGlC03B,GAAaxyC,EAAO4C,GAexB,SAAS6vC,GAAerkC,EAAgBnxD,EAAWm1F,EAASnC,GACxDyC,GAAqB1uC,KAAYD,KAAY9mD,EAAWm1F,EAASnC,GAAM,EAAO7rC,KAA4BgK,GAe9G,SAASukC,GAAqBvkC,EAAgBnxD,EAAWm1F,EAASnC,GAC9DyC,GAAqB1uC,KAAYD,KAAY9mD,EAAWm1F,EAASnC,GAAM,EAAM7rC,KAA4BgK,GAc7G,SAASskC,GAAqB1yC,EAAO4C,EAAO3lD,EAAWm1F,EAASnC,EAAMD,EAAUnuC,EAAOuM,GAC/EpO,EAAMoL,kBACNmnC,GAAavyC,EAAO,IAAI8vC,GAAgB7yF,EAAWm1F,EAASpC,EAAUC,GAAOpuC,EAAMhlD,OA4D3F,SAA2CmjD,EAAOoO,GAE9C,MAAMwkC,EAAsB5yC,EAAM7B,iBAAmB6B,EAAM7B,eAAiB,IAGxEiQ,KAD4BpO,EAAM7B,eAAex0D,OAASipG,EAAoBA,EAAoBjpG,OAAS,IAAM,IAEjHipG,EAAoB1mG,KAAwB8zD,EAAc,QAAEr2D,OAAS,EAAGykE,GANhF,CA3D0CpO,EAAOoO,GACrC4hC,IACAhwC,EAAM6a,sBAAuB,IAGrC23B,GAAaxyC,EAAO4C,GASxB,SAASiwC,KACL,OAQuBjwC,EAREmB,KAQK0tC,EAROnsC,KAYX1C,EAv6mCd,GAu6mC+B6a,QAAQg0B,GAAYtC,UAJnE,IAA2BvsC,EAAO6uC,EAYlC,SAASe,GAAaxyC,EAAO4C,GAEzB,MAAMusC,EAAY,IAAIN,IA7szB1B,SAAiC7uC,EAAO4C,EAAOzhD,EAAS2mE,GAEpD,MAAM3C,EAAW1C,GAAY7f,GAC7BuiB,EAASj5E,KAAKiV,GACV6+C,EAAMoL,iBACNsX,GAAgB1iB,GAAO9zD,KAAK47E,EAAW3C,EAASx7E,OAAS,GALjE,CA8szB4Bq2D,EAAO4C,EAAOusC,EAAWA,EAAUntD,SACpC,OAAnB4gB,EAn7mCQ,KAo7mCRA,EAp7mCQ,GAo7mCS,IAAIysC,IACNzsC,EAr7mCP,GAq7mCwB6a,QAAQvxE,KAAK,IAAIgjG,GAAQC,IAQjE,SAASoD,GAAavyC,EAAOwwC,EAAUvtC,GACb,OAAlBjD,EAAMyd,UACNzd,EAAMyd,QAAU,IAAIyyB,IACxBlwC,EAAMyd,QAAQq1B,MAAM,IAAIvC,GAAQC,EAAUvtC,IAqB9C,SAAS4sC,GAAU7vC,EAAOnjD,GAEtB,OAA0BmjD,EAAc,QAAE0vC,WAAW7yF,GAiBzD,SAASk2F,GAAuBlxC,EAAO6F,GACnC,OAAO8gB,GAAkB4d,GAAa9G,GAAYz9B,EAAO6F,GA+pD7D,MA+BMsrC,GAAkB,IAAI34C,GAAe,8CAMrC44C,EAIF,YAAYC,GACRrqG,KAAKqqG,SAAWA,EAChBrqG,KAAKsqG,aAAc,EACnBtqG,KAAKu7B,MAAO,EACZv7B,KAAKuqG,YAAc,IAAIjuF,QAAQ,CAK9BrV,EAAKujG,KACFxqG,KAAKkI,QAAUjB,EACfjH,KAAKqhC,OAASmpE,IAOtB,kBACI,GAAIxqG,KAAKsqG,YACL,OAGJ,MAAMG,EAAoB,GAEpBzjD,EAAW,KAIb,KAA4BzrB,MAAO,EACnCv7B,KAAKkI,WAET,GAAIlI,KAAKqqG,SACL,IAAK,IAAI3pG,EAAI,EAAGA,EAAIV,KAAKqqG,SAASvpG,OAAQJ,IAAK,CAE3C,MAAMgqG,EAAa1qG,KAAKqqG,SAAS3pG,KAC7B,GAAUgqG,IACVD,EAAkBpnG,KAAKqnG,GAInCpuF,QAAQs/B,IAAI6uD,GAAmBzgD,KAAK,KAG5BhD,MAAgB2jD,MAIxBl4F,IAAOzS,KAAKqhC,OAAO5uB,KACc,IAA7Bg4F,EAAkB3pG,QAClBkmD,IAEJhnD,KAAKsqG,aAAc,UAG3BF,EAAsB/4C,UAAO,SAAuClyD,GAAK,OAAO,IAAKA,GAAKirG,GAAuB13C,GAASy3C,GAAiB,KAC3IC,EAAsB/6C,WAAQb,GAAmB,CAAER,MAAOo8C,EAAuB17C,QAAS07C,EAAsB/4C,kBAwDhH,MAAMu5C,GAAS,IAAIp5C,GAAe,SAY5Bq5C,GAAyB,CAC3B/4C,QAAS84C,GACTzlB,WAVJ,WACI,MAAO,GAAG2lB,OAAgBA,OAAgBA,QAU1C1lB,KAAM,IAKV,SAAS0lB,KACL,OAAOpyF,OAAO83B,aAAa,GAAKjnC,KAAK2R,MAAsB,GAAhB3R,KAAK0S,WAOpD,MAAM8uF,GAAuB,IAAIv5C,GAAe,wBAM1Cw5C,GAAc,IAAIx5C,GAAe,eAUjCy5C,GAAyB,IAAIz5C,GAAe,2CAa5C05C,EAKF,IAAIhkF,GAEA5lB,QAAQwtC,IAAI5nB,GAOhB,KAAKA,GAED5lB,QAAQoxC,KAAKxrB,WAGrBgkF,EAAQ75C,UAAO,SAAyBlyD,GAAK,OAAO,IAAKA,GAAK+rG,IAC9DA,EAAQ77C,WAAQb,GAAmB,CAAER,MAAOk9C,EAASx8C,QAASw8C,EAAQ75C,kBAiCtE,MAAM85C,GAAc,IAAI35C,GAAe,YAwCjC45C,GAAwB,IAAI55C,GAAe,uBA0FjD,MAAM65C,GAKF,YAAYC,EAAiBC,GACzBvrG,KAAKsrG,gBAAkBA,EACvBtrG,KAAKurG,mBAAqBA,GAgBlC,MAEMC,GAAwC,SAKpChI,GACN,OAAO,IAAID,GAAkBC,IAG3BiI,GAA6BD,GAa7BE,GATyC,SAKrClI,GACN,OAAOlnF,QAAQpU,QAAQsjG,GAAsChI,KAO3DmI,GAAwD,SAKpDnI,GAEN,MAAM8H,EAAkBE,GAAsChI,GAIxD+H,EAAqBxpC,GAFUpJ,GAAe6qC,GAED1rC,cAC9Cl5D,OAAO,CAKXo3F,EAAW4V,KAER,MAAM/N,EAAenmC,GAAgBk0C,GAErC,OADA/N,GAAgB7H,EAAU3yF,KAAK,IAAIy6F,GAAmBD,IAC/C7H,GACP,IACJ,OAAO,IAAIqV,GAA6BC,EAAiBC,IAGvDM,GAA6CF,GAa7CG,GATyD,SAKrDtI,GACN,OAAOlnF,QAAQpU,QAAQyjG,GAAsDnI,wBAe3EuI,EACF,cAKI/rG,KAAKgsG,kBAAoBP,GAIzBzrG,KAAKisG,mBAAqBP,GAI1B1rG,KAAKksG,kCAAoCL,GAIzC7rG,KAAKmsG,mCAAqCL,GAM9C,cAMA,cAAcxoG,IAMd,YAAYkgG,YAEhBuI,EAAS16C,UAAO,SAA0BlyD,GAAK,OAAO,IAAKA,GAAK4sG,IAChEA,EAAS18C,WAAQb,GAAmB,CAAER,MAAO+9C,EAAUr9C,QAASq9C,EAAS16C,kBAiCzE,MAAM+6C,GAAmB,IAAI56C,GAAe,mBAyBtC,GAAU,KAAOl1C,QAAQpU,QAAQ,GAAvB,GAChB,SAASmkG,GAAkB95E,GACH,oBAAT+5E,KAEP,GAAQtiD,KAAK,KAAQz3B,GAAMA,EAAGjf,MAAM,KAAM,QAG1Cg5F,KAAKj2F,QAAQg2F,kBAAkB,oBAAqB95E,GA4G5D,MAAMg6E,GAIF,aAAY,qBAAEC,GAAuB,EAAK,mCAAEC,GAAqC,IA2B7E,GA1BAzsG,KAAK0sG,sBAAuB,EAC5B1sG,KAAK2sG,sBAAuB,EAI5B3sG,KAAK4sG,UAAW,EAIhB5sG,KAAK6sG,WAAa,IAAI,IAAa,GAMnC7sG,KAAK8sG,iBAAmB,IAAI,IAAa,GAMzC9sG,KAAK+sG,SAAW,IAAI,IAAa,GAIjC/sG,KAAKgtG,QAAU,IAAI,IAAa,GACb,oBAARV,KACP,MAAM,IAAI7lG,MAAM,kDAEpB6lG,KAAKW,oBAEQ,KACRC,SAAW,EADH,KAERC,OAFQ,KAEMC,OAASd,KAAKj2F,QAC7B,KAAyC,cAHhC,KAIJ+2F,OAJI,KAIUA,OAAOC,KAAK,KAAyC,cAExE,KAAkD,uBANzC,KAOJD,OAPI,KAOUA,OAAOC,KAAK,IAAwB,KAAqD,uBAE5Gb,GAAwB,KAAoD,yBATnE,KAUJY,OAVI,KAUUA,OAAOC,KAAK,KAAoD,yBAV1E,KAYRZ,mCAAqCA,EAZ7B,KAaRa,6BAA+B,EAbvB,KAcRC,4BAnJb,WACI,IAAIA,EAA8B98C,GAA+B,sBAC7D+8C,EAA6B/8C,GAA8B,qBAC/D,GAAoB,oBAAT67C,MAAwBiB,GAA+BC,EAA4B,CAG1F,MAAMC,EAAiCF,EAA4BjB,KAAKoB,WAAW,qBAC/ED,IACAF,EAA8BE,GAElC,MAAME,EAAgCH,EAA2BlB,KAAKoB,WAAW,qBAC7EC,IACAH,EAA6BG,GAGrC,MAAO,CAAEJ,4BAAAA,EAA6BC,2BAAAA,GAf1C,GAmJ4ED,4BA4N5E,SAA0CK,GAEtC,MAKMC,IAA8BD,EAAKnB,oCACrCmB,EAAKL,6BANqC,OApBlD,SAAuCK,IACO,IAAtCA,EAAKN,8BAGTM,EAAKN,4BAA8BM,EAAKL,4BAA4B75F,KAAK+8C,GAAS,KAI9Em9C,EAAKN,6BAA+B,EACpCQ,GAAsBF,GACtBG,GAAYH,KAEhBE,GAAsBF,IAZ1B,CAuB0CA,KAItCA,EAAKR,OAASQ,EAAKR,OAAOC,KAAK,CAC3B5iG,KAAM,UACNg1B,WAAY,CAAqB,eAAiB,EAAM,0BAA6BouE,GACrFG,aAAc,CASbC,EAAU53F,EAASwtB,EAAQqqE,EAAMC,EAAWC,KACzC,IAEI,OADAC,GAAQT,GACDK,EAASK,WAAWzqE,EAAQqqE,EAAMC,EAAWC,WAGhDP,GAA2C,cAAdK,EAAK5qG,MAClCuqG,IAEJU,GAAQX,KAGhBY,SAAU,CAUTP,EAAU53F,EAASwtB,EAAQtT,EAAU49E,EAAWC,EAAWxgG,KACxD,IAEI,OADAygG,GAAQT,GACDK,EAAS3xE,OAAOuH,EAAQtT,EAAU49E,EAAWC,EAAWxgG,WAG/D2gG,GAAQX,KAGhBa,UAAW,CAOVR,EAAU53F,EAASwtB,EAAQ6qE,KACxBT,EAASU,QAAQ9qE,EAAQ6qE,GACrBr4F,IAAYwtB,IAGe,aAAvB6qE,EAAaE,QACbhB,EAAKiB,sBAAwBH,EAAaI,UAC1ChB,GAAsBF,GACtBG,GAAYH,IAEgB,aAAvBc,EAAaE,SAClBhB,EAAKlB,qBAAuBgC,EAAaK,aAIrDC,cAAe,CAOdf,EAAU53F,EAASwtB,EAAQtiC,KACxB0sG,EAAS50B,YAAYx1C,EAAQtiC,GAC7BqsG,EAAKqB,kBAAkB,IAGjBrB,EAAKZ,QAAQz0D,KAAKh3C,KACjB,KAvFnB,CA1OqB,MAoBjB,yBAA2B,OAA6C,IAAtC+qG,KAAKj2F,QAAQ4K,IAAI,iBAInD,6BACI,IAAKsrF,GAAO2C,kBACR,MAAM,IAAIzoG,MAAM,kDAMxB,gCACI,GAAI8lG,GAAO2C,kBACP,MAAM,IAAIzoG,MAAM,kDAoBxB,IAAI8rB,EAAI47E,EAAWC,GACf,OAA0B,KAAiDhB,OAAO+B,IAAI58E,EAAI47E,EAAWC,GAoBzG,QAAQ77E,EAAI47E,EAAWC,EAAW3jG,GAE9B,MAAMmjG,EAAO,KAAiDR,OAExDc,EAAON,EAAKwB,kBAAkB,gBAAkB3kG,EAAM8nB,EAAI88E,GAAeC,GAAQA,IACvF,IACI,OAA0B1B,EAAK2B,QAAQrB,EAAMC,EAAWC,WAGxDR,EAAK4B,WAAWtB,IAYxB,WAAW37E,EAAI47E,EAAWC,GACtB,OAA0B,KAAiDhB,OAAOqC,WAAWl9E,EAAI47E,EAAWC,GAkBhH,kBAAkB77E,GACd,OAA0B,KAAiD46E,OAAOgC,IAAI58E,IAyC9F,SAAS+8E,MAET,MAAMD,GAAgB,GA+BtB,SAAStB,GAAYH,GACjB,GAAqB,GAAjBA,EAAKV,WAAkBU,EAAKjB,uBAAyBiB,EAAKhB,SAC1D,IACIgB,EAAKV,WACLU,EAAKd,iBAAiBv0D,KAAK,cAI3B,GADAq1D,EAAKV,YACAU,EAAKjB,qBACN,IACIiB,EAAKqB,kBAAkB,IAGjBrB,EAAKb,SAASx0D,KAAK,eAGzBq1D,EAAKhB,UAAW,IA2HpC,SAASkB,GAAsBF,GAGvBA,EAAKjB,wBAFLiB,EAAKiB,uBACJjB,EAAKnB,qCAA4E,IAAtCmB,EAAKN,6BAWzD,SAASe,GAAQT,GACbA,EAAKV,WACDU,EAAKhB,WACLgB,EAAKhB,UAAW,EAChBgB,EAAKf,WAAWt0D,KAAK,OAO7B,SAASg2D,GAAQX,GACbA,EAAKV,WACLa,GAAYH,GAMhB,MAAM8B,GACF,cACI1vG,KAAK2sG,sBAAuB,EAC5B3sG,KAAK0sG,sBAAuB,EAC5B1sG,KAAK4sG,UAAW,EAChB5sG,KAAK6sG,WAAa,IAAI,GACtB7sG,KAAK8sG,iBAAmB,IAAI,GAC5B9sG,KAAK+sG,SAAW,IAAI,GACpB/sG,KAAKgtG,QAAU,IAAI,GAQvB,IAAIz6E,EAAI47E,EAAWC,GACf,OAAO77E,EAAGjf,MAAM66F,EAAWC,GAQ/B,WAAW77E,EAAI47E,EAAWC,GACtB,OAAO77E,EAAGjf,MAAM66F,EAAWC,GAM/B,kBAAkB77E,GAAM,OAAOA,IAQ/B,QAAQA,EAAI47E,EAAWC,EAAW3jG,GAC9B,OAAO8nB,EAAGjf,MAAM66F,EAAWC,uBAqE7BuB,EAIF,YAAYC,GACR5vG,KAAK4vG,QAAUA,EACf5vG,KAAK6vG,cAAgB,EACrB7vG,KAAK8vG,eAAgB,EAOrB9vG,KAAK+vG,UAAW,EAChB/vG,KAAKgwG,WAAa,GAClBhwG,KAAKiwG,iBAAmB,KACxBjwG,KAAKkwG,sBACLN,EAAQT,IAAI,KAIRnvG,KAAKiwG,iBACc,oBAAR3D,KAAsB,KAAOA,KAAKj2F,QAAQ4K,IAAI,sBAOjE,sBACIjhB,KAAK4vG,QAAQ/C,WAAWvkD,UAAU,CAC9BhtB,KAAM,KAIFt7B,KAAK+vG,UAAW,EAChB/vG,KAAK8vG,eAAgB,KAG7B9vG,KAAK4vG,QAAQX,kBAAkB,KAI3BjvG,KAAK4vG,QAAQ7C,SAASzkD,UAAU,CAC5BhtB,KAAM,KAIFixE,GAAO4D,yBACP9D,GAAkB,KAIdrsG,KAAK8vG,eAAgB,EACrB9vG,KAAKowG,8BAWzB,8BAGI,OAFApwG,KAAK6vG,eAAiB,EACtB7vG,KAAK+vG,UAAW,EACT/vG,KAAK6vG,cAOhB,8BAEI,GADA7vG,KAAK6vG,eAAiB,EAClB7vG,KAAK6vG,cAAgB,EACrB,MAAM,IAAIppG,MAAM,qCAGpB,OADAzG,KAAKowG,uBACEpwG,KAAK6vG,cAMhB,WACI,OAAO7vG,KAAK8vG,eAAwC,IAAvB9vG,KAAK6vG,gBAAwB7vG,KAAK4vG,QAAQlD,qBAM3E,uBACI,GAAI1sG,KAAK4sG,WAELP,GAAkB,KAId,KAAkC,IAA3BrsG,KAAKgwG,WAAWlvG,QAAc,CAEjC,IAAIuvG,EAAwBrwG,KAAKgwG,WAAWtsG,MAC5CgX,aAAa21F,EAAGC,WAChBD,EAAGE,OAAOvwG,KAAK+vG,UAEnB/vG,KAAK+vG,UAAW,QAGnB,CAGD,IAAIS,EAAUxwG,KAAKywG,kBACnBzwG,KAAKgwG,WAAahwG,KAAKgwG,WAAWvvG,OAIjC4vG,IACOA,EAAGK,WAAYL,EAAGK,SAASF,KAC3B91F,aAAa21F,EAAGC,YACT,IAIftwG,KAAK+vG,UAAW,GAOxB,kBACI,OAAK/vG,KAAKiwG,iBAIHjwG,KAAKiwG,iBAAiBU,WAAWlvG,IAIvCtC,IAAAA,CAEOyO,OAAQzO,EAAEyO,OAGVgjG,iBAAqC,EAA0C,iBAC/ExxF,KAAMjgB,EAAEigB,QAbL,GAwBf,YAAYixF,EAAI/9D,EAASo+D,GAErB,IAAIJ,GAAa,EACbh+D,GAAWA,EAAU,IACrBg+D,EAAYx1F,WAAW,KAInB9a,KAAKgwG,WAAahwG,KAAKgwG,WAAWvvG,OAIjC4vG,GAAOA,EAAGC,YAAcA,GACzBD,EAAGrwG,KAAK+vG,SAAU/vG,KAAKywG,oBACvBn+D,IAERtyC,KAAKgwG,WAAW3sG,KAAK,CAAqBktG,OAAQF,EAAIC,UAAWA,EAAWI,SAAUA,IAe1F,WAAWH,EAAQj+D,EAASo+D,GACxB,GAAIA,IAAa1wG,KAAKiwG,iBAClB,MAAM,IAAIxpG,MAAM,8HAIpBzG,KAAK6wG,YAAY,EAA6Bv+D,EAAS,GACvDtyC,KAAKowG,uBAOT,yBAA2B,OAAOpwG,KAAK6vG,cAQvC,cAAciB,EAAO5tB,EAAU6tB,GAE3B,MAAO,WAGfpB,EAAYt+C,UAAO,SAA6BlyD,GAAK,OAAO,IAAKA,GAAKwwG,GAAaj9C,GAAS65C,MAC5FoD,EAAYtgD,WAAQb,GAAmB,CAAER,MAAO2hD,EAAajhD,QAASihD,EAAYt+C,iCAgD5E2/C,EACF,cAIIhxG,KAAKixG,cAAgB,IAAI50F,IACzB60F,GAAmBC,YAAYnxG,MAQnC,oBAAoBguD,EAAOojD,GACvBpxG,KAAKixG,cAAcpyG,IAAImvD,EAAOojD,GAOlC,sBAAsBpjD,GAAShuD,KAAKixG,cAAcnV,OAAO9tC,GAKzD,4BAA8BhuD,KAAKixG,cAAcryF,QAMjD,eAAeyyF,GAAQ,OAAOrxG,KAAKixG,cAAchwF,IAAIowF,IAAS,KAK9D,sBAAwB,OAAOz8F,MAAM5L,KAAKhJ,KAAKixG,cAAcn8F,UAK7D,qBAAuB,OAAOF,MAAM5L,KAAKhJ,KAAKixG,cAAc5xG,QAQ5D,sBAAsBgyG,EAAMC,GAAkB,GAC1C,OAAOJ,GAAmBK,sBAAsBvxG,KAAMqxG,EAAMC,WAGpEN,EAAoB3/C,UAAO,SAAqClyD,GAAK,OAAO,IAAKA,GAAK6xG,IACtFA,EAAoB3hD,WAAQb,GAAmB,CAAER,MAAOgjD,EAAqBtiD,QAASsiD,EAAoB3/C,kBAmC1G,MAAMmgD,GAKF,YAAYh7B,IAOZ,sBAAsBA,EAAU66B,EAAMC,GAClC,OAAO,MAaf,IAQIG,GARAP,GAAqB,IAAIM,GAUzBE,GAsBJ,SAA2Cv/C,EAAUzyD,EAAS8jG,GAG1D,MAAMmO,EAAgB,IAAIpO,GAAkBC,GAC5C,GAl+rBiD,IAA1C1d,GAAiCluE,KAm+rBpC,OAAO0E,QAAQpU,QAAQypG,GAG3B,MAEMC,EA6+BV,SAAsB7qG,GAElB,MAAMW,EAAS,GAMf,OALAX,EAAMzH,QAILuyG,GAASA,GAAQnqG,EAAOrE,QAAQwuG,IAC1BnqG,EARX,CA/+B4ByqD,EAASlxC,IAAImrF,GAAkB,IAAIziG,OAAOjK,GAEX+B,IAIvDwsC,GAAwBA,EAAY,YAKpC,GAAiC,IAA7B2jE,EAAkB9wG,OAClB,OAAOwb,QAAQpU,QAAQypG,GAG3B,MAAMG,EAl0wCV,WACI,MAAMC,EAAWthD,GAAY,GAC7B,IAAKshD,IAAaA,EAASC,qBACvB,MAAM,IAAIvrG,MAAM,+VAKpB,OAAOsrG,EAASC,qBARpB,GAs0wCUC,EAFmBtsB,GAAS36E,OAAO,CAAE6jD,UAAW+iD,IAEd3wF,IAAI6wF,EAASI,gBAGrD,OAlosBJ,SAAmCC,GAG/B,MAAMC,EAAoB,GAGpBC,EAAS,IAAIh2F,IAKnB,SAASi2F,EAAsBroC,GAE3B,IAAI9f,EAAUkoD,EAAOpxF,IAAIgpD,GACzB,IAAK9f,EAAS,CAEV,MAAMooD,EAknsBmB,CAIjCtoC,GAAO3tD,QAAQpU,QAAQ+pG,EAAehxF,IAAIgpD,IAJT,CAlnsBKA,GAC9BooC,EAAOxzG,IAAIorE,EAAK9f,EAAUooD,EAAKvoD,KAAKg8B,KAExC,OAAO77B,EAoDX,OAlDA27B,GAAiCxmF,QAAQ,CAKxCo6E,EAAWp2E,KAER,MAAMkvG,EAAW,GACb94B,EAAU+4B,aACVD,EAASnvG,KAAKivG,EAAsB54B,EAAU+4B,aAAazoD,KAI1D1iB,IACGoyC,EAAUpyC,SAAWA,KAI7B,MAAMorE,EAAYh5B,EAAUg5B,UAEtBhmE,EAASgtC,EAAUhtC,SAAWgtC,EAAUhtC,OAAS,IAEjDimE,EAAcj5B,EAAUhtC,OAAO5rC,OACrC4xG,GAAaA,EAAUpzG,QAAQ,CAK9BszG,EAAU5+F,KACP04B,EAAOrpC,KAAK,IACZmvG,EAASnvG,KAAKivG,EAAsBM,GAAU5oD,KAI7Cvd,IACGC,EAAOimE,EAAc3+F,GAASy4B,EAC9BimE,EAAU14F,OAAO04F,EAAU7wG,QAAQ+wG,GAAW,GACtB,GAApBF,EAAU5xG,SACV44E,EAAUg5B,eAAYx8F,QAKlC,MAAM28F,EAAgBv2F,QAAQs/B,IAAI42D,GAAUxoD,KAAK,IAmFzD,SAA8B1mD,GAC1ByiF,GAA8B+V,OAAOx4F,GADzC,CAhFmCA,IAC3B8uG,EAAkB/uG,KAAKwvG,KA6C3B/sB,GAAmC,IAAIzpE,IA1ChCC,QAAQs/B,IAAIw2D,GAAmBpoD,KAAK,QAvE/C,GAuosBSA,KAAK,IAGJ2nD,IAoCV,MAAMmB,GAA2B,IAAIthD,GAAe,sBAMpD,MAAMuhD,GAKF,YAAYtoG,EAAMujD,GACdhuD,KAAKyK,KAAOA,EACZzK,KAAKguD,MAAQA,GA2CrB,SAASglD,GAAsBC,EAAuBxoG,EAAMokD,EAAY,IAEpE,MAAMlhB,EAAO,aAAaljC,EAEpB81D,EAAS,IAAI/O,GAAe7jB,GAClC,MAAO,CAINulE,EAAiB,MAEd,IAAItsG,EAAWusG,KACf,IAAKvsG,GAAYA,EAASurD,SAASlxC,IAAI6xF,IAA0B,GAC7D,GAAIG,EACAA,EAAsBpkD,EAAUllD,OAAOupG,GAAgBvpG,OAAO,CAAEmoD,QAASyO,EAAQxO,UAAU,SAE1F,CAED,MAAMqhD,EAAoBvkD,EAAUllD,OAAOupG,GAAgBvpG,OAAO,CAAEmoD,QAASyO,EAAQxO,UAAU,GAAQ,CACnGD,QAASswB,GACTrwB,SAAU,cA9C9B,SAAwBI,GACpB,GAAIs/C,KAAcA,GAAUvwB,YACvBuwB,GAAUt/C,SAASlxC,IAAI6xF,IAA0B,GAClD,MAAM,IAAIrsG,MAAM,iFAGpBgrG,GAAYt/C,EAASlxC,IAAIoyF,IAEzB,MAAMC,EAAQnhD,EAASlxC,IAAI8pF,GAAsB,MAC7CuI,GACAA,EAAMh0G,QAILq2C,GAASA,KAdlB,CAgD+BgwC,GAAS36E,OAAO,CAAE6jD,UAAWukD,EAAmB3oG,KAAMkjC,KAG7E,OAUR,SAAwB4lE,GAEpB,MAAM3sG,EAAWusG,KACjB,IAAKvsG,EACD,MAAM,IAAIH,MAAM,uBAEpB,IAAKG,EAASurD,SAASlxC,IAAIsyF,EAAe,MACtC,MAAM,IAAI9sG,MAAM,wFAEpB,OAAOG,EATX,CAV8B25D,IAsC9B,SAAS4yC,KACL,OAAO1B,KAAcA,GAAUvwB,UAAYuwB,GAAY,wBAmDrD4B,EAKF,YAAYG,GACRxzG,KAAKwzG,UAAYA,EACjBxzG,KAAKyzG,SAAW,GAChBzzG,KAAK0zG,kBAAoB,GACzB1zG,KAAKgjF,YAAa,EA4BtB,uBAAuB2uB,EAAejyG,GAMlC,MAIMi0G,EAoLd,SAAmBC,EAAcC,GAE7B,IAAIF,EAUJ,OARIA,EADiB,SAAjBC,EACS,IAAIlE,IAGc,YAAjBkE,OAA6B19F,EAAY09F,IAAiB,IAAIrH,GAAO,CAC3EC,qBAAsB/kC,KACtBglC,mCAAoCoH,IAGrCF,EAZX,CAxL6Bj0G,EAAUA,EAAQi0G,YAASz9F,EAEjBxW,GAAWA,EAAQm0G,wBAA0B,GAItEhlD,EAAY,CAAC,CAAEiD,QAASy6C,GAAQx6C,SAAU4hD,IAGhD,OAAOA,EAAOxE,IAAI,KAKd,MAAM2E,EAAiBnuB,GAAS36E,OAAO,CAAE6jD,UAAWA,EAAWxoC,OAAQrmB,KAAKmyD,SAAU1nD,KAAMknG,EAAcnO,WAAW/4F,OAE/GspG,EAA+BpC,EAAc3mG,OAAO8oG,GAEpDE,EAAmBD,EAAU5hD,SAASlxC,IAAIolD,GAAc,MAC9D,IAAK2tC,EACD,MAAM,IAAIvtG,MAAM,iEAcpB,OAZAstG,EAAUx9C,UAAU,IAGdj1B,GAAOthC,KAAKyzG,SAAUM,IAC5B,EAA4B9E,kBAAkB,IAGxC,EAA4BjC,QAAQ1kD,UAAU,CAAEhtB,KAIjD/5B,IAAYyyG,EAAiB36B,YAAY93E,OA2K1D,SAAsCu4E,EAAc65B,EAAQpjF,GACxD,IAEI,MAAM7oB,EAAS6oB,IACf,OAAI,GAAU7oB,GACHA,EAAOijG,MAIbl4F,IAMG,MALAkhG,EAAO1E,kBAAkB,IAGnBn1B,EAAaT,YAAY5mE,IAEzBA,IAGP/K,EAEX,MAAO+K,GAMH,MALAkhG,EAAO1E,kBAAkB,IAGnBn1B,EAAaT,YAAY5mE,IAEzBA,GA1Bd,CA1KgDuhG,EAAkB,EAA6B,KAK/E,MAAMC,EAAaF,EAAU5hD,SAASlxC,IAAImpF,IAE1C,OADA6J,EAAWC,kBACJD,EAAW1J,YAAYvgD,KAAK,KAQ3B04C,GADiBqR,EAAU5hD,SAASlxC,IAAIkqF,GAtuPtC,UAAA,SAyuPNnrG,KAAKm0G,mBAAmBJ,GACjBA,QAyBvB,gBAAgBvQ,EAAY4Q,EAAkB,IAE1C,MAAM10G,EAAU20G,GAAe,GAAID,GACnC,OAAO1C,GAAuB1xG,KAAKmyD,SAAUzyD,EAAS8jG,GACjDx5C,KAIL2nD,GAAiB3xG,KAAKs0G,uBAAuB3C,EAAejyG,IAOhE,mBAAmBq0G,GAEf,MAAM50B,EAA4B40B,EAAU5hD,SAASlxC,IAAI,IACzD,GAAI8yF,EAAU7Q,qBAAqBpiG,OAAS,EACxCizG,EAAU7Q,qBAAqB5jG,QAI/BmG,GAAK05E,EAAOtnB,UAAUpyD,QAErB,CAAA,IAAIsuG,EAAU7vC,SAASqwC,cAIxB,MAAM,IAAI9tG,MAAM,cAAc0kC,GAAU4oE,EAAU7vC,SAAS94D,qJAH3D2oG,EAAU7vC,SAASqwC,cAAcp1B,GAMrCn/E,KAAKyzG,SAASpwG,KAAK0wG,GAOvB,UAAUxjF,GAAYvwB,KAAK0zG,kBAAkBrwG,KAAKktB,GAMlD,eAAiB,OAAOvwB,KAAKwzG,UAK7B,UACI,GAAIxzG,KAAKgjF,WACL,MAAM,IAAIv8E,MAAM,4CAEpBzG,KAAKyzG,SAASvvG,QAAQ5E,QAItB5B,GAAUA,EAAOy7C,WACjBn5C,KAAK0zG,kBAAkBp0G,QAIvBk9E,GAAYA,KACZx8E,KAAKgjF,YAAa,EAKtB,gBAAkB,OAAOhjF,KAAKgjF,mBAElCqwB,EAAYhiD,UAAO,SAA6BlyD,GAAK,OAAO,IAAKA,GAAKk0G,GAAa3gD,GAASizB,MAC5F0tB,EAAYhkD,WAAQb,GAAmB,CAAER,MAAOqlD,EAAa3kD,QAAS2kD,EAAYhiD,kBA0FlF,SAASgjD,GAAe5zC,EAAK+zC,GAOzB,OANI5/F,MAAM4I,QAAQg3F,GACRA,EAAK51G,OAAOy1G,GAAgB5zC,GAG5BrhE,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI8kC,GAAM,sBAiG9Cg0C,EAUF,YAAYC,EAAOpuC,EAAUktC,EAAWmB,EAAmBC,EAA2BC,GAClF70G,KAAK00G,MAAQA,EACb10G,KAAKsmE,SAAWA,EAChBtmE,KAAKwzG,UAAYA,EACjBxzG,KAAK20G,kBAAoBA,EACzB30G,KAAK40G,0BAA4BA,EACjC50G,KAAK60G,YAAcA,EAInB70G,KAAK80G,oBAAsB,GAC3B90G,KAAK+0G,OAAS,GACd/0G,KAAKg1G,cAAe,EACpBh1G,KAAKi1G,sBAAuB,EAC5Bj1G,KAAKk1G,SAAU,EAKfl1G,KAAKm1G,eAAiB,GAItBn1G,KAAKkyE,WAAa,GAClBlyE,KAAKi1G,qBAAuBxtC,KAC5BznE,KAAK00G,MAAM5H,iBAAiBxkD,UAAU,CAAEhtB,KAAM,KAGlCt7B,KAAK00G,MAAMvF,IAAI,KAGfnvG,KAAKo1G,YAEjB,MAAMC,EAAoB,IAAI,EAI7BzsD,IACG5oD,KAAKk1G,QAAUl1G,KAAK00G,MAAM9H,WAAa5sG,KAAK00G,MAAMhI,uBAC7C1sG,KAAK00G,MAAM/H,qBAChB3sG,KAAK00G,MAAMzF,kBAAkB,KAIzBrmD,EAASttB,KAAKt7B,KAAKk1G,SACnBtsD,EAAS5B,eAIX4lD,EAAW,IAAI,EAIpBhkD,IAIG,IAAI0sD,EACJt1G,KAAK00G,MAAMzF,kBAAkB,KAIzBqG,EAAYt1G,KAAK00G,MAAM3H,SAASzkD,UAAU,KAItCikD,GAAO4D,yBAGP9D,GAAkB,KAITrsG,KAAKk1G,SAAYl1G,KAAK00G,MAAMhI,sBAC5B1sG,KAAK00G,MAAM/H,uBACZ3sG,KAAKk1G,SAAU,EACftsD,EAASttB,MAAK,UAM9B,MAAMi6E,EAAcv1G,KAAK00G,MAAM7H,WAAWvkD,UAAU,KAIhDikD,GAAOiJ,sBACHx1G,KAAKk1G,UACLl1G,KAAKk1G,SAAU,EACfl1G,KAAK00G,MAAMzF,kBAAkB,KAGrBrmD,EAASttB,MAAK,QAG9B,MAAO,KAIHg6E,EAAUtvD,cACVuvD,EAAYvvD,iBAGpB,KAA4B4mD,SACxBpwE,EAAQ64E,EAAmBzI,EAAS1kD,KAAK8E,OAsBjD,UAAUyoD,EAAoBpX,GAC1B,IAAKr+F,KAAK60G,YAAYt5E,KAClB,MAAM,IAAI90B,MAAM,iJAGpB,IAAIk6E,EAEAA,EADA80B,aAA8Bnf,GACXmf,EAIIz1G,KAAK40G,0BAA0Bc,wBAAwBD,GAElFz1G,KAAKm1G,eAAe9xG,KAAKs9E,EAAiBwd,eAG1C,MAAMnd,EAA2BL,EAtsBJyd,qBAssBwBloF,EAAYlW,KAAKwzG,UAAUvyF,IAAIgyC,IAI9E0iD,EAAUh1B,EAAiB31E,OAAO26E,GAASC,KAAM,GAFhCyY,GAAsB1d,EAAiB9zB,SAEam0B,GAC3E20B,EAAQp/C,UAAU,KAGVv2D,KAAK41G,iBAAiBD,KAE9B,MAAMvE,EAAcuE,EAAQxjD,SAASlxC,IAAI0uF,GAAa,MAStD,OARIyB,GACAuE,EAAQxjD,SAASlxC,IAAI+vF,IAChB6E,oBAAoBF,EAAQt0C,SAASq1B,cAAe0a,GAE7DpxG,KAAK81G,eAAeH,GAChBluC,MACAznE,KAAKsmE,SAASx3B,IAAI,oGAEf6mE,EAaX,OACI,GAAI31G,KAAKg1G,aACL,MAAM,IAAIvuG,MAAM,6CAEpB,IACIzG,KAAKg1G,cAAe,EACpB,IAAK,IAAI3qE,KAAQrqC,KAAK+0G,OAClB1qE,EAAK0rE,gBAET,GAAI/1G,KAAKi1G,qBACL,IAAK,IAAI5qE,KAAQrqC,KAAK+0G,OAClB1qE,EAAK2rE,iBAIjB,MAAOvjG,GAEHzS,KAAK00G,MAAMzF,kBAAkB,IAGvBjvG,KAAK20G,kBAAkBt7B,YAAY5mE,YAGzCzS,KAAKg1G,cAAe,GAU5B,WAAW90B,GAEP,MAAM71C,EAAO,EACbrqC,KAAK+0G,OAAO1xG,KAAKgnC,GACjBA,EAAK4rE,eAAej2G,MAOxB,WAAWkgF,GAEP,MAAM71C,EAAO,EACb/I,GAAOthC,KAAK+0G,OAAQ1qE,GACpBA,EAAK6rE,mBAOT,eAAej1B,GACXjhF,KAAKm2G,WAAWl1B,EAAa5mB,UAC7Br6D,KAAKo1G,OACLp1G,KAAKkyE,WAAW7uE,KAAK49E,GAGHjhF,KAAKwzG,UAAUvyF,IAAIgqF,GAAwB,IAAIthG,OAAO3J,KAAK80G,qBACnEx1G,QAITk9E,GAAaA,EAASyE,IAO3B,iBAAiBA,GACbjhF,KAAKw7E,WAAWyF,EAAa5mB,UAC7B/4B,GAAOthC,KAAKkyE,WAAY+O,GAM5B,cAEIjhF,KAAK+0G,OAAO7wG,QAAQ5E,QAInB+qC,GAASA,EAAK8O,WAMnB,gBAAkB,OAAOn5C,KAAK+0G,OAAOj0G,eAEzC2zG,EAAepjD,UAAO,SAAgClyD,GAAK,OAAO,IAAKA,GAAKs1G,GAAgB/hD,GAAS65C,IAAS75C,GAASw4C,IAAUx4C,GAASizB,IAAWjzB,GAAS2T,IAAe3T,GAAS8jC,IAA2B9jC,GAAS03C,MAC1NqK,EAAeplD,WAAQb,GAAmB,CAAER,MAAOymD,EAAgB/lD,QAAS+lD,EAAepjD,kBA+F3F,SAAS/vB,GAAO3gC,EAAMgwC,GAElB,MAAM38B,EAAQrT,EAAKkB,QAAQ8uC,GACvB38B,GAAS,GACTrT,EAAKqZ,OAAOhG,EAAO,GA2C3B,MAAMoiG,IAkEN,MAAMC,IAeN,MAAMC,GAAiB,CACnBC,kBAAmB,GACnBC,kBAAmB,iCAQjBC,EAKF,YAAYC,EAAWC,GACnB32G,KAAK02G,UAAYA,EACjB12G,KAAK42G,QAAUD,GAAUL,GAM7B,KAAKp4G,GAGD,OAAoD8B,KAAK62G,eAAe34G,GAO5E,eAAeA,GACX,IAAKR,EAAQu0C,GAAc/zC,EAAKS,MA7DrB,KAiEX,YAHmBuX,IAAf+7B,IACAA,EAAa,WAEV,EAAA,OAAA,CAAcv0C,GAChBssD,KAIJtsD,GAAWA,EAAOu0C,IACd+X,KAIJ1mD,GAASwzG,GAAcxzG,EAAM5F,EAAQu0C,IACjC+X,KAIJ1mD,GAAStD,KAAK02G,UAAUzK,mBAAmB3oG,IAOhD,YAAYpF,GACR,IAAKR,EAAQu0C,GAAc/zC,EAAKS,MAxFrB,KA0FPo4G,EAxFiB,YA6FrB,YAJmB7gG,IAAf+7B,IACAA,EAAa,UACb8kE,EAAqB,IAElB,EAAA,OAAA,CAAc/2G,KAAK42G,QAAQL,kBAAoB74G,EAASsC,KAAK42G,QAAQJ,mBACvExsD,KAIJtsD,GAAWA,EAAOu0C,EAAa8kE,IAC3B/sD,KAIJ0E,GAAYooD,GAAcpoD,EAAShxD,EAAQu0C,YAGpDwkE,EAAuBplD,UAAO,SAAwClyD,GAAK,OAAO,IAAKA,GAAKs3G,GAAwB/jD,GAASq5C,IAAWr5C,GAAS2jD,GAA8B,KAC/KI,EAAuBpnD,WAAQb,GAAmB,CAAER,MAAOyoD,EAAwB/nD,QAAS+nD,EAAuBplD,kBA6BnH,SAASylD,GAAczrG,EAAO2rG,EAAY/kE,GACtC,IAAK5mC,EACD,MAAM,IAAI5E,MAAM,gBAAgBwrC,UAAmB+kE,MAEvD,OAAO3rG,EA2kCX,MAgCM4rG,GAAejE,GAAsB,KAAM,OAbhB,CAE7B,CAAElhD,QAASk5C,GAAaj5C,SAAU,WAClC,CAAED,QAASuhD,GAAajuB,KAAM,CAACO,KAC/B,CAAE7zB,QAASk/C,GAAqB5rB,KAAM,IACtC,CAAEtzB,QAASo5C,GAAS9lB,KAAM,MAyExB8xB,GAA+B,CACjC,CACIplD,QAAS,GACTyzB,SAAU,GACVH,KAAM,CAACmnB,GAAQrB,GAASvlB,GAAUtf,GAAcmwB,GAA0B4T,KAE9E,CAAEt4C,QAASosC,GAAW9Y,KAAM,CAACmnB,IAASpnB,WA2B1C,SAA8BwuB,GAE1B,IAAIwD,EAAQ,GASZ,OARAxD,EAAO5G,SAASzkD,UAAU,KAItB,KAAO6uD,EAAMr2G,QACUq2G,EAAMzzG,KAANyzG,KAGpB,SAIG5kF,GAAM4kF,EAAM9zG,KAAKkvB,MAzC3B,CACIu/B,QAASs4C,GACT7kB,SAAU6kB,GACVhlB,KAAM,CAAC,CAAC,IAAIn3B,GAAYk8C,MAE5B,CAAEr4C,QAASi6C,GAAUxmB,SAAUwmB,GAAU3mB,KAAM,IAC/CylB,GACA,CAAE/4C,QAASkrC,GAAiB7X,WArEhC,WACI,OAAOkY,IAoE0DjY,KAAM,IACvE,CAAEtzB,QAASorC,GAAiB/X,WAhEhC,WACI,OAAOmY,IA+D0DlY,KAAM,IACvE,CACItzB,QAASq5C,GACThmB,WA5DR,SAAwB8a,GAKpB,OAFIyC,GAFJzC,EAASA,GA+BsC,oBAAdmX,WAA6BA,UAAUnX,QAvxTlD,SA4vTfA,GAwDH7a,KAAM,CAAC,CAAC,IAAIr3B,GAAOo9C,IAAc,IAAIl9C,GAAY,IAAIE,MAEzD,CAAE2D,QAASs5C,GAAuBr5C,SAhzTZ,2BAu1TpBslD,EAKF,YAAYl4B,YAGhBk4B,EAAkBpmD,UAAO2G,GAAiB,CAAEt0D,KAAM+zG,IAClDA,EAAkB/nD,UAAOV,GAAiB,CAAEF,QAAS,SAAmCvvD,GAAK,OAAO,IAAKA,GAAKk4G,GAAmB3kD,GAAS,MAAqB7D,UAAWqoD,WCn32CnK,MAAMI,GACK,qCCqBlB,IAAIC,GAAO,KAIX,SAASC,KACL,OAAOD,GA8KX,MAAM,GAAW,IAAI/lD,GAAe,oCA8B9BimD,UAENA,EAAiBpmD,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAKs4G,IAC7DA,EAAiBpoD,WAAQb,GAAmB,CAAEE,QAASgpD,GAA4B1pD,MAAOypD,EAAkBhpD,WAAY,mBAiG3I,SAASipD,KACL,OAAOhlD,GAAS,IASpB,MAAMilD,GAAuB,IAAInmD,GAAe,2CAyB1ComD,UAAgC,GAIlC,YAAYC,GACR5wD,QACAjnD,KAAK63G,KAAOA,EACZ73G,KAAK83G,QAOT,QACI,KAA4Bz2C,SAAWm2C,KAASO,cAChD/3G,KAAKg4G,SAAWR,KAASS,aAK7B,qBAAuB,OAA0BT,KAASU,YAAYl4G,KAAK63G,MAK3E,WAAWtlF,GACPilF,KAASW,qBAAqBn4G,KAAK63G,KAAM,UAAUnkE,iBAAiB,WAAYnhB,GAAI,GAMxF,aAAaA,GACTilF,KAASW,qBAAqBn4G,KAAK63G,KAAM,UAAUnkE,iBAAiB,aAAcnhB,GAAI,GAK1F,WAAa,OAAOvyB,KAAKqhE,SAAS+2C,KAIlC,eAAiB,OAAOp4G,KAAKqhE,SAASg3C,SAItC,eAAiB,OAAOr4G,KAAKqhE,SAASi3C,SAItC,WAAa,OAAOt4G,KAAKqhE,SAASk3C,KAIlC,eAAiB,OAAOv4G,KAAKqhE,SAASm3C,SAItC,aAAe,OAAOx4G,KAAKqhE,SAASv4B,OAIpC,WAAa,OAAO9oC,KAAKqhE,SAASr0B,KAKlC,aAAayrE,GAAWz4G,KAAKqhE,SAASm3C,SAAWC,EAOjD,UAAUt6D,EAAOu6D,EAAOzuC,GAChB0uC,KACA34G,KAAKg4G,SAASY,UAAUz6D,EAAOu6D,EAAOzuC,GAGtCjqE,KAAKqhE,SAASr0B,KAAOi9B,EAS7B,aAAa9rB,EAAOu6D,EAAOzuC,GACnB0uC,KACA34G,KAAKg4G,SAASa,aAAa16D,EAAOu6D,EAAOzuC,GAGzCjqE,KAAKqhE,SAASr0B,KAAOi9B,EAM7B,UAAYjqE,KAAKg4G,SAASc,UAI1B,OAAS94G,KAAKg4G,SAASe,OAIvB,WAAa,OAAO/4G,KAAKg4G,SAAS75D,cAEtCy5D,EAAwBvmD,UAAO,SAAyClyD,GAAK,OAAO,IAAKA,GAAKy4G,GAAyB,GAAgB,MAKpHA,EAAwBvoD,WAAQb,GAAmB,CAAEE,QAASsqD,GAA+BhrD,MAAO4pD,EAAyBnpD,WAAY,mBA6B5J,SAASkqD,KACL,QAAS5mE,OAAOknE,QAAQL,UAK5B,SAASI,KACL,OAAO,IAAI,GAAwBtmD,GAAS,KA8BhD,SAASwmD,GAAc31G,EAAO8D,GAC1B,GAAoB,GAAhB9D,EAAMzC,OACN,OAAOuG,EAEX,GAAkB,GAAdA,EAAIvG,OACJ,OAAOyC,EAGX,IAAI41G,EAAU,EAOd,OANI51G,EAAMqgC,SAAS,MACfu1E,IAEA9xG,EAAI8/B,WAAW,MACfgyE,IAEW,GAAXA,EACO51G,EAAQ8D,EAAIxD,UAAU,GAElB,GAAXs1G,EACO51G,EAAQ8D,EAEZ9D,EAAQ,IAAM8D,EAWzB,SAAS+xG,GAAmBnvC,GAExB,MAAMlqE,EAAQkqE,EAAIlqE,MAAM,UAElBs5G,EAAat5G,GAASA,EAAMiU,OAASi2D,EAAInpE,OAG/C,OAAOmpE,EAAI/lE,MAAM,EADOm1G,GAAsC,MAAxBpvC,EAAIovC,EAAa,GAAa,EAAI,IACjCpvC,EAAI/lE,MAAMm1G,GASrD,SAASC,GAAqBC,GAC1B,OAAOA,GAAwB,MAAdA,EAAO,GAAa,IAAMA,EAASA,qBA0BlDC,UAENA,EAAiBnoD,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAKq6G,IAC7DA,EAAiBnqD,WAAQb,GAAmB,CAAEE,QAAS+qD,GAAyBzrD,MAAOwrD,EAAkB/qD,WAAY,eA8DxI,SAASgrD,GAAwBC,GAG7B,MAAMr4C,EAAW3O,GAAS,IAAU2O,SACpC,OAAO,IAAI,GAAqB3O,GAAS,IAAwC2O,GAAYA,EAASryB,QAAU,IA0BpH,MAAM2qE,GAAgB,IAAInoD,GAAe,kCA4BnCooD,UAA6B,GAK/B,YAAYC,EAAmBzB,GAM3B,GALAnxD,QACAjnD,KAAK65G,kBAAoBA,EACb,MAARzB,IACAA,EAAOp4G,KAAK65G,kBAAkBC,sBAEtB,MAAR1B,EACA,MAAM,IAAI3xG,MAAM,+GAEpBzG,KAAK+5G,UAAY3B,EAMrB,WAAW7lF,GACPvyB,KAAK65G,kBAAkBG,WAAWznF,GAClCvyB,KAAK65G,kBAAkBI,aAAa1nF,GAKxC,cAAgB,OAAOvyB,KAAK+5G,UAK5B,mBAAmBG,GAAY,OAAOhB,GAAcl5G,KAAK+5G,UAAWG,GAKpE,KAAKC,GAAc,GAEf,MAAM3B,EAAWx4G,KAAK65G,kBAAkBrB,SAAWc,GAAqBt5G,KAAK65G,kBAAkB/wE,QAEzFkE,EAAOhtC,KAAK65G,kBAAkB7sE,KACpC,OAAOA,GAAQmtE,EAAc,GAAG3B,IAAWxrE,IAASwrE,EASxD,UAAUr6D,EAAOu6D,EAAOzuC,EAAKmwC,GAEzB,MAAMC,EAAcr6G,KAAKs6G,mBAAmBrwC,EAAMqvC,GAAqBc,IACvEp6G,KAAK65G,kBAAkBjB,UAAUz6D,EAAOu6D,EAAO2B,GASnD,aAAal8D,EAAOu6D,EAAOzuC,EAAKmwC,GAE5B,MAAMC,EAAcr6G,KAAKs6G,mBAAmBrwC,EAAMqvC,GAAqBc,IACvEp6G,KAAK65G,kBAAkBhB,aAAa16D,EAAOu6D,EAAO2B,GAKtD,UAAYr6G,KAAK65G,kBAAkBf,UAInC,OAAS94G,KAAK65G,kBAAkBd,eAEpCa,EAAqBvoD,UAAO,SAAsClyD,GAAK,OAAO,IAAKA,GAAKy6G,GAAsB,GAAgB,IAAmB,GAAgBD,GAAe,KAChLC,EAAqBvqD,WAAQ,GAA0B,CAAErB,MAAO4rD,EAAsBlrD,QAASkrD,EAAqBvoD,iCAkD9GkpD,UAA6B,GAK/B,YAAYV,EAAmBE,GAC3B9yD,QACAjnD,KAAK65G,kBAAoBA,EACzB75G,KAAK+5G,UAAY,GACA,MAAbA,IACA/5G,KAAK+5G,UAAYA,GAOzB,WAAWxnF,GACPvyB,KAAK65G,kBAAkBG,WAAWznF,GAClCvyB,KAAK65G,kBAAkBI,aAAa1nF,GAKxC,cAAgB,OAAOvyB,KAAK+5G,UAK5B,KAAKI,GAAc,GAIf,IAAIj8G,EAAO8B,KAAK65G,kBAAkB7sE,KAGlC,OAFY,MAAR9uC,IACAA,EAAO,KACJA,EAAK4C,OAAS,EAAI5C,EAAK2F,UAAU,GAAK3F,EAMjD,mBAAmBg8G,GAEf,MAAMjwC,EAAMivC,GAAcl5G,KAAK+5G,UAAWG,GAC1C,OAAOjwC,EAAInpE,OAAS,EAAK,IAAMmpE,EAAOA,EAS1C,UAAU9rB,EAAOu6D,EAAOx6G,EAAMk8G,GAE1B,IAAInwC,EAAMjqE,KAAKs6G,mBAAmBp8G,EAAOo7G,GAAqBc,IAC5C,GAAdnwC,EAAInpE,SACJmpE,EAAMjqE,KAAK65G,kBAAkBrB,UAEjCx4G,KAAK65G,kBAAkBjB,UAAUz6D,EAAOu6D,EAAOzuC,GASnD,aAAa9rB,EAAOu6D,EAAOx6G,EAAMk8G,GAE7B,IAAInwC,EAAMjqE,KAAKs6G,mBAAmBp8G,EAAOo7G,GAAqBc,IAC5C,GAAdnwC,EAAInpE,SACJmpE,EAAMjqE,KAAK65G,kBAAkBrB,UAEjCx4G,KAAK65G,kBAAkBhB,aAAa16D,EAAOu6D,EAAOzuC,GAKtD,UAAYjqE,KAAK65G,kBAAkBf,UAInC,OAAS94G,KAAK65G,kBAAkBd,eAEpCwB,EAAqBlpD,UAAO,SAAsClyD,GAAK,OAAO,IAAKA,GAAKo7G,GAAsB,GAAgB,IAAmB,GAAgBZ,GAAe,KAChLY,EAAqBlrD,WAAQ,GAA0B,CAAErB,MAAOusD,EAAsB7rD,QAAS6rD,EAAqBlpD,iCA2E9GmpD,EAKF,YAAYC,EAAkBf,GAI1B15G,KAAKwsD,SAAW,IAAI,GAIpBxsD,KAAK06G,oBAAsB,GAC3B16G,KAAK26G,kBAAoBF,EAEzB,MAAMG,EAAkB56G,KAAK26G,kBAAkBzC,cAC/Cl4G,KAAK65G,kBAAoBH,EACzB15G,KAAK+5G,UAAYX,GAAmByB,GAAgBD,IACpD56G,KAAK26G,kBAAkBX,WAItBvkE,IACGz1C,KAAKwsD,SAASjU,KAAK,CACf,IAAOv4C,KAAK9B,MAAK,GACjB,KAAO,EACP,MAASu3C,EAAG0I,MACZ,KAAQ1I,EAAGnyC,SAavB,KAAK62G,GAAc,GACf,OAAOn6G,KAAK0I,UAAU1I,KAAK26G,kBAAkBz8G,KAAKi8G,IAMtD,WAAa,OAAOn6G,KAAK65G,kBAAkBiB,WAU3C,qBAAqB58G,EAAM68G,EAAQ,IAC/B,OAAO/6G,KAAK9B,QAAU8B,KAAK0I,UAAUxK,EAAOo7G,GAAqByB,IASrE,UAAU9wC,GACN,OAAOuwC,EAASpB,mBAgNxB,SAAwB4B,EAAU/wC,GAC9B,OAAO+wC,GAAY/wC,EAAI9iC,WAAW6zE,GAAY/wC,EAAIpmE,UAAUm3G,EAASl6G,QAAUmpE,EADnF,CAhN0DjqE,KAAK+5G,UAAWc,GAAgB5wC,KAYtF,mBAAmBA,GAIf,OAHIA,GAAkB,MAAXA,EAAI,KACXA,EAAM,IAAMA,GAETjqE,KAAK26G,kBAAkBL,mBAAmBrwC,GAarD,GAAG/rE,EAAM68G,EAAQ,GAAI58D,EAAQ,MACzBn+C,KAAK26G,kBAAkB/B,UAAUz6D,EAAO,GAAIjgD,EAAM68G,GAClD/6G,KAAKi7G,0BAA0Bj7G,KAAKs6G,mBAAmBp8G,EAAOo7G,GAAqByB,IAAS58D,GAWhG,aAAajgD,EAAM68G,EAAQ,GAAI58D,EAAQ,MACnCn+C,KAAK26G,kBAAkB9B,aAAa16D,EAAO,GAAIjgD,EAAM68G,GACrD/6G,KAAKi7G,0BAA0Bj7G,KAAKs6G,mBAAmBp8G,EAAOo7G,GAAqByB,IAAS58D,GAMhG,UAAYn+C,KAAK26G,kBAAkB7B,UAKnC,OAAS94G,KAAK26G,kBAAkB5B,OAQhC,YAAYxmF,GACRvyB,KAAK06G,oBAAoBr3G,KAAKkvB,GAC9BvyB,KAAKsoD,UAILjQ,IAAOr4C,KAAKi7G,0BAA0B5iE,EAAE4xB,IAAK5xB,EAAE8F,SAQnD,0BAA0B8rB,EAAM,GAAI9rB,GAChCn+C,KAAK06G,oBAAoBp7G,QAIzBizB,GAAMA,EAAG03C,EAAK9rB,IAUlB,UAAU+8D,EAAQC,EAASC,GACvB,OAAOp7G,KAAKwsD,SAASlE,UAAU,CAAEhtB,KAAM4/E,EAAQ35G,MAAO45G,EAASn0D,SAAUo0D,YAGjFZ,EAASnpD,UAAO,SAA0BlyD,GAAK,OAAO,IAAKA,GAAKq7G,GAAU,GAAgB,IAAmB,GAAgB,MAQ7HA,EAASlB,qBAAuBA,GAUhCkB,EAAStB,cAAgBA,GAUzBsB,EAASpB,mBAAqBA,GAMXoB,EAASnrD,WAAQb,GAAmB,CAAEE,QAAS2sD,GAAgBrtD,MAAOwsD,EAAU/rD,WAAY,eAsE/G,SAAS4sD,KACL,OAAO,IAAI,GAAS3oD,GAAS,IAAwCA,GAAS,KAclF,SAASmoD,GAAgB5wC,GACrB,OAAOA,EAAI9lE,QAAQ,gBAAiB,IA2BxC,MAmJMm3G,GAAiB,iBAAG,CACtBC,QAAS,EACTC,QAAS,EACTC,SAAU,EACVC,WAAY,UAEhBJ,EAAkBA,EAAkBC,SAAW,UAC/CD,EAAkBA,EAAkBE,SAAW,UAC/CF,EAAkBA,EAAkBG,UAAY,WAChDH,EAAkBA,EAAkBI,YAAc,eAT3B,GAWjBC,GAAM,iBAAG,CACXC,KAAM,EACNC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,KAAM,EACNC,MAAO,UAEXN,EAAOA,EAAOC,MAAQ,OACtBD,EAAOA,EAAOE,KAAO,MACrBF,EAAOA,EAAOG,KAAO,MACrBH,EAAOA,EAAOI,KAAO,MACrBJ,EAAOA,EAAOK,MAAQ,OACtBL,EAAOA,EAAOM,OAAS,UAbX,GAeNC,GAAS,iBAAG,CACdC,OAAQ,EACRC,WAAY,UAEhBF,EAAUA,EAAUC,QAAU,SAC9BD,EAAUA,EAAUE,YAAc,eALnB,GAOTC,GAAgB,iBAAG,CAErBC,OAAQ,EAERC,YAAa,EAEbC,KAAM,EAENC,MAAO,UAEXJ,EAAiBA,EAAiBC,QAAU,SAC5CD,EAAiBA,EAAiBE,aAAe,cACjDF,EAAiBA,EAAiBG,MAAQ,OAC1CH,EAAiBA,EAAiBI,OAAS,UAbrB,GAehBC,GAAW,iBAAG,CAKhBD,MAAO,EAKPE,OAAQ,EAKRC,KAAM,EAKNC,KAAM,UAEVH,EAAYA,EAAYD,OAAS,QACjCC,EAAYA,EAAYC,QAAU,SAClCD,EAAYA,EAAYE,MAAQ,OAChCF,EAAYA,EAAYG,MAAQ,SAzBf,GA2BXC,GAAY,iBAAG,CAMjBvB,QAAS,EAMTwB,MAAO,EAKPC,KAAM,EAKNC,YAAa,EAKbC,SAAU,EAKVC,UAAW,EAKXC,YAAa,EAKbC,uBAAwB,EAKxBC,SAAU,EAKVp3F,SAAU,EAKVq3F,IAAK,GAKLC,cAAe,GAKfC,gBAAiB,GAKjBC,cAAe,WAEnBZ,EAAaA,EAAavB,SAAW,UACrCuB,EAAaA,EAAaC,OAAS,QACnCD,EAAaA,EAAaE,MAAQ,OAClCF,EAAaA,EAAaG,aAAe,cACzCH,EAAaA,EAAaI,UAAY,WACtCJ,EAAaA,EAAaK,WAAa,YACvCL,EAAaA,EAAaM,aAAe,cACzCN,EAAaA,EAAaO,wBAA0B,yBACpDP,EAAaA,EAAaQ,UAAY,WACtCR,EAAaA,EAAa52F,UAAY,WACtC42F,EAAaA,EAAaS,KAAO,MACjCT,EAAaA,EAAaU,eAAiB,gBAC3CV,EAAaA,EAAaW,iBAAmB,kBAC7CX,EAAaA,EAAaY,eAAiB,kBAvFzB,GA4OlB,SAASC,GAAoB1d,EAAQ7vD,GAGjC,OAAOwtE,GADM,GAAgB3d,GACG,GAAiBkB,YAAa/wD,GAWlE,SAASytE,GAAoB5d,EAAQ7vD,GAGjC,OAAOwtE,GADM,GAAgB3d,GACG,GAAiBmB,YAAahxD,GAYlE,SAAS0tE,GAAwB7d,EAAQ7vD,GAKrC,OAAOwtE,GAHM,GAAgB3d,GAEsB,GAAiBoB,gBACrBjxD,GAWnD,SAAS2tE,GAAsB9d,EAAQnrE,GAEnC,MAAM1V,EAAO,GAAgB6gF,GAEvBh5F,EAAMmY,EAAK,GAAiBkiF,eAAexsE,GACjD,QAAmB,IAAR7tB,EAAqB,CAC5B,GAAI6tB,IAAWgoF,GAAaW,gBACxB,OAAOr+F,EAAK,GAAiBkiF,eAAewb,GAAavB,SAExD,GAAIzmF,IAAWgoF,GAAaY,cAC7B,OAAOt+F,EAAK,GAAiBkiF,eAAewb,GAAaC,OAGjE,OAAO91G,EAmCX,SAAS+2G,GAAsB/d,EAAQ38F,GAGnC,OADa,GAAgB28F,GACjB,GAAiBsB,eAAej+F,GAmEhD,SAAS26G,GAAc7+F,GACnB,IAAKA,EAAK,GAAiByiF,WACvB,MAAM,IAAIp7F,MAAM,6CAA6C2Y,EAAK,GAAiBqhF,2GAoF3F,SAASmd,GAAoBx+F,EAAMpL,GAC/B,IAAK,IAAItT,EAAIsT,EAAOtT,GAAK,EAAGA,IACxB,QAAuB,IAAZ0e,EAAK1e,GACZ,OAAO0e,EAAK1e,GAGpB,MAAM,IAAI+F,MAAM,0CAOpB,SAASy3G,GAAYzkF,GACjB,MAAO0kF,EAAGn9G,GAAKy4B,EAAK96B,MAAM,KAC1B,MAAO,CAAEy/G,OAAQD,EAAGE,SAAUr9G,GAyDlC,MAAMs9G,GAAqB,uGAGrBC,GAAgB,GAEhBC,GAAqB,oMAErBC,GAAS,iBAAG,CACdhC,MAAO,EACPiC,SAAU,EACV9B,KAAM,EACN+B,SAAU,UAEdF,EAAUA,EAAUhC,OAAS,QAC7BgC,EAAUA,EAAUC,UAAY,WAChCD,EAAUA,EAAU7B,MAAQ,OAC5B6B,EAAUA,EAAUE,UAAY,aATjB,GAWTC,GAAQ,iBAAG,CACbC,SAAU,EACVC,MAAO,EACPrmG,KAAM,EACNsmG,MAAO,EACPC,QAAS,EACTC,QAAS,EACTC,kBAAmB,EACnBC,IAAK,UAETP,EAASA,EAASC,UAAY,WAC9BD,EAASA,EAASE,OAAS,QAC3BF,EAASA,EAASnmG,MAAQ,OAC1BmmG,EAASA,EAASG,OAAS,QAC3BH,EAASA,EAASI,SAAW,UAC7BJ,EAASA,EAASK,SAAW,UAC7BL,EAASA,EAASM,mBAAqB,oBACvCN,EAASA,EAASO,KAAO,QAjBX,GAmBRC,GAAe,iBAAG,CACpBC,WAAY,EACZC,KAAM,EACNC,OAAQ,EACRve,KAAM,UAEVoe,EAAgBA,EAAgBC,YAAc,aAC9CD,EAAgBA,EAAgBE,MAAQ,OACxCF,EAAgBA,EAAgBG,QAAU,SAC1CH,EAAgBA,EAAgBpe,MAAQ,SATnB,GA8BrB,SAASwe,GAAWn0G,EAAOlB,EAAQ81F,EAAQwf,GAEvC,IAAIC,EAsrBR,SAAgBr0G,GACZ,GAAIwH,GAAOxH,GACP,OAAOA,EAEX,GAAqB,iBAAVA,IAAuB25B,MAAM35B,GACpC,OAAO,IAAIoN,KAAKpN,GAEpB,GAAqB,iBAAVA,EAAoB,CAC3BA,EAAQA,EAAMvL,OAEd,MAAM6/G,EAAWluG,WAAWpG,GAE5B,IAAK25B,MAAM,EAA6B26E,GACpC,OAAO,IAAIlnG,KAAKknG,GAEpB,GAAI,4BAA4B/2G,KAAKyC,GAAQ,CAQzC,MAAO8kC,EAAGnvC,EAAGgtC,GAAK3iC,EAAM1M,MAAM,KAAK8C,IAIlCwrC,IAASA,GACV,OAAO,IAAIx0B,KAAK03B,EAAGnvC,EAAI,EAAGgtC,GAG9B,IAAIjuC,EACJ,GAAIA,EAAQsL,EAAMtL,MAAMu+G,IACpB,OAgBZ,SAAyBv+G,GAErB,MAAM2/G,EAAO,IAAIjnG,KAAK,GAEtB,IAAImnG,EAAS,EAETC,EAAQ,EAGZ,MAAMC,EAAa//G,EAAM,GAAK2/G,EAAKK,eAAiBL,EAAKM,YAEnDC,EAAalgH,EAAM,GAAK2/G,EAAKQ,YAAcR,EAAKS,SAElDpgH,EAAM,KACN6/G,EAAS30E,OAAOlrC,EAAM,GAAKA,EAAM,KACjC8/G,EAAQ50E,OAAOlrC,EAAM,GAAKA,EAAM,MAEpC+/G,EAAWpsG,KAAKgsG,EAAMz0E,OAAOlrC,EAAM,IAAKkrC,OAAOlrC,EAAM,IAAM,EAAGkrC,OAAOlrC,EAAM,KAE3E,MAAMo+G,EAAIlzE,OAAOlrC,EAAM,IAAM,GAAK6/G,EAE5B5+G,EAAIiqC,OAAOlrC,EAAM,IAAM,GAAK8/G,EAE5Bn+G,EAAIupC,OAAOlrC,EAAM,IAAM,GAEvBqgH,EAAK72G,KAAKw1B,MAA2C,IAArCttB,WAAW,MAAQ1R,EAAM,IAAM,KAErD,OADAkgH,EAAWvsG,KAAKgsG,EAAMvB,EAAGn9G,EAAGU,EAAG0+G,GACxBV,EA3BX,CAhBmC3/G,GAI/B,MAAM2/G,EAAO,IAAIjnG,KAAK,GACtB,IAAK5F,GAAO6sG,GACR,MAAM,IAAIj5G,MAAM,sBAAsB4E,kBAE1C,OAAOq0G,EAzCX,CAtrBsBr0G,GAGlBlB,EA+CJ,SAASk2G,EAAepgB,EAAQ91F,GAE5B,MAAMw4F,EApjBV,SAAqB1C,GACjB,OAAO,GAAgBA,GAAQ,GAAiBQ,UADpD,CAojBiCR,GAE7B,GADAse,GAAc5b,GAAY4b,GAAc5b,IAAa,GACjD4b,GAAc5b,GAAUx4F,GACxB,OAAOo0G,GAAc5b,GAAUx4F,GAGnC,IAAIoiC,EAAc,GAClB,OAAQpiC,GACJ,IAAK,YACDoiC,EAAcoxE,GAAoB1d,EAAQyc,GAAYD,OACtD,MACJ,IAAK,aACDlwE,EAAcoxE,GAAoB1d,EAAQyc,GAAYC,QACtD,MACJ,IAAK,WACDpwE,EAAcoxE,GAAoB1d,EAAQyc,GAAYE,MACtD,MACJ,IAAK,WACDrwE,EAAcoxE,GAAoB1d,EAAQyc,GAAYG,MACtD,MACJ,IAAK,YACDtwE,EAAcsxE,GAAoB5d,EAAQyc,GAAYD,OACtD,MACJ,IAAK,aACDlwE,EAAcsxE,GAAoB5d,EAAQyc,GAAYC,QACtD,MACJ,IAAK,WACDpwE,EAAcsxE,GAAoB5d,EAAQyc,GAAYE,MACtD,MACJ,IAAK,WACDrwE,EAAcsxE,GAAoB5d,EAAQyc,GAAYG,MACtD,MACJ,IAAK,QAED,MAAMyD,EAAYD,EAAepgB,EAAQ,aAEnCsgB,EAAYF,EAAepgB,EAAQ,aACzC1zD,EAAci0E,GAAe1C,GAAwB7d,EAAQyc,GAAYD,OAAQ,CAAC6D,EAAWC,IAC7F,MACJ,IAAK,SAED,MAAME,EAAaJ,EAAepgB,EAAQ,cAEpCygB,EAAaL,EAAepgB,EAAQ,cAC1C1zD,EAAci0E,GAAe1C,GAAwB7d,EAAQyc,GAAYC,QAAS,CAAC8D,EAAYC,IAC/F,MACJ,IAAK,OAED,MAAMC,EAAWN,EAAepgB,EAAQ,YAElC2gB,EAAWP,EAAepgB,EAAQ,YACxC1zD,EACIi0E,GAAe1C,GAAwB7d,EAAQyc,GAAYE,MAAO,CAAC+D,EAAUC,IACjF,MACJ,IAAK,OAED,MAAMC,EAAWR,EAAepgB,EAAQ,YAElC6gB,EAAWT,EAAepgB,EAAQ,YACxC1zD,EACIi0E,GAAe1C,GAAwB7d,EAAQyc,GAAYG,MAAO,CAACgE,EAAUC,IAMzF,OAHIv0E,IACAgyE,GAAc5b,GAAUx4F,GAAUoiC,GAE/BA,EApEX,CAhDuC0zD,EAAQ91F,IACnBA,EAExB,IAEIpK,EAFAgH,EAAQ,GAGZ,KAAOoD,GAAQ,CAEX,GADApK,EAAQy+G,GAAmB72G,KAAKwC,IAC5BpK,EASC,CACDgH,EAAM1D,KAAK8G,GACX,MAXO,CACPpD,EAAQA,EAAM4C,OAAO5J,EAAMmE,MAAM,IAEjC,MAAM2tG,EAAO9qG,EAAMrD,MACnB,IAAKmuG,EACD,MAEJ1nG,EAAS0nG,GAQjB,IAAIkP,EAAqBrB,EAAKsB,oBAC1BvB,IACAsB,EAAqBE,GAAiBxB,EAAUsB,GAChDrB,EAmoBR,SAAgCA,EAAMD,EAAUtjG,GAE5C,MAEM4kG,EAAqBrB,EAAKsB,oBAGhC,OAlBJ,SAAwBtB,EAAMrB,GAG1B,OAFAqB,EAAO,IAAIjnG,KAAKinG,EAAKwB,YAChBC,WAAWzB,EAAKhxE,aAAe2vE,GAC7BqB,EAHX,CAkB0BA,GALS,GAIRuB,GAAiBxB,EAAUsB,GACWA,IAPjE,CAnoBsCrB,EAAMD,IAGxC,IAAIz7B,EAAO,GAYX,OAXAj9E,EAAMzH,QAIN+L,IAEI,MAAM+1G,EA2Yd,SAA0Bj3G,GACtB,GAAIk3G,GAAal3G,GACb,OAAOk3G,GAAal3G,GAGxB,IAAIm3G,EACJ,OAAQn3G,GAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACDm3G,EAAYC,GAAcnC,GAAgBpe,KAAMqb,GAAiBE,aACjE,MACJ,IAAK,OACD+E,EAAYC,GAAcnC,GAAgBpe,KAAMqb,GAAiBG,MACjE,MACJ,IAAK,QACD8E,EAAYC,GAAcnC,GAAgBpe,KAAMqb,GAAiBC,QACjE,MAEJ,IAAK,IACDgF,EAAYE,GAAW5C,GAASC,SAAU,EAAG,GAAG,GAAO,GACvD,MAEJ,IAAK,KACDyC,EAAYE,GAAW5C,GAASC,SAAU,EAAG,GAAG,GAAM,GACtD,MAEJ,IAAK,MACDyC,EAAYE,GAAW5C,GAASC,SAAU,EAAG,GAAG,GAAO,GACvD,MAEJ,IAAK,OACDyC,EAAYE,GAAW5C,GAASC,SAAU,EAAG,GAAG,GAAO,GACvD,MAEJ,IAAK,IACL,IAAK,IACDyC,EAAYE,GAAW5C,GAASE,MAAO,EAAG,GAC1C,MACJ,IAAK,KACL,IAAK,KACDwC,EAAYE,GAAW5C,GAASE,MAAO,EAAG,GAC1C,MAEJ,IAAK,MACDwC,EAAYC,GAAcnC,GAAgBG,OAAQlD,GAAiBE,aACnE,MACJ,IAAK,OACD+E,EAAYC,GAAcnC,GAAgBG,OAAQlD,GAAiBG,MACnE,MACJ,IAAK,QACD8E,EAAYC,GAAcnC,GAAgBG,OAAQlD,GAAiBC,QACnE,MAEJ,IAAK,MACDgF,EACIC,GAAcnC,GAAgBG,OAAQlD,GAAiBE,YAAaL,GAAUE,YAClF,MACJ,IAAK,OACDkF,EACIC,GAAcnC,GAAgBG,OAAQlD,GAAiBG,KAAMN,GAAUE,YAC3E,MACJ,IAAK,QACDkF,EACIC,GAAcnC,GAAgBG,OAAQlD,GAAiBC,OAAQJ,GAAUE,YAC7E,MAEJ,IAAK,IACDkF,EAAYG,GAAW,GACvB,MACJ,IAAK,KACDH,EAAYG,GAAW,GACvB,MAEJ,IAAK,IACDH,EAAYG,GAAW,GAAG,GAC1B,MAEJ,IAAK,IACDH,EAAYE,GAAW5C,GAASnmG,KAAM,GACtC,MACJ,IAAK,KACD6oG,EAAYE,GAAW5C,GAASnmG,KAAM,GACtC,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACD6oG,EAAYC,GAAcnC,GAAgBE,KAAMjD,GAAiBE,aACjE,MACJ,IAAK,OACD+E,EAAYC,GAAcnC,GAAgBE,KAAMjD,GAAiBG,MACjE,MACJ,IAAK,QACD8E,EAAYC,GAAcnC,GAAgBE,KAAMjD,GAAiBC,QACjE,MACJ,IAAK,SACDgF,EAAYC,GAAcnC,GAAgBE,KAAMjD,GAAiBI,OACjE,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACD6E,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBE,aACvE,MACJ,IAAK,OACD+E,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBG,MACvE,MACJ,IAAK,QACD8E,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBC,QACvE,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACDgF,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBE,YAAaL,GAAUE,YAAY,GAC1G,MACJ,IAAK,OACDkF,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBG,KAAMN,GAAUE,YAAY,GACnG,MACJ,IAAK,QACDkF,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBC,OAAQJ,GAAUE,YAAY,GACrG,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACDkF,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBE,YAAaL,GAAUC,QAAQ,GACtG,MACJ,IAAK,OACDmF,EACIC,GAAcnC,GAAgBC,WAAYhD,GAAiBG,KAAMN,GAAUC,QAAQ,GACvF,MACJ,IAAK,QACDmF,EAAYC,GAAcnC,GAAgBC,WAAYhD,GAAiBC,OAAQJ,GAAUC,QAAQ,GACjG,MAEJ,IAAK,IACDmF,EAAYE,GAAW5C,GAASG,MAAO,GAAI,IAC3C,MACJ,IAAK,KACDuC,EAAYE,GAAW5C,GAASG,MAAO,GAAI,IAC3C,MAEJ,IAAK,IACDuC,EAAYE,GAAW5C,GAASG,MAAO,GACvC,MAEJ,IAAK,KACDuC,EAAYE,GAAW5C,GAASG,MAAO,GACvC,MAEJ,IAAK,IACDuC,EAAYE,GAAW5C,GAASI,QAAS,GACzC,MACJ,IAAK,KACDsC,EAAYE,GAAW5C,GAASI,QAAS,GACzC,MAEJ,IAAK,IACDsC,EAAYE,GAAW5C,GAASK,QAAS,GACzC,MACJ,IAAK,KACDqC,EAAYE,GAAW5C,GAASK,QAAS,GACzC,MAEJ,IAAK,IACDqC,EAAYE,GAAW5C,GAASM,kBAAmB,GACnD,MACJ,IAAK,KACDoC,EAAYE,GAAW5C,GAASM,kBAAmB,GACnD,MACJ,IAAK,MACDoC,EAAYE,GAAW5C,GAASM,kBAAmB,GACnD,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MACDoC,EAAYI,GAAejD,GAAUhC,OACrC,MAEJ,IAAK,QACD6E,EAAYI,GAAejD,GAAUE,UACrC,MAEJ,IAAK,IACL,IAAK,KACL,IAAK,MAEL,IAAK,IACL,IAAK,KACL,IAAK,MACD2C,EAAYI,GAAejD,GAAUC,UACrC,MAEJ,IAAK,OACL,IAAK,OAEL,IAAK,OACD4C,EAAYI,GAAejD,GAAU7B,MACrC,MACJ,QACI,OAAO,KAGf,OADAyE,GAAal3G,GAAUm3G,EAChBA,EA/MX,CA3Y+Cj2G,GACvC24E,GAAQo9B,EACJA,EAAc1B,EAAMzf,EAAQ8gB,GAClB,OAAV11G,EAAmB,IAAOA,EAAMlH,QAAQ,WAAY,IAAIA,QAAQ,MAAO,OAExE6/E,EAkFX,SAASw8B,GAAez1E,EAAK42E,GAWzB,OAVIA,IACA52E,EAAMA,EAAI5mC,QAAQ,eAAA,SAKRpE,EAAO0V,GACb,OAAsB,MAAdksG,GAAsBlsG,KAAOksG,EAAcA,EAAWlsG,GAAO1V,MAGtEgrC,EAUX,SAAS62E,GAAUC,EAAKC,EAAQC,EAAY,IAAKjiH,EAAMkiH,GAEnD,IAAIC,EAAM,IACNJ,EAAM,GAAMG,GAAWH,GAAO,KAC1BG,EACAH,EAAa,EAANA,GAGPA,GAAOA,EACPI,EAAMF,IAId,IAAIG,EAASxpG,OAAOmpG,GACpB,KAAOK,EAAOphH,OAASghH,GACnBI,EAAS,IAAMA,EAKnB,OAHIpiH,IACAoiH,EAASA,EAAOjgH,OAAOigH,EAAOphH,OAASghH,IAEpCG,EAAMC,EAqBjB,SAASV,GAAW/2G,EAAMmN,EAAM7C,EAAS,EAAGjV,GAAO,EAAOkiH,GAAU,GAChE,OAAO,SAKGtC,EAAMzf,GAEZ,IAAI4R,EAsBZ,SAAqBA,EAAM6N,GACvB,OAAQ7N,GACJ,KAAK+M,GAASC,SACV,OAAOa,EAAKyC,cAChB,KAAKvD,GAASE,MACV,OAAOY,EAAK7wE,WAChB,KAAK+vE,GAASnmG,KACV,OAAOinG,EAAK9wE,UAChB,KAAKgwE,GAASG,MACV,OAAOW,EAAKjxE,WAChB,KAAKmwE,GAASI,QACV,OAAOU,EAAKhxE,aAChB,KAAKkwE,GAASK,QACV,OAAOS,EAAK/wE,aAChB,KAAKiwE,GAASM,kBACV,OAAOQ,EAAK0C,kBAChB,KAAKxD,GAASO,IACV,OAAOO,EAAK2C,SAChB,QACI,MAAM,IAAI57G,MAAM,2BAA2BorG,QAnBvD,CAtB+BpnG,EAAMi1G,GAI7B,IAHI3qG,EAAS,GAAK88F,GAAQ98F,KACtB88F,GAAQ98F,GAERtK,IAASm0G,GAASG,MACL,IAATlN,IAA0B,KAAZ98F,IACd88F,EAAO,SAGV,GAAIpnG,IAASm0G,GAASM,kBACvB,OAhCmC4C,EAgCElqG,EA9B/BgqG,GA8ByB/P,EA9BD,GACzB5vG,OAAO,EAAG6/G,GAH3B,IAA+CA,EAmCvC,MAAMQ,EAAcvE,GAAsB9d,EAAQ6c,GAAaK,WAC/D,OAAOyE,GAAU/P,EAAMj6F,EAAM0qG,EAAaxiH,EAAMkiH,IAsCxD,SAAST,GAAc92G,EAAM2lC,EAAOmyE,EAAOrG,GAAUC,OAAQqG,GAAW,GACpE,OAAO,SAKG9C,EAAMzf,GACZ,OAaR,SAA4Byf,EAAMzf,EAAQx1F,EAAM2lC,EAAOmyE,EAAMC,GACzD,OAAQ/3G,GACJ,KAAK20G,GAAgBG,OACjB,OAttBZ,SAA6Btf,EAAQwiB,EAAWryE,GAE5C,MAAMhxB,EAAO,GAAgB6gF,GAIvB1xD,EAASqvE,GAFI,CAAoBx+F,EAAK,GAAiB0hF,cAAe1hF,EAAK,GAAiB2hF,mBAEnD0hB,GAC/C,OAAO7E,GAAoBrvE,EAAQ6B,GAPvC,CAstBuC6vD,EAAQsiB,EAAMnyE,GAAOsvE,EAAK7wE,YACzD,KAAKuwE,GAAgBE,KACjB,OA7uBZ,SAA2Brf,EAAQwiB,EAAWryE,GAE1C,MAAMhxB,EAAO,GAAgB6gF,GAIvByiB,EAAO9E,GAFI,CAAoBx+F,EAAK,GAAiBwhF,YAAaxhF,EAAK,GAAiByhF,iBAEnD4hB,GAC3C,OAAO7E,GAAoB8E,EAAMtyE,GAPrC,CA6uBqC6vD,EAAQsiB,EAAMnyE,GAAOsvE,EAAK2C,UACvD,KAAKjD,GAAgBC,WAEjB,MAAMsD,EAAejD,EAAKjxE,WAEpBm0E,EAAiBlD,EAAKhxE,aAC5B,GAAI8zE,EAAU,CAEV,MAAMK,EAjetB,SAAsC5iB,GAElC,MAAM7gF,EAAO,GAAgB6gF,GAI7B,OAHAge,GAAc7+F,IAEAA,EAAK,GAAiByiF,WAAW,IAAiC,IACnEpgG,IAIZqhH,GACuB,iBAATA,EACA5E,GAAY4E,GAEhB,CAAC5E,GAAY4E,EAAK,IAAK5E,GAAY4E,EAAK,MAdvD,CAie2D7iB,GAErC8iB,EAlctB,SAAkC9iB,EAAQwiB,EAAWryE,GAEjD,MAAMhxB,EAAO,GAAgB6gF,GAC7Bge,GAAc7+F,GAEd,MAKM2jG,EAAanF,GALI,CACnBx+F,EAAK,GAAiByiF,WAAW,GACjCziF,EAAK,GAAiByiF,WAAW,IAGkB4gB,IAAc,GACrE,OAAO7E,GAAoBmF,EAAY3yE,IAAU,GAXrD,CAkc4D6vD,EAAQsiB,EAAMnyE,GAE1D,IAAI1oC,EAyBJ,GAxBAm7G,EAAMvjH,QAAQ,CAKbwjH,EAAM9uG,KACH,GAAIY,MAAM4I,QAAQslG,GAAO,CAErB,MAAQ1E,MAAO4E,EAAW3E,QAAS4E,GAAgBH,EAAK,IAChD1E,MAAO8E,EAAS7E,QAAS8E,GAAcL,EAAK,GAChDH,GAAgBK,GAAaJ,GAAkBK,IAC9CN,EAAeO,GACXP,IAAiBO,GAAWN,EAAiBO,KAClDz7G,EAASq7G,EAAW/uG,QAGvB,CAED,MAAM,MAAEoqG,EAAK,QAAEC,GAAYyE,EACvB1E,IAAUuE,GAAgBtE,IAAYuE,IACtCl7G,EAASq7G,EAAW/uG,OAI5BtM,EACA,OAAOA,EAIf,OA5yBZ,SAA6Bu4F,EAAQwiB,EAAWryE,GAE5C,MAAMhxB,EAAO,GAAgB6gF,GAIvBmjB,EAAOxF,GAFI,CAAoBx+F,EAAK,GAAiBshF,kBAAmBthF,EAAK,GAAiBuhF,uBAEzD8hB,GAC3C,OAAO7E,GAAoBwF,EAAMhzE,GAPrC,CA4yBuC6vD,EAAQsiB,EAAM,GAA4BI,EAAe,GAAK,EAAI,GACjG,KAAKvD,GAAgBpe,KACjB,OAjvBZ,SAA2Bf,EAAQ7vD,GAK/B,OAAOwtE,GAHM,GAAgB3d,GAEY,GAAiBe,MACrB5wD,GALzC,CAivBqC6vD,EAAQ,GAA4Byf,EAAKyC,eAAiB,EAAI,EAAI,GAC/F,QAOI,MAAM,IAAI17G,MAAM,+BADGgE,IAxD/B,CAbkCi1G,EAAMzf,EAAQx1F,EAAM2lC,EAAOmyE,EAAMC,IAgFnE,SAASd,GAAetxE,GACpB,OAAO,SAMGsvE,EAAMzf,EAAQlrF,GAEpB,MAAM64F,GAAQ,EAAI74F,EAEZgtG,EAAYhE,GAAsB9d,EAAQ6c,GAAaK,WAEvDiB,EAAQxQ,EAAO,EAAIrkG,KAAK2R,MAAM0yF,EAAO,IAAMrkG,KAAKyR,KAAK4yF,EAAO,IAClE,OAAQx9D,GACJ,KAAKquE,GAAUhC,MACX,OAAS7O,GAAQ,EAAK,IAAM,IAAMgU,GAAUxD,EAAO,EAAG2D,GAClDH,GAAUr4G,KAAK+mC,IAAIs9D,EAAO,IAAK,EAAGmU,GAC1C,KAAKtD,GAAUC,SACX,MAAO,OAAU9Q,GAAQ,EAAK,IAAM,IAAMgU,GAAUxD,EAAO,EAAG2D,GAClE,KAAKtD,GAAU7B,KACX,MAAO,OAAUhP,GAAQ,EAAK,IAAM,IAAMgU,GAAUxD,EAAO,EAAG2D,GAAa,IACvEH,GAAUr4G,KAAK+mC,IAAIs9D,EAAO,IAAK,EAAGmU,GAC1C,KAAKtD,GAAUE,SACX,OAAe,IAAX5pG,EACO,KAGE64F,GAAQ,EAAK,IAAM,IAAMgU,GAAUxD,EAAO,EAAG2D,GAAa,IAC/DH,GAAUr4G,KAAK+mC,IAAIs9D,EAAO,IAAK,EAAGmU,GAE9C,QACI,MAAM,IAAIt7G,MAAM,uBAAuB2pC,QA6BvD,SAASqxE,GAAW7pG,EAAMyrG,GAAa,GACnC,OAAO,SAKG3D,EAAMzf,GAEZ,IAAIv4F,EACJ,GAAI27G,EAAY,CAEZ,MAAMC,EAA4B,IAAI7qG,KAAKinG,EAAKyC,cAAezC,EAAK7wE,WAAY,GAAGwzE,SAAW,EAExFkB,EAAQ7D,EAAK9wE,UACnBlnC,EAAS,EAAI6B,KAAK2R,OAAOqoG,EAAQD,GAA6B,OAE7D,CAED,MAAME,EAnClB,SAAgCC,GAE5B,MAAMC,EAAiB,IAAKjrG,KAAKgrG,EATrB,EASoC,GAAIpB,SACpD,OAAO,IAAI5pG,KAAKgrG,EAAM,EAAG,GAAMC,GARlB,EAAA,EAQ2DC,IAAgBD,GAH5F,CAmCsDhE,EAAKyC,eAIzCyB,GA9BWC,EA4BqBnE,EA3BvC,IAAIjnG,KAAKorG,EAAS1B,cAAe0B,EAASh1E,WAAYg1E,EAASj1E,WAfzD,EAeiFi1E,EAASxB,YA6BxEnB,UAAYsC,EAAWtC,UAC9Cx5G,EAAS,EAAI6B,KAAKw1B,MAAM6kF,EAAO,QA/B3C,IAA6BC,EAiCrB,OAAOjC,GAAUl6G,EAAQkQ,EAAMmmG,GAAsB9d,EAAQ6c,GAAaK,aAIlF,MAAMkE,GAAe,GA+NrB,SAASJ,GAAiBxB,EAAUqE,GAGhCrE,EAAWA,EAASt7G,QAAQ,KAAM,IAElC,MAAM4/G,EAA0BtrG,KAAK7W,MAAM,yBAA2B69G,GAAY,IAClF,OAAOz6E,MAAM++E,GAA2BD,EAAWC,EA2HvD,SAASlxG,GAAOxH,GACZ,OAAOA,aAAiBoN,OAASusB,MAAM35B,EAAM+R,WASjD,MAAM4mG,GAAuB,8BA4B7B,SAASC,GAA2B54G,EAAO5L,EAASwgG,EAAQikB,EAAaC,EAAeC,EAAYC,GAAY,GAE5G,IAAIC,EAAgB,GAEhBC,GAAS,EACb,GAAK/oG,SAASnQ,GAGT,CAED,IAAIm5G,EA4TZ,SAAqB3C,GAEjB,IAIIC,EAEA2C,EAEA/jH,EAEAkwC,EAEA8zE,EAZAC,EAASp7G,KAAK+mC,IAAIuxE,GAAO,GAEzB+C,EAAW,EA4Bf,KAhBKH,EAAaE,EAAO9iH,QA9WT,OA8WkC,IAC9C8iH,EAASA,EAAOxgH,QA/WJ,IA+WyB,MAGpCzD,EAAIikH,EAAO77E,OAAO,OAAS,GAExB27E,EAAa,IACbA,EAAa/jH,GACjB+jH,IAAeE,EAAOzgH,MAAMxD,EAAI,GAChCikH,EAASA,EAAO9gH,UAAU,EAAGnD,IAExB+jH,EAAa,IAElBA,EAAaE,EAAO7jH,QAGnBJ,EAAI,EA5XK,MA4XFikH,EAAO9kH,OAAOa,GAAkBA,KAE5C,GAAIA,KAAOgkH,EAAQC,EAAO7jH,QAEtBghH,EAAS,CAAC,GACV2C,EAAa,MAEZ,CAGD,IADAC,IArYU,MAsYHC,EAAO9kH,OAAO6kH,IACjBA,IAKJ,IAHAD,GAAc/jH,EACdohH,EAAS,GAEJlxE,EAAI,EAAGlwC,GAAKgkH,EAAOhkH,IAAKkwC,IACzBkxE,EAAOlxE,GAAK3F,OAAO05E,EAAO9kH,OAAOa,IASzC,OALI+jH,EArZW,KAsZX3C,EAASA,EAAO9nG,OAAO,EAAG6qG,IAC1BD,EAAWH,EAAa,EACxBA,EAAa,GAEV,CAAE3C,OAAAA,EAAQ8C,SAAAA,EAAUH,WAAAA,GA1D/B,CA5TuCp5G,GAC3Bg5G,IACAG,EA8RZ,SAAmBA,GAEf,GAA+B,IAA3BA,EAAa1C,OAAO,GACpB,OAAO0C,EAIX,MAAMM,EAAcN,EAAa1C,OAAOhhH,OAAS0jH,EAAaC,WAa9D,OAZID,EAAaI,SACbJ,EAAaI,UAAY,GAGL,IAAhBE,EACAN,EAAa1C,OAAOz+G,KAAK,EAAG,GAEP,IAAhByhH,GACLN,EAAa1C,OAAOz+G,KAAK,GAE7BmhH,EAAaC,YAAc,GAExBD,EApBX,CA9RqCA,IAG7B,IAAIO,EAAStlH,EAAQslH,OAEjBC,EAAcvlH,EAAQwlH,QAEtBC,EAAczlH,EAAQ0lH,QAC1B,GAAIf,EAAY,CAEZ,MAAMr9G,EAAQq9G,EAAWrkH,MAAMikH,IAC/B,GAAc,OAAVj9G,EACA,MAAM,IAAIN,MAAS29G,EAAH,8BAGpB,MAAMgB,EAAar+G,EAAM,GAEnBs+G,EAAkBt+G,EAAM,GAExBu+G,EAAkBv+G,EAAM,GACZ,MAAdq+G,IACAL,EAASQ,GAAkBH,IAER,MAAnBC,IACAL,EAAcO,GAAkBF,IAEb,MAAnBC,EACAJ,EAAcK,GAAkBD,GAER,MAAnBD,GAA2BL,EAAcE,IAC9CA,EAAcF,IAgW9B,SAAqBR,EAAcS,EAASE,GACxC,GAAIF,EAAUE,EACV,MAAM,IAAI1+G,MAAM,gDAAgDw+G,kCAAwCE,OAG5G,IAAIrD,EAAS0C,EAAa1C,OAEtBgD,EAAchD,EAAOhhH,OAAS0jH,EAAaC,WAE/C,MAAMe,EAAej8G,KAAKC,IAAID,KAAKqS,IAAIqpG,EAASH,GAAcK,GAG9D,IAAIM,EAAUD,EAAehB,EAAaC,WAEtCiB,EAAQ5D,EAAO2D,GACnB,GAAIA,EAAU,EAAG,CAEb3D,EAAO9nG,OAAOzQ,KAAKqS,IAAI4oG,EAAaC,WAAYgB,IAEhD,IAAK,IAAI70E,EAAI60E,EAAS70E,EAAIkxE,EAAOhhH,OAAQ8vC,IACrCkxE,EAAOlxE,GAAK,MAGf,CAEDk0E,EAAcv7G,KAAKqS,IAAI,EAAGkpG,GAC1BN,EAAaC,WAAa,EAC1B3C,EAAOhhH,OAASyI,KAAKqS,IAAI,EAAG6pG,EAAUD,EAAe,GACrD1D,EAAO,GAAK,EACZ,IAAK,IAAIphH,EAAI,EAAGA,EAAI+kH,EAAS/kH,IACzBohH,EAAOphH,GAAK,EAEpB,GAAIglH,GAAS,EACT,GAAID,EAAU,EAAI,EAAG,CACjB,IAAK,IAAIlmH,EAAI,EAAGA,EAAIkmH,EAASlmH,IACzBuiH,EAAOprC,QAAQ,GACf8tC,EAAaC,aAEjB3C,EAAOprC,QAAQ,GACf8tC,EAAaC,kBAGb3C,EAAO2D,EAAU,KAIzB,KAAOX,EAAcv7G,KAAKqS,IAAI,EAAG4pG,GAAeV,IAC5ChD,EAAOz+G,KAAK,GAEhB,IAAIsiH,EAAqC,IAAjBH,EAIxB,MAAMI,EAASX,EAAUT,EAAaC,WAGhCoB,EAAQ/D,EAAOr7E,aAAAA,SAOXo/E,EAAO73E,EAAGttC,EAAGohH,GAYnB,OAVAA,EAAOphH,IADPstC,GAAQ63E,GACQ,GAAK73E,EAAIA,EAAI,GACzB23E,IAEkB,IAAd7D,EAAOphH,IAAYA,GAAKklH,EACxB9D,EAAOp+G,MAGPiiH,GAAoB,GAGrB33E,GAAK,GAAK,EAAI,IACrB,GACA63E,IACA/D,EAAOprC,QAAQmvC,GACfrB,EAAaC,cA/ErB,CA7VoBD,EAAcQ,EAAaE,GAEvC,IAAIpD,EAAS0C,EAAa1C,OAEtB2C,EAAaD,EAAaC,WAE9B,MAAMG,EAAWJ,EAAaI,SAE9B,IAAIkB,EAAW,GAOf,IANAvB,EAASzC,EAAO79E,MAIhB+J,IAAMA,GAECy2E,EAAaM,EAAQN,IACxB3C,EAAOprC,QAAQ,GAGnB,KAAO+tC,EAAa,EAAGA,IACnB3C,EAAOprC,QAAQ,GAGf+tC,EAAa,EACbqB,EAAWhE,EAAO9nG,OAAOyqG,EAAY3C,EAAOhhH,SAG5CglH,EAAWhE,EACXA,EAAS,CAAC,IAId,MAAMiE,EAAS,GAIf,IAHIjE,EAAOhhH,QAAUrB,EAAQumH,QACzBD,EAAOrvC,QAAQorC,EAAO9nG,QAAQva,EAAQumH,OAAQlE,EAAOhhH,QAAQb,KAAK,KAE/D6hH,EAAOhhH,OAASrB,EAAQwmH,OAC3BF,EAAOrvC,QAAQorC,EAAO9nG,QAAQva,EAAQwmH,MAAOnE,EAAOhhH,QAAQb,KAAK,KAEjE6hH,EAAOhhH,QACPilH,EAAOrvC,QAAQorC,EAAO7hH,KAAK,KAE/BqkH,EAAgByB,EAAO9lH,KAAK89G,GAAsB9d,EAAQikB,IAEtD4B,EAAShlH,SACTwjH,GAAiBvG,GAAsB9d,EAAQkkB,GAAiB2B,EAAS7lH,KAAK,KAE9E2kH,IACAN,GAAiBvG,GAAsB9d,EAAQ6c,GAAaM,aAAe,IAAMwH,QAvFrFN,EAAgBvG,GAAsB9d,EAAQ6c,GAAa52F,UAgG/D,OALIo+F,EADAj5G,EAAQ,IAAMk5G,EACE9kH,EAAQymH,OAAS5B,EAAgB7kH,EAAQ0mH,OAGzC1mH,EAAQ2mH,OAAS9B,EAAgB7kH,EAAQ4mH,OAEtD/B,EAqHX,SAASgC,GAAkBn8G,EAAQ43G,EAAY,KAE3C,MAAMviH,EAAI,CACNulH,OAAQ,EACRE,QAAS,EACTE,QAAS,EACTiB,OAAQ,GACRC,OAAQ,GACRH,OAAQ,GACRC,OAAQ,GACRF,MAAO,EACPD,OAAQ,GAGNO,EAAep8G,EAAOxL,MA7PZ,KA+PV6nH,EAAWD,EAAa,GAExBE,EAAWF,EAAa,GAExBG,GAAmD,IAAnCF,EAAS3kH,QAvQf,KAwQZ2kH,EAAS7nH,MAxQG,KAyQZ,CACI6nH,EAAS3iH,UAAU,EAAG2iH,EAAShhF,YAxQzB,KAwQkD,GACxDghF,EAAS3iH,UAAU2iH,EAAShhF,YAzQtB,KAyQ+C,IAGvDmhF,EAAUD,EAAc,GAExBE,EAAWF,EAAc,IAAM,GACrClnH,EAAE4mH,OAASO,EAAQ1kH,OAAO,EAAG0kH,EAAQ9kH,QAzQtB,MA0Qf,IAAK,IAAInB,EAAI,EAAGA,EAAIkmH,EAAS9lH,OAAQJ,IAAK,CAEtC,MAAM4sF,EAAKs5B,EAAS/mH,OAAOa,GAlRjB,MAmRN4sF,EACA9tF,EAAEylH,QAAUzlH,EAAE2lH,QAAUzkH,EAAI,EA9QrB,MAgRF4sF,EACL9tF,EAAE2lH,QAAUzkH,EAAI,EAGhBlB,EAAE6mH,QAAU/4B,EAIpB,MAAMy4B,EAASY,EAAQhoH,MA1RT,KA6Rd,GAFAa,EAAEymH,MAAQF,EAAO,GAAKA,EAAO,GAAGjlH,OAAS,EACzCtB,EAAEwmH,OAAUD,EAAO,IAAMA,EAAO,IAAOA,EAAO,IAAMA,EAAO,IAAIjlH,OAAS,EACpE2lH,EAAU,CAEV,MAAMI,EAAWL,EAAS1lH,OAAStB,EAAE4mH,OAAOtlH,OAAStB,EAAE6mH,OAAOvlH,OAExDgmH,EAAML,EAAS5kH,QA/RV,KAgSXrC,EAAE0mH,OAASO,EAASxkH,OAAO,EAAG6kH,GAAK3iH,QAAQ,KAAM,IACjD3E,EAAE2mH,OAASM,EAASxkH,OAAO6kH,EAAMD,GAAU1iH,QAAQ,KAAM,SAGzD3E,EAAE0mH,OAASnE,EAAYviH,EAAE4mH,OACzB5mH,EAAE2mH,OAAS3mH,EAAE6mH,OAEjB,OAAO7mH,EAyMX,SAAS+lH,GAAkBvhC,GAEvB,MAAMt8E,EAASiK,SAASqyE,GACxB,GAAIh/C,MAAMt9B,GACN,MAAM,IAAIjB,MAAM,wCAA0Cu9E,GAE9D,OAAOt8E,EAYX,MAAMq/G,uBAyCAC,UAA6BD,GAI/B,YAAY9mB,GACRh5C,QACAjnD,KAAKigG,OAASA,EAOlB,kBAAkB50F,EAAO40F,GAGrB,OFu67BR,SAA6BA,GAGzB,OADaD,GAAeC,GAChBO,GAAgBoB,YAHhC,CEx67B2C3B,GAAUjgG,KAAKigG,OFw67B1D,CEx67BkE50F,IAEtD,KAAKswG,GAAOC,KACR,MAAO,OACX,KAAKD,GAAOE,IACR,MAAO,MACX,KAAKF,GAAOG,IACR,MAAO,MACX,KAAKH,GAAOI,IACR,MAAO,MACX,KAAKJ,GAAOK,KACR,MAAO,OACX,QACI,MAAO,iBAIvBgL,EAAqB31D,UAAO,SAAsClyD,GAAK,OAAO,IAAKA,GAAK6nH,GAAsB,GAAgB,MAC9HA,EAAqB33D,WAAQ,GAA0B,CAAErB,MAAOg5D,EAAsBt4D,QAASs4D,EAAqB31D,kBAyDpH,SAAS41D,GAAiBC,EAAWz8G,GACjCA,EAAO08G,mBAAmB18G,GAC1B,IAAK,MAAM28G,KAAUF,EAAUvoH,MAAM,KAAM,CAEvC,MAAM0oH,EAAUD,EAAOvlH,QAAQ,MACxBylH,EAAYC,IAA2B,GAAZF,EAAgB,CAACD,EAAQ,IAAM,CAACA,EAAOljH,MAAM,EAAGmjH,GAAUD,EAAOljH,MAAMmjH,EAAU,IACnH,GAAIC,EAAWxnH,SAAW2K,EACtB,OAAO+8G,mBAAmBD,GAGlC,OAAO,wBAoCLE,EAOF,YAAYC,EAAkBC,EAAkBC,EAAOC,GACnD7nH,KAAK0nH,iBAAmBA,EACxB1nH,KAAK2nH,iBAAmBA,EACxB3nH,KAAK4nH,MAAQA,EACb5nH,KAAK6nH,UAAYA,EACjB7nH,KAAK8nH,gBAAkB,KACvB9nH,KAAK+nH,gBAAkB,KACvB/nH,KAAKgoH,gBAAkB,GACvBhoH,KAAKioH,UAAY,KAMrB,UAAU58G,GACNrL,KAAKkoH,eAAeloH,KAAKgoH,iBACzBhoH,KAAKgoH,gBAAmC,iBAAV38G,EAAqBA,EAAM1M,MAAM,OAAS,GACxEqB,KAAKmoH,cAAcnoH,KAAKgoH,iBACxBhoH,KAAKmoH,cAAcnoH,KAAKioH,WAM5B,YAAY58G,GACRrL,KAAKkoH,eAAeloH,KAAKioH,WACzBjoH,KAAKmoH,cAAcnoH,KAAKgoH,iBACxBhoH,KAAK8nH,gBAAkB,KACvB9nH,KAAK+nH,gBAAkB,KACvB/nH,KAAKioH,UAA6B,iBAAV58G,EAAqBA,EAAM1M,MAAM,OAAS0M,EAC9DrL,KAAKioH,YACD,GAAoBjoH,KAAKioH,WACzBjoH,KAAK8nH,gBAAkB9nH,KAAK0nH,iBAAiBvvF,KAAKn4B,KAAKioH,WAAWj9G,SAGlEhL,KAAK+nH,gBAAkB/nH,KAAK2nH,iBAAiBxvF,KAAKn4B,KAAKioH,WAAWj9G,UAO9E,YACI,GAAIhL,KAAK8nH,gBAAiB,CAEtB,MAAMM,EAAkBpoH,KAAK8nH,gBAAgBlE,KAAwB5jH,KAAe,WAChFooH,GACApoH,KAAKqoH,sBAAsBD,QAG9B,GAAIpoH,KAAK+nH,gBAAiB,CAE3B,MAAMO,EAAkBtoH,KAAK+nH,gBAAgBnE,KAAwB5jH,KAAe,WAChFsoH,GACAtoH,KAAKuoH,sBAAsBD,IASvC,sBAAsBniB,GAClBA,EAAQqiB,iBAIPllC,GAAWtjF,KAAKyoH,aAAanlC,EAAO7tE,IAAK6tE,EAAOqO,eACjDwU,EAAQuiB,mBAIPplC,GAAWtjF,KAAKyoH,aAAanlC,EAAO7tE,IAAK6tE,EAAOqO,eACjDwU,EAAQwiB,mBAIPrlC,IACOA,EAAO8Q,eACPp0F,KAAKyoH,aAAanlC,EAAO7tE,KAAK,KAS1C,sBAAsB0wF,GAClBA,EAAQqiB,iBAIPllC,IACG,GAA2B,iBAAhBA,EAAOrjC,KAId,MAAM,IAAIx5C,MAAM,iEAAiE,GAAW68E,EAAOrjC,OAHnGjgD,KAAKyoH,aAAanlC,EAAOrjC,MAAM,KAMvCkmD,EAAQwiB,mBAIPrlC,GAAWtjF,KAAKyoH,aAAanlC,EAAOrjC,MAAM,IAa/C,cAAc2oE,GACNA,IACIh0G,MAAM4I,QAAQorG,IAAgBA,aAAuBrsG,IACrD,EAAmCjd,QAIlCupH,GAAU7oH,KAAKyoH,aAAaI,GAAO,IAGpCzpH,OAAOC,KAAKupH,GAAatpH,QAIzBupH,GAAS7oH,KAAKyoH,aAAaI,IAASD,EAAYC,MAW5D,eAAeD,GACPA,IACIh0G,MAAM4I,QAAQorG,IAAgBA,aAAuBrsG,IACrD,EAAmCjd,QAIlCupH,GAAU7oH,KAAKyoH,aAAaI,GAAO,IAGpCzpH,OAAOC,KAAKupH,GAAatpH,QAIzBupH,GAAS7oH,KAAKyoH,aAAaI,GAAO,KAU9C,aAAaA,EAAOC,IAChBD,EAAQA,EAAM/oH,SAEV+oH,EAAMlqH,MAAM,QAAQW,QAIpBupH,IACQC,EACA9oH,KAAK6nH,UAAU72B,SAAShxF,KAAK4nH,MAAMlxB,cAAemyB,GAGlD7oH,KAAK6nH,UAAU32B,YAAYlxF,KAAK4nH,MAAMlxB,cAAemyB,aAMzEpB,EAAQp2D,UAAO,SAAyBlyD,GAAK,OAAO,IAAKA,GAAKsoH,GAAS,GAAyB,IAAyB,GAAyB,IAAyB,GAAyB,IAAoB,GAAyB,MACjPA,EAAQ52D,UAAO,GAAyB,CAAEvtD,KAAMmkH,EAAS5wD,UAAW,CAAC,CAAC,GAAI,UAAW,KAAMtB,OAAQ,CAAEszD,MAAO,CAAC,QAAS,SAAUE,QAAS,mBAuOzI,MAAMC,GAOF,YAAYC,EAAWC,EAASl1G,EAAO4hB,GACnC51B,KAAKipH,UAAYA,EACjBjpH,KAAKkpH,QAAUA,EACflpH,KAAKgU,MAAQA,EACbhU,KAAK41B,MAAQA,EAKjB,YAAc,OAAsB,IAAf51B,KAAKgU,MAI1B,WAAa,OAAOhU,KAAKgU,QAAUhU,KAAK41B,MAAQ,EAIhD,WAAa,OAAO51B,KAAKgU,MAAQ,GAAM,EAIvC,UAAY,OAAQhU,KAAKmpH,yBA8GvBC,EAMF,YAAYC,EAAgBC,EAAWC,GACnCvpH,KAAKqpH,eAAiBA,EACtBrpH,KAAKspH,UAAYA,EACjBtpH,KAAKupH,SAAWA,EAChBvpH,KAAKwpH,SAAW,KAChBxpH,KAAKypH,eAAgB,EACrBzpH,KAAK0pH,QAAU,KAQnB,YAAYR,GACRlpH,KAAKwpH,SAAWN,EAChBlpH,KAAKypH,eAAgB,EAqBzB,iBAAiBl3F,GACTk1C,MAAqB,MAANl1C,GAA4B,mBAAPA,GAEhC,SAAmDjxB,QAAa,MAChEA,QAAQoxC,KAAK,4CAA4CxH,KAAKC,UAAU5Y,0FAIhFvyB,KAAK04F,WAAanmE,EAKtB,mBAAqB,OAAOvyB,KAAK04F,WAOjC,kBAAkBrtF,GAIVA,IACArL,KAAKspH,UAAYj+G,GAOzB,YACI,GAAIrL,KAAKypH,cAAe,CACpBzpH,KAAKypH,eAAgB,EAGrB,MAAMp+G,EAAQrL,KAAKwpH,SACnB,IAAKxpH,KAAK0pH,SAAWr+G,EACjB,IACIrL,KAAK0pH,QAAU1pH,KAAKupH,SAASpxF,KAAK9sB,GAAOL,OAAOhL,KAAK2pH,cAEzD,MAAOrhD,GACH,MAAM,IAAI7hE,MAAM,2CAA2C4E,eA8K1D/H,EA9KyF+H,EA+KnG/H,EAAW,aAAYA,iEADlC,IAAqBA,EA1Kb,GAAItD,KAAK0pH,QAAS,CAEd,MAAMvjB,EAAUnmG,KAAK0pH,QAAQ9F,KAAK5jH,KAAKwpH,UACnCrjB,GACAnmG,KAAK4pH,cAAczjB,IAQ/B,cAAcA,GAEV,MAAM0jB,EAAe,GACrB1jB,EAAQ2jB,iBAAiB,CAMxB7pE,EAAM8pE,EAAuB9wB,KAC1B,GAA0B,MAAtBh5C,EAAKk5C,cAAuB,CAK5B,MAAM9uD,EAAOrqC,KAAKqpH,eAAeppC,mBAAmBjgF,KAAKspH,UAAW,IAAIN,GAAe,KAA8ChpH,KAAc,UAAI,GAAI,GAAqB,OAAjBi5F,OAAwB/iF,EAAY+iF,GAE7L+wB,EAAQ,IAAIC,GAAgBhqE,EAAM5V,GACxCw/E,EAAaxmH,KAAK2mH,QAEjB,GAAoB,MAAhB/wB,EACLj5F,KAAKqpH,eAAe/nF,OAAiC,OAA1ByoF,OAAiC7zG,EAAY6zG,QAEvE,GAA8B,OAA1BA,EAAgC,CAErC,MAAM1/E,EAA0BrqC,KAAKqpH,eAAepoG,IAAI8oG,GACxD/pH,KAAKqpH,eAAea,KAAK7/E,EAAM4uD,GAE/B,MAAM+wB,EAAQ,IAAIC,GAAgBhqE,EAAM,GACxC4pE,EAAaxmH,KAAK2mH,MAG1B,IAAK,IAAItpH,EAAI,EAAGA,EAAImpH,EAAa/oH,OAAQJ,IACrCV,KAAKmqH,eAAeN,EAAanpH,GAAG2pC,KAAMw/E,EAAanpH,GAAG4iF,QAE9D,IAAK,IAAI5iF,EAAI,EAAG0pH,EAAOpqH,KAAKqpH,eAAevoH,OAAQJ,EAAI0pH,EAAM1pH,IAAK,CAE9D,MAAMw/E,EAA6BlgF,KAAKqpH,eAAepoG,IAAIvgB,GAC3Dw/E,EAAQ5nE,QAAQtE,MAAQtT,EACxBw/E,EAAQ5nE,QAAQsd,MAAQw0F,EACxBlqC,EAAQ5nE,QAAQ4wG,QAA6BlpH,KAAc,SAE/DmmG,EAAQkkB,sBAIP/mC,IAEsCtjF,KAAKqpH,eAAepoG,IAAIqiE,EAAO2V,cAC1D3gF,QAAQ2wG,UAAY3lC,EAAOrjC,OAS3C,eAAe5V,EAAMi5C,GACjBj5C,EAAK/xB,QAAQ2wG,UAAY3lC,EAAOrjC,KAYpC,8BAA8Bj2C,EAAK+hC,GAC/B,OAAO,UAGfq9E,EAAQ/3D,UAAO,SAAyBlyD,GAAK,OAAO,IAAKA,GAAKiqH,GAAS,GAAyB,IAA0B,GAAyB,IAAqB,GAAyB,MACjMA,EAAQv4D,UAAO,GAAyB,CAAEvtD,KAAM8lH,EAASvyD,UAAW,CAAC,CAAC,GAAI,QAAS,GAAI,UAAW,KAAMtB,OAAQ,CAAE2zD,QAAS,UAAWS,aAAc,eAAgBW,cAAe,yBA8DnL,MAAML,GAKF,YAAY3mC,EAAQj5C,GAChBrqC,KAAKsjF,OAASA,EACdtjF,KAAKqqC,KAAOA,sBAkKdkgF,EAKF,YAAYlB,EAAgB5oC,GACxBzgF,KAAKqpH,eAAiBA,EACtBrpH,KAAK6nD,SAAW,IAAI2iE,GACpBxqH,KAAKyqH,iBAAmB,KACxBzqH,KAAK0qH,iBAAmB,KACxB1qH,KAAK2qH,aAAe,KACpB3qH,KAAK4qH,aAAe,KACpB5qH,KAAKyqH,iBAAmBhqC,EAO5B,SAASoqC,GACL7qH,KAAK6nD,SAASohE,UAAYjpH,KAAK6nD,SAASijE,KAAOD,EAC/C7qH,KAAK+qH,cAOT,aAAatqC,GACTuqC,GAAe,WAAYvqC,GAC3BzgF,KAAKyqH,iBAAmBhqC,EACxBzgF,KAAK2qH,aAAe,KACpB3qH,KAAK+qH,cAOT,aAAatqC,GACTuqC,GAAe,WAAYvqC,GAC3BzgF,KAAK0qH,iBAAmBjqC,EACxBzgF,KAAK4qH,aAAe,KACpB5qH,KAAK+qH,cAMT,cACQ/qH,KAAK6nD,SAASohE,UACTjpH,KAAK2qH,eACN3qH,KAAKqpH,eAAezqG,QACpB5e,KAAK4qH,aAAe,KAChB5qH,KAAKyqH,mBACLzqH,KAAK2qH,aACD3qH,KAAKqpH,eAAeppC,mBAAmBjgF,KAAKyqH,iBAAkBzqH,KAAK6nD,YAK1E7nD,KAAK4qH,eACN5qH,KAAKqpH,eAAezqG,QACpB5e,KAAK2qH,aAAe,KAChB3qH,KAAK0qH,mBACL1qH,KAAK4qH,aACD5qH,KAAKqpH,eAAeppC,mBAAmBjgF,KAAK0qH,iBAAkB1qH,KAAK6nD,YAevF,8BAA8B79C,EAAK+hC,GAC/B,OAAO,UAGfw+E,EAAKl5D,UAAO,SAAsBlyD,GAAK,OAAO,IAAKA,GAAKorH,GAAM,GAAyB,IAA0B,GAAyB,MAC1IA,EAAK15D,UAAO,GAAyB,CAAEvtD,KAAMinH,EAAM1zD,UAAW,CAAC,CAAC,GAAI,OAAQ,KAAMtB,OAAQ,CAAEu1D,KAAM,OAAQG,SAAU,WAAYC,SAAU,oBAwE1I,MAAMV,GACF,cACIxqH,KAAKipH,UAAY,KACjBjpH,KAAK8qH,KAAO,MAcpB,SAASE,GAAepiG,EAAU63D,GAG9B,GADgCA,IAAeA,EAAYR,mBAEvD,MAAM,IAAIx5E,MAAM,GAAGmiB,0CAAiD,GAAW63D,QASvF,MAAM0qC,GAKF,YAAY1sC,EAAmB2sC,GAC3BprH,KAAKy+E,kBAAoBA,EACzBz+E,KAAKorH,aAAeA,EACpBprH,KAAKqrH,UAAW,EAKpB,SACIrrH,KAAKqrH,UAAW,EAChBrrH,KAAKy+E,kBAAkBwB,mBAAmBjgF,KAAKorH,cAKnD,UACIprH,KAAKqrH,UAAW,EAChBrrH,KAAKy+E,kBAAkB7/D,QAM3B,aAAa0sG,GACLA,IAAYtrH,KAAKqrH,SACjBrrH,KAAKgL,UAECsgH,GAAWtrH,KAAKqrH,UACtBrrH,KAAKm5C,8BAyFXoyE,EACF,cACIvrH,KAAKwrH,cAAe,EACpBxrH,KAAKyrH,WAAa,EAClBzrH,KAAK0rH,oBAAsB,EAC3B1rH,KAAK2rH,mBAAoB,EAM7B,aAAahiG,GACT3pB,KAAK4rH,UAAYjiG,EACO,IAApB3pB,KAAKyrH,YACLzrH,KAAK6rH,qBAAoB,GAOjC,WAAa,OAAO7rH,KAAKyrH,aAMzB,YAAYphF,GACHrqC,KAAK8rH,gBACN9rH,KAAK8rH,cAAgB,IAEzB9rH,KAAK8rH,cAAczoH,KAAKgnC,GAO5B,WAAWh/B,GAEP,MAAM0gH,EAAU1gH,GAASrL,KAAK4rH,UAQ9B,OAPA5rH,KAAK2rH,kBAAoB3rH,KAAK2rH,mBAAqBI,EACnD/rH,KAAK0rH,sBACD1rH,KAAK0rH,sBAAwB1rH,KAAKyrH,aAClCzrH,KAAK6rH,qBAAqB7rH,KAAK2rH,mBAC/B3rH,KAAK0rH,oBAAsB,EAC3B1rH,KAAK2rH,mBAAoB,GAEtBI,EAOX,oBAAoBC,GAChB,GAAIhsH,KAAK8rH,eAAiBE,IAAehsH,KAAKwrH,aAAc,CACxDxrH,KAAKwrH,aAAeQ,EACpB,IAAK,IAAItrH,EAAI,EAAGA,EAAIV,KAAK8rH,cAAchrH,OAAQJ,IAEvBV,KAAK8rH,cAAcprH,GAC3BurH,aAAaD,YAKzCT,EAASl6D,UAAO,SAA0BlyD,GAAK,OAAO,IAAKA,GAAKosH,IAChEA,EAAS16D,UAAO,GAAyB,CAAEvtD,KAAMioH,EAAU10D,UAAW,CAAC,CAAC,GAAI,WAAY,KAAMtB,OAAQ,CAAE22D,SAAU,mCA2E5GC,EAMF,YAAYC,EAAe3rC,EAAayrC,GACpClsH,KAAKksH,SAAWA,EAChBA,EAASG,WACTrsH,KAAKq/E,MAAQ,IAAI8rC,GAAWiB,EAAe3rC,GAM/C,YAAczgF,KAAKq/E,MAAM4sC,aAAajsH,KAAKksH,SAASI,WAAWtsH,KAAKusH,uBAExEJ,EAAa96D,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAKgtH,GAAc,GAAyB,IAA0B,GAAyB,IAAqB,GAAyB,GAAU,KAC1NA,EAAat7D,UAAO,GAAyB,CAAEvtD,KAAM6oH,EAAct1D,UAAW,CAAC,CAAC,GAAI,eAAgB,KAAMtB,OAAQ,CAAEg3D,aAAc,uCAiD5HC,EAMF,YAAYJ,EAAe3rC,EAAayrC,GACpCA,EAASO,YAAY,IAAItB,GAAWiB,EAAe3rC,YAG3D+rC,EAAgBn7D,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAKqtH,GAAiB,GAAyB,IAA0B,GAAyB,IAAqB,GAAyB,GAAU,KACnOA,EAAgB37D,UAAO,GAAyB,CAAEvtD,KAAMkpH,EAAiB31D,UAAW,CAAC,CAAC,GAAI,kBAAmB,4BA+OvG61D,EAMF,YAAY9E,EAAO2B,EAAU1B,GACzB7nH,KAAK4nH,MAAQA,EACb5nH,KAAKupH,SAAWA,EAChBvpH,KAAK6nH,UAAYA,EACjB7nH,KAAK2sH,SAAW,KAChB3sH,KAAK0pH,QAAU,KAMnB,YAAY50G,GACR9U,KAAK2sH,SAAW73G,GACX9U,KAAK0pH,SAAW50G,IACjB9U,KAAK0pH,QAAU1pH,KAAKupH,SAASpxF,KAAKrjB,GAAQ9J,UAMlD,YACI,GAAIhL,KAAK0pH,QAAS,CAEd,MAAMvjB,EAAUnmG,KAAK0pH,QAAQ9F,KAAwB5jH,KAAc,UAC/DmmG,GACAnmG,KAAK4pH,cAAczjB,IAU/B,UAAUymB,EAAavhH,GACnB,MAAOZ,EAAMoiH,GAAQD,EAAYjuH,MAAM,KAE1B,OADb0M,EAAiB,MAATA,GAAiBwhH,EAAO,GAAGxhH,IAAQwhH,IAASxhH,GAEhDrL,KAAK6nH,UAAUx2B,SAASrxF,KAAK4nH,MAAMlxB,cAAejsF,EAAM,GAGxDzK,KAAK6nH,UAAU12B,YAAYnxF,KAAK4nH,MAAMlxB,cAAejsF,GAQ7D,cAAc07F,GACVA,EAAQwiB,mBAIPrlC,GAAWtjF,KAAK8sH,UAAUxpC,EAAO7tE,IAAK,OACvC0wF,EAAQqiB,iBAIPllC,GAAWtjF,KAAK8sH,UAAUxpC,EAAO7tE,IAAK6tE,EAAOqO,eAC9CwU,EAAQuiB,mBAIPplC,GAAWtjF,KAAK8sH,UAAUxpC,EAAO7tE,IAAK6tE,EAAOqO,uBAGtD+6B,EAAQr7D,UAAO,SAAyBlyD,GAAK,OAAO,IAAKA,GAAKutH,GAAS,GAAyB,IAAoB,GAAyB,IAAyB,GAAyB,MAC/LA,EAAQ77D,UAAO,GAAyB,CAAEvtD,KAAMopH,EAAS71D,UAAW,CAAC,CAAC,GAAI,UAAW,KAAMtB,OAAQ,CAAEw3D,QAAS,kCA0ExGC,EAIF,YAAYvuC,GACRz+E,KAAKy+E,kBAAoBA,EACzBz+E,KAAKitH,SAAW,KAOhBjtH,KAAKktH,wBAA0B,KAI/BltH,KAAKmtH,iBAAmB,KAM5B,YAAYhnB,GAGR,GADqBnmG,KAAKotH,oBAAoBjnB,GAC5B,CAEd,MAAMknB,EAAmBrtH,KAAKy+E,kBAC1Bz+E,KAAKitH,UACLI,EAAiB/rF,OAAO+rF,EAAiBxrH,QAAQ7B,KAAKitH,WAE1DjtH,KAAKitH,SAAWjtH,KAAKmtH,iBACjBE,EAAiBptC,mBAAmBjgF,KAAKmtH,iBAAkBntH,KAAKktH,yBAChE,UAECltH,KAAKitH,UAAYjtH,KAAKktH,yBAC3BltH,KAAKstH,uBAAuBttH,KAAKktH,yBAgBzC,oBAAoB/mB,GAEhB,MAAMonB,EAAYpnB,EAAiC,wBACnD,QAASA,EAA0B,kBAAMonB,GAAavtH,KAAKwtH,wBAAwBD,GAOvF,wBAAwBA,GAEpB,MAAME,EAAcruH,OAAOC,KAAKkuH,EAAUn5B,eAAiB,IAErDs5B,EAActuH,OAAOC,KAAKkuH,EAAU57B,cAAgB,IAC1D,GAAI87B,EAAY3sH,SAAW4sH,EAAY5sH,OAAQ,CAC3C,IAAK,IAAIusD,KAAYqgE,EACjB,IAAuC,IAAnCD,EAAY5rH,QAAQwrD,GACpB,OAAO,EAGf,OAAO,EAEX,OAAO,EAOX,uBAAuBthB,GACnB,IAAK,IAAIshB,KAAYjuD,OAAOC,KAAK0sC,GACU/rC,KAAc,SAAW,QAAEqtD,GAAgCrtD,KAA8B,wBAAEqtD,WAI9I2/D,EAAiB37D,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAK6tH,GAAkB,GAAyB,MAC3HA,EAAiBn8D,UAAO,GAAyB,CAAEvtD,KAAM0pH,EAAkBn2D,UAAW,CAAC,CAAC,GAAI,mBAAoB,KAAMtB,OAAQ,CAAE23D,wBAAyB,0BAA2BC,iBAAkB,oBAAsBp2D,SAAU,CAAC,YA6EvO,SAAS42D,GAAyBrqH,EAAM+H,GACpC,OAAO5E,MAAM,yBAAyB4E,gBAAoB,GAAW/H,0BA+fnEsqH,EAIF,YAAY3tB,GACRjgG,KAAKigG,OAASA,EAelB,UAAU50F,EAAOlB,EAAS,aAAcs1G,EAAUxf,GAC9C,GAAa,MAAT50F,GAA2B,KAAVA,GAAgBA,GAAUA,EAC3C,OAAO,KACX,IACI,OAAOm0G,GAAWn0G,EAAOlB,EAAQ81F,GAAUjgG,KAAKigG,OAAQwf,GAE5D,MAAOl+G,GACH,MAAMosH,GAAyBC,EAAUrsH,EAAM2lB,kBAI3D0mG,EAASv8D,UAAO,SAA0BlyD,GAAK,OAAO,IAAKA,GAAKyuH,GAAU,GAAyB,MACnGA,EAAS78D,WAAQ,GAAoB,CAAEtmD,KAAM,OAAQnH,KAAMsqH,EAAUp1D,MAAM,yBA6WrEq1D,EAIF,YAAYC,GACR9tH,KAAK8tH,QAAUA,EAkBnB,UAAUziH,EAAO+4G,EAAYnkB,GACzB,GAAI,GAAQ50F,GACR,OAAO,KACX40F,EAASA,GAAUjgG,KAAK8tH,QACxB,IAGI,OAh6GZ,SAAsBziH,EAAO40F,EAAQmkB,GAKjC,OAAOH,GAA2B54G,EADlBi7G,GAFDtI,GAAsB/d,EAAQqb,GAAkBC,SAErBwC,GAAsB9d,EAAQ6c,GAAaK,YACnCld,EAAQ6c,GAAaC,MAAOD,GAAavB,QAAS6I,GALxG,CA+5GwB2J,GAAY1iH,GACC40F,EAAQmkB,GAErC,MAAO7iH,GACH,MAAMosH,GAAyBE,EAAatsH,EAAM2lB,kBAI9D2mG,EAAYx8D,UAAO,SAA6BlyD,GAAK,OAAO,IAAKA,GAAK0uH,GAAa,GAAyB,MAC5GA,EAAY98D,WAAQ,GAAoB,CAAEtmD,KAAM,SAAUnH,KAAMuqH,EAAar1D,MAAM,yBAuC7Ew1D,EAIF,YAAYF,GACR9tH,KAAK8tH,QAAUA,EAmBnB,UAAUziH,EAAO+4G,EAAYnkB,GACzB,GAAI,GAAQ50F,GACR,OAAO,KACX40F,EAASA,GAAUjgG,KAAK8tH,QACxB,IAGI,OAtgHZ,SAAuBziH,EAAO40F,EAAQmkB,GAOlC,OADYH,GAA2B54G,EAFvBi7G,GAFDtI,GAAsB/d,EAAQqb,GAAkBE,SAErBuC,GAAsB9d,EAAQ6c,GAAaK,YAE9Bld,EAAQ6c,GAAaC,MAAOD,GAAavB,QAAS6I,GAAY,GAC1GjgH,QAAQ,IAAIL,OAlLN,IAkL2B,KAAMi6G,GAAsB9d,EAAQ6c,GAAaG,cAPjG,CAqgHwB8Q,GAAY1iH,GACE40F,EAAQmkB,GAEtC,MAAO7iH,GACH,MAAMosH,GAAyBK,EAAazsH,EAAM2lB,kBAI9D8mG,EAAY38D,UAAO,SAA6BlyD,GAAK,OAAO,IAAKA,GAAK6uH,GAAa,GAAyB,MAC5GA,EAAYj9D,WAAQ,GAAoB,CAAEtmD,KAAM,UAAWnH,KAAM0qH,EAAax1D,MAAM,UAqKpF,SAAS,GAAQntD,GACb,OAAgB,MAATA,GAA2B,KAAVA,GAAgBA,GAAUA,EAOtD,SAAS0iH,GAAY1iH,GAEjB,GAAqB,iBAAVA,IAAuB25B,MAAMiG,OAAO5/B,GAASoG,WAAWpG,IAC/D,OAAO4/B,OAAO5/B,GAElB,GAAqB,iBAAVA,EACP,MAAM,IAAI5E,MAAS4E,EAAH,oBAEpB,OAAOA,qBAqHL4iH,UAENA,EAAah9D,UAAO,GAAwB,CAAE3tD,KAAM2qH,IACpDA,EAAa3+D,UAAO,GAAwB,CAAEZ,QAAS,SAA8BvvD,GAAK,OAAO,IAAKA,GAAK8uH,IAAoBp/D,UAAW,CAClI,CAAEiD,QAASi1D,GAAgBxhC,SAAU,aAsF7C,SAAS2oC,GAAkBC,GACvB,MAdwB,YAcjBA,qBAoDLC,UAKaA,EAAiB/+D,WAAQb,GAAmB,CAC3DR,MAAOogE,EACP3/D,WAAY,OACZC,QAAS,IAGH,IAAI2/D,GAAwB37D,GAAS,IAAW3gB,OAAQ2gB,GAAS2T,aAkD3E,MAAMgoD,GAMF,YAAYr8E,EAAUD,EAAQ+nC,GAC1B95E,KAAKgyC,SAAWA,EAChBhyC,KAAK+xC,OAASA,EACd/xC,KAAK85E,aAAeA,EACpB95E,KAAK+U,OAAS,IAGR,CAAC,EAAG,GASd,UAAUA,GAEF/U,KAAK+U,OADLH,MAAM4I,QAAQzI,GACA,IAGRA,EAGQA,EAOtB,oBACI,OAAI/U,KAAKsuH,2BACE,CAACtuH,KAAK+xC,OAAOw8E,QAASvuH,KAAK+xC,OAAOy8E,SAGlC,CAAC,EAAG,GAQnB,iBAAiB1qF,GACT9jC,KAAKsuH,4BACLtuH,KAAK+xC,OAAO08E,SAAS3qF,EAAS,GAAIA,EAAS,IAQnD,eAAem3C,GACX,GAAIj7E,KAAKsuH,2BAA4B,CAI7BrzC,EADAj7E,KAAK+xC,OAAOgM,KAAO/9C,KAAK+xC,OAAOgM,IAAIha,OAC1B/jC,KAAK+xC,OAAOgM,IAAIha,OAAOk3C,GAGvBA,EAAO92E,QAAQ,4BAA6B,QAEzD,IAEI,MAAMuqH,EAAiB1uH,KAAKgyC,SAASm2B,cAAc,IAAI8S,GACvD,GAAIyzC,EAEA,YADA1uH,KAAK2uH,gBAAgBD,GAIzB,MAAME,EAAmB5uH,KAAKgyC,SAASm2B,cAAc,UAAU8S,OAC/D,GAAI2zC,EAEA,YADA5uH,KAAK2uH,gBAAgBC,GAI7B,MAAOn8G,GACHzS,KAAK85E,aAAaT,YAAY5mE,KAS1C,4BAA4Bo8G,GACxB,GAAI7uH,KAAKsuH,2BAA4B,CAEjC,MAAMrV,EAAUj5G,KAAK+xC,OAAOknE,QACxBA,GAAWA,EAAQ4V,oBACnB5V,EAAQ4V,kBAAoBA,IASxC,gBAAgBl+E,GAEZ,MAAMm+E,EAAOn+E,EAAGo+E,wBAEVp9E,EAAOm9E,EAAKn9E,KAAO3xC,KAAK+xC,OAAOi9E,YAE/BC,EAAMH,EAAKG,IAAMjvH,KAAK+xC,OAAOm9E,YAE7Bn6G,EAAS/U,KAAK+U,SACpB/U,KAAK+xC,OAAO08E,SAAS98E,EAAO58B,EAAO,GAAIk6G,EAAMl6G,EAAO,IAYxD,2BACI,IACI,QAAS/U,KAAK+xC,UAAY/xC,KAAK+xC,OAAO08E,SAE1C,MAAOnmD,GACH,OAAO,IC7qOnB,MAAM,WAtCN,cD8BA,QC7BI,cAAgBrhB,QAIhB,oBAAsB,OAAO,IAqC7B,qBDzBJ,IAA2BkoE,EAAAA,ECyBmB,IAAI,GDxBzC5X,KACDA,GAAO4X,GC6BX,YAAYx+E,EAAIlmC,GAAQ,OAAO,EAA0BA,GAKzD,IAAIlJ,GACIwwC,OAAOzwC,SACPywC,OAAOzwC,QAAQwtC,KAAOiD,OAAOzwC,QAAQwtC,IAAIvtC,GAOjD,SAASA,GACDwwC,OAAOzwC,SACPywC,OAAOzwC,QAAQi2B,OAASwa,OAAOzwC,QAAQi2B,MAAMh2B,GAMrD,cACQwwC,OAAOzwC,SACPywC,OAAOzwC,QAAQ8tH,UAAYr9E,OAAOzwC,QAAQ8tH,WASlD,YAAYz+E,EAAI0+E,EAAK7yC,GAIjB,OAHA7rC,EAAG+C,iBAAiB27E,EAAK7yC,GAAU,GAG5B,KAGC7rC,EAAGiD,oBAAoBy7E,EAAK7yC,GAAU,IAOlD,cAAc7rC,EAAI0+E,GAAO1+E,EAAGqT,cAAcqrE,GAK1C,OAAOv7E,GAIH,OAHIA,EAAKC,YACLD,EAAKC,WAAWk1B,YAAYn1B,GAEzBA,EAMX,SAASnD,GAAM,OAAOA,EAAGtlC,MAMzB,cAAckgE,EAAS72B,GAEnB,OADAA,EAAMA,GAAO10C,KAAKsvH,sBACPl9E,cAAcm5B,GAK7B,qBACI,OAAOv5B,SAAS61B,eAAeC,mBAAmB,aAKtD,qBAAuB,OAAO91B,SAK9B,cAAc8B,GAAQ,OAAOA,EAAK7hC,WAAa03D,KAAKC,aAKpD,aAAa91B,GAAQ,OAAOA,aAAgBy7E,iBAM5C,qBAAqB76E,EAAK7Q,GACtB,MAAe,WAAXA,EACOkO,OAEI,aAAXlO,EACO6Q,EAEI,SAAX7Q,EACO6Q,EAAInF,KAER,KAKX,aAAe,OAAOwC,OAAOknE,QAI7B,cAAgB,OAAOlnE,OAAOsvB,SAK9B,YAAY3sB,GAER,MAAM0jE,EAoCLoX,KACDA,GAAiCx9E,SAASm2B,cAAc,QACnDqnD,IAIFA,GAAYC,aAAa,QAHjB,KAtCX,OAAe,MAARrX,EAAe,MAkDRnuC,EAlD4BmuC,EAmDzCsX,KACDA,GAAiB19E,SAASI,cAAc,MAE5Cs9E,GAAexvD,aAAa,OAAQ+J,GACU,MAAtCylD,GAAelX,SAAS34G,OAAO,GAAc6vH,GAAelX,SAChE,IAAMkX,GAAelX,UAN7B,IAAsBvuC,EA7ClB,mBAAqBulD,GAAc,KAInC,eAAiB,OAAOz9E,OAAOkD,UAAUC,UAIzC,iBAGI,OAAOnD,OAAO49E,aAAe59E,OAAO49E,YAAY/0G,IAAMm3B,OAAO49E,YAAY/0G,OAAAA,IACjEnC,MAAOyoG,UAKnB,kBAAoB,OAAO,EAK3B,UAAUz2G,GAAQ,OAAO,GAAkBunC,SAASo1E,OAAQ38G,IAGhE,IAeIilH,GAfAF,GAAc,KAuClB,MAAMI,GAAgB,IAAIp+D,GAAe,iBAoCnCq+D,GAA8B,CAChC,CACI/9D,QAASq4C,GACThlB,WAhCR,SAA+B2qC,EAAc99E,EAAUmgB,GACnD,MAAO,KAMHA,EAASlxC,IAAImpF,IAAuBG,YAAYvgD,KAAK,KAKjD,MAAM+lE,EAAM,KAEGn7G,MAAM3T,UAAUiD,MAAMoP,MAAM0+B,EAASg+E,iBAAiB,yBAC9DvvH,OAIPkwC,GAAMA,EAAG8+E,aAAa,mBAAqBK,GACtCxwH,QAILqxC,GAAMo/E,EAAIzuF,OAAOqP,QASrBy0C,KAAM,CAACwqC,GAAe,GAAUjqC,IAChCd,OAAO,IASf,MAAM,GAIF,cHikxCJ,IAA8BorC,EAAAA,EGjkxCW,IAAI,GHkkxCzC/e,GAAqB+e,EG7jxCrB,YAAYz5C,GACR,GAA+B,sBAAI,CAKlC66B,EAAMC,GAAkB,KAErB,MAAMF,EAAc56B,EAAS+6B,sBAAsBF,EAAMC,GACzD,GAAmB,MAAfF,EACA,MAAM,IAAI3qG,MAAM,2CAEpB,OAAO2qG,GAEX,GAAoC,2BAAI,IAGlC56B,EAAS05C,sBACf,GAAmC,0BAAI,IAGjC15C,EAAS25C,qBAiCV,GAA8B,uBAC/B,GAA8B,qBAAI,IAEtC,GAA8B,qBAAE9sH,KA9B/BktB,IAEG,MAAM6/F,EAAgB,GAAoC,6BAE1D,IAAIx6F,EAAQw6F,EAActvH,OAEtBuvH,GAAU,EAEd,MAAMC,EAAY,SAIRC,GACNF,EAAUA,GAAWE,EACrB36F,IACa,GAATA,GACArF,EAAS8/F,IAGjBD,EAAc9wH,SAAAA,SAIJ8xG,GACNA,EAAYof,WAAWF,QAcnC,sBAAsB95C,EAAU66B,EAAMC,GAClC,GAAY,MAARD,EACA,OAAO,KAGX,MAAMlyG,EAAIq3E,EAASi6C,eAAepf,GAClC,OAAS,MAALlyG,EACOA,EAEDmyG,EAGN,KAAUof,aAAarf,GAChBrxG,KAAKuxG,sBAAsB/6B,EAAU,EAA4BlF,MAAM,GAE3EtxE,KAAKuxG,sBAAsB/6B,EAAU66B,EAAKsf,eAAe,GALrD,MAwHnB,MA6BMC,GAAwB,IAAIp/D,GAAe,0CAO3Cq/D,EAMF,YAAYC,EAASpc,GACjB10G,KAAK00G,MAAQA,EACb10G,KAAK+wH,mBAAqB,IAAI10G,IAC9By0G,EAAQxxH,QAMRE,GAAKA,EAAE81C,QAAUt1C,MACjBA,KAAKgxH,SAAWF,EAAQ5sH,QAAQiY,UAWpC,iBAAiBs4B,EAAS80C,EAAW/1C,GAGjC,OADexzC,KAAKixH,eAAe1nC,GACrB71C,iBAAiBe,EAAS80C,EAAW/1C,GAWvD,uBAAuB3P,EAAQ0lD,EAAW/1C,GAGtC,OADexzC,KAAKixH,eAAe1nC,GACrB2nC,uBAAuBrtF,EAAQ0lD,EAAW/1C,GAM5D,UAAY,OAAOxzC,KAAK00G,MAMxB,eAAenrB,GAEX,MAAM4nC,EAASnxH,KAAK+wH,mBAAmB9vG,IAAIsoE,GAC3C,GAAI4nC,EACA,OAAOA,EAGX,MAAML,EAAU9wH,KAAKgxH,SACrB,IAAK,IAAItwH,EAAI,EAAGA,EAAIowH,EAAQhwH,OAAQJ,IAAK,CAErC,MAAMywH,EAASL,EAAQpwH,GACvB,GAAIywH,EAAOnzE,SAASurC,GAEhB,OADAvpF,KAAK+wH,mBAAmBlyH,IAAI0qF,EAAW4nC,GAChCA,EAGf,MAAM,IAAI1qH,MAAM,2CAA2C8iF,WAGnEsnC,EAAax/D,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAK0xH,GAAc,GAAgBD,IAAwB,GAAgB,MAC9IC,EAAaxhE,WAAQ,GAA0B,CAAErB,MAAO6iE,EAAcniE,QAASmiE,EAAax/D,kBAgC5F,MAAM,GAIF,YAAYwmD,GACR73G,KAAK63G,KAAOA,EAQhB,uBAAuBpjE,EAAS80C,EAAW/1C,GAEvC,MAAM3P,EAAS,KAAUs0E,qBAAqBn4G,KAAK63G,KAAMpjE,GACzD,IAAK5Q,EACD,MAAM,IAAIp9B,MAAM,4BAA4Bo9B,eAAoB0lD,KAEpE,OAAOvpF,KAAK0zC,iBAAiB7P,EAAQ0lD,EAAW/1C,uBAgClD49E,EACF,cAIIpxH,KAAKqxH,WAAa,IAAI90G,IAM1B,UAAUmwB,GAEN,MAAM4kF,EAAY,IAAI/0G,IACtBmwB,EAAOptC,QAIPmtC,IACSzsC,KAAKqxH,WAAWt6G,IAAI01B,KACrBzsC,KAAKqxH,WAAWnyG,IAAIutB,GACpB6kF,EAAUpyG,IAAIutB,MAGtBzsC,KAAKuxH,cAAcD,GAMvB,cAAcA,IAId,eAAiB,OAAO18G,MAAM5L,KAAKhJ,KAAKqxH,oBAE5CD,EAAiB//D,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAKiyH,IAChFA,EAAiB/hE,WAAQ,GAA0B,CAAErB,MAAOojE,EAAkB1iE,QAAS0iE,EAAiB//D,iCAYlGmgE,UAA4B,GAI9B,YAAY3Z,GACR5wD,QACAjnD,KAAK63G,KAAOA,EACZ73G,KAAKyxH,WAAa,IAAIl1G,IACtBvc,KAAK0xH,YAAc,IAAIn1G,IACvBvc,KAAKyxH,WAAWvyG,IAAI24F,EAAKlhF,MAQ7B,iBAAiB+V,EAAQ4kC,GACrB5kC,EAAOptC,QAINmtC,IAEG,MAAMklF,EAAU3xH,KAAK63G,KAAKzlE,cAAc,SACxCu/E,EAAQ13C,YAAcxtC,EACtBzsC,KAAK0xH,YAAYxyG,IAAIoyD,EAAKrJ,YAAY0pD,MAO9C,QAAQC,GACJ5xH,KAAK6xH,iBAAiB7xH,KAAKqxH,WAAYO,GACvC5xH,KAAKyxH,WAAWvyG,IAAI0yG,GAMxB,WAAWA,GAAY5xH,KAAKyxH,WAAW31B,OAAO81B,GAK9C,cAAcN,GACVtxH,KAAKyxH,WAAWnyH,QAIhBsyH,GAAY5xH,KAAK6xH,iBAAiBP,EAAWM,IAKjD,cAAgB5xH,KAAK0xH,YAAYpyH,QAIjCwyH,GAAa,KAAUxwF,OAAOwwF,YAElCN,EAAoBngE,UAAO,SAAqClyD,GAAK,OAAO,IAAKA,GAAKqyH,GAAqB,GAAgB,MAC3HA,EAAoBniE,WAAQ,GAA0B,CAAErB,MAAOwjE,EAAqB9iE,QAAS8iE,EAAoBngE,kBAmCjH,MAAM0gE,GAAiB,CACnB,IAAO,6BACP,MAAS,+BACT,MAAS,+BACT,IAAO,uCACP,MAAS,iCAGPC,GAAkB,UA6BxB,SAASC,GAAcC,EAAQxlF,EAAQ7I,GACnC,IAAK,IAAInjC,EAAI,EAAGA,EAAIgsC,EAAO5rC,OAAQJ,IAAK,CAEpC,IAAI+rC,EAAQC,EAAOhsC,GACfkU,MAAM4I,QAAQivB,GACdwlF,GAAcC,EAAQzlF,EAAO5I,IAG7B4I,EAAQA,EAAMtoC,QAAQ6tH,GAAiBE,GACvCruF,EAAOxgC,KAAKopC,IAGpB,OAAO5I,EAMX,SAASsuF,GAAuBC,GAK5B,OAIChxE,IAKG,GAAc,iBAAVA,EACA,OAAOgxE,GAIkB,IADAA,EAAahxE,KAGtCA,EAAMT,iBACNS,EAAMupC,aAAc,uBAK1B0nC,EAMF,YAAYC,EAAcC,EAAkBC,GACxCxyH,KAAKsyH,aAAeA,EACpBtyH,KAAKuyH,iBAAmBA,EACxBvyH,KAAKwyH,MAAQA,EACbxyH,KAAKyyH,iBAAmB,IAAIp2G,IAC5Brc,KAAK0yH,gBAAkB,IAAI,GAAoBJ,GAOnD,eAAe79E,EAASnxC,GACpB,IAAKmxC,IAAYnxC,EACb,OAAOtD,KAAK0yH,gBAEhB,OAAQpvH,EAAK0zD,eACT,KAAK,GAAkB7C,SAAU,CAE7B,IAAIqF,EAAWx5D,KAAKyyH,iBAAiBxxG,IAAI3d,EAAKgrB,IAM9C,OALKkrC,IACDA,EAAW,IAAIm5D,GAAkC3yH,KAAKsyH,aAActyH,KAAKuyH,iBAAkBjvH,EAAMtD,KAAKwyH,OACtGxyH,KAAKyyH,iBAAiB5zH,IAAIyE,EAAKgrB,GAAIkrC,IAEvC,EAAgCo5D,YAAYn+E,GACrC+kB,EAEX,KAAK,GAAkBpF,OACvB,KAAK,GAAkBE,UACnB,OAAO,IAAI,GAAkBt0D,KAAKsyH,aAActyH,KAAKuyH,iBAAkB99E,EAASnxC,GACpF,QACI,IAAKtD,KAAKyyH,iBAAiB17G,IAAIzT,EAAKgrB,IAAK,CAErC,MAAMoe,EAASulF,GAAc3uH,EAAKgrB,GAAIhrB,EAAKopC,OAAQ,IACnD1sC,KAAKuyH,iBAAiBM,UAAUnmF,GAChC1sC,KAAKyyH,iBAAiB5zH,IAAIyE,EAAKgrB,GAAItuB,KAAK0yH,iBAE5C,OAAO1yH,KAAK0yH,iBAOxB,SAIA,eAEJL,EAAoBhhE,UAAO,SAAqClyD,GAAK,OAAO,IAAKA,GAAKkzH,GAAqB,GAAgB,IAAe,GAAgB,IAAsB,GAAgBznB,MAChMynB,EAAoBhjE,WAAQ,GAA0B,CAAErB,MAAOqkE,EAAqB3jE,QAAS2jE,EAAoBhhE,kBAwCjH,MAAM,GAIF,YAAYihE,GACRtyH,KAAKsyH,aAAeA,EACpBtyH,KAAKof,KAAOhgB,OAAO4L,OAAO,MAK9B,WAMA,cAAcP,EAAM0mE,GAChB,OAAIA,EAGOn/B,SAASo/B,gBAAgB2gD,GAAe5gD,IAAcA,EAAW1mE,GAErEunC,SAASI,cAAc3nC,GAMlC,cAAcY,GAAS,OAAO2mC,SAASgwC,cAAc32E,GAKrD,WAAWA,GAAS,OAAO2mC,SAAS+/C,eAAe1mF,GAMnD,YAAYgb,EAAQysG,GAAYzsG,EAAO4hD,YAAY6qD,GAOnD,aAAazsG,EAAQysG,EAAUC,GACvB1sG,GACAA,EAAOu2D,aAAak2C,EAAUC,GAQtC,YAAY1sG,EAAQ2sG,GACZ3sG,GACAA,EAAO4iD,YAAY+pD,GAQ3B,kBAAkBC,EAAgBC,GAE9B,IAAIviF,EAA+B,iBAAnBsiF,EAA8BjhF,SAASm2B,cAAc8qD,GACjEA,EACJ,IAAKtiF,EACD,MAAM,IAAIlqC,MAAM,iBAAiBwsH,iCAKrC,OAHKC,IACDviF,EAAGspC,YAAc,IAEdtpC,EAMX,WAAWmD,GAAQ,OAAOA,EAAKC,WAK/B,YAAYD,GAAQ,OAAOA,EAAK+1B,YAQhC,aAAal5B,EAAIlmC,EAAMY,EAAO8lE,GAC1B,GAAIA,EAAW,CACX1mE,EAAO0mE,EAAY,IAAM1mE,EAIzB,MAAM0oH,EAAepB,GAAe5gD,GAChCgiD,EACAxiF,EAAGwvB,eAAegzD,EAAc1oH,EAAMY,GAGtCslC,EAAGuvB,aAAaz1D,EAAMY,QAI1BslC,EAAGuvB,aAAaz1D,EAAMY,GAS9B,gBAAgBslC,EAAIlmC,EAAM0mE,GACtB,GAAIA,EAAW,CAIX,MAAMgiD,EAAepB,GAAe5gD,GAChCgiD,EACAxiF,EAAGyiF,kBAAkBD,EAAc1oH,GAMnCkmC,EAAG84B,gBAAgB,GAAG0H,KAAa1mE,UAIvCkmC,EAAG84B,gBAAgBh/D,GAQ3B,SAASkmC,EAAIlmC,GAAQkmC,EAAGsgD,UAAU/xE,IAAIzU,GAMtC,YAAYkmC,EAAIlmC,GAAQkmC,EAAGsgD,UAAU3vD,OAAO72B,GAQ5C,SAASkmC,EAAIlE,EAAOphC,EAAOpG,GACnBA,EAAQ4xF,GAAoBE,SAC5BpmD,EAAGlE,MAAM4zB,YAAY5zB,EAAOphC,EAAUpG,EAAQ4xF,GAAoBC,UAAa,YAAc,IAG7FnmD,EAAGlE,MAAMA,GAASphC,EAS1B,YAAYslC,EAAIlE,EAAOxnC,GACfA,EAAQ4xF,GAAoBE,SAC5BpmD,EAAGlE,MAAM2kD,eAAe3kD,GAKxBkE,EAAGlE,MAAMA,GAAS,GAS1B,YAAYkE,EAAIlmC,EAAMY,GAElBslC,EAAGlmC,GAAQY,EAOf,SAASyoC,EAAMzoC,GAASyoC,EAAKu/E,UAAYhoH,EAOzC,OAAOw4B,EAAQud,EAAO7wB,GAElB,MAAsB,iBAAXsT,EACmB7jC,KAAKsyH,aAAapB,uBAAuBrtF,EAAQud,EAAO+wE,GAAuB5hG,IAEhEvwB,KAAKsyH,aAAa5+E,iBAAiB7P,EAAQud,EAAO+wE,GAAuB5hG,KA8B9H,MAAMoiG,WAA0C,GAO5C,YAAYL,EAAcC,EAAkB74C,EAAW84C,GACnDvrE,MAAMqrE,GACNtyH,KAAK05E,UAAYA,EAEjB,MAAMhtC,EAASulF,GAAcO,EAAQ,IAAM94C,EAAUprD,GAAIorD,EAAUhtC,OAAQ,IAC3E6lF,EAAiBM,UAAUnmF,GAC3B1sC,KAAKszH,YAhaQ,oBAMGnvH,QAAQ6tH,GA0ZgBQ,EAAQ,IAAM94C,EAAUprD,IAChEtuB,KAAKuzH,SArZb,SAA2BC,GACvB,MAfc,iBAeGrvH,QAAQ6tH,GAAiBwB,GAD9C,CAqZ0ChB,EAAQ,IAAM94C,EAAUprD,IAM9D,YAAYmmB,GAAWwS,MAAMiZ,aAAazrB,EAASz0C,KAAKuzH,SAAU,IAMlE,cAAcltG,EAAQ5b,GAElB,MAAMkmC,EAAKsW,MAAM7U,cAAc/rB,EAAQ5b,GAEvC,OADAw8C,MAAMiZ,aAAavvB,EAAI3wC,KAAKszH,YAAa,IAClC3iF,GAoBf,MAAM,WAA0B,GAO5B,YAAY2hF,EAAcC,EAAkBkB,EAAQ/5C,GAChDzyB,MAAMqrE,GACNtyH,KAAKuyH,iBAAmBA,EACxBvyH,KAAKyzH,OAASA,EACdzzH,KAAK05E,UAAYA,EAEb15E,KAAK0zH,WADLh6C,EAAU1iB,gBAAkB,GAAkB1C,UAC5B,EAA8Bq/D,aAAa,CAAE53D,KAAM,SAGnD,EAA8B63D,mBAEpD5zH,KAAKuyH,iBAAiBsB,QAAQ7zH,KAAK0zH,YAEnC,MAAMhnF,EAASulF,GAAcv4C,EAAUprD,GAAIorD,EAAUhtC,OAAQ,IAC7D,IAAK,IAAIhsC,EAAI,EAAGA,EAAIgsC,EAAO5rC,OAAQJ,IAAK,CAEpC,MAAMixH,EAAU3/E,SAASI,cAAc,SACvCu/E,EAAQ13C,YAAcvtC,EAAOhsC,GAC7BV,KAAK0zH,WAAWzrD,YAAY0pD,IAQpC,iBAAiB79E,GAAQ,OAAOA,IAAS9zC,KAAKyzH,OAASzzH,KAAK0zH,WAAa5/E,EAIzE,UAAY9zC,KAAKuyH,iBAAiBuB,WAAW9zH,KAAK0zH,YAMlD,YAAYrtG,EAAQysG,GAChB,OAAO7rE,MAAMghB,YAAYjoE,KAAK+zH,iBAAiB1tG,GAASysG,GAQ5D,aAAazsG,EAAQysG,EAAUC,GAC3B,OAAO9rE,MAAM21B,aAAa58E,KAAK+zH,iBAAiB1tG,GAASysG,EAAUC,GAOvE,YAAY1sG,EAAQ2sG,GAChB,OAAO/rE,MAAMgiB,YAAYjpE,KAAK+zH,iBAAiB1tG,GAAS2sG,GAM5D,WAAWl/E,GACP,OAAO9zC,KAAK+zH,iBAAiB9sE,MAAMlT,WAAW/zC,KAAK+zH,iBAAiBjgF,yBA+BtEkgF,UAAwB,GAI1B,YAAYt/E,GACRuS,MAAMvS,GAQV,SAAS60C,GAAa,OAAO,EAO7B,iBAAiB90C,EAAS80C,EAAW/1C,GAEjC,OADAiB,EAAQf,iBAAiB61C,EAAW,GAA8B,GAC3D,IAGDvpF,KAAK4zC,oBAAoBa,EAAS80C,EAAW,GAQvD,oBAAoB1lD,EAAQ0lD,EAAWh5D,GACnC,OAAOsT,EAAO+P,oBAAoB21C,EAAW,WAGrDyqC,EAAgB3iE,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAK60H,GAAiB,GAAgB,MAC/GA,EAAgB3kE,WAAQ,GAA0B,CAAErB,MAAOgmE,EAAiBtlE,QAASslE,EAAgB3iE,kBA2WrG,MA6CM4iE,GAAgB,CAAC,MAAO,UAAW,OAAQ,SAK3CC,GAAU,CAGZ,KAAM,YACN,KAAM,MACN,OAAQ,SACR,OAAQ,SACR,IAAO,SACP,IAAO,SACP,KAAQ,YACR,MAAS,aACT,GAAM,UACN,KAAQ,YACR,KAAQ,cACR,OAAU,aACV,IAAO,MAMLC,GAAsB,CACxB,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,IAAQ,IACR,OAAQ,WAuBNC,GAAuB,CACzB,IAlBHhzE,GAAUA,EAAMizE,OAmBb,QAfHjzE,GAAUA,EAAMkzE,QAgBb,KAZHlzE,GAAUA,EAAMmzE,QAab,MATHnzE,GAAUA,EAAMozE,6BAeXC,UAAwB,GAK1B,YAAY//E,GACRuS,MAAMvS,GAOV,SAAS60C,GAAa,OAAoD,MAA7CkrC,EAAgBC,eAAenrC,GAS5D,iBAAiB90C,EAAS80C,EAAW/1C,GAEjC,MAAMmhF,EAAiCF,EAAgBC,eAAenrC,GAEhEqrC,EAAiBH,EAAgBI,cAAcF,EAAqB,QAAGnhF,EAASxzC,KAAKs1C,QAAQw/E,WACnG,OAAO90H,KAAKs1C,QAAQw/E,UAAU7lB,kBAAkB,IAIrC,KAAU8lB,YAAYtgF,EAASkgF,EAA0B,aAAGC,IAO3E,sBAAsBrrC,GAElB,MAAMxiF,EAAQwiF,EAAU/iF,cAAc7H,MAAM,KAEtCq2H,EAAejuH,EAAMgpC,QAC3B,GAAsB,IAAjBhpC,EAAMjG,QAAoC,YAAjBk0H,GAA+C,UAAjBA,EACxD,OAAO,KAGX,MAAMv/G,EAAMg/G,EAAgBQ,cAAiCluH,EAAMrD,OAEnE,IAAIwxH,EAAU,GAcd,GAbAjB,GAAc30H,QAId61H,IAEI,MAAMnhH,EAAQjN,EAAMlF,QAAQszH,GACxBnhH,GAAS,IACTjN,EAAMiT,OAAOhG,EAAO,GACpBkhH,GAAWC,EAAe,OAGlCD,GAAWz/G,EACS,GAAhB1O,EAAMjG,QAA8B,IAAf2U,EAAI3U,OAEzB,OAAO,KAGX,MAAM4G,EAAS,GAGf,OAFAA,EAAqB,aAAIstH,EACzBttH,EAAgB,QAAIwtH,EACbxtH,EAMX,uBAAuB05C,GAEnB,IAAI8zE,EAAU,GAEVz/G,EA4EZ,SAAqB2rC,GAEjB,IAAI3rC,EAAM2rC,EAAM3rC,IAChB,GAAW,MAAPA,EAAa,CAKb,GAJAA,EAAM2rC,EAAMg0E,cAID,MAAP3/G,EACA,MAAO,eAEPA,EAAI0xB,WAAW,QACf1xB,EAAMiD,OAAO83B,aAAa7+B,SAAS8D,EAAI5R,UAAU,GAAI,KAlPjC,IAmPhBu9C,EAAMigB,UAAwC8yD,GAAoBn7G,eAAevD,KAIjFA,EAAM,GAA2CA,KAI7D,OAAOy+G,GAAQz+G,IAAQA,EArB3B,CA5E8B2rC,GAsBtB,OArBA3rC,EAAMA,EAAIjP,cACE,MAARiP,EACAA,EAAM,QAEO,MAARA,IACLA,EAAM,OAEVw+G,GAAc30H,QAId61H,IACQA,GAAgB1/G,IAGZ4/G,EADmBjB,GAAqBe,IACzB/zE,KACf8zE,GAAWC,EAAe,OAItCD,GAAWz/G,EACJy/G,EASX,qBAAqBA,EAAS1hF,EAASo6D,GACnC,OAICxsD,IACOqzE,EAAgBa,gBAAgBl0E,KAAW8zE,GAC3CtnB,EAAK6B,WAAW,IAGVj8D,EAAQ4N,KAS1B,qBAAqBm0E,GAEjB,OAAQA,GACJ,IAAK,MACD,MAAO,SACX,QACI,OAAOA,WAIvBd,EAAgBpjE,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAKs1H,GAAiB,GAAgB,MAC/GA,EAAgBplE,WAAQ,GAA0B,CAAErB,MAAOymE,EAAiB/lE,QAAS+lE,EAAgBpjE,iCAsH/FmkE,UAENA,EAAankE,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAKq2H,IACrDA,EAAanmE,WAAQb,GAAmB,CAAEE,QAAS,WAAkC,OAAOgE,GAAS,KAAsB1E,MAAOwnE,EAAc/mE,WAAY,8BAmFzKgnE,UAAyB,GAI3B,YAAY5d,GACR5wD,QACAjnD,KAAK63G,KAAOA,EAOhB,SAAS9rE,EAAK1gC,GACV,GAAa,MAATA,EACA,OAAO,KACX,OAAQ0gC,GACJ,KAAK8gC,GAAgBC,KACjB,OAAO,EACX,KAAKD,GAAgBE,KACjB,OAAI,GAAiC1hE,EAAO,QACjC,GAAiBA,GAErB,GAAerL,KAAK63G,KAAMn/F,OAAOrN,IAC5C,KAAKwhE,GAAgBG,MACjB,OAAI,GAAiC3hE,EAAO,SACjC,GAAiBA,GAErB,GAAgB,GAC3B,KAAKwhE,GAAgBI,OACjB,GAAI,GAAiC5hE,EAAO,UACxC,OAAO,GAAiBA,GAE5B,MAAM,IAAI5E,MAAM,yCACpB,KAAKomE,GAAgBK,IAGjB,OADa,GAA2B7hE,GACpC,GAAiCA,EAAO,OACjC,GAAiBA,GAErB,GAAcqN,OAAOrN,IAChC,KAAKwhE,GAAgBM,aACjB,GAAI,GAAiC9hE,EAAO,eACxC,OAAO,GAAiBA,GAE5B,MAAM,IAAI5E,MAAM,iFACpB,QACI,MAAM,IAAIA,MAAM,8BAA8BslC,wCAO1D,wBAAwB1gC,GAAS,OH4iI1B,IAAIw7D,GG5iI0Dx7D,GAKrE,yBAAyBA,GAAS,OHmjI3B,IAAIy7D,GGnjI4Dz7D,GAKvE,0BAA0BA,GACtB,OHyjIG,IAAI07D,GGzjI+B17D,GAM1C,uBAAuBA,GAAS,OH+jIzB,IAAI27D,GG/jIwD37D,GAKnE,+BAA+BA,GAC3B,OHqkIG,IAAI47D,GGrkIoC57D,WAGnDoqH,EAAiBpkE,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAKs2H,GAAkB,GAAgB,MAK/FA,EAAiBpmE,WAAQb,GAAmB,CAAEE,QAAS,WAAsC,OAxF/EyD,EAwF8GO,GAAShB,IAvF7I,IAAI,GAAiBS,EAASlxC,IAAI,KAD7C,IAAiCkxC,GAwFsInE,MAAOynE,EAAkBhnE,WAAY,eA0C5M,MA0BMinE,GAAkB1iB,GAAsBiE,GAAc,UAxBhB,CACxC,CAAEnlD,QAASk5C,GAAaj5C,SD4mJA,WC3mJxB,CAAED,QAASi5C,GAAsBh5C,SAtBrC,WACI,GAAkB4jE,cAClB,GAAsBhgF,QAoBqCkvC,OAAO,GAClE,CAAE/yB,QAAS,GAAUqzB,WAVzB,WAGI,OHqtBJ,SAAqBnzC,GACjBqnB,GAAWrnB,EADf,CGttBiBA,UACNA,UAOqCozC,KAAM,MAuBhDwwC,GAA2B,CAfiB,GAiB9C,CAAE9jE,QAAS,GAAiBC,SAAU,QACtC,CAAED,QAASuU,GAAc8e,WA1C7B,WACI,OAAO,IAAI9e,IAyCwC+e,KAAM,IACzD,CACItzB,QAAS8+D,GACTrrC,SAAU,GACVV,OAAO,EACPO,KAAM,CAAC,GAAUmnB,GAAQvB,KAE7B,CAAEl5C,QAAS8+D,GAAuBrrC,SAAU,GAAiBV,OAAO,EAAMO,KAAM,CAAC,KAvnBjD,GAynBhC,CACItzB,QAAS,GACTyzB,SAAU,GACVH,KAAM,CAAC,GAAc,GAAqBwlB,KAE9C,CAAE94C,QAAS8kC,GAAkBvR,YAAa,IAC1C,CAAEvzB,QAAS,GAAkBuzB,YAAa,IAC1C,CAAEvzB,QAAS,GAAqByzB,SAAU,GAAqBH,KAAM,CAAC,KACtE,CAAEtzB,QAAS69C,GAAapqB,SAAUoqB,GAAavqB,KAAM,CAACmnB,KACtD,CAAEz6C,QAAS,GAAcyzB,SAAU,GAAcH,KAAM,CAACwrC,GAAuBrkB,KAj6DxC,uBA66DrCspB,EAIF,YAAYC,GACR,GAAIA,EACA,MAAM,IAAIrvH,MAAM,iKAWxB,4BAA4B8yG,GACxB,MAAO,CACHv4B,SAAU60C,EACVhnE,UAAW,CACP,CAAEiD,QAAS84C,GAAQ74C,SAAUwnD,EAAOiZ,OACpC,CAAE1gE,QAAS89D,GAAevqC,YAAaulB,IACvCilB,aAKhBgG,EAAc5kE,UAAO,GAAwB,CAAE3tD,KAAMuyH,IACrDA,EAAcvmE,UAAO,GAAwB,CAAEZ,QAAS,SAA+BvvD,GAAK,OAAO,IAAKA,GAAK02H,GAAe,GAAgBA,EAAe,MAAShnE,UAAW+mE,GAA0BluF,QAAS,CAAC,GAAc2vE,YC78E1N,SAAS0e,MAAMtiH,GAClB,IAAI62C,EAAY72C,EAAKA,EAAK3S,OAAS,GACnC,OAAI0oD,EAAYc,IACZ72C,EAAK/P,MACE2mD,EAAc52C,EAAM62C,IAGpBoB,EAAUj4C,GCTlB,SAASw7B,GAAUya,EAASoB,GAC/B,OAAOD,EAASnB,EAASoB,EAAgB,GCDtC,SAAS,GAAO12C,EAAWZ,GAC9B,OAAO,SAAgC5F,GACnC,OAAOA,EAAO+7C,KAAK,IAAIqsE,GAAe5hH,EAAWZ,KH6uF3B,oBAAXu+B,QAA0BA,OG1uF7C,MAAMikF,GACF,YAAY5hH,EAAWZ,GACnBxT,KAAKoU,UAAYA,EACjBpU,KAAKwT,QAAUA,EAEnB,KAAK+zC,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAiBf,EAAYvnD,KAAKoU,UAAWpU,KAAKwT,WAGtF,MAAM,WAAyB,EAC3B,YAAY8zC,EAAalzC,EAAWZ,GAChCyzC,MAAMK,GACNtnD,KAAKoU,UAAYA,EACjBpU,KAAKwT,QAAUA,EACfxT,KAAK41B,MAAQ,EAEjB,MAAMvqB,GACF,IAAI3D,EACJ,IACIA,EAAS1H,KAAKoU,UAAUV,KAAK1T,KAAKwT,QAASnI,EAAOrL,KAAK41B,SAE3D,MAAO6vB,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAGvB/9C,GACA1H,KAAKsnD,YAAYhsB,KAAKjwB,ICKlC,MAAM4qH,IAqBN,MAAMC,IA0CN,MAAMC,GAKF,YAAYC,GAKRp2H,KAAKq2H,gBAAkB,IAAIh6G,IAI3Brc,KAAKs2H,WAAa,KACbF,EAIDp2H,KAAKu2H,SADmB,iBAAZH,EACI,KAIZp2H,KAAKo2H,QAAU,IAAI/5G,IACnB+5G,EAAQz3H,MAAM,MAAMW,QAIpBuuC,IAEI,MAAM75B,EAAQ65B,EAAKhsC,QAAQ,KAC3B,GAAImS,EAAQ,EAAG,CAEX,MAAMvJ,EAAOojC,EAAK3pC,MAAM,EAAG8P,GAErByB,EAAMhL,EAAKjE,cAEX6E,EAAQwiC,EAAK3pC,MAAM8P,EAAQ,GAAGlU,OACpCE,KAAKw2H,uBAAuB/rH,EAAMgL,GAC9BzV,KAAKo2H,QAAQr/G,IAAItB,GACEzV,KAAKo2H,QAAQn1G,IAAIxL,GAAOpS,KAAKgI,GAGhDrL,KAAKo2H,QAAQv3H,IAAI4W,EAAK,CAACpK,QAOvB,KAIZrL,KAAKo2H,QAAU,IAAI/5G,IACnBjd,OAAOC,KAAK+2H,GAAS92H,QAIrBmL,IAEI,IAAIqK,EAASshH,EAAQ3rH,GAErB,MAAMgL,EAAMhL,EAAKjE,cACK,iBAAXsO,IACPA,EAAS,CAACA,IAEVA,EAAOhU,OAAS,IAChBd,KAAKo2H,QAAQv3H,IAAI4W,EAAKX,GACtB9U,KAAKw2H,uBAAuB/rH,EAAMgL,OArD9CzV,KAAKo2H,QAAU,IAAI/5G,IAkE3B,IAAI5R,GAEA,OADAzK,KAAK21C,OACE31C,KAAKo2H,QAAQr/G,IAAItM,EAAKjE,eASjC,IAAIiE,GACAzK,KAAK21C,OAEL,MAAM7gC,EAAS9U,KAAKo2H,QAAQn1G,IAAIxW,EAAKjE,eACrC,OAAOsO,GAAUA,EAAOhU,OAAS,EAAIgU,EAAO,GAAK,KAOrD,OAEI,OADA9U,KAAK21C,OACE/gC,MAAM5L,KAAKhJ,KAAKq2H,gBAAgBvhH,UAS3C,OAAOrK,GAEH,OADAzK,KAAK21C,OACE31C,KAAKo2H,QAAQn1G,IAAIxW,EAAKjE,gBAAkB,KAWnD,OAAOiE,EAAMY,GACT,OAAOrL,KAAKq2B,MAAM,CAAE5rB,KAAAA,EAAMY,MAAAA,EAAOorH,GAAI,MAYzC,IAAIhsH,EAAMY,GACN,OAAOrL,KAAKq2B,MAAM,CAAE5rB,KAAAA,EAAMY,MAAAA,EAAOorH,GAAI,MAUzC,OAAOhsH,EAAMY,GACT,OAAOrL,KAAKq2B,MAAM,CAAE5rB,KAAAA,EAAMY,MAAAA,EAAOorH,GAAI,MAQzC,uBAAuBhsH,EAAMisH,GACpB12H,KAAKq2H,gBAAgBt/G,IAAI2/G,IAC1B12H,KAAKq2H,gBAAgBx3H,IAAI63H,EAAQjsH,GAOzC,OACUzK,KAAKu2H,WACHv2H,KAAKu2H,oBAAoBJ,GACzBn2H,KAAK22H,SAAS32H,KAAKu2H,UAGnBv2H,KAAKu2H,WAETv2H,KAAKu2H,SAAW,KACVv2H,KAAKs2H,aACPt2H,KAAKs2H,WAAWh3H,QAIhBujC,GAAU7iC,KAAK42H,YAAY/zF,IAC3B7iC,KAAKs2H,WAAa,OAS9B,SAAS7wG,GACLA,EAAMkwB,OACN/gC,MAAM5L,KAAKyc,EAAM2wG,QAAQ/2H,QAAQC,QAIjCmW,IACIzV,KAAKo2H,QAAQv3H,IAAI4W,EAAwBgQ,EAAM2wG,QAAQn1G,IAAIxL,IAC3DzV,KAAKq2H,gBAAgBx3H,IAAI4W,EAAwBgQ,EAAM4wG,gBAAgBp1G,IAAIxL,MAQnF,MAAMotB,GAEF,MAAMxM,EAAQ,IAAI8/F,GAIlB,OAHA9/F,EAAMkgG,SACCv2H,KAAKu2H,UAAYv2H,KAAKu2H,oBAAoBJ,GAAen2H,KAAKu2H,SAAWv2H,KAChFq2B,EAAMigG,YAAct2H,KAAKs2H,YAAc,IAAI3sH,OAAO,CAACk5B,IAC5CxM,EAOX,YAAYwM,GAER,MAAMptB,EAAMotB,EAAOp4B,KAAKjE,cACxB,OAAQq8B,EAAO4zF,IACX,IAAK,IACL,IAAK,IAED,IAAIprH,EAA2Bw3B,EAAa,MAI5C,GAHqB,iBAAVx3B,IACPA,EAAQ,CAACA,IAEQ,IAAjBA,EAAMvK,OACN,OAEJd,KAAKw2H,uBAAuB3zF,EAAOp4B,KAAMgL,GAEzC,MAAMnL,GAAsB,MAAdu4B,EAAO4zF,GAAaz2H,KAAKo2H,QAAQn1G,IAAIxL,QAAOS,IAAc,GACxE5L,EAAKjH,QAAQgI,GACbrL,KAAKo2H,QAAQv3H,IAAI4W,EAAKnL,GACtB,MACJ,IAAK,IAED,MAAMusH,EAA8Bh0F,EAAa,MACjD,GAAKg0F,EAIA,CAED,IAAIrzE,EAAWxjD,KAAKo2H,QAAQn1G,IAAIxL,GAChC,IAAK+tC,EACD,OAEJA,EAAWA,EAAS/iD,OAIpB4K,IAAsC,IAA7BwrH,EAASh1H,QAAQwJ,IACF,IAApBm4C,EAAS1iD,QACTd,KAAKo2H,QAAQt6B,OAAOrmF,GACpBzV,KAAKq2H,gBAAgBv6B,OAAOrmF,IAG5BzV,KAAKo2H,QAAQv3H,IAAI4W,EAAK+tC,QAnB1BxjD,KAAKo2H,QAAQt6B,OAAOrmF,GACpBzV,KAAKq2H,gBAAgBv6B,OAAOrmF,IA6B5C,QAAQ8c,GACJvyB,KAAK21C,OACL/gC,MAAM5L,KAAKhJ,KAAKq2H,gBAAgBh3H,QAC3BC,QAILmW,GAAO8c,EAAsBvyB,KAAKq2H,gBAAgBp1G,IAAIxL,GAA2BzV,KAAKo2H,QAAQn1G,IAAIxL,MAqF1G,MAAMqhH,GAMF,UAAUrhH,GAAO,OAAOshH,GAAiBthH,GAMzC,YAAYpK,GAAS,OAAO0rH,GAAiB1rH,GAM7C,UAAUoK,GAAO,OAAO+xG,mBAAmB/xG,GAM3C,YAAYpK,GAAS,OAAOm8G,mBAAmBn8G,IAmCnD,SAAS0rH,GAAiB1+E,GACtB,OAAO8uE,mBAAmB9uE,GACrBl0C,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KA+C1B,MAAM6yH,GAIF,YAAYt3H,EAAU,IAIlB,GAHAM,KAAKi3H,QAAU,KACfj3H,KAAKk3H,UAAY,KACjBl3H,KAAKm3H,QAAUz3H,EAAQy3H,SAAW,IAAIL,GAChCp3H,EAAQ03H,WAAY,CACtB,GAAM13H,EAAQ23H,WACV,MAAM,IAAI5wH,MAAM,kDAEpBzG,KAAKyB,IAjGjB,SAAqB61H,EAAWC,GAE5B,MAAM91H,EAAM,IAAI4a,IAoBhB,OAnBIi7G,EAAUx2H,OAAS,GAEJw2H,EAAU34H,MAAM,KACxBW,QAINk4H,IAEG,MAAMC,EAAQD,EAAM31H,QAAQ,MACrB4T,EAAKw3B,IAAiB,GAAVwqF,EACf,CAACF,EAAMG,UAAUF,GAAQ,IACzB,CAACD,EAAMG,UAAUF,EAAMtzH,MAAM,EAAGuzH,IAASF,EAAMI,YAAYH,EAAMtzH,MAAMuzH,EAAQ,KAE7E92H,EAAOc,EAAIwf,IAAIxL,IAAQ,GAC7B9U,EAAK0C,KAAK4pC,GACVxrC,EAAI5C,IAAI4W,EAAK9U,KAGdc,EAtBX,CAiGmC/B,EAAQ03H,WAAYp3H,KAAKm3H,cAEzCz3H,EAAQ23H,YACfr3H,KAAKyB,IAAM,IAAI4a,IACfjd,OAAOC,KAAKK,EAAQ23H,YAAY/3H,QAIhCmW,IAEI,MAAMpK,EAA4B3L,EAAoB,WAAE+V,GACrCzV,KAAS,IAAEnB,IAAI4W,EAAKb,MAAM4I,QAAQnS,GAASA,EAAQ,CAACA,OAI3ErL,KAAKyB,IAAM,KASnB,IAAI+1H,GAEA,OADAx3H,KAAK21C,OACqB31C,KAAS,IAAE+W,IAAIygH,GAQ7C,IAAIA,GACAx3H,KAAK21C,OAEL,MAAM1uC,EAAyBjH,KAAS,IAAEihB,IAAIu2G,GAC9C,OAASvwH,EAAMA,EAAI,GAAK,KAQ5B,OAAOuwH,GAEH,OADAx3H,KAAK21C,OACqB31C,KAAS,IAAEihB,IAAIu2G,IAAU,KAMvD,OAEI,OADAx3H,KAAK21C,OACE/gC,MAAM5L,KAAwBhJ,KAAS,IAAEX,QAQpD,OAAOm4H,EAAOnsH,GAAS,OAAOrL,KAAKq2B,MAAM,CAAEmhG,MAAAA,EAAOnsH,MAAAA,EAAOorH,GAAI,MAO7D,IAAIe,EAAOnsH,GAAS,OAAOrL,KAAKq2B,MAAM,CAAEmhG,MAAAA,EAAOnsH,MAAAA,EAAOorH,GAAI,MAQ1D,OAAOe,EAAOnsH,GAAS,OAAOrL,KAAKq2B,MAAM,CAAEmhG,MAAAA,EAAOnsH,MAAAA,EAAOorH,GAAI,MAM7D,WAEI,OADAz2H,KAAK21C,OACE31C,KAAKX,OACPoC,IAILgU,IAEI,MAAMmiH,EAAO53H,KAAKm3H,QAAQU,UAAUpiH,GAIpC,OAA6CzV,KAAS,IAAEihB,IAAIxL,GAAOhU,IAInE4J,GAASusH,EAAO,IAAM53H,KAAKm3H,QAAQW,YAAYzsH,IAC1CpL,KAAK,OAITQ,OAIL+2H,GAAmB,KAAVA,GACJv3H,KAAK,KAOd,MAAM4iC,GAEF,MAAMxM,EAAQ,IAAI2gG,GAAW,CAAqBG,QAASn3H,KAAKm3H,UAGhE,OAFA9gG,EAAM6gG,UAAYl3H,KAAKk3H,WAAal3H,KACpCq2B,EAAM4gG,SAAWj3H,KAAKi3H,SAAW,IAAIttH,OAAO,CAACk5B,IACtCxM,EAMX,OACqB,OAAbr2B,KAAKyB,MACLzB,KAAKyB,IAAM,IAAI4a,KAEI,OAAnBrc,KAAKk3H,YACLl3H,KAAKk3H,UAAUvhF,OACf31C,KAAKk3H,UAAU73H,OAAOC,QAItBmW,GAA0BzV,KAAS,IAAEnB,IAAI4W,EAA8DzV,KAAe,UAAM,IAAEihB,IAAIxL,KAC/GzV,KAAa,QAAEV,QAIlCujC,IACI,OAAQA,EAAO4zF,IACX,IAAK,IACL,IAAK,IAED,MAAMnsH,GAAsB,MAAdu4B,EAAO4zF,GAAgCz2H,KAAS,IAAEihB,IAAI4hB,EAAO20F,YAASthH,IAAc,GAClG5L,EAAKjH,KAAwBw/B,EAAa,OACvB7iC,KAAS,IAAEnB,IAAIgkC,EAAO20F,MAAOltH,GAChD,MACJ,IAAK,IACD,QAAqB4L,IAAjB2sB,EAAOx3B,MAeN,CACkBrL,KAAS,IAAE87F,OAAOj5D,EAAO20F,OAC5C,MAjB4B,CAE5B,IAAIltH,EAA0BtK,KAAS,IAAEihB,IAAI4hB,EAAO20F,QAAU,GAE9D,MAAMtqF,EAAM5iC,EAAKzI,QAAQghC,EAAOx3B,QACnB,IAAT6hC,GACA5iC,EAAK0P,OAAOkzB,EAAK,GAEjB5iC,EAAKxJ,OAAS,EACKd,KAAS,IAAEnB,IAAIgkC,EAAO20F,MAAOltH,GAG7BtK,KAAS,IAAE87F,OAAOj5D,EAAO20F,WAShEx3H,KAAKk3H,UAAYl3H,KAAKi3H,QAAU,OA2E5C,SAAStkH,GAActH,GACnB,MAA8B,oBAAhB8pB,aAA+B9pB,aAAiB8pB,YASlE,SAAS4iG,GAAO1sH,GACZ,MAAuB,oBAAT2sH,MAAwB3sH,aAAiB2sH,KAS3D,SAASC,GAAW5sH,GAChB,MAA2B,oBAAb6sH,UAA4B7sH,aAAiB6sH,SAa/D,MAAMC,GAOF,YAAYp6F,EAAQksC,EAAKmuD,EAAOC,GAgC5B,IAAI34H,EAkCJ,GAjEAM,KAAKiqE,IAAMA,EAQXjqE,KAAKuvC,KAAO,KAOZvvC,KAAKs4H,gBAAiB,EAItBt4H,KAAKu4H,iBAAkB,EAOvBv4H,KAAK8oE,aAAe,OACpB9oE,KAAK+9B,OAASA,EAAON,cAxF7B,SAAuBM,GACnB,OAAQA,GACJ,IAAK,SACL,IAAK,MACL,IAAK,OACL,IAAK,UACL,IAAK,QACD,OAAO,EACX,QACI,OAAO,GATnB,CA+F0B/9B,KAAK+9B,SAAas6F,GAEhCr4H,KAAKuvC,UAAkBr5B,IAAVkiH,EAAuB,EAA6B,KACjE14H,EAAU24H,GAIV34H,EAAU,EAGVA,IAEAM,KAAKs4H,iBAAmB54H,EAAQ44H,eAChCt4H,KAAKu4H,kBAAoB74H,EAAQ64H,gBAE3B74H,EAAQopE,eACV9oE,KAAK8oE,aAAeppE,EAAQopE,cAG1BppE,EAAQ02H,UACVp2H,KAAKo2H,QAAU12H,EAAQ02H,SAErB12H,EAAQ65G,SACVv5G,KAAKu5G,OAAS75G,EAAQ65G,SAIzBv5G,KAAKo2H,UACNp2H,KAAKo2H,QAAU,IAAID,IAGlBn2H,KAAKu5G,OAIL,CAGD,MAAMA,EAASv5G,KAAKu5G,OAAOxgG,WAC3B,GAAsB,IAAlBwgG,EAAOz4G,OAEPd,KAAKw4H,cAAgBvuD,MAEpB,CAGD,MAAMwuD,EAAOxuD,EAAIpoE,QAAQ,KAUzB7B,KAAKw4H,cAAgBvuD,IADC,IAAVwuD,EAAc,IAAOA,EAAOxuD,EAAInpE,OAAS,EAAI,IAAM,IAC9By4G,QAxBrCv5G,KAAKu5G,OAAS,IAAIyd,GAClBh3H,KAAKw4H,cAAgBvuD,EAgC7B,gBAEI,OAAkB,OAAdjqE,KAAKuvC,KACE,KAIP58B,GAAc3S,KAAKuvC,OAASwoF,GAAO/3H,KAAKuvC,OAAS0oF,GAAWj4H,KAAKuvC,OAC5C,iBAAdvvC,KAAKuvC,KACLvvC,KAAKuvC,KAGZvvC,KAAKuvC,gBAAgBynF,GACdh3H,KAAKuvC,KAAKx2B,WAGI,iBAAd/Y,KAAKuvC,MAA0C,kBAAdvvC,KAAKuvC,MAC7C36B,MAAM4I,QAAQxd,KAAKuvC,MACZrE,KAAKC,UAAUnrC,KAAKuvC,MAGJvvC,KAAW,KAAE+Y,WAS5C,0BAEI,OAAkB,OAAd/Y,KAAKuvC,MAIL0oF,GAAWj4H,KAAKuvC,MAHT,KAQPwoF,GAAO/3H,KAAKuvC,MACLvvC,KAAKuvC,KAAKjsC,MAAQ,KAGzBqP,GAAc3S,KAAKuvC,MACZ,KAIc,iBAAdvvC,KAAKuvC,KACL,aAGPvvC,KAAKuvC,gBAAgBynF,GACd,kDAGc,iBAAdh3H,KAAKuvC,MAA0C,iBAAdvvC,KAAKuvC,MAC7C36B,MAAM4I,QAAQxd,KAAKuvC,MACZ,mBAGJ,KAMX,MAAM1M,EAAS,IAIX,MAAM9E,EAAS8E,EAAO9E,QAAU/9B,KAAK+9B,OAE/BksC,EAAMpnC,EAAOonC,KAAOjqE,KAAKiqE,IAEzBnB,EAAejmC,EAAOimC,cAAgB9oE,KAAK8oE,aAM3Cv5B,OAAwBr5B,IAAhB2sB,EAAO0M,KAAsB1M,EAAO0M,KAAOvvC,KAAKuvC,KAIxDgpF,OAA8CriH,IAA3B2sB,EAAO01F,gBAAiC11F,EAAO01F,gBAAkBv4H,KAAKu4H,gBAEzFD,OAA4CpiH,IAA1B2sB,EAAOy1F,eAAgCz1F,EAAOy1F,eAAiBt4H,KAAKs4H,eAI5F,IAAIlC,EAAUvzF,EAAOuzF,SAAWp2H,KAAKo2H,QAEjC7c,EAAS12E,EAAO02E,QAAUv5G,KAAKu5G,OAyBnC,YAvB0BrjG,IAAtB2sB,EAAO61F,aAEPtC,EACIh3H,OAAOC,KAAKwjC,EAAO61F,YACd95H,OAAO,CAKXw3H,EAAS3rH,IAAS2rH,EAAQv3H,IAAI4L,EAAyBo4B,EAAkB,WAAEp4B,IAAS2rH,IAGzFvzF,EAAO81F,YAEPpf,EAASn6G,OAAOC,KAAKwjC,EAAO81F,WACvB/5H,OAAO,CAKX26G,EAAQie,IAAUje,EAAO16G,IAAI24H,EAA0B30F,EAAiB,UAAE20F,IAAUje,IAGlF,IAAI4e,GAAYp6F,EAAQksC,EAAK16B,EAAM,CACtCgqE,OAAAA,EAAQ6c,QAAAA,EAASkC,eAAAA,EAAgBxvD,aAAAA,EAAcyvD,gBAAAA,KAiE3D,MAAMK,GAAa,iBAAG,CAIlBC,KAAM,EAINC,eAAgB,EAIhBC,eAAgB,EAIhBC,iBAAkB,EAIlBC,SAAU,EAIVC,KAAM,UAEVN,EAAcA,EAAcC,MAAQ,OACpCD,EAAcA,EAAcE,gBAAkB,iBAC9CF,EAAcA,EAAcG,gBAAkB,iBAC9CH,EAAcA,EAAcI,kBAAoB,mBAChDJ,EAAcA,EAAcK,UAAY,WACxCL,EAAcA,EAAcM,MAAQ,SA/BjB,GAwInB,MAAMC,GAUF,YAAYxjF,EAAMyjF,EAAgB,IAAKC,EAAoB,MAGvDr5H,KAAKo2H,QAAUzgF,EAAKygF,SAAW,IAAID,GACnCn2H,KAAKs5H,YAAyBpjH,IAAhBy/B,EAAK2jF,OAAuB3jF,EAAK2jF,OAASF,EACxDp5H,KAAKu5H,WAAa5jF,EAAK4jF,YAAcF,EACrCr5H,KAAKiqE,IAAMt0B,EAAKs0B,KAAO,KAEvBjqE,KAAKw5H,GAAKx5H,KAAKs5H,QAAU,KAAOt5H,KAAKs5H,OAAS,KA8CtD,MAAMG,WAA2BN,GAK7B,YAAYxjF,EAAO,IACfsR,MAAMtR,GACN31C,KAAKsD,KAAOs1H,GAAcG,eAQ9B,MAAMl2F,EAAS,IAGX,OAAO,IAAI42F,GAAmB,CAC1BrD,QAASvzF,EAAOuzF,SAAWp2H,KAAKo2H,QAChCkD,YAA0BpjH,IAAlB2sB,EAAOy2F,OAAuBz2F,EAAOy2F,OAASt5H,KAAKs5H,OAC3DC,WAAY12F,EAAO02F,YAAcv5H,KAAKu5H,WACtCtvD,IAAKpnC,EAAOonC,KAAOjqE,KAAKiqE,UAAO/zD,KAkB3C,MAAMwjH,WAAqBP,GAKvB,YAAYxjF,EAAO,IACfsR,MAAMtR,GACN31C,KAAKsD,KAAOs1H,GAAcK,SAC1Bj5H,KAAKuvC,UAAqBr5B,IAAdy/B,EAAKpG,KAAqBoG,EAAKpG,KAAO,KAMtD,MAAM1M,EAAS,IACX,OAAO,IAAI62F,GAAa,CACpBnqF,UAAuBr5B,IAAhB2sB,EAAO0M,KAAsB1M,EAAO0M,KAAOvvC,KAAKuvC,KACvD6mF,QAASvzF,EAAOuzF,SAAWp2H,KAAKo2H,QAChCkD,YAA2BpjH,IAAlB2sB,EAAOy2F,OAAwBz2F,EAAOy2F,OAASt5H,KAAKs5H,OAC7DC,WAAY12F,EAAO02F,YAAcv5H,KAAKu5H,WACtCtvD,IAAKpnC,EAAOonC,KAAOjqE,KAAKiqE,UAAO/zD,KA0B3C,MAAMyjH,WAA0BR,GAI5B,YAAYxjF,GAERsR,MAAMtR,EAAM,EAAG,iBACf31C,KAAKyK,KAAO,oBAIZzK,KAAKw5H,IAAK,EAKNx5H,KAAKknB,QADLlnB,KAAKs5H,QAAU,KAAOt5H,KAAKs5H,OAAS,IACrB,oCAAmC3jF,EAAKs0B,KAAO,iBAI1D,6BAA6Bt0B,EAAKs0B,KAAO,oBAAoBt0B,EAAK2jF,UAAU3jF,EAAK4jF,aAEzFv5H,KAAKuB,MAAQo0C,EAAKp0C,OAAS,MAoCnC,SAASq4H,GAAQl6H,EAAS6vC,GACtB,MAAO,CACHA,KAAAA,EACA6mF,QAAS12H,EAAQ02H,QACjByD,QAASn6H,EAAQm6H,QACjBtgB,OAAQ75G,EAAQ65G,OAChB+e,eAAgB54H,EAAQ44H,eACxBxvD,aAAcppE,EAAQopE,aACtByvD,gBAAiB74H,EAAQ64H,oCAgD3BuB,EAIF,YAAYtmF,GACRxzC,KAAKwzC,QAAUA,EAgCnB,QAAQnK,EAAO4gC,EAAKvqE,EAAU,IAE1B,IAAIq6H,EAEJ,GAAI1wF,aAAiB8uF,GAGjB4B,EAAM1wF,MAEL,CAMD,IAAI+sF,OAAUlgH,EAEVkgH,EADA12H,EAAQ02H,mBAAmBD,GACjBz2H,EAAQ02H,QAGR,IAAID,GAAYz2H,EAAQ02H,SAItC,IAAI7c,OAASrjG,EACPxW,EAAQ65G,SAENA,EADA75G,EAAQ65G,kBAAkByd,GACjBt3H,EAAQ65G,OAGR,IAAIyd,GAAW,CAAqBK,WAAY33H,EAAQ65G,UAIzEwgB,EAAM,IAAI5B,GAAY9uF,EAAO,OAA4CnzB,IAAjBxW,EAAQ6vC,KAAqB7vC,EAAQ6vC,KAAO,KAAO,CACvG6mF,QAAAA,EACA7c,OAAAA,EACA+e,eAAgB54H,EAAQ44H,eAExBxvD,aAAcppE,EAAQopE,cAAgB,OACtCyvD,gBAAiB74H,EAAQ64H,kBAQjC,MAAMyB,EAAUjE,GAAGgE,GAAK7xE,KAAKjZ,GAI5B8qF,GAAQ/5H,KAAKwzC,QAAQymF,OAAOF,KAI7B,GAAI1wF,aAAiB8uF,IAAmC,WAApBz4H,EAAQm6H,QACxC,OAAOG,EAMX,MAAME,EAA0BF,EAAQ9xE,KAAK,GAI5C9G,GAAUA,aAAiBs4E,KAE5B,OAAQh6H,EAAQm6H,SAAW,QACvB,IAAK,OAMD,OAAQE,EAAIjxD,cACR,IAAK,cACD,OAAOoxD,EAAKhyE,KAAK,EAIhBjhD,IAEG,GAAiB,OAAbA,EAAIsoC,QAAmBtoC,EAAIsoC,gBAAgBpa,aAC3C,MAAM,IAAI1uB,MAAM,mCAEpB,OAAOQ,EAAIsoC,QAEnB,IAAK,OACD,OAAO2qF,EAAKhyE,KAAK,EAIhBjhD,IAEG,GAAiB,OAAbA,EAAIsoC,QAAmBtoC,EAAIsoC,gBAAgByoF,MAC3C,MAAM,IAAIvxH,MAAM,2BAEpB,OAAOQ,EAAIsoC,QAEnB,IAAK,OACD,OAAO2qF,EAAKhyE,KAAK,EAIhBjhD,IAEG,GAAiB,OAAbA,EAAIsoC,MAAqC,iBAAbtoC,EAAIsoC,KAChC,MAAM,IAAI9oC,MAAM,6BAEpB,OAAOQ,EAAIsoC,QAEnB,IAAK,OACL,QAEI,OAAO2qF,EAAKhyE,KAAK,EAIhBjhD,GAAQA,EAAIsoC,OAEzB,IAAK,WAED,OAAO2qF,EACX,QAEI,MAAM,IAAIzzH,MAAM,uCAAuC/G,EAAQm6H,aAa3E,OAAO5vD,EAAKvqE,EAAU,IAClB,OAAOM,KAAKm6H,QAAQ,SAAUlwD,EAAK,GAUvC,IAAIA,EAAKvqE,EAAU,IACf,OAAOM,KAAKm6H,QAAQ,MAAOlwD,EAAK,GAYpC,KAAKA,EAAKvqE,EAAU,IAChB,OAAOM,KAAKm6H,QAAQ,OAAQlwD,EAAK,GAsBrC,MAAMA,EAAKmwD,GACP,OAAOp6H,KAAKm6H,QAAQ,QAASlwD,EAAK,CAC9BsvC,QAAAA,IAAYyd,IAAaqD,OAAOD,EAAe,kBAC/CP,QAAS,OACT/wD,aAAc,SAatB,QAAQmB,EAAKvqE,EAAU,IACnB,OAAOM,KAAKm6H,QAAQ,UAAWlwD,EAAK,GAWxC,MAAMA,EAAK16B,EAAM7vC,EAAU,IACvB,OAAOM,KAAKm6H,QAAQ,QAASlwD,EAAK2vD,GAAQl6H,EAAS6vC,IAYvD,KAAK06B,EAAK16B,EAAM7vC,EAAU,IACtB,OAAOM,KAAKm6H,QAAQ,OAAQlwD,EAAK2vD,GAAQl6H,EAAS6vC,IAYtD,IAAI06B,EAAK16B,EAAM7vC,EAAU,IACrB,OAAOM,KAAKm6H,QAAQ,MAAOlwD,EAAK2vD,GAAQl6H,EAAS6vC,YAGzDuqF,EAAWzoE,UAAO,SAA4BlyD,GAAK,OAAO,IAAKA,GAAK26H,GAAY,GAAgB7D,MAChG6D,EAAWzqE,WAAQ,GAA0B,CAAErB,MAAO8rE,EAAYprE,QAASorE,EAAWzoE,kBAmEtF,MAAMipE,GAKF,YAAYh/F,EAAMtD,GACdh4B,KAAKs7B,KAAOA,EACZt7B,KAAKg4B,YAAcA,EAMvB,OAAO+hG,GACH,OAAO/5H,KAAKg4B,YAAYuiG,UAAUR,EAAK/5H,KAAKs7B,OAsBpD,MAAMk/F,GAAoB,IAAIhpE,GAAe,wCACvCipE,EAMF,UAAUV,EAAKz+F,GACX,OAAOA,EAAK2+F,OAAOF,WAG3BU,EAAgBppE,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAKs7H,IAC9EA,EAAgBprE,WAAQ,GAA0B,CAAErB,MAAOysE,EAAiB/rE,QAAS+rE,EAAgBppE,kBAySrG,MAAMqpE,GAAc,eAsBpB,MAAMC,uBAaAC,EACF,eAKA,QAAU,OAAO,IAAwB/xD,uBAE7C+xD,EAAWvpE,UAAO,SAA4BlyD,GAAK,OAAO,IAAKA,GAAKy7H,IACpEA,EAAWvrE,WAAQ,GAA0B,CAAErB,MAAO4sE,EAAYlsE,QAASksE,EAAWvpE,iCA4BhFwpE,EAIF,YAAYC,GACR96H,KAAK86H,WAAaA,EAOtB,OAAOf,GAGH,GAAmB,UAAfA,EAAIh8F,OACJ,MAAM,IAAIt3B,MAAM,6EAGpB,OAAO,IAAI,EAIVmiD,IAGG,MAAMggB,EAAM5oE,KAAK86H,WAAWC,QAiB5B,GAhBAnyD,EAAIpqE,KAAKu7H,EAAIh8F,OAAQg8F,EAAIvB,eACnBuB,EAAIxB,kBACN3vD,EAAI2vD,iBAAkB,GAG1BwB,EAAI3D,QAAQ92H,QAAQ,CAKnBmL,EAAMqK,IAAW8zD,EAAIoyD,iBAAiBvwH,EAAMqK,EAAO7U,KAAK,OAEpD85H,EAAI3D,QAAQr/G,IAAI,WACjB6xD,EAAIoyD,iBAAiB,SAAU,sCAG9BjB,EAAI3D,QAAQr/G,IAAI,gBAAiB,CAElC,MAAMkkH,EAAelB,EAAImB,0BAEJ,OAAjBD,GACAryD,EAAIoyD,iBAAiB,eAAgBC,GAI7C,GAAIlB,EAAIjxD,aAAc,CAElB,MAAMA,EAAeixD,EAAIjxD,aAAatiE,cAMtCoiE,EAAIE,aAAqD,SAAjBA,EAA2BA,EAAe,OAItF,MAAMqyD,EAAUpB,EAAIqB,gBAQpB,IAAIC,EAAiB,KAIrB,MAAMC,EAAiB,KAInB,GAAuB,OAAnBD,EACA,OAAOA,EAIX,MAAM/B,EAAwB,OAAf1wD,EAAI0wD,OAAkB,IAAM1wD,EAAI0wD,OAEzCC,EAAa3wD,EAAI2wD,YAAc,KAG/BnD,EAAU,IAAID,GAAYvtD,EAAI2yD,yBAI9BtxD,EA/JtB,SAAwBrB,GACpB,MAAI,gBAAiBA,GAAOA,EAAI4yD,YACrB5yD,EAAI4yD,YAEX,mBAAmB5yH,KAAKggE,EAAI2yD,yBACrB3yD,EAAI6yD,kBAAkB,iBAE1B,KAPX,CA+J2C7yD,IAAQmxD,EAAI9vD,IAGvC,OADAoxD,EAAiB,IAAI5B,GAAmB,CAAErD,QAAAA,EAASkD,OAAAA,EAAQC,WAAAA,EAAYtvD,IAAAA,IAChEoxD,GAMLK,EAAS,KAKX,IAAI,QAAEtF,EAAO,OAAEkD,EAAM,WAAEC,EAAU,IAAEtvD,GAAQqxD,IAGvC/rF,EAAO,KACI,MAAX+pF,IAEA/pF,OAAgC,IAAjBq5B,EAAII,SAA4BJ,EAAI+yD,aAAe/yD,EAAII,UAG3D,IAAXswD,IACAA,EAAW/pF,EAAO,IAAM,GAO5B,IAAIiqF,EAAKF,GAAU,KAAOA,EAAS,IAGnC,GAAyB,SAArBS,EAAIjxD,cAA2C,iBAATv5B,EAAmB,CAGzD,MAAMqsF,EAAersF,EACrBA,EAAOA,EAAKprC,QAAQu2H,GAAa,IACjC,IAEInrF,EAAgB,KAATA,EAAcrE,KAAKtpC,MAAM2tC,GAAQ,KAE5C,MAAOhuC,GAIHguC,EAAOqsF,EAGHpC,IAEAA,GAAK,EAELjqF,EAAO,CAAqBhuC,MAAAA,EAAOyiF,KAAMz0C,KAIjDiqF,GAEA5wE,EAASttB,KAAK,IAAIo+F,GAAa,CAC3BnqF,KAAAA,EACA6mF,QAAAA,EACAkD,OAAAA,EACAC,WAAAA,EACAtvD,IAAKA,QAAO/zD,KAIhB0yC,EAAS5B,YAIT4B,EAASrnD,MAAM,IAAIo4H,GAAkB,CAEjCp4H,MAAOguC,EACP6mF,QAAAA,EACAkD,OAAAA,EACAC,WAAAA,EACAtvD,IAAKA,QAAO/zD,MAQlB82F,EAILzrG,IACG,MAAM,IAAE0oE,GAAQqxD,IAEVr0H,EAAM,IAAI0yH,GAAkB,CAC9Bp4H,MAAAA,EACA+3H,OAAQ1wD,EAAI0wD,QAAU,EACtBC,WAAY3wD,EAAI2wD,YAAc,gBAC9BtvD,IAAKA,QAAO/zD,IAEhB0yC,EAASrnD,MAAM0F,IAOnB,IAAI40H,GAAc,EAIlB,MAAMC,EAIL16E,IAEQy6E,IACDjzE,EAASttB,KAAKggG,KACdO,GAAc,GAKlB,IAAIE,EAAgB,CAChBz4H,KAAMs1H,GAAcI,iBACpBgD,OAAQ56E,EAAM46E,QAGd56E,EAAM66E,mBACNF,EAAcG,MAAQ96E,EAAM86E,OAKP,SAArBnC,EAAIjxD,cAA6BF,EAAI+yD,eACrCI,EAAcI,YAAcvzD,EAAI+yD,cAGpC/yE,EAASttB,KAAKygG,IAKZK,EAILh7E,IAIG,IAAIi7E,EAAW,CACX/4H,KAAMs1H,GAAcE,eACpBkD,OAAQ56E,EAAM46E,QAId56E,EAAM66E,mBACNI,EAASH,MAAQ96E,EAAM86E,OAG3BtzE,EAASttB,KAAK+gG,IAmBlB,OAhBAzzD,EAAIl1B,iBAAiB,OAAQgoF,GAC7B9yD,EAAIl1B,iBAAiB,QAASs5D,GAE1B+sB,EAAIzB,iBAEJ1vD,EAAIl1B,iBAAiB,WAAYooF,GAEjB,OAAZX,GAAoBvyD,EAAI0zD,QACxB1zD,EAAI0zD,OAAO5oF,iBAAiB,WAAY0oF,IAIhDxzD,EAAIG,KAAK,GACTngB,EAASttB,KAAK,CAAEh4B,KAAMs1H,GAAcC,OAG7B,KAKHjwD,EAAIh1B,oBAAoB,QAASo5D,GACjCpkC,EAAIh1B,oBAAoB,OAAQ8nF,GAC5B3B,EAAIzB,iBACJ1vD,EAAIh1B,oBAAoB,WAAYkoF,GACpB,OAAZX,GAAoBvyD,EAAI0zD,QACxB1zD,EAAI0zD,OAAO1oF,oBAAoB,WAAYwoF,IAInDxzD,EAAI2zD,mBAKpB1B,EAAexpE,UAAO,SAAgClyD,GAAK,OAAO,IAAKA,GAAK07H,GAAgB,GAAgBF,MAC5GE,EAAexrE,WAAQ,GAA0B,CAAErB,MAAO6sE,EAAgBnsE,QAASmsE,EAAexpE,kBAsBlG,MAAMmrE,GAAmB,IAAIhrE,GAAe,oBAEtCirE,GAAmB,IAAIjrE,GAAe,oBAO5C,MAAMkrE,uBAeAC,EAMF,YAAYjoF,EAAK9tC,EAAU0gH,GACvBtnH,KAAK00C,IAAMA,EACX10C,KAAK4G,SAAWA,EAChB5G,KAAKsnH,WAAaA,EAClBtnH,KAAK48H,iBAAmB,GACxB58H,KAAK68H,UAAY,KAIjB78H,KAAK88H,WAAa,EAKtB,WACI,GAAsB,WAAlB98H,KAAK4G,SACL,OAAO,KAGX,MAAMm2H,EAAe/8H,KAAK00C,IAAI0yE,QAAU,GAMxC,OALI2V,IAAiB/8H,KAAK48H,mBACtB58H,KAAK88H,aACL98H,KAAK68H,UAAY,GAAkBE,EAAc/8H,KAAKsnH,YACtDtnH,KAAK48H,iBAAmBG,GAErB/8H,KAAK68H,kBAGpBF,EAAwBtrE,UAAO,SAAyClyD,GAAK,OAAO,IAAKA,GAAKw9H,GAAyB,GAAgB,IAAW,GAAgB3xB,IAAc,GAAgBwxB,MAChMG,EAAwBttE,WAAQ,GAA0B,CAAErB,MAAO2uE,EAAyBjuE,QAASiuE,EAAwBtrE,iCAsDvH2rE,EAKF,YAAYC,EAAcC,GACtBl9H,KAAKi9H,aAAeA,EACpBj9H,KAAKk9H,WAAaA,EAOtB,UAAUnD,EAAKz+F,GAEX,MAAM6hG,EAAQpD,EAAI9vD,IAAIzjE,cAKtB,GAAmB,QAAfuzH,EAAIh8F,QAAmC,SAAfg8F,EAAIh8F,QAAqBo/F,EAAMh2F,WAAW,YAClEg2F,EAAMh2F,WAAW,YACjB,OAAO7L,EAAK2+F,OAAOF,GAGvB,MAAM/rE,EAAQhuD,KAAKi9H,aAAaG,WAKhC,OAHc,OAAVpvE,GAAmB+rE,EAAI3D,QAAQr/G,IAAI/W,KAAKk9H,cACxCnD,EAAMA,EAAI1jG,MAAM,CAAE+/F,QAAS2D,EAAI3D,QAAQv3H,IAAImB,KAAKk9H,WAAYlvE,MAEzD1yB,EAAK2+F,OAAOF,WAG3BiD,EAAoB3rE,UAAO,SAAqClyD,GAAK,OAAO,IAAKA,GAAK69H,GAAqB,GAAgBN,IAAyB,GAAgBD,MACpKO,EAAoB3tE,WAAQ,GAA0B,CAAErB,MAAOgvE,EAAqBtuE,QAASsuE,EAAoB3rE,iCAuC3GgsE,EAKF,YAAYC,EAASnrE,GACjBnyD,KAAKs9H,QAAUA,EACft9H,KAAKmyD,SAAWA,EAChBnyD,KAAK+3B,MAAQ,KAMjB,OAAOgiG,GACH,GAAmB,OAAf/5H,KAAK+3B,MAAgB,CAErB,MAAMwlG,EAAev9H,KAAKmyD,SAASlxC,IAAIu5G,GAAmB,IAC1Dx6H,KAAK+3B,MAAQwlG,EAAa92F,YAAY,CAKrCnL,EAAMtD,IAAgB,IAAIsiG,GAAuBh/F,EAAMtD,GAAeh4B,KAAKs9H,SAEhF,OAAOt9H,KAAK+3B,MAAMkiG,OAAOF,WAGjCsD,EAAwBhsE,UAAO,SAAyClyD,GAAK,OAAO,IAAKA,GAAKk+H,GAAyB,GAAgBnH,IAAc,GAAgB,MACrKmH,EAAwBhuE,WAAQ,GAA0B,CAAErB,MAAOqvE,EAAyB3uE,QAAS2uE,EAAwBhsE,iCA2EvHmsE,EAKF,iBACI,MAAO,CACHx8C,SAAUw8C,EACV3uE,UAAW,CACP,CAAEiD,QAAS,GAAqByzB,SAAU,MAatD,mBAAmB7lF,EAAU,IACzB,MAAO,CACHshF,SAAUw8C,EACV3uE,UAAW,CACPnvD,EAAQ4nH,WAAa,CAAEx1D,QAAS0qE,GAAkBzqE,SAAUryD,EAAQ4nH,YAAe,GACnF5nH,EAAQw9H,WAAa,CAAEprE,QAAS2qE,GAAkB1qE,SAAUryD,EAAQw9H,YAAe,aAKnGM,EAAqBvsE,UAAO,GAAwB,CAAE3tD,KAAMk6H,IAC5DA,EAAqBluE,UAAO,GAAwB,CAAEZ,QAAS,SAAsCvvD,GAAK,OAAO,IAAKA,GAAKq+H,IAA4B3uE,UAAW,CAC1J,GACA,CAAEiD,QAAS0oE,GAAmBn1C,YAAa,GAAqBR,OAAO,GACvE,CAAE/yB,QAAS4qE,GAAwBn3C,SAAU,IAC7C,CAAEzzB,QAAS0qE,GAAkBzqE,SAAU,cACvC,CAAED,QAAS2qE,GAAkB1qE,SAAU,wCAuBzC0rE,UAENA,EAAiBxsE,UAAO,GAAwB,CAAE3tD,KAAMm6H,IACxDA,EAAiBnuE,UAAO,GAAwB,CAAEZ,QAAS,SAAkCvvD,GAAK,OAAO,IAAKA,GAAKs+H,IAAwB5uE,UAAW,CAC9I,GACA,CAAEiD,QAASmkE,GAAa1wC,SAAU,IAClC,GACA,CAAEzzB,QAASokE,GAAa7wC,YAAa,IACrC,GACA,CAAEvzB,QAAS6oE,GAAYt1C,YAAa,KACrC39C,QAAS,CAAC,CACL,GAAqBg2F,YAAY,CAC7BpW,WAAY,aACZ4V,WAAY,2BCj9FrB,MAAMS,GAA4C,IAAIthH,ICgB7D,IAAIuhH,GAAgB,SAAS5vF,EAAG9uC,GAI5B,OAHA0+H,GAAgBx+H,OAAOy+H,gBAClB,CAAEC,UAAW,cAAgBlpH,OAAS,SAAUo5B,EAAG9uC,GAAK8uC,EAAE8vF,UAAY5+H,IACvE,SAAU8uC,EAAG9uC,GAAK,IAAK,IAAIM,KAAKN,EAAOA,EAAE8Z,eAAexZ,KAAIwuC,EAAExuC,GAAKN,EAAEM,MACpDwuC,EAAG9uC,IAGrB,SAAS6+H,GAAU/vF,EAAG9uC,GAEzB,SAAS8+H,IAAOh+H,KAAKoL,YAAc4iC,EADnC4vF,GAAc5vF,EAAG9uC,GAEjB8uC,EAAE/sC,UAAkB,OAAN/B,EAAaE,OAAO4L,OAAO9L,IAAM8+H,EAAG/8H,UAAY/B,EAAE+B,UAAW,IAAI+8H,GAG5E,IAAIC,GAAW,WAQlB,OAPAA,GAAW7+H,OAAOu8B,QAAU,SAAkBx8B,GAC1C,IAAK,IAAIuC,EAAGhB,EAAI,EAAG8D,EAAI8D,UAAUxH,OAAQJ,EAAI8D,EAAG9D,IAE5C,IAAK,IAAIlB,KADTkC,EAAI4G,UAAU5H,GACOtB,OAAO6B,UAAU+X,eAAetF,KAAKhS,EAAGlC,KAAIL,EAAEK,GAAKkC,EAAElC,IAE9E,OAAOL,IAEKmU,MAAMtT,KAAMsI,YAezB,SAAS41H,GAAWC,EAAYt6F,EAAQpuB,EAAKk4B,GAChD,IAA2HK,EAAvHlvC,EAAIwJ,UAAUxH,OAAQywC,EAAIzyC,EAAI,EAAI+kC,EAAkB,OAAT8J,EAAgBA,EAAOvuC,OAAOwuC,yBAAyB/J,EAAQpuB,GAAOk4B,EACrH,GAAuB,iBAAZywF,SAAoD,mBAArBA,QAAQC,SAAyB9sF,EAAI6sF,QAAQC,SAASF,EAAYt6F,EAAQpuB,EAAKk4B,QACpH,IAAK,IAAIjtC,EAAIy9H,EAAWr9H,OAAS,EAAGJ,GAAK,EAAGA,KAASstC,EAAImwF,EAAWz9H,MAAI6wC,GAAKzyC,EAAI,EAAIkvC,EAAEuD,GAAKzyC,EAAI,EAAIkvC,EAAEnK,EAAQpuB,EAAK87B,GAAKvD,EAAEnK,EAAQpuB,KAAS87B,GAChJ,OAAOzyC,EAAI,GAAKyyC,GAAKnyC,OAAOmb,eAAespB,EAAQpuB,EAAK87B,GAAIA,EAWzD,SAAS+sF,GAAU9qH,EAAS+qH,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIliH,WAAAA,SAAoBpU,EAASm5B,GAC/C,SAASq9F,EAAUrzH,GAAS,IAAM+nB,EAAKqrG,EAAUnjG,KAAKjwB,IAAW,MAAOoH,GAAK4uB,EAAO5uB,IACpF,SAASksH,EAAStzH,GAAS,IAAM+nB,EAAKqrG,EAAiB,MAAEpzH,IAAW,MAAOoH,GAAK4uB,EAAO5uB,IACvF,SAAS2gB,EAAK1rB,GAJlB,IAAe2D,EAIa3D,EAAO6zB,KAAOrzB,EAAQR,EAAO2D,QAJ1CA,EAIyD3D,EAAO2D,MAJhDA,aAAiBmzH,EAAInzH,EAAQ,IAAImzH,GAAAA,SAAYt2H,GAAWA,EAAQmD,OAIT2+C,KAAK00E,EAAWC,GAClGvrG,GAAMqrG,EAAYA,EAAUnrH,MAAME,EAAS+qH,GAAc,KAAKjjG,WAI/D,SAASsjG,GAAYprH,EAAS+7B,GACjC,IAAsG9pC,EAAG0qC,EAAGhxC,EAAG0/H,EAA3Gz6H,EAAI,CAAE06H,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAP5/H,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,IAAO6/H,KAAM,GAAIC,IAAK,IAChG,OAAOJ,EAAI,CAAEvjG,KAAM4jG,EAAK,GAAI,MAASA,EAAK,GAAI,OAAUA,EAAK,IAAwB,mBAAXzlH,SAA0BolH,EAAEplH,OAAOW,UAAY,WAAa,OAAOpa,OAAU6+H,EACvJ,SAASK,EAAK16H,GAAK,OAAO,SAAU6zC,GAAK,OACzC,SAAco+E,GACV,GAAIhxH,EAAG,MAAM,IAAI9F,UAAU,mCAC3B,KAAOyE,GAAG,IACN,GAAIqB,EAAI,EAAG0qC,IAAMhxC,EAAY,EAARs3H,EAAG,GAAStmF,EAAU,OAAIsmF,EAAG,GAAKtmF,EAAS,SAAOhxC,EAAIgxC,EAAU,SAAMhxC,EAAEuU,KAAKy8B,GAAI,GAAKA,EAAE7U,SAAWn8B,EAAIA,EAAEuU,KAAKy8B,EAAGsmF,EAAG,KAAKl7F,KAAM,OAAOp8B,EAE3J,OADIgxC,EAAI,EAAGhxC,IAAGs3H,EAAK,CAAS,EAARA,EAAG,GAAQt3H,EAAEkM,QACzBorH,EAAG,IACP,KAAK,EAAG,KAAK,EAAGt3H,EAAIs3H,EAAI,MACxB,KAAK,EAAc,OAAXryH,EAAE06H,QAAgB,CAAEzzH,MAAOorH,EAAG,GAAIl7F,MAAM,GAChD,KAAK,EAAGn3B,EAAE06H,QAAS3uF,EAAIsmF,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKryH,EAAE66H,IAAIv7H,MAAOU,EAAE46H,KAAKt7H,MAAO,SACxC,QACI,MAAkBvE,GAAZA,EAAIiF,EAAE46H,MAAYl+H,OAAS,GAAK3B,EAAEA,EAAE2B,OAAS,KAAkB,IAAV21H,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEryH,EAAI,EAAG,SACjG,GAAc,IAAVqyH,EAAG,MAAct3H,GAAMs3H,EAAG,GAAKt3H,EAAE,IAAMs3H,EAAG,GAAKt3H,EAAE,IAAM,CAAEiF,EAAE06H,MAAQrI,EAAG,GAAI,MAC9E,GAAc,IAAVA,EAAG,IAAYryH,EAAE06H,MAAQ3/H,EAAE,GAAI,CAAEiF,EAAE06H,MAAQ3/H,EAAE,GAAIA,EAAIs3H,EAAI,MAC7D,GAAIt3H,GAAKiF,EAAE06H,MAAQ3/H,EAAE,GAAI,CAAEiF,EAAE06H,MAAQ3/H,EAAE,GAAIiF,EAAE66H,IAAI57H,KAAKozH,GAAK,MACvDt3H,EAAE,IAAIiF,EAAE66H,IAAIv7H,MAChBU,EAAE46H,KAAKt7H,MAAO,SAEtB+yH,EAAKlnF,EAAK77B,KAAKF,EAASpP,GAC1B,MAAOqO,GAAKgkH,EAAK,CAAC,EAAGhkH,GAAI09B,EAAI,EAAK,QAAU1qC,EAAItG,EAAI,EACtD,GAAY,EAARs3H,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAEprH,MAAOorH,EAAG,GAAKA,EAAG,QAAK,EAAQl7F,MAAM,GApB9E,CADqD,CAAC/2B,EAAG6zC,MC9E7D,MAAM8mF,GAAwB,CAE5B,WAAY,WAAY,UACxB,WAAY,YAAa,cAAe,oBAAqB,uBAAwB,KACrF,WAAY,WAAY,UAAW,UAAW,YAAa,YASvDC,GAA6B,CACjC,WAAY,WAAY,UACxB,WAAY,YAAa,cAAe,oBAAqB,8BAA+B,uBAAwB,KACpH,WAAY,WAAY,UAAW,UAAW,YAAa,WAAY,aAAc,qBAWjFC,GAAkB,CACtB,WAAY,WAAY,YAAa,UAAW,aAAc,WAE1DC,GAAY,CAChB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,eAkC9BC,GAAa,CACxB,kBAAmB,CACjBC,kBAAmB,IAErB,wCAAyC,CACvCA,kBAAmB,CACjB,kBAAmB,mBACnB,aAAc,eAAgB,cAC9B,aAAc,uBAGlB,wCAAyC,CACvCA,kBAAmB,CACjB,iBAAkB,uBAGtB,uBAAwB,CACtBA,kBAAmB,IAErB,4BAA6B,CAC3BA,kBAAmB,CAAC,mBAEtB,8BAA+B,CAC7BA,kBAAmB,CACjB,mBAAoB,oBACpB,cAAe,gBAAiB,eAChC,2BAyBJ,iCAAkC,CAChCA,kBAAmB,CAEjB,yBAA0B,0BAS9B,6BAA8B,CAC5BA,kBAAmB,CACjB,mBAAoB,oBACpB,cAAe,gBAAiB,eAChC,2BAyBJ,UAAW,CACTA,kBAAmB,CAAC,iBAAkB,sBAExC,sBAAuB,CACrBA,kBAAmB,CAAC,oBAAqB,4BAE3C,qBAAsB,CACpBA,kBAAmB,CAAC,gBAAiB,4BAEvC,cAAe,CACbA,kBAAmB,CAAC,gBAAiB,QAAS,eAOhD,aAAc,CACZA,kBAAmB,CAAC,gBAAiB,oBAAqB,iCAAkC,mBAG9F,iBAAkB,CAChBA,kBAAmB,CAAC,gBAAiB,oBAAqB,iCAAkC,mBAE9F,mBAAoB,CAClBA,kBAAmB,CAAC,gBAAiB,oBAAqB,iCAAkC,mBAE9F,cAAe,CACbC,YAAa,mBACbD,kBAAmB,CAAC,gBAAiB,cAAe,2BAA4B,mBAElF,uBAAwB,CACtBA,kBAAmB,IAErB,qBAAsB,CACpBA,kBAAmB,CAAC,oBAAqB,iBACzCC,YAAa,cAEf,iBAAkB,CAChBD,kBAAmB,CAAC,mBAAoB,iBACxCC,YAAa,cAEf,oBAAqB,CACnBD,kBAAmB,CAAC,WAAY,aAAc,oBAAqB,UAAW,YAAa,WAAY,YAGzG,qBAAsB,CACpBA,kBAAmB,CAAC,WAAY,aAAc,oBAAqB,UAAW,WAAY,WAC1FC,YAAa,qBAGf,gCAAiC,CAC/BD,kBAAmB,CAAC,iCAAkC,sCAGxD,6BAA8B,CAC5BA,kBAAmB,CAAC,iCAAkC,sCAGxD,uBAAwB,CACtBA,kBAAmB,CAAC,WAAY,WAAY,UAAW,YAAa,WAAY,YAGlF,kBAAmB,CACjBA,kBAAmB,CAAC,WAAY,YAAa,UAAW,WAAY,eAEtE,iBAAkB,CAChBC,YAAa,aACbD,kBAAmB,CAAC,gBAAiB,cAAe,2BAA4B,mBAIlF,eAAgB,CACdE,UAAW,EACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,EACXF,kBAAmBL,IAErB,qBAAsB,CACpBO,UAAW,EACXF,kBAAmBL,IAErB,6BAA8B,CAC5BO,UAAW,EACXF,kBAAmBL,IAErB,qBAAsB,CACpBO,UAAW,EACXF,kBAAmBL,IAErB,6BAA8B,CAC5BO,UAAW,EACXF,kBAAmBL,IAErB,gBAAiB,CACfO,UAAW,EACXF,kBAAmBL,IAErB,wBAAyB,CACvBO,UAAW,EACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,EACXF,kBAAmBL,IAErB,+BAAgC,CAC9BO,UAAW,EACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,EACXF,kBAAmBL,IAErB,+BAAgC,CAC9BO,UAAW,EACXF,kBAAmBL,IAErB,0BAA2B,CACzBO,UAAW,EACXF,kBAAmBL,IAErB,uCAAwC,CACtCO,UAAW,EACXF,kBAAmBL,IAErB,kCAAmC,CACjCO,UAAW,EACXF,kBAAmBL,IAErB,eAAgB,CACdO,UAAW,EACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,EACXF,kBAAmBL,IAErB,gBAAiB,CACfO,UAAW,EACXF,kBAAmBL,IAErB,wBAAyB,CACvBO,UAAW,EACXF,kBAAmBL,IAErB,gBAAiB,CACfO,UAAW,GACXF,kBAAmBL,IAErB,wBAAyB,CACvBO,UAAW,GACXF,kBAAmBL,IAErB,kBAAmB,CACjBO,UAAW,GACXF,kBAAmBL,IAErB,0BAA2B,CACzBO,UAAW,GACXF,kBAAmBL,IAErB,kCAAmC,CACjCO,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UAAW,WAAY,YAAa,UAAW,oBAAqB,gBAAiB,KAC7G,WAAY,WAAY,UAAW,UAAW,YAAa,aAG/D,iBAAkB,CAChBE,UAAW,GACXF,kBAAmBL,IAErB,yBAA0B,CACxBO,UAAW,GACXF,kBAAmBL,IAErB,yCAA0C,CACxCO,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UAAW,WAAY,YAAa,UAAW,oBAAqB,gBAAiB,KAC7G,WAAY,WAAY,UAAW,UAAW,YAAa,aAG/D,gBAAiB,CACfE,UAAW,GACXF,kBAAmBL,IAErB,wBAAyB,CACvBO,UAAW,GACXF,kBAAmBL,IAErB,yBAA0B,CACxBO,UAAW,GACXF,kBAAmBL,IAErB,iCAAkC,CAChCO,UAAW,GACXF,kBAAmBL,IAErB,eAAgB,CACdO,UAAW,GACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,GACXF,kBAAmBL,IAErB,eAAgB,CACdO,UAAW,GACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,GACXF,kBAAmBL,IAErB,cAAe,CACbO,UAAW,GACXF,kBAAmBL,IAErB,sBAAuB,CACrBO,UAAW,GACXF,kBAAmBL,IAErB,eAAgB,CACdO,UAAW,GACXF,kBAAmBL,IAErB,4BAA6B,CAC3BO,UAAW,GACXF,kBAAmBL,IAErB,sBAAuB,CACrBO,UAAW,GACXF,kBAAmBL,IAErB,4BAA6B,CAC3BO,UAAW,GACXF,kBAAmBL,IAErB,oCAAqC,CACnCO,UAAW,GACXF,kBAAmBL,IAErB,uBAAwB,CACtBO,UAAW,GACXF,kBAAmBL,IAErB,oCAAqC,CACnCO,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,YAAa,UAAW,oBAAqB,uBAAwB,UAAW,WACxG,UAAW,WAAY,UAAW,YAAa,WAAY,YAG/D,+BAAgC,CAC9BE,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,YAAa,UAAW,oBAAqB,uBAAwB,UAAW,WACxG,UAAW,WAAY,UAAW,YAAa,WAAY,YAG/D,4BAA6B,CAC3BE,UAAW,GACXF,kBAAmBL,IAErB,oCAAqC,CACnCO,UAAW,GACXF,kBAAmBL,IAErB,qCAAsC,CACpCO,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UAAW,WAAY,YAAa,UAAW,oBACvE,uBAAwB,KAAM,WAAY,WAAY,UAAW,UAAW,YAC5E,WAAY,kCAGhB,gBAAiB,CACfE,UAAW,GAEXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,gBAMvG,6BAA8B,CAC5BE,UAAW,GAKXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,gBAGvG,uBAAwB,CACtBE,UAAW,GACXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,gBAGvG,sBAAuB,CACrBE,UAAW,GACXF,kBAAmB,CACjB,YAAa,WAAY,WAAY,WAAY,uBACjD,UAAW,WAAY,UAAW,YAAa,WAAY,UAC3D,UAAW,WAAY,oBAAqB,OAGhD,8BAA+B,CAC7BE,UAAW,GACXF,kBAAmB,CACjB,YAAa,WAAY,WAAY,WAAY,uBACjD,UAAW,WAAY,UAAW,YAAa,WAAY,UAC3D,UAAW,WAAY,oBAAqB,OAGhD,qBAAsB,CACpBE,UAAW,GACXF,kBAAmBL,IAErB,6BAA8B,CAC5BO,UAAW,GACXF,kBAAmBL,IAErB,4BAA6B,CAC3BO,UAAW,GACXF,kBAAmBJ,IAErB,+BAAgC,CAC9BM,UAAW,GACXF,kBAAmBJ,IAErB,0BAA2B,CACzBM,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UACxB,WAAY,YAAa,UAAW,oBAAqB,uBAAwB,KACjF,WAAY,WAAY,UAAW,UAAW,YAAa,WAAY,gBAG3E,cAAe,CACbC,YAAa,4BACbC,UAAW,GAEXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,gBAGvG,2BAA4B,CAC1BC,YAAa,+BACbC,UAAW,GAEXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,gBAGvG,sBAAuB,CACrBC,YAAa,0BACbC,UAAW,GAEXF,kBAAmB,CACjB,WAAY,eAAgB,gBAAiB,WAAY,UAAW,oBAAqB,WAAY,UACrG,YAAa,WAAY,UAAW,QAAS,UAAW,YAAa,WAAY,iBAAkB,cAAe,gBAGtH,iBAAkB,CAChBE,UAAW,GAEXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,KAC1E,iBAAkB,qBAGtB,yBAA0B,CACxBE,UAAW,GAEXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,KAC1E,iBAAkB,mBAAoB,gBAG1C,yBAA0B,CACxBE,UAAW,GAEXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,YAAa,oBACvF,iBAAkB,qBAGtB,yBAA0B,CAExBA,kBAAmB,CAAC,eAAgB,gBAAiB,QAAS,cAAe,YAG/E,wBAAyB,CACvBA,kBAAmB,CAAC,eAAgB,gBAAiB,cAAe,gBAAiB,sBAAuB,YAE9G,8BAA+B,CAC7BA,kBAAmB,CAAC,eAAgB,gBAAiB,cAAe,gBAAiB,iBAAkB,YAGzG,eAAgB,CACdE,UAAW,GACXF,kBA5hBiB,CACnB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,KAAM,mBAChF,iBAAkB,mBAAoB,qBAyhBtC,uBAAwB,CACtBE,UAAW,GACXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,KAAM,mBAChF,iBAAkB,mBAAoB,mBAAoB,gBAG9D,uBAAwB,CACtBE,UAAW,GACXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,gCAAiC,iBAAkB,sBAAuB,KAAM,mBAChF,iBAAkB,mBAAoB,mBAAoB,YAAa,sBAG3E,sBAAuB,CACrBE,UAAW,GACXF,kBA7iBwB,CAC1B,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,iBAAkB,sBAAuB,KAAM,mBAC/C,iBAAkB,mBAAoB,qBA0iBtC,8BAA+B,CAC7BE,UAAW,GACXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACxG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACzC,iBAAkB,sBAAuB,KAAM,mBAC/C,iBAAkB,mBAAoB,mBAAoB,gBAG5D,0BAA2B,CACzBE,UAAW,GACXF,kBAAmBL,IAErB,kCAAmC,CACjCO,UAAW,GACXF,kBAAmBL,IAErB,0BAA2B,CACzBM,YAAa,0BACbC,UAAW,GACXC,QAAS,EACTH,kBAAmB,CAAC,WAAY,WAAY,YAAa,QAAS,UAAW,YAE/E,yBAA0B,CACxBC,YAAa,kCACbC,UAAW,GACXF,kBAAmBH,IAErB,0BAA2B,CACzBI,YAAa,0BACbC,UAAW,GACXF,kBAAmBH,IAErB,2BAA4B,CAC1BI,YAAa,uBACbC,UAAW,GACXF,kBAAmBH,IAErB,0CAA2C,CACzCI,YAAa,8BACbC,UAAW,GACXF,kBAloBkC,CACpC,WAAY,WAAY,UACxB,WAAY,YAAa,cAAe,oBAAqB,uBAAwB,KACrF,WAAY,WAAY,UAAW,UAAW,YAAa,WAAY,eAioBvE,kCAAmC,CACjCC,YAAa,8BACbC,UAAW,GACXF,kBAAmBF,IAErB,kDAAmD,CACjDG,YAAa,sCACbC,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UACxB,eAAgB,YAAa,cAAe,YAAa,oBAAqB,uBAC9E,WAAY,WAAY,UAAW,UAAW,YAAa,WAAY,UAG3E,sDAAuD,CACrDC,YAAa,sCACbC,UAAW,GACXF,kBAAmBF,IAErB,+CAAgD,CAC9CG,YAAa,mCACbC,UAAW,GACXF,kBAAmB,CACjB,WAAY,WAAY,UACxB,WAAY,YAAa,UAAW,oBAAqB,uBAAwB,KACjF,WAAY,WAAY,UAAW,UAAW,YAAa,WAAY,SAG3E,mDAAoD,CAClDC,YAAa,mCACbC,UAAW,GACXF,kBAAmB,CACjB,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UACtG,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cAAe,SAG5D,4CAA6C,CAC3CE,UAAW,GACXF,kBAAmBL,IAErB,iDAAkD,CAChDO,UAAW,GACXF,kBAAmBL,IAErB,wDAAyD,CACvDO,UAAW,GACXF,kBAAmB,CAAC,WAAY,WAAY,UAC1C,WAAY,YAAa,UAAW,oBAAqB,uBAAwB,KACjF,WAAY,WAAY,UAAW,UAAW,YAAa,WAC3D,uBAAwB,+BAAgC,8BAE5D,wCAAyC,CACvCC,YAAa,4CACbC,UAAW,GACXF,kBAAmBF,IAErB,gDAAiD,CAC/CG,YAAa,4CACbC,UAAW,GACXF,kBAAmBF,IAErB,qDAAsD,CACpDG,YAAa,iDACbC,UAAW,GACXF,kBAAmBF,IAErB,4DAA6D,CAC3DG,YAAa,wDACbC,UAAW,GACXF,kBAAmB,CAAC,YAAa,eAAgB,gBAAiB,UAAW,WAAY,WAAY,oBAAqB,UAC1H,WAAY,YAAa,WAAY,UAAW,QAChD,UAAW,WAAY,iBAAkB,cACvC,uBAAwB,+BAAgC,8BAE5D,oCAAqC,CACnCC,YAAa,UACbD,kBAAmB,CAAC,gBAAiB,YAAa,cAEpD,4BAA6B,CAC3BA,kBAAmB,CAAC,gBAAiB,gBAEvC,yBAA0B,CACxBA,kBAAmB,CAAC,gBAEtB,8BAA+B,CAC7BA,kBAAmB,CACjB,gBAAiB,qBAAsB,2BAA4B,iBAAkB,qBAGzF,yCAA0C,CACxCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iDAAkD,CAChDA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wCAAyC,CACvCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uCAAwC,CACtCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,gCAAiC,CAC/BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wCAAyC,CACvCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,+BAAgC,CAC9BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,8BAA+B,CAC7BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,0BAA2B,CACzBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,oCAAqC,CACnCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,2BAA4B,CAC1BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uBAAwB,CACtBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,0CAA2C,CACzCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,4CAA6C,CAC3CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,mCAAoC,CAClCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,gCAAiC,CAC/BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,0CAA2C,CACzCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uBAAwB,CACtBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,oDAAqD,CACnDA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,2CAA4C,CAC1CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,mCAAoC,CAClCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,2CAA4C,CAC1CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,4CAA6C,CAC3CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAI/D,uCAAwC,CACtCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,qCAAsC,CACpCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,+CAAgD,CAC9CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,sCAAuC,CACrCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAM/D,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uBAAwB,CACtBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,0BAA2B,CACzBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,oCAAqC,CACnCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,mCAAoC,CAClCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,2CAA4C,CAC1CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,4CAA6C,CAC3CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,0BAA2B,CACzBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uCAAwC,CACtCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAI/D,kDAAmD,CACjDA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,gDAAiD,CAC/CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,0DAA2D,CACzDA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iDAAkD,CAChDA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAK/D,gCAAiC,CAC/BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,8BAA+B,CAC7BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,wCAAyC,CACvCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,+BAAgC,CAC9BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAK/D,qCAAsC,CACpCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,mCAAoC,CAClCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,6CAA8C,CAC5CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,oCAAqC,CACnCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAM/D,uCAAwC,CACtCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,qCAAsC,CACpCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,+CAAgD,CAC9CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,sCAAuC,CACrCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAK/D,2CAA4C,CAC1CA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,kCAAmC,CACjCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,mCAAoC,CAClCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,4BAA6B,CAC3BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uCAAwC,CACtCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,yBAA0B,CACxBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,iCAAkC,CAChCA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,wBAAyB,CACvBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,gBAG/D,uBAAwB,CACtBA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,+BAAgC,CAC9BA,kBAAmB,CACjB,YAAa,QAAS,SAAU,QAAS,iBAAkB,YAAa,gBAG5E,oCAAqC,CACnCA,kBAAmB,IAErB,sDAAuD,CACrDA,kBAAmB,CACjB,sBAAuB,aAAc,SAAU,cAAe,kBAIlE,kCAAmC,CACjCA,kBAAmB,IAErB,oDAAqD,CACnDA,kBAAmB,IAErB,oCAAqC,CACnCA,kBAAmB,CAAC,WAEtB,2CAA4C,CAC1CA,kBAAmB,CAAC,uCAEtB,8CAA+C,CAC7CC,YAAa,0CACbD,kBAAmB,CAAC,mBAAoB,uBAE1C,+CAAgD,CAC9CC,YAAa,0CACbD,kBAAmB,CAAC,mBAAoB,qBAAsB,mBAEhE,iCAAkC,CAChCA,kBAAmB,IAErB,yDAA0D,CACxDA,kBAAmB,CAAC,2CAEtB,wDAAyD,CAEvDA,kBAAmB,CAAC,uBAAwB,6BAE9C,uDAAwD,CACtDA,kBAAmB,CAAC,wBAGxBl+H,QAAQwtC,IAAIywF,ICrsCL,MAAMK,GAAe,CAC1BC,WAAY,aACZlgF,QAAS,UACTmgF,IAAK,MACLC,IAAK,MACLC,SAAU,WACVC,WAAY,aACZC,UAAW,YACXC,YAAa,cACbC,GAAI,KACJC,WAAY,aACZC,OAAQ,SACRC,cAAe,gBACfC,WAAY,aACZC,YAAa,cACbC,IAAK,MACLC,gBAAiB,kBACjBC,mBAAoB,qBACpBC,QAAS,UACTj7C,KAAM,ICjBR,IAAYk7C,GAAZ,SAAYA,UACV,EAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,cAAA,GAAA,gBACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,gBAAA,GAAA,kBACA,EAAA,EAAA,cAAA,GAAA,gBACA,EAAA,EAAA,QAAA,GAAA,UACA,EAAA,EAAA,YAAA,GAAA,cACA,EAAA,EAAA,cAAA,GAAA,gBACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,SAAA,GAAA,WAVUA,EAAZ,CAcC,IAEM,MAAMC,GAAe,CAI1BC,MAAO,CACLpzH,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,SAEhBC,WAAY,CACVxzH,OAAQkzH,GAAYG,cACpBC,UAAW,aACXC,aAAc,cAEhBE,yBAA0B,CACxBzzH,OAAQkzH,GAAYQ,aACpBJ,UAAW,eACXC,aAAc,4BAEhBI,+BAAgC,CAC9B3zH,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,4BAEhBK,YAAa,CACX5zH,OAAQkzH,GAAYQ,aACpBJ,UAAW,cACXC,aAAc,eAEhBM,kBAAmB,CACjB7zH,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,eAEhBO,kBAAmB,CACjB9zH,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,eAEhBQ,iBAAkB,CAChB/zH,OAAQkzH,GAAYG,cACpBC,UAAW,OACXC,aAAc,eAEhBS,SAAU,CACRh0H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaE,IACxBqB,aAAc,YAEhBW,aAAc,CACZl0H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaa,YACxBU,aAAc,YAEhBY,iBAAkB,CAChBn0H,OAAQkzH,GAAYvB,WACpB2B,UAAW,mBACXC,aAAc,YAEhBa,cAAe,CACbp0H,OAAQkzH,GAAYQ,aACpBJ,UAAW,WACXC,aAAc,YAOhBc,UAAW,CACTr0H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAajgF,QACxBwhF,aAAc,aAEhBe,cAAe,CACbt0H,OAAQkzH,GAAYqB,WACpBjB,UAAW,gCACXC,aAAc,aAEhBiB,cAAe,CACbx0H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaS,WACxBc,aAAc,aAEhBkB,kBAAmB,CACjBz0H,OAAQkzH,GAAYvB,WACpB2B,UAAW,oBACXC,aAAc,aAEhBmB,eAAgB,CACd10H,OAAQkzH,GAAYQ,aACpBJ,UAAW,MACXC,aAAc,aAEhBoB,gBAAiB,CACf30H,OAAQkzH,GAAYG,cACpBC,UAAW,cACXC,aAAc,aAEhBqB,QAAS,CACP50H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaG,IACxBoB,aAAc,WAEhBsB,cAAe,CACb70H,OAAQkzH,GAAYG,cACpBC,UAAW,cACXC,aAAc,WAEhBuB,YAAa,CACX90H,OAAQkzH,GAAYqB,WACpBjB,UAAW,aACXC,aAAc,WAEhBwB,eAAgB,CACd/0H,OAAQkzH,GAAY8B,cACpB1B,UAAW,cACXC,aAAc,kBAEhB0B,cAAe,CACbj1H,OAAQkzH,GAAY8B,cACpB1B,UAAW,wBACXC,aAAc,uBAEhB2B,kBAAmB,CACjBl1H,OAAQkzH,GAAY8B,cACpB1B,UAAW,yBACXC,aAAc,4BAEhB4B,wBAAyB,CACvBn1H,OAAQkzH,GAAYG,cACpBC,UAAW,uBACXC,aAAc,eAEhB6B,kBAAmB,CACjBp1H,OAAQkzH,GAAY8B,cACpB1B,UAAW,cACXC,aAAc,qBAEhB8B,+BAAgC,CAC9Br1H,OAAQkzH,GAAY8B,cACpB1B,UAAW,mBACXC,aAAc,aACd+B,QAAS,IAEXC,kCAAmC,CACjCv1H,OAAQkzH,GAAY8B,cACpB1B,UAAW,sBACXC,aAAc,gBACd+B,QAAS,IAEXE,WAAY,CACVx1H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaI,SACxBmB,aAAc,aACd+B,QAAS,OAEXG,eAAgB,CACdz1H,OAAQkzH,GAAYG,cACpBC,UAAW,MACXC,aAAc,cAEhBmC,kBAAmB,CACjB11H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,oBACXC,aAAc,cAEhBqC,8BAA+B,CAC7B51H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,gCACXC,aAAc,iBAEhBsC,YAAa,CACX71H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,cACXC,aAAc,eAEhBuC,cAAe,CACb91H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaO,YACxBgB,aAAc,gBACd+B,QAAS,OAEXS,kBAAmB,CACjB/1H,OAAQkzH,GAAYG,cACpBC,UAAW,MACXC,aAAc,iBAEhByC,GAAI,CACFh2H,OAAQkzH,GAAYqB,WACpBjB,UAAW,KACXC,aAAc,MAEhB0C,MAAO,CACLj2H,OAAQkzH,GAAYQ,aACpBJ,UAAW,QACXC,aAAc,QACd+B,QAAS,SAsBXY,WAAY,CACVl2H,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,SAEhB4C,cAAe,CACbn2H,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,YAEhB6C,SAAU,CACRp2H,OAAQkzH,GAAY8B,cACpB1B,UAAW,iBACXC,aAAc,YAEhB8C,aAAc,CACZr2H,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,WAEhB+C,SAAU,CACRt2H,OAAQkzH,GAAY8B,cACpB1B,UAAW,mBACXC,aAAc,YAEhBgD,aAAc,CACZv2H,OAAQkzH,GAAYG,cACpBC,UAAW,OACXC,aAAc,YAEhBiD,QAAS,CACPx2H,OAAQkzH,GAAY8B,cACpB1B,UAAW,cACXC,aAAc,WAEhBkD,SAAU,CACRz2H,OAAQkzH,GAAYvB,WACpB2B,UAAW,YACXC,aAAc,YAEhB5yF,OAAQ,CACN3gC,OAAQkzH,GAAYyC,gBACpBrC,UAAW,SACXC,aAAc,SACd+B,QAAS,KAEXoB,SAAU,CACR12H,OAAQkzH,GAAYG,cACpBC,UAAW,WACXC,aAAc,UAEhBoD,QAAS,CACP32H,OAAQkzH,GAAYG,cACpBC,UAAW,UACXC,aAAc,UAEhBxB,QAAS,CACP/xH,OAAQkzH,GAAYG,cACpBC,UAAW,UACXC,aAAc,UAEhBqD,QAAS,CACP52H,OAAQkzH,GAAYG,cACpBC,UAAW,UACXC,aAAc,WAEhBsD,QAAS,CACP72H,OAAQkzH,GAAY4D,YACpBxD,UAAW,UACXC,aAAc,WAEhBnpE,UAAW,CACTpqD,OAAQkzH,GAAY4D,YACpBxD,UAAW,YACXC,aAAc,aAEhBwD,SAAU,CACR/2H,OAAQkzH,GAAY4D,YACpBxD,UAAW,WACXC,aAAc,YAEhByD,UAAW,CACTh3H,OAAQkzH,GAAYG,cACpBC,UAAW,YACXC,aAAc,aAEhB0D,uBAAwB,CACtBj3H,OAAQkzH,GAAYG,cACpBC,UAAW,yBACXC,aAAc,0BAEhB2D,QAAS,CACPl3H,OAAQkzH,GAAYG,cACpBC,UAAW,UACXC,aAAc,WAEhB4D,UAAW,CACTn3H,OAAQkzH,GAAYG,cACpBC,UAAW,YACXC,aAAc,aAEhB6D,UAAW,CACTp3H,OAAQkzH,GAAYG,cACpBC,UAAW,YACXC,aAAc,aAEhB8D,UAAW,CACTr3H,OAAQkzH,GAAYe,QACpBX,UAAWtB,GAAaiB,QACxBM,aAAc,YACd+B,QAAS,OAEXgC,cAAe,CACbt3H,OAAQkzH,GAAYG,cACpBC,UAAW,MACXC,aAAc,aAEhBgE,eAAgB,CACdv3H,OAAQkzH,GAAYG,cACpBC,UAAW,iBACXC,aAAc,kBAEhBiE,SAAU,CACRx3H,OAAQkzH,GAAYG,cACpBC,UAAW,WACXC,aAAc,YAEhBkE,GAAI,CACFz3H,OAAQkzH,GAAYG,cACpBC,UAAW,KACXC,aAAc,MAEhBmE,UAAW,CACT13H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,YACXC,aAAc,MAEhBoE,KAAM,CACJ33H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,OACXC,aAAc,QAOhBqE,MAAO,CACL53H,OAAQkzH,GAAYG,cACpBC,UAAW,QACXC,aAAc,SAEhBsE,qBAAsB,CACpB73H,OAAQkzH,GAAYqB,WACpBjB,UAAW,uBACXC,aAAc,YAEhBuE,sBAAuB,CACrB93H,OAAQkzH,GAAYqB,WACpBjB,UAAW,wBACXC,aAAc,aAEhBwE,cAAe,CACb/3H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,WACXC,aAAc,YAEhByE,kBAAmB,CACjBh4H,OAAQkzH,GAAYqB,WACpBjB,UAAW,yBACXC,aAAc,aACd+B,QAAS,OAEX2C,4BAA6B,CAC3Bj4H,OAAQkzH,GAAYqB,WACpBjB,UAAW,yBACXC,aAAc,YACd+B,QAAS,OAEX4C,qBAAsB,CACpBl4H,OAAQkzH,GAAYqB,WACpBjB,UAAW,0BACXC,aAAc,gBACd+B,QAAS,OAEX6C,iBAAkB,CAChBn4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,sBACXC,aAAc,YACd+B,QAAS,OAEX+C,eAAgB,CACdr4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,oBACXC,aAAc,WACd+B,QAAS,OAEXgD,oBAAqB,CACnBt4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,2BACXC,aAAc,iBACd+B,QAAS,OAEXiD,iBAAkB,CAChBv4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,wBACXC,aAAc,YACd+B,QAAS,OAEXkD,iBAAkB,CAChBx4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,wBACXC,aAAc,YACd+B,QAAS,OAEXmD,iBAAkB,CAChBz4H,OAAQkzH,GAAYkF,cACpB9E,UAAW,wBACXC,aAAc,YACd+B,QAAS,OAEXoD,8BAA+B,CAC7B14H,OAAQkzH,GAAYkF,cACpB9E,UAAW,qCACXC,aAAc,yBACd+B,QAAS,OAEXqD,eAAgB,CACd34H,OAAQkzH,GAAYkF,cACpB9E,UAAW,sBACXC,aAAc,UACd+B,QAAS,OAEXsD,qBAAsB,CACpB54H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,KACXC,aAAc,MAEhBsF,6BAA8B,CAC5B74H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,aACXC,aAAc,cAEhBuF,0BAA2B,CACzB94H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,cACXC,aAAc,WAEhBwF,mBAAoB,CAClB/4H,OAAQkzH,GAAY8B,cACpB1B,UAAW,qBACXC,aAAc,sBAEhByF,gBAAiB,CACfh5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,kBACXC,aAAc,gBAEhB0F,iBAAkB,CAChBj5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,mBACXC,aAAc,iBAEhB2F,iBAAkB,CAChBl5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,kBACXC,aAAc,eAEhB4F,kBAAmB,CACjBn5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,mBACXC,aAAc,gBAEhB6F,sBAAuB,CACrBp5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,uBACXC,aAAc,qBAEhB8F,YAAa,CACXr5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,cACXC,aAAc,WAEhB+F,cAAe,CACbt5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,gBACXC,aAAc,aAEhBgG,aAAc,CACZv5H,OAAQkzH,GAAYqB,WACpBjB,UAAW,eACXC,aAAc,YAEhBiG,uBAAwB,CACtBx5H,OAAQkzH,GAAY8B,cACpB1B,UAAW,qBACXC,aAAc,sBAEhBkG,eAAgB,CACdz5H,OAAQkzH,GAAYqB,WACpBjB,UAAWtB,GAAaI,SACxBmB,aAAc,cACd+B,QAAS,KAEXoE,WAAY,CACV15H,OAAQkzH,GAAYqB,WACpBjB,UAAW,UACXC,aAAc,WAEhBoG,aAAc,CACZ35H,OAAQkzH,GAAYqB,WACpBjB,UAAW,YACXC,aAAc,aAEhBqG,YAAa,CACX55H,OAAQkzH,GAAYqB,WACpBjB,UAAW,WACXC,aAAc,YAEhBsG,YAAa,CACX75H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,cACXC,aAAc,eAEhBuG,UAAW,CACT95H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,YACXC,aAAc,aAEhBwG,UAAW,CACT/5H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,YACXC,aAAc,aAEhByG,mBAAoB,CAClBh6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,WACXC,aAAc,YAEhB0G,yBAA0B,CACxBj6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,iBACXC,aAAc,kBAEhB2G,eAAgB,CACdl6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,OACXC,aAAc,QAEhB4G,iBAAkB,CAChBn6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,SACXC,aAAc,UAEhB6G,YAAa,CACXp6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,cACXC,aAAc,eAEhB8G,eAAgB,CACdr6H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,cACXC,aAAc,eAEhB+G,SAAU,CACRt6H,OAAQkzH,GAAYG,cACpBC,UAAW,aACXC,aAAc,UAEhBgH,SAAU,CACRv6H,OAAQkzH,GAAYG,cACpBC,UAAW,UACXC,aAAc,OAEhBiH,SAAU,CACRx6H,OAAQkzH,GAAYG,cACpBC,UAAW,cACXC,aAAc,WAEhBkH,mBAAoB,CAClBz6H,OAAQkzH,GAAYwH,SACpBpH,UAAW,qBACXC,aAAc,mBAEhBoH,UAAW,CACT36H,OAAQkzH,GAAYwH,SACpBpH,UAAW,qBACXC,aAAc,UAEhBqH,WAAY,CACV56H,OAAQkzH,GAAYwH,SACpBpH,UAAW,UACXC,aAAc,WAEhBsH,MAAO,CACL76H,OAAQkzH,GAAYwH,SACpBpH,UAAW,KACXC,aAAc,MAEhBuH,OAAQ,CACN96H,OAAQkzH,GAAYwH,SACpBpH,UAAW,MACXC,aAAc,OAEhBwH,YAAa,CACX/6H,OAAQkzH,GAAYwH,SACpBpH,UAAW,WACXC,aAAc,WAEhByH,cAAe,CACbh7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,aACXC,aAAc,cAEhB0H,OAAQ,CACNj7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,MACXC,aAAc,OAEhB2H,MAAO,CACLl7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,KACXC,aAAc,MAEhB4H,oBAAqB,CACnBn7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,sBACXC,aAAc,UAEhB6H,iBAAkB,CAChBp7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,mBACXC,aAAc,iBAEhB8H,mBAAoB,CAClBr7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,qBACXC,aAAc,mBAEhB+H,eAAgB,CACdt7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,iBACXC,aAAc,eAEhBgI,qBAAsB,CACpBv7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,uBACXC,aAAc,qBAEhBiI,uCAAwC,CACtCx7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,iCACXC,aAAc,eAEhBkI,mCAAoC,CAClCz7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,6BACXC,aAAc,eAEhBmI,4BAA6B,CAC3B17H,OAAQkzH,GAAYyC,gBACpBrC,UAAW,8BACXC,aAAc,+BAEhBoI,eAAgB,CACd37H,OAAQkzH,GAAYwH,SACpBpH,UAAW,gBACXC,aAAc,kBAEhBqI,yBAA0B,CACxB57H,OAAQkzH,GAAYwH,SACpBpH,UAAW,OACXC,aAAc,4BAEhBsI,mBAAoB,CAClB77H,OAAQkzH,GAAYwH,SACpBpH,UAAW,iBACXC,aAAc,mBAEhBuI,UAAW,CACT97H,OAAQkzH,GAAYwH,SACpBpH,UAAW,eACXC,aAAc,UAEhBwI,YAAa,CACX/7H,OAAQkzH,GAAYwH,SACpBpH,UAAW,UACXC,aAAc,aCptBLF,GAAgB,CAC3BD,MAAO,MACPI,WAAY,QACZoD,QAAS,WACT5C,SAAU,UACVK,UAAW,MACX2B,GAAI,GACJM,SAAU,EACVI,SAAU,GACVC,QAAS,EACT5E,QAAS,EACTiK,MAAO,QACPC,KAAM,OACNC,YAAa,GACbluF,IAAK,MACLmuF,WAAY,MACZ9E,UAAW,MACXO,MAAO,QACPX,uBAAwB,OACxBO,SAAU,GACVD,eAAgB,GAChBE,GAAI,GACJL,UAAW,OACXF,QAAS,OACTF,UAAW,OACXG,UAAW,OACXiF,qBAAsB,IACtBC,WAAY,SACZC,QAAS,MACTC,YAAa,MACb9yH,YAAa,ICvBR,IAAA,GAAA,YAAM+yH,EAHb,cAIU,KAAAC,SAAW,EACX,KAAAC,oBAAsB,GACtB,KAAAC,kBAAoB,GACpB,KAAAC,sBAAwB,GACxB,KAAAC,kBAAoB,CAC1B1K,IAAK,cAGP,eAAexvG,EAAUm6G,EAAiB,GAAIC,EAAQ,MACpD,MAAM/oD,EAAW,SAAW5hF,KAAKqqI,SAKjC,OAJArqI,KAAKsqI,oBAAoB1oD,GAAYrxD,EACrCvwB,KAAKuqI,kBAAkB3oD,GAAY8oD,EACnC1qI,KAAKwqI,sBAAsB5oD,GAAY+oD,EAEhC/oD,EAGT,mBAAmByoD,GAIjB,cAHOrqI,KAAKsqI,oBAAoBD,UACzBrqI,KAAKuqI,kBAAkBF,UACvBrqI,KAAKwqI,sBAAsBH,GAC3BrqI,KAOT,iBAAiB4qI,EAAW,IAC1B,IAAK,MAAMC,KAAWD,EAChBC,KAAW7qI,KAAKyqI,mBAClBzqI,KAAK8qI,iBAAiB,CAAC9qI,KAAKyqI,kBAAkBI,KAGlD,IAAK,MAAMp1H,KAAOzV,KAAKsqI,oBACrB,GAAItqI,KAAKsqI,oBAAoBtxH,eAAevD,GAAM,CAChD,MAAM8a,EAAWvwB,KAAKsqI,oBAAoB70H,GAEtCzV,KAAK+qI,4BAA4Bt1H,EAAKm1H,IASxCr6G,EAAS9a,GAIf,OAAOzV,KAGT,eACE,OAAOA,KAAKsqI,oBAGd,gCAAgCpJ,GAC9B,MAAM8J,EAAmB,GACzB,IAAK,MAAMC,KAAmBlK,GACxBA,GAAa/nH,eAAeiyH,IAAoBlK,GAAakK,GAAiB/J,YAAcA,GAC9F8J,EAAiB3nI,KAAK4nI,GAG1B,OAAOD,EAGC,4BAA4Bv1H,EAAKm1H,GAEzC,GAAwB,IAApBA,EAAS9pI,OACX,OAAO,EAET,IAAK,MAAMoqI,KAAoBlrI,KAAKuqI,kBAAkB90H,GACpD,GAAIy1H,KAAoBlrI,KAAKuqI,kBAAkB90H,IAEzCm1H,EAASxnH,SADSpjB,KAAKuqI,kBAAkB90H,GAAKy1H,IAEhD,OAAO,EAKb,OAAO,gDAnFEd,2BAAAA,EAAqB,QAArBA,EAAqB,UAAA,WAFpB,YAEP,GCGA,GAAA,YAAMe,EAWX,YACUC,EACAC,GADA,KAAAD,KAAAA,EACA,KAAAC,sBAAAA,EAZF,KAAAC,QAAU,OACV,KAAA9kF,aAAe,KACf,KAAA+kF,cAAe,EAEf,KAAAC,UAAmB,GACnB,KAAAC,aAAsB,GACtB,KAAAC,gBAAyB,GACzB,KAAAC,gBAAyB,GACzB,KAAAC,cAAe,EAOvB,SACE,OAAO5rI,KAAKurI,aAGd,oBACE,OAAOvrI,KAAK4rI,aAGd,kBACE,OAAK5rI,KAAKurI,aAIHvrI,KAAKurI,aAHHvrI,KAAK6rI,WAMhB,WACE,MAAMC,EAAW,IAAI9U,GAAW,CAC9BK,WAAY,CACViU,QAAStrI,KAAKsrI,WAGZlV,EAAU,IAAID,GA8DpB,OA7DAn2H,KAAKwmD,aAAexmD,KAAKorI,KAAKz7F,KAAK2nE,GAA6B,aAAcw0B,EAAU,CACtF1V,QAASA,EACTttD,aAAc,OACdyvD,iBAAiB,EACjBsB,QAAS,aAEX75H,KAAKwmD,aAAa8B,UAChB0gB,IAEE,MAAM+iE,EAAe7gG,KAAKtpC,MAAMonE,EAASotD,QAAQn1G,IAAI,aAC/C+qH,EAAiB9gG,KAAKtpC,MAAMonE,EAASotD,QAAQn1G,IAAI,iBACvDjhB,KAAK4rI,cAAmC,IAAnBI,EACrB,IAAK,MAAMv2H,KAAOs2H,EACZt2H,KAAOs2H,GAAwB,UAARt2H,IACzBs2H,EAAat2H,GAAO+xG,mBAAmBukB,EAAat2H,IAAMtR,QAAQ,MAAO,MAuC7E,MApC2B,KAAvB4nI,EAAalI,QACfkI,EAAalI,MAAQ,SAEW,KAA9BkI,EAAaE,eACfF,EAAaE,aAAe,SAEG,MAA7BF,EAAaG,cACfH,EAAaG,YAAc,QAEI,MAA7BH,EAAaG,cACfH,EAAaG,YAAc,SAE7BlsI,KAAKmsI,SAAWJ,EAqBhB/rI,KAAKurI,cAAe,EACpBvrI,KAAKosI,gBAEEpsI,KAAKurI,cAEdhqI,IACED,QAAQwtC,IAAIvtC,GACZvB,KAAKurI,cAAe,EACbvrI,KAAKurI,eAGTvrI,KAAKwmD,aAGd,gBACE,IAAK,MAAM9lD,KAAKV,KAAKwrI,UACnB,GAAI9qI,KAAKV,KAAKwrI,UAAW,CACvB,MAAMj7G,EAAWvwB,KAAKwrI,UAAU9qI,GAC5BV,KAAK0rI,gBAAgBhrI,IACjBV,KAAK0rI,gBAAgBhrI,KAAMV,KAAK2rI,kBACpC3rI,KAAK2rI,gBAAgB3rI,KAAK0rI,gBAAgBhrI,IAAM,IAElDV,KAAK2rI,gBAAgB3rI,KAAK0rI,gBAAgBhrI,IAAI2C,KAAKktB,KAEnDA,IACIvwB,KAAKyrI,aAAa/qI,IAAMV,KAAKyrI,aAAa/qI,KAAMV,KAAK2rI,iBACvD3rI,KAAKqsI,cAAcrsI,KAAKyrI,aAAa/qI,MAO/C,cAAc4rI,GACZ,GAAIA,KAAOtsI,KAAK2rI,gBACd,IAAK,MAAMY,KAAgBvsI,KAAK2rI,gBAAgBW,GAC9CC,IAKN,cACE,OAAOvsI,KAAKmsI,SAGP,OAAO57G,EAAU+7G,EAAM,KAAME,EAAS,MAU3C,OATAxsI,KAAKwrI,UAAUnoI,KAAKktB,GACpBvwB,KAAKyrI,aAAapoI,KAAKipI,GACvBtsI,KAAK0rI,gBAAgBroI,KAAKmpI,GACtBxsI,KAAKmsI,WACP57G,IACI+7G,GACFtsI,KAAKqsI,cAAcC,IAGhBtsI,mDAhJEmrI,GAAqB,GAAA,IAAA,GAAA,6BAArBA,EAAqB,QAArBA,EAAqB,UAAA,WAFpB,YAEP,GCHA,GAAA,YAAMsB,EAGX,YAAsBpB,GAAA,KAAAA,sBAAAA,EAFd,KAAAqB,iBAAmB,GAW3B,UAAUj3H,EAAKpK,GAEb,IAAIy/H,GAAmB,EACnB9qI,KAAK0sI,iBAAiBj3H,KAASpK,IACjCy/H,GAAmB,GAErB9qI,KAAK0sI,iBAAiBj3H,GAAOpK,EAEzBy/H,GACF9qI,KAAKqrI,sBAAsBP,iBAAiB,CAACr1H,IAIjD,UAAUA,GACR,OAAIzV,KAAK0sI,iBAAiB1zH,eAAevD,GAChCzV,KAAK0sI,iBAAiBj3H,GAExB,KAGT,YAAYA,GACV,QAAIzV,KAAK0sI,iBAAiB1zH,eAAevD,iDAjChCg3H,GAAoB,GAAA,6BAApBA,EAAoB,QAApBA,EAAoB,UAAA,WAFnB,YAEP,GCPA,MAAME,GAAgB,CAC3BC,cAAe,CACbC,SAAU,CACR,CAAEC,WAAY,kBACd,CAAEA,WAAY,cACd,CAAEA,WAAY,wBAGlBC,uBAAwB,CACtBF,SAAU,CACR,CAAEC,WAAY,uBAGlBE,yBAA0B,CACxBH,SAAU,CACR,CAAEC,WAAY,wBACd,CAAEA,WAAY,qBAGlBG,UAAW,CACTJ,SAAU,CACR,CAAEC,WAAY,kBACd,CAAEA,WAAY,kBACd,CAAEA,WAAY,6BCrBpB,IAAYI,GAAZ,SAAYA,UAAsB,EAAA,EAAA,MAAA,GAAA,QAAO,EAAA,EAAA,GAAA,GAAA,KAAI,EAAA,EAAA,OAAA,GAAA,SAAQ,EAAA,EAAA,SAAA,GAAA,WAAU,EAAA,EAAA,eAAA,GAAA,iBAAnDA,EAAZ,CAA8E,IAClEC,GAAZ,SAAYA,UAAkB,EAAA,EAAA,UAAA,GAAA,YAAW,EAAA,EAAA,SAAA,GAAA,WAAU,EAAA,EAAA,YAAA,GAAA,cAAa,EAAA,EAAA,WAAA,GAAA,aAAY,EAAA,EAAA,aAAA,GAAA,eAAhEA,EAAZ,CAAyF,ICIlF,IAAA,GAAA,YAAMC,EAOX,YAAsB/B,GAAA,KAAAA,sBAAAA,EANd,KAAAqB,iBAAmB,GAG3B,KAAAlB,UAAY,GACZ,KAAA6B,iBAAmB,GAInB,UAAU53H,EAAKpK,EAAOiiI,GAAa,GAEjC,IAAIxC,GAAmB,EACnB9qI,KAAK0sI,iBAAiBj3H,KAASpK,IACjCy/H,GAAmB,GAErB9qI,KAAK0sI,iBAAiBj3H,GAAOpK,EAEzBy/H,IAAqBwC,GACvBttI,KAAKqrI,sBAAsBP,iBAAiB,CAACr1H,IAG/CzV,KAAKutI,uBAGP,UAAU93H,GACR,OAAIzV,KAAK0sI,iBAAiB1zH,eAAevD,GAChCzV,KAAK0sI,iBAAiBj3H,GAExB,KAGT,YAAYA,GACV,QAAIzV,KAAK0sI,iBAAiB1zH,eAAevD,GAM3C,UACE,MAAMpW,EAAO,GACb,IAAK,MAAMoW,KAAOzV,KAAK0sI,iBACjB1sI,KAAK0sI,iBAAiB1zH,eAAevD,IACvCpW,EAAKgE,KAAKoS,GAGd,OAAOpW,EAGT,sBACE,OAAOW,KAAK0sI,iBAGd,eAGE,OADA1sI,KAAKqrI,sBAAsBP,iBAAiB9qI,KAAKwtI,WAC1CxtI,KAGT,eACE,IAAK,MAAMyV,KAAOzV,KAAKwtI,UACrBxtI,KAAKytI,UAAUh4H,EAAK,MAQtB,OANAzV,KAAK0tI,wBAAwB,cAC7B1tI,KAAK0tI,wBAAwB,iBAC7B1tI,KAAK0tI,wBAAwB,aAC7B1tI,KAAK0tI,wBAAwB,WAC7B1tI,KAAK0tI,wBAAwB,kBAC7B1tI,KAAK0tI,wBAAwB,oBACtB1tI,KAGF,mBAAmBuwB,GAExB,OADAvwB,KAAKqtI,iBAAiBhqI,KAAKktB,GACpBvwB,KAGT,uBACE,IAAK,MAAMuwB,KAAYvwB,KAAKqtI,iBAC1B98G,IAEF,OAAOvwB,KAGF,SAASyV,EAAK8a,GAEnB,OADAvwB,KAAKwrI,UAAU/1H,GAAO8a,EACfvwB,KAGF,oBAAoByV,GAEzB,cADOzV,KAAKwrI,UAAU/1H,GACfzV,KAGF,wBAAwByV,EAAK2J,EAAO,MACzC,IAAK,MAAMuuH,KAAQ3tI,KAAKwrI,UAClBxrI,KAAKwrI,UAAUxyH,eAAe20H,IAASA,IAASl4H,IAElD8a,EADiBvwB,KAAKwrI,UAAUmC,IACvBvuH,GAGb,OAAOpf,mDApGEotI,GAAoB,GAAA,6BAApBA,EAAoB,QAApBA,EAAoB,UAAA,WAFnB,YAEP,GCFA,GAAA,YAAMQ,EAKX,cAFA,KAAApC,UAAY,GAIZ,UAAU/1H,GAGR,OAFAzV,KAAK6tI,kBAAoBp4H,EACzBzV,KAAK8qI,mBACE9qI,KAGT,yBACE,OAAOA,KAAK6tI,kBAGd,YAAYt9G,GAEV,OADAvwB,KAAKwrI,UAAUnoI,KAAKktB,GACbvwB,KAGT,mBACE,IAAK,MAAMuwB,KAAYvwB,KAAKwrI,UAC1Bj7G,IAEF,OAAOvwB,mDA1BE4tI,2BAAAA,EAAkB,QAAlBA,EAAkB,UAAA,WAFjB,YAEP,GCmBA,GAAA,YAAME,EAwDX,YACUzC,EACA0C,EACAC,EACAC,EACA7C,GAJA,KAAAC,sBAAAA,EACA,KAAA0C,KAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,mBAAAA,EACA,KAAA7C,KAAAA,EA5DV,KAAA8C,mBAAoB,EAEpB,KAAAv3B,OAASg2B,GAET,KAAAwB,aAAe,GACf,KAAAC,QAAU,GACV,KAAAC,SAAW,GACX,KAAAxK,OAAQ,EACR,KAAAoI,cAAe,EACf,KAAAC,aAAc,EAed,KAAAoC,YAAc,GACd,KAAAC,QAAU,GACV,KAAAC,aAAe,GAEf,KAAAC,SAAW,MACX,KAAAC,cAAgB,GAChB,KAAAC,kBAAmB,EAEnB,KAAAC,QAAU,MACV,KAAAC,aAAe,GACf,KAAAC,iBAAkB,EAElB,KAAAC,sBAAwB,GACxB,KAAAC,kBAAoB,GACpB,KAAAC,uBAAyB,GAEzB,KAAAC,eAAiB,GACjB,KAAAC,WAAa,GACb,KAAAC,gBAAkB,GAElB,KAAAC,eAAiB,MACjB,KAAAC,oBAAsB,GAEtB,KAAA9D,UAAY,GAKZ,KAAA+D,gBAAkB,KAClB,KAAAC,mBAAqB,KAUrB,cACExvI,KAAK+tI,KAAK0B,OAAO,KACf,MAAMtD,EAAWnsI,KAAK+tI,KAAK2B,cAE3B1vI,KAAKmuI,aAAehC,EAASvK,SAC7B5hI,KAAKouI,QAAUjC,EAASwD,IACxB3vI,KAAKquI,SAAWlC,EAASyD,UAAY,IAAMzD,EAAS0D,SAEpD7vI,KAAK6jI,MAAQsI,EAAStI,MACtB7jI,KAAKisI,aAAeE,EAASF,aAC7BjsI,KAAKksI,YAAcC,EAASD,YAE5B,MAAM4D,EAAuB9vI,KAAKkuI,kBASlC,GADAluI,KAAK+vI,sBAAqB,IACmE,IAAzF,CAAC,MAAO,UAAW,aAAc,MAAO,cAAcluI,QAAQsqI,EAAS6D,aAAqB,CAC9F,IAAIv6H,EAAM,GACV,OAAQ02H,EAAS6D,aACf,IAAK,MACHv6H,EAAMmqH,GAAaE,IACnB,MACF,IAAK,UACHrqH,EAAMmqH,GAAajgF,QACnB,MACF,IAAK,aACHlqC,EAAMmqH,GAAaC,WACnB,MACF,IAAK,aACHpqH,EAAMmqH,GAAaY,WACnB,MACF,IAAK,MACH/qH,EAAMmqH,GAAaG,IAGvB//H,KAAKiwI,iBAAiBx6H,EAAK02H,EAASoC,QAASpC,EAAS+D,kBAEtDlwI,KAAKiwI,iBAAiBrQ,GAAaE,IAAK9/H,KAAKmuI,aAAcnuI,KAAKquI,UAKlE,GADAruI,KAAK+vI,sBAAqB,IACsC,IAA5D,CAAC,aAAc,OAAOluI,QAAQsqI,EAASgE,gBAAwB,CACjE,IAAI16H,EAAM,GACV,OAAQ02H,EAASgE,gBACf,IAAK,aACH16H,EAAMmqH,GAAae,gBACnB,MACF,IAAK,MACHlrH,EAAMmqH,GAAaG,IAGvB//H,KAAKiwI,iBAAiBx6H,EAAK02H,EAASiE,WAAYjE,EAASkE,qBAChDrwI,KAAKisI,aACdjsI,KAAKiwI,iBAAiBrQ,GAAae,gBAAiB3gI,KAAKouI,QAASpuI,KAAKquI,UAEvEruI,KAAKiwI,iBAAiBrQ,GAAagB,mBAAoB5gI,KAAKmuI,aAAcnuI,KAAKquI,UAEjFruI,KAAK+vI,qBAAqBD,IACzB,kBACH9vI,KAAKswI,uBAGP,oBAAoBjlI,GAClBrL,KAAK2uI,iBAAmBtjI,EAG1B,mBAAmBA,GACjBrL,KAAK8uI,gBAAkBzjI,EAGzB,qBAAqBA,GAGnB,OADArL,KAAKkuI,kBAAoB7iI,EAClBrL,KAGT,uBACE,OAAOA,KAAKkuI,kBAMd,iBAAiBz4H,GAgBf,MACMu3H,EAA2B,CAACpN,GAAaO,YAAaP,GAAaQ,IACzE,GAAIpgI,KAAK2uI,kBAAoBl5H,IAAQmqH,GAAaI,UAA8B,QAAlBhgI,KAAKyuI,UAAsBzuI,KAAKyuI,WAE1FzuI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBsB,UACnEzuI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,cAEzE,MAAO,GAGX,GAAIxwI,KAAK8uI,iBAAmBr5H,IAAQmqH,GAAaM,WAA8B,QAAjBlgI,KAAK4uI,SAAqB5uI,KAAK4uI,SACvF5uI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,aACxE,MAAO,GAGX,GAAIxwI,KAAKkuI,kBAAmB,CAC1B,GACGz4H,IAAQmqH,GAAaO,aAA0C,KAA3BngI,KAAKgvI,mBACtCv5H,IAAQmqH,GAAaI,UAA8B,KAAlBhgI,KAAKyuI,SAE1C,MAAO,MAET,GAAIh5H,IAAQmqH,GAAaI,SAAAA,CACvB,GACEhgI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBsB,UACnEzuI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,aAEzE,OAAOxwI,KAAKyuI,cAET,IAA+C,IAA3CzB,EAAyBnrI,QAAQ4T,IAAezV,KAAK+uI,wBAA0Bt5H,EAAAA,CACxF,GAAIzV,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBsD,YACxE,OAAOzwI,KAAKgvI,uBAET,GAAIhvI,KAAKsuI,cAAgB74H,EAC9B,OAAOzV,KAAKuuI,YAET,CACL,GAAI3O,GAAaG,MAAQtqH,GAAOzV,KAAKkvI,iBAAmBtP,GAAaG,IACnE,OAAO//H,KAAKmvI,WAEd,GAAIvP,GAAaS,aAAe5qH,GAAOzV,KAAKkvI,iBAAmBtP,GAAae,gBAC1E,OAAO3gI,KAAKmvI,WAEd,GAAIvP,GAAaa,cAAgBhrH,GAAOzV,KAAKkvI,iBAAmBtP,GAAagB,mBAC3E,OAAO5gI,KAAKmvI,WAEd,GAAIvP,GAAaiB,UAAYprH,EAC3B,OAAOzV,KAAKqvI,eAGhB,MAAO,GAGT,kBACE,OACErvI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,cACnExwI,KAAK2uI,kBAAoB3uI,KAAKyuI,UAA8B,QAAlBzuI,KAAKyuI,SAE3C,CACLnrI,KAAMs8H,GAAaI,SACnB30H,MAAOrL,KAAKyuI,SACZ3P,MAAO9+H,KAAK0uI,eAEL1uI,KAAKkuI,kBACP,CACL5qI,KAAMtD,KAAKsuI,YACXjjI,MAAOrL,KAAKuuI,QACZzP,MAAO9+H,KAAKwuI,cAGP,CACLlrI,KAAMtD,KAAKkvI,eACX7jI,MAAOrL,KAAKmvI,WACZrQ,MAAO9+H,KAAKovI,iBAKlB,kBAGE,GAAIpvI,KAAKkuI,mBAAqBluI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,aAAc,CAChH,GACExwI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBsB,UACnEzuI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBqD,aAEzE,MAAO,CACLltI,KAAMs8H,GAAaI,SACnB30H,MAAOrL,KAAKyuI,SACZ3P,MAAO9+H,KAAK0uI,eAGhB,GAAI1uI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBsD,YACxE,MAAO,CACLntI,KAAMtD,KAAK+uI,sBACX1jI,MAAOrL,KAAKgvI,kBACZlQ,MAAO9+H,KAAKivI,6BAGX,GAAIjvI,KAAKiuI,mBAAmBsC,2BAA6BpD,GAAiBuD,WAC/E,MAAO,CACLptI,KAAMs8H,GAAaiB,QACnBx1H,MAAOrL,KAAKqvI,eACZvQ,MAAO9+H,KAAKsvI,qBAGhB,OAAO,KAGT,gBAAgB75H,GAGd,OAAIzV,KAAKkuI,kBACHz4H,IAAQmqH,GAAaI,SAChBhgI,KAAK0uI,eACwC,IAJvB,CAAC9O,GAAaO,YAAaP,GAAaQ,IAInCv+H,QAAQ4T,GACnCzV,KAAKivI,uBAELjvI,KAAKwuI,aAEL5O,GAAaG,MAAQtqH,EACvBzV,KAAKovI,gBAEP,GAGT,iBAAiB35H,EAAKpK,EAAOyzH,GAI3B,MAAMkO,EAA2B,CAACpN,GAAaO,YAAaP,GAAaQ,IACrEpgI,KAAKkuI,kBACHz4H,IAAQmqH,GAAaI,UACvBhgI,KAAKyuI,SAAWpjI,EAChBrL,KAAK0uI,cAAgB5P,EACrB9+H,KAAKswI,yBAC+C,IAA3CtD,EAAyBnrI,QAAQ4T,IAC1CzV,KAAK+uI,sBAAwBt5H,EAC7BzV,KAAKgvI,kBAAoB3jI,EACzBrL,KAAKivI,uBAAyBnQ,EAC9B9+H,KAAKswI,yBAELtwI,KAAKsuI,YAAc74H,EACnBzV,KAAKuuI,QAAUljI,EACfrL,KAAKwuI,aAAe1P,EAEpB9+H,KAAKyuI,SAAW,MAChBzuI,KAAK0uI,cAAgB,GACrB1uI,KAAK+uI,sBAAwB,GAC7B/uI,KAAKgvI,kBAAoB,GACzBhvI,KAAKivI,uBAAyB,GAC9BjvI,KAAKswI,uBAELtwI,KAAK2wI,YAAY3wI,KAAKuuI,QAASvuI,KAAKwuI,aAAcxuI,KAAKsuI,eAGpDtuI,KAAKisI,cAAgBjsI,KAAKksI,aAAelsI,KAAK6jI,QAAUpuH,IAAQmqH,GAAagB,oBAChF5gI,KAAKkvI,eAAiBz5H,EACtBzV,KAAKmvI,WAAa9jI,EAClBrL,KAAKovI,gBAAkBtQ,EACvB9+H,KAAK4wI,eAAe5wI,KAAKmvI,WAAYnvI,KAAKovI,gBAAiB,cAC3D35H,EAAMmqH,GAAaa,aACVzgI,KAAKisI,cAAgBx2H,IAAQmqH,GAAae,iBACnD3gI,KAAKkvI,eAAiBz5H,EACtBzV,KAAKmvI,WAAa9jI,EAClBrL,KAAKovI,gBAAkBtQ,EACvB9+H,KAAK4wI,eAAe5wI,KAAKmvI,WAAYnvI,KAAKovI,gBAAiB,cAC3D35H,EAAMmqH,GAAaS,YACVrgI,KAAKksI,aAAez2H,IAAQmqH,GAAaG,KAClD//H,KAAKkvI,eAAiBz5H,EACtBzV,KAAKmvI,WAAa9jI,EAClBrL,KAAKovI,gBAAkBtQ,EACvB9+H,KAAK4wI,eAAe5wI,KAAKmvI,WAAYnvI,KAAKovI,gBAAiB,SACjDpvI,KAAKisI,cAAiBjsI,KAAK6jI,OAAUpuH,IAAQmqH,GAAae,gBAO3DlrH,IAAQmqH,GAAaiB,SAE9B7gI,KAAKqvI,eAAiBhkI,EACtBrL,KAAKsvI,oBAAsBxQ,EAC3BrpH,EAAMmqH,GAAaiB,UAEnB7gI,KAAKkvI,eAAiBtP,GAAac,IACnC1gI,KAAKmvI,WAAanvI,KAAKmuI,aACvBnuI,KAAKovI,gBAAkBtQ,EACvBrpH,EAAMmqH,GAAaa,YACnBzgI,KAAK4wI,eAAe,GAAI,GAAI,MAf5B5wI,KAAKkvI,eAAiBtP,GAAae,gBACnC3gI,KAAKmvI,WAAanvI,KAAKouI,QACvBpuI,KAAKovI,gBAAkB,mBACvB35H,EAAMmqH,GAAaS,WACnBrgI,KAAK4wI,eAAe5wI,KAAKmvI,WAAYnvI,KAAKovI,gBAAiB,eAmB/DpvI,KAAKqrI,sBAAsBP,iBAAiB,CAACr1H,IAC7CzV,KAAK6wI,8BAGP,YAAYC,EAAaC,EAAiBC,GAGxC,MAAMC,EAAiB/lG,KAAKC,UAAU,CAAC3rC,EAAGsxI,EAAaI,GAAIH,EAAiBI,GAAIH,IAChF,GAAIhxI,KAAKuvI,kBAAoB0B,GAAkBjxI,KAAKuvI,gBAAiB,CACnE,MAAMpD,EAAqBnsI,KAAK+tI,KAAK2B,cACjCvD,GAAa,aAAcA,GAC7BnsI,KAAKoxI,QAAQ,CACXC,QAASlF,EAASvK,SAClBiC,MAAO,QACP0K,QAASuC,EACTQ,YAAaP,EACbf,YAAagB,IAInBhxI,KAAKuvI,gBAAkB0B,EAEzB,eAAeH,EAAaC,EAAiBC,GAG3C,MAAMC,EAAiB/lG,KAAKC,UAAU,CAAC3rC,EAAGsxI,EAAaI,GAAIH,EAAiBI,GAAIH,IAChF,GAAIhxI,KAAKwvI,qBAAuByB,GAAkBjxI,KAAKwvI,mBAAoB,CACzE,MAAMrD,EAAqBnsI,KAAK+tI,KAAK2B,cACjCvD,GAAa,aAAcA,GAC7BnsI,KAAKoxI,QAAQ,CACXC,QAASlF,EAASvK,SAClBiC,MAAO,OACP0K,QAASuC,EACTQ,YAAaP,EACbf,YAAagB,IAInBhxI,KAAKwvI,mBAAqByB,EAG5B,QAAQ13B,GACN,MAAMuyB,EAAW,IAAI9U,GAAW,CAC9BK,WAAY,CACVsT,MAAOrzB,2BACP3nE,KAAMzE,KAAKC,UAAUouE,MAGnBg4B,EAAc,IAAIpb,GAEHn2H,KAAKorI,KAAKz7F,KADnB2nE,GAA6B,uCACAw0B,EAAU,CACjD1V,QAASmb,EACTzoE,aAAc,OACdyvD,iBAAiB,EACjBsB,QAAS,aAGEvxE,UACX0gB,IACE1nE,QAAQwtC,IAAI,yBAEdvtC,OAMJ,iBACE,MAAgC,KAAxBvB,KAAKkvI,eAGf,sBAAsB3+G,GACpBvwB,KAAKwrI,UAAUnoI,KAAKktB,GAGtB,8BACE,IAAK,MAAMA,KAAYvwB,KAAKwrI,UAC1Bj7G,IAEF,OAAOvwB,KAGT,uBACEA,KAAKguI,cAAcP,UAAU,yBAA0BztI,KAAKyuI,UACxDzuI,KAAK+uI,wBAA0BnP,GAAaO,aAC9CngI,KAAKguI,cAAcP,UAAU,0BAA2BztI,KAAKgvI,iEApctDlB,GAAc,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,6BAAdA,EAAc,QAAdA,EAAc,UAAA,WAFb,YAEP,GCnBA,GAAA,YAAM0D,EAGX,eAEA,uBAEE,YAA6Bt7H,IAArBlW,KAAKyxI,YAGf,qBAAqBh8H,GACnB,SAAIzV,KAAK0xI,0BAA2Bj8H,KAAOzV,KAAKyxI,cAMlD,cAAch8H,GACZ,OAAOzV,KAAKyxI,YAAYh8H,GAG1B,iBACE,OAAOzV,KAAKyxI,YAGd,eAAeA,GAEb,OADAzxI,KAAKyxI,YAAcA,EACZzxI,mDA3BEwxI,2BAAAA,EAA0B,QAA1BA,EAA0B,UAAA,WAFzB,YAEP,GCEA,GAAA,YAAMG,EAUX,cATA,KAAAC,WAAY,EACZ,KAAAC,iBAAqC,IAAI,EAGzC,KAAAC,oBAAuC,IAAI,EAG3C,KAAAC,0BAAyD,IAAI,EAI7D,yBACE,OAAO/xI,KAAK8xI,oBAEd,gBAAgBE,GACdhyI,KAAKgyI,aAAeA,EACpBhyI,KAAK8xI,oBAAoBx2G,KAAKt7B,KAAKgyI,cAErC,kBACE,OAAOhyI,KAAKgyI,aAEd,+BACE,OAAOhyI,KAAK+xI,0BAEd,gCACE/xI,KAAK+xI,0BAA0Bz2G,KAAKt7B,KAAKiyI,oBAE3C,sBAAsBA,GACpBjyI,KAAKiyI,mBAAqBA,EAC1BjyI,KAAKkyI,gCAEP,wBACE,OAAOlyI,KAAKiyI,mBAEd,4BACE,OAAOjyI,KAAK6xI,iBAEd,aAAaloH,GACX3pB,KAAK4xI,UAAYjoH,EACjB3pB,KAAK6xI,iBAAiBv2G,KAAK3R,iDAxClBgoH,2BAAAA,EAAoB,QAApBA,EAAoB,UAAA,WAFnB,YAEP,GCFA,GAAA,YAAMQ,EAKX,eAEA,WAAWC,EAAYC,EAAYC,GACjCtyI,KAAKoyI,WAAaA,EAClBpyI,KAAKqyI,WAAaA,EAClBryI,KAAKsyI,YAAcA,EAGrB,gBACE,OAAOtyI,KAAKqyI,WAGd,gBACE,OAAOryI,KAAKoyI,WAGd,iBACE,OAAOpyI,KAAKsyI,0DAtBHH,2BAAAA,EAAsB,QAAtBA,EAAsB,UAAA,WAFrB,YAEP,GCUA,GAAA,YAAMI,EACX,YACUC,EACAC,EACAxE,EACAD,EACA0E,EACAC,EACAC,GANA,KAAAJ,YAAAA,EACA,KAAAC,eAAAA,EACA,KAAAxE,mBAAAA,EACA,KAAAD,cAAAA,EACA,KAAA0E,2BAAAA,EACA,KAAAC,qBAAAA,EACA,KAAAC,uBAAAA,EAGV,IAAIn9H,GACF,MAAMo9H,EAAe7yI,KAAKwyI,YAAY9C,cAChCoD,EAAkB9yI,KAAKiuI,mBAAmBsC,yBAEhD,GAAY,yBAAR96H,EACF,OAAIo9H,EAAahP,OAASgP,EAAa3G,YAC9B2G,EAAajR,SAEf,GAET,GAAY,0BAARnsH,EACF,OAAIo9H,EAAa5G,aACR4G,EAAalD,IAEf,GAET,GAAY,2BAARl6H,EAAkC,CACpC,QAAwBS,IAApB48H,GACiD,kBAAhD9yI,KAAK2yI,qBAAqBI,kBAE7B,OAAO/yI,KAAKguI,cAAcgF,UAAU,0BAE/B,GAAIF,IAAoB3F,GAAiBsB,SAAU,CACxD,MAAMwE,EAAsBjzI,KAAKyyI,eAAeS,kBAChD,OAAID,EAAoB3vI,OAASs8H,GAAaI,SACrCiT,EAAoB5nI,MAEtB,MAET,MAAO,MAET,GAAY,eAARoK,EAAsB,CACxB,IAAI09H,GAAc,EAClB,QACuBj9H,IAApB48H,GACkD,kBAAhD9yI,KAAK2yI,qBAAqBI,mBACiC,QAA3D/yI,KAAKguI,cAAcgF,UAAU,0BAAA,CAG3B,GAAIF,IAAoB3F,GAAiBsB,SAAU,CACxD,MAAMwE,EAAsBjzI,KAAKyyI,eAAeS,kBAC5CD,EAAoB3vI,OAASs8H,GAAaI,UAA0C,QAA9BiT,EAAoB5nI,QAC5E8nI,GAAc,SAJhBA,GAAc,EAOhB,OAAK,MACDj9H,EACAi3H,GAAiBsB,SACjBtB,GAAiBiG,UACjBjG,GAAiBsD,aACjBrtH,SAAS0vH,IACwC,kBAAhD9yI,KAAK2yI,qBAAqBI,mBACzBI,EAIC,GAFEnzI,KAAKyyI,eAAeY,iBAAiBzT,GAAaG,KAI7D,GAAY,4BAARtqH,EAAmC,CACrC,QAAwBS,IAApB48H,GACiD,kBAAhD9yI,KAAK2yI,qBAAqBI,kBAE7B,OAAO/yI,KAAKguI,cAAcgF,UAAU,2BAC/B,GAAIF,IAAoB3F,GAAiBsD,YAAa,CAC3D,MAAMwC,EAAsBjzI,KAAKyyI,eAAeS,kBAChD,OAAID,EAAoB3vI,OAASs8H,GAAaO,YACrC8S,EAAoB5nI,MAEtB,GAET,MAAO,GAET,GAAY,OAARoK,EACF,OAAIq9H,IAAoB3F,GAAiBsD,YAChCzwI,KAAKyyI,eAAeY,iBAAiBzT,GAAaQ,IAEpD,GAET,GAAY,oBAAR3qH,EAA2B,CAE7B,OAD4BzV,KAAKyyI,eAAea,kBACpBhwI,MAC1B,IAAK,MACH,MAAO,MAET,IAAK,UAGL,IAAK,aACH,MAAO,MAET,IAAK,aACH,MAAO,cAET,IAAK,gBACH,MAAO,SAET,IAAK,SACH,MAAO,MAET,IAAK,qBACH,MAAO,SAET,IAAK,MACH,MAAO,MAET,IAAK,MACH,MAAO,MAET,IAAK,WACH,MAAO,WAET,IAAK,UACH,MAAO,UAIX,MAAO,GAET,GAAY,qBAARmS,EAEF,MAAO,CADqBzV,KAAKyyI,eAAea,kBACpBjoI,OAE9B,GAAY,yBAARoK,EAEF,OAD4BzV,KAAKyyI,eAAea,kBACrBjoI,MAE7B,GAAIoK,IAAQmqH,GAAaI,SAAU,CACjC,IAAIuT,EAAkBvzI,KAAKyyI,eAAeY,iBAAiBzT,GAAaI,UAIxE,MAHmB,QAAfuT,IACFA,EAAa,GAERA,EAET,MAAY,kCAAR99H,GACFnU,QAAQwtC,IAAI9uC,KAAK4yI,uBAAuBY,iBACjCxzI,KAAK4yI,uBAAuBY,iBAGzB,YAAR/9H,EACKzV,KAAK0yI,2BAA2Be,cAAc,WAAa,IAAM,IAE9D,cAARh+H,EACKzV,KAAK0yI,2BAA2Be,cAAc,aAAe,IAAM,IAEhE,aAARh+H,EACKzV,KAAK0yI,2BAA2Be,cAAc,YAAc,IAAM,IAE/D,gBAARh+H,EACkE,SAA7DzV,KAAK0yI,2BAA2Be,cAAc,WAAwB,OAAS,QAE5E,kBAARh+H,EACoE,SAA/DzV,KAAK0yI,2BAA2Be,cAAc,aAA0B,OAAS,QAE9E,iBAARh+H,EACmE,SAA9DzV,KAAK0yI,2BAA2Be,cAAc,YAAyB,OAAS,QAGlF,KAGT,aAAah+H,GACX,QAAY,yBAARA,IACGzV,KAAKwyI,YAAYkB,aAIZ,0BAARj+H,IACGzV,KAAKwyI,YAAYkB,YAIZ,kCAARj+H,IAGQ,YAARA,GAGQ,cAARA,GAGQ,aAARA,GAGQ,gBAARA,GAGQ,kBAARA,EAXKzV,KAAK0yI,2BAA2BhB,uBAc7B,iBAARj8H,GACKzV,KAAK0yI,2BAA2BhB,uEAzMhCa,GAAiB,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,6BAAjBA,EAAiB,QAAjBA,EAAiB,UAAA,WAFhB,YAEP,GCbIoB,GAAOn9H,IAEhB,SAASo9H,EAAWC,EAAQC,GAC1B,OAAQD,GAAUC,EAAeD,IAAY,GAAKC,EAGpD,SAASC,EAAYC,EAAIC,GACvB,IAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAMxB,OALAF,EAAY,WAALJ,EACPK,EAAY,WAALJ,EAGPK,GAAgB,WAALN,IAAyB,WAALC,IAF/BC,EAAY,WAALF,IACPG,EAAY,WAALF,GAGa,WAAVK,EAAuBF,EAAMC,EAEnCH,EAAMC,EACM,WAAVG,EACgB,WAAVA,EAAuBF,EAAMC,EAEnB,WAAVC,EAAuBF,EAAMC,EAG/BC,EAAUF,EAAMC,EAoB5B,SAASE,EAAGt1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAGtpC,EAAG8yI,GAE5B,OADAv1I,EAAI80I,EAAY90I,EAAG80I,EAAYA,EAjBjC,SAAW/oG,EAAGmF,EAAGO,GACf,OAAQ1F,EAAImF,GAAQnF,EAAK0F,EAD3B,CAiB+CxxC,EAAGJ,EAAGkvC,GAAIhD,GAAIwpG,IACpDT,EAAYH,EAAW30I,EAAGyC,GAAIxC,GAGvC,SAASu1I,EAAGx1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAGtpC,EAAG8yI,GAE5B,OADAv1I,EAAI80I,EAAY90I,EAAG80I,EAAYA,EAlBjC,SAAW/oG,EAAGmF,EAAGO,GACf,OAAQ1F,EAAI0F,EAAMP,GAAMO,EAD1B,CAkB+CxxC,EAAGJ,EAAGkvC,GAAIhD,GAAIwpG,IACpDT,EAAYH,EAAW30I,EAAGyC,GAAIxC,GAGvC,SAASw1I,EAAGz1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAGtpC,EAAG8yI,GAE5B,OADAv1I,EAAI80I,EAAY90I,EAAG80I,EAAYA,EAnBjC,SAAW/oG,EAAGmF,EAAGO,GACf,OAAQ1F,EAAImF,EAAIO,EADlB,CAmB+CxxC,EAAGJ,EAAGkvC,GAAIhD,GAAIwpG,IACpDT,EAAYH,EAAW30I,EAAGyC,GAAIxC,GAGvC,SAASy1I,EAAG11I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAGtpC,EAAG8yI,GAE5B,OADAv1I,EAAI80I,EAAY90I,EAAG80I,EAAYA,EApBjC,SAAW/oG,EAAGmF,EAAGO,GACf,OAAQP,GAAKnF,GAAM0F,GADrB,CAoB+CxxC,EAAGJ,EAAGkvC,GAAIhD,GAAIwpG,IACpDT,EAAYH,EAAW30I,EAAGyC,GAAIxC,GA0BvC,SAAS01I,EAAUf,GACjB,IAESgB,EAFLC,EAAiB,GACnBC,EAAsB,GAExB,IAAKF,EAAS,EAAGA,GAAU,EAAGA,IAG5BC,IADAC,EAAsB,KADblB,IAAqB,EAATgB,EAAe,KACF97H,SAAS,KACW9W,OAAO8yI,EAAoBj0I,OAAS,EAAG,GAE/F,OAAOg0I,EA2BT,IACIv1I,EAAGy1I,EAAIC,EAAIC,EAAIC,EAAIl2I,EAAGC,EAAGJ,EAAGkvC,EAD5BhD,EAAIp2B,QA4BR,IAPAo2B,EAhFA,SAA4Bx0B,GAS1B,IARA,IAAI4+H,EACAC,EAAiB7+H,EAAO1V,OACxBw0I,EAAuBD,EAAiB,EAExCE,EAA8C,KADtBD,EAAwBA,EAAuB,IAAO,GACrC,GACzCE,EAAa5gI,MAAM2gI,EAAiB,GACpCE,EAAgB,EAChBC,EAAa,EACVA,EAAaL,GAElBI,EAAiBC,EAAa,EAAK,EACnCF,EAFAJ,GAAcM,EAAcA,EAAa,GAAM,GAErBF,EAAWJ,GAAe5+H,EAAO0f,WAAWw/G,IAAeD,EACrFC,IAOF,OAHAF,EAFAJ,GAAcM,EAAcA,EAAa,GAAM,GAEtBF,EAAWJ,GAAe,MADnDK,EAAiBC,EAAa,EAAK,GAEnCF,EAAWD,EAAiB,GAAKF,GAAkB,EACnDG,EAAWD,EAAiB,GAAKF,IAAmB,GAC7CG,EApBT,CA8EAh/H,EA3CA,SAAoBA,GAClBA,EAASA,EAAOrS,QAAQ,QAAS,MAGjC,IAFA,IAAIwxI,EAAU,GAELnxI,EAAI,EAAGA,EAAIgS,EAAO1V,OAAQ0D,IAAK,CAEtC,IAAI1F,EAAI0X,EAAO0f,WAAW1xB,GAEtB1F,EAAI,IACN62I,GAAWj9H,OAAO83B,aAAa1xC,GACrBA,EAAI,KAASA,EAAI,MAC3B62I,GAAWj9H,OAAO83B,aAAc1xC,GAAK,EAAK,KAC1C62I,GAAWj9H,OAAO83B,aAAkB,GAAJ1xC,EAAU,OAE1C62I,GAAWj9H,OAAO83B,aAAc1xC,GAAK,GAAM,KAC3C62I,GAAWj9H,OAAO83B,aAAe1xC,GAAK,EAAK,GAAM,KACjD62I,GAAWj9H,OAAO83B,aAAkB,GAAJ1xC,EAAU,MAK9C,OAAO62I,EArBT,CA2CoBn/H,IAIpBvX,EAAI,WACJC,EAAI,WACJJ,EAAI,WACJkvC,EAAI,UAECzuC,EAAI,EAAGA,EAAIyrC,EAAElqC,OAAQvB,GAAK,GAC7By1I,EAAK/1I,EACLg2I,EAAK/1I,EACLg2I,EAAKp2I,EACLq2I,EAAKnnG,EACL/uC,EAAIs1I,EAAGt1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA/BjB,EA+B0B,YAClCyuC,EAAIumG,EAAGvmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GA/BnB,GA+B4B,YAClCT,EAAIy1I,EAAGz1I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GA/BnB,GA+B4B,WAClCL,EAAIq1I,EAAGr1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GA/BnB,GA+B4B,YAClCN,EAAIs1I,EAAGt1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAnCjB,EAmC0B,YAClCyuC,EAAIumG,EAAGvmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAnCnB,GAmC4B,YAClCT,EAAIy1I,EAAGz1I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GAnCnB,GAmC4B,YAClCL,EAAIq1I,EAAGr1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GAnCnB,GAmC4B,YAClCN,EAAIs1I,EAAGt1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAvCjB,EAuC0B,YAClCyuC,EAAIumG,EAAGvmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAvCnB,GAuC4B,YAClCT,EAAIy1I,EAAGz1I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IAvCnB,GAuC6B,YACnCL,EAAIq1I,EAAGr1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IAvCnB,GAuC6B,YACnCN,EAAIs1I,EAAGt1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,IA3CjB,EA2C2B,YACnCyuC,EAAIumG,EAAGvmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IA3CnB,GA2C6B,YACnCT,EAAIy1I,EAAGz1I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IA3CnB,GA2C6B,YAEnCN,EAAIw1I,EAAGx1I,EADPC,EAAIq1I,EAAGr1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IA3CnB,GA2C6B,YACtBT,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA3CjB,EA2C0B,YAClCyuC,EAAIymG,EAAGzmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GA3CnB,EA2C4B,YAClCT,EAAI21I,EAAG31I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IA3CnB,GA2C6B,WACnCL,EAAIu1I,EAAGv1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GA3CnB,GA2C4B,YAClCN,EAAIw1I,EAAGx1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA/CjB,EA+C0B,YAClCyuC,EAAIymG,EAAGzmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IA/CnB,EA+C6B,UACnCT,EAAI21I,EAAG31I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IA/CnB,GA+C6B,YACnCL,EAAIu1I,EAAGv1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GA/CnB,GA+C4B,YAClCN,EAAIw1I,EAAGx1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAnDjB,EAmD0B,WAClCyuC,EAAIymG,EAAGzmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IAnDnB,EAmD6B,YACnCT,EAAI21I,EAAG31I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GAnDnB,GAmD4B,YAClCL,EAAIu1I,EAAGv1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GAnDnB,GAmD4B,YAClCN,EAAIw1I,EAAGx1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,IAvDjB,EAuD2B,YACnCyuC,EAAIymG,EAAGzmG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAvDnB,EAuD4B,YAClCT,EAAI21I,EAAG31I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GAvDnB,GAuD4B,YAElCN,EAAIy1I,EAAGz1I,EADPC,EAAIu1I,EAAGv1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IAvDnB,GAuD6B,YACtBT,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAvDjB,EAuD0B,YAClCyuC,EAAI0mG,EAAG1mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAvDnB,GAuD4B,YAClCT,EAAI41I,EAAG51I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IAvDnB,GAuD6B,YACnCL,EAAIw1I,EAAGx1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IAvDnB,GAuD6B,YACnCN,EAAIy1I,EAAGz1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA3DjB,EA2D0B,YAClCyuC,EAAI0mG,EAAG1mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GA3DnB,GA2D4B,YAClCT,EAAI41I,EAAG51I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GA3DnB,GA2D4B,YAClCL,EAAIw1I,EAAGx1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IA3DnB,GA2D6B,YACnCN,EAAIy1I,EAAGz1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,IA/DjB,EA+D2B,WACnCyuC,EAAI0mG,EAAG1mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GA/DnB,GA+D4B,YAClCT,EAAI41I,EAAG51I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GA/DnB,GA+D4B,YAClCL,EAAIw1I,EAAGx1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GA/DnB,GA+D4B,UAClCN,EAAIy1I,EAAGz1I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAnEjB,EAmE0B,YAClCyuC,EAAI0mG,EAAG1mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IAnEnB,GAmE6B,YACnCT,EAAI41I,EAAG51I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IAnEnB,GAmE6B,WAEnCN,EAAI01I,EAAG11I,EADPC,EAAIw1I,EAAGx1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GAnEnB,GAmE4B,YACrBT,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GAnEjB,EAmE0B,YAClCyuC,EAAI2mG,EAAG3mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAnEnB,GAmE4B,YAClCT,EAAI61I,EAAG71I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IAnEnB,GAmE6B,YACnCL,EAAIy1I,EAAGz1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GAnEnB,GAmE4B,YAClCN,EAAI01I,EAAG11I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,IAvEjB,EAuE2B,YACnCyuC,EAAI2mG,EAAG3mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,GAvEnB,GAuE4B,YAClCT,EAAI61I,EAAG71I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,IAvEnB,GAuE6B,YACnCL,EAAIy1I,EAAGz1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GAvEnB,GAuE4B,YAClCN,EAAI01I,EAAG11I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA3EjB,EA2E0B,YAClCyuC,EAAI2mG,EAAG3mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IA3EnB,GA2E6B,YACnCT,EAAI61I,EAAG71I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GA3EnB,GA2E4B,YAClCL,EAAIy1I,EAAGz1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,IA3EnB,GA2E6B,YACnCN,EAAI01I,EAAG11I,EAAGC,EAAGJ,EAAGkvC,EAAGhD,EAAEzrC,EAAI,GA/EjB,EA+E0B,YAClCyuC,EAAI2mG,EAAG3mG,EAAG/uC,EAAGC,EAAGJ,EAAGksC,EAAEzrC,EAAI,IA/EnB,GA+E6B,YACnCT,EAAI61I,EAAG71I,EAAGkvC,EAAG/uC,EAAGC,EAAG8rC,EAAEzrC,EAAI,GA/EnB,GA+E4B,WAClCL,EAAIy1I,EAAGz1I,EAAGJ,EAAGkvC,EAAG/uC,EAAG+rC,EAAEzrC,EAAI,GA/EnB,GA+E4B,YAClCN,EAAI80I,EAAY90I,EAAG+1I,GACnB91I,EAAI60I,EAAY70I,EAAG+1I,GACnBn2I,EAAIi1I,EAAYj1I,EAAGo2I,GACnBlnG,EAAI+lG,EAAY/lG,EAAGmnG,GAKrB,OAFWP,EAAU31I,GAAK21I,EAAU11I,GAAK01I,EAAU91I,GAAK81I,EAAU5mG,IAEtDxnC,eCnOP,MAAM,WAAwB,EACjC,YAAYovI,GACR3uF,QACAjnD,KAAK41I,OAASA,EAElB,YACI,OAAO51I,KAAK61I,WAEhB,WAAWtuF,GACP,MAAMf,EAAeS,MAAMuB,WAAWjB,GAItC,OAHIf,IAAiBA,EAAad,QAC9B6B,EAAWjsB,KAAKt7B,KAAK41I,QAElBpvF,EAEX,WACI,GAAIxmD,KAAKspD,SACL,MAAMtpD,KAAKupD,YAEV,GAAIvpD,KAAK0lD,OACV,MAAM,IAAIsD,EAGV,OAAOhpD,KAAK41I,OAGpB,KAAKvqI,GACD47C,MAAM3rB,KAAKt7B,KAAK41I,OAASvqI,IC7BjC,MAUayqI,GAVU,MACnB,SAASC,IAIL,OAHAtvI,MAAMiN,KAAK1T,MACXA,KAAKknB,QAAU,0BACflnB,KAAKyK,KAAO,aACLzK,KAGX,OADA+1I,EAAe90I,UAAY7B,OAAO4L,OAAOvE,MAAMxF,WACxC80I,GARY,GCChB,MAAM,WAAwB,EACjC,WAAWC,EAAYtrF,EAAYurF,EAAYC,EAAYC,GACvDn2I,KAAKsnD,YAAYhsB,KAAKovB,GAE1B,YAAYnpD,EAAO40I,GACfn2I,KAAKsnD,YAAY/lD,MAAMA,GAE3B,eAAe40I,GACXn2I,KAAKsnD,YAAYN,YCRlB,MAAM,WAAwB,EACjC,YAAY3gC,EAAQ2vH,EAAYC,GAC5BhvF,QACAjnD,KAAKqmB,OAASA,EACdrmB,KAAKg2I,WAAaA,EAClBh2I,KAAKi2I,WAAaA,EAClBj2I,KAAKgU,MAAQ,EAEjB,MAAM3I,GACFrL,KAAKqmB,OAAOkkC,WAAWvqD,KAAKg2I,WAAY3qI,EAAOrL,KAAKi2I,WAAYj2I,KAAKgU,QAAShU,MAElF,OAAOuB,GACHvB,KAAKqmB,OAAOmkC,YAAYjpD,EAAOvB,MAC/BA,KAAKgmD,cAET,YACIhmD,KAAKqmB,OAAOokC,eAAezqD,MAC3BA,KAAKgmD,eCfN,SAASowF,GAAkBC,EAAiB3uI,EAAQsuI,EAAYC,EAAYrrF,EAAkB,IAAI,GAAgByrF,EAAiBL,EAAYC,IAClJ,IAAIrrF,EAAgBlF,OAGpB,OAAIh+C,aAAkB,EACXA,EAAO4gD,UAAUsC,GAErBX,EAAYviD,EAAZuiD,CAAoBW,GCL/B,MAAMkiB,GAAO,GACN,SAASwpE,MAAiB3qF,GAC7B,IAAIb,OAAiB50C,EACjBo0C,OAAYp0C,EAUhB,OATIszC,EAAYmC,EAAYA,EAAY7qD,OAAS,MAC7CwpD,EAAYqB,EAAYjoD,OAEuB,mBAAxCioD,EAAYA,EAAY7qD,OAAS,KACxCgqD,EAAiBa,EAAYjoD,OAEN,IAAvBioD,EAAY7qD,QAAgB0c,EAAQmuC,EAAY,MAChDA,EAAcA,EAAY,IAEvBD,EAAUC,EAAarB,GAAWX,KAAK,IAAI4sF,GAAsBzrF,IAErE,MAAMyrF,GACT,YAAYzrF,GACR9qD,KAAK8qD,eAAiBA,EAE1B,KAAKvD,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAwBf,EAAYvnD,KAAK8qD,kBAGtE,MAAM,WAAgC,GACzC,YAAYxD,EAAawD,GACrB7D,MAAMK,GACNtnD,KAAK8qD,eAAiBA,EACtB9qD,KAAKorD,OAAS,EACdprD,KAAK8U,OAAS,GACd9U,KAAK2rD,YAAc,GAEvB,MAAM1D,GACFjoD,KAAK8U,OAAOzR,KAAKypE,IACjB9sE,KAAK2rD,YAAYtoD,KAAK4kD,GAE1B,YACI,MAAM0D,EAAc3rD,KAAK2rD,YACnBxoD,EAAMwoD,EAAY7qD,OACxB,GAAY,IAARqC,EACAnD,KAAKsnD,YAAYN,eAEhB,CACDhnD,KAAKorD,OAASjoD,EACdnD,KAAKw2I,UAAYrzI,EACjB,IAAK,IAAIzC,EAAI,EAAGA,EAAIyC,EAAKzC,IAErBV,KAAKkf,IAAIk3H,GAAkBp2I,KADR2rD,EAAYjrD,QACcwV,EAAWxV,KAIpE,eAAe+1I,GACgB,IAAtBz2I,KAAKorD,QAAU,IAChBprD,KAAKsnD,YAAYN,WAGzB,WAAW0vF,EAAahsF,EAAYurF,GAChC,MAAMnhI,EAAS9U,KAAK8U,OAEd0hI,EAAax2I,KAAKw2I,UADT1hI,EAAOmhI,KAGLnpE,KAAS9sE,KAAKw2I,UAAYx2I,KAAKw2I,UAD1C,EAEN1hI,EAAOmhI,GAAcvrF,EACH,IAAd8rF,IACIx2I,KAAK8qD,eACL9qD,KAAK22I,mBAAmB7hI,GAGxB9U,KAAKsnD,YAAYhsB,KAAKxmB,EAAO5Q,UAIzC,mBAAmB4Q,GACf,IAAIpN,EACJ,IACIA,EAAS1H,KAAK8qD,eAAex3C,MAAMtT,KAAM8U,GAE7C,MAAO2wC,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3BzlD,KAAKsnD,YAAYhsB,KAAK5zB,ICpFvB,MAAM,GAAQ,IAAI,EAAW6/C,GAAcA,EAAWP,YACtD,SAAS,GAAMsD,GAClB,OAAOA,EAEX,SAAwBA,GACpB,OAAO,IAAI,EAAW/C,GAAc+C,EAAUb,SAAS,IAAMlC,EAAWP,aAD5E,CAFsCsD,GAAa,GCA5C,SAASlwB,GAAMw8G,GAClB,OAAO,IAAI,EAAWrvF,IAClB,IAAI3lC,EACJ,IACIA,EAAQg1H,IAEZ,MAAOnxF,GAEH,YADA8B,EAAWhmD,MAAMkkD,GAIrB,OADe7jC,EAAQ,EAAKA,GAAS,MACvB0mC,UAAUf,KCbzB,SAASsvF,KACZ,OAAOprF,EAAS,GCFpB,MAUaqrF,GAVuB,MAChC,SAASC,IAIL,OAHAtwI,MAAMiN,KAAK1T,MACXA,KAAKknB,QAAU,wBACflnB,KAAKyK,KAAO,0BACLzK,KAGX,OADA+2I,EAA4B91I,UAAY7B,OAAO4L,OAAOvE,MAAMxF,WACrD81I,GARyB,GCG7B,SAASC,GAASphH,GACrB,OAAO,SAAkChoB,GACrC,OAAc,IAAVgoB,EACO,KAGAhoB,EAAO+7C,KAAK,IAAI,GAAiB/zB,KAIpD,MAAM,GACF,YAAYsmG,GAER,GADAl8H,KAAKk8H,MAAQA,EACTl8H,KAAKk8H,MAAQ,EACb,MAAM,IAAI4a,GAGlB,KAAKvvF,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAmBf,EAAYvnD,KAAKk8H,SAGxE,MAAM,WAA2B,EAC7B,YAAY50E,EAAa40E,GACrBj1E,MAAMK,GACNtnD,KAAKk8H,MAAQA,EACbl8H,KAAKi3I,KAAO,IAAIriI,MAChB5U,KAAK41B,MAAQ,EAEjB,MAAMvqB,GACF,MAAM4rI,EAAOj3I,KAAKi3I,KACZ/a,EAAQl8H,KAAKk8H,MACbtmG,EAAQ51B,KAAK41B,QACfqhH,EAAKn2I,OAASo7H,EACd+a,EAAK5zI,KAAKgI,GAIV4rI,EADcrhH,EAAQsmG,GACR7wH,EAGtB,YACI,MAAMi8C,EAActnD,KAAKsnD,YACzB,IAAI1xB,EAAQ51B,KAAK41B,MACjB,GAAIA,EAAQ,EAAG,CACX,MAAMsmG,EAAQl8H,KAAK41B,OAAS51B,KAAKk8H,MAAQl8H,KAAKk8H,MAAQl8H,KAAK41B,MACrDqhH,EAAOj3I,KAAKi3I,KAClB,IAAK,IAAIv2I,EAAI,EAAGA,EAAIw7H,EAAOx7H,IAAK,CAC5B,MAAMwsC,EAAOtX,IAAWsmG,EACxB50E,EAAYhsB,KAAK27G,EAAK/pG,KAG9Boa,EAAYN,YCpDb,SAASkwF,GAAaC,EAAeC,IACxC,OAAQxpI,GACGA,EAAO+7C,KAAK,IAAI0tF,GAAqBF,IAGpD,MAAME,GACF,YAAYF,GACRn3I,KAAKm3I,aAAeA,EAExB,KAAK5vF,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAuBf,EAAYvnD,KAAKm3I,gBAG5E,MAAM,WAA+B,EACjC,YAAY7vF,EAAa6vF,GACrBlwF,MAAMK,GACNtnD,KAAKm3I,aAAeA,EACpBn3I,KAAKs3I,UAAW,EAEpB,MAAMjsI,GACFrL,KAAKs3I,UAAW,EAChBt3I,KAAKsnD,YAAYhsB,KAAKjwB,GAE1B,YACI,GAAKrL,KAAKs3I,SAWN,OAAOt3I,KAAKsnD,YAAYN,WAXR,CAChB,IAAIvB,EACJ,IACIA,EAAMzlD,KAAKm3I,eAEf,MAAO1kI,GACHgzC,EAAMhzC,EAEVzS,KAAKsnD,YAAY/lD,MAAMkkD,KAOnC,SAAS2xF,KACL,OAAO,IAAItB,GCzCR,SAASyB,GAAe1kH,EAAe,MAC1C,OAAQjlB,GAAWA,EAAO+7C,KAAK,IAAI6tF,GAAuB3kH,IAE9D,MAAM2kH,GACF,YAAY3kH,GACR7yB,KAAK6yB,aAAeA,EAExB,KAAK00B,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAyBf,EAAYvnD,KAAK6yB,gBAG9E,MAAM,WAAiC,EACnC,YAAYy0B,EAAaz0B,GACrBo0B,MAAMK,GACNtnD,KAAK6yB,aAAeA,EACpB7yB,KAAK2kC,SAAU,EAEnB,MAAMt5B,GACFrL,KAAK2kC,SAAU,EACf3kC,KAAKsnD,YAAYhsB,KAAKjwB,GAE1B,YACQrL,KAAK2kC,SACL3kC,KAAKsnD,YAAYhsB,KAAKt7B,KAAK6yB,cAE/B7yB,KAAKsnD,YAAYN,YCpBlB,SAAS,GAAK5yC,EAAWye,GAC5B,MAAM4kH,EAAkBnvI,UAAUxH,QAAU,EAC5C,OAAQ8M,GAAWA,EAAOs6C,KAAK9zC,EAAY,GAAO,CAACikC,EAAG33C,IAAM0T,EAAUikC,EAAG33C,EAAGkN,IAAW,EAAUopI,GAAS,GAAIS,EAAkBF,GAAe1kH,GAAgBqkH,GAAa,IAAM,IAAIpB,KCPnL,SAAS4B,GAAW7qF,GACvB,OAAO,SAAoCj/C,GACvC,MAAMglB,EAAW,IAAI+kH,GAAc9qF,GAC7B+qF,EAAShqI,EAAO+7C,KAAK/2B,GAC3B,OAAQA,EAASglH,OAASA,GAGlC,MAAMD,GACF,YAAY9qF,GACR7sD,KAAK6sD,SAAWA,EAEpB,KAAKtF,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAgBf,EAAYvnD,KAAK6sD,SAAU7sD,KAAK43I,UAGpF,MAAM,WAAwB,EAC1B,YAAYtwF,EAAauF,EAAU+qF,GAC/B3wF,MAAMK,GACNtnD,KAAK6sD,SAAWA,EAChB7sD,KAAK43I,OAASA,EAElB,MAAMnyF,GACF,IAAKzlD,KAAKqnD,UAAW,CACjB,IAAI3/C,EACJ,IACIA,EAAS1H,KAAK6sD,SAASpH,EAAKzlD,KAAK43I,QAErC,MAAOC,GAEH,YADA5wF,MAAM1lD,MAAMs2I,GAGhB73I,KAAK83I,yBACL,MAAMltF,EAAkB,IAAI,EAAsB5qD,MAClDA,KAAKkf,IAAI0rC,GACT,MAAMY,EAAoBb,EAAejjD,EAAQkjD,GAC7CY,IAAsBZ,GACtB5qD,KAAKkf,IAAIssC,KClClB,SAAS,GAAK51B,GACjB,OAAQhoB,GACU,IAAVgoB,EACO,KAGAhoB,EAAO+7C,KAAK,IAAI,GAAa/zB,IAIhD,MAAM,GACF,YAAYsmG,GAER,GADAl8H,KAAKk8H,MAAQA,EACTl8H,KAAKk8H,MAAQ,EACb,MAAM,IAAI4a,GAGlB,KAAKvvF,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAef,EAAYvnD,KAAKk8H,SAGpE,MAAM,WAAuB,EACzB,YAAY50E,EAAa40E,GACrBj1E,MAAMK,GACNtnD,KAAKk8H,MAAQA,EACbl8H,KAAK41B,MAAQ,EAEjB,MAAMvqB,GACF,MAAM6wH,EAAQl8H,KAAKk8H,MACbtmG,IAAU51B,KAAK41B,MACjBA,GAASsmG,IACTl8H,KAAKsnD,YAAYhsB,KAAKjwB,GAClBuqB,IAAUsmG,IACVl8H,KAAKsnD,YAAYN,WACjBhnD,KAAKgmD,iBC/Bd,SAAS,GAAM5xC,EAAWye,GAC7B,MAAM4kH,EAAkBnvI,UAAUxH,QAAU,EAC5C,OAAQ8M,GAAWA,EAAOs6C,KAAK9zC,EAAY,GAAO,CAACikC,EAAG33C,IAAM0T,EAAUikC,EAAG33C,EAAGkN,IAAW,EAAU,GAAK,GAAI6pI,EAAkBF,GAAe1kH,GAAgBqkH,GAAa,IAAM,IAAIpB,KCJtL,MAAMiC,GACF,YAAY3jI,EAAWZ,EAAS5F,GAC5B5N,KAAKoU,UAAYA,EACjBpU,KAAKwT,QAAUA,EACfxT,KAAK4N,OAASA,EAElB,KAAKg7C,EAAUh7C,GACX,OAAOA,EAAO06C,UAAU,IAAI,GAAgBM,EAAU5oD,KAAKoU,UAAWpU,KAAKwT,QAASxT,KAAK4N,UAGjG,MAAM,WAAwB,EAC1B,YAAY05C,EAAalzC,EAAWZ,EAAS5F,GACzCq5C,MAAMK,GACNtnD,KAAKoU,UAAYA,EACjBpU,KAAKwT,QAAUA,EACfxT,KAAK4N,OAASA,EACd5N,KAAKgU,MAAQ,EACbhU,KAAKwT,QAAUA,GAAWxT,KAE9B,eAAeg4I,GACXh4I,KAAKsnD,YAAYhsB,KAAK08G,GACtBh4I,KAAKsnD,YAAYN,WAErB,MAAM37C,GACF,IAAI3D,GAAS,EACb,IACIA,EAAS1H,KAAKoU,UAAUV,KAAK1T,KAAKwT,QAASnI,EAAOrL,KAAKgU,QAAShU,KAAK4N,QAEzE,MAAO63C,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAGtB/9C,GACD1H,KAAKyqD,gBAAe,GAG5B,YACIzqD,KAAKyqD,gBAAe,ICtCrB,SAASwtF,GAAUvuF,EAASoB,GAC/B,MAA8B,mBAAnBA,EACCl9C,GAAWA,EAAOs6C,KAAK+vF,GAAU,CAACh5I,EAAGyB,IAAM,EAAKgpD,EAAQzqD,EAAGyB,IAAIwnD,KAAK,EAAI,CAAChpD,EAAG+rD,IAAOH,EAAe7rD,EAAGC,EAAGwB,EAAGuqD,OAE/Gr9C,GAAWA,EAAO+7C,KAAK,IAAIuuF,GAAkBxuF,IAEzD,MAAMwuF,GACF,YAAYxuF,GACR1pD,KAAK0pD,QAAUA,EAEnB,KAAKnC,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAoBf,EAAYvnD,KAAK0pD,WAGzE,MAAM,WAA4B,EAC9B,YAAYpC,EAAaoC,GACrBzC,MAAMK,GACNtnD,KAAK0pD,QAAUA,EACf1pD,KAAKgU,MAAQ,EAEjB,MAAM3I,GACF,IAAI3D,EACJ,MAAMsM,EAAQhU,KAAKgU,QACnB,IACItM,EAAS1H,KAAK0pD,QAAQr+C,EAAO2I,GAEjC,MAAOzS,GAEH,YADAvB,KAAKsnD,YAAY/lD,MAAMA,GAG3BvB,KAAKsrD,UAAU5jD,GAEnB,UAAUA,GACN,MAAM8jD,EAAoBxrD,KAAKwrD,kBAC3BA,GACAA,EAAkBxF,cAEtB,MAAM4E,EAAkB,IAAI,EAAsB5qD,MAC5CsnD,EAActnD,KAAKsnD,YACzBA,EAAYpoC,IAAI0rC,GAChB5qD,KAAKwrD,kBAAoBb,EAAejjD,EAAQkjD,GAC5C5qD,KAAKwrD,oBAAsBZ,GAC3BtD,EAAYpoC,IAAIlf,KAAKwrD,mBAG7B,YACI,MAAM,kBAAEA,GAAsBxrD,KACzBwrD,IAAqBA,EAAkB9F,QACxCuB,MAAMS,YAEV1nD,KAAKgmD,cAET,eACIhmD,KAAKwrD,uBAAoBt1C,EAE7B,iBACIlW,KAAKwrD,uBAAoBt1C,EACrBlW,KAAKqnD,WACLJ,MAAMS,YAGd,WAAWgD,GACP1qD,KAAKsnD,YAAYhsB,KAAKovB,IC/DvB,SAAS/gD,MAAUgiD,GACtB,OAAOkrF,IAAAA,CAAY9gB,MAAMpqE,ICFtB,SAASwsF,GAAKpkI,EAAaqkI,GAC9B,IAAIC,GAAU,EAId,OAHI/vI,UAAUxH,QAAU,IACpBu3I,GAAU,GAEP,SAA8BzqI,GACjC,OAAOA,EAAO+7C,KAAK,IAAI2uF,GAAavkI,EAAaqkI,EAAMC,KAG/D,MAAMC,GACF,YAAYvkI,EAAaqkI,EAAMC,GAAU,GACrCr4I,KAAK+T,YAAcA,EACnB/T,KAAKo4I,KAAOA,EACZp4I,KAAKq4I,QAAUA,EAEnB,KAAK9wF,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAef,EAAYvnD,KAAK+T,YAAa/T,KAAKo4I,KAAMp4I,KAAKq4I,WAGjG,MAAM,WAAuB,EACzB,YAAY/wF,EAAavzC,EAAawkI,EAAOF,GACzCpxF,MAAMK,GACNtnD,KAAK+T,YAAcA,EACnB/T,KAAKu4I,MAAQA,EACbv4I,KAAKq4I,QAAUA,EACfr4I,KAAKgU,MAAQ,EAEjB,WACI,OAAOhU,KAAKu4I,MAEhB,SAASltI,GACLrL,KAAKq4I,SAAU,EACfr4I,KAAKu4I,MAAQltI,EAEjB,MAAMA,GACF,GAAKrL,KAAKq4I,QAKN,OAAOr4I,KAAKqrD,SAAShgD,GAJrBrL,KAAKo4I,KAAO/sI,EACZrL,KAAKsnD,YAAYhsB,KAAKjwB,GAM9B,SAASA,GACL,MAAM2I,EAAQhU,KAAKgU,QACnB,IAAItM,EACJ,IACIA,EAAS1H,KAAK+T,YAAY/T,KAAKo4I,KAAM/sI,EAAO2I,GAEhD,MAAOyxC,GACHzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAE3BzlD,KAAKo4I,KAAO1wI,EACZ1H,KAAKsnD,YAAYhsB,KAAK5zB,ICtDvB,SAAS,MCGT,SAAS06B,GAAIsmB,EAAgBnnD,EAAOylD,GACvC,OAAO,SAA6Bp5C,GAChC,OAAOA,EAAO+7C,KAAK,IAAI6uF,GAAW9vF,EAAgBnnD,EAAOylD,KAGjE,MAAMwxF,GACF,YAAY9vF,EAAgBnnD,EAAOylD,GAC/BhnD,KAAK0oD,eAAiBA,EACtB1oD,KAAKuB,MAAQA,EACbvB,KAAKgnD,SAAWA,EAEpB,KAAKO,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAcf,EAAYvnD,KAAK0oD,eAAgB1oD,KAAKuB,MAAOvB,KAAKgnD,YAGpG,MAAM,WAAsB,EACxB,YAAYM,EAAaM,EAAgBrmD,EAAOylD,GAC5CC,MAAMK,GACNtnD,KAAKy4I,SAAW,GAChBz4I,KAAK04I,UAAY,GACjB14I,KAAK24I,aAAe,GACpB34I,KAAK04I,UAAYn3I,GAAS,GAC1BvB,KAAK24I,aAAe3xF,GAAY,GAC5BliC,EAAW8iC,IACX5nD,KAAK6nD,SAAW7nD,KAChBA,KAAKy4I,SAAW7wF,GAEXA,IACL5nD,KAAK6nD,SAAWD,EAChB5nD,KAAKy4I,SAAW7wF,EAAetsB,MAAQ,GACvCt7B,KAAK04I,UAAY9wF,EAAermD,OAAS,GACzCvB,KAAK24I,aAAe/wF,EAAeZ,UAAY,IAGvD,MAAM37C,GACF,IACIrL,KAAKy4I,SAAS/kI,KAAK1T,KAAK6nD,SAAUx8C,GAEtC,MAAOo6C,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3BzlD,KAAKsnD,YAAYhsB,KAAKjwB,GAE1B,OAAOo6C,GACH,IACIzlD,KAAK04I,UAAUhlI,KAAK1T,KAAK6nD,SAAUpC,GAEvC,MAAOA,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3BzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAE3B,YACI,IACIzlD,KAAK24I,aAAajlI,KAAK1T,KAAK6nD,UAEhC,MAAOpC,GAEH,YADAzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAG3B,OAAOzlD,KAAKsnD,YAAYN,YC5DhC,MAAM4xF,GACF,YAAYroH,GACRvwB,KAAKuwB,SAAWA,EAEpB,KAAKg3B,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAkBf,EAAYvnD,KAAKuwB,YAGvE,MAAM,WAA0B,EAC5B,YAAY+2B,EAAa/2B,GACrB02B,MAAMK,GACNtnD,KAAKkf,IAAI,IAAI,EAAaqR,KC8BlC,MAAMsoH,GAKF,YAAYvqH,EAAI27C,GACZjqE,KAAKsuB,GAAKA,EACVtuB,KAAKiqE,IAAMA,GAoBnB,MAAM6uE,WAAwBD,GAO1B,YAEAvqH,EAEA27C,EAEA8uE,EAAoB,aAEpBC,EAAgB,MACZ/xF,MAAM34B,EAAI27C,GACVjqE,KAAK+4I,kBAAoBA,EACzB/4I,KAAKg5I,cAAgBA,EAMzB,WAAa,MAAO,uBAAuBh5I,KAAKsuB,aAAatuB,KAAKiqE,SAmCtE,MAAMgvE,WAAsBJ,GAMxB,YAEAvqH,EAEA27C,EAAKivE,GACDjyF,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EAM7B,WACI,MAAO,qBAAqBl5I,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,uBAkB7F,MAAMC,WAAyBN,GAM3B,YAEAvqH,EAEA27C,EAAKmvE,GACDnyF,MAAM34B,EAAI27C,GACVjqE,KAAKo5I,OAASA,EAMlB,WAAa,MAAO,wBAAwBp5I,KAAKsuB,aAAatuB,KAAKiqE,SAcvE,MAAMovE,WAAwBR,GAM1B,YAEAvqH,EAEA27C,EAAK1oE,GACD0lD,MAAM34B,EAAI27C,GACVjqE,KAAKuB,MAAQA,EAMjB,WACI,MAAO,uBAAuBvB,KAAKsuB,aAAatuB,KAAKiqE,gBAAgBjqE,KAAKuB,UAelF,MAAM+3I,WAAyBT,GAO3B,YAEAvqH,EAEA27C,EAAKivE,EAAmB/6F,GACpB8I,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EACzBl5I,KAAKm+C,MAAQA,EAMjB,WACI,MAAO,wBAAwBn+C,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,8BAA8Bl5I,KAAKm+C,UAoBnI,MAAMo7F,WAAyBV,GAO3B,YAEAvqH,EAEA27C,EAAKivE,EAAmB/6F,GACpB8I,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EACzBl5I,KAAKm+C,MAAQA,EAKjB,WACI,MAAO,wBAAwBn+C,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,8BAA8Bl5I,KAAKm+C,UAoBnI,MAAMq7F,WAAuBX,GAQzB,YAEAvqH,EAEA27C,EAAKivE,EAAmB/6F,EAAOs7F,GAC3BxyF,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EACzBl5I,KAAKm+C,MAAQA,EACbn+C,KAAKy5I,eAAiBA,EAK1B,WACI,MAAO,sBAAsBz5I,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,8BAA8Bl5I,KAAKm+C,0BAA0Bn+C,KAAKy5I,mBA4BhK,MAAMC,WAAqBb,GAOvB,YAEAvqH,EAEA27C,EAAKivE,EAAmB/6F,GACpB8I,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EACzBl5I,KAAKm+C,MAAQA,EAKjB,WACI,MAAO,oBAAoBn+C,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,8BAA8Bl5I,KAAKm+C,UAqB/H,MAAMw7F,WAAmBd,GAOrB,YAEAvqH,EAEA27C,EAAKivE,EAAmB/6F,GACpB8I,MAAM34B,EAAI27C,GACVjqE,KAAKk5I,kBAAoBA,EACzBl5I,KAAKm+C,MAAQA,EAKjB,WACI,MAAO,kBAAkBn+C,KAAKsuB,aAAatuB,KAAKiqE,6BAA6BjqE,KAAKk5I,8BAA8Bl5I,KAAKm+C,UAoB7H,MAAMy7F,GAIF,YAAYjP,GACR3qI,KAAK2qI,MAAQA,EAKjB,WAAa,MAAO,8BAA8B3qI,KAAK2qI,MAAMzsI,SAcjE,MAAM27I,GAIF,YAAYlP,GACR3qI,KAAK2qI,MAAQA,EAKjB,WAAa,MAAO,4BAA4B3qI,KAAK2qI,MAAMzsI,SAiB/D,MAAM47I,GAIF,YAAYC,GACR/5I,KAAK+5I,SAAWA,EAKpB,WAGI,MAAO,+BADM/5I,KAAK+5I,SAASC,aAAeh6I,KAAK+5I,SAASC,YAAY97I,MAAQ,QAkBpF,MAAM+7I,GAIF,YAAYF,GACR/5I,KAAK+5I,SAAWA,EAKpB,WAGI,MAAO,6BADM/5I,KAAK+5I,SAASC,aAAeh6I,KAAK+5I,SAASC,YAAY97I,MAAQ,QAmBpF,MAAMg8I,GAIF,YAAYH,GACR/5I,KAAK+5I,SAAWA,EAKpB,WAGI,MAAO,0BADM/5I,KAAK+5I,SAASC,aAAeh6I,KAAK+5I,SAASC,YAAY97I,MAAQ,QAmBpF,MAAMi8I,GAIF,YAAYJ,GACR/5I,KAAK+5I,SAAWA,EAKpB,WAGI,MAAO,wBADM/5I,KAAK+5I,SAASC,aAAeh6I,KAAK+5I,SAASC,YAAY97I,MAAQ,QAgBpF,MAAMk8I,GAMF,YAAYC,EAAav2G,EAAUm3C,GAC/Bj7E,KAAKq6I,YAAcA,EACnBr6I,KAAK8jC,SAAWA,EAChB9jC,KAAKi7E,OAASA,EAKlB,WAGI,MAAO,mBAAmBj7E,KAAKi7E,uBADnBj7E,KAAK8jC,SAAW,GAAG9jC,KAAK8jC,SAAS,OAAO9jC,KAAK8jC,SAAS,KAAO,6BAoC3Ew2G,UAENA,EAAsBjpF,UAAO,SAAuClyD,GAAK,OAAO,IAAKA,GAAKm7I,IAC1FA,EAAsB3pF,UAAO,GAAyB,CAAErtD,KAAMg3I,EAAuBzjF,UAAW,CAAC,CAAC,iBAAkB9B,MAAO,EAAGC,KAAM,EAAG1tB,SAAU,SAAwCgsC,EAAIvnC,GAAgB,EAALunC,GAChM,GAAiB,EAAG,kBACnBmB,WAAY,WAAc,MAAO,CAAC,KAAkBzd,cAAe,UAkE5E,MAAMujF,GAIF,YAAYhhC,GAAUv5G,KAAKu5G,OAASA,GAAU,GAK9C,IAAI9uG,GAAQ,OAAOzK,KAAKu5G,OAAOvgG,eAAevO,GAK9C,IAAIA,GACA,GAAIzK,KAAK+W,IAAItM,GAAO,CAEhB,MAAM4tC,EAAIr4C,KAAKu5G,OAAO9uG,GACtB,OAAOmK,MAAM4I,QAAQ66B,GAAKA,EAAE,GAAKA,EAErC,OAAO,KAMX,OAAO5tC,GACH,GAAIzK,KAAK+W,IAAItM,GAAO,CAEhB,MAAM4tC,EAAIr4C,KAAKu5G,OAAO9uG,GACtB,OAAOmK,MAAM4I,QAAQ66B,GAAKA,EAAI,CAACA,GAEnC,MAAO,GAKX,WAAa,OAAOj5C,OAAOC,KAAKW,KAAKu5G,SAgBzC,SAASihC,GAAkBjhC,GACvB,OAAO,IAAIghC,GAAYhhC,GAQ3B,SAASkhC,GAAyBvzH,GAE9B,MAAM3lB,EAAQkF,MAAM,6BAA+BygB,GAEnD,OADA,EAAuD,4BAAI,EACpD3lB,EAgBX,SAASm5I,GAAkBC,EAAUC,EAAcjQ,GAE/C,MAAM5jI,EAA2B4jI,EAAW,KAAEhsI,MAAM,KACpD,GAAIoI,EAAMjG,OAAS65I,EAAS75I,OAExB,OAAO,KAEX,GAAwB,SAApB6pI,EAAMkQ,YACLD,EAAaE,eAAiB/zI,EAAMjG,OAAS65I,EAAS75I,QAEvD,OAAO,KAGX,MAAMi6I,EAAY,GAElB,IAAK,IAAI/mI,EAAQ,EAAGA,EAAQjN,EAAMjG,OAAQkT,IAAS,CAE/C,MAAM69F,EAAO9qG,EAAMiN,GAEblJ,EAAU6vI,EAAS3mI,GAGzB,GADoB69F,EAAK1qE,WAAW,KAEhC4zG,EAAUlpC,EAAKhuG,UAAU,IAAMiH,OAE9B,GAAI+mG,IAAS/mG,EAAQ5M,KAEtB,OAAO,KAGf,MAAO,CAAE88I,SAAUL,EAASz2I,MAAM,EAAG6C,EAAMjG,QAASi6I,UAAAA,GA+VxD,MAAME,GAKF,YAAYC,EAAQx9I,GAChBsC,KAAKk7I,OAASA,EACdl7I,KAAKtC,OAASA,GActB,SAASy9I,GAAexkC,EAAQykC,EAAa,IAEzC,IAAK,IAAI16I,EAAI,EAAGA,EAAIi2G,EAAO71G,OAAQJ,IAAK,CAEpC,MAAMiqI,EAAQh0B,EAAOj2G,GAGrB,GAAaiqI,EADI0Q,GAAYD,EAAYzQ,KASjD,SAAS,GAAaA,EAAO2Q,GACzB,IAAK3Q,EACD,MAAM,IAAIlkI,MAAM,2CACgB60I,oWAWpC,GAAI1mI,MAAM4I,QAAQmtH,GACd,MAAM,IAAIlkI,MAAM,mCAAmC60I,iCAEvD,IAAK3Q,EAAMjxD,YAAcixD,EAAMv5F,WAAau5F,EAAM4Q,cAC7C5Q,EAAM6Q,QA/iBQ,YA+iBE7Q,EAAM6Q,OACvB,MAAM,IAAI/0I,MAAM,mCAAmC60I,6FAEvD,GAAI3Q,EAAM8Q,YAAc9Q,EAAMv5F,SAC1B,MAAM,IAAI3qC,MAAM,mCAAmC60I,uDAEvD,GAAI3Q,EAAM8Q,YAAc9Q,EAAM4Q,aAC1B,MAAM,IAAI90I,MAAM,mCAAmC60I,2DAEvD,GAAI3Q,EAAMv5F,UAAYu5F,EAAM4Q,aACxB,MAAM,IAAI90I,MAAM,mCAAmC60I,yDAEvD,GAAI3Q,EAAM8Q,YAAc9Q,EAAMjxD,UAC1B,MAAM,IAAIjzE,MAAM,mCAAmC60I,wDAEvD,GAAI3Q,EAAMzsI,MAAQysI,EAAM+Q,QACpB,MAAM,IAAIj1I,MAAM,mCAAmC60I,gDAEvD,QAAyB,IAArB3Q,EAAM8Q,aAA0B9Q,EAAMjxD,YAAcixD,EAAMv5F,WAAau5F,EAAM4Q,aAC7E,MAAM,IAAI90I,MAAM,mCAAmC60I,8FAEvD,QAAmB,IAAf3Q,EAAMzsI,WAAqC,IAAlBysI,EAAM+Q,QAC/B,MAAM,IAAIj1I,MAAM,mCAAmC60I,6DAEvD,GAA0B,iBAAf3Q,EAAMzsI,MAA8C,MAAzBysI,EAAMzsI,KAAK2B,OAAO,GACpD,MAAM,IAAI4G,MAAM,mCAAmC60I,sCAEvD,GAAmB,KAAf3Q,EAAMzsI,WAAoC,IAArBysI,EAAM8Q,iBAA6C,IAApB9Q,EAAMkQ,UAG1D,MAAM,IAAIp0I,MAAM,2CAA2C60I,oBAA2B3Q,EAAM8Q,mIAEhG,QAAwB,IAApB9Q,EAAMkQ,WAA4C,SAApBlQ,EAAMkQ,WAA4C,WAApBlQ,EAAMkQ,UAClE,MAAM,IAAIp0I,MAAM,mCAAmC60I,uDAEnD3Q,EAAMv5F,UACN+pG,GAAexQ,EAAMv5F,SAAUkqG,GAQvC,SAASD,GAAYD,EAAYO,GAC7B,OAAKA,EAGAP,GAAeO,EAAaz9I,KAGxBk9I,IAAeO,EAAaz9I,KACvBk9I,EAAH,KAEDA,GAAcO,EAAaz9I,KAC1By9I,EAAaz9I,KAGb,GAAGk9I,KAAcO,EAAaz9I,OAT9B,GAHAk9I,EAoBf,SAASQ,GAAkBrqG,GAEvB,MAAMH,EAAWG,EAAEH,UAAYG,EAAEH,SAAS3vC,IAAIm6I,IAExC98I,EAAIsyC,EAAWhyC,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI4V,GAAI,CAAEH,SAAAA,IAAchyC,OAAOu8B,OAAO,GAAI4V,GAI3F,OAHKzyC,EAAE46E,YAActoC,GAAYtyC,EAAEy8I,eAAkBz8I,EAAE08I,QAtnBpC,YAsnB8C18I,EAAE08I,SAC/D18I,EAAE46E,UAAY,IAEX56E,EA2BX,SAAS+8I,GAAa58I,EAAGC,GAMrB,MAAM48I,EAAwB18I,OAAOC,KAAKJ,GAEpC88I,EAAwB38I,OAAOC,KAAKH,GAC1C,IAAK48I,IAAOC,GAAMD,EAAGh7I,QAAUi7I,EAAGj7I,OAC9B,OAAO,EAGX,IAAI2U,EACJ,IAAK,IAAI/U,EAAI,EAAGA,EAAIo7I,EAAGh7I,OAAQJ,IAE3B,GADA+U,EAAMqmI,EAAGp7I,IACJs7I,GAAoB/8I,EAAEwW,GAAMvW,EAAEuW,IAC/B,OAAO,EAGf,OAAO,EAQX,SAASumI,GAAoB/8I,EAAGC,GAC5B,OAAI0V,MAAM4I,QAAQve,IAAM2V,MAAM4I,QAAQte,GAC9BD,EAAE6B,QAAU5B,EAAE4B,QAEX7B,EAAEglC,MAITg4G,GAAS/8I,EAAE2C,QAAQo6I,IAAU,GAGtBh9I,IAAMC,EASrB,SAAS,GAAQiI,GACb,OAAOyN,MAAM3T,UAAU0I,OAAO2J,MAAM,GAAInM,GAQ5C,SAAS,GAAKlI,GACV,OAAOA,EAAE6B,OAAS,EAAI7B,EAAEA,EAAE6B,OAAS,GAAK,KAoB5C,SAASxB,GAAQmC,EAAK8uB,GAClB,IAAK,MAAMqM,KAAQn7B,EACXA,EAAIuX,eAAe4jB,IACnBrM,EAAS9uB,EAAIm7B,GAAOA,GAqDhC,SAASs/G,GAAmB7wI,GACxB,OAAI,GAAcA,GACPA,EAEP,GAAWA,GAIJ,EAAKiR,QAAQpU,QAAQmD,IAEzB0qH,GAAG1qH,GAoBd,SAAS8wI,GAAa/hE,EAAWgiE,EAAWC,GACxC,OAAIA,EAYR,SAA0BjiE,EAAWgiE,GAEjC,OAAOP,GAAazhE,EAAWgiE,GAFnC,CAXgChiE,EAAUggC,YAAagiC,EAAUhiC,cAoBjE,SAASkiC,EAAmBliE,EAAWgiE,GACnC,IAAKG,GAAUniE,EAAUugE,SAAUyB,EAAUzB,UACzC,OAAO,EACX,GAAIvgE,EAAUoiE,mBAAqBJ,EAAUI,iBACzC,OAAO,EACX,IAAK,MAAM19I,KAAKs9I,EAAUhrG,SAAU,CAChC,IAAKgpC,EAAUhpC,SAAStyC,GACpB,OAAO,EACX,IAAKw9I,EAAmBliE,EAAUhpC,SAAStyC,GAAIs9I,EAAUhrG,SAAStyC,IAC9D,OAAO,EAEf,OAAO,EAXX,CAnB+Bs7E,EAAUrwE,KAAMqyI,EAAUryI,MAqCzD,SAA6BqwE,EAAWgiE,GAEpC,OAAOh9I,OAAOC,KAAK+8I,GAAWt7I,QAAU1B,OAAOC,KAAK+6E,GAAWt5E,QAC3D1B,OAAOC,KAAK+8I,GAAWn4G,MAIvBxuB,GAAOumI,GAAoB5hE,EAAU3kE,GAAM2mI,EAAU3mI,KAP7D,CAnC+B2kE,EAAUggC,YAAagiC,EAAUhiC,cAiDhE,SAASqiC,EAAqBriE,EAAWgiE,GACrC,OAQJ,SAASM,EAA2BtiE,EAAWgiE,EAAWO,GACtD,GAAIviE,EAAUugE,SAAS75I,OAAS67I,EAAe77I,OAG3C,QAAKy7I,GADWniE,EAAUugE,SAASz2I,MAAM,EAAGy4I,EAAe77I,QACnC67I,KAEpBP,EAAUtB,cAIb,GAAI1gE,EAAUugE,SAAS75I,SAAW67I,EAAe77I,OAAQ,CAC1D,IAAKy7I,GAAUniE,EAAUugE,SAAUgC,GAC/B,OAAO,EACX,IAAK,MAAM79I,KAAKs9I,EAAUhrG,SAAU,CAChC,IAAKgpC,EAAUhpC,SAAStyC,GACpB,OAAO,EACX,IAAK29I,EAAqBriE,EAAUhpC,SAAStyC,GAAIs9I,EAAUhrG,SAAStyC,IAChE,OAAO,EAEf,OAAO,EAEN,CAED,MAAMuX,EAAUsmI,EAAez4I,MAAM,EAAGk2E,EAAUugE,SAAS75I,QAErDw6B,EAAOqhH,EAAez4I,MAAMk2E,EAAUugE,SAAS75I,QACrD,QAAKy7I,GAAUniE,EAAUugE,SAAUtkI,MAE9B+jE,EAAUhpC,SAAuB,SAE/BsrG,EAA2BtiE,EAAUhpC,SAAuB,QAAGgrG,EAAW9gH,IA9BzF,CARsC8+C,EAAWgiE,EAAWA,EAAUzB,UADtE,CAhD6BvgE,EAAUrwE,KAAMqyI,EAAUryI,MAwHvD,MAAM6yI,GAOF,YAAY7yI,EAAMqwG,EAAayiC,GAC3B78I,KAAK+J,KAAOA,EACZ/J,KAAKo6G,YAAcA,EACnBp6G,KAAK68I,SAAWA,EAKpB,oBAII,OAHK78I,KAAK88I,iBACN98I,KAAK88I,eAAiBtC,GAAkBx6I,KAAKo6G,cAE1Cp6G,KAAK88I,eAMhB,WAAa,OAAOC,GAAmBC,UAAUh9I,OAiCrD,MAAMi9I,GAKF,YAAYtC,EAAUvpG,GAClBpxC,KAAK26I,SAAWA,EAChB36I,KAAKoxC,SAAWA,EAIhBpxC,KAAKqmB,OAAS,KACd/mB,GAAQ8xC,EAAU,CAOjBiH,EAAG94C,IAAM84C,EAAEhyB,OAASrmB,MAMzB,cAAgB,OAAOA,KAAKw8I,iBAAmB,EAK/C,uBAAyB,OAAOp9I,OAAOC,KAAKW,KAAKoxC,UAAUtwC,OAK3D,WAAa,OAAOo8I,GAAel9I,OAuDvC,MAAMm9I,GAKF,YAAYj/I,EAAM0vD,GACd5tD,KAAK9B,KAAOA,EACZ8B,KAAK4tD,WAAaA,EAKtB,mBAII,OAHK5tD,KAAKo9I,gBACNp9I,KAAKo9I,cAAgB5C,GAAkBx6I,KAAK4tD,aAEzC5tD,KAAKo9I,cAMhB,WAAa,OAAOC,GAAcr9I,OAqCtC,SAASu8I,GAAUe,EAAIC,GACnB,OAAID,EAAGx8I,SAAWy8I,EAAGz8I,QAEdw8I,EAAGr5G,MAAM,CAKfhlC,EAAGyB,IAAMzB,EAAEf,OAASq/I,EAAG78I,GAAGxC,MAQ/B,SAASs/I,GAAqB1yI,EAASynB,GAEnC,IAAItrB,EAAM,GAqBV,OApBA3H,GAAQwL,EAAQsmC,SAAU,CAKzB2B,EAAO0qG,KA7pCW,YA8pCXA,IACAx2I,EAAMA,EAAI0C,OAAO4oB,EAAGwgB,EAAO0qG,OAGnCn+I,GAAQwL,EAAQsmC,SAAU,CAKzB2B,EAAO0qG,KAvqCW,YAwqCXA,IACAx2I,EAAMA,EAAI0C,OAAO4oB,EAAGwgB,EAAO0qG,OAG5Bx2I,EAeX,MAAMy2I,IAoCN,MAAMC,GAMF,MAAM1zE,GAEF,MAAMzqE,EAAI,IAAIo+I,GAAU3zE,GACxB,OAAO,IAAI2yE,GAAQp9I,EAAEq+I,mBAAoBr+I,EAAEs+I,mBAAoBt+I,EAAEu+I,iBAOrE,UAAUC,GAON,MAAO,GALS,IA0BxB,SAASC,EAAiBnzI,EAASf,GAC/B,IAAKe,EAAQgwI,cACT,OAAOoC,GAAepyI,GAE1B,GAAIf,EAAM,CAEN,MAAM06H,EAAU35H,EAAQsmC,SAAuB,QAC3C6sG,EAAiBnzI,EAAQsmC,SAAuB,SAAG,GACnD,GAEEA,EAAW,GAWjB,OAVA9xC,GAAQwL,EAAQsmC,SAAU,CAKzBiH,EAAG94C,KA3xCW,YA4xCPA,GACA6xC,EAAS/tC,KAAK,GAAG9D,KAAK0+I,EAAiB5lG,GAAG,QAG3CjH,EAAStwC,OAAS,EAAI,GAAG2jI,KAAWrzF,EAASnxC,KAAK,SAAWwkI,EAEnE,CAED,MAAMrzF,EAAWosG,GAAqB1yI,EAAS,CAK9CutC,EAAG94C,IAzyCW,YA0yCPA,EACO,CAAC0+I,EAAiBnzI,EAAQsmC,SAAuB,SAAG,IAExD,CAAC,GAAG7xC,KAAK0+I,EAAiB5lG,GAAG,OAExC,MAAO,GAAG6kG,GAAepyI,OAAasmC,EAASnxC,KAAK,UApC5D,CA1B6C+9I,EAAKj0I,MAAM,KA0JxD,SAA8BwvG,GAE1B,MAAM2kC,EAAY9+I,OAAOC,KAAKk6G,GAAQ93G,IAIrCgJ,IAEG,MAAMY,EAAQkuG,EAAO9uG,GACrB,OAAOmK,MAAM4I,QAAQnS,GACjBA,EAAM5J,IAIN42C,GAAK,GAAG8lG,GAAe1zI,MAAS0zI,GAAe9lG,MAAOp4C,KAAK,KAC3D,GAAGk+I,GAAe1zI,MAAS0zI,GAAe9yI,OAElD,OAAO6yI,EAAUp9I,OAAS,IAAIo9I,EAAUj+I,KAAK,KAAS,GAjB1D,CAxJ2C+9I,EAAK5jC,eAEE,iBAAlB4jC,EAAKnB,SAAwB,IAgGlDl0E,UAhG2Fq1E,EAAc,UAAO,MAK3H,MAAMjB,GAAqB,IAAIY,GAK/B,SAAST,GAAepyI,GACpB,OAAOA,EAAQ6vI,SAASl5I,IAIxBjC,GAAK69I,GAAc79I,IAAKS,KAAK,KAsDjC,SAASm+I,GAAgB18I,GACrB,OAAOylH,mBAAmBzlH,GACrByC,QAAQ,OAAQ,KAChBA,QAAQ,QAAS,KACjBA,QAAQ,OAAQ,KAChBA,QAAQ,QAAS,KAU1B,SAASg6I,GAAez8I,GACpB,OAAO08I,GAAgB18I,GAAGyC,QAAQ,QAAS,KAsB/C,SAASk6I,GAAiB38I,GACtB,OAAO08I,GAAgB18I,GAAGyC,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OAAOA,QAAQ,QAAS,KAM3F,SAASm6I,GAAO58I,GACZ,OAAO8lH,mBAAmB9lH,GAQ9B,SAAS68I,GAAY78I,GACjB,OAAO48I,GAAO58I,EAAEyC,QAAQ,MAAO,QAMnC,SAASk5I,GAAcn/I,GACnB,MAAO,GAAGmgJ,GAAiBngJ,EAAKA,QAMLq7G,EANmCr7G,EAAK0vD,WAO5DxuD,OAAOC,KAAKk6G,GACd93G,IAILgU,GAAO,IAAI4oI,GAAiB5oI,MAAQ4oI,GAAiB9kC,EAAO9jG,OACvDxV,KAAK,MAPd,IAA+Bs5G,EAiC/B,MAAMilC,GAAa,gBAKnB,SAASC,GAAc1zG,GAEnB,MAAMhrC,EAAQgrC,EAAIhrC,MAAMy+I,IACxB,OAAOz+I,EAAQA,EAAM,GAAK,GAG9B,MAAM2+I,GAAiB,YAYjBC,GAAuB,WAW7B,MAAMf,GAIF,YAAY3zE,GACRjqE,KAAKiqE,IAAMA,EACXjqE,KAAK+1B,UAAYk0C,EAKrB,mBAEI,OADAjqE,KAAK4+I,gBAAgB,KACE,KAAnB5+I,KAAK+1B,WAAoB/1B,KAAK6+I,eAAe,MAAQ7+I,KAAK6+I,eAAe,KAClE,IAAI5B,GAAgB,GAAI,IAG5B,IAAIA,GAAgB,GAAIj9I,KAAK8+I,iBAKxC,mBAEI,MAAMvlC,EAAS,GACf,GAAIv5G,KAAK4+I,gBAAgB,KACrB,EAAA,CACI5+I,KAAK++I,gBAAgBxlC,SAChBv5G,KAAK4+I,gBAAgB,MAElC,OAAOrlC,EAKX,gBACI,OAAOv5G,KAAK4+I,gBAAgB,KAAOp3B,mBAAmBxnH,KAAK+1B,WAAa,KAM5E,gBACI,GAAuB,KAAnB/1B,KAAK+1B,UACL,MAAO,GAEX/1B,KAAK4+I,gBAAgB,KAErB,MAAMjE,EAAW,GAIjB,IAHK36I,KAAK6+I,eAAe,MACrBlE,EAASt3I,KAAKrD,KAAKg/I,gBAEhBh/I,KAAK6+I,eAAe,OAAS7+I,KAAK6+I,eAAe,QAAU7+I,KAAK6+I,eAAe,OAClF7+I,KAAKi/I,QAAQ,KACbtE,EAASt3I,KAAKrD,KAAKg/I,gBAGvB,IAAI5tG,EAAW,GACXpxC,KAAK6+I,eAAe,QACpB7+I,KAAKi/I,QAAQ,KACb7tG,EAAWpxC,KAAKk/I,aAAY,IAGhC,IAAIj4I,EAAM,GAOV,OANIjH,KAAK6+I,eAAe,OACpB53I,EAAMjH,KAAKk/I,aAAY,KAEvBvE,EAAS75I,OAAS,GAAK1B,OAAOC,KAAK+xC,GAAUtwC,OAAS,KACtDmG,EAAkB,QAAI,IAAIg2I,GAAgBtC,EAAUvpG,IAEjDnqC,EAQX,eAEI,MAAM/I,EAAOugJ,GAAcz+I,KAAK+1B,WAChC,GAAa,KAAT73B,GAAe8B,KAAK6+I,eAAe,KACnC,MAAM,IAAIp4I,MAAM,mDAAmDzG,KAAK+1B,eAG5E,OADA/1B,KAAKi/I,QAAQ/gJ,GACN,IAAIi/I,GAAWmB,GAAOpgJ,GAAO8B,KAAKm/I,qBAM7C,oBAEI,MAAM5lC,EAAS,GACf,KAAOv5G,KAAK4+I,gBAAgB,MACxB5+I,KAAKo/I,WAAW7lC,GAEpB,OAAOA,EAOX,WAAWA,GAEP,MAAM9jG,EAAMgpI,GAAcz+I,KAAK+1B,WAC/B,IAAKtgB,EACD,OAEJzV,KAAKi/I,QAAQxpI,GAEb,IAAIpK,EAAQ,GACZ,GAAIrL,KAAK4+I,gBAAgB,KAAM,CAE3B,MAAMS,EAAaZ,GAAcz+I,KAAK+1B,WAClCspH,IACAh0I,EAAQg0I,EACRr/I,KAAKi/I,QAAQ5zI,IAGrBkuG,EAAO+kC,GAAO7oI,IAAQ6oI,GAAOjzI,GAQjC,gBAAgBkuG,GAEZ,MAAM9jG,EApJd,SAA0Bs1B,GAEtB,MAAMhrC,EAAQgrC,EAAIhrC,MAAM2+I,IACxB,OAAO3+I,EAAQA,EAAM,GAAK,GAH9B,CAoJqCC,KAAK+1B,WAClC,IAAKtgB,EACD,OAEJzV,KAAKi/I,QAAQxpI,GAEb,IAAIpK,EAAQ,GACZ,GAAIrL,KAAK4+I,gBAAgB,KAAM,CAE3B,MAAMS,EAjJlB,SAAiCt0G,GAE7B,MAAMhrC,EAAQgrC,EAAIhrC,MAAM4+I,IACxB,OAAO5+I,EAAQA,EAAM,GAAK,GAH9B,CAiJuDC,KAAK+1B,WAC5CspH,IACAh0I,EAAQg0I,EACRr/I,KAAKi/I,QAAQ5zI,IAIrB,MAAMi0I,EAAaf,GAAY9oI,GAEzB8pI,EAAahB,GAAYlzI,GAC/B,GAAIkuG,EAAOvgG,eAAesmI,GAAa,CAGnC,IAAIE,EAAajmC,EAAO+lC,GACnB1qI,MAAM4I,QAAQgiI,KACfA,EAAa,CAACA,GACdjmC,EAAO+lC,GAAcE,GAEzBA,EAAWn8I,KAAKk8I,QAIhBhmC,EAAO+lC,GAAcC,EAS7B,YAAYE,GAER,MAAM9E,EAAW,GAEjB,IADA36I,KAAKi/I,QAAQ,MACLj/I,KAAK4+I,gBAAgB,MAAQ5+I,KAAK+1B,UAAUj1B,OAAS,GAAG,CAE5D,MAAM5C,EAAOugJ,GAAcz+I,KAAK+1B,WAE1BuF,EAAOt7B,KAAK+1B,UAAU73B,EAAK4C,QAGjC,GAAa,MAATw6B,GAAyB,MAATA,GAAyB,MAATA,EAChC,MAAM,IAAI70B,MAAM,qBAAqBzG,KAAKiqE,QAG9C,IAAIy1E,OAAa,EACbxhJ,EAAK2D,QAAQ,MAAQ,GACrB69I,EAAaxhJ,EAAK+D,OAAO,EAAG/D,EAAK2D,QAAQ,MACzC7B,KAAKi/I,QAAQS,GACb1/I,KAAKi/I,QAAQ,MAERQ,IACLC,EAloDO,WAqoDX,MAAMtuG,EAAWpxC,KAAK8+I,gBACtBnE,EAAS+E,GAA+C,IAAjCtgJ,OAAOC,KAAK+xC,GAAUtwC,OAAeswC,EAAuB,QAC/E,IAAI6rG,GAAgB,GAAI7rG,GAC5BpxC,KAAK4+I,gBAAgB,MAEzB,OAAOjE,EAOX,eAAe5vG,GAAO,OAAO/qC,KAAK+1B,UAAUoR,WAAW4D,GAOvD,gBAAgBA,GACZ,QAAI/qC,KAAK6+I,eAAe9zG,KACpB/qC,KAAK+1B,UAAY/1B,KAAK+1B,UAAUlyB,UAAUknC,EAAIjqC,SACvC,GASf,QAAQiqC,GACJ,IAAK/qC,KAAK4+I,gBAAgB7zG,GACtB,MAAM,IAAItkC,MAAM,aAAaskC,QAgCzC,MAAM40G,GAIF,YAAY51I,GAAQ/J,KAAK4/I,MAAQ71I,EAIjC,WAAa,OAAO/J,KAAK4/I,MAAMv0I,MAM/B,OAAOlM,GAEH,MAAMK,EAAIQ,KAAK6/I,aAAa1gJ,GAC5B,OAAOK,EAAEsB,OAAS,EAAItB,EAAEA,EAAEsB,OAAS,GAAK,KAO5C,SAAS3B,GAEL,MAAMqF,EAAIs7I,GAAS3gJ,EAAGa,KAAK4/I,OAC3B,OAAOp7I,EAAIA,EAAE4sC,SAAS3vC,IAItBtC,GAAKA,EAAEkM,OAAU,GAOrB,WAAWlM,GAEP,MAAMqF,EAAIs7I,GAAS3gJ,EAAGa,KAAK4/I,OAC3B,OAAOp7I,GAAKA,EAAE4sC,SAAStwC,OAAS,EAAI0D,EAAE4sC,SAAS,GAAG/lC,MAAQ,KAO9D,SAASlM,GAEL,MAAMK,EAAIugJ,GAAS5gJ,EAAGa,KAAK4/I,OAC3B,OAAIpgJ,EAAEsB,OAAS,EACJ,GAEDtB,EAAEA,EAAEsB,OAAS,GAAGswC,SAAS3vC,IAInC3C,GAAKA,EAAEuM,OACE5K,OAITu/I,GAAMA,IAAO7gJ,GAOjB,aAAaA,GAAK,OAAO4gJ,GAAS5gJ,EAAGa,KAAK4/I,OAAOn+I,IAIjDC,GAAKA,EAAE2J,QAgBX,SAASy0I,GAASz0I,EAAOyoC,GACrB,GAAIzoC,IAAUyoC,EAAKzoC,MACf,OAAOyoC,EACX,IAAK,MAAMf,KAASe,EAAK1C,SAAU,CAE/B,MAAM0C,EAAOgsG,GAASz0I,EAAO0nC,GAC7B,GAAIe,EACA,OAAOA,EAEf,OAAO,KASX,SAASisG,GAAS10I,EAAOyoC,GACrB,GAAIzoC,IAAUyoC,EAAKzoC,MACf,MAAO,CAACyoC,GACZ,IAAK,MAAMf,KAASe,EAAK1C,SAAU,CAE/B,MAAMlzC,EAAO6hJ,GAAS10I,EAAO0nC,GAC7B,GAAI70C,EAAK4C,OAEL,OADA5C,EAAKw4E,QAAQ5iC,GACN51C,EAGf,MAAO,GAKX,MAAM+hJ,GAKF,YAAY50I,EAAO+lC,GACfpxC,KAAKqL,MAAQA,EACbrL,KAAKoxC,SAAWA,EAKpB,WAAa,MAAO,YAAYpxC,KAAKqL,UAczC,SAAS60I,GAAkBpsG,GAEvB,MAAMryC,EAAM,GAQZ,OAPIqyC,GACAA,EAAK1C,SAAS9xC,QAIdyzC,GAAStxC,EAAIsxC,EAAM1nC,MAAMmwI,QAAUzoG,GAEhCtxC,EAqCX,MAAM0+I,WAAoBR,GAMtB,YAAY51I,EAAMgwI,GACd9yF,MAAMl9C,GACN/J,KAAK+5I,SAAWA,EAChBqG,GAAe,KAA2Br2I,GAK9C,WAAa,OAAO/J,KAAK+5I,SAAShhI,YActC,SAASsnI,GAAiBC,EAAS9mE,GAE/B,MAAMugE,EAqBV,SAAkCuG,EAAS9mE,GAEvC,MAQM+mE,EAAY,IAAIC,GAAuB,GARzB,GAIK,GAER,GAJC,GAl8DC,UAw8DkGhnE,EAAe,KAAM8mE,EAAQv2I,MAAO,EAAG,IAC5J,OAAO,IAAI02I,GAAoB,GAAI,IAAIR,GAASM,EAAW,KAX/D,CArB8CD,EAAS9mE,GAE7CknE,EAAW,IAAI,GAAgB,CAAC,IAAIvD,GAAW,GAAI,MAEnDwD,EAAc,IAAI,GAAgB,IAElCC,EAAY,IAAI,GAAgB,IAEhCC,EAAmB,IAAI,GAAgB,IAEvChE,EAAW,IAAI,GAAgB,IAE/B0D,EAAY,IAAI,GAAeG,EAAUC,EAAaE,EAAkBhE,EAAU+D,EAr7DrE,UAq7DgGpnE,EAAeugE,EAAShwI,MAE3I,OADAw2I,EAAUxG,SAAWA,EAAShwI,KACvB,IAAIo2I,GAAY,IAAIF,GAASM,EAAW,IAAKxG,GA8BxD,MAAM,GAYF,YAAY9vE,EAAKsvC,EAAQa,EAAayiC,EAAUz9H,EAAMo8H,EAAQ9hE,EAAWonE,GACrE9gJ,KAAKiqE,IAAMA,EACXjqE,KAAKu5G,OAASA,EACdv5G,KAAKo6G,YAAcA,EACnBp6G,KAAK68I,SAAWA,EAChB78I,KAAKof,KAAOA,EACZpf,KAAKw7I,OAASA,EACdx7I,KAAK05E,UAAYA,EACjB15E,KAAK+gJ,gBAAkBD,EAM3B,kBAAoB,OAAO9gJ,KAAK+gJ,gBAAgB/G,YAKhD,WAAa,OAAOh6I,KAAKghJ,aAAaj3I,KAKtC,aAAe,OAAO/J,KAAKghJ,aAAa36H,OAAOrmB,MAK/C,iBAAmB,OAAOA,KAAKghJ,aAAa51E,WAAWprE,MAKvD,eAAiB,OAAOA,KAAKghJ,aAAa5vG,SAASpxC,MAKnD,mBAAqB,OAAOA,KAAKghJ,aAAanB,aAAa7/I,MAO3D,eAQI,OAPKA,KAAKihJ,YACNjhJ,KAAKihJ,UAAYjhJ,KAAKu5G,OAAOrxD,KAAK,EAIjC1oD,GAAMg7I,GAAkBh7I,MAEtBQ,KAAKihJ,UAOhB,oBASI,OARKjhJ,KAAK88I,iBACN98I,KAAK88I,eACD98I,KAAKo6G,YAAYlyD,KAAK,EAIrB1oD,GAAMg7I,GAAkBh7I,MAE1BQ,KAAK88I,eAKhB,WACI,OAAO98I,KAAK+5I,SAAW/5I,KAAK+5I,SAAShhI,WAAa,UAAU/Y,KAAK+gJ,oBAyEzE,SAASG,GAA2BvW,EAAOwW,EAA4B,aAEnE,MAAMtB,EAAelV,EAAMkV,aAE3B,IAAIuB,EAAyB,EAC7B,GAAkC,WAA9BD,EAEA,IADAC,EAAyBvB,EAAa/+I,OAAS,EACxCsgJ,GAA0B,GAAG,CAEhC,MAAM/qI,EAAUwpI,EAAauB,GAEvB/6H,EAASw5H,EAAauB,EAAyB,GAErD,GAAI/qI,EAAQ2jI,aAA4C,KAA7B3jI,EAAQ2jI,YAAY97I,KAC3CkjJ,QAGC,CAAA,GAAK/6H,EAAOqzD,UAIb,MAHA0nE,KAOZ,OAOJ,SAA0BvB,GACtB,OAAOA,EAAajhJ,OAAO,CAK1BqI,EAAKo6I,KAAAA,CAOO9nC,OALMn6G,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI10B,EAAIsyG,QAAS8nC,EAAK9nC,QAKhDn6F,KAHJhgB,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI10B,EAAImY,MAAOiiI,EAAKjiI,MAGtClX,QADP9I,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI10B,EAAIiB,SAAUm5I,EAAKC,iBAEnE,CAAqB/nC,OAAQ,GAAIn6F,KAAM,GAAIlX,QAAS,KAd5D,CAP4B23I,EAAa37I,MAAMk9I,IA2C/C,MAAMZ,GAeF,YAAYv2E,EAAKsvC,EAAQa,EAAayiC,EAAUz9H,EAAMo8H,EAAQ9hE,EAAWsgE,EAAauH,EAAYC,EAAet5I,GAC7GlI,KAAKiqE,IAAMA,EACXjqE,KAAKu5G,OAASA,EACdv5G,KAAKo6G,YAAcA,EACnBp6G,KAAK68I,SAAWA,EAChB78I,KAAKof,KAAOA,EACZpf,KAAKw7I,OAASA,EACdx7I,KAAK05E,UAAYA,EACjB15E,KAAKg6I,YAAcA,EACnBh6I,KAAKyhJ,YAAcF,EACnBvhJ,KAAK0hJ,eAAiBF,EACtBxhJ,KAAK2hJ,SAAWz5I,EAMpB,WAAa,OAAOlI,KAAKghJ,aAAaj3I,KAKtC,aAAe,OAAO/J,KAAKghJ,aAAa36H,OAAOrmB,MAK/C,iBAAmB,OAAOA,KAAKghJ,aAAa51E,WAAWprE,MAKvD,eAAiB,OAAOA,KAAKghJ,aAAa5vG,SAASpxC,MAKnD,mBAAqB,OAAOA,KAAKghJ,aAAanB,aAAa7/I,MAI3D,eAII,OAHKA,KAAKihJ,YACNjhJ,KAAKihJ,UAAYzG,GAAkBx6I,KAAKu5G,SAErCv5G,KAAKihJ,UAKhB,oBAII,OAHKjhJ,KAAK88I,iBACN98I,KAAK88I,eAAiBtC,GAAkBx6I,KAAKo6G,cAE1Cp6G,KAAK88I,eAKhB,WASI,MAAO,cAPK98I,KAAKiqE,IAAIxoE,IAIrBqJ,GAAWA,EAAQiO,YAAa9Y,KAAK,gBAErBD,KAAKg6I,YAAch6I,KAAKg6I,YAAY97I,KAAO,QA4GnE,MAAMuiJ,WAA4Bd,GAM9B,YAAY11E,EAAKlgE,GACbk9C,MAAMl9C,GACN/J,KAAKiqE,IAAMA,EACXm2E,GAAe,KAA2Br2I,GAK9C,WAAa,OAAO63I,GAAc5hJ,KAAK4/I,QAe3C,SAASQ,GAAejiG,EAAOrK,GAC3BA,EAAKzoC,MAAM21I,aAAe7iG,EAC1BrK,EAAK1C,SAAS9xC,QAIdR,GAAKshJ,GAAejiG,EAAOr/C,IAM/B,SAAS8iJ,GAAc9tG,GAEnB,MAAMh1C,EAAIg1C,EAAK1C,SAAStwC,OAAS,EAAI,MAAMgzC,EAAK1C,SAAS3vC,IAAImgJ,IAAe3hJ,KAAK,WAAa,GAC9F,MAAO,GAAG6zC,EAAKzoC,QAAQvM,IAS3B,SAAS+iJ,GAAsBlX,GAC3B,GAAIA,EAAMoP,SAAU,CAEhB,MAAM+H,EAAkBnX,EAAMoP,SAExBgI,EAAepX,EAAMoW,gBAC3BpW,EAAMoP,SAAWgI,EACZlG,GAAaiG,EAAgB1nC,YAAa2nC,EAAa3nC,cACpCuwB,EAAmB,YAAErvG,KAAKymH,EAAa3nC,aAE3D0nC,EAAgBjF,WAAakF,EAAalF,UACtBlS,EAAgB,SAAErvG,KAAKymH,EAAalF,UAEvDhB,GAAaiG,EAAgBvoC,OAAQwoC,EAAaxoC,SAC/BoxB,EAAc,OAAErvG,KAAKymH,EAAaxoC,QArzDlE,SAA4Bt6G,EAAGC,GAC3B,GAAID,EAAE6B,SAAW5B,EAAE4B,OACf,OAAO,EACX,IAAK,IAAIJ,EAAI,EAAGA,EAAIzB,EAAE6B,SAAUJ,EAC5B,IAAKm7I,GAAa58I,EAAEyB,GAAIxB,EAAEwB,IACtB,OAAO,EAEf,OAAO,EAPX,CAuzDgCohJ,EAAgB73E,IAAK83E,EAAa93E,MAClC0gE,EAAW,IAAErvG,KAAKymH,EAAa93E,KAElD4xE,GAAaiG,EAAgB1iI,KAAM2iI,EAAa3iI,OAC7BurH,EAAY,KAAErvG,KAAKymH,EAAa3iI,WAIxDurH,EAAMoP,SAAWpP,EAAMoW,gBAEHpW,EAAY,KAAErvG,KAAKqvG,EAAMoW,gBAAgB3hI,MAQrE,SAAS4iI,GAA0B/iJ,EAAGC,GAv1CtC,IAAuBo+I,EAAIC,EA41CvB,OAHuB1B,GAAa58I,EAAEs6G,OAAQr6G,EAAEq6G,SAx1CzCgjC,GADYe,EAy1CsDr+I,EAAEgrE,IAz1CpDszE,EAy1CyDr+I,EAAE+qE,MAx1CtDqzE,EAAGr5G,MAAM,CAKpChlC,EAAGyB,IAAMm7I,GAAa58I,EAAE2uD,WAAY2vF,EAAG78I,GAAGktD,iBAq1ClB3uD,EAAEonB,SAAYnnB,EAAEmnB,WAEnCpnB,EAAEonB,QAAU27H,GAA0B/iJ,EAAEonB,OAA2BnnB,EAAS,SAyItF,SAAS+iJ,GAAeC,GACpB,MAA0B,iBAAZA,GAAmC,MAAXA,IAAoBA,EAAQC,UAAYD,EAAQE,YAU1F,SAAS,GAAKC,EAAiBC,EAAiBhC,EAASlmC,EAAayiC,GAElE,IAAI0F,EAAK,GAeT,OAdInoC,GACA96G,GAAQ86G,EAAa,CAKpB/uG,EAAOZ,KACJ83I,EAAG93I,GAAQmK,MAAM4I,QAAQnS,GAASA,EAAM5J,IAIvC42C,GAAM,GAAGA,GAAQ,GAAGhtC,IAIlB,IAAIuxI,GADX0D,EAAQv2I,OAASs4I,EACEC,EAU3B,SAASE,EAAensI,EAASosI,EAAYC,GAEzC,MAAMtxG,EAAW,GAcjB,OAbA9xC,GAAQ+W,EAAQ+6B,SAAU,CAKzBtyC,EAAG4gJ,KAEItuG,EAASsuG,GADT5gJ,IAAM2jJ,EACiBC,EAGAF,EAAe1jJ,EAAG2jJ,EAAYC,KAGtD,IAAIzF,GAAgB5mI,EAAQskI,SAAUvpG,GAhBjD,CARsCkvG,EAAQv2I,KAAMs4I,EAAiBC,GAFzBC,EAAI1F,GA4BhD,MAAM8F,GAMF,YAAY36I,EAAY46I,EAAoBC,GAIxC,GAHA7iJ,KAAKgI,WAAaA,EAClBhI,KAAK4iJ,mBAAqBA,EAC1B5iJ,KAAK6iJ,SAAWA,EACZ76I,GAAc66I,EAAS/hJ,OAAS,GAAKmhJ,GAAeY,EAAS,IAC7D,MAAM,IAAIp8I,MAAM,8CAGpB,MAAMq8I,EAAgBD,EAAS1qH,KAI/Br5B,GAAkB,iBAANA,GAAuB,MAALA,GAAaA,EAAEqjJ,SAC7C,GAAIW,GAAiBA,IAAkB,GAAKD,GACxC,MAAM,IAAIp8I,MAAM,2CAMxB,SACI,OAAOzG,KAAKgI,YAAuC,IAAzBhI,KAAK6iJ,SAAS/hJ,QAAoC,KAApBd,KAAK6iJ,SAAS,IA+E9E,MAAME,GAMF,YAAYnI,EAAcoI,EAAiBhvI,GACvChU,KAAK46I,aAAeA,EACpB56I,KAAKgjJ,gBAAkBA,EACvBhjJ,KAAKgU,MAAQA,GAyDrB,SAASivI,GAAQf,GACb,MAAuB,iBAAZA,GAAmC,MAAXA,GAAmBA,EAAQC,QACnDD,EAAQC,QAAsB,QAElC,GAAGD,EAmBd,SAASgB,GAAmBtI,EAAcztD,EAAY01D,GAIlD,GAHKjI,IACDA,EAAe,IAAIqC,GAAgB,GAAI,KAEN,IAAjCrC,EAAaD,SAAS75I,QAAgB85I,EAAaE,cACnD,OAAOqI,GAA2BvI,EAAcztD,EAAY01D,GAGhE,MAAM7hJ,EAmEV,SAAsB45I,EAAcztD,EAAY01D,GAE5C,IAAIO,EAAsB,EAEtBC,EAAmBl2D,EAEvB,MAAMm2D,EAAU,CAAEvjJ,OAAO,EAAOwjJ,UAAW,EAAGC,aAAc,GAC5D,KAAOH,EAAmBzI,EAAaD,SAAS75I,QAAQ,CACpD,GAAIsiJ,GAAuBP,EAAS/hJ,OAChC,OAAOwiJ,EAEX,MAAMplJ,EAAO08I,EAAaD,SAAS0I,GAE7BhC,EAAO4B,GAAQJ,EAASO,IAExB9nH,EAAO8nH,EAAsBP,EAAS/hJ,OAAS,EAAI+hJ,EAASO,EAAsB,GAAK,KAC7F,GAAIC,EAAmB,QAAcntI,IAATmrI,EACxB,MACJ,GAAIA,GAAQ/lH,GAAyB,iBAATA,QAAuCplB,IAAjBolB,EAAK6mH,QAAuB,CAC1E,IAAKsB,GAAQpC,EAAM/lH,EAAMp9B,GACrB,OAAOolJ,EACXF,GAAuB,MAEtB,CACD,IAAKK,GAAQpC,EAAM,GAAInjJ,GACnB,OAAOolJ,EACXF,IAEJC,IAEJ,MAAO,CAAEtjJ,OAAO,EAAMwjJ,UAAWF,EAAkBG,aAAcJ,GA9BrE,CAnE2BxI,EAAcztD,EAAY01D,GAE3Ca,EAAiBb,EAAS3+I,MAAMlD,EAAEwiJ,cACxC,GAAIxiJ,EAAEjB,OAASiB,EAAEuiJ,UAAY3I,EAAaD,SAAS75I,OAAQ,CAEvD,MAAM+9H,EAAI,IAAIoe,GAAgBrC,EAAaD,SAASz2I,MAAM,EAAGlD,EAAEuiJ,WAAY,IAG3E,OAFA1kB,EAAEztF,SAAuB,QACrB,IAAI6rG,GAAgBrC,EAAaD,SAASz2I,MAAMlD,EAAEuiJ,WAAY3I,EAAaxpG,UACxE+xG,GAA2BtkB,EAAG,EAAG6kB,GAEvC,OAAI1iJ,EAAEjB,OAAmC,IAA1B2jJ,EAAe5iJ,OACxB,IAAIm8I,GAAgBrC,EAAaD,SAAU,IAE7C35I,EAAEjB,QAAU66I,EAAaE,cACvB6I,GAAsB/I,EAAcztD,EAAY01D,GAElD7hJ,EAAEjB,MACAojJ,GAA2BvI,EAAc,EAAG8I,GAG5CC,GAAsB/I,EAAcztD,EAAY01D,GAS/D,SAASM,GAA2BvI,EAAcztD,EAAY01D,GAC1D,GAAwB,IAApBA,EAAS/hJ,OACT,OAAO,IAAIm8I,GAAgBrC,EAAaD,SAAU,IAEjD,CAED,MAAMwH,EAxDd,SAAoBU,GAChB,MAA6B,iBAAhBA,EAAS,SAEM3sI,IAAxB2sI,EAAS,GAAGV,QADL,CAAE,QAAkBU,GAGxBA,EAAS,GAAGV,QALvB,CAwDmCU,GAErBzxG,EAAW,GAqBjB,OApBA9xC,GAAQ6iJ,EAAS,CAKhBU,EAAUrH,KACU,OAAbqH,IACAzxG,EAASoqG,GAAU0H,GAAmBtI,EAAaxpG,SAASoqG,GAASruD,EAAY01D,MAGzFvjJ,GAAQs7I,EAAaxpG,SAAU,CAK9B2B,EAAO0qG,UACyBvnI,IAAzBisI,EAAQ1E,KACRrsG,EAASqsG,GAAe1qG,KAGzB,IAAIkqG,GAAgBrC,EAAaD,SAAUvpG,IA+C1D,SAASuyG,GAAsB/I,EAAcztD,EAAY01D,GAErD,MAAMh6I,EAAQ+xI,EAAaD,SAASz2I,MAAM,EAAGipF,GAE7C,IAAIzsF,EAAI,EACR,KAAOA,EAAImiJ,EAAS/hJ,QAAQ,CACxB,GAA2B,iBAAhB+hJ,EAASniJ,SAA2CwV,IAAxB2sI,EAASniJ,GAAGyhJ,QAAuB,CAEtE,MAAM/wG,EAAWwyG,GAAyBf,EAASniJ,GAAGyhJ,SACtD,OAAO,IAAIlF,GAAgBp0I,EAAOuoC,GAGtC,GAAU,IAAN1wC,GAAWuhJ,GAAeY,EAAS,IAAK,CAGxCh6I,EAAMxF,KAAK,IAAI85I,GADLvC,EAAaD,SAASxtD,GACJjvF,KAAM2kJ,EAAS,KAC3CniJ,IACA,SAGJ,MAAM2gJ,EAAO4B,GAAQJ,EAASniJ,IAExB46B,EAAQ56B,EAAImiJ,EAAS/hJ,OAAS,EAAK+hJ,EAASniJ,EAAI,GAAK,KACvD2gJ,GAAQ/lH,GAAQ2mH,GAAe3mH,IAC/BzyB,EAAMxF,KAAK,IAAI85I,GAAWkE,EAAM,GAAU/lH,KAC1C56B,GAAK,IAGLmI,EAAMxF,KAAK,IAAI85I,GAAWkE,EAAM,KAChC3gJ,KAGR,OAAO,IAAIu8I,GAAgBp0I,EAAO,IAMtC,SAAS+6I,GAAyBzB,GAE9B,MAAM/wG,EAAW,GAWjB,OAVA9xC,GAAQ6iJ,EAAS,CAKhBU,EAAUrH,KACU,OAAbqH,IACAzxG,EAASoqG,GAAUmI,GAAsB,IAAI1G,GAAgB,GAAI,IAAK,EAAG4F,MAG1EzxG,EAMX,SAAS,GAAUmoE,GAEf,MAAMtyG,EAAM,GAOZ,OANA3H,GAAQi6G,EAAQ,CAKflhE,EAAG94C,IAAM0H,EAAI1H,GAAK,GAAG84C,GACfpxC,EAQX,SAASw8I,GAAQvlJ,EAAMq7G,EAAQzuG,GAC3B,OAAO5M,GAAQ4M,EAAQ5M,MAAQ29I,GAAatiC,EAAQzuG,EAAQ8iD,YAwBhE,MAAMi2F,GAOF,YAAYC,EAAoBC,EAAaC,EAAWC,GACpDjkJ,KAAK8jJ,mBAAqBA,EAC1B9jJ,KAAK+jJ,YAAcA,EACnB/jJ,KAAKgkJ,UAAYA,EACjBhkJ,KAAKikJ,aAAeA,EAMxB,SAASC,GAEL,MAAMC,EAAankJ,KAAK+jJ,YAAYnE,MAE9BwE,EAAWpkJ,KAAKgkJ,UAAYhkJ,KAAKgkJ,UAAUpE,MAAQ,KACzD5/I,KAAKqkJ,sBAAsBF,EAAYC,EAAUF,GACjDrC,GAAsB7hJ,KAAK+jJ,YAAYh6I,MACvC/J,KAAKskJ,oBAAoBH,EAAYC,EAAUF,GAUnD,sBAAsBK,EAAYC,EAAUC,GAExC,MAAMrzG,EAAW8uG,GAAkBsE,GAEnCD,EAAWnzG,SAAS9xC,QAIpBolJ,IAEI,MAAMC,EAAkBD,EAAYr5I,MAAMmwI,OAC1Cx7I,KAAK4kJ,iBAAiBF,EAAatzG,EAASuzG,GAAkBF,UACvDrzG,EAASuzG,KAGpBrlJ,GAAQ8xC,EAAU,CAKjBiH,EAAGwsG,KACA7kJ,KAAK8kJ,8BAA8BzsG,EAAGosG,KAU9C,iBAAiBF,EAAYC,EAAUO,GAEnC,MAAMC,EAAST,EAAWl5I,MAEpBg2I,EAAOmD,EAAWA,EAASn5I,MAAQ,KACzC,GAAI25I,IAAW3D,EAEX,GAAI2D,EAAOtrE,UAAW,CAGlB,MAAMphE,EAAUysI,EAAcE,WAAWD,EAAOxJ,QAC5CljI,GACAtY,KAAKqkJ,sBAAsBE,EAAYC,EAAUlsI,EAAQ84B,eAK7DpxC,KAAKqkJ,sBAAsBE,EAAYC,EAAUO,QAIjD1D,GAEArhJ,KAAK8kJ,8BAA8BN,EAAUO,GAUzD,8BAA8Bpa,EAAOuZ,GAC7BlkJ,KAAK8jJ,mBAAmBoB,aAAava,EAAMt/H,MAAM0uI,UACjD/5I,KAAKmlJ,2BAA2Bxa,EAAOuZ,GAGvClkJ,KAAKolJ,yBAAyBza,EAAOuZ,GAS7C,2BAA2BvZ,EAAOuZ,GAE9B,MAAM5rI,EAAU4rI,EAAee,WAAWta,EAAMt/H,MAAMmwI,QACtD,GAAIljI,GAAWA,EAAQkjI,OAAQ,CAE3B,MAAMv6D,EAAe3oE,EAAQkjI,OAAOx8D,SAE9BylE,EAAWnsI,EAAQ84B,SAASi0G,sBAClCrlJ,KAAK8jJ,mBAAmBnpG,MAAMgwF,EAAMt/H,MAAM0uI,SAAU,CAAE94D,aAAAA,EAAc0pD,MAAAA,EAAO8Z,SAAAA,KASnF,yBAAyB9Z,EAAOuZ,GAE5B,MAAM5rI,EAAU4rI,EAAee,WAAWta,EAAMt/H,MAAMmwI,QACtD,GAAIljI,EAAS,CAET,MAAM84B,EAAW8uG,GAAkBvV,GAE7B8Z,EAAW9Z,EAAMt/H,MAAMquE,UAAYphE,EAAQ84B,SAAW8yG,EAC5D5kJ,GAAQ8xC,EAAU,CAKjBiH,EAAG94C,IAAMS,KAAK8kJ,8BAA8BzsG,EAAGosG,IAC5CnsI,EAAQkjI,SAERljI,EAAQkjI,OAAO8J,aAEfhtI,EAAQ84B,SAASi0G,wBAW7B,oBAAoBd,EAAYC,EAAUC,GAEtC,MAAMrzG,EAAW8uG,GAAkBsE,GACnCD,EAAWnzG,SAAS9xC,QAIpBR,IACIkB,KAAKulJ,eAAezmJ,EAAGsyC,EAAStyC,EAAEuM,MAAMmwI,QAASiJ,GACjDzkJ,KAAKikJ,aAAa,IAAI9J,GAAcr7I,EAAEuM,MAAM0uI,aAE5CwK,EAAWnzG,SAAStwC,QACpBd,KAAKikJ,aAAa,IAAIhK,GAAmBsK,EAAWl5I,MAAM0uI,WAUlE,eAAewK,EAAYC,EAAUN,GAEjC,MAAMc,EAAST,EAAWl5I,MAEpBg2I,EAAOmD,EAAWA,EAASn5I,MAAQ,KAGzC,GAFAw2I,GAAsBmD,GAElBA,IAAW3D,EACX,GAAI2D,EAAOtrE,UAAW,CAGlB,MAAMphE,EAAU4rI,EAAesB,mBAAmBR,EAAOxJ,QACzDx7I,KAAKskJ,oBAAoBC,EAAYC,EAAUlsI,EAAQ84B,eAIvDpxC,KAAKskJ,oBAAoBC,EAAYC,EAAUN,QAInD,GAAIc,EAAOtrE,UAAW,CAGlB,MAAMphE,EAAU4rI,EAAesB,mBAAmBR,EAAOxJ,QACzD,GAAIx7I,KAAK8jJ,mBAAmB2B,aAAaT,EAAOjL,UAAW,CAEvD,MAAM2L,EAA6B1lJ,KAAK8jJ,mBAAmB6B,SAASX,EAAOjL,UAC3E/5I,KAAK8jJ,mBAAmBnpG,MAAMqqG,EAAOjL,SAAU,MAC/CzhI,EAAQ84B,SAASw0G,mBAAmBF,EAAOjB,UAC3CnsI,EAAQutI,UAAYH,EAAOzkE,aAC3B3oE,EAAQqyH,MAAQ+a,EAAO/a,MAAMt/H,MACzBiN,EAAQkjI,QAGRljI,EAAQkjI,OAAOsK,OAAOJ,EAAOzkE,aAAcykE,EAAO/a,MAAMt/H,OAE5D06I,GAAwCL,EAAO/a,WAE9C,CAED,MAAMh0B,EAuD1B,SAA4BojC,GACxB,IAAK,IAAIr4I,EAAIq4I,EAAS1zH,OAAQ3kB,EAAGA,EAAIA,EAAE2kB,OAAQ,CAE3C,MAAMskH,EAAQjpI,EAAEs4I,YAChB,GAAIrP,GAASA,EAAMqb,cACf,OAAOrb,EAAMqb,cACjB,GAAIrb,GAASA,EAAMjxD,UACf,OAAO,KAEf,OAAO,KATX,CAvDsDsrE,EAAOjL,UAEnCkM,EAAqBtvC,EAASA,EAAOj5G,OAAOylG,yBAA2B,KAC7E7qF,EAAQutI,UAAY,KACpBvtI,EAAQqyH,MAAQqa,EAChB1sI,EAAQgiB,SAAW2rH,EACf3tI,EAAQkjI,QAGRljI,EAAQkjI,OAAO0K,aAAalB,EAAQiB,GAExCjmJ,KAAKskJ,oBAAoBC,EAAY,KAAMjsI,EAAQ84B,gBAKvDpxC,KAAKskJ,oBAAoBC,EAAY,KAAML,IA+B3D,SAAS6B,GAAwCjyG,GAC7C+tG,GAAsB/tG,EAAKzoC,OAC3ByoC,EAAK1C,SAAS9xC,QAAQymJ,IAuC1B,SAAS,GAAW1tG,GAChB,MAAoB,mBAANA,EAalB,SAAS8tG,GAAU9tG,GACf,OAAOA,aAAaukG,GAqCxB,MAAMwJ,GAIF,YAAYxL,GAAgB56I,KAAK46I,aAAeA,GAAgB,MAMpE,MAAMyL,GAIF,YAAY/F,GACRtgJ,KAAKsgJ,QAAUA,GAWvB,SAASgD,GAAQ1I,GACb,OAAO,IAAI,EAIV1wF,GAAQA,EAAI3oD,MAAM,IAAI6kJ,GAAQxL,KAMnC,SAAS0L,GAAiBC,GACtB,OAAO,IAAI,EAIVr8F,GAAQA,EAAI3oD,MAAM,IAAI8kJ,GAAiBE,KAM5C,SAASC,GAAqB/K,GAC1B,OAAO,IAAI,EAIVvxF,GAAQA,EAAI3oD,MAAM,IAAIkF,MAAM,gEAAgEg1I,QA2BjG,MAAM,GAQF,YAAYp3E,EAAgBoiF,EAAcC,EAAepG,EAAS3pC,GAC9D32G,KAAKymJ,aAAeA,EACpBzmJ,KAAK0mJ,cAAgBA,EACrB1mJ,KAAKsgJ,QAAUA,EACftgJ,KAAK22G,OAASA,EACd32G,KAAK2mJ,gBAAiB,EACtB3mJ,KAAKghF,SAAW3c,EAAepjD,IAAIgyC,IAKvC,QASI,OAPkBjzD,KAAK4mJ,mBAAmB5mJ,KAAKghF,SAAUhhF,KAAK22G,OAAQ32G,KAAKsgJ,QAAQv2I,KA3/GpE,WA6/Gam+C,KAAK,EAIhC2+F,GAAqB7mJ,KAAK8mJ,cAAcD,EAAkB7mJ,KAAKsgJ,QAAQlmC,YAAgCp6G,KAAKsgJ,QAAiB,YAC7Gp4F,KAAKwvF,GAIrBjlI,IACG,GAAIA,aAAa4zI,GAIb,OAFArmJ,KAAK2mJ,gBAAiB,EAEf3mJ,KAAKD,MAAM0S,EAAE6tI,SAExB,GAAI7tI,aAAa2zI,GACb,MAAMpmJ,KAAK+mJ,aAAat0I,GAE5B,MAAMA,KAQd,MAAMurI,GASF,OAPkBh+I,KAAK4mJ,mBAAmB5mJ,KAAKghF,SAAUhhF,KAAK22G,OAAQqnC,EAAKj0I,KA1hH5D,WA4hHWm+C,KAAK,EAI9B2+F,GAAqB7mJ,KAAK8mJ,cAAcD,EAAkB7I,EAAK5jC,YAAgC4jC,EAAc,YAC/F91F,KAAKwvF,GAInBjlI,IACG,GAAIA,aAAa2zI,GACb,MAAMpmJ,KAAK+mJ,aAAat0I,GAE5B,MAAMA,KAQd,aAAaA,GACT,OAAO,IAAIhM,MAAM,0CAA0CgM,EAAEmoI,iBASjE,cAAcoM,EAAe5sC,EAAayiC,GAEtC,MAAM9yI,EAAOi9I,EAAcrM,SAAS75I,OAAS,EACzC,IAAIm8I,GAAgB,GAAI,CAAE,QAAkB+J,IAC5CA,EACJ,OAAO,IAAIpK,GAAQ7yI,EAAMqwG,EAAayiC,GAU1C,mBAAmB77D,EAAUk6D,EAAQN,EAAcY,GAC/C,OAAqC,IAAjCZ,EAAaD,SAAS75I,QAAgB85I,EAAaE,cAC5C96I,KAAKinJ,eAAejmE,EAAUk6D,EAAQN,GACxC1yF,KAAK,EAIT9W,GAAa,IAAI6rG,GAAgB,GAAI7rG,KAEnCpxC,KAAKknJ,cAAclmE,EAAU45D,EAAcM,EAAQN,EAAaD,SAAUa,GAAQ,GAU7F,eAAex6D,EAAUk6D,EAAQN,GAC7B,OA/2FR,SAAoB/uG,EAAKtZ,GACrB,GAAgC,IAA5BnzB,OAAOC,KAAKwsC,GAAK/qC,OACjB,OAAOi1H,GAAG,IAGd,MAAMoxB,EAAW,GAEXC,EAAW,GAEXngJ,EAAM,GAuBZ,OAtBA3H,GAAQusC,EAAK,CAKZ5sC,EAAGM,KAEA,MAAMs3B,EAAStE,EAAGhzB,EAAGN,GAAGipD,KAAK,EAI5B3W,GAAMtqC,EAAI1H,GAAKgyC,IApwBD,YAqwBXhyC,EACA4nJ,EAAS9jJ,KAAKwzB,GAGduwH,EAAS/jJ,KAAKwzB,KAMKk/F,GAAGziH,MAAM,KAAM6zI,EAASx9I,OAAOy9I,IACrDl/F,KAAK2uF,KAAa,KAAU,EAAI,IAG/B5vI,IApCV,CA+2F0B2zI,EAAaxpG,SAAU,CAKxCqsG,EAAa1qG,IAAU/yC,KAAK4mJ,mBAAmB5lE,EAAUk6D,EAAQnoG,EAAO0qG,IAY7E,cAAcz8D,EAAU45D,EAAcM,EAAQP,EAAUa,EAAQmL,GAC5D,OAAO5wB,MAAMmlB,GAAQhzF,KAAK,EAIzB3W,GAEqBvxC,KAAKqnJ,0BAA0BrmE,EAAU45D,EAAcM,EAAQ3pG,EAAGopG,EAAUa,EAAQmL,GACrFz+F,KAAKwvF,GAIrBjlI,IACG,GAAIA,aAAa2zI,GAGb,OAA0BrwB,GAAG,MAEjC,MAAMtjH,MAETokI,KAAa,GAIjBn1I,KAAQA,GAAKg2I,GAAW,CAKxBjlI,EAAGrO,KACA,GAAIqO,aAAaqjI,IAAyB,eAAXrjI,EAAEhI,KAAuB,CACpD,GAAIzK,KAAKsnJ,iBAAiB1M,EAAcD,EAAUa,GAC9C,OAAOzlB,GAAG,IAAIknB,GAAgB,GAAI,KAEtC,MAAM,IAAImJ,GAAQxL,GAEtB,MAAMnoI,KAUd,iBAAiBmoI,EAAcD,EAAUa,GACrC,OAA2B,IAApBb,EAAS75I,SAAiB85I,EAAaxpG,SAASoqG,GAa3D,0BAA0Bx6D,EAAU45D,EAAcM,EAAQvQ,EAAO9hI,EAAO2yI,EAAQmL,GAC5E,OAAIY,GAAU5c,KAAW6Q,EACd8H,GAAQ1I,QAEM1kI,IAArBy0H,EAAM8Q,WACCz7I,KAAKwnJ,yBAAyBxmE,EAAU45D,EAAcjQ,EAAO9hI,GAEpE89I,GAAkB3mJ,KAAK2mJ,eAChB3mJ,KAAKynJ,uCAAuCzmE,EAAU45D,EAAcM,EAAQvQ,EAAO9hI,EAAO2yI,GAE9F8H,GAAQ1I,GAYnB,uCAAuC55D,EAAU45D,EAAcM,EAAQvQ,EAAOgQ,EAAUa,GACpF,MAAmB,OAAf7Q,EAAMzsI,KACC8B,KAAK0nJ,kDAAkD1mE,EAAUk6D,EAAQvQ,EAAO6Q,GAEpFx7I,KAAK2nJ,8CAA8C3mE,EAAU45D,EAAcM,EAAQvQ,EAAOgQ,EAAUa,GAU/G,kDAAkDx6D,EAAUk6D,EAAQvQ,EAAO6Q,GAEvE,MAAM+K,EAAUvmJ,KAAK4nJ,sBAAsB,GAAuBjd,EAAiB,WAAG,IACtF,OAAuBA,EAAiB,WAAExjG,WAAW,KAC1Cm/G,GAAiBC,GAErBvmJ,KAAK6nJ,mBAAmBld,EAAO4b,GAASr+F,KAAK2C,EAInDi9F,IAEG,MAAMvwH,EAAQ,IAAI0lH,GAAgB6K,EAAa,IAC/C,OAAO9nJ,KAAKknJ,cAAclmE,EAAUzpD,EAAO2jH,EAAQ4M,EAAatM,GAAQ,MAahF,8CAA8Cx6D,EAAU45D,EAAcM,EAAQvQ,EAAOgQ,EAAUa,GAC3F,MAAM,QAAEzvB,EAAO,iBAAEg8B,EAAgB,UAAEC,EAAS,wBAAEC,GAA4B,GAAMrN,EAAcjQ,EAAOgQ,GACrG,IAAK5uB,EACD,OAAOu3B,GAAQ1I,GAEnB,MAAM2L,EAAUvmJ,KAAK4nJ,sBAAsBG,EAAqCpd,EAAiB,WAAG,GACpG,OAAuBA,EAAiB,WAAExjG,WAAW,KAC1Cm/G,GAAiBC,GAErBvmJ,KAAK6nJ,mBAAmBld,EAAO4b,GAASr+F,KAAK2C,EAInDi9F,GACU9nJ,KAAKknJ,cAAclmE,EAAU45D,EAAcM,EAAQ4M,EAAYn+I,OAAOgxI,EAASz2I,MAAM8jJ,IAAaxM,GAAQ,KAWzH,yBAAyBx6D,EAAUknE,EAAiBvd,EAAOgQ,GACvD,GAAmB,OAAfhQ,EAAMzsI,KACN,OAAIysI,EAAM4Q,aACCv7I,KAAKymJ,aAAavsF,KAAK8mB,EAAS7uB,SAAUw4E,GAC5CziF,KAAK,EAITigG,IACGxd,EAAMqb,cAAgBmC,EACf,IAAIlL,GAAgBtC,EAAU,OAGtC5kB,GAAG,IAAIknB,GAAgBtC,EAAU,KAE5C,MAAM,QAAE5uB,EAAO,iBAAEg8B,EAAgB,UAAEC,GAAc,GAAME,EAAiBvd,EAAOgQ,GAC/E,IAAK5uB,EACD,OAAOu3B,GAAQ4E,GAEnB,MAAME,EAAoBzN,EAASz2I,MAAM8jJ,GAGzC,OADqBhoJ,KAAKqoJ,eAAernE,EAAU2pD,EAAOgQ,GACtCzyF,KAAK2C,EAIxBy9F,IAEG,MAAMC,EAAcD,EAAa5qJ,OAE3B8qJ,EAAcF,EAAapN,QAC3B,aAAEN,EAAY,eAAE6N,GA2TlC,SAAe7N,EAAcmN,EAAkBU,EAAgB9xC,GAC3D,OAAI8xC,EAAe3nJ,OAAS,GAiEhC,SAAoD85I,EAAcD,EAAUO,GACxE,OAAOA,EAAOt0G,KAId2K,GAAKm3G,GAAoB9N,EAAcD,EAAUppG,IAnqI9B,YAmqIoCg2G,GAAUh2G,IALrE,CAhEmDqpG,EAAc6N,EAAgB9xC,GAGlE,CAAEikC,aAAc+N,GADb,IAAI1L,GAAgB8K,EA6CtC,SAAwC7M,EAAQ0N,GAE5C,MAAM3hJ,EAAM,GACZA,EAAkB,QAAI2hJ,EACtB,IAAK,MAAMr3G,KAAK2pG,EACG,KAAX3pG,EAAErzC,MAlpIS,YAkpIMqpJ,GAAUh2G,KAC3BtqC,EAAIsgJ,GAAUh2G,IAAM,IAAI0rG,GAAgB,GAAI,KAGpD,OAAOh2I,EATX,CA7CuF0vG,EAAQ,IAAIsmC,GAAgBwL,EAAgB7N,EAAaxpG,aACxFq3G,eAAgB,IAEtC,IAA1BA,EAAe3nJ,QAwEvB,SAAoC85I,EAAcD,EAAUO,GACxD,OAAOA,EAAOt0G,KAId2K,GAAKm3G,GAAoB9N,EAAcD,EAAUppG,IALrD,CAvEmCqpG,EAAc6N,EAAgB9xC,GAGlD,CAAEikC,aAAc+N,GADb,IAAI1L,GAAgBrC,EAAaD,SAwBnD,SAA4CC,EAAc6N,EAAgBvN,EAAQ9pG,GAE9E,MAAMnqC,EAAM,GACZ,IAAK,MAAMsqC,KAAK2pG,EACRwN,GAAoB9N,EAAc6N,EAAgBl3G,KAAOH,EAASm2G,GAAUh2G,MAC5EtqC,EAAIsgJ,GAAUh2G,IAAM,IAAI0rG,GAAgB,GAAI,KAGpD,OAAO79I,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIyV,GAAWnqC,GARtD,CAxBgG2zI,EAAc6N,EAAgB9xC,EAAQikC,EAAaxpG,YAC3Fq3G,eAAAA,GAE7C,CAAE7N,aAAAA,EAAc6N,eAAAA,GAb3B,CA3T2DP,EAAiBH,EAAkBK,EAAmBI,GACrG,OAA8B,IAA1BC,EAAe3nJ,QAAgB85I,EAAaE,cAE1B96I,KAAKinJ,eAAesB,EAAaC,EAAa5N,GAC/C1yF,KAAK,EAIrB9W,GAAa,IAAI6rG,GAAgB8K,EAAkB32G,KAE7B,IAAvBo3G,EAAY1nJ,QAA0C,IAA1B2nJ,EAAe3nJ,OACpCi1H,GAAG,IAAIknB,GAAgB8K,EAAkB,KAGlC/nJ,KAAKknJ,cAAcqB,EAAa3N,EAAc4N,EAAaC,EA/yHlE,WA+yHkG,GAC5FvgG,KAAK,EAIrBtkD,GAAO,IAAIq5I,GAAgB8K,EAAiBp+I,OAAO/F,EAAG+2I,UAAW/2I,EAAGwtC,eAU7E,eAAe4vC,EAAU2pD,EAAOgQ,GAC5B,OAAIhQ,EAAMv5F,SAEC2kF,GAAG,IAAIklB,GAAmBtQ,EAAMv5F,SAAU4vC,IAEjD2pD,EAAM4Q,kBAEsBrlI,IAAxBy0H,EAAMqb,cACCjwB,GAAG4U,EAAMqb,eA+MhC,SAAyB3hF,EAAgBsmE,EAAOgQ,GAE5C,MAAMkO,EAAUle,EAAMke,QACtB,OAAKA,GAA8B,IAAnBA,EAAQ/nJ,OAGZ,EAAK+nJ,GAAS3gG,KAAK,EAI9B4gG,IAEG,MAAM94H,EAAQq0C,EAAepjD,IAAI6nI,GAEjC,IAAIC,EACJ,GA7qBR,SAAmB/4H,GACf,OAAOA,GAAS,GAAWA,EAAM64H,SADrC,CA6qBsB74H,GACV+4H,EAAW/4H,EAAM64H,QAAQle,EAAOgQ,OAE/B,CAAA,IAAI,GAAW3qH,GAIhB,MAAM,IAAIvpB,MAAM,yBAHhBsiJ,EAAW/4H,EAAM26G,EAAOgQ,GAK5B,OAAOuB,GAAmB6M,MAEnB7gG,KAAK2uF,MPzuJEziI,EO6uJlB1M,IAAqB,IAAXA,EP5uJFkG,GAAWA,EAAO+7C,KAAK,IAAIouF,GAAc3jI,OADpBZ,EACwC5F,MOktJ1DmoH,IAAG,GPntJX,IAAe3hH,EO+sJtB,CA7MmC4sE,EAAS7uB,SAAUw4E,EAAOgQ,GAC5CzyF,KAAK2C,EAITm+F,GACOA,EACOhpJ,KAAKymJ,aAAavsF,KAAK8mB,EAAS7uB,SAAUw4E,GAC5CziF,KAAK,EAITigG,IACGxd,EAAMqb,cAAgBmC,EACfA,KArY/B,SAAsBxd,GAClB,OAAO,IAAI,EAIVzgF,GAAQA,EAAI3oD,MAAMk5I,GAAyB,+DAA+D9P,EAAMzsI,2BALrH,CAwYoCysI,KAGrB5U,GAAG,IAAIklB,GAAmB,GAAIj6D,IAQzC,mBAAmB2pD,EAAO2V,GAEtB,IAAIr5I,EAAM,GAENnI,EAAIwhJ,EAAQv2I,KAChB,OAAa,CAET,GADA9C,EAAMA,EAAI0C,OAAO7K,EAAE67I,UACQ,IAAvB77I,EAAE09I,iBACF,OAAOzmB,GAAG9uH,GAEd,GAAInI,EAAE09I,iBAAmB,IAAM19I,EAAEsyC,SAAuB,QACpD,OAAOo1G,GAAwC7b,EAAiB,YAEpE7rI,EAAIA,EAAEsyC,SAAuB,SAUrC,sBAAsBupG,EAAUc,EAAYV,GACxC,OAAO/6I,KAAKipJ,4BAA4BxN,EAAYz7I,KAAK0mJ,cAAc9kJ,MAAM65I,GAAad,EAAUI,GAUxG,4BAA4BU,EAAY6E,EAAS3F,EAAUI,GAEvD,MAAMmO,EAAUlpJ,KAAKmpJ,mBAAmB1N,EAAY6E,EAAQv2I,KAAM4wI,EAAUI,GAC5E,OAAO,IAAI6B,GAAQsM,EAASlpJ,KAAKopJ,kBAAkB9I,EAAQlmC,YAAap6G,KAAKsgJ,QAAQlmC,aAAckmC,EAAQzD,UAQ/G,kBAAkBwM,EAAkBC,GAEhC,MAAMriJ,EAAM,GAkBZ,OAjBA3H,GAAQ+pJ,EAAkB,CAKzBhxG,EAAG94C,KAGA,GADqC,iBAAN84C,GAAkBA,EAAElR,WAAW,KACzC,CAEjB,MAAMoiH,EAAalxG,EAAEx0C,UAAU,GAC/BoD,EAAI1H,GAAK+pJ,EAAaC,QAGtBtiJ,EAAI1H,GAAK84C,IAGVpxC,EAUX,mBAAmBw0I,EAAYlkH,EAAOojH,EAAUI,GAE5C,MAAMyO,EAAkBxpJ,KAAKypJ,eAAehO,EAAYlkH,EAAMojH,SAAUA,EAAUI,GAElF,IAAI3pG,EAAW,GASf,OARA9xC,GAAQi4B,EAAM6Z,SAAU,CAKvB2B,EAAOtoC,KACJ2mC,EAAS3mC,GAAQzK,KAAKmpJ,mBAAmB1N,EAAY1oG,EAAO4nG,EAAUI,KAEnE,IAAIkC,GAAgBuM,EAAiBp4G,GAUhD,eAAeqqG,EAAYiO,EAAoBC,EAAgB5O,GAC3D,OAAO2O,EAAmBjoJ,IAI1BC,GAAKA,EAAExD,KAAKipC,WAAW,KAAOnnC,KAAK4pJ,aAAanO,EAAY/5I,EAAGq5I,GAC3D/6I,KAAK6pJ,aAAanoJ,EAAGioJ,IAS7B,aAAalO,EAAYqO,EAAsB/O,GAE3C,MAAMj0B,EAAMi0B,EAAU+O,EAAqB5rJ,KAAK2F,UAAU,IAC1D,IAAKijH,EACD,MAAM,IAAIrgH,MAAM,uBAAuBg1I,oBAA6BqO,EAAqB5rJ,UAC7F,OAAO4oH,EAQX,aAAagjC,EAAsBH,GAE/B,IAAIz8G,EAAM,EACV,IAAK,MAAMxrC,KAAKioJ,EAAgB,CAC5B,GAAIjoJ,EAAExD,OAAS4rJ,EAAqB5rJ,KAEhC,OADAyrJ,EAAe3vI,OAAOkzB,GACfxrC,EAEXwrC,IAEJ,OAAO48G,GA+Ef,SAAS,GAAMlP,EAAcjQ,EAAOgQ,GAChC,GAAmB,KAAfhQ,EAAMzsI,KACN,MAAyB,SAApBysI,EAAMkQ,YAA0BD,EAAaE,eAAiBH,EAAS75I,OAAS,GAC1E,CAAEirH,SAAS,EAAOg8B,iBAAkB,GAAIC,UAAW,EAAGC,wBAAyB,IAEnF,CAAEl8B,SAAS,EAAMg8B,iBAAkB,GAAIC,UAAW,EAAGC,wBAAyB,IAGzF,MAEMhhJ,GAFU0jI,EAAM+Q,SAAWhB,IAEbC,EAAUC,EAAcjQ,GAC5C,OAAK1jI,EAQE,CACH8kH,SAAS,EACTg8B,iBAAqC9gJ,EAAa,SAClD+gJ,UAA8B/gJ,EAAI+zI,SAAgB,OAClDiN,wBAA4ChhJ,EAAc,WAXnD,CACH8kH,SAAS,EACTg8B,iBAAkB,GAClBC,UAAW,EACXC,wBAAyB,IAoCrC,SAASU,GAAqBjnJ,GAC1B,GAA2B,IAAvBA,EAAE86I,kBAA0B96I,EAAE0vC,SAAuB,QAAG,CAExD,MAAMtyC,EAAI4C,EAAE0vC,SAAuB,QACnC,OAAO,IAAI6rG,GAAgBv7I,EAAEi5I,SAAShxI,OAAO7K,EAAE67I,UAAW77I,EAAEsyC,UAEhE,OAAO1vC,EAmEX,SAASgnJ,GAAoB9N,EAAcD,EAAUppG,GACjD,SAAKqpG,EAAaE,eAAiBH,EAAS75I,OAAS,IAAsB,SAAhBywC,EAAEspG,YAG3C,KAAXtpG,EAAErzC,WAAgCgY,IAAjBq7B,EAAEkqG,WAM9B,SAAS8L,GAAU5c,GACf,OAAOA,EAAM6Q,QAnsIM,UA0uIvB,MAAMuO,GAIF,YAAY7rJ,GACR8B,KAAK9B,KAAOA,EACZ8B,KAAK2qI,MAAQ3qI,KAAK9B,KAAK8B,KAAK9B,KAAK4C,OAAS,IASlD,MAAMkpJ,GAKF,YAAYtwE,EAAWixD,GACnB3qI,KAAK05E,UAAYA,EACjB15E,KAAK2qI,MAAQA,GAerB,SAASsf,GAAkBjF,EAAQ3D,EAAM6C,GAErC,MAAMC,EAAaa,EAAOpF,MAG1B,OAiDJ,SAASsK,EAAoB3F,EAAYC,EAAUC,EAAU0F,EAAYC,EAAS,CAC9EC,oBAAqB,GACrBC,kBAAmB,KAGnB,MAAMC,EAAerK,GAAkBsE,GAiBvC,OAfAD,EAAWnzG,SAAS9xC,QAIpBR,KAqBJ,SAAwBylJ,EAAYC,EAAUN,EAAgBiG,EAAYC,EAAS,CAC/EC,oBAAqB,GACrBC,kBAAmB,KAGnB,MAAMtF,EAAST,EAAWl5I,MAEpBg2I,EAAOmD,EAAWA,EAASn5I,MAAQ,KAEnCiN,EAAU4rI,EAAiBA,EAAee,WAAWV,EAAWl5I,MAAMmwI,QAAU,KAEtF,GAAI6F,GAAQ2D,EAAOhL,cAAgBqH,EAAKrH,YAAa,CAEjD,MAAMwQ,EA6Cd,SAAqCnJ,EAAM2D,EAAQjpF,GAC/C,GAAoB,mBAATA,EACP,OAAOA,EAAKslF,EAAM2D,GAEtB,OAAQjpF,GACJ,IAAK,mBACD,OAAQwgF,GAAU8E,EAAKp3E,IAAK+6E,EAAO/6E,KACvC,IAAK,gCACD,OAAQsyE,GAAU8E,EAAKp3E,IAAK+6E,EAAO/6E,OAC9B4xE,GAAawF,EAAKjnC,YAAa4qC,EAAO5qC,aAC/C,IAAK,SACD,OAAO,EACX,IAAK,4BACD,OAAQ4nC,GAA0BX,EAAM2D,KACnCnJ,GAAawF,EAAKjnC,YAAa4qC,EAAO5qC,aAC/C,IAAK,eACL,QACI,OAAQ4nC,GAA0BX,EAAM2D,IAjBpD,CA7CsD3D,EAAM2D,EAA2BA,EAAmB,YAAEyF,uBAChGD,EACAJ,EAAOE,kBAAkBjnJ,KAAK,IAAI0mJ,GAAYI,KAI9CnF,EAAO5lI,KAAOiiI,EAAKjiI,KACnB4lI,EAAO1D,cAAgBD,EAAKC,eAI5B4I,EAAoB3F,EAAYC,EADhCQ,EAAOtrE,UACmCphE,EAAUA,EAAQ84B,SAAW,KAI7B8yG,EAJmCiG,EAAYC,GAMzFI,GAGAJ,EAAOC,oBAAoBhnJ,KAAK,IAAI2mJ,GADlB1xI,GAAWA,EAAQkjI,QAAUljI,EAAQkjI,OAAO9hE,WAAa,KACd2nE,SAI7DA,GACAyD,GAA8BN,EAAUlsI,EAAS8xI,GAErDA,EAAOE,kBAAkBjnJ,KAAK,IAAI0mJ,GAAYI,IAG1CD,EAAoB3F,EAAY,KADhCS,EAAOtrE,UAC+BphE,EAAUA,EAAQ84B,SAAW,KAI7B8yG,EAJmCiG,EAAYC,GA3CjG,CApBuBtrJ,EAAGyrJ,EAAazrJ,EAAEuM,MAAMmwI,QAASiJ,EAAU0F,EAAWxgJ,OAAO,CAAC7K,EAAEuM,QAAS++I,UACjFG,EAAazrJ,EAAEuM,MAAMmwI,UAGhCl8I,GAAQirJ,EAAc,CAKrBlyG,EAAG94C,IAAMulJ,GAA8BzsG,EAAG,EAA8B4sG,WAAW1lJ,GAAI6qJ,IACjFA,EAtBX,CAjD+BjG,EADV9C,EAAOA,EAAKzB,MAAQ,KACYsE,EAAgB,CAACC,EAAW94I,QAmBjF,SAAS+xH,GAASpvE,EAAO+rF,EAAU11E,GAE/B,MAAMsyC,EASV,SAAgCojC,GAC5B,IAAKA,EACD,OAAO,KACX,IAAK,IAAIr4I,EAAIq4I,EAAS1zH,OAAQ3kB,EAAGA,EAAIA,EAAE2kB,OAAQ,CAE3C,MAAMskH,EAAQjpI,EAAEs4I,YAChB,GAAIrP,GAASA,EAAMqb,cACf,OAAOrb,EAAMqb,cAErB,OAAO,KATX,CAT0CjM,GAGtC,OADiBpjC,EAASA,EAAOj5G,OAAOy0D,SAAWkS,GACnCpjD,IAAI+sC,GA6IxB,SAAS82F,GAA8Bna,EAAOryH,EAAS8xI,GAEnD,MAAMh5G,EAAW8uG,GAAkBvV,GAE7Bp5F,EAAIo5F,EAAMt/H,MAChB/L,GAAQ8xC,EAAU,CAKjB0C,EAAM+wG,KAKCC,GAA8BhxG,EAJ7BvC,EAAEmoC,UAGEphE,EAC+BA,EAAQ84B,SAAS6zG,WAAWJ,GAG5B,KANAvsI,EAGwC8xI,KAUhFA,EAAOC,oBAAoBhnJ,KAAK,IAAI2mJ,GAJnCz4G,EAAEmoC,WAGEphE,GAAWA,EAAQkjI,QAAUljI,EAAQkjI,OAAOkP,YACCpyI,EAAQkjI,OAAO9hE,UAHf,KAG0BnoC,IAapF,MAAMo5G,GAAgBlxI,OAAO,iBAI7B,SAASmxI,KACL,OAAO3S,GAIP/tF,GAC8BosF,MAAiBpsF,EAAIzoD,IAI/CwsC,GAAKA,EAAEia,KAAK,GAAK,GCtqKlB,YAAsBt0C,GACzB,MAAM02C,EAAY12C,EAAMA,EAAM9S,OAAS,GACvC,OAAI0oD,EAAYc,IACZ12C,EAAMlQ,MACEkK,GAAWjE,GAAOiK,EAAOhG,EAAQ08C,IAGjC18C,GAAWjE,GAAOiK,EAAOhG,GAPlC,CDsqKgC,OAC1Bs6C,KAAKiwF,GAAK,CAKd0S,EAAKlqJ,KAEF,IAAImqJ,GAAY,EAChB,OAAOnqJ,EAAK/B,OAAO,CAMlBmsJ,EAAU99G,EAAKvsC,KACZ,GAAIqqJ,IAAaJ,GACb,OAAOI,EAQX,GANI99G,IAAQ09G,KACRG,GAAY,IAKXA,EAAW,CAGZ,IAAY,IAAR79G,EACA,OAAOA,EACX,GAAIvsC,IAAMC,EAAKG,OAAS,GAAKqlJ,GAAUl5G,GACnC,OAAOA,EAGf,OAAO89G,GACPF,IACJF,IAAgB,GAIpB1qG,GAAQA,IAAS0qG,IAAiB,EAIlC1qG,GAAQkmG,GAAUlmG,GAAQA,GAAgB,IAATA,GACjC,GAAK,KA2Gb,SAAS+qG,GAAoBjR,EAAUkK,GAInC,OAHiB,OAAblK,GAAqBkK,GACrBA,EAAa,IAAI/J,GAAgBH,IAE9BhkB,IAAG,GAad,SAASk1B,GAAyBlR,EAAUkK,GAIxC,OAHiB,OAAblK,GAAqBkK,GACrBA,EAAa,IAAInK,GAAqBC,IAEnChkB,IAAG,GAQd,SAASm1B,GAAeC,EAAWC,EAAW/mF,GAE1C,MAAMgnF,EAAcD,EAAUpR,YAAcoR,EAAUpR,YAAYqR,YAAc,KAChF,OAAKA,GAAsC,IAAvBA,EAAYvqJ,OA4BzBi1H,GAzBwBs1B,EAAY5pJ,IAI1C3C,GACUs7B,GAAM,KAKT,MAAMpK,EAAQotG,GAASt+H,EAAGssJ,EAAW/mF,GAErC,IAAIpc,EACJ,GAvzCZ,SAAuBj4B,GACnB,OAAOA,GAAS,GAAWA,EAAMq7H,aADrC,CAuzC8Br7H,GACdi4B,EAAai0F,GAAmBlsH,EAAMq7H,YAAYD,EAAWD,QAE5D,CAAA,IAAI,GAAWn7H,GAIhB,MAAM,IAAIvpB,MAAM,6BAHhBwhD,EAAai0F,GAAmBlsH,EAAMo7H,EAAWD,IAKrD,OAAOljG,EAAWC,KAAK,UAGGA,KAAK0iG,MA3B5B70B,IAAG,GAmClB,SAASu1B,GAAoBH,EAAWjtJ,EAAMmmE,GAE1C,MAAM+mF,EAAYltJ,EAAKA,EAAK4C,OAAS,GAe/ByqJ,EAbyBrtJ,EAAKgG,MAAM,EAAGhG,EAAK4C,OAAS,GACtDqb,UACA1a,IAILjC,GAzbJ,SAA6BA,GAEzB,MAAMgsJ,EAAmBhsJ,EAAEw6I,YAAcx6I,EAAEw6I,YAAYwR,iBAAmB,KAC1E,OAAKA,GAAgD,IAA5BA,EAAiB1qJ,OAEnC,CAAEgzC,KAAMt0C,EAAGisJ,OAAQD,GADf,KAJf,CAyb6BhsJ,IACpBiB,OAIL2D,GAAW,OAANA,GAEuD3C,IAI3DusC,GACU5T,GAAM,IAyBF27F,GApBc/nF,EAAEy9G,OAAOhqJ,IAI7B3C,IAEG,MAAMkxB,EAAQotG,GAASt+H,EAAGkvC,EAAE8F,KAAMuwB,GAElC,IAAIpc,EACJ,GAx2ChB,SAA4Bj4B,GACxB,OAAOA,GAAS,GAAWA,EAAMw7H,kBADrC,CAw2CuCx7H,GACnBi4B,EAAai0F,GAAmBlsH,EAAMw7H,iBAAiBJ,EAAWD,QAEjE,CAAA,IAAI,GAAWn7H,GAIhB,MAAM,IAAIvpB,MAAM,kCAHhBwhD,EAAai0F,GAAmBlsH,EAAMo7H,EAAWD,IAKrD,OAAOljG,EAAWC,KAAK,SAEHA,KAAK0iG,QAGrC,OAAO70B,GAAGw1B,GAA8BrjG,KAAK0iG,MA6CjD,MAAMc,IAeN,MAAM,GASF,YAAYC,EAAmBh1C,EAAQ2pC,EAASr2E,EAAKk3E,EAA2ByK,GAC5E5rJ,KAAK2rJ,kBAAoBA,EACzB3rJ,KAAK22G,OAASA,EACd32G,KAAKsgJ,QAAUA,EACftgJ,KAAKiqE,IAAMA,EACXjqE,KAAKmhJ,0BAA4BA,EACjCnhJ,KAAK4rJ,uBAAyBA,EAKlC,YACI,IAEI,MAAM/E,EAAmBgF,GAAQ7rJ,KAAKsgJ,QAAQv2I,KAAM,GAAI,GAAI/J,KAAK22G,OAAQ32G,KAAK4rJ,wBAAwBhR,aAEhGxpG,EAAWpxC,KAAK8rJ,oBAAoB9rJ,KAAK22G,OAAQkwC,EAh1J5C,WAk1JL98I,EAAO,IAAIy2I,GAAuB,GAAIphJ,OAAO2sJ,OAAO,IAAK3sJ,OAAO2sJ,OAAO3sJ,OAAOu8B,OAAO,GAAI37B,KAAKsgJ,QAAQlmC,cAAkCp6G,KAAKsgJ,QAAiB,SAAG,GAl1J5J,UAk1JgLtgJ,KAAK2rJ,kBAAmB,KAAM3rJ,KAAKsgJ,QAAQv2I,MAAO,EAAG,IAE1OiiJ,EAAW,IAAI/L,GAASl2I,EAAMqnC,GAE9B66G,EAAa,IAAIxL,GAAoBzgJ,KAAKiqE,IAAK+hF,GAErD,OADAhsJ,KAAKksJ,qBAAqBD,EAAWrM,OAC9B7pB,GAAGk2B,GAEd,MAAOx5I,GACH,OAAO,IAAI,EAIVy3C,GAAQA,EAAI3oD,MAAMkR,KAO3B,qBAAqB05I,GAEjB,MAAMxhB,EAAQwhB,EAAU9gJ,MAElB3K,EAAIwgJ,GAA2BvW,EAAO3qI,KAAKmhJ,2BACjDxW,EAAMpxB,OAASn6G,OAAO2sJ,OAAOrrJ,EAAE64G,QAC/BoxB,EAAMvrH,KAAOhgB,OAAO2sJ,OAAOrrJ,EAAE0e,MAC7B+sI,EAAU/6G,SAAS9xC,QAInBkF,GAAKxE,KAAKksJ,qBAAqB1nJ,IAQnC,oBAAoBmyG,EAAQikC,EAAcY,GACtC,OAAqC,IAAjCZ,EAAaD,SAAS75I,QAAgB85I,EAAaE,cAC5C96I,KAAKgjJ,gBAAgBrsC,EAAQikC,GAEjC56I,KAAKosJ,eAAez1C,EAAQikC,EAAcA,EAAaD,SAAUa,GAO5E,gBAAgB7kC,EAAQikC,GAEpB,MAAMxpG,EAAWosG,GAAqB5C,EAAc,CAKnD7nG,EAAO0qG,IAAgBz9I,KAAK8rJ,oBAAoBn1C,EAAQ5jE,EAAO0qG,IAGhE,OA+LR,SAAmC4O,GAE/B,MAAMC,EAAQ,GACdD,EAAM/sJ,QAINkF,IAEI,MAAM+nJ,EAA0BD,EAAM9nJ,EAAE6G,MAAMmwI,QAC9C,GAAI+Q,EAAyB,CAEzB,MAAM/sJ,EAAI+sJ,EAAwBtiF,IAAIxoE,IAItCC,GAAKA,EAAEqX,YAAa9Y,KAAK,KAEnBnB,EAAI0F,EAAE6G,MAAM4+D,IAAIxoE,IAItBC,GAAKA,EAAEqX,YAAa9Y,KAAK,KACzB,MAAM,IAAIwG,MAAM,mDAAmDjH,WAAWV,OAElFwtJ,EAAM9nJ,EAAE6G,MAAMmwI,QAAUh3I,EAAE6G,QAzBlC,CAjMkC+lC,GACEA,EAsH1B9mB,KAAK,CAKVrrB,EAAGC,IAxgKe,YAygKXD,EAAEoM,MAAMmwI,QACA,EA1gKG,YA2gKXt8I,EAAEmM,MAAMmwI,OACD,EACJv8I,EAAEoM,MAAMmwI,OAAOgR,cAActtJ,EAAEmM,MAAMmwI,SA/HrCpqG,EASX,eAAeulE,EAAQikC,EAAcD,EAAUa,GAC3C,IAAK,MAAMjqG,KAAKolE,EACZ,IACI,OAAO32G,KAAKysJ,2BAA2Bl7G,EAAGqpG,EAAcD,EAAUa,GAEtE,MAAO/oI,GACH,KAAMA,aAAai5I,IACf,MAAMj5I,EAGlB,GAAIzS,KAAKsnJ,iBAAiB1M,EAAcD,EAAUa,GAC9C,MAAO,GAEX,MAAM,IAAIkQ,GASd,iBAAiB9Q,EAAcD,EAAUa,GACrC,OAA2B,IAApBb,EAAS75I,SAAiB85I,EAAaxpG,SAASoqG,GAS3D,2BAA2B7Q,EAAO+hB,EAAY/R,EAAUa,GACpD,GAAI7Q,EAAM8Q,WACN,MAAM,IAAIiQ,GACd,IAAK/gB,EAAM6Q,QA17JI,aA07J0BA,EACrC,MAAM,IAAIkQ,GAEd,IAAI3R,EAEAgO,EAAmB,GAEnBK,EAAoB,GACxB,GAAmB,OAAfzd,EAAMzsI,KAAe,CAErB,MAAMq7G,EAASohC,EAAS75I,OAAS,EAAuB,GAAK65I,GAAY/sF,WAAa,GACtFmsF,EAAW,IAAIyG,GAAuB7F,EAAUphC,EAAQn6G,OAAO2sJ,OAAO3sJ,OAAOu8B,OAAO,GAAI37B,KAAKsgJ,QAAQlmC,cAAkCp6G,KAAKsgJ,QAAiB,SAAGhvH,GAAQq5G,GAAQ6Q,EAA2B7Q,EAAgB,UAAGA,EAAOgiB,GAAsBD,GAAaE,GAAkBF,GAAc/R,EAAS75I,OAAQ+rJ,GAAWliB,QAEnU,CAED,MAAMjjI,EAsGlB,SAAiBkzI,EAAcjQ,EAAOgQ,GAClC,GAAmB,KAAfhQ,EAAMzsI,KAAa,CACnB,GAAwB,SAApBysI,EAAMkQ,YAAyBD,EAAaE,eAAiBH,EAAS75I,OAAS,GAC/E,MAAM,IAAI4qJ,GAEd,MAAO,CAAE3D,iBAAkB,GAAIC,UAAW,EAAGp6F,WAAY,IAG7D,MAEM3mD,GAFU0jI,EAAM+Q,SAAWhB,IAEbC,EAAUC,EAAcjQ,GAC5C,IAAK1jI,EACD,MAAM,IAAIykJ,GAEd,MAAM3Q,EAAY,GAClBz7I,GAA2B2H,EAAc,UAAG,CAK3CoxC,EAAG94C,KAAQw7I,EAAUx7I,GAAK84C,EAAEn6C,OAE7B,MAAM0vD,EAAa3mD,EAAI+zI,SAASl6I,OAAS,EAAI1B,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIo/G,GAAY9zI,EAAI+zI,SAAS/zI,EAAI+zI,SAASl6I,OAAS,GAAG8sD,YAC3HmtF,EACJ,MAAO,CAAEgN,iBAAkB9gJ,EAAI+zI,SAAUgN,UAAW/gJ,EAAI+zI,SAASl6I,OAAQ8sD,WAAAA,GAxB7E,CAtGmC8+F,EAAY/hB,EAAOgQ,GAC1CoN,EAAmBrgJ,EAAOqgJ,iBAC1BK,EAAoBzN,EAASz2I,MAAMwD,EAAOsgJ,WAC1CjO,EAAW,IAAIyG,GAAuBuH,EAAkBrgJ,EAAOkmD,WAAYxuD,OAAO2sJ,OAAO3sJ,OAAOu8B,OAAO,GAAI37B,KAAKsgJ,QAAQlmC,cAAkCp6G,KAAKsgJ,QAAiB,SAAGhvH,GAAQq5G,GAAQ6Q,EAA2B7Q,EAAgB,UAAGA,EAAOgiB,GAAsBD,GAAaE,GAAkBF,GAAc3E,EAAiBjnJ,OAAQ+rJ,GAAWliB,IAGnW,MAAM6d,EAqEd,SAAwB7d,GACpB,OAAIA,EAAMv5F,SACCu5F,EAAMv5F,SAEbu5F,EAAM4Q,aACoB5Q,EAAoB,cAAEuQ,OAE7C,GAPX,CArE2CvQ,IAC7B,aAAEiQ,EAAY,eAAE6N,GAAmBoD,GAAQa,EAAY3E,EAAkBK,EAAmBI,EAAaxoJ,KAAK4rJ,wBACpH,GAA8B,IAA1BnD,EAAe3nJ,QAAgB85I,EAAaE,cAAe,CAE3D,MAAM1pG,EAAWpxC,KAAKgjJ,gBAAgBwF,EAAa5N,GACnD,MAAO,CAAC,IAAIqF,GAASlG,EAAU3oG,IAEnC,GAA2B,IAAvBo3G,EAAY1nJ,QAA0C,IAA1B2nJ,EAAe3nJ,OAC3C,MAAO,CAAC,IAAIm/I,GAASlG,EAAU,KAGnC,MAAM3oG,EAAWpxC,KAAKosJ,eAAe5D,EAAa5N,EAAc6N,EA19JjD,WA29Jf,MAAO,CAAC,IAAIxI,GAASlG,EAAU3oG,KAkJvC,SAASu7G,GAAsB/R,GAE3B,IAAIl5I,EAAIk5I,EACR,KAAOl5I,EAAEorJ,gBACLprJ,EAAIA,EAAEorJ,eAEV,OAAOprJ,EAMX,SAASkrJ,GAAkBhS,GAEvB,IAAIl5I,EAAIk5I,EAEJ3zI,EAAOvF,EAAEqrJ,mBAAqBrrJ,EAAEqrJ,mBAAqB,EACzD,KAAOrrJ,EAAEorJ,gBACLprJ,EAAIA,EAAEorJ,eACN7lJ,GAAQvF,EAAEqrJ,mBAAqBrrJ,EAAEqrJ,mBAAqB,EAE1D,OAAO9lJ,EAAM,EAUjB,SAAS4kJ,GAAQjR,EAAcmN,EAAkBU,EAAgB9xC,EAAQi1C,GACrE,GAAInD,EAAe3nJ,OAAS,GAgFhC,SAAkD85I,EAAc6N,EAAgBvN,GAC5E,OAAOA,EAAOt0G,KAId2K,GAAKy7G,GAAepS,EAAc6N,EAAgBl3G,IAluK/B,YAkuKqC07G,GAAY17G,IALxE,CA/EiDqpG,EAAc6N,EAAgB9xC,GAAS,CAEhF,MAAMj1G,EAAI,IAAIu7I,GAAgB8K,EAsDtC,SAAqCnN,EAAcmN,EAAkB7M,EAAQgS,GAEzE,MAAMjmJ,EAAM,GACZA,EAAkB,QAAIimJ,EACtBA,EAAeJ,eAAiBlS,EAChCsS,EAAeH,mBAAqBhF,EAAiBjnJ,OACrD,IAAK,MAAMywC,KAAK2pG,EACZ,GAAe,KAAX3pG,EAAErzC,MA7sKS,YA6sKM+uJ,GAAY17G,GAAuB,CAEpD,MAAM7vC,EAAI,IAAIu7I,GAAgB,GAAI,IAClCv7I,EAAEorJ,eAAiBlS,EACnBl5I,EAAEqrJ,mBAAqBhF,EAAiBjnJ,OACxCmG,EAAIgmJ,GAAY17G,IAAM7vC,EAG9B,OAAOuF,EAfX,CAtDoF2zI,EAAcmN,EAAkBpxC,EAAQ,IAAIsmC,GAAgBwL,EAAgB7N,EAAaxpG,YAGrK,OAFA1vC,EAAEorJ,eAAiBlS,EACnBl5I,EAAEqrJ,mBAAqBhF,EAAiBjnJ,OACjC,CAAE85I,aAAcl5I,EAAG+mJ,eAAgB,IAE9C,GAA8B,IAA1BA,EAAe3nJ,QAqFvB,SAAkC85I,EAAc6N,EAAgBvN,GAC5D,OAAOA,EAAOt0G,KAId2K,GAAKy7G,GAAepS,EAAc6N,EAAgBl3G,IALtD,CApFiCqpG,EAAc6N,EAAgB9xC,GAAS,CAEhE,MAAMj1G,EAAI,IAAIu7I,GAAgBrC,EAAaD,SAoBnD,SAAyCC,EAAcmN,EAAkBU,EAAgBvN,EAAQ9pG,EAAUw6G,GAEvG,MAAM3kJ,EAAM,GACZ,IAAK,MAAMsqC,KAAK2pG,EACZ,GAAI8R,GAAepS,EAAc6N,EAAgBl3G,KAAOH,EAAS67G,GAAY17G,IAAK,CAE9E,MAAM7vC,EAAI,IAAIu7I,GAAgB,GAAI,IAClCv7I,EAAEorJ,eAAiBlS,EAEfl5I,EAAEqrJ,mBADyB,WAA3BnB,EACuBhR,EAAaD,SAAS75I,OAGtBinJ,EAAiBjnJ,OAE5CmG,EAAIgmJ,GAAY17G,IAAM7vC,EAG9B,OAAOtC,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIyV,GAAWnqC,GAjBtD,CApB6F2zI,EAAcmN,EAAkBU,EAAgB9xC,EAAQikC,EAAaxpG,SAAUw6G,IAGpK,OAFAlqJ,EAAEorJ,eAAiBlS,EACnBl5I,EAAEqrJ,mBAAqBhF,EAAiBjnJ,OACjC,CAAE85I,aAAcl5I,EAAG+mJ,eAAAA,GAG9B,MAAM/mJ,EAAI,IAAIu7I,GAAgBrC,EAAaD,SAAUC,EAAaxpG,UAGlE,OAFA1vC,EAAEorJ,eAAiBlS,EACnBl5I,EAAEqrJ,mBAAqBhF,EAAiBjnJ,OACjC,CAAE85I,aAAcl5I,EAAG+mJ,eAAAA,GAsF9B,SAASuE,GAAepS,EAAc6N,EAAgBl3G,GAClD,SAAKqpG,EAAaE,eAAiB2N,EAAe3nJ,OAAS,IAAsB,SAAhBywC,EAAEspG,YAGjD,KAAXtpG,EAAErzC,WAAgCgY,IAAjBq7B,EAAEkqG,WAM9B,SAASwR,GAAYtiB,GACjB,OAAOA,EAAM6Q,QAlwKM,UAwwKvB,SAASlqH,GAAQq5G,GACb,OAAOA,EAAMvrH,MAAQ,GAMzB,SAASytI,GAAWliB,GAChB,OAAOA,EAAMziI,SAAW,GAwJ5B,SAASilJ,GAAYrE,EAAgBsC,EAAWD,EAAW9mF,GAEvD,MAAM/pC,EAAW8iG,GAAS0rB,EAAgBsC,EAAW/mF,GACrD,OAA0B63E,GAAnB5hH,EAASpyB,QAA6BoyB,EAASpyB,QAAQkjJ,EAAWD,GAClD7wH,EAAS8wH,EAAWD,IAiB/C,SAASiC,GAAU9xH,GACf,OAAO,SAIG1tB,GACN,OAAOA,EAAOs6C,KAAK+vF,GAInB5/F,IAEI,MAAMg1G,EAAa/xH,EAAK+c,GACxB,OAAIg1G,EACO,EAAKA,GAAYnlG,KAAK,EAAI,IAG3B7P,IAEH,EAAK,CAACA,QAuEzB,MAAMi1G,GAKF,aAAa3iB,GAAS,OAAO,EAM7B,MAAMA,EAAO4iB,IAKb,aAAa5iB,GAAS,OAAO,EAK7B,SAASA,GAAS,OAAO,KAMzB,iBAAiBqa,EAAQ3D,GACrB,OAAO2D,EAAOhL,cAAgBqH,EAAKrH,aAe3C,MAAMwT,GAAS,IAAIh8F,GAAe,UAClC,MAAM,GAOF,YAAYi8F,EAAQ37C,EAAU47C,EAAqBC,GAC/C3tJ,KAAKytJ,OAASA,EACdztJ,KAAK8xG,SAAWA,EAChB9xG,KAAK0tJ,oBAAsBA,EAC3B1tJ,KAAK2tJ,kBAAoBA,EAO7B,KAAK5sE,EAAgB4pD,GAMjB,OALI3qI,KAAK0tJ,qBACL1tJ,KAAK0tJ,oBAAoB/iB,GAGN3qI,KAAK4tJ,kBAAqCjjB,EAAmB,cAC9DziF,KAAK,EAI1BwG,IACO1uD,KAAK2tJ,mBACL3tJ,KAAK2tJ,kBAAkBhjB,GAG3B,MAAMjtI,EAASgxD,EAAQ1jD,OAAO+1E,GAC9B,OAAO,IAAIk6D,GAAmB,GAAQv9I,EAAOy0D,SAASlxC,IAAIusI,KAAS/rJ,IAAIm6I,IAAoBl+I,MAQnG,kBAAkB69I,GACd,MAA4B,iBAAjBA,EACA,EAAKv7I,KAAKytJ,OAAOvzF,KAAKqhF,IAGtBW,GAAmBX,KAAgBrzF,KAAK2C,EAI9C1rD,GACOA,aAAa+zD,GACN6iE,GAAG52H,GAGH,EAAKa,KAAK8xG,SAAS7F,mBAAmB9sG,OAoFjE,MAAM0uJ,GAKF,iBAAiB5jF,GAAO,OAAO,EAK/B,QAAQA,GAAO,OAAOA,EAMtB,MAAM6jF,EAAYC,GAAY,OAAOD,GAiJzC,SAASE,GAAoBzsJ,GACzB,MAAMA,EAQV,SAAS0sJ,GAAgC1sJ,EAAOmlJ,EAAez8E,GAC3D,OAAOy8E,EAAc9kJ,MAAM,KAQ/B,SAASssJ,GAAkBnU,EAAUoU,GACjC,OAA0Bp4B,GAAG,yBAc3Bq4B,EAaF,YAAYzC,EAAmBjF,EAAe2H,EAAchtF,EAAUlP,EAAUs7F,EAAQ37C,EAAU6E,GAC9F32G,KAAK2rJ,kBAAoBA,EACzB3rJ,KAAK0mJ,cAAgBA,EACrB1mJ,KAAKquJ,aAAeA,EACpBruJ,KAAKqhE,SAAWA,EAChBrhE,KAAK22G,OAASA,EACd32G,KAAKsuJ,yBAA2B,KAChCtuJ,KAAKuuJ,kBAAoB,KACzBvuJ,KAAKwuJ,aAAe,EACpBxuJ,KAAKyuJ,iBAAkB,EAIvBzuJ,KAAK0jD,OAAS,IAAI,EAIlB1jD,KAAK85E,aAAek0E,GAOpBhuJ,KAAK0uJ,yBAA2BT,GAKhCjuJ,KAAK2uJ,WAAY,EACjB3uJ,KAAK4uJ,kBAAoB,EAQzB5uJ,KAAKw+D,MAAQ,CACTqwF,oBAAqBX,GACrBY,mBAAoBZ,IAMxBluJ,KAAK+uJ,oBAAsB,IAAIlB,GAI/B7tJ,KAAK8jJ,mBAAqB,IAAIwJ,GAM9BttJ,KAAKgvJ,oBAAsB,SAU3BhvJ,KAAKmhJ,0BAA4B,YAQjCnhJ,KAAKivJ,kBAAoB,WAKzBjvJ,KAAK4rJ,uBAAyB,SAa9B5rJ,KAAKghF,SAAW7uB,EAASlxC,IAAIgyC,IAC7BjzD,KAAKsB,QAAU6wD,EAASlxC,IAAI,IAE5B,MAAM0yF,EAASxhD,EAASlxC,IAAIsrF,IAC5BvsG,KAAKyuJ,gBAAkB96C,aAAkBpH,GACzCvsG,KAAKkvJ,YAAYv4C,GACjB32G,KAAKmvJ,eAhtKF,IAAIvS,GAAQ,IAAIK,GAAgB,GAAI,IAAK,GAAI,MAitKhDj9I,KAAKovJ,WAAapvJ,KAAKmvJ,eACvBnvJ,KAAKqvJ,eAAiBrvJ,KAAKmvJ,eAC3BnvJ,KAAKymJ,aAAe,IAAI,GAAmBgH,EAAQ37C,EAhBlDvgE,GAAMvxC,KAAKsvJ,aAAa,IAAI1V,GAAqBroG,IAMjDA,GAAMvxC,KAAKsvJ,aAAa,IAAIzV,GAAmBtoG,KAWhDvxC,KAAKuvJ,YAAclP,GAAiBrgJ,KAAKmvJ,eAAgBnvJ,KAAK2rJ,mBAC9D3rJ,KAAKwvJ,YAAc,IAAI,GAAgB,CACnClhI,GAAI,EACJ6gI,eAAgBnvJ,KAAKmvJ,eACrBM,cAAezvJ,KAAKmvJ,eACpBO,aAAc1vJ,KAAK+uJ,oBAAoBY,QAAQ3vJ,KAAKmvJ,gBACpDjW,kBAAmBl5I,KAAK+uJ,oBAAoBY,QAAQ3vJ,KAAKmvJ,gBACzDS,OAAQ5vJ,KAAKmvJ,eACbU,OAAQ,GACR3nJ,QAAS,KACTm5B,OAAQ,KACR8oB,QAAS7tC,QAAQpU,SAAQ,GACzB0F,OAAQ,aACRorI,cAAe,KACf8I,gBAAiB9hJ,KAAKuvJ,YAAYxV,SAClC+V,eAAgB,KAChBC,mBAAoB/vJ,KAAKuvJ,YACzBS,kBAAmB,KACnBvE,OAAQ,CAAEnB,kBAAmB,GAAID,oBAAqB,IACtD4F,aAAc,OAElBjwJ,KAAKkwJ,YAAclwJ,KAAKmwJ,iBAAiBnwJ,KAAKwvJ,aAC9CxvJ,KAAKowJ,qBAOT,iBAAiBZ,GAEb,MAAMa,EAAoCrwJ,KAAa,OACvD,OAA6CwvJ,EAAYtnG,KAAK,GAI9D/oD,GAAc,IAATA,EAAEmvB,IAEP,EAIAnvB,GAAyBC,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAEuwJ,aAAc1vJ,KAAK+uJ,oBAAoBY,QAAQxwJ,EAAEywJ,WAEhH3X,GAIA94I,IAEI,IAAImxJ,GAAY,EAEZC,GAAU,EACd,OAAOx6B,GAAG52H,GAAG+oD,KAEb9lB,GAIAjjC,IACIa,KAAKuuJ,kBAAoB,CACrBjgI,GAAInvB,EAAEmvB,GACNkiI,WAAYrxJ,EAAEswJ,cACdC,aAAcvwJ,EAAEuwJ,aAChB7kB,QAAS1rI,EAAEyO,OACXiiJ,OAAQ1wJ,EAAE0wJ,OACVY,mBAAoBzwJ,KAAKsuJ,yBAA2BlvJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI37B,KAAKsuJ,0BAA2B,CAAEmC,mBAAoB,OACtI,QAEPxY,GAIL94I,IAEI,MAAMuxJ,GAAiB1wJ,KAAK2uJ,WAAaxvJ,EAAEuwJ,aAAa32I,aAAe/Y,KAAKqvJ,eAAet2I,WAI3F,IAFwD,WAA7B/Y,KAAKgvJ,qBAA0C0B,IACtE1wJ,KAAK+uJ,oBAAoB4B,iBAAiBxxJ,EAAEywJ,QAE5C,OAAO75B,GAAG52H,GAAG+oD,KAEb+vF,GAIA94I,IAEI,MAAMyxJ,EAAa5wJ,KAAKwvJ,YAAY3Z,WAEpC,OADAwa,EAAc/0H,KAAK,IAAIw9G,GAAgB35I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAevwJ,EAAEyO,OAAQzO,EAAE65I,gBACxF4X,IAAe5wJ,KAAKwvJ,YAAY3Z,WACzB,GAEJ,CAAC12I,KAIZ84I,GAIA94I,GAAKmd,QAAQpU,QAAQ/I,KAv5DfklE,EAy5DWrkE,KAAKghF,SAAS7uB,SAz5DTs0F,EAy5DmBzmJ,KAAKymJ,aAz5DVC,EAy5DwB1mJ,KAAK0mJ,cAz5Dd/vC,EAy5D6B32G,KAAK22G,OAx5D9F,SAIG/oG,GACN,OAAOA,EAAOs6C,KAAK+vF,GAInB94I,GAzvBR,SAAwBklE,EAAgBoiF,EAAcC,EAAepG,EAAS3pC,GAC1E,OAAO,IAAI,GAAetyC,EAAgBoiF,EAAcC,EAAepG,EAAS3pC,GAAQrjG,QAD5F,CAyvB4B+wD,EAAgBoiF,EAAcC,EAAevnJ,EAAEuwJ,aAAc/4C,GAC5EzuD,KAAK,EAIVgxF,GAAsB95I,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE+5I,kBAAAA,UA44DhD92G,GAIAjjC,IACIa,KAAKuuJ,kBAAoBnvJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAuB37B,KAAuB,mBAAI,CAAE8wJ,SAAU3xJ,EAAE+5I,sBAl1B7I,SAAqByS,EAAmBh1C,EAAQo6C,EAAY5P,EAA2ByK,GACnF,OAAO,SAIGh+I,GACN,OAAOA,EAAOs6C,KAAK2C,EAInB1rD,GAvfR,SAAmBwsJ,EAAmBh1C,EAAQ2pC,EAASr2E,EAAKk3E,EAA4B,YAAayK,EAAyB,UAC1H,OAAO,IAAI,GAAWD,EAAmBh1C,EAAQ2pC,EAASr2E,EAAKk3E,EAA2ByK,GACrFpzG,YAFT,CAufuBmzG,EAAmBh1C,EAAQx3G,EAAE+5I,kBAAmB6X,EAAW5xJ,EAAE+5I,mBAAoBiI,EAA2ByK,GACtH1jG,KAAK,EAIV4nG,GAAmB1wJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE2wJ,eAAAA,SAfjE,CAq1BgC9vJ,KAAK2rJ,kBAAmB3rJ,KAAK22G,OAIxC1sC,GAAQjqE,KAAK6wJ,aAAa5mF,GAAOjqE,KAAKmhJ,0BAA2BnhJ,KAAK4rJ,wBAEvExpH,GAIAjjC,IACmC,UAA3Ba,KAAKivJ,oBACA9vJ,EAAE0wJ,OAAOmB,oBACVhxJ,KAAKixJ,cAAc9xJ,EAAE+5I,oBAAqB/5I,EAAE0wJ,OAAOqB,WAAY/xJ,EAAEmvB,GAAInvB,EAAE0wJ,OAAO1xG,OAElFn+C,KAAKqvJ,eAAiBlwJ,EAAE+5I,qBAIhC92G,GAIAjjC,IAEI,MAAMgyJ,EAAmB,IAAI7X,GAAiBn6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa1xJ,EAAE+5I,mBAAuC/5I,EAAiB,gBACnKkxJ,EAAc/0H,KAAK61H,MA77D3C,IAA0B9sF,EAAgBoiF,EAAcC,EAAe/vC,EAu8DnD,GAL2B+5C,GAAiB1wJ,KAAKovJ,YAC7CpvJ,KAAK+uJ,oBAAoB4B,iBAAiB3wJ,KAAKovJ,YAI3B,CACpB,MAAM,GAAE9gI,EAAE,aAAEohI,EAAY,OAAE9hJ,EAAM,cAAEorI,EAAa,OAAE6W,GAAW1wJ,EAEtDiyJ,EAAW,IAAItY,GAAgBxqH,EAAItuB,KAAK6wJ,aAAanB,GAAe9hJ,EAAQorI,GAClFqX,EAAc/0H,KAAK81H,GAEnB,MAAMtB,EAAiBzP,GAAiBqP,EAAc1vJ,KAAK2rJ,mBAAmB5R,SAC9E,OAAOhkB,GAAG32H,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE2wJ,eAAAA,EAAgB5W,kBAAmBwW,EAAcG,OAAQzwJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIk0H,GAAS,CAAEmB,oBAAoB,EAAOE,YAAY,OAU3L,OAHAlxJ,KAAKovJ,WAAajwJ,EAAEywJ,OACpB5vJ,KAAKqvJ,eAAiBlwJ,EAAE+5I,kBACxB/5I,EAAE+I,QAAQ,MACH,KAKnBklJ,GAIAjuJ,IACI,MAAM,eAAE2wJ,EAAgBxhI,GAAIkgI,EAAckB,aAAc2B,EAAgBzB,OAAQR,EAAYS,QAAQ,mBAAEmB,EAAkB,WAAEE,IAAiB/xJ,EAC3I,OAAOa,KAAKw+D,MAAMqwF,oBAAoB,EAAqC,CACvEL,aAAAA,EACA6C,eAAAA,EACAjC,WAAAA,EACA4B,qBAAsBA,EACtBE,aAAcA,MAItB9uH,GAIAjjC,IAEI,MAAMmyJ,EAAc,IAAI/X,GAAiBp6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa1xJ,EAAE+5I,mBAAuC/5I,EAAiB,gBAC9Ja,KAAKsvJ,aAAagC,KACjB,EAILnyJ,GAAMC,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAEssJ,OAAQxB,GAAqC9qJ,EAAiB,eAAGA,EAAE2iJ,gBAAiB9hJ,KAAKquJ,iBAlqDjJ,SAAqBhqF,EAAgB4/E,GACjC,OAAO,SAIGr2I,GACN,OAAOA,EAAOs6C,KAAK2C,EAInB1rD,IACI,MAAM,eAAE2wJ,EAAc,gBAAEhO,EAAiB2J,QAAQ,kBAAEnB,EAAiB,oBAAED,IAA0BlrJ,EAChG,OAAmC,IAA/BkrJ,EAAoBvpJ,QAA6C,IAA7BwpJ,EAAkBxpJ,OAC/Ci1H,GAAG32H,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE8wJ,cAAc,KA0B9E,SAAgC7F,EAAQe,EAAWoG,EAASltF,GACxD,OAAO,EAAK+lF,GAAQliG,KAAK2C,EAIzB6uC,GAiLJ,SAA0BhgB,EAAW83E,EAASD,EAASpG,EAAW9mF,GAE9D,MAAMotF,EAAgBD,GAAWA,EAAQxX,YAAcwX,EAAQxX,YAAYyX,cAAgB,KAC3F,OAAKA,GAA0C,IAAzBA,EAAc3wJ,OAwB7Bi1H,GArB0B07B,EAAchwJ,IAI9C3C,IAEG,MAAMkxB,EAAQotG,GAASt+H,EAAG0yJ,EAASntF,GAEnC,IAAIpc,EACJ,GAv4CR,SAAyBj4B,GACrB,OAAOA,GAAS,GAAWA,EAAMyhI,eADrC,CAu4C4BzhI,GAChBi4B,EACIi0F,GAAmBlsH,EAAMyhI,cAAc,EAAgCD,EAASD,EAASpG,QAE5F,CAAA,IAAI,GAAWn7H,GAIhB,MAAM,IAAIvpB,MAAM,+BAHhBwhD,EAAai0F,GAAmBlsH,EAAM0pD,EAAW83E,EAASD,EAASpG,IAKvE,OAAOljG,EAAWC,KAAK,SAESA,KAAK0iG,MAvB9B70B,IAAG,GAJlB,CAjL8Br8B,EAAMhgB,UAAWggB,EAAMixC,MAAO4mB,EAASpG,EAAW9mF,IAAmB,GAI/F38D,IAA8B,IAAXA,GAAqB,IAT5C,CAxB0C2iJ,EAAqB,EAAqCvI,EAAiBz9E,GACpGnc,KAAK2C,EAIV4mG,GACWA,GAntCC,kBAmtC0BA,EAoClD,SAA8B3Q,EAAgBsJ,EAAQ/lF,EAAgB4/E,GAClE,OAAO,EAAKmG,GAAQliG,KAAKjZ,GAIxByqD,GACU,EAAK,CACRuxD,GAAyBvxD,EAAMixC,MAAMtkH,OAAQ49H,GAC7C+G,GAAoBtxD,EAAMixC,MAAOsZ,GACjCqH,GAAoBxK,EAAgBpnD,EAAMx7F,KAAMmmE,GAChD6mF,GAAepK,EAAgBpnD,EAAMixC,MAAOtmE,KAE3Cnc,KAAK2uF,KAAa,GAIvBnvI,IACsB,IAAXA,GACP,KACH,GAILA,IAA8B,IAAXA,GAAqB,IAvB5C,CAnCyC,EAAqC4iJ,EAAmBjmF,EAAgB4/E,GAC7FluB,GAAG07B,IACN,EAILxB,GAAiB7wJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE8wJ,aAAAA,UA5BnE,CAkqDkLjwJ,KAAKghF,SAAS7uB,SAInLk9D,GAAQrvH,KAAKsvJ,aAAajgC,IAAQjtF,GAInCjjC,IACI,GAAIgnJ,GAAUhnJ,EAAE8wJ,cAAe,CAE3B,MAAM1uJ,EAAQk5I,GAAyB,mBAAmBz6I,KAAK6wJ,aAAa1xJ,EAAE8wJ,kBAE9E,MADA1uJ,EAAM0oE,IAAM9qE,EAAE8wJ,aACR1uJ,KAET6gC,GAILjjC,IAEI,MAAMuyJ,EAAY,IAAIlY,GAAer6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa1xJ,EAAE+5I,mBAAuC/5I,EAAiB,iBAAKA,EAAE8wJ,cACjKjwJ,KAAKsvJ,aAAaoC,KACjB,GAILvyJ,IACI,IAAKA,EAAE8wJ,aAAc,CACjBjwJ,KAAK2xJ,2BAEL,MAAMC,EAAY,IAAIzY,GAAiBh6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe,IAGhF,OAFAW,EAAc/0H,KAAKs2H,GACnBzyJ,EAAE+I,SAAQ,IACH,EAEX,OAAO,IAGXklJ,GAIAjuJ,IACI,GAAIA,EAAEssJ,OAAOnB,kBAAkBxpJ,OAC3B,OAAOi1H,GAAG52H,GAAG+oD,KAAK9lB,GAIlBjjC,IAEI,MAAM0yJ,EAAe,IAAInY,GAAav6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa1xJ,EAAE+5I,mBAAuC/5I,EAAiB,gBAC3Ja,KAAKsvJ,aAAauC,MAj8BrB1Q,EAk8BgBnhJ,KAAKmhJ,0BAl8BM98E,EAk8BqBrkE,KAAKghF,SAAS7uB,SAj8BxE,SAIGvkD,GACN,OAAOA,EAAOs6C,KAAK2C,EAInB1rD,IACI,MAAM,eAAE2wJ,EAAgBrE,QAAQ,kBAAEnB,IAAwBnrJ,EAC1D,OAAKmrJ,EAAkBxpJ,OAGhB,EAAKwpJ,GACPpiG,KAAKjZ,GAIVyqD,GAoBZ,SAAoB0xD,EAAWD,EAAWhK,EAA2B98E,GAGjE,OAkBJ,SAAqBn8D,EAASkjJ,EAAWD,EAAW9mF,GAEhD,MAAMhlE,EAAOD,OAAOC,KAAK6I,GACzB,GAAoB,IAAhB7I,EAAKyB,OACL,OAAOi1H,GAAG,IAEd,GAAoB,IAAhB12H,EAAKyB,OAAc,CAEnB,MAAM2U,EAAMpW,EAAK,GACjB,OAAO8tJ,GAAYjlJ,EAAQuN,GAAM21I,EAAWD,EAAW9mF,GAClDnc,KAAK,EAIT78C,IAAAA,CAAqB,CAACoK,GAAMpK,MAGjC,MAAM+T,EAAO,GAiBb,OAf0B,EAAK/f,GAAM6oD,KAAK2C,EAIzCp1C,GACU03I,GAAYjlJ,EAAQuN,GAAM21I,EAAWD,EAAW9mF,GAClDnc,KAAK,EAIT78C,IACG+T,EAAK3J,GAAOpK,EACLA,OAGU68C,KAAK,KAAU,EAAI,IAGtC9oC,IArCV,CAnBoBgsI,EAAUzJ,SACEyJ,EAAWD,EAAW9mF,GAC7Cnc,KAAK,EAIT4pG,IACG1G,EAAU9J,cAAgBwQ,EAC1B1G,EAAUhsI,KAAOhgB,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIyvH,EAAUhsI,MAAO8hI,GAA2BkK,EAAWjK,GAA2Bj5I,SAC5H,QAXf,CApBgCwxF,EAAMixC,MAAO,EAAqCwW,EAA2B98E,IExgMtG,SAAgBtwD,EAAaqkI,GAChC,OAAI9vI,UAAUxH,QAAU,EACb,SAAwC8M,GAC3C,OAAOs6C,EAAKiwF,GAAKpkI,EAAaqkI,GAAOpB,GAAS,GAAIO,GAAea,GAA1DlwF,CAAiEt6C,IAGzE,SAAgCA,GACnC,OAAOs6C,EAAKiwF,GAAK,CAAC0S,EAAKx/I,EAAO2I,IAAUD,EAAY82I,EAAKx/I,EAAO2I,EAAQ,IAAKgjI,GAAS,GAA/E9uF,CAAmFt6C,IAP3F,CFwgMgI,CAK1HxJ,EAAG45H,IAAO55H,GAAK,EAIhBA,GAAKjF,IAhBM42H,GAAG52H,QAs7BNijC,GAIAjjC,IAEI,MAAM4yJ,EAAa,IAAIpY,GAAWx6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa1xJ,EAAE+5I,mBAAuC/5I,EAAiB,gBACvJa,KAAKsvJ,aAAayC,MA18B1C,IAAqB5Q,EAA2B98E,IAg9BpC+oF,GAICjuJ,IACG,MAAM,eAAE2wJ,EAAgBxhI,GAAIkgI,EAAckB,aAAc2B,EAAgBzB,OAAQR,EAAYS,QAAQ,mBAAEmB,EAAkB,WAAEE,IAAiB/xJ,EAC3I,OAAOa,KAAKw+D,MAAMswF,mBAAmB,EAAqC,CACtEN,aAAAA,EACA6C,eAAAA,EACAjC,WAAAA,EACA4B,qBAAsBA,EACtBE,aAAcA,MAEjB,EAIJ/xJ,IAEG,MAAM6wJ,EA7zHtB,SAA2BlM,EAAoBzC,EAAM2Q,GAEjD,MAAMjoJ,EASV,SAASkoJ,EAAWnO,EAAoBzC,EAAM2Q,GAE1C,GAAIA,GAAalO,EAAmBoO,iBAAiB7Q,EAAKh2I,MAAO2mJ,EAAU3mJ,MAAM0uI,UAAW,CAExF,MAAM1uI,EAAQ2mJ,EAAU3mJ,MACxBA,EAAM01I,gBAAkBM,EAAKh2I,MAE7B,MAAM+lC,EAiDd,SAA+B0yG,EAAoBzC,EAAM2Q,GACrD,OAAO3Q,EAAKjwG,SAAS3vC,IAIrBsxC,IACI,IAAK,MAAMvzC,KAAKwyJ,EAAU5gH,SACtB,GAAI0yG,EAAmBoO,iBAAiB1yJ,EAAE6L,MAAM0uI,SAAUhnG,EAAM1nC,OAC5D,OAAO4mJ,EAAWnO,EAAoB/wG,EAAOvzC,GAGrD,OAAOyyJ,EAAWnO,EAAoB/wG,KAX9C,CAjD+C+wG,EAAoBzC,EAAM2Q,GACjE,OAAO,IAAI/R,GAAS50I,EAAO+lC,GAG1B,CAED,MAAM+gH,EAAyCrO,EAAmB6B,SAAStE,EAAKh2I,OAChF,GAAI8mJ,EAAqB,CAErB,MAAMnU,EAAOmU,EAAoBxnB,MAEjC,OAoBZ,SAASynB,EAAoC/Q,EAAM35I,GAC/C,GAAI25I,EAAKh2I,MAAM2uI,cAAgBtyI,EAAO2D,MAAM2uI,YACxC,MAAM,IAAIvzI,MAAM,yEAEpB,GAAI46I,EAAKjwG,SAAStwC,SAAW4G,EAAO0pC,SAAStwC,OACzC,MAAM,IAAI2F,MAAM,8EAEpBiB,EAAO2D,MAAM01I,gBAAkBM,EAAKh2I,MACpC,IAAK,IAAI3K,EAAI,EAAGA,EAAI2gJ,EAAKjwG,SAAStwC,SAAUJ,EACxC0xJ,EAAoC/Q,EAAKjwG,SAAS1wC,GAAIgH,EAAO0pC,SAAS1wC,IAT9E,CArBgD2gJ,EAAMrD,GACnCA,EAEN,CAED,MAAM3yI,EAqDP,IAAI,GAAe,IAAI,IADJvM,EApDiBuiJ,EAAKh2I,OAqDA4+D,KAAM,IAAI,GAAgBnrE,EAAEy6G,QAAS,IAAI,GAAgBz6G,EAAEs7G,aAAc,IAAI,GAAgBt7G,EAAE+9I,UAAW,IAAI,GAAgB/9I,EAAEsgB,MAAOtgB,EAAE08I,OAAQ18I,EAAE46E,UAAW56E,GAnDhMsyC,EAAWiwG,EAAKjwG,SAAS3vC,IAI/B3C,GAAKmzJ,EAAWnO,EAAoBhlJ,IACpC,OAAO,IAAImhJ,GAAS50I,EAAO+lC,IA6CvC,IAA8BtyC,EA1E9B,CAT4BglJ,EAAoBzC,EAAKzB,MAAOoS,EAAYA,EAAUpS,WAAQ1pI,GACtF,OAAO,IAAIiqI,GAAYp2I,EAAMs3I,GAHjC,CA6zH4DrhJ,KAAK8jJ,mBAAuC3kJ,EAAiB,eAAGA,EAAE4wJ,oBAC9G,OAAQ3wJ,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIx8B,GAAI,CAAE6wJ,kBAAAA,MAOlD5tH,GAICjjC,IACGa,KAAKmvJ,eAAiBhwJ,EAAE+5I,kBACxBl5I,KAAKovJ,WAAapvJ,KAAK+uJ,oBAAoBvyH,MAAMx8B,KAAKmvJ,eAAgBhwJ,EAAEywJ,QACxE,KAA4BL,YAAiCpwJ,EAAoB,kBAClD,aAA3Ba,KAAKivJ,oBACA9vJ,EAAE0wJ,OAAOmB,oBACVhxJ,KAAKixJ,cAAcjxJ,KAAKovJ,aAAcjwJ,EAAE0wJ,OAAOqB,WAAY/xJ,EAAEmvB,GAAInvB,EAAE0wJ,OAAO1xG,OAE9En+C,KAAKqvJ,eAAiBlwJ,EAAE+5I,sBA/wG3CmV,EAixG+BruJ,KAAKquJ,aAjxGtBvK,EAixGoC9jJ,KAAK8jJ,mBAjxGrBG,EAqxGtB50B,GAAQrvH,KAAKsvJ,aAAajgC,GArxGa,EAIpDlwH,IACI,IAAI0kJ,GAAeC,EAAuC3kJ,EAAoB,kBAAGA,EAAE4wJ,mBAAoB9L,GAClGoO,SAAShE,GACPlvJ,KA8wGoCijC,GAAI,CAGnC,OAASkuH,GAAY,GAGrB,WAAaA,GAAY,MDz/NhB//H,ECy/NqC,KAS9C,IAAK+/H,IAAcC,EAAS,CAOxBvwJ,KAAK2xJ,2BAEL,MAAMC,EAAY,IAAIzY,GAAiBh6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe,iBAAiBvwJ,EAAEmvB,gDAAgDtuB,KAAKwuJ,gBACxJ6B,EAAc/0H,KAAKs2H,GACnBzyJ,EAAE+I,SAAQ,GAKdlI,KAAKuuJ,kBAAoB,MDjhO7B3gJ,GAAWA,EAAO+7C,KAAK,IAAIivF,GAAgBroH,KCkhOtCmnH,GAIJjlI,IAIG,GAHA89I,GAAU,GA7uMUhvJ,EAgvMWkR,IA/uM3B,EAAuD,2BA+uMxB,CAE/B,MAAM6/I,EAAcnM,GAAU1zI,EAAEw3D,KAC3BqoF,IAMDtyJ,KAAK2uJ,WAAY,EACjB3uJ,KAAKuyJ,iBAAiBpzJ,EAAE4wJ,mBAAoB5wJ,EAAEgwJ,eAAgBhwJ,EAAEywJ,SAGpE,MAAMgC,EAAY,IAAIzY,GAAiBh6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAej9I,EAAEyU,SAClFmpI,EAAc/0H,KAAKs2H,GAGdU,EAQDx3I,WAAW,KAKP,MAAM03I,EAAaxyJ,KAAK+uJ,oBAAoBvyH,MAAM/pB,EAAEw3D,IAAKjqE,KAAKovJ,YAM9D,OAAOpvJ,KAAKyyJ,mBAAmBD,EAAY,aAAc,KAJ1C,CACXxB,mBAAoB7xJ,EAAE0wJ,OAAOmB,mBAC7BE,WAAuC,UAA3BlxJ,KAAKivJ,mBAEkD,CAAE/mJ,QAAS/I,EAAE+I,QAASm5B,OAAQliC,EAAEkiC,OAAQ8oB,QAAShrD,EAAEgrD,WAC1H,GAnBJhrD,EAAE+I,SAAQ,OAwBb,CACDlI,KAAKuyJ,iBAAiBpzJ,EAAE4wJ,mBAAoB5wJ,EAAEgwJ,eAAgBhwJ,EAAEywJ,QAEhE,MAAM8C,EAAW,IAAIrZ,GAAgBl6I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAej9I,GAC9E49I,EAAc/0H,KAAKo3H,GACnB,IACIvzJ,EAAE+I,QAAQlI,KAAK85E,aAAarnE,IAEhC,MAAOkgJ,GACHxzJ,EAAEkiC,OAAOsxH,IAnyMjC,IAAoCpxJ,EAsyMpB,OAAO,MDjlOhB,IAAkBgvB,EC8tHxB89H,EAAcvK,EAAoBG,KA83G/B,uBAAuB0H,GACnB3rJ,KAAK2rJ,kBAAoBA,EAGzB3rJ,KAAKuvJ,YAAYxlJ,KAAK2vE,UAAY15E,KAAK2rJ,kBAM3C,gBAEI,MAAMiF,EAAa5wJ,KAAKwvJ,YAAYnkJ,MAKpC,OADAulJ,EAAW1X,kBAAoBl5I,KAAKqvJ,eAC7BuB,EAOX,cAAczxJ,GACVa,KAAKwvJ,YAAYl0H,KAAKl8B,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI37B,KAAK4yJ,iBAAkBzzJ,IAMjF,oBACIa,KAAK6yJ,8BACqB,IAAtB7yJ,KAAKwuJ,cACLxuJ,KAAK8yJ,cAAc9yJ,KAAKqhE,SAASnjE,MAAK,GAAO,CAAEgzJ,YAAY,IAOnE,8BAISlxJ,KAAK+yJ,uBACN/yJ,KAAK+yJ,qBAA0C/yJ,KAAKqhE,SAAS/Y,UAI5DsmD,IAEG,IAAIwgD,EAAapvJ,KAAKgzJ,SAASpkD,EAAY,KAE3C,MAAMhhG,EAA4B,aAAnBghG,EAAa,KAAmB,WAAa,aAItDzwD,EAAQywD,EAAOzwD,OAASywD,EAAOzwD,MAAMqwG,aAAe5/C,EAAOzwD,MAAQ,KACzErjC,WAAW,KAGH9a,KAAKyyJ,mBAAmBrD,EAAYxhJ,EAAQuwC,EAAO,CAAE+yG,YAAY,KAAa,MAQlG,UAAY,OAAOlxJ,KAAK6wJ,aAAa7wJ,KAAKmvJ,gBAK1C,uBAAyB,OAAOnvJ,KAAKuuJ,kBAMrC,aAAantG,GAA6BphD,KAAa,OAAEs7B,KAAK8lB,GAkB9D,YAAYu1D,GACRwkC,GAAexkC,GACf32G,KAAK22G,OAASA,EAAOl1G,IAAIm6I,IACzB57I,KAAK2uJ,WAAY,EACjB3uJ,KAAK4uJ,kBAAoB,EAM7B,cAAgB5uJ,KAAKizJ,UAKrB,UACQjzJ,KAAK+yJ,uBACL/yJ,KAAK+yJ,qBAAqB/sG,cAC1BhmD,KAAK+yJ,qBAAuB,MAgDpC,cAAclQ,EAAUqQ,EAAmB,IACvC,MAAM,WAAEC,EAAU,YAAE/4C,EAAW,SAAEyiC,EAAQ,oBAAEuW,EAAmB,oBAAEC,EAAmB,iBAAEC,GAAqBJ,EACtGzrF,MAAe2rF,GAAuB,SAAmD9xJ,QAAa,MACtGA,QAAQoxC,KAAK,uEAGjB,MAAMzzC,EAAIk0J,GAAcnzJ,KAAKuvJ,YAAYxlJ,KAEnCtE,EAAI6tJ,EAAmBtzJ,KAAKmvJ,eAAetS,SAAWA,EAE5D,IAAI0W,EAAI,KACR,GAAIF,EACA,OAAQA,GACJ,IAAK,QACDE,EAAIn0J,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAI37B,KAAKmvJ,eAAe/0C,aAAcA,GACtE,MACJ,IAAK,WACDm5C,EAAIvzJ,KAAKmvJ,eAAe/0C,YACxB,MACJ,QACIm5C,EAAIn5C,GAAe,UAI3Bm5C,EAAIH,EAAsBpzJ,KAAKmvJ,eAAe/0C,YAAcA,GAAe,KAK/E,OAHU,OAANm5C,IACAA,EAAIvzJ,KAAKwzJ,iBAAiBD,IA1hItC,SAAuB5oB,EAAO2V,EAASuC,EAAUzoC,EAAayiC,GAC1D,GAAwB,IAApBgG,EAAS/hJ,OACT,OAAO,GAAKw/I,EAAQv2I,KAAMu2I,EAAQv2I,KAAMu2I,EAASlmC,EAAayiC,GAGlE,MAAM4W,EAoHV,SAA2B5Q,GACvB,GAA4B,iBAAhBA,EAAS,IAAwC,IAApBA,EAAS/hJ,QAAgC,MAAhB+hJ,EAAS,GACvE,OAAO,IAAIF,IAAW,EAAM,EAAGE,GAGnC,IAAID,EAAqB,EAErB56I,GAAa,EAEjB,MAAMf,EAAM47I,EAASjkJ,OAAO,CAM3BqI,EAAKysJ,EAAKC,KACP,GAAmB,iBAARD,GAA2B,MAAPA,EAAa,CACxC,GAAIA,EAAIvR,QAAS,CAEb,MAAMA,EAAU,GAShB,OARA7iJ,GAAQo0J,EAAIvR,QAAS,CAKpBU,EAAUp4I,KACP03I,EAAQ13I,GAA4B,iBAAbo4I,EAAwBA,EAASlkJ,MAAM,KAAOkkJ,IAElE,IAAI57I,EAAK,CAAEk7I,QAAAA,IAEtB,GAAIuR,EAAItR,YACJ,MAAO,IAAIn7I,EAAKysJ,EAAItR,aAG5B,MAAqB,iBAARsR,EACF,IAAIzsJ,EAAKysJ,GAEL,IAAXC,GACAD,EAAI/0J,MAAM,KAAKW,QAAQ,CAKtBs0J,EAASC,KACW,GAAbA,GAA8B,MAAZD,IAGA,GAAbC,GAA8B,KAAZD,EACvB5rJ,GAAa,EAEI,OAAZ4rJ,EACLhR,IAEgB,IAAXgR,GACL3sJ,EAAI5D,KAAKuwJ,MAGV3sJ,GAEJ,IAAIA,EAAKysJ,IAChB,IACJ,OAAO,IAAI/Q,GAAW36I,EAAY46I,EAAoB37I,GA7D1D,CApHkC47I,GAC9B,GAAI4Q,EAAIK,SACJ,OAAO,GAAKxT,EAAQv2I,KAAM,IAAIkzI,GAAgB,GAAI,IAAKqD,EAASlmC,EAAayiC,GAGjF,MAAMkX,EAwMV,SAA8BN,EAAKzV,EAAMrT,GACrC,GAAI8oB,EAAIzrJ,WACJ,OAAO,IAAI+6I,GAAS/E,EAAKj0I,MAAM,EAAM,GAEzC,IAAuC,IAAnC4gI,EAAMoP,SAAS2H,eACf,OAAO,IAAIqB,GAASpY,EAAMoP,SAAS0H,aAAa,EAAM,GAG1D,MAAMuS,EAAW/R,GAAewR,EAAI5Q,SAAS,IAAM,EAAI,EAGvD,OAQJ,SAA0CtrH,EAAOvjB,EAAO4uI,GAEpD,IAAI/jB,EAAItnG,EAEJ08H,EAAKjgJ,EAELkgJ,EAAKtR,EACT,KAAOsR,EAAKD,GAAI,CAGZ,GAFAC,GAAMD,EACNp1B,EAAuBA,EAAS,QAC3BA,EACD,MAAM,IAAIp4H,MAAM,2BAEpBwtJ,EAAKp1B,EAAE8b,SAAS75I,OAEpB,OAAO,IAAIiiJ,GAASlkB,GAAG,EAAOo1B,EAAKC,GAfvC,CAR4CvpB,EAAMoP,SAAS0H,YADzC9W,EAAMoP,SAAS2H,eAAiBsS,EAC6BP,EAAI7Q,oBAXnF,CAxMkD6Q,EAAKnT,EAAS3V,GAEtDiQ,EAAemZ,EAAiB/Q,gBAClCG,GAA2B4Q,EAAiBnZ,aAAcmZ,EAAiB//I,MAAOy/I,EAAI5Q,UACtFK,GAAmB6Q,EAAiBnZ,aAAcmZ,EAAiB//I,MAAOy/I,EAAI5Q,UAClF,OAAO,GAAKkR,EAAiBnZ,aAAcA,EAAc0F,EAASlmC,EAAayiC,GAfnF,CA4hI6B59I,EAAGe,KAAKmvJ,eAAgBtM,EAAU,EAAwB,GAuBnF,cAAc54E,EAAK4lF,EAAS,CAAEmB,oBAAoB,IAC1CvpF,MAAeznE,KAAKyuJ,kBAAoBliD,GAAO2C,mBAC/ClvG,KAAKsB,QAAQoxC,KAAK,qFAGtB,MAAM4tG,EAAU6F,GAAUl8E,GAAOA,EAAMjqE,KAAKgzJ,SAAS/oF,GAE/CuoF,EAAaxyJ,KAAK+uJ,oBAAoBvyH,MAAM8jH,EAAStgJ,KAAKovJ,YAChE,OAAOpvJ,KAAKyyJ,mBAAmBD,EAAY,aAAc,KAAM3C,GAgCnE,SAAShN,EAAUgN,EAAS,CAAEmB,oBAAoB,IAE9C,OA2XR,SAA0BnO,GACtB,IAAK,IAAIniJ,EAAI,EAAGA,EAAImiJ,EAAS/hJ,OAAQJ,IAAK,CAEtC,MAAMgzJ,EAAM7Q,EAASniJ,GACrB,GAAW,MAAPgzJ,EACA,MAAM,IAAIjtJ,MAAM,+BAA+BitJ,sBAAwBhzJ,MALnF,CA5XyBmiJ,GACV7iJ,KAAK8yJ,cAAc9yJ,KAAK8mJ,cAAcjE,EAAUgN,GAASA,GAOpE,aAAa5lF,GAAO,OAAOjqE,KAAK0mJ,cAAc1J,UAAU/yE,GAMxD,SAASA,GAEL,IAAIq2E,EACJ,IACIA,EAAUtgJ,KAAK0mJ,cAAc9kJ,MAAMqoE,GAEvC,MAAOx3D,GACH6tI,EAAUtgJ,KAAK0uJ,yBAAyBj8I,EAAGzS,KAAK0mJ,cAAez8E,GAEnE,OAAOq2E,EAQX,SAASr2E,EAAKoyE,GACV,GAAI8J,GAAUl8E,GACV,OAAOkyE,GAAan8I,KAAKmvJ,eAAgBllF,EAAKoyE,GAGlD,MAAMiE,EAAUtgJ,KAAKgzJ,SAAS/oF,GAC9B,OAAOkyE,GAAan8I,KAAKmvJ,eAAgB7O,EAASjE,GAOtD,iBAAiB9iC,GACb,OAAOn6G,OAAOC,KAAKk6G,GAAQ36G,OAAO,CAKjC8I,EAAQ+N,KAEL,MAAMpK,EAAQkuG,EAAO9jG,GAIrB,OAHIpK,MAAAA,IACA3D,EAAO+N,GAAOpK,GAEX3D,GACP,IAMR,qBACI1H,KAAKkwJ,YAAY5nG,UAIjBnpD,IACIa,KAAK2uJ,WAAY,EACjB3uJ,KAAK4uJ,iBAAmBzvJ,EAAEmvB,GACNtuB,KAAa,OAC5Bs7B,KAAK,IAAI29G,GAAc95I,EAAEmvB,GAAItuB,KAAK6wJ,aAAa1xJ,EAAEuwJ,cAAe1vJ,KAAK6wJ,aAAa7wJ,KAAKmvJ,kBAC5FnvJ,KAAKsuJ,yBAA2BtuJ,KAAKuuJ,kBACrCvuJ,KAAKuuJ,kBAAoB,KACzBpvJ,EAAE+I,SAAQ,IAKduK,IAAOzS,KAAKsB,QAAQoxC,KAAK,kCAW7B,mBAAmBk9G,EAAQhiJ,EAAQorI,EAAe6W,EAAQsE,GAEtD,MAAMC,EAAiBp0J,KAAK4yJ,gBAI5B,GAAIwB,GAA6B,eAAXxmJ,GAAqD,eAA1BwmJ,EAAexmJ,QAC5DwmJ,EAAexE,OAAO72I,aAAe62I,EAAO72I,WAC5C,OAAOuD,QAAQpU,SAAQ,GAK3B,GAAIksJ,GAA4B,cAAVxmJ,GAAoD,aAA1BwmJ,EAAexmJ,QAC3DwmJ,EAAexE,OAAO72I,aAAe62I,EAAO72I,WAC5C,OAAOuD,QAAQpU,SAAQ,GAK3B,GAAIksJ,GAA4B,YAAVxmJ,GAAkD,eAA1BwmJ,EAAexmJ,QACzDwmJ,EAAexE,OAAO72I,aAAe62I,EAAO72I,WAC5C,OAAOuD,QAAQpU,SAAQ,GAG3B,IAAIA,EAEAm5B,EAEA8oB,EACAgqG,GACAjsJ,EAAUisJ,EAAajsJ,QACvBm5B,EAAS8yH,EAAa9yH,OACtB8oB,EAAUgqG,EAAahqG,SAGvBA,EAAU,IAAI7tC,QAAQ,CAKrBrV,EAAKujG,KACFtiG,EAAUjB,EACVo6B,EAASmpE,IAIjB,MAAMl8E,IAAOtuB,KAAKwuJ,aAYlB,OAXAxuJ,KAAKq0J,cAAc,CACf/lI,GAAAA,EACA1gB,OAAAA,EACAorI,cAAAA,EACAmW,eAAgBnvJ,KAAKmvJ,eACrBM,cAAezvJ,KAAKovJ,WAAYQ,OAAAA,EAAQC,OAAAA,EAAQ3nJ,QAAAA,EAASm5B,OAAAA,EAAQ8oB,QAAAA,EACjE23F,gBAAiB9hJ,KAAKuvJ,YAAYxV,SAClCgW,mBAAoB/vJ,KAAKuvJ,cAItBplG,EAAQwgD,MAIdl4F,GAAe6J,QAAQ+kB,OAAO5uB,IAUnC,cAAcw3D,EAAKinF,EAAY5iI,EAAI6vB,GAE/B,MAAMjgD,EAAO8B,KAAK0mJ,cAAc1J,UAAU/yE,GAC1C9rB,EAAQA,GAAS,GACbn+C,KAAKqhE,SAASizF,qBAAqBp2J,IAASgzJ,EAE5ClxJ,KAAKqhE,SAASw3C,aAAa36G,EAAM,GAAIkB,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIwiB,GAAQ,CAAEqwG,aAAclgI,KAG7FtuB,KAAKqhE,SAASkzF,GAAGr2J,EAAM,GAAIkB,OAAOu8B,OAAOv8B,OAAOu8B,OAAO,GAAIwiB,GAAQ,CAAEqwG,aAAclgI,KAU3F,iBAAiBkmI,EAAaC,EAAW7E,GACrC,KAA4BL,YAAciF,EAC1Cx0J,KAAKmvJ,eAAiBsF,EACtBz0J,KAAKovJ,WAAapvJ,KAAK+uJ,oBAAoBvyH,MAAMx8B,KAAKmvJ,eAAgBS,GACtE5vJ,KAAK2xJ,2BAMT,2BACI3xJ,KAAKqhE,SAASw3C,aAAa74G,KAAK0mJ,cAAc1J,UAAUh9I,KAAKovJ,YAAa,GAAI,CAAEZ,aAAcxuJ,KAAK4uJ,2BAG3GR,EAAO/8F,UAAO,SAAwBlyD,GAAK,MAC3CivJ,EAAOv9F,UAAO,GAAyB,CAAEvtD,KAAM8qJ,yBAmSzCsG,EAQF,YAAYC,EAAQhqB,EAAOiqB,EAAUp7F,EAAU7oB,GAC3C3wC,KAAK20J,OAASA,EACd30J,KAAK2qI,MAAQA,EACb3qI,KAAK6iJ,SAAW,GACA,MAAZ+R,GACAp7F,EAAS0G,aAAavvB,EAAG+lD,cAAe,WAAY,KAO5D,eAAemsD,GAEP7iJ,KAAK6iJ,SADO,MAAZA,EACgBjuI,MAAM4I,QAAQqlI,GAAYA,EAAW,CAACA,GAGtC,GAQxB,wBAAwBx3I,GAChBo8D,MAAe,SAAmDnmE,QAAa,MAC/EA,QAAQoxC,KAAK,wEAEjB1yC,KAAK60J,SAAWxpJ,EAKpB,UAEI,MAAMwkJ,EAAS,CACXmB,mBAAoB8D,GAAc90J,KAAKgxJ,oBACvCE,WAAY4D,GAAc90J,KAAKkxJ,YAC/B/yG,MAAOn+C,KAAKm+C,OAGhB,OADAn+C,KAAK20J,OAAO7B,cAAc9yJ,KAAKsgJ,QAASuP,IACjC,EAKX,cACI,OAAO7vJ,KAAK20J,OAAO7N,cAAc9mJ,KAAK6iJ,SAAU,CAC5CsQ,WAAYnzJ,KAAK2qI,MACjBvwB,YAAap6G,KAAKo6G,YAClByiC,SAAU78I,KAAK68I,SACfuW,oBAAqB0B,GAAc90J,KAAK60J,UACxCxB,oBAAqBrzJ,KAAKqzJ,oBAC1BC,iBAAkBwB,GAAc90J,KAAKszJ,4BAIjDoB,EAAWrjG,UAAO,SAA4BlyD,GAAK,OAAO,IAAKA,GAAKu1J,GAAY,GAAyB,IAAS,GAAyB,IAAiB,GAAyB,YAAa,GAAyB,IAAmB,GAAyB,MACvQA,EAAW7jG,UAAO,GAAyB,CAAEvtD,KAAMoxJ,EAAY79F,UAAW,CAAC,CAAC,GAAI,aAAc,GAAI,EAAG,IAAK,EAAG,SAAU1B,aAAc,SAAiCme,EAAIvnC,GAAgB,EAALunC,GAC7K,GAAkB,SAAA,WAA0D,OAAOvnC,EAAIgpH,cACtFx/F,OAAQ,CAAEy/F,WAAY,aAAc5B,oBAAqB,sBAAuBh5C,YAAa,cAAeyiC,SAAU,WAAYwW,oBAAqB,sBAAuBC,iBAAkB,mBAAoBtC,mBAAoB,qBAAsBE,WAAY,aAAc/yG,MAAO,gCAgGlS82G,EAMF,YAAYN,EAAQhqB,EAAOuqB,GACvBl1J,KAAK20J,OAASA,EACd30J,KAAK2qI,MAAQA,EACb3qI,KAAKk1J,iBAAmBA,EACxBl1J,KAAK6iJ,SAAW,GAChB7iJ,KAAKwmD,aAAemuG,EAAOjxG,OAAO4E,UAIjC5mD,IACOA,aAAau3I,IACbj5I,KAAKm1J,2BAQjB,eAAetS,GAEP7iJ,KAAK6iJ,SADO,MAAZA,EACgBjuI,MAAM4I,QAAQqlI,GAAYA,EAAW,CAACA,GAGtC,GAOxB,wBAAwBx3I,GAChBo8D,MAAe,SAAmDnmE,QAAa,MAC/EA,QAAQoxC,KAAK,uEAEjB1yC,KAAK60J,SAAWxpJ,EAMpB,YAAY86F,GAAWnmG,KAAKm1J,yBAI5B,cAAgBn1J,KAAKwmD,aAAaR,cAQlC,QAAQtM,EAAQ46E,EAASC,EAASC,GAC9B,GAAe,IAAX96E,GAAgB46E,GAAWC,GAAWC,EACtC,OAAO,EAEX,GAA2B,iBAAhBx0H,KAAK6jC,QAAsC,SAAf7jC,KAAK6jC,OACxC,OAAO,EAGX,MAAMgsH,EAAS,CACXmB,mBAAoB8D,GAAc90J,KAAKgxJ,oBACvCE,WAAY4D,GAAc90J,KAAKkxJ,YAC/B/yG,MAAOn+C,KAAKm+C,OAGhB,OADAn+C,KAAK20J,OAAO7B,cAAc9yJ,KAAKsgJ,QAASuP,IACjC,EAMX,yBACI7vJ,KAAKo4G,KAAOp4G,KAAKk1J,iBAAiB56C,mBAAmBt6G,KAAK20J,OAAO9D,aAAa7wJ,KAAKsgJ,UAKvF,cACI,OAAOtgJ,KAAK20J,OAAO7N,cAAc9mJ,KAAK6iJ,SAAU,CAC5CsQ,WAAYnzJ,KAAK2qI,MACjBvwB,YAAap6G,KAAKo6G,YAClByiC,SAAU78I,KAAK68I,SACfuW,oBAAqB0B,GAAc90J,KAAK60J,UACxCxB,oBAAqBrzJ,KAAKqzJ,oBAC1BC,iBAAkBwB,GAAc90J,KAAKszJ,4BAIjD2B,EAAmB5jG,UAAO,SAAoClyD,GAAK,OAAO,IAAKA,GAAK81J,GAAoB,GAAyB,IAAS,GAAyB,IAAiB,GAAyB,MAC7MA,EAAmBpkG,UAAO,GAAyB,CAAEvtD,KAAM2xJ,EAAoBp+F,UAAW,CAAC,CAAC,IAAK,aAAc,IAAK,CAAC,OAAQ,aAAc,KAAMzB,SAAU,EAAGD,aAAc,SAAyCme,EAAIvnC,GAAgB,EAALunC,GAC5N,GAAkB,SAAA,SAA8D8hF,GAAU,OAAOrpH,EAAIgpH,QAAQK,EAAO17G,OAAQ07G,EAAO9gC,QAAS8gC,EAAO7gC,QAAS6gC,EAAO5gC,aAC5J,EAALlhD,IACF,GAAsB,OAAQvnC,EAAIqsE,KAAM,IACxC,GAAmB,SAAUrsE,EAAIlI,UAChC0xB,OAAQ,CAAEy/F,WAAY,aAAc5B,oBAAqB,sBAAuBvvH,OAAQ,SAAUu2E,YAAa,cAAeyiC,SAAU,WAAYwW,oBAAqB,sBAAuBC,iBAAkB,mBAAoBtC,mBAAoB,qBAAsBE,WAAY,aAAc/yG,MAAO,SAAW4Y,SAAU,CAAC,YA2GhV,SAAS+9F,GAAcpzJ,GACnB,MAAa,KAANA,KAAcA,EAmSzB,MAAM2zJ,GACF,cACIr1J,KAAKw7I,OAAS,KACdx7I,KAAK2qI,MAAQ,KACb3qI,KAAKs6B,SAAW,KAChBt6B,KAAKoxC,SAAW,IAAIkkH,GACpBt1J,KAAK6lJ,UAAY,MAoBzB,MAAMyP,GACF,cAEIt1J,KAAKykJ,SAAW,IAAIpoI,IAQxB,qBAAqBwoI,EAAWrJ,GAE5B,MAAMljI,EAAUtY,KAAKwlJ,mBAAmBX,GACxCvsI,EAAQkjI,OAASA,EACjBx7I,KAAKykJ,SAAS5lJ,IAAIgmJ,EAAWvsI,GASjC,uBAAuBusI,GAEnB,MAAMvsI,EAAUtY,KAAKilJ,WAAWJ,GAC5BvsI,IACAA,EAAQkjI,OAAS,MAQzB,sBAEI,MAAMiJ,EAAWzkJ,KAAKykJ,SAEtB,OADAzkJ,KAAKykJ,SAAW,IAAIpoI,IACbooI,EAMX,mBAAmBA,GAAYzkJ,KAAKykJ,SAAWA,EAK/C,mBAAmBI,GAEf,IAAIvsI,EAAUtY,KAAKilJ,WAAWJ,GAK9B,OAJKvsI,IACDA,EAAU,IAAI+8I,GACdr1J,KAAKykJ,SAAS5lJ,IAAIgmJ,EAAWvsI,IAE1BA,EAMX,WAAWusI,GAAa,OAAO7kJ,KAAKykJ,SAASxjI,IAAI4jI,IAAc,yBAyC7D0Q,EAQF,YAAYrR,EAAgB7iF,EAAU/mC,EAAU7vB,EAAM+qJ,GAClDx1J,KAAKkkJ,eAAiBA,EACtBlkJ,KAAKqhE,SAAWA,EAChBrhE,KAAKs6B,SAAWA,EAChBt6B,KAAKw1J,eAAiBA,EACtBx1J,KAAKugJ,UAAY,KACjBvgJ,KAAKy1J,gBAAkB,KACvBz1J,KAAK01J,eAAiB,IAAI,GAC1B11J,KAAK21J,iBAAmB,IAAI,GAC5B31J,KAAKyK,KAAOA,GA57PG,UA67Pfy5I,EAAe0R,qBAAqB51J,KAAKyK,KAAMzK,MAKnD,cAAgBA,KAAKkkJ,eAAe2R,uBAAuB71J,KAAKyK,MAIhE,WACI,IAAKzK,KAAKugJ,UAAW,CAIjB,MAAMjoI,EAAUtY,KAAKkkJ,eAAee,WAAWjlJ,KAAKyK,MAChD6N,GAAWA,EAAQqyH,QACfryH,EAAQutI,UAER7lJ,KAAK8lJ,OAAOxtI,EAAQutI,UAAWvtI,EAAQqyH,OAIvC3qI,KAAKkmJ,aAAa5tI,EAAQqyH,MAAOryH,EAAQgiB,UAAY,QAQrE,kBAAoB,QAASt6B,KAAKugJ,UAIlC,gBACI,IAAKvgJ,KAAKugJ,UACN,MAAM,IAAI95I,MAAM,2BACpB,OAAOzG,KAAKugJ,UAAUr8E,SAK1B,qBACI,IAAKlkE,KAAKugJ,UACN,MAAM,IAAI95I,MAAM,2BACpB,OAA0BzG,KAAqB,gBAKnD,yBACI,OAAIA,KAAKy1J,gBACEz1J,KAAKy1J,gBAAgB1b,SAAS36H,KAElC,GAMX,SACI,IAAKpf,KAAKugJ,UACN,MAAM,IAAI95I,MAAM,2BACpBzG,KAAKqhE,SAAS2d,SAEd,MAAM82E,EAAM91J,KAAKugJ,UAGjB,OAFAvgJ,KAAKugJ,UAAY,KACjBvgJ,KAAKy1J,gBAAkB,KAChBK,EAQX,OAAOxpB,EAAKypB,GACR/1J,KAAKugJ,UAAYjU,EACjBtsI,KAAKy1J,gBAAkBM,EACvB/1J,KAAKqhE,SAASqf,OAAO4rD,EAAIjyE,UAK7B,aACI,GAAIr6D,KAAKugJ,UAAW,CAEhB,MAAMzhJ,EAAIkB,KAAK05E,UACf15E,KAAKugJ,UAAUpnG,UACfn5C,KAAKugJ,UAAY,KACjBvgJ,KAAKy1J,gBAAkB,KACvBz1J,KAAK21J,iBAAiBp9G,KAAKz5C,IAQnC,aAAai3J,EAAgBz7H,GACzB,GAAIt6B,KAAK0qJ,YACL,MAAM,IAAIjkJ,MAAM,+CAEpBzG,KAAKy1J,gBAAkBM,EAEvB,MAKMrnG,GAFNp0B,EAAWA,GAAYt6B,KAAKs6B,UAEHo7E,wBALRqgD,EAAehV,gBAE6C,YAAY,WAKnFiV,EAAgBh2J,KAAKkkJ,eAAesB,mBAAmBxlJ,KAAKyK,MAAM2mC,SAElE+gB,EAAW,IAAI8jG,GAAeF,EAAgBC,EAAeh2J,KAAKqhE,SAASlP,UACjFnyD,KAAKugJ,UAAYvgJ,KAAKqhE,SAAS60F,gBAAgBxnG,EAAS1uD,KAAKqhE,SAASvgE,OAAQqxD,GAG9EnyD,KAAKw1J,eAAeW,eACpBn2J,KAAK01J,eAAen9G,KAAKv4C,KAAKugJ,UAAUr8E,kBAGhDqxF,EAAalkG,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAKo2J,GAAc,GAAyBD,IAAyB,GAAyB,IAA0B,GAAyB,IAAkC,GAAyB,QAAS,GAAyB,MACjTC,EAAa1kG,UAAO,GAAyB,CAAEvtD,KAAMiyJ,EAAc1+F,UAAW,CAAC,CAAC,kBAAmBrB,QAAS,CAAEkgG,eAAgB,WAAYC,iBAAkB,cAAgBlgG,SAAU,CAAC,kBAmEvL,MAAMwgG,GAMF,YAAYtrB,EAAOqrB,EAAe3vI,GAC9BrmB,KAAK2qI,MAAQA,EACb3qI,KAAKg2J,cAAgBA,EACrBh2J,KAAKqmB,OAASA,EAOlB,IAAI2nC,EAAO4E,GACP,OAAI5E,IAAU,GACHhuD,KAAK2qI,MAEZ38E,IAAUsnG,GACHt1J,KAAKg2J,cAETh2J,KAAKqmB,OAAOpF,IAAI+sC,EAAO4E,IAkCtC,MAAMwjG,IA4CN,MAAM,GAMF,QAAQzrB,EAAOp4G,GAAM,OAAOwjG,GAAG,0BAc7BsgC,EAQF,YAAY1B,EAAQ2B,EAAcxkD,EAAU3/C,EAAUokG,GAClDv2J,KAAK20J,OAASA,EACd30J,KAAKmyD,SAAWA,EAChBnyD,KAAKu2J,mBAAqBA,EAa1Bv2J,KAAKytJ,OAAS,IAAI,GAAmB6I,EAAcxkD,EAPlDvgE,GAAMojH,EAAOrF,aAAa,IAAI1V,GAAqBroG,IAMnDA,GAAMojH,EAAOrF,aAAa,IAAIzV,GAAmBtoG,KAMtD,kBACIvxC,KAAKwmD,aACDxmD,KAAK20J,OAAOjxG,OACPwE,KAAK,GAITz1C,GAAMA,aAAawmI,IAAiBhqG,GAAU,IAGzCjvC,KAAKw2J,YACNluG,UAAU,QAQvB,UAEI,MAAM04B,EAAWhhF,KAAKmyD,SAASlxC,IAAIgyC,IACnC,OAAOjzD,KAAKy2J,cAAcz1E,EAAUhhF,KAAK20J,OAAOh+C,QAQpD,cAAgB32G,KAAKwmD,aAAaR,cAOlC,cAAcg7B,EAAUk6D,GAEpB,MAAMj0I,EAAM,GACZ,IAAK,MAAM0jI,KAASuQ,EAEhB,GAAIvQ,EAAM4Q,eAAiB5Q,EAAMke,SAAWle,EAAMqb,cAAe,CAE7D,MAAMwC,EAAc7d,EAAMqb,cAC1B/+I,EAAI5D,KAAKrD,KAAKy2J,cAAcjO,EAAY9qJ,OAAQ8qJ,EAAYtN,cAGvDvQ,EAAM4Q,eAAiB5Q,EAAMke,QAClC5hJ,EAAI5D,KAAKrD,KAAK02J,cAAc11E,EAAU2pD,IAGjCA,EAAMv5F,UACXnqC,EAAI5D,KAAKrD,KAAKy2J,cAAcz1E,EAAU2pD,EAAMv5F,WAGpD,OAAO,EAAKnqC,GAAKihD,KAAKuD,IAAY,EAIjCrnD,QAQL,cAAc48E,EAAU2pD,GACpB,OAAO3qI,KAAKu2J,mBAAmBC,QAAQ7rB,EAAO,IAK1B3qI,KAAKytJ,OAAOvzF,KAAK8mB,EAAS7uB,SAAUw4E,GACrCziF,KAAK2C,EAInB8rD,IACGg0B,EAAMqb,cAAgBrvC,EACf32G,KAAKy2J,cAAc9/C,EAAOj5G,OAAQi5G,EAAOukC,oBAKhEmb,EAAgBhlG,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAKk3J,GAAiB,GAAgB,IAAS,GAAgB,IAA+B,GAAgB,IAAkB,GAAgB,IAAkB,GAAgBD,MAC3PC,EAAgBhnG,WAAQ,GAA0B,CAAErB,MAAOqoG,EAAiB3nG,QAAS2nG,EAAgBhlG,iCA6C/FslG,EAMF,YAAYhC,EAAQiC,EAAkBl3J,EAAU,IAC5CM,KAAK20J,OAASA,EACd30J,KAAK42J,iBAAmBA,EACxB52J,KAAKN,QAAUA,EACfM,KAAK62J,OAAS,EACd72J,KAAK82J,WAAa,aAClB92J,KAAK+2J,WAAa,EAClB/2J,KAAK26C,MAAQ,GAEbj7C,EAAQs3J,0BAA4Bt3J,EAAQs3J,2BAA6B,WACzEt3J,EAAQu3J,gBAAkBv3J,EAAQu3J,iBAAmB,WAKzD,OAImD,aAA3Cj3J,KAAKN,QAAQs3J,2BACbh3J,KAAK42J,iBAAiBM,4BAA4B,UAEtDl3J,KAAKm3J,yBAA2Bn3J,KAAKo3J,qBACrCp3J,KAAKq3J,yBAA2Br3J,KAAKs3J,sBAMzC,qBACI,OAAOt3J,KAAK20J,OAAOjxG,OAAO4E,UAI1B71C,IACQA,aAAaqmI,IAEb94I,KAAK26C,MAAM36C,KAAK62J,QAAU72J,KAAK42J,iBAAiBW,oBAChDv3J,KAAK82J,WAAarkJ,EAAEsmI,kBACpB/4I,KAAK+2J,WAAatkJ,EAAEumI,cAAgBvmI,EAAEumI,cAAcwV,aAAe,GAE9D/7I,aAAawmI,KAClBj5I,KAAK62J,OAASpkJ,EAAE6b,GAChBtuB,KAAKw3J,oBAAoB/kJ,EAAGzS,KAAK20J,OAAO3B,SAASvgJ,EAAEymI,mBAAmB2D,aAQlF,sBACI,OAAO78I,KAAK20J,OAAOjxG,OAAO4E,UAI1B71C,IACUA,aAAa2nI,KAGf3nI,EAAEqxB,SAC6C,QAA3C9jC,KAAKN,QAAQs3J,0BACbh3J,KAAK42J,iBAAiBa,iBAAiB,CAAC,EAAG,IAEK,YAA3Cz3J,KAAKN,QAAQs3J,2BAClBh3J,KAAK42J,iBAAiBa,iBAAiBhlJ,EAAEqxB,UAKzCrxB,EAAEwoE,QAA2C,YAAjCj7E,KAAKN,QAAQu3J,gBACzBj3J,KAAK42J,iBAAiBc,eAAejlJ,EAAEwoE,QAES,aAA3Cj7E,KAAKN,QAAQs3J,2BAClBh3J,KAAK42J,iBAAiBa,iBAAiB,CAAC,EAAG,OAW3D,oBAAoBpd,EAAap/D,GAC7Bj7E,KAAK20J,OAAOrF,aAAa,IAAIlV,GAAOC,EAAiC,aAApBr6I,KAAK82J,WAA4B92J,KAAK26C,MAAM36C,KAAK+2J,YAAc,KAAM97E,IAK1H,cACQj7E,KAAKm3J,0BACLn3J,KAAKm3J,yBAAyBnxG,cAE9BhmD,KAAKq3J,0BACLr3J,KAAKq3J,yBAAyBrxG,sBAI1C2wG,EAAetlG,UAAO,SAAgClyD,GAAK,MAC3Dw3J,EAAe9lG,UAAO,GAAyB,CAAEvtD,KAAMqzJ,UA2DvD,MAOMgB,GAAuB,IAAInmG,GAAe,wBAK1ComG,GAAuB,IAAIpmG,GAAe,wBAG1CqmG,GAAmB,CACrB,GACA,CAAE/lG,QAAS4rF,GAAen4D,SAAUo4D,IACpC,CACI7rF,QAAS,GACTqzB,WAwZR,SAAqBuhE,EAAejC,EAAUpjF,EAAUlP,EAAUs7F,EAAQ37C,EAAU6E,EAAQ7qE,EAAO,GAAIijH,EAAqBjL,GAExH,MAAM6Q,EAAS,IAAI,GAAO,KAAMjO,EAAejC,EAAUpjF,EAAUlP,EAAUs7F,EAAQ37C,EAAU,GAAQ6E,IAavG,GAZIo4C,IACA4F,EAAO5F,oBAAsBA,GAE7BjL,IACA6Q,EAAO7Q,mBAAqBA,GAE5Bh4G,EAAKguC,eACL66E,EAAO76E,aAAehuC,EAAKguC,cAE3BhuC,EAAK4iH,2BACLiG,EAAOjG,yBAA2B5iH,EAAK4iH,0BAEvC5iH,EAAKgsH,cAAe,CAEpB,MAAM/nC,EAAM,KACZ4kC,EAAOjxG,OAAO4E,UAIb71C,IACGs9G,EAAIgoC,SAAS,iBAAqCtlJ,EAAe,YAAEhI,MACnEslH,EAAIjhF,IAAIr8B,EAAEsG,YACVg3G,EAAIjhF,IAAIr8B,GACRs9G,EAAIioC,gBAeZ,OAZIlsH,EAAKkjH,sBACL2F,EAAO3F,oBAAsBljH,EAAKkjH,qBAElCljH,EAAKq1G,4BACLwT,EAAOxT,0BAA4Br1G,EAAKq1G,2BAExCr1G,EAAKmjH,oBACL0F,EAAO1F,kBAAoBnjH,EAAKmjH,mBAEhCnjH,EAAK8/G,yBACL+I,EAAO/I,uBAAyB9/G,EAAK8/G,wBAElC+I,GAhcHvvE,KAAM,CACFs4D,GAAe4X,GAAwB,GAAU3vE,GAAUywB,GAAuBrK,GAClFyhD,GAAQmK,GAAsB,CAt6F1C,QAs6FgE,IAAI1pG,IACxD,CA1mGZ,QA0mGiC,IAAIA,MAGjCqnG,GACA,CAAExjG,QAAS,GAAgBqzB,WA+b/B,SAAmBwvE,GACf,OAAOA,EAAOpF,YAAYxlJ,MAhcwBq7E,KAAM,CAAC,KACzD,CAAEtzB,QAASskD,GAAuB7wB,SAAUkxB,IAC5C,GACA,GAhZJ,MAMI,QAAQk0B,EAAOp4G,GACX,OAAOA,IAAK21B,KAAKwvF,GAAW,IAGtB3hB,GAAG,UAwYb,CAAEjkE,QAAS6lG,GAAsB5lG,SApB1B,CAAE+lG,eAAe,KAyB5B,SAASG,KACL,OAAO,IAAIllD,GAAa,SAAU,uBAqDhCmlD,EAMF,YAAYloI,EAAO2kI,IAUnB,eAAezZ,EAAQvkC,GACnB,MAAO,CACH31B,SAAUk3E,EACVrpG,UAAW,CACPgpG,GACAM,GAAcjd,GACd,CACIppF,QAAS8lG,GACTzyE,WAAYizE,GACZhzE,KAAM,CAAC,CAAC,GAAQ,IAAIn3B,GAAY,IAAIE,MAExC,CAAE2D,QAAS6lG,GAAsB5lG,SAAU4kD,GAAkB,IAC7D,CACI7kD,QAAS,GACTqzB,WAAY,GACZC,KAAM,CACF,GAAkB,CAAC,IAAIr3B,GAAO4rD,IAAgB,IAAI1rD,IAAa0pG,KAGvE,CACI7lG,QAAS,GACTqzB,WAAYkzE,GACZjzE,KAAM,CAAC,GAAQ,GAAkBuyE,KAErC,CACI7lG,QAASskG,GACT/wE,YAAasxB,GAAUA,EAAO4/C,mBAAqB5/C,EAAO4/C,mBACtD,IAER,CAAEzkG,QAASihD,GAAcluB,OAAO,EAAMM,WAAY8yE,IAkgBvD,CACH,GACA,CACInmG,QAASq4C,GACTtlB,OAAO,EACPM,WAAYmzE,GACZlzE,KAAM,CAAC,KAEX,CAAEtzB,QAASymG,GAAoBpzE,WAAYqzE,GAAsBpzE,KAAM,CAAC,KACxE,CAAEtzB,QAASm5C,GAAwBpmB,OAAO,EAAMQ,YAAakzE,OAjgBjE,gBAAgBrd,GACZ,MAAO,CAAEl6D,SAAUk3E,EAAcrpG,UAAW,CAACspG,GAAcjd,aAGnEgd,EAAajnG,UAAO,GAAwB,CAAE3tD,KAAM40J,IACpDA,EAAa5oG,UAAO,GAAwB,CAAEZ,QAAS,SAA8BvvD,GAAK,OAAO,IAAKA,GAAK+4J,GAAc,GAAgBN,GAAsB,GAAI,GAAgB,GAAQ,aAoC3L,SAASS,GAAqB1D,EAAQiC,EAAkBjgD,GAIpD,OAHIA,EAAO8hD,cACP7B,EAAiB8B,UAAU/hD,EAAO8hD,cAE/B,IAAI,GAAe9D,EAAQiC,EAAkBjgD,GAQxD,SAAS,GAAwBgiD,EAA0B39C,EAAUt7G,EAAU,IAC3E,OAAOA,EAAQk5J,QAAU,IAAI,GAAqBD,EAA0B39C,GACxE,IAAI,GAAqB29C,EAA0B39C,GAM3D,SAASo9C,GAAoBzD,GACzB,GAAIA,EACA,MAAM,IAAIluJ,MAAM,wGAEpB,MAAO,UAmBX,SAAS0xJ,GAAcjd,GACnB,MAAO,CACH,CAAEppF,QAAS+zB,GAA8BhB,OAAO,EAAM9yB,SAAUmpF,GAChE,CAAEppF,QAAS07F,GAAQ3oE,OAAO,EAAM9yB,SAAUmpF,uBA+P5C2d,EAIF,YAAY1mG,GACRnyD,KAAKmyD,SAAWA,EAChBnyD,KAAK84J,gBAAiB,EACtB94J,KAAK+4J,0BAA4B,IAAI,EAKzC,iBAGI,OADU/4J,KAAKmyD,SAASlxC,IAAI02F,GAAsBr7F,QAAQpU,QAAQ,OACzD8hD,KAAK,KAKV,IAAI9hD,EAAU,KAEd,MAAMjB,EAAM,IAAIqV,QAIhBi1B,GAAKrpC,EAAUqpC,GAETojH,EAAS30J,KAAKmyD,SAASlxC,IAAI,IAE3B6qB,EAAO9rC,KAAKmyD,SAASlxC,IAAI02I,IAC/B,GAAI33J,KAAKg5J,iBAAiBltH,IAAS9rC,KAAKi5J,gBAAgBntH,GACpD5jC,GAAQ,QAEP,GAA+B,aAA3B4jC,EAAKotH,kBACVvE,EAAO9B,8BACP3qJ,GAAQ,OAEP,CAAA,GAA+B,YAA3B4jC,EAAKotH,kBAmBV,MAAM,IAAIzyJ,MAAM,uCAAuCqlC,EAAKotH,sBAlB5DvE,EAAOn2F,MAAMswF,mBAAqB,IAKzB9uJ,KAAK84J,eAOoB/iC,GAAG,OAN7B/1H,KAAK84J,gBAAiB,EACtB5wJ,GAAQ,GACDlI,KAAK+4J,2BAOpBpE,EAAOuE,oBAKX,OAAOjyJ,IAOf,kBAAkBkyJ,GAEd,MAAMrtH,EAAO9rC,KAAKmyD,SAASlxC,IAAI02I,IAEzByB,EAAYp5J,KAAKmyD,SAASlxC,IAAI,IAE9Bo4I,EAAiBr5J,KAAKmyD,SAASlxC,IAAI,IAEnC0zI,EAAS30J,KAAKmyD,SAASlxC,IAAI,IAE3BqrH,EAAMtsI,KAAKmyD,SAASlxC,IAAI,IAC1Bk4I,IAA6B7sB,EAAIp6D,WAAW,KAG5ClyE,KAAKi5J,gBAAgBntH,GACrB6oH,EAAOuE,oBAEFl5J,KAAKg5J,iBAAiBltH,IAC3B6oH,EAAO9B,8BAEXuG,EAAUE,kBACVD,EAAe1jH,OACfg/G,EAAO4E,uBAAuBjtB,EAAIn3B,eAAe,IACjDn1G,KAAK+4J,0BAA0Bz9H,KAAK,MACpCt7B,KAAK+4J,0BAA0B/xG,YAOnC,gBAAgBlb,GACZ,MAAkC,mBAA3BA,EAAKotH,oBAAqE,IAA3BptH,EAAKotH,wBAC5BhjJ,IAA3B41B,EAAKotH,kBAOb,iBAAiBptH,GACb,MAAkC,oBAA3BA,EAAKotH,oBAAsE,IAA3BptH,EAAKotH,0BAGpEL,EAAkBxnG,UAAO,SAAmClyD,GAAK,OAAO,IAAKA,GAAK05J,GAAmB,GAAgB,MACrHA,EAAkBxpG,WAAQ,GAA0B,CAAErB,MAAO6qG,EAAmBnqG,QAASmqG,EAAkBxnG,kBA6B3G,SAASinG,GAAkB/mH,GACvB,OAAOA,EAAEioH,eAAe5gI,KAAK2Y,GAMjC,SAASinH,GAAqBjnH,GAC1B,OAAOA,EAAEkoH,kBAAkB7gI,KAAK2Y,GASpC,MAAMgnH,GAAqB,IAAI/mG,GAAe,sBGp3TvC,IAAA,GAAA,YAAMkoG,EA4CX,YACU/uB,GAAA,KAAAA,MAAAA,EA5CV,KAAAgvB,aAAe,IAAI,IAAkB,GAErC,KAAAC,YAAc,CACZC,IAAK,YACLx4F,SAAU,MACVy4F,WAAY,MACZC,qBAAsB,GACtBC,IAAK,GACLv2J,GAAI,CAAC,OACLw2J,oBAAqB,GACrB5xB,mBAAoB,EACpB6xB,GAAI,CAAC,UACLC,eAAgB,uBAChBC,QAAS,MACTC,oBAAqB,wBACrBC,oBAAqB,GACrBtxB,iBAAkB,GAClBC,mBAAoB,GACpBC,eAAgB,GAChBC,qBAAsB,GACtBoxB,+BAAgC,EAChCC,2BAA4B,EAC5BC,cAAe,KACflxB,eAAgB,KAChBmxB,cAAe,KACfC,cAAe,GACfC,eAAgB,KAChBC,eAAgB,KAChBC,2BAA4B,EAC5BC,wBAAyB,EACzBC,aAAc,KACdC,0BAA2B,KAC3BC,4BAA6B,KAC7BC,wBAAyB,KACzBC,eAAgB,QAChBC,aAAc,KACdC,uBAAwB,MAG1B,KAAAC,SAAU,EAEV,KAAAC,KAAO,GAKLx7J,KAAK2qI,MAAMvwB,YAAY9xD,UAAUixD,IAC3BA,EAAOvgG,eAAe,aACA,MAApBugG,EAAOkiD,WACTz7J,KAAKu7J,SAAU,KAMvB,IAAI9lJ,EAAKpK,GACPrL,KAAK45J,YAAYnkJ,GAAOpK,EACxB,MAAMqwJ,EAAexwH,KAAKC,UAAUnrC,KAAKihB,IAAI,SAG7C,OAFAjhB,KAAKw7J,KAAO7nB,GAAI+nB,GAChB17J,KAAK25J,aAAaphH,KAAK9iC,GAChBzV,KAGT,UACE,OAAOA,KAAKw7J,KAGd,IAAIG,GACF,MAAuB,SAAnBA,EACK37J,KAAK45J,YAES,YAAnB+B,EACK37J,KAAKu7J,QAEPv7J,KAAK45J,YAAY+B,GAG1B,0BACE,OAAO37J,KAAK25J,aAGd,aACE,OAAO35J,KAAK45J,YAGd,MAAMgC,GACJ57J,KAAK45J,YAAcgC,EACnB,IAAK,MAAMnmJ,KAAOzV,KAAK45J,YAEjB55J,KAAK45J,YAAY5gJ,eAAevD,IAClCzV,KAAK25J,aAAaphH,KAAK9iC,iDA3FlBikJ,GAAe,GAAA,6BAAfA,EAAe,QAAfA,EAAe,UAAA,WAFd,YAEP,GCQA,GAAA,YAAMmC,EACX,YACU9tB,EACA+tB,EACArpB,EACAC,EACA1E,EACA+tB,EACAC,GANA,KAAAjuB,KAAAA,EACA,KAAA+tB,cAAAA,EACA,KAAArpB,eAAAA,EACA,KAAAC,2BAAAA,EACA,KAAA1E,cAAAA,EACA,KAAA+tB,WAAAA,EACA,KAAAC,gBAAAA,EAGV,aAAarxB,EAAOzpI,GAAQ,GACpBypI,KAASpL,IACbj+H,QAAQC,MAAM,8BAAgCopI,EAAQ,8BAExD,MAAMsxB,EAAkB18B,GAAWoL,GAAOnL,kBAC1C,IAAK,MAAM08B,KAAYD,EAAiB,CACjCl7B,GAAam7B,IAGV,cAAen7B,GAAam7B,IAChC56J,QAAQC,MAAMopI,EAAQ,oDAAsDuxB,EAAW,wCAEnF,iBAAkBn7B,GAAam7B,IACnC56J,QAAQC,MAAMopI,EAAQ,oDAAsDuxB,EAAW,4CANzF56J,QAAQC,MAAMopI,EAAQ,4BAA8BuxB,GAStD,MAAMP,EAAiB56B,GAAam7B,GAAUh7B,UAC9C,GAAIH,GAAam7B,GAAUtuJ,SAAWkzH,GAAY8B,gBAC5C5iI,KAAK87J,cAAcK,YAAYR,GAInC,OAHIz6J,GACFI,QAAQoxC,KAAKi4F,EAAQ,6BAA+BgxB,EAAiB,MAEhE,EAET,GAAI56B,GAAam7B,GAAUtuJ,SAAWkzH,GAAYkF,gBAC5ChmI,KAAKguI,cAAcmuB,YAAYR,GAInC,OAHIz6J,GACFI,QAAQoxC,KAAKi4F,EAAQ,oCAAsCgxB,EAAiB,MAEvE,EAET,GAAI56B,GAAam7B,GAAUtuJ,SAAWkzH,GAAYqB,aAC5CniI,KAAK+7J,WAAWK,aAAaT,GAIjC,OAHIz6J,GACFI,QAAQoxC,KAAKi4F,EAAQ,wCAA0CgxB,EAAiB,MAE3E,EAET,MAAMxvB,EAAqBnsI,KAAK+tI,KAAK2B,cACrC,KAAI3O,GAAam7B,GAAUtuJ,SAAWkzH,GAAYQ,cAC3C6K,GAAcwvB,KAAkBxvB,GAIrC,OAHIjrI,GACFI,QAAQoxC,KAAKi4F,EAAQ,iDAAmDgxB,EAAiB,oCAEpF,EAET,GAAI56B,GAAam7B,GAAUtuJ,SAAWkzH,GAAY4D,cAC5C1kI,KAAK0yI,2BAA2B2pB,qBAAqBV,GAIzD,OAHIz6J,GACFI,QAAQoxC,KAAKi4F,EAAQ,qDAAuDgxB,EAAiB,kCAExF,EAGX,OAAO,EAET,aAAaW,EAAW3xB,GACtB,MAAMwB,EAAqBnsI,KAAK+tI,KAAK2B,cAChC3O,GAAau7B,IAChBh7J,QAAQC,MAAM,0BAA4B+6J,GAE5C,MAAMX,EAAiB56B,GAAau7B,GAAWp7B,UAC/C,OAAQH,GAAau7B,GAAW1uJ,QAC9B,KAAKkzH,GAAYQ,aACf,GAAI6K,EACF,OAAOA,EAASwvB,GAElB,MACF,KAAK76B,GAAY8B,cACf,OAAO5iI,KAAK87J,cAAc9oB,UAAU2oB,GAEtC,KAAK76B,GAAYkF,cACf,OAAOhmI,KAAKguI,cAAcgF,UAAU2oB,GAEtC,KAAK76B,GAAYqB,WACf,OAAOniI,KAAK+7J,WAAW96I,IAAI06I,GAE7B,KAAK76B,GAAYvB,WACf,OAAOA,GAAWoL,GAAOgxB,GAE3B,KAAK76B,GAAYG,cACf,OAAOA,GAAc06B,GAEvB,KAAK76B,GAAYe,QAEf,OAAO7hI,KAAKyyI,eAAeY,iBAAiBsoB,GAE9C,KAAK76B,GAAY4D,YACf,OAAO1kI,KAAK0yI,2BAA2Be,cAAckoB,GAEvD,KAAK76B,GAAYwH,SACf,OAAOtoI,KAAKg8J,gBAAgB/6I,IAAI06I,IAItC,sBAAsBhxB,EAAO/8E,GAC3B,MAAM2uG,EAAc,GAEdN,GADqBj8J,KAAK+tI,KAAK2B,cACbnQ,GAAWoL,GAAOnL,mBAC1C,IAAK,MAAM08B,KAAYD,EAAiB,CACjCl7B,GAAam7B,IAChB56J,QAAQC,MAAM,0BAA4B26J,GAE5C,MAAMtuJ,EAASmzH,GAAam7B,GAAUtuJ,OACtC,GAAI,iBAAkBmzH,GAAam7B,GAAW,CAC5C,MAAM/6B,EAAeJ,GAAam7B,GAAU/6B,aAC5C,GAAIvzH,IAAWkzH,GAAYyC,gBAEzBg5B,EAAYp7B,GAAgBvzE,EADLmzE,GAAam7B,GAAUh7B,eAEzC,CACL,MAAMs7B,EAAax8J,KAAKy8J,aAAaP,EAAUvxB,IAC9B,gBAAbuxB,GAA4C,gBAAbA,IAA6C,IAAfM,KAC/DD,EAAYp7B,GAAgBq7B,GAGE,OAA9BD,EAAYp7B,IAA0BJ,GAAam7B,GAAUljJ,eAAe,aAC9EujJ,EAAYp7B,GAAgBJ,GAAam7B,GAAUh5B,UAMzD,OAAOq5B,gDArIEV,GAAwB,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,6BAAxBA,EAAwB,QAAxBA,EAAwB,UAAA,WAFvB,YAEP,GCfA,SAAS,GAAWt6J,EAAO+oD,GAC9B,OAIW,IAAI,EAJVA,EAIqB/C,GAAc+C,EAAUb,SAASizG,GAAU,EAAG,CAAEn7J,MAAAA,EAAOgmD,WAAAA,IAHvDA,GAAcA,EAAWhmD,MAAMA,IAM7D,SAASm7J,IAAS,MAAEn7J,EAAK,WAAEgmD,IACvBA,EAAWhmD,MAAMA,GCLd,IAAA,GAAA,YAAMo7J,EAIX,cAHU,KAAA7lJ,MAAQ,GACR,KAAA8lJ,cAAgB,GAI1B,cAAcnnJ,EAAKuzD,GACjBhpE,KAAK8W,MAAMrB,GAAOuzD,EAGpB,SAASvzD,GACP,OAAQA,KAAOzV,KAAK8W,MAGtB,YAAYrB,GACV,OAAOzV,KAAK8W,MAAMrB,GAGpB,mBAAmBA,EAAK+wC,GACtBxmD,KAAK48J,cAAcnnJ,GAAO+wC,EAG5B,mBAAmB/wC,UACVzV,KAAK48J,cAAcnnJ,GAG5B,gBAAgBA,GACd,OAAQA,KAAOzV,KAAK48J,cAGtB,iBAAiBnnJ,GACf,OAAOzV,KAAK48J,cAAcnnJ,GAG5B,sBACE,OAAOzV,KAAK48J,cASd,UAAUnnJ,GACR,OAAOy1B,KAAKC,UAAU11B,iDA7CbknJ,2BAAAA,EAAyB,QAAzBA,EAAyB,UAAA,WAFxB,YAEP,GCAA,GAAA,YAAME,EAGX,cAFA,KAAAC,OAAS,GAIT,YAAYvjD,EAAQwjD,GAClB,MAAMC,EAAa59J,OAAOu8B,OAAO,GAAI49E,GACrC,IAAK,MAAM0jD,KAAeF,SACjBC,EAAWC,GAEpB,OAAO/xH,KAAKC,UAAU6xH,GAGxB,uBAAuBzjD,EAAQwjD,GAC7B,MAAMG,EAAW,GACjB,IAAK,MAAMj9G,KAAQ88G,EACb98G,KAAQs5D,IACV2jD,EAASj9G,GAAQs5D,EAAOt5D,IAG5B,OAAOi9G,EAGT,WAAWC,EAAQC,EAAsBC,GACjCA,KAAYr9J,KAAK88J,SACrB98J,KAAK88J,OAAOO,GAAY,IAE1Br9J,KAAK88J,OAAOO,GAAUh6J,KAAK,CACzBsnI,MAAOwyB,EACPJ,oBAAqBK,IAIzB,SAASC,GACP,OAAOr9J,KAAK88J,OAAOO,iDAlCVR,2BAAAA,EAAmB,QAAnBA,EAAmB,UAAA,WAFlB,YAEP,GCQP,IAAYS,GAAZ,SAAYA,UACV,EAAA,EAAA,SAAA,GAAA,WACA,EAAA,EAAA,QAAA,GAAA,UACA,EAAA,EAAA,YAAA,GAAA,cACA,EAAA,EAAA,QAAA,GAAA,UACA,EAAA,EAAA,SAAA,GAAA,WACA,EAAA,EAAA,MAAA,GAAA,QANUA,EAAZ,CAOC,IAKM,MAAM,GA4BX,YACEnrG,EACAm6E,GA7BF,KAAAixB,OAASjmD,GAA6B,cAQ9B,KAAAkmD,UAAW,EAIX,KAAAr/G,MAAsBm/G,GAAaG,SACnC,KAAAC,qBAA8B,GAK9B,KAAAC,0BAA4B,EAE5B,KAAAC,SAAW,KAWjB59J,KAAKorI,KAAOj5E,EAASlxC,IAAI,IACzBjhB,KAAK+tI,KAAO57E,EAASlxC,IAAI,IACzBjhB,KAAKsG,GAAK6rD,EAASlxC,IAAI,IACvBjhB,KAAK8W,MAAQq7C,EAASlxC,IAAI,IAC1BjhB,KAAK69J,aAAe1rG,EAASlxC,IAAI,IACjCjhB,KAAKssI,IAAMA,EAGN,qBACDtsI,KAAKwmD,cAAsC,OAAtBxmD,KAAKwmD,eAC5BxmD,KAAK29J,4BACL39J,KAAKwmD,aAAaR,cAClBhmD,KAAKwmD,aAAe,KAChBxmD,KAAK49J,WACP59J,KAAK8W,MAAMgnJ,mBAAmB99J,KAAK49J,UACnC59J,KAAK49J,SAAW,OAKf,+BACL,OAAO59J,KAAK29J,0BAGP,SACL,OAAO39J,KAAKssI,IAGN,yBAAyBpL,GAC/B,IAAK,MAAMg7B,KAAYn7B,GACrB,GAAIm7B,KAAYn7B,IAEVG,IADUH,GAAam7B,GACHh7B,UACtB,OAAOg7B,EAIb,OAAO,KAGD,wBAAwBA,GAC9B,OAAOn7B,GAAam7B,GAAUh7B,UAQzB,kBAAkByJ,GACvB,GAAI,sBAAuBpL,GAAWoL,GAAQ,CAC5C,MAAMozB,EAAqB,GAC3B,IAAK,MAAMC,KAAuBz+B,GAAWoL,GAAOnL,kBAC9Cw+B,KAAuBz+B,GAAWoL,GAAOnL,mBAE3Cu+B,EAAmB16J,KAAKrD,KAAKi+J,wBADN1+B,GAAWoL,GAAOnL,kBAAkBw+B,KAK/D,OAAOD,EAET,MAAO,GAIF,YAAYpzB,EAAO/8E,EAAa1sD,GAAQ,GAO7C,OAAOlB,KAAKk+J,QAAQvzB,EAAO/8E,EAAY1sD,GAK/B,QAAQypI,EAAO/8E,EAAa1sD,GAAQ,GAE5C,IAAKlB,KAAKsG,GAAG63J,aAAaxzB,EAAOzpI,GAC/B,OAAO,EAET,MAAMq4G,EAASv5G,KAAKsG,GAAG83J,sBAAsBzzB,EAAO/8E,GAGpD,IAAIywG,EAEFA,OADoCnoJ,IAAlCqpH,GAAWoL,GAAOlL,YACPF,GAAWoL,GAAOlL,YAElBkL,EAEf,MAAMizB,EAAW59J,KAAK8W,MAAMwnJ,UAAU,CAAC/sH,EAAGo5F,EAAOnrI,EAAG+5G,IAIpD,GAHIr4G,GACFI,QAAQwtC,IAAI,WAAY8uH,GAEtB59J,KAAK8W,MAAMynJ,SAASX,GAAW,CACjC,MAAMY,EAAex+J,KAAK8W,MAAM2nJ,YAAYb,GAE5C59J,KAAKwmD,aAAe,IAAI,EAAWe,OAChCe,UAAWo2G,IACRA,aAAmB/kC,IACrB35H,KAAKuB,MAAQm9J,EACb1+J,KAAK2+J,YAAYrB,GAAa72J,QACrBi4J,aAAmBhlC,KAC5B15H,KAAKgpE,SAAW01F,EAChB1+J,KAAK2+J,YAAYrB,GAAasB,aAIlC5+J,KAAKwmD,aAAalrB,KAAKkjI,OAClB,CAAA,GAAIx+J,KAAK8W,MAAM+nJ,gBAAgBjB,GACpC,OAAO59J,KAAK8W,MAAMgoJ,iBAAiBlB,GAC9B,CACL,IAAImB,EAAY,GAMdA,EALEV,EAAWj7I,SAAS,kBACtBi7I,EAAWj7I,SAAS,sBACpBi7I,EAAWj7I,SAAS,6BACpBi7I,EAAWj7I,SAAS,yBAERi7I,E1D7KA,S0D+K+BA,EAE7Cr+J,KAAKg/J,qBAILlkJ,WAAW,KAGT,MAAMgxH,EAAW,IAAI9U,GAAW,CAC9BK,WAAY,CACVsT,MAAOo0B,EACPpvH,KAAMzE,KAAKC,UAAUouE,MAInBg4B,GAAAA,IAAkBpb,IACrBt3H,IAAI,eAAgB,qCACvBmB,KAAKwmD,aAAexmD,KAAKorI,KAAKz7F,KAAK3vC,KAAKu9J,OAAS,UAAYc,EAAYvyB,EACvE,CACE1V,QAASmb,EACTzoE,aAAc,OACdyvD,iBAAiB,EACjBsB,QAAS,aAEV3xE,KACCwvF,GAAYn2I,IACVvB,KAAKuB,MAAQA,EACbvB,KAAK2+J,YAAYrB,GAAa72J,OACvB,GAAW,8BAAgC43J,EAAa,QAGlE/1G,UAAWo2G,IACNA,aAAmB/kC,IACrB35H,KAAKuB,MAAQm9J,EACb1+J,KAAK2+J,YAAYrB,GAAa72J,OAC9BzG,KAAK8W,MAAMgnJ,mBAAmBF,IACrBc,aAAmBhlC,KAC5B15H,KAAKgpE,SAAW01F,EACV,UAAWn/B,GAAWoL,KAAuC,IAA5BpL,GAAWoL,GAAO7zH,OACvD9W,KAAK8W,MAAMmoJ,cAAcrB,EAAUc,GAErC1+J,KAAK2+J,YAAYrB,GAAasB,cAGnC,KACH5+J,KAAK2+J,YAAYrB,GAAa4B,SAC9Bl/J,KAAK8W,MAAMqoJ,mBAAmBvB,EAAU59J,KAAKwmD,cAC7CxmD,KAAK49J,SAAWA,GAGlB,OAAO59J,KAAKwmD,aAGP,cACL,OAAOxmD,KAAKgpE,SAEP,WACL,OAAOhpE,KAAKuB,MAGP,cAAcgvB,GAInB,OAHAvwB,KAAK09J,qBAAqBr6J,KAAKktB,GAE/BA,EAASvwB,KAAKm+C,OACPn+C,KAGF,oBAAoBuwB,GACzB,IAAK,IAAI7vB,EAAI,EAAGA,EAAIV,KAAK09J,qBAAqB58J,OAAQJ,IACpD,GAAI6vB,IAAavwB,KAAK09J,qBAAqBh9J,GAAI,CAC7CV,KAAK09J,qBAAqB1jJ,OAAOtZ,EAAG,GACpC,MAGJ,OAAOV,KAGC,YAAYm+C,GAIpBn+C,KAAKm+C,MAAQA,EACb,IAAK,MAAM5tB,KAAYvwB,KAAK09J,qBAC1BntI,EAASvwB,KAAKm+C,OAEhB,OAAOn+C,KAGF,mBAGL,OAFAA,KAAKg/J,qBACLh/J,KAAK2+J,YAAYrB,GAAa8B,aACvBp/J,KAGF,eAGL,OAFAA,KAAKg/J,qBACLh/J,KAAK2+J,YAAYrB,GAAa+B,SACvBr/J,KAGF,gBAGL,OAFAA,KAAKg/J,qBACLh/J,KAAK2+J,YAAYrB,GAAa+B,SACvBr/J,MChRJ,IAAA,GAAA,YAAMs/J,EAGX,YACUntG,GAAA,KAAAA,SAAAA,EAHV,KAAAotG,gBAAkB,GAgBlB,IAAIjzB,GAOF,OANKtsI,KAAKu/J,gBAAgBvmJ,eAAeszH,KACvCtsI,KAAKu/J,gBAAgBjzB,GAAO,IAAI,GAC9BtsI,KAAKmyD,SACLm6E,IAGGtsI,KAAKu/J,gBAAgBjzB,iDAxBnBgzB,GAAU,GAAA,6BAAVA,EAAU,QAAVA,EAAU,UAAA,WAFT,YAEP,GCEA,GAAA,YAAME,EAKX,YACUC,EACAp0B,EACAqH,EACAgtB,EACAt0B,GAJA,KAAAq0B,WAAAA,EACA,KAAAp0B,sBAAAA,EACA,KAAAqH,2BAAAA,EACA,KAAAgtB,yBAAAA,EACA,KAAAt0B,KAAAA,EARV,KAAAu0B,cAAe,EACf,KAAAn0B,UAAY,GAUZ,SAASj7G,GACPvwB,KAAKwrI,UAAUnoI,KAAKktB,GAChBvwB,KAAK2/J,cACPpvI,IAIJ,iBACE,IAAK,MAAMA,KAAYvwB,KAAKwrI,UAC1Bj7G,IAEF,OAAOvwB,KAGT,qBACE,OAAOA,KAAK0yI,2BAA2Be,cAAc,iBAGvD,kBACEzzI,KAAK4/J,eAAiB5/J,KAAKy/J,WAAWx+I,IAAI,eAC1CjhB,KAAK4/J,eAAeC,YAAY,eAChC7/J,KAAK4/J,eAAeE,cAAe3hH,IACjC,GAAIA,IAAUm/G,GAAasB,SAAU,CACnC,MAAM51F,EAAWhpE,KAAK4/J,eAAenB,cAC/BhtB,EAAcvmG,KAAKtpC,MAAMonE,EAASz5B,MAEnCvvC,KAAK0yI,2BAA2BhB,uBAGnC1xI,KAAK0yI,2BAA2BqtB,eAAe//J,KAAK0yI,2BAA2BstB,kBAF/EhgK,KAAK0yI,2BAA2BqtB,eAAetuB,GAKjDzxI,KAAKqrI,sBAAsBP,iBAAiB,CAAC,cAAe,gBAAiB,eAAgB,UAAW,YAAa,aACrH9qI,KAAKigK,iBACLjgK,KAAK2/J,cAAe,KAGxB3/J,KAAKqrI,sBAAsB60B,eACxBlsJ,IACChU,KAAK4/J,eAAeC,YAAY,gBAElC7/J,KAAK4/J,eAAeO,kBAAkB,gBAG1C,gBAAgB1uB,GACdzxI,KAAK0yI,2BAA2BqtB,eAAetuB,GAE/CzxI,KAAKigK,iBACL,MAAMn0B,EAAW,CACflK,SAAU5hI,KAAK0/J,yBAAyBjD,aAAa,iBACrDz7B,MAAO,MACPI,WAAY,QACZg/B,cAAe3uB,EAAY2uB,cAC3BC,WAAY5uB,EAAY4uB,WACxBC,QAAS7uB,EAAY6uB,QACrB77B,QAASgN,EAAYhN,QACrBzsE,UAAWy5E,EAAYz5E,UACvB2sE,SAAU8M,EAAY9M,SACtB47B,aAAc,GACdC,gBAAiB,IAEnB,IAAK,MAAMn1J,KAASomI,EAAY8uB,aAC9Bz0B,EAASy0B,aAAal9J,KAAKgI,GAE7B,IAAK,MAAMA,KAASomI,EAAY+uB,gBAC9B10B,EAAS00B,gBAAgBn9J,KAAKgI,GAmBhC,MAAMo1J,EAAY,IAAIzpC,GAAW,CAC/BK,WAAY,CACVsT,MAAOrzB,yBACP3nE,KAAMzE,KAAKC,UAAU2gG,MAInByF,EAAc,IAAIpb,GAEHn2H,KAAKorI,KAAKz7F,KADnB2nE,GAA6B,cACAmpD,EAAW,CAClDrqC,QAASmb,EACTzoE,aAAc,OACdyvD,iBAAiB,EACjBsB,QAAS,aAEEvxE,UACX0gB,IACE1nE,QAAQwtC,IAAI,sBAEZ9uC,KAAKqrI,sBAAsBP,iBAAiB,CAAC,UAAW,YAAa,cAEvEvpI,IACED,QAAQwtC,IAAI,4EAvHP0wH,GAA6B,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,6BAA7BA,EAA6B,QAA7BA,EAA6B,UAAA,WAF5B,YAEP,GCPA,GAAA,YAAMkB,EAGX,eAEA,gBAAgBr1J,GAEd,OADArL,KAAK2gK,aAAet1J,EACbrL,KAGT,kBACE,OAAOA,KAAK2gK,2DAXHD,2BAAAA,EAAc,QAAdA,EAAc,UAAA,WAFb,YAEP,GCAA,GAAA,YAAME,EAIX,cAHA,KAAAC,cAAgB,IAAI,GACpB,KAAA1iH,MAAQ,EAIR,kBACE,OAAOn+C,KAAK6gK,cAGd,kBAAkBC,GAChB9gK,KAAKm+C,MAAQ2iH,EACb9gK,KAAK6gK,cAActoH,KAAKv4C,KAAKm+C,qDAZpByiH,2BAAAA,EAAgC,QAAhCA,EAAgC,UAAA,WAF/B,YAEP,GCIA,GAAA,YAAMG,EAQX,YACU/E,EACAyD,EACEp0B,GAFF,KAAA2wB,gBAAAA,EACA,KAAAyD,WAAAA,EACE,KAAAp0B,sBAAAA,EAVZ,KAAAiyB,aAAeA,GAGL,KAAA0D,sBAAwB,uDAE3B,KAAA7iH,MAAQm/G,GAAaG,SAQ5B,sBACEz9J,KAAKihK,gBAAkBjhK,KAAKkhK,cAAclhK,KAAKghK,sBAAuB,GACtEhhK,KAAKihK,gBAAgBnB,cAAe3hH,IAClC,GAAIA,IAAUm/G,GAAasB,SAAU,CACnC,MAAM51F,EAAWhpE,KAAKihK,gBAAgBxC,cAChCC,EAAUxzH,KAAKtpC,MAAMonE,EAASz5B,MAEpCvvC,KAAKg8J,gBAAgB34G,MAAMq7G,EAAQl1B,6BAGvCxpI,KAAKmhK,iBAAmBnhK,KAAKqrI,sBAAsB60B,eAAgBlsJ,IACjEhU,KAAK4/J,eAAeC,YAAY7/J,KAAKghK,wBACpChhK,KAAK4/J,eAAeO,kBAAkBngK,KAAKghK,wBAGhD,mBAAmBpG,GACjB56J,KAAKg8J,gBAAgBn9J,IAAI,iBAAkB+7J,GAC3C56J,KAAKohK,sBAGP,cAAcC,EAAWC,GACvB,MAAM1B,EAAiB5/J,KAAKy/J,WAAWx+I,IAAIogJ,EAAY,IAAMC,GAM7D,OALA1B,EAAeE,cAAe3hH,IAC5Bn+C,KAAKm+C,MAAQA,IAEfyhH,EAAeC,YAAYwB,GAEpBzB,gDAzCEmB,GAAyB,GAAA,IAAA,GAAA,IAAA,GAAA,6BAAzBA,EAAyB,QAAzBA,EAAyB,UAAA,WAFxB,YAEP,GCGA,GAAA,YAAMQ,EAcX,YACUvF,EACAwF,EACAC,EACA92B,EACAtpE,EACAqgG,GALA,KAAA1F,gBAAAA,EACA,KAAAwF,eAAAA,EACA,KAAAC,iCAAAA,EACA,KAAA92B,MAAAA,EACA,KAAAtpE,SAAAA,EACA,KAAAqgG,0BAAAA,EAXV,KAAAC,cAAgB,IAAI,IAAkB,GACtC,KAAAC,gBAAkB,IAAI,IAAkB,GACxC,KAAAC,UAAY,KACZ,KAAAC,aAAe,KAYf,eACE,IAAI9zH,GAAAA,IAAQv1B,MAAOyoG,UAEf6gD,EAA8B,oBAAhBpyC,aAAgCA,YAAY/0G,KAA4B,IAApB+0G,YAAY/0G,OAAkB,EACpG,MAAO,uCAAuCzW,QAAQ,QAAUrF,IAC9D,IAAIyyC,EAAoB,GAAhBhoC,KAAK0S,SAQb,OAPI+xB,EAAI,GACNuD,GAAKvD,EAAIuD,GAAK,GAAK,EACnBvD,EAAIzkC,KAAK2R,MAAM8yB,EAAI,MAEnBuD,GAAKwwH,EAAKxwH,GAAK,GAAK,EACpBwwH,EAAKx4J,KAAK2R,MAAM6mJ,EAAK,MAET,MAANjjK,EAAYyyC,EAAS,EAAJA,EAAU,GAAMx4B,SAAS,MAItD,eAAekxD,GACb,IAAI+3F,EAAc,GAClB,IAAK,MAAMnwD,KAAQ5nC,EACjB+3F,GAAe,IAAMnwD,EAAK3zG,KAE5B,OAAO8jK,EAGT,eAAezoD,EAAS,IACtB,MAAMiiD,EAAOx7J,KAAKg8J,gBAAgBiG,UAClC,IACEC,aAAaC,QAAQ3G,EAAMtwH,KAAKC,UAAUnrC,KAAKg8J,gBAAgB/6I,IAAI,UACnE,MAAOxO,GACPyvJ,aAAatjJ,QACbsjJ,aAAaC,QAAQ3G,EAAMtwH,KAAKC,UAAUnrC,KAAKg8J,gBAAgB/6I,IAAI,UAGrE,GADAs4F,EAAmB,WAAIiiD,EACA,OAAnBx7J,KAAK6hK,UAAoB,CAC3B,MAAMO,EAAoBzuB,GAAI3zI,KAAKqiK,eAAeriK,KAAK6hK,YACvD,IACEK,aAAaC,QAAQC,EAAmBl3H,KAAKC,UAAU,CACrD8+B,IAAKjqE,KAAKqiK,eAAeriK,KAAK6hK,WAC9BtoD,OAAQv5G,KAAK8hK,gBAEf,MAAOrvJ,GACPyvJ,aAAatjJ,QACbsjJ,aAAaC,QAAQC,EAAmBl3H,KAAKC,UAAU,CACrD8+B,IAAKjqE,KAAKqiK,eAAeriK,KAAK6hK,WAC9BtoD,OAAQv5G,KAAK8hK,gBAGjBvoD,EAAqB,aAAI6oD,EAG3B,OAAO7oD,EAYT,wBACE,OAAOv5G,KAAK2hK,cAGd,eAAeW,GACbtiK,KAAK6hK,UAAYS,EAGnB,iBAAiB/oD,GACfv5G,KAAK8hK,aAAevoD,EAGtB,gBACE,OAAOv5G,KAAK4hK,gBAGd,oBACE5hK,KAAK2qI,MAAMvwB,YACR9xD,UAAUixD,IACT,GAAIA,EAAOvgG,eAAe,gBAAiB,CACzC,MAAMupJ,EAAoBr3H,KAAKtpC,MAAMsgK,aAAaM,QAAQjpD,EAAOkpD,eAE/DF,EAAkBt4F,MAAQjqE,KAAKqiK,eAAeriK,KAAK6hK,YAChDU,EAAkBhpD,OAAOmpD,aAAenpD,EAAOmpD,YAC/CH,EAAkBhpD,OAAOkpD,eAAiBlpD,EAAOkpD,aAEpDziK,KAAK4hK,gBAAgBrpH,UAAKriC,GAE1BlW,KAAK4hK,gBAAgBrpH,KAAKgqH,MAMpC,sCAoBE,OAnBAviK,KAAK2qI,MAAMvwB,YACR9xD,UAAUixD,IACT,GAAIA,EAAOvgG,eAAe,cAAe,CACvC,MAAM2pJ,EAAez3H,KAAKtpC,MAAMsgK,aAAaM,QAAQjpD,EAAOmpD,aAE5D1iK,KAAKg8J,gBAAgB34G,MAAMs/G,GAEzBppD,EAAOvgG,eAAe,SACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,MAAO+V,MAAM4I,QAAQ+7F,EAAOqpD,MAAQrpD,EAAOqpD,KAAO,CAACrpD,EAAOqpD,OAEjFrpD,EAAOvgG,eAAe,mBACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,gBAAiB06G,EAAOgwB,gBAE/ChwB,EAAOvgG,eAAe,WACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,eAAgB06G,EAAOspD,QAElD7iK,KAAKg8J,gBAAgBn9J,IAAI,iBAAkB,YAC3CmB,KAAK2hK,cAAcppH,SAEhBv4C,KAGT,+BAA+Bu5G,GAC7B,GAAIA,EAAOvgG,eAAe,cAAe,CACvC,MAAM2pJ,EAAez3H,KAAKtpC,MAAMsgK,aAAaM,QAAQjpD,EAAOmpD,aAE5D1iK,KAAKg8J,gBAAgB34G,MAAMs/G,GAa7B,OAXIppD,EAAOvgG,eAAe,SACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,MAAO+V,MAAM4I,QAAQ+7F,EAAOqpD,MAAQrpD,EAAOqpD,KAAO,CAACrpD,EAAOqpD,OAEjFrpD,EAAOvgG,eAAe,mBACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,gBAAiB06G,EAAOgwB,gBAE/ChwB,EAAOvgG,eAAe,WACxBhZ,KAAKg8J,gBAAgBn9J,IAAI,eAAgB06G,EAAOspD,QAElD7iK,KAAKg8J,gBAAgBn9J,IAAI,iBAAkB,YAC3CmB,KAAK2hK,cAAcppH,OACZv4C,KAGT,mBAEE,OAD8BA,KAAKqhE,SAASnjE,OACfS,MAAM,KAAK,iDAtK/B4iK,GAAwB,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,6BAAxBA,EAAwB,QAAxBA,EAAwB,UAAA,WAFvB,YAEP,GCPA,GAAA,YAAMuB,EAIX,cAHA,KAAAtsF,SAAW,GACX,KAAA16B,QAAU,IAAI,IAAkB,GAIhC,WAAWwwF,EAAKjhI,GACd,MAAMsmF,EAAe3xF,KAAKw2E,SAAS81D,GACnCtsI,KAAKw2E,SAAS81D,GAAOjhI,EACjBsmF,IAAiBtmF,GACnBrL,KAAK87C,QAAQvD,KAAKv4C,KAAKw2E,UAI3B,kBACE,OAAOx2E,KAAK87C,QAGd,QAAQwwF,GACN,OAAOtsI,KAAKw2E,SAAS81D,iDAnBZw2B,2BAAAA,EAAkB,QAAlBA,EAAkB,UAAA,WAFjB,YAEP,GCIA,GAAA,YAAeC,EAOpB,YACUtD,EACEp0B,EACA23B,EACAC,EACAC,GAJF,KAAAzD,WAAAA,EACE,KAAAp0B,sBAAAA,EACA,KAAA23B,8BAAAA,EACA,KAAAC,yBAAAA,EACA,KAAAC,mBAAAA,EAPL,KAAA/kH,MAAQm/G,GAAaG,SAmB5B,cAAc4D,EAAWC,GACvB,MAAM1B,EAAiB5/J,KAAKy/J,WAAWx+I,IAAIogJ,EAAY,IAAMC,GAM7D,OALA1B,EAAeE,cAAe3hH,IAC5Bn+C,KAAKm+C,MAAQA,IAEfyhH,EAAeC,YAAYwB,GAEpBzB,EAGC,qBACR,MAAO,CACLuD,WAAW,EACXzqD,MAAO,IAIX,mBACE,MAAM+4B,EAAczxI,KAAKojK,qBACzB,GAAIpjK,KAAKqjK,cAAcrqJ,eAAe,eACpC,IAAK,MAAMsqJ,KAAWtjK,KAAKqjK,cAAc5xB,YACnCzxI,KAAKqjK,cAAc5xB,YAAYz4H,eAAesqJ,KAEhD7xB,EAAY6xB,GADMtjK,KAAKqjK,cAAc5xB,YAAY6xB,IAKvDtjK,KAAKyxI,YAAcA,EAGrB,cAAch8H,GACZ,OAAOzV,KAAKyxI,YAAYh8H,GAG1B,iBACE,OAAOzV,KAAKijK,yBAAyBM,+DA3DnBR,GAAiB,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,2BAAjBA,EAAiB,OAAA,CAAA,cAAA,sBAAhC,GCJA,GAAA,YAAeS,UAAsB,GAO1C,WACExjK,KAAKyjK,mBACLzjK,KAAK4/J,eAAiB5/J,KAAKkhK,cAAclhK,KAAKqjK,cAAchC,UAAW,GACvErhK,KAAK4/J,eAAeE,cAAe3hH,IACjC,GAAIA,IAAUm/G,GAAasB,SAAU,CACnC,MAAM51F,EAAWhpE,KAAK4/J,eAAenB,cACrC,IAAIC,EACJ,IACEA,EAAUxzH,KAAKtpC,MAAMonE,EAASz5B,MAC9B,MAAO98B,GACPnR,QAAQwtC,IAAI,6BAA+B9uC,KAAKqjK,cAAchC,gBAEhDnrJ,IAAZwoJ,GACF1+J,KAAK0jK,mBAAmBhF,EAAS,MAIvC1+J,KAAKmhK,iBAAmBnhK,KAAKqrI,sBAAsB60B,eAAgBlsJ,IACjEhU,KAAK4/J,eAAeC,YAAY7/J,KAAKqjK,cAAchC,YAClDrhK,KAAK4/J,eAAeO,kBAAkBngK,KAAKqjK,cAAchC,YAQ9D,cACErhK,KAAKqrI,sBAAsBs4B,mBAAmB3jK,KAAKmhK,kBACnDnhK,KAAK4/J,eAAeZ,qBAKtB,mBAAmBN,EAAS4C,GAC1BthK,KAAK0+J,QAAUA,EACf1+J,KAAK4jK,yBAAyB5jK,KAAK0+J,SAGrC,YAAYA,GACV,QAAgBxoJ,IAAZwoJ,GAAyB,WAAYA,GAAqC,IAA1BA,EAAQ5pJ,OAAOhU,OACjE,OAAO,EAET,GAAId,KAAKyxI,YAAYz4H,eAAe,gBAAiB,CACnD,IAAI6qJ,EAAYnF,EAAQrgI,MAAMr+B,KAAKyxI,YAAYqyB,cAC/C,GAAI,eAAgBD,IAAsC,IAAzBA,EAAUE,WACzC,OAAO,EAGX,QAAgB7tJ,IAAZwoJ,GAAyB,WAAYA,GAAWA,EAAQ5pJ,OAAOhU,OAAS,EAAG,CAC7E,IAAIkjK,GAAyB,EAC7B,IAAK,MAAM/jH,KAAQy+G,EAAQ5pJ,OACN,OAAfmrC,EAAK50C,QACP24J,GAAyB,GAG7B,QAAKA,EAKP,YAAgB9tJ,IAAZwoJ,KAAyB,eAAgBA,KAAkC,IAAvBA,EAAQqF,WAMlE,6BAA6BE,EAAMC,GAEjC,GADAD,EAAOtyJ,SAASsyJ,IACXh5H,OAAOhQ,UAAUgpI,GACpB,OAAO,EAET,OAAU,CACR,GAAIA,EAAOC,GAAgB,EACzB,OAAOD,EAETA,kDAnFgBT,yBAAAA,EAAa,OAAA,CAAA,cAAA,iBAAA,SAAA,CAAA,SAA5B,eAAe,2BCHlB,GAAA,EAAA,OACI,GAAA,GACJ,6BACA,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,cACJ,gCANJ,GAAA,EAAA,OACI,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAGA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAGJ,wBANS,GAAA,GAAA,GAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,aAGsB,GAAA,GAAA,GAAA,OAAA,EAAA,cAAA,EAAA,QAAA,EAAA,kCAK3B,GAAA,EAAA,OACI,GAAA,EAAA,MAAI,GAAA,GAAS,KACb,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,MAAA,GAEA,GAAA,EAAA,MAAA,GAA0B,GAAA,EAAA,cAAU,KACxC,KACJ,wBANQ,GAAA,GAAA,GAAA,EAAA,kCAOR,GAAA,EAAA,OACI,GAAA,EAAA,MAAI,GAAA,GAAS,KACb,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,eACJ,KACJ,wBAJQ,GAAA,GAAA,GAAA,EAAA,kCAKR,GAAA,EAAA,OACI,GAAA,EAAA,MAAI,GAAA,GAAS,KACb,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,MAAA,GAEA,GAAA,EAAA,MAAA,GAA0B,GAAA,EAAA,cAAU,KACxC,KACJ,wBANQ,GAAA,GAAA,GAAA,EAAA,kCAOR,GAAA,EAAA,OACI,GAAA,EAAA,MAAI,GAAA,GAAS,KACb,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,0DACJ,KACJ,wBAJQ,GAAA,GAAA,GAAA,EAAA,kCAKR,GAAA,EAAA,OACI,GAAA,EAAA,MAAI,GAAA,GAAS,KACb,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,yBACJ,KACJ,wBAJQ,GAAA,GAAA,GAAA,EAAA,uBC/BL,IAAA,GAAA,YAAMW,EAQX,cAPA,KAAA7G,aAAeA,GAKN,KAAA8G,aAAuB,EAIhC,YAGA,QAAQhlJ,GACN,SAAKA,GAGDxK,MAAM4I,QAAQ4B,IAAyB,IAAhBA,EAAKte,sDAjBvBqjK,yBAAAA,EAAqB,UAAA,CAAA,CAAA,sBAAA,OAAA,CAAA,aAAA,eAAA,KAAA,OAAA,MAAA,QAAA,UAAA,YAAA,YAAA,eAAA,mBAAA,GAAA,MAAA,EAAA,KAAA,EAAA,OAAA,CAAA,CAAA,EAAA,QAAA,CAAA,EAAA,yCAAA,CAAA,QAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,iBAAA,CAAA,EAAA,mBAAA,CAAA,OAAA,SAAA,EAAA,iBAAA,mBAAA,CAAA,EAAA,iBAAA,SAAA,SAAA,EAAA,GAAA,EAAA,SDPlC,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAQA,GAAA,EAAA,MAAA,GACI,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAQA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAMA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAQA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAMA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,GAMJ,YA3CK,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,UASI,GAAA,GAAA,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,SAQA,GAAA,GAAA,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,UAMA,GAAA,GAAA,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,SAQA,GAAA,GAAA,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,aAMA,GAAA,GAAA,GAAA,OAAA,EAAA,eAAA,EAAA,aAAA,iJC9BF,GCPA,MAAM,WAAe,EACxB,YAAY75G,EAAW+5G,GACnBp9G,QAEJ,SAAS9I,EAAO9jB,EAAQ,GACpB,OAAOr6B,MCLR,MAAM,WAAoB,GAC7B,YAAYsqD,EAAW+5G,GACnBp9G,MAAMqD,EAAW+5G,GACjBrkK,KAAKsqD,UAAYA,EACjBtqD,KAAKqkK,KAAOA,EACZrkK,KAAKwwG,SAAU,EAEnB,SAASryD,EAAO9jB,EAAQ,GACpB,GAAIr6B,KAAK0lD,OACL,OAAO1lD,KAEXA,KAAKm+C,MAAQA,EACb,MAAM7vB,EAAKtuB,KAAKsuB,GACVg8B,EAAYtqD,KAAKsqD,UAOvB,OANU,MAANh8B,IACAtuB,KAAKsuB,GAAKtuB,KAAKskK,eAAeh6G,EAAWh8B,EAAI+L,IAEjDr6B,KAAKwwG,SAAU,EACfxwG,KAAKq6B,MAAQA,EACbr6B,KAAKsuB,GAAKtuB,KAAKsuB,IAAMtuB,KAAKukK,eAAej6G,EAAWtqD,KAAKsuB,GAAI+L,GACtDr6B,KAEX,eAAesqD,EAAWh8B,EAAI+L,EAAQ,GAClC,OAAOmqI,YAAYl6G,EAAUnwB,MAAMvB,KAAK0xB,EAAWtqD,MAAOq6B,GAE9D,eAAeiwB,EAAWh8B,EAAI+L,EAAQ,GAClC,GAAc,OAAVA,GAAkBr6B,KAAKq6B,QAAUA,IAA0B,IAAjBr6B,KAAKwwG,QAC/C,OAAOliF,EAEXm2I,cAAcn2I,GAGlB,QAAQ6vB,EAAO9jB,GACX,GAAIr6B,KAAK0lD,OACL,OAAO,IAAIj/C,MAAM,gCAErBzG,KAAKwwG,SAAU,EACf,MAAMjvG,EAAQvB,KAAK0kK,SAASvmH,EAAO9jB,GACnC,GAAI94B,EACA,OAAOA,GAEe,IAAjBvB,KAAKwwG,SAAgC,MAAXxwG,KAAKsuB,KACpCtuB,KAAKsuB,GAAKtuB,KAAKskK,eAAetkK,KAAKsqD,UAAWtqD,KAAKsuB,GAAI,OAG/D,SAAS6vB,EAAO9jB,GACZ,IAAIk2H,GAAU,EACVoU,OAAazuJ,EACjB,IACIlW,KAAKqkK,KAAKlmH,GAEd,MAAO1rC,GACH89I,GAAU,EACVoU,IAAelyJ,GAAKA,GAAK,IAAIhM,MAAMgM,GAEvC,GAAI89I,EAEA,OADAvwJ,KAAKgmD,cACE2+G,EAGf,eACI,MAAMr2I,EAAKtuB,KAAKsuB,GACVg8B,EAAYtqD,KAAKsqD,UACjB38B,EAAU28B,EAAU38B,QACpB3Z,EAAQ2Z,EAAQ9rB,QAAQ7B,MAC9BA,KAAKqkK,KAAO,KACZrkK,KAAKm+C,MAAQ,KACbn+C,KAAKwwG,SAAU,EACfxwG,KAAKsqD,UAAY,MACF,IAAXt2C,GACA2Z,EAAQ3T,OAAOhG,EAAO,GAEhB,MAANsa,IACAtuB,KAAKsuB,GAAKtuB,KAAKskK,eAAeh6G,EAAWh8B,EAAI,OAEjDtuB,KAAKq6B,MAAQ,MC5Ed,IAAA,GAAA,YAAMuqI,EACT,YAAYC,EAAiBjqJ,EAAMgqJ,EAAUhqJ,KACzC5a,KAAK6kK,gBAAkBA,EACvB7kK,KAAK4a,IAAMA,EAEf,SAASypJ,EAAMhqI,EAAQ,EAAG8jB,GACtB,OAAO,IAAIn+C,KAAK6kK,gBAAgB7kK,KAAMqkK,GAAM56G,SAAStL,EAAO9jB,WAGpEuqI,EAAUhqJ,IAAM,IAAMnC,KAAKmC,SATpB,GCCA,MAAM,WAAuBgqJ,GAChC,YAAYC,EAAiBjqJ,EAAMgqJ,GAAUhqJ,KACzCqsC,MAAM49G,EAAiB,IACf,GAAe52D,UAAY,GAAeA,WAAajuG,KAChD,GAAeiuG,SAASrzF,MAGxBA,KAGf5a,KAAK2tB,QAAU,GACf3tB,KAAKorD,QAAS,EACdprD,KAAK8kK,eAAY5uJ,EAErB,SAASmuJ,EAAMhqI,EAAQ,EAAG8jB,GACtB,OAAI,GAAe8vD,UAAY,GAAeA,WAAajuG,KAChD,GAAeiuG,SAASxkD,SAAS46G,EAAMhqI,EAAO8jB,GAG9C8I,MAAMwC,SAAS46G,EAAMhqI,EAAO8jB,GAG3C,MAAMvwB,GACF,MAAM,QAAED,GAAY3tB,KACpB,GAAIA,KAAKorD,OAEL,YADAz9B,EAAQtqB,KAAKuqB,GAGjB,IAAIrsB,EACJvB,KAAKorD,QAAS,EACd,EAAA,CACI,GAAI7pD,EAAQqsB,EAAOm3I,QAAQn3I,EAAOuwB,MAAOvwB,EAAOyM,OAC5C,YAECzM,EAASD,EAAQoiB,SAE1B,GADA/vC,KAAKorD,QAAS,EACV7pD,EAAO,CACP,KAAOqsB,EAASD,EAAQoiB,SACpBniB,EAAOo4B,cAEX,MAAMzkD,ICvCX,MACM,GADiB,IAAI,GAAe,ICIjD,MAAMyjK,GACF,YAAYC,GACRjlK,KAAKilK,iBAAmBA,EAE5B,KAAK19G,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAgBf,EAAYvnD,KAAKilK,oBAGrE,MAAM,WAAwB,EAC1B,YAAY39G,EAAa29G,GACrBh+G,MAAMK,GACNtnD,KAAKilK,iBAAmBA,EACxBjlK,KAAKs3I,UAAW,EAEpB,MAAMjsI,GAGF,GAFArL,KAAKqL,MAAQA,EACbrL,KAAKs3I,UAAW,GACXt3I,KAAKklK,UAAW,CACjB,IAAIC,EACJ,IACI,MAAM,iBAAEF,GAAqBjlK,KAC7BmlK,EAAWF,EAAiB55J,GAEhC,MAAOo6C,GACH,OAAOzlD,KAAKsnD,YAAY/lD,MAAMkkD,GAElC,MAAM+F,EAAoBb,EAAew6G,EAAU,IAAI,EAAsBnlK,QACxEwrD,GAAqBA,EAAkB9F,OACxC1lD,KAAKolK,gBAGLplK,KAAKkf,IAAIlf,KAAKklK,UAAY15G,IAItC,gBACI,MAAM,MAAEngD,EAAK,SAAEisI,EAAQ,UAAE4tB,GAAcllK,KACnCklK,IACAllK,KAAKshC,OAAO4jI,GACZllK,KAAKklK,eAAYhvJ,EACjBgvJ,EAAUl/G,eAEVsxF,IACAt3I,KAAKqL,WAAQ6K,EACblW,KAAKs3I,UAAW,EAChBt3I,KAAKsnD,YAAYhsB,KAAKjwB,IAG9B,aACIrL,KAAKolK,gBAET,iBACIplK,KAAKolK,iBCzDN,SAASC,GAAUp4H,GACtB,OAAQzvB,EAAQyvB,IAASA,EAAMx7B,WAAWw7B,GAAO,GAAM,ECsB3D,SAAS,GAASkR,GACd,MAAM,MAAEnqC,EAAK,OAAE6uJ,EAAM,WAAEt7G,GAAepJ,EAEtC,GADAoJ,EAAWjsB,KAAKtnB,IACZuzC,EAAW7B,OAAf,CAGK,IAAgB,IAAZm9G,EACL,OAAOt7G,EAAWP,WAEtB7I,EAAMnqC,MAAQA,EAAQ,EACtBhU,KAAKypD,SAAStL,EAAO0kH,IC/BlB,SAASyC,GAAUH,EAAU76G,EAAY,IAC5C,OHHkB26G,EGGL,IDAV,SAAeM,EAAU,EAAGC,EAAmBl7G,GAClD,IAAIu4G,GAAU,EAUd,OATIwC,GAAUG,GACV3C,EAAS53H,OAAOu6H,GAAqB,EAAK,EAAKv6H,OAAOu6H,GAEjDh8G,EAAYg8G,KACjBl7G,EAAYk7G,GAEXh8G,EAAYc,KACbA,EAAY,IAET,IAAI,EAAW/C,IAClB,MAAMk+G,EAAMJ,GAAUE,GAChBA,GACEA,EAAUj7G,EAAU1vC,MAC5B,OAAO0vC,EAAUb,SAAS,GAAUg8G,EAAK,CACrCzxJ,MAAO,EAAG6uJ,OAAAA,EAAQt7G,WAAAA,MAhBvB,CCAsB49G,EAAU76G,GHF5B,SAA+B18C,GAClC,OAAOA,EAAO+7C,KAAK,IAAIq7G,GAAcC,KAFtC,IAAeA,EIDf,MAAMS,GAAM,MAENC,GAAQ,OACRC,GAAS,SACTC,GAAS,SACTC,GAAS,SAGTC,GAAO,OAMPC,GAAe,UAIfC,GAAO,OACPC,GAAYj7H,OAAOi7H,UACnBC,IAAal7H,OAAOi7H,UAOpBE,GAAQ,QAGRC,GAAM,MAENC,GAAQ,QACRC,GAAQ,OAERC,GAAI,IACJC,GAAI,ICpCF,SAAS,GAAQp7J,GAC5B,OAAOuJ,MAAM4I,QAAQnS,GCCV,SAAS2lF,GAASv8C,EAAS+gC,GACtC,MAAMkxF,EAAa,GAAQlxF,GAAWA,EAAU,CAAEA,GAElD,IAAK,IAAItoC,EAAM,EAAGA,EAAMw5H,EAAW5lK,OAAQosC,IAAO,CAC9C,MAAMihC,EAAYu4F,EAAWx5H,IACiB,IAA1CuH,EAAQ05B,UAAUtsE,QAAQssE,KAC1B15B,EAAQ05B,WAAa,IAAMA,ICRvC,MAAMw4F,GAAc,OCAL,MAAM,ICsEN,IAAA,GApEf,cAA2B,GACvB,YAEI,OADA3mK,KAAK4mK,WAAa5mK,KAAK4mK,YAAc,GAC9B5mK,KAAK4mK,WAGhB,YAAYnyH,GAMR,OALKz0C,KAAK4mK,WAGN5mK,KAAK4mK,WAAWvjK,KAAKoxC,GAFrBz0C,KAAK4mK,WAAa,CAAEnyH,GAIjBz0C,KAGX,eAAey0C,GACX,MAAM0U,EAAYnpD,KAAKmpD,YACjBn1C,EAAQm1C,EAAUtnD,QAAQ4yC,GAIhC,OAHe,IAAXzgC,GACAm1C,EAAUnvC,OAAOhG,EAAO,GAErBhU,KAGX,QAAQowB,EAAYgxB,GAChB,MAAM+H,EAAYnpD,KAAK4mK,WAEvB,GAAIz9G,IAAcnpD,KAAK6mK,WACnB,IAAK,IAAI35H,EAAM,EAAGA,EAAMic,EAAUroD,OAAQosC,IAAO,CAC7C,IAAI0b,EAAWO,EAAUjc,GACrB0b,EAASx4B,IACTw4B,EAASx4B,GAAYgxB,GAIjC,OAAOphD,KAGX,cAAcyS,EAAI,IACdA,EAAEgiC,QAAUz0C,KACZA,KAAK6qI,QAAQ,gBAAiBp4H,GAGlC,iBACIzS,KAAK6qI,QAAQ,iBAAkB,CAC3Bp2F,QAASz0C,OAIjB,UAEI,OADAA,KAAK6mK,YAAc7mK,KAAK6mK,YAAc,GAAK,EACpC7mK,KAGX,SAEI,OADAA,KAAK6mK,WAAat9J,KAAKqS,KAAK5b,KAAK6mK,YAAc,GAAK,EAAG,GAChD7mK,KAGX,eAAe8mK,EAAOz7J,GACdrL,KAAK8mK,IACL9mK,KAAK8mK,GAAOC,eAAe/mK,MAE/BA,KAAK8mK,GAASz7J,EACdA,EAAM27J,YAAYhnK,QChEX,SAASinK,GAAQ57J,GAC5B,YAHc,IAGAA,ECElB,MAAM,GAAW,GAAG0N,SAEpB,MAAM,WAAqB,GACvB,YAAYrZ,EAASwpC,EAAS,IAC1B+d,QAEAjnD,KAAKkpC,OAASA,EAEd,IAAK,IAAI49H,KAASpnK,EAAS,CACvB,IAAIwnK,EAASxnK,EAAQonK,GACrBI,EAASlnK,KAAKmnK,MAAMD,EAAQJ,GAC5B9mK,KAAK8mK,GAASI,GAItB,IAAIJ,GACA,MAAM//J,EAAQ+/J,EAAMnoK,MAAM,KAC1B,IAAI+I,EAAS1H,KAEb,KAAO+G,EAAMjG,QAAU4G,GAEnBA,EAASA,EADEX,EAAMgpC,SAIrB,OAAOroC,EAGX,IAAIo/J,EAAOz7J,GACSrL,KAAKihB,IAAI6lJ,KAETz7J,IACZrL,KAAKonK,KAAKN,EAAO9mK,KAAKmnK,MAAM97J,EAAOy7J,IACnC9mK,KAAKqnK,cAAc,CACfP,MAAO9mK,KAAKkpC,OAAS49H,EACrBz7J,MAAOA,KAKnB,KAAKy7J,EAAOz7J,GACR,MAAMi8J,EAAYR,EAAMjlK,QAAQ,MAAQ,EACxC,IAAI0lK,EAAYvnK,KACZwnK,EAAYV,EAEhB,GAAIQ,EAAW,CACX,MAAMvgK,EAAQygK,EAAU7oK,MAAM,KAC9B,IAAIuqC,EAASlpC,KAAKkpC,OAElB,KAAOniC,EAAMjG,OAAS,GAAG,CACrB0mK,EAAYzgK,EAAMgpC,QAClB7G,GAAUs+H,EAAY,IAEtB,IAAI37H,EAAM07H,EAAUC,GAEf37H,IACDA,EAAM,IAAI,GAAa,GAAI3C,GAC3B2C,EAAIm7H,YAAYhnK,MAChBunK,EAAUC,GAAa37H,GAE3B07H,EAAY17H,EAEhB27H,EAAYzgK,EAAM,GAGtBwgK,EAAUE,OAAOD,GACjBD,EAAUC,GAAan8J,EAG3B,OAAOy7J,GACH,MAAMzwJ,EAAUrW,KAAK8mK,GACjBzwJ,GAAWA,EAAQ0wJ,gBACnB1wJ,EAAQ0wJ,eAAe/mK,MAI/B,MAAMiW,EAAQ6wJ,GACV,MAAMxjK,EAAO,GAASoQ,KAAKuC,GAC3B,IAAIy0B,EAAUz0B,EAUd,OARgB,OAAZy0B,GAAoBu8H,GAAQv8H,IAAqB,oBAATpnC,IAClC2S,aAAkB,IAAmBA,aAAkB,KACzDy0B,EAAU,IAAI,GAAaA,EAAS1qC,KAAKkpC,OAAS49H,EAAQ,MAG9Dp8H,EAAQs8H,YAAYhnK,OAGjB0qC,GAIA,IAAA,GAAA,GChGf,SAASg9H,GAAYZ,GACjB,OAAO,SAASz7J,GAMZ,OALIrL,KAAK8mK,KAAWz7J,IAChBrL,KAAK8mK,GAASz7J,EACdrL,KAAK2nK,kBAGF3nK,MAIf,SAAS4nK,GAAYd,GACjB,OAAO,WACH,OAAO9mK,KAAK8mK,IAsBL,IAAA,GAPO,CAACe,EAAOvb,KAC1B,MAAM5kJ,EAAS,cAAcmgK,IAG7B,OAfJ,SAAyBt1I,EAAIu1I,GACzB,IAAK,IAAIpnK,EAAI,EAAGA,EAAIonK,EAAOhnK,OAAQJ,IAAK,CACpC,IAAI+J,EAAOq9J,EAAOpnK,GACdqnK,EAAct9J,EAAK5K,OAAO,GAAG49B,cACfhzB,EAAK5G,UAAU,EAAG4G,EAAK3J,QAEzCyxB,EAAG,MAAQw1I,GAAeL,GAAYj9J,GACtC8nB,EAAG,MAAQw1I,GAAeH,GAAYn9J,IAP9C,CAaoB/C,EAAOzG,UAAWqrJ,GAE3B5kJ,GCxBI,SAASq3B,GAAM1zB,EAAOyoB,GACjC,MAAMk0I,GATGxoK,EASSs0B,GAPPvqB,KAAK0+J,IAAI,GAAIzoK,GAGjB,EALX,IAAaA,EAUT,OAAO+J,KAAKw1B,MAAM1zB,EAAQ28J,GAASA,ECVvC,MAAME,GAAa3+J,KAAKwvC,GAAK,IACvBovH,GAAUl9H,OAAOi7H,UACjBkC,IAAWn9H,OAAOi7H,UCAT,SAASmC,GAAIC,GACxB,OAAOA,EAAUJ,GC0GN,IAAA,eAxGTK,UAAe,GAEjB,YAAYtpK,EAAI,EAAGC,EAAI,EAAGJ,EAAI,EAAGkvC,EAAI,EAAGv7B,EAAI,EAAGhN,EAAI,GAC/CwhD,QAEAjnD,KAAKf,EAAIA,EACTe,KAAKd,EAAIA,EACTc,KAAKlB,EAAIA,EACTkB,KAAKguC,EAAIA,EACThuC,KAAKyS,EAAIA,EACTzS,KAAKyF,EAAIA,EAGb,aAAa+iK,GACT,OAAO,IAAID,EACPvoK,KAAKf,EAAIupK,EAAOvpK,EAAIe,KAAKlB,EAAI0pK,EAAOtpK,EACpCc,KAAKd,EAAIspK,EAAOvpK,EAAIe,KAAKguC,EAAIw6H,EAAOtpK,EACpCc,KAAKf,EAAIupK,EAAO1pK,EAAIkB,KAAKlB,EAAI0pK,EAAOx6H,EACpChuC,KAAKd,EAAIspK,EAAO1pK,EAAIkB,KAAKguC,EAAIw6H,EAAOx6H,EACpChuC,KAAKf,EAAIupK,EAAO/1J,EAAIzS,KAAKlB,EAAI0pK,EAAO/iK,EAAIzF,KAAKyS,EAC7CzS,KAAKd,EAAIspK,EAAO/1J,EAAIzS,KAAKguC,EAAIw6H,EAAO/iK,EAAIzF,KAAKyF,GAIrD,SACI,MAAM,EAAExG,EAAC,EAAEC,EAAGJ,EAAGkvC,EAAGA,EAAGv7B,EAAGA,EAAGosH,EAAGp5H,EAAG04G,GAAMn+G,KACnCyoK,EAAMxpK,EAAIwT,EAAIvT,EAAI8uC,EAExB,OAAY,IAARy6H,EACO,KAGJ,IAAIF,EAAO91J,EAAIg2J,GAAMvpK,EAAIupK,GAAMz6H,EAAIy6H,EAAKxpK,EAAIwpK,GAChCz6H,EAAImwE,EAAI1rG,EAAIosH,GAAK4pC,GAAMvpK,EAAI2/H,EAAI5/H,EAAIk/G,GAAKsqD,GAG/D,QACI,OAAO,IAAIF,EAAOvoK,KAAKf,EAAGe,KAAKd,EAAGc,KAAKlB,EAAGkB,KAAKguC,EAAGhuC,KAAKyS,EAAGzS,KAAKyF,GAGnE,OAAOggB,GACH,QAAKA,GAIEzlB,KAAKf,IAAMwmB,EAAMxmB,GAAKe,KAAKd,IAAMumB,EAAMvmB,GACvCc,KAAKlB,IAAM2mB,EAAM3mB,GAAKkB,KAAKguC,IAAMvoB,EAAMuoB,GACvChuC,KAAKyS,IAAMgT,EAAMhT,GAAKzS,KAAKyF,IAAMggB,EAAMhgB,EAGlD,MAAMquB,GAQF,OAPA9zB,KAAKf,EAAI8/B,GAAM/+B,KAAKf,EAAG60B,GACvB9zB,KAAKd,EAAI6/B,GAAM/+B,KAAKd,EAAG40B,GACvB9zB,KAAKlB,EAAIigC,GAAM/+B,KAAKlB,EAAGg1B,GACvB9zB,KAAKguC,EAAIjP,GAAM/+B,KAAKguC,EAAGla,GACvB9zB,KAAKyS,EAAIssB,GAAM/+B,KAAKyS,EAAGqhB,GACvB9zB,KAAKyF,EAAIs5B,GAAM/+B,KAAKyF,EAAGquB,GAEhB9zB,KAGX,QAAQ8zB,GACJ,MAAMpsB,EAAS,CAAE1H,KAAKf,EAAGe,KAAKd,EAAGc,KAAKlB,EAAGkB,KAAKguC,EAAGhuC,KAAKyS,EAAGzS,KAAKyF,GAE9D,GAAIwhK,GAAQnzI,GACR,IAAK,IAAIpzB,EAAI,EAAGA,EAAIgH,EAAO5G,OAAQJ,IAC/BgH,EAAOhH,GAAKq+B,GAAMr3B,EAAOhH,GAAIozB,GAIrC,OAAOpsB,EAGX,SAASosB,EAAW+N,EAAY,KAC5B,OAAO7hC,KAAKq7B,QAAQvH,GAAW7zB,KAAK4hC,GAGxC,iBAAiBmJ,EAAGmF,GAChB,OAAO,IAAIo4H,EAAO,EAAG,EAAG,EAAG,EAAGv9H,EAAGmF,GAGrC,cACI,OAAO,IAAIo4H,EAAO,EAAG,EAAG,EAAG,EAAG,EAAG,GAGrC,cAAczxH,EAAO9L,EAAGmF,GACpB,MAAMq4H,EAAS,IAAID,EAQnB,OAPAC,EAAOvpK,EAAIsK,KAAKm/J,IAAIL,GAAIvxH,IACxB0xH,EAAOtpK,EAAIqK,KAAKo/J,IAAIN,GAAIvxH,IACxB0xH,EAAO1pK,GAAK0pK,EAAOtpK,EACnBspK,EAAOx6H,EAAIw6H,EAAOvpK,EAClBupK,EAAO/1J,EAAKu4B,EAAIA,EAAIw9H,EAAOvpK,EAAIkxC,EAAIq4H,EAAOtpK,GAAM,EAChDspK,EAAO/iK,EAAK0qC,EAAIA,EAAIq4H,EAAOvpK,EAAI+rC,EAAIw9H,EAAOtpK,GAAM,EAEzCspK,EAGX,aAAaI,EAAQC,GACjB,OAAO,IAAIN,EAAOK,EAAQ,EAAG,EAAGC,EAAQ,EAAG,WAInDN,EAAOO,SAAWP,EAAO17C,aC3GV,SAASk8C,GAASC,GAC7B,OAAIA,GAAmD,mBAA1BA,EAAeR,OACjCQ,EAAeR,SAGnBQ,ECEX,MAAM,WAAc,GAAc,GAAc,CAAE,IAAK,OACnD,YAAYh+H,EAAGmF,GACX8W,QAEAjnD,KAAKgrC,EAAIA,GAAK,EACdhrC,KAAKmwC,EAAIA,GAAK,EAGlB,OAAO1qB,GACH,OAAOA,GAASA,EAAMulB,IAAMhrC,KAAKgrC,GAAKvlB,EAAM0qB,IAAMnwC,KAAKmwC,EAG3D,QACI,OAAO,IAAI,GAAMnwC,KAAKgrC,EAAGhrC,KAAKmwC,GAGlC,OAAO2G,EAAO9H,GACV,MAAMi6H,EAAc,GAAMj+J,OAAOgkC,IAAW,GAAMk6H,KAElD,OAAOlpK,KAAK8X,UAAU,GAAOqxJ,OAAOryH,EAAOmyH,EAAYj+H,EAAGi+H,EAAY94H,IAG1E,UAAUnF,EAAGmF,GAMT,OALAnwC,KAAKgrC,GAAKA,EACVhrC,KAAKmwC,GAAKA,EAEVnwC,KAAK2nK,iBAEE3nK,KAGX,cAAcopK,GACV,OAAOppK,KAAKqpK,UAAUD,EAAMp+H,EAAGo+H,EAAMj5H,GAGzC,KAAKnF,EAAGmF,GAEJ,OADAnwC,KAAKgrC,EAAIhrC,KAAKmwC,EAAI,EACXnwC,KAAKqpK,UAAUr+H,EAAGmF,GAG7B,MAAMy4H,EAAQC,EAASD,GAMnB,OALA5oK,KAAKgrC,GAAK49H,EACV5oK,KAAKmwC,GAAK04H,EAEV7oK,KAAK2nK,iBAEE3nK,KAGX,UAAU4oK,EAAQC,GACd,OAAO7oK,KAAKq2B,QAAQwhB,MAAM+wH,EAAQC,GAGtC,UAAUG,GACN,MAAMR,EAASO,GAASC,IAClB,EAAEh+H,EAAC,EAAEmF,GAAMnwC,KAOjB,OALAA,KAAKgrC,EAAIw9H,EAAOvpK,EAAI+rC,EAAIw9H,EAAO1pK,EAAIqxC,EAAIq4H,EAAO/1J,EAC9CzS,KAAKmwC,EAAIq4H,EAAOtpK,EAAI8rC,EAAIw9H,EAAOx6H,EAAImC,EAAIq4H,EAAO/iK,EAE9CzF,KAAK2nK,iBAEE3nK,KAGX,cAAcgpK,GACV,MAAMI,EAAQppK,KAAKq2B,QAMnB,OAJI2yI,GACAI,EAAMtxJ,UAAUkxJ,GAGbI,EAGX,WAAWA,GACP,MAAMjsH,EAAKn9C,KAAKgrC,EAAIo+H,EAAMp+H,EACpBoS,EAAKp9C,KAAKmwC,EAAIi5H,EAAMj5H,EAE1B,OAAO5mC,KAAKsvC,KAAKsE,EAAKA,EAAKC,EAAKA,GAGpC,MAAM0kE,GAMF,OALA9hH,KAAKgrC,EAAIjM,GAAM/+B,KAAKgrC,EAAG82E,GACvB9hH,KAAKmwC,EAAIpR,GAAM/+B,KAAKmwC,EAAG2xE,GAEvB9hH,KAAK2nK,iBAEE3nK,KAGX,QAAQ8hH,GACJ,MAAMwnD,EAAUrC,GAAQnlD,GAIxB,MAAO,CAHGwnD,EAAUvqI,GAAM/+B,KAAKgrC,EAAG82E,GAAU9hH,KAAKgrC,EACvCs+H,EAAUvqI,GAAM/+B,KAAKmwC,EAAG2xE,GAAU9hH,KAAKmwC,GAKrD,SAAS2xE,EAAQjgF,EAAY,KACzB,IAAI,EAAEmJ,EAAC,EAAEmF,GAAMnwC,KAOf,OALIinK,GAAQnlD,KACR92E,EAAIjM,GAAMiM,EAAG82E,GACb3xE,EAAIpR,GAAMoR,EAAG2xE,IAGV92E,EAAInJ,EAAYsO,EAG3B,cAAco5H,EAAMC,GAChB,GAAIvC,GAAQsC,GACR,OAAIA,aAAgB,GACTA,EACqB,IAArBjhK,UAAUxH,QAAgC,IAAhByoK,EAAKzoK,OAC/B,IAAI,GAAMyoK,EAAK,GAAIA,EAAK,IAG5B,IAAI,GAAMA,EAAMC,GAI/B,aACI,IAAIC,EAAOtB,GACPuB,EAAOvB,GAEX,IAAK,IAAIznK,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IAAK,CACvC,IAAI0oK,EAAQ9gK,UAAU5H,GACtB+oK,EAAOlgK,KAAKC,IAAI4/J,EAAMp+H,EAAGy+H,GACzBC,EAAOngK,KAAKC,IAAI4/J,EAAMj5H,EAAGu5H,GAG7B,OAAO,IAAI,GAAMD,EAAMC,GAG3B,aACI,IAAIC,EAAOvB,GACPwB,EAAOxB,GAEX,IAAK,IAAI1nK,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IAAK,CACvC,MAAM0oK,EAAQ9gK,UAAU5H,GACxBipK,EAAOpgK,KAAKqS,IAAIwtJ,EAAMp+H,EAAG2+H,GACzBC,EAAOrgK,KAAKqS,IAAIwtJ,EAAMj5H,EAAGy5H,GAG7B,OAAO,IAAI,GAAMD,EAAMC,GAG3B,kBACI,OAAO,IAAI,GAAMxB,GAASA,IAG9B,kBACI,OAAO,IAAI,GAAMD,GAASA,IAG9B,kBACI,OAAO,IAAI,GAAM,EAAG,IAIb,IAAA,GAAA,GCnKf,MAAM,WAAa,GAAc,GAAc,CAAE,QAAS,YACtD,YAAY/3H,EAAOy5H,GACf5iH,QAEAjnD,KAAKowC,MAAQA,GAAS,EACtBpwC,KAAK6pK,OAASA,GAAU,EAG5B,OAAOpkJ,GACH,OAAOA,GAASA,EAAM2qB,QAAUpwC,KAAKowC,OAAS3qB,EAAMokJ,SAAW7pK,KAAK6pK,OAGxE,QACI,OAAO,IAAI,GAAK7pK,KAAKowC,MAAOpwC,KAAK6pK,QAGrC,QAAQ/nD,GACJ,MAAMwnD,EAAUrC,GAAQnlD,GAIxB,MAAO,CAHOwnD,EAAUvqI,GAAM/+B,KAAKowC,MAAO0xE,GAAU9hH,KAAKowC,MAC1Ck5H,EAAUvqI,GAAM/+B,KAAK6pK,OAAQ/nD,GAAU9hH,KAAK6pK,QAK/D,cAAcN,EAAMC,GAChB,GAAIvC,GAAQsC,GACR,OAAIA,aAAgB,GACTA,EACqB,IAArBjhK,UAAUxH,QAAgC,IAAhByoK,EAAKzoK,OAC/B,IAAI,GAAKyoK,EAAK,GAAIA,EAAK,IAG3B,IAAI,GAAKA,EAAMC,GAI9B,kBACI,OAAO,IAAI,GAAK,EAAG,IAIZ,IAAA,GAAA,GC1Cf,MAAM,WAAa,GACf,YAAYx6H,EAAS,IAAI,GAASp3B,EAAO,IAAI,IACzCqvC,QAEAjnD,KAAK8pK,UAAU96H,GACfhvC,KAAK+pK,QAAQnyJ,GAGjB,QACI,OAAO,IAAI,GACP5X,KAAKgvC,OAAO3Y,QACZr2B,KAAK4X,KAAKye,SAIlB,OAAO5Q,GACH,OAAOA,GACAA,EAAMupB,OAAOg7H,OAAOhqK,KAAKgvC,SACzBvpB,EAAM7N,KAAKoyJ,OAAOhqK,KAAK4X,MAGlC,UAAUvM,GAGN,OAFArL,KAAKiqK,eAAe,SAAU,GAAMj/J,OAAOK,IAC3CrL,KAAK2nK,iBACE3nK,KAGX,YACI,OAAOA,KAAKgvC,OAGhB,QAAQ3jC,GAGJ,OAFArL,KAAKiqK,eAAe,OAAQ,GAAKj/J,OAAOK,IACxCrL,KAAK2nK,iBACE3nK,KAGX,UACI,OAAOA,KAAK4X,KAGhB,QACI,OAAO5X,KAAK4X,KAAKw4B,MAGrB,SACI,OAAOpwC,KAAK4X,KAAKiyJ,OAGrB,UACI,OAAO7pK,KAAKgvC,OAAO3Y,QAGvB,cACI,OAAOr2B,KAAKgvC,OAAO3Y,QAAQgzI,UAAUrpK,KAAKowC,QAASpwC,KAAK6pK,UAG5D,WACI,OAAO7pK,KAAKgvC,OAAO3Y,QAAQgzI,UAAUrpK,KAAKowC,QAAS,GAGvD,aACI,OAAOpwC,KAAKgvC,OAAO3Y,QAAQgzI,UAAU,EAAGrpK,KAAK6pK,UAGjD,SACI,OAAO7pK,KAAKgvC,OAAO3Y,QAAQgzI,UAAUrpK,KAAKowC,QAAU,EAAGpwC,KAAK6pK,SAAW,GAG3E,KAAKrB,GACD,MAAM0B,EAAKlqK,KAAKmqK,UAAUC,cAAc5B,GAClC6B,EAAKrqK,KAAKsqK,WAAWF,cAAc5B,GACnC+B,EAAKvqK,KAAKwqK,cAAcJ,cAAc5B,GACtCiC,EAAKzqK,KAAK0qK,aAAaN,cAAc5B,GAE3C,OAAO,GAAKmC,WAAWT,EAAIG,EAAIE,EAAIE,GAGvC,cAAczpK,GACV,OAAO,GAAK2pK,WACR3qK,KAAKmqK,UAAUryJ,UAAU9W,GACzBhB,KAAKwqK,cAAc1yJ,UAAU9W,IAIrC,OAAOgqC,EAAGmF,EAAInF,GAOV,OALAhrC,KAAK4X,KAAKw4B,OAAS,EAAIpF,EACvBhrC,KAAK4X,KAAKiyJ,QAAU,EAAI15H,EAExBnwC,KAAKgvC,OAAOq6H,WAAWr+H,GAAImF,GAEpBnwC,KAGX,WAAWgrC,EAAGmF,GACV,OAAOnwC,KAAKq2B,QAAQ/3B,OAAO0sC,EAAGmF,GAGlC,cAAci5H,GACV,MAAMp6H,EAAShvC,KAAKgvC,OACdw7H,EAAcxqK,KAAKwqK,cACzB,QAASpB,EAAMp+H,EAAIgE,EAAOhE,GAAKo+H,EAAMj5H,EAAInB,EAAOmB,GAAKq6H,EAAYx/H,EAAIo+H,EAAMp+H,GAAKw/H,EAAYr6H,EAAIi5H,EAAMj5H,GAG1G,UAAUi5H,EAAOh5H,GACb,MAAMw6H,EAAY5qK,KAAK6qK,WAAWz6H,EAAOA,GACnC06H,EAAY9qK,KAAK6qK,YAAYz6H,GAAQA,GAE3C,OAAOw6H,EAAUG,cAAc3B,KAAW0B,EAAUC,cAAc3B,GAGtE,oBACI,MAAMe,EAAU,GAAM3gK,IAAI8J,MAAM,KAAMhL,WAChCkiK,EAAc,GAAM5uJ,IAAItI,MAAM,KAAMhL,WACpCsP,EAAO,IAAI,GACb4yJ,EAAYx/H,EAAIm/H,EAAQn/H,EACxBw/H,EAAYr6H,EAAIg6H,EAAQh6H,GAG5B,OAAO,IAAI,GAAKg6H,EAASvyJ,GAG7B,aAAa3Y,EAAGC,GACZ,OAAO,GAAKyrK,WACR,GAAMnhK,IAAIvK,EAAEkrK,UAAWjrK,EAAEirK,WACzB,GAAMvuJ,IAAI3c,EAAEurK,cAAetrK,EAAEsrK,gBAIrC,iBAAiBvrK,EAAGC,GAChB,MAAM8rK,EAAQ,CACVr5H,KAAM1yC,EAAEkrK,UAAUn/H,EAClBikF,IAAKhwH,EAAEkrK,UAAUh6H,EACjByB,MAAO3yC,EAAEurK,cAAcx/H,EACvBigI,OAAQhsK,EAAEurK,cAAcr6H,GAGtB+6H,EAAQ,CACVv5H,KAAMzyC,EAAEirK,UAAUn/H,EAClBikF,IAAK/vH,EAAEirK,UAAUh6H,EACjByB,MAAO1yC,EAAEsrK,cAAcx/H,EACvBigI,OAAQ/rK,EAAEsrK,cAAcr6H,GAG5B,GAAI66H,EAAMr5H,MAAQu5H,EAAMt5H,OACpBs5H,EAAMv5H,MAAQq5H,EAAMp5H,OACpBo5H,EAAM/7C,KAAOi8C,EAAMD,QACnBC,EAAMj8C,KAAO+7C,EAAMC,OACnB,OAAO,GAAKN,WACR,IAAI,GAAMphK,KAAKqS,IAAIovJ,EAAMr5H,KAAMu5H,EAAMv5H,MAAOpoC,KAAKqS,IAAIovJ,EAAM/7C,IAAKi8C,EAAMj8C,MACtE,IAAI,GAAM1lH,KAAKC,IAAIwhK,EAAMp5H,MAAOs5H,EAAMt5H,OAAQroC,KAAKC,IAAIwhK,EAAMC,OAAQC,EAAMD,WAM5E,IAAA,GAAA,GC5Jf,MAAM,WAAuB,GACzB,YAAYzC,EAAS,GAAO37C,QACxB5lE,QAEAjnD,KAAKmrK,QAAU3C,EAGnB,QACI,OAAO,IAAI,GACPxoK,KAAKmrK,QAAQ90I,SAIrB,OAAO5Q,GACH,OAAOA,GACAA,EAAM0lJ,QAAQnB,OAAOhqK,KAAKmrK,SAGrC,UAAUngI,EAAGmF,GAIT,OAHAnwC,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa,GAAO/B,UAAUr+H,EAAGmF,IAE7DnwC,KAAKqrK,iBACErrK,KAGX,MAAM4oK,EAAQC,EAASD,EAAQ55H,EAAS,MACpC,IAAIi6H,EAAcj6H,EAclB,OAZIi6H,IACAA,EAAc,GAAMj+J,OAAOi+J,GAC3BjpK,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa,GAAO/B,UAAUJ,EAAYj+H,EAAGi+H,EAAY94H,KAGzFnwC,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa,GAAOvzH,MAAM+wH,EAAQC,IAE1DI,IACAjpK,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa,GAAO/B,WAAWJ,EAAYj+H,GAAIi+H,EAAY94H,KAG3FnwC,KAAKqrK,iBACErrK,KAGX,OAAO82C,EAAO9H,GACV,MAAMi6H,EAAc,GAAMj+J,OAAOgkC,IAAW,GAAMk6H,KAKlD,OAHAlpK,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa,GAAOjC,OAAOryH,EAAOmyH,EAAYj+H,EAAGi+H,EAAY94H,IAEzFnwC,KAAKqrK,iBACErrK,KAGX,SAASgpK,GACL,MAAMR,EAASO,GAASC,GAKxB,OAHAhpK,KAAKmrK,QAAUnrK,KAAKmrK,QAAQC,aAAa5C,GAEzCxoK,KAAKqrK,iBACErrK,KAGX,OAAOqL,GACH,OAAIA,GACArL,KAAKmrK,QAAU9/J,EACfrL,KAAKqrK,iBACErrK,MAGJA,KAAKmrK,QAGhB,iBACInrK,KAAKqnK,cAAc,CACfP,MAAO,YACPz7J,MAAOrL,QAKJ,IAAA,GAAA,GClFA,SAAS,GAAUwoK,GAC9B,OAAe,OAAXA,EACO,KAGPA,aAAkB,GACXA,EAGJ,IAAI,GAAeA,GCX9B,IAAI8C,GAAQ,EAEG,SAASC,KACpB,MAAO,OAASD,KCDL,SAASE,GAAengK,EAAOwnB,GAC1C,OAAOo0I,GAAQ57J,GAASA,EAAQwnB,ECDrB,SAAS44I,GAAcC,GAClC,MAAiB,KAAVA,GAA0B,OAAVA,GAA4B,SAAVA,GAA8B,gBAAVA,IAA4BzE,GAAQyE,GC4ItF,IAAA,GAvIf,cAAsB,GAClB,eACI,MAAO,OAGX,YAAYhsK,GACRunD,QAEAjnD,KAAK2rK,aAAajsK,GAGtB,aAAaA,EAAU,IACnB,MAAM,KAAEksK,EAAI,UAAE9zJ,GAAcpY,EAExBoY,IACApY,EAAQoY,UAAY,GAAgBA,IAGpC8zJ,IAASA,EAAKt9I,KACds9I,EAAKt9I,GAAKi9I,MAGdvrK,KAAKN,QAAU,IAAI,GAAaA,GAChCM,KAAKN,QAAQsnK,YAAYhnK,MAG7B,UAAUqL,GACN,IAAI47J,GAAQ57J,GAGR,OAAOrL,KAAKN,QAAQuhB,IAAI,aAFxBjhB,KAAKN,QAAQb,IAAI,YAAa,GAAgBwM,IAMtD,kBACI,IACIwgK,EADAp3H,EAAUz0C,KAGd,KAAOy0C,EAAQpuB,QAAQ,CACnBouB,EAAUA,EAAQpuB,OAClB,IAAI2iJ,EAAiBv0H,EAAQ38B,YACzBkxJ,IACA6C,EAAe7C,EAAeR,SAAS4C,aAAaS,GAAgB,GAAOh/C,SAInF,GAAIg/C,EACA,OAAO,GAAgBA,GAI/B,iBAAiBC,EAAkB9rK,KAAK8rK,mBACpC,MACMC,EAAgBhD,GADG/oK,KAAK8X,aAG9B,IACIk0J,EADAH,EAAe9C,GAAS+C,GAS5B,GALIE,EADAD,GAAiBF,EACAA,EAAaT,aAAaW,GAE1BA,GAAiBF,EAGlCG,EACA,OAAO,GAAgBA,GAI/B,QAAQ3gK,GACJ,OAAI47J,GAAQ57J,IACRrL,KAAKN,QAAQb,IAAI,UAAWwM,GACrBrL,OAG4B,IAAhCA,KAAKN,QAAQuhB,IAAI,WAG5B,KAAK5V,GACD,MAAM3L,EAAUM,KAAKN,QACrB,OAAIunK,GAAQ57J,IACJA,IAAUA,EAAMijB,KAChBjjB,EAAMijB,GAAKi9I,MAEf7rK,EAAQb,IAAI,OAAQwM,GACbrL,MAGJN,EAAQuhB,IAAI,QAGvB,QAAQ5V,GACJ,OAAI47J,GAAQ57J,IACRrL,KAAKN,QAAQb,IAAI,UAAWwM,GACrBrL,MAGJwrK,GAAexrK,KAAKN,QAAQuhB,IAAI,WAAY,GAGvD,YAAY+nJ,GACR,MAAMiD,EAAOjsK,KAAKksK,aAAalD,GAC/B,GAAIiD,EAAM,CACN,MAAML,EAAO5rK,KAAK4rK,OAClB,OAAOA,EAAO,GAAKO,UAAUF,EAAML,EAAKK,KAAKjD,IAAmBiD,GAIxE,cAAc7C,EAAO0C,GACjB,GAAI9rK,KAAKosK,UAAW,CAChB,MAAMt0J,EAAY9X,KAAKqsK,iBAAiBP,GACxC,IAAIQ,EAAmBlD,EAIvB,OAHItxJ,IACAw0J,EAAmBlD,EAAMgB,cAActyJ,EAAU0wJ,SAASpsI,WAEtDp8B,KAAKusK,YAAcvsK,KAAKwsK,eAAeF,IAAuBtsK,KAAKysK,WAAazsK,KAAK0sK,cAAgB1sK,KAAKysK,UAAUH,GAEhI,OAAO,EAGX,WACI,MAAMxuK,EAAOkC,KAAKN,QAAQ5B,KAC1B,OAAOA,IAAS2tK,GAAc3tK,EAAK4tK,OAGvC,aACI,MAAMiB,EAAS3sK,KAAKN,QAAQitK,OAC5B,OAAOA,GAAUA,EAAOv8H,MAAQ,IAAMq7H,GAAckB,EAAOjB,OAG/D,aAAa1C,GACT,OAAOhpK,KAAKisK,KAAKjD,KC3IV,SAAS4D,GAAqBl2H,EAAQm2H,EAAIC,EAAItE,GACzD,IAAIuE,EAAW,EACXC,EAAW,EASf,OAPIxE,IACAuE,EAAWxjK,KAAKuvC,MAAM0vH,EAAO1pK,EAAIguK,EAAItE,EAAOvpK,EAAI4tK,GAC/B,IAAbrE,EAAOtpK,IACP8tK,EAAWzjK,KAAKuvC,MAAM0vH,EAAOx6H,EAAI8+H,EAAItE,EAAOtpK,EAAI2tK,KAIjD,CACH7hI,EAAG+hI,EACH58H,EAAG68H,GCLX,MAAMC,GAAW1jK,KAAKwvC,GAAK,EAE3B,MAAM,WAAe,GAAc,GAAc,CAAE,YAC/C,YAAYrC,EAAS,IAAI,GAASw2H,EAAS,GACvCjmH,QAEAjnD,KAAKmtK,UAAUz2H,GACf12C,KAAKotK,UAAUF,GAGnB,UAAU7hK,GAGN,OAFArL,KAAKiqK,eAAe,SAAU,GAAMj/J,OAAOK,IAC3CrL,KAAK2nK,iBACE3nK,KAGX,YACI,OAAOA,KAAK02C,OAGhB,OAAOjxB,GACH,OAAOA,GACAA,EAAMixB,OAAOszH,OAAOhqK,KAAK02C,SACzBjxB,EAAMynJ,SAAWltK,KAAKktK,OAGjC,QACI,OAAO,IAAI,GAAOltK,KAAK02C,OAAOrgB,QAASr2B,KAAKktK,QAGhD,QAAQp2H,GACJ,OAAO92C,KAAKqtK,SAAShF,GAAIvxH,IAG7B,KAAK0xH,GACD,MAAM8E,EAAgBV,GAAqB5sK,EAAaA,KAAKktK,OAAQltK,KAAKktK,OAAQ1E,GAClF,IAAI+E,EAAW,GAAMC,WACjBA,EAAW,GAAMD,WAErB,IAAK,IAAI7sK,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,IAAI+sK,EAAgBztK,KAAKqtK,SAASC,EAActiI,EAAItqC,EAAIusK,IAAU7C,cAAc5B,GAC5EkF,EAAgB1tK,KAAKqtK,SAASC,EAAcn9H,EAAIzvC,EAAIusK,IAAU7C,cAAc5B,GAC5EmF,EAAe,IAAI,GAAMF,EAAcziI,EAAG0iI,EAAcv9H,GAE5Do9H,EAAW,GAAM/jK,IAAI+jK,EAAUI,GAC/BH,EAAW,GAAM5xJ,IAAI4xJ,EAAUG,GAGnC,OAAO,GAAKhD,WAAW4C,EAAUC,GAGrC,SAAS12H,GACL,MAAM,OAAEJ,EAAM,OAAEw2H,GAAWltK,KAE3B,OAAO,IAAI,GACP02C,EAAO1L,EAAIkiI,EAAS3jK,KAAKm/J,IAAI5xH,GAC7BJ,EAAOvG,EAAI+8H,EAAS3jK,KAAKo/J,IAAI7xH,IAIrC,cAAcsyH,GACV,MAAM,OAAE1yH,EAAM,OAAEw2H,GAAWltK,KAG3B,OAFiBuJ,KAAK0+J,IAAImB,EAAMp+H,EAAI0L,EAAO1L,EAAG,GAC1CzhC,KAAK0+J,IAAImB,EAAMj5H,EAAIuG,EAAOvG,EAAG,IAAM5mC,KAAK0+J,IAAIiF,EAAQ,GAI5D,UAAU9D,EAAOh5H,GACb,MAAM,OAAEsG,EAAM,OAAEw2H,GAAWltK,KACrB4tK,EAAgBl3H,EAAOm3H,WAAWzE,GAExC,OAAO8D,EAAS98H,GAASw9H,GAAiBA,GAAiBV,EAAS98H,GAI7D,IAAA,GAAA,GCnCA,GA5CGy3H,GAAS,cACTA,EACV,KAAK6D,EAAOoC,GACR,MAAMpuK,EAAUM,KAAKN,QAErB,GAAIunK,GAAQyE,GAAQ,CAChB,GAAIA,GARH,aAQYA,EAAMz5J,SAAuB,CACtC,MAAM87J,EAAU,CACZrC,MAAOA,GAEPzE,GAAQ6G,KACRC,EAAQD,QAAUA,GAEtBpuK,EAAQb,IAAI,OAAQkvK,QAEpBruK,EAAQb,IAAI,OAAQ6sK,GAGxB,OAAO1rK,KAGX,OAAON,EAAQuhB,IAAI,QAGvB,OAAOyqJ,EAAOt7H,EAAO09H,GACjB,OAAI7G,GAAQyE,IACR1rK,KAAKN,QAAQb,IAAI,eAAgB6sK,GAE7BzE,GAAQ72H,IACRpwC,KAAKN,QAAQb,IAAI,eAAgBuxC,GAGjC62H,GAAQ6G,IACR9tK,KAAKN,QAAQb,IAAI,iBAAkBivK,GAGhC9tK,MAGJA,KAAKN,QAAQuhB,IAAI,YCxCpC,MAAM+sJ,GAAuB,GAAOlF,SAAS/vJ,WAkC9B,IAAA,GAhCI8uJ,GAAS,cACVA,EACV,KAAKmB,GACD,MAAMgD,EAAiBjD,GAAS/oK,KAAKqsK,iBAAiBrD,IAChDiF,EAAajC,EAAiBA,EAAejzJ,WAAai1J,GAChE,IAAI/B,EAEAjsK,KAAKkuK,YAAcluK,KAAKmuK,cAAgBF,EACxChC,EAAOjsK,KAAKkuK,WAAW73I,SAEvB41I,EAAOjsK,KAAKouK,MAAMpC,GAClBhsK,KAAKkuK,WAAajC,EAAOA,EAAK51I,QAAU,KACxCr2B,KAAKmuK,YAAcF,GAGvB,MAAMI,EAAcruK,KAAKN,QAAQuhB,IAAI,gBAKrC,OAJIotJ,GAAepC,GACfA,EAAK3tK,OAAO+vK,EAAc,GAGvBpC,EAGX,wBACWjsK,KAAKkuK,WACZluK,KAAK6qI,QAAQ,iBAAkB,CAC3Bp2F,QAASz0C,SC7BzB,SAASsuK,GAAiB7jK,GACtB,MAAM+8J,EAAY,IAAM/8J,EACxB,OAAO,SAASY,GACZ,OAAI47J,GAAQ57J,IACRrL,KAAKiqK,eAAezC,EAAWn8J,GAC/BrL,KAAK2nK,iBACE3nK,MAGJA,KAAKwnK,IAiBL,IAAA,GAPM,CAACK,EAAOvb,EAAQ,CAAE,eACnC,MAAM5kJ,EAAS,cAAcmgK,IAG7B,OAVJ,SAAiCt1I,EAAI+5H,GACjC,IAAK,IAAI5rJ,EAAI,EAAGA,EAAI4rJ,EAAMxrJ,OAAQJ,IAC9B6xB,EAAG+5H,EAAM5rJ,IAAM4tK,GAAiBhiB,EAAM5rJ,IAF9C,CAQ4BgH,EAAOzG,UAAWqrJ,GAEnC5kJ,GChBX,MAAM,WAAe,GAAU,GAAW,GAAa,OACnD,eACI,MAAO,SAGX,YAAY6mK,EAAW,IAAI,GAAkB7uK,EAAU,IACnDunD,MAAMvnD,GAENM,KAAKuuK,SAASA,GAETtH,GAAQjnK,KAAKN,QAAQitK,SACtB3sK,KAAK2sK,OAbM,QAiBnB,UACI,OAAO3sK,KAAKwuK,UAAUvC,OAG1B,MAAMzD,GACF,OAAOxoK,KAAKwuK,UAAUvC,KAAKzD,GAG/B,eAAeY,GACX,OAAOppK,KAAKuuK,WAAWxD,cAAc3B,GAGzC,UAAUA,GACN,OAAOppK,KAAKuuK,WAAW9B,UAAUrD,EAAOppK,KAAKN,QAAQitK,OAAOv8H,MAAQ,IAI7D,IAAA,GAAA,GCvCA,SAASq+H,GAAIC,GACxB,OAAOA,EAAUxG,GCCN,SAAS,GAAMjpK,EAAGC,EAAGyvK,ECJlB,IDKd,OAA6C,IAAtC5vI,GAAMx1B,KAAK+mC,IAAIrxC,EAAIC,GAAIyvK,GEHnB,SAASC,GAAY3vK,EAAGC,EAAGyvK,GACtC,OAAO1vK,EAAIC,GAAK,GAAMD,EAAGC,EAAGyvK,GCWhC,MACM,GAAMplK,KAAK0+J,IACX4G,GAAY,CAAE,UAAW,UAAW,aAAc,WAAY,iBAEpE,MAAM,WAAY,GAAc,GAAcA,KAC1C,YAAYn4H,EAAS,IAAI,GAASh3C,EAAU,IACxCunD,QAEAjnD,KAAKmtK,UAAUz2H,GAEf12C,KAAK8uK,QAAUpvK,EAAQovK,QACvB9uK,KAAK+uK,QAAUrvK,EAAQqvK,SAAWrvK,EAAQovK,QAC1C9uK,KAAKgvK,WAAatvK,EAAQsvK,WAC1BhvK,KAAKivK,SAAWvvK,EAAQuvK,SACxBjvK,KAAKkvK,cAAgBxvK,EAAQwvK,gBAAiB,EAC9ClvK,KAAKmvK,UAAYzvK,EAAQyvK,UAG7B,QACI,OAAO,IAAI,GAAInvK,KAAK02C,OAAQ,CACxBo4H,QAAS9uK,KAAK8uK,QACdC,QAAS/uK,KAAK+uK,QACdC,WAAYhvK,KAAKgvK,WACjBC,SAAUjvK,KAAKivK,SACfC,cAAelvK,KAAKkvK,gBAI5B,UAAU7jK,GAGN,OAFArL,KAAKiqK,eAAe,SAAU,GAAMj/J,OAAOK,IAC3CrL,KAAK2nK,iBACE3nK,KAGX,YACI,OAAOA,KAAK02C,OAGhB,QAAQI,GACJ,MAAMJ,EAAS12C,KAAK02C,OACd04H,EAAS/G,GAAIvxH,GAEnB,OAAO,IAAI,GACPJ,EAAO1L,EAAIhrC,KAAK8uK,QAAUvlK,KAAKm/J,IAAI0G,GACnC14H,EAAOvG,EAAInwC,KAAK+uK,QAAUxlK,KAAKo/J,IAAIyG,IAI3C,cACI,MAAMJ,EAAahvK,KAAKgvK,WAClBhlK,EAAMhK,KAAKkvK,eAAiB,EAAI,EAChCG,EAAc,CAAErvK,KAAKsvK,QAAQN,IAC7B1sH,EAAWtiD,KAAKuvK,eAChBC,EAAgBltH,EAAS2sH,SAAW3sH,EAAS0sH,WAC7CS,EAAoBlmK,KAAKyR,KAAKw0J,EAtDvB,IAuDPE,EAAmBF,EAAgBC,EACzC,IACIzG,EADA2G,EAAeX,EAEfhvK,KAAKmvK,YACLnG,EAAiB,KAAYG,OAAOnpK,KAAKmvK,UAAWnvK,KAAK02C,SAG7D,IAAK,IAAIh2C,EAAI,EAAGA,GAAK+uK,EAAmB/uK,IAAK,CACzC,MAAMkvK,EAAYD,EAAe3lK,EAAM0lK,EACjCG,EAAS7vK,KAAK8vK,qBAAqBH,EAAcC,EAAW5G,GAElEqG,EAAYhsK,KAAKwsK,EAAOE,IAAKF,EAAOG,IAAKH,EAAOj3H,IAChD+2H,EAAeC,EAGnB,OAAOP,EAGX,KAAK7G,GACD,MAAMlmH,EAAWtiD,KAAKuvK,eAChBP,EAAa1sH,EAAS0sH,WACtBC,EAAW3sH,EAAS2sH,SACpB3B,EAAgBV,GAAqB5sK,EAAaA,KAAK8uK,QAAS9uK,KAAK+uK,QAASvG,GAC9EuE,EAAW0B,GAAInB,EAActiI,GAC7BgiI,EAAWyB,GAAInB,EAAcn9H,GAC7B8/H,EAAWjwK,KAAKsvK,QAAQL,GAAU7E,cAAc5B,GACtD,IAAI0H,EAAgBC,GAAepD,EAAUiC,GACzCoB,EAAgBD,GAAenD,EAAUgC,GACzCrB,EAAe3tK,KAAKsvK,QAAQN,GAAY5E,cAAc5B,GACtD+E,EAAW,GAAM/jK,IAAImkK,EAAcsC,GACnCzC,EAAW,GAAM5xJ,IAAI+xJ,EAAcsC,GAEvC,KAAOC,EAAgBjB,GAAYmB,EAAgBnB,GAAU,CACzD,IAAIxB,EAMAC,EALAwC,EAAgBjB,IAChBxB,EAAgBztK,KAAKsvK,QAAQY,GAAe9F,cAAc5B,GAC1D0H,GAAiB,IAIjBE,EAAgBnB,IAChBvB,EAAgB1tK,KAAKsvK,QAAQc,GAAehG,cAAc5B,GAC1D4H,GAAiB,IAGrBzC,EAAe,IAAI,GAAMF,EAAcziI,EAAG0iI,EAAcv9H,GACxDo9H,EAAW,GAAM/jK,IAAI+jK,EAAUI,GAC/BH,EAAW,GAAM5xJ,IAAI4xJ,EAAUG,GAGnC,OAAO,GAAKhD,WAAW4C,EAAUC,GAGrC,eACI,IAAI,WAAEwB,EAAU,SAAEC,EAAQ,cAAEC,GAAkBlvK,KAE9C,GAAIkvK,EAAe,CACf,IAAImB,EAAWrB,EACfA,EAAaC,EACbA,EAAWoB,EAOf,OAJIrB,EAAaC,GAAaC,GAAiBF,IAAeC,KAC1DA,GAAY,KAGT,CACHD,WAAYA,EACZC,SAAUA,GAIlB,qBAAqBD,EAAYC,EAAUjG,GACvC,MAAMrwH,EAAK34C,KAAKsvK,QAAQN,GAClBp2H,EAAK54C,KAAKsvK,QAAQL,GAClBqB,EAAetwK,KAAKuwK,cAAcvB,GAClCwB,EAAexwK,KAAKuwK,cAActB,GAClC9vK,GAAKkpK,GAAI4G,GAAY5G,GAAI2G,IAAe,EACxCe,EAAM,IAAI,GAAMp3H,EAAG3N,EAAI7rC,EAAImxK,EAAatlI,EAAG2N,EAAGxI,EAAIhxC,EAAImxK,EAAangI,GACnE6/H,EAAM,IAAI,GAAMp3H,EAAG5N,EAAI7rC,EAAIqxK,EAAaxlI,EAAG4N,EAAGzI,EAAIhxC,EAAIqxK,EAAargI,GAQzE,OAPI64H,IACArwH,EAAG7gC,UAAUkxJ,GACbpwH,EAAG9gC,UAAUkxJ,GACb+G,EAAIj4J,UAAUkxJ,GACdgH,EAAIl4J,UAAUkxJ,IAGX,CACHrwH,GAAIA,EACJo3H,IAAKA,EACLC,IAAKA,EACLp3H,GAAIA,GAIZ,cAAc9B,GACV,MAAMs4H,EAAS/G,GAAIvxH,GAEnB,OAAO,IAAI,IAAO92C,KAAK8uK,QAAUvlK,KAAKo/J,IAAIyG,GAASpvK,KAAK+uK,QAAUxlK,KAAKm/J,IAAI0G,IAG/E,cAAchG,GACV,MAAM9mH,EAAWtiD,KAAKuvK,eAChBC,EAAgBltH,EAAS2sH,SAAW3sH,EAAS0sH,YAC7C,OAAEt4H,EAAM,QAAEo4H,EAAO,QAAEC,GAAY/uK,KAC/Bg3C,EAAWN,EAAOm3H,WAAWzE,GAC7BqH,EAAWlnK,KAAKuvC,MAAMswH,EAAMj5H,EAAIuG,EAAOvG,EAAGi5H,EAAMp+H,EAAI0L,EAAO1L,GAC3D0lI,EAAe5B,EAAUC,EAC3BxlK,KAAKsvC,KAAK,GAAIi2H,EAAS,GAAK,GAAIvlK,KAAKo/J,IAAI8H,GAAW,GAAK,GAAI1B,EAAS,GAAK,GAAIxlK,KAAKm/J,IAAI+H,GAAW,IACjGE,EAAa3wK,KAAKsvK,QAAQtvK,KAAKgvK,YAAYjwI,MFlLvC,IEmLJkxI,EAAWjwK,KAAKsvK,QAAQtvK,KAAKivK,UAAUlwI,MFnLnC,IEoLJnI,EClLC,SAA0Bg6I,EAAIj4H,EAAIC,EAAIi4H,GACjD,MAAMC,EAAMn4H,EAAG3N,EAAI4lI,EAAG5lI,EAChB+lI,EAAMF,EAAG7lI,EAAI4N,EAAG5N,EAChBgmI,EAAMr4H,EAAGxI,EAAIygI,EAAGzgI,EAChB8gI,EAAMJ,EAAG1gI,EAAIyI,EAAGzI,EAChB+gI,EAAKN,EAAG5lI,EAAI4N,EAAG5N,EACfmmI,EAAKP,EAAGzgI,EAAIyI,EAAGzI,EACfnC,EAAI8iI,EAAMG,EAAMF,EAAMC,EACtBtvK,GAAKovK,EAAMK,EAAKH,EAAME,GAAMljI,EAC5B7uC,GAAK4xK,EAAMI,EAAKF,EAAMC,GAAMljI,EAElC,GAAItsC,GAAK,GAAKA,GAAK,GAAKvC,GAAK,GAAKA,GAAK,EACnC,OAAO,IAAI,GAAMyxK,EAAG5lI,EAAI7rC,EAAI2xK,EAAKF,EAAGzgI,EAAIhxC,EAAI6xK,GAZrC,CDkL+Bt6H,EAAQ0yH,EAAMrqI,MFpL1C,IEoL4D4xI,EAAYV,GAClF,IAAIlF,EAEJ,GAAIyE,EAAgB,IAChBzE,EAAgBn0I,GAAgBg4I,GAAYl4H,EAAOm3H,WAAWj3I,GAAeogB,IAAa43H,GAAY53H,EAAU05H,OAC7G,CACH,IAAI55H,EAAQs6H,GAAe16H,EAAO1L,EAAG0L,EAAOvG,EAAG2+H,EAASC,EAAS3F,EAAMp+H,EAAGo+H,EAAMj5H,GAClE,MAAV2G,IACAA,GAAS,IAAMA,GAAS,KAG5B,IAAIu6H,EAAe/uH,EAAS0sH,YAAcl4H,GAASA,GAASwL,EAAS2sH,SACrElE,EAAiBsG,GAAgBzC,GAAY53H,EAAU05H,KAAmBW,KAAkBz6I,GAAgBA,EAAaozI,OAAOZ,IAEpI,OAAO2B,EAGX,UAAU3B,EAAOh5H,GACb,MAAMkS,EAAWtiD,KAAKuvK,eAChB74H,EAAS12C,KAAK02C,OACpB,IAAII,EAAQs6H,GAAe16H,EAAO1L,EAAG0L,EAAOvG,EAAGnwC,KAAK8uK,QAAS9uK,KAAK+uK,QAAS3F,EAAMp+H,EAAGo+H,EAAMj5H,GAO1F,OANc,MAAV2G,IACAA,GAAS,IAAMA,GAAS,KAGPwL,EAAS0sH,YAAcl4H,GAASA,GAASwL,EAAS2sH,UAEhDjvK,KAAKsvK,QAAQx4H,GAAO+2H,WAAWzE,IAAUh5H,EAGpE,kBAAkB7sC,EAAO8D,EAAKwlK,EAAIC,EAAIwE,EAAUC,EAAOz5H,GACnD,MAAM05H,EA8Bd,SAAgC5jH,GAC5B,IAAI,GAAE6jH,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAE/E,EAAE,GAAEC,EAAE,SAAEwE,EAAQ,MAAEC,EAAK,SAAEz5H,EAAW,GAAM8V,EAEhE,MAAM8gH,EAAUrG,GAAIvwH,GACd+5H,EAAStoK,KAAKm/J,IAAIgG,GAClBoD,EAAOvoK,KAAKo/J,IAAI+F,GAEhBqD,EAAKF,GAAUJ,EAAKE,GAAM,EAAIG,GAAQJ,EAAKE,GAAM,EACjDI,GAAMF,GAAQL,EAAKE,GAAM,EAAIE,GAAUH,EAAKE,GAAM,EAElDK,EAAOX,IAAaC,EAAQ,GAAK,EAEjCW,EAAM3oK,KAAK0+J,IAAI8J,EAAI,GACnBI,EAAM5oK,KAAK0+J,IAAI+J,EAAI,GACzB,IAAII,EAAM7oK,KAAK0+J,IAAI4E,EAAI,GACnBwF,EAAM9oK,KAAK0+J,IAAI6E,EAAI,GAEnBx8F,EAAQ4hG,EAAME,EAAMD,EAAME,EAE1B/hG,EAAQ,IACRA,EAAQ/mE,KAAKsvC,KAAKq5H,EAAME,EAAMD,EAAME,GACpCxF,GAAKv8F,EACL8hG,EAAM7oK,KAAK0+J,IAAI4E,EAAI,GAEnBC,GAAKx8F,EACL+hG,EAAM9oK,KAAK0+J,IAAI6E,EAAI,IAGvB,IAAIwF,EAASL,EAAO1oK,KAAKsvC,MAAMu5H,EAAMC,EAAMD,EAAMD,EAAME,EAAMH,IAAQE,EAAMD,EAAME,EAAMH,IAEnFltI,MAAMstI,KACNA,EAAS,GAGb,MAAMC,EAAMD,GAAUzF,EAAKmF,GAAMlF,EAC3B0F,EAAkB1F,EAAKiF,GAAfO,EAAqBzF,EAE7B4F,EAAKZ,EAASU,EAAMT,EAAOU,GAAOf,EAAKE,GAAM,EAC7Ce,EAAKZ,EAAOS,EAAMV,EAASW,GAAOd,EAAKE,GAAM,EAG7Ce,GAAMZ,EAAKQ,GAAO1F,EAClB+F,GAAMZ,EAAKQ,GAAO1F,EAClB+F,IAAOd,EAAKQ,GAAO1F,EACnBiG,IAAOd,EAAKQ,GAAO1F,EAEnBkC,GAAc4D,GAAM,EAAI,GAAK,GAAKnE,GAAIllK,KAAKwpK,KAAKJ,EAAKppK,KAAKsvC,KAAK85H,EAAKA,EAAKC,EAAKA,KAE9EI,EAAcj0I,IAAO4zI,EAAKE,EAAKD,EAAKE,IAAOvpK,KAAKsvC,KAAK85H,EAAKA,EAAKC,EAAKA,GAAMrpK,KAAKsvC,KAAKg6H,EAAKA,EAAKC,EAAKA,IAAM,IAC/G,IAAIh8H,GAAS67H,EAAKG,EAAKF,EAAKC,GAAM,EAAI,GAAK,GAAKpE,GAAIllK,KAAKwpK,KAAKC,KAEzDzB,GAASz6H,EAAQ,IAClBA,GAAS,KAGTy6H,GAASz6H,EAAQ,IACjBA,GAAS,KAEb,IAAIm4H,EAAWD,EAAal4H,EAC5B,MAAMm8H,EAAehE,GAAY,EAAI,GAAK,EAG1C,OAFAA,EAAY1lK,KAAK+mC,IAAI2+H,GAAY,IAAOgE,EAEjC,CACHv8H,OAAQ,IAAI,GAAM+7H,EAAIC,GACtB1D,WAAYA,EACZC,SAAUA,EACVH,QAASjC,EACTkC,QAASjC,EACTqC,UAAWr3H,GApEnB,CA9BqD,CACzC25H,GAAIluK,EAAMynC,EACV0mI,GAAInuK,EAAM4sC,EACVwhI,GAAItqK,EAAI2jC,EACR4mI,GAAIvqK,EAAI8oC,EACR08H,GAAIA,EACJC,GAAIA,EACJwE,SAAUA,EACVC,MAAOA,EACPz5H,SAAUA,IAGd,OAAO,IAAI,GAAI05H,EAAc96H,OAAQ,CACjCs4H,WAAYwC,EAAcxC,WAC1BC,SAAUuC,EAAcvC,SACxBH,QAAS0C,EAAc1C,QACvBC,QAASyC,EAAczC,QACvBI,UAAWqC,EAAcrC,UACzBD,cAAyB,IAAVqC,KAK3B,SAASH,GAAeqB,EAAIC,EAAI7F,EAAIC,EAAI9hI,EAAGmF,GACvC,MAAMu4H,EAAM3pI,IAAOiM,EAAIynI,GAAM5F,EAAI,GAC3BlE,EAAM5pI,IAAOoR,EAAIuiI,GAAM5F,EAAI,GAEjC,OAAO/tI,GAAM0vI,GAAIllK,KAAKuvC,MAAM6vH,EAAKD,KA2ErC,SAASyH,GAAer5H,EAAOvzC,GAC3B,IAAIyrK,EAAal4H,EAEjB,KAAOk4H,EAAazrK,GAChByrK,GAAc,GAGlB,OAAOA,EAGI,IAAA,GAAA,GEjUf,MAAM3rK,GAAO,GAAGA,KACVK,GAAM,GAAGA,IACTsW,GAAS,GAAGA,OACZ+1B,GAAQ,GAAGA,MACX7rC,GAAQ,GAAGA,MACXwyE,GAAU,GAAGA,QAuHJ,IAAA,GArHf,cAA4B,GACxB,YAAY9iE,EAAQ,IAChBqzC,QAEAjnD,KAAKc,OAAS,EACdd,KAAKkzK,QAAQ,EAAGt/J,EAAM9S,OAAQ8S,GAGlC,SAASvI,GACL,OAAIA,GACArL,KAAKkzK,QAAQ,EAAGlzK,KAAKc,OAAQuK,GAE7BrL,KAAKmzK,UACEnzK,MAGJA,KAAKkE,MAAM,GAGtB,OACI,MAAMkvK,EAAW9qK,UACXZ,EAASrE,GAAKiQ,MAAMtT,KAAMozK,GAIhC,OAFApzK,KAAKqzK,KAAKD,GAEH1rK,EAGX,QACI,OAAOxD,GAAMwP,KAAK1T,MAGtB,MACI,MAAMc,EAASd,KAAKc,OACd4G,EAAShE,GAAI4P,MAAMtT,MAMzB,OAJIc,GACAd,KAAKu6F,QAAQ,CAAE7yF,IAGZA,EAGX,OAAOsM,EAAOs/J,GACV,MAAMF,EAAWlvK,GAAMwP,KAAKpL,UAAW,GACjCZ,EAAS1H,KAAKkzK,QAAQl/J,EAAOs/J,EAASF,GAI5C,OAFApzK,KAAKmzK,UAEEzrK,EAGX,QACI,MAAM5G,EAASd,KAAKc,OACd4G,EAASqoC,GAAMz8B,MAAMtT,MAM3B,OAJIc,GACAd,KAAKu6F,QAAQ,CAAE7yF,IAGZA,EAGX,UACI,MAAM0rK,EAAW9qK,UACXZ,EAASgvE,GAAQpjE,MAAMtT,KAAMozK,GAInC,OAFApzK,KAAKqzK,KAAKD,GAEH1rK,EAGX,QAAQ+sC,GACJ,MAAM3zC,EAASd,KAAKc,OAEpB,IAAK,IAAIosC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5B,GAAIltC,KAAKktC,KAASuH,EACd,OAAOvH,EAGf,OAAQ,EAGZ,QAAQl5B,EAAOs/J,EAASF,GACpB,MAAM1rK,EAASsS,GAAO1G,MAAMtT,KAAM,CAAEgU,EAAOs/J,GAAU3pK,OAAOypK,IAK5D,OAHApzK,KAAKuzK,eAAe7rK,GACpB1H,KAAKwzK,aAAaJ,GAEX1rK,EAGX,KAAK0rK,GACDpzK,KAAKwzK,aAAaJ,GAClBpzK,KAAKmzK,UAGT,QAAQC,GACJpzK,KAAKuzK,eAAeH,GACpBpzK,KAAKmzK,UAGT,aAAaC,GACT,IAAK,IAAIlmI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IACrCkmI,EAASlmI,GAAK85H,YAAYhnK,MAIlC,eAAeozK,GACX,IAAK,IAAIlmI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IACrCkmI,EAASlmI,GAAK65H,eAAe/mK,MAIrC,aCnHW,GANf,cAAoC,GAChC,UACIA,KAAK2nK,mBCDE,SAAS8L,GAAgBxD,EAAUyD,EAActK,GAC5D,MAAMtyH,EAAQ23H,GAAIllK,KAAKuvC,MAAM46H,EAAavjI,EAAI8/H,EAAS9/H,EAAGujI,EAAa1oI,EAAIilI,EAASjlI,IAGpF,OAFqBo+H,EAAMgB,cAAc,KAAYjB,QAAQryH,EAAOm5H,IAEhDjlI,EAAIilI,EAASjlI,ECPtB,SAAS2oI,GAAiBx0K,EAAG2nK,EAAO+I,GAC/C,MAAM+D,EAAK,EAAIz0K,EACf,OAAOoK,KAAK0+J,IAAI2L,EAAI,GAAK/D,EAAO,GAAG/I,GAC/B,EAAIv9J,KAAK0+J,IAAI2L,EAAI,GAAKz0K,EAAI0wK,EAAO,GAAG/I,GACpC,EAAIv9J,KAAK0+J,IAAI9oK,EAAG,GAAKy0K,EAAK/D,EAAO,GAAG/I,GACpCv9J,KAAK0+J,IAAI9oK,EAAG,GAAK0wK,EAAO,GAAG/I,GCLpB,SAAS+M,GAAkBhE,EAAQ/I,GAC9C,MAAO,CAAsB,EAAI+I,EAAO,GAAG/I,GAAjC+I,EAAO,GAAG/I,GAAgC,EAAI+I,EAAO,GAAG/I,GAAS+I,EAAO,GAAG/I,GACjF,GAAK+I,EAAO,GAAG/I,GAAS,EAAI+I,EAAO,GAAG/I,GAAS+I,EAAO,GAAG/I,IACzD,IAAM+I,EAAO,GAAG/I,GAAS+I,EAAO,GAAG/I,IACnC+I,EAAO,GAAG/I,ICAlB,MAAM,WAAsB,GAExB,YAAYgN,EAAO,EAAGC,EAAM,GACxB9sH,QAEAjnD,KAAK8zK,KAAOA,EACZ9zK,KAAK+zK,IAAMA,EAGf,IAAIC,GACA,OAAO,IAAI,GAAcj1I,GAAM/+B,KAAK8zK,KAAOE,EAAQF,KTdzC,ISc2D/0I,GAAM/+B,KAAK+zK,IAAMC,EAAQD,ITdpF,KSiBd,YAAY1oK,GACR,OAAO,IAAI,GAAcrL,KAAK8zK,KAAOzoK,EAAOrL,KAAK+zK,KAGrD,SACI,OAAO,IAAI,IAAe/zK,KAAK8zK,MAAO9zK,KAAK+zK,KAG/C,SAASC,GACL,OAAO,IAAI,GAAch0K,KAAK8zK,KAAOE,EAAQF,KAAO9zK,KAAK+zK,IAAMC,EAAQD,IACnE/zK,KAAK8zK,KAAOE,EAAQD,IAAM/zK,KAAK+zK,IAAMC,EAAQF,MAGrD,iBAAiBzoK,GACb,OAAO,IAAI,GAAcrL,KAAK8zK,KAAOzoK,EAAOrL,KAAK+zK,IAAM1oK,GAG3D,QAAQ7G,GACJ,MAAM6jK,EAAM9+J,KAAKuvC,MAAM94C,KAAK+zK,IAAK/zK,KAAK8zK,MAChCviI,EAAIhoC,KAAKsvC,KAAKtvC,KAAK0+J,IAAIjoK,KAAK+zK,IAAK,GAAKxqK,KAAK0+J,IAAIjoK,KAAK8zK,KAAM,IAC1DG,EAAO1qK,KAAK0+J,IAAI12H,EAAG,EAAI/sC,GAE7B,OAAO,IAAI,GAAcyvK,EAAO1qK,KAAKm/J,IAAIL,EAAM7jK,GAAIyvK,EAAO1qK,KAAKo/J,IAAIN,EAAM7jK,IAG7E,OAAOwvK,GACH,OAAOh0K,KAAK8zK,OAASE,EAAQF,MAAQ9zK,KAAK+zK,MAAQC,EAAQD,IAG9D,SACI,OAAoB,IAAb/zK,KAAK+zK,KAIL,IAAA,GAAA,GC/Cf,SAASG,GAAWlpI,GAChB,OAAOA,EAAI,GAAK,EAAI,EAYT,SAASmpI,GAAmBl1K,EAAGC,EAAGJ,EAAGkvC,GAChD,GAAU,IAAN/uC,EACA,OAXR,SAAgCA,EAAGC,EAAGJ,GAClC,MAAMs1K,EAAa7qK,KAAKsvC,KAAKtvC,KAAK0+J,IAAI/oK,EAAG,GAAK,EAAID,EAAIH,GACtD,MAAO,GACDI,EAAIk1K,IAAe,EAAIn1K,KACvBC,EAAIk1K,IAAe,EAAIn1K,IAJjC,CAWsCC,EAAGJ,EAAGkvC,GAGxC,MAAMxuC,GAAK,EAAIP,EAAIH,EAAIyK,KAAK0+J,IAAI/oK,EAAG,KAAO,EAAIqK,KAAK0+J,IAAIhpK,EAAG,IACpDs0J,GAAK,EAAIhqJ,KAAK0+J,IAAI/oK,EAAG,GAAK,EAAID,EAAIC,EAAIJ,EAAI,GAAKyK,KAAK0+J,IAAIhpK,EAAG,GAAK+uC,IAAM,GAAKzkC,KAAK0+J,IAAIhpK,EAAG,IACvFo1K,EAAI9qK,KAAK0+J,IAAIzoK,EAAI,EAAG,GAAK+J,KAAK0+J,IAAI1U,EAAI,EAAG,GACzC7yJ,EAAI,IAAI,GAAc,EAAE,GACxB4zK,GAAOp1K,GAAK,EAAID,GACtB,IAAIwyK,EAAIE,EAAID,EAAIE,EAAI2C,EAAIC,EAAIC,EAExBJ,EAAI,GACJ5C,EAAK,IAAI,IAAele,EAAI,EAAGhqJ,KAAKsvC,MAAMw7H,IAAIK,QAAQ,GACtD/C,EAAK,IAAI,IAAepe,EAAI,GAAKhqJ,KAAKsvC,MAAMw7H,IAAIK,QAAQ,KAExDjD,GAAMle,EAAI,EAAIhqJ,KAAKsvC,KAAKw7H,GACxB5C,EAAK,IAAI,GAAcyC,GAAWzC,GAAMloK,KAAK0+J,IAAI1+J,KAAK+mC,IAAImhI,GAAK,EAAI,IACnEE,GAAMpe,EAAI,EAAIhqJ,KAAKsvC,KAAKw7H,GACxB1C,EAAK,IAAI,GAAcuC,GAAWvC,GAAMpoK,KAAK0+J,IAAI1+J,KAAK+mC,IAAIqhI,GAAK,EAAI,KAGvED,EAAKD,EAAGvyJ,IAAIyyJ,GAEZ6C,EAAK/C,EAAGvyJ,IAAIyyJ,GAAIgD,kBAAiB,IACjCF,EAAKhD,EAAGvyJ,IAAIyyJ,EAAGxxK,UAAUw0K,iBAAiBprK,KAAKsvC,KAAK,GAAK,GAEzD+4H,EAAK4C,EAAGt1J,IAAIxe,EAAEk+B,SAAS61I,IACvBF,EAAKC,EAAGt1J,IAAIxe,EAAEP,SAASy+B,SAAS61I,IAEhC,MAAM/sK,EAAS,GAYf,OAVIgqK,EAAGkD,UACHltK,EAAOrE,KAAK07B,GAAM2yI,EAAGoC,KAAOQ,EVlDlB,KUoDV1C,EAAGgD,UACHltK,EAAOrE,KAAK07B,GAAM6yI,EAAGkC,KAAOQ,EVrDlB,KUuDVC,EAAGK,UACHltK,EAAOrE,KAAK07B,GAAMw1I,EAAGT,KAAOQ,EVxDlB,KU2DP5sK,ECvDI,SAASmtK,GAAgBhF,EAAQzG,EAAOtC,EAAOgO,EAAWz2I,GACrE,MAAM02I,EAAalB,GAAkBhE,EAAQiF,GACvCE,EAAQb,GAAmBY,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAK3L,EAAM0L,IACpG,IAAIl+I,EAEJ,IAAK,IAAIsW,EAAM,EAAGA,EAAM8nI,EAAMl0K,OAAQosC,IAClC,GAAI,GAAK8nI,EAAM9nI,IAAQ8nI,EAAM9nI,IAAQ,IACjCtW,EAAe+8I,GAAiBqB,EAAM9nI,GAAM45H,EAAO+I,GAC/CtmK,KAAK+mC,IAAI1Z,EAAewyI,EAAMtC,KAAWzoI,GACzC,OAAO,ECbR,SAAS42I,GAAuBh2K,EAAGC,EAAGkqK,GACjD,IAAI8L,EACJ,GAAIj2K,EAAE+rC,IAAM9rC,EAAE8rC,EAAG,CACb,MAAMy+H,EAAOlgK,KAAKC,IAAIvK,EAAE+rC,EAAG9rC,EAAE8rC,GACvB2+H,EAAOpgK,KAAKqS,IAAI3c,EAAE+rC,EAAG9rC,EAAE8rC,GACvB0+H,EAAOngK,KAAKC,IAAIvK,EAAEkxC,EAAGjxC,EAAEixC,GACvBy5H,EAAOrgK,KAAKqS,IAAI3c,EAAEkxC,EAAGjxC,EAAEixC,GACvB3L,EAAUilI,GAAQL,EAAMp+H,GAAKo+H,EAAMp+H,EAAI2+H,EAGzCuL,EADAxL,IAASE,EACIR,EAAMj5H,GAAKu5H,GAAQllI,EAEnBA,IAAcolI,EAAOF,KAAUzqK,EAAE+rC,EAAI9rC,EAAE8rC,IAAM/rC,EAAEkxC,EAAIjxC,EAAEixC,GAAK,EAAIi5H,EAAMp+H,EAAIy+H,EAAOE,EAAOP,EAAMp+H,IAAO2+H,EAAOF,GAAQC,EAAON,EAAMj5H,GAAM,EAI1J,OAAO+kI,EAAa,EAAI,ECb5B,SAASC,GAAc1qK,GACnB,MAAM+8J,EAAY,IAAM/8J,EACxB,OAAO,SAASY,GACZ,OAAI47J,GAAQ57J,IACRrL,KAAKiqK,eAAezC,EAAW,GAAMx8J,OAAOK,IAC5CrL,KAAK2nK,iBACE3nK,MAGJA,KAAKwnK,IAiBL,IAAA,GAPI,CAACK,EAAOvb,KACvB,MAAM5kJ,EAAS,cAAcmgK,IAG7B,OAVJ,SAA8Bt1I,EAAI+5H,GAC9B,IAAK,IAAI5rJ,EAAI,EAAGA,EAAI4rJ,EAAMxrJ,OAAQJ,IAC9B6xB,EAAG+5H,EAAM5rJ,IAAMy0K,GAAc7oB,EAAM5rJ,IAF3C,CAQyBgH,EAAOzG,UAAWqrJ,GAEhC5kJ,GCbX,MAAM,GAAS,CAAE,SAAU,YAAa,cAExC,MAAM,WAAgB,GAAW,GAAc,KAC3C,YAAYuzE,EAAQm6F,EAAWC,GAC3BpuH,QAEAjnD,KAAKi7E,OAAOA,GAAU,IAAI,IAC1Bj7E,KAAKo1K,UAAUA,GACfp1K,KAAKq1K,WAAWA,GAGpB,OAAOC,EAAW9M,GACd,MAAM+M,EAAgBv1K,KAAKi7E,SAASmvF,cAAc5B,GAC5CgN,EAAkBF,EAAUr6F,SAASmvF,cAAc5B,GACzD,IAAI15C,EAWJ,OARIA,EADA9uH,KAAKq1K,cAAgBC,EAAUF,YACxBp1K,KAAKy1K,kBACRF,EAAev1K,KAAKq1K,aAAajL,cAAc5B,GAC/C8M,EAAUF,YAAYhL,cAAc5B,GAASgN,GAG1Cx1K,KAAK01K,iBAAiBH,EAAeC,GAGzC1mD,EAGX,iBAAiBn2E,EAAIC,GACjB,OAAO,GAAK+xH,WAAWhyH,EAAIC,GAG/B,kBAAkBD,EAAIo3H,EAAKC,EAAKp3H,GAC5B,MAAMi3H,EAAS,CAAEl3H,EAAIo3H,EAAKC,EAAKp3H,GACzB+8H,EAAY31K,KAAK41K,kBAAkB/F,EAAQ,KAC3CgG,EAAY71K,KAAK41K,kBAAkB/F,EAAQ,KAC3CiG,EAAUC,GAAY,CAAEJ,EAAUnsK,IAAKmsK,EAAU/5J,IAAK+8B,EAAG3N,EAAG4N,EAAG5N,IAC/DgrI,EAAUD,GAAY,CAAEF,EAAUrsK,IAAKqsK,EAAUj6J,IAAK+8B,EAAGxI,EAAGyI,EAAGzI,IAErE,OAAO,GAAKw6H,WAAW,IAAI,GAAMmL,EAAQtsK,IAAKwsK,EAAQxsK,KAAM,IAAI,GAAMssK,EAAQl6J,IAAKo6J,EAAQp6J,MAG/F,kBAAkBi0J,EAAQ/I,GACtB,MAAMmP,EAAWj2K,KAAKk2K,eAClBrG,EAAO,GAAG/I,GAAQ+I,EAAO,GAAG/I,GAC5B+I,EAAO,GAAG/I,GAAQ+I,EAAO,GAAG/I,IAGhC,MAAO,CACHt9J,IAAKmqK,GAAiBsC,EAASzsK,IAAKs9J,EAAO+I,GAC3Cj0J,IAAK+3J,GAAiBsC,EAASr6J,IAAKkrJ,EAAO+I,IAInD,eAAe4B,EAAIE,EAAIwE,EAAIC,GACvB,MAAMn3K,EAAIwyK,EAAK,EAAIE,EAAK,EAAIwE,EAAKC,EAC3Bl3K,GAAM,GAAKuyK,EAAK,EAAIE,EAAKwE,GACzBr3K,EAAI2yK,EAAKE,EACT94H,EAAOtvC,KAAKsvC,KAAK35C,EAAIA,EAAI,EAAID,EAAIH,GACvC,IAAI80K,EAAK,EACLyC,EAAK,EAEC,IAANp3K,EACU,IAANC,IACA00K,EAAKyC,GAAMv3K,EAAII,GAEX8lC,MAAM6T,KACd+6H,IAAQ10K,EAAI25C,IAAS,EAAI55C,GACzBo3K,IAAQn3K,EAAI25C,IAAS,EAAI55C,IAG7B,IAAIuK,EAAMD,KAAKqS,IAAIrS,KAAKC,IAAIoqK,EAAIyC,GAAK,IACjC7sK,EAAM,GAAKA,EAAM,KACjBA,EAAM,GAGV,IAAIoS,EAAMrS,KAAKC,IAAID,KAAKqS,IAAIg4J,EAAIyC,GAAK,GAKrC,OAJIz6J,EAAM,GAAKA,EAAM,KACjBA,EAAM,GAGH,CACHpS,IAAKA,EACLoS,IAAKA,GAIb,iBAAiB9Q,EAASs+J,GACtB,IAAIkN,EAMJ,OAJIA,EADAt2K,KAAKq1K,cAAgBvqK,EAAQsqK,YCjG1B,SAAiCvF,EAAQzG,EAAO6C,GAC3D,MAAM8I,EAAalB,GAAkBhE,EAAQ,KACvCmF,EAAQb,GAAmBY,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAIA,EAAW,GAAK3L,EAAMp+H,GACpG,IAAIurI,EAAiBC,EACjB5gJ,EAAQ,EACZ,IAAK,IAAIl1B,EAAI,EAAGA,EAAIs0K,EAAMl0K,OAAQJ,IAC9B61K,EAAkB5C,GAAiBqB,EAAMt0K,GAAI,IAAKmvK,GAClD2G,EAAgB,GAAMD,EAAiBnN,EAAMj5H,IAAMomI,EAAkBnN,EAAMj5H,EACvEqmI,KAAiC,IAAbxB,EAAMt0K,IAAyB,IAAbs0K,EAAMt0K,KAAaurK,EAAKzB,cAAcx/H,EAAIo+H,EAAMp+H,GAAO,EAAIgqI,EAAMt0K,IAAMs0K,EAAMt0K,GAAK,IACxHk1B,IAIR,OAAOA,EAbI,CDkG0C,CAAE51B,KAAKi7E,SAAUj7E,KAAKq1K,aAAcvqK,EAAQsqK,YAAatqK,EAAQmwE,UAAYmuF,EAAOppK,KAAKy2K,OAAO3rK,IAExHmqK,GAAuBj1K,KAAKi7E,SAAUnwE,EAAQmwE,SAAUmuF,GAE1EkN,EAGX,aAAaxrK,EAASs+J,EAAOh5H,EAAOsmI,GAEhC,GADa12K,KAAKy2K,OAAO3rK,GAASxM,OAAO8xC,EAAOA,GACvC26H,cAAc3B,GAAQ,CAC3B,MAAMzwH,EAAK34C,KAAKi7E,SACVriC,EAAK54C,KAAKq1K,aACVxE,EAAK/lK,EAAQsqK,YACbuB,EAAK7rK,EAAQmwE,SAEnB,GAAmB,UAAfy7F,GAA0B/9H,EAAGk1H,WAAWzE,IAAUh5H,EAClD,OAAQqjI,GAAgB96H,EAAIC,EAAIwwH,GAC7B,GAAmB,QAAfsN,GAAwBC,EAAG9I,WAAWzE,IAAUh5H,EACvD,OAAQqjI,GAAgBkD,EAAI9F,EAAIzH,GAIpC,MAAMyG,EAAS,CAAEl3H,EAAIC,EAAIi4H,EAAI8F,GAC7B,GAAI9B,GAAgBhF,EAAQzG,EAAO,IAAK,IAAKh5H,IAAUykI,GAAgBhF,EAAQzG,EAAO,IAAK,IAAKh5H,GAC5F,OAAO,EAEX,MAAM0H,EAAW,KAAYqxH,OAAO,GAAIC,GAClCwN,EAAgB,CAAEj+H,EAAGyxH,cAActyH,GAAWc,EAAGwxH,cAActyH,GAAW+4H,EAAGzG,cAActyH,GAAW6+H,EAAGvM,cAActyH,IAC7H,OAAO+8H,GAAgB+B,EAAexN,EAAO,IAAK,IAAKh5H,IAAUykI,GAAgB+B,EAAexN,EAAO,IAAK,IAAKh5H,IAIzH,YAAYtlC,EAASs+J,EAAOh5H,GACxB,MAAMuI,EAAK34C,KAAKi7E,SACVriC,EAAK9tC,EAAQmwE,SACbnkC,EAAQ23H,GAAIllK,KAAKuvC,MAAMF,EAAGzI,EAAIwI,EAAGxI,EAAGyI,EAAG5N,EAAI2N,EAAG3N,IAEpD,OADa,IAAI,GAAK,CAAE2N,EAAG3N,EAAG2N,EAAGxI,EAAIC,EAAQ,GAAK,CAAEuI,EAAGk1H,WAAWj1H,GAAKxI,IAC3D26H,cAAc3B,EAAMgB,cAAc,KAAYjB,QAAQryH,EAAO6B,KAG7E,YAAY7tC,EAASs+J,EAAOh5H,EAAOsmI,GAC/B,IAAIG,EAMJ,OAJIA,EADA72K,KAAKq1K,cAAgBvqK,EAAQsqK,YAClBp1K,KAAK82K,aAAahsK,EAASs+J,EAAOh5H,EAAQ,EAAGsmI,GAE7C12K,KAAK+2K,YAAYjsK,EAASs+J,EAAOh5H,GAEzCymI,GAIf,SAASd,GAAY5uK,GACjB,IAAIrG,EAASqG,EAAIrG,OACb0I,EAAM2+J,GACNvsJ,EAAMwsJ,GAEV,IAAK,IAAI1nK,EAAI,EAAGA,EAAII,EAAQJ,IACxBkb,EAAMrS,KAAKqS,IAAIA,EAAKzU,EAAIzG,IACxB8I,EAAMD,KAAKC,IAAIA,EAAKrC,EAAIzG,IAG5B,MAAO,CACH8I,IAAKA,EACLoS,IAAKA,GAIE,IAAA,GAAA,GE1KA,SAAS,GAAKhI,GACzB,GAAIA,EACA,OAAOA,EAAMA,EAAM9S,OAAS,GCmKpC,SAASk2K,GAAiBppH,EAAYqpH,EAAY5rK,GAC9C,MAAM6rK,EAAiBD,EAAa,EAAI,EAExC,IAAK,IAAIv2K,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EACxCktD,EAAW5zC,OAAOtZ,EAAIw2K,EAAgB,EAAG7rK,GAIjD,SAAS8rK,GAAgB/N,EAAO1yH,GAC5B,GAAI0yH,GAAS1yH,EACT,OAAOA,EAAO0gI,UAAU,GAAG/N,WAAWD,EAAMp+H,GAAIo+H,EAAMj5H,GAM9D,SAASknI,GAA8BvzI,EAAU4vI,EAAczD,GAC3D,MAAMqH,EAAc5D,EAAar9I,QAAQwhB,MAAM,EAAI,GACnD,MAAO,CACHw9H,WAAYiC,EAAYjhJ,QAAQkhJ,cAAczzI,EAASszI,UALjD,EAAI,IAMVhC,UAAWkC,EAAYC,cAActH,EAASmH,UANxC,EAAI,KAUH,IAAA,GA1LE,CACbp1K,EAAG,SAAS9D,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,GAAapkC,EAEjC,IAAK,IAAIgB,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,IAAI0oK,EAAQ,IAAI,GAAMx7G,EAAWltD,GAAIktD,EAAWltD,EAAI,IAEhDhB,EAAQ83K,YACRpO,EAAMmO,cAAczzI,GAGxB5lC,EAAKu5K,OAAOrO,EAAMp+H,EAAGo+H,EAAMj5H,GAE3BrM,EAASkH,EAAIo+H,EAAMp+H,EACnBlH,EAASqM,EAAIi5H,EAAMj5H,IAI3BrxC,EAAG,SAASZ,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,GAAapkC,EAEjC,IAAK,IAAIgB,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,IAAI20K,EAAa,IAAI,GAAMznH,EAAWltD,GAAIktD,EAAWltD,EAAI,IACrD00K,EAAY,IAAI,GAAMxnH,EAAWltD,EAAI,GAAIktD,EAAWltD,EAAI,IACxD0oK,EAAQ,IAAI,GAAMx7G,EAAWltD,EAAI,GAAIktD,EAAWltD,EAAI,IACpDhB,EAAQ83K,aACRpC,EAAUmC,cAAczzI,GACxBuxI,EAAWkC,cAAczzI,GACzBslI,EAAMmO,cAAczzI,IAGxB5lC,EAAKw5K,QAAQrC,EAAYD,EAAWhM,GAEpCtlI,EAASkH,EAAIo+H,EAAMp+H,EACnBlH,EAASqM,EAAIi5H,EAAMj5H,IAI3BkI,EAAG,SAASn6C,EAAMwB,GAGds3K,GAAiBt3K,EAAQkuD,YAAY,EAFvBluD,EAAQ83K,WAAa,EAAI93K,EAAQokC,SAASkH,GAGxDhrC,KAAKgC,EAAE9D,EAAMwB,IAGjBy+G,EAAG,SAASjgH,EAAMwB,GAGds3K,GAAiBt3K,EAAQkuD,YAAY,EAFvBluD,EAAQ83K,WAAa,EAAI93K,EAAQokC,SAASqM,GAGxDnwC,KAAKgC,EAAE9D,EAAMwB,IAGjBT,EAAG,SAASf,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,GAAapkC,EAEjC,IAAK,IAAIgB,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,MAAMouK,EAAUlhH,EAAWltD,GACrBquK,EAAUnhH,EAAWltD,EAAI,GACzBo3C,EAAW8V,EAAWltD,EAAI,GAC1B4wK,EAAW1jH,EAAWltD,EAAI,GAC1B6wK,EAAQ3jH,EAAWltD,EAAI,GACvBuvK,EAAW,IAAI,GAAMriH,EAAWltD,EAAI,GAAIktD,EAAWltD,EAAI,IAEzDhB,EAAQ83K,YACRvH,EAASsH,cAAczzI,GAEvBA,EAASkH,IAAMilI,EAASjlI,GAAKlH,EAASqM,IAAM8/H,EAAS9/H,IACrDjyC,EAAKy5K,MAAM1H,EAAUnB,EAASC,EAASuC,EAAUC,EAAOz5H,GAExDhU,EAASkH,EAAIilI,EAASjlI,EACtBlH,EAASqM,EAAI8/H,EAAS9/H,KAKlCzuC,EAAG,SAASxD,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,EAAQ,gBAAE8zI,GAAoBl4K,EAClD,IAAIm4K,EAEoB,MAApBD,GAA+C,MAApBA,IAC3BC,EAAgB,GAAK,GAAK35K,EAAK2K,OAAO8xI,UAAUy6B,aAGpD,IAAK,IAAI10K,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,IAEI20K,EAFAD,EAAY,IAAI,GAAMxnH,EAAWltD,GAAIktD,EAAWltD,EAAI,IACpDuvK,EAAW,IAAI,GAAMriH,EAAWltD,EAAI,GAAIktD,EAAWltD,EAAI,IAGvDhB,EAAQ83K,aACRpC,EAAUmC,cAAczzI,GACxBmsI,EAASsH,cAAczzI,IAIvBuxI,EADAwC,EACaV,GAAgBU,EAAe/zI,GAE/BA,EAASzN,QAG1BwhJ,EAAgBzC,EAEhBl3K,EAAKw5K,QAAQrC,EAAYD,EAAWnF,GAEpCnsI,EAASkH,EAAIilI,EAASjlI,EACtBlH,EAASqM,EAAI8/H,EAAS9/H,IAI9BojH,EAAG,SAASr1J,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,GAAapkC,EAEjC,IAAK,IAAIgB,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,IAAIgzK,EAAe,IAAI,GAAM9lH,EAAWltD,GAAIktD,EAAWltD,EAAI,IACvDuvK,EAAW,IAAI,GAAMriH,EAAWltD,EAAI,GAAIktD,EAAWltD,EAAI,IAEvDhB,EAAQ83K,aACR9D,EAAa6D,cAAczzI,GAC3BmsI,EAASsH,cAAczzI,IAG3B,IAAIg0I,EAAqBT,GAA8BvzI,EAAU4vI,EAAczD,GAE/E/xK,EAAKw5K,QAAQI,EAAmBzC,WAAYyC,EAAmB1C,UAAWnF,GAE1EnsI,EAASkH,EAAIilI,EAASjlI,EACtBlH,EAASqM,EAAI8/H,EAAS9/H,IAI9BhxC,EAAG,SAASjB,EAAMwB,GACd,MAAM,WAAEkuD,EAAU,SAAE9pB,EAAQ,gBAAE8zI,GAAoBl4K,EAClD,IAAIg0K,EAEoB,MAApBkE,GAA+C,MAApBA,IAE3BlE,EADkB,GAAK,GAAKx1K,EAAK2K,OAAO8xI,UACby6B,YAAY/+I,QAClCkhJ,cAAczzI,EAASszI,WAAW,EAAI,IACtCv/H,MAAM,MAGf,IAAK,IAAIn3C,EAAI,EAAGA,EAAIktD,EAAW9sD,OAAQJ,GAAK,EAAG,CAC3C,IAAIuvK,EAAW,IAAI,GAAMriH,EAAWltD,GAAIktD,EAAWltD,EAAI,IACnDhB,EAAQ83K,YACRvH,EAASsH,cAAczzI,GAIvB4vI,EADAA,EACeyD,GAAgBzD,EAAc5vI,GAE9BA,EAASzN,QAG5B,IAAIyhJ,EAAqBT,GAA8BvzI,EAAU4vI,EAAczD,GAE/E/xK,EAAKw5K,QAAQI,EAAmBzC,WAAYyC,EAAmB1C,UAAWnF,GAE1EnsI,EAASkH,EAAIilI,EAASjlI,EACtBlH,EAASqM,EAAI8/H,EAAS9/H,KC7JlC,MAAM4nI,GAAgB,kCAChBC,GAAc,oDA6DL,IAAA,GAjDf,SAAmBC,EAAcltI,GAC7B,MAAMjH,EAAW,IAAI,GACrB,IAAI8zI,EA4CJ,OA1CA7sI,EAAI5mC,QAAQ4zK,GAAe,CAACh4K,EAAO00C,EAAS8kE,EAAQ2+D,KAChD,IAAIh2B,EAAUztG,EAAQjuC,cACtB,MAAMgxK,EAAat1B,IAAYztG,EACzBmZ,EAfd,SAAyB7iB,GACrB,MAAM6iB,EAAa,GAInB,OAHA7iB,EAAI5mC,QAAQ6zK,IAAAA,SAAsBj4K,EAAOmhB,GACrC0sC,EAAWvqD,KAAKoO,WAAWyP,OAExB0sC,EALX,CAe2C2rD,EAAOz5G,QAmB1C,GArCK,MAoBDoiJ,IACIs1B,GACA1zI,EAASkH,GAAK4iB,EAAW,GACzB9pB,EAASqM,GAAKyd,EAAW,KAEzB9pB,EAASkH,EAAI4iB,EAAW,GACxB9pB,EAASqM,EAAIyd,EAAW,IAG5BqqH,EAAaE,OAAOr0I,EAASkH,EAAGlH,EAASqM,GAErCyd,EAAW9sD,OAAS,IACpBohJ,EAAU,IACVt0F,EAAW5zC,OAAO,EAAG,KAIzB,GAASkoI,GACT,GAASA,GACL+1B,EAAc,CACVrqH,WAAYA,EACZ9pB,SAAUA,EACV0zI,WAAYA,EACZI,gBAAiBA,IAIrBM,GA9CF,MA8CeA,EAAU1xK,eACvByxK,EAAax5K,aAEd,GAlDF,MAkDMyjJ,EACP,MAAM,IAAIz7I,MAAM,sDAAwDy7I,GAG5E01B,EAAkB11B,IAGf+1B,GC5DI,SAASG,GAAoBhF,EAAUiF,EAAgBrP,GAClE,IAAIsP,EAEJ,IAAK,IAAI53K,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,IAAI+zC,EAAU2+H,EAAS1yK,GACvB,GAAI+zC,EAAQ23H,UAAW,CACnB,IAAImM,EAAqBF,EAAiB5jI,EAAQw3H,KAAKjD,GAAkBv0H,EAAQ+jI,UAC7ED,IAEID,EADAA,EACc,GAAKnhJ,MAAMmhJ,EAAaC,GAExBA,IAM9B,OAAOD,ECjBI,SAASG,GAA2BrF,EAAUpK,GACzD,IAAIsP,EAEJ,IAAK,IAAI53K,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,IAAI+zC,EAAU2+H,EAAS1yK,GACvB,GAAI+zC,EAAQ23H,UAAW,CACnB,IAAImM,EAAqB9jI,EAAQikI,YAAY1P,GACzCuP,IAEID,EADAA,EACc,GAAKnhJ,MAAMmhJ,EAAaC,GAExBA,IAM9B,OAAOD,ECHJ,MAAM,WAAa,GAAU,GAAW,MAC3C,aAAavtI,EAAKrrC,GACd,OAAO,GAAUkC,MAAMmpC,EAAKrrC,GAGhC,eACI,MAAO,OAGX,YAAYA,GACRunD,MAAMvnD,GACNM,KAAK26I,SAAW,IAAI,GACpB36I,KAAK26I,SAASqsB,YAAYhnK,MAErBinK,GAAQjnK,KAAKN,QAAQitK,UACtB3sK,KAAK2sK,OAAO,QAEP1F,GAAQjnK,KAAKN,QAAQitK,OAAOgM,WAC7B34K,KAAKN,QAAQb,IAAI,kBAAmB,UAKhD,OAAOmsC,EAAGmF,GAON,OANAnwC,KAAK44K,UACL54K,KAAK26I,SAASy4B,SAAS,IACvBpzK,KAAK64K,SAEL74K,KAAKy3K,OAAOzsI,EAAGmF,GAERnwC,KAGX,OAAOgrC,EAAGmF,GACN,MAAMi5H,EAAQnC,GAAQ92H,GAAK,IAAI,GAAMnF,EAAGmF,GAAKnF,EACvClgC,EAAU,IAAI,GAAQs+J,GAI5B,OAFAppK,KAAK26I,SAASt3I,KAAKyH,GAEZ9K,KAGX,QAAQq1K,EAAYD,EAAWhM,GAC3B,GAAIppK,KAAK26I,SAAS75I,OAAS,EAAG,CAC1B,MAAMg4K,EAAc,GAAK94K,KAAK26I,UACxB7vI,EAAU,IAAI,GAAQs+J,EAAOgM,GACnCp1K,KAAK44K,UACLE,EAAYzD,WAAWA,GACvBr1K,KAAK64K,SAEL74K,KAAK26I,SAASt3I,KAAKyH,GAGvB,OAAO9K,KAGX,IAAIgvK,EAAYC,EAAUH,EAASC,EAASG,GACxC,GAAIlvK,KAAK26I,SAAS75I,OAAS,EAAG,CAC1B,MACMm6E,EADc,GAAKj7E,KAAK26I,UACH1/D,SACrB13E,EAAQ8kK,GAAI2G,GACZt4H,EAAS,IAAI,GAAMukC,EAAOjwC,EAAI8jI,EAAUvlK,KAAKm/J,IAAInlK,GACnD03E,EAAO9qC,EAAI4+H,EAAUxlK,KAAKo/J,IAAIplK,IAC5Bw1K,EAAM,IAAI,GAAIriI,EAAQ,CACxBs4H,WAAYA,EACZC,SAAUA,EACVH,QAASA,EACTC,QAASA,EACTG,cAAeA,IAGnBlvK,KAAKg5K,gBAAgBD,GAGzB,OAAO/4K,KAGX,MAAMqH,EAAKwlK,EAAIC,EAAIwE,EAAUC,EAAOz5H,GAChC,GAAI93C,KAAK26I,SAAS75I,OAAS,EAAG,CAC1B,MACMm6E,EADc,GAAKj7E,KAAK26I,UACH1/D,SACrB89F,EAAM,GAAIpO,WAAW1vF,EAAQ5zE,EAAKwlK,EAAIC,EAAIwE,EAAUC,EAAOz5H,GAEjE93C,KAAKg5K,gBAAgBD,GAEzB,OAAO/4K,KAGX,gBAAgB+4K,GACZ/4K,KAAK44K,UAEL,MAAMvJ,EAAc0J,EAAI1J,cAExB,IAAK,IAAI3uK,EAAI,EAAGA,EAAI2uK,EAAYvuK,OAAQJ,GAAK,EACzCV,KAAK03K,QAAQrI,EAAY3uK,GAAI2uK,EAAY3uK,EAAI,GAAI2uK,EAAY3uK,EAAI,IAGrEV,KAAK64K,SACL74K,KAAK2nK,iBAGT,QAII,OAHA3nK,KAAKN,QAAQgmD,QAAS,EACtB1lD,KAAK2nK,iBAEE3nK,KAGX,UACI,OAAOA,KAAKouK,QAGhB,eAAehF,GACX,MAAMzuB,EAAW36I,KAAK26I,SAChB75I,EAAS65I,EAAS75I,OACxB,IACImqB,EAAU5U,EADVigK,EAAqB,EAGzB,IAAK,IAAIppI,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5BjiB,EAAW0vH,EAASztG,EAAM,GAC1B72B,EAAUskI,EAASztG,GACnBopI,GAAsBrrJ,EAASguJ,iBAAiB5iK,EAAS+yJ,GAO7D,OAJIppK,KAAKN,QAAQgmD,QAAWi1F,EAAS,GAAG1/D,SAAS+uF,OAAOrvB,EAAS75I,EAAS,GAAGm6E,YACzEq7F,GAAsBrB,GAAuBt6B,EAAS,GAAG1/D,SAAU0/D,EAAS75I,EAAS,GAAGm6E,SAAUmuF,IAG/FkN,EAAqB,GAAM,EAGtC,UAAUlN,EAAOh5H,GACb,MAAMuqG,EAAW36I,KAAK26I,SAChB75I,EAAS65I,EAAS75I,OAClBo4K,EAAY9oI,GAASpwC,KAAKN,QAAQitK,OAAOv8H,MAE/C,GAAItvC,EAAS,EAAG,CACZ,GAAI65I,EAAS,GAAGw+B,YAAYx+B,EAAS,GAAIyuB,EAAO8P,EAAW,SACvD,OAAO,EAGX,IAAK,IAAIhsI,EAAM,EAAGA,GAAOpsC,EAAS,EAAGosC,IACjC,GAAIytG,EAASztG,EAAM,GAAGisI,YAAYx+B,EAASztG,GAAMk8H,EAAO8P,GACpD,OAAO,EAIf,GAAIv+B,EAAS75I,EAAS,GAAGq4K,YAAYx+B,EAAS75I,EAAS,GAAIsoK,EAAO8P,EAAW,OACzE,OAAO,EAGf,OAAO,EAGX,MAAM1Q,GACF,MAAM7tB,EAAW36I,KAAK26I,SAChB75I,EAAS65I,EAAS75I,OACxB,IAAIw3K,EAEJ,GAAe,IAAXx3K,EAAc,CACd,IAAIm6E,EAAS0/D,EAAS,GAAG1/D,SAASmvF,cAAc5B,GAChD8P,EAAc,IAAI,GAAKr9F,EAAQ,GAAKiuF,WACjC,GAAIpoK,EAAS,EAChB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,IAAI04K,EAAaz+B,EAASj6I,EAAI,GAAG+1K,OAAO97B,EAASj6I,GAAI8nK,GAEjD8P,EADAA,EACc,GAAKnhJ,MAAMmhJ,EAAac,GAExBA,EAK1B,OAAOd,EAGX,gBAAgBxpD,EAAMpvH,GAClB,OAAO,IAAI,GAAKA,GACXy4K,OAAOrpD,EAAKq7C,WACZsN,OAAO3oD,EAAKw7C,YACZmN,OAAO3oD,EAAK07C,eACZiN,OAAO3oD,EAAK47C,cACZjsK,QAGT,kBAAkBoxK,EAAQnwK,GACtB,GAAImwK,EAAQ,CACR,MAAM3xK,EAAO,IAAI,GAAKwB,GAEtB,IAAK,IAAIgB,EAAI,EAAGA,EAAImvK,EAAO/uK,OAAQJ,IAAK,CACpC,IAAI0oK,EAAQ,GAAMp+J,OAAO6kK,EAAOnvK,IAC5B0oK,IACU,IAAN1oK,EACAxC,EAAKi6K,OAAO/O,GAEZlrK,EAAKu5K,OAAOrO,IAKxB,OAAOlrK,GAIf,eAAe66K,EAAKr5K,GAChB,MAAMxB,EAAO,IAAI,GAAKwB,GAChBsvK,EAAa+J,EAAI/J,WACjBzrK,EAAQw1K,EAAIzJ,QAAQN,GAG1B,OAFA9wK,EAAKi6K,OAAO50K,EAAMynC,EAAGznC,EAAM4sC,GAC3BjyC,EAAK66K,IAAI/J,EAAY+J,EAAI9J,SAAU8J,EAAIjK,QAASiK,EAAIhK,QAASgK,EAAI7J,eAC1DhxK,GAIR,MAAM,WAAkB,GAAU,GAAW,MAChD,aAAa6sC,EAAKrrC,GACd,MAAMwkE,EAAW,IAAI,GAAUxkE,GAC/B,OAAO,GAAUwkE,EAAUn5B,GAG/B,eACI,MAAO,YAGX,YAAYrrC,GACRunD,MAAMvnD,GACNM,KAAK6I,MAAQ,IAAI,GACjB7I,KAAK6I,MAAMm+J,YAAYhnK,MAElBinK,GAAQjnK,KAAKN,QAAQitK,SACtB3sK,KAAK2sK,OAAO,QAIpB,OAAO3hI,EAAGmF,GACN,MAAMjyC,EAAO,IAAI,GAKjB,OAJAA,EAAKi6K,OAAOntI,EAAGmF,GAEfnwC,KAAK6I,MAAMxF,KAAKnF,GAET8B,KAGX,OAAOgrC,EAAGmF,GAKN,OAJInwC,KAAK6I,MAAM/H,OAAS,GACpB,GAAKd,KAAK6I,OAAO4uK,OAAOzsI,EAAGmF,GAGxBnwC,KAGX,QAAQq1K,EAAYD,EAAWhM,GAK3B,OAJIppK,KAAK6I,MAAM/H,OAAS,GACpB,GAAKd,KAAK6I,OAAO6uK,QAAQrC,EAAYD,EAAWhM,GAG7CppK,KAGX,IAAIgvK,EAAYC,EAAUH,EAASC,EAASG,GAKxC,OAJIlvK,KAAK6I,MAAM/H,OAAS,GACpB,GAAKd,KAAK6I,OAAOkwK,IAAI/J,EAAYC,EAAUH,EAASC,EAASG,GAG1DlvK,KAGX,MAAMqH,EAAKwlK,EAAIC,EAAIwE,EAAUC,EAAOz5H,GAKhC,OAJI93C,KAAK6I,MAAM/H,OAAS,GACpB,GAAKd,KAAK6I,OAAO8uK,MAAMtwK,EAAKwlK,EAAIC,EAAIwE,EAAUC,EAAOz5H,GAGlD93C,KAGX,QAKI,OAJIA,KAAK6I,MAAM/H,OAAS,GACpB,GAAKd,KAAK6I,OAAOpK,QAGduB,KAGX,MAAMwoK,GACF,OAAO4P,GAAoBp4K,KAAK6I,OAAO,EAAM2/J,GAGjD,UACI,OAAO4P,GAAoBp4K,KAAK6I,OAAO,GAG3C,eAAeugK,GACX,MAAMvgK,EAAQ7I,KAAK6I,MAEnB,IAAK,IAAIqkC,EAAM,EAAGA,EAAMrkC,EAAM/H,OAAQosC,IAClC,GAAIrkC,EAAMqkC,GAAKs/H,eAAepD,GAC1B,OAAO,EAGf,OAAO,EAGX,UAAUA,GACN,MAAMvgK,EAAQ7I,KAAK6I,MACbunC,EAAQpwC,KAAKN,QAAQitK,OAAOv8H,MAElC,IAAK,IAAIlD,EAAM,EAAGA,EAAMrkC,EAAM/H,OAAQosC,IAClC,GAAIrkC,EAAMqkC,GAAKu/H,UAAUrD,EAAOh5H,GAC5B,OAAO,EAGf,OAAO,EAGX,aAAa44H,GACT,OAAOyP,GAA2Bz4K,KAAK6I,MAAO7I,KAAKqsK,iBAAiBrD,KChU5E,MAAM,WAAY,GAAU,GAAW,GAAa,OAChD,eACI,MAAO,MAGX,YAAYuF,EAAW,IAAI,GAAe7uK,EAAU,IAChDunD,MAAMvnD,GAENM,KAAKuuK,SAASA,GAETtH,GAAQjnK,KAAKN,QAAQitK,SACtB3sK,KAAK2sK,OAbM,QAiBnB,MAAMnE,GACF,OAAOxoK,KAAKwuK,UAAUvC,KAAKzD,GAG/B,UACI,OAAOxoK,KAAKuuK,WAAWtC,OAG3B,SACI,MAAM/tK,EAAO,IAAI,GACXmxK,EAAcrvK,KAAKuuK,WAAWc,cAEpC,GAAIA,EAAYvuK,OAAS,EAAG,CACxB5C,EAAKi6K,OAAO9I,EAAY,GAAGrkI,EAAGqkI,EAAY,GAAGl/H,GAE7C,IAAK,IAAIzvC,EAAI,EAAGA,EAAI2uK,EAAYvuK,OAAQJ,GAAK,EACzCxC,EAAKw5K,QAAQrI,EAAY3uK,GAAI2uK,EAAY3uK,EAAI,GAAI2uK,EAAY3uK,EAAI,IAIzE,OAAOxC,EAGX,eAAekrK,GACX,OAAOppK,KAAKuuK,WAAWxD,cAAc3B,GAGzC,UAAUA,GACN,OAAOppK,KAAKuuK,WAAW9B,UAAUrD,EAAOppK,KAAKN,QAAQitK,OAAOv8H,MAAQ,IAI7D,IAAA,GAAA,GCGA,GA3Df,cAAuB,GACnB,YAAYx4B,GACRqvC,QAEAjnD,KAAKq5K,MAAQzhK,EACb5X,KAAKs5K,QAAU,EACft5K,KAAKu5K,KAAO,GAGhB,IAAI9jK,EAAKpK,GACL,MAAM5J,EAAMzB,KAAKu5K,KACX16J,EAAQ,CAAEpJ,IAAKA,EAAKpK,MAAOA,GAEjC5J,EAAIgU,GAAOoJ,EAEN7e,KAAKy7F,OAGNz7F,KAAK07F,MAAM89E,MAAQ36J,EACnBA,EAAM46J,MAAQz5K,KAAK07F,MACnB17F,KAAK07F,MAAQ78E,GAJb7e,KAAKy7F,MAAQz7F,KAAK07F,MAAQ78E,EAO1B7e,KAAKs5K,SAAWt5K,KAAKq5K,OACrB53K,EAAIzB,KAAKy7F,MAAMhmF,KAAO,KACtBzV,KAAKy7F,MAAQz7F,KAAKy7F,MAAM+9E,MACxBx5K,KAAKy7F,MAAMg+E,MAAQ,MAEnBz5K,KAAKs5K,UAIb,IAAI7jK,GACA,MAAMoJ,EAAQ7e,KAAKu5K,KAAK9jK,GAExB,GAAIoJ,EAmBA,OAlBIA,IAAU7e,KAAKy7F,OAAS58E,IAAU7e,KAAK07F,QACvC17F,KAAKy7F,MAAQ58E,EAAM26J,MACnBx5K,KAAKy7F,MAAMg+E,MAAQ,MAGnB56J,IAAU7e,KAAK07F,QACX78E,EAAM46J,QACN56J,EAAM46J,MAAMD,MAAQ36J,EAAM26J,MAC1B36J,EAAM26J,MAAMC,MAAQ56J,EAAM46J,OAG9B56J,EAAM46J,MAAQz5K,KAAK07F,MACnB78E,EAAM26J,MAAQ,KAEdx5K,KAAK07F,MAAM89E,MAAQ36J,EACnB7e,KAAK07F,MAAQ78E,GAGVA,EAAMxT,QCxDzB,MAAMquK,GAAgB,eAGtB,SAASC,GAAc31F,GACnB,OAAOtrE,OAAOsrE,GAAM7/E,QAAQu1K,GAHlB,KAMd,SAASE,GAAU3jK,GACf,MAAMlP,EAAQ,GACd,IAAK,IAAI0O,KAAOQ,EACZlP,EAAM1D,KAAKoS,EAAMQ,EAAOR,IAG5B,OAAO1O,EAAMujB,OAAOrqB,KAAK,IAK7B,SAAS45K,GAAQ9uI,GAGb,IAAIiC,EAAO,WAEX,IAAK,IAAItsC,EAAI,EAAGA,EAAIqqC,EAAIjqC,SAAUJ,EAC9BssC,IAASA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IACzEA,GAAQjC,EAAI7U,WAAWx1B,GAG3B,OAAOssC,IAAS,ECpBpB,MAAM8sI,GAAkB,CACpBC,mBAAoB,GAGxB,IAAIC,GAEoB,oBAAbhoI,WACPgoI,GAAoBhoI,SAASI,cAAc,OAC3C4nI,GAAkBvtI,MAAM2xC,QAAU,wQAqEvB,IAAA,eAhET67F,UAAoB,GACtB,YAAYv6K,GACRunD,QAEAjnD,KAAKk6K,OAAS,IAAI,GAAS,KAC3Bl6K,KAAKN,QAAUN,OAAOu8B,OAAO,GAAIm+I,GAAiBp6K,GAGtD,QAAQskF,EAAMv3C,EAAO/sC,EAAU,IAC3B,GAAI,MAAOskF,EACP,MA1BD,CAAE5zC,MAAO,EAAGy5H,OAAQ,EAAGsQ,SAAU,GA6BpC,MACMvc,EAAWic,GAAQ71F,EADR41F,GAAUntI,IAErB2tI,EAAep6K,KAAKk6K,OAAOj5J,IAAI28I,GAErC,GAAIwc,EACA,OAAOA,EAGX,MAAMxiK,EArCH,CAAEw4B,MAAO,EAAGy5H,OAAQ,EAAGsQ,SAAU,GAsC9BE,EAAa36K,EAAQ46K,KAAON,GAC5BO,EAAiBv6K,KAAKw6K,kBAAkBC,WAAU,GAExD,IAAK,IAAIhlK,KAAOg3B,EAAO,CACnB,IAAIphC,EAAQohC,EAAMh3B,QACG,IAAVpK,IACPgvK,EAAW5tI,MAAMh3B,GAAOpK,GAIhC,MAAMqvK,GAAoC,IAA1Bh7K,EAAQi6K,cAA0BA,GAAc31F,GAAQtrE,OAAOsrE,GAkB/E,OAhBAq2F,EAAWpgG,YAAcygG,EACzBL,EAAWpyG,YAAYsyG,GACvBvoI,SAASzC,KAAK04B,YAAYoyG,GAEtBK,EAAQ55K,SACR8W,EAAKw4B,MAAQiqI,EAAWM,YAAc36K,KAAKN,QAAQq6K,mBACnDniK,EAAKiyJ,OAASwQ,EAAWO,aACzBhjK,EAAKuiK,SAAWI,EAAeM,UAAY76K,KAAKN,QAAQq6K,oBAGxDniK,EAAKw4B,MAAQ,GAAKx4B,EAAKiyJ,OAAS,GAChC7pK,KAAKk6K,OAAO9+E,IAAIwiE,EAAUhmJ,GAG9ByiK,EAAWtmI,WAAWk1B,YAAYoxG,GAE3BziK,EAGX,kBACI,MAAM2oD,EAASvuB,SAASI,cAAc,OAItC,OAHAmuB,EAAO9zB,MAAM2xC,QAAU,0DACnBp+E,KAAKN,QAAQq6K,mBAAqB,eAAiB/5K,KAAKN,QAAQq6K,mBAAqB,uBAElFx5G,UAIf05G,EAAY5jK,QAAU,IAAI4jK,QCjFX,SAASa,GAAY92F,EAAMv3C,EAAO4tI,GAC7C,OAAO,GAAYhkK,QAAQ0kK,QAAQ/2F,EAAMv3C,EAAO4tI,GCSpD,MAAM,WAAa,GAAU,GAAW,GAAS,CAAE,eAC/C,eACI,MAAO,OAGX,YAAYztG,EAAS9oC,EAAW,IAAI,GAASpkC,EAAU,IACnDunD,MAAMvnD,GAENM,KAAK4sE,QAAQA,GACb5sE,KAAK8jC,SAASA,GAET9jC,KAAKN,QAAQs7K,OACdh7K,KAAKN,QAAQs7K,KAfJ,mBAkBR/T,GAAQjnK,KAAKN,QAAQ5B,OACtBkC,KAAKlC,KAlBI,QAsBjB,QAAQuN,GACJ,OAAI47J,GAAQ57J,IACRrL,KAAKN,QAAQb,IAAI,UAAWwM,GACrBrL,MAGJA,KAAKN,QAAQuhB,IAAI,WAG5B,UAKI,OAJgB65J,GAAY96K,KAAK4sE,UAAW,CACxCouG,KAAMh7K,KAAKN,QAAQuhB,IAAI,UAM/B,OACI,MAAMrJ,EAAO5X,KAAK+6K,UACZj0D,EAAM9mH,KAAK8jC,WAAWzN,QAC5B,OAAO,IAAI,GAAKywF,EAAK,CAAElvG,EAAKw4B,MAAOx4B,EAAKiyJ,SAG5C,KAAKb,GACD,MAAMgD,EAAiBjD,GAAS/oK,KAAKqsK,iBAAiBrD,IACtD,OAAOhpK,KAAK8uH,OAAOm9C,KAAKD,GAG5B,UACI,OAAOhsK,KAAK8uH,OAAOm9C,OAGvB,eAAe7C,GACX,OAAOppK,KAAK8uH,OAAOi8C,cAAc3B,IAI1B,IAAA,GAAA,GC9Df,MAAM,WAAc,GAAa,GAAS,CAAE,UACxC,eACI,MAAO,QAGX,YAAYv2H,EAAKi8E,EAAO,IAAI,GAAQpvH,EAAU,IAC1CunD,MAAMvnD,GAENM,KAAK6yC,IAAIA,GACT7yC,KAAK8uH,KAAKA,GAGd,IAAIzjH,GACA,OAAI47J,GAAQ57J,IACRrL,KAAKN,QAAQb,IAAI,MAAOwM,GACjBrL,MAGJA,KAAKN,QAAQuhB,IAAI,OAG5B,KAAK+nJ,GACD,MAAMgD,EAAiBjD,GAAS/oK,KAAKqsK,iBAAiBrD,IACtD,OAAOhpK,KAAKi7K,MAAMhP,KAAKD,GAG3B,UACI,OAAOhsK,KAAKi7K,MAAMhP,OAGtB,eAAe7C,GACX,OAAOppK,KAAKi7K,MAAMlQ,cAAc3B,GAGpC,WACI,OAAOppK,KAAK6yC,OAIL,IAAA,GAAA,GC1BA,GApBK,CAACg1H,EAAOqT,IAAkB,cAC5BrT,EACV,SAASt3I,GACL,MAAM6gB,EAAWpxC,KAAKk7K,GAEtB,IAAK,IAAIx6K,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IAAK,CACtC,IAAIqyC,EAAQ3B,EAAS1wC,GAEjBqyC,EAAMooI,SACNpoI,EAAMooI,SAAS5qJ,GAEfA,EAASwiB,GAIjB,OAAO/yC,OCfJ,SAASq6H,GAAOhxF,EAAO+xI,GAElC,OADA/xI,EAAMhmC,KAAKiQ,MAAM+1B,EAAO+xI,GACjB/xI,ECKX,MAAM,WAAc,GAAY,GAAS,aACrC,eACI,MAAO,QAGX,YAAY3pC,GACRunD,MAAMvnD,GACNM,KAAKoxC,SAAW,GAGpB,eAAexjB,EAAQwlC,EAAOp/C,GAC1BhU,KAAK6qI,QAAQ,iBAAiB,CAC1Bj9G,OAAQA,EACRwlC,MAAOA,EACPp/C,MAAOA,IAIf,SAMI,OALAqmH,GAAOr6H,KAAKoxC,SAAU9oC,WACtBtI,KAAKq7K,UAAU/yK,UAAWtI,MAE1BA,KAAKs7K,eAAe,MAAOhzK,WAEpBtI,KAGX,OAAOgU,EAAOygC,GAMV,OALAz0C,KAAKoxC,SAASp3B,OAAOhG,EAAO,EAAGygC,GAC/BA,EAAQpuB,OAASrmB,KAEjBA,KAAKs7K,eAAe,MAAO,CAAE7mI,GAAWzgC,GAEjChU,KAGX,SAASy0C,EAASzgC,GACd,OAAOhU,KAAK0gF,OAAO1sE,EAAOygC,GAG9B,OAAOA,GACH,MAAMzgC,EAAQhU,KAAKoxC,SAASvvC,QAAQ4yC,GAOpC,OANIzgC,GAAS,IACThU,KAAKoxC,SAASp3B,OAAOhG,EAAO,GAC5BygC,EAAQpuB,OAAS,KACjBrmB,KAAKs7K,eAAe,SAAU,CAAE7mI,GAAWzgC,IAGxChU,KAGX,SAASgU,GACL,GAAI,GAAKA,GAASA,EAAQhU,KAAKoxC,SAAStwC,OAAQ,CAC5C,IAAI2zC,EAAUz0C,KAAKoxC,SAASp9B,GAC5BhU,KAAKoxC,SAASp3B,OAAOhG,EAAO,GAC5BygC,EAAQpuB,OAAS,KACjBrmB,KAAKs7K,eAAe,SAAU,CAAE7mI,GAAWzgC,GAG/C,OAAOhU,KAGX,QACI,MAAMozD,EAAQpzD,KAAKoxC,SAMnB,OALApxC,KAAKoxC,SAAW,GAChBpxC,KAAKq7K,UAAUjoH,EAAO,MAEtBpzD,KAAKs7K,eAAe,SAAUloH,EAAO,GAE9BpzD,KAGX,KAAKgpK,GACD,OAAOoP,GAAoBp4K,KAAKoxC,UAAU,EAAMpxC,KAAKqsK,iBAAiBrD,IAG1E,UACI,OAAOoP,GAAoBp4K,KAAKoxC,UAAU,GAG9C,aAAa43H,GACT,OAAOyP,GAA2Bz4K,KAAKoxC,SAAUpxC,KAAKqsK,iBAAiBrD,IAG3E,iBAAiBA,GACb,OAAO,GAAQ/nK,UAAUorK,iBAAiB34J,KAAK1T,KAAMgpK,IAAmB,KAG5E,cAAcI,EAAO0C,GACjB,GAAI9rK,KAAKosK,UAAW,CAChB,MAAMh7H,EAAWpxC,KAAKoxC,SAChBt5B,EAAY9X,KAAKqsK,iBAAiBP,GACxC,IAAK,IAAI5+H,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IACrC,GAAIkE,EAASlE,GAAK69H,cAAc3B,EAAOtxJ,GACnC,OAAO,EAInB,OAAO,EAGX,UAAUs7J,EAAUmI,GAChB,IAAK,IAAI76K,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,MAAMqyC,EAAQqgI,EAAS1yK,GACjB2lB,EAAS0sB,EAAM1sB,OACjBA,GAAUA,IAAWrmB,MAAQqmB,EAAOib,QACpCjb,EAAOib,OAAOyR,GAGlBA,EAAM1sB,OAASk1J,IAKZ,IAAA,GAAA,GCvHA,SAASC,GAAiBpS,EAAO6C,EAAMx3H,GAClD,MAAMgnI,EAAYhnI,EAAQ38B,aAAe,KACnC0wJ,EAASiT,EAAUjT,SACzBA,EAAO/1J,GAAK22J,EAAMp+H,EAAIihI,EAAKj9H,OAAOhE,EAClCw9H,EAAO/iK,GAAK2jK,EAAMj5H,EAAI87H,EAAKj9H,OAAOmB,EAElCsrI,EAAUjT,OAAOA,GACjB/zH,EAAQ38B,UAAU2jK,GCRP,SAAS,GAAW7jK,EAAMk3G,EAAM4sD,EAAOC,EAAMC,GACxD,IAAIr4K,EASJ,OAPIA,EADU,UAAVm4K,EACQ5sD,EAAK9/E,OAAO2sI,GACH,QAAVD,EACC5sD,EAAK9/E,OAAO2sI,GAAQ7sD,EAAKl3G,KAAKgkK,GAAahkK,EAE3Ck3G,EAAK9/E,OAAO2sI,IAAS7sD,EAAKl3G,KAAKgkK,GAAahkK,GAAQ,EAGzDrU,ECVI,SAASs4K,GAAkBjkK,EAAMk3G,EAAM4sD,EAAOC,EAAMC,GAC/D,IAAIr4K,EASJ,OAPIA,EADU,UAAVm4K,EACQ5sD,EAAK9/E,OAAO2sI,GAAQ7sD,EAAKl3G,KAAKgkK,GAAahkK,EAClC,QAAV8jK,EACC5sD,EAAK9/E,OAAO2sI,GAEZ7sD,EAAK9/E,OAAO2sI,IAAS7sD,EAAKl3G,KAAKgkK,GAAahkK,GAAQ,EAGzDrU,ECFX,MAAM,GAAkB,CACpBu4K,aAAc,QACdC,eAAgB,QAChBC,WAAY,QACZC,QAAS,EACTC,YAAa,aACbC,YAAa,EACbn5I,MAAM,EACNo5I,QAAQ,GAGN,GAAU,CAAChJ,EAAU7iJ,KACvB6iJ,EAAS9zK,QAAQixB,IAGf8rJ,GAAiB,CAACjJ,EAAU7iJ,KAG9B,IAAK,IAAI2c,EAFMkmI,EAAStyK,OAEA,EAAGosC,GAAO,EAAGA,IACjC3c,EAAS6iJ,EAASlmI,GAAMA,IAkKjB,IAAA,GA9Jf,cAAqB,GAEjB,YAAY4hF,EAAMpvH,GACdunD,MAAM7nD,OAAOu8B,OAAO,GAAI,GAAiBj8B,IACzCM,KAAKi7K,MAAQnsD,EACb9uH,KAAKs8K,UAAY,GAGrB,KAAKjxK,GACD,OAAIA,GACArL,KAAKi7K,MAAQ5vK,EACNrL,MAGJA,KAAKi7K,MAGhB,WACI,MAAMv7K,EAAUM,KAAKN,QACf68K,EAAWv8K,KAAKs8K,UACM,eAAxB58K,EAAQw8K,aACRK,EAASX,UAAY,QACrBW,EAASC,gBAAkB,SAC3BD,EAASE,UAAY,IACrBF,EAASG,WAAa,MAEtBH,EAASX,UAAY,SACrBW,EAASC,gBAAkB,QAC3BD,EAASE,UAAY,IACrBF,EAASG,WAAa,KAGtBh9K,EAAQyc,SACRnc,KAAKV,QAAU+8K,GACfr8K,KAAK28K,aAAed,KAEpB77K,KAAKV,QAAU,GACfU,KAAK28K,aAAe,IAI5B,SACI,IAAK38K,KAAKi7K,OAAkC,IAAzBj7K,KAAKoxC,SAAStwC,OAC7B,OAEJd,KAAK48K,WAED58K,KAAKN,QAAQoY,WACb9X,KAAK8X,UAAU,MAGnB,MAAMpY,EAAUM,KAAKN,QACfovH,EAAO9uH,KAAKi7K,OACZ,OAAEl1D,EAAM,WAAE82D,GAAe78K,KAAK88K,eAC9B,UAAElB,EAAS,gBAAEY,EAAe,UAAEC,EAAS,WAAEC,GAAe18K,KAAKs8K,UAC7DS,EAAc,IAAI,GAClBC,EAAgB,IAAI,GACpBplK,EAAO,IAAI,GACjB,IACIixE,EAActxD,EAAO0lJ,EADrBC,EAAa,GAAWL,EAAY/tD,EAAMpvH,EAAQo8K,aAAcY,EAAYF,GAGhF,MAAMW,EAAkB,CAAClR,EAAM/+H,KAC3B,MAAMuH,EAAUld,EAAM67I,SAASlmI,GAE/B8vI,EAAcP,GAAa5zF,EAC3Bm0F,EAAcN,GAAc,GAAWzQ,EAAKr0J,KAAK4kK,GAAkBS,EAAUv9K,EAAQs8K,WAAYU,EAAYF,GAC7GhB,GAAiBwB,EAAe/Q,EAAMx3H,GACtCo0C,GAAgBojF,EAAKr0J,KAAKgkK,GAAal8K,EAAQu8K,SAGnD,IAAK,IAAImB,EAAW,EAAGA,EAAWr3D,EAAOjlH,OAAQs8K,IAC7C7lJ,EAAQwuF,EAAOq3D,GACfL,EAAYN,GAAa5zF,EAAe7oF,KAAK28K,aAAaplJ,EAAM3f,KAAMk3G,EAAMpvH,EAAQq8K,eAAgBU,EAAWb,GAC/GmB,EAAYL,GAAcQ,EAC1BtlK,EAAKgkK,GAAarkJ,EAAM3f,KACxBA,EAAK4kK,GAAmBjlJ,EAAM8lJ,SAC9BJ,EAAW,IAAI,GAAKF,EAAanlK,GACjC5X,KAAKV,QAAQi4B,EAAM+lJ,OAAQH,GAE3BD,GAAc3lJ,EAAM8lJ,SAAW39K,EAAQy8K,YAG3C,IAAKz8K,EAAQsjC,MAAQzL,EAAM3f,KAAOk3G,EAAKl3G,KAAKgkK,GAAY,CACpD,MAAM/jI,EAAQi3E,EAAKl3G,KAAKgkK,GAAaqB,EAASrlK,KAAKgkK,GAC7C2B,EAAcN,EAAS9S,UAAUtyH,MAAMA,EAAOA,GAE9C2lI,EAAW,GADEP,EAASrlK,KAAK4kK,GAAmB3kI,EACZi3E,EAAMpvH,EAAQo8K,aAAcY,EAAYF,GAC1E1kK,EAAY,KACA,MAAd2kK,EACA3kK,EAAUuxJ,UAAUv6C,EAAK9/E,OAAOhE,EAAIuyI,EAAYvyI,EAAGwyI,EAAWD,EAAYptI,GAE1Er4B,EAAUuxJ,UAAUmU,EAAWD,EAAYvyI,EAAG8jF,EAAK9/E,OAAOmB,EAAIotI,EAAYptI,GAE9Er4B,EAAU+/B,MAAMA,EAAOA,GAEvB73C,KAAK8X,UAAUA,IAIvB,cACI,MAAM,QAAEpY,EAAO,SAAE0xC,GAAapxC,MACxB,YAAEm8K,EAAW,KAAEn5I,EAAI,QAAEi5I,GAAYv8K,EACjCk8K,EAAY57K,KAAKs8K,UAAUV,UACjC,IAAIrkJ,EAAQv3B,KAAKy9K,YACjB,MAAM13D,EAAS,GACT23D,EAAW,WACb33D,EAAO1iH,KAAKk0B,GACZslJ,GAActlJ,EAAM8lJ,SAAWlB,GAEnC,IAAIU,GAAcV,EAElB,IAAK,IAAIjvI,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IAAO,CAC5C,IAAIuH,EAAUrD,EAASlE,GACnB++H,EAAO76H,EAASlE,GAAKwrI,cACrBjkI,EAAQ23H,WAAaH,IACjBjpI,GAAQzL,EAAM3f,KAAOq0J,EAAKr0J,KAAKgkK,GAAaK,EAAUj8K,KAAKi7K,MAAMrjK,KAAKgkK,GAC1C,IAAxBrkJ,EAAM+lJ,OAAOx8K,QACbd,KAAK29K,YAAYpmJ,EAAO00I,EAAMx3H,GAC9BipI,IACAnmJ,EAAQv3B,KAAKy9K,cAEbC,IACAnmJ,EAAQv3B,KAAKy9K,YACbz9K,KAAK29K,YAAYpmJ,EAAO00I,EAAMx3H,IAGlCz0C,KAAK29K,YAAYpmJ,EAAO00I,EAAMx3H,IAS1C,OAJIld,EAAM+lJ,OAAOx8K,QACb48K,IAGG,CACH33D,OAAQA,EACR82D,WAAYA,GAIpB,YAAYtlJ,EAAO00I,EAAMx3H,GACrBld,EAAM3f,MAAQq0J,EAAKr0J,KAAK5X,KAAKs8K,UAAUV,WAAa57K,KAAKN,QAAQu8K,QACjE1kJ,EAAM8lJ,SAAW9zK,KAAKqS,IAAIqwJ,EAAKr0J,KAAK5X,KAAKs8K,UAAUE,iBAAkBjlJ,EAAM8lJ,UAC3E9lJ,EAAM+lJ,OAAOj6K,KAAK4oK,GAClB10I,EAAM67I,SAAS/vK,KAAKoxC,GAGxB,YACI,MAAO,CACH4oI,SAAU,EACVzlK,MAAO5X,KAAKN,QAAQu8K,QACpBqB,OAAQ,GACRlK,SAAU,MCjLtB,MAAM,WAAa,GAAU,GAAW,GAAa,OACjD,eACI,MAAO,OAGX,YAAY7E,EAAW,IAAI,GAAgB7uK,EAAU,IACjDunD,MAAMvnD,GAENM,KAAKuuK,SAASA,GAETtH,GAAQjnK,KAAKN,QAAQitK,SACtB3sK,KAAK2sK,OAAO,QAIpB,MAAMnE,GACF,OAAOxoK,KAAKwuK,UAAUvC,KAAKzD,GAG/B,UACI,OAAOxoK,KAAKwuK,UAAUvC,OAG1B,eAAe7C,GACX,OAAOppK,KAAKwuK,UAAUzD,cAAc3B,GAGxC,UAAUA,GACN,OAAOppK,KAAKuuK,WAAW9B,UAAUrD,EAAOppK,KAAKN,QAAQitK,OAAOv8H,MAAQ,IAI7D,IAAA,GAAA,GCrCA,SAASwtI,GAAcxK,EAAUtkD,EAAM+uD,EAAWlC,EAAMC,GACnE,IAAK,IAAI1uI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IAAO,CAC5C,MAAM++H,EAAOmH,EAASlmI,GAAKwrI,cAC3B,GAAIzM,EAAM,CACN,MAAM7C,EAAQ6C,EAAKj9H,OAAO3Y,QAC1B+yI,EAAMuS,GAAQ,GAAW1P,EAAKr0J,KAAKgkK,GAAY9sD,EAAM+uD,GAAa,QAASlC,EAAMC,GACjFJ,GAAiBpS,EAAO6C,EAAMmH,EAASlmI,MCNpC,SAAS,GAAMkmI,EAAUtkD,EAAM+uD,GAC1CD,GAAcxK,EAAUtkD,EAAM+uD,EAAW,IAAK,SCFnC,SAAS,GAAOzK,EAAUtkD,EAAM+uD,GAC3CD,GAAcxK,EAAUtkD,EAAM+uD,EAAW,IAAK,UCAnC,SAASC,GAAc1K,EAAU2K,EAAWC,EAAWpC,GAClE,GAAIxI,EAAStyK,OAAS,EAAG,CACrB,MAAMkuC,EAAS,IAAI,GACnB,IAAIivI,EAAe7K,EAAS,GAAGnH,KAE/B,IAAK,IAAI/+H,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IAAO,CAC5C,IAAIuH,EAAU2+H,EAASlmI,GAAKuH,QACxBw3H,EAAOmH,EAASlmI,GAAK++H,KACzBj9H,EAAO+uI,GAAaE,EAAajvI,OAAO+uI,GAAaE,EAAarmK,KAAKgkK,GACvE5sI,EAAOgvI,GAAa/R,EAAKj9H,OAAOgvI,GAChCxC,GAAiBxsI,EAAQi9H,EAAMx3H,GAC/Bw3H,EAAKj9H,OAAO+uI,GAAa/uI,EAAO+uI,GAChCE,EAAehS,ICfZ,SAASiS,GAAoB9K,GACxC,MAAM0K,EAAgB,GAEtB,IAAK,IAAI5wI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IAAO,CAC5C,IAAIuH,EAAU2+H,EAASlmI,GACnB++H,EAAOx3H,EAAQikI,cACfzM,GACA6R,EAAcz6K,KAAK,CACfoxC,QAASA,EACTw3H,KAAMA,IAKlB,OAAO6R,ECXI,SAAS,GAAM1K,GAC1B0K,GAAcI,GAAoB9K,GAAW,IAAK,IAAK,SCD5C,SAAS+K,GAAO/K,GAC3B0K,GAAcI,GAAoB9K,GAAW,IAAK,IAAK,UC6C5C,SAASgL,GAAahL,EAAUtkD,EAAM6sD,EAAMqC,EAAWpC,GAClE,MAAM9e,EA/CV,SAAmBsW,EAAUtkD,EAAM8sD,GAC/B,MAAMyC,EAAUvvD,EAAKl3G,KAAKgkK,GACpB9e,EAAS,GACf,IAEIroH,EAASw3H,EAFTzqJ,EAAQ,GACR88J,EAAY,EAGhB,MAAMC,EAAoB,WACtB/8J,EAAMne,KAAK,CACPoxC,QAASA,EACTw3H,KAAMA,KAId,IAAK,IAAI/+H,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IAIrC,GAHAuH,EAAU2+H,EAASlmI,GAEnB++H,EAAOx3H,EAAQikI,cACXzM,EAAM,CACN,IAAIr0J,EAAOq0J,EAAKr0J,KAAKgkK,GACjB0C,EAAY1mK,EAAOymK,EACf78J,EAAM1gB,QACNg8J,EAAOz5J,KAAKme,GACZA,EAAQ,GACR+8J,IACAD,EAAY1mK,IAEZ2mK,IACAzhB,EAAOz5J,KAAKme,GACZA,EAAQ,GACR88J,EAAY,IAGhBC,IACAD,GAAa1mK,GASzB,OAJI4J,EAAM1gB,QACNg8J,EAAOz5J,KAAKme,GAGTs7I,EA3CX,CA+C6BsW,EAAUtkD,EAAM8sD,GACnC5sI,EAAS8/E,EAAK9/E,OAAO3Y,QACrB3uB,EAAS,GAEf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM4vH,EAAOh8J,OAAQosC,IAAO,CAC1C,IAAI1rB,EAAQs7I,EAAO5vH,GACfg+B,EAAe1pD,EAAM,GACzBwtB,EAAOgvI,GAAa9yG,EAAa+gG,KAAKj9H,OAAOgvI,GAC7CxC,GAAiBxsI,EAAQk8B,EAAa+gG,KAAM/gG,EAAaz2B,SACzDy2B,EAAa+gG,KAAKj9H,OAAO2sI,GAAQ3sI,EAAO2sI,GACxCmC,GAAct8J,EAAOm6J,EAAMqC,EAAWpC,GACtCl0K,EAAOrE,KAAK,IACZ,IAAK,IAAIm7K,EAAa,EAAGA,EAAah9J,EAAM1gB,OAAQ09K,IAChD92K,EAAOwlC,GAAK7pC,KAAKme,EAAMg9J,GAAY/pI,SAG3C,OAAO/sC,EChEI,SAAS,GAAK0rK,EAAUtkD,GACnC,OAAOsvD,GAAahL,EAAUtkD,EAAM,IAAK,IAAK,SCDnC,SAAS2vD,GAAMrL,EAAUtkD,GACpC,OAAOsvD,GAAahL,EAAUtkD,EAAM,IAAK,IAAK,UCDnC,SAAS,GAAIr6E,EAASq6E,GACjC,MAAMm9C,EAAOx3H,EAAQikI,cACrB,GAAIzM,EAAM,CACN,MAAMyS,EAAczS,EAAKr0J,KACnB+mK,EAAW7vD,EAAKl3G,KACtB,GAAI+mK,EAASvuI,MAAQsuI,EAAYtuI,OAASuuI,EAAS9U,OAAS6U,EAAY7U,OAAQ,CAC5E,MAAMhyH,EAAQtuC,KAAKC,IAAIm1K,EAASvuI,MAAQsuI,EAAYtuI,MAAOuuI,EAAS9U,OAAS6U,EAAY7U,QACnF/xJ,EAAY28B,EAAQ38B,aAAe,KACzCA,EAAU+/B,MAAMA,EAAOA,GACvBpD,EAAQ38B,UAAUA,KCDf,IAAA,GARf,cAAyB,GACrB,UACI9X,KAAKqnK,cAAc,CACfP,MAAO,YCHnB,SAAS8X,GAAgBn0K,GACrB,OAAO,SAASY,GACZ,OAAI47J,GAAQ57J,IACRrL,KAAKN,QAAQb,IAAI4L,EAAMY,GAChBrL,MAGJA,KAAKN,QAAQuhB,IAAIxW,ICHhC,MAAM,GAAU,CAAE,SAAU,QAAS,WAErC,MAAM,WDWc,EAACo9J,EAAOvb,KACxB,MAAM5kJ,EAAS,cAAcmgK,IAG7B,OAVJ,SAAgCt1I,EAAI+5H,GAChC,IAAK,IAAI5rJ,EAAI,EAAGA,EAAI4rJ,EAAMxrJ,OAAQJ,IAC9B6xB,EAAG+5H,EAAM5rJ,IAAMk+K,GAAgBtyB,EAAM5rJ,IAF7C,CAQ2BgH,EAAOzG,UAAWqrJ,GAElC5kJ,GCfL,CAAiC,GAAc,KACjD,YAAYqN,EAAQ22J,EAAOoC,GACvB7mH,QAEAjnD,KAAKN,QAAU,IAAI,GAAa,CAC5BqV,OAAQA,EACR22J,MAAOA,EACPoC,QAAS7G,GAAQ6G,GAAWA,EAAU,IAG1C9tK,KAAKN,QAAQsnK,YAAYhnK,MAG7B,cAAcpC,GACV,GAAIqpK,GAAQrpK,GAAM,CACd,IAAIwlD,EASJ,OAPIA,EADAxlD,aAAe,GACRA,EACAA,EAAIkD,OAAS,EACb,IAAI,GAAalD,EAAI,GAAIA,EAAI,GAAIA,EAAI,IAErC,IAAI,GAAaA,EAAImX,OAAQnX,EAAI8tK,MAAO9tK,EAAIkwK,SAGhD1qH,IAKJ,IAAA,GAAA,GCwBA,GAxDf,cAAuB,GACnB,eACI,MAAO,WAGX,YAAY1jD,EAAU,IAClBunD,QAEAjnD,KAAK6+K,MAAQ,IAAI,GAAW7+K,KAAK8+K,aAAap/K,EAAQm/K,QACtD7+K,KAAK6+K,MAAM7X,YAAYhnK,MACvBA,KAAK++K,WAAar/K,EAAQs/K,UAC1Bh/K,KAAKsuB,GAAKi9I,KAGd,UAAUlgK,GACN,OAAI47J,GAAQ57J,IACRrL,KAAK++K,WAAa1zK,EAClBrL,KAAKqnK,gBACErnK,MAGJA,KAAK++K,WAGhB,aAAaF,EAAQ,IACjB,MAAMn3K,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM2xI,EAAM/9K,OAAQosC,IAClCxlC,EAAOrE,KAAK,GAAa2H,OAAO6zK,EAAM3xI,KAG1C,OAAOxlC,EAGX,QAAQqN,EAAQ22J,EAAOoC,GACnB9tK,KAAK6+K,MAAMx7K,KAAK,IAAI,GAAa0R,EAAQ22J,EAAOoC,IAGpD,WAAW1qH,GACP,MAAMpvC,EAAQhU,KAAK6+K,MAAMh9K,QAAQuhD,GAC7BpvC,GAAS,GACThU,KAAK6+K,MAAM7kK,OAAOhG,EAAO,GAIjC,cAAcvB,GACVzS,KAAK6qI,QAAQ,gBAAiB,CAC1Bi8B,MAAO,YAAcr0J,EAAI,IAAMA,EAAEq0J,MAAQ,IACzCz7J,MAAOrL,OAIf,iBACIA,KAAKqnK,kBCpDb,MAAM,GAAS,CAAE,QAAS,OAE1B,MAAM,WAAuB,GAAW,GAAU,KAC9C,YAAY3nK,EAAU,IAClBunD,MAAMvnD,GAENM,KAAKuD,MAAM7D,EAAQ6D,OAAS,IAAI,IAChCvD,KAAKqH,IAAI3H,EAAQ2H,KAAO,IAAI,GAAM,EAAG,KAI9B,IAAA,GAAA,GCVf,MAAM,WAAuB,GAAW,GAAU,CAAE,YAChD,YAAY3H,EAAU,IAClBunD,MAAMvnD,GAENM,KAAK02C,OAAOh3C,EAAQg3C,QAAU,IAAI,IAClC12C,KAAKi/K,QAAUhY,GAAQvnK,EAAQwtK,QAAUxtK,EAAQwtK,OAAS,EAC1DltK,KAAKk/K,cAAgBx/K,EAAQy/K,aAGjC,OAAO9zK,GACH,OAAI47J,GAAQ57J,IACRrL,KAAKi/K,QAAU5zK,EACfrL,KAAK2nK,iBACE3nK,MAGJA,KAAKi/K,QAGhB,aAAa5zK,GACT,OAAI47J,GAAQ57J,IACRrL,KAAKk/K,cAAgB7zK,EACrBrL,KAAKqnK,gBACErnK,MAGJA,KAAKk/K,eAIL,IAAA,GAAA,GCpCR,SAASE,GAAMt7I,GAClB,MAAO,GAAMv6B,KAAKm/J,IAAI5kI,EAAWv6B,KAAKwvC,IAAM,EAGzC,SAASsmI,GAAOv7I,GACnB,OAAOA,EAGJ,SAASw7I,GAAex7I,EAAUrK,EAAMl2B,EAAOqgH,GAClD,IAAIliH,EAAI,QACJlC,EAAI,EACJP,EAAI2kH,EAER,OAAiB,IAAb9/E,EACOvgC,EAGM,IAAbugC,EACOvgC,EAAQqgH,GAGdpkH,IACDA,EAAI,IAGJP,EAAIsK,KAAK+mC,IAAIszE,IACb3kH,EAAI2kH,EACJliH,EAAIlC,EAAI,GAERkC,EAAIlC,GAAK,EAAI+J,KAAKwvC,IAAMxvC,KAAKg2K,KAAK37D,EAAO3kH,GAGtCA,EAAIsK,KAAK0+J,IAAI,GAAI,GAAKnkI,GACtBv6B,KAAKo/J,KAAK19H,OAAOnH,GAAYpiC,IAAM,IAAM6H,KAAKwvC,IAAMv5C,GAAKokH,EAAOrgH,GC7B5D,IAAA,GAJHkV,KAAKmC,KAAO,WACpB,OAAA,IAAWnC,MAAOyoG,WCDP,SAASs+D,GAAWn0K,EAAO7B,EAAKoS,GAC3C,OAAOrS,KAAKqS,IAAIrS,KAAKC,IAAI6B,EAAOuQ,GAAMpS,GCD1C,IAAIi2K,GAAuBlvJ,IACvB,MAAMmvJ,EAAwB,oBAAX3tI,OAAyBA,OAAS,GAC/C4tI,EAAiBD,EAAI99G,uBACP89G,EAAIE,6BACJF,EAAIG,0BACJH,EAAII,wBACJJ,EAAIK,yBACJ,SAASxvJ,GAAYzV,WAAWyV,EAAU,IAAO,KAErEkvJ,GAAsBlvJ,GAAYovJ,EAAejsK,KAAKgsK,EAAKnvJ,GAC3DkvJ,GAAoBlvJ,IAGT,IAAA,GAAA,GCXf,IAAI,GAEJ,MAAM,WAAyB,GAC3B,qBAKI,OAJK,KACD,GAAW,IAAI,IAGZ,GAGX,cACI02B,QAEAjnD,KAAKggL,OAAS,GAGlB,SAASv1K,EAAMnH,GACXtD,KAAKggL,OAAO38K,KAAK,CACboH,KAAMA,EACNnH,KAAMA,IAId,OAAOmxC,EAAS/0C,GACZ,MAAM0zD,EAAQpzD,KAAKggL,OACnB,IAAIjgL,EAEJ,GAAIL,GAAWA,EAAQ4D,KAAM,CACzB,MAAMA,EAAO5D,EAAQ4D,KAAKkD,cAC1B,IAAK,IAAI9F,EAAI,EAAGA,EAAI0yD,EAAMtyD,OAAQJ,IAC9B,GAAI0yD,EAAM1yD,GAAG+J,KAAKjE,gBAAkBlD,EAAM,CACtCvD,EAAQqzD,EAAM1yD,GACd,OAKZ,GAAIX,EACA,OAAO,IAAIA,EAAMuD,KAAKmxC,EAAS/0C,IAK5B,IAAA,GAAA,GC+BA,GAxEf,cAAwB,GACpB,cAAc4D,EAAMmxC,EAAS/0C,GACzB,OAAO,GAAiB2W,QAAQrL,OAAO1H,EAAMmxC,EAAS/0C,GAG1D,cACI,OAAOM,KAAKigL,UAAY,CACpB9a,SAAU,IACV+a,OAAQ,SAIhB,YAAY70K,GACRrL,KAAKigL,SAAW50K,EAGpB,YAAYopC,EAAS/0C,GACjBunD,QAEAjnD,KAAKN,QAAUN,OAAOu8B,OAAO,GAAI37B,KAAKN,QAASA,GAC/CM,KAAKy0C,QAAUA,EAGnB,SACA,QAEA,OACI,MAAM/0C,EAAUM,KAAKN,SACf,SAAEylK,EAAQ,MAAE9qI,EAAQ,GAAM36B,EAC1BwgL,EAAS,EAAgBxgL,EAAQwgL,QACjC38K,EAAQ,KAAQ82B,EAChB8lJ,EAAS58K,EAAQ4hK,EAEN,IAAbA,GACAnlK,KAAKozB,KAAK,GACVpzB,KAAKu8H,SAELzhH,WAAW,KACP,MAAMslK,EAAO,KACT,GAAIpgL,KAAKqgL,SACL,OAGJ,MAAMC,EAAW,KAEX7mJ,EAAO+lJ,GAAWc,EAAW/8K,EAAO,EAAG4hK,GAEvCob,EAAiBL,EADNzmJ,EAAO0rI,EACgB1rI,EAAM,EAAG,EAAG0rI,GAEpDnlK,KAAKozB,KAAKmtJ,GAEND,EAAWH,EACX,GAAeC,GAEfpgL,KAAKu8H,SAIb6jD,KACD/lJ,GAIX,QACIr6B,KAAKqgL,UAAW,EAGpB,UACIrgL,KAAKu8H,UCrEb,IAAI,GAEJ,MAAM,WAAmB,GACrB,qBAKI,OAJK,KACD,GAAW,IAAI,IAGZ,GAGX,MAAMxxF,EAAKrrC,GACP,MAAM8gL,EAAY,IAAI,GAAU9gL,GAChC,OAAO,GAAU8gL,EAAWz1I,IAIrB,IAAA,GAAA,GCmEA,GAtFf,cAAuB,GACnB,YAAY01I,GACRx5H,QAEAjnD,KAAK0gL,WAAa,GAClB1gL,KAAKqmB,OAAS,KAEVo6J,IACAzgL,KAAKygL,WAAaA,EAClBzgL,KAAK65H,WAIb,UACQ75H,KAAKygL,YACLzgL,KAAKygL,WAAW1Z,eAAe/mK,MAGnC,MAAMoxC,EAAWpxC,KAAK0gL,WACtB,IAAK,IAAIhgL,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IACjCV,KAAK0gL,WAAWhgL,GAAGy4C,UAGvBn5C,KAAKqmB,OAAS,KAGlB,QAEA,UACQrmB,KAAKygL,YACLzgL,KAAKygL,WAAWzZ,YAAYhnK,MAIpC,OAAO8zC,GACH9zC,KAAK0gL,WAAWr9K,KAAKywC,GACrBA,EAAKztB,OAASrmB,KAGlB,SAAS8zC,EAAMgzE,GACX9mH,KAAK0gL,WAAW1mK,OAAO8sG,EAAK,EAAGhzE,GAC/BA,EAAKztB,OAASrmB,KAGlB,OAAOgU,EAAO4hB,GACV,MAAMvuB,EAAM2M,EAAQ4hB,EACpB,IAAK,IAAIl1B,EAAIsT,EAAOtT,EAAI2G,EAAK3G,IACzBV,KAAK0gL,WAAWhgL,GAAGigL,aAEvB3gL,KAAK0gL,WAAW1mK,OAAOhG,EAAO4hB,GAGlC,aACI51B,KAAK4e,QACL5e,KAAKm5C,UAGT,QACIn5C,KAAKshC,OAAO,EAAGthC,KAAK0gL,WAAW5/K,QAGnC,aACQd,KAAKqmB,QACLrmB,KAAKqmB,OAAOu6J,aAIpB,iBACI5gL,KAAK4gL,aAGT,gBACI5gL,KAAK4gL,aAGT,eAAenuK,GACM,QAAbA,EAAEmb,OACF5tB,KAAKk6D,KAAKznD,EAAE2gD,MAAO3gD,EAAEuB,OACD,WAAbvB,EAAEmb,QACT5tB,KAAKshC,OAAO7uB,EAAEuB,MAAOvB,EAAE2gD,MAAMtyD,QAGjCd,KAAK4gL,eCyBb,SAAS,GAAWv1K,GAChB,MAAwB,mBAAVA,EAGlB,SAASw1K,GAASx1K,GACd,MAAwB,iBAAVA,EAAqB,CAAEA,GAAUA,EAGnD,SAAS,KACLrL,KAAK8gL,mBAAoB,EAG7B,SAAS,KACL,OAAkC,IAA3B9gL,KAAK8gL,kBAGD,IAAA,GA3Hf,cAAyB,GACrB,cACI75H,QAEAjnD,KAAK+gL,QAAU,GAGnB,KAAKx3F,EAAW3pC,EAAUohI,GACtB,MAAMC,EAAaJ,GAASt3F,GACtB23F,EAAqB,GAAWthI,GAChC9+C,EAASmgL,EAAWngL,OAE1B,QAAiBoV,IAAb0pC,EAAwB,CACxB,IAAK,IAAIknH,KAASv9E,EACdvpF,KAAK44B,KAAKkuI,EAAOv9E,EAAUu9E,IAE/B,OAAO9mK,KAGX,IAAK,IAAIktC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,MAAMq8C,EAAY03F,EAAW/zI,GAE7B,IAAIsG,EAAU0tI,EAAqBthI,EAAWA,EAAS2pC,GAEvD,GAAI/1C,EAAS,CACT,GAAIwtI,EAAK,CACL,MAAMG,EAAW3tI,EACjBA,EAAU,KACNxzC,KAAKohL,OAAO73F,EAAW/1C,GACvB2tI,EAAS7tK,MAAMtT,KAAMsI,YAEzBkrC,EAAQ2tI,SAAWA,GAEVnhL,KAAK+gL,QAAQx3F,GAAavpF,KAAK+gL,QAAQx3F,IAAc,IAC3DlmF,KAAKmwC,IAIpB,OAAOxzC,KAGX,IAAIihL,EAAYrhI,GACZ,OAAO5/C,KAAK44B,KAAKqoJ,EAAYrhI,GAAU,GAG3C,MAAM2pC,EAAW3pC,GACb,MAAMqhI,EAAaJ,GAASt3F,GACtB23F,EAAqB,GAAWthI,GAEtC,IAAK,IAAI1S,EAAM,EAAGpsC,EAASmgL,EAAWngL,OAAQosC,EAAMpsC,EAAQosC,IAAO,CAC/D,MAAMq8C,EAAY03F,EAAW/zI,GAEvBsG,EAAU0tI,EAAqBthI,EAAWA,EAAS2pC,GAErD/1C,IACexzC,KAAK+gL,QAAQx3F,GAAavpF,KAAK+gL,QAAQx3F,IAAc,IAC7D7S,QAAQljC,GAIvB,OAAOxzC,KAGX,QAAQupF,EAAW92E,EAAI,IACnB,IAAIixC,EAAS1jD,KAAK+gL,QAAQx3F,GAE1B,GAAI7lC,EAAQ,CACR,MAAM5iD,EAAS4iD,EAAO5iD,OAEtB2R,EAAE4uK,OAASrhL,KACXyS,EAAEquK,mBAAoB,EACtBruK,EAAEkuC,eAAiB,GACnBluC,EAAE6uK,mBAAqB,GAEvB59H,EAASA,EAAOx/C,QAEhB,IAAK,IAAIgpC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5BwW,EAAOxW,GAAKx5B,KAAK1T,KAAMyS,GAG3B,OAA+B,IAAxBA,EAAEquK,kBAGb,OAAO,EAGX,OAAOv3F,EAAW/1C,GACd,MAAMkQ,EAAS1jD,KAAK+gL,QAAQx3F,GAE5B,QAAkBrzE,IAAdqzE,EACAvpF,KAAK+gL,QAAU,QACZ,GAAIr9H,EACP,GAAIlQ,EACA,IAAK,IAAItG,EAAMwW,EAAO5iD,OAAS,EAAGosC,GAAO,EAAGA,IACpCwW,EAAOxW,KAASsG,GAAWkQ,EAAOxW,GAAKi0I,WAAa3tI,GACpDkQ,EAAO1pC,OAAOkzB,EAAK,QAI3BltC,KAAK+gL,QAAQx3F,GAAa,GAIlC,OAAOvpF,OCzGA,SAAS,GAAcy0C,EAAS/H,GAC3C,MAAMhlC,EAAS,GACT+kC,EAAQsF,OAAOwvI,iBAAiB9sI,IAAY,GAC5C+sI,EAAc5sK,MAAM4I,QAAQkvB,GAAUA,EAAS,CAAEA,GAEvD,IAAK,IAAIQ,EAAM,EAAGA,EAAMs0I,EAAY1gL,OAAQosC,IAAO,CAC/C,IAAI45H,EAAQ0a,EAAYt0I,GACxBxlC,EAAOo/J,GAASr6H,EAAMq6H,GAG1B,OAAOp/J,ECPX,SAAS+5K,GAAUp2K,GACf,OAAI25B,MAAM35B,GACCA,EAEJA,EAAQ,KAGJ,SAAS,GAAYopC,EAAS78B,GACzC,IAAIA,EAWG,CACH,MAAMA,EAAO,GAAc68B,EAAS,CAAE,QAAS,WAE/C,MAAO,CACHrE,MAAOz+B,SAASiG,EAAKw4B,MAAO,IAC5By5H,OAAQl4J,SAASiG,EAAKiyJ,OAAQ,KAhB5B,CACN,MAAM,MAAEz5H,EAAK,OAAEy5H,GAAWjyJ,EAEtBqvJ,GAAQ72H,KACRqE,EAAQhI,MAAM2D,MAAQqxI,GAAUrxI,IAGhC62H,GAAQ4C,KACRp1H,EAAQhI,MAAMo9H,OAAS4X,GAAU5X,KCnB9B,SAAS6X,GAAajvK,EAAI,IACrC,OAAOA,EAAE+pC,MAAQ/pC,EAAE+pC,MAAMmlI,aAAelvK,EAAEoxB,OCC/B,SAAS+9I,GAAentI,GACnC,MAAM,YAAEotI,EAAW,WAAEC,GAAe,GAAcrtI,EAAS,CAAE,cAAe,eAC5E,MAAO,CACHw6E,IAAKx9G,WAAWqwK,GAChBnwI,KAAMlgC,WAAWowK,ICNV,SAAS,GAAcptI,GAClC,MAAM6lI,EAAM7lI,EAAQs6E,wBAEdgzD,EAAkB/vI,SAAS+vI,gBAEjC,MAAO,CACH9yD,IAAKqrD,EAAIrrD,KAAOl9E,OAAOm9E,aAAe6yD,EAAgBC,YAAcD,EAAgBE,WAAa,GACjGtwI,KAAM2oI,EAAI3oI,MAAQI,OAAOi9E,aAAe+yD,EAAgBG,aAAeH,EAAgBI,YAAc,ICL9F,SAASC,GAAiB3vK,GACrC,OAAIw0J,IAASx0J,EAAEu4B,GAAK,IAAIq2B,UACb,CACHr2B,EAAGv4B,EAAEu4B,EAAEq2B,SACPlxB,EAAG19B,EAAE09B,EAAEkxB,UAIR,CACHr2B,EAAGv4B,EAAE4vK,OAAS5vK,EAAEgmC,SAAW,EAC3BtI,EAAG19B,EAAE6vK,OAAS7vK,EAAEimC,SAAW,GCVnC,MAAM6pI,GAAe,iBAYrB,SAASC,GAAgB/tI,GACrB,MAAM38B,EAAYypK,iBAAiB9sI,GAAS38B,UAE5C,MAAkB,SAAdA,EACO,GAAO+0G,OAdtB,SAAqB41D,GACjB,MAAM1iL,EAAQ0iL,EAAa1iL,MAAMwiL,IACjC,GAAc,OAAVxiL,GAAmC,IAAjBA,EAAMe,OACxB,OAAO,GAAO+rH,OAGlB,MAAM61D,EAAU3iL,EAAM,GAAGpB,MAAM,KAAK8C,IAAIupC,GAAKv5B,WAAWu5B,IACxD,OAAO,IAAI,MAAU03I,GAPzB,CAiBuB5qK,GAGR,SAAS6qK,GAAaluI,GACjC,IAAKA,EACD,OAAO,GAAOo4E,OAGlB,IAAI27C,EAASga,GAAgB/tI,GACzBpuB,EAASouB,EAAQk8E,cACrB,KAAOtqG,GAAQ,CACX,MAAMwlJ,EAAe2W,GAAgBn8J,GACrCmiJ,EAASA,EAAO4C,aAAaS,GAC7BxlJ,EAASA,EAAOsqG,cAIpB,OADA63C,EAAOtpK,EAAIspK,EAAO1pK,EAAI0pK,EAAO/1J,EAAI+1J,EAAO/iK,EAAI,EACrC+iK,ECjCX,MAAM,GAAS,CACX,QACA,aACA,aACA,YACA,UAuJW,IAAA,GApJf,cAAsB,GAClB,YAAY/zH,EAAS/0C,GACjBunD,QAEAjnD,KAAKN,QAAUN,OAAOu8B,OAAO,GAAIj8B,GACjCM,KAAKy0C,QAAUA,EACfz0C,KAAKy0C,QAAQmuI,mBAAqB5iL,KAAK6iL,aAAajqJ,KAAK54B,MAEzDA,KAAK8iL,OAAS9iL,KAAK+iL,SAAS,SAC5B/iL,KAAKgjL,YAAchjL,KAAK+iL,SAAS,cACjC/iL,KAAKijL,YAAcjjL,KAAK+iL,SAAS,cACjC/iL,KAAKkjL,WAAaljL,KAAK+iL,SAAS,aAEhC/iL,KAAKmjL,QAAU,IAAI,GAEnB,GAAY1uI,EAASz0C,KAAKN,SAE1BM,KAAK44B,KAAK,GAAQ54B,KAAKN,SAEvBM,KAAKojL,kBAGT,KAAK3uI,GACDz0C,KAAKmjL,QAAQ/xI,SAAS/tC,KAAKoxC,GAG/B,QACIz0C,KAAKmjL,QAAQ/xI,SAAW,GAG5B,UACIpxC,KAAKmjL,QAAU,KACfnjL,KAAKy0C,QAAQmuI,mBAAqB,KAClC5iL,KAAKohL,SAGT,YAAY3uK,GACR,IACIqhC,EADAuvI,EAAU3B,GAAajvK,GAG3B,MAAQqhC,GAAQuvI,IACZvvI,EAAOuvI,EAAQC,WACXD,IAAYrjL,KAAKy0C,UAIrB4uI,EAAUA,EAAQ1yD,cAGtB,GAAI78E,EACA,OAAOA,EAAK2sI,WAIpB,eACI,OAAOzgL,KAAKmjL,QAGhB,UACI,OAAO,GAAYnjL,KAAKy0C,SAG5B,YAAY78B,GACR,IAAIA,EAGA,OAAO5X,KAAKq5K,MAFZr5K,KAAKq5K,MAAQzhK,EAMrB,QAAQA,GACJ,GAAY5X,KAAKy0C,QAAS78B,GAE1B5X,KAAKujL,YAAY3rK,GACjB5X,KAAKwjL,UAGT,OAAOngI,GACH,MAAMzrC,EAAO5X,KAAKyjL,UACZF,EAAcvjL,KAAKujL,eAErBlgI,IAAUzrC,EAAKw4B,MAAQ,GAAKx4B,EAAKiyJ,OAAS,MAAQ0Z,GAAe3rK,EAAKw4B,QAAUmzI,EAAYnzI,OAASx4B,EAAKiyJ,SAAW0Z,EAAY1Z,WACjI7pK,KAAKujL,YAAY3rK,GACjB5X,KAAKwjL,QAAQ5rK,EAAMyrC,GACnBrjD,KAAK6qI,QAAQ,SAAUjzH,IAI/B,KAAKvM,GACD,IAAKA,EACD,OAAOrL,KAAKyjL,UAGhBzjL,KAAK+pK,QAAQ1+J,GAGjB,kBACIrL,KAAK0jL,oBAAqB,EAG9B,iBACI1jL,KAAK0jL,oBAAqB,EAG9B,mBAEA,WAEA,SAASn6F,GACL,OAAQ92E,IACJ,MAAMqhC,EAAO9zC,KAAK2jL,YAAYlxK,GAC1BqhC,IAAS9zC,KAAK0jL,oBACd1jL,KAAK6qI,QAAQthD,EAAW,CACpB90C,QAASX,EACT8vI,cAAenxK,EACfnP,KAAMimF,KAMtB,iBACI,MAAM90C,EAAUz0C,KAAKy0C,QACfovI,EAAUjC,GAAentI,IACzB,KAAE9C,EAAI,IAAEs9E,GAAQ,GAAcx6E,GAEpC,MAAO,CACH9C,KAAMA,EAAOkyI,EAAQlyI,KACrBs9E,IAAKA,EAAM40D,EAAQ50D,KAI3B,cAAcx8G,GACV,MAAMsC,EAAS/U,KAAK8jL,iBACdC,EAAQ3B,GAAiB3vK,GACzBu4B,EAAI+4I,EAAM/4I,EAAIj2B,EAAO48B,KACrBxB,EAAI4zI,EAAM5zI,EAAIp7B,EAAOk6G,IAErB+0D,EAAmBrB,GAAa3iL,KAAKy0C,SAASrY,SAMpD,OALc,IAAI,GACd4O,EACAmF,GACFr4B,UAAUksK,KCzJL,SAASC,GAAa/8J,GACjC,MAAM5lB,EAAUywC,OAAOzwC,aAEA,IAAb,GAA4BA,EAAQwtC,KAC1CxtC,EAAQwtC,IAAI5nB,GCJL,SAASg9J,GAAWz5K,EAAMY,GACrC,OAAQ47J,GAAQ57J,IAAoB,OAAVA,EAAkB,IAAKZ,MAAWY,MAAa,GCD9D,SAAS84K,GAActkH,GAClC,IAAIxyB,EAAS,GACb,IAAK,IAAI3sC,EAAI,EAAGA,EAAIm/D,EAAM/+D,OAAQJ,IAC9B2sC,GAAU62I,GAAWrkH,EAAMn/D,GAAG,GAAIm/D,EAAMn/D,GAAG,IAG/C,OAAO2sC,ECNI,SAAS+2I,GAAYvkH,GAChC,IAAIxyB,EAAS,GACb,IAAK,IAAI3sC,EAAI,EAAGA,EAAIm/D,EAAM/+D,OAAQJ,IAAK,CACnC,IAAI2K,EAAQw0D,EAAMn/D,GAAG,GACjBumK,GAAQ57J,KACRgiC,GAAUwyB,EAAMn/D,GAAG,GAAK,IAAM2K,EAAQ,KAI9C,GAAe,KAAXgiC,EACA,OAAOA,ECVA,IAAA,GAFE,GCAjB,MAAMg3I,GAAS,6BCEf,IAAIC,GAAY,SAASlqG,EAAWmqG,GAChCnqG,EAAUlS,UAAYq8G,GAG1B,GAAwB,oBAAbvyI,SAA0B,CACjC,MAAMwyI,EAAe,eAAiBH,GAAS,WACzCI,EAAgBzyI,SAASI,cAAc,OACvCsyI,EAAiC,oBAAdr8G,UAEzBo8G,EAAcv8G,UAAYs8G,EAEtBE,GAAaD,EAAcr5G,WAAWrL,eAAiBskH,KACvDC,GAAY,SAASlqG,EAAWmqG,GAC5B,MACMI,GAAAA,IADat8G,WACKa,gBAAgBq7G,EAAK,YACvCK,EAAc5yI,SAAS6yI,UAAUF,EAAS5C,iBAEhD3nG,EAAUlS,UAAY,GACtBkS,EAAUnS,YAAY28G,KAKnB,IAAA,GAAA,GCIf,IAAIE,GAAU,GAaC,IAAA,GAXC,CACZ,cACI,MAAsB,oBAAX/yI,QAA0B+yI,KAIrCA,GArCR,SAAwB5vI,GACpB,MAAM6vI,EAAa,CACfC,KAAM,uBACNC,OAAQ,yBACRC,OAAQ,yBACRC,MAAO,sCACPC,KAAM,mCACNC,QAAS,kCAGb,IAAIP,EAEJ,IAAK,IAAIQ,KAASP,EACd,GAAIA,EAAW/rK,eAAessK,GAAQ,CAClC,MAAMvlL,EAAQm1C,EAAUn1C,MAAMglL,EAAWO,IACzC,GAAIvlL,EAAO,CACP+kL,EAAU,GACVA,EAAQQ,IAAS,EACjBR,EAAQ/kL,EAAM,GAAGyG,cAAc7H,MAAM,KAAK,GAAGA,MAAM,KAAK,KAAM,EAC9DmmL,EAAQS,QAAU5zK,SAASqgC,SAASq3B,cAAgBtpE,EAAM,GAAI,IAE9D,OAKZ,OAAO+kL,EA1BX,CAqCiC/yI,OAAOkD,UAAUC,YAH/B4vI,KCxBnB,MACMU,GAAgB,CAClB5Z,KAAM,YACN9tK,KAAM,QAGV,SAAS2nL,GAAaniL,EAAM+H,GACxB,MAAgB,SAAT/H,GAA6B,SAATA,KAAqB+H,GAA4B,aAAnBA,EAAM4G,UA+VpD,IAAA,GA3Uf,cAAmB,GAEf,YAAYwuK,EAAY/gL,GACpBunD,MAAMw5H,GACNzgL,KAAK0lL,YAAc,GAEnB1lL,KAAKN,QAAUA,EAGnB,UACQM,KAAKy0C,UACLz0C,KAAKy0C,QAAQ6uI,WAAa,KAC1BtjL,KAAKy0C,QAAU,MAGnBz0C,KAAK2lL,mBACL1+H,MAAM9N,UAGV,KAAKi6H,EAAUtsD,GACX,IAAK,IAAIpmH,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,MAAM+/K,EAAarN,EAAS1yK,GACtB0wC,EAAWqvI,EAAWrvI,SAEtBs4B,EAAY,IAAI,GAAS+2G,EAAWxuK,UAAUwuK,EAAYzgL,KAAKN,SAEjEunK,GAAQngD,GACR9mH,KAAK4lL,SAASl8G,EAAWo9C,GAEzB9mH,KAAKq6H,OAAO3wD,GAGhBA,EAAUm8G,oBAENz0I,GAAYA,EAAStwC,OAAS,GAC9B4oE,EAAUxP,KAAK9oB,GAGnB,MAAMqD,EAAUz0C,KAAKy0C,QACjBA,GACAi1B,EAAUo8G,SAASrxI,EAASqyE,IAKxC,OACI,IAAI/8G,EAAO/J,KAEX,KAAO+J,EAAKsc,QACRtc,EAAOA,EAAKsc,OAGhB,OAAOtc,EAGX,SAASg8K,EAAYj/D,GACjB,MAAM1sC,EAAYpoC,SAASI,cAAc,OACzC,GAAUgoC,EACN,eAAiBiqG,GAAS,mBACtBrkL,KAAKgmL,SACT,UAGJ,MAAMvxI,EAAU2lC,EAAUhP,WAAWA,WACjC32B,IACIwyH,GAAQngD,GACRi/D,EAAWnpG,aAAanoC,EAASsxI,EAAWrF,WAAW55D,IAAQ,MAE/Di/D,EAAW99G,YAAYxzB,GAE3Bz0C,KAAKimL,WAAWxxI,IAIxB,WAAWA,GACHz0C,KAAKy0C,UACLz0C,KAAKy0C,QAAQ6uI,WAAa,MAG9BtjL,KAAKy0C,QAAUA,EACfz0C,KAAKy0C,QAAQ6uI,WAAatjL,KAE1B,MAAMqsJ,EAAQrsJ,KAAK0gL,WACnB,IAAK,IAAIhgL,EAAI,EAAGA,EAAI2rJ,EAAMvrJ,OAAQJ,IAE9B2rJ,EAAM3rJ,GAAGulL,WADUxxI,EAAQisI,WAAWhgL,IAK9C,QACIV,KAAK2lL,mBAED3lL,KAAKy0C,UACLz0C,KAAKy0C,QAAQyzB,UAAY,IAG7B,MAAM92B,EAAWpxC,KAAK0gL,WACtB,IAAK,IAAIhgL,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IACjC0wC,EAAS1wC,GAAGy4C,UAGhBn5C,KAAK0gL,WAAa,GAGtB,aACI,GAAI1gL,KAAKy0C,QAAS,CACd,MAAMV,EAAa/zC,KAAKy0C,QAAQV,WAC5BA,GACAA,EAAWk1B,YAAYjpE,KAAKy0C,SAEhCz0C,KAAKy0C,QAAU,KAGnBwS,MAAM05H,aAGV,WACI,OAAO3gL,KAAKkmL,iBAGhB,SACI,OAAOlmL,KAAKsnC,WAGhB,iBACI,MAAM+kH,EAAQrsJ,KAAK0gL,WACnB,IAAIrzI,EAAS,GAEb,IAAK,IAAI3sC,EAAI,EAAGA,EAAI2rJ,EAAMvrJ,OAAQJ,IAC9B2sC,GAAUg/G,EAAM3rJ,GAAGslL,SAGvB,OAAO34I,EAGX,cAAc56B,GACV,MAAM,MAAEq0J,EAAK,MAAEz7J,GAAUoH,EAEX,YAAVq0J,EACA9mK,KAAKmmL,IAAI,UAAW96K,EAAQ,GH/K3B,QGgLMm6K,GAAc1e,IAAU2e,GAAa3e,EAAOz7J,GACnDrL,KAAKomL,iBAAiBtf,EAAOz7J,GACZ,YAAVy7J,EACP9mK,KAAKqmL,KAAK,UAAWh7K,GACJ,WAAVy7J,EACP9mK,KAAKmmL,IAAI,SAAU96K,GACF,OAAVy7J,IACHz7J,EACArL,KAAKqmL,KAAK,KAAMh7K,GAEhBrL,KAAKsmL,WAAW,OAIxBr/H,MAAMogH,cAAc50J,GAGxB,KAAKhI,EAAMY,GACHrL,KAAKy0C,SACLz0C,KAAKy0C,QAAQyrB,aAAaz1D,EAAMY,GAIxC,QAAQw0D,GACJ,IAAK,IAAIn/D,EAAI,EAAGA,EAAIm/D,EAAM/+D,OAAQJ,IAC9BV,KAAKqmL,KAAKxmH,EAAMn/D,GAAG,GAAIm/D,EAAMn/D,GAAG,IAIxC,IAAI+J,EAAMY,GACFrL,KAAKy0C,UACLz0C,KAAKy0C,QAAQhI,MAAMhiC,GAAQY,GAInC,OAAOqhC,GACH,IAAK,IAAIhsC,EAAI,EAAGA,EAAIgsC,EAAO5rC,OAAQJ,IAC/BV,KAAKmmL,IAAIz5I,EAAOhsC,GAAG,GAAIgsC,EAAOhsC,GAAG,IAIzC,WAAW+J,GACHzK,KAAKy0C,SACLz0C,KAAKy0C,QAAQg1B,gBAAgBh/D,GAIrC,aAAaqN,GACT,MAAM+nD,EAAQ,GAQd,OAPI/nD,GACA+nD,EAAMx8D,KAAK,CAzNL,YA2NF,UAAYyU,EAAU0wJ,SAASzvJ,SAAS,GAAK,MAI9C8mD,EAGX,kBACI,OAAOskH,GACHnkL,KAAKumL,aAAavmL,KAAKygL,WAAW3oK,cAI1C,gBAAgBzM,GACRA,EACArL,KAAKwmL,QAAQxmL,KAAKumL,aAAal7K,IAE/BrL,KAAKsmL,WA5OC,aAgPd,WACI,MAAM5mL,EAAUM,KAAKygL,WAAW/gL,QAC1B+sC,EAAQ,CAAE,CAAE,SAAU/sC,EAAQ6sF,SAMpC,OAJwB,IAApB7sF,EAAQ0sK,SACR3/H,EAAMppC,KAAK,CAAE,UH9PZ,SGiQEopC,EAGX,cACI,OAAOy3I,GAAW,QAASE,GAAYpkL,KAAKymL,UAAS,KAGzD,gBACI,OAAOvC,GAAW,UAAWlkL,KAAKygL,WAAW/gL,QAAQouK,SAGzD,WACI,OAAOoW,GAAW,KAAMlkL,KAAKygL,WAAW/gL,QAAQ4uB,IAGpD,oBACI,MAAMmyJ,EAAazgL,KAAKygL,WAClBiF,EAAc1lL,KAAK0lL,YACzB,GAAIjF,EAAY,CACZ,MAAM/gL,EAAU+gL,EAAW/gL,QAC3B,IAAIgnL,EAEJ,IAAK,IAAI5f,KAAS0e,GAAe,CAC7B,IAAIxyF,EAAatzF,EAAQuhB,IAAI6lJ,GACzB9zE,GAAcyyF,GAAa3e,EAAO9zE,KAClC0yF,EAAY5e,GAAS9zE,EACrB0zF,GAAiB,GAGrBA,GACA1mL,KAAK2mL,iBAAiB,CAClB/4J,OAAQ,MACR83J,YAAaA,KAM7B,iBAAiBjzK,GACTzS,KAAKqmB,QACLrmB,KAAKqmB,OAAOsgK,iBAAiBl0K,GAIrC,iBAAiBnP,EAAM+H,GACnB,MAAMq6K,EAAc1lL,KAAK0lL,YACnBrvK,EAAUqvK,EAAYpiL,GACtB+iL,EAAOb,GAAcliL,GACrB0vF,EAAa,GACf38E,IACA28E,EAAW1vF,GAAQ+S,EACnBrW,KAAK2mL,iBAAiB,CAClB/4J,OAAQ,SACR83J,YAAa1yF,WAEV0yF,EAAYpiL,IAGlB+H,GAKD2nF,EAAW1vF,GAAQ+H,EACnBrL,KAAK2mL,iBAAiB,CAClB/4J,OAAQ,MACR83J,YAAa1yF,IAEjB0yF,EAAYpiL,GAAQ+H,EACpBrL,KAAKqmL,KAAKA,EAAMrmL,KAAK4mL,OAAOv7K,EAAMijB,MAV9BjY,GACArW,KAAKsmL,WAAWD,GAa5B,mBAGIrmL,KAAK2mL,iBAAiB,CAClB/4J,OAAQ,SACR83J,YAJgB1lL,KAAK0lL,cAMzB1lL,KAAK0lL,YAAc,GAGvB,oBACI,OAAOvB,GAAcnkL,KAAK6mL,kBAG9B,iBACI,MAAMnB,EAAc1lL,KAAK0lL,YACnB7lH,EAAQ,GAEd,IAAK,IAAIinG,KAAS4e,EACd7lH,EAAMx8D,KAAK,CAAEmiL,GAAc1e,GAAQ9mK,KAAK4mL,OAAOlB,EAAY5e,GAAOx4I,MAGtE,OAAOuxC,EAGX,OAAOvxC,GACH,MAAMw4J,GAAgB9mL,KAAKN,SAAW,IAAIonL,aACpC9rE,EAAWh7G,KAAK+mL,UAAU5iL,QAAQ,KAAM,OAE9C,MAAO,OADM2iL,EAAe,GAAK9rE,KACR1sF,KAG7B,UACI,OAxVR,WACI,MAAMhkB,EAAO0nC,SAASg1I,qBAAqB,QAAQ,GACnD,IAAI5uE,EAAOpmE,SAASqvB,SAAS+2C,KACzBnuC,EAAM,GAEV,GAAI3/D,KAAU,GAAQw6K,SAAW,IAAIM,KAAM,CACvC,MAAM6B,EAAY7uE,EAAKv2G,QAAQ,MACZ,IAAfolL,IACA7uE,EAAOA,EAAKv0G,UAAU,EAAGojL,IAG7Bh9G,EAAMmuC,EAGV,OAAOnuC,EAdX,KCSe,GA1Bf,cAA+B,GAC3B,WACI,MAAO,SAASjqE,KAAKknL,kBAAkBlnL,KAAKokL,mBAGhD,eACI,OAAOF,GAAW,SAAUlkL,KAAKygL,WAAW1rK,UAGhD,WACI,MAAM0rK,EAAazgL,KAAKygL,WACxB,MAAO,CACH,CAAE,aAAcA,EAAW/U,SAC3B,CAAE,eAAgB+U,EAAW3S,YAIrC,cAAcr7J,GACM,WAAZA,EAAEq0J,MACF9mK,KAAKqmL,KAAK5zK,EAAEq0J,MAAOr0J,EAAEpH,OACF,UAAZoH,EAAEq0J,OAAiC,YAAZr0J,EAAEq0J,OAChC9mK,KAAKmmL,IAAI,QAAU1zK,EAAEq0J,MAAOr0J,EAAEpH,SCqB3B,GAxCf,cAA2B,GACvB,YAAYo1K,GACRx5H,MAAMw5H,GAENzgL,KAAKsuB,GAAKmyJ,EAAWnyJ,GAErBtuB,KAAKmnL,YAGT,YACI,MAAMtI,EAAQ7+K,KAAKygL,WAAW5B,MACxBpqI,EAAUz0C,KAAKy0C,QAErB,IAAK,IAAIvH,EAAM,EAAGA,EAAM2xI,EAAM/9K,OAAQosC,IAAO,CACzC,IAAIk6I,EAAW,IAAI,GAAiBvI,EAAM3xI,IAC1CltC,KAAKq6H,OAAO+sD,GACR3yI,GACA2yI,EAAStB,SAASrxI,IAK9B,cAAchiC,GACM,mBAAZA,EAAEq0J,OACF,GAAS7lK,UAAU2d,MAAMlL,KAAK1T,MAC9BA,KAAKmnL,aACc,aAAZ10K,EAAEq0J,OACT9mK,KAAKwmL,QAAQxmL,KAAKqnL,kBAI1B,oBACI,OAAOlD,GAAcnkL,KAAKqnL,kBAG9B,WACI,MAAO,CAAE,gBAAiBrnL,KAAKygL,WAAWzB,YAAc,iBAAmB,uBClBpE,GArBf,cAAiC,GAC7B,WACI,MAAO,uBAAwBh/K,KAAKsuB,OAAStuB,KAAKsnL,uBAAyBtnL,KAAKkmL,oCAGpF,iBACI,MAAMzF,EAAazgL,KAAKygL,WAClBl9K,EAAQk9K,EAAWl9K,QACnB8D,EAAMo5K,EAAWp5K,MASvB,MARc,CACV,CAAE,KAAM9D,EAAMynC,GACd,CAAE,KAAMznC,EAAM4sC,GACd,CAAE,KAAM9oC,EAAI2jC,GACZ,CAAE,KAAM3jC,EAAI8oC,GACZnwC,KAAKunL,cCKF,GAnBf,cAAiC,GAC7B,WACI,MAAO,uBAAwBvnL,KAAKsuB,OAAStuB,KAAKsnL,uBAAwBtnL,KAAKkmL,oCAGnF,iBACI,MAAMzF,EAAazgL,KAAKygL,WAClB/pI,EAAS+pI,EAAW/pI,SACpBw2H,EAASuT,EAAWvT,SAO1B,MANc,CACV,CAAE,KAAMx2H,EAAO1L,GACf,CAAE,KAAM0L,EAAOvG,GACf,CAAE,IAAK+8H,GACPltK,KAAKunL,cCEF,GAff,cAAuB,GACnB,YAAY9G,GACRx5H,QAEAjnD,KAAKygL,WAAaA,EAClBzgL,KAAKsuB,GAAKmyJ,EAAWnyJ,GAErBtuB,KAAKk6D,KAAK,CAAEumH,IAGhB,WACI,MAAO,iBAAkBzgL,KAAKsuB,OAAStuB,KAAKkmL,gCC8ErC,GApFf,cAA6B,GACzB,cACIj/H,QACAjnD,KAAKwnL,cAAgB,GAGzB,SAASzB,GACL/lL,KAAKy0C,QAAUsxI,EAGnB,WACI,MAAO,SAAU/lL,KAAKkmL,0BAG1B,iBAAiBzzK,GACb,MAAM,YAAEizK,EAAW,OAAE93J,GAAWnb,EAEjB,QAAXmb,EACA5tB,KAAKynL,eAAe/B,GACF,WAAX93J,GACP5tB,KAAK0nL,kBAAkBhC,GAI/B,iBAAiBpiL,EAAM28C,GACnB,IAAIhuC,EAUJ,MATa,SAAT3O,EACA2O,EAAW,GACK,SAAT3O,IACH28C,aAAgB,GAChBhuC,EAAW,GACJguC,aAAgB,KACvBhuC,EAAW,KAGZ,IAAIA,EAASguC,GAGxB,eAAeylI,GACX,IAAK,IAAI5e,KAAS4e,EACd1lL,KAAK2nL,cAAc7gB,EAAO4e,EAAY5e,IAI9C,cAAcxjK,EAAMm9K,GAChB,MAAM,QAAEhsI,EAAO,cAAE+yI,GAAkBxnL,KAC7BsuB,EAAKmyJ,EAAWnyJ,GAChBs5J,EAAUJ,EAAcl5J,GAC9B,GAAKs5J,EAWDA,EAAQhyJ,YAXE,CACV,MAAMke,EAAO9zC,KAAK6nL,iBAAiBvkL,EAAMm9K,GACzC+G,EAAcl5J,GAAM,CAChBmmB,QAASX,EACTle,MAAO,GAEX51B,KAAKq6H,OAAOvmF,GACRW,GACAX,EAAKgyI,SAAS9lL,KAAKy0C,UAO/B,kBAAkBixI,GACd,IAAK,IAAI5e,KAAS4e,EACd1lL,KAAK8nL,iBAAiBpC,EAAY5e,IAI1C,iBAAiB2Z,GACb,MAAM+G,EAAgBxnL,KAAKwnL,cACrBl5J,EAAKmyJ,EAAWnyJ,GAChBs5J,EAAUJ,EAAcl5J,GAE1Bs5J,IACAA,EAAQhyJ,QACc,IAAlBgyJ,EAAQhyJ,QACR51B,KAAKshC,OAAOthC,KAAK0gL,WAAW7+K,QAAQ+lL,EAAQnzI,SAAU,UAC/C+yI,EAAcl5J,OCxDtB,GAzBf,cAAuB,GACnB,YAAY5uB,GACRunD,QACAjnD,KAAKN,QAAUA,EACfM,KAAKo3E,KAAO,IAAI,GAGpB,SAAS2uG,GACL/lL,KAAKy0C,QAAUsxI,EACf/lL,KAAKo3E,KAAK0uG,SAASC,EAAWgC,mBAGlC,QACI,GAAS9mL,UAAU2d,MAAMlL,KAAK1T,MAGlC,WACI,OAAOA,KAAKo3E,KAAK4uG,SAAWhmL,KAAKkmL,iBAGrC,iBAAiBzzK,GACbzS,KAAKo3E,KAAKuvG,iBAAiBl0K,KCzBpB,SAASu1K,GAAWvzI,EAASiP,GACxC,IAAK,IAAI6lC,KAAa7lC,EAAQ,CAC1B,MAAMu9H,EAAa13F,EAAUzpF,OAAOnB,MAAM,KAC1C,IAAK,IAAIuuC,EAAM,EAAGA,EAAM+zI,EAAWngL,OAAQosC,IACvCuH,EAAQf,iBAAiButI,EAAW/zI,GAAMwW,EAAO6lC,IAAY,ICJ1D,SAAS0+F,GAAaxzI,EAASiP,EAAS,IACnD,IAAK,IAAIj5C,KAAQi5C,EAAQ,CACrB,MAAMu9H,EAAax2K,EAAK3K,OAAOnB,MAAM,KACrC,IAAK,IAAIuuC,EAAM,EAAGA,EAAM+zI,EAAWngL,OAAQosC,IACvCuH,EAAQb,oBAAoBqtI,EAAW/zI,GAAMwW,EAAOj5C,IAAO,ICJvE,MAAMy9K,GAAc,CAChBnlL,IAAK,CAAE,IAAK,KACZolL,KAAM,CAAE,EAAG,KACXC,SAAU,CAAE,EAAG,KACfC,QAAS,CAAE,IAAK,IAAK,IAAK,KAC1BC,YAAa,CAAE,EAAG,IAAK,IAAK,KAC5BC,eAAgB,CAAE,EAAG,IAAK,IAAK,IAAK,IAAK,MCCvCC,GAAgB,CAClB,eAAgB,eAChB,eAAgB,SAChB,eAAgB,eAChB,iBAAkB,kBAuLP,IAAA,GAnLf,cAAuB,GAEnB,iBACIxoL,KAAKqmL,KAAK,IAAKrmL,KAAKyoL,cACpBzoL,KAAK4gL,aAGT,cAAcnuK,GACV,OAAQA,EAAEq0J,OACN,IAAK,OACGr0J,EAAEpH,MACFrL,KAAKwmL,QAAQxmL,KAAK0oL,QAAQj2K,EAAEpH,QAE5BrL,KAAKsmL,WAAW,QAEpB,MAEJ,IAAK,aACDtmL,KAAKwmL,QAAQxmL,KAAK0oL,QAAQ,CAAEhd,MAAOj5J,EAAEpH,SACrC,MAEJ,IAAK,SACGoH,EAAEpH,MACFrL,KAAKwmL,QAAQxmL,KAAK2oL,UAAUl2K,EAAEpH,QAE9BrL,KAAKsmL,WAAW,UAEpB,MAEJ,IAAK,YACDtmL,KAAK4oL,gBAAgBn2K,EAAEpH,OACvB,MAEJ,QACI,MAAMZ,EAAO+9K,GAAc/1K,EAAEq0J,OACzBr8J,GACAzK,KAAKqmL,KAAK57K,EAAMgI,EAAEpH,OAK9B47C,MAAMogH,cAAc50J,GAGxB,UACQzS,KAAKy0C,UACLz0C,KAAKy0C,QAAQwlC,YAAcj6E,KAAKygL,WAAW7zG,WAInD,aACI,OAAO5sE,KAAK6oL,UAAU7oL,KAAKygL,YAG/B,UAAUviL,GACN,MAAMy8I,EAAWz8I,EAAKy8I,SAChB75I,EAAS65I,EAAS75I,OACxB,GAAIA,EAAS,EAAG,CACZ,MAAMiG,EAAQ,GACd,IAAIsmC,EAAQy7I,EAEZ,IAAK,IAAIpoL,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,IAAIqoL,EAAc/oL,KAAK+oL,YAAYpuC,EAASj6I,EAAI,GAAIi6I,EAASj6I,IACzDqoL,IAAgBD,IAChBA,EAAcC,EACdhiL,EAAM1D,KAAK0lL,IAIXhiL,EAAM1D,KADU,MAAhB0lL,EACW/oL,KAAKgpL,YAAYruC,EAASj6I,GAAGu6E,UAE7Bj7E,KAAKgpL,YAAYruC,EAASj6I,EAAI,GAAG20K,aAAc16B,EAASj6I,GAAG00K,YAAaz6B,EAASj6I,GAAGu6E,WASvG,OALA5tC,EAAS,IAAMrtC,KAAKgpL,YAAYruC,EAAS,GAAG1/D,UA7E1C,IA6E8Dl0E,EAAM9G,KA7EpE,KA8EE/B,EAAKwB,QAAQgmD,SACbrY,GAAU,KAGPA,GAIf,cACI,MAAMwiI,EAASvnK,UACTxH,EAAS+uK,EAAO/uK,OAChB4G,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAII,EAAQJ,IACxBgH,EAAOrE,KAAKwsK,EAAOnvK,GAAGqY,SAAS,IAGnC,OAAOrR,EAAOzH,KAAK,KAGvB,YAAYgpL,EAAcC,GACtB,OAAOD,EAAa5T,cAAgB6T,EAAW9T,YAAc,IAAM,IAGvE,UAAUzI,GACN,MAAM9sG,EAAQ,GAmBd,OAjBI8sG,IAAWlB,GAAckB,EAAOjB,QAChC7rG,EAAMx8D,KAAK,CAAE,SAAUspK,EAAOjB,QAC9B7rG,EAAMx8D,KAAK,CAAE,eAAgBspK,EAAOv8H,QACpCyvB,EAAMx8D,KAAK,CAAE,iBAAkBrD,KAAKmpL,cAAcxc,KAClD9sG,EAAMx8D,KAAK,CAAE,kBAAmBspK,EAAOgM,WAEnC1R,GAAQ0F,EAAOmB,UACfjuG,EAAMx8D,KAAK,CAAE,iBAAkBspK,EAAOmB,UAGtC7G,GAAQ0F,EAAOyc,WACfvpH,EAAMx8D,KAAK,CAAE,mBAAoBrD,KAAKqpL,eAAe1c,MAGzD9sG,EAAMx8D,KAAK,CAAE,SdnIZ,ScsIEw8D,EAGX,eACI,OAAOskH,GACHnkL,KAAK2oL,UAAU3oL,KAAKygL,WAAW/gL,QAAQitK,SAI/C,eAAeA,GACX,MAAM,SAAEyc,EAAQ,MAAEh5I,EAAQ,GAAMu8H,EAEhC,GAAIyc,GD1IE,UC0IUA,EAAoB,CAChC,MAAME,EAAYpB,GAAYkB,EAAS5iL,eACjCkB,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAI4oL,EAAUxoL,OAAQJ,IAClCgH,EAAOrE,KAAKimL,EAAU5oL,GAAK0vC,GAG/B,OAAO1oC,EAAOzH,KAAK,MAI3B,cAAc0sK,GACV,MAAM,SAAEyc,EAAQ,QAAEG,GAAY5c,EAE9B,OAAQyc,GAAyB,UAAbA,EDxJf,OCwJ8CG,EAGvD,QAAQzrL,GACJ,MAAM+hE,EAAQ,GAad,OAZM/hE,GAA0B,aAAlBA,EAAKmU,WACXnU,IAAS2tK,GAAc3tK,EAAK4tK,QAC5B7rG,EAAMx8D,KAAK,CAAE,OAAQvF,EAAK4tK,QAEtBzE,GAAQnpK,EAAKgwK,UACbjuG,EAAMx8D,KAAK,CAAE,eAAgBvF,EAAKgwK,WAGtCjuG,EAAMx8D,KAAK,CAAE,Od9KhB,UckLEw8D,EAGX,aACI,OAAOskH,GACHnkL,KAAK0oL,QAAQ1oL,KAAKygL,WAAW/gL,QAAQ5B,OAI7C,WACI,MAAO,SAAUkC,KAAKwpL,cAAgBxpL,KAAKokL,iBAAmBpkL,KAAKypL,mBAAqBvF,GAAW,IAAKlkL,KAAKyoL,gBAC7FzoL,KAAK0pL,iBAAmB1pL,KAAK2pL,eAAiB3pL,KAAK4pL,sBAAwB5pL,KAAK6pL,8BCtLzF,GANf,cAAsB,GAClB,aACI,OAAO7pL,KAAK6oL,UAAU7oL,KAAKygL,WAAWn+I,YCwB/B,GA1Bf,cAAyB,GAErB,iBACI,MAAMoU,EAAS12C,KAAK02C,SACpB12C,KAAKqmL,KAAK,KAAM3vI,EAAO1L,GACvBhrC,KAAKqmL,KAAK,KAAM3vI,EAAOvG,GACvBnwC,KAAKqmL,KAAK,IAAKrmL,KAAKktK,UACpBltK,KAAK4gL,aAGT,SACI,OAAO5gL,KAAKygL,WAAWlS,WAAW73H,OAGtC,SACI,OAAO12C,KAAKygL,WAAWlS,WAAWrB,OAGtC,WACI,MAAO,WAAYltK,KAAKwpL,cAAgBxpL,KAAKokL,iBAAmBpkL,KAAKypL,sBACjDzpL,KAAK02C,SAAS1L,UAAYhrC,KAAK02C,SAASvG,SAAWnwC,KAAKktK,YAC5DltK,KAAK0pL,kBAAoB1pL,KAAK2pL,gBAAkB3pL,KAAK4pL,sBACrD5pL,KAAK6pL,kBAAT,gBCRL,GAdf,cAAwB,GACpB,WACI,MAAO,KAAM7pL,KAAKwpL,WAAaxpL,KAAK6pL,kBAAoB7pL,KAAKokL,cAAgBpkL,KAAKypL,gBAAkBzpL,KAAK4pL,uBAAyB5pL,KAAKkmL,uBAG3I,cAAczzK,GACM,cAAZA,EAAEq0J,OACF9mK,KAAK4oL,gBAAgBn2K,EAAEpH,OAG3B47C,MAAMogH,cAAc50J,KCZ5B,MAAMq3K,GAAY,KACZC,GAAW,KACXC,GAAc,KACdC,GAAa,KACbC,GAAW,KAEF,SAASC,GAAW9+K,GAC/B,OAAOqN,OAAOrN,GAAOlH,QAAQ2lL,GAAW,SAAS3lL,QAAQ4lL,GAAU,QAAQ5lL,QAAQ+lL,GAAU,QAAQ/lL,QAAQ6lL,GAAa,UAAU7lL,QAAQ8lL,GAAY,SCiD7I,IAAA,GApDf,cAAwB,GAEpB,iBACIjqL,KAAKwmL,QAAQxmL,KAAKoqL,eAClBpqL,KAAK4gL,aAGT,cAAcnuK,GACM,QAAZA,EAAEq0J,OACF9mK,KAAKwmL,QAAQxmL,KAAKqqL,aAGtBpjI,MAAMogH,cAAc50J,GAGxB,cACI,MAAMq8G,EAAO9uH,KAAKygL,WAAW3xD,OACvBo7C,EAAKp7C,EAAKq7C,UAEhB,MAAO,CACH,CAAE,IAAKD,EAAGl/H,GACV,CAAE,IAAKk/H,EAAG/5H,GACV,CAAE,QAAS2+E,EAAK1+E,QAAU,MAC1B,CAAE,SAAU0+E,EAAK+6C,SAAW,OAIpC,iBACI,OAAOsa,GAAcnkL,KAAKoqL,eAG9B,UAAUE,GACN,IAAIz3I,EAAM7yC,KAAKygL,WAAW5tI,MAM1B,OAJIy3I,IACAz3I,EAAMs3I,GAAWt3I,IAGd,CAAE,CAAE,aAAcA,IAG7B,eACI,OAAOsxI,GAAcnkL,KAAKqqL,WAAU,IAGxC,WACI,MAAO,qCAAsCrqL,KAAKwpL,cAAgBxpL,KAAKokL,iBAAmBpkL,KAAK6pL,qBAAsB7pL,KAAKypL,kBAC/GzpL,KAAKuqL,oBAAsBvqL,KAAKwqL,kBAAoBxqL,KAAK4pL,iCCjC7D,GAhBf,cAA4B,GACxB,aACI,MAAM/gL,EAAQ7I,KAAKygL,WAAW53K,MAE9B,GAAIA,EAAM/H,OAAS,EAAG,CAClB,MAAM4G,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAImI,EAAM/H,OAAQJ,IAC9BgH,EAAOrE,KAAKrD,KAAK6oL,UAAUhgL,EAAMnI,KAGrC,OAAOgH,EAAOzH,KAAK,QCehB,GA1Bf,cAAuB,GAEnB,iBACI,MAAMsuK,EAAWvuK,KAAKygL,WAAWlS,WACjCvuK,KAAKqmL,KAAK,IAAK9X,EAASv/H,OAAOhE,GAC/BhrC,KAAKqmL,KAAK,IAAK9X,EAASv/H,OAAOmB,GAC/BnwC,KAAKqmL,KAAK,QAAS9X,EAAS32J,KAAKw4B,OACjCpwC,KAAKqmL,KAAK,SAAU9X,EAAS32J,KAAKiyJ,QAClC7pK,KAAK4gL,aAGT,OACI,OAAO5gL,KAAKygL,WAAWlS,WAAW32J,KAGtC,SACI,OAAO5X,KAAKygL,WAAWlS,WAAWv/H,OAGtC,WACI,MAAO,SAAUhvC,KAAKwpL,cAAgBxpL,KAAKokL,iBAAmBpkL,KAAKypL,sBAAwBzpL,KAAKgvC,SAAShE,SAAWhrC,KAAKgvC,SAASmB,aAC3GnwC,KAAK4X,OAAOw4B,kBAAoBpwC,KAAK4X,OAAOiyJ,WAAa7pK,KAAK0pL,kBACrE1pL,KAAK2pL,gBAAkB3pL,KAAK4pL,uBAAyB5pL,KAAK6pL,yBClBlF,MAAMY,GAAe,wBAErB,SAASC,GAAe1mG,GACpB,IAAKA,GAAwB,iBAATA,IAAsBymG,GAAa7hL,KAAKo7E,GACxD,OAAOA,EAGX,MAAMvvC,EAAUi2I,GAAeC,SAG/B,OAFAF,GAAarjL,UAAY,EAElB48E,EAAK7/E,QAAQsmL,GAAe1qL,IAC/B00C,EAAQyzB,UAAYnoE,EAEb00C,EAAQwlC,aAAexlC,EAAQm2I,YAItB,oBAAb54I,WACP04I,GAAeC,SAAW34I,SAASI,cAAc,SAmEtC,IAAA,GAhEf,cAAuB,GAEnB,iBACI,MAAM00E,EAAM9mH,KAAK8mH,MACjB9mH,KAAKqmL,KAAK,IAAKv/D,EAAI97E,GACnBhrC,KAAKqmL,KAAK,IAAKv/D,EAAI32E,GACnBnwC,KAAK4gL,aAGT,cAAcnuK,GACM,SAAZA,EAAEq0J,OACF9mK,KAAKqmL,KAAK,QAASjC,GAAYpkL,KAAKymL,aACpCzmL,KAAK2nK,kBACc,YAAZl1J,EAAEq0J,OACT7/G,MAAM2lB,QAAQ5sE,KAAKygL,WAAW7zG,WAGlC3lB,MAAMogH,cAAc50J,GAGxB,SAAS63K,GACL,MAAM79I,EAAQwa,MAAMw/H,SAAS6D,GAC7B,IAAItP,EAAOh7K,KAAKygL,WAAW/gL,QAAQs7K,KAQnC,OANIsP,IACAtP,EAAOmP,GAAWnP,IAGtBvuI,EAAMppC,KAAK,CAAE,OAAQ23K,GAAQ,CAAE,cAAe,QAEvCvuI,EAGX,MACI,MAAMq6E,EAAM9mH,KAAKygL,WAAW38I,WACtBlsB,EAAO5X,KAAKygL,WAAW1F,UAC7B,OAAOj0D,EAAIzwF,QAAQw0J,KAAK/jE,EAAI32E,EAAIv4B,EAAKuiK,UAGzC,gBACI,IAAIvtG,EAAU5sE,KAAKygL,WAAW7zG,UAI9B,OAHAA,EAAU89G,GAAe99G,GACzBA,EAAUu9G,GAAWv9G,GAEd+sG,GAAc/sG,GAGzB,mBACI,IAAIqO,EAMJ,QAJKj7E,KAAKN,SAAW,IAAIorL,KAAS,GAAQhG,QAAQM,MAAQ,GAAQN,QAAQE,OACtE/pG,EAAS,OAGNipG,GAAW,cAAejpG,GAGrC,WACI,MAAO,SAAUj7E,KAAKwpL,cAAgBxpL,KAAK+qL,sBAAwB/qL,KAAKokL,iBAAmBpkL,KAAKypL,qBAC7EzpL,KAAK8mH,MAAM97E,SAAWhrC,KAAK8mH,MAAM32E,MAAQnwC,KAAK0pL,kBAAoB1pL,KAAK6pL,qBAAuB7pL,KAAK4pL,sBACtG5pL,KAAK2pL,gBAAkB3pL,KAAKgrL,2BCrEpD,GAASC,IAAM,GACf,GAASC,OAAS,GAClB,GAASnuE,MAAQ,GACjB,GAASouE,MAAQ,GACjB,GAASC,UAAY,GACrB,GAASC,KAAO,GAChB,GAASC,KAAO,GAChB,GAASC,KAAO,GAsHD,IAAA,GA/Ff,cAAsB,GAClB,WACI,MAAO,MAGX,YAAY92I,EAAS/0C,GACjBunD,MAAMxS,EAAS/0C,GAEfM,KAAK4/I,MAAQ,IAAI,GAASxgJ,OAAOu8B,OAAO,CACpCmvJ,IA9BA,QA8BK,GAAcr2I,EAAS,aAAa0D,WAC1Cn4C,KAAKN,UAER,GAAUM,KAAKy0C,QAASz0C,KAAKspH,aAE7BtpH,KAAKwrL,aAAexrL,KAAKy0C,QAAQszI,kBAjCzC,SAAuBtzI,GACnB,IAAIg3I,EAEJ,IACIA,EAAMh3I,EAAQi3I,aAAej3I,EAAQi3I,eAAiB,KACxD,MAAOj5K,IAET,GAAIg5K,EAAK,CACL,MAAM95I,GAAS85I,EAAIh5K,EAAI,EACjBw8G,GAAQw8D,EAAIhmL,EAAI,EAChBgnC,EAAQgI,EAAQhI,MAET,IAATkF,GAAsB,IAARs9E,IACdxiF,EAAMkF,KAAOA,EAAO,KACpBlF,EAAMwiF,IAAMA,EAAM,OAd9B,CAmCsBjvH,KAAKwrL,cAEnBxrL,KAAK4/I,MAAMkmC,SAAS9lL,KAAKwrL,cAEzBxD,GAAWhoL,KAAKy0C,QAAS,CACrBk3I,MAAO3rL,KAAK8iL,OACZ8I,UAAW5rL,KAAKgjL,YAChB6I,SAAU7rL,KAAKijL,YACf3pI,UAAWt5C,KAAKkjL,aAGpBljL,KAAK8rL,SAGT,UACQ9rL,KAAK4/I,QACL5/I,KAAK4/I,MAAMzmG,UACXn5C,KAAK4/I,MAAQ,KACb5/I,KAAKwrL,aAAe,KACpBvD,GAAajoL,KAAKy0C,QAAS,CACvBk3I,MAAO3rL,KAAK8iL,OACZ8I,UAAW5rL,KAAKgjL,YAChB6I,SAAU7rL,KAAKijL,YACf3pI,UAAWt5C,KAAKkjL,cAIxBj8H,MAAM9N,UAGV,UAAUpkC,GACN,MAAMg3K,EAAU,GAAIxiL,KAAKw1B,MAAMhqB,EAAOi2B,MAAQzhC,KAAKw1B,MAAMhqB,EAAOo7B,MAAQnwC,KAAKq5K,MAAMjpI,SAAWpwC,KAAKq5K,MAAMxP,SAEzG7pK,KAAKgsL,QAAUj3K,EACf/U,KAAKwrL,aAAatrH,aAAa,UAAW6rH,GAG9C,KAAKt3I,GACDwS,MAAMglI,KAAKx3I,GACXz0C,KAAK4/I,MAAM1lF,KAAK,CAAEzlB,IAGtB,QACIwS,MAAMroC,QACN5e,KAAK4/I,MAAMhhI,QAGf,MACI,MAAO,yBAA2B5e,KAAKspH,YAG3C,eACI,IAAM65D,QAAS+I,EAAQF,QAASj3K,GAAW/U,KAE3C,GAAI+U,EAAQ,CACR,MAAMiuB,EAAO,IAAI,GACjBA,EAAKoO,SAAS/tC,KAAK6oL,GAEnBlpJ,EAAKlrB,UACD,KAAYuxJ,WAAWt0J,EAAOi2B,GAAIj2B,EAAOo7B,IAG7C+7I,EAASlpJ,EAGb,OAAOkpJ,EAGX,UACQlsL,KAAKgsL,SACLhsL,KAAKqpK,UAAUrpK,KAAKgsL,SAI5B,YACI,MAAO,oEAAqE3H,gEAAsErkL,KAAK4/I,MAAMomC,mBC3ItJ,SAASmG,KACpB,IAAIC,EAAWC,EACf,MAAMliI,EAAU,IAAI7tC,QAAQ,CAACpU,EAASm5B,KAClC+qJ,EAAahtK,IACT+qC,EAAQmiI,OAAS,WACjBpkL,EAAQkX,GACD+qC,GAEXkiI,EAAYjtK,IACR+qC,EAAQmiI,OAAS,WACjBjrJ,EAAOjiB,GAEA+qC,KAQf,OALAA,EAAQmiI,OAAS,UACjBniI,EAAQjiD,QAAUkkL,EAClBjiI,EAAQ9oB,OAASgrJ,EACjBliI,EAAQhM,MAAQ,IAAMgM,EAAQmiI,OAEvBniI,ECpBI,SAASoiI,GAAW/5E,GAC/B,OAAOl2F,QAAQs/B,IAAI42D,GCCR,IAAA,GAFE,GCCF,SAASg6E,GAAWzgJ,EAAK7tC,GACpC,MAAMy8I,EAAWz8I,EAAKy8I,SAEtB,GAAwB,IAApBA,EAAS75I,OACT,OAGJ,IAAIgK,EAAU6vI,EAAS,GACnB1/D,EAASnwE,EAAQmwE,SACrBlvC,EAAIosI,OAAOl9F,EAAOjwC,EAAGiwC,EAAO9qC,GAE5B,IAAK,IAAIzvC,EAAI,EAAGA,EAAIi6I,EAAS75I,OAAQJ,IAAK,CACtCoK,EAAU6vI,EAASj6I,GACnBu6E,EAASnwE,EAAQmwE,SAEjB,IACIwxG,EADU9xC,EAASj6I,EAAI,GACL20K,aAClBD,EAAYtqK,EAAQsqK,YAEpBqX,GAAWrX,EACXrpI,EAAI2gJ,cAAcD,EAAQzhJ,EAAGyhJ,EAAQt8I,EACnBilI,EAAUpqI,EAAGoqI,EAAUjlI,EACvB8qC,EAAOjwC,EAAGiwC,EAAO9qC,GAEnCpE,EAAI0rI,OAAOx8F,EAAOjwC,EAAGiwC,EAAO9qC,GAIhCjyC,EAAKwB,QAAQgmD,QACb3Z,EAAImsI,YCkFG,IAAA,GA3Gf,cAAmB,GACf,YAAYuI,GACRx5H,MAAMw5H,GACFA,GACAzgL,KAAK2sL,WAIb,WACI,MAAM/gB,EAAO5rK,KAAKygL,WAAW7U,OACzBA,IACA5rK,KAAK4rK,KAAOA,EACZA,EAAK5E,YAAYhnK,OAIzB,QACQA,KAAKygL,YACLzgL,KAAKygL,WAAW1Z,eAAe/mK,MAGnCA,KAAK4sL,YAEL3lI,MAAMroC,QAGV,YACQ5e,KAAK4rK,OACL5rK,KAAK4rK,KAAK7E,eAAe/mK,aAClBA,KAAK4rK,MAIpB,QAAQ7/H,GACA/rC,KAAK4rK,OACL7/H,EAAI8gJ,YACJL,GAAWzgJ,EAAK/rC,KAAK4rK,MACrB7/H,EAAI6/H,QAIZ,cAAcn5J,GACM,SAAZA,EAAEq0J,QACF9mK,KAAK4sL,YACL5sL,KAAK2sL,YAGT1lI,MAAMogH,cAAc50J,GAGxB,aAAas5B,GACT,GAAI/rC,KAAKygL,WAAY,CACjB,MAAM3oK,EAAY9X,KAAKygL,WAAW3oK,YAC9BA,GACAi0B,EAAIj0B,UAAUxE,MAAMy4B,EAAKj0B,EAAU0wJ,SAASntI,QAAQ,KAKhE,aAAa+3I,EAAUtsD,EAAKgmE,GACxB,IAAK,IAAIpsL,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,IAAI+/K,EAAarN,EAAS1yK,GACtB0wC,EAAWqvI,EAAWrvI,SAEtBs4B,EAAY,IAAI,GAAS+2G,EAAWxuK,UAAUwuK,EAAYqM,GAE1D17I,GAAYA,EAAStwC,OAAS,GAC9B4oE,EAAUxP,KAAK9oB,EAAU01E,EAAKgmE,GAG9B7lB,GAAQngD,GACR9mH,KAAK4lL,SAASl8G,EAAWo9C,GAEzB9mH,KAAKq6H,OAAO3wD,IAKxB,KAAK0pG,EAAUtsD,EAAKgmE,GAChB9sL,KAAK+sL,aAAa3Z,EAAUtsD,EAAKgmE,GAEjC9sL,KAAK4gL,aAGT,WAAW70I,GACP,GAAI/rC,KAAKygL,WAAY,CACjB,MAAM3S,EAAU9tK,KAAKygL,WAAW3S,UAC5B7G,GAAQ6G,IACR9tK,KAAKgtL,YAAYjhJ,EAAK+hI,IAKlC,YAAY/hI,EAAK1gC,GACb,IAAI4hL,EAAW5hL,EACX4hL,GAAYlhJ,EAAIihJ,cAChBC,GAAYlhJ,EAAIihJ,aAEpBjhJ,EAAIihJ,YAAcC,EAGtB,UACI,MAAMp6I,EAAM7yC,KAAKygL,WACjB,OAAQ5tI,GAAQA,IAA+B,IAAxBA,EAAInzC,QAAQ0sK,UCxG3C,MAAM,WAAkB,GAAY,GAAM,eACtC,SAASrgI,GACL,IAAK/rC,KAAKosK,UACN,OAGJrgI,EAAImhJ,OAEJltL,KAAKmtL,aAAaphJ,GAClB/rC,KAAKotL,QAAQrhJ,GACb/rC,KAAKqtL,WAAWthJ,GAEhB,MAAM20I,EAAa1gL,KAAK0gL,WACxB,IAAK,IAAIhgL,EAAI,EAAGA,EAAIggL,EAAW5/K,OAAQJ,IAAK,CACxC,IAAIqyC,EAAQ2tI,EAAWhgL,GACnBqyC,EAAMq5H,WACNr5H,EAAMu6I,SAASvhJ,GAIvBA,EAAIwhJ,WAIG,IAAA,GAAA,GC1BA,SAASlrJ,GAAS9P,EAAI8H,GACjC,IACIiY,EADAk7I,EAAe,EAGnB,IAAKnzJ,GAASA,GAAS,EACnB,OAAO9H,EAGX,MAAM2yI,EAAY,WACd,MAAMuoB,EAAU,KAAQD,EAClB/5K,EAAOnL,UAEPX,EAAO,WACT4qB,EAAGjf,MAAM,KAAMG,GACf+5K,EAAe,MAInB,IAAKA,EACD,OAAO7lL,IAGP2qC,GACA53B,aAAa43B,GAGbm7I,EAAUpzJ,EACV1yB,IAEA2qC,EAAUx3B,WAAWnT,EAAM0yB,EAAQozJ,IAQ3C,OAJAvoB,EAAUhrI,OAAS,WACfxf,aAAa43B,IAGV4yH,EChCX,MAAM,WAAiB,GAAY,GAAW,eAC1C,YAAYwoB,EAAQ91K,GAChBqvC,QAEAjnD,KAAK0tL,OAASA,EACd1tL,KAAK4X,KAAOA,EACZ5X,KAAK+rC,IAAM2hJ,EAAOzoC,WAAW,MAE7B,MAAM0oC,EAAoB3tL,KAAK4tL,YAAYh1J,KAAK54B,MAChDA,KAAK4gL,WAAav+I,GAAS,KACvB,GAAesrJ,IAZP,IAAO,IAgBvB,UACI1mI,MAAM9N,UACNn5C,KAAK0tL,OAAS,KACd1tL,KAAK+rC,IAAM,KAGf,KAAKqnI,EAAUtsD,EAAKgmE,GAChB9sL,KAAK+sL,aAAa3Z,EAAUtsD,EAAKgmE,GACjC9sL,KAAK4tL,cAGT,SAAS/1I,GACL,MAAM,OAAE61I,EAAM,KAAE91K,GAAS5X,KACzB0tL,EAAOt9I,MAAQx4B,EAAKw4B,MAAQyH,EAC5B61I,EAAO7jB,OAASjyJ,EAAKiyJ,OAAShyH,EAC9B73C,KAAK+rC,IAAI8L,MAAMA,EAAOA,GAG1B,oBACI,MAAuC,iBAA5B9F,OAAO87I,iBACP97I,OAAO87I,iBAGX,EAGX,YAAYnuL,GACR,IAAKM,KAAK+rC,IACN,OAGJ,MACM8L,EADan4C,GAAWA,EAAQouL,WACX,EAAI9tL,KAAK+tL,oBACpC/tL,KAAKguL,SAASn2I,GAEd73C,KAAK+rC,IAAIkiJ,UAAU,EAAG,EAAGjuL,KAAK0tL,OAAOt9I,MAAOpwC,KAAK0tL,OAAO7jB,QACxD7pK,KAAKstL,SAASttL,KAAK+rC,MAIZ,IAAA,GAAA,GCfA,GA5Cf,cAAuB,GACnB,cACIkb,QAEAjnD,KAAKkuL,OAAS,GAGlB,KAAKC,EAAOliB,GACRjsK,KAAKkuL,OAAO7qL,KAAK,CACb4oK,KAAMA,EACNkiB,MAAOA,IAEXA,EAAMC,UAAYpuL,KAGtB,YAAYopK,GACR,MAAM8kB,EAASluL,KAAKkuL,OACdptL,EAASotL,EAAOptL,OAChB4G,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAMpsC,EAAQosC,IACxBghJ,EAAOhhJ,GAAK++H,KAAKlB,cAAc3B,IAC/B1hK,EAAOrE,KAAK6qL,EAAOhhJ,GAAKihJ,OAGhC,OAAOzmL,EAGX,OAAOymL,EAAOliB,GACVjsK,KAAKqzK,KAAK8a,EAAOliB,GAGrB,OAAOkiB,GACH,MAAMD,EAASluL,KAAKkuL,OACdptL,EAASotL,EAAOptL,OAEtB,IAAK,IAAIosC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5B,GAAIghJ,EAAOhhJ,GAAKihJ,QAAUA,EAAO,CAC7BD,EAAOl0K,OAAOkzB,EAAK,GACnB,SCpChB,MAAM,WAAiB,GACnB,YAAY4hF,GACR7nE,QACAjnD,KAAKoxC,SAAW,GAChBpxC,KAAK8uH,KAAOA,EAGhB,SAASA,GACL,MAAMu/D,EAAWruL,KAAK8uH,KAChBw/D,EAAkBD,EAAS7jB,cAC3BA,EAAc17C,EAAK07C,cAGzB,OAFiB6jB,EAASr/I,OAAOhE,GAAK8jF,EAAK9/E,OAAOhE,GAAKqjJ,EAASr/I,OAAOmB,GAAK2+E,EAAK9/E,OAAOmB,GAAKq6H,EAAYx/H,GAAKsjJ,EAAgBtjJ,GAC1Hw/H,EAAYr6H,GAAKm+I,EAAgBn+I,EAIzC,YAAYi5H,GACR,MAAMh4H,EAAWpxC,KAAKoxC,SAChBtwC,EAASswC,EAAStwC,OAClB4G,EAASu/C,MAAMsnI,YAAYnlB,GACjC,IAAK,IAAIl8H,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5BmtF,GAAO3yH,EAAQ0pC,EAASlE,GAAKqhJ,YAAYnlB,IAE7C,OAAO1hK,EAGX,OAAOymL,EAAOliB,GACV,MAAM76H,EAAWpxC,KAAKoxC,SACtB,IAAIo9I,GAAW,EAEf,GAAIxuL,KAAKyuL,SAASxiB,GAAO,CACrB,GAAIjsK,KAAKkuL,OAAOptL,OAAS,EACrBd,KAAKqzK,KAAK8a,EAAOliB,OACd,CACE76H,EAAStwC,QACVd,KAAK0uL,gBAGT,IAAK,IAAIxhJ,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IACrC,GAAIkE,EAASlE,GAAKwzC,OAAOytG,EAAOliB,GAAO,CACnCuiB,GAAW,EACX,MAIHA,GACDxuL,KAAKqzK,KAAK8a,EAAOliB,GAGzBuiB,GAAW,EAGf,OAAOA,EAGX,gBACI,MAAM,KAAE1/D,EAAI,SAAE19E,GAAapxC,KACrB02C,EAASo4E,EAAKp4E,SACdi4I,EAAY7/D,EAAK1+E,QAAU,EAC3Bw+I,EAAa9/D,EAAK+6C,SAAW,EAEnCz4H,EAAS/tC,KACL,IAAI,GAAS,IAAI,GAAK,CAAEyrH,EAAK9/E,OAAOhE,EAAG8jF,EAAK9/E,OAAOmB,GAAK,CAAEw+I,EAAWC,KACrE,IAAI,GAAS,IAAI,GAAK,CAAEl4I,EAAO1L,EAAG8jF,EAAK9/E,OAAOmB,GAAK,CAAEw+I,EAAWC,KAChE,IAAI,GAAS,IAAI,GAAK,CAAE9/D,EAAK9/E,OAAOhE,EAAG0L,EAAOvG,GAAK,CAAEw+I,EAAWC,KAChE,IAAI,GAAS,IAAI,GAAK,CAAEl4I,EAAO1L,EAAG0L,EAAOvG,GAAK,CAAEw+I,EAAWC,OAKxD,IAAA,GAAA,GC+Gf,SAASC,GAAepd,EAAIE,GACxB,OAAIF,EAAGqd,QAAUnd,EAAGmd,QACT,EAEPrd,EAAGqd,QAAUnd,EAAGmd,SACR,EAGL,EAGI,IAAA,GA1Lf,cAA6B,GAEzB,cACI7nI,QAEAjnD,KAAK+uL,YAGT,YACI/uL,KAAKgvL,QAAU,GACfhvL,KAAK+J,KAAO,IAAI,GAChB/J,KAAKivL,aAAe,GAGxB,QACI,MAAMA,EAAejvL,KAAKivL,aAC1B,IAAK,IAAI/hJ,EAAM,EAAGA,EAAM+hJ,EAAanuL,OAAQosC,IACzCltC,KAAKshC,OAAO2tJ,EAAa/hJ,IAE7BltC,KAAK+uL,YAGT,WAAW3lB,GACP,MAAM8lB,GAAelvL,KAAKgvL,QAASzlL,KAAK2R,MAAOkuJ,EAAMp+H,EA3B3C,OA2BgE,IAAMzhC,KAAK2R,MAAOkuJ,EAAMj5H,EA3BxF,MA4BV,IAAIzoC,EAAS1H,KAAK+J,KAAKwkL,YAAYnlB,GAE/B8lB,IACAxnL,EAASA,EAAOiC,OAAOulL,EAAWX,YAAYnlB,KAGlDppK,KAAKmvL,aAAaznL,GAElBA,EAAO4iB,KAAKukK,IACZ,IAAK,IAAI3hJ,EAAM,EAAGA,EAAMxlC,EAAO5G,OAAQosC,IACnC,GAAIxlC,EAAOwlC,GAAK69H,cAAc3B,GAC1B,OAAO1hK,EAAOwlC,GAK1B,aAAakmI,GACT,IAAK,IAAIlmI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IAAO,CAC5C,IAAIuH,EAAU2+H,EAASlmI,GACnBkiJ,EAAS,EACTC,EAAc9lL,KAAK0+J,IA/ChB,IACD,IA+CF9jF,EAAU,GAEd,KAAO1vC,GACH0vC,EAAQ9gF,KAAKoxC,GACbA,EAAUA,EAAQpuB,OAGtB,KAAO89D,EAAQrjF,QACX2zC,EAAU0vC,EAAQzgF,MAClB0rL,KAAY36I,EAAQpuB,OAASouB,EAAQpuB,OAAO+qB,SAAWpxC,KAAKivL,cAAcptL,QAAQ4yC,GAAW,GAAK46I,EAClGA,GA1DG,IA6DPjc,EAASlmI,GAAK4hJ,QAAUM,GAIhC,cAAc38K,GACM,cAAZA,EAAEq0J,OAAqC,iBAAZr0J,EAAEq0J,OAC7B9mK,KAAKsvL,WAAW78K,EAAEgiC,SAI1B,eAAehiC,GACXzS,KAAKsvL,WAAW78K,EAAEgiC,SAGtB,WAAWA,GACP,GAAyB,UAArBA,EAAQxiC,SACR,IAAK,IAAIi7B,EAAM,EAAGA,EAAMuH,EAAQrD,SAAStwC,OAAQosC,IAC7CltC,KAAKsvL,WAAW76I,EAAQrD,SAASlE,SAGjCuH,EAAQ25I,WACR35I,EAAQ25I,UAAU9sJ,OAAOmT,GAE7Bz0C,KAAKuvL,aAAa96I,GAI1B,IAAI2+H,GACA,MAAMoc,EAAgB56K,MAAM4I,QAAQ41J,GAAYA,EAASlvK,MAAM,GAAK,CAAEkvK,GAEtE/4C,GAAOr6H,KAAKivL,aAAcO,GAC1BxvL,KAAKyvL,QAAQD,GAGjB,eAAe/8K,GACX,GAAiB,WAAbA,EAAEmb,OACF,IAAK,IAAIsf,EAAM,EAAGA,EAAMz6B,EAAE2gD,MAAMtyD,OAAQosC,IACpCltC,KAAKshC,OAAO7uB,EAAE2gD,MAAMlmB,SAGxBltC,KAAKyvL,QAAQ76K,MAAM3T,UAAUiD,MAAMwP,KAAKjB,EAAE2gD,MAAO,IAIzD,QAAQggH,GACJ,IAAI3+H,EAEJ,KAAO2+H,EAAStyK,OAAS,GACrB2zC,EAAU2+H,EAAS1vK,MACnB+wC,EAAQuyH,YAAYhnK,MACK,UAArBy0C,EAAQxiC,SACRooH,GAAO+4C,EAAU3+H,EAAQrD,UAEzBpxC,KAAKuvL,aAAa96I,GAK9B,aAAa05I,GACT,MAAMliB,EAAOkiB,EAAMliB,OACnB,GAAIA,EAAM,CACN,MAAMyjB,EAAU1vL,KAAK2vL,WAAW1jB,GAC1BjhI,EAAI0kJ,EAAQ,GAAG,GACfv/I,EAAIu/I,EAAQ,GAAG,GAErB,GAAI1vL,KAAK4vL,OAAOF,GACZ1vL,KAAK+J,KAAK22E,OAAOytG,EAAOliB,OACrB,CACH,MAAM+iB,EAAUhvL,KAAKgvL,QAChBA,EAAQhkJ,KACTgkJ,EAAQhkJ,GAAK,IAGZgkJ,EAAQhkJ,GAAGmF,KACZ6+I,EAAQhkJ,GAAGmF,GAAK,IAAI,GAChB,IAAI,GAAK,CAzIf,IAyIiBnF,EAzIjB,IAyIgCmF,GAAiB,CAzIjD,IAAA,QA6IF6+I,EAAQhkJ,GAAGmF,GAAGuwC,OAAOytG,EAAOliB,KAKxC,OAAOx3H,GAGH,GAFAA,EAAQsyH,eAAe/mK,MAEE,UAArBy0C,EAAQxiC,SAAsB,CAC9B,MAAMm/B,EAAWqD,EAAQrD,SACzB,IAAK,IAAIlE,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IACrCltC,KAAKshC,OAAO8P,EAASlE,SAElBuH,EAAQ25I,YACf35I,EAAQ25I,UAAU9sJ,OAAOmT,UAClBA,EAAQ25I,WAIvB,OAAOsB,GACH,OAAOA,EAAQ,GAAG5uL,OAAS,GAAK4uL,EAAQ,GAAG5uL,OAAS,EAGxD,WAAWguH,GACP,MAAM07C,EAAc17C,EAAK07C,cACnBqlB,EAAUtmL,KAAK2R,MAAMsvJ,EAAYx/H,EAtK7B,KAuKJ8kJ,EAAUvmL,KAAK2R,MAAMsvJ,EAAYr6H,EAvK7B,KAwKJu/I,EAAU,CAAE,GAAI,IACtB,IAAK,IAAI1kJ,EAAIzhC,KAAK2R,MAAM4zG,EAAK9/E,OAAOhE,EAzK1B,KAyK0CA,GAAK6kJ,EAAS7kJ,IAC9D0kJ,EAAQ,GAAGrsL,KAAK2nC,GAEpB,IAAK,IAAImF,EAAI5mC,KAAK2R,MAAM4zG,EAAK9/E,OAAOmB,EA5K1B,KA4K0CA,GAAK2/I,EAAS3/I,IAC9Du/I,EAAQ,GAAGrsL,KAAK8sC,GAEpB,OAAOu/I,ICjIA,GApDK,CAChBK,UAAW,SAAUC,aAAc,SAAUC,KAAM,SACnDC,WAAY,SAAUC,MAAO,SAAUC,MAAO,SAC9CC,OAAQ,SAAUC,MAAO,SAAUC,eAAgB,SACnDC,KAAM,SAAUC,WAAY,SAAUC,MAAO,SAC7CC,UAAW,SAAUC,UAAW,SAAUC,WAAY,SACtDC,UAAW,SAAUC,MAAO,SAAUC,eAAgB,SACtDC,SAAU,SAAUC,QAAS,SAAUC,KAAM,SAC7CC,SAAU,SAAUC,SAAU,SAAUC,cAAe,SACvDC,SAAU,SAAUC,SAAU,SAAUC,UAAW,SACnDC,UAAW,SAAUC,YAAa,SAAUC,eAAgB,SAC5DC,WAAY,SAAUC,WAAY,SAAUC,QAAS,SACrDC,WAAY,SAAUC,aAAc,SAAUC,cAAe,SAC7DC,cAAe,SAAUC,cAAe,SAAUC,cAAe,SACjEC,WAAY,SAAUC,SAAU,SAAUC,YAAa,SACvDC,QAAS,SAAUC,QAAS,SAAUC,WAAY,SAClDC,UAAW,SAAUC,YAAa,SAAUC,YAAa,SACzDC,QAAS,SAAUC,UAAW,SAAUC,WAAY,SACpDC,KAAM,SAAUC,UAAW,SAAUC,KAAM,SAC3CC,KAAM,SAAUC,MAAO,SAAUC,YAAa,SAC9CC,SAAU,SAAUC,QAAS,SAAUC,UAAW,SAClDC,OAAQ,SAAUC,MAAO,SAAUC,MAAO,SAC1CC,SAAU,SAAUC,cAAe,SAAUC,UAAW,SACxDC,aAAc,SAAUC,UAAW,SAAUC,WAAY,SACzDC,UAAW,SAAUC,qBAAsB,SAAUC,UAAW,SAChEC,UAAW,SAAUC,WAAY,SAAUC,UAAW,SACtDC,YAAa,SAAUC,cAAe,SAAUC,aAAc,SAC9DC,eAAgB,SAAUC,eAAgB,SAAUC,eAAgB,SACpEC,YAAa,SAAUC,KAAM,SAAUC,UAAW,SAClDC,MAAO,SAAUC,QAAS,SAAUC,OAAQ,SAC5CC,iBAAkB,SAAUC,WAAY,SAAUC,aAAc,SAChEC,aAAc,SAAUC,eAAgB,SAAUC,gBAAiB,SACnEC,kBAAmB,SAAUC,gBAAiB,SAAUC,gBAAiB,SACzEC,aAAc,SAAUC,UAAW,SAAUC,UAAW,SACxDC,SAAU,SAAUC,YAAa,SAAUC,KAAM,SACjDC,QAAS,SAAUC,MAAO,SAAUC,UAAW,SAC/CC,OAAQ,SAAUC,UAAW,SAAUC,OAAQ,SAC/CC,cAAe,SAAUC,UAAW,SAAUC,cAAe,SAC7DC,cAAe,SAAUC,WAAY,SAAUC,UAAW,SAC1DC,KAAM,SAAUC,KAAM,SAAUC,KAAM,SACtCC,WAAY,SAAUC,OAAQ,SAAUC,IAAK,SAC7CC,UAAW,SAAUC,UAAW,SAAUC,YAAa,SACvDC,OAAQ,SAAUC,WAAY,SAAUC,SAAU,SAClDC,SAAU,SAAUC,OAAQ,SAAUC,OAAQ,SAC9CC,QAAS,SAAUC,UAAW,SAAUC,UAAW,SACnDC,UAAW,SAAUC,KAAM,SAAUC,YAAa,SAClDC,UAAW,SAAUC,IAAK,SAAUC,KAAM,SAC1CC,QAAS,SAAUC,OAAQ,SAAUC,UAAW,SAChDC,OAAQ,SAAUC,MAAO,SAAUC,MAAO,SAC1CC,WAAY,SAAUC,OAAQ,SAAUC,YAAa,UC7CzD,MAAM,GAAU,GAAQnU,QAExB,IAAIoU,GAAmBxtB,IACnB,MAAMytB,EAAa/5L,OAAOC,KAAK,IAC/B85L,EAAW91L,KAAK,eAEhB,MAAMnD,EAAS,IAAI4D,OAAO,KAAOq1L,EAAWl5L,KAAK,KAAO,WAAY,KAGpE,OAFAi5L,GAAmBxtB,GAAUxrK,EAAOyH,KAAK+jK,GAElCxrK,EAAOyH,KAAK+jK,IAGvB,MAAM,WAAkB,GACpB,cAAgBzkH,QAChB,QAAU,OAAOjnD,KAEjB,QAAU,OAAOA,KAEjB,QAAU,OAAOA,KAAKo5L,UAAUC,QAEhC,UAAY,OAAOr5L,KAEnB,QAAU,MAAO,IAAMA,KAAKq5L,QAE5B,YACI,MAAMC,EAAMt5L,KAAKo5L,UACjB,MAAO,QAASE,EAAI/nJ,MAAQ+nJ,EAAIz6D,MAAQy6D,EAAIp6L,MAAQuS,WAAYw5B,OAAOjrC,KAAKf,GAAIs6L,QAAQ,OAG5F,YACI,OAAI,GAAQnU,MAAQ,GAAQG,QAAU,EAC3BvlL,KAAKw5L,QAETx5L,KAAKy5L,YAGhB,OAAO36L,GACH,OAAOA,IAAMkB,MAAc,OAANlB,GAAckB,KAAKy5L,cAAgBC,GAAW56L,GAAG26L,YAG1E,KAAKh0K,GACD,GAAc,OAAVA,EACA,OAAO83F,IAGX,MAAMo8E,EAAK35L,KAAKo5L,UACVQ,EAAKn0K,EAAM2zK,UAEjB,OAAO7vL,KAAKsvC,KAAKtvC,KAAK0+J,IAAoB,IAAf0xB,EAAGpoJ,EAAIqoJ,EAAGroJ,GAAW,GAC/BhoC,KAAK0+J,IAAoB,KAAf0xB,EAAG96D,EAAI+6D,EAAG/6D,GAAW,GAC/Bt1H,KAAK0+J,IAAoB,KAAf0xB,EAAGz6L,EAAI06L,EAAG16L,GAAW,IAGpD,QACI,IAAIJ,EAAIkB,KAAKo5L,UAKb,OAJIt6L,IAAMkB,OACNlB,EAAI,IAAI+6L,GAAM/6L,EAAEyyC,EAAGzyC,EAAE+/H,EAAG//H,EAAEI,EAAGJ,EAAEG,IAG5BH,GAIf,MAAMg7L,WAAY,GACd,YAAYvoJ,EAAGstF,EAAG3/H,EAAGD,GACjBgoD,QAEAjnD,KAAKuxC,EAAIA,EACTvxC,KAAK6+H,EAAIA,EACT7+H,KAAKd,EAAIA,EACTc,KAAKf,EAAIA,EAGb,QACI,MAAM,EAAEsyC,EAAC,EAAEstF,EAAC,EAAE3/H,GAAMc,KACdwJ,EAAMD,KAAKC,IAAI+nC,EAAGstF,EAAG3/H,GACrB0c,EAAMrS,KAAKqS,IAAI21B,EAAGstF,EAAG3/H,GACrBoxE,EAAQ10D,EAAMpS,EACd6uC,EAAIz8B,EACV,IAAIuiG,EAAGz8G,EAEP,OAAc,IAAV4uE,EACO,IAAIypH,GAAI,EAAG,EAAG1hJ,EAAGr4C,KAAKf,IAGrB,IAAR2c,GACAla,EAAI4uE,EAAQ10D,EAERuiG,EADA5sE,IAAM31B,GACDijH,EAAI3/H,GAAKoxE,EACPuuD,IAAMjjH,EACT,GAAK1c,EAAIqyC,GAAK++B,EAEd,GAAK/+B,EAAIstF,GAAKvuD,EAGtB6tC,GAAK,GACDA,EAAI,IACJA,GAAK,OAGTz8G,EAAI,EACJy8G,GAAK,GAGF,IAAI47E,GAAI57E,EAAGz8G,EAAG22C,EAAGr4C,KAAKf,IAGjC,QACI,MAAM,EAAEsyC,EAAC,EAAEstF,EAAC,EAAE3/H,GAAMc,KACd4b,EAAMrS,KAAKqS,IAAI21B,EAAGstF,EAAG3/H,GACrBsK,EAAMD,KAAKC,IAAI+nC,EAAGstF,EAAG3/H,GAC3B,IAAIi/G,EAAGz8G,EAAGM,GAAK4Z,EAAMpS,GAAO,EAE5B,GAAIoS,IAAQpS,EACR20G,EAAIz8G,EAAI,MACL,CACH,MAAMssC,EAAIpyB,EAAMpS,EAEhB,OADA9H,EAAIM,EAAI,GAAMgsC,GAAK,EAAIpyB,EAAMpS,GAAOwkC,GAAKpyB,EAAMpS,GACvCoS,GACJ,KAAK21B,EAAG4sE,GAAK0gB,EAAI3/H,GAAK8uC,GAAK6wF,EAAI3/H,EAAI,EAAI,GAAI,MAC3C,KAAK2/H,EAAG1gB,GAAKj/G,EAAIqyC,GAAKvD,EAAI,EAAG,MAC7B,KAAK9uC,EAAGi/G,GAAK5sE,EAAIstF,GAAK7wF,EAAI,GAKlC,OAAO,IAAIgsJ,GAAQ,GAAJ77E,EAAY,IAAJz8G,EAAa,IAAJM,EAAShC,KAAKf,GAGlD,UACI,OAAO,IAAI46L,GAAe,IAAT75L,KAAKuxC,EAAkB,IAATvxC,KAAK6+H,EAAkB,IAAT7+H,KAAKd,EAASc,KAAKf,IAIxE,MAAM46L,WAAcC,GAChB,YAAYvoJ,EAAGstF,EAAG3/H,EAAGD,GACjBgoD,MAAM19C,KAAKw1B,MAAMwS,GAAIhoC,KAAKw1B,MAAM8/F,GAAIt1H,KAAKw1B,MAAM7/B,GAAID,GAGvD,QACI,OAAO,IAAI66L,GAAI95L,KAAKuxC,EAAI,IAAKvxC,KAAK6+H,EAAI,IAAK7+H,KAAKd,EAAI,IAAKc,KAAKf,GAGlE,QACI,OAAOe,KAAKi6L,QAAQC,QAGxB,QACI,OAAOl6L,KAAKi6L,QAAQE,QAGxB,QACI,OAAOC,GAAIp6L,KAAKuxC,EAAG,GAAK6oJ,GAAIp6L,KAAK6+H,EAAG,GAAKu7D,GAAIp6L,KAAKd,EAAG,GAGzD,UACI,OAAOc,MAIf,SAASo6L,GAAI51L,EAAG4rC,EAAOlK,EAAM,KACzB,IAAIx+B,EAASlD,EAAEuU,SAAS,IACxB,KAAOq3B,EAAQ1oC,EAAO5G,QAClB4G,EAASw+B,EAAMx+B,EAGnB,OAAOA,EAGX,MAAMqyL,WAAY,GACd,YAAY57E,EAAGz8G,EAAG22C,EAAGp5C,GACjBgoD,QAEAjnD,KAAKm+G,EAAIA,EACTn+G,KAAK0B,EAAIA,EACT1B,KAAKq4C,EAAIA,EACTr4C,KAAKf,EAAIA,EAGb,QACI,IACIsyC,EAAGstF,EAAG3/H,GADN,EAAEi/G,EAAC,EAAG,EAAE9lE,GAAMr4C,KAGlB,GAAU,IAAN0B,EACA6vC,EAAIstF,EAAI3/H,EAAIm5C,MACT,CACH8lE,GAAK,GAEL,MAAMz9G,EAAI6I,KAAK2R,MAAMijG,GACf14G,EAAI04G,EAAIz9G,EACRlB,EAAI64C,GAAK,EAAI32C,GACb6xJ,EAAIl7G,GAAK,EAAI32C,EAAI+D,GACjBtG,EAAIk5C,GAAK,EAAI32C,GAAK,EAAI+D,IAE5B,OAAQ/E,GACJ,KAAK,EAAG6wC,EAAI8G,EAAGwmF,EAAI1/H,EAAGD,EAAIM,EAAG,MAC7B,KAAK,EAAG+xC,EAAIgiH,EAAG10B,EAAIxmF,EAAGn5C,EAAIM,EAAG,MAC7B,KAAK,EAAG+xC,EAAI/xC,EAAGq/H,EAAIxmF,EAAGn5C,EAAIC,EAAG,MAC7B,KAAK,EAAGoyC,EAAI/xC,EAAGq/H,EAAI00B,EAAGr0J,EAAIm5C,EAAG,MAC7B,KAAK,EAAG9G,EAAIpyC,EAAG0/H,EAAIr/H,EAAGN,EAAIm5C,EAAG,MAC7B,QAAS9G,EAAI8G,EAAGwmF,EAAIr/H,EAAGN,EAAIq0J,GAInC,OAAO,IAAIumC,GAAIvoJ,EAAGstF,EAAG3/H,EAAGc,KAAKf,GAGjC,QACI,OAAOe,KAAKi6L,QAAQE,QAGxB,UACI,OAAOn6L,KAAKi6L,QAAQb,WAI5B,MAAMY,WAAY,GACd,YAAY77E,EAAGz8G,EAAGM,EAAG/C,GACjBgoD,QAEAjnD,KAAKm+G,EAAIA,EACTn+G,KAAK0B,EAAIA,EACT1B,KAAKgC,EAAIA,EACThC,KAAKf,EAAIA,EAGb,QACI,IAGIsyC,EAAGstF,EAAG3/H,EAHNi/G,EAAIn+G,KAAKm+G,EAAI,IACbz8G,EAAI1B,KAAK0B,EAAI,IACbM,EAAIhC,KAAKgC,EAAI,IAGjB,GAAU,IAANN,EACA6vC,EAAIstF,EAAI3/H,EAAI8C,MACT,CACH,MAAMuxJ,EAAIvxJ,EAAI,GAAMA,GAAK,EAAIN,GAAKM,EAAIN,EAAIM,EAAIN,EACxClC,EAAI,EAAIwC,EAAIuxJ,EAClBhiH,EAAI8oJ,GAAQ76L,EAAG+zJ,EAAGp1C,EAAI,EAAI,GAC1B0gB,EAAIw7D,GAAQ76L,EAAG+zJ,EAAGp1C,GAClBj/G,EAAIm7L,GAAQ76L,EAAG+zJ,EAAGp1C,EAAI,EAAI,GAG9B,OAAO,IAAI27E,GAAIvoJ,EAAGstF,EAAG3/H,EAAGc,KAAKf,GAGjC,QACI,OAAOe,KAAKi6L,QAAQC,QAGxB,UACI,OAAOl6L,KAAKi6L,QAAQb,WAI5B,SAASiB,GAAQ76L,EAAG+zJ,EAAG7xJ,GACnB,IAAIvC,EAAIuC,EAUR,OARIvC,EAAI,IACJA,GAAK,GAGLA,EAAI,IACJA,GAAK,GAGLA,EAAI,EAAI,EACDK,EAAc,GAAT+zJ,EAAI/zJ,GAASL,EAGzBA,EAAI,GACGo0J,EAGPp0J,EAAI,EAAI,EACDK,GAAK+zJ,EAAI/zJ,IAAM,EAAI,EAAIL,GAAK,EAGhCK,EAKI,SAASk6L,GAAWruL,EAAOivL,GACtC,IAAIt5L,EAAG4rC,EAEP,GAAa,MAATvhC,GAA2B,SAAVA,EACjB,OAAO,KAGX,GAAIA,aAAiB,GACjB,OAAOA,EAGX,IAAIqgK,EAAQrgK,EAAM7E,cAClB,GAAKxF,EAAIk4L,GAAgBxtB,GAOrB,OALIA,EADS,gBAAT1qK,EAAE,GACM,IAAI84L,GAAI,EAAG,EAAG,EAAG,GAEjBJ,GAAW,GAAY14L,EAAE,IAAKs5L,GAE1C5uB,EAAM3rK,MAAQ,CAAEiB,EAAE,IACX0qK,EA4BX,IA1BK1qK,EAAI,gDAAgD2G,KAAK+jK,IAC1D9+H,EAAM,IAAIitJ,GAAMloL,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IAAK,IAC5BA,EAAI,uCAAuC2G,KAAK+jK,IACxD9+H,EAAM,IAAIitJ,GAAMloL,SAAS3Q,EAAE,GAAKA,EAAE,GAAI,IACtB2Q,SAAS3Q,EAAE,GAAKA,EAAE,GAAI,IACtB2Q,SAAS3Q,EAAE,GAAKA,EAAE,GAAI,IAAK,IACnCA,EAAI,uDAAuD2G,KAAK+jK,IACxE9+H,EAAM,IAAIitJ,GAAMloL,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IAAK,IAC5BA,EAAI,wEAAwE2G,KAAK+jK,IACzF9+H,EAAM,IAAIitJ,GAAMloL,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IACf2Q,SAAS3Q,EAAE,GAAI,IAAKyQ,WAAWzQ,EAAE,MACzCA,EAAI,qFAAqF2G,KAAK+jK,IACtG9+H,EAAM,IAAIktJ,GAAIroL,WAAWzQ,EAAE,IAAM,IACnByQ,WAAWzQ,EAAE,IAAM,IACnByQ,WAAWzQ,EAAE,IAAM,IAAK,IAC9BA,EAAI,sGAAsG2G,KAAK+jK,MACvH9+H,EAAM,IAAIktJ,GAAIroL,WAAWzQ,EAAE,IAAM,IACnByQ,WAAWzQ,EAAE,IAAM,IACnByQ,WAAWzQ,EAAE,IAAM,IAAKyQ,WAAWzQ,EAAE,MAGnD4rC,EACAA,EAAI7sC,MAAQiB,OACT,IAAKs5L,EACR,MAAM,IAAI7zL,MAAM,uBAAyBilK,GAG7C,OAAO9+H,EC/LI,IAAA,GAjIf,cAAuB,GAEnB,SAASb,GACLA,EAAImhJ,OAEJltL,KAAKmtL,aAAaphJ,GAClB/rC,KAAKotL,QAAQrhJ,GACb/rC,KAAKqtL,WAAWthJ,GAEhBA,EAAI8gJ,YAEJ7sL,KAAKu6L,aAAaxuJ,EAAK/rC,KAAKygL,YAE5BzgL,KAAKw6L,YAAYzuJ,GACjB/rC,KAAKy6L,WAAW1uJ,GAChB/rC,KAAK06L,YAAY3uJ,GAEjB/rC,KAAK26L,QAAQ5uJ,GACb/rC,KAAK46L,UAAU7uJ,GAEfA,EAAIwhJ,UAGR,QAAQxhJ,GACJ,MAAMjuC,EAAOkC,KAAKygL,WAAW/gL,QAAQ5B,KACrC,IAAI+8L,GAAU,EAkBd,OAhBI/8L,IACsB,aAAlBA,EAAKmU,UACLjS,KAAK86L,gBAAgB/uJ,EAAKjuC,GAC1B+8L,GAAU,GACFpvB,GAAc3tK,EAAK4tK,SAC3B3/H,EAAIgvJ,UAAYj9L,EAAK4tK,MAErB3/H,EAAImhJ,OACJltL,KAAKgtL,YAAYjhJ,EAAKjuC,EAAKgwK,SAC3B/hI,EAAIjuC,OACJiuC,EAAIwhJ,UAEJsN,GAAU,IAIXA,EAGX,gBAAgB9uJ,EAAKjuC,GACjB,MAAMmuK,EAAOjsK,KAAKygL,WAAWjI,UAC7B,IAAIwiB,EAEJ,GAAIl9L,aAAgB,GAAgB,CAChC,IAAIyF,EAAQzF,EAAKyF,QACb8D,EAAMvJ,EAAKuJ,MACf2zL,EAAWjvJ,EAAIkvJ,qBAAqB13L,EAAMynC,EAAGznC,EAAM4sC,EAAG9oC,EAAI2jC,EAAG3jC,EAAI8oC,QAC9D,GAAIryC,aAAgB,GAAgB,CACvC,IAAI44C,EAAS54C,EAAK44C,SAClBskJ,EAAWjvJ,EAAImvJ,qBAAqBxkJ,EAAO1L,EAAG0L,EAAOvG,EAAG,EAAGuG,EAAO1L,EAAG0L,EAAOvG,EAAGryC,EAAKovK,WAnEhG,SAA0B8tB,EAAUnc,GAChC,IAAK,IAAI3xI,EAAM,EAAGA,EAAM2xI,EAAM/9K,OAAQosC,IAAO,CACzC,IAAIkW,EAAOy7H,EAAM3xI,GACbw+H,EAAQguB,GAAWt2I,EAAKsoH,SAE5BA,EAAMzsK,GAAKmkD,EAAK0qH,UAEhBktB,EAASG,aAAa/3I,EAAKruC,SAAU22J,EAAM+tB,cAPnD,CAsEyBuB,EAAUl9L,EAAK+gL,OAEhC9yI,EAAImhJ,OAECpvL,EAAKkhL,aACNjzI,EAAIj0B,UAAUm0J,EAAK77H,QAAS,EAAG,EAAG67H,EAAKpC,SAAUoC,EAAKj9H,OAAOhE,EAAGihI,EAAKj9H,OAAOmB,GAEhFpE,EAAIgvJ,UAAYC,EAChBjvJ,EAAIjuC,OAEJiuC,EAAIwhJ,UAGR,UAAUxhJ,GACN,MAAM4gI,EAAS3sK,KAAKygL,WAAW/gL,QAAQitK,OACvC,GAAIA,IAAWlB,GAAckB,EAAOjB,QAAUiB,EAAOv8H,MAAQ,EASzD,OARArE,EAAIqvJ,YAAczuB,EAAOjB,MACzB3/H,EAAIsvJ,UAAY7vB,GAAemB,EAAOv8H,MAAO,GAE7CrE,EAAImhJ,OACJltL,KAAKgtL,YAAYjhJ,EAAK4gI,EAAOmB,SAC7B/hI,EAAI4gI,SACJ5gI,EAAIwhJ,WAEG,EAIf,WACI,MAAM5gB,EAAS3sK,KAAKygL,WAAW/gL,QAAQitK,OACvC,GAAIA,GAAUA,EAAOyc,SACjB,OAAOzc,EAAOyc,SAAS5iL,cAI/B,YAAYulC,GACR,MAAMq9I,EAAWppL,KAAKopL,WACtB,GAAIA,GxB1GE,UwB0GUA,EAAoB,CAChC,MAAME,EAAYpB,GAAYkB,GAC1Br9I,EAAIyuJ,YACJzuJ,EAAIyuJ,YAAYlR,IAEhBv9I,EAAIuvJ,QAAUhS,EACdv9I,EAAIwvJ,eAAiBjS,IAKjC,WAAWv9I,GACP,MAAMq9I,EAAWppL,KAAKopL,WAChBzc,EAAS3sK,KAAKygL,WAAW/gL,QAAQitK,OACnCyc,GxBxHE,UwBwHUA,EACZr9I,EAAIw9I,QxBxHH,OwByHM5c,GAAUA,EAAO4c,UACxBx9I,EAAIw9I,QAAU5c,EAAO4c,SAI7B,YAAYx9I,GACR,MAAM4gI,EAAS3sK,KAAKygL,WAAW/gL,QAAQitK,OACnCA,GAAUA,EAAOgM,WACjB5sI,EAAI4sI,SAAWhM,EAAOgM,UAI9B,aAAa5sI,EAAK7tC,GACdsuL,GAAWzgJ,EAAK7tC,KCtIT,GAPf,cAAsB,GAClB,aAAa6tC,GAETygJ,GAAWzgJ,EADE/rC,KAAKygL,WAAWn+I,YCKtB,GARf,cAAyB,GACrB,aAAayJ,GACT,MAAM,OAAE2K,EAAM,OAAEw2H,GAAWltK,KAAKygL,WAAWlS,WAE3CxiI,EAAIgtI,IAAIriI,EAAO1L,EAAG0L,EAAOvG,EAAG+8H,EAAQ,EAAa,EAAV3jK,KAAKwvC,MCkErC,GArEf,cAAwB,GACpB,YAAY0nI,EAAYqM,GACpB7lI,MAAMw5H,GAENzgL,KAAK07H,OAAS17H,KAAK07H,OAAO9iG,KAAK54B,MAC/BA,KAAKgtG,QAAUhtG,KAAKgtG,QAAQp0E,KAAK54B,MAEjCA,KAAKw7L,QAAUrP,KAEf,MAAMpY,EAAM/zK,KAAK+zK,IAAM,IAAIoX,MAEvB2B,IAAU,UAAUlkL,KAAK63K,EAAW5tI,SACpCkhI,EAAI0nB,YAAc3O,GAGtB/Y,EAAIlhI,IAAM4tI,EAAW5tI,MAEjBkhI,EAAI/sH,SACJhnD,KAAK07H,UAELq4C,EAAI2nB,OAAS17L,KAAK07H,OAClBq4C,EAAI4nB,QAAU37L,KAAKgtG,SAI3B,SAASjhE,GACwB,aAAzB/rC,KAAKw7L,QAAQr9I,UACbpS,EAAImhJ,OAEJltL,KAAKmtL,aAAaphJ,GAClB/rC,KAAKotL,QAAQrhJ,GAEb/rC,KAAK47L,UAAU7vJ,GAEfA,EAAIwhJ,WAIZ,cAAc96K,GACM,QAAZA,EAAEq0J,OACF9mK,KAAKw7L,QAAUrP,KACfnsL,KAAK+zK,IAAIlhI,IAAM7yC,KAAKygL,WAAW5tI,OAE/BoU,MAAMogH,cAAc50J,GAI5B,SACIzS,KAAKw7L,QAAQtzL,UACblI,KAAK4gL,aAGT,UACI5gL,KAAKw7L,QAAQn6J,OAAO,IAAI56B,MACpB,yBAA2BzG,KAAK+zK,IAAIlhI,IACpC,uDAIR,UAAU9G,GACN,MAAM+iF,EAAO9uH,KAAKygL,WAAW3xD,OACvBq7C,EAAUr7C,EAAKq7C,UAErBp+H,EAAI6vJ,UACA57L,KAAK+zK,IAAK5J,EAAQn/H,EAAGm/H,EAAQh6H,EAAG2+E,EAAK1+E,QAAS0+E,EAAK+6C,YCvDhD,GATf,cAA4B,GACxB,aAAa99H,GACT,MAAMljC,EAAQ7I,KAAKygL,WAAW53K,MAC9B,IAAK,IAAInI,EAAI,EAAGA,EAAImI,EAAM/H,OAAQJ,IAC9B8rL,GAAWzgJ,EAAKljC,EAAMnI,MCGnB,GARf,cAAuB,GACnB,aAAaqrC,GACT,MAAM,OAAEiD,EAAM,KAAEp3B,GAAS5X,KAAKygL,WAAWlS,WAEzCxiI,EAAI+iF,KAAK9/E,EAAOhE,EAAGgE,EAAOmB,EAAGv4B,EAAKw4B,MAAOx4B,EAAKiyJ,UC2BvC,GA/Bf,cAAuB,GACnB,SAAS99H,GACL,MAAMi4C,EAAOhkF,KAAKygL,WACZ35D,EAAM9iC,EAAKlgD,WACXlsB,EAAOosE,EAAK+2F,UAElBhvI,EAAImhJ,OAEJltL,KAAKmtL,aAAaphJ,GAClB/rC,KAAKotL,QAAQrhJ,GACb/rC,KAAKqtL,WAAWthJ,GAEhBA,EAAI8gJ,YAEJ9gJ,EAAIivI,KAAOh3F,EAAKtkF,QAAQs7K,KACxBjvI,EAAI8vJ,UAAY,OAEZ77L,KAAK26L,QAAQ5uJ,IACbA,EAAI+vJ,SAAS93G,EAAKpX,UAAWk6C,EAAI97E,EAAG87E,EAAI32E,EAAIv4B,EAAKuiK,UAGjDn6K,KAAK46L,UAAU7uJ,KACf/rC,KAAKw6L,YAAYzuJ,GACjBA,EAAIgwJ,WAAW/3G,EAAKpX,UAAWk6C,EAAI97E,EAAG87E,EAAI32E,EAAIv4B,EAAKuiK,WAGvDpuI,EAAIwhJ,YCZZ,GAAStC,IAAM,GACf,GAASC,OAAS,GAClB,GAASnuE,MAAQ,GACjB,GAASouE,MAAQ,GACjB,GAASC,UAAY,GACrB,GAASC,KAAO,GAChB,GAASC,KAAO,GAChB,GAASC,KAAO,GAmMD,IAAA,GAhMf,cAAsB,GAClB,WACI,MAAO,SAGX,YAAY92I,EAAS/0C,GACjBunD,MAAMxS,EAAS/0C,GAEfM,KAAKy0C,QAAQyzB,UAAYloE,KAAKspH,UAAUtpH,MAExC,MAAM0tL,EAAS1tL,KAAKy0C,QAAQszI,kBACtBnwK,EAAO,GAAY68B,GAEzBi5I,EAAOt9I,MAAQx4B,EAAKw4B,MACpBs9I,EAAO7jB,OAASjyJ,EAAKiyJ,OAErB7pK,KAAKwrL,aAAekC,EAEpB1tL,KAAK4/I,MAAQ,IAAI,GAAS8tC,EAAQ91K,GAElC5X,KAAKg8L,mBAAqBh8L,KAAKi8L,YAAYrjK,KAAK54B,MAEhDgoL,GAAWhoL,KAAKy0C,QAAS,CACrBk3I,MAAO3rL,KAAKg8L,mBACZ1iJ,UAAWt5C,KAAKg8L,qBAIxB,UACI/0I,MAAM9N,UAEFn5C,KAAK4/I,QACL5/I,KAAK4/I,MAAMzmG,UACXn5C,KAAK4/I,MAAQ,MAGb5/I,KAAKk8L,cACLl8L,KAAKk8L,YAAYt9K,eACV5e,KAAKk8L,aAGZl8L,KAAKm8L,UACLn8L,KAAKm8L,QAAQhjJ,iBACNn5C,KAAKm8L,SAGhBlU,GAAajoL,KAAKy0C,QAAS,CACvBk3I,MAAO3rL,KAAKg8L,mBACZ1iJ,UAAWt5C,KAAKg8L,qBAIxB,KAAKvnJ,GACDwS,MAAMglI,KAAKx3I,GACXz0C,KAAK4/I,MAAM1lF,KAAK,CAAEzlB,QAAWv+B,EAAWlW,KAAKN,QAAQotL,MAEjD9sL,KAAKk8L,aACLl8L,KAAKk8L,YAAYh9K,IAAI,CAAEu1B,IAI/B,QACIwS,MAAMroC,QACN5e,KAAK4/I,MAAMhhI,QAEP5e,KAAKk8L,aACLl8L,KAAKk8L,YAAYt9K,QAGjB5e,KAAKm8L,SACLn8L,KAAKm8L,QAAQv9K,QAIrB,YAAYnM,GACR,GAAIzS,KAAKk8L,YAAa,CAClB,MAAM9yB,EAAQppK,KAAKo8L,cAAc3pL,GAEjC,OADczS,KAAKk8L,YAAYG,WAAWjzB,IAKlD,QACI,MAAQxpB,MAAO71I,EAAMyhL,aAAc8Q,GAAgBt8L,KAC7Cu8L,EAAgB,GAEtBxyL,EAAKoxK,SAAUzxG,IACPA,EAAU8xH,SACVe,EAAcl5L,KAAKqmE,EAAU8xH,WAIrC,MAAMrxI,EAAUgiI,KACVqQ,EAAiB,KACnBzyL,EAAK6jL,YAAY,CAAEE,YAAY,IAE/B,IACI,MAAM1uK,EAAOk9K,EAAYG,YACzBtyI,EAAQjiD,QAAQkX,GAClB,MAAO3M,GACL03C,EAAQ9oB,OAAO5uB,KAMvB,OAFA85K,GAAWgQ,GAAevyI,KAAKwyI,EAAgBA,GAExCryI,EAGX,kBACIlD,MAAMy1I,kBACF18L,KAAKk8L,cACLl8L,KAAKk8L,YAAYt9K,eACV5e,KAAKk8L,aAIpB,iBAEI,GADAj1I,MAAM01I,kBACD38L,KAAKk8L,YAAa,CACnBl8L,KAAKk8L,YAAc,IAAI,GAEvB,MAAMxb,EAAa1gL,KAAK4/I,MAAM8gC,WACxBuO,EAAe,GACrB,IAAK,IAAI/hJ,EAAM,EAAGA,EAAMwzI,EAAW5/K,OAAQosC,IACvC+hJ,EAAa5rL,KAAKq9K,EAAWxzI,GAAKuzI,YAEtCzgL,KAAKk8L,YAAYh9K,IAAI+vK,IAI7B,UACIjvL,KAAKwrL,aAAap7I,MAAQpwC,KAAKq5K,MAAMjpI,MACrCpwC,KAAKwrL,aAAa3hB,OAAS7pK,KAAKq5K,MAAMxP,OAEtC7pK,KAAK4/I,MAAMhoI,KAAO5X,KAAKq5K,MACvBr5K,KAAK4/I,MAAMghC,aAGf,YACI,MAAO,uDAGX,kBACI5gL,KAAKk8L,YAAc,IAAI,GACvBl8L,KAAKm8L,QAAU,ICzKvB,MAEI,YAAYS,GACRA,EAAQhkK,KAAK,aAAc54B,KAAKgjL,YAAYpqJ,KAAK54B,OACjD48L,EAAQhkK,KAAK,aAAc54B,KAAKijL,YAAYrqJ,KAAK54B,OAEjDA,KAAKy0C,QAAUmoJ,EAAQnoJ,QAG3B,QACIz0C,KAAK68L,eAGT,UACI78L,KAAK68L,sBACE78L,KAAKy0C,QAGhB,YAAYhiC,GACR,MAAM85E,EAASvsF,KAAK88L,aAAarqL,GAE5B85E,GAGIvsF,KAAK+8L,WACN/8L,KAAKg9L,eAAiBh9L,KAAKi9L,cAG/Bj9L,KAAKk9L,WAAW3wG,IANhBvsF,KAAK68L,eAUb,cACI78L,KAAK68L,eAGT,aAAapqL,GACT,IAAI07K,EAAQ17K,EAAEgiC,QAEd,KAAO05I,IAAUlnB,GAAQknB,EAAMzuL,QAAQ6sF,SACnC4hG,EAAQA,EAAM9nK,OAGlB,GAAI8nK,EACA,OAAOA,EAAMzuL,QAAQ6sF,OAI7B,aACI,GAAIvsF,KAAKy0C,QACL,OAAOz0C,KAAKy0C,QAAQhI,MAAM8/C,OAIlC,WAAWA,GACHvsF,KAAKy0C,UACLz0C,KAAKy0C,QAAQhI,MAAM8/C,OAASA,EAC5BvsF,KAAK+8L,SAAWxwG,GAIxB,eACQvsF,KAAK+8L,WACL/8L,KAAKk9L,WAAWl9L,KAAKg9L,gBAAkB,WAChCh9L,KAAK+8L,YDyGiB/8L,MAEjCinD,MAAMm8H,kBAGV,YAAY3wK,GACR,GAAIzS,KAAK0jL,mBACL,OAGJ,MAAMyK,EAAQnuL,KAAK2jL,YAAYlxK,GAE/B,GAAe,UAAXA,EAAEnP,KAAkB,CACpB,MAAM65L,EAAen9L,KAAKo9L,cACtBD,GAAgBA,IAAiBhP,GACjCnuL,KAAK6qI,QAAQ,aAAc,CACvBp2F,QAAS0oJ,EACTvZ,cAAenxK,EACfnP,KAAM,eAIV6qL,GAASgP,IAAiBhP,GAC1BnuL,KAAK6qI,QAAQ,aAAc,CACvBp2F,QAAS05I,EACTvK,cAAenxK,EACfnP,KAAM,eAIdtD,KAAK6qI,QAAQ,YAAa,CACtBp2F,QAAS05I,EACTvK,cAAenxK,EACfnP,KAAM,cAGVtD,KAAKo9L,cAAgBjP,OACdA,GACPnuL,KAAK6qI,QAAQ,QAAS,CAClBp2F,QAAS05I,EACTvK,cAAenxK,EACfnP,KAAM,YEhNtB,IAAI,GACA,GAEJ,MAAM+5L,GAAc,IAA0B,oBAAbrrJ,SAQjC,MAAM,WAAuB,GACzB,qBAQI,OAPK,KACD,GAAU,CACN07I,OAVa2P,MACzBrrJ,SAASI,cAAc,UAAU6yG,WAUrBs/B,IARU8Y,MACtBrrJ,SAAS61B,eAAey1H,WAAW,oDAAqD,SAW7E,GAGX,qBAKI,OAJK,KACD,GAAW,IAAI,IAGZ,GAGX,cACIr2I,QAEAjnD,KAAKggL,OAAS,CAAE,CACZv1K,KAAM,MACNnH,KAAM,IACP,CACCmH,KAAM,SACNnH,KAAM,KAId,OAAOmxC,EAAS/0C,GACZ,MAAM0zD,EAAQpzD,KAAKggL,OACnB,IAAIjgL,EAAQqzD,EAAM,GAElB,GAAI1zD,GAAWA,EAAQ4D,KAAM,CACzB,MAAMi6L,EAAY79L,EAAQ4D,KAAKkD,cAC/B,IAAK,IAAI9F,EAAI,EAAGA,EAAI0yD,EAAMtyD,OAAQJ,IAC9B,GAAI0yD,EAAM1yD,GAAG+J,OAAS8yL,EAAW,CAC7Bx9L,EAAQqzD,EAAM1yD,GACd,OAKZ,GAAIX,EACA,OAAO,IAAIA,EAAMuD,KAAKmxC,EAAS/0C,GAGnCukL,GACI,oIAC+DhvI,UAAUC,YAItE,IAAA,GAAA,GC1DA,GAVf,cAAsB,GAClB,qBACI,OAAO,GAAesoJ,QAG1B,cAAc/oJ,EAAS/0C,GACnB,OAAO,GAAe2W,QAAQrL,OAAOypC,EAAS/0C,KCJvC,SAAS+9L,GAAYlmK,GAChC,MAAMxtB,EAAO,IAAI,GAAS,CACtB+8K,cAAc,IAEZ7a,EAAO10I,EAAMmhJ,cACnB,IAAIglB,EAAYnmK,EAEhB,GAAI00I,EAAM,CACN,MAAMj9H,EAASi9H,EAAK0xB,YACdC,EAAa,IAAI,GACvBA,EAAW9lL,UAAU,KAAYuxJ,WAAWr6H,EAAOhE,GAAIgE,EAAOmB,IAC9DytJ,EAAWxsJ,SAAS/tC,KAAKk0B,GACzBmmK,EAAYE,EAGhB7zL,EAAKmwD,KAAK,CAAEwjI,IAEZ,MAAMnZ,EAAM,qCAAsCF,gEAAsEt6K,EAAKi8K,iBAI7H,OAFAj8K,EAAKovC,UAEEorI,ECxBX,MAAM,GAAW,CACbsZ,EAAO,IAAWC,GAAO,IAAWC,IAAO,IAC3C3jJ,EAAO,KAAW4jJ,GAAO,KAAWC,IAAO,KAC3C5jJ,EAAO,MAAW6jJ,GAAO,MAAWC,IAAO,MAC3C7jJ,EAAO,KAAW8jJ,GAAO,KAAWC,IAAO,KAC3C9jJ,EAAO,IAAW+jJ,GAAO,IAAWC,IAAO,IAC3CC,EAAO,KAAWC,GAAO,KAAWC,IAAO,KAC3CC,EAAO,MAAWC,GAAO,MAAWC,IAAO,MAC3CC,EAAO,OAAWC,GAAO,OAAWC,IAAO,OAC3CC,EAAO,KAAWC,GAAO,KAAWC,IAAO,KAC3CC,IAAO,KAGI,SAASC,GAAc76L,GAClC,MAAMsQ,EAAS,CAAE,IACF,IAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACzC,GAAM,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACzC,EAAM,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GAExD,IAAIwqL,EAAQ,GACZ,KAAO96L,EAAI,GACHA,EAAIsQ,EAAO,GACXA,EAAOi7B,SAEPuvJ,GAAS,GAASxqL,EAAO,IACzBtQ,GAAKsQ,EAAO,IAGpB,OAAOwqL,EC9BX,MAAM9uJ,GAAe93B,OAAO83B,aCEtB+uJ,GAAU,oEAED,SAASC,GAAa59K,GACjC,IAAIyrB,EAAS,GACT3sC,EAAI,EAER,MAAM++L,EDHH,SAAoB79K,GACvB,IAAIyrB,EAAS,GAEb,IAAK,IAAI3sC,EAAI,EAAGA,EAAIkhB,EAAM9gB,OAAQJ,IAAK,CACnC,IAAIg/L,EAAO99K,EAAMsU,WAAWx1B,GAE5B,GAAI,OAAUg/L,GAAQA,GAAQ,MAAQ,CAClC,MAAMC,EAAKD,EACLxzK,EAAMtK,EAAMsU,aAAax1B,GAE1BskC,MAAM9Y,KAGPwzK,EAAuB,MAAfC,EAAK,QACLzzK,EAAM,OAAU,OAI5BwzK,EAAO,IAEPryJ,GAAUmD,GAAakvJ,GAChBA,EAAO,MAEdryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,GACxCryJ,GAAUmD,GAAa,IAAe,GAAPkvJ,IACxBA,EAAO,OAEdryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,IACxCryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,EAAI,IAC5CryJ,GAAUmD,GAAa,IAAe,GAAPkvJ,IACxBA,EAAO,UAEdryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,IACxCryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,GAAK,IAC7CryJ,GAAUmD,GAAa,IAAQkvJ,IAAS,EAAI,IAC5CryJ,GAAUmD,GAAa,IAAe,GAAPkvJ,IAIvC,OAAOryJ,EAvCJ,CCGyBzrB,GAE5B,KAAOlhB,EAAI++L,EAAS3+L,QAAQ,CACxB,IAAI8+L,EAAOH,EAASvpK,WAAWx1B,KAC3Bm/L,EAAOJ,EAASvpK,WAAWx1B,KAC3Bo/L,EAAOL,EAASvpK,WAAWx1B,KAE3Bq/L,EAAOH,GAAQ,EACfI,GAAgB,EAAPJ,IAAa,EAAMC,GAAQ,EACpCI,GAAgB,GAAPJ,IAAc,EAAMC,GAAQ,EACrCI,EAAc,GAAPJ,EAEP96J,MAAM66J,GACNI,EAAOC,EAAO,GACPl7J,MAAM86J,KACbI,EAAO,IAGX7yJ,EAASA,EACLkyJ,GAAQ1/L,OAAOkgM,GAAQR,GAAQ1/L,OAAOmgM,GACtCT,GAAQ1/L,OAAOogM,GAAQV,GAAQ1/L,OAAOqgM,GAG9C,OAAO7yJ,ECzBI,SAAS8yJ,GAAUlhM,EAAG62J,GACjC,OAAI72J,EAAE6B,OAAS,EACJ7B,EAAEiF,QAmBN,SAAUomB,EAAKrrB,GAClB,GAAIA,EAAE6B,QAAU,EACZ,OAAO7B,EAEX,IAAI+B,EAAIuI,KAAK2R,MAAMjc,EAAE6B,OAAS,GAC1B6wC,EAAO1yC,EAAEiF,MAAM,EAAGlD,GAClB4wC,EAAQ3yC,EAAEiF,MAAMlD,GAGpB,OA1BJ,SAAe/B,EAAGC,GAEd,IADA,IAAIqyC,EAAI,GAAIM,EAAK,EAAGC,EAAK,EAAGpxC,EAAI,EACzBmxC,EAAK5yC,EAAE6B,QAAUgxC,EAAK5yC,EAAE4B,QACvBg1J,EAAI72J,EAAE4yC,GAAK3yC,EAAE4yC,KAAQ,EACrBP,EAAE7wC,KAAOzB,EAAE4yC,KAEXN,EAAE7wC,KAAOxB,EAAE4yC,KASnB,OANID,EAAK5yC,EAAE6B,QACPywC,EAAEluC,KAAKiQ,MAAMi+B,EAAGtyC,EAAEiF,MAAM2tC,IAExBC,EAAK5yC,EAAE4B,QACPywC,EAAEluC,KAAKiQ,MAAMi+B,EAAGryC,EAAEgF,MAAM4tC,IAErBP,EAfX,CAwBII,EAAOrnB,EAAKqnB,GACZC,EAAQtnB,EAAKsnB,IARV,CAUJ3yC,GCjCQ,SAASmhM,GAAY7oK,EAAO73B,GACvC,MAAMkB,EAAW,CACbwvC,MAAO,QAASy5H,OAAQ,QACxBijB,KAAM,aAGV,IAAI8Q,EAAarmK,EACjB,MAAM00I,EAAO10I,EAAMmhJ,cAGnB,GAAIzM,EAAM,CACN,MAAMj9H,EAASi9H,EAAK0xB,YACpBC,EAAa,IAAI,GACjBA,EAAW9lL,UAAU,KAAYuxJ,WAAWr6H,EAAOhE,GAAIgE,EAAOmB,IAC9DytJ,EAAWxsJ,SAAS/tC,KAAKk0B,GAEzB,MAAM3f,EAAOq0J,EAAKwX,UAClB7iL,EAASwvC,MAAQx4B,EAAKw4B,MAAQ,KAC9BxvC,EAASipK,OAASjyJ,EAAKiyJ,OAAS,KAGpC,MAAMw2B,EAAiBjhM,OAAOu8B,OAAO/6B,EAAUlB,GAEzC06E,EAAYpoC,SAASI,cAAc,OACnC3F,EAAQ2tC,EAAU3tC,MAExBA,EAAM6zJ,QAAU,OAChB7zJ,EAAM2D,MAAQiwJ,EAAejwJ,MAC7B3D,EAAMo9H,OAASw2B,EAAex2B,OAC9B73H,SAASzC,KAAK04B,YAAYmS,GAE1B,MAAMwiH,EAAU,IAAI,GAAQxiH,EAAWimH,GACvCzD,EAAQF,kBACRE,EAAQ3Q,KAAK2R,GAEb,MAAMzzI,EAAUyyI,EAAQ2D,QAClBpnJ,EAAU,KACZyjJ,EAAQzjJ,UACRnH,SAASzC,KAAK05B,YAAYmR,IAI9B,OAFAjwB,EAAQH,KAAK7Q,EAASA,GAEfgR,EC3CI,SAASq2I,GAAUjpK,EAAO73B,GACrC,IAAI6kL,EAAMkZ,GAAYlmK,GAMtB,OAJK73B,GAAYA,EAAQ+gM,MACrBlc,EAAM,6BAA+Bib,GAAajb,IAG/C4H,KAAgBjkL,QAAQq8K,GCRpB,SAASmc,GAAiBxiM,GACrC,IAAI6W,EAAS,GACT7W,EAAKwB,QAAQitK,QAAU,EAAQ9lK,KAAKogK,QAAQ/oK,EAAKwB,QAAQitK,OAAOv8H,QAC5DlyC,EAAKwB,QAAQitK,OAAOv8H,MAAQ,GAAM,IAClCr7B,EAAS,GAIjB,IAAK,IAAIrU,EAAI,EAAGA,EAAIxC,EAAKy8I,SAAS75I,OAAQJ,IACtCxC,EAAKy8I,SAASj6I,GAAGu6E,SAASl8C,MAAM,GAAGsqI,UAAUt0J,EAAQA,GAGzD,OAAO7W,ECdI,SAASyiM,GAAUC,EAAQC,GAItC,OAAQD,EAAO51J,EAAI61J,EAAO1wJ,EAAIywJ,EAAOzwJ,EAAI0wJ,EAAO71J,EAAI,ECJzC,SAAS9P,GAAS7vB,GAC7B,MAAwB,iBAAVA,IAAuB25B,MAAM35B,GCChC,SAAS5C,GAAS4C,GAC7B,MrK0BkB,iBqK1BJA,ECAH,SAASy1L,GAAoBz1L,GACxC,OAAO6vB,GAAS7vB,IAAW5C,GAAS4C,IAAUmQ,SAASnQ,GCJ5C,SAAS,GAAWknB,GAC/B,MAAqB,mBAAPA,ECIlB,SAASwuK,GAAcz5I,EAAa15C,GAEhC,IAAK,IAAIgb,KAAYhb,EAAQ,CACzB,IAGIozL,EAHAC,EAAYrzL,EAAOgb,GACnBs4K,SAAkBD,EAStB,GALID,EAXG,WAUHE,GAAqC,OAAdD,EACZA,EAAU71L,YAEV,KAGX41L,GAAYA,IAAapsL,MAEzB,GAAIqsL,aAAqBxoL,KACrB6uC,EAAY1+B,GAAY,IAAInQ,KAAKwoL,EAAU//E,gBACxC,GAAI,GAAW+/E,EAAU5qK,OAC5BixB,EAAY1+B,GAAYq4K,EAAU5qK,YAC/B,CACH,IAAI8qK,EAAW75I,EAAY1+B,GAEvB0+B,EAAY1+B,GAzBjB,iBAwBY,GACiBu4K,GAEA,GAE5BJ,GAAcz5I,EAAY1+B,GAAWq4K,OA5BnC,cA8BCC,IACP55I,EAAY1+B,GAAYq4K,GAIhC,OAAO35I,EAGI,SAAS85I,GAAW95I,GAC/B,MAAMxmD,EAASwH,UAAUxH,OAEzB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IACxBqgM,GAAcz5I,EAAah/C,UAAU5H,IAGzC,OAAO4mD,EChDI,SAAS,GAASj8C,GAC7B,MAAwB,iBAAVA,ECCH,SAASg2L,GAAWh2L,GAC/B,OAAI6vB,GAAS7vB,GACFA,EAAQ,KAEZA,ECDX,MAAMi2L,GAAoB,sCAE1B,SAASC,GAAYz6B,GACjB,OAAOw6B,GAAkB14L,KAAKk+J,GAGnB,SAAS,GAAcryH,EAAS/H,GAC3C,MAAM80I,EAAc/4K,GAASikC,GAAU,CAAEA,GAAWA,EAEpD,GAAI,GAAQ80I,GAAc,CACtB,MAAM95K,EAAS,GACT+kC,EAAQsF,OAAOwvI,iBAAiB9sI,GAEtC,IAAK,IAAIvH,EAAM,EAAGA,EAAMs0I,EAAY1gL,OAAQosC,IAAO,CAC/C,IAAI45H,EAAQ0a,EAAYt0I,GACxBxlC,EAAOo/J,GAASy6B,GAAYz6B,GAASr1J,WAAWg7B,EAAMq6H,IAAUr6H,EAAMq6H,GAG1E,OAAOp/J,EACJ,GAAI,GAASglC,GAChB,IAAK,IAAIo6H,KAASp6H,EACd+H,EAAQhI,MAAMq6H,GAASu6B,GAAW30J,EAAOo6H,ICxBtC,SAAS06B,GAAWn2L,EAAOo2L,EAAiB,GACvD,MAAMxlB,EAAU,CAAEhtD,IAAK,EAAGr9E,MAAO,EAAGq5H,OAAQ,EAAGt5H,KAAM,GAWrD,MATsB,iBAAZ,EACNsqI,EAAW,IAAIA,EAAQ7V,IAAS6V,EAAQrW,IAAUqW,EAAQhW,IAAQ56J,GAElE4wK,EAAW,IAAI5wK,EAAS,KAAKo2L,EAC7BxlB,EAAQ7V,IAAS/6J,EAAM+6J,KAAUq7B,EACjCxlB,EAAQrW,IAAUv6J,EAAMu6J,KAAW67B,EACnCxlB,EAAQhW,IAAQ56J,EAAM46J,KAASw7B,GAG5BxlB,ECJX,IAAI,GAV0B,CAC1B9xK,OAAQ,CAACA,EAAQkB,IAAUA,EAE3B0N,SAAW1N,GAAUA,EAErBq2L,UAAYr2L,GAAU,IAAIoN,KAAKpN,GAE/Bs2L,SAAU,IAAM,GAeL,IAAA,GAVf,MACI,gBAAgBC,GACZ,GAAUA,EAGd,4BACI,OAAO,KCdf,MAAMC,GAAuB,uBA2Cd,ICdA,GA9Bf,MACI,YAAYC,EAAOxpL,EAAU,IACzBtY,KAAK+hM,aAAezpL,EAAQ0pL,YAC5BhiM,KAAKqhL,OAAS/oK,EAAQ+oK,QAAUygB,EAChC9hM,KAAKmK,OAAS,IDDtB,MACI,YAAY63L,GACRhiM,KAAK+hM,aAAeC,EAGxB,WACI,OAAOhiM,KAAK+hM,cAAgB,GAAYl6H,eAG5C,SAASx8D,GACLrL,KAAK+hM,aAAe12L,EAGxB,KAAK42L,KAAiBntL,GAClB,MAAMotL,EAAOliM,KAAKkiM,KAElB,OAAIz5L,GAASw5L,IAAiBA,EAAaliM,MAAMimK,IACtCk8B,EAAK/3L,OAAO83L,KAAiBntL,GAGjCotL,EAAKnpL,SAASjE,EAAO,GAAImtL,GAGpC,WAAWA,EAAcntL,EAAQmrF,GAC7B,MAAMiiG,EAAOliM,KAAKkiM,KAClB,IAAIx6L,EAYJ,OATIA,EADAe,GAASw5L,IAAiBA,EAAaliM,MAAMimK,IACpCi8B,EAAa99L,QAAQ09L,IAAAA,SAA+B9hM,EAAOiU,EAAOmuL,GACvE,IAAI92L,EAAQyJ,EAAOnD,SAASqC,EAAO,KAEnC,OAAOkuL,EAAKnpL,SAAS1N,EAAO82L,EAAoBA,EAAkBt+L,UAAU,GAAK,GAAIo8F,MAGhFiiG,EAAKnpL,SAASjE,EAAO,GAAImtL,EAAchiG,GAG7Cv4F,ICpCyB4Q,EAAQ0pL,aACxChiM,KAAK8hM,MAAQA,EACb9hM,KAAK8qL,IAAMsX,QAAQ9pL,EAAQwyK,KAG/B,WACI,OAAO9qL,KAAK+hM,cAAgB,GAAYl6H,eAG5C,SAASx8D,GACLrL,KAAK+hM,aAAe12L,EACpBrL,KAAKmK,OAAO+3L,KAAO72L,EAGvB,OAAOZ,EAAMgJ,GACLzT,KAAK8hM,OACL9hM,KAAK8hM,MAAMj3D,QAAQpgI,EAAMgJ,GAIjC,WAAWkoK,GACP,MAAM0mB,IAAariM,KAAK8hM,OAAS,IAAIpiM,SAAW,IAAI2iM,SACpD,OAAOA,GAAYA,EAASC,OAAS3mB,IC7B7C,IAAI,GAcW,IAAA,GAZf,MACI,gBAAgBimB,GACZ,GAAUA,EAGd,cAAcntJ,EAASiP,GACnB,GAAI,GACA,OAAO,GAAQ14C,OAAOypC,EAASiP,KCT3C,IAAI,GAAU,CACV6+I,QAAS,SAASj7J,GACd,OAAOA,ICCA,SAASk7J,GAAY9iM,EAAU,IAC1C,IAAI4nC,EAOJ,OANI5nC,EAAQ4nC,SACR5nC,EAAQ4nC,SAAWA,EDA3B,MACI,gBAAgBs6J,GACZ,GAAUA,EAGd,eAAet6J,GACX,OAAO,GAAQi7J,QAAQj7J,KCNuBi7J,QAAQ7iM,EAAQ4nC,UACvD,GAAW5nC,EAAQktE,WAC1BtlC,EAAW5nC,EAAQktE,SAGhBtlC,ECTX,MAAMm7J,GAAc,sDACdC,GAAW,iBAAG,CAEpB,UAA2B,SAAS72J,GAChC,OAAOA,IAHM,GAMF,SAAS,GAAOi7H,GAC3B,GAAI47B,GAAY57B,GACZ,OAAO47B,GAAY57B,GAGvB,MAAMgB,EAAS,GAcf,OAbAhB,EAAM3iK,QAAQs+L,IAAAA,SAAsB1iM,EAAOiU,EAAO2uL,EAAe77B,GAC7DgB,EAAOzkK,KAAK,EAAQwD,KAAKogK,QAAQjzJ,GAASA,EAAS2uL,GAAiB77B,MAGxE47B,GAAY57B,GAAS,SAASj7H,GAC1B,IAAInkC,EAASmkC,EACb,IAAK,IAAIqB,EAAM,EAAGA,EAAM46H,EAAOhnK,QAAU4G,EAAQwlC,IAC7CxlC,EAASA,EAAOogK,EAAO56H,IAG3B,OAAOxlC,GAGJg7L,GAAY57B,GC5BR,SAAS87B,GAAKhvL,EAAO2c,GAChC,MAAMzvB,EAAS8S,EAAM9S,OACf4G,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAMpsC,EAAQosC,IACxB3c,EAAS3c,EAAMs5B,KACfxlC,EAAQrE,KAAKuQ,EAAMs5B,IAI3B,OAAOxlC,ECTI,SAASm7L,GAAWpuJ,EAASquJ,GACxC,GAAIruJ,EAAQ05B,UAAW,CACnB,MAAMm+E,EAAQw2C,EAAWnkM,MAAM,KAC/B,IAAK,IAAIuuC,EAAM,EAAGA,EAAMo/G,EAAMxrJ,OAAQosC,IAClC,IAA+C,IAA3CuH,EAAQ05B,UAAUtsE,QAAQyqJ,EAAMp/G,IAChC,OAAO,GCJR,MAAM61J,GACjB,cACI/iM,KAAKu5K,KAAO,GAGhB,IAAI9uK,GACA,OAAOzK,KAAKu5K,KAAKv5K,KAAKgjM,KAAKv4L,IAG/B,IAAIA,EAAMY,GACNrL,KAAKu5K,KAAKv5K,KAAKgjM,KAAKv4L,IAASY,EAGjC,KAAKZ,GACD,OAAOA,aAAgBgO,KAAOhO,EAAKy2G,UAAYz2G,GCfxC,SAASwpC,GAAQ5oC,EAAOuI,GACnC,GAAIA,EACA,OAAiC,IAA1BA,EAAM/R,QAAQwJ,GCCd,SAAS68B,GAAiB3kC,EAAO8D,EAAKg1H,GACjD,OAAO,EAAQx1H,KAAKk4B,MAAMx7B,GAAS8D,EAAM9D,GAAS84H,ExLEvB,GyLiChB,IAAA,GAnCf,MACI,YAAYzzE,EAAUhJ,GAClB5/C,KAAK4oD,SAAWA,EAChB5oD,KAAKijM,WAAa7B,GAAW,GAAIphM,KAAKijM,WAAYrjJ,GAGtD,QAAQn1C,EAAMgJ,GACV,MAAM,SAAEm1C,EAAQ,WAAEq6I,GAAejjM,KACjC,IAAIshL,EAOJ,OANI2hB,EAAWx4L,GACX62K,EAAqBthL,KAAKkjM,aAAaD,EAAWx4L,GAAOgJ,GAClDm1C,EAAgB,UACvB04H,EAAqBthL,KAAKkjM,aAdtB,UAc4Cz4L,EAAMgJ,IAGnD6tK,EAGX,aAAa6hB,KAAW1vL,GACpB,OAAOzT,KAAK4oD,SAASu6I,GAAQ7vL,MAAMtT,KAAK4oD,SAAUn1C,GAGtD,iBAAiB64I,GACb,GAAItsJ,KAAK4oD,SAASw6I,iBACd,OAAOpjM,KAAK4oD,SAASw6I,iBAAiB92C,GAG1C,IAAK,IAAIp/G,EAAM,EAAGA,EAAMo/G,EAAMxrJ,OAAQosC,IAClC,GAAIltC,KAAKijM,WAAW32C,EAAMp/G,IACtB,OAAO,IC/BR,SAAS,GAAIt5B,EAAO2c,GAC/B,MAAMzvB,EAAS8S,EAAM9S,OACf4G,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,IAAI7hC,EAAQklB,EAAS3c,EAAMs5B,IACvB,EAAQrmC,KAAKogK,QAAQ57J,IACrB3D,EAAOrE,KAAKgI,GAGpB,OAAO3D,ECTI,SAAS27L,GAAgB5wL,GACpC,IAAI69D,EAAQ,EAWZ,OATI79D,EAAE6wL,aACFhzH,GAAS79D,EAAE6wL,WAAa,IACxBhzH,EAAQA,EAAQ,EAAI/mE,KAAKyR,KAAKs1D,GAAS/mE,KAAK2R,MAAMo1D,IAGlD79D,EAAE8wL,SACFjzH,EAAQ,EAAQzpE,KAAKk4B,MAAMtsB,EAAE8wL,OAAS,IAGnCjzH,ECZX,MAAQ+pD,OAAM,GAAE2tD,WAAU,GAAE/gB,QAAO,GAAEwH,IAAG,GAAE+0B,cAAa,GAAE9kB,YAAW,GAAEgD,aAAY,GAAEU,iBAAgB,GAAE97J,KAAI,GAAEk5J,WAAU,GAAE5F,UAAS,GAAEvR,IAAG,GAAEtpI,MAAK,GAAEkpJ,aAAY,GAAEzc,eAAc,IAAK,EAAQ3kK,KCAxL,MAAM,GACF,kBAAkBnH,EAAS+jM,EAAOtlJ,EAAQ,CAAE55B,MAAO,KAG1C7kB,GAAWy+C,EAAM55B,MAFJ,IAE0BytB,SAASyxJ,OAIrDrkM,OAAOC,KAAKK,GAASJ,SAAAA,SAAiBmW,GAClC,MAAMpK,EAAQ3L,EAAQ+V,GACV,eAARA,GAAmC,MAAXA,EAAI,IAAepK,IAInC,SAARoK,EACAguL,EAAMpgM,KAAKgI,GACa,iBAAVA,IACd8yC,EAAM55B,QACN,GAAWm/K,WAAWr4L,EAAOo4L,EAAOtlJ,GACpCA,EAAM55B,aAKlB,iBAAiBk/K,EAAOlzK,GACpB,IAAIiiF,EAAW,GAEf,GAAIixF,EAAM3iM,OAAS,GAAKkxC,SAASyxJ,MAAO,CACpC,IACIjxF,EAAWixF,EAAMhiM,KAAAA,SAAau5K,GAC1B,OAAOhpI,SAASyxJ,MAAMvpI,KAAK8gH,MAEjC,MAAOvoK,GAELwxK,GAAaxxK,GAGjB6J,QAAQs/B,IAAI42D,GAAUxoD,KAAKz5B,EAAUA,QAErCA,IAIR,oBAAoB7wB,EAAS6wB,GACzB,MAAMkzK,EAAQ,GACd,GAAWC,WAAWhkM,EAAS+jM,GAE/B,GAAWE,UAAUF,EAAOlzK,IAIrB,IAAA,GAAA,GCnDA,SAASqzK,GAAkBtgM,EAAM5D,GAC5C,MAAMme,EAAQva,EAAKrC,UAEf4c,EAAMne,QADNme,EAAMne,QACU0hM,GAAW,GAAIvjL,EAAMne,QAASA,GAE9BA,ECLT,SAASmkM,GAAkB18L,GACtC,IAAIqC,EAAM08J,GACNtqJ,EAAMuqJ,GAEV,IAAK,IAAIj5H,EAAM,EAAGpsC,EAASqG,EAAIrG,OAAQosC,EAAMpsC,EAAQosC,IAAO,CACxD,MAAM7hC,EAAQlE,EAAI+lC,GACJ,OAAV7hC,GAAkBmQ,SAASnQ,KAC3B7B,EAAMD,KAAKC,IAAIA,EAAK6B,GACpBuQ,EAAMrS,KAAKqS,IAAIA,EAAKvQ,IAI5B,MAAO,CACH7B,IAAKA,IAAQ08J,QAAYhwJ,EAAY1M,EACrCoS,IAAKA,IAAQuqJ,QAAYjwJ,EAAY0F,GChB9B,SAASuc,GAAKvkB,EAAOQ,GAChC,IAAK,IAAI1T,EAAI,EAAGA,EAAIkT,EAAM9S,OAAQJ,IAAK,CACnC,MAAMu/C,EAAOrsC,EAAMlT,GACnB,GAAI0T,EAAU6rC,EAAMv/C,EAAGkT,GACnB,OAAOqsC,GCFnB,MAAM,GAAS,EAASsoH,OAClB,GAAe,iBAYrB,SAAS,GAAgB9zH,GACrB,MAAM38B,EAAYypK,iBAAiB9sI,GAAS38B,UAE5C,MAAkB,SAAdA,EACO,GAAO+0G,OAdtB,SAAqB41D,GACjB,MAAM1iL,EAAQ0iL,EAAa1iL,MAAM,IACjC,GAAc,OAAVA,GAAmC,IAAjBA,EAAMe,OACxB,OAAO,GAAO+rH,OAGlB,MAAM61D,EAAU3iL,EAAM,GAAGpB,MAAM,KAAK8C,IAAIupC,GAAKv5B,WAAWu5B,IACxD,OAAO,IAAI,MAAU03I,GAPzB,CAiBuB5qK,GCnBR,SAASgsL,GAAct6L,EAAKoS,GACvC,IAAIgoG,EAAO,GAAMhoG,EAAMpS,EAAKu6L,GAE5B,GAAa,IAATngF,EAAY,CACZ,GAAY,IAARhoG,EACA,MAAO,GAGXgoG,EAAOr6G,KAAK+mC,IAAI10B,GAGpB,MAAMi8B,EAAQtuC,KAAK0+J,IAAI,GAAI1+J,KAAK2R,MAAM3R,KAAKulC,IAAI80E,GAAQr6G,KAAKulC,IAAI,MAC1Dk1J,EAAgB,GAAOpgF,EAAO/rE,ElMJP,IkMK7B,IAAIosJ,EAAkB,EAYtB,OATIA,EADAD,EAAgB,SACE,GACXA,EAAgB,SACL,GACXA,EAAgB,SACL,EAEA,EAGf,GAAMnsJ,EAAQosJ,ElMjBQ,ImMRjC,MAAM,WAAc,GAChB,YAAYj5J,EAAGmF,GACX8W,QAEAjnD,KAAKgrC,EAAIA,GAAK,EACdhrC,KAAKmwC,EAAIA,GAAK,EAGlB,QACI,OAAO,IAAI,GAAMnwC,KAAKgrC,EAAGhrC,KAAKmwC,GAGlC,OAAOi5H,GACH,OAAOA,GAASppK,KAAKgrC,IAAMo+H,EAAMp+H,GAAKhrC,KAAKmwC,IAAMi5H,EAAMj5H,EAG3D,OAAOuG,EAAQ4xH,GACX,MAAM47B,EAAQ,GAAI57B,GACZ67B,EAAO56L,KAAKm/J,IAAIw7B,GAChBE,EAAO76L,KAAKo/J,IAAIu7B,IACdl5J,EAAGynI,EAAItiI,EAAGuiI,GAAOh8H,GACnB,EAAE1L,EAAC,EAAEmF,GAAMnwC,KAYjB,OAVAA,KAAKgrC,EAAI,GACLynI,GAAMznI,EAAIynI,GAAM0xB,GAAQh0J,EAAIuiI,GAAM0xB,EnMrBf,GmMyBvBpkM,KAAKmwC,EAAI,GACLuiI,GAAMviI,EAAIuiI,GAAMyxB,GAAQn5J,EAAIynI,GAAM2xB,EnM1Bf,GmM8BhBpkM,KAGX,SAASf,GAKL,OAHAe,KAAKgrC,GAAK/rC,EACVe,KAAKmwC,GAAKlxC,EAEHe,KAGX,WAAWopK,GACP,MAAMjsH,EAAKn9C,KAAKgrC,EAAIo+H,EAAMp+H,EACpBoS,EAAKp9C,KAAKmwC,EAAIi5H,EAAMj5H,EAE1B,OAAO5mC,KAAKsvC,KAAKsE,EAAKA,EAAKC,EAAKA,GAGpC,gBAAgB1G,EAAQI,EAAOo2H,GAC3B,MAAMwB,EAAU,GAAI53H,GAEpB,OAAO,IAAI,GACPJ,EAAO1L,EAAIkiI,EAAS3jK,KAAKm/J,IAAIgG,GAC7Bh4H,EAAOvG,EAAI+8H,EAAS3jK,KAAKo/J,IAAI+F,KAM1B,IAAA,GAAA,GC1Df,MAAM,WAAY,GACd,YAAY+C,EAAIC,EAAIC,EAAIC,GACpB3qH,QAEAjnD,KAAKyxK,GAAKA,GAAM,EAChBzxK,KAAK0xK,GAAKA,GAAM,EAChB1xK,KAAK2xK,GAAKA,GAAM,EAChB3xK,KAAK4xK,GAAKA,GAAM,EAGpB,OAAO0I,GACH,OAAOt6K,KAAKyxK,KAAO6I,EAAI7I,IAAMzxK,KAAK2xK,KAAO2I,EAAI3I,IACzC3xK,KAAK0xK,KAAO4I,EAAI5I,IAAM1xK,KAAK4xK,KAAO0I,EAAI1I,GAG9C,QACI,OAAO5xK,KAAK2xK,GAAK3xK,KAAKyxK,GAG1B,SACI,OAAOzxK,KAAK4xK,GAAK5xK,KAAK0xK,GAG1B,UAAUv0H,EAAIC,GAMV,OALAp9C,KAAKyxK,IAAMt0H,EACXn9C,KAAK2xK,IAAMx0H,EACXn9C,KAAK0xK,IAAMt0H,EACXp9C,KAAK4xK,IAAMx0H,EAEJp9C,KAGX,KAAKgrC,EAAGmF,GACJ,MAAM05H,EAAS7pK,KAAK6pK,SACdz5H,EAAQpwC,KAAKowC,QAYnB,OAVI,GAAQpF,KACRhrC,KAAKyxK,GAAKzmI,EACVhrC,KAAK2xK,GAAK3xK,KAAKyxK,GAAKrhI,GAGpB,GAAQD,KACRnwC,KAAK0xK,GAAKvhI,EACVnwC,KAAK4xK,GAAK5xK,KAAK0xK,GAAK7H,GAGjB7pK,KAGX,KAAKqkM,GAMD,OALArkM,KAAKyxK,GAAKloK,KAAKC,IAAIxJ,KAAKyxK,GAAI4yB,EAAU5yB,IACtCzxK,KAAK0xK,GAAKnoK,KAAKC,IAAIxJ,KAAK0xK,GAAI2yB,EAAU3yB,IACtC1xK,KAAK2xK,GAAKpoK,KAAKqS,IAAI5b,KAAK2xK,GAAI0yB,EAAU1yB,IACtC3xK,KAAK4xK,GAAKroK,KAAKqS,IAAI5b,KAAK4xK,GAAIyyB,EAAUzyB,IAE/B5xK,KAGX,UAAUopK,GACN,MAAMk7B,EAAa,GAAQl7B,GACrBp+H,EAAIs5J,EAAal7B,EAAM,GAAKA,EAAMp+H,EAClCmF,EAAIm0J,EAAal7B,EAAM,GAAKA,EAAMj5H,EAGxC,OAFAnwC,KAAKgjC,KAAK,IAAI,GAAIgI,EAAGmF,EAAGnF,EAAGmF,IAEpBnwC,KAGX,OAAOqkM,EAAW1oB,GAYd,OAVIA,IAASnV,IAAMmV,IACf37K,KAAKyxK,GAAK4yB,EAAU5yB,GACpBzxK,KAAK2xK,GAAK0yB,EAAU1yB,IAGpBgK,IAASlV,IAAMkV,IACf37K,KAAK0xK,GAAK2yB,EAAU3yB,GACpB1xK,KAAK4xK,GAAKyyB,EAAUzyB,IAGjB5xK,KAGX,QAAQqkM,EAAWppH,GACf,MAAM4uF,EAAS7pK,KAAK6pK,SACdz5H,EAAQpwC,KAAKowC,QACburI,EAAO1gG,IAAWorF,IAAOprF,IAAW2qF,GAASa,GAAID,GACjDzxJ,EAAS4mK,IAASlV,GAAIoD,EAASz5H,EAErC,GAAI6qC,IAAW4qF,GAAQ,CACnB,MAAM0+B,EAAeF,EAAU3tJ,SACzBA,EAAS12C,KAAK02C,SAEpB12C,KAAKyxK,IAAM8yB,EAAav5J,EAAI0L,EAAO1L,EACnChrC,KAAK0xK,IAAM6yB,EAAap0J,EAAIuG,EAAOvG,OAEnCnwC,KAAK27K,EAAO,GADL1gG,IAAWorF,IAAOprF,IAAWgrF,GACnBo+B,EAAU1oB,EAAO,GAAK5mK,EAEtBsvL,EAAU1oB,EAAO,GAMtC,OAHA37K,KAAK2xK,GAAK3xK,KAAKyxK,GAAKrhI,EACpBpwC,KAAK4xK,GAAK5xK,KAAK0xK,GAAK7H,EAEb7pK,KAGX,OAAOwkM,EAAIC,GAKP,OAHAzkM,KAAK2xK,IAAM6yB,EACXxkM,KAAK4xK,IAAM6yB,EAEJzkM,KAGX,OAAOwkM,EAAIC,GAEP,OADAzkM,KAAK0kM,QAAQF,GAAKC,GACXzkM,KAGX,IAAI6jL,GACA,MAAM5H,EAAUulB,GAAW3d,GAO3B,OALA7jL,KAAKyxK,IAAMwK,EAAQtqI,KACnB3xC,KAAK2xK,IAAMsK,EAAQrqI,MACnB5xC,KAAK0xK,IAAMuK,EAAQhtD,IACnBjvH,KAAK4xK,IAAMqK,EAAQhR,OAEZjrK,KAGX,MAAM6jL,GACF,MAAM5H,EAAUulB,GAAW3d,GAO3B,OALA5H,EAAQtqI,MAAQsqI,EAAQtqI,KACxBsqI,EAAQhtD,KAAOgtD,EAAQhtD,IACvBgtD,EAAQrqI,OAASqqI,EAAQrqI,MACzBqqI,EAAQhR,QAAUgR,EAAQhR,OAEnBjrK,KAAKkmC,IAAI+1I,GAGpB,QACI,OAAO,IAAI,GAAIj8K,KAAKyxK,GAAIzxK,KAAK0xK,GAAI1xK,KAAK2xK,GAAI3xK,KAAK4xK,IAGnD,SACI,OAAO,IAAI,GACP5xK,KAAKyxK,GAAKzxK,KAAKowC,QAAU,EACzBpwC,KAAK0xK,GAAK1xK,KAAK6pK,SAAW,GAIlC,cAAcT,GAEV,OAAOA,EAAMp+H,GAAKhrC,KAAKyxK,IAAMrI,EAAMp+H,GAAKhrC,KAAK2xK,IACtCvI,EAAMj5H,GAAKnwC,KAAK0xK,IAAMtI,EAAMj5H,GAAKnwC,KAAK4xK,GAGjD,SACI,MAAO,CACH,IAAI,GAAM5xK,KAAKyxK,GAAIzxK,KAAK0xK,IACxB,IAAI,GAAM1xK,KAAK2xK,GAAI3xK,KAAK0xK,IACxB,IAAI,GAAM1xK,KAAK2xK,GAAI3xK,KAAK4xK,IACxB,IAAI,GAAM5xK,KAAKyxK,GAAIzxK,KAAK4xK,KAIhC,UACI,MAAO,CAAE5xK,KAAKyxK,GAAIzxK,KAAK0xK,GAAI1xK,KAAK2xK,GAAI3xK,KAAK4xK,IAAK3xK,KAAK,KAGvD,SAASq6K,GACL,QAASA,EAAI1I,GAAK5xK,KAAK0xK,IAAM1xK,KAAK4xK,GAAK0I,EAAI5I,IAAM4I,EAAI3I,GAAK3xK,KAAKyxK,IAAMzxK,KAAK2xK,GAAK2I,EAAI7I,IAGvF,OAAO35H,GACH,IAAI1H,EAAQpwC,KAAKowC,QACby5H,EAAS7pK,KAAK6pK,SAClB,MAAQ7+H,EAAGynI,EAAItiI,EAAGuiI,GAAO1yK,KAAK02C,SAExBiuJ,EAAKC,GAAY,EAAG,EAAGnyB,EAAIC,EAAI56H,GAC/B+sJ,EAAKD,GAAYx0J,EAAO,EAAGqiI,EAAIC,EAAI56H,GACnCgtJ,EAAKF,GAAYx0J,EAAOy5H,EAAQ4I,EAAIC,EAAI56H,GACxCitJ,EAAKH,GAAY,EAAG/6B,EAAQ4I,EAAIC,EAAI56H,GAQ1C,OANA1H,EAAQ7mC,KAAKqS,IAAI+oL,EAAG35J,EAAG65J,EAAG75J,EAAG85J,EAAG95J,EAAG+5J,EAAG/5J,GAAKzhC,KAAKC,IAAIm7L,EAAG35J,EAAG65J,EAAG75J,EAAG85J,EAAG95J,EAAG+5J,EAAG/5J,GACzE6+H,EAAStgK,KAAKqS,IAAI+oL,EAAGx0J,EAAG00J,EAAG10J,EAAG20J,EAAG30J,EAAG40J,EAAG50J,GAAK5mC,KAAKC,IAAIm7L,EAAGx0J,EAAG00J,EAAG10J,EAAG20J,EAAG30J,EAAG40J,EAAG50J,GAE1EnwC,KAAK2xK,GAAK3xK,KAAKyxK,GAAKrhI,EACpBpwC,KAAK4xK,GAAK5xK,KAAK0xK,GAAK7H,EAEb7pK,KAGX,SACI,OAAO,IAAI,EAAKsrL,KAAK,CAAEtrL,KAAKyxK,GAAIzxK,KAAK0xK,IAAM,CAAE1xK,KAAKowC,QAASpwC,KAAK6pK,WAGpE,UACI,OAAwB,IAAjB7pK,KAAKowC,SAAmC,IAAlBpwC,KAAK6pK,SAGtC,MAAMw6B,EAAW1oB,EAAMkC,GACnB,MAAM8b,EAAKhe,EAAO,EACZie,EAAKje,EAAO,EACZqpB,EAAWrpB,IAASnV,GpMlLb,QAnBC,SoMsMR5uJ,EAAO5X,KAAKglM,KAEd/wJ,GAAQ4pI,EAAW,CAAE5X,GAAMI,MAC3BrmK,KAAK25L,GAAM0K,EAAU1K,GACrB35L,KAAK45L,GAAM55L,KAAK25L,GAAM/hL,GACfq8B,GAAQ4pI,EAAW,CAAEzX,GAAOR,MACnC5lK,KAAK45L,GAAMyK,EAAUzK,GACrB55L,KAAK25L,GAAM35L,KAAK45L,GAAMhiL,GACfimK,IAAchY,KACrB7lK,KAAK25L,GAAM0K,EAAU1K,IAAO0K,EAAUW,KAAcptL,GAAQ,EAC5D5X,KAAK45L,GAAM55L,KAAK25L,GAAM/hL,IAKlC,SAASgtL,GAAY55J,EAAGmF,EAAGsiI,EAAIC,EAAI57H,GAC/B,MAAMotJ,EAAQ,GAAIptJ,GAElB,OAAO,IAAI,GACP27H,GAAMznI,EAAIynI,GAAMlpK,KAAKm/J,IAAIw7B,IAAU/zJ,EAAIuiI,GAAMnpK,KAAKo/J,IAAIu7B,GACtDxxB,GAAM1nI,EAAIynI,GAAMlpK,KAAKo/J,IAAIu7B,IAAU/zJ,EAAIuiI,GAAMnpK,KAAKm/J,IAAIw7B,IAI/C,IAAA,GAAA,GCxOf,MAAM,WAAa,GAEf,YAAYxtJ,EAAQuuJ,EAAa/3B,EAAQ8B,EAAYl4H,GACjDmQ,QAEAjnD,KAAK02C,OAASA,EACd12C,KAAKilM,YAAcA,EACnBjlM,KAAKktK,OAASA,EACdltK,KAAKgvK,WAAaA,EAClBhvK,KAAK82C,MAAQA,EAGjB,QACI,OAAO,IAAI,GAAK92C,KAAK02C,OAAQ12C,KAAKilM,YAAajlM,KAAKktK,OAAQltK,KAAKgvK,WAAYhvK,KAAK82C,OAGtF,SACI,OAAO92C,KAAKgvK,WAAahvK,KAAK82C,MAAQ,EAG1C,UAAUouJ,EAAWD,GAOjB,OANIA,EACAjlM,KAAKilM,YAAcC,EAEnBllM,KAAKktK,OAASg4B,EAGXllM,KAIX,MAAM82C,EAAOmuJ,GACT,MAAME,EAAc,GAAIruJ,GAClBsuJ,EAAK77L,KAAKm/J,IAAIy8B,GACdE,EAAK97L,KAAKo/J,IAAIw8B,GACdj4B,EAAS+3B,EAAcjlM,KAAKilM,YAAcjlM,KAAKktK,OAC/CliI,EAAI,GAAMhrC,KAAK02C,OAAO1L,EAAKo6J,EAAKl4B,ErMnCf,GqMoCjB/8H,EAAI,GAAMnwC,KAAK02C,OAAOvG,EAAKk1J,EAAKn4B,ErMpCf,GqMsCvB,OAAO,IAAI,GAAMliI,EAAGmF,GAGxB,YAAY6G,EAAU5G,EAAOy5H,GACzB,MAAMy7B,EAAStlM,KAAKq2B,QAAQ/3B,OAAO04C,GAC7BuuJ,EAAWD,EAAOvxI,SAClByxI,EAAWF,EAAOl8B,MAAMm8B,GACxBE,EAAKr1J,EAAQ,EACbs1J,EAAK77B,EAAS,EACd87B,EAAKp8L,KAAKo/J,IAAI,GAAI48B,IAClBK,EAAKr8L,KAAKm/J,IAAI,GAAI68B,IACxB,IAAIv6J,EAAIw6J,EAASx6J,EAAIy6J,EACjBt1J,EAAIq1J,EAASr1J,EAAIu1J,EAUrB,OARIn8L,KAAK+mC,IAAIq1J,GAAM,KACf36J,GAAKy6J,GAAMG,EAAKr8L,KAAK+mC,IAAIs1J,IAGzBr8L,KAAK+mC,IAAIs1J,GAAM,KACfz1J,GAAKu1J,GAAMC,EAAKp8L,KAAK+mC,IAAIq1J,IAGtB,IAAI,GAAI36J,EAAGmF,EAAGnF,EAAIoF,EAAOD,EAAI05H,GAGxC,cAAcrqK,GACV,MAAMk3C,EAAS12C,KAAK02C,OACduuJ,EAAcjlM,KAAKilM,YACnB/3B,EAASltK,KAAKktK,OACd8B,EAAahvK,KAAKgvK,WAClBC,EAAWjvK,KAAKgvK,WAAahvK,KAAK82C,MAClCqG,EAAK39C,EAAEwrC,EAAI0L,EAAO1L,EAClBoS,EAAK59C,EAAE2wC,EAAIuG,EAAOvG,EAClB01J,EAAS,IAAI,GAAM1oJ,EAAIC,GACvBuzH,EAAa3wK,KAAKopK,MAAM4F,GACxB82B,EAAc,IAAI,GAAMn1B,EAAW3lI,EAAI0L,EAAO1L,EAAG2lI,EAAWxgI,EAAIuG,EAAOvG,GACvE8/H,EAAWjwK,KAAKopK,MAAM6F,GACtB82B,EAAY,IAAI,GAAM91B,EAASjlI,EAAI0L,EAAO1L,EAAGilI,EAAS9/H,EAAIuG,EAAOvG,GACjE61J,EAAO,GAAM7oJ,EAAKA,EAAKC,EAAKA,ErM5EX,GqM8EvB,OAAQ0oJ,EAAY97B,OAAO67B,IAAWlF,GAAUmF,EAAaD,MACrDlF,GAAUoF,EAAWF,IACtBG,GAAQf,EAAcA,GAAee,GAAQ94B,EAASA,EAGjE,UACI,MAAMoN,EAAM,IAAI,GAAIpU,GAAWA,GAAWC,GAAWA,IAC/C6I,EAAa,GAAMhvK,KAAKgvK,WAAa,KACrCC,EAAW,IAAOD,EAAahvK,KAAK82C,OAAS,KAC7CmuJ,EAAcjlM,KAAKilM,YACnBgB,EAAY,CAAE,EAAG,GAAI,IAAK,IAAKj3B,EAAYC,GAAW3kJ,KAAK47K,IAC3DC,EAAkBF,EAAUpkM,QAAQmtK,GACpCo3B,EAAgBH,EAAUpkM,QAAQotK,GACxC,IAAIo3B,EAGAA,EADAr3B,IAAeC,EACNg3B,EAELE,EAAkBC,EACTH,EAAU/hM,MAAMiiM,EAAiBC,EAAgB,GAEjD,GAAGz8L,OACRs8L,EAAU/hM,MAAM,EAAGkiM,EAAgB,GACnCH,EAAU/hM,MAAMiiM,EAAiBF,EAAUnlM,SAKvD,IAAK,IAAIJ,EAAI,EAAGA,EAAI2lM,EAAOvlM,OAAQJ,IAAK,CACpC,IAAI0oK,EAAQppK,KAAKopK,MAAMi9B,EAAO3lM,IAC9B45K,EAAIgsB,UAAUl9B,GACdkR,EAAIgsB,UAAUl9B,EAAO67B,GAOzB,OAJKA,GACD3qB,EAAIgsB,UAAUtmM,KAAK02C,QAGhB4jI,EAGX,OAAOjvK,GAEH,OADArL,KAAKktK,QAAU7hK,EACRrL,MAIf,SAASkmM,GAAgBjnM,EAAGC,GACxB,OAAOD,EAAIC,EAGA,IAAA,GAAA,GC9FA,eApCTqnM,UAAqB,GACvB,WAAWjB,EAAQ5lM,GACf,MAAMsvK,EAAas2B,EAAOt2B,WAAa,IACvC,IAAIC,EAAWq2B,EAAOxuJ,MAAQk4H,EAG1Bs2B,EAAOxuJ,MAAQ,GAAKk4H,IAAeC,IACnCA,GATY,MAYhB,MAAMv4H,EAAS,IAAI,EAAK8vJ,MAAMlB,EAAO5uJ,OAAO1L,EAAGs6J,EAAO5uJ,OAAOvG,GACvD+8H,EAAS3jK,KAAKqS,IAAI0pL,EAAOp4B,OAAQ,GACjC+3B,EAAc17L,KAAKqS,IAAI0pL,EAAOL,YAAa,GAC3ClsB,EAAM,IAAI,EAAKkS,IAAIv0I,EAAQ,CAC7Bs4H,WAAYA,EACZC,SAAUA,EACVH,QAAS5B,EACT6B,QAAS7B,IAEPhvK,EAAO,EAAKmtL,KAAKob,QAAQ1tB,EAAKr5K,GAASjB,QAE7C,GAAIwmM,EAAa,CACblsB,EAAIjK,QAAUiK,EAAIhK,QAAUk2B,EAC5B,MAAMyB,EAAW3tB,EAAIzJ,QAAQL,GAC7B/wK,EAAKu5K,OAAOivB,EAAS17J,EAAG07J,EAASv2J,GACjCjyC,EAAK66K,IAAI9J,EAAUD,EAAYi2B,EAAaA,GAAa,QAEzD/mM,EAAKu5K,OAAO/gI,EAAO1L,EAAG0L,EAAOvG,GAGjC,OAAOjyC,UAIfqoM,EAAalwL,QAAU,IAAIkwL,QClC3B,MAAM,WAAqB,GACvB,YAAY7mM,GACRunD,QAEAjnD,KAAKoxC,SAAW,GAEhBpxC,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASM,KAAK2mM,gBAAgBjnM,IAGrE,gBAAgBA,GACZ,OAAOA,EAGX,OAAO2kM,GACH,MAAMjzJ,EAAWpxC,KAAKoxC,SACtB,IAAIkpI,EAEJ,IAAK,IAAI55K,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IAAK,CACtC,IAAIkmM,EAAex1J,EAAS1wC,GAC5BkmM,EAAaC,OAAOxC,GAEpB/pB,EAAMA,EAAMA,EAAIt3I,KAAK4jK,EAAatsB,KAAOssB,EAAatsB,IAAIjkJ,QAG9Dr2B,KAAKs6K,IAAMA,GAAO+pB,EAGtB,UACI,MAAMjzJ,EAAWpxC,KAAKoxC,SAElBpxC,KAAK6zF,WACL7zF,KAAK6zF,UAAU16C,UAGnB,IAAK,IAAIz4C,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IACjC0wC,EAAS1wC,GAAGy4C,UAIpB,UACI,MAAM9yB,EAASrmB,KAAKqmB,OAEpB,OAAOA,EAASA,EAAOygL,UAAY,KAGvC,YACI,MAAMrjH,EAAUzjF,KAAK+mM,aACrB,GAAItjH,EACA,OAAOA,EAAQ49F,OAIvB,aACI,IAAI5sI,EAAUz0C,KACd,KAAOy0C,GAAS,CACZ,GAAIA,EAAQuyJ,aACR,OAAOvyJ,EAAQuyJ,aAEnBvyJ,EAAUA,EAAQpuB,QAI1B,kBAAkB82B,EAAIC,GAClB,MAAMhM,EAAWpxC,KAAKoxC,SAChB61J,EAAgB71J,EAAStwC,OAE/B,IAAK,IAAIJ,EAAI,EAAGA,EAAIumM,EAAevmM,IAC/B0wC,EAAS1wC,GAAG45K,IAAIjR,UAAUlsH,EAAIC,GAItC,SACI,IAAK,IAAI18C,EAAI,EAAGA,EAAI4H,UAAUxH,OAAQJ,IAAK,CACvC,IAAIu/C,EAAO33C,UAAU5H,GACrBV,KAAKoxC,SAAS/tC,KAAK48C,GACnBA,EAAK55B,OAASrmB,MAItB,gBACiC,IAAzBA,KAAKN,QAAQ0sK,UAIjBpsK,KAAKknM,eAELlnM,KAAKmnM,YAELnnM,KAAKkmL,iBAELlmL,KAAKonM,kBACLpnM,KAAKqnM,kBAGT,YACQrnM,KAAKksL,SACLlsL,KAAKksL,OAAOob,aAAetnM,KAEvBA,KAAKqmB,QACLrmB,KAAKqmB,OAAOkhL,aAAavnM,KAAKksL,SAK1C,iBACI,MAAM96I,EAAWpxC,KAAKoxC,SAChBtwC,EAASswC,EAAStwC,OACxB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IACxB0wC,EAAS1wC,GAAG8mM,eAIpB,eACIxnM,KAAKksL,OAAS,IAAI,EAAKnvE,MAAM,CACzBqyE,OAAQpvL,KAAKN,QAAQ0vL,OACrBhjB,QAAS,GAAepsK,KAAKN,QAAQ0sK,SAAS,KAItD,kBACQpsK,KAAKksL,QAAUlsL,KAAKN,QAAQm0F,YAC5B7zF,KAAK6zF,UAAY,EAAK4zG,UAAUz8L,OAC5BhL,KAAKksL,OAAQlsL,KAAKN,QAAQm0F,YAKtC,aAAa6zG,GACJA,EAAYJ,eACbI,EAAYJ,aAAetnM,MAG3B0nM,EAAYhoM,QAAQioM,OACpB3nM,KAAK4nM,WAAW1b,OAAO7xD,OAAOqtE,GACvB,GAAQA,EAAYhoM,QAAQ0vL,QACnCpvL,KAAK6nM,YAAYC,YAAYJ,GACtB1nM,KAAK+nM,YACZ/nM,KAAK8nM,YAAYJ,GACV1nM,KAAKksL,OACZlsL,KAAKksL,OAAO7xD,OAAOqtE,GAInB1nM,KAAKqmB,OAAOkhL,aAAaG,GAIjC,WACI,OAAI1nM,KAAKqmB,OACErmB,KAAKqmB,OAAOuhL,WAGhB5nM,KAGX,YACI,OAAIA,KAAKqmB,OACErmB,KAAKqmB,OAAOwhL,YAGhB7nM,KAGX,YAAY0nM,GACR,MAAMtY,EAASsY,EAAYhoM,QAAQ0vL,QAAU,EACvC4Y,EAAUhoM,KAAKksL,OAAO96I,SACtBtwC,EAASknM,EAAQlnM,OACvB,IAAIgmH,EAEJ,IAAKA,EAAM,EAAGA,EAAMhmH,KAEL,GADGknM,EAAQlhF,GACYpnH,QAAQ0vL,OAAQ,GACvCA,GAHatoE,KAQ5B9mH,KAAKksL,OAAOxrG,OAAOomC,EAAK4gF,GAG5B,SAASn3K,GACL,MAAM6gB,EAAWpxC,KAAKoxC,SAChBtwC,EAASswC,EAAStwC,OAExB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,IAAIqyC,EAAQ3B,EAAS1wC,GAErB6vB,EAASwiB,GACLA,EAAMooI,UACNpoI,EAAMooI,SAAS5qJ,IAK3B,QAAQxwB,GACJ,IAAI00C,EAAUz0C,KACV+rH,GAAU,EAEd,KAAOt3E,IAAYs3E,GACfA,EAAUhsH,EAAM00C,GAEXs3E,IACDt3E,EAAUA,EAAQpuB,QAI1B,GAAI0lG,EACA,OAAOt3E,EAIf,kBAEA,eACI,MAAM/0C,GAAWM,KAAKN,SAAW,IAAIuoM,UACrC,SAAUjoM,KAAKkoM,iBAAoBxoM,IAA+B,IAApBA,EAAQ0sK,SAG1D,gBAAgB+7B,EAAMr6B,GAClB,MAAMpuK,GAAWM,KAAKN,SAAW,IAAIuoM,WAAa,GAC5CG,EAAe1oM,EAAQwsL,OAC7B,IAAI+b,EAAYjoM,KAAKqoM,WAErB,IAAKJ,EAAW,CACZ,MAAMK,EAAmB,CACrBxqM,KAAM,CACF4tK,MAAOnF,GACPuH,QAASA,GAAW,IAExBnB,OAAQ,CACJjB,MAAOnF,GACPn2H,MAAO,EACP09H,QAASA,GAAW,KAI5B,GAAIs6B,EAAAA,CAeA,GAdAH,EAAYjoM,KAAKqoM,WAAaD,EAC1BhpM,OAAOu8B,OAAO37B,KAAKuoM,sBAAuB,CACtCrB,aAAc,IAAMlnM,KAAKkoM,gBAAgBI,GACzCjnB,OAAQrhL,KAAKwoM,YACbC,OAAQzoM,KAAKyoM,OACbC,SAAU1oM,KAAK0oM,SACfC,SAAU3oM,KAAK2oM,SACft9L,MAAOrL,KAAKqL,MACZu9L,WAAY5oM,KAAK4oM,WACjBC,aAAc7oM,KAAK6oM,aACnB3sE,MAAOl8H,KAAKk8H,UAIf+rE,EACD,YAGJA,EAAYjoM,KAAKqoM,WAAaroM,KAAKkoM,gBAAgBI,GAGlD,GAAQL,EAAUvoM,QAAQ0vL,UAC3B6Y,EAAUvoM,QAAQ0vL,OAAS,GAAe1vL,EAAQ0vL,OAAQpvL,KAAKN,QAAQ0vL,SAG3EpvL,KAAKunM,aAAaU,GAGtBA,EAAU77B,QAAQ+7B,GAGtB,sBAAsB1zJ,EAAS/0C,EAASopM,GACpC,MAAMC,EAAU,IAAI,EAAK1d,KAAKjsL,OAAOu8B,OAAO,CACxCgxI,OAAQ,CACJjB,MAAO,QAEX5tK,KAAMkC,KAAKgpM,eAAeF,GAC1BpjJ,OAAQjR,EAAQ/0C,QAAQgmD,QACzBhmD,IAIH,OAFAqpM,EAAQpuD,SAASy4B,SAAS3+H,EAAQkmG,SAASy4B,YAEpC21B,EAGX,eAAerpM,GACX,GAAIM,KAAKqmB,OACL,OAAOrmB,KAAKqmB,OAAO2iL,eAAetpM,GAI1C,+BACI,OAAO,GAIf,GAAauB,UAAUvB,QAAU,GAElB,IAAA,GAAA,GCpSf,MAAM,WAAmB,GACrB,YAAYA,GACRunD,MAAMvnD,GAENM,KAAKN,QAAQupM,OAASzH,GAAWxhM,KAAKN,QAAQupM,QAC9CjpM,KAAKN,QAAQmkL,QAAU2d,GAAWxhM,KAAKN,QAAQmkL,SAGnD,OAAOwgB,GACH,MAAM3kM,EAAUM,KAAKN,SACf,MAAE0wC,EAAK,OAAEy5H,EAAM,YAAEq/B,GAAgBxpM,EACjCypM,EAAa/4J,GAASy5H,EACtBo/B,EAASvpM,EAAQupM,OACjBplB,EAAUnkL,EAAQmkL,QAClBulB,EAAc1pM,EAAQ2pM,OAAOj5J,MACnC,IAAIkqI,EAEJ,MAAMgvB,EAAmB,KACrBtpM,KAAK07K,MAAM2oB,EAAW79B,GAAG9mK,EAAQg8K,OACjC17K,KAAK07K,MAAM2oB,EAAW59B,GAAG/mK,EAAQ6pM,QACjCvpM,KAAKwpM,WAAalvB,EAAIjkJ,QAAQozK,MAAMR,GAAQQ,MAAML,IAGtD,IAAIM,EAAarF,EAAUhuK,QACvB8yK,IACAO,EAAW/3B,GAAK+3B,EAAWj4B,GAAKrhI,EAChCs5J,EAAW93B,GAAK83B,EAAWh4B,GAAK7H,GAGhCq/B,GACAQ,EAAWD,MAAMR,GAAQQ,MAAML,GAAaK,MAAM5lB,GAGtD58H,MAAM4/I,OAAO6C,GAGTpvB,EADA6uB,EACMnpM,KAAKs6K,IAAM,IAAI,GAAI,EAAG,EAAGlqI,EAAOy5H,GAEhC7pK,KAAKs6K,IAGX4uB,GAAeC,GACfG,IACAI,EAAa1pM,KAAK0pM,WAAa1pM,KAAKwpM,WAAWnzK,QAAQozK,MAAM5lB,KAE7D6lB,EAAa1pM,KAAK0pM,WAAapvB,EAAIjkJ,QACnCikJ,EAAIp0I,IAAI29I,GAAS39I,IAAIkjK,GAAaljK,IAAI+iK,GACtCK,KAGJtpM,KAAK2pM,kBACDrvB,EAAI7I,GAAKi4B,EAAWj4B,GAAKw3B,EAAOt3J,KAAOy3J,EAAcvlB,EAAQlyI,KAC7D2oI,EAAI5I,GAAKg4B,EAAWh4B,GAAKu3B,EAAOh6E,IAAMm6E,EAAcvlB,EAAQ50D,KAGhE,MAAM79E,EAAWpxC,KAAKoxC,SACtB,IAAK,IAAI1wC,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IAAK,CACtC,IAAIu/C,EAAO7O,EAAS1wC,GACpBu/C,EAAK4mJ,OAAO5mJ,EAAKq6H,MAIzB,MAAM+pB,EAAW1oB,EAAMkC,GACnB79K,KAAKs6K,IAAIoB,MAAM2oB,EAAW1oB,EAAMkC,GAGpC,SACI,MAAMn+K,EAAUM,KAAKN,QACrB,OAAOA,EAAQ2pM,OAAOj5J,OAAS1wC,EAAQkqM,WAG3C,eACI3iJ,MAAMigJ,eAEUlnM,KAAKN,QACT0sK,SAAWpsK,KAAK6pM,UACxB7pM,KAAKksL,OAAO7xD,OAAO,EAAKgxD,KAAKye,SACzB9pM,KAAKwpM,WAAWO,SAChB/pM,KAAKgqM,gBAKjB,cACI,MAAMtqM,EAAUM,KAAKN,QACf2pM,EAAS3pM,EAAQ2pM,QAAU,GAEjC,MAAO,CACH18B,OAAQ,CACJv8H,MAAOi5J,EAAOj5J,MACds7H,MAAO29B,EAAO39B,MACdoC,QAAS,GAAeu7B,EAAOv7B,QAASpuK,EAAQouK,SAChDsb,SAAUigB,EAAOjgB,UAErBtrL,KAAM,CACF4tK,MAAOhsK,EAAQkqM,WACf97B,QAASpuK,EAAQouK,SAErBvhF,OAAQ7sF,EAAQ6sF,SAK5Bq3G,GAAkB,GAAY,CAC1BloB,MAAOzV,GACPsjC,OAAQljC,GACR4iC,OAAQ,GACRplB,QAAS,GACTwlB,OAAQ,CACJ39B,MAAO/F,GACPv1H,MAAO,GAEXw5J,WAAY,GACZV,aAAa,EACb94J,MAAO,EACPy5H,OAAQ,EACRuC,SAAS,IAGE,IAAA,GAAA,GCxHf,MAAM,WAAqB,GAEvB,YAAY1sK,EAASuqM,GACjBhjJ,MAAMvnD,GAENM,KAAKiqM,UAAYA,EAGrB,aACI,MAAM,QAAEvqM,EAAS8pM,WAAYlvB,GAAQt6K,MAC/B,KAAEsD,EAAI,SAAEw0C,GAAap4C,EACrBg3C,EAAS4jI,EAAI5jI,SACbi4I,EAAYrU,EAAIlqI,QAAU,EAEhC,IAAK1wC,EAAQ0sK,UAAYpsK,KAAK6pM,SAC1B,OAAO,KAGX,MAAMp9J,EAAQzsC,KAAKgqM,cACnB,IAAIv1J,EAgCJ,OA9BInxC,IAASwiK,GACTrxH,EAAU,IAAI,EAAKy2I,OACf,IAAI,EAAKA,OAAO,CACZ,GAAM5Q,EAAI7I,GAAKkd,EzMzBJ,GyM0BX,GAAMrU,EAAI5I,GAAK4I,EAAIzQ,SAAW,EzM1BnB,IyM2BZ8kB,GACHliJ,GzMHQ,ayMKLnpC,EACPmxC,EAAU,EAAK42I,KAAK1gB,WAAW,CAC3B,CAAE2P,EAAI7I,GAAKkd,EAAWrU,EAAI5I,IAC1B,CAAE4I,EAAI7I,GAAI6I,EAAI1I,IACd,CAAE0I,EAAI3I,GAAI2I,EAAI1I,KACfnlI,GAAOhuC,QzMlCD,UyMmCF6E,GACPmxC,EAAU,IAAI,EAAK22I,UAAU3+I,GAE7BgI,EAAQ0jI,OAAOmC,EAAI7I,GAAI6I,EAAI5I,IAAI+F,OAAO6C,EAAI3I,GAAI2I,EAAI1I,IAClDn9H,EAAQ0jI,OAAOmC,EAAI7I,GAAI6I,EAAI1I,IAAI6F,OAAO6C,EAAI3I,GAAI2I,EAAI5I,KAElDj9H,EAAU,EAAK42I,KAAKye,SAASxvB,EAAIyvB,SAAUt9J,GAG3CqL,GACArD,EAAQ38B,UAAU,EAAKA,YAClBqxJ,QAAQrxH,EAAU,CAAEpB,EAAO1L,EAAG0L,EAAOvG,KAI9CsE,EAAQ/0C,QAAQ0vL,OAAS1vL,EAAQ0vL,OAC1B36I,EAGX,gBACI,MAAM2zJ,EAAepoM,KAAKN,QAAQwsL,OAC5B+d,EAAYjqM,KAAKiqM,WAAa,GACpC,IAAI/d,EAiBJ,OAdIA,EADAkc,EACSA,EAAa,CAClB/8L,MAAO4+L,EAAU5+L,MACjBq9L,SAAUuB,EAAUvB,SACpBrnB,OAAQrhL,KAAKwoM,YACbC,OAAQwB,EAAUxB,OAClBE,SAAUsB,EAAUtB,SACpB75E,KAAM9uH,KAAKwpM,WAAWO,SACtBrqM,QAASM,KAAKkqM,gBACdhD,aAAc,IAAMlnM,KAAKmqM,eAGpBnqM,KAAKmqM,aAGXje,EAGX,gBACI,MAAMxsL,EAAUM,KAAKN,QACrB,MAAO,CACHkqM,WAAYlqM,EAAQkqM,WACpBP,OAAQ3pM,EAAQ2pM,OAChBJ,OAAQvpM,EAAQupM,OAChBplB,QAASnkL,EAAQmkL,QACjBvgL,KAAM5D,EAAQ4D,KACdsU,KAAMlY,EAAQ0wC,MACdg8H,QAAS1sK,EAAQ0sK,SAIzB,eACIpsK,KAAKksL,OAASlsL,KAAKoyC,iBAI3BwxJ,GAAkB,GAAc,CAC5BtgM,KAAMwiK,GACN4V,MAAO7V,GACP0jC,OAAQ1jC,KAGG,IAAA,GAAA,GCAA,GAvGG,CACdukC,MAAO,CACH9mM,KALO,SAMPw0C,SAAU,EACV+mI,MAAO,CAAE,CACL9pK,OAAQ,EACR22J,MAAOnF,GACPuH,QAAS,GACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,IACV,CACC/4J,OAAQ,EACR22J,MAAOnF,GACPuH,QAAS,KAGjBu8B,WAAY,CACR/mM,KArBO,SAsBPu7K,MAAO,CAAE,CACL9pK,OAAQ,EACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,GACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,OAGjBw8B,aAAc,CACVhnM,KArCO,SAsCPu7K,MAAO,CAAE,CACL9pK,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,IACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KAGjBy8B,aAAc,CACVjnM,KArDO,SAsDPknM,YAAY,EACZ3rB,MAAO,CAAE,CACL9pK,OAAQ,EACR22J,MAAOnF,GACPuH,QAAS,GACV,CACC/4J,OAAQ,GACR22J,MAAOnF,GACPuH,QAAS,IACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KAGjB28B,WAAY,CACRnnM,KAtEO,SAuEPknM,YAAY,EACZ3rB,MAAO,CAAE,CACL9pK,OAAQ,EACR22J,MAAOnF,GACPuH,QAAS,IACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KACV,CACC/4J,OAAQ,IACR22J,MAAOnF,GACPuH,QAAS,KAGjB48B,aAAc,CACVpnM,KAnGO,SAoGPozC,OAAQ,CAAE,GAAK,IACfw2H,OAAQ,KCrGD,SAASy9B,GAAQp5J,EAAG7vC,GAC/B,GAAI6vC,EAAEkgI,KAAO/vK,EAAE+vK,IAAMlgI,EAAEmgI,KAAOhwK,EAAEgwK,IAAMngI,EAAEogI,KAAOjwK,EAAEiwK,IAAMpgI,EAAEqgI,KAAOlwK,EAAEkwK,GAC9D,OAAOlwK,EAGX,MAAMzC,EAAIsK,KAAKC,IAAI+nC,EAAEkgI,GAAI/vK,EAAE+vK,IACrBvyK,EAAIqK,KAAKqS,IAAI21B,EAAEkgI,GAAI/vK,EAAE+vK,IACrB3yK,EAAIyK,KAAKC,IAAI+nC,EAAEogI,GAAIjwK,EAAEiwK,IACrB3jI,EAAIzkC,KAAKqS,IAAI21B,EAAEogI,GAAIjwK,EAAEiwK,IACrBl/J,EAAIlJ,KAAKC,IAAI+nC,EAAEmgI,GAAIhwK,EAAEgwK,IACrBjsK,EAAI8D,KAAKqS,IAAI21B,EAAEmgI,GAAIhwK,EAAEgwK,IACrB7yC,EAAIt1H,KAAKC,IAAI+nC,EAAEqgI,GAAIlwK,EAAEkwK,IACrBzzD,EAAI50G,KAAKqS,IAAI21B,EAAEqgI,GAAIlwK,EAAEkwK,IACrBg5B,EAAQ,GA2Bd,OAdAA,EAAM,GAAK,IAAI,GAAI1rM,EAAGuT,EAAG3T,EAAG2G,GAC5BmlM,EAAM,GAAK,IAAI,GAAI3rM,EAAGwG,EAAGvG,EAAG2/H,GAC5B+rE,EAAM,GAAK,IAAI,GAAI9rM,EAAG2G,EAAGuoC,EAAG6wF,GAC5B+rE,EAAM,GAAK,IAAI,GAAI1rM,EAAG2/H,EAAG//H,EAAGq/G,GAGxB5sE,EAAEkgI,KAAOxyK,GAAKsyC,EAAEmgI,KAAOj/J,GAAK/Q,EAAE+vK,KAAOxyK,GAAKyC,EAAEgwK,KAAOj/J,GACnDm4L,EAAM,GAAK,IAAI,GAAI3rM,EAAGwT,EAAGvT,EAAGuG,GAC5BmlM,EAAM,GAAK,IAAI,GAAI9rM,EAAG+/H,EAAG7wF,EAAGmwE,KAE5BysF,EAAM,GAAK,IAAI,GAAI9rM,EAAG2T,EAAGu7B,EAAGvoC,GAC5BmlM,EAAM,GAAK,IAAI,GAAI3rM,EAAG4/H,EAAG3/H,EAAGi/G,IAGzBykF,GAAKgI,GAAAA,SAAgBtwB,GACxB,OAAOA,EAAIzQ,SAAW,GAAKyQ,EAAIlqI,QAAU,KAC1C,GClCP,MAAM,WAAoB,GACtB,YAAY1wC,GACRunD,MAAMvnD,GAEN,MAAMmrM,EAAc7qM,KAAKN,QACzBmrM,EAAYz6J,MAAQz+B,SAASk5L,EAAYz6J,MAAO,IAChDy6J,EAAYhhC,OAASl4J,SAASk5L,EAAYhhC,OAAQ,IAElD7pK,KAAK8qM,UAAY,GAGrB,SACI,MAAM,QAAEprM,EAAO,SAAE0xC,GAAapxC,KAC9B,IAAI+qM,EAAa,IAAI,GAAI,EAAG,EAAGrrM,EAAQ0wC,MAAO1wC,EAAQmqK,QAEtD7pK,KAAKs6K,IAAMywB,EAAWtB,MAAM/pM,EAAQupM,QAEpC,IAAK,IAAIvoM,EAAI,EAAGA,EAAI0wC,EAAStwC,OAAQJ,IACjC0wC,EAAS1wC,GAAGmmM,OAAOkE,GACnBA,EAAaJ,GAAQI,EAAY35J,EAAS1wC,GAAG45K,MAAQ,IAAI,GAIjE,eACIt6K,KAAKksL,OAAS,IAAI,EAAKnvE,MACvB/8G,KAAKgrM,mBAGT,mBACI,MAAMtrM,EAAUM,KAAKN,QACf2pM,EAAS3pM,EAAQ2pM,QAAU,GAC3B/uB,EAAMt6K,KAAKs6K,IAAIjkJ,QAAQ6P,IAAIxmC,EAAQupM,QAAQQ,MAAMJ,EAAOj5J,OAExDw5J,EAAa,EAAKve,KAAKye,SAASxvB,EAAIyvB,SAAU,CAChDp9B,OAAQ,CACJjB,MAAO29B,EAAOj5J,MAAQi5J,EAAO39B,MAAQ,GACrCt7H,MAAOi5J,EAAOj5J,MACdg5I,SAAUigB,EAAOjgB,UAErBtrL,KAAM,CACF4tK,MAAOhsK,EAAQkqM,WACf97B,QAASpuK,EAAQouK,SAErBshB,QAAS,KAGbpvL,KAAKksL,OAAO7xD,OAAOuvE,GAGvB,UACI,OAAO5pM,KAGX,eAAeN,GACX,MAAMorM,EAAY9qM,KAAK8qM,UACjBG,EAAW,GAAUvrM,GACrBs7L,EAAW,GAAUt7L,EAAQs7L,UACnC,IAAIkQ,EAEJ,GAAIJ,EAAUG,GACVC,EAAkBJ,EAAUG,OACzB,CACH,MAAMnC,EAAkB1pM,OAAOu8B,OAAO,GAAIq/J,EAAUt7L,GAC9B,WAAlBs7L,EAAS13L,KACT4nM,EAAkB,IAAI,EAAKC,eAAerC,IAEtCppM,EAAQulM,cACR6D,EAAgBjqB,MAoCpC,SAA0Bn/K,GACtB,MAAMm/K,EAAQn/K,EAAQm/K,MAChBusB,EAAc1rM,EAAQulM,YAAcvlM,EAAQwtK,OAAU,IACtDpsK,EAAS+9K,EAAM/9K,OACfuqM,EAAe,GAErB,IAAK,IAAI3qM,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,IAAI4qM,EAAclsM,OAAOu8B,OAAO,GAAIkjJ,EAAMn+K,IAC1C4qM,EAAYv2L,QAAUu2L,EAAYv2L,QAAU,IAAMq2L,GAAaA,GAAa,IAC5EC,EAAahoM,KAAKioM,GAGtB,OAAOD,EAZX,CApC6DvC,IAE7CoC,EAAkB,IAAI,EAAKK,eAAezC,GAC1CoC,EAAgBV,YAAqC,IAAxBxP,EAASwP,YAE1CM,EAAUG,GAAYC,EAG1B,OAAOA,EAGX,iBACI,MAAMJ,EAAY9qM,KAAK8qM,UACvB,IAAK,IAAIG,KAAYH,EACjBA,EAAUG,GAAUrkC,WAAa,GAIzC,OACI,MAAMlnK,EAAUM,KAAKN,QACrB,OAAO,IAAI,GAAI,EAAG,EAAGA,EAAQ0wC,MAAO1wC,EAAQmqK,SAIpD+5B,GAAkB,GAAa,CAC3BxzJ,M5M3FyB,I4M4FzBy5H,O5M9F0B,I4M+F1B+/B,WAAYrjC,GACZ8iC,OAAQ,CACJ39B,MAAO/F,GACPv1H,MAAO,GAEX64J,OAAQzH,GAAW,GACnBpS,QAAS,IAkBE,IAAA,GAAA,GC3Hf,MAAM,WAAqB,GACvB,YAAY1vL,GACRunD,MAAMvnD,GACNM,KAAKwrM,iBAGT,iBACI,MAAM9rM,EAAUM,KAAKN,QACjBA,EAAQ+rM,UACRzrM,KAAKy8K,UAAYjW,GACjBxmK,KAAK0rM,YAAcjlC,GACnBzmK,KAAK2rM,e7MiBI,Q6MhBT3rM,KAAK4rM,iB7MHK,S6MIV5rM,KAAK6rM,aAAensM,EAAQu8K,QAC5Bj8K,KAAK8rM,eAAiBpsM,EAAQqsM,WAE9B/rM,KAAKy8K,UAAYhW,GACjBzmK,KAAK0rM,YAAcllC,GACnBxmK,KAAK2rM,e7MTK,S6MUV3rM,KAAK4rM,iB7MSI,Q6MRT5rM,KAAK6rM,aAAensM,EAAQqsM,SAC5B/rM,KAAK8rM,eAAiBpsM,EAAQu8K,SAItC,OAAOooB,GACHrkM,KAAKs6K,IAAM+pB,EAAUhuK,QACrBr2B,KAAKgsM,iBAGT,iBACI,MAAM,IAAE1xB,EAAG,YAAEoxB,EAAW,UAAEjvB,EAAS,iBAAEmvB,EAAgB,eAAED,GAAmB3rM,MACpE,OAAE+lH,EAAM,WAAE82D,EAAU,qBAAEovB,GAAyBjsM,KAAKksM,eACpDC,EAAcpmF,EAAOjlH,OACrBsrM,EAAc9xB,EAAImC,EAAY,GAAKz8K,KAAKqsM,WAAWxvB,EAAYvC,EAAIqxB,MAEzE,GAAIQ,EAAa,CACb,IAAIjvB,EAAakvB,EAEjB,IAAK,IAAIhvB,EAAW,EAAGA,EAAW+uB,EAAa/uB,IAAY,CACvD,IAAI7lJ,EAAQwuF,EAAOq3D,GACfkvB,EAAgB/0K,EAAM+0K,cACtBzjH,EAAeyxF,EAAIoxB,EAAc,GACjCa,EAAqBD,EAAcxrM,OAEvC,IAAK,IAAIosC,EAAM,EAAGA,EAAMq/J,EAAoBr/J,IAAO,CAC/C,IAAIuH,EAAU63J,EAAcp/J,GACxBwxI,EAAc1+K,KAAK0+K,YAAYjqI,GAC/B+3J,EAAoBtvB,EAAal9K,KAAKqsM,WAAW3tB,EAAYitB,GAAiBp0K,EAAMk1K,WAEpFC,EAAa,IAAI,GACrBA,EAAWjwB,EAAY,GAAK+vB,EAC5BE,EAAWjwB,EAAY,GAAK+vB,EAAoB9tB,EAAYitB,GAC5De,EAAWhB,EAAc,GAAK7iH,EAC9B6jH,EAAWhB,EAAc,GAAK7iH,EAAe61F,EAAYktB,GAEzDn3J,EAAQoyJ,OAAO6F,GAEf7jH,GAAgB61F,EAAYktB,GAAoB5rM,KAAK8rM,eAEzD5uB,GAAc3lJ,EAAMk1K,UAAYzsM,KAAK6rM,aAEzCvxB,EAAImC,EAAY,GAAK2vB,EACrB9xB,EAAImC,EAAY,GAAK2vB,EAAcvvB,EACnCvC,EAAIoxB,EAAc,GAAKpxB,EAAIoxB,EAAc,GAAKO,GAItD,WAAWr0L,EAAMymK,GACb,IAAI96K,EAAQ,EACZ,MAAMm4K,EAAQ17K,KAAKN,QAAQg8K,MAM3B,OALIA,IAAUtV,IAASsV,IAAU9V,GAC7BriK,EAAQ86K,EAAUzmK,EACX8jK,IAAU7V,KACjBtiK,GAAS86K,EAAUzmK,GAAQ,GAExBrU,EAGX,eACI,MAAM,IAAE+2K,EAAG,SAAElpI,EAAQ,iBAAEw6J,EAAgB,eAAED,EAAc,eAAEG,EAAc,aAAED,GAAiB7rM,KACpFq+K,EAAU,GAAM/D,EAAIsxB,MACpB3E,EAAgB71J,EAAStwC,OACzBilH,EAAS,GAEf,IAAI0mF,EAAY,EACZE,EAAoB,EACpB9vB,EAAa,EACbovB,EAAuB,EACvBK,EAAgB,GAEpB,IAAK,IAAIp/J,EAAM,EAAGA,EAAM+5J,EAAe/5J,IAAO,CAC1C,IAAIuH,EAAUrD,EAASlE,GAClBuH,EAAQ6lI,KACT7lI,EAAQoyJ,OAAOvsB,GAGnB,IAAIoE,EAAc1+K,KAAK0+K,YAAYjqI,GAC/Bz0C,KAAKN,QAAQsjC,MAAQ,GAAM2pK,EAAoBb,EAAiBptB,EAAYktB,IAAqBvtB,IACjGt4D,EAAO1iH,KAAK,CACRipM,cAAeA,EACfG,UAAWA,EACXE,kBAAmBA,IAEvBV,EAAuB1iM,KAAKqS,IAAIqwL,EAAsBU,GACtD9vB,GAAcgvB,EAAeY,EAC7BA,EAAY,EACZE,EAAoB,EACpBL,EAAgB,IAEpBG,EAAYljM,KAAKqS,IAAI6wL,EAAW/tB,EAAYitB,IACxCgB,EAAoB,IACpBA,GAAqBb,GAEzBa,GAAqBjuB,EAAYktB,GACjCU,EAAcjpM,KAAKoxC,GAWvB,OARAsxE,EAAO1iH,KAAK,CACRipM,cAAeA,EACfG,UAAWA,EACXE,kBAAmBA,IAEvBV,EAAuB1iM,KAAKqS,IAAIqwL,EAAsBU,GACtD9vB,GAAc4vB,EAEP,CACH1mF,OAAQA,EACR82D,WAAYA,EACZovB,qBAAsBA,GAI9B,YAAYx3J,GACR,MAAO,CACHrE,MAAOqE,EAAQ6lI,IAAIlqI,QACnBy5H,OAAQp1H,EAAQ6lI,IAAIzQ,UAI5B,iBAGJ+5B,GAAkB,GAAc,CAC5B6H,UAAU,EACVzoK,MAAM,EACN+oK,SAAU,EACV9vB,QAAS,IAGE,IAAA,GAAA,GCpJf,MAAM2wB,GAAc,EAAKrhB,KAEzB,MAAM,WAAa,GAEf,YAAY3+G,EAASltE,GACjBunD,MAAMvnD,GAENM,KAAK4sE,QAAUA,EAGf5sE,KAAK6mM,OAAO,IAAI,IAGpB,OAAOxC,GACH,MAAM3kM,EAAUM,KAAKN,QACfkY,EAAOlY,EAAQkY,KAAO,EAAK/Q,KAAKi0K,YAAY96K,KAAK4sE,QAAS,CAAEouG,KAAMt7K,EAAQs7K,OAEhFh7K,KAAKm6K,SAAWviK,EAAKuiK,SAErBn6K,KAAKs6K,IAAM,IAAI,GAAI+pB,EAAU5yB,GAAI4yB,EAAU3yB,GACnC2yB,EAAU5yB,GAAK75J,EAAKw4B,MAAOi0J,EAAU3yB,GAAK95J,EAAKiyJ,QAG3D,eACI,MAAM,KAAEmR,EAAI,MAAEtP,EAAK,QAAEoC,EAAO,OAAEvhF,GAAWvsF,KAAKN,QAE9CM,KAAKksL,OAAS,IAAI0gB,GAAY5sM,KAAK4sE,QAAS5sE,KAAKs6K,IAAIyvB,SAAS5/B,UAAW,CACrE6Q,KAAMA,EACNl9K,KAAM,CAAE4tK,MAAOA,EAAOoC,QAASA,GAC/BvhF,OAAQA,KAKpBq3G,GAAkB,GAAM,CACpB5oB,K9MlCwB,kB8MmCxBtP,MAAO/F,KAGI,IAAA,GAAA,GC7CA,SAASknC,GAAU/9E,GAC9B,MAAM9/E,EAAS8/E,EAAK9/E,OACdw7H,EAAc17C,EAAK07C,cAEzB,OAAO,IAAI,GAAIx7H,EAAOhE,EAAGgE,EAAOmB,EAAGq6H,EAAYx/H,EAAGw/H,EAAYr6H,GCMlE,MAAM28J,GAAmB,MA2JV,IAAA,GAzJf,cAAsB,GAElB,YAAYlgI,EAASltE,EAAS0f,GAC1B6nC,MAAMvnD,GACNM,KAAK4sE,QAAUA,EACf5sE,KAAKof,KAAOA,EAEZpf,KAAK+sM,kBAC4B,IAA7B/sM,KAAKN,QAAQstM,aACbhtM,KAAK6mM,OAAO,IAAI,IAIxB,iBACI,MAAMnnM,EAAUM,KAAKN,QACfutM,EAAOv0L,OAAO1Y,KAAK4sE,SAASjuE,MAAMmuM,IAClCI,EAAe,IAAI,GAAa,CAAEzB,UAAU,EAAM/vB,MAAOh8K,EAAQg8K,MAAO14I,MAAM,IAC9EmqK,EAAc/L,GAAW,GAAK1hM,EAAS,CAAEouK,QAAS,EAAGj6E,UAAW,OAEtE7zF,KAAKo6E,UAAY8yH,EACjBltM,KAAKq6H,OAAO6yE,GAEZ,IAAK,IAAIE,EAAS,EAAGA,EAASH,EAAKnsM,OAAQssM,IAAU,CACjD,IAAIppH,EAAO,IAAI,GAAKipH,EAAKG,GAAQttM,OAAQqtM,GACzCD,EAAa7yE,OAAOr2C,IAI5B,OAAOqgH,GACH,MAAM3kM,EAAUM,KAAKN,QACf2tM,EAAW3tM,EAAQwsL,OAGzB,GAFAlsL,KAAKo6E,UAAU16E,QAAQg8K,MAAQh8K,EAAQg8K,MAEnC2xB,IAAartM,KAAKstM,WAAY,CAC9B,IAAIC,EAAYlJ,EACXkJ,EAAUC,YACXxtM,KAAKstM,YAAa,EAClBttM,KAAK6mM,OAAO0G,GACZvtM,KAAKstM,YAAa,EAClBC,EAAYvtM,KAAKs6K,KAErB,MAAM4R,EAASlsL,KAAKksL,OAASmhB,EAASrtM,KAAKytM,cAAcF,IAErDrhB,IACAqhB,EAAYV,GAAU3gB,EAAOxT,eAAiB,IAAI,EAAK4S,MAEvDY,EAAOxsL,QAAQ0vL,OAAS1vL,EAAQ0vL,QAGpCpvL,KAAKs6K,IAAMt6K,KAAK0pM,WAAa1pM,KAAKwpM,WAAa+D,OAI/C,GAFAtmJ,MAAM4/I,OAAOxC,GAET3kM,EAAQo4C,SAAU,CAClB,MAAMmxJ,EAASzH,GAAW9hM,EAAQupM,QAClC,IAAI3uB,EAAMt6K,KAAKs6K,IAAImvB,MAAMR,GAEzBjpM,KAAKqkM,UAAYA,EACjBrkM,KAAK0tM,UAAYpzB,EAAIjkJ,QAErBikJ,EAAMt6K,KAAKmpK,SACXmR,EAAIjR,UAAU4/B,EAAOt3J,KAAOs3J,EAAOr3J,MAAOq3J,EAAOh6E,IAAMg6E,EAAOh+B,QAE9DjrK,KAAK2tM,WAAarzB,EAAIjkJ,QAEtBikJ,EAAIp0I,IAAI+iK,IAKpB,eACI,MAAMvpM,EAAUM,KAAKN,QAQrB,GANAM,KAAKksL,OAAS,IAAI,EAAKnvE,MAAM,CACzBjlG,UAAW9X,KAAK4tM,oBAChBxe,OAAQ1vL,EAAQ0vL,OAChBuY,OAAQjoM,EAAQioM,SAGhB3nM,KAAK6pM,SAAU,CACf,MAAMvvB,EAAM,EAAK+Q,KAAKye,SAAS9pM,KAAKwpM,WAAWO,SAAU/pM,KAAKgqM,eAC9DhqM,KAAKksL,OAAO7xD,OAAOigD,IAI3B,eACI,GAAKt6K,KAAKN,QAAQ0sK,QAIlB,GAAIpsK,KAAKN,QAAQwsL,OAAQ,CACrB,MAAMA,EAASlsL,KAAKksL,OAChBA,IAAW,GAAQA,EAAOxsL,QAAQioM,UAClCzb,EAAOxsL,QAAQioM,OAAS3nM,KAAKN,QAAQioM,QAEzC3nM,KAAKmnM,YACLnnM,KAAKonM,uBAELngJ,MAAMugJ,eAId,cAAcnD,GACV,MAAM/rL,EAAU,CACZ0rE,KAAMhkF,KAAK4sE,QACXkiD,KAAMu1E,EAAU0F,SAChB1oB,OAAQrhL,KAAKwoM,YACb9oM,QAASM,KAAKN,QACdwnM,aAAc,KACVlnM,KAAKstM,YAAa,EAClBttM,KAAK6mM,OAAOxC,GACZrkM,KAAKstM,YAAa,EACXttM,KAAK6tM,qBAOpB,OAJI7tM,KAAKof,MACLhgB,OAAOu8B,OAAOrjB,EAAStY,KAAKof,MAGzB9G,EAGX,mBACItY,KAAKknM,eACLlnM,KAAKkmL,iBACL,MAAMgG,EAASlsL,KAAKksL,OAEpB,cADOlsL,KAAKksL,OACLA,EAGX,SACI,MAAMxsL,EAAUM,KAAKN,QAIrB,OAHAM,KAAKs6K,IAAInR,OAAOzpK,EAAQo4C,UACxB93C,KAAK07K,MAAM17K,KAAKqkM,UAAW79B,GAAG9mK,EAAQg8K,OACtC17K,KAAK07K,MAAM17K,KAAKqkM,UAAW59B,GAAG/mK,EAAQ6pM,QAC/BvpM,KAAKs6K,IAGhB,oBACI,MAAMxiI,EAAW93C,KAAKN,QAAQo4C,SAC9B,IAAKA,EACD,OAAO,KAGX,MAAQ9M,EAAGynI,EAAItiI,EAAGuiI,GAAO1yK,KAAK0tM,UAAUh3J,SAClCo3J,EAAY9tM,KAAK2tM,WAAWj3J,SAElC,OAAO,EAAK5+B,YACAuxJ,UAAUykC,EAAU9iK,EAAIynI,EAAIq7B,EAAU39J,EAAIuiI,GAC1CvJ,OAAOrxH,EAAU,CAAE26H,EAAIC,MC7J3C,MAAM,WAAc,GAChB,YAAYhzK,GACRunD,MAAMvnD,GAENM,KAAKq6H,OACD,IAAI,GAAQr6H,KAAKN,QAAQskF,KAAM5kF,OAAOu8B,OAAO,GAAI37B,KAAKN,QAAS,CAC3D6pM,OAAQvpM,KAAKN,QAAQokC,aAKjC,OAAOugK,GACHp9I,MAAM4/I,OAAOxC,GACbrkM,KAAKs6K,IAAIyzB,OAAO1J,EAAW79B,IAG/B,kBAAkB9mK,EAAS2mB,EAAQ2nL,GAC/B,IAQIt1F,EARAu1F,EAAevuM,EAcnB,MAZuB,iBAAZA,IACPuuM,EAAe,CAAEjqH,KAAMtkF,IAG3BuuM,EAAe7uM,OAAOu8B,OAAO,CAAEywI,SAAS,GAAQ4hC,EAAgBC,GAG5DA,GAAgBA,EAAa7hC,SAAW6hC,EAAajqH,OACrD00B,EAAQ,IAAI,GAAMu1F,GAClB5nL,EAAOg0G,OAAO3hB,IAGXA,GAIfkrF,GAAkB,GAAO,CACrBl4B,MAAO/F,GACP7hI,SAAUuiI,GACVqV,MAAO7V,GACPojC,OAAQzH,GAAW,GACnB3d,QAAS2d,GAAW,KAGT,IAAA,GAAA,GCtCf,MAAM,WAAkB,GACpB,YAAYn2L,EAAO24E,EAAMhwE,EAAO00L,EAAUhpM,GACtCunD,MAAM+8B,EAAMtkF,GAEZM,KAAKgkF,KAAOA,EACZhkF,KAAKqL,MAAQA,EACbrL,KAAKgU,MAAQA,EACbhU,KAAK0oM,SAAWA,EAChB1oM,KAAK6mM,OAAO,IAAI,IAGpB,cAAcxC,GACV,MAAM/rL,EAAU2uC,MAAMwmJ,cAAcpJ,GAOpC,OALA/rL,EAAQjN,MAAQrL,KAAKqL,MACrBiN,EAAQowL,SAAW1oM,KAAK0oM,SACxBpwL,EAAQnO,OAASnK,KAAKN,QAAQyK,OAC9BmO,EAAQksH,QAAUxkI,KAAKN,QAAQ8kI,QAExBlsH,EAGX,MAAM41L,EAAQz7L,GAEVy7L,EAAOrjE,QlNlCiB,iBkNkCS,CAC7Bp2F,QAAS,GAAahiC,GACtBpH,MAAOrL,KAAKqL,MACZ24E,KAAMhkF,KAAKgkF,KACXhwE,MAAOhU,KAAKgU,MACZ00L,SAAU1oM,KAAK0oM,SACf/sB,KAAM37K,KAAKqmB,OAAO3mB,UAI1B,SACI,GAAIM,KAAKN,QAAQyuM,gBAAkBtoC,GAAQ,CACvC,MAAMyU,EAAMt6K,KAAK0tM,UAAU3D,SACrBjyL,EAAY9X,KAAK4tM,oBAEvB5tM,KAAKs6K,IAAMuyB,GAAUvyB,EAAIrO,KAAKn0J,EAAU0wJ,gBAExCvhH,MAAMkiH,SAGV,OAAOnpK,KAAKs6K,IAGhB,oBACI,MAAM56K,EAAUM,KAAKN,QACfo4C,EAAWp4C,EAAQo4C,SACzB,IAAKA,EACD,OAAO,KAGX,GAAIp4C,EAAQyuM,gBAAkBtoC,GAC1B,OAAO5+G,MAAM2mJ,oBAGjB,MAAMQ,EAAiB,EAAKt2L,YAAYqxJ,OAAOrxH,GAAU0wH,SACnD8R,EAAMt6K,KAAK0tM,UAAU3D,SACrBj7E,EAAO9uH,KAAKqkM,UAAU0F,SAEtBsE,EAAiB3uM,EAAQ2uM,gBAAkBhoC,GAC3CioC,EAAYD,IAAmBhoC,IAAOgoC,IAAmBzoC,GAASY,GAAIC,GACtE8nC,EAAeF,IAAmBhoC,IAAOgoC,IAAmBzoC,GAASa,GAAID,GACzEgoC,EAAaH,IAAmBhoC,IAAOgoC,IAAmBpoC,GAAOn3C,EAAK9/E,OAAS8/E,EAAK07C,cAEpFL,EAAUmQ,EAAInQ,UAAUC,cAAcgkC,GACtC9jC,EAAWgQ,EAAIhQ,WAAWF,cAAcgkC,GACxC5jC,EAAc8P,EAAI9P,cAAcJ,cAAcgkC,GAC9C1jC,EAAa4P,EAAI5P,aAAaN,cAAcgkC,GAC5CT,EAAa,EAAKriB,KAAK3gB,WAAWR,EAASG,EAAUE,EAAaE,GAElErB,EAAY,CACd,CAACklC,GAAez/E,EAAK9/E,OAAOu/J,GAAgBZ,EAAW3+J,OAAOu/J,IAG5DE,EAAellM,KAAK+mC,IAAI65H,EAAQokC,GAAgBllC,EAAUklC,GAAgBC,EAAWD,IACrFG,EAAgBnlM,KAAK+mC,IAAIg6H,EAASikC,GAAgBllC,EAAUklC,GAAgBC,EAAWD,IAE7F,IAAIlC,EAAYsC,EAEZ,GAAMF,ElNlFe,MkNkFsB,GAAMC,ElNlF5B,KkNmFrBrC,EAAaliC,EACbwkC,EAAWrkC,GACJokC,EAAgBD,GACvBpC,EAAa/hC,EACbqkC,EAAWnkC,IAEX6hC,EAAaliC,EACbwkC,EAAWjkC,GAGf,MAAMkkC,EAAcvC,EAAWiC,IAAcK,EAASL,GAAajC,EAAWiC,IAAc,EAG5F,OAFAjlC,EAAUilC,GAAax/E,EAAKp4E,SAAS43J,GAAaM,EAE3C,EAAK92L,YACPuxJ,UAAUA,EAAUr+H,EAAGq+H,EAAUl5H,GACjCg5H,OAAOrxH,IAIpB8rJ,GAAkB,GAAW,CACzBoJ,aAAa,IAGF,IAAA,GAAA,GCxGf,MAAM,WAAa,GACf,YAAYllC,EAAQpoK,EAASsnM,GACzB//I,MAAMvnD,GAENM,KAAK8nK,OAASA,EACd9nK,KAAKgnM,aAAeA,EAEpBhnM,KAAKgmL,SAGT,OACIhmL,KAAKN,QAAQ0sK,SAAU,EAG3B,OACIpsK,KAAKN,QAAQ0sK,SAAU,EAG3B,SACI,MAAM1sK,EAAUM,KAAKN,QAErB,GAAIA,EAAQ0sK,QAAS,CACjB,MAAM,MAAEttC,EAAK,KAAE+vE,GAASnvM,EAClB46K,EAAM,IAAI,GACVw0B,EAAa,IAAM9uM,KACzB,IAEIowC,EAAOy5H,EAFPjyJ,EAAOi3L,EAAKj3L,KACZosE,EAAOhkF,KAAK8nK,OAAO9jF,KAGvB,GAAI,GAAQ86C,IAAUA,EAAMstC,QAAS,CACjC,MAAM2iC,EAAevM,GAAY1jE,GAC7BiwE,EACA/qH,EAAO+qH,EAAa/uM,KAAK8nK,QAClBhpC,EAAM30H,SACb65E,EAAOhkF,KAAKgnM,aAAa78L,OAAO6kM,KAAKlwE,EAAM30H,OAAQ65E,IAGlD86C,EAAM4sC,QACP5sC,EAAM4sC,MnNlCJ,WmNkCY5sC,EAAMh7F,SAxCZ,OAwCwD+qK,EAAKjF,YAGzE5pM,KAAK8+H,MAAQ,IAAI,GAAQ96C,EAAMo9G,GAAW,GAAItiE,IAC9C9+H,KAAK8+H,MAAMmwE,SAAWH,EnNtChB,WmNwCFhwE,EAAMh7F,UAAwB,GAAQlsB,KAClCi3L,EAAKvrM,OAASwiK,GACdluJ,EAAOrO,KAAKqS,IAAI5b,KAAK8+H,MAAMw7C,IAAIlqI,QAASpwC,KAAK8+H,MAAMw7C,IAAIzQ,WAEvDz5H,EAAQpwC,KAAK8+H,MAAMw7C,IAAIlqI,QACvBy5H,EAAS7pK,KAAK8+H,MAAMw7C,IAAIzQ,UAE5ByQ,EAAIt3I,KAAKhjC,KAAK8+H,MAAMw7C,MAI5Bu0B,EAAKz+J,MAAQA,GAASx4B,GA1DR,EA2Ddi3L,EAAKhlC,OAASA,GAAUjyJ,GA3DV,EA6Dd,MAAM2oD,EAAS,IAAI,GAAa6gI,GAAW,GAAIyN,IAC/CtuI,EAAO0uI,SAAWH,EAElB9uM,KAAKugE,OAASA,EACdvgE,KAAKq6H,OAAO95D,GAERvgE,KAAK8+H,OACL9+H,KAAKq6H,OAAOr6H,KAAK8+H,OAGrBv+D,EAAOsmI,OAAO,IAAI,IAClB7mM,KAAKkvM,WAAa50B,EAAIt3I,KAAKu9B,EAAO+5G,MAI1C,OAAO+pB,GACH,MAAM,QAAE3kM,EAAO,MAAEo/H,EAAK,OAAEv+D,EAAM,WAAE2uI,GAAelvM,KACzC02C,EAAS2tJ,EAAU3tJ,SACnB51C,EAASpB,EAAQmuC,KAAK/sC,OACtBgjC,EAAWpkC,EAAQokC,SAGzB,GAAIpkC,EAAQ0sK,QAAS,CACjB,IAAI+iC,EAAW70B,EAAKovB,EAEhBz1J,GAAQnQ,EAAU,CAAEmiI,GAAMG,KACtBtiI,IAAamiI,IACbyjC,EAAawF,EAAWE,QAAQ/K,EAAWvgK,GAAUulI,WAAWvoK,EAAQujM,EAAU3tJ,SAASvG,EAAI++J,EAAWx4J,SAASvG,GAE/GzwC,EAAQmuC,KAAKu+H,UACb+iC,EAAY,CAAE9K,EAAU5yB,GAAI/6H,EAAOvG,GACnCnwC,KAAKqvM,WAAa,CACdF,EACA,CAAEzF,EAAW/3B,GAAIj7H,EAAOvG,IAE5BmqI,EAAMovB,EAAWrzK,QAAQiwK,UAAU6I,MAGvCzF,EAAawF,EAAWE,QAAQ/K,EAAWvgK,GAAUulI,UAAUvoK,EAAQujM,EAAU3tJ,SAASvG,EAAI++J,EAAWx4J,SAASvG,GAE9GzwC,EAAQmuC,KAAKu+H,UACb+iC,EAAY,CAAE9K,EAAU1yB,GAAIj7H,EAAOvG,GACnCnwC,KAAKqvM,WAAa,CACdF,EACA,CAAEzF,EAAWj4B,GAAI/6H,EAAOvG,IAE5BmqI,EAAMovB,EAAWrzK,QAAQiwK,UAAU6I,KAIvCrrK,IAAa8hI,IACb8jC,EAAawF,EAAWE,QAAQ/K,EAAWvgK,GAAUulI,UAAUg7B,EAAU3tJ,SAAS1L,EAAIkkK,EAAWx4J,SAAS1L,EAAGlqC,GAEzGpB,EAAQmuC,KAAKu+H,UACb+iC,EAAY,CAAEz4J,EAAO1L,EAAGq5J,EAAUzyB,IAClC5xK,KAAKqvM,WAAa,CACdF,EACA,CAAEz4J,EAAO1L,EAAG0+J,EAAWh4B,KAE3B4I,EAAMovB,EAAWrzK,QAAQiwK,UAAU6I,MAGvCzF,EAAawF,EAAWE,QAAQ/K,EAAWvgK,GAAUulI,UAAUg7B,EAAU3tJ,SAAS1L,EAAIkkK,EAAWx4J,SAAS1L,GAAIlqC,GAE1GpB,EAAQmuC,KAAKu+H,UACb+iC,EAAY,CAAEz4J,EAAO1L,EAAGq5J,EAAU3yB,IAClC1xK,KAAKqvM,WAAa,CACdF,EACA,CAAEz4J,EAAO1L,EAAG0+J,EAAW93B,KAE3B0I,EAAMovB,EAAWrzK,QAAQiwK,UAAU6I,KAK3C5uI,GACAA,EAAOsmI,OAAO6C,GAGd5qE,IACAA,EAAM+nE,OAAO6C,GACTnpI,InN9HG,YmN+HC7gE,EAAQo/H,MAAMh7F,UACdg7F,EAAMw7C,IAAI80B,QAAQ7uI,EAAO+5G,IAAKx2I,GAElCg7F,EAAM+nE,OAAO/nE,EAAMw7C,OAI3Bt6K,KAAK0pM,WAAaA,EAClB1pM,KAAKqkM,UAAYA,EACjBrkM,KAAKs6K,IAAMA,GAAOovB,GAI1B,eACIziJ,MAAMigJ,eACNlnM,KAAKksL,OAAOxsL,QAAQioM,OAAS3nM,KAAKN,QAAQioM,OAEtC3nM,KAAKN,QAAQ0sK,SACbpsK,KAAKsvM,aAIb,eACI,MAAM5vM,EAAUM,KAAKN,QACf0oM,EAAe1oM,EAAQwsL,OACzBxsL,EAAQ0sK,SAAWg8B,GACnBpoM,KAAKksL,OAASkc,EAAahpM,OAAOu8B,OAAO37B,KAAK8nK,OAAQ,CAClDuZ,OAAQrhL,KAAKwoM,YACb15E,KAAM9uH,KAAKqkM,UAAU0F,SACrBrqM,QAAS,CACLkqM,WAAYlqM,EAAQkqM,WACpBP,OAAQ3pM,EAAQkqM,WAChBiF,KAAMnvM,EAAQmvM,KACd/vE,MAAOp/H,EAAQo/H,MACfjxF,KAAMnuC,EAAQmuC,KACd/J,SAAUpkC,EAAQokC,SAClBsoI,QAAS1sK,EAAQ0sK,SAErB86B,aAAc,KACVlnM,KAAKknM,eACLlnM,KAAKkmL,iBACL,MAAMqpB,EAAgBvvM,KAAKksL,OAE3B,cADOlsL,KAAKksL,OACLqjB,MAGfvvM,KAAKmnM,aAELlgJ,MAAMugJ,eAId,aACI,MAAM9nM,EAAUM,KAAKN,QAAQmuC,KAE7B,GAAI7tC,KAAKqvM,WAAY,CACjB,MAAMnxM,EAAO,EAAKmtL,KAAK1gB,WAAW3qK,KAAKqvM,WAAY,CAC/C1iC,OAAQ,CACJjB,MAAOhsK,EAAQgsK,MACft7H,MAAO1wC,EAAQ0wC,MACfg5I,SAAU1pL,EAAQ0pL,YAI1BsX,GAAiBxiM,GACjB8B,KAAKksL,OAAO7xD,OAAOn8H,IAI3B,MAAMgwM,EAAQz7L,GACV,MAAMgB,EAAOzT,KAAKwvM,UAAU/8L,GAEvBy7L,EAAOrjE,QnN3MM,YmN2Mcp3H,IAC5BhB,EAAEkuC,iBAIV,KAAKutJ,EAAQz7L,GACT,MAAMgB,EAAOzT,KAAKwvM,UAAU/8L,GAEvBy7L,EAAOrjE,QnNlNM,YmNkNcp3H,IAC5BhB,EAAEkuC,iBAIV,IAAIutJ,EAAQz7L,GACR,MAAMgB,EAAOzT,KAAKwvM,UAAU/8L,GAE5By7L,EAAOrjE,QnNzNW,YmNyNSp3H,GAG/B,UAAUhB,GACN,MAAM/S,EAAUM,KAAKN,QAErB,OAAON,OAAOu8B,OAAO37B,KAAK8nK,OAAQ,CAC9BrzH,QAAS,GAAahiC,GACtBuxE,KAAM,GAAQtkF,EAAQo/H,OAASp/H,EAAQo/H,MAAM96C,KAAO,GACpDkoG,OAAQlsL,KAAKksL,UAKzB0X,GAAkB,GAAM,CACpBiL,KAAM,CACFziC,SAAS,EACT9oK,KAAMwiK,IAEVhnC,MAAO,CACHh7F,SnNpPc,SmNqPdsoI,SAAS,EACTsP,MAAO7V,GACP0jC,OAAQ1jC,IAEZh4H,KAAM,CACFu+H,SAAS,GAEbA,SAAS,EACTtoI,SAAUuiI,GACV+oB,OAAQ,IAGG,IAAA,GAAA,GC9QA,SAASqgB,GAAe/vM,EAASgwM,GAC5C,MAAM,MAAEC,EAAK,MAAEC,EAAK,SAAE9rK,GAAapkC,EAE7B01G,EAAO,IAAI,EAAKi2E,KAAK,CACvB1e,OAAQ,CACJv8H,MAAOs/J,EAAYt/J,MACnBs7H,MAAOgkC,EAAYhkC,SAc3B,OAVIhsK,EAAQ+rM,SACRr2F,EAAK+iE,OAAOw3B,EAAO7rK,GACd2zI,OAAOk4B,EAAQD,EAAY93L,KAAMksB,GAEtCsxE,EAAK+iE,OAAOr0I,EAAU8rK,GACjBn4B,OAAO3zI,EAAU8rK,EAAQF,EAAY93L,MAG9C8oL,GAAiBtrF,GAEVA,ECpBI,SAASy6F,GAAmBnwM,EAASowM,GAChD,MAAM,UAAEX,EAAS,QAAEY,EAAO,SAAEjsK,GAAapkC,EAEnCmuC,EAAO,IAAI,EAAKw9I,KAAK,CACvB1e,OAAQ,CACJv8H,MAAO0/J,EAAS1/J,MAChBs7H,MAAOokC,EAASpkC,MAChB0d,SAAU0mB,EAAS1mB,YAc3B,OAVI1pL,EAAQ+rM,SACR59J,EAAKsqI,OAAOg3B,EAAWrrK,GAClB2zI,OAAOs4B,EAASjsK,GAErB+J,EAAKsqI,OAAOr0I,EAAUqrK,GACjB13B,OAAO3zI,EAAUisK,GAG1BrP,GAAiB7yJ,GAEVA,ECVX,MAAM,WAAa,GACf,YAAYnuC,EAASsnM,EAAe,IAAI,IACpC//I,MAAMvnD,GAENM,KAAKgnM,aAAeA,EAEfhnM,KAAKN,QAAQ0sK,UACdpsK,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAAS,CACxCswM,OAAQ,CACJ5jC,SAAS,GAEbv+H,KAAM,CACFu+H,SAAS,GAEb68B,OAAQ,EACRgH,cAAe,EACfC,cAAe,KAIvBlwM,KAAKN,QAAQywM,WAAa/O,GAAW,GAAI,CACrC11B,MAAO1rK,KAAKN,QAAQmuC,KAAK69H,MACzBt7H,MAAOpwC,KAAKN,QAAQmuC,KAAKuC,MACzBg8H,QtNjBQ,SsNiBCpsK,KAAKN,QAAQ0wM,eACvBpwM,KAAKN,QAAQywM,WAAY,CACxBv4L,KAAM5X,KAAKN,QAAQwwM,cACnBx0B,MAAO17K,KAAKN,QAAQ0wM,gBAGxBpwM,KAAKN,QAAQ2wM,WAAajP,GAAW,GAAI,CACrC11B,MAAO1rK,KAAKN,QAAQmuC,KAAK69H,MACzBt7H,MAAOpwC,KAAKN,QAAQmuC,KAAKuC,MACzBg8H,QtN1BQ,SsN0BCpsK,KAAKN,QAAQ4wM,eACvBtwM,KAAKN,QAAQ2wM,WAAY,CACxBz4L,KAAM5X,KAAKN,QAAQuwM,cACnBv0B,MAAO17K,KAAKN,QAAQ4wM,gBAGxBtwM,KAAKuwM,aAEAvwM,KAAKN,QAAQ8wM,cACdxwM,KAAKywM,eAGTzwM,KAAK0wM,cACL1wM,KAAK2wM,cAGT,cAMA,cACI,MAAO,CACHnnM,IAAKxJ,KAAKN,QAAQswM,OAAOhvL,KACzBpF,IAAK5b,KAAK4wM,eAIlB,uBAAuBC,GACnB,MAAM/4J,EAAW+4J,EAAa/4J,SAE1B,GAASA,KACT+4J,EAAa1C,cAAgBr2J,EAAS4jI,MACtCm1B,EAAa/4J,SAAWA,EAAShB,OAIzC,eACI,MAAMp3C,EAAUM,KAAKN,QAEfmxM,EAAezP,GAAW,GAAK1hM,EAAQswM,OAAQ,CACjDt0B,MAFUh8K,EAAQ+rM,SAAWrlC,GAAQP,GAGrCupB,OAAQ1vL,EAAQ0vL,SAEdh8J,EAAO7pB,KAAKqS,IAAI,EAAGi1L,EAAaz9K,MAItC,GAFApzB,KAAK8wM,cAEDD,EAAazkC,QAAS,CACtBpsK,KAAK+wM,uBAAuBF,GACE,SAA1BA,EAAa/4J,WACb+4J,EAAa/4J,SAAW,EACxBp4C,EAAQsxM,kBAAmB,GAG/B,MAAM3yK,EAAQr+B,KAAKixM,cACnB,IAAK,IAAI/jK,EAAM7O,EAAM70B,IAAK0jC,EAAM7O,EAAMziB,IAAKsxB,GAAO9Z,EAAM,CAEpD,IAAI0rG,EAAQ9+H,KAAKkxM,gBAAgBhkK,EAAK2jK,EADjB,CAAE78L,MAAOk5B,EAAKtX,MAAOyI,EAAMziB,MAE5CkjH,IACA9+H,KAAKq6H,OAAOyE,GACZ9+H,KAAKgwM,OAAO3sM,KAAKy7H,MAMjC,cACI9+H,KAAKoxC,SAAWwxJ,GAAK5iM,KAAKoxC,SAAU2B,KAAWA,aAAiB,KAChE/yC,KAAKgwM,OAAS,GAGlB,aACQhwM,KAAK04G,QACL14G,KAAKoxC,SAAWwxJ,GAAK5iM,KAAKoxC,SAAU2B,GAASA,IAAU/yC,KAAK04G,OAC5D14G,KAAK04G,WAAQxiG,GAIrB,QACIlW,KAAK8wM,cACL9wM,KAAKmxM,aAGT,UACI,MAAM,QAAEzxM,EAAO,IAAE46K,GAAQt6K,KAEnBoxM,EAAS1xM,EAAQswM,OAAOoB,OACxBC,EAAQD,EAAS92B,EAAI7I,GAAK6I,EAAI3I,GAC9B2/B,EAAQF,EAAS92B,EAAI1I,GAAK0I,EAAI5I,GAC9B2pB,EAAY37L,EAAQmuC,KAAKuC,OAAS,EAExC,OANiB1wC,EAAQ+rM,SAOrB,IAAI,GAAI4F,EAAO/2B,EAAI5I,GAAI2/B,EAAO/2B,EAAI1I,GAAKypB,GACvC,IAAI,GAAI/gB,EAAI7I,GAAI6/B,EAAOh3B,EAAI3I,GAAK0pB,EAAWiW,GAGnD,cACI,MAAM5xM,EAAUM,KAAKN,QACfuuM,EAAe7M,GAAW,CAC5BtpJ,SAAUp4C,EAAQ+rM,UAAY,GAAK,EACnCznH,KAAM,GACNorG,OAAQ,EACRmiB,YAAY,GACb7xM,EAAQg5G,OAEX,GAAIu1F,EAAa7hC,SAAW6hC,EAAajqH,KAAM,CAC3C,MAAM00B,EAAQ,IAAI,GAAQu1F,EAAajqH,KAAMiqH,GAC7CjuM,KAAKq6H,OAAO3hB,GACZ14G,KAAK04G,MAAQA,GAIrB,cACI,MAAMh5G,EAAUM,KAAKN,QACf8xM,EAAQ9xM,EAAQ8xM,MAChBp+I,EAAQo+I,EAAMpyL,MAAQ,GAE5Bpf,KAAKwxM,MAAQ,GAEb,IAAK,IAAI9wM,EAAI,EAAGA,EAAI0yD,EAAMtyD,OAAQJ,IAAK,CACnC,MAAMu/C,EAAOmhJ,GAAW,GAAIoQ,EAAOp+I,EAAM1yD,IACzCu/C,EAAK50C,MAAQrL,KAAKyxM,eAAexxJ,EAAK50C,OAEtC,MAAMqmM,EAAO,IAAI,GAAK,CAClBrmM,MAAO40C,EAAK50C,MACZ24E,KAAM/jC,EAAK6+E,MAAM96C,KACjB0kH,SAAUzoJ,GACXA,EAAMjgD,KAAKgnM,cAEV0K,EAAKhyM,QAAQ0sK,UACT,GAAQslC,EAAKhyM,QAAQokC,UACjBpkC,EAAQ+rM,WAAax3J,GAAQy9J,EAAKhyM,QAAQokC,SAAU,CAAEmiI,GAAMG,KAC5DsrC,EAAKhyM,QAAQokC,SAAWpkC,EAAQyc,QAAU8pJ,GAAOG,GACzC1mK,EAAQ+rM,UAAax3J,GAAQy9J,EAAKhyM,QAAQokC,SAAU,CAAEuiI,GAAKT,OACnE8rC,EAAKhyM,QAAQokC,SAAWpkC,EAAQyc,QAAUypJ,GAASS,IAInDqrC,EAAKhyM,QAAQokC,SADbpkC,EAAQ+rM,SACgB/rM,EAAQyc,QAAU8pJ,GAAOG,GAEzB1mK,EAAQyc,QAAUypJ,GAASS,GAG3DrmK,KAAKq6H,OAAOq3E,GACZ1xM,KAAKwxM,MAAMnuM,KAAKquM,KAK5B,eAAermM,GACX,OAAOA,EAGX,eACI47C,MAAMugJ,eAENxnM,KAAK2xM,kBAGT,eACI1qJ,MAAMigJ,eAENlnM,KAAKgrM,mBACLhrM,KAAKsvM,aAGT,kBACI,IAAIsC,EAAY5xM,KAAK6xM,WAQrB,OAPKD,IACDA,EAAY5xM,KAAK6xM,WAAa,IAAI,EAAK90F,MAAM,CACzCqyE,QAAS,IAEbpvL,KAAKunM,aAAavnM,KAAK6xM,aAGpBD,EAGX,YAAYE,GACR,MAAMpyM,EAAUM,KAAKN,QACfqyM,EAAU/xM,KAAK+xM,UACfX,EAAS1xM,EAAQswM,OAAOoB,OACxBY,EAAYtyM,EAAQ2wM,WAAWjkC,QAAU1sK,EAAQsyM,UAAY,EAC7DC,EAAkB,CAGpBxG,SAAU/rM,EAAQ+rM,UAGtB,SAASzlB,EAAOksB,EAAexC,EAAayC,GACxC,MAAMv8K,EAAQs8K,EAAcpxM,OACtBsyB,EAAO7pB,KAAKqS,IAAI,EAAG8zL,EAAYt8K,MAErC,GAAIs8K,EAAYtjC,QACZ,IAAK,IAAI1rK,EAAIgvM,EAAY1uL,KAAMtgB,EAAIk1B,EAAOl1B,GAAK0yB,EACvC,GAAQ++K,IAAczxM,EAAIyxM,GAAa,IAI3CF,EAAgBtC,MAAQyB,EAASW,EAAQpgC,GAAKogC,EAAQpgC,GAAK+9B,EAAY93L,KACvEq6L,EAAgBrC,MAAQwB,EAASW,EAAQrgC,GAAKg+B,EAAY93L,KAAOm6L,EAAQrgC,GACzEugC,EAAgBnuK,SAAWouK,EAAcxxM,GAEzCoxM,EAAUz3E,OAAOo1E,GAAewC,EAAiBvC,KAK7D1pB,EAAOhmL,KAAKoyM,wBAAyB1yM,EAAQ2wM,YAC7CrqB,EAAOhmL,KAAKqyM,wBAAyB3yM,EAAQywM,WAAY6B,EAAYtyM,EAAQ4yM,WAGjF,aACI,MAAM5yM,EAAUM,KAAKN,QACfmuC,EAAOnuC,EAAQmuC,KACfkkK,EAAU/xM,KAAK+xM,UAErB,GAAIlkK,EAAKuC,MAAQ,GAAKvC,EAAKu+H,QAAS,CAChC,MAAMluK,EAAO,IAAI,EAAKmtL,KAAK,CACvB1e,OAAQ,CACJv8H,MAAOvC,EAAKuC,MACZs7H,MAAO79H,EAAK69H,MACZ0d,SAAUv7I,EAAKu7I,YAQvBlrL,EAAKi6K,OAAO45B,EAAQtgC,GAAIsgC,EAAQrgC,IAC3B+F,OAAOs6B,EAAQpgC,GAAIogC,EAAQngC,IAE5BlyK,EAAQ6yM,aACR7R,GAAiBxiM,GAGrB,MAAMq5B,EAAQv3B,KAAKwyM,WAAa,IAAI,EAAKz1F,MACzCxlF,EAAM8iG,OAAOn8H,GAEb8B,KAAKksL,OAAO7xD,OAAO9iG,GACnBv3B,KAAKyyM,YAAYl7K,IAIzB,oBACI,MAAM73B,EAAUM,KAAKN,QACrB,IAAIgzM,EAAW,EAUf,OARIhzM,EAAQ2wM,WAAWjkC,SAAW1sK,EAAQywM,WAAW/jC,QACjDsmC,EAAWnpM,KAAKqS,IAAIlc,EAAQ2wM,WAAWz4L,KAAMlY,EAAQywM,WAAWv4L,MACzDlY,EAAQ2wM,WAAWjkC,QAC1BsmC,EAAWhzM,EAAQ2wM,WAAWz4L,KACvBlY,EAAQywM,WAAW/jC,UAC1BsmC,EAAWhzM,EAAQywM,WAAWv4L,MAG3B86L,EAGX,mBACI,MAAM,QAAEhzM,EAAO,IAAE46K,GAAQt6K,KACnB4pM,EAAalqM,EAAQkqM,WAEvBA,IACA5pM,KAAK2yM,gBAAkB,EAAKtnB,KAAKye,SAASxvB,EAAIyvB,SAAU,CACpDjsM,KAAM,CACF4tK,MAAOk+B,GAEXj9B,OAAQ,OAGZ3sK,KAAKksL,OAAO7xD,OAAOr6H,KAAK2yM,kBAIhC,kBACI,MAAMjzM,EAAUM,KAAKN,QACfkzM,EAAYlzM,EAAQkzM,WAAa,GACjCnH,EAAW/rM,EAAQ+rM,SACnBoH,EAAW7yM,KAAK6yM,SAEtB,GAAyB,IAArBD,EAAU9xM,OACV,OAGJ,MAAMy2B,EAAQv3B,KAAK8yM,eAAiB,IAAI,EAAK/1F,MAAM,CAC/CqyE,QAAS,IAGP2jB,EAAUnQ,GAAK5iM,KAAKgzM,KAAKC,KAAMt3B,GAAQA,EAAKj8K,QAAQ+rM,WAAazrM,KAAKN,QAAQ+rM,UAAU,GAE9F,IAAK,IAAIv+J,EAAM,EAAGA,EAAM0lK,EAAU9xM,OAAQosC,IAAO,CAC7C,IACIgmK,EAAOC,EAEPr0E,EAHA7+E,EAAO2yJ,EAAU1lK,GAEjB2jK,EAAe5wJ,EAAK6+E,MA0BxB,GAvBI2sE,GACAyH,GAASH,GAAWF,EAASxB,OAAOU,UACpCoB,EAAQnzM,KAAKozM,QAAQnzJ,EAAKj3C,KAAMi3C,EAAKh3C,IAAI,KAEzCiqM,EAAQlzM,KAAKozM,QAAQnzJ,EAAKj3C,KAAMi3C,EAAKh3C,IAAI,GACzCkqM,GAASJ,GAAWF,EAASvB,OAAOS,WAGpClB,IACAA,EAAatH,OAASsH,EAAa/sK,UAAYmiI,GAC/CnnC,EAAQ9+H,KAAKqzM,oBACTxC,EACA5wJ,EACA,IAAI,GACAizJ,EAAMzhC,GACN0hC,EAAMzhC,GACNwhC,EAAMvhC,GACNwhC,EAAMvhC,MAMI,IAAlBshC,EAAM9iK,SAAoC,IAAnB+iK,EAAMtpC,SAAgB,CAC7C,MAAMypC,EAAW,IAAI,EAAKhoB,KACtB,CAAE4nB,EAAMzhC,GAAI0hC,EAAMzhC,IAClB,CAAEwhC,EAAM9iK,QAAS+iK,EAAMtpC,WAGrB3rK,EAAO,EAAKmtL,KAAKye,SAASwJ,EAAU,CACtCx1M,KAAM,CACF4tK,MAAOzrH,EAAKyrH,MACZoC,QAAS7tH,EAAK6tH,SAElBnB,OAAQ,OAGZp1I,EAAM8iG,OAAOn8H,GACT4gI,GACAvnG,EAAM8iG,OAAOyE,IAKzB9+H,KAAKunM,aAAahwK,GAGtB,oBAAoBunG,EAAO7+E,EAAMq6H,GAE7B,IAAsB,IAAlBx7C,EAAMstC,QACN,OAAO,KAGX,IACImnC,EADAvvH,EAAO86C,EAAM96C,KAGjB,GAAI,GAAQ86C,IAAUA,EAAMstC,QAAS,CACjC,MAAMonC,EAAgBhR,GAAY1jE,GAC9B00E,EACAxvH,EAAOwvH,EAAc,CAAExvH,KAAMA,EAAM/jC,KAAMA,IAClC6+E,EAAM30H,SACb65E,EAAOhkF,KAAKgnM,aAAa78L,OAAO6kM,KAAKlwE,EAAM30H,OAAQ65E,IAGlD86C,EAAM4sC,QACP5sC,EAAM4sC,MAAQ1rK,KAAKN,QAAQswM,OAAOtkC,OAQ1C,OAJA6nC,EAAU,IAAI,GAAQvvH,EAAM86C,GAC5By0E,EAAQ1M,OAAOvsB,GACfi5B,EAAQ/L,eAED+L,EAAQrnB,OAGnB,gBAAgB6mB,GACZ,MAAMrzM,EAAUM,KAAKN,SACf,eAAE+zM,EAAc,eAAEC,EAAc,UAAEpB,EAAS,SAAE7G,GAAa/rM,EAC1Di0M,EAAkBZ,EAAQrzM,QAAQmuC,KAAKu+H,QACvC4lC,EAAY0B,EAAetnC,QAAU1sK,EAAQsyM,UAAY,EACzDD,EAAUgB,EAAQhB,UAClB6B,EAAU7B,EAAQtG,EAAW,KAAO,MACpCoI,EAAc,CAChB1E,UAAW4C,EAAQtG,EAAW,KAAO,MACrCsE,QAASgC,EAAQtG,EAAW,KAAO,MACnCA,SAAUA,GAER4E,EAAa,GAEbj2H,EAAYp6E,KAAK8zM,kBAEvB,SAAS9tB,EAAOksB,EAAepC,EAAUqC,GACrC,MAAMv8K,EAAQs8K,EAAcpxM,OACtBsyB,EAAO7pB,KAAKqS,IAAI,EAAGk0L,EAAS18K,MAElC,GAAI08K,EAAS1jC,QACT,IAAK,IAAI1rK,EAAIovM,EAAS9uL,KAAMtgB,EAAIk1B,EAAOl1B,GAAK0yB,EAAM,CAC9C,IAAI0zF,EAAM,GAAMorF,EAAcxxM,IACzBuzC,GAAQ6yE,EAAKupF,IACV3vM,EAAIyxM,GAAa,GAAOwB,GAAmBC,IAAY9sF,IACvD+sF,EAAY/vK,SAAWgjF,EACvB1sC,EAAUigD,OAAOw1E,GAAmBgE,EAAa/D,IAEjDO,EAAWhtM,KAAKyjH,KAUpC,OAHAk/D,EAAOhmL,KAAKoyM,wBAAyBsB,GACrC1tB,EAAOhmL,KAAKqyM,wBAAyBoB,EAAgBzB,EAAYM,GAE1Dl4H,EAAUhpC,SAGrB,OAAOkpI,GACH,MAAM,QAAE56K,EAAO,OAAEswM,EAAM,MAAEt3F,GAAU14G,KAC7ByrM,EAAW/rM,EAAQ+rM,SACnB71K,EAAQo6K,EAAOlvM,OACfizM,EAAStI,EtNlbF,QAnBC,SsNscRuI,EAAYt7F,EAAQA,EAAM4hE,IAAIy5B,KAAY,EAC1CE,EAAQj0M,KAAKk0M,oBAAsBx0M,EAAQupM,OAAS+K,EAEpDG,IADWn0M,KAAK8mM,WAAa,IAAIxsB,KAAOA,GACtBy5B,KACxB,IAAIK,EAAe,EAEnB,IAAK,IAAI1zM,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,IAAI2zM,EAAYrE,EAAOtvM,GAAG45K,IAAIy5B,KAC1BM,EAAYJ,GAASE,IACrBC,EAAe7qM,KAAKqS,IAAIw4L,EAAcC,IAK1Cr0M,KAAKs6K,IADLmxB,EACW,IAAI,GACXnxB,EAAI7I,GAAI6I,EAAI5I,GACZ4I,EAAI7I,GAAK2iC,EAAeH,EAAO35B,EAAI1I,IAG5B,IAAI,GACX0I,EAAI7I,GAAI6I,EAAI5I,GACZ4I,EAAI3I,GAAI2I,EAAI5I,GAAK0iC,EAAeH,GAIxCj0M,KAAKs0M,eACLt0M,KAAKu0M,gBACLv0M,KAAKw0M,eAGT,yBACI,OAAOx0M,KAAKoyM,wBAGhB,eAAetzE,GACX,OAAOA,EAAM9qH,MAGjB,gBACI,MAAM,QAAEtU,EAAO,OAAEswM,GAAWhwM,KACtBy0M,EAAqBz0M,KAAKy0M,qBAC1BhJ,EAAW/rM,EAAQ+rM,SACnB2F,EAAS1xM,EAAQswM,OAAOoB,OACxBc,EAAgBlyM,KAAK00M,yBAE3B,IAAK,IAAIxnK,EAAM,EAAGA,EAAM8iK,EAAOlvM,OAAQosC,IAAO,CAC1C,MAAM4xF,EAAQkxE,EAAO9iK,GACfynK,EAAS30M,KAAK40M,eAAe91E,GAC7Bu1E,EAAY5I,EAAW3sE,EAAMw7C,IAAIzQ,SAAW/qC,EAAMw7C,IAAIlqI,QACtDykK,EAAoB3C,EAAcyC,GAClCG,EAAmB5C,EAAcyC,EAAS,GAChD,IAAII,EAAeC,EAEfvJ,GAGIsJ,EAFAN,EACeI,GAAqBC,EAAmBD,GAAqB,EAClDR,EAAY,EAEtBQ,EAAqBR,EAAY,EAGrDW,EAAcD,GAEVN,GACAM,EAAgBF,EAChBG,EAAcF,IAEdC,EAAgBF,EAAqBR,EAAY,EACjDW,EAAcD,EAAgBV,GAItCr0M,KAAKi1M,cAAcn2E,EAAOsyE,EAAQ2D,EAAeC,IAIzD,cAAcl2E,EAAOsyE,EAAQ2D,EAAeC,EAAcD,GACtD,MAAMr1M,EAAUM,KAAKN,QACf+rM,EAAW/rM,EAAQ+rM,SACnBsG,EAAU/xM,KAAK+xM,UACfmD,EAAcl1M,KAAKk0M,oBAAsBx0M,EAAQupM,OACvD,IAAIkM,EAEJ,GAAI1J,EAAU,CACV,IAAI2J,EAASrD,EAAQpgC,GAEjBy/B,GACAgE,GAAUF,EACVp2E,EAAMp/H,QAAQ2uM,eAAiBpoC,KAE/BmvC,GAAUF,EAAcp2E,EAAMw7C,IAAIlqI,QAClC0uF,EAAMp/H,QAAQ2uM,eAAiBjoC,IAGnC+uC,EAAWr2E,EAAMw7C,IAAIpwD,KAAKkrF,EAAQL,OAC/B,CACH,IAAIM,EAAStD,EAAQrgC,GAEjB0/B,GACAiE,GAAUH,EAAcp2E,EAAMw7C,IAAIzQ,SAClC/qC,EAAMp/H,QAAQ2uM,eAAiBzoC,KAE/ByvC,GAAUH,EACVp2E,EAAMp/H,QAAQ2uM,eAAiBhoC,IAGnC8uC,EAAW,IAAI,GACXJ,EAAeM,EACfL,EAAaK,EAASv2E,EAAMw7C,IAAIzQ,UAIxC/qC,EAAM+nE,OAAOsO,GAGjB,qBAAqBA,EAAUG,GAC3B,OAAIH,EAAS/kK,QAAUklK,EACZ,EAGPH,EAAStrC,SAAWyrC,GACZ,IAGJ,GAGZ,mBACI,IAAKt1M,KAAKN,QAAQsxM,kBAAoBhxM,KAAKN,QAAQ+rM,SAC/C,OAAO,EAGX,MAAMyG,EAAgBlyM,KAAKoyM,wBACrBpC,EAAShwM,KAAKgwM,OACdluK,EAAQv4B,KAAKC,IAAIwmM,EAAOlvM,OAAQoxM,EAAcpxM,OAAS,GAC7D,IAAIg2C,EAAQ,EAEZ,IAAK,IAAI5J,EAAM,EAAGA,EAAMpL,EAAOoL,IAAO,CAClC,MAAMkD,EAAQ7mC,KAAK+mC,IAAI4hK,EAAchlK,EAAM,GAAKglK,EAAchlK,IAI9D,GAFA4J,EAAQ92C,KAAKu1M,qBADIvF,EAAO9iK,GAAKotI,IACelqI,IAE7B,KAAX0G,EACA,MAIR,GAAc,IAAVA,EAAa,CACb,IAAK,IAAI5J,EAAM,EAAGA,EAAM8iK,EAAOlvM,OAAQosC,IACnC8iK,EAAO9iK,GAAKxtC,QAAQo4C,SAAWhB,EAC/Bk5J,EAAO9iK,GAAK25J,OAAO,IAAI,IAG3B,OAAO,GAIf,eACI,MAAM,QAAEnnM,EAAO,MAAEg5G,GAAU14G,KACrBoxM,EAAS1xM,EAAQswM,OAAOoB,OAG1B14F,IAFah5G,EAAQ+rM,UAIjB/yF,EAAMh5G,QAAQg8K,MAAQ01B,EAAShrC,GAAQH,GACvCvtD,EAAMh5G,QAAQ6pM,OAAS7wF,EAAMh5G,QAAQokC,WAErC40E,EAAMh5G,QAAQg8K,MAAQhjE,EAAMh5G,QAAQokC,SACpC40E,EAAMh5G,QAAQ6pM,OAAS6H,EAAS/qC,GAAMT,IAG1CltD,EAAMmuF,OAAO7mM,KAAKs6K,MAI1B,eACI,IAAK,IAAIptI,EAAM,EAAGA,EAAMltC,KAAKwxM,MAAM1wM,OAAQosC,IAAO,CAC9C,MAAM+S,EAAOjgD,KAAKwxM,MAAMtkK,GAClB7hC,EAAQ40C,EAAKvgD,QAAQ2L,MAC3B,IAAImqM,EAEA,GAAQnqM,IACJrL,KAAKy1M,iBAAiBpqM,GACtB40C,EAAKkoJ,OAELloJ,EAAKy1J,OAGTF,EAAOx1M,KAAK21M,SAAStqM,IAErB40C,EAAKy1J,OAGTz1J,EAAK4mJ,OAAO2O,GAAQx1M,KAAK+xM,YAIjC,SAAS1mM,GACL,OAAOrL,KAAKozM,QAAQ/nM,GAGxB,QAAQuqM,GACJ,MAAM7D,EAAU6D,EAAW7D,UACrBtG,EAAWzrM,KAAKN,QAAQ+rM,SACxB3kF,EAAM2kF,EAAWhlC,GAAID,GAE3BxmK,KAAKs6K,IAAIyzB,OAAOgE,EAASjrF,GACrB2kF,EACAzrM,KAAKs6K,IAAIoqB,OAAO,EAAG1kM,KAAK+xM,UAAUloC,SAAWkoC,EAAQloC,UAErD7pK,KAAKs6K,IAAIoqB,OAAO1kM,KAAK+xM,UAAU3hK,QAAU2hK,EAAQ3hK,QAAS,GAE9DpwC,KAAKs6K,IAAIxzD,EAAM,IAAM9mH,KAAK+xM,UAAUjrF,EAAM,GAAKirF,EAAQjrF,EAAM,GAC7D9mH,KAAKs6K,IAAIxzD,EAAM,IAAM9mH,KAAK+xM,UAAUjrF,EAAM,GAAKirF,EAAQjrF,EAAM,GAGjE,cAAcz7G,EAAO3L,EAAS4Y,GAC1B,IAAI0rE,EACJ,MAAM6xH,EAAOrT,GAAY9iM,GACnBo2M,EAAc,IACXp2M,EAAQyK,OAINnK,KAAKgnM,aAAa78L,OAAO4rM,WAC5Br2M,EAAQyK,OAAQ,CAAEkB,GAAS3L,EAAQ8kI,SAJ5Bn5H,EAqBf,OALI24E,EARA6xH,EAQOA,EAPiBz2M,OAAOu8B,OAAO,GAAIrjB,EAAS,CAC/C,WAAa,OAAOw9L,KACpBzqM,MAAAA,EACAlB,OAAQzK,EAAQyK,OAChBq6H,QAAS9kI,EAAQ8kI,WAKdsxE,IAGJ9xH,EAGX,KAAKh7E,EAAOC,EAAI64B,GACZ,MAAM0zK,EAAOx1M,KAAKozM,QAAQpqM,EAAMC,EAAI64B,GACpC,GAAI0zK,EACA,OAAOA,EAAKzL,SAIpB,aACI,MAAMzvB,EAAMt6K,KAAKs6K,IAAIjkJ,QACf25K,EAAShwM,KAAKgwM,OACpB,GAAIA,EAAOlvM,OAAQ,CACf,MAAM66K,EAAO37K,KAAKN,QAAQ+rM,SAAWhlC,GAAID,GACzC,GAAIxmK,KAAKgnM,aAAagP,WAAWr6B,GAAO,CACpC,MAAM5mK,EAAS/U,KAAKi2M,iBACpB37B,EAAIqB,EAAO,IAAM5mK,EAAOxR,MACxB+2K,EAAIqB,EAAO,IAAM5mK,EAAO1N,QACrB,CACC2oM,EAAO,GAAGtwM,QAAQ0sK,SAClBkO,EAAIt3I,KAAKgtK,EAAO,GAAG11B,KAEvB,MAAM47B,EAAYlG,EAAOA,EAAOlvM,OAAS,GACrCo1M,EAAUx2M,QAAQ0sK,SAClBkO,EAAIt3I,KAAKkzK,EAAU57B,MAK/B,OAAOA,EAGX,iBACI,MAAM,SAAEmxB,EAAQ,QAAEtvL,GAAYnc,KAAKN,QAC7B+0M,EAAqBz0M,KAAKy0M,qBAC1BvC,EAAgBlyM,KAAK00M,yBACrByB,EAAc1K,EAAWhlC,GAAID,GAC7BwpC,EAAShwM,KAAKgwM,OACdoG,EAAgBj6L,EAAU,EAAI,EAC9Bk6L,EAAcl6L,EAAU,EAAI,EAClC,IAAIm6L,EAAiB,EACjBC,EAAe,EAEnB,IAAK,IAAIrpK,EAAM,EAAGA,EAAM8iK,EAAOlvM,OAAQosC,IAAO,CAC1C,MAAM4xF,EAAQkxE,EAAO9iK,GACfynK,EAAS30M,KAAK40M,eAAe91E,GACnC,IAAI03E,EAAWC,EAEXhC,GACA+B,EAAYtE,EAAcyC,EAASyB,GACnCK,EAAUvE,EAAcyC,EAAS0B,IAEjCG,EAAYC,EAAUvE,EAAcyC,GAGxC2B,EAAiB/sM,KAAKqS,IAAI06L,EAAgBE,EAAY13E,EAAMw7C,IAAI67B,EAAc,IAC9EI,EAAehtM,KAAKqS,IAAI26L,EAAcz3E,EAAMw7C,IAAI67B,EAAc,GAAKM,GAGvE,MAAO,CACHlzM,MAAO+yM,EACPjvM,IAAKkvM,GAIb,WAAWvtM,EAAMC,EAAIO,EAAKoS,EAAK7G,GAC3B,MAAMrV,EAAUM,KAAKN,QAErB,GAAKsJ,EAAOQ,GAAOuL,EAAS,KAAO,GAAQrV,EAAQ8J,MAAQ9J,EAAQ8J,KAAOA,IAAUoS,EAAM3S,GAAM8L,EAAS,KAAO,GAAQrV,EAAQkc,MAAQA,GAAOlc,EAAQkc,KACnJ,OAAO,KAGX,GAAK3S,EAAKO,GAAOuL,EAAS,GAAO6G,EAAM5S,GAAQ+L,EAAS,EACpD,MAAO,CACHvL,IAAKR,EACL4S,IAAK3S,GAIb,MAAMytM,EAAYztM,EAAKD,EACvB,IAAI2tM,EAAW3tM,EACX4tM,EAAW3tM,EAUf,OARID,EAAOQ,GAAOuL,EAAS,GACvB4hM,EAAW,GAAW3tM,EAAMQ,EAAKoS,GACjCg7L,EAAW,GAAW5tM,EAAO0tM,EAAWltM,EAAMktM,EAAW96L,IAClD3S,EAAK2S,GAAO7G,EAAS,IAC5B6hM,EAAW,GAAW3tM,EAAIO,EAAKoS,GAC/B+6L,EAAW,GAAW1tM,EAAKytM,EAAWltM,EAAKoS,EAAM86L,IAG9C,CACHltM,IAAKmtM,EACL/6L,IAAKg7L,GAIb,aACI,MAAO,CACHptM,IAAKxJ,KAAK62M,UACVj7L,IAAK5b,KAAK82M,WAIlB,qBACI,OAAQ92M,KAAKN,QAAQq3M,UAIzB,uBAIJnT,GAAkB,GAAM,CACpBoM,OAAQ,CACJ5jC,SAAS,EACTt0H,SAAU,EACVs5J,QAAQ,EACRh+K,KAAM,EACNpS,KAAM,GAEV6sB,KAAM,CACFuC,MAAO,EACPs7H,MAAO/F,GACPyG,SAAS,GAEb1zD,MAAO,CACH0zD,SAAS,EACTtoI,SAAU+hI,IAEdwqC,WAAY,CACR30B,MtNjzBe,UsNkzBf9jK,KAAM,EACNoJ,KAAM,EACNoS,KAAM,GAEV+8K,WAAY,CACRz0B,MtNvzBe,UsNwzBf9jK,KAAM,EACNoJ,KAAM,EACNoS,KAAM,GAEV4jL,kBAAmB,EACnB1G,ctN7zBmB,UsN8zBnBF,ctNn0BgB,OsNo0BhBsD,eAAgB,CACZ1yL,KAAM,EACNoS,KAAM,GAEVqgL,eAAgB,CACZrnC,SAAS,EACTh8H,MAAO,EACPs7H,MAAO/F,GACP3kJ,KAAM,EACNoS,KAAM,GAGV61K,OAAQ,EACR78B,SAAS,EACTjwJ,SAAS,EACT46L,WAAW,EACXvF,MAAO,CACH1yE,MAAO,CACH96C,KAAM,KAIduuH,aAAa,EACb/B,cAAc,IAGH,IAAA,GAAA,GCn3BR,MAIMyG,GAAO,OAGPC,GAAQ,QAURC,GAAgB,CACzB,MAFyB,QAGzB,OAJ0B,QAK1B,MANyB,OAOzB,KARwB,MASxB,MAVyB,KAWzB,QAZ2B,IAa3B,QAd2B,IAe3B,aAhBgC,GCPrB,SAASC,GAAiBn4M,EAAGC,GAIxC,OAHaD,EAAEiiH,UAAYhiH,EDQA,KCPRD,EAAE+hH,oBAAsB9hH,EAAE8hH,qBCJlC,SAASq2F,GAAS33F,EAAM43F,GACnC,OAAO,IAAI7+L,KAAKinG,EAAKwB,UAAYo2F,GCDtB,SAAS,GAAOjsM,GAC3B,IAAI3D,EAQJ,OANI2D,aAAiBoN,KACjB/Q,EAAS2D,EACFA,IACP3D,EAAS,IAAI+Q,KAAKpN,IAGf3D,ECHX,SAAS6vM,GAAU73F,EAAMtB,GACrB,OAAc,IAAVA,GAAmC,KAApBsB,EAAKjxE,aACpBixE,EAAKS,SAAST,EAAKjxE,WAAa,IACzB,GAgBA,SAAS+oK,GAAYC,EAAWpsM,EAAOwhH,EAAM6qF,GACxD,IAAIhwM,EAAS+vM,EAEb,GAAIA,EAAW,CACX,IAAI/3F,EAAO,GAAO+3F,GAClB,MAAMr5F,EAAQsB,EAAKjxE,WAEfo+E,IAASqqF,IACTxvM,EAAS,IAAI+Q,KAAKinG,EAAKyC,cAAgB92G,EAAO,EAAG,GACjDksM,GAAU7vM,EAAQ,IJ5BR,WI6BHmlH,GACPnlH,EAAS,IAAI+Q,KAAKinG,EAAKyC,cAAezC,EAAK7wE,WAAaxjC,EAAO,GAC/DksM,GAAU7vM,EAAQ02G,IJhCT,UIiCFyO,GACPnlH,EAAS8vM,GCpCN,SAAqB93F,EAAMg4F,EAAe,GACrD,IAAIC,EAAiB,EACjBC,EAAMl4F,EAAK2C,SAEf,IAAKr9E,MAAM4yK,GACP,KAAOA,IAAQF,GACC,IAARE,EACAA,EAAM,EAENA,IAGJD,IAIR,OAAON,GAAS33F,ELNQ,OKMDi4F,GAhBZ,CDoC8Bj4F,EAAMg4F,GAAuB,EAARrsM,EAAW4rM,IACjEM,GAAU7vM,EAAQ02G,IACXyO,IAASoqF,IAChBvvM,EAAS,IAAI+Q,KAAKinG,EAAKyC,cAAezC,EAAK7wE,WAAY6wE,EAAK9wE,UAAYvjC,GACxEksM,GAAU7vM,EAAQ02G,IJxCT,UIyCFyO,EACPnlH,EA9BZ,SAAkBg4G,EAAMtB,GACpB,MAAMy5F,EAAc,IAAIp/L,KAAKinG,GAE7Bm4F,EAAY12F,WAAW,EAAG,EAAG,GAE7B,MAAM22F,EJTqB,KISXp4F,EAAKsB,oBAAsB62F,EAAY72F,qBAEvD,OAAOq2F,GAASQ,EAAaC,EJVJ,KIUa15F,GAP1C,CA8B8BsB,EAAMr0G,GJ3Cb,YI4CJwhH,GACPnlH,EAAS2vM,GAAS33F,EJpCC,IIoCKr0G,GAEpB3D,EAAOinC,aAAe,GACtBjnC,EAAOqwM,WAAW,IJjDX,YImDJlrF,EACPnlH,EAAS2vM,GAAS33F,EJ3CC,II2CKr0G,GJrDR,iBIsDTwhH,IACPnlH,EAAS2vM,GAAS33F,EAAMr0G,IJvDR,iBI0DhBwhH,GAAyBnlH,EAAO06G,kBAAoB,GACpD16G,EAAOswM,gBAAgB,GAI/B,OAAOtwM,EE5DI,SAASuwM,GAAUv4F,EAAMmN,EAAM6qF,GAC1C,OAAOF,GAAY,GAAO93F,GAAO,EAAGmN,EAAM6qF,GCA/B,SAASQ,GAAST,EAAW5qF,EAAM6qF,GAC9C,MAAMh4F,EAAO,GAAO+3F,GAEpB,OAAI/3F,GAAQu4F,GAAUv4F,EAAMmN,EAAM6qF,GAAcx2F,YAAcxB,EAAKwB,UACxDxB,EAGJ83F,GAAY93F,EAAM,EAAGmN,EAAM6qF,GCXvB,SAASS,GAAal5M,EAAGC,GACpC,OAAID,GAAKC,EACED,EAAEiiH,UAAYhiH,EAAEgiH,WAGnB,ECLG,SAASk3F,GAASn5M,EAAGC,GAChC,OAAOD,EAAEiiH,UAAYhiH,ECEV,SAASm5M,GAAOhtM,GAC3B,GAAI,GAAQA,GAAQ,CAChB,IAAI3D,EAAS,GACb,IAAK,IAAIwlC,EAAM,EAAGA,EAAM7hC,EAAMvK,OAAQosC,IAClCxlC,EAAOrE,KAAKg1M,GAAOhtM,EAAM6hC,KAG7B,OAAOxlC,EACJ,GAAI2D,EACP,OAAO,GAAOA,GAAO61G,UCVd,SAASo3F,GAAWr5M,EAAGC,GAClC,OAAID,GAAKC,EACEm5M,GAAOp5M,KAAOo5M,GAAOn5M,GAGzBD,IAAMC,ECFjB,SAASq5M,GAAU74F,EAAMn8G,EAAOi1M,GAC5B,OAAOpB,GAAiB13F,EAAMn8G,GAAS4zM,GAAcqB,GAG1C,SAASC,GAAUptM,EAAO9H,EAAOi1M,EAAUE,GACtD,MAAMh5F,EAAO,GAAOr0G,GACdstM,EAAY,GAAOp1M,GACzB,IAAIyQ,EAaJ,OAVIA,EZTc,WYQdwkM,EACS94F,EAAK7wE,WAAa8pK,EAAU9pK,WAA8D,IAAhD6wE,EAAKyC,cAAgBw2F,EAAUx2F,eAC9Eo2F,GAAU74F,EAAM,IAAIjnG,KAAKinG,EAAKyC,cAAezC,EAAK7wE,YAAaooK,IAAQ,IAAIx+L,KAAKinG,EAAKyC,cAAezC,EAAK7wE,WAAa,EAAG,GAAGD,UACzH4pK,IAAatB,GACZx3F,EAAKyC,cAAgBw2F,EAAUx2F,cAAgBs2F,GAAU/4F,EAAM,IAAIjnG,KAAKinG,EAAKyC,cAAe,GZZtF,SYYkG,GAAK,GAC9Gq2F,IAAavB,IZdP,UYceuB,EACpBD,GAAU74F,EAAMi5F,EAAWH,GAE3BJ,GAAS14F,EAAMn8G,GAAS4zM,GAAcqB,GAG3CxkM,EAAQ0kM,ECtBJ,SAAS,GAASz5M,EAAGC,EAAG2tH,GACnC,IAAIjJ,EAYJ,OATIA,EADAiJ,IAASqqF,GACFh4M,EAAEijH,cAAgBljH,EAAEkjH,cbDb,WaEP0K,EACwB,GAAxB,GAAS5tH,EAAGC,EAAGg4M,IAAch4M,EAAE2vC,WAAa5vC,EAAE4vC,WAC9Cg+E,IAASoqF,GACT1tM,KAAK2R,MAAMk9L,GAASl5M,EAAGD,GbEV,OaAbsK,KAAK2R,MAAMk9L,GAASl5M,EAAGD,GAAKk4M,GAActqF,IAG9CjJ,ECbI,SAAS89E,GAAUM,EAAatiF,GAC3C,IAAIh4G,EAMJ,OAJIA,EADAe,GAASi3G,IACAsiF,EAAYN,UAAUhiF,IAEtB,GAAOA,GAEbh4G,ECNI,SAASkxM,GAAW5W,EAAa6W,GAC5C,GAAI,GAAQA,GAAQ,CAChB,MAAMnxM,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM2rK,EAAM/3M,OAAQosC,IAClCxlC,EAAOrE,KAAKq+L,GAAUM,EAAa6W,EAAM3rK,KAG7C,OAAOxlC,EAGX,OAAOg6L,GAAUM,EAAa6W,GCZnB,SAAS,GAASn5M,EAASsiM,GACtC,OAAI9mK,GAASx7B,EAAQg4M,cACVh4M,EAAQg4M,aAGf1V,GAAeA,EAAYL,SACpBK,EAAYL,WAGhB,ECaX,MAAM,WAAqB,GACvB,aACI3hM,KAAK84M,OAAS,GAGlB,iBACI,MAAO,GAGX,QACI,MAAMj7M,EAAO,IAAI,GAAauB,OAAOu8B,OAAO,GAAI37B,KAAKN,QAAS,CAC1Dq5M,WAAY/4M,KAAKN,QAAQs5M,gBACzBh5M,KAAKgnM,cAGT,OAFAnpM,EAAK4yM,eAEE5yM,EAGX,gBAAgB6B,GACZ,MAAMq5M,EAAar5M,EAAQq5M,YAAc,GACnCE,EAAa,GAAQv5M,EAAQ8J,KAC7B0vM,EAAa,GAAQx5M,EAAQkc,KAGnC,GAFAlc,EAAQs5M,cAAgBt5M,EAAQq5M,WAAaA,GAExCE,GAAcC,IAAeH,EAAWj4M,OAAQ,CACjD,MAAM0I,EAAMyvM,EAAa1vM,KAAK2R,MAAMxb,EAAQ8J,KAAO,EACnD,IAAIoS,EAGAA,EADAs9L,EACMx5M,EAAQq3M,UAAYxtM,KAAK2R,MAAMxb,EAAQkc,KAAO,EAAIrS,KAAKyR,KAAKtb,EAAQkc,KAEpEm9L,EAAWj4M,OAGrBpB,EAAQq5M,WAAar5M,EAAQq5M,WAAW70M,MAAMsF,EAAKoS,GAGvD,OAAOlc,EAGX,eACI,MAAMA,EAAUM,KAAKN,QACfoB,EAASpB,EAAQq5M,WAAWj4M,QAAU,EACtC0I,EAAM0xB,GAASx7B,EAAQ8J,KAAO9J,EAAQ8J,IAAM,EAAI,EACtD,IAAIoS,EAQJ,OALIA,EADAsf,GAASx7B,EAAQkc,MAAQlc,EAAQkc,IAAM,GAAM,GAAKlc,EAAQkc,IAAM5b,KAAKm5M,aAAav9L,IAC5E9a,GAAU,EAAIpB,EAAQkc,IAAM,GAE5B9a,GAAUpB,EAAQq3M,UAAY,EAAI,GAGrC,CACHvtM,IAAKA,EACLoS,IAAKA,GAIb,kBAAkBkmB,GACd,MAAMpiC,EAAUM,KAAKN,QACrB,IACIkc,EADApS,EAAM0xB,GAASx7B,EAAQ8J,KAAO9J,EAAQ8J,IAAM,EAWhD,GAPIoS,EADAsf,GAASx7B,EAAQkc,KACXlc,EAAQkc,IACPsf,GAASx7B,EAAQ8J,KAClBA,EAAM9J,EAAQq5M,WAAWj4M,OAEzBd,KAAKm5M,aAAav9L,KAAO,EAG/BkmB,EAAO,CACP,MAAMq3K,EAAan5M,KAAKm5M,aACxB3vM,EAAM,GAAWA,EAAK,EAAG2vM,EAAWv9L,KACpCA,EAAM,GAAWA,EAAK,EAAGu9L,EAAWv9L,KAGxC,MAAO,CACHpS,IAAKA,EACLoS,IAAKA,GAIb,QACI,MAAMlc,EAAUM,KAAKN,QAIrB,MAAO,CACH8J,IAJQ0xB,GAASx7B,EAAQ8J,KAAO9J,EAAQ8J,IAAM,EAK9CoS,IAJQsf,GAASx7B,EAAQkc,KAAOlc,EAAQkc,IAAM5b,KAAKm5M,aAAav9L,KAQxE,eACI,OAAO5b,KAAKq+B,QAGhB,aACI,MAAM3+B,EAAUM,KAAKN,QACrB,MAAO,CAAE8J,IAAK,EAAGoS,IAAKrS,KAAKqS,IAAI5b,KAAKo5M,YAAc,EAAG15M,EAAQs5M,cAAcl4M,SAAWpB,EAAQq3M,UAAY,EAAI,IAGlH,eACI,MAAM,IAAEvtM,EAAG,IAAEoS,GAAQ5b,KAAKq5M,eACpBtH,EAAU/xM,KAAK+xM,UAIrB,MAAO,CACHl6J,OAJS73C,KAAKN,QAAQ+rM,SAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,UACzCx0B,EAAMpS,GAAQ,IAGjBxJ,KAAKN,QAAQyc,SAAW,EAAI,GAC5Cm+J,IAAKy3B,EACLvoM,IAAKA,EACLoS,IAAKA,GAIb,gBACIqrC,MAAMstJ,gBACNv0M,KAAKs5M,uBAGT,uBACI,MAAM,IAAEh/B,EAAG,OAAE01B,GAAWhwM,KAExB,GAAIgwM,EAAOlvM,OAAS,EAAG,CACnB,MAAMy4M,EAAYv5M,KAAKN,QAAQ+rM,SAAWhlC,GAAID,GACxCjjK,EAAQ+2K,EAAIi/B,EAAY,GACxBlyM,EAAMizK,EAAIi/B,EAAY,GACtBC,EAAaxJ,EAAO,GACpBkG,EAAY,GAAKlG,IAEnBwJ,EAAWl/B,IAAIi/B,EAAY,GAAKlyM,GAAOmyM,EAAWl/B,IAAIi/B,EAAY,GAAKh2M,KACvEi2M,EAAW95M,QAAQ0sK,SAAU,IAE7B8pC,EAAU57B,IAAIi/B,EAAY,GAAKlyM,GAAO6uM,EAAU57B,IAAIi/B,EAAY,GAAKh2M,KACrE2yM,EAAUx2M,QAAQ0sK,SAAU,IAKxC,wBACI,OAAOpsK,KAAKy5M,WAAWpJ,WAG3B,wBACI,OAAOrwM,KAAKy5M,WAAWtJ,WAG3B,yBACI,OAAOnwM,KAAKy5M,WAAWC,WAG3B,YAAYC,GACR,MAAM,IAAEnwM,EAAG,IAAEoS,GAAQ5b,KAAKq5M,eACpBv3K,EAAQv4B,KAAKyR,KAAKY,GACxB,IAAIvF,EAAU9M,KAAK2R,MAAM1R,GACzB,MAAMowM,EAAU,GAEhB,KAAOvjM,GAAWyrB,GACd83K,EAAQv2M,KAAKgT,GACbA,GAAWsjM,EAGf,OAAOC,EAGX,iBAAiBD,GACb,MAAM,SAAElO,EAAQ,QAAEtvL,GAAYnc,KAAKN,SAC7B,MAAEm4C,EAAK,IAAEyiI,EAAG,IAAE9wK,GAAQxJ,KAAK65M,eAC3B/yF,EAAMwzD,GAAKmxB,EAAWhlC,GAAID,KAAMrqJ,EAAU,EAAI,IAC9Cy9L,EAAU55M,KAAK85M,YAAYH,GAC3BI,EAAY,GAElB,IAAK,IAAI7sK,EAAM,EAAGA,EAAM0sK,EAAQ94M,OAAQosC,IACpC6sK,EAAU12M,KAAKyjH,EAAM,GAAMjvE,GAAS+hK,EAAQ1sK,GAAO1jC,GxOjMhC,IwOoMvB,OAAOuwM,EAGX,WACI,MAAMr6M,EAAUM,KAAKN,QACfoX,EAAQ9W,KAAK84M,OACbz6K,EAAQr+B,KAAKq5M,eACbtH,EAAU/xM,KAAK+xM,UACf/kK,EAAO+kK,EAAQiI,UAAY37K,EAAM70B,IAAM,IAAM60B,EAAMziB,IAAMlc,EAAQyc,QAAUzc,EAAQq3M,UAEzF,GAAIjgM,EAAMmjM,QAAUjtK,EAAM,CACtB,MAAMktK,EAAWx6M,EAAQywM,WAAW/jC,SAAW1sK,EAAQ+zM,eAAernC,QACtEt1J,EAAMmjM,MAAQjtK,EACdl2B,EAAM4iM,WAAa15M,KAAKm6M,iBAAiB,GACzCrjM,EAAMu5L,WAAarwM,KAAKo6M,0BAA0BtjM,EAAM4iM,WAAY3H,GACpEj7L,EAAMq5L,WAAa+J,EAAWl6M,KAAKo6M,0BAA0Bp6M,KAAKm6M,iBAAiB,IAAMpI,GAAW,GAGxG,OAAOj7L,EAGX,0BAA0BijM,EAAWhI,GACjC,IAAKgI,EAAUj5M,OACX,OAAOi5M,EAGX,MAAMp+B,EAAO37K,KAAKN,QAAQ+rM,SAAWhlC,GAAID,GACnChiI,EAAWV,GAAaiuK,EAAQp2B,EAAO,IAAM73I,GAAYA,GAAYiuK,EAAQp2B,EAAO,GAEpFt0K,EAAM0yM,EAAUj5M,OAAS,EAC/B,IAAIqsF,EAAa,EACjB,MAAQ3oD,EAAQu1K,EAAU5sH,KAAgBA,GAAc9lF,GACpD8lF,IAGJ,IAAIhoB,EAAW99D,EAEf,MAAQm9B,EAAQu1K,EAAU50I,KAAcA,GAAY,GAChDA,IAGJ,OAAO40I,EAAU71M,MAAMipF,EAAYhoB,EAAW,GAGlD,QAAQn8D,EAAMC,EAAI64B,GACd,MAAMpiC,EAAUM,KAAKN,SACf,QAAEyc,EAAO,UAAE46L,EAAS,SAAEtL,GAAa/rM,GACnC,MAAEm4C,EAAK,IAAEyiI,EAAG,IAAE9wK,GAAQxJ,KAAK65M,eAC3BN,EAAY9N,EAAWhlC,GAAID,GAC3B2oC,EAAY70B,EAAIi/B,GAAap9L,EAAU,EAAI,IAC3Ck+L,EAAU//B,EAAIjkJ,QACdikL,GAAc,GAAQrxM,GAEtB1F,EAAQ,GAAeyF,EAAM,GACnC,IAAI3B,EAAM,GAAe4B,EAAI1F,GAC7B8D,EAAMkC,KAAKqS,IAAIvU,EAAM,EAAG9D,GAIxB8D,EAAMkC,KAAKqS,IAAIrY,EAAO8D,GAEtB,IAAIsxC,EAAKw2J,GAAa5rM,EAAQiG,GAAOquC,EACjCe,EAAKu2J,GAAa9nM,EAAM,EAAImC,GAAOquC,EAcvC,OAZIyiK,GAAcvD,IACdn+J,EAAKD,GAGL7W,IACA6W,EAAK,GAAWA,EAAI2hI,EAAIi/B,EAAY,GAAIj/B,EAAIi/B,EAAY,IACxD3gK,EAAK,GAAWA,EAAI0hI,EAAIi/B,EAAY,GAAIj/B,EAAIi/B,EAAY,KAG5Dc,EAAQd,EAAY,GAAKp9L,EAAUy8B,EAAKD,EACxC0hK,EAAQd,EAAY,GAAKp9L,EAAUw8B,EAAKC,EAEjCyhK,EAGX,UAAU7E,GACN,MACM+D,EADWv5M,KAAKN,QAAQ+rM,SACDhlC,GAAID,GAC3BurC,EAAU/xM,KAAK+xM,UACfwI,EAAe/E,EAAKn/K,QAK1B,OAHAkkL,EAAahB,EAAY,GAAK,GAAW/D,EAAK+D,EAAY,GAAIxH,EAAQwH,EAAY,GAAIxH,EAAQwH,EAAY,IAC1GgB,EAAahB,EAAY,GAAK,GAAW/D,EAAK+D,EAAY,GAAIxH,EAAQwH,EAAY,GAAIxH,EAAQwH,EAAY,IAEnGgB,EAGX,KAAKvxM,EAAMC,EAAI64B,GACX,MAAMt4B,EAAMD,KAAK2R,MAAMlb,KAAKN,QAAQ8J,KAAO,GAC3C,IAAIjG,EAAQyF,EACR3B,EAAM4B,EAcV,MAZqB,iBAAV1F,EACPA,EAAQvD,KAAKw6M,cAAcj3M,GACpB23B,GAAS33B,KAChBA,GAASiG,GAGM,iBAARnC,EACPA,EAAMrH,KAAKw6M,cAAcnzM,GAClB6zB,GAAS7zB,KAChBA,GAAOmC,GAGJy9C,MAAMuuJ,KAAKjyM,EAAO8D,EAAKy6B,GAGlC,mBAAmBsnI,GACf,MAAM,QAAEjtJ,EAAO,UAAE46L,EAAS,SAAEtL,GAAazrM,KAAKN,QACxC65M,EAAY9N,EAAWhlC,GAAID,IAC3B,MAAE3uH,EAAK,IAAEyiI,EAAG,IAAE9wK,EAAG,IAAEoS,GAAQ5b,KAAK65M,eAEhC1K,EAAY70B,EAAIi/B,EAAY,GAE5BzyF,EAAMsiD,EAAMmwC,GAElB,GAAIzyF,EAAMqoF,GAAaroF,EAHPwzD,EAAIi/B,EAAY,GAI5B,OAAO,KAGX,IAAIluM,GATe8Q,EAAUP,EAAMpS,IASTs9G,EAAMqoF,GAAat3J,EAC7C,MAAM+rE,EAAOv4G,EAAQ,EAQrB,OANI0rM,EACA1rM,EAAQ9B,KAAKw1B,MAAM1zB,GACH,IAATu4G,GAAcv4G,EAAQ,GAC7BA,IAGG9B,KAAK2R,MAAM7P,GAGtB,YAAY+9J,GACR,MAAMp1J,EAAQhU,KAAKy6M,mBAAmBrxC,GAEtC,OAAc,OAAVp1J,EACO,KAGJhU,KAAKN,QAAQq5M,WAAW/kM,GAGnC,cAAc3I,GACV,OAAOrL,KAAK06M,WAAWrvM,GAAS9B,KAAK2R,MAAMlb,KAAKN,QAAQ8J,KAAO,GAGnE,WAAWwK,EAAOkoH,GACd,MAAMx8H,EAAUM,KAAKN,QAErB,OAAQw8H,EAAQx8H,EAAQs5M,cAAgBt5M,EAAQq5M,YAAY/kM,GAGhE,kBACI,OAAQhU,KAAKN,QAAQq5M,YAAc,IAAIj4M,OAG3C,eAAewvE,GACX,MAAM5wE,EAAUM,KAAKN,QACfqyM,EAAU/xM,KAAK+xM,UACfn6L,EAAOlY,EAAQ+rM,SAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QACrD/R,EAAQ3+B,EAAQq5M,WAAWj4M,OAE3BiU,EAAS,GAAMu7D,GADP14D,EAAOymB,GxOpWI,IwOuWzB,MAAO,CACH70B,IAAKuL,EACL6G,IAAKyiB,EAAQtpB,GAIrB,UAAU4lM,GACN,MAAMtB,EAAer5M,KAAK46M,qBAClBpxM,IAAKqxM,EAAUj/L,IAAKk/L,GAAa96M,KAAKm5M,aACxC3vM,EAAM,GAAW6vM,EAAa7vM,IAAMmxM,EAAME,EAAUC,GACpDl/L,EAAM,GAAWy9L,EAAaz9L,IAAM++L,EAAME,EAAUC,GAE1D,GAAIl/L,EAAMpS,EAAM,EACZ,MAAO,CACHA,IAAKA,EACLoS,IAAKA,GAKjB,WAAWi8B,GACP,MAAMxZ,EAAQr+B,KAAKN,QAAQq5M,WAAWj4M,OAChCwvE,EAAQz4B,EAAQxZ,EAEtB,MAAO,CACH70B,KAAM8mE,EACN10D,IAAKyiB,EAAQiyC,GAIrB,cACI,MAAM2gI,EAAcjxM,KAAKixM,cAEzB,OAAOA,EAAYr1L,IAAMq1L,EAAYznM,IAGzC,cACI,MAAM9J,EAAUM,KAAKN,SACf,UAAEq3M,EAAW/G,OAAQa,GAAiBnxM,EAC5C,IAAI,IAAE8J,EAAG,IAAEoS,GAAQ5b,KAAK46M,mBAAkB,GAC1C,MAAMr3M,EAAQgG,KAAK2R,MAAM1R,GAUzB,IAAIwX,EAQJ,OAhBK+1L,GAIDvtM,EAAMD,KAAKyR,KAAKxR,GAChBoS,EAAMrS,KAAK2R,MAAMU,KAJjBpS,EAAMD,KAAK2R,MAAM1R,GACjBoS,EAAMrS,KAAKyR,KAAKY,IAShBoF,EADAxX,EAAMqnM,EAAa7vL,KACZ6vL,EAAa7vL,KAAO6vL,EAAaz9K,KAAO7pB,KAAKyR,MAAMxR,EAAMqnM,EAAa7vL,MAAQ6vL,EAAaz9K,MAE3Fy9K,EAAa7vL,KAGjB,CACHxX,IAAKwX,EAAOzd,EACZqY,KAAMlc,EAAQq5M,WAAWj4M,OAAS8a,GAAOm7L,EAAY,EAAI,GAAK,GAAKxzM,GAI3E,gBAAgByQ,EAAO68L,EAAckK,GACjC,MAAMr7M,EAAUM,KAAKN,QACfgpM,EAAWhpM,EAAQs7M,UAAYt7M,EAAQs7M,UAAUhnM,GAAS,KAC1D20L,EAAW,GAAejpM,EAAQq5M,WAAW/kM,GAAQ,IAE3D+mM,EAAarS,SAAWA,EACxB,MAAM1kH,EAAOhkF,KAAKi7M,cAActS,EAAUkI,EAAckK,GAExD,OAAO,IAAI,GAAUpS,EAAU3kH,EAAMhwE,EAAO00L,EAAUmI,GAG1D,iBAAiBxlM,GACb,MAAMgzB,EAAQr+B,KAAK46M,oBAEnB,OAAOrxM,KAAK2R,MAAMmjB,EAAM70B,MAAQ6B,GAASA,GAAS9B,KAAKyR,KAAKqjB,EAAMziB,KAGtE,SAASvQ,GACL,MACM2I,EAAQ3I,EAAQ9B,KAAK2R,MADXlb,KAAKN,QACoB8J,KAAO,GAChD,OAAOxJ,KAAKozM,QAAQp/L,GAGxB,eACIizC,MAAMutJ,eACNx0M,KAAKk7M,sBAGT,sBACI,MAAM,MAAE1J,EAAK,IAAEl3B,GAAQt6K,KACvB,GAAIwxM,GAASA,EAAM1wM,OAAQ,CACvB,MAAMy4M,EAAYv5M,KAAKN,QAAQ+rM,SAAWhlC,GAAID,GACxCjjK,EAAQ+2K,EAAIi/B,EAAY,GACxBlyM,EAAMizK,EAAIi/B,EAAY,GAE5B,IAAK,IAAIrsK,EAAM,EAAGA,EAAMskK,EAAM1wM,OAAQosC,IAAO,CACzC,MAAMwkK,EAAOF,EAAMtkK,GACfwkK,EAAKp3B,MAAQjzK,EAAMqqM,EAAKp3B,IAAIi/B,EAAY,IAAM7H,EAAKp3B,IAAIi/B,EAAY,GAAKh2M,IACxEmuM,EAAKgE,SAMrB,IAAIplI,GACA,MAAMjyC,EAAQr+B,KAAK46M,mBAAkB,IAC/B,MAAE/iK,GAAU73C,KAAK65M,eACjB9kM,EAAS,GAAMu7D,EAAQz4B,ExOtdJ,IwOudnBshK,EAAan5M,KAAKm5M,aAIxB,OAAOn5M,KAAKm7M,WAHA98K,EAAM70B,IAAMuL,EACZspB,EAAMziB,IAAM7G,EAES,EAAGokM,EAAWv9L,IAAK7G,GAGxD,YAAYxR,EAAO8D,GACf,MAAM,QAAE8U,EAAO,SAAEsvL,GAAazrM,KAAKN,QAC7B65M,EAAY9N,EAAWhlC,GAAID,GAC3BnoI,EAAQr+B,KAAK46M,mBAAkB,IAC/B,MAAE/iK,EAAK,IAAEyiI,GAAQt6K,KAAK65M,eACtB1K,EAAY70B,EAAIi/B,GAAap9L,EAAU,EAAI,IAK3C3S,EAAM60B,EAAM70B,KAHAjG,EAAMg2M,GAAapK,GAGDt3J,EAC9Bj8B,EAAMyiB,EAAM70B,KAHFnC,EAAIkyM,GAAapK,GAGCt3J,EAC5BujK,EAAW7xM,KAAKC,IAAIA,EAAKoS,GACzBy/L,EAAW9xM,KAAKqS,IAAIpS,EAAKoS,GAE/B,GAAIy/L,EAAWD,GAjfW,IAkftB,MAAO,CACH5xM,IAAK4xM,EACLx/L,IAAKy/L,GAKjB,aACI,OAAOr7M,KAAKq+B,QAGhB,WAAWhzB,GACP,MAAM3L,EAAUM,KAAKN,QAIrB,OAHcM,KAAKs7M,eACft7M,KAAKs7M,eAAer6L,IAAI5V,GA9fpC,SAAiBA,EAAOlE,GACpB,GAAIkE,aAAiBoN,KAAM,CACvB,MAAM3X,EAASqG,EAAIrG,OACnB,IAAK,IAAIosC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAC5B,GAAIorK,GAAWnxM,EAAI+lC,GAAM7hC,GACrB,OAAO6hC,EAIf,OAAQ,EAGZ,OAAO/lC,EAAItF,QAAQwJ,GAZvB,CA8fqDA,EAAO3L,EAAQs5M,eAKhE,sBACI,MAAMt5M,EAAUM,KAAKN,QACrB,IAMIkc,EANApS,EAAM,EAaV,OAXI0xB,GAASx7B,EAAQ8J,OACjBA,EAAMD,KAAK2R,MAAMxb,EAAQ8J,MAKzBoS,EADAsf,GAASx7B,EAAQkc,KACXlc,EAAQq3M,UAAYxtM,KAAK2R,MAAMxb,EAAQkc,KAAOrS,KAAKyR,KAAKtb,EAAQkc,KAAO,EAEvE5b,KAAKu7M,aAAe,EAGvB,CACH/xM,IAAKA,EACLoS,IAAKA,GAIb,gBACI,IAAK5b,KAAKs7M,eAAgB,CACtB,MAAM75M,EAAMzB,KAAKs7M,eAAiB,IAAIvY,GAChCiW,EAAgBh5M,KAAKN,QAAQs5M,cACnC,IAAK,IAAI9rK,EAAM,EAAGA,EAAM8rK,EAAcl4M,OAAQosC,IAC1CzrC,EAAI5C,IAAIm6M,EAAc9rK,GAAMA,IAKxC,aACI,OAAO3jC,KAAKqS,IAAI5b,KAAKN,QAAQs5M,cAAcl4M,OAAQd,KAAKo5M,YAAc,IAI9ExV,GAAkB,GAAc,CAC5BtgM,KAAM,WACNmoM,UAAU,EACViI,eAAgB,CACZtnC,SAAS,EACTh8H,MAAO,EACPs7H,MAAO/F,IAEXqqC,OAAQ,CACJ5gB,OAAQ,GAEZ2nB,WAAW,EACXvG,cAAc,IAGH,IAAA,GAAA,GC/jBf,MAEMgL,GAAmB,CACrBC,aAAc,eACdC,QAAS,WACTr9F,QAAS,QACTD,MAAO,QACPsE,KAAM,MACNi5F,MAAO,MACPptK,OAAQ,UACRqtK,MAAO,QCMLC,GAAa,CnBhBS,eACL,UACA,UACF,QmBcsB5E,GnBZtB,QACC,SmBW0CC,IAKhE,SAAS4E,GAAc/C,GACnB,IAAI16K,EAAQ06K,EAAWgD,OAOvB,OANK19K,IACDA,EAAQ06K,EAAWgD,OAASlY,GAAkBkV,GAC9C16K,EAAM70B,IAAM,GAAO60B,EAAM70B,KACzB60B,EAAMziB,IAAM,GAAOyiB,EAAMziB,MAGtByiB,EAGX,MAAM29K,GACF,YAAYt8M,GACRM,KAAKN,QAAUA,EAGnB,iBACI,MAAO,CACH8J,IAAK,EACLoS,IAAK,GAIb,eACI,MAAO,GAGX,QACI,MAAO,GAGX,aACI,MAAO,GAGX,aACI,OAAQ,EAGZ,SACI,MAAO,GAGX,aACI,OAAQ,EAGZ,cACI,OAAO,EAGX,aACI,OAAO,EAGX,SACI,OAAO,MAIf,MAAM,GACF,YAAYrY,EAAO8D,EAAK3H,GACpBM,KAAKN,QAAUA,EACfA,EAAQg5M,aAAeh5M,EAAQg5M,cAAgB,EAE/C,MAAM,gBAAEuD,EAAe,UAAElF,GAAcr3M,EAEvCM,KAAKuD,MAAQi0M,GAAYj0M,EAAO,EAAG7D,EAAQ84M,SAAU94M,EAAQg4M,cAC7D,MAAMwE,EAAWl8M,KAAKm8M,iBAAiB90M,GACjC+0M,GAAarF,GAAauB,GAAWjxM,EAAK60M,KAAcx8M,EAAQ28M,WAEtEr8M,KAAKqH,IAAMrH,KAAKm8M,iBAAiB90M,GAAM0vM,EAAWqF,EAAY,EAAI,GAElE,MAAM5yM,EAAM9J,EAAQ8J,KAAOjG,EAC3BvD,KAAKs8M,WAAat8M,KAAKm8M,iBAAiB3yM,GACxCxJ,KAAKu8M,aAAeN,EAAkBj8M,KAAKs8M,WAAa9yM,EAExD,MAAMoS,EAAMlc,EAAQkc,IACpB,GAAKA,EAGE,CACH,MAAM0f,GAAQy7K,GAAauB,GAAW18L,EAAK5b,KAAKm8M,iBAAiBvgM,KAAS,EAAI,EAC9E5b,KAAK+sF,SAAW/sF,KAAKm8M,iBAAiBvgM,GAAK,EAAO0f,GAClDt7B,KAAKw8M,WAAaP,EAAkBj8M,KAAKm8M,iBAAiBvgM,GAAMm7L,GAAar3M,EAAQkc,SALrF5b,KAAK+sF,SAAWmvH,EAChBl8M,KAAKw8M,WAAaP,GAAmBG,EAAYp8M,KAAKqH,IAAMA,EAO5DrH,KAAK+sF,SAAW/sF,KAAKs8M,aACrBt8M,KAAK+sF,SAAW/sF,KAAKs8M,YAErBt8M,KAAKw8M,YAAcx8M,KAAKu8M,eACxBv8M,KAAKw8M,WAAax8M,KAAKm8M,iBAAiBn8M,KAAKu8M,cAAc,EAAO,IAI1E,eACI,MAAO,CACH/yM,IAAKxJ,KAAKu8M,aACV3gM,IAAK5b,KAAKw8M,YAIlB,iBACI,IAAKx8M,KAAKy8M,SAAU,CAChB,MAAM/8M,EAAUM,KAAKN,SAEf,SAAE84M,EAAQ,aAAEE,GAAiBh5M,EAE7Bg9M,EAASjE,GAAUz4M,KAAKu8M,aAAcv8M,KAAKs8M,WAAY9D,EAAUE,GACjEiE,EAASlE,GAAUz4M,KAAKw8M,WAAYx8M,KAAKs8M,WAAY9D,EAAUE,GAErE14M,KAAKy8M,SAAW,CAAEjzM,IAAKkzM,EAAQ9gM,IAAK+gM,GAGxC,OAAO38M,KAAKy8M,SAGhB,QACI,MAAO,CACHjzM,IAAKxJ,KAAKuD,MACVqY,IAAK5b,KAAKqH,KAIlB,aAGI,OAFarH,KAAK06M,WAAW16M,KAAKqH,MAEnBrH,KAAKN,QAAQq3M,UAAY,EAAI,GAGhD,aACI,MAAO,CACHvtM,IAAKxJ,KAAKs8M,WACV1gM,IAAK5b,KAAK+sF,UAIlB,WAAW1hF,GACP,MAAM3L,EAAUM,KAAKN,QACrB,OAAO6J,KAAK2R,MAAMu9L,GAAUptM,EAAOrL,KAAKs8M,WAAY58M,EAAQ84M,SAAU94M,EAAQg5M,eAGlF,WAAWrtM,GACP,MAAM3L,EAAUM,KAAKN,QACrB,OAAO6J,KAAK2R,MAAMu9L,GAAUptM,EAAOrL,KAAKuD,MAAO7D,EAAQ84M,SAAU94M,EAAQg5M,eAG7E,UAAUrtM,GACN,MAAM3L,EAAUM,KAAKN,QACrB,OAAO+4M,GAAUptM,EAAOrL,KAAKs8M,WAAY58M,EAAQ84M,SAAU94M,EAAQg5M,cAGvE,cAGI,OAFe14M,KAAK48M,WAAW58M,KAAK+sF,UAEpB,EAGpB,SACI,IAAIj4E,EAAS9U,KAAK68M,QAClB,IAAK/nM,EAAQ,CACT,MAAMpV,EAAUM,KAAKN,QACf2+B,EAAQr+B,KAAK88M,aACnB98M,KAAK68M,QAAU/nM,EAAS,GAExB,IAAK,IAAI4qG,EAAOrhF,EAAM70B,IAAKk2G,GAAQrhF,EAAMziB,KACrC9G,EAAOzR,KAAKq8G,GACZA,EAAO83F,GAAY93F,EAAMhgH,EAAQg5M,aAAch5M,EAAQ84M,SAAU94M,EAAQg4M,cAIjF,OAAO5iM,EAGX,OAAOd,EAAOkoH,GACV,MAAMx8H,EAAUM,KAAKN,QAErB,OAAO83M,GAAYt7E,EAAQl8H,KAAKuD,MAAQvD,KAAKs8M,WAAY58M,EAAQg5M,aAAe1kM,EAAOtU,EAAQ84M,SAAU94M,EAAQg4M,cAGrH,iBAAiBrsM,EAAO+V,EAAOka,GAC3B,MAAM,SAAEk9K,EAAQ,aAAEE,EAAY,aAAEhB,GAAiB13M,KAAKN,QAChD6D,EAAQvD,KAAKuD,MAEb6vB,EAAOqlL,GAAUptM,EAAO9H,EAAOi1M,EAAUE,GAC/C,IAAIqE,EAAc37L,EAAQ7X,KAAKyR,KAAKoY,GAAQ7pB,KAAK2R,MAAMkY,GAMvD,OAJIkI,IACAyhL,GAAezhL,GAGZk8K,GAAYj0M,EAAOw5M,EAAcrE,EAAcF,EAAUd,IAKxE,SAASsF,GAAat9M,EAASu9M,EAAWC,GACtC,MAAMC,EAAiBrB,GAAcp8M,EAAQq5M,YACvCqE,GAAQ19M,EAAQkc,KAAOuhM,EAAevhM,MAAQlc,EAAQ8J,KAAO2zM,EAAe3zM,MAC5E,kBAAE6zM,EAAiB,cAAEC,GAAkB59M,EACvC69M,EA3ME,QA2MS79M,EAAQ84M,SACzB,IAIIgF,EAAWpqL,EAAMqqL,EAJjBC,EAAaT,EAAYpB,GAAWh6M,QAAQo7M,GAAa,EACzDzE,EAAW+E,EAAW1B,GAAW6B,KAAgBh+M,EAAQ84M,SACzDmF,EAAQP,EAAOjG,GAAcqB,GAC7BoF,EAAaD,EAGjB,MAAQvqL,GAAQuqL,GAASL,GAAe,CACpCE,EAAYA,GAAaH,EAAkB7E,GAAUt0M,MAAM,GAE3D,EAAA,CACIu5M,EAAWD,EAAUztK,cAChB0tK,GAAYR,IAAczE,GAAYiF,EAAWP,GAE1D,GAAIO,EACArqL,EAAOqqL,EACPE,EAAQC,EAAaxqL,MAClB,CAAA,GAAIolL,IAAa,GAAKqD,IAAa,CACtCzoL,EAAO7pB,KAAKyR,KAAK4iM,EAAaN,GAC9B,MACG,IAAIC,EAIJ,CACCI,EAAQL,IACRlqL,EAAO7pB,KAAKyR,KAAK4iM,EAAaN,IAElC,MAPA9E,EAAWqD,GAAW6B,MAAiB,GAAK7B,IAC5C+B,EAAaR,EAAOjG,GAAcqB,GAClCgF,EAAY,MASpB99M,EAAQg5M,aAAetlL,EACvB1zB,EAAQ84M,SAAWA,EAwDvB,MAAM,WAAyB,GAE3B,QACI,MAAM36M,EAAO,IAAI,GAAiBuB,OAAOu8B,OAAO,GAAI37B,KAAKN,SAAUM,KAAKgnM,cAGxE,OAFAnpM,EAAK4yM,eAEE5yM,EAGX,iBACI,MAAM0F,EAAQvD,KAAK69M,UAAU3hF,QAAQ1yH,IACrC,OAAOxJ,KAAKN,QAAQ84M,SAAWx4M,KAAKN,QAAQg5M,aAAen1M,EAG/D,gBAAgB7D,GACZ,OAAOA,EAGX,aACIunD,MAAMspJ,aAEN,MAAMvJ,EAAehnM,KAAKgnM,aACpBhF,EAAcgF,EAAa9E,KACjC,IAAIxiM,EAAUM,KAAKN,QAEfq5M,EAAar5M,EAAQq5M,YAAc,GAyBvC,GAxBKA,EAAW+E,UACZ/E,EAAaH,GAAW5W,EAAa+W,GACrCA,EAAW+E,SAAU,GAGzBp+M,EAAU0hM,GAAW,CACjB6a,iBAAiB,GAClBv8M,EAAS,CACRq5M,WAAYA,EACZvvM,IAAKk4L,GAAUM,EAAatiM,EAAQ8J,KACpCoS,IAAK8lL,GAAUM,EAAatiM,EAAQkc,KACpC87L,aAAc,GAASh4M,EAASsiM,KAGhCgF,EAAa+W,SAAW/W,EAAagP,WAAWt2M,EAAQ+rM,SAAWhlC,GAAID,MACvE9mK,EAAQu8M,iBAAkB,GAG9Bv8M,EAAQs+M,gBAAkBt+M,EAAQs+M,iBAAmBt+M,EAAQ84M,SAC7D94M,EAAQu+M,oBAAsBv+M,EAAQu+M,qBAAuBv+M,EAAQg5M,aAErE14M,KAAKN,QAAUA,EACfA,EAAQs5M,cAAgBD,EAEpBA,EAAWj4M,OAAS,EAAG,CACvB,MAAMu9B,EAAQy9K,GAAc/C,GACtBmF,EAAex+M,EAAQw+M,aAI7B,GAFAl+M,KAAK69M,UAAY,IAAI,GAAUx/K,EAAM70B,IAAK60B,EAAMziB,IArE5D,SAAkBlc,GACd,MAAM84M,GAAY94M,EAAQ84M,UAAY,IAAIhyM,cAW1C,MAjSQ,QAuRWgyM,IAAqBvkK,GAAQukK,EAAUqD,KAxC9D,SAAyBn8M,GACrB,MAAMq5M,EAAar5M,EAAQq5M,WACrBnjL,EAAQ,GAAQmjL,GAAcA,EAAWj4M,OAAS,EACxD,IACIq9M,EAActxF,EADduxF,EAAUl4C,GAGd,IAAK,IAAIm4C,EAAa,EAAGA,EAAazoL,EAAOyoL,IAAc,CACvD,MAAM1V,EAAWoQ,EAAWsF,GAE5B,GAAI1V,GAAYwV,EAAc,CAC1B,MAAMv6F,EAAOwzF,GAAiBzO,EAAUwV,GACpCv6F,EAAO,IACPw6F,EAAU70M,KAAKC,IAAI40M,EAASx6F,GAGxBiJ,EADAuxF,GnBhQS,QmBiQFlH,GACAkH,GAAWE,QnB5QhB,SmB8QKF,GnBtQE,OATR,QmBiRMA,GnBzQC,MmB0QDnH,GACAmH,GnB5QE,KATR,QmBuRMA,GnB/QI,IATR,UADA,WmBiSfD,EAAexV,EAGnBjpM,EAAQ84M,SAAW3rF,GAAQoqF,GAnC/B,CA2CwBv3M,GA1RZ,QA6RJ84M,GAjSK,SAiSe94M,EAAQg5M,cAC5BsE,GAAat9M,GAGVA,EAZX,CAqE0EA,IAE1Dw+M,EAAc,CACd,MAAML,EAAY79M,KAAK69M,UAAUU,eAE3BC,EAAkBp/M,OAAOu8B,OAAO,GAAIj8B,EAAS,CAC/Cq3M,WAAW,EACXkF,iBAAiB,EACjBzD,SAAU,MACVhvM,IAAKq0M,EAAUr0M,IACfoS,IAAKiiM,EAAUjiM,IACf0hM,cAAeY,IAGbO,EAAmBz+M,KAAK69M,UAAUn+M,QAExCs9M,GAAawB,EAAiBC,EAAiBjG,SAAUiG,EAAiB/F,cAE1E14M,KAAK0+M,cAAgB,IAAI,GAAUrgL,EAAM70B,IAAK60B,EAAMziB,IAAK4iM,QAEzDx+M,KAAK0+M,cAAgB1+M,KAAK69M,eAI9Bn+M,EAAQ84M,SAAW94M,EAAQ84M,UAAYvB,GACvCj3M,KAAK69M,UAAY79M,KAAK0+M,cAAgB,IAAI1C,GAAet8M,GAG7DM,KAAK2+M,YAAc,GAGvB,YAAYhF,GACR,MAAM,UAAEkE,EAAS,cAAEa,GAAkB1+M,KAC/B4+M,EAAcF,EAAcE,cAElC,IAAK5+M,KAAKN,QAAQw+M,eAAiBU,EAC/B,OAAO33J,MAAM6yJ,YAAYH,GAG7B,MAAMC,EAAU,GAChB,IAAI9kM,EAAS4pM,EAAc5pM,SACvBC,EAAS,EAER/U,KAAKN,QAAQq3M,YACdjiM,EAASA,EAAOnL,OAAO+0M,EAAcG,OAAOD,IAC5C7pM,EAAS,IAGb,IAAK,IAAIm4B,EAAM,EAAGA,EAAMp4B,EAAOhU,OAAQosC,IAEnC,GADA0sK,EAAQv2M,KAAKw6M,EAAUpF,UAAU3jM,EAAOo4B,IAAQn4B,GAC/B,IAAb4kM,GAAkBzsK,GAAO,EAAG,CAC5B,MAAM5mB,EAAOszL,EAAQ94M,OAAS,EAC9B84M,EAAQ5/L,OAAOkzB,EAAK,EAAG0sK,EAAQtzL,EAAO,IAAMszL,EAAQtzL,GAAQszL,EAAQtzL,EAAO,IAAMqzL,GAIzF,OAAOC,EAGX,iBAAiBvuM,GACb,MAAMgzB,EAAQr+B,KAAKq+B,QACb06K,EAAa/4M,KAAKN,QAAQq5M,YAAc,GAE9C,OAAOZ,GAAa9sM,EAAOgzB,EAAM70B,MAAQ,GAAK2uM,GAAa9sM,EAAOgzB,EAAMziB,MAAQ,GAAKm9L,EAAWj4M,OAGpG,eAAeuK,GACX,OAAOq2L,GAAU1hM,KAAKgnM,aAAa9E,KAAM72L,GAG7C,SAASA,GACL,OAAOrL,KAAKozM,QAAQ/nM,GAGxB,eAAeilE,GACX,MAAM5wE,EAAUM,KAAKN,SACf,SAAE84M,EAAQ,aAAEd,EAAY,SAAEjM,GAAa/rM,EACvCqyM,EAAU/xM,KAAK+xM,UACfn6L,EAAO6zL,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QACnD,IAAI/R,EAAQr+B,KAAKq+B,QACjB,MACMtpB,EAAS,GAAMu7D,GADP14D,GAAQymB,EAAMziB,IAAMyiB,EAAM70B,M1Olbf,I0OqbzB,GAAI60B,EAAM70B,KAAO60B,EAAMziB,IAAK,CACxB,MAAM5S,EAAOquM,GAAS33M,EAAQ8J,KAAO60B,EAAM70B,IAAKuL,GAC1C9L,EAAKouM,GAAS33M,EAAQkc,KAAOyiB,EAAMziB,IAAK7G,GAE9CspB,EAAQ,CACJ70B,IAAKguM,GAAYxuM,EAAM,EAAGwvM,EAAUd,GACpC97L,IAAK47L,GAAYvuM,EAAI,EAAGuvM,EAAUd,IAI1C,OAAOr5K,EAGX,WAAWiyC,GACP,IAAIwuI,EAASv1M,KAAK+mC,IAAIggC,GAClB5oE,EAAS1H,KAAKq+B,SACZ70B,IAAKR,EAAM4S,IAAK3S,GAAOvB,EAE7B,GAAIsB,GAAQC,EAAI,CACZ,KAAO61M,KAAU,CACb,MAAMzgL,EAAQ+5K,GAASpvM,EAAMC,GACvBmqB,EAAO7pB,KAAKw1B,MAAc,GAARV,GACpBiyC,EAAQ,GACRtnE,EAAOquM,GAASruM,EAAMoqB,GACtBnqB,EAAKouM,GAASpuM,GAAKmqB,KAEnBpqB,EAAOquM,GAASruM,GAAOoqB,GACvBnqB,EAAKouM,GAASpuM,EAAImqB,IAI1B1rB,EAAS,CAAE8B,IAAKR,EAAM4S,IAAK3S,GAG/B,OAAOvB,EAGX,cACI,MAAO,CACH8B,IAAKxJ,KAAKN,QAAQswM,OAAOhvL,KACzBpF,IAAK5b,KAAK0+M,cAAcE,eAIhC,IAAItuI,GACA,GAAItwE,KAAK2kC,UACL,OAAO,KAGX,MAAMjlC,EAAUM,KAAKN,QACfqyM,EAAU/xM,KAAK+xM,UACfn6L,EAAOlY,EAAQ+rM,SAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,SACrD,IAAE5mC,EAAG,IAAEoS,GAAQ5b,KAAK69M,UAAUU,eAC9BQ,EAAc/+M,KAAK69M,UAAU3hF,QAE7BnnH,EAAS,GAAMu7D,GADP14D,GAAQgE,EAAMpS,I1O3eH,K0O4eiC9J,EAAQyc,SAAW,EAAI,GAC3EnT,EAAOquM,GAAS7tM,EAAKuL,GACrB9L,EAAKouM,GAASz7L,EAAK7G,GAEnBiqM,EAAWh/M,KAAKm7M,WAAW9C,GAAOrvM,GAAOqvM,GAAOpvM,GAAKovM,GAAO0G,EAAYv1M,KAAM6uM,GAAO0G,EAAYnjM,KAAM7G,GAE7G,OAAIiqM,GACAA,EAASx1M,IAAM,GAAOw1M,EAASx1M,KAC/Bw1M,EAASpjM,IAAM,GAAOojM,EAASpjM,KAC/BojM,EAASxG,SAAW94M,EAAQ84M,SAC5BwG,EAAStG,aAAeh5M,EAAQg5M,cAAgB,EAChDsG,EAAShB,gBAAkBt+M,EAAQs+M,gBACnCgB,EAASf,oBAAsBv+M,EAAQu+M,oBAEhCe,QARX,EAYJ,YAAYz7M,EAAO8D,GACf,GAAIrH,KAAK2kC,UACL,OAAO,KAGX,MAAMs6K,EAAch4J,MAAMg4J,YAAY17M,EAAO8D,GACvC63M,EAAal/M,KAAK69M,UAAUU,eAC5BY,EAAen/M,KAAK69M,UAAUuB,iBAC9BvnK,EAAQugK,GAAS8G,EAAWtjM,IAAKsjM,EAAW11M,MAAQ21M,EAAavjM,IAAMujM,EAAa31M,KACpF9J,EAAUM,KAAKN,QAKrB,MAAO,CACH8J,IAJQ6tM,GAAS6H,EAAW11M,IAAKy1M,EAAYz1M,IAAMquC,GAKnDj8B,IAJQy7L,GAAS6H,EAAW11M,IAAKy1M,EAAYrjM,IAAMi8B,GAKnD2gK,SAAU94M,EAAQs+M,iBAAmBt+M,EAAQ84M,SAC7CE,aAAch5M,EAAQu+M,qBAAuBv+M,EAAQg5M,cAI7D,UAAUpoI,GACN,GAAItwE,KAAK2kC,UACL,OAAO,KAGX,MAAMjlC,EAAUM,KAAKN,QACf2/M,EAlhBF,QAkhBQ3/M,EAAQs+M,gBACde,EAAc/+M,KAAK69M,UAAU3hF,SAC3B1yH,IAAK4xM,EAAUx/L,IAAKy/L,GAAar7M,KAAK69M,UAAUU,eACxD,IAAI,aAAE7G,EAAY,SAAEc,EAAQ,aAAEE,GAAiB14M,KAAK69M,UAAUn+M,QAC1D8J,EAAMguM,GAAY4D,EAAU9qI,EAAQooI,EAAcF,EAAUd,GAC5D97L,EAAM47L,GAAY6D,GAAW/qI,EAAQooI,EAAcF,EAAUd,GAEjE,GAAI2H,EAAK,CACL,MAAM,kBAAEhC,EAAiB,cAAEC,GAAkB59M,EAEvC4/M,EAAU,GAAKjC,EAAkB7E,IAAa8E,EAAgBnG,GAAcqB,GAC5E+G,EAAYnH,GAASiD,EAAUD,GAC/Bx3F,EAAOw0F,GAASx8L,EAAKpS,GAC3B,IACIg2M,EAAkBlI,EADlBmI,EAAgB5D,GAAWh6M,QAAQ22M,GAGvC,GAAI50F,EAAOuzF,GAAcqB,InBrjBT,iBmBqjBsBA,EAClCA,EAAWqD,GAAW4D,EAAgB,GACtCD,EAAmB,GAAKnC,EAAkB7E,IAC1ClB,GAASiI,GAAajC,EAAgB,GAAKkC,EAAmBrI,GAAcqB,IAAa,EACzFhvM,EAAM6tM,GAAS+D,EAAU9D,GACzB17L,EAAMy7L,GAASgE,GAAW/D,QAEvB,GAAI1zF,EAAO07F,GAAW9G,IAAatB,GAAO,CAC7C,IAAIwI,EAAY,EAEhB,EAAG,CACCD,IACAjH,EAAWqD,GAAW4D,GACtBC,EAAY,EACZpI,EAAQ,EAAIH,GAAcqB,GAC1B,EAAA,CACIgH,EAAmBnC,EAAkB7E,GAAUkH,GAC/CA,UACKA,EAAYrC,EAAkB7E,GAAU13M,QAAUw2M,EAAQkI,EAAmBD,SACjF/G,IAAatB,IAASI,EAAQkI,EAAmBD,GAE1DjI,GAASA,EAAQkI,EAAmBD,GAAa,EAC7CjI,EAAQ,IACR9tM,EAAM6tM,GAAS+D,GAAW9D,GAC1B17L,EAAMy7L,GAASgE,EAAU/D,GACzB9tM,EAAM6tM,GAAS7tM,EAAK,GAAWoS,EAAKmjM,EAAYv1M,IAAKu1M,EAAYnjM,KAAOA,GACxEA,EAAMy7L,GAASz7L,EAAK,GAAWpS,EAAKu1M,EAAYv1M,IAAKu1M,EAAYnjM,KAAOpS,KAYpF,OAPIA,EAAMu1M,EAAYv1M,MAClBA,EAAMu1M,EAAYv1M,KAElBoS,EAAMmjM,EAAYnjM,MAClBA,EAAMmjM,EAAYnjM,KAGlBpS,GAAOoS,GAAOw8L,GAASx8L,EAAKpS,GAAO,EAC5B,CACHA,IAAKA,EACLoS,IAAKA,EACL48L,SAAU94M,EAAQs+M,iBAAmBt+M,EAAQ84M,SAC7CE,aAAch5M,EAAQu+M,qBAAuBv+M,EAAQg5M,mBAL7D,EAUJ,QACI,OAAO14M,KAAK69M,UAAUU,eAG1B,eACIt3J,MAAMwpJ,eACNzwM,KAAK2/M,oBAGT,cACI14J,MAAM6pJ,cACN9wM,KAAK2+M,YAAc,GAGvB,gBACI3+M,KAAK4/M,qBACL34J,MAAMstJ,gBAGV,qBACI,MAAM,QAAE70M,EAAO,YAAEi/M,GAAgB3+M,KACjC,GAA2B,IAAvB2+M,EAAY79M,OACZ,OAGJ,MAAMixM,EAAU/xM,KAAK+xM,UACftG,EAAW/rM,EAAQ+rM,SACnB2F,EAAS1xM,EAAQi/M,YAAYvN,QAAU1xM,EAAQswM,OAAOoB,OAEtDoI,EAAamF,EAAY,GAC/B,GAAInF,EAAY,CACZ,MAAM11K,EAAW2nK,EAAWsG,EAAQrgC,GAAM8nC,EAAWl/B,IAAIzQ,SAAW,EAAKkoC,EAAQtgC,GACjFzxK,KAAKi1M,cAAcuE,EAAYpI,EAAQttK,GAG3C,MAAMoyK,EAAYyI,EAAY,GAC9B,GAAIzI,EAAW,CACX,MAAMpyK,EAAW2nK,EAAWsG,EAAQngC,GAAMskC,EAAU57B,IAAIzQ,SAAW,EAAKkoC,EAAQpgC,GAChF3xK,KAAKi1M,cAAciB,EAAW9E,EAAQttK,IAI9C,mBACImjB,MAAM+pJ,mBACNhxM,KAAK6/M,wBAGT,uBACI54J,MAAMqyJ,uBACNt5M,KAAK8/M,wBAGT,wBACI,MAAM,YAAEnB,EAAW,OAAE3O,GAAWhwM,KAChC,GAA2B,IAAvB2+M,EAAY79M,OACZ,OAGJ,SAAS8qK,EAAKm0C,EAAYjhF,GACtB,QAAKA,EAAMp/H,QAAQ0sK,UAAWttC,EAAMw7C,IAAI0lC,SAASD,EAAWzlC,OACxDx7C,EAAMp/H,QAAQ0sK,SAAU,EACjB,IAMf,MAAM6zC,EAAkBtB,EAAY,GACpC,GAAIsB,GAAmBA,EAAgBvgN,QAAQ0sK,QAC3C,IAAK,IAAI1rK,EAAI,EAAGA,EAAIsvM,EAAOlvM,QACN8qK,EAAKq0C,EAAiBjQ,EAAOtvM,IADfA,KAQvC,MAAMw/M,EAAiBvB,EAAY,GACnC,GAAIuB,GAAkBA,EAAexgN,QAAQ0sK,QACzC,IAAK,IAAI1rK,EAAIsvM,EAAOlvM,OAAS,EAAGJ,EAAI,GACfkrK,EAAKs0C,EAAgBlQ,EAAOtvM,MADRA,IASjD,aACI,MAAM45K,EAAMrzH,MAAMyiJ,aACZiV,EAAc3+M,KAAK2+M,YAEzB,IAAK,IAAIj+M,EAAI,EAAGA,EAAIi+M,EAAY79M,OAAQJ,IAAK,CACzC,MAAMo+H,EAAQ6/E,EAAYj+M,GACtBo+H,EAAMp/H,QAAQ0sK,SACdkO,EAAIt3I,KAAK87F,EAAMw7C,KAIvB,OAAOA,EAGX,gBAAgBtmK,EAAO68L,EAAckK,EAAe,IAChD,MAAMr7M,EAAUM,KAAKN,QACfgpM,EAAWhpM,EAAQs7M,YAAct7M,EAAQw+M,aAAex+M,EAAQs7M,UAAUhnM,GAAS,KACnF0rG,EAAO1/G,KAAK0+M,cAAcG,OAAO7qM,GAGvC68L,EAAa1mM,OAAS0mM,EAAa1mM,QAFhB0mM,EAAasP,YAAYngN,KAAK0+M,cAAch/M,QAAQ84M,UAGvEuC,EAAarS,SAAWA,EAExB,MAAM1kH,EAAOhkF,KAAKi7M,cAAcv7F,EAAMmxF,EAAckK,GACpD,GAAI/2H,EACA,OAAO,IAAI,GAAU07B,EAAM17B,EAAMhwE,EAAO00L,EAAUmI,GAI1D,oBACI,MAAM,aAAE0L,EAAY,WAAEC,GAAex8M,KAAK0+M,cACpCh/M,EAAUM,KAAKN,QACfmxM,EAAezxM,OAAOu8B,OAAO,GAAIj8B,EAAQswM,OAAQtwM,EAAQi/M,YAAa,CACxEjjC,MAAO7V,GACPupB,OAAQ1vL,EAAQ0vL,SAGpB,IAA6B,IAAzByhB,EAAazkC,QACb,OAGJpsK,KAAK+wM,uBAAuBF,GAC5BA,EAAa1C,cAAgBtoC,GAEC,SAA1BgrC,EAAa/4J,WACb+4J,EAAa/4J,SAAW,EACxBp4C,EAAQmgN,uBAAwB,GAIpChP,EAAa1mM,OAAS0mM,EAAa1mM,QADhB0mM,EAAasP,YAAYngN,KAAK0+M,cAAch/M,QAAQ84M,UAGvE,MAAM4H,EAAc,CAACpsM,EAAO0rG,EAAM17B,KAC9B,GAAIA,EAAM,CACN,MAAM86C,EAAQ,IAAI,GAAUpf,EAAM17B,EAAMhwE,EAAO,KAAM68L,GACrD7wM,KAAKq6H,OAAOyE,GACZ9+H,KAAK2+M,YAAYt7M,KAAKy7H,KAK9BshF,EAAY,EAAG7D,EADGv8M,KAAKi7M,cAAcsB,EAAc1L,EAAc,CAAE78L,MAAO,EAAG4hB,MAAO,KAIpFwqL,EAAY,EAAG5D,EADCx8M,KAAKi7M,cAAcuB,EAAY3L,EAAc,CAAE78L,MAAO,EAAG4hB,MAAO,KAIpF,wBACI,MAAMo6K,EAAShwM,KAAK2+M,YACpB,IAAK3+M,KAAKN,QAAQmgN,uBAAyB7/M,KAAKN,QAAQ+rM,UAA8B,IAAlBuE,EAAOlvM,OACvE,OAGJ,MAAMu/M,EAAc,CAACvhF,EAAOozE,EAAel+L,KACvC,MAAMo8B,EAAoE,EAA5D7mC,KAAK+mC,IAAI4hK,EAAcl+L,EAAQ,GAAKk+L,EAAcl+L,IAC1D8iC,EAAQ92C,KAAKu1M,qBAAqBz2E,EAAMw7C,IAAKlqI,GACrC,IAAV0G,IACAgoF,EAAMp/H,QAAQo4C,SAAWhB,EACzBgoF,EAAM+nE,OAAO,IAAI,MAInBqL,EAAgBlyM,KAAKoyM,wBAC3BiO,EAAYrQ,EAAO,GAAIkC,EAAe,GACtCmO,EAAYrQ,EAAO,GAAIkC,EAAeA,EAAcpxM,OAAS,GAGjE,cAAcuK,GACV,OAAOrL,KAAK69M,UAAUjB,WAAWvxM,GAGrC,KAAKrC,EAAMC,EAAI64B,GACX,MAAMw+K,EAAYtgN,KAAK69M,UACvB,IAAIt6M,EAAQyF,EACR3B,EAAM4B,EAEN1F,aAAiBkV,OACjBlV,EAAQ+8M,EAAU7H,UAAUl1M,IAG5B8D,aAAeoR,OACfpR,EAAMi5M,EAAU7H,UAAUpxM,IAG9B,MAAMmuM,EAAOx1M,KAAKozM,QAAQ7vM,EAAO8D,EAAKy6B,GACtC,GAAI0zK,EACA,OAAOA,EAAKzL,SAIpB,QAAQ9qM,EAAGC,EAAG4iC,GACV,IAAIv+B,EAAQtE,EACRoI,EAAMnI,EAUV,M1O9xBc,iB0OsxBHqE,IACPA,EAAQvD,KAAKw6M,cAAcj3M,I1OvxBjB,iB0O0xBH8D,IACPA,EAAMrH,KAAKw6M,cAAcnzM,IAGtB4/C,MAAMmsJ,QAAQ7vM,EAAO8D,EAAKy6B,GAGrC,aACI,MACMzD,EAAQy9K,GADE97M,KAAKN,QACes5M,eAEpC,MAAO,CACHxvM,IAAK,GAAO60B,EAAM70B,KAClBoS,IAAK,GAAOyiB,EAAMziB,MAI1B,WAAW5H,EAAOkoH,GACd,OAAOl8H,KAAK69M,UAAUgB,OAAO7qM,EAAOkoH,GAGxC,kBACI,OAAOl8H,KAAK69M,UAAUe,cAG1B,eACI,OAAO5+M,KAAK69M,UAAUuB,iBAG1B,qBACI,OAAQp/M,KAAK0+M,cAAch/M,QAAQq3M,UAGvC,qBACQ/2M,KAAK2kC,YAIT3kC,KAAKN,QAAQq5M,WAAa/4M,KAAK69M,UAAU/oM,UAG7C,YAAYs0J,GACR,MAAMp1J,EAAQhU,KAAKy6M,mBAAmBrxC,GAEtC,OAAc,OAAVp1J,EACO,KAGJhU,KAAK69M,UAAUgB,OAAO7qM,GAGjC,WAAW3I,GACP,OAAOrL,KAAK69M,UAAUnD,WAAWrvM,GAGrC,sBACI,MAAMgzB,EAAQr+B,KAAK69M,UAAUf,aAC7B,MAAO,CACHtzM,IAAKxJ,KAAK69M,UAAUnD,WAAWr8K,EAAM70B,KACrCoS,IAAK5b,KAAK69M,UAAUnD,WAAWr8K,EAAMziB,MAI7C,aACI,OAAO5b,KAAK69M,UAAU3hF,QAG1B,aACI,OAAOl8H,KAAK69M,UAAUtC,aAG1B,UACI,OAAQv7M,KAAKN,QAAQs5M,cAAcl4M,OAGvC,eACI,IAAqC,IAAjCd,KAAKN,QAAQu8M,iBAA6Bj8M,KAAK2kC,UAC/C,OAAO3kC,KAAKq+B,QAGhB,MAAM3+B,EAAUM,KAAKN,QACfw/M,EAAapD,GAAcp8M,EAAQs5M,eAQzC,OANkB,IAAI,GAAUkG,EAAW11M,IAAK01M,EAAWtjM,IAAKxc,OAAOu8B,OAAO,GAAIj8B,EAAS,CACvFq3M,WAAW,EACXkF,iBAAiB,EACjBI,WAAY38M,EAAQq3M,aAGPwH,gBAIzB3a,GAAkB,GAAkB,CAChCtgM,KAAMyiK,GACNiqC,OAAQ,CACJmQ,YAAa3E,IAEjBmD,YAAa,CACTvyC,SAAS,GAEbixC,kBAAmB,CACf5B,aAAc,CAAE,EAAG,GAAI,KACvBC,QAAS,CAAE,EAAG,EAAG,EAAG,GAAI,IACxBr9F,QAAS,CAAE,EAAG,EAAG,EAAG,GAAI,IACxBD,MAAO,CAAE,EAAG,EAAG,GACfsE,KAAM,CAAE,EAAG,EAAG,GACdi5F,MAAO,CAAE,EAAG,GACZptK,OAAQ,CAAE,EAAG,EAAG,EAAG,GACnBqtK,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,KAEjC0B,cAAe,KAGJ,IAAA,GAAA,GCl6BA,SAASpiM,GAAM7P,EAAO+nB,GACjC,OAAO,GAAM7pB,KAAK2R,MAAM7P,EAAQ+nB,GAAQA,E3OOX,I4ORlB,SAASpY,GAAK3P,EAAO+nB,GAChC,OAAO,GAAM7pB,KAAKyR,KAAK3P,EAAQ+nB,GAAQA,E5OOV,I6OTlB,SAASmtL,GAAgBl1M,GACpC,OAAO9B,KAAKqS,IAAIrS,KAAKC,IAAI6B,EJHJ,MAAA,KKezB,MAAMm1M,GAAkBj3M,KAAK0+J,IAAI,IAAI,GAErC,MAAM,WAAoB,GAEtB,YAAY4uC,EAAWC,EAAWp3M,EAASsnM,GACvC//I,MAAM7nD,OAAOu8B,OAAO,GAAIj8B,EAAS,CAC7Bm3M,UAAWA,EACXC,UAAWA,IACX9P,GAGR,gBAAgBtnM,GACZ,MAAM+gN,EA0Od,SAAyB5J,EAAWC,EAAWp3M,GAC3C,MAAMghN,EAAchhN,EAAQghN,YAE5B,IAAIC,ECtQO,SAAqBn3M,EAAKoS,EAAKglM,GAC1C,IAAKp3M,IAAQoS,EACT,OAAO,EAGX,IAAIilM,EAEJ,GAAIr3M,GAAO,GAAKoS,GAAO,EAAG,CACtB,MAAM+6L,EAAWntM,IAAQoS,EAAM,EAAIpS,EAEnC,IAAIo6G,GAAQhoG,EAAM+6L,GAAY/6L,EAC9B,IAAe,IAAXglM,IAAsBA,GAAUh9F,ENArB,GMCX,OAAO,EAGXi9F,EAAUt3M,KAAKqS,IAAI,EAAG+6L,GAAa/6L,EAAM+6L,GAAY,QAErDkK,EAAUr3M,EAGd,OAAOq3M,EApBI,CDsQehK,EAAWC,EAAW4J,GAC5CI,EEvQO,SAAqBt3M,EAAKoS,EAAKglM,GAC1C,IAAKp3M,IAAQoS,EACT,OAAO,EAGX,IAAImlM,EAEJ,GAAIv3M,GAAO,GAAKoS,GAAO,EAAG,CACtB,MAAMg7L,EAAWptM,IAAQoS,EAAM,EAAIA,EAEnC,IAAIgoG,EAAOr6G,KAAK+mC,KAAKsmK,EAAWptM,GAAOotM,GACvC,IAAe,IAAXgK,IAAsBA,GAAUh9F,EPArB,GOCX,OAAO,EAGXm9F,EAAUx3M,KAAKC,IAAI,EAAGotM,GAAaptM,EAAMotM,GAAY,QAErDmK,EAAUnlM,EAGd,OAAOmlM,EApBI,CFuQelK,EAAWC,EAAW4J,GAEhD,MAAM1O,EAAYlO,GAAc6c,EAASG,GACnCL,EAAc,CAChBzO,UAAWA,GAgBf,OAbiC,IAA7BtyM,EAAQshN,mBACJL,EAAU,GAAKM,GAAeN,EAAS3O,EAAW,EAAI,KACtD2O,GAAW3O,GAGX8O,EAAU,GAAKG,GAAeH,EAAS9O,EAAW,EAAI,KACtD8O,GAAW9O,IAInByO,EAAYj3M,IAAM0R,GAAMylM,EAAS3O,GACjCyO,EAAY7kM,IAAMZ,GAAK8lM,EAAS9O,GAEzByO,EAxBX,CA1O4C/gN,EAAQm3M,UAAWn3M,EAAQo3M,UAAWp3M,GAG1E,OAFAM,KAAKkhN,aAoQb,SAA0BT,EAAa/gN,GACnC,MAAO,CACH8J,IAAK,GAAQ9J,EAAQ8J,KAAOD,KAAKC,IAAIi3M,EAAYj3M,IAAK9J,EAAQ8J,KAAOi3M,EAAYj3M,IACjFoS,IAAK,GAAQlc,EAAQkc,KAAOrS,KAAKqS,IAAI6kM,EAAY7kM,IAAKlc,EAAQkc,KAAO6kM,EAAY7kM,IACjFo2L,UAAWyO,EAAYzO,WAJ/B,CApQ6CyO,EAAa/gN,GAqR1D,SAAqB+gN,EAAaU,GAC9B,IACIC,EAAYC,EADZ3hN,EAAUyhN,EAGd,GAAIA,EAAa,EAbrB,SAAyBzhN,EAASooK,GAC9B,IAAK,IAAI56H,EAAM,EAAGA,EAAM46H,EAAOhnK,OAAQosC,IAAO,CAC1C,MAAM45H,EAAQgB,EAAO56H,GACE,OAAnBxtC,EAAQonK,KACRpnK,EAAQonK,QAAS5wJ,IAJ7B,CAcwBirM,EAAa,CAAE,MAAO,QAEtCC,EAAa,GAAQD,EAAY33M,KACjC63M,EAAa,GAAQF,EAAYvlM,KAEjC,MAAM0lM,EAAgBF,GAAcC,EAEhCC,GACIH,EAAY33M,MAAQ23M,EAAYvlM,MAC5BulM,EAAY33M,IAAM,EAClB23M,EAAY33M,IAAM,EAElB23M,EAAYvlM,IAAM,GAK1BulM,EAAYnP,WACZyO,EAAYj3M,IAAM0R,GAAMulM,EAAYj3M,IAAK23M,EAAYnP,WACrDyO,EAAY7kM,IAAMZ,GAAKylM,EAAY7kM,IAAKulM,EAAYnP,YAC7CsP,IACP5hN,EAAU0hM,GAAWqf,EAAaU,GAGlCV,EAAYzO,UAAYlO,GAAcpkM,EAAQ8J,IAAK9J,EAAQkc,MAInE6kM,EAAYnO,WAAa5yM,EAAQsyM,WAAayO,EAAYzO,WAAa,EAEvE,MAAMtqM,EAAS05L,GAAWqf,EAAa/gN,GASvC,OARIgI,EAAO8B,KAAO9B,EAAOkU,MACjBwlM,IAAeC,EACf35M,EAAOkU,IAAMlU,EAAO8B,IAAM9B,EAAOsqM,WACzBoP,GAAcC,IACtB35M,EAAO8B,IAAM9B,EAAOkU,IAAMlU,EAAOsqM,YAIlCtqM,EA5CX,CAnR2B+4M,EAAa/gN,GAGpC,aACIM,KAAK66M,SAAW76M,KAAKkhN,aAAa13M,IAClCxJ,KAAK86M,SAAW96M,KAAKkhN,aAAatlM,IAClC5b,KAAKuhN,eAAiBvhN,KAAKkhN,aAAalP,UACxChyM,KAAK62M,UAAY72M,KAAKN,QAAQm3M,UAC9B72M,KAAK82M,UAAY92M,KAAKN,QAAQo3M,UAGlC,QACI,OAAO,IAAI,GACP92M,KAAK62M,UACL72M,KAAK82M,UACL13M,OAAOu8B,OAAO,GAAI37B,KAAKN,SACvBM,KAAKgnM,cAIb,aACI,OAAO,EAGX,QACI,MAAMtnM,EAAUM,KAAKN,QACrB,MAAO,CAAE8J,IAAK9J,EAAQ8J,IAAKoS,IAAKlc,EAAQkc,KAG5C,aAAa4lM,GACT,GAAkB,IAAdA,EACA,OAAO,EAGX,MAAM9hN,EAAUM,KAAKN,QAGrB,OAAO6J,KAAK2R,MAAM,IAFJxb,EAAQkc,IAAMlc,EAAQ8J,KAEJg4M,E9O7DT,I8O6DwC,EAGnE,iBAAiB30F,EAAMslF,GACnB,MAAMzyM,EAAUM,KAAKN,SACf,SAAE+rM,EAAQ,QAAEtvL,GAAYzc,EACxBqyM,EAAU/xM,KAAK+xM,UAIf3+K,EAAOy5F,IAHI4+E,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,UACzC1wC,EAAQkc,IAAMlc,EAAQ8J,MAG9Bi4M,EAAYzhN,KAAK0hN,aAAa70F,GAC9B7iH,GAAOyhM,GAAY,EAAI,IAAMtvL,GAAW,EAAI,GAE5C49L,EAAY,GAClB,IAAIjzF,EAAMirF,GAAStG,EAAWhlC,GAAID,KAFR,IAARx8J,EAAY,EAAI,IAG9B23M,EAAW,EAEXxP,IACAwP,EAAWxP,EAAWtlF,GAG1B,IAAK,IAAI3/E,EAAM,EAAGA,EAAMu0K,EAAWv0K,IAC3BA,EAAMy0K,GAAa,GACnB5H,EAAU12M,KAAK,GAAMyjH,E9OrFN,I8OwFnBA,GAAY1zF,EAAOppB,EAGvB,OAAO+vM,EAGX,wBACI,OAAO/5M,KAAKm6M,iBAAiBn6M,KAAKN,QAAQsyM,WAG9C,wBACI,OAAOhyM,KAAKm6M,iBAAiBn6M,KAAKN,QAAQ4yM,WAG9C,QAAQrzM,EAAGC,EAAG4iC,GAAQ,GAClB,MAAMpiC,EAAUM,KAAKN,SACf,SAAE+rM,EAAQ,QAAEtvL,GAAYzc,EACxB65M,EAAY9N,EAAWhlC,GAAID,GAC3BurC,EAAU/xM,KAAK+xM,UACf5C,EAAY4C,EAAQwH,GAAap9L,EAAU,EAAI,IAG/CiX,GADMjX,GAAW,EAAI,KADVsvL,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,UAEvB1wC,EAAQkc,IAAMlc,EAAQ8J,MAChD6wM,EAAU,IAAI,GAAItI,EAAQtgC,GAAIsgC,EAAQrgC,GAAIqgC,EAAQtgC,GAAIsgC,EAAQrgC,IAEpE,IAgBI/4H,EAAIC,EAhBJr1C,EAAQtE,EACRoI,EAAMnI,EA4BV,OA1BK,GAAQqE,KACTA,EAAQ8D,GAAO,GAGd,GAAQA,KACTA,EAAM9D,GAAS,GAGfu+B,IACAv+B,EAAQgG,KAAKqS,IAAIrS,KAAKC,IAAIjG,EAAO7D,EAAQkc,KAAMlc,EAAQ8J,KACvDnC,EAAMkC,KAAKqS,IAAIrS,KAAKC,IAAInC,EAAK3H,EAAQkc,KAAMlc,EAAQ8J,MAKnDiiM,GACA9yJ,EAAKj5C,EAAQkc,IAAMrS,KAAKqS,IAAIrY,EAAO8D,GACnCuxC,EAAKl5C,EAAQkc,IAAMrS,KAAKC,IAAIjG,EAAO8D,KAEnCsxC,EAAKpvC,KAAKC,IAAIjG,EAAO8D,GAAO3H,EAAQ8J,IACpCovC,EAAKrvC,KAAKqS,IAAIrY,EAAO8D,GAAO3H,EAAQ8J,KAGxC6wM,EAAQd,EAAY,GAAKgH,GAAgBpR,EAAY/7K,GAAQjX,EAAUy8B,EAAKD,IAC5E0hK,EAAQd,EAAY,GAAKgH,GAAgBpR,EAAY/7K,GAAQjX,EAAUw8B,EAAKC,IAErEyhK,EAGX,SAASjxC,GACL,MAAM1pK,EAAUM,KAAKN,SACf,SAAE+rM,EAAQ,QAAEtvL,GAAYzc,EACxBkc,EAAMqvB,OAAOvrC,EAAQkc,KACrBpS,EAAMyhC,OAAOvrC,EAAQ8J,KACrB+vM,EAAY9N,EAAWhlC,GAAID,GAC3BurC,EAAU/xM,KAAK+xM,UACf5C,EAAY4C,EAAQwH,GAAap9L,EAAU,EAAI,IAC/CkhK,EAAWouB,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QAEjDr7B,GADMoH,GAAW,EAAI,IACLitJ,EAAMmwC,GAAapK,GAEnCyS,EAAc7sM,IADN6G,EAAMpS,GAAO6zK,GAG3B,OAAItoK,EAAS,GAAKA,EAASsoK,EAChB,KAOJ,GAJOouB,EACN7vL,EAAMgmM,EACNp4M,EAAMo4M,E9OhKW,I8OqK7B,eAAetxI,GACX,MAAM5wE,EAAUM,KAAKN,SACf,SAAE+rM,EAAQ,QAAEtvL,EAAO,IAAEP,EAAG,IAAEpS,GAAQ9J,EAClCqyM,EAAU/xM,KAAK+xM,UACfn6L,EAAO6zL,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QAGnD,IAAIr7B,EAAS,GAAMu7D,GADL14D,GADAgE,EAAMpS,I9O1KK,I8OkLzB,OAJKiiM,IAAYtvL,GAAcsvL,GAAYtvL,IACvCpH,GAAUA,GAGP,CACHvL,IAAKA,EAAMuL,EACX6G,IAAKA,EAAM7G,EACXA,OAAQA,GAIhB,WAAWu7D,GACP,MAAM5wE,EAAUM,KAAKN,QACfqV,GAAUu7D,EAAQ5wE,EAAQsyM,UAEhC,MAAO,CACHxoM,IAAK9J,EAAQ8J,IAAMuL,EACnB6G,IAAKlc,EAAQkc,IAAM7G,GAI3B,cACI,OAAO/U,KAAK0hN,aAAa1hN,KAAKN,QAAQsyM,WAG1C,gBAAgBh+L,EAAO68L,EAAckK,GACjC,MAAMr7M,EAAUM,KAAKN,QACf2L,EAAQ,GAAM3L,EAAQ8J,IAAOwK,EAAQtU,EAAQsyM,U9OzM1B,I8O0MnBhuH,EAAOhkF,KAAKi7M,cAAc5vM,EAAOwlM,EAAckK,GAErD,OAAO,IAAI,GAAU1vM,EAAO24E,EAAMhwE,EAAO,KAAM68L,GAGnD,iBAAiBxlM,GACb,MAAMgzB,EAAQr+B,KAAKq+B,QACnB,OAAOA,EAAM70B,KAAO6B,GAASA,GAASgzB,EAAMziB,IAGhD,IAAI00D,GACA,MAAMjyC,EAAQr+B,KAAK6hN,eAAevxI,GAClC,OAAOtwE,KAAKm7M,WAAW98K,EAAM70B,IAAK60B,EAAMziB,IAAK5b,KAAK66M,SAAU76M,KAAK86M,SAAUz8K,EAAMtpB,QAGrF,YAAYxR,EAAO8D,GACf,MAAMy6M,EAAa9hN,KAAK61I,SAAStyI,GAC3Bw+M,EAAW/hN,KAAK61I,SAASxuI,GACzBmC,EAAMD,KAAKC,IAAIs4M,EAAYC,GAC3BnmM,EAAMrS,KAAKqS,IAAIkmM,EAAYC,GAEjC,GAAI/hN,KAAKgiN,aAAax4M,EAAKoS,GACvB,MAAO,CACHpS,IAAKA,EACLoS,IAAKA,GAKjB,UAAU00D,GACN,MAAM,SAAEuqI,EAAQ,SAAEC,GAAa96M,KACzBiiN,EAAWjiN,KAAKkiN,WAAW5xI,GAC3B9mE,EAAM,GAAWy4M,EAASz4M,IAAKqxM,EAAUC,GACzCl/L,EAAM,GAAWqmM,EAASrmM,IAAKi/L,EAAUC,GAE/C,GAAI96M,KAAKgiN,aAAax4M,EAAKoS,GACvB,MAAO,CACHpS,IAAKA,EACLoS,IAAKA,GAKjB,aAAapS,EAAKoS,GACd,OAAOA,EAAMpS,EAAMg3M,IA+F3B,SAASS,GAAe51M,EAAOszB,EAASwjL,GACpC,MAAM3mL,EAAY,GAAMjyB,KAAK+mC,IAAIjlC,EAAQszB,G9OtVZ,I8OyV7B,OAAqB,IAAdnD,GAAmBA,EAFRmD,GAAW,EAAIwjL,GAKrCve,GAAkB,GAAa,CAC3BtgM,KAAM,UACNkG,IAAK,EACLoS,IAAK,EACL6vL,UAAU,EACViI,eAAgB,CACZtnC,SAAS,EACTh8H,MAAO,EACPs7H,MAAO/F,IAEXqqC,OAAQ,CACJ7lM,OAAQ,0BAEZilL,OAAQ,IAGG,IAAA,GAAA,GGzWf,MAAM,WAAsB,GACxB,YAAYynB,EAAWC,EAAWsL,EAAapb,GAC3C,MAAMx9L,EAAM,GAAOqtM,GACbj7L,EAAM,GAAOk7L,GAEb9U,EAAcgF,EAAa9E,KACjC,IAAIxiM,EAAU0iN,GAAe,GAC7B1iN,EAAU0hM,GAAW1hM,GAAW,GAAI,CAChC8J,IAAKk4L,GAAUM,EAAatiM,EAAQ8J,KACpCoS,IAAK8lL,GAAUM,EAAatiM,EAAQkc,KACpCo7L,kBAAmB4B,GAAW5W,EAAatiM,EAAQ2iN,oBAAsB3iN,EAAQs3M,mBACjFU,aAAc,GAASh4M,EAASsiM,KAEpCtiM,EAoMR,SAAuBm3M,EAAWC,EAAWp3M,GACzC,MAAM8J,EAAM9J,EAAQ8J,KAAOqtM,EACrBj7L,EAAMlc,EAAQkc,KAAOk7L,EACrB0B,EAAW94M,EAAQ84M,WAAa58L,GAAOpS,EAnBjD,SAAmB8mE,GACf,IAAIu8C,E1B7Ma,Q0ByNjB,OAVIv8C,G1BlMqB,Q0BmMrBu8C,EAAOqqF,GACA5mI,G1BrMe,Q0BsMtBu8C,E1B/Mc,S0BgNPv8C,G1BxMc,O0ByMrBu8C,E1BlNa,Q0BmNNv8C,G1B3Ma,Q0B4MpBu8C,EAAOoqF,IAGJpqF,EAbX,CAmBiEuqF,GAAiBx7L,EAAKpS,I1B/NlE,S0BgOX84M,EAAenL,GAAcqB,GAC7Bd,EAAeh4M,EAAQg4M,cAAgB,EACvCiJ,EAAU1I,GAAUI,GAAO7uM,GAAO,EAAGgvM,EAAUd,IAAiB,GAAO97L,GACvEklM,EAAU5I,GAASG,GAAOz8L,GAAO,EAAG48L,EAAUd,GAE9C1F,GADgBtyM,EAAQsyM,UAAYtyM,EAAQsyM,eAAY97L,IAC3B8E,GACf8oL,GAAc6c,EAAQz/F,UAAW4/F,EAAQ5/F,WACzCohG,GACAA,EACdC,EAAc,GAAS5B,EAASG,EAAStI,GAEzCgK,EADaxnM,GAAKunM,EAAavQ,GACLuQ,EAC1B5rL,EAAOptB,KAAK2R,MAAMsnM,EAAa,GAC/Bv+M,EAAOu+M,EAAa7rL,EAY1B,OAVKj3B,EAAQ84M,iBACF94M,EAAQ84M,SAGnB94M,EAAQ84M,SAAW94M,EAAQ84M,UAAYA,EACvC94M,EAAQ8J,IAAM9J,EAAQ8J,KAAOguM,GAAYmJ,GAAUhqL,EAAM6hL,EAAUd,GACnEh4M,EAAQkc,IAAMlc,EAAQkc,KAAO47L,GAAYsJ,EAAS78M,EAAMu0M,EAAUd,GAClEh4M,EAAQ4yM,UAAY5yM,EAAQ4yM,WAAaN,EAAY,EACrDtyM,EAAQsyM,UAAYA,EAEbtyM,EA7BX,CApMgC8J,EAAKoS,EAAKlc,GAElCunD,MAAMvnD,EAASsnM,GAEfhnM,KAAKgiM,YAAcA,EACnBhiM,KAAK62M,UAAYrtM,EACjBxJ,KAAK82M,UAAYl7L,EAEjB,MAAM87L,EAAeh4M,EAAQg4M,cAAgB,EAC7C13M,KAAK66M,SAAWxC,GAAOJ,GAAUI,GAAO7uM,GAAO,EAAG9J,EAAQ84M,SAAUd,IACpE13M,KAAK86M,SAAWzC,GAAOH,GAASG,GAAOz8L,GAAO,EAAGlc,EAAQ84M,SAAUd,IAGvE,QACI,OAAO,IAAI,GAAc13M,KAAK62M,UAAW72M,KAAK82M,UAAW13M,OAAOu8B,OAAO,GAAI37B,KAAKN,SAAUM,KAAKgnM,cAGnG,QACI,MAAMtnM,EAAUM,KAAKN,QACrB,MAAO,CAAE8J,IAAK9J,EAAQ8J,IAAKoS,IAAKlc,EAAQkc,KAG5C,aAAa4lM,GACT,MAAM9hN,EAAUM,KAAKN,QAErB,OAAO6J,KAAK2R,MACR,GAASxb,EAAQ8J,IAAK9J,EAAQkc,IAAKlc,EAAQ84M,UAAYgJ,EAAY,GAI3E,iBAAiBpuL,GACb,MAAM1zB,EAAUM,KAAKN,QACf+rM,EAAW/rM,EAAQ+rM,SACnBsG,EAAU/xM,KAAK+xM,UACf/nM,GAAOyhM,GAAY,EAAI,IAAM/rM,EAAQyc,SAAW,EAAI,GAEpD5Y,EAAQwuM,GAAStG,EAAWhlC,GAAID,KADZ,IAARx8J,EAAY,EAAI,IAE5By3M,EAAYzhN,KAAK0hN,aAAatuL,GAC9BqvL,EAAYrK,GAAS14M,EAAQkc,IAAKlc,EAAQ8J,KAE1CquC,GADW4zJ,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,SAC9BqyK,EACnB/K,EAAeh4M,EAAQg4M,cAAgB,EAEvCqC,EAAY,CAAEx2M,GACpB,IAAK,IAAI7C,EAAI,EAAGA,EAAI+gN,EAAW/gN,IAAK,CAChC,MACMomH,EAAMvjH,EAAQ60M,GADPZ,GAAY93M,EAAQ8J,IAAK9I,EAAI0yB,EAAM1zB,EAAQ84M,SAAUd,GAC/Bh4M,EAAQ8J,KAAOquC,EAAQ7tC,EAE1D+vM,EAAU12M,KAAK,GAAMyjH,EjPrEF,IiPwEvB,OAAOizF,EAGX,wBACI,OAAO/5M,KAAKm6M,iBAAiBn6M,KAAKN,QAAQsyM,WAG9C,wBACI,OAAOhyM,KAAKm6M,iBAAiBn6M,KAAKN,QAAQ4yM,WAG9C,QAAQrzM,EAAGC,EAAG4iC,GACV,OAAO,GAAY7gC,UAAUmyM,QAAQ1/L,KACjC1T,KAAM0hM,GAAU1hM,KAAKgiM,YAAa/iM,GAAIyiM,GAAU1hM,KAAKgiM,YAAa9iM,GAAI4iC,GAI9E,SAASsnI,GACL,MAAM/9J,EAAQ,GAAYpK,UAAU40I,SAASniI,KAAK1T,KAAMopK,GAExD,OAAiB,OAAV/9J,EAAiB,GAAOA,GAAS,KAG5C,cACI,OAAOrL,KAAK0hN,aAAa1hN,KAAKN,QAAQsyM,WAG1C,gBAAgBh+L,EAAO68L,EAAckK,GACjC,MAAMr7M,EAAUM,KAAKN,QACfqV,EAASf,EAAQtU,EAAQsyM,UAE/B,IAAItyF,EAAOhgH,EAAQ8J,IAEfuL,EAAS,IACT2qG,EAAO83F,GAAY93F,EAAM3qG,EAAQrV,EAAQ84M,SAJxB94M,EAAQg4M,cAAgB,IAQ7C7G,EAAa1mM,OAAS0mM,EAAa1mM,QADhB0mM,EAAasP,YAAYzgN,EAAQ84M,UAGpD,MAAMx0H,EAAOhkF,KAAKi7M,cAAcv7F,EAAMmxF,EAAckK,GACpD,OAAO,IAAI,GAAUr7F,EAAM17B,EAAMhwE,EAAO,KAAM68L,GAGlD,eAAevgI,EAAO+rE,GAClB,MAAM38I,EAAUM,KAAKN,QACf84M,EAAW94M,EAAQ84M,SACnBd,EAAeh4M,EAAQg4M,cAAgB,EACvC3F,EAAU/xM,KAAK+xM,UACfn6L,EAAOlY,EAAQ+rM,SAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QACrD/R,EAAQr+B,KAAKq+B,QACbwZ,EAAQjgC,EAAOwgM,GAAS/5K,EAAMziB,IAAKyiB,EAAM70B,KACzCuL,EAAS,GAAMu7D,EAAQz4B,EjPvHJ,KiPuHiCn4C,EAAQyc,SAAW,EAAI,GACjF,IAAInT,EAAOquM,GAAS33M,EAAQ8J,IAAKuL,GAC7B9L,EAAKouM,GAAS33M,EAAQkc,IAAK7G,GAO/B,OALKsnI,IACDrzI,EAAOwuM,GAAYxuM,EAAM,EAAGwvM,EAAUd,GACtCzuM,EAAKuuM,GAAYvuM,EAAI,EAAGuvM,EAAUd,IAG/B,CACHluM,IAAKR,EACL4S,IAAK3S,EACL8L,OAAQA,GAIhB,WAAWu7D,GACP,IAAM9mE,IAAKR,EAAM4S,IAAK3S,GAAOjJ,KAAKN,QAC9Bo/M,EAASv1M,KAAK+mC,IAAIggC,GAEtB,KAAOwuI,KAAU,CACb,MAAMzgL,EAAQ+5K,GAASpvM,EAAMC,GACvBmqB,EAAO7pB,KAAKw1B,MAAc,GAARV,GACpBiyC,EAAQ,GACRtnE,EAAOquM,GAASruM,EAAMoqB,GACtBnqB,EAAKouM,GAASpuM,GAAKmqB,KAEnBpqB,EAAOquM,GAASruM,GAAOoqB,GACvBnqB,EAAKouM,GAASpuM,EAAImqB,IAI1B,MAAO,CAAE5pB,IAAKR,EAAM4S,IAAK3S,GAG7B,iBAAiBoC,GACb,MAAMgzB,EAAQr+B,KAAKq+B,QAEnB,OAAO85K,GAAa9sM,EAAOgzB,EAAM70B,MAAQ,GAAK2uM,GAAa9sM,EAAOgzB,EAAMziB,MAAQ,EAGpF,IAAI00D,GACA,MAAMjyC,EAAQr+B,KAAK6hN,eAAevxI,GAAO,GACnCoyI,EAAgB1iN,KAAKm7M,WAAW9C,GAAOh6K,EAAM70B,KAAM6uM,GAAOh6K,EAAMziB,KAAM5b,KAAK66M,SAAU76M,KAAK86M,SAAUz8K,EAAMtpB,QAEhH,GAAI2tM,EACA,MAAO,CACHl5M,IAAK,GAAOk5M,EAAcl5M,KAC1BoS,IAAK,GAAO8mM,EAAc9mM,MAKtC,YAAYrY,EAAO8D,GACf,MAAMy6M,EAAa9hN,KAAK61I,SAAStyI,GAC3Bw+M,EAAW/hN,KAAK61I,SAASxuI,GACzBmC,EAAMD,KAAKC,IAAIs4M,EAAYC,GAC3BnmM,EAAMrS,KAAKqS,IAAIkmM,EAAYC,GAEjC,MAAO,CACHv4M,IAAK,GAAOA,GACZoS,IAAK,GAAOA,IAIpB,UAAU00D,GACN,MAAMjyC,EAAQr+B,KAAKkiN,WAAW5xI,GAI9B,MAAO,CACH9mE,IAJQ,GAAO,GAAW6uM,GAAOh6K,EAAM70B,KAAMxJ,KAAK66M,SAAU76M,KAAK86M,WAKjEl/L,IAJQ,GAAO,GAAWy8L,GAAOh6K,EAAMziB,KAAM5b,KAAK66M,SAAU76M,KAAK86M,aAyD7ElX,GAAkB,GAAe,CAC7BtgM,KAAMyiK,GACN2tC,eAAgB,CACZtnC,SAAS,EACTh8H,MAAO,EACPs7H,MAAO/F,IAEXqqC,OAAQ,CACJmQ,YAAa3E,MAIN,IAAA,GAAA,GC7Pf,MAAM,WAAwB,GAC1B,YAAY3E,EAAWC,EAAWp3M,EAASsnM,GAEvC,MAAMob,EAAchhB,GAAW,CAAE4Q,UALd,GAK6CxoM,IAAKqtM,EAAWj7L,IAAKk7L,GAAap3M,GAC5F4K,EAAO83M,EAAYpQ,UACnB8O,EA2Wd,SAAqBllM,EAAKtR,GACtB,MAAMq4M,EAAkB,GAAM,GAAI/mM,EAAKtR,GlPpXV,IkPoXsC,EACnE,IAAIw2M,EASJ,OAPIA,EADAllM,GAAO,EACGtR,EACiB,IAApBq4M,IAA0BA,EAAkB,IAAOA,EAAkB,IAClEp5M,KAAK0+J,IAAI39J,EAAM,GAAIsR,EAAKtR,GAAQ,IAEhCf,KAAK0+J,IAAI39J,EAAMf,KAAKyR,KAAK,GAAIY,EAAKtR,KAGzCw2M,EAXX,CA3WoChK,EAAWxsM,GACjCq2M,EA+Vd,SAAqBn3M,EAAKoS,EAAKlc,GAC3B,MAAM4K,EAAO5K,EAAQsyM,UACrB,IAAI2O,EAAUn3M,EAMd,OALIA,GAAO,EACPm3M,EAAU/kM,GAAO,EAAIrS,KAAK0+J,IAAI39J,GAAO,GAAK,EAClC5K,EAAQghN,cAChBC,EAAUp3M,KAAK0+J,IAAI39J,EAAMf,KAAK2R,MAAM,GAAI1R,EAAKc,MAE1Cq2M,EARX,CA/VoC9J,EAAWC,EAAWsL,GAC5C/jL,EAqUd,SAAmBsiL,EAASG,EAASsB,EAAa1iN,GAC9C,IAAI,IAAE8J,EAAG,IAAEoS,GAAQwmM,EAkBnB,OAhBI,GAAQA,EAAYpL,oBAAsBoL,EAAYpL,mBAAqB,GAC3E4L,KAGC,GAAQljN,EAAQkc,KAEVlc,EAAQkc,KAAO,GACtBgnM,KAFAhnM,EAAMklM,EAKL,GAAQphN,EAAQ8J,KAEV9J,EAAQ8J,KAAO,GACtBo5M,KAFAp5M,EAAMm3M,EAKH,CACHn3M,IAAKA,EACLoS,IAAKA,GArBb,CArUgC+kM,EAASG,EAASsB,EAAa1iN,GAEvD0iN,EAAYxmM,IAAMyiB,EAAMziB,IACxBwmM,EAAY54M,IAAM60B,EAAM70B,IACxB44M,EAAY9P,UAAY5yM,EAAQ4yM,WAAa,GAAMhoM,EAAO,ElPdjC,IkPgBzB28C,MAAMm7J,EAAapb,GAEnBhnM,KAAK66M,SAAW,GAAQn7M,EAAQ8J,KAAOD,KAAKC,IAAIm3M,EAASjhN,EAAQ8J,KAAOm3M,EACxE3gN,KAAK86M,SAAW,GAAQp7M,EAAQkc,KAAOrS,KAAKqS,IAAIklM,EAASphN,EAAQkc,KAAOklM,EACxE9gN,KAAK6iN,OAAS,GAAM,GAAIxkL,EAAM70B,IAAKc,GlPpBV,IkPqBzBtK,KAAK8iN,OAAS,GAAM,GAAIzkL,EAAMziB,IAAKtR,GlPrBV,IkPsBzBtK,KAAK62M,UAAYA,EACjB72M,KAAK82M,UAAYA,EAEjB92M,KAAKywM,eAGT,QACI,OAAO,IAAI,GACPzwM,KAAK62M,UACL72M,KAAK82M,UACL13M,OAAOu8B,OAAO,GAAI37B,KAAKN,SACvBM,KAAKgnM,cAIb,aACI,OAAOhnM,KAAKN,QAAQ8J,IAGxB,QAAQvK,EAAGC,EAAG4iC,GACV,MAAM,QAAEpiC,EAAO,OAAEmjN,EAAM,OAAEC,GAAW9iN,MAC9B,QAAEmc,EAAO,SAAEsvL,EAAUuG,UAAW1nM,GAAS5K,EACzC65M,EAAY9N,EAAWhlC,GAAID,GAC3BurC,EAAU/xM,KAAK+xM,UACf5C,EAAY4C,EAAQwH,GAAap9L,EAAU,EAAI,IAG/CiX,GADMjX,GAAW,EAAI,KADVsvL,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,UAEvB0yK,EAASD,IACnCxI,EAAU,IAAI,GAAItI,EAAQtgC,GAAIsgC,EAAQrgC,GAAIqgC,EAAQtgC,GAAIsgC,EAAQrgC,IACpE,IAuBI/4H,EAAIC,EAvBJr1C,EAAQtE,EACRoI,EAAMnI,EAUV,OARK,GAAQqE,KACTA,EAAQ8D,GAAO,GAGd,GAAQA,KACTA,EAAM9D,GAAS,GAGfA,GAAS,GAAK8D,GAAO,EACd,MAGPy6B,IACAv+B,EAAQgG,KAAKqS,IAAIrS,KAAKC,IAAIjG,EAAO7D,EAAQkc,KAAMlc,EAAQ8J,KACvDnC,EAAMkC,KAAKqS,IAAIrS,KAAKC,IAAInC,EAAK3H,EAAQkc,KAAMlc,EAAQ8J,MAGvDjG,EAAQ,GAAIA,EAAO+G,GACnBjD,EAAM,GAAIA,EAAKiD,GAIXmhM,GACA9yJ,EAAKmqK,EAASv5M,KAAKqS,IAAIrY,EAAO8D,GAC9BuxC,EAAKkqK,EAASv5M,KAAKC,IAAIjG,EAAO8D,KAE9BsxC,EAAKpvC,KAAKC,IAAIjG,EAAO8D,GAAOw7M,EAC5BjqK,EAAKrvC,KAAKqS,IAAIrY,EAAO8D,GAAOw7M,GAGhCxI,EAAQd,EAAY,GAAKgH,GAAgBpR,EAAY/7K,GAAQjX,EAAUy8B,EAAKD,IAC5E0hK,EAAQd,EAAY,GAAKgH,GAAgBpR,EAAY/7K,GAAQjX,EAAUw8B,EAAKC,IAErEyhK,GAGX,SAASjxC,GACL,MAAM,QAAE1pK,EAAO,OAAEmjN,EAAM,OAAEC,GAAW9iN,MAC9B,QAAEmc,EAAO,SAAEsvL,EAAUuG,UAAW1nM,GAAS5K,EACzCqyM,EAAU/xM,KAAK+xM,UACf/nM,EAAMyhM,IAAatvL,EAAU,GAAK,EAClC4mM,EAAoB,IAAR/4M,EAAY,EAAI,EAC5BqzK,EAAWouB,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QAEjDmpK,EAAY9N,EAAWhlC,GAAID,GAE3BzxJ,EAAS/K,GAAOo/J,EAAMmwC,GADVxH,EAAQwH,EAAYwJ,IAItC,OAAIhuM,EAAS,GAAKA,EAASsoK,EAChB,KAKJ,GAAM9zK,KAAK0+J,IAAI39J,EAFRu4M,EANM9tM,IAJL+tM,EAASD,GAAUxlC,IlPjGT,IkPgH7B,QACI,MAAM39K,EAAUM,KAAKN,QACrB,MAAO,CAAE8J,IAAK9J,EAAQ8J,IAAKoS,IAAKlc,EAAQkc,KAG5C,WAAW00D,GACP,MAAMhmE,EAAOtK,KAAKN,QAAQsyM,UACpBj9L,GAAUu7D,EAEhB,MAAO,CACH9mE,IAAKD,KAAK0+J,IAAI39J,EAAMtK,KAAK6iN,OAAS9tM,GAClC6G,IAAKrS,KAAK0+J,IAAI39J,EAAMtK,KAAK8iN,OAAS/tM,IAI1C,eAAeu7D,GACX,MAAM,QAAE5wE,EAAO,OAAEmjN,EAAM,OAAEC,GAAW9iN,MAC9B,QAAEmc,EAAO,SAAEsvL,EAAUuG,UAAW1nM,GAAS5K,EACzCqyM,EAAU/xM,KAAK+xM,UACfn6L,EAAO6zL,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,QAEnD,IAAIr7B,EAAS,GAAMu7D,GADL14D,GAAQkrM,EAASD,IlPpIN,IkP2IzB,OAJKpX,IAAYtvL,GAAcsvL,GAAYtvL,IACvCpH,GAAUA,GAGP,CACHvL,IAAKD,KAAK0+J,IAAI39J,EAAMu4M,EAAS9tM,GAC7B6G,IAAKrS,KAAK0+J,IAAI39J,EAAMw4M,EAAS/tM,GAC7BA,OAAQA,GAIhB,cACI,MAAMiuM,EAAWz5M,KAAK2R,MAAMlb,KAAK8iN,QAGjC,OAFcv5M,KAAK2R,MAAM8nM,EAAWhjN,KAAK6iN,QAAU,EAKvD,wBACI,MAAMvL,EAAQ,GAMd,OAJAt3M,KAAKijN,4BAA6Bn/K,IAC9BwzK,EAAMj0M,KAAKygC,IACZ,CAAE1Q,KAAM,EAAGpS,KAAM,IAEbs2L,EAGX,YAAYxF,GACR,MAAMpyM,EAAUM,KAAKN,SACf,WAAE2wM,EAAU,WAAEF,EAAU,SAAE1E,GAAa/rM,EACvC0xM,EAAS1xM,EAAQswM,OAAOoB,OACxBW,EAAU/xM,KAAK+xM,UAEfE,EAAkB,CAGpBxG,SAAUA,GAGd,SAASzlB,EAAOk9B,EAAcxT,GAC1BuC,EAAgBtC,MAAQyB,EAASW,EAAQpgC,GAAKogC,EAAQpgC,GAAK+9B,EAAY93L,KACvEq6L,EAAgBrC,MAAQwB,EAASW,EAAQrgC,GAAKg+B,EAAY93L,KAAOm6L,EAAQrgC,GACzEugC,EAAgBnuK,SAAWo/K,EAE3BpR,EAAUz3E,OAAOo1E,GAAewC,EAAiBvC,IAWrD,OARIW,EAAWjkC,SACXpsK,KAAKijN,4BAA4Bj9B,EAAQqqB,GAGzCF,EAAW/jC,SACXpsK,KAAKmjN,4BAA4Bn9B,EAAQmqB,GApB/B,GA0BlB,gBAAgB4C,GACZ,MAAMrzM,EAAUM,KAAKN,SACf,eAAE+zM,EAAc,eAAEC,EAAc,SAAEjI,GAAa/rM,EAC/CqyM,EAAUgB,EAAQhB,UAClB8B,EAAc,CAChB1E,UAAW4C,EAAQtG,EAAW,KAAO,MACrCsE,QAASgC,EAAQtG,EAAW,KAAO,MACnCA,SAAUA,GAER4E,EAAa,GAEbj2H,EAAYp6E,KAAK8zM,kBACvB,SAAS9tB,EAAOk9B,EAAcpT,GACrB77J,GAAQivK,EAAc7S,KACvBwD,EAAY/vK,SAAWo/K,EACvB9oI,EAAUigD,OAAOw1E,GAAmBgE,EAAa/D,IAEjDO,EAAWhtM,KAAK6/M,IAYxB,OARIxP,EAAetnC,SACfpsK,KAAKijN,4BAA4Bj9B,EAAQ0tB,GAGzCD,EAAernC,SACfpsK,KAAKmjN,4BAA4Bn9B,EAAQytB,GAGtCr5H,EAAUhpC,SAGrB,4BAA4B7gB,EAAUm/K,GAClC,MAAM,UAAEP,EAAS,KAAE/7K,GAASpzB,KAAKojN,gBAC3B,OAAEP,EAAM,OAAEC,GAAW9iN,KAE3B,IAAK,IAAIgoK,EAAQz+J,KAAKyR,KAAK6nM,GAAUnT,EAAY1uL,KAAMgnJ,GAAS86C,EAAQ96C,GAAS0nC,EAAYt8K,KAEzF7C,EADe,GAAM4+K,EAAY/7K,GAAQ40I,EAAQ66C,GlPvO5B,IkPwOFnT,GAI3B,4BAA4Bn/K,EAAUm/K,GAClC,MAAM,IAAElmM,EAAG,IAAEoS,EAAG,UAAE02L,EAAWN,UAAW1nM,GAAStK,KAAKN,SAChD,UAAEyvM,EAAS,KAAE/7K,GAASpzB,KAAKojN,gBAC3B,OAAEP,EAAM,OAAEC,GAAW9iN,KAG3B,IAAK,IAAIgoK,EAFKz+J,KAAK2R,MAAM2nM,GAED76C,EAAQ86C,EAAQ96C,IAAS,CAC7C,MAAMq7C,EAAerjN,KAAKsjN,sBAAsBt7C,GAChD,IAAK,IAAI96H,EAAMwiK,EAAY1uL,KAAMksB,EAAMolK,EAAWplK,GAAOwiK,EAAYt8K,KAAM,CACvE,MAAM/nB,EAAQg4M,EAAah4M,MAAQ6hC,EAAMm2K,EAAaE,UACtD,GAAIl4M,EAAQuQ,EACR,MAEAvQ,GAAS7B,GAET+mB,EADiB,GAAM4+K,EAAY/7K,GAAQ,GAAI/nB,EAAOf,GAAQu4M,GlP1PjD,IkP2PMnT,KAMnC,gBAAgB17L,EAAO68L,EAAckK,GACjC,MAAM/yC,EAAQz+J,KAAKyR,KAAKhb,KAAK6iN,OAAS7uM,GAChC3I,EAAQ9B,KAAK0+J,IAAIjoK,KAAKN,QAAQsyM,UAAWhqC,GACzChkF,EAAOhkF,KAAKi7M,cAAc5vM,EAAOwlM,EAAckK,GAErD,OAAO,IAAI,GAAU1vM,EAAO24E,EAAMhwE,EAAO,KAAM68L,GAGnD,iBAAiBxlM,GACb,MAAMgzB,EAAQr+B,KAAKq+B,QACnB,OAAOA,EAAM70B,KAAO6B,GAASA,GAASgzB,EAAMziB,IAGhD,IAAI00D,GACA,MAAMjyC,EAAQr+B,KAAK6hN,eAAevxI,GAClC,OAAOtwE,KAAKm7M,WAAW98K,EAAM70B,IAAK60B,EAAMziB,IAAK5b,KAAK66M,SAAU76M,KAAK86M,SAAUz8K,EAAMtpB,QAGrF,YAAYxR,EAAO8D,GACf,MAAMy6M,EAAa9hN,KAAK61I,SAAStyI,GAC3Bw+M,EAAW/hN,KAAK61I,SAASxuI,GAI/B,MAAO,CACHmC,IAJQD,KAAKC,IAAIs4M,EAAYC,GAK7BnmM,IAJQrS,KAAKqS,IAAIkmM,EAAYC,IAQrC,UAAUzxI,GACN,MAAM,QAAE5wE,EAAO,SAAEm7M,EAAQ,SAAEC,GAAa96M,KAClCiiN,EAAWjiN,KAAKkiN,WAAW5xI,GAC3B9mE,EAAM,GAAWy4M,EAASz4M,IAAKqxM,EAAUC,GACzCl/L,EAAM,GAAWqmM,EAASrmM,IAAKi/L,EAAUC,GACzCxwM,EAAO5K,EAAQsyM,UACfwR,EAAqB5nM,EAAMpS,GAAO9J,EAAQ8J,KAAO9J,EAAQkc,KAAQ,GAAM,GAAIlc,EAAQkc,IAAKtR,GAAQ,GAAI5K,EAAQ8J,IAAKc,GlPrS9F,IkPqS0H,EAC7Im5M,IAAmB/jN,EAAQ8J,MAAQqxM,GAAYn7M,EAAQkc,MAAQk/L,IAAa,GAAM,GAAIl/L,EAAKtR,GAAQ,GAAId,EAAKc,GlPtSzF,KkPsSsH,EAE/I,GAAIk5M,GAAsBC,EACtB,MAAO,CACHj6M,IAAKA,EACLoS,IAAKA,GAKjB,sBAAsBosJ,GAClB,MAAM,UAAEsqC,EAAWN,UAAW1nM,GAAStK,KAAKN,QACtC2L,EAAQ9B,KAAK0+J,IAAI39J,EAAM09J,GAK7B,MAAO,CACH38J,MAAOA,EACPk4M,WANch6M,KAAK0+J,IAAI39J,EAAM09J,EAAQ,GACV38J,GACAinM,GAQnC,eACI,MAAM,QAAEn2L,EAAO,SAAEsvL,GAAazrM,KAAKN,QAC7B65M,EAAY9N,EAAWhlC,GAAID,GAC3BurC,EAAU/xM,KAAK+xM,UACf/nM,EAAMyhM,IAAatvL,EAAU,GAAK,EAClC4mM,EAAoB,IAAR/4M,EAAY,EAAI,EAKlC,MAAO,CACHopB,KAJSppB,IADIyhM,EAAWsG,EAAQloC,SAAWkoC,EAAQ3hK,UACvBpwC,KAAK8iN,OAAS9iN,KAAK6iN,SAK/C1T,UAJc4C,EAAQwH,EAAYwJ,GAKlChR,QAASA,IAuDrB,SAAS6Q,KACL,MAAM,IAAIn8M,MAAM,6DAGpB,SAAS,GAAI0pC,EAAGnF,GACZ,OAAOzhC,KAAKulC,IAAIqB,GAAK5mC,KAAKulC,IAAI9D,GAGlC44J,GAAkB,GAAiB,CAC/BtgM,KAAM,MACN0uM,UA1YuB,GA2YvBM,UAAW,EACX0E,kBAAmB,EACnBvL,UAAU,EACViI,eAAgB,CACZtnC,SAAS,EACTh8H,MAAO,EACPs7H,MAAO/F,IAEXypB,OAAQ,EACRohB,cAAc,IAGH,IAAA,GAAA,GC/UA,GAhFQ,CACnBkT,gBAAiB,SAAS3Q,GACtB,MAAMrzM,EAAUM,KAAKN,QACfwtK,EAAS3jK,KAAK+mC,IAAItwC,KAAKs6K,IAAI5jI,SAASvG,EAAI4iK,EAAQhB,UAAUrgC,IAChE,IAEIiyC,EAAaC,EAFbhS,EAAY,GACZiS,GAAY,EAoBhB,OAjBInkN,EAAQg0M,eAAetnC,UACvBu3C,EAAc3jN,KAAK8jN,oBAAoB/Q,GACvC8Q,GAAY,EAEZjS,EAAY5xM,KAAK+jN,qBACbJ,EAAaz2C,EAAQxtK,EAAQg0M,iBAIjCh0M,EAAQ+zM,eAAernC,UACvBw3C,EAAc5jN,KAAKgkN,oBAAoBjR,EAAS8Q,GAEhD,GAAOjS,EAAW5xM,KAAKikN,qBACnBL,EAAa12C,EAAQxtK,EAAQ+zM,eAAgBV,EAAS8Q,KAIvDjS,GAGXmS,qBAAsB,SAAS1d,EAAQn5B,EAAQxtK,GAC3C,OAAOM,KAAKkkN,gBAAgB7d,EAAQn5B,EAAQxtK,IAGhDukN,qBAAsB,SAAS5d,EAAQn5B,EAAQxtK,EAASqzM,EAAS8Q,GAC7D,MAAMM,EAAiBnkN,KAAKmkN,gBAAkBnkN,KAAKmkN,eAAej3C,EAAQ6lC,EAAS8Q,GACnF,OAAO7jN,KAAKkkN,gBAAgB7d,EAAQn5B,EAAQxtK,EAASykN,IAGzDD,gBAAiB,SAAS7d,EAAQn5B,EAAQxtK,EAASykN,GAC/C,MAAM13K,EAAQ,CACVkgI,OAAQ,CACJv8H,MAAO1wC,EAAQ0wC,MACfs7H,MAAOhsK,EAAQgsK,MACf0d,SAAU1pL,EAAQ0pL,WAIpB1yI,EAAS12C,KAAKs6K,IAAI5jI,SAClB0tK,EAAS,IAAI,EAAKl5B,OAAO,CAAEx0I,EAAO1L,EAAG0L,EAAOvG,GAAK+8H,GACjD9yF,EAAYp6E,KAAK8zM,kBAEvB,IAAK,IAAIpzM,EAAI,EAAGA,EAAI2lM,EAAOvlM,OAAQJ,IAAK,CACpC,MAAMmtC,EAAO,IAAI,EAAKw9I,KAAK5+I,GACvB03K,IACAC,EAAOl3C,OAASi3C,EAAe9d,EAAO3lM,KAG1CmtC,EAAKsqI,OAAOisC,EAAO1tK,QACd+gI,OAAO2sC,EAAO90C,QAAQ+2B,EAAO3lM,GAAK,MAEvC05E,EAAUigD,OAAOxsF,GAGrB,OAAOusC,EAAUhpC,UAGrBizK,eAAgB,SAAStR,EAASn7L,EAAMoJ,EAAMoS,EAAMkxL,GAChD,MAAMC,EAAOvkN,KAAKwkN,UAAU5sM,EAAMoJ,EAAMoS,EAAMkxL,GACxC5kN,EAAUqzM,EAAQrzM,QAClB+kN,EAAiB/kN,EAAQ0sK,UAA4C,KAAhC1sK,EAAQmuC,MAAQ,IAAIu+H,QAE/D,OAAO,GAAIm4C,EAAOv2K,IACd,MAAM02K,EAAQ1kN,KAAKwvK,cAAcxhI,GAEjC,IAAKy2K,GAA4B,KAAVC,EACnB,OAAOA,MCnEvB,MAAM,WAA0B,GAC5B,QACI,MAAO,CAAEl7M,IAAK,EAAGoS,IAAK5b,KAAKN,QAAQq5M,WAAWj4M,QAGlD,OAAOw5K,GACHt6K,KAAKs6K,IAAMA,EACXt6K,KAAK2kN,eAGT,UACI,OAAO3kN,KAAKs6K,IAGhB,eACI,MAAM,OAAE01B,EAAQtwM,SAAWswM,OAAQa,IAAmB7wM,KAChDghB,EAAO6vL,EAAa7vL,MAAQ,EAC5BoS,EAAOy9K,EAAaz9K,MAAQ,EAC5BinJ,EAAa,IAAI,GAEvB,IAAK,IAAI35K,EAAI,EAAGA,EAAIsvM,EAAOlvM,OAAQJ,IAAK,CACpCsvM,EAAOtvM,GAAGmmM,OAAOxsB,GACjB,MAAM86B,EAAWnF,EAAOtvM,GAAG45K,IAE3B01B,EAAOtvM,GAAGmmM,OAAO7mM,KAAKozM,QAAQpyL,EAAOtgB,EAAI0yB,GAAMwxL,YAC3C,EAAGzP,EAAS/kK,QAAS+kK,EAAStrC,YAK1C,UAAUjyJ,EAAMitM,EAAYC,EAAYR,GAAa,GACjD,MAAM5kN,EAAUM,KAAKN,QAEfqlN,EADarlN,EAAQq5M,WAAWj4M,OACR8W,GAAQ,EAChCotM,EAAW,IAAMD,EAEjB3xL,EAAO0xL,GAAc,EACrBP,EAAO,GACb,IAAIztK,EAAQ,EAEZ,IAAK,IAAIp2C,EALImkN,GAAc,EAKRnkN,EAAIqkN,EAAUrkN,GAAK0yB,EAE9B0jB,EADAp3C,EAAQyc,QACA,IAAMzb,EAAIskN,EAEVtkN,EAAIskN,EAGhBluK,EAAQ,GAAMA,EpPpDK,GoPoDqB,IAElCwtK,GAAcrwK,GAAQ6C,EAAOwtK,IAC/BC,EAAKlhN,KAAKyzC,GAIlB,OAAOytK,EAGX,iBACI,OAAOvkN,KAAKwkN,UAAU,GAG1B,iBACI,OAAOxkN,KAAKwkN,UAAU,IAG1B,cAAcliK,GACV,OAAQ,IAAMA,EAAWtiD,KAAKN,QAAQsvK,YAAc,IAGxD,cACI,OAAO,GAAIhvK,KAAKilN,iBAAmB3iK,GAAatiD,KAAKwvK,cAAcltH,IAGvE,aACI,MAAO,GAGX,oBAAoBywJ,GAChB,MAAMW,EAAiB1zM,KAAKN,QAAQg0M,eACpC,OAAO1zM,KAAKqkN,eAAetR,EAAS,EAAGW,EAAe1yL,KAAM0yL,EAAetgL,MAG/E,oBAAoB2/K,EAAS8Q,GACzB,MAAM,eAAEpQ,EAAc,eAAEC,GAAmB1zM,KAAKN,QAC1CokN,EAAsBD,EAAY7jN,KAAKwkN,UAAU,EAAG9Q,EAAe1yL,KAAM0yL,EAAetgL,MAAQ,KAEtG,OAAOpzB,KAAKqkN,eAAetR,EAAS,GAAKU,EAAezyL,KAAMyyL,EAAergL,KAAM0wL,GAGvF,eAAe52C,EAAQ6lC,EAAS8Q,GAC5B,GAAI9Q,EAAQrzM,QAAQ4D,OAASoiK,GAAK,CAC9B,MAAMw/C,EAAa,GAAI,KAAwC,EAAjCllN,KAAKN,QAAQq5M,WAAWj4M,SAChDqkN,EAAc57M,KAAKm/J,IAAIw8C,GAAch4C,EACrCy2C,EAAc3jN,KAAK2jN,cASzB,OAPuB,SAAS7sK,GAC5B,OAAK+sK,GAAa5vK,GAAQ6C,EAAO6sK,GACtBz2C,EAGJi4C,IAMnB,kBACI,MAAMvS,EAAY5yM,KAAKN,QAAQkzM,WAAa,GAEtCr7K,EAAQv3B,KAAK8yM,eAAiB,IAAI,EAAK/1F,MAAM,CAC/CqyE,QAAS,IAGb,IAAK,IAAI1uL,EAAI,EAAGA,EAAIkyM,EAAU9xM,OAAQJ,IAAK,CACvC,MAAM6kI,EAAOqtE,EAAUlyM,GACjB80M,EAAOx1M,KAAKolN,aAAa7/E,GACzB+0E,EAAat6M,KAAKozM,QAAQ7tE,EAAKv8H,MAE/B2tB,EAAO4uG,EAAKv8H,KAAOO,KAAK2R,MAAMqqH,EAAKv8H,MACzCwsM,EAAKxmC,YAAcr4I,EAAO2jL,EAAWxjK,MAErC,MAAM7yC,EAAOsF,KAAKyR,KAAKuqH,EAAKt8H,IAAMs8H,EAAKt8H,GACvCusM,EAAK1+J,QAAU7yC,EAAO0yB,GAAQ2jL,EAAWxjK,MAEzC,MAAMmgG,EAAO,GAAa5gI,QAAQgvM,WAAW7P,EAAM,CAC/C13M,KAAM,CACF4tK,MAAOnmC,EAAKmmC,MACZoC,QAASvoC,EAAKuoC,SAElBnB,OAAQ,CACJmB,QAASvoC,EAAKuoC,WAGtBv2I,EAAM8iG,OAAO4c,GAGjBj3I,KAAKunM,aAAahwK,GAGtB,aAAaguG,GACT,OAAOvlI,KAAKozM,QAAQ7tE,EAAKv8H,KAAMu8H,EAAKt8H,GAAK,GAG7C,QAAQD,EAAMC,GACV,MAAMvJ,EAAUM,KAAKN,QACfq3M,EAAYr3M,EAAQq3M,UACpBz8B,EAAMt6K,KAAKs6K,IACXiqC,EAAOvkN,KAAK2jN,cACZ2B,EAAYf,EAAKzjN,OACjBykN,EAAY,IAAMD,EACxB,IAAIE,EAAYx8M,EAEZtJ,EAAQyc,UAAY46L,IACpByO,GAAaA,EAAY,GAAKF,GAGlCE,EAAY,GAAWj8M,KAAK2R,MAAMsqM,GAAY,EAAGF,EAAY,GAC7D,IAAIG,EAAYlB,EAAKiB,GAEjBzO,IACA0O,GAAwBF,EAAY,EAEhCE,EAAY,IACZA,GAAa,MAIrB,MAEM3uK,EAAQyuK,GAFE,GAAWh8M,KAAKyR,KAAK/R,GAAMu8M,GAAYA,EAAWF,EAAY,GACtDE,EAAY,GAGpC,OAAO,IAAI,GAAKlrC,EAAI5jI,SAAU,EAAG4jI,EAAIzQ,SAAW,EAAG47C,EAAW3uK,GAGlE,KAAK9tC,EAAMC,GACP,MAAMusM,EAAOx1M,KAAKozM,QAAQpqM,EAAMC,GAC1B+lK,EAAawmC,EAAKxmC,WAAa,IAGrC,OAAO,IAAI,EAAKic,IAAI,CAAEuqB,EAAK9+J,OAAO1L,EAAGwqK,EAAK9+J,OAAOvG,GAAK,CAClD6+H,WAAYA,EACZC,SAJaD,EAAawmC,EAAK1+J,MAK/Bg4H,QAAS0mC,EAAKtoC,OACd6B,QAASymC,EAAKtoC,SAItB,mBAAmB9D,GACf,MAAMtoK,EAASd,KAAKN,QAAQq5M,WAAWj4M,OACvC,IAAIkT,EAAQ,KAEZ,IAAK,IAAItT,EAAI,EAAGA,EAAII,EAAQJ,IAExB,GADaV,KAAKozM,QAAQ1yM,GACjBqqK,cAAc3B,GAAQ,CAC3Bp1J,EAAQtT,EACR,MAIR,OAAOsT,GAIf4vL,GAAkB,GAAmB,CACjC50B,WAAY,GACZghC,OAAQ,CACJ/G,OAAQzH,GAAW,KAEvBkS,eAAgB,CACZtnC,SAAS,GAEb2qC,WAAW,IAEf3V,GAAW,GAAkBngM,UAAW,IAEzB,IAAA,GAAA,GCtNf,MAAM,WAAkB,GACpB,YAAYvB,EAASsnM,GACjB//I,MAAMvnD,EAASsnM,GAEf,MAAM0e,EAAkB1lN,KAAKN,QAE7BgmN,EAAgBpT,UAAYoT,EAAgBpT,WAAaoT,EAAgB1T,UAAY,EAGzF,aAAawP,GACT,OAAO,GAAYvgN,UAAUygN,aAAahuM,KAAK1T,KAAMwhN,GAAa,EAGtE,OAAOlnC,GACHt6K,KAAKs6K,IAAMA,EACXt6K,KAAK2kN,eAGT,eACI,MAAM,QAAEjlN,EAAO,OAAEswM,EAAQtwM,SAAWswM,OAAQa,IAAmB7wM,KACzDghB,EAAO6vL,EAAa7vL,MAAQ,EAC5BoS,EAAOy9K,EAAaz9K,MAAQ,EAE5BinJ,EAAa,IAAI,GACjBkqC,EAAOvkN,KAAKwkN,UAAU9kN,EAAQsyM,UAAWhxL,EAAMoS,GAErD,IAAK,IAAI1yB,EAAI,EAAGA,EAAIsvM,EAAOlvM,OAAQJ,IAAK,CACpCsvM,EAAOtvM,GAAGmmM,OAAOxsB,GACjB,MAAM86B,EAAWnF,EAAOtvM,GAAG45K,IAE3B01B,EAAOtvM,GAAGmmM,OAAO7mM,KAAKozM,QAAQmR,EAAK7jN,IAAIkkN,YAAY,EAAGzP,EAAS/kK,QAAS+kK,EAAStrC,YAIzF,UACI,OAAO7pK,KAAKs6K,IAGhB,UAAU1iK,EAAMitM,EAAYC,EAAYR,GAAa,GACjD,MAAM96M,EAAMxJ,KAAKN,QAAQ8J,IACnBi4M,EAAYzhN,KAAK0hN,aAAa9pM,GAC9B2sM,EAAO,GAEPnxL,EAAO0xL,GAAc,EAE3B,IAAK,IAAIpkN,EAHImkN,GAAc,EAGRnkN,EAAI+gN,EAAW/gN,GAAK0yB,EAAM,CACzC,MAAM/c,GAAW,IAAM7M,EAAM9I,EAAIkX,GAAQ,IACnC0sM,GAAcrwK,GAAQ59B,EAASiuM,IACjCC,EAAKlhN,KAAKgT,GAIlB,OAAOkuM,EAGX,iBACI,OAAOvkN,KAAKwkN,UAAUxkN,KAAKN,QAAQsyM,WAGvC,iBACI,OAAOhyM,KAAKwkN,UAAUxkN,KAAKN,QAAQ4yM,WAGvC,cAAc5xM,GACV,OAAQ,IAAMA,EAAIV,KAAKN,QAAQsvK,YAAc,IAGjD,aACI,MAAO,GAGX,oBAAoB+jC,GAChB,MAAMW,EAAiB1zM,KAAKN,QAAQg0M,eACpC,OAAO1zM,KAAKqkN,eAAetR,EAAS/yM,KAAKN,QAAQsyM,UAAW0B,EAAe1yL,KAAM0yL,EAAetgL,MAGpG,oBAAoB2/K,EAAS8Q,GACzB,MAAMnkN,EAAUM,KAAKN,SACf,eAAE+zM,EAAc,eAAEC,GAAmBh0M,EACrCokN,EAAsBD,EAAY7jN,KAAKwkN,UAAU9kN,EAAQsyM,UAAW0B,EAAe1yL,KAAM0yL,EAAetgL,MAAQ,KAEtH,OAAOpzB,KAAKqkN,eAAetR,EAASrzM,EAAQ4yM,UAAWmB,EAAezyL,KAAMyyL,EAAergL,KAAM0wL,GAGrG,aAAav+E,GACT,OAAOvlI,KAAKozM,QAAQ7tE,EAAKv8H,KAAMu8H,EAAKt8H,IAGxC,QAAQhK,EAAGC,GACP,MAAM,QAAEQ,EAAO,IAAE46K,GAAQt6K,KACnBgvK,EAAatvK,EAAQsvK,WAC3B,IAAIzrK,EAAQ,GAAWtE,EAAGS,EAAQ8J,IAAK9J,EAAQkc,KAC3CvU,EAAM,GAAWnI,GAAKqE,EAAOA,EAAO7D,EAAQkc,KAUhD,GARIlc,EAAQyc,UACR5Y,IAAU,EACV8D,IAAQ,GAGZ9D,GAAS,IAAMA,EAAQyrK,GAAc,IACrC3nK,GAAO,IAAMA,EAAM2nK,GAAc,IAE7B3nK,EAAM9D,EAAO,CACb,MAAMmjD,EAAMnjD,EACZA,EAAQ8D,EACRA,EAAMq/C,EAGV,OAAO,IAAI,GAAK4zH,EAAI5jI,SAAU,EAAG4jI,EAAIzQ,SAAW,EAAGtmK,EAAO8D,EAAM9D,GAGpE,KAAKyF,EAAMC,EAAKD,GACZ,MAAMtJ,EAAUM,KAAKN,QACf6D,EAAQ,IAAM7D,EAAQsvK,WACtBwmC,EAAOx1M,KAAKozM,QAAQpqM,EAAMC,GAC1BO,EAAMD,KAAKC,IAAIR,EAAMC,GACrB2S,EAAMrS,KAAKqS,IAAI5S,EAAMC,GAC3B,IAAI+lK,EAAYC,EAahB,OAXIvvK,EAAQyc,SACR6yJ,EAAaxlK,EACbylK,EAAWrzJ,IAEXozJ,EAAa,IAAMpzJ,EACnBqzJ,EAAW,IAAMzlK,GAGrBwlK,GAAcA,EAAazrK,GAAS,IACpC0rK,GAAYA,EAAW1rK,GAAS,IAEzB,IAAI,EAAK0nL,IAAI,CAAEuqB,EAAK9+J,OAAO1L,EAAGwqK,EAAK9+J,OAAOvG,GAAK,CAClD6+H,WAAYA,EACZC,SAAUA,EACVH,QAAS0mC,EAAKtoC,OACd6B,QAASymC,EAAKtoC,SAItB,SAAS9D,GACL,MAAM1pK,EAAUM,KAAKN,QACfg3C,EAAS12C,KAAKs6K,IAAI5jI,SAGxB,IAAIwtJ,EAAQ36L,KAAKw1B,MAAM,GAAIx1B,KAAKuvC,MADrBswH,EAAMj5H,EAAIuG,EAAOvG,EADjBi5H,EAAMp+H,EAAI0L,EAAO1L,KAGxBznC,EAAQ7D,EAAQsvK,WAOpB,OALKtvK,EAAQyc,UACT+nL,IAAU,EACV3gM,IAAU,IAGN2gM,EAAQ3gM,EAAQ,KAAO,IAGnC,aACI,MAAO,CACHiG,IAAK,EACLoS,IAAe,EAAVrS,KAAKwvC,KAKtB6qJ,GAAkB,GAAW,CACzBtgM,KAAM,QACN0rK,WAAY,EACZ7yJ,SAAS,EACT61L,UAAW,GACXxoM,IAAK,EACLoS,IAAK,IACLo0L,OAAQ,CACJ/G,OAAQzH,GAAW,KAEvBkS,eAAgB,CACZhoC,MAAO/F,GACPyG,SAAS,EACTh8H,MAAO,GAEXqjK,eAAgB,CACZ/nC,MAAO,UAIf01B,GAAW,GAAUngM,UAAW,GAAgB,CAC5C0wM,gBAAiB,GAAkB1wM,UAAU0wM,gBAC7CgS,YAAa,GAAkB1iN,UAAU0iN,YACzCtlL,MAAO,GAAYp9B,UAAUo9B,MAC7BuyK,YAAa,GAAY3vM,UAAU2vM,YACnCM,gBAAiB,GAAYjwM,UAAUiwM,kBAG5B,IAAA,GAAA,GC1Cf,SAASyU,GAAgB1mN,EAAGC,GACxB,OAAO,IAAMqK,KAAK+mC,IAAI/mC,KAAK+mC,IAAIrxC,EAAIC,GAAK,KAG7B,IAAA,GA3Je,CAC1BQ,QAAS,CACLg0M,eAAgB,CACZtnC,SAAS,IAIjBulC,gBAAiB,WACb,MAAQ+B,gBAAgB,KAAEpwM,GAAM,UAAEsvM,EAAY,IAAO5yM,KAAKN,QACpDqzM,EAAU/yM,KAAK6yM,SAAS+S,UACxBjC,EAAc5Q,EAAQ4Q,cACtBjtK,EAASq8J,EAAQz4B,IAAI5jI,SACrBnf,EAAQv3B,KAAK8yM,eAAiB,IAAI,EAAK/1F,MAAM,CAC/CqyE,QAAS,IAGb,IAAK,IAAI1uL,EAAI,EAAGA,EAAIkyM,EAAU9xM,OAAQJ,IAAK,CACvC,MAAM6kI,EAAOqtE,EAAUlyM,GACjBmlN,EAAY,CACd/nN,KAAM,CACF4tK,MAAOnmC,EAAKmmC,MACZoC,QAASvoC,EAAKuoC,SAElBnB,OAAQ,CACJmB,QAASvoC,EAAKuoC,UAIhB0nC,EAAOx1M,KAAKozM,QAAQ7tE,EAAKv8H,KAAMu8H,EAAKt8H,IAAI,GACxCguI,EAAO,IAAI,GAAKvgG,EAAQA,EAAOvG,EAAIqlK,EAAK5jC,GAAIl7H,EAAOvG,EAAIqlK,EAAK9jC,GAAI,EAAG,KAEzE,IAAIyc,EAEAA,EADA7qL,IAASoiK,GACD,GAAarvJ,QAAQgvM,WAAWpuE,EAAM4uE,GAEtC,EAAKx6B,KAAK1gB,WAAW3qK,KAAK8lN,eAAe7uE,EAAM0sE,GAAckC,GAAWpnN,QAGpF84B,EAAM8iG,OAAO8zD,GAGjBnuL,KAAKunM,aAAahwK,IAGtBuuL,eAAgB,SAAS7uE,EAAMovD,GAC3B,MAAM0f,EAAc,GACdC,EAAc,GACdtvK,EAAS,CAAEugG,EAAKvgG,OAAO1L,EAAGisG,EAAKvgG,OAAOvG,GACtC81K,EAAc,IAAI,EAAK/6B,OAAOx0I,EAAQugG,EAAKguD,aAC3CihB,EAAc,IAAI,EAAKh7B,OAAOx0I,EAAQugG,EAAKi2B,QAEjD,IAAK,IAAIxsK,EAAI,EAAGA,EAAI2lM,EAAOvlM,OAAQJ,IAC/BqlN,EAAY1iN,KAAK4iN,EAAY32C,QAAQ+2B,EAAO3lM,GAAK,MACjDslN,EAAY3iN,KAAK6iN,EAAY52C,QAAQ+2B,EAAO3lM,GAAK,MAOrD,OAJAqlN,EAAY5pM,UACZ4pM,EAAY1iN,KAAK0iN,EAAY,IAC7BC,EAAY3iN,KAAK2iN,EAAY,IAEtBA,EAAYr8M,OAAOo8M,IAG9BrC,gBAAiB,SAAS3Q,GACtB,MAAMrzM,EAAUM,KAAKN,QACf2wM,EAAarwM,KAAKmmN,8BAClBxC,EAAc5Q,EAAQ4Q,cACtBjtK,EAASq8J,EAAQz4B,IAAI5jI,SAC3B,IAAIk7J,EAAY,GAQhB,GANIlyM,EAAQg0M,eAAetnC,UACvBwlC,EAAY5xM,KAAKkkN,gBACbxtK,EAAQ25J,EAAYsT,EAAajkN,EAAQg0M,iBAI7Ch0M,EAAQ+zM,eAAernC,QAAS,CAChC,MAAM+jC,EAAanwM,KAAKomN,8BACxB,GAAOxU,EAAW5xM,KAAKkkN,gBACnBxtK,EAAQy5J,EAAYwT,EAAajkN,EAAQ+zM,iBAIjD,OAAO7B,GAGXsS,gBAAiB,SAASxtK,EAAQ4gK,EAAOjR,EAAQ3mM,GAC7C,MAAM+sC,EAAQ,CACVkgI,OAAQ,CACJv8H,MAAO1wC,EAAQ0wC,MACfs7H,MAAOhsK,EAAQgsK,MACf0d,SAAU1pL,EAAQ0pL,YAGpB,KAAEpoK,EAAO,EAAC,KAAEoS,EAAO,GAAM1zB,EACzB06E,EAAYp6E,KAAK8zM,kBAEvB,IAAK,IAAIa,EAAS3zL,EAAM2zL,EAAS2C,EAAMx2M,OAAQ6zM,GAAUvhL,EAAM,CAC3D,MAAMizL,EAAa3vK,EAAOvG,EAAImnK,EAAM3C,GACpC,GAAI0R,EAAa,EAAG,CAChB,MAAMjC,EAAS,IAAI,EAAKl5B,OAAO,CAAEx0I,EAAO1L,EAAG0L,EAAOvG,GAAKk2K,GACvD,GAAI3mN,EAAQ4D,OAASoiK,GACjBtrF,EAAUigD,OAAO,IAAI,EAAK6wD,OAAOk5B,EAAQ33K,QACtC,CACH,MAAMoB,EAAO,IAAI,EAAKw9I,KAAK5+I,GAC3B,IAAK,IAAI65K,EAAU,EAAGA,EAAUjgB,EAAOvlM,OAAQwlN,IAC3Cz4K,EAAK4pI,OAAO2sC,EAAO90C,QAAQ+2B,EAAOigB,GAAW,MAGjDz4K,EAAKpvC,QACL27E,EAAUigD,OAAOxsF,KAK7B,OAAOusC,EAAUhpC,UAGrBykG,SAAU,SAASuzB,GACf,MAAM2oC,EAAU/xM,KAAK+xM,UACfgB,EAAU/yM,KAAK6yM,SAAS+S,UACxBjC,EAAc5Q,EAAQ4Q,cACtBjtK,EAASq8J,EAAQz4B,IAAI5jI,SACrBw2H,EAAS9D,EAAMyE,WAAWn3H,GAChC,IAAIM,EAAWk2H,EAEf,GAAIltK,KAAKN,QAAQg0M,eAAepwM,OAASoiK,IAAOi+C,EAAY7iN,OAAS,EAAG,CACpE,MAEMojM,GAAS,GAAI36L,KAAKuvC,MADbswH,EAAMj5H,EAAIuG,EAAOvG,EADjBi5H,EAAMp+H,EAAI0L,EAAO1L,IAEa,KAAO,IAEhD24K,EAAYr5L,MAAAA,SAAcrrB,EAAGC,GACzB,OAAOymN,GAAgB1mN,EAAGilM,GAASyhB,GAAgBzmN,EAAGglM,MAK1D,MAAMqiB,EAAWZ,GAAgBhC,EAAY,GAAIA,EAAY,IAAM,EAC7De,EAAQiB,GAAgBzhB,EAAOyf,EAAY,IAC3C6C,EAAQ,GAAKD,EAGnBvvK,EAAWk2H,GAAU3jK,KAAKo/J,IAAI,GAFjB,IAAM+7C,EAAQ8B,IAEgBj9M,KAAKo/J,IAAI,GAAI69C,KAG5D,OAAOxmN,KAAKymN,WAAWxlN,UAAU40I,SAASniI,KACtC1T,KAAM,IAAI,GAAM+xM,EAAQtgC,GAAIsgC,EAAQngC,GAAK56H,MCtJrD,MAAM,WAAyB,GAC3B,8BACI,OAAOh3C,KAAKm6M,iBAAiBn6M,KAAKN,QAAQsyM,WAG9C,8BACI,MAAMtyM,EAAUM,KAAKN,QACrB,IAAIgnN,EAAgB,EAKpB,OAHIhnN,EAAQg0M,eAAetnC,UACvBs6C,EAAgBhnN,EAAQsyM,WAErBhyM,KAAKm6M,iBAAiBz6M,EAAQ4yM,UAAWoU,GAGpD,WACI,OAAO,IAIftlB,GAAW,GAAiBngM,UAAW,IAExB,IAAA,GAAA,GCtBf,MAAM,WAA6B,GAC/B,8BACI,MAAM84M,EAAY,GAMlB,OAJA/5M,KAAKijN,6BAAAA,SAAqCn/K,GACtCi2K,EAAU12M,KAAKygC,KAChB9jC,KAAKN,QAAQg0M,gBAETqG,EAGX,8BACI,MAAMA,EAAY,GAMlB,OAJA/5M,KAAKmjN,6BAAAA,SAAqCr/K,GACtCi2K,EAAU12M,KAAKygC,KAChB9jC,KAAKN,QAAQ+zM,gBAETsG,EAGX,WACI,OAAO,IAIf3Y,GAAW,GAAqBngM,UAAW,IAE5B,IAAA,GAAA,GC+Pf,SAAS,GAAWoK,GAChB,OAAOA,GAAS,GAAK,EAAI,EAGd,IAAA,GA5Rf,cAA6B,GAEzB,YAAYq6C,GACRuB,QAEAjnD,KAAK0lD,OAASA,EAGlB,QAAQihK,GACJ,MAAM92C,EAAS82C,EAAWziN,MAAM,GAC1By2I,EAAW,GACjB,IAAIj1F,EAAS1lD,KAAK0lD,OACd5kD,EAAS+uK,EAAO/uK,OAOpB,GALIA,EAAS,IACTd,KAAK4mN,iBAAiB,EAAG/2C,GACzB/uK,EAAS+uK,EAAO/uK,QAGhBA,EAAS,GAAiB,IAAXA,GAAgB+uK,EAAO,GAAG7F,OAAO6F,EAAO,IACvD,OAAOl1B,EAGX,IA2BIksE,EAAqBC,EA3BrBl2C,EAAKf,EAAO,GACZl3H,EAAKk3H,EAAO,GACZj3H,EAAKi3H,EAAO,GAIhB,IAFAl1B,EAASt3I,KAAK,IAAI,EAAK0jN,QAAQn2C,IAExBA,EAAG5G,OAAO6F,EAAO/uK,EAAS,KAC7B4kD,GAAS,EACTmqH,EAAOnsK,MACP5C,IAGJ,GAAe,IAAXA,EAAc,CACd,MAAMkmN,EAAUhnN,KAAKgnN,QAAQp2C,EAAGj4H,EAAI6tH,GAAGC,IAWvC,OATA,GAAK9rB,GAAU06B,WACXr1K,KAAKinN,kBAAkBD,EAASp2C,EAAIj4H,EAAI6tH,GAAGC,KAG/C9rB,EAASt3I,KAAK,IAAI,EAAK0jN,QACnBpuK,EACA34C,KAAKknN,mBAAmBF,EAASp2C,EAAIj4H,EAAI6tH,GAAGC,MAGzC9rB,EAKX,GAAIj1F,EAAQ,CACRkrH,EAAKf,EAAO/uK,EAAS,GAAI63C,EAAKk3H,EAAO,GAAIj3H,EAAKi3H,EAAO,GACrD,MAAMs3C,EAAgBnnN,KAAKmnN,cAAcv2C,EAAIj4H,EAAIC,GACjDiuK,EAAsBM,EAAc,GACpCL,EAAmBK,EAAc,OAC9B,CACH,MAAMH,EAAUhnN,KAAKgnN,QAAQp2C,EAAIj4H,EAAI6tH,GAAEC,IACvCogD,EAAsB7mN,KAAKinN,kBAAkBD,EAASp2C,EAAIj4H,EAAI6tH,GAAGC,IAGrE,IAAI2gD,EAAMP,EACV,IAAK,IAAI35K,EAAM,EAAGA,GAAOpsC,EAAS,EAAGosC,IAGjC,GAFAltC,KAAK4mN,iBAAiB15K,EAAK2iI,GAC3B/uK,EAAS+uK,EAAO/uK,OACZosC,EAAM,GAAKpsC,EAAQ,CACnB8vK,EAAKf,EAAO3iI,GAAMyL,EAAKk3H,EAAO3iI,EAAM,GAAI0L,EAAKi3H,EAAO3iI,EAAM,GAC1D,MAAMi6K,EAAgBnnN,KAAKmnN,cAAcv2C,EAAGj4H,EAAGC,GAE/C,GAAK+hG,GAAU06B,WAAW+xC,GAC1BA,EAAMD,EAAc,GAGpBxsE,EAASt3I,KAAK,IAAI,EAAK0jN,QAAQpuK,EADnBwuK,EAAc,KAKlC,GAAIzhK,EAAQ,CACRkrH,EAAKf,EAAO/uK,EAAS,GAAI63C,EAAKk3H,EAAO/uK,EAAS,GAAI83C,EAAKi3H,EAAO,GAC9D,MAAMs3C,EAAgBnnN,KAAKmnN,cAAcv2C,EAAIj4H,EAAIC,GAEjD,GAAK+hG,GAAU06B,WAAW+xC,GAC1BzsE,EAASt3I,KAAK,IAAI,EAAK0jN,QACnBpuK,EACAwuK,EAAc,KAGlB,GAAKxsE,GAAU06B,WAAW8xC,EAAc,IACxCxsE,EAASt3I,KAAK,IAAI,EAAK0jN,QACnBnuK,EACAkuK,QAED,CACH,MAAME,EAAUhnN,KAAKgnN,QAAQruK,EAAIC,EAAI4tH,GAAGC,IAExC,GAAK9rB,GAAU06B,WAAW+xC,GAC1BzsE,EAASt3I,KAAK,IAAI,EAAK0jN,QACnBnuK,EACA54C,KAAKknN,mBAAmBF,EAASruK,EAAIC,EAAI4tH,GAAGC,MAIpD,OAAO9rB,EAGX,iBAAiBztG,EAAK2iI,GAClB,KAAOA,EAAO3iI,EAAM,KAAO2iI,EAAO3iI,GAAK88H,OAAO6F,EAAO3iI,EAAM,KAAO2iI,EAAO3iI,EAAM,GAAG88H,OAAO6F,EAAO3iI,EAAM,MAClG2iI,EAAO71J,OAAOkzB,EAAM,EAAG,GAI/B,WAAW0jI,EAAIj4H,EAAIC,GACf,IAAIyuK,GAAa,EAEjB,GAAIz2C,EAAG5lI,IAAM2N,EAAG3N,EACZq8K,GAAa,OACV,GAAI1uK,EAAG3N,IAAM4N,EAAG5N,GACd2N,EAAGxI,EAAIyI,EAAGzI,GAAKygI,EAAGzgI,GAAKwI,EAAGxI,GAAOyI,EAAGzI,EAAIwI,EAAGxI,GAAKwI,EAAGxI,GAAKygI,EAAGzgI,KAC5Dk3K,GAAa,OAEd,CACH,MAAM90L,EAAKvyB,KAAKsnN,aAAa12C,EAAGj4H,GAC1Bi5H,EAAK5xK,KAAKunN,kBAAkBh1L,EAAIqmB,EAAG5N,GACnC4lI,EAAGzgI,GAAKwI,EAAGxI,GAAKyI,EAAGzI,GAAKyhI,GACxBj5H,EAAGxI,GAAKygI,EAAGzgI,GAAKyI,EAAGzI,GAAKyhI,IAC1By1C,GAAa,GAIrB,OAAOA,EAGX,OAAOz2C,EAAIj4H,EAAIC,GACX,MAAMrmB,EAAKvyB,KAAKsnN,aAAa12C,EAAIj4H,GAC3Bi5H,EAAK5xK,KAAKunN,kBAAkBh1L,EAAIqmB,EAAG5N,GAEzC,OAAQ4lI,EAAG5lI,IAAM2N,EAAG3N,GAAK2N,EAAG3N,IAAM4N,EAAG5N,GAAM,GAAM4mI,EAAI,KAAO,GAAMh5H,EAAGzI,EAAG,GAG5E,aAAawI,EAAIC,GACb,MAAM35C,GAAK25C,EAAGzI,EAAIwI,EAAGxI,IAAMyI,EAAG5N,EAAI2N,EAAG3N,GAGrC,MAAO,CAFG2N,EAAGxI,EAAIlxC,EAAI05C,EAAG3N,EAEZ/rC,GAGhB,cAAc2xK,EAAIj4H,EAAIC,GAClB,IAIIouK,EAJAQ,EAAShhD,GACTihD,EAAShhD,GACTihD,GAAW,EACXC,GAAoB,EAGxB,GAAI3nN,KAAK4nN,OAAOh3C,EAAIj4H,EAAIC,GACpBouK,EAAUhnN,KAAKgnN,QAAQp2C,EAAIj4H,EAAI6tH,GAAGC,QAC/B,CACH,MAAMohD,EAAY,CACd78K,EAAGhrC,KAAK8nN,mBAAmBl3C,EAAIj4H,EAAIC,EAAI4tH,IACvCr2H,EAAGnwC,KAAK8nN,mBAAmBl3C,EAAIj4H,EAAIC,EAAI6tH,KAG3C,GAAIohD,EAAU78K,GAAK68K,EAAU13K,EACzB62K,EAAUhnN,KAAKgnN,QAAQp2C,EAAIh4H,EAAI4tH,GAAGC,IAClCihD,GAAW,OAOX,GALI1nN,KAAKqnN,WAAWz2C,EAAIj4H,EAAIC,KACxB4uK,EAAS/gD,GACTghD,EAASjhD,IAGTqhD,EAAUL,GACVR,EAAU,MACP,CACH,IAAI/0C,EAGAA,EAFCr5H,EAAG6uK,GAAU72C,EAAG62C,IAAW72C,EAAG62C,IAAW9uK,EAAG8uK,IAC5C72C,EAAG62C,GAAU7uK,EAAG6uK,IAAW9uK,EAAG8uK,IAAW72C,EAAG62C,GACtC,IAAY7uK,EAAG6uK,GAAU72C,EAAG62C,KAAY9uK,EAAG6uK,GAAU52C,EAAG42C,MAEvD,IAAY5uK,EAAG4uK,GAAU52C,EAAG42C,KAAY7uK,EAAG8uK,GAAU72C,EAAG62C,KAGpET,EAxLe,IAwLwB/0C,EACvC01C,GAAoB,GAKhC,MAAMT,EAAqBlnN,KAAKknN,mBAAmBF,EAASp2C,EAAIj4H,EAAI6uK,EAAQC,GAE5E,GAAIE,EAAmB,CACnB,MAAMI,EAAYP,EAClBA,EAASC,EACTA,EAASM,EAGb,MAAMd,EAAoBjnN,KAAKinN,kBAAkBD,EAASruK,EAAIC,EAAI4uK,EAAQC,GAO1E,OALIC,IACA1nN,KAAKgoN,qBAAqBp3C,EAAIj4H,EAAIuuK,EAAoBF,GACtDhnN,KAAKgoN,qBAAqBrvK,EAAIC,EAAIquK,EAAmBD,IAGlD,CAAEE,EAAoBD,GAGjC,qBAAqBtuK,EAAIC,EAAIqvK,EAAIjB,GACzBruK,EAAGxI,EAAIyI,EAAGzI,EACNyI,EAAGzI,EAAI83K,EAAG93K,GACV83K,EAAGj9K,EAAI2N,EAAG3N,GAAK4N,EAAGzI,EAAIwI,EAAGxI,GAAK62K,EAC9BiB,EAAG93K,EAAIyI,EAAGzI,GACH83K,EAAG93K,EAAIwI,EAAGxI,IACjB83K,EAAGj9K,EAAI4N,EAAG5N,GAAK4N,EAAGzI,EAAIwI,EAAGxI,GAAK62K,EAC9BiB,EAAG93K,EAAIwI,EAAGxI,GAGV83K,EAAG93K,EAAIyI,EAAGzI,GACV83K,EAAGj9K,EAAI2N,EAAG3N,GAAK2N,EAAGxI,EAAIyI,EAAGzI,GAAK62K,EAC9BiB,EAAG93K,EAAIyI,EAAGzI,GACHwI,EAAGxI,EAAI83K,EAAG93K,IACjB83K,EAAGj9K,EAAI4N,EAAG5N,GAAK2N,EAAGxI,EAAIyI,EAAGzI,GAAK62K,EAC9BiB,EAAG93K,EAAIwI,EAAGxI,GAKtB,QAAQygI,EAAIj4H,EAAI6uK,EAAQC,GACpB,MAAMz8K,EAAI2N,EAAG6uK,GAAU52C,EAAG42C,GAE1B,IAAIR,EAQJ,OALIA,EADM,IAANh8K,EACU,GAJJ2N,EAAG8uK,GAAU72C,EAAG62C,IAMRz8K,EAGXg8K,EAGX,mBAAmBp2C,EAAIj4H,EAAIC,EAAIkuH,GAC3B,OAAQluH,EAAGkuH,GAASnuH,EAAGmuH,IAAUnuH,EAAGmuH,GAAS8J,EAAG9J,IACnCluH,EAAGkuH,GAASnuH,EAAGmuH,IAAUnuH,EAAGmuH,GAAS8J,EAAG9J,GAGzD,kBAAkBkgD,EAASp2C,EAAIC,EAAI22C,EAAQC,GACvC,MAAM7zC,EAAKhD,EAAG42C,GAERxwK,EA3PC,MA0PI65H,EAAG22C,GACS5zC,GAEvB,OAAO5zK,KAAKopK,MAAMwK,EAAK58H,EAAU45H,EAAG62C,GAAUzwK,EAAWgwK,EAASQ,EAAQC,GAG9E,mBAAmBT,EAASp2C,EAAIC,EAAI22C,EAAQC,GACxC,MACMpxC,EAAKxF,EAAG22C,GACRxwK,EAnQC,MAmQWq/H,EAFPzF,EAAG42C,IAId,OAAOxnN,KAAKopK,MAAMiN,EAAKr/H,EAAU65H,EAAG42C,GAAUzwK,EAAWgwK,EAASQ,EAAQC,GAG9E,MAAMS,EAAQC,EAAQX,EAAQC,GAC1B,MAAM/zC,EAAe,IAAI,EAAK8yB,MAI9B,OAHA9yB,EAAa8zC,GAAUU,EACvBx0C,EAAa+zC,GAAUU,EAEhBz0C,EAGX,kBAAkBnhJ,EAAIyY,GAClB,MAAMlqC,EAASyxB,EAAGzxB,OAClB,IAAI4G,EAAS,EAEb,IAAK,IAAIhH,EAAI,EAAGA,EAAII,EAAQJ,IACxBgH,GAAU6B,KAAK0+J,IAAIj9H,EAAEtqC,GAAK6xB,EAAG7xB,GAEjC,OAAOgH,IC9PA,GA5Bf,cAAwB,GACpB,YAAYi0K,GACR10H,QAEAjnD,KAAKooN,MAAQzsC,EACb37K,KAAKN,QAAUi8K,EAAKj8K,QAGxB,MAAM0pK,GACF,MAAMuS,EAAO37K,KAAKooN,MAGlB,OAFczsC,EAAK0sC,YAAc1sC,EAAK0sC,YAAYj/C,GAASuS,EAAK9lC,SAASuzB,GAK7E,KAAKpgK,EAAMC,EAAI64B,GAAQ,GACnB,OAAO9hC,KAAKooN,MAAM5S,KAAKxsM,EAAMC,EAAI64B,GAGrC,QACI,OAAO9hC,KAAKooN,MAAM/pL,QAGtB,aACI,OAAOr+B,KAAKooN,MAAMtL,eCxBX,SAASwL,GAAe79M,EAAMwoM,GACzC,IAAK,IAAI/lK,EAAM,EAAGA,EAAM+lK,EAAKnyM,OAAQosC,IACjC,GAAI+lK,EAAK/lK,GAAKxtC,QAAQ+K,OAASA,EAE3B,OADAwoM,EAAK/lK,GAAKq7K,qBACH,IAAI,GAAUtV,EAAK/lK,ICQvB,IAAA,GAZf,MACI,YAAY8lK,GACRhzM,KAAKksL,OAAS8mB,EAAK9mB,OACnBlsL,KAAKwoN,aAAexV,EAAKyV,eAAev8B,OACxClsL,KAAK0oN,MAAQ1V,EAGjB,eAAevoM,GACX,OAAO69M,GAAe79M,EAAMzK,KAAK0oN,MAAMzV,QCEhC,GAVf,cAA4B,GACxB,YAAYJ,GACR5rJ,QAEAjnD,KAAK2oN,UAAY9V,EACjB7yM,KAAKksL,OAAS2mB,EAAS3mB,OACvBlsL,KAAK4oN,iBAAmB/V,EAASgW,YCN1B,SAASC,GAAah0M,GACjC,MAAMhU,EAASgU,EAAOhU,OACtB,IAAI80B,EAAQ,EAEZ,IAAK,IAAIl1B,EAAI,EAAGA,EAAII,EAAQJ,IAEpBw6B,GADQpmB,EAAOpU,KAEfk1B,IAIR,OAAOA,ECRX,MAAMmzL,GAAa,CACfv/M,IAAK,SAASsL,GACV,MAAMhU,EAASgU,EAAOhU,OACtB,IAAI0I,EAAM08J,GAEV,IAAK,IAAIxlK,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM2K,EAAQyJ,EAAOpU,GACjBw6B,GAAS7vB,KACT7B,EAAMD,KAAKC,IAAIA,EAAK6B,IAI5B,OAAO7B,IAAQ08J,GAAYpxJ,EAAO,GAAKtL,GAG3CoS,IAAK,SAAS9G,GACV,MAAMhU,EAASgU,EAAOhU,OACtB,IAAI8a,EAAMuqJ,GAEV,IAAK,IAAIzlK,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM2K,EAAQyJ,EAAOpU,GACjBw6B,GAAS7vB,KACTuQ,EAAMrS,KAAKqS,IAAIA,EAAKvQ,IAI5B,OAAOuQ,IAAQuqJ,GAAYrxJ,EAAO,GAAK8G,GAG3CwrB,IAAK,SAAStyB,GACV,MAAMhU,EAASgU,EAAOhU,OACtB,IAAIsmC,EAAM,EAEV,IAAK,IAAI1mC,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM2K,EAAQyJ,EAAOpU,GACjBw6B,GAAS7vB,KACT+7B,GAAO/7B,GAIf,OAAO+7B,GAGX4hL,UAAW,SAASl0M,GAChB,IAAIpN,EAAS,KAMb,OAJIohN,GAAah0M,KACbpN,EAASqhN,GAAW3hL,IAAItyB,IAGrBpN,GAGXkuB,MAAO,SAAS9gB,GACZ,MAAMhU,EAASgU,EAAOhU,OACtB,IAAI80B,EAAQ,EAEZ,IAAK,IAAIl1B,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM2K,EAAQyJ,EAAOpU,GACP,OAAV2K,GAAkB,GAAQA,IAC1BuqB,IAIR,OAAOA,GAGXqzL,IAAK,SAASn0M,GACV,MAAM8gB,EAAQkzL,GAAah0M,GAC3B,IAAIpN,EAASoN,EAAO,GAMpB,OAJI8gB,EAAQ,IACRluB,EAASqhN,GAAW3hL,IAAItyB,GAAU8gB,GAG/BluB,GAGX2hC,MAAO,SAASv0B,GACZ,MAAMhU,EAASgU,EAAOhU,OAEtB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM2K,EAAQyJ,EAAOpU,GACrB,GAAc,OAAV2K,GAAkB,GAAQA,GAC1B,OAAOA,EAIf,OAAOyJ,EAAO,KAIP,IAAA,GAAA,GC/FA,SAASo0M,GAASpiD,EAAOqiD,GACpC,OAAY,OAARA,EACOA,EAGC,GAAOriD,EAAP,CACDqiD,GCoIA,IAAA,eAxITC,UAAqB,GAEvB,cACIniK,QAEAjnD,KAAKqpN,aAAe,GACpBrpN,KAAKspN,aAAe,GACpBtpN,KAAKupN,WAAa,GAClBvpN,KAAKwpN,gBAAkB,GAG3B,SAASC,EAAaC,EAAc,CAAEpjD,IAASqjD,EAAc,IAEzD,IAAK,IAAIjpN,EAAI,EAAGA,EAAI+oN,EAAY3oN,OAAQJ,IAAK,CACzC,MAAM4C,EAAOmmN,EAAY/oN,GAEzBV,KAAKqpN,aAAa/lN,GAAQomN,EAC1B1pN,KAAKspN,aAAahmN,GAAQqmN,EAC1B3pN,KAAKupN,WAAWjmN,GAAQtD,KAAK4pN,WAAWF,EAAa,MACrD1pN,KAAKwpN,gBAAgBlmN,GAAQtD,KAAK4pN,WAAWF,OAAaxzM,IAIlE,gBAAgBuyL,GACZ,OAAOzoM,KAAK0pN,YAAYjhB,GAAQ9+L,OAAO3J,KAAK2pN,YAAYlhB,IAG5D,YAAYA,GACR,OAAOzoM,KAAKqpN,aAAa5gB,EAAOnlM,OAAS,CAAEgjK,IAG/C,YAAYmiC,GACR,OAAOzoM,KAAKspN,aAAa7gB,EAAOnlM,OAAS,CAAEgjK,IAG/C,UAAUmiC,EAAQohB,EAAS5pK,GACvB,MAAM7gC,EAAOqpL,EAAOrpL,KACd6qL,EAAY,GAAQhqJ,GAAQA,EAAO7gC,EAAKyqM,GACxCniN,EAAS,CAAEgiN,YAAa,CAAEr+M,MAAO4+L,IACjCyf,EAAc1pN,KAAK0pN,YAAYjhB,GAC/BkhB,EAAc3pN,KAAKspN,aAAa7gB,EAAOnlM,MAC7C,IAAIwkK,EAAQz8J,EAEZ,GAAkB,OAAd4+L,EACA5+L,EAAQrL,KAAKupN,WAAW9gB,EAAOnlM,WAC5B,GAAK,GAAQ2mM,GAAAA,CAEb,GAAIr1L,MAAM4I,QAAQysL,GAAY,CACjC,MAAM6f,EAAY7f,EAAU/lM,MAAMwlN,EAAY5oN,QAC9CuK,EAAQrL,KAAK+pN,eAAe9f,EAAWyf,GACvC5hD,EAAS9nK,KAAK+pN,eAAeD,EAAWH,QACrC,GAAyB,iBAAd1f,EAAwB,CACtC,MAAM+f,EAAiBhqN,KAAKiqN,aAAaxhB,EAAQihB,GAC3CQ,EAAiBlqN,KAAKiqN,aAAaxhB,EAAQkhB,GAEjDt+M,EAAQrL,KAAKmqN,gBAAgBlgB,EAAWyf,EAAaM,GACrDliD,EAAS9nK,KAAKmqN,gBAAgBlgB,EAAW0f,EAAaO,SAVtD7+M,EAAQrL,KAAKwpN,gBAAgB/gB,EAAOnlM,MAuBxC,OAVI,GAAQ+H,KACmB,IAAvBq+M,EAAY5oN,OACZ4G,EAAOgiN,YAAYr+M,MAAQA,EAAMq+M,EAAY,IAE7ChiN,EAAOgiN,YAAcr+M,GAI7B3D,EAAOogK,OAASA,GAAU,GAEnBpgK,EAGX,WAAWogK,EAAQsiD,GACf,MAAM/+M,EAAQ,GACRvK,EAASgnK,EAAOhnK,OAEtB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAExB2K,EADkBy8J,EAAOpnK,IACN0pN,EAGvB,OAAO/+M,EAGX,eAAeuI,EAAOk0J,GAClB,MAAMz8J,EAAQ,GAEd,GAAIy8J,EAAQ,CACR,MAAMhnK,EAASyI,KAAKC,IAAIs+J,EAAOhnK,OAAQ8S,EAAM9S,QAE7C,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IACxB2K,EAAMy8J,EAAOpnK,IAAMkT,EAAMlT,GAIjC,OAAO2K,EAGX,gBAAgB4K,EAAQ6xJ,EAAQuiD,EAAYviD,GACxC,MAAMz8J,EAAQ,GAEd,GAAIy8J,EAAQ,CACR,MAAMhnK,EAASgnK,EAAOhnK,OAEtB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM8mK,EAAYM,EAAOpnK,GACnB4pN,EAAeD,EAAU3pN,GACV,OAAjB4pN,IACAj/M,EAAMm8J,GAAa0hD,GAASoB,EAAcr0M,KAKtD,OAAO5K,EAGX,aAAao9L,EAAQ8hB,GACjB,MAAMN,EAAe,GAErB,GAAIM,EAAiB,CACjB,MAAMzpN,EAASypN,EAAgBzpN,OAE/B,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM8mK,EAAY+iD,EAAgB7pN,GAC5B8pN,EAAkBhjD,IAAclB,GAAQ,QAAUkB,EAAY,QAEpEyiD,EAAa5mN,KAAiC,OAA5BolM,EAAO+hB,GAA6B/hB,EAAO+hB,IAAoBhjD,EAAa,OAItG,OAAOyiD,UAIfb,EAAa/yM,QAAU,IAAI+yM,QCrI3B,MAEMqB,GAAe,0BACfC,GAAyB,IAAI5mN,OAAO,yCAyH3B,IAAA,GAvHf,cAAmC,GAC/B,YAAY6gK,EAAY8jC,EAAQ3hC,GAC5B7/G,QAEAjnD,KAAK2qN,iBAAiBhmD,EAAY8jC,EAAQ3hC,GAG9C,iBAAiBnC,EAAY8jC,EAAQ3hC,GACjC,MAAM1nJ,EAAOqpL,EAAOrpL,KACdwrM,EAAiBF,GAAuB/iN,KAAKg9J,GAEnD,GAAIimD,EAAgB,CAChB5qN,KAAK6qN,YAAc7qN,KAAK8qN,kBAAkBriB,EAAQ3hC,GAElD,MAAMikD,EAAU/qN,KAAKgrN,WAAW5rM,GAC1B6rM,EAAYjrN,KAAKkrN,qBAAqB9rM,EAAM2rM,GAAS,GACrDI,EAAWP,EAAe,GAAKn5M,WAAWm5M,EAAe,IAAM,EAC/DQ,EAAa,CAAEl/L,IAAK6+L,EAAQ1/M,MAAQ4/M,EAAYE,EAAUh/L,KAAM4+L,EAAQ1/M,MAAQ4/M,EAAYE,GAElGnrN,KAAKqrN,YAAc,WACf,OAAOD,QAER,GAAIzmD,EAAW9iK,SAAW8iK,EAAW9iK,QA3BpC,WA2BwD,EAAG,CAC/D7B,KAAK6qN,YAAc7qN,KAAK8qN,kBAAkBriB,EAAQ3hC,GAClD,MAAMwkD,EAAgBtrN,KAAKurN,iBAAiBnsM,EAAMpf,KAAKgrN,WAAW5rM,IAElEpf,KAAKqrN,YAAc,SAAShgN,GACxB,MAAO,CAAE6gB,IAAK7gB,EAAQigN,EAAen/L,KAAM9gB,EAAQigN,KAK/D,kBAAkB7iB,EAAQ3hC,GACtB,MAAM1nJ,EAAOqpL,EAAOrpL,KACdosM,EAAS,GAAan1M,QACtBqzM,EAAc8B,EAAO9B,YAAYjhB,GACjCxoJ,EAAO,GAAQ7gC,EAAK,IAAMA,EAAK,GAAK,GAC1C,IAAIyrM,EAYJ,OAVI,GAAQ5qK,GAER4qK,EAAc,GAAO,KADP/jD,EAAQ4iD,EAAY7nN,QAAQilK,GAAS,GAChB,KAC5B5rI,GAAS+kB,GAChB4qK,EAAc,KlQ5BJ,iBkQ6BI5qK,IAEd4qK,EAAc,GADSW,EAAOvB,aAAaxhB,EAAQihB,GACfA,EAAY7nN,QAAQilK,MAGrD+jD,EAGX,cAAcY,EAAY9mD,GACtB,IAAIz4I,EAAKC,EAAM9gB,EAEf,IAAK,GAAQs5J,GACT,OAAO,KAGX,GAAI3kK,KAAKqrN,YACL,OAAOrrN,KAAKqrN,YAAYI,GAG5B,GAAI,GAAQ9mD,GACRz4I,EAAMu/L,EAAa9mD,EAAW,GAC9Bx4I,EAAOs/L,EAAa9mD,EAAW,QAC5B,GAAIzpI,GAAS7vB,EAAQoG,WAAWkzJ,IACnCz4I,EAAMu/L,EAAapgN,EACnB8gB,EAAOs/L,EAAapgN,MACjB,CAAA,KAAKA,EAAQo/M,GAAa9iN,KAAKg9J,IAKlC,MAAM,IAAIl+J,MAAM,2BAA6Bk+J,GALG,CAChD,MAAM+mD,EAAeD,GAAch6M,WAAWpG,EAAM,IAAM,KAC1D6gB,EAAMu/L,EAAaliN,KAAK+mC,IAAIo7K,GAC5Bv/L,EAAOs/L,EAAaliN,KAAK+mC,IAAIo7K,IAKjC,MAAO,CAAEx/L,IAAKA,EAAKC,KAAMA,GAG7B,iBAAiB/M,EAAM2rM,GACnB,OAAO/qN,KAAKkrN,qBAAqB9rM,EAAM2rM,GAAS,GAAQxhN,KAAKsvC,KAAKkyK,EAAQn1L,OAG9E,qBAAqBxW,EAAM2rM,EAASY,GAChC,MAAM7qN,EAASse,EAAKte,OACdo7H,EAAQyvF,EAAWZ,EAAQn1L,MAAQ,EAAIm1L,EAAQn1L,MACrD,IAAIg2L,EAAsB,EAE1B,IAAK,IAAI1+K,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,MAAM7hC,EAAQrL,KAAK6qN,YAAYzrM,EAAK8tB,IAChChS,GAAS7vB,KACTugN,GAAuBriN,KAAK0+J,IAAI58J,EAAQ0/M,EAAQ1/M,MAAO,IAI/D,OAAO9B,KAAKsvC,KAAK+yK,EAAsB1vF,GAG3C,WAAW98G,GACP,MAAMte,EAASse,EAAKte,OACpB,IAAIsmC,EAAM,EACNxR,EAAQ,EAEZ,IAAK,IAAIsX,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,MAAM7hC,EAAQrL,KAAK6qN,YAAYzrM,EAAK8tB,IAChChS,GAAS7vB,KACT+7B,GAAO/7B,EACPuqB,KAIR,MAAO,CACHvqB,MAAO+7B,EAAMxR,EACbA,MAAOA,KC1HnB,MAQMi2L,IARU,GAAQ/mC,SAAW,IAQPM,KAAO,KAAQ,EAQrClc,GAAO,OAUP4iD,GAAM,MAKNC,GAAS,SAITC,GAAO,OAEPC,GAAM,MAeNC,GAAgB,eAGhBC,GAAwB,CAC1BL,GAAKC,GApBI,OANO,cAHH,UAuBS,kBArBX,SAiBM,cADH,WASA,YApBW,uBAyDvBK,GAAa,4BCnFnB,MAAM,WAAqB,GACvB,YAAYlgM,EAAKC,EAAM8qJ,EAAY6qB,EAAO2G,EAAQ/oM,GAC9CunD,MAAMvnD,GAENM,KAAKksB,IAAMA,EACXlsB,KAAKmsB,KAAOA,EACZnsB,KAAKi3K,WAAaA,EAClBj3K,KAAK8hM,MAAQA,EACb9hM,KAAKyoM,OAASA,EAGlB,OAAOpE,GACH,MAAMgoB,EAAUrsN,KAAKN,QAAQ2sN,QACvBp1C,EAAaj3K,KAAKi3K,WAElBq1C,EADOtsN,KAAKusN,UACInZ,QAAQpzM,KAAKksB,IAAKlsB,KAAKmsB,MACvCqgM,EAAYnoB,EAAU3tJ,SACtB+1K,EAAYzsN,KAAK0sN,aAAaroB,EAAWptB,GACzC01C,EAAW11C,EAAau1C,EAAUxhL,EAAIwhL,EAAUr8K,EAChDy8K,EAAWD,EAAWF,EACtBI,EAASF,EAAWF,EAC1B,IAAIpd,EAEAp4B,GACAo4B,EAAa,CACT,IAAI,GAAMmd,EAAUxhL,EAAGshL,EAAS56C,IAChC,IAAI,GAAM86C,EAAUxhL,EAAGshL,EAAS16C,KAEhCy6C,GACAhd,EAAWhsM,KAAK,IAAI,GAAMupN,EAAUN,EAAS56C,IACzC,IAAI,GAAMm7C,EAAQP,EAAS56C,IAC3B,IAAI,GAAMk7C,EAAUN,EAAS16C,IAC7B,IAAI,GAAMi7C,EAAQP,EAAS16C,KAEnC5xK,KAAKs6K,IAAM,IAAI,GAAIsyC,EAAUN,EAAS56C,GAAIm7C,EAAQP,EAAS16C,MAE3Dy9B,EAAa,CACT,IAAI,GAAMid,EAAS76C,GAAI+6C,EAAUr8K,GACjC,IAAI,GAAMm8K,EAAS36C,GAAI66C,EAAUr8K,IAEjCk8K,GACAhd,EAAWhsM,KAAK,IAAI,GAAMipN,EAAS76C,GAAIm7C,GACnC,IAAI,GAAMN,EAAS76C,GAAIo7C,GACvB,IAAI,GAAMP,EAAS36C,GAAIi7C,GACvB,IAAI,GAAMN,EAAS36C,GAAIk7C,IAE/B7sN,KAAKs6K,IAAM,IAAI,GAAIgyC,EAAS76C,GAAIm7C,EAAUN,EAAS36C,GAAIk7C,IAG3D7sN,KAAKqvM,WAAaA,EAGtB,aAAa/0B,EAAKrD,GACd,MAAMk9B,EAAUl9B,EAAaqD,EAAIlqI,QAAUkqI,EAAIzQ,SAG/C,OAFkBtgK,KAAKC,IAAID,KAAK2R,MAAMi5L,EAAU,GAxDxB,IAAA,EA6D5B,eACI,MAAMz0M,EAAUM,KAAKN,QACfwsL,EAASxsL,EAAQwsL,OAEnBA,EACAlsL,KAAKksL,OAASA,EAAO,CACjBhgK,IAAKlsB,KAAKksB,IACVC,KAAMnsB,KAAKmsB,KACX2iG,KAAM9uH,KAAKs6K,IAAIyvB,SACf1oB,OAAQrhL,KAAKwoM,YACb9oM,QAAS,CACL2sN,QAAS3sN,EAAQ2sN,QACjB3gD,MAAOhsK,EAAQgsK,MACf79H,KAAMnuC,EAAQmuC,MAElBq5J,aAAc,KACVlnM,KAAK8sN,sBACL,MAAMvd,EAAgBvvM,KAAKksL,OAE3B,cADOlsL,KAAKksL,OACLqjB,KAIfvvM,KAAK8sN,sBAIb,sBACI,MAAM,QAAEptN,EAAO,WAAE2vM,GAAervM,KAC1B6zM,EAAc,CAChBlnC,OAAQ,CACJjB,MAAOhsK,EAAQgsK,MACft7H,MAAO1wC,EAAQmuC,KAAKuC,MACpBg5I,SAAU1pL,EAAQmuC,KAAKu7I,WAI/BniI,MAAMigJ,eAEN,IAAK,IAAIh6J,EAAM,EAAGA,EAAMmiK,EAAWvuM,OAAQosC,GAAO,EAAG,CACjD,MAAMW,EAAO,IAAI,EAAKw9I,KAAKwoB,GACtB17B,OAAOk3B,EAAWniK,GAAKlC,EAAGqkK,EAAWniK,GAAKiD,GAC1CsnI,OAAO43B,EAAWniK,EAAM,GAAGlC,EAAGqkK,EAAWniK,EAAM,GAAGiD,GAEvDuwJ,GAAiB7yJ,GACjB7tC,KAAKksL,OAAO7xD,OAAOxsF,KAK/B+1J,GAAkB,GAAc,CAC5B/vG,UAAW,CACPvwF,KDpHO,SCqHP+2B,MDtH2B,KCwH/BgyL,SAAS,EACTx+K,KAAM,CACFuC,MAAO,GAEXg/I,OAAQ,IAGG,IAAA,GAAA,GCzHA,GARf,cAAkC,GAC9B,UAGI,OAFapvL,KAAK8hM,MAAMirB,gBAAgB/sN,KAAKyoM,UCAtC,SAASukB,GAAYttN,EAAS4Y,EAAS6lC,EAAQ,GAAI8uK,GAAS,GACvE,MAAMrsN,EAAWu9C,EAAMv9C,SAAWu9C,EAAMv9C,UAAY,GAC9C2jB,EAAQ45B,EAAM55B,MAAQ45B,EAAM55B,OAAS,EAC3C,IAAI2oM,GAAY,EAIhB,GAFA/uK,EAAMgvK,SAAWhvK,EAAMgvK,UAAY,GAE/B5oM,EATiB,EAUjB,OAAO,KAGX,IAAK,IAAIqE,KAAYlpB,EACjB,IAAKu0C,GAAQrrB,EAAUu1B,EAAMgvK,WAAaztN,EAAQsZ,eAAe4P,GAAW,CACxE,MAAMq4K,EAAYvhM,EAAQkpB,GACtB,GAAWq4K,IACXisB,GAAY,EACPD,IACDvtN,EAAQkpB,GAAY,GAAeq4K,EAAU3oL,GAAU1X,EAASgoB,MAE7D,GAASq4K,KACXgsB,IACD9uK,EAAMv9C,SAAWA,EAASgoB,IAE9Bu1B,EAAM55B,QACN2oM,EAAYF,GAAY/rB,EAAW3oL,EAAS6lC,EAAO8uK,IAAWC,EAC9D/uK,EAAM55B,SAKlB,OAAO2oM,EClCI,SAASE,GAAgB3kB,GACpC,MAAM4kB,EAAc5kB,EAAO3nM,OAC3B,IAAIi4M,EAAa,EAEjB,IAAK,IAAIr4M,EAAI,EAAGA,EAAI2sN,EAAa3sN,IAC7Bq4M,EAAaxvM,KAAKqS,IAAIm9L,EAAYtQ,EAAO/nM,GAAG0e,KAAKte,QAGrD,OAAOi4M,ECMX,MAAM,WAAyB,GAC3B,YAAYlG,EAAUnzM,GAClBunD,MAAMvnD,GAENM,KAAK6yM,SAAWA,EAChB7yM,KAAKgnM,aAAe6L,EAAS7L,aAC7BhnM,KAAKstN,aAAeza,EAAS0a,mBAAmB7tN,EAAQ+oM,OAAO,IAI/DzoM,KAAKwtN,gBAAkB,GAEvBxtN,KAAK6vK,OAAS,GACd7vK,KAAKytN,eAAiB,GACtBztN,KAAK0tN,aAAe,GACpB1tN,KAAK2tN,cAAgB,GACrB3tN,KAAK4tN,YAAc,GAEnB5tN,KAAKgmL,SAGT,SACIhmL,KAAK6tN,mBAAmB7tN,KAAK8tN,SAASl1L,KAAK54B,OAG/C,aAAayoM,EAAQslB,GACjB,IAAIruN,EAAUM,KAAK2tN,cAAcI,GACjC,IAAKruN,EAAS,CACV,MAAMkB,EAAWZ,KAAKguN,YAAY/sN,UAAUL,SAC5CZ,KAAK2tN,cAAcI,GAAYruN,EAAU0hM,GAAW,GAAKxgM,EAAU,CAC/D6qM,UAAWzrM,KAAKN,QAAQuuN,YACzBxlB,GAGP,OAAO/oM,EAGX,UAAU0pK,GACN,IAAKA,EACD,OAAO,EAGX,GAAIppK,KAAKN,QAAQwuN,cAAgBhzL,GAASkuI,EAAM/9J,OAAQ,CACpD,MACMoiN,EAAiBztN,KAAKytN,eADTrkD,EAAMi1C,YAEnB8P,EAAc,GACpB,IAAIC,EAAc,EAElB,IAAK,IAAI1tN,EAAI,EAAGA,EAAI+sN,EAAe3sN,OAAQJ,IAAK,CAC5C,MAAM+kB,EAAQgoM,EAAe/sN,GAC7B,GAAI+kB,EAAO,CACP,MAAMjE,EAAQ4nJ,EAAMq/B,OAAOjnL,MACrB6sM,EAAa5oM,EAAMgjL,OAAOjnL,MAEhC,GAAKA,GAAS6sM,GAAe7sM,EAAM+V,QAAU82L,EAAW92L,MACpD,SAGA2D,GAASzV,EAAMpa,SACf+iN,GAAe7kN,KAAK+mC,IAAI7qB,EAAMpa,OAC9B8iN,EAAY9qN,KAAKkG,KAAK+mC,IAAI7qB,EAAMpa,UAK5C,GAAI+iN,EAAc,EACd,OAAOhlD,EAAM/9J,MAAQ+iN,EAI7B,OAAOhlD,EAAM/9J,MAGjB,UAAU+9J,EAAO04C,EAAa,GAC1B,MAAM2L,EAAiBztN,KAAKytN,eAAerkD,EAAMi1C,YAEjD,GAAIr+M,KAAKN,QAAQ4uN,UAAW,CACxB,IAAIC,EAAYvuN,KAAKuuN,UAAUnlD,GAC/B,MAAM5iD,EAAW+nG,GAAa,EAC9B,IAAIC,EAAY1M,EACZ2M,GAAe,EAEnB,IAAK,IAAI/tN,EAAI,EAAGA,EAAI+sN,EAAe3sN,OAAQJ,IAAK,CAC5C,MAAM+kB,EAAQgoM,EAAe/sN,GAE7B,GAAI0oK,IAAU3jJ,EACV,MAGJ,MAAMjE,EAAQ4nJ,EAAMq/B,OAAOjnL,MACrB6sM,EAAa5oM,EAAMgjL,OAAOjnL,MAChC,GAAIA,GAAS6sM,EAAY,CACrB,GxQ7EE,iBwQ6ES7sM,GAAoBA,IAAU6sM,EACrC,SAGJ,GAAI7sM,EAAM+V,OAAS/V,EAAM+V,QAAU82L,EAAW92L,MAC1C,SAIR,MAAMm3L,EAAa1uN,KAAKuuN,UAAU9oM,IAC7BipM,GAAc,GAAKloG,GACnBkoG,EAAa,IAAMloG,KACpBgoG,GAAaE,EACbH,GAAaG,EACbD,GAAe,EAEXzuN,KAAKN,QAAQwuN,eACbK,EAAYhlN,KAAKC,IAAI+kN,EAAW,KAS5C,OAJIE,IACAD,GAAa1M,GAGV,CAAE0M,EAAWD,GAGxB,MACMhV,EAAYv5M,KAAK+sN,gBADR3jD,EAAMq/B,QAEfuO,EAAoBh3M,KAAK2uN,0BAA0BpV,GAEzD,MAAO,CAAEvC,EAAmBlW,GAAoB13B,EAAM/9J,OAAS+9J,EAAM/9J,MAAQ2rM,GAGjF,YAAY4X,EAAUC,GAClB,IAAIrlN,EAAM08J,GACNtqJ,EAAMuqJ,GAEV,IAAK,IAAIzlK,EAAI,EAAGA,EAAIV,KAAKytN,eAAe3sN,OAAQJ,IAAK,CACjD,MAAM+sN,EAAiBztN,KAAKytN,eAAe/sN,GAC3C,GAAK+sN,EAIL,IAAK,IAAIqB,EAAM,EAAGA,EAAMrB,EAAe3sN,OAAQguN,IAAO,CAClD,MAAM1lD,EAAQqkD,EAAeqB,GAC7B,GAAI1lD,IACIA,EAAMq/B,OAAOjnL,QAAUqtM,GAAazlD,EAAMq/B,OAAO9sB,OAASizC,GAAU,CACpE,MAAM3lN,EAAKjJ,KAAK+uN,UAAU3lD,EAAO,GAAG,GAChC,GAAQngK,IAAOuS,SAASvS,KACxB2S,EAAMrS,KAAKqS,IAAIA,EAAK3S,GACpBO,EAAMD,KAAKC,IAAIA,EAAKP,MAOxC,MAAO,CAAEO,IAAKA,EAAKoS,IAAKA,GAG5B,mBACI,MAAM,UAAE0yM,EAAW7lB,OAAQumB,GAAgBhvN,KAAKN,QAC1CuvN,EAAc,GAEpB,GAAIX,EACA,IAAK,IAAI5tN,EAAI,EAAGA,EAAIsuN,EAAYluN,OAAQJ,IAAK,CACzC,MAAM+nM,EAASumB,EAAYtuN,GACrBkuN,EAAWnmB,EAAO9sB,KAClBlmK,EAAMm5M,EAAWnmB,EAAOjnL,MAE9B,IAAI0tM,EAASD,EAAYx5M,GACzB,IAAKy5M,EAAQ,CACTA,EAASlvN,KAAKmvN,YAAYP,EAAUnmB,EAAOjnL,OAE3C,MAAM4tM,EAAcpvN,KAAKovN,YACrBA,IACIA,EAAY3oG,SAAS3lH,SACrBouN,EAAO1lN,IAAMD,KAAKC,IAAI0lN,EAAO1lN,IAAKq6L,GAAkBurB,EAAY3oG,UAAUj9G,MAE1E4lN,EAAY5oG,SAAS1lH,SACrBouN,EAAOtzM,IAAMrS,KAAKqS,IAAIszM,EAAOtzM,IAAKioL,GAAkBurB,EAAY5oG,UAAU5qG,OAI9EszM,EAAO1lN,MAAQ08J,IAAagpD,EAAOtzM,MAAQuqJ,GAC3C8oD,EAAYx5M,GAAOy5M,EAEnBA,EAAS,KAIbA,IACAlvN,KAAKwtN,gBAAgBoB,GAAYM,IAMjD,YAAY9lD,EAAOhqJ,EAAMi/L,GACrB,MAAM,MAAEhzM,EAAK,OAAEo9L,EAAM,SAAEslB,GAAa3kD,EAC9BimD,EAAYjmD,EAAM1pK,QAAQ2vN,UAC1BC,EAAWlwM,EAAK0oJ,OAAsB,SACtCynD,EAAYnwM,EAAK0oJ,OAAuB,UAC9C,IAAIsjD,EAEAlwL,GAASo0L,IAAap0L,GAASq0L,GAC/BnE,EAAa,CAAEl/L,IAAKojM,EAAUnjM,KAAMojM,GAC7BF,GAAa,GAAQA,EAAUhkN,SACtCrL,KAAKwvN,kBAAoBxvN,KAAKwvN,mBAAqB,GACnDxvN,KAAKwvN,kBAAkBzB,GAAY/tN,KAAKwvN,kBAAkBzB,IACtD,IAAI,GAAqBsB,EAAUhkN,MAAOo9L,EAAQniC,IAEtD8kD,EAAaprN,KAAKwvN,kBAAkBzB,GAAU0B,cAAcpkN,EAAOgkN,EAAUhkN,QAG7E+/M,IACAhiD,EAAMl9I,IAAMk/L,EAAWl/L,IACvBk9I,EAAMj9I,KAAOi/L,EAAWj/L,KACxBnsB,KAAK0vN,iBAAiBtmD,EAAOi1C,IAIrC,iBAAiBj1C,EAAOi1C,GACpB,MAAMpnC,GAAcj3K,KAAKN,QAAQuuN,WAC3BvuN,EAAU0pK,EAAM1pK,QAAQ2vN,UAC9B,IAAI,OAAE5mB,EAAM,IAAEv8K,EAAG,KAAEC,GAASi9I,EAE5B,GAAIppK,KAAKN,QAAQ4uN,UAAW,CACxB,MAAMqB,EAAoB3vN,KAAK2vN,kBAAkBvmD,EAAOi1C,GACxDnyL,EAAMyjM,EAAkBzjM,IACxBC,EAAOwjM,EAAkBxjM,SACtB,CACH,MAAM27I,EAAS,CAAEu2C,WAAYA,EAAY5V,OAAQA,GACjDzoM,KAAK4vN,YAAY,CAAEvkN,MAAO6gB,GAAO47I,GACjC9nK,KAAK4vN,YAAY,CAAEvkN,MAAO8gB,GAAQ27I,GAGtC,MAAM+nD,EAAW,IAAI,GAAoB3jM,EAAKC,EAAM8qJ,EAAYj3K,KAAMyoM,EAAQ/oM,GAC9E0pK,EAAMimD,UAAY,CAAEQ,GACpBzmD,EAAM/uC,OAAOw1F,GAGjB,kBAAkBzmD,EAAOi1C,GACrB,MAAMkQ,EAAYvuN,KAAK+uN,UAAU3lD,EAAO,GAAG,GAAKA,EAAM/9J,MAChD6gB,EAAMk9I,EAAMl9I,IAAMqiM,EAClBpiM,EAAOi9I,EAAMj9I,KAAOoiM,EAY1B,OAVAvuN,KAAKovN,YAAcpvN,KAAKovN,aAAe,CAAE5oG,SAAU,GAAIC,SAAU,IAE7Dv6F,EAAM,IACNlsB,KAAKovN,YAAY3oG,SAAS43F,GAAc90M,KAAKC,IAAIxJ,KAAKovN,YAAY3oG,SAAS43F,IAAe,EAAGnyL,IAG7FC,EAAO,IACPnsB,KAAKovN,YAAY5oG,SAAS63F,GAAc90M,KAAKqS,IAAI5b,KAAKovN,YAAY5oG,SAAS63F,IAAe,EAAGlyL,IAG1F,CAAED,IAAKA,EAAKC,KAAMA,GAG7B,SAAS/M,EAAM0oJ,GACX,MAAM,WAAEu2C,EAAU,OAAE5V,EAAM,SAAEslB,GAAajmD,EAEzC,IAAI2lD,EAAiBztN,KAAKytN,eAAepP,GACpCoP,IACDztN,KAAKytN,eAAepP,GAAcoP,EAAiB,IAGvD,IAAIC,EAAe1tN,KAAK0tN,aAAaK,GAChCL,IACD1tN,KAAK0tN,aAAaK,GAAYL,EAAe,IAGjD,MAAMtkD,EAAQppK,KAAK8vN,YAAY1wM,EAAM0oJ,GACjCsB,IACAhqK,OAAOu8B,OAAOytI,EAAOtB,GAErBsB,EAAM2mD,MAAQ/vN,KACdopK,EAAM4mD,SAAW5wM,EAAK0oJ,OAAOkoD,SACxB,GAAQ5mD,EAAMs/B,YACft/B,EAAMs/B,SAAWD,EAAOrpL,KAAKi/L,IAEjCr+M,KAAKiwN,YAAY7mD,EAAOhqJ,EAAMi/L,IAGlCr+M,KAAK6vK,OAAOxsK,KAAK+lK,GACjBskD,EAAarqN,KAAK+lK,GAClBqkD,EAAepqN,KAAK+lK,GAEpBppK,KAAK4vN,YAAYxwM,EAAKsqM,YAAa5hD,GAGvC,iBAAiBpoK,EAAS2L,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GAC3D,MAAM5vK,EAAQ,CAAEv9C,SAAU6nM,EAAOynB,UAAW/C,SAAU,CAAE,OAAQ,YAAa,UAAW,UAAW,UAAW,WAAY,SAAU,SAAU,sBAAuB,wBAErK,IAAIgD,EAASnwN,KAAK4tN,YAAYG,GACzB,GAAQoC,KACTnwN,KAAK4tN,YAAYG,GAAYoC,EAASnD,GAAYttN,EAAS,GAAIy+C,GAAO,IAG1E,IAAIiyK,EAAe1wN,EAYnB,OAXIywN,IACAC,EAAehvB,GAAW,GAAIgvB,GAC9BpD,GAAYoD,EAAc,CACtB/kN,MAAOA,EACPs9L,SAAUA,EACV30L,MAAOqqM,EACP5V,OAAQA,EACRC,SAAUD,EAAOrpL,KAAKi/L,IACvBlgK,IAGAiyK,EAGX,YAAYhxM,EAAM0oJ,GACd,MAAM8mD,EAAW9mD,EAAO2gC,OAAO9sB,KACzBtwK,EAAQ+T,EAAK/T,MACnB,IAAIglN,EAAYrwN,KAAKwtN,gBAAgBoB,GAEjCpzM,SAASnQ,IAAoB,OAAVA,IACnBglN,EAAYrwN,KAAKwtN,gBAAgBoB,GAC7ByB,GAAa,CAAE7mN,IAAK08J,GAAWtqJ,IAAKuqJ,IAExCkqD,EAAU7mN,IAAMD,KAAKC,IAAI6mN,EAAU7mN,IAAK6B,GACxCglN,EAAUz0M,IAAMrS,KAAKqS,IAAIy0M,EAAUz0M,IAAKvQ,IAIhD,gBAAgBo9L,GACZ,MAAMoK,EAAW7yM,KAAK6yM,SAChB+b,EAAWnmB,EAAO9sB,KAClBA,EAAOizC,EAAW/b,EAASyd,eAAe1B,GAAY/b,EAAS0G,UAErE,IAAK59B,EACD,MAAM,IAAIl1K,MAAM,yCAA2CmoN,GAG/D,OAAOjzC,EAGX,OAAO0oB,GACH,MAAMksB,EAAgBvwN,KAAKuwN,cAAgB,GACrCC,EAAcxwN,KAAK6vK,OACnBy9C,EAAettN,KAAKstN,aAC1B,IAAIzD,EAAU,EAEd7pN,KAAK6tN,mBAAmB,CAACzuM,EAAM0oJ,KAC3B,MAAM,WAAEu2C,EAAY5V,OAAQgoB,GAAkB3oD,EAExCyxC,EAAYv5M,KAAK+sN,gBAAgB0D,GACjCrnD,EAAQonD,EAAY3G,KAE1B,IAAI6G,EAAeH,EAAclS,GAMjC,GALKqS,IACDH,EAAclS,GAAcqS,EACxB1wN,KAAK0wN,aAAapD,EAAcjP,EAAY9E,IAGhDnwC,EAAO,CACP,MAAM2lD,EAAY/uN,KAAK+uN,UAAU3lD,EAAOmwC,EAAUuI,cAC5C6O,EAAY3wN,KAAK2wN,UAAUpX,EAAWwV,GAC5C,GAAI4B,EAAW,CACX,MAAMC,EAAY5wN,KAAK4wN,UAAUF,EAAcC,GAE/CvnD,EAAMynD,UAAY7wN,KAAK6wN,UAAUznD,EAAOmwC,GACxCnwC,EAAM0nD,WAAa/B,EAAU,GAEzB/uN,KAAKN,QAAQwuN,eACb9kD,EAAMw/B,WAAa5oM,KAAKuuN,UAAUnlD,IAGtCppK,KAAK+wN,YAAY3nD,EAAOwnD,QAExBxnD,EAAMgD,SAAU,KAK5BpsK,KAAKgxN,iBAAiBT,IACjBvwN,KAAKN,QAAQksK,MAAQ5rK,KAAKN,QAAQuxN,aAAejxN,KAAK6vK,OAAO/uK,QAC9Dd,KAAKixN,cAGTjxN,KAAKs6K,IAAM+pB,EAGf,UAAUkV,EAAWwV,GACjB,OAAOxV,EAAUnG,QAAQ2b,EAAU,GAAIA,EAAU,IAAK/uN,KAAKN,QAAQksK,MAGvE,cACI,MAAM6hD,EAAiBztN,KAAKytN,eACtB59C,EAAS49C,EAAe,GAAG9jN,OAAO,GAAK8jN,IAC7C,IAAK,IAAIvgL,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAC/B2iI,EAAO3iI,IACPltC,KAAKkxN,WAAWrhD,EAAO3iI,IAKnC,WAAWk8H,GACP,MAAMmxC,EAAev6M,KAAKstN,aAAa6D,UAAU/nD,EAAMkR,KAClDigC,EAAavwC,OAAOZ,EAAMkR,MAC3BlR,EAAMy9B,OAAO0T,GAIrB,UAAUnxC,EAAOmwC,GACb,MAAMvC,EAAoBh3M,KAAK2uN,0BAA0BpV,GACnDluM,EAAQ+9J,EAAM/9J,MAEpB,OAAOkuM,EAAU75M,QAAQyc,QACrB9Q,EAAQ2rM,EAAoB3rM,GAAS2rM,EAG7C,0BAA0BuC,GACtB,MAAM+T,EAAettN,KAAKstN,aACpB5tN,EAAU65M,EAAU75M,QAK1B,MAJuB,GAAGiK,OACtBjK,EAAQ2iN,oBAAsB3iN,EAAQs3M,mBAGpBsW,EAAa8D,WAAa,IAAM,EAG1D,YAAYhoD,EAAOwnD,GACfxnD,EAAMy9B,OAAO+pB,GAGjB,oBAEA,UAAUF,EAAcC,GACpB,MACM1C,EADUjuN,KAAKN,QACMuuN,WACrB/a,EAAQ+a,EAAa0C,EAAYD,EACjCvd,EAAQ8a,EAAayC,EAAeC,EAE1C,OAAO,IAAI,GAAIzd,EAAMzhC,GAAI0hC,EAAMzhC,GAAIwhC,EAAMvhC,GAAIwhC,EAAMvhC,IAGvD,aAAa07C,EAAcjP,GACvB,OAAOiP,EAAala,QAAQiL,GAGhC,mBAAmB9tL,GACf,MAAMk4K,EAASzoM,KAAKN,QAAQ+oM,OACtB7yK,EAAQw3L,GAAgB3kB,GACxB4kB,EAAc5kB,EAAO3nM,OAE3B,IAAK,IAAIitN,EAAW,EAAGA,EAAWV,EAAaU,IAC3C/tN,KAAKqxN,oBAAoB5oB,EAAOslB,GAAW,sBAAuBA,EAAUx9L,GAGhF,IAAK,IAAI8tL,EAAa,EAAGA,EAAazoL,EAAOyoL,IACzC,IAAK,IAAI0P,EAAW,EAAGA,EAAWV,EAAaU,IAAY,CACvD,MAAM0C,EAAgBhoB,EAAOslB,GACvBuD,EAAkBtxN,KAAKstN,aAAaiE,WAAWlT,GAGrD9tL,EAFkBvwB,KAAKwxN,WAAWf,EAAe1C,EAAU1P,GAEvC,CAChB1V,SAAU2oB,EACVjT,WAAYA,EACZ+O,gBAAiBx3L,EACjB6yK,OAAQgoB,EACR1C,SAAUA,IAKtB,IAAK,IAAIA,EAAW,EAAGA,EAAWV,EAAaU,IAC3C/tN,KAAKqxN,oBAAoB5oB,EAAOslB,GAAW,sBAAuBA,EAAUx9L,GAIpF,oBAAoBk4K,EAAQ3hC,EAAOinD,EAAUx9L,GACzC,MAAMkhM,EAAkBhpB,EAAO3hC,GAC/B,GAAI2qD,EAAiB,CACjB,MAAMpT,EAAaoT,EAAgBpT,WAGnC9tL,EAFkBvwB,KAAKwxN,WAAW/oB,EAAQslB,EAAU1P,EAAYoT,EAAgBxxK,MAE5D,CAChB0oJ,SAAU8oB,EAAgB9oB,SAC1B0V,WAAYA,EACZ5V,OAAQA,EACRslB,SAAUA,EACVrlB,SAAU+oB,EAAgBxxK,QAKtC,WAAWwoJ,EAAQslB,EAAU1P,EAAYp+J,GAChCjgD,KAAK0xN,aACN1xN,KAAK0xN,WAAa,IAGtB,IAAIC,EAAY3xN,KAAK0xN,WAAW3D,GAC3B4D,IACDA,EAAY3xN,KAAK0xN,WAAW3D,GAAY,IAG5C,IAAI3uM,EAAOuyM,EAAUtT,GAKrB,OAJKj/L,IACDA,EAAOuyM,EAAUtT,GAAc,GAAahoM,QAAQu7M,UAAUnpB,EAAQ4V,EAAYp+J,IAG/E7gC,EAGX,iBAAiBgqJ,EAAOj/J,GACpB,OAAoB,OAAhBi/J,EAAM/9J,MACC,GAGJrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQi/J,EAAM/9J,OAGvD,WAAW+T,GACP,OAAOA,EAAKsqM,YAAYr+M,OAIhCu4L,GAAkB,GAAkB,CAChC6E,OAAQ,GACRwlB,YAAY,EACZK,WAAW,EACX1iD,MAAM,EACNqlD,aAAa,IAGF,IAAA,GAAA,GCrZA,eAhITY,UAAc,GAChB,YAAYxmN,GAGR,GAFA47C,QAEyB,IAArB3+C,UAAUxH,OAAc,CACxB,MAAMgxN,EAAUD,EAAMC,QAChBC,EAAgB/xN,KAAKgyN,aAAa3mN,GAExC,IAAK,IAAI6hC,EAAM,EAAGA,EAAM4kL,EAAQhxN,OAAQosC,IAAO,CAC3C,MACM+kL,EAAYH,EAAQ5kL,GAAKvmC,QACzBI,EAFc+qN,EAAQ5kL,GAAK7qC,GAEPsF,KAAKoqN,GAE/B,GAAIhrN,EAAO,CACP,MAAMmrN,EAAWD,EAAUlrN,GAC3B/G,KAAKuxC,EAAI2gL,EAAS,GAClBlyN,KAAK6+H,EAAIqzF,EAAS,GAClBlyN,KAAKd,EAAIgzN,EAAS,UAI1BlyN,KAAKuxC,EAAIjpC,UAAU,GACnBtI,KAAK6+H,EAAIv2H,UAAU,GACnBtI,KAAKd,EAAIoJ,UAAU,GAGvBtI,KAAKuxC,EAAIvxC,KAAKmyN,cAAcnyN,KAAKuxC,GACjCvxC,KAAK6+H,EAAI7+H,KAAKmyN,cAAcnyN,KAAK6+H,GACjC7+H,KAAKd,EAAIc,KAAKmyN,cAAcnyN,KAAKd,GAGrC,QACI,MAAMgnC,EAAMlmC,KAAKoyN,SACX7gL,EAAIvxC,KAAKuxC,EAAEx4B,SAAS,IACpB8lH,EAAI7+H,KAAK6+H,EAAE9lH,SAAS,IACpB7Z,EAAIc,KAAKd,EAAE6Z,SAAS,IAE1B,MAAO,IAAMmtB,EAAIqL,GAAKrL,EAAI24F,GAAK34F,EAAIhnC,GAGvC,aAAamM,GACT,IAAIqgK,EAAQrgK,GAAS,QAUrB,MARwB,MAApBqgK,EAAM7rK,OAAO,KACb6rK,EAAQA,EAAMzpK,OAAO,EAAG,IAG5BypK,EAAQA,EAAMvnK,QAAQ,KAAM,IAC5BunK,EAAQA,EAAMllK,cACdklK,EAAQmmD,EAAMQ,YAAY3mD,IAAUA,EAE7BA,EAGX,cAAcrgK,GACV,OAAIA,EAAQ,GAAK25B,MAAM35B,GACZ,EAGJA,EAAQ,IAAM,IAAMA,EAG/B,SAASA,GACL,OAAyB,IAAjBA,EAAMvK,OAAgB,IAAMuK,EAAQA,EAGhD,WAAWA,GACP,MAAM0zB,EAAQx1B,KAAKw1B,MAMnB,OAJA/+B,KAAKuxC,EAAIxS,EAAM/+B,KAAKmyN,cAAcnyN,KAAKuxC,EAAIlmC,IAC3CrL,KAAK6+H,EAAI9/F,EAAM/+B,KAAKmyN,cAAcnyN,KAAK6+H,EAAIxzH,IAC3CrL,KAAKd,EAAI6/B,EAAM/+B,KAAKmyN,cAAcnyN,KAAKd,EAAImM,IAEpCrL,KAGX,iBACI,OAAOuJ,KAAKsvC,KAAK,KAAQ74C,KAAKuxC,EAAIvxC,KAAKuxC,EAAI,KAAQvxC,KAAK6+H,EAAI7+H,KAAK6+H,EAAI,KAAQ7+H,KAAKd,EAAIc,KAAKd,GAG/F,SACI,OAAOc,KAAKsyN,iBAnFE,IAsFlB,iBAAiB/gL,EAAGstF,EAAG3/H,EAAGD,GACtB,OAAO,IAAI46L,GAAMtoJ,EAAGstF,EAAG3/H,EAAQ,MAALD,EAAYA,EAAI,GAG9C,eAAesyC,EAAGstF,EAAG3/H,EAAGD,GACpB,OAAO,IAAI66L,GAAIvoJ,EAAGstF,EAAG3/H,EAAQ,MAALD,EAAYA,EAAI,GAG5C,eAAek/G,EAAGz8G,EAAG22C,EAAGp5C,GACpB,OAAO,IAAI86L,GAAI57E,EAAGz8G,EAAG22C,EAAQ,MAALp5C,EAAYA,EAAI,GAG5C,eAAek/G,EAAGz8G,EAAGM,EAAG/C,GACpB,OAAO,IAAI+6L,GAAI77E,EAAGz8G,EAAGM,EAAQ,MAAL/C,EAAYA,EAAI,WAIhD4yN,EAAMC,QAAU,CAAE,CACdzvN,GAAI,+CACJsE,QAAS,SAASI,GACd,MAAO,CACH4K,SAAS5K,EAAM,GAAI,IAAK4K,SAAS5K,EAAM,GAAI,IAAK4K,SAAS5K,EAAM,GAAI,OAG5E,CACC1E,GAAI,0BACJsE,QAAS,SAASI,GACd,MAAO,CACH4K,SAAS5K,EAAM,GAAI,IAAK4K,SAAS5K,EAAM,GAAI,IAAK4K,SAAS5K,EAAM,GAAI,OAG5E,CACC1E,GAAI,0BACJsE,QAAS,SAASI,GACd,MAAO,CACH4K,SAAS5K,EAAM,GAAKA,EAAM,GAAI,IAC9B4K,SAAS5K,EAAM,GAAKA,EAAM,GAAI,IAC9B4K,SAAS5K,EAAM,GAAKA,EAAM,GAAI,QAK1C8qN,EAAMQ,YAAc,SCnFL,GA9CU,CACrB1mC,MAAO,SAASmW,EAAOrvL,GACnB,OAAOqvL,EAAMj3D,QP4DA,cO1DT7qI,KAAKwvM,UAAU/8L,KAIvB8/M,MAAO,SAASzwB,EAAOrvL,GACnB,OAAOqvL,EAAMj3D,QPsDA,cOpDT7qI,KAAKwvM,UAAU/8L,KAIvByrB,KAAM,SAAS4jK,EAAOrvL,GAClB,OAAOqvL,EAAMj3D,QPgDD,aO9CR7qI,KAAKwvM,UAAU/8L,KAIvB+/M,IAAK,SAAS1wB,EAAOrvL,GACjB,OAAOqvL,EAAMj3D,QP0CA,cOxCT7qI,KAAKwvM,UAAU/8L,KAIvB+8L,UAAW,SAAS/8L,GAChB,MAAO,CACHpH,MAAOrL,KAAKqL,MACZu9L,WAAY5oM,KAAK4oM,WACjBkoB,WAAY9wN,KAAK8wN,WACjBnoB,SAAU3oM,KAAK2oM,SACfF,OAAQzoM,KAAKyoM,OACbC,SAAU1oM,KAAK0oM,SACfG,aAAc7oM,KAAK6oM,aACnB3sE,MAAOl8H,KAAKk8H,MACZznF,QAAS,GAAahiC,GACtBmxK,cAAenxK,EACf22J,MAAOppK,QCtBJ,GAnBG,CACdyyN,WAAY,WACR,MAAM/yN,EAAUM,KAAKN,QAAQ8xM,MACvBxtH,EAAOhkF,KAAKgwN,UAAYtwN,EAAQo/H,MAAM96C,MAEpB,IAApBtkF,EAAQ0sK,SAAqB,GAAQpoF,IAAkB,OAATA,IAC9ChkF,KAAK0xM,KAAO,IAAI,GAAK,CACjBrmM,MAAOrL,KAAKqL,MACZ24E,KAAMA,EACN0kH,SAAU1oM,KAAK0oM,SACfC,SAAU3oM,KAAK2oM,SACfF,OAAQzoM,KAAKyoM,QACdzoM,KAAKN,QAAQ8xM,MAAOxxM,KAAK+vN,MAAM/oB,cAElChnM,KAAKq6H,OAAOr6H,KAAK0xM,SCN7B,MAAM,WAAkB,GACpB,YAAYrmM,EAAO3L,GACfunD,QAEAjnD,KAAKqL,MAAQA,EACbrL,KAAKN,QAAUA,EACfM,KAAK6wN,UAAY,GAAe7wN,KAAKN,QAAQmxN,WAAW,GACxD7wN,KAAK0yN,iBAAkB,EAG3B,SACI,MAAM,QAAEC,EAAO,OAAE3iB,GAAWhwM,KAAKN,QAEjC,IAAIM,KAAK4yN,UAAT,CAWA,GAPA5yN,KAAK4yN,WAAY,EAEbD,EAAQvmD,SAAWumD,EAAQ/6M,OAC3B5X,KAAKugE,OAASvgE,KAAK6yN,eACnB7yN,KAAKq6H,OAAOr6H,KAAKugE,SAGjByvI,EAAO5jC,QAAS,CAChB,MAAMonC,EAAgBhR,GAAYwN,GAC5B/F,EAAYjqM,KAAKiqM,YACvB,IAAI6oB,EAAY9yN,KAAKqL,MACjBmoM,EACAsf,EAAYtf,EAAcvJ,GACnB+F,EAAO7lM,SACd2oN,EAAY9yN,KAAKusC,YAAYyjK,EAAO7lM,SAExCnK,KAAK8+H,MAAQ,IAAI,GAAQg0F,EACrB1xB,GAAW,CACP1lB,MAAO7V,GACP0jC,OAAQ1jC,GACRojC,OAAQ,CACJt3J,KAAM,EACNC,MAAO,GAEXw9I,OAAQ,GAAe4gB,EAAO5gB,OAAQpvL,KAAKyoM,OAAOrZ,SACnD4gB,GACH/F,GAEJjqM,KAAKq6H,OAAOr6H,KAAK8+H,OAGrB9+H,KAAKyyN,aAEDzyN,KAAK6vN,UACL7vN,KAAKq6H,OAAOr6H,KAAK6vN,WAIzB,eACI,MAAMnwN,EAAUM,KAAKN,QAAQizN,QACvB/oB,EAAalqM,EAAQkqM,WACrBP,EAASjI,GAAW,CAAE11B,MAAO1rK,KAAK0rK,OAAShsK,EAAQ2pM,QAMzD,OAJK,GAAQA,EAAO39B,SAChB29B,EAAO39B,MAAQ,IAAI,GAAMk+B,GAAYmpB,WThEvB,ISgEqD15B,SAGhEgQ,EAGX,gBAEA,eACI,MAAM3pM,EAAUM,KAAKN,QAAQizN,QAmB7B,OAlBe,IAAI,GAAa,CAC5BrvN,KAAM5D,EAAQ4D,KACd8sC,MAAO1wC,EAAQkY,KACfiyJ,OAAQnqK,EAAQkY,KAChBkgC,SAAUp4C,EAAQo4C,SAClB8xJ,WAAYlqM,EAAQkqM,WACpBP,OAAQrpM,KAAKgzN,eACbllD,QAAS9tK,KAAKyoM,OAAO36B,SAAWpuK,EAAQouK,QACxCshB,OAAQ,GAAe1vL,EAAQ0vL,OAAQpvL,KAAKyoM,OAAOrZ,QACnDv7F,UAAWn0F,EAAQm0F,UACnBq4F,OAAQxsL,EAAQwsL,QACjB,CACCwc,SAAU1oM,KAAK0oM,SACfr9L,MAAOrL,KAAKqL,MACZo9L,OAAQzoM,KAAKyoM,OACbE,SAAU3oM,KAAK2oM,WAMvB,YAMI,OALK3oM,KAAKugE,SACNvgE,KAAKugE,OAASvgE,KAAK6yN,eACnB7yN,KAAKugE,OAAOsmI,OAAO7mM,KAAKizN,YAGrBjzN,KAAKugE,OAAO+5G,IAGvB,OAAO+pB,GACH,MAAM,QAAE3kM,EAAO,UAAEmxN,GAAc7wN,KACzByrM,EAAW/rM,EAAQ+rM,SAEzBzrM,KAAKgmL,SAELhmL,KAAKs6K,IAAM+pB,EACX,MAAM6uB,EAAW7uB,EAAUhuK,QAuB3B,GArBIo1K,EACIolB,EACAqC,EAASxhD,IAAMwhD,EAASrpD,SAExBqpD,EAASthD,IAAMshD,EAASrpD,SAGxBgnD,EACAqC,EAASzhD,IAAMyhD,EAAS9iL,QAExB8iL,EAASvhD,IAAMuhD,EAAS9iL,QAIhCpwC,KAAKizN,UAAYC,EACblzN,KAAKugE,QACLvgE,KAAKugE,OAAOsmI,OAAOqsB,GAGvBlzN,KAAKmzN,YAAYD,GAEblzN,KAAKqvN,UACL,IAAK,IAAI3uN,EAAI,EAAGA,EAAIV,KAAKqvN,UAAUvuN,OAAQJ,IACvCV,KAAKqvN,UAAU3uN,GAAGmmM,OAAOqsB,GAIjC,GAAIlzN,KAAK0xM,KAAM,CACX,IAAI0hB,EAAgBpzN,KAAKqzN,YAEzB,IAAM3zN,EAAQizN,QAAQvmD,UAAW1sK,EAAQizN,QAAQ/6M,KAAO,CACpD,MAAM8+B,EAAS08K,EAAc18K,SAC7B08K,EAAgB,IAAI,GAAI18K,EAAO1L,EAAG0L,EAAOvG,EAAGuG,EAAO1L,EAAG0L,EAAOvG,GAGjEnwC,KAAK0xM,KAAK7K,OAAOusB,IAIzB,YAAY94C,GACR,MAAM,QAAE56K,EAAO,MAAEo/H,GAAU9+H,KAC3B,IAAIi7E,EAASv7E,EAAQswM,OAAOlsK,SAExBg7F,IACA7jD,EThJE,USgJOA,EAAmBorF,GAAMprF,EAClCA,EThJE,USgJOA,EAAmB2qF,GAAS3qF,EAErC6jD,EAAM+nE,OAAOvsB,GACbx7C,EAAMw7C,IAAI80B,QAAQpvM,KAAKqzN,YAAap4I,GACpC6jD,EAAM+nE,OAAO/nE,EAAMw7C,MAI3B,kBACI,MAAMq4C,EAAU3yN,KAAKN,QAAQuoM,UAAU0qB,QACjCW,EAAetzN,KAAKgzN,eAAetnD,MACnChsK,EAAUM,KAAKN,QAAQizN,QACvB/6M,EAAOlY,EAAQkY,MAAQlY,EAAQ2pM,OAAOj5J,OAAS,IAAMuiL,EAAQtpB,OAAOj5J,OAAS,GAE7EmjL,EAAS,IAAI,GAAa,CAC5BjwN,KAAM5D,EAAQ4D,KACd8sC,MAAOx4B,EACPiyJ,OAAQjyJ,EACRkgC,SAAUp4C,EAAQo4C,SAClB8xJ,WAAY+oB,EAAQjnD,OAAS4nD,EAC7BjqB,OAAQ,CACJ39B,MAAOinD,EAAQtpB,OAAO39B,MACtBt7H,MAAOuiL,EAAQtpB,OAAOj5J,MACtB09H,QAAS,GAAe6kD,EAAQtpB,OAAOv7B,QAAS,IAEpDA,QAAS,GAAe6kD,EAAQ7kD,QAAS,KAI7C,OAFAylD,EAAO1sB,OAAO7mM,KAAKizN,WAEZM,EAAOppB,aAGlB,kBACI,OAAQnqM,KAAKugE,QAAU,IAAI2rH,OAG/B,sBACI,MAAM3rH,EAASvgE,KAAKugE,OACpB,IAAI2rH,EAAQp9D,EAEZ,GAAIvuD,EACAuuD,EAAOvuD,EAAOipI,WAAWO,SACzB7d,EAAS3rH,EAAO2rH,WACb,CACH,MAAMt0K,EAAO5X,KAAKN,QAAQizN,QAAQ/6M,KAC5B47M,EAAW57M,EAAO,EAClB8+B,EAAS12C,KAAKs6K,IAAI5jI,SACxBo4E,EAAO,IAAI,EAAKw8D,KAAK,CAAE50I,EAAO1L,EAAIwoL,EAAU98K,EAAOvG,EAAIqjL,GAAY,CAAE57M,EAAMA,IAG/E,MAAO,CACHlY,QAASM,KAAKN,QACdovH,KAAMA,EACNo9D,OAAQA,GAIhB,gBACI,MAAMmnC,EAAYrzN,KAAKqzN,YACjBI,EAAUzzN,KAAK+vN,MAAM/c,KAAKygB,UAGhC,IAFqBA,GAAWA,EAAQzT,SAASqT,GAEhC,CACb,MACMK,EAAkBztD,GACxB,IAAI91H,EAAGwjL,EAUP,OARI3zN,KAAK6wN,WACL1gL,EAAIkjL,EAAU3hD,GACdiiD,EAAgB/tD,KAEhBz1H,EAAIkjL,EAAUzhD,GACd+hD,EAAgBttD,IAGb,CACH+C,MAAO,IAAI,GAbLiqD,EAAU1hD,GT5NT,ESyOaxhI,GACpBurI,MAAO,CACHk4C,WAAYF,EACZjoB,SAAUkoB,KAM1B,YAAYxpN,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,GAG7C,YAAYmwK,GAER,OADkBt6K,KAAKqzN,YACNrT,SAAS1lC,GAG9B,iBACQt6K,KAAK8+H,QACL9+H,KAAK8+H,MAAMp/H,QAAQioM,QAAS,GAG5B3nM,KAAK0xM,OACL1xM,KAAK0xM,KAAKhyM,QAAQioM,QAAS,GAInC,YACI,MAAO,CACHe,SAAU1oM,KAAK0oM,SACfC,SAAU3oM,KAAK2oM,SACft9L,MAAOrL,KAAKqL,MACZu9L,WAAY5oM,KAAK4oM,WACjBkoB,WAAY9wN,KAAK8wN,WACjBroB,OAAQzoM,KAAKyoM,SAKzB,GAAUxnM,UAAUL,SAAW,CAC3B6qM,UAAU,EACVknB,QAAS,CACLvmD,SAAS,EACTw9B,WAAYrjC,GACZ3uJ,KT9QiB,ES+QjBtU,KAAMwiK,GACNujC,OAAQ,CACJj5J,MAAO,GAEX09H,QAAS,GAEbkiC,OAAQ,CACJ5jC,SAAS,EACTtoI,STnRM,QSoRNmlK,OAAQzH,GAAW,GACnB3d,QAAS2d,GAAW,GACpB3tG,UAAW,CACPvwF,KTvSG,SSwSH+2B,MTzSuB,MS4S/Bm3K,MAAO,CACH1yE,MAAO,IAEXmpE,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,CACJ39B,MAAO,OACPt7H,MAAO,IAGfg/I,O5Q1SwB,K4Q4S5BigC,UAAW,CACPxhL,KAAM,CACFuC,MAAO,KAKnBgxJ,GAAW,GAAUngM,UAAW,IAChCmgM,GAAW,GAAUngM,UAAW,IAEjB,IAAA,GAAA,GChUf,MAAM,WAAoB,GACtB,YAAYouM,EAAY5G,EAAQslB,GAC5B9mK,QAEAjnD,KAAKqvM,WAAaA,EAClBrvM,KAAKyoM,OAASA,EACdzoM,KAAK+tN,SAAWA,EAGpB,SACI,OAAO/tN,KAAK8zN,iBAAiB9zN,KAAKqvM,YAGtC,iBAAiBx/B,GACb,MAAMnoK,EAAS,GACf,IAAK,IAAIhH,EAAI,EAAGI,EAAS+uK,EAAO/uK,OAAQJ,EAAII,EAAQJ,IAC5CmvK,EAAOnvK,KAA4B,IAAtBmvK,EAAOnvK,GAAG0rK,SACvB1kK,EAAOrE,KAAKwsK,EAAOnvK,GAAGuyN,UAAUlpB,SAASrzJ,UAIjD,OAAOhvC,EAGX,eACI,MAAM0gM,EAAepoM,KAAKyoM,OAAOvc,OAC7Bkc,GACApoM,KAAKksL,OAASkc,EAAa,CACvBv4B,OAAQ7vK,KAAK8zN,iBAAiB9zN,KAAKqvM,YACnC5G,OAAQzoM,KAAKyoM,OACbpnB,OAAQrhL,KAAKwoM,YACbtB,aAAc,KACVlnM,KAAK+zN,gBAEE/zN,KAAKksL,UAGhBlsL,KAAKksL,SAAW,GAAQlsL,KAAKksL,OAAOxsL,QAAQ0vL,UAC5CpvL,KAAKksL,OAAOxsL,QAAQ0vL,OAASpvL,KAAKyoM,OAAOrZ,SAG7CpvL,KAAK+zN,gBAIb,gBACI,MAAM,QAAEr0N,EAAO,OAAE+oM,GAAWzoM,KAC5B,IAAI,MAAE0rK,EAAOwkD,UAAWtvN,GAAa6nM,EAEjC,GAAW/8B,IAAU9qK,IACrB8qK,EAAQ9qK,EAAS8qK,OAGrB,MAAM79H,EAAO,EAAKw9I,KAAK1gB,WAAW3qK,KAAK6vK,SAAU,CAC7ClD,OAAQ,CACJjB,MAAOA,EACPt7H,MAAOq4J,EAAOr4J,MACd09H,QAAS26B,EAAO36B,QAChBsb,SAAUqf,EAAOrf,UAErBgG,OAAQqZ,EAAOrZ,SAGf1vL,EAAQgmD,QACR7X,EAAKpvC,QAGTuB,KAAKksL,OAASr+I,EAGlB,SAASp7B,EAAGuhN,GACR,OAAOh0N,KAAKqmB,OAAO4tM,gBAAgBD,EAAOhpL,EAAGgpL,EAAO7jL,EAAGnwC,KAAK+tN,WAIpEnqB,GAAkB,GAAa,CAC3Bl+I,QAAQ,IAGG,IAAA,GAAA,GC1Cf,SAASwuK,GAAgBC,EAAWC,EAAUC,EAAS14C,EAAM3xK,GACzD,MAAMswK,EAAM65C,EAAU75C,IAChB5yK,EAAS,IAAI,EAAK8+L,MAKxB,OAHA9+L,EAAO0sN,GAAY95C,EAAI85C,EAAWC,GAClC3sN,EAAOi0K,GAAQrB,EAAIqB,EAAO3xK,GAEnBtC,EAGI,IAAA,GAhDO,CAClB4sN,oBAAqB,SAASzkD,GAC1B,MAAMy9C,EAAettN,KAAKqmB,OAAOwsL,SAAS0a,mBAAmBvtN,KAAKyoM,SAC5D,UAAEsO,EAAS,SAAEtL,EAAQ,QAAEtvL,GAAYmxM,EAAa5tN,QAEhD00N,EAAW3oB,EAAWjlC,GAAIC,GAC1BkV,EAAO8vB,EAAWhlC,GAAID,GACtB6tD,EAAUl4M,EAAU,EAAI,EACxBnS,EAAMqqN,EAEZ,IAAIE,EAAgBL,GAAgBrkD,EAAO,GAAIukD,EAAUC,EAAS14C,EAAM3xK,GACxE,MAAMtC,EAAS,CAAE6sN,GAEjB,IAAK,IAAIrnL,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQ8qD,GAAgBrkD,EAAO3iI,GAAMknL,EAAUC,EAAS14C,EAAM3xK,GAEpE,GAAIuqN,EAAcH,KAAchrD,EAAMgrD,GAAW,CAC7C,MAAMI,EAAY,IAAI,EAAKhuB,MAC3BguB,EAAUJ,GAAYG,EAAcH,GACpCI,EAAU74C,GAAQvS,EAAMuS,GAExBj0K,EAAOrE,KAAKmxN,EAAWprD,GAG3BmrD,EAAgBnrD,EASpB,OANK2tC,EAEMwd,IAAkB,GAAK7sN,IAC9BA,EAAOrE,KAAKkxN,GAFZ7sN,EAAOrE,KAAK6wN,GAAgB,GAAKrkD,GAASukD,EAAUC,EAAS14C,EAAMx/J,EAAU,EAAI,IAK9EzU,IClCf,MAAM,WAAwB,GAC1B,SACI,OAAO1H,KAAKs0N,oBAAoBt0N,KAAKqvM,aAI7CjO,GAAW,GAAgBngM,UAAW,IAEvB,IAAA,GAAA,GCwBA,GA5Bf,cAA4B,GACxB,gBACI,MAAMwnM,EAASzoM,KAAKyoM,OACd7nM,EAAW6nM,EAAOynB,UACxB,IAAIxkD,EAAQ+8B,EAAO/8B,MAEf,GAAWA,IAAU9qK,IACrB8qK,EAAQ9qK,EAAS8qK,OAGrB,MACM/wB,EADiB,IAAI,GAAe36I,KAAKN,QAAQgmD,QACvB/+C,QAAQ3G,KAAK6vK,UACvC4kD,EAAQ,IAAI,EAAKppC,KAAK,CACxB1e,OAAQ,CACJjB,MAAOA,EACPt7H,MAAOq4J,EAAOr4J,MACd09H,QAAS26B,EAAO36B,QAChBsb,SAAUqf,EAAOrf,UAErBgG,OAAQqZ,EAAOrZ,SAGnBqlC,EAAM95E,SAASt3I,KAAKiQ,MAAMmhN,EAAM95E,SAAUA,GAE1C36I,KAAKksL,OAASuoC,ICuDP,GAjFQ,CACnBC,eAAgB,WACZ,MAAM,QAAEh1N,EAAO,aAAEguN,GAAiB1tN,KAC5ByoM,EAAS/oM,EAAQ+oM,OACjB4kB,EAAcK,EAAa5sN,OACjC,IAAIg4K,EAEJ94K,KAAK20N,UAAY,GAEjB,IAAK,IAAI5G,EAAW,EAAGA,EAAWV,EAAaU,IAAY,CACvD,MAAM0C,EAAgBhoB,EAAOslB,GACvB6G,EAAe50N,KAAK60N,WAAWnH,EAAaK,IAC5C+G,EAAaF,EAAa9zN,OAChC,IAAIuuM,EAAa,GAEjB,IAAK,IAAIwa,EAAU,EAAGA,EAAUiL,EAAYjL,IAAW,CACnD,MAAMzgD,EAAQwrD,EAAa/K,GACvBzgD,EACAimC,EAAWhsM,KAAK+lK,GdLhB,gBcMOppK,KAAK+0N,oBAAoBtE,KAC5BphB,EAAWvuM,OAAS,IACpBg4K,EAAc94K,KAAKg1N,cACf3lB,EAAYohB,EAAe1C,EAAUj1C,GAEzC94K,KAAKi1N,YAAYn8C,IAErBu2B,EAAa,IAIjBA,EAAWvuM,OAAS,IACpBg4K,EAAc94K,KAAKg1N,cACf3lB,EAAYohB,EAAe1C,EAAUj1C,GAEzC94K,KAAKi1N,YAAYn8C,IAIzB94K,KAAKoxC,SAASslC,QAAQpjE,MAAMtT,KAAKoxC,SAAUpxC,KAAK20N,YAGpDM,YAAa,SAASnqN,GAClB9K,KAAK20N,UAAUtxN,KAAKyH,GACpBA,EAAQub,OAASrmB,MAGrB60N,WAAY,SAAShlD,GACjB,OAAOA,GAGXklD,oBAAqB,SAAStsB,GAC1B,MAAMysB,EAAgBzsB,EAAOysB,cAG7B,OAFoBA,GAAiBl1N,KAAKN,QAAQ4uN,UAE9BplD,GAAOgsD,GdzCf,ec4ChBjB,gBAAiB,SAASjpL,EAAGmF,EAAG49K,GAC5B,MAAMlqL,EAAS,IAAI,GAAMmH,EAAGmF,GACtBglL,EAAYn1N,KAAK0tN,aAAaK,GACpC,IACIqH,EADAC,EAAuBnvD,GAG3B,IAAK,IAAIxlK,EAAI,EAAGA,EAAIy0N,EAAUr0N,OAAQJ,IAAK,CACvC,MAAM0oK,EAAQ+rD,EAAUz0N,GAExB,GAAI0oK,GAAS,GAAQA,EAAM/9J,QAA0B,OAAhB+9J,EAAM/9J,QAAoC,IAAlB+9J,EAAMgD,QAAmB,CAClF,MACMwB,EADWxE,EAAMkR,IACQ5jI,SAASm3H,WAAWhqI,GAE/C+pI,EAAgBynD,IAChBD,EAAehsD,EACfisD,EAAuBznD,IAKnC,OAAOwnD,IC7Ef,MAAM,WAAsB,EAAK3tB,UAC7B,QACIznM,KAAKs1N,QAAQt1N,KAAKN,QAAQ46K,IAAI7I,IAGlC,KAAK3qD,GACD,MAAMwzD,EAAMt6K,KAAKN,QAAQ46K,IACzBt6K,KAAKs1N,QAAQptL,GAAiBoyI,EAAI7I,GAAI6I,EAAI3I,GAAI7qD,IAGlD,QAAQ97E,GACJ,MAAMyJ,EAAUz0C,KAAKy0C,QACfkmG,EAAWlmG,EAAQkmG,SACnB2vB,EAAW3vB,EAAS,GAAG1/D,SACvBuvF,EAAc7vB,EAAS,GAAG1/D,SAEhCxmC,EAAQmkI,UACRtO,EAASirD,KAAKvqL,GACdyJ,EAAQokI,SACRrO,EAAY+qD,KAAKvqL,IAIzB44J,GAAkB,GAAe,CAC7Bz+B,Sf1B+B,Me6BnC,EAAKqwD,iBAAiBn/M,QAAQo/M,SAAS,OAAQ,IAEhC,IAAA,GAAA,GCjCA,SAASC,GAAatiD,GACjC,IAAK,IAAIlmI,EAAM,EAAGA,EAAMkmI,EAAStyK,OAAQosC,IACrC,GAAI,GAAQkmI,EAASlmI,GAAKkiJ,QACtB,OAAO,EC6BJ,IAAA,GA5BY,CACvBgY,gBAAiB,WACb,MAAMr9L,EAAO/J,KAAK8mM,UAClB,GAAI/8L,IAA6C,KAApCA,EAAKrK,SAAW,IAAI8vJ,YAAuB,CACpD,MAAM8qB,EAAMvwK,EAAK6N,OACX+9M,EAAW,EAAKtqC,KAAKye,SAASxvB,EAAIyvB,UACxC/pM,KAAKksL,OAAOtgB,KAAK+pD,GACjB31N,KAAK6zF,UAAY,IAAI,GAAc8hI,EAAU,CACzCr7C,IAAKA,IAELo7C,GAAa11N,KAAKN,QAAQ+oM,SAC1BzoM,KAAK41N,sBAAsBD,KAKvCC,sBAAuB,SAASD,GAC5B,MAAM9lD,EAAS7vK,KAAK61N,kBAEpB,IAAK,IAAI3oL,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQyG,EAAO3iI,GACjBk8H,GAASA,EAAM8iB,QAAU,GAAQ9iB,EAAM8iB,OAAOxsL,QAAQ0vL,SACtDhmB,EAAM8iB,OAAOtgB,KAAK+pD,MCqFnB,eArGTG,UAAkB,GACpB,SAEI7uK,MAAM++H,SAENhmL,KAAK+1N,mBACL/1N,KAAK00N,iBAGT,YACI,OAAO,GAGX,YAAYt1M,EAAM0oJ,GACd,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,EAC7CotD,EAAgBl1N,KAAK+0N,oBAAoBtsB,GAC/C,IAAIp9L,EAAQ+T,EAAKsqM,YAAYr+M,MAE7B,IAAK,GAAQA,IAAoB,OAAVA,EAAgB,CACnC,GAAI6pN,IAAkBhsD,GAGlB,OAAO,KAFP79J,EAAQ,EAMhB,IAAI+kN,EAAepwN,KAAKowN,aAAa3nB,EAAQslB,GAC7CqC,EAAepwN,KAAKg2N,iBAChB5F,EAAc/kN,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GAGvD,IAAIriD,EAAQtsJ,EAAK0oJ,OAAO4D,OAAS+8B,EAAO/8B,MACpC,GAAW+8B,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB,MAAMtC,EAAQ,IAAI,GAAU/9J,EAAO+kN,GAKnC,OAJAhnD,EAAMsC,MAAQA,EAEd1rK,KAAKq6H,OAAO+uC,GAELA,EAGX,UAAUA,GACN,IAAImlD,EAAYvuN,KAAKuuN,UAAUnlD,GAE/B,GAAIppK,KAAKN,QAAQ4uN,UAAW,CACxB,MACMb,EAAiBztN,KAAKytN,eADTrkD,EAAMi1C,YAGzB,IAAK,IAAI39M,EAAI,EAAGA,EAAI+sN,EAAe3sN,OAAQJ,IAAK,CAC5C,MAAM+kB,EAAQgoM,EAAe/sN,GAE7B,GAAI0oK,IAAU3jJ,EACV,MAGJ8oM,GAAavuN,KAAKuuN,UAAU9oM,GAExBzlB,KAAKN,QAAQwuN,eACbK,EAAYhlN,KAAKC,IAAI+kN,EAAW,KAM5C,MAAO,CAAEA,EAAWA,GAGxB,cAAclf,EAAYohB,EAAe1C,GACrC,MAAMthL,EAAQgkL,EAAchkL,MAC5B,IAAIuhL,EAUJ,OAPIA,ElB9DC,SkB6DDvhL,EACY,GlB/DT,WkBgEIA,EACK,GAEA,GAGT,IAAIuhL,EAAU3e,EAAYohB,EAAe1C,GAGpD,kBACI,MAAMl+C,EAAS7vK,KAAK6vK,OACdnoK,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IACnCxlC,EAAOrE,MAAMwsK,EAAO3iI,IAAQ,IAAIqzB,QAEpC,OAAO74D,EAAOiC,OAAO3J,KAAK20N,WAG9B,+BACI,OAAO,UAIfvzB,GAAW00B,EAAU70N,UAAW,GAAgB,UCkBjC,GA5Hf,cAA0B,GACtB,YAAYouM,EAAYohB,EAAe1C,EAAUkI,EAAaC,GAC1DjvK,MAAMooJ,EAAYohB,EAAe1C,GAEjC/tN,KAAKi2N,YAAcA,EACnBj2N,KAAKk2N,YAAcA,EAGvB,eACI,MAAMztB,EAASzoM,KAAKyoM,OACd7nM,EAAW6nM,EAAOynB,UAClBrc,EAAcpL,EAAO56J,MAAQ,GACnC,IAAI69H,EAAQ+8B,EAAO/8B,MAEf,GAAWA,IAAU9qK,IACrB8qK,EAAQ9qK,EAAS8qK,OAGrB1rK,KAAKksL,OAAS,IAAI,EAAKnvE,MAAM,CACzBqyE,OAAQqZ,EAAOrZ,SAGnBpvL,KAAKm2N,WAAW,CACZr4N,KAAM,CACF4tK,MAAOA,EACPoC,QAAS26B,EAAO36B,SAEpBnB,OAAQ,OAGRknC,EAAYzjK,MAAQ,IAA6B,IAAxByjK,EAAYznC,SACrCpsK,KAAKo2N,aAAa,CACdzpD,OAAQy0B,GAAW,CACf11B,MAAOA,EACPoC,QAAS26B,EAAO36B,QAChByb,QAAS,QACVsqB,KAKf,iBACI,IAAIl5D,EAAW36I,KAAKq2N,gBAMpB,OAJK17E,IACDA,EAAW36I,KAAKq2N,gBAAkBr2N,KAAKs2N,wBAGpC37E,EAGX,uBACI,OAAO36I,KAAKu2N,mBAAmBv2N,KAAK6vK,UAGxC,gBACI,OAAI7vK,KAAKi2N,YACEj2N,KAAKi2N,YAAYO,oBAAoBx2N,KAAKk2N,aAG9Cl2N,KAAKw2N,oBAAoBx2N,KAAKk2N,aAGzC,oBAAoBA,GAChB,OAAOl2N,KAAKu2N,mBAAmBv2N,KAAK8zN,iBAAiBoC,IAAc/5M,UAGvE,mBAAmB0zJ,GACf,OAAOA,EAAOpuK,IAAK2nK,GAAU,IAAI,EAAK29C,QAAQ39C,IAGlD,aAAa38H,GACT,MAAMkgI,EAAS,IAAI,EAAK0e,KAAK5+I,GAC7BkgI,EAAOhyB,SAASt3I,KAAKiQ,MAAMq5J,EAAOhyB,SAAU36I,KAAKy2N,kBAEjDz2N,KAAKksL,OAAO7xD,OAAOsyC,GAGvB,kBACI,OAAO3sK,KAAKi2N,aAAgBj2N,KAAKk2N,aAAel2N,KAAKk2N,YAAYp1N,OAGrE,WAAW2rC,GACP,MAAMgqL,EAAiBz2N,KAAKy2N,iBACtBC,EAAeD,EAAevyN,MAAM,GACpCyyN,EAAmB32N,KAAK42N,kBAE9B,GAAID,EAAkB,CAClB,MAAME,EAAgB72N,KAAK62N,gBAE3B,GAAOH,EAAcG,GAGzB,MAAM/4N,EAAO,IAAI,EAAKutL,KAAK5+I,GAC3B3uC,EAAK68I,SAASt3I,KAAKiQ,MAAMxV,EAAK68I,SAAU+7E,IAEnCC,GAAoBF,EAAe31N,OAAS,GAC7Cd,KAAK82N,WAAWh5N,GAGpBkC,KAAKksL,OAAO7xD,OAAOv8H,GAGvB,WAAWi5N,GACP,MAAMj1B,EAAQ9hM,KAAKqmB,OACb4nM,EAAansB,EAAMpiM,QAAQuuN,WAC3B1U,EAAYzX,EAAMirB,gBAAgB/sN,KAAKyoM,QACvCuuB,EAAgBl1B,EAAM6sB,0BAA0BpV,GAChD0d,EAAU1d,EAAUnG,QAAQ4jB,EAAeA,GAAe,GAC1Dr8E,EAAW36I,KAAKy2N,iBAChBS,EAAav8E,EAAS,GAAG1/D,SACzBk8I,EAAY,GAAKx8E,GAAU1/D,SACjC,IAAI5zE,EAAM4mN,EAAagJ,EAAQxlD,GAAKwlD,EAAQvlD,GAExCu8C,EACA8I,EAASt/C,OAAOpwK,EAAK8vN,EAAUhnL,GACtBsnI,OAAOpwK,EAAK6vN,EAAW/mL,GAEhC4mL,EAASt/C,OAAO0/C,EAAUnsL,EAAG3jC,GACpBowK,OAAOy/C,EAAWlsL,EAAG3jC,KCvH1C,MAAM,WAAwB,GAE1B,uBACI,OAAOrH,KAAKu2N,mBAAmBv2N,KAAKs0N,oBAAoBt0N,KAAKqvM,aAGjE,oBAAoB6mB,GAChB,OAAOl2N,KAAKu2N,mBAAmBv2N,KAAKs0N,oBAAoB4B,IAAc/5M,WAI9EilL,GAAW,GAAgBngM,UAAW,IAEvB,IAAA,GAAA,GCYA,GAzBf,cAAgC,GAE5B,uBACI,MAAMm2N,EAAiB,IAAI,GAAep3N,KAAKN,QAAQgmD,QACjD2pJ,EAAarvM,KAAK6vK,SAExB,OAAOunD,EAAezwN,QAAQ0oM,GAGlC,sBACI,MAAMonB,EAAiBz2N,KAAKy2N,iBACtBI,EAAgB,GACtB,IAAK,IAAI3pL,EAAMupL,EAAe31N,OAAS,EAAGosC,GAAO,EAAGA,IAAO,CACvD,MAAMpiC,EAAU2rN,EAAevpL,GAC/B2pL,EAAcxzN,KAAK,IAAI,EAAK0jN,QACxBj8M,EAAQmwE,SACRnwE,EAAQuqK,aACRvqK,EAAQsqK,cAIhB,OAAOyhD,IC2GA,GA5Hf,cAAwB,GACpB,cAAcxnB,EAAYohB,EAAe1C,EAAUkI,GAC/C,MACMxpL,GAASgkL,EAAc5iL,MAAQ,IAAIpB,MACzC,IAAI4qL,EAEAnB,EAWAlI,EASJ,OAxBkBhuN,KAAKN,QAAQ4uN,WAKdP,EAAW,GAAKkI,IAEP,QADAj2N,KAAK+0N,oBAAoBtE,IAE3CyF,EAAcD,EAAY5mB,WAC1BgoB,EAAkBpB,GAElBC,EAAcl2N,KAAKs3N,gBAAgBjoB,EAAY0e,EAAUthL,IAM7DuhL,EtBHC,SsBEDvhL,EACY,GtBJT,WsBKIA,EACK,GAEA,GAGT,IAAIuhL,EAAU3e,EAAYohB,EAAe1C,EAAUsJ,EAAiBnB,GAG/E,OAAO7xB,GACHp9I,MAAM4/I,OAAOxC,GAEb,MAAM6xB,EAAcl2N,KAAKu3N,aACzB,GAAIrB,EACA,IAAK,IAAIhpL,EAAM,EAAGA,EAAMgpL,EAAYp1N,OAAQosC,IAAO,CAC/C,MAAMsqL,EAAatB,EAAYhpL,GACzB0jL,EAAY5wN,KAAKstN,aAAala,QAAQokB,EAAWnZ,YACvDmZ,EAAW3wB,OAAO+pB,IAK9B,gBAAgBvhB,EAAY0e,EAAUthL,GAClC,MAAMihL,EAAe1tN,KAAK0tN,aAC1B,IAAI+J,EAAWpoB,EAAW,GAAGgP,WACzBv9M,EAASuuM,EAAWvuM,OACpB22N,EAAW,IACXA,EAAW,EACX32N,KAGJ,MAAM42N,EAASD,EAAW32N,EACpB62N,EAAc33N,KAAK2tN,cAAc,GAAGiK,oBAAsB,EAAI,EAC9D1B,EAAc,GAEpBl2N,KAAKu3N,aAAev3N,KAAKu3N,cAAgB,GACzC,IAAK,IAAIlZ,EAAaoZ,EAAUpZ,EAAaqZ,EAAQrZ,IAAc,CAC/D,MAAMwL,EAAUxL,EAAasZ,EAC7B,IACIvuD,EADAyuD,EAAkB9J,EAGtB,EAAA,CACI8J,IACAzuD,EAAQskD,EAAamK,GAAiBhO,SACjCgO,EAAkB,IAAMzuD,GAEjC,GAAIA,EtBlDH,SsBmDO38H,GAAkB4xK,EAAaoZ,IAAa/J,EAAamK,GAAiBhO,EAAU,IACpFqM,EAAY7yN,KAAKrD,KAAK83N,sBAAsBzZ,EAAYwL,EAASA,EAAU,EAAGgO,IAGlF3B,EAAY7yN,KAAK+lK,GtBvDpB,SsByDO38H,GAAkB4xK,EAAa,EAAIqZ,IAAWhK,EAAamK,GAAiBhO,EAAU,IACtFqM,EAAY7yN,KAAKrD,KAAK83N,sBAAsBzZ,EAAYwL,EAASA,EAAU,EAAGgO,QAE/E,CACH,MAAME,EAAgB/3N,KAAKg4N,qBAAqB3Z,GAChDr+M,KAAKu3N,aAAal0N,KAAK00N,GACvB7B,EAAY7yN,KAAK00N,IAIzB,OAAO7B,EAGX,sBAAsB7X,EAAYwL,EAASoO,EAAWC,GAClD,MAAMxK,EAAe1tN,KAAK0tN,aAC1B,IACItkD,EADAp1J,EAAQkkN,EAGZ,KAAOlkN,EAAQ,IAAMo1J,GACjBp1J,IACAo1J,EAAQskD,EAAa15M,GAAOikN,GAUhC,OAPK7uD,EAIDA,EAAQskD,EAAa15M,GAAO61M,IAH5BzgD,EAAQppK,KAAKg4N,qBAAqB3Z,GAClCr+M,KAAKu3N,aAAal0N,KAAK+lK,IAKpBA,EAGX,qBAAqBi1C,GACjB,MAAM3+M,EAAUM,KAAKowN,aAAa,GAAI,GAChChnD,EAAQ,IAAI,GAAU,EAAG1pK,GAI/B,OAHA0pK,EAAMi1C,WAAaA,EACnBj1C,EAAMq/B,OAAS,GAERr/B,EAGX,oBAAoBq/B,GAChB,OAAOA,EAAOysB,eAAiBhsD,GAGnC,+BACI,OAAO,ICjGA,GA7Bf,cAAoC,GAChC,cACIjiH,QAEAjnD,KAAKm4N,WAAa,GAGtB,OAAOC,GACH,MAAMD,EAAan4N,KAAKm4N,WAExB,IAAK,IAAIvJ,KAAYwJ,EAAiB,CAClC,MAAMC,EAAaD,EAAgBxJ,GACnC,IAAIvwL,EAAQ85L,EAAWvJ,GACvBuJ,EAAWvJ,GAAYvwL,EAAQA,GAAS,CAAE70B,IAAK08J,GAAWtqJ,IAAKuqJ,IAE/D9nI,EAAM70B,IAAMD,KAAKC,IAAI60B,EAAM70B,IAAK6uN,EAAW7uN,KAC3C60B,EAAMziB,IAAMrS,KAAKqS,IAAIyiB,EAAMziB,IAAKy8M,EAAWz8M,MAInD,MAAMgzM,GACF5uN,KAAKm4N,WAAWvJ,QAAY14M,EAGhC,MAAM04M,GACF,OAAO5uN,KAAKm4N,WAAWvJ,KCtB/B,MAAM,WAAiB,GACnB,YAAYhiJ,EAASltE,EAASuqM,GAC1BhjJ,MAAMvnD,GAENM,KAAKs4N,QAAU,IAAI,GAAQ1rJ,EAAS5sE,KAAKN,QAASuqM,GAClDjqM,KAAKq6H,OAAOr6H,KAAKs4N,SAGrB,eACIt4N,KAAKs4N,QAAQ54N,QAAQioM,OAAS3nM,KAAKN,QAAQioM,OAG/C,OAAOtD,GACH,MAAM3kM,EAAUM,KAAKN,SACf,SAAE+rM,EAAQ,UAAEolB,GAAcnxN,EAC1BskF,EAAOhkF,KAAKoxC,SAAS,GACrB+7J,EAAcnpH,EAAKtkF,QACnB46K,EAAMt2F,EAAKs2F,IACXuJ,EAAU7/F,EAAKtkF,QAAQmkL,QAC7B,IAAIsxB,EAAW9Q,EAEf8I,EAAYzxB,MAAQ+vB,EAAW5lC,GAASI,GACxCknC,EAAY5D,OAASkC,EAAWplC,GAAMR,GxB6D3B,cwB3DPnmK,EAAQokC,SACJ2nK,GACA0B,EAAY5D,OAASljC,IAEhBwqD,GAAav2C,EAAIzQ,SAAWw6B,EAAUx6B,WACvCsjC,EAAY5D,OAAS3jC,KAGzBunC,EAAYzxB,MAAQm1C,EAAYzqD,GAAQH,GAErCvmK,EAAQokC,WAAa+hI,IAC5BsnC,EAAY5D,OAAS1jC,GACrBsnC,EAAYzxB,MAAQ7V,IxBgDZ,ewB/CDnmK,EAAQokC,SACX2nK,EACA0B,EAAY5D,OAASsnB,EAAYjrD,GAASS,GAE1C8mC,EAAYzxB,MAAQm1C,EAAY5qD,GAAOG,GxB4CnC,ewB1CD1mK,EAAQokC,WACX2nK,EAEI0J,EADA0b,EACW,IAAI,GACXxsB,EAAU5yB,GAAI4yB,EAAU3yB,GAAK4I,EAAIzQ,SACjCw6B,EAAU1yB,GAAI0yB,EAAU3yB,IAGjB,IAAI,GACX2yB,EAAU5yB,GAAI4yB,EAAUzyB,GACxByyB,EAAU1yB,GAAI0yB,EAAUzyB,GAAK0I,EAAIzQ,WAIzCsjC,EAAYzxB,MAAQ7V,GAEhBsvC,EADA0b,EACW,IAAI,GACXxsB,EAAU1yB,GAAI0yB,EAAU3yB,GACxB2yB,EAAU1yB,GAAK2I,EAAIlqI,QAASi0J,EAAUzyB,IAG/B,IAAI,GACXyyB,EAAU5yB,GAAK6I,EAAIlqI,QAASi0J,EAAU3yB,GACtC2yB,EAAU5yB,GAAI4yB,EAAUzyB,MAMnClyK,EAAQo4C,WACL2zJ,EACA5nB,EAAQlyI,KAAOkyI,EAAQjyI,OAClBujK,EAAS/kK,QAAU4zC,EAAK0lH,WAAWt5J,SAAW,EAEnDyzI,EAAQ50D,IAAM40D,EAAQ5Y,QACjBkqC,EAAStrC,SAAW7lF,EAAK0lH,WAAW7/B,UAAY,GAI7D7lF,EAAK6iH,OAAOsO,GAGhB,eAAese,GACX,MACM3sD,EADW9mK,KAAKN,QAAQ+rM,SACLhlC,GAAID,GACvBjjK,EAAQujK,EAAQ,IAChBz/J,EAAMy/J,EAAQ,IAEdyxD,EAAYv4N,KAAKqmB,OAAOi0J,IAE9B,GAAIi+C,EAAUh1N,GAASkwN,EAAQlwN,IAAUkwN,EAAQpsN,GAAOkxN,EAAUlxN,GAAM,CACpE,MAAMg9L,EAJGrkM,KAAKoxC,SAAS,GAIAo4J,WAAWnzK,QAClCguK,EAAU9gM,GAASgG,KAAKqS,IAAI28M,EAAUh1N,GAAQkwN,EAAQlwN,IACtD8gM,EAAUh9L,GAAOkC,KAAKC,IAAI+uN,EAAUlxN,GAAMosN,EAAQpsN,IAElDrH,KAAK6mM,OAAOxC,KAKxBT,GAAkB,GAAU,CACxB9/J,SxBnBgB,awBoBhBmlK,OAAQzH,GAAW,GACnB3d,QAAS2d,GAAW,GACpB91B,MAAO/F,GACPikC,WAAY,GACZP,OAAQ,CACJj5J,MAAO,EACPs7H,MAAO,IAEXmlD,WAAW,EACXplB,UAAU,EACV53G,UAAW,CACPvwF,KxBrHO,SwBsHP+2B,MxBvH2B,KwByH/B+0J,OAAQ,IAGG,IAAA,GAAA,GChIA,SAASopC,GAAmB94N,GACvC,MAAMqpM,EAAUrpM,EAAQqpM,QAExB,OAAOA,GAAWA,EAAQ/N,UAAiC,SAArB+N,EAAQ/N,SCelD,MAAM,WAAY,GACd,YAAY3vL,EAAO3L,GACfunD,QAEAjnD,KAAKN,QAAUA,EACfM,KAAK0rK,MAAQhsK,EAAQgsK,OAASnF,GAC9BvmK,KAAK6wN,UAAY,GAAe7wN,KAAKN,QAAQmxN,WAAW,GACxD7wN,KAAKqL,MAAQA,EAGjB,SACQrL,KAAK4yN,YAIT5yN,KAAK4yN,WAAY,EAEjB5yN,KAAKogN,cACLpgN,KAAKyyN,aAEDzyN,KAAK6vN,UACL7vN,KAAKq6H,OAAOr6H,KAAK6vN,WAIzB,cACI,MAAMnwN,EAAUM,KAAKN,QACfswM,EAAStwM,EAAQswM,OAEvB,GAAIA,EAAO5jC,QAAS,CAChB,MAAM69B,EAAYjqM,KAAKiqM,YACvB,IACI6oB,EADAtf,EAAgBhR,GAAYwN,GAI5B8iB,EADAtf,EACYA,EAAcvJ,GAEdjqM,KAAKusC,YAAYyjK,EAAO7lM,QAGxCnK,KAAK8+H,MAAQ,IAAI,GAASg0F,EACtB1xB,GAAW,CACPqK,SAAU/rM,EAAQ+rM,UAEtBuE,GACD/F,GACHjqM,KAAKq6H,OAAOr6H,KAAK8+H,QAIzB,YAAY30H,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,GAG7C,OAAOk6L,GACHrkM,KAAKgmL,SAEL,MAAMlnD,EAAQ9+H,KAAK8+H,MAanB,GAXA9+H,KAAKs6K,IAAM+pB,EAEPvlE,IACAA,EAAMp/H,QAAQmxN,UAAY7wN,KAAK6wN,UAC/B/xF,EAAM+nE,OAAOxC,IAGbrkM,KAAK0xM,MACL1xM,KAAK0xM,KAAK7K,OAAOxC,GAGjBrkM,KAAKqvN,UACL,IAAK,IAAI3uN,EAAI,EAAGA,EAAIV,KAAKqvN,UAAUvuN,OAAQJ,IACvCV,KAAKqvN,UAAU3uN,GAAGmmM,OAAOxC,GAKrC,eACI,MAAM,IAAE/pB,EAAG,QAAE56K,GAAYM,KACnBooM,EAAe1oM,EAAQwsL,OAE7B,IAAqB,IAAjBlsL,KAAKosK,QAGL,GAFAnlH,MAAMigJ,eAEFkB,EAAc,CACd,MAAMlc,EAASlsL,KAAKy4N,WAAarwB,EAAa,CAC1CO,SAAU3oM,KAAK2oM,SACfD,SAAU1oM,KAAK0oM,SACfr9L,MAAOrL,KAAKqL,MACZg2K,OAAQrhL,KAAKwoM,YACbC,OAAQzoM,KAAKyoM,OACbG,WAAY5oM,KAAK4oM,WACjBkoB,WAAY9wN,KAAK8wN,WACjBjoB,aAAc7oM,KAAK6oM,aACnB3sE,MAAOl8H,KAAKk8H,MACZpN,KAAMwrD,EAAIyvB,SACV7C,aAAc,KACV,MAAM3vK,EAAQ,IAAI,EAAKwlF,MAEvB,OADA/8G,KAAK04N,WAAWnhM,GACTA,GAEX73B,QAASA,IAGTwsL,GACAlsL,KAAKksL,OAAO7xD,OAAO6xD,QAEhB5R,EAAIlqI,QAAU,GAAKkqI,EAAIzQ,SAAW,GACzC7pK,KAAK04N,WAAW14N,KAAKksL,QAKjC,WAAWA,GACP,MAAMxsL,EAAUM,KAAKN,QACf2pM,EAAS3pM,EAAQ2pM,OACjBsvB,EAAgB,GAAQtvB,EAAOv7B,SAAWu7B,EAAOv7B,QAAUpuK,EAAQouK,QACnEh/C,EAAO9uH,KAAKs6K,IAAIyvB,SAEtBj7E,EAAKl3G,KAAKw4B,MAAQ7mC,KAAKw1B,MAAM+vF,EAAKl3G,KAAKw4B,OAEvC,MAAMlyC,EAAO8B,KAAKy4N,WAAa,EAAKptC,KAAKye,SAASh7E,EAAM,CACpDhxH,KAAM,CACF4tK,MAAO1rK,KAAK0rK,MACZoC,QAASpuK,EAAQouK,SAErBnB,OAAQ,CACJjB,MAAO1rK,KAAK44N,iBACZxoL,MAAOi5J,EAAOj5J,MACd09H,QAAS6qD,EACTvvC,SAAUigB,EAAOjgB,YAInBh5I,EAAQpwC,KAAKs6K,IAAIlqI,QACjBy5H,EAAS7pK,KAAKs6K,IAAIzQ,SAexB,IAbanqK,EAAQ+rM,SAAWr7J,EAAQy5H,GA3IpB,IA8IhB62B,GAAiBxiM,IAGbkyC,EAAQ,GAAKy5H,EAAS,KACtB3rK,EAAKwB,QAAQitK,OAAOgM,SAAW,UAIvCuT,EAAO7xD,OAAOn8H,GAEVs6N,GAAmB94N,GAAU,CAC7B,MAAMqpM,EAAU/oM,KAAK64N,sBAAsB36N,EAAM,CAAE46N,UAAW94N,KAAK0rK,OAAS01B,GAAW,CACnF/5L,IAAM3H,EAAQ+rM,cAAsBv1L,EAAX,CAAE,EAAG,IAC/BxW,EAAQqpM,UAEX7c,EAAO7xD,OAAO0uE,IAItB,gBAAgBt8J,GAGZ,OAAOi0J,GAFW,EAAKrV,KAAKye,SAAS9pM,KAAKs6K,IAAIyvB,SAAUt9J,IAK5D,kBACI,OAAOzsC,KAAKy4N,WAGhB,sBACI,MAAO,CACH/4N,QAASM,KAAKN,QACdovH,KAAM9uH,KAAKs6K,IAAIyvB,SACf7d,OAAQlsL,KAAKy4N,YAIrB,iBACI,MAAM/sD,EAAQ1rK,KAAK0rK,MACb29B,EAASrpM,KAAKN,QAAQ2pM,OACtB0pB,EAAa1pB,EAAO0vB,a1B9LR,G0B+LlB,IAAIC,EAAc3vB,EAAO39B,MAMzB,OAJK,GAAQstD,KACTA,EAAc,IAAI,GAAMttD,GAAOqnD,WAAWA,GAAY15B,SAGnD2/B,EAGX,gBACI,MAAM,QAAEt5N,EAAO,IAAE46K,EAAG,UAAEu2C,GAAc7wN,KAC9ByzN,EAAUzzN,KAAK+vN,MAAM/c,KAAKygB,WAAan5C,EAC7C,IAEItvI,EAAGmF,EAFHujL,EAAkBztD,GAClB0tD,EAAgBttD,GAGpB,GAAI3mK,EAAQ+rM,SACRzgK,EAAIzhC,KAAKC,IAAI8wK,EAAI3I,GAAI8hD,EAAQ9hD,I1B/MlB,E0BgNPk/C,EACA1gL,EAAI5mC,KAAKqS,IAAI0+J,EAAI5I,GAAI+hD,EAAQ/hD,KAE7BvhI,EAAI5mC,KAAKC,IAAI8wK,EAAI1I,GAAI6hD,EAAQ7hD,IAC7B+hD,EAAgB/tD,QAEjB,CACH,MAAM6L,EAAKloK,KAAKqS,IAAI0+J,EAAI7I,GAAIgiD,EAAQhiD,IAC9BE,EAAKpoK,KAAKC,IAAI8wK,EAAI3I,GAAI8hD,EAAQ9hD,IAEhCjyK,EAAQ4uN,WACRqF,EAAgB/tD,GACZirD,GACA6C,EAAkBttD,GAClBp7H,EAAI2mI,GAEJ3mI,EAAIymI,EAERthI,EAAI5mC,KAAKqS,IAAI0+J,EAAI5I,GAAI+hD,EAAQ/hD,I1BlOtB,I0BoOHm/C,EACA7lL,EAAI2mI,E1BrOD,G0BuOH3mI,EAAIymI,E1BvOD,E0BwOHiiD,EAAkBttD,IAEtBj2H,EAAI5mC,KAAKqS,IAAI0+J,EAAI5I,GAAI+hD,EAAQ/hD,KAIrC,MAAO,CACHtI,MAAO,IAAI,GAAMp+H,EAAGmF,GACpBurI,MAAO,CACHk4C,WAAYF,EACZjoB,SAAUkoB,IAKtB,YAAYr5C,GACR,OAAOt6K,KAAKs6K,IAAI0lC,SAAS1lC,GAG7B,YACI,MAAO,CACHouB,SAAU1oM,KAAK0oM,SACfC,SAAU3oM,KAAK2oM,SACft9L,MAAOrL,KAAKqL,MACZu9L,WAAY5oM,KAAK4oM,WACjBkoB,WAAY9wN,KAAK8wN,WACjBjoB,aAAc7oM,KAAK6oM,aACnB3sE,MAAOl8H,KAAKk8H,MACZusE,OAAQzoM,KAAKyoM,SAKzBrH,GAAW,GAAIngM,UAAW,IAC1BmgM,GAAW,GAAIngM,UAAW,IAE1B,GAAIA,UAAUL,SAAW,CACrByoM,OAAQ,CACJj5J,MAAO,GAEXq7J,UAAU,EACV1C,QAAS,CACL/N,SAAU,SAEdgV,OAAQ,CACJ5jC,SAAS,EACTjiK,OAAQ,OAEZ2jK,QAAS,EACT0jC,MAAO,CACH1yE,MAAO,KAIA,IAAA,GAAA,GCvSR,SAAS,GAAQs0C,EAAU7iJ,GAC9B6iJ,EAAS9zK,QAAQixB,GAGd,SAAS,GAAe6iJ,EAAU7iJ,GACrC,MAAMzvB,EAASsyK,EAAStyK,OAExB,IAAK,IAAIosC,EAAMpsC,EAAS,EAAGosC,GAAO,EAAGA,IACjC3c,EAAS6iJ,EAASlmI,GAAMA,EAAMpsC,EAAS,GCF/C,MAAM,WAAsB,GACxB,YAAYpB,GACRunD,MAAMvnD,GAENM,KAAKV,QAAUI,EAAQorL,IAAM,GAAiB,GAGlD,OAAOxQ,GACH,MAAM,SAAEmxB,EAAQ,IAAEwtB,EAAG,QAAEh9C,GAAYj8K,KAAKN,QAClC0xC,EAAWpxC,KAAKoxC,SAChBxb,EAAQwb,EAAStwC,OACjB66K,EAAO8vB,EAAWhlC,GAAID,GACtB0yD,EAAQtjM,EAAQqjM,EAAOh9C,GAAWrmJ,EAAQ,GAC1CujM,GAAY1tB,EAAWnxB,EAAIzQ,SAAWyQ,EAAIlqI,SAAW8oL,EAC3D,IAAIp1L,EAAWw2I,EAAIqB,EAAO,GAAKw9C,GAAYF,EAAM,GAEjDj5N,KAAKV,QAAQ8xC,EAAU,CAAC2B,EAAO7F,KAC3B,MAAMgmL,GAAYngL,EAAMunI,KAAOA,GAAKjkJ,QAEpC68L,EAASv3C,EAAO,GAAK73I,EACrBovL,EAASv3C,EAAO,GAAK73I,EAAWq1L,EAEhCpmL,EAAM8zJ,OAAOqsB,GACThmL,EAAMtX,EAAQ,IACdkO,GAAaq1L,EAAWl9C,GAG5Bn4I,GAAYq1L,KAKxBv1B,GAAkB,GAAe,CAC7B6H,UAAU,EACVwtB,IAAK,EACLh9C,QAAS,IAGE,IAAA,GAAA,GCvCf,MAAM,WAAkB,GACpB,OAAOooB,GACH,MAAM+0B,EAAep5N,KAAKN,QAAQ+rM,SAAWjlC,GAAIC,GAC3Cr1H,EAAWpxC,KAAKoxC,SAChB61J,EAAgB71J,EAAStwC,OAC/B,IAAIw5K,EAAMt6K,KAAKs6K,IAAM,IAAI,GAEzB,IAAK,IAAI55K,EAAI,EAAGA,EAAIumM,EAAevmM,IAAK,CACpC,MAAMkmM,EAAex1J,EAAS1wC,GAE9B,IAA6B,IAAzBkmM,EAAax6B,QAAmB,CAChC,MAAM8mD,EAAWtsB,EAAatsB,IAAIjkJ,QAClC68L,EAASnlB,OAAO1J,EAAW+0B,GAEjB,IAAN14N,IACA45K,EAAMt6K,KAAKs6K,IAAM44C,EAAS78L,SAG9BuwK,EAAaC,OAAOqsB,GACpB54C,EAAIt3I,KAAKkwL,MAMzBtvB,GAAkB,GAAW,CACzB6H,UAAU,IAGC,IAAA,GAAA,GCpBf,MAAM,WAAiB,GAEnB,SACIxkJ,MAAM++H,SACNhmL,KAAK+1N,mBAGT,YACI,OAAO,GAGX,cACI,OAAO,GAGX,YACI,OAAO,GAGX,YAAYnH,EAAUC,GAGlB,OAFe5nK,MAAMkoK,YAAYP,EAAUC,GAK/C,YAAYzvM,EAAM0oJ,GACd,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,GAC7C,QAAEpoK,EAAO,SAAE0xC,GAAapxC,KACxBsuN,EAAY5uN,EAAQ4uN,UACpBjjN,EAAQrL,KAAKyrN,WAAWrsM,GAC9B,IAAIgxM,EAAepwN,KAAKowN,aAAa3nB,EAAQslB,GAE7C,MAAMld,EAAeuf,EAAapgB,OAC9Bse,G9B4CQ,e8B3CJzd,EAAa/sK,WACb+sK,EAAa/sK,S9BwCV,a8BpCXssL,EAAa9B,UAAYA,EAEzB,IAAI5iD,EAAQtsJ,EAAK0oJ,OAAO4D,OAAS+8B,EAAO/8B,MACpCrgK,EAAQ,GAAK+kN,EAAaiJ,gBAC1B3tD,EAAQ0kD,EAAaiJ,eAGzBjJ,EAAepwN,KAAKg2N,iBAChB5F,EAAc/kN,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GAGnD,GAAWtlB,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB,MACMtC,EAAQ,IADIppK,KAAKguN,YACT,CAAc3iN,EAAO+kN,GACnChnD,EAAMsC,MAAQA,EAEd,IAAI4tD,EAAUloL,EAASitK,GAmBvB,OAlBKib,IAEDA,EAAU,IADUt5N,KAAKu5N,cACf,CAAgB,CACtB9tB,SAAU/rM,EAAQuuN,WAClBgL,IAAKv5N,EAAQu5N,IACbh9C,QAASv8K,EAAQu8K,QACjB6O,KAAMprL,EAAQuuN,aAAejuN,KAAKgnM,cAAgB,IAAIlc,MAE1D9qL,KAAKq6H,OAAOi/F,IAGZhL,EACkBtuN,KAAKw5N,aAAa/wB,EAAQ6wB,GAClCj/F,OAAO+uC,GAEjBkwD,EAAQj/F,OAAO+uC,GAGZA,EAGX,aAAaq/B,EAAQ6wB,GACjB,MAAM93M,EAAQinL,EAAOjnL,MACfi4M,EAAaj4M,GAAQA,EAAM+V,OAAiB/V,EAC5Ck4M,EAAQJ,EAAQloL,SACtB,IAAIuoL,EAEJ,GjSvEc,iBiSuEHF,EAAAA,CACP,IAAK,IAAI/4N,EAAI,EAAGA,EAAIg5N,EAAM54N,OAAQJ,IAC9B,GAAIg5N,EAAMh5N,GAAGk5N,cAAgBH,EAAY,CACrCE,EAAYD,EAAMh5N,GAClB,YAIRi5N,EAAYD,EAAM,GAYtB,OATKC,IAEDA,EAAY,IADM35N,KAAK65N,YACX,CAAc,CACtBpuB,UAAWzrM,KAAKN,QAAQuuN,aAE5B0L,EAAUC,YAAcH,EACxBH,EAAQj/F,OAAOs/F,IAGZA,EAGX,aAAarM,EAAcjP,EAAY9E,GACnC,MAAM75M,EAAUM,KAAKN,QACfgxN,EAAepD,EAAala,QAAQiL,GACpCyD,EAAavI,EAAUuI,aAE7B,GAAIpiN,EAAQ4uN,UAAW,CACnB,MAAMwL,EAAWvgB,EAAUnG,QAAQ0O,EAAYA,GAAY,GACrD/jC,EAAYr+K,EAAQuuN,WAAaznD,GAAIC,GAC3CiqD,EAAa3yC,EAAY,GAAK2yC,EAAa3yC,EAAY,GAAK+7C,EAAS/7C,EAAY,GAGrF,OAAO2yC,EAGX,iBAAiBH,GACb,MAAMn/K,EAAWpxC,KAAKoxC,SAChB2oL,EAAiB3oL,EAAStwC,OAEhC,IAAK,IAAIJ,EAAI,EAAGA,EAAIq5N,EAAgBr5N,IAChC0wC,EAAS1wC,GAAGmmM,OAAO0pB,EAAc7vN,IAIzC,kBACIV,KAAKg6N,uBACL/yK,MAAMmgJ,kBAEFsuB,GAAa11N,KAAKN,QAAQ+oM,SAC1BzoM,KAAK41N,wBAIb,wBACI,MAAM/lD,EAAS7vK,KAAK6vK,OAEpB,IAAK,IAAI3iI,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQyG,EAAO3iI,GACf+sL,EAAc7wD,EAAM8iB,OACtB+tC,GAAe,GAAQA,EAAYv6N,QAAQ0vL,UAC3ChmB,EAAM1pK,QAAQm0F,UAAY7zF,KAAKN,QAAQm0F,UACvCu1E,EAAMg+B,oBAKlB,uBACI,MAAM1nM,EAAUM,KAAKN,QACfm0F,EAAYn0F,EAAQm0F,WAAa,GACvC,IAAI7kD,EAEJ,GAAItvC,EAAQ4uN,UAAW,CACnB,MAAM/U,EAAYv5M,KAAK+sN,gBAAgBrtN,EAAQ+oM,OAAO,IACtDz5J,EAASuqK,EAAUnG,QAAQmG,EAAUuI,mBAErC9yK,EAAShvC,KAAKstN,aAAala,QAAQ,GAGvCv/G,EAAU7kD,OAAS,IAAI,EAAKw3J,MAAMx3J,EAAOyiI,GAAIziI,EAAO0iI,IACpD79E,EAAU43G,UAAY/rM,EAAQuuN,YAItCrqB,GAAkB,GAAU,CACxB/vG,UAAW,CACPvwF,KAAMwoN,MAIC,IAAA,GAAA,GCnLf,MAAM,WAAoB,GACtB,YAAYzgN,EAAO3L,GACfunD,MAAMvnD,GACNM,KAAKqL,MAAQA,EAGjB,OAAOivK,GACH,MAAM,QAAE56K,EAAO,MAAE2L,EAAO0kN,MAAOjuB,GAAU9hM,KACnCu5M,EAAYzX,EAAMirB,gBAAgBrtN,GAClCw6N,EAAS3gB,EAAUnG,QAAQ/nM,EAAM7M,KAAM6M,EAAM5M,OAC7C07N,EAAS5gB,EAAUnG,QAAQ/nM,EAAM6gB,IAAK7gB,EAAM8gB,MAElD+tM,EAAOzoD,GAAK0oD,EAAO1oD,GAAK6I,EAAI7I,GAC5ByoD,EAAOvoD,GAAKwoD,EAAOxoD,GAAK2I,EAAI3I,GAE5B3xK,KAAKo6N,SAAWF,EAEhB,MAAM7tM,EAAM8tM,EAAOzjL,SAAS1L,EACtB6kI,EAAS,GAEfA,EAAOxsK,KAAK,CAAE,CAAEgpB,EAAK8tM,EAAOzoD,IAAM,CAAErlJ,EAAK6tM,EAAOxoD,MAChD7B,EAAOxsK,KAAK,CAAE,CAAEgpB,EAAK6tM,EAAOtoD,IAAM,CAAEvlJ,EAAK8tM,EAAOvoD,MAEhD5xK,KAAKq6N,MAAQxqD,EAEb7vK,KAAKs6K,IAAM6/C,EAAO9jM,QAAQ2M,KAAKk3L,GAE1Bl6N,KAAK4yN,YACN5yN,KAAK4yN,WAAY,EACjB5yN,KAAKyyN,cAGTzyN,KAAKs6N,aAGT,aACQt6N,KAAK0xM,MACL1xM,KAAK0xM,KAAK7K,OAAO7mM,KAAKs6K,KAI9B,eACIrzH,MAAMigJ,eACNlnM,KAAKu6N,YAAcv6N,KAAKw6N,WAAWx6N,KAAKN,SACxCM,KAAKksL,OAAO7xD,OACRr6H,KAAKu6N,aAGTv6N,KAAKy6N,gBAGT,WAAW/6N,GACP,MAAM63B,EAAQ,IAAI,EAAKwlF,MAKvB,OAHA/8G,KAAK06N,WAAWnjM,EAAO73B,GACvBM,KAAK26N,YAAYpjM,EAAO73B,GAEjB63B,EAGX,WAAW6iD,EAAW16E,GAClB,MAAM6vC,EAAO,EAAK87I,KAAKye,SAAS9pM,KAAKo6N,SAASrwB,SAAU,CACpDjsM,KAAM,CACF4tK,MAAO1rK,KAAK0rK,MACZoC,QAASpuK,EAAQouK,SAErBnB,OAAQ,OAGRjtK,EAAQ2pM,OAAOj5J,MAAQ,GACvBb,EAAK7vC,QAAQb,IAAI,SAAU,CACvB6sK,MAAO1rK,KAAK44N,iBACZxoL,MAAO1wC,EAAQ2pM,OAAOj5J,MACtBg5I,SAAU1pL,EAAQ2pM,OAAOjgB,SACzBtb,QAAS,GAAepuK,EAAQ2pM,OAAOv7B,QAASpuK,EAAQouK,WAIhE4yB,GAAiBnxJ,GACjB6qC,EAAUigD,OAAO9qF,GAEbipL,GAAmB94N,IACnB06E,EAAUigD,OAAOr6H,KAAK64N,sBAAsBtpL,EAAM,CAAEupL,UAAW94N,KAAK0rK,OAAS01B,GAAW,CACpF/5L,IAAM3H,EAAQ+rM,cAAsBv1L,EAAX,CAAE,EAAG,IAC/BxW,EAAQqpM,WAInB,YAAY3uH,EAAW16E,GACnBM,KAAK46N,UAAUxgJ,EAAW16E,EAASM,KAAKq6N,MAAO36N,EAAQmuC,MAG3D,UAAUusC,EAAW16E,EAAS26N,EAAOxmB,GACjC,IAAKwmB,EACD,OAGJ,MAAMQ,EAAY,CACdluD,OAAQ,CACJjB,MAAOmoC,EAAYnoC,OAAS1rK,KAAK0rK,MACjCoC,QAAS,GAAe+lC,EAAY/lC,QAASpuK,EAAQouK,SACrD19H,MAAOyjK,EAAYzjK,MACnBg5I,SAAUyqB,EAAYzqB,SACtBG,QAAS,SAIjB,IAAK,IAAI7oL,EAAI,EAAGA,EAAI25N,EAAMv5N,OAAQJ,IAAK,CACnC,MAAMmtC,EAAO,EAAKw9I,KAAK1gB,WAAW0vD,EAAM35N,GAAIm6N,GAC5Cn6B,GAAiB7yJ,GACjBusC,EAAUigD,OAAOxsF,IAIzB,iBACI,MAAMw7J,EAASrpM,KAAKN,QAAQ2pM,OAC5B,IAAI2vB,EAAc3vB,EAAO39B,MAMzB,OAJK,GAAQstD,KACTA,EAAc,IAAI,GAAMh5N,KAAK0rK,OAAOqnD,WAAW1pB,EAAO0vB,aAAa1/B,SAGhE2/B,EAGX,gBACI,MAAMjwB,EAAU,EAAK1d,KAAKye,SAAS9pM,KAAKs6K,IAAIyvB,SAAU,CAClDjsM,KAAM,CACF4tK,MAAOnF,GACPuH,QAAS,GAEbnB,OAAQ,OAGZ3sK,KAAKksL,OAAO7xD,OAAO0uE,GAGvB,kBACI,MAAMd,EAAYjoM,KAAKN,QAAQuoM,UACzB6yB,EAAc96N,KAAK0rK,MAEzB1rK,KAAK0rK,MAAQu8B,EAAUv8B,OAAS1rK,KAAK0rK,MACrC,MAAMq9B,EAAU/oM,KAAKw6N,WACjBp5B,GAAW,GAAIphM,KAAKN,QAAS,CACzBmuC,KAAM,CACF69H,MAAO1rK,KAAK44N,mBAEjB3wB,IAIP,OAFAjoM,KAAK0rK,MAAQovD,EAEN/xB,EAGX,kBACI,OAAO/oM,KAAKu6N,YAGhB,sBACI,MAAO,CACH76N,QAASM,KAAKN,QACdovH,KAAM9uH,KAAKs6K,IAAIyvB,SACf7d,OAAQlsL,KAAKu6N,aAIrB,gBACI,MAAMjgD,EAAMt6K,KAAKs6K,IACXm5C,EAAUzzN,KAAK+vN,MAAM/c,KAAKygB,WAAan5C,EAE7C,MAAO,CACHlR,MAAO,IAAI,GAAMkR,EAAI3I,G/B9KV,E+B8K+BpoK,KAAKqS,IAAI0+J,EAAI5I,GAAI+hD,EAAQ/hD,I/B9KxD,G+B+KXgK,MAAO,CACHk4C,WAAY3tD,GACZwlC,SAAUplC,KAKtB,YAAYl8J,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,GAG7C,YAAYmwK,GACR,OAAOt6K,KAAKs6K,IAAI0lC,SAAS1lC,IAIjCspB,GAAkB,GAAa,CAC3B6H,UAAU,EACVpC,OAAQ,CACJ0vB,YAAa,IAEjBlrL,KAAM,CACFuC,MAAO,GAEX24J,QAAS,CACL/N,SAAU,SAEd+/B,QAAS,CACL5wN,OAAQ,0MAQZ89L,UAAW,CACPn6B,QAAS,EACTu7B,OAAQ,CACJj5J,MAAO,EACP09H,QAAS,GAEbjgI,KAAM,CACFuC,MAAO,EACP09H,QAAS,IAGjB0jC,MAAO,CACHplC,SAAS,EACTttC,MAAO,MAIfsiE,GAAW,GAAYngM,UAAW,IAClCmgM,GAAW,GAAYngM,UAAW,IAEnB,IAAA,GAAA,GC9OA,SAAS+5N,GAAWlmN,GAC/B,OAAOg0M,GAAah0M,KAAYA,EAAOhU,OCQ3C,MAAM,WAAyB,GAE3B,iBAAiByvN,GACb,MAAMn/K,EAAWpxC,KAAKoxC,SAChB2oL,EAAiB3oL,EAAStwC,OAEhC,IAAK,IAAIJ,EAAI,EAAGA,EAAIq5N,EAAgBr5N,IAChC0wC,EAAS1wC,GAAGmmM,OAAO0pB,EAAc7vN,IAIzC,SAAS0e,EAAM0oJ,GACX,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,GAC7C,SAAE12H,EAAQ,QAAE1xC,GAAYM,KACxBqL,EAAQ+T,EAAKsqM,YAEbpyE,EAAW0jF,GADEh7N,KAAKi7N,WAAW5vN,IAE7Bq9L,EAAWD,EAAOrpL,KAAKi/L,GAC7B,IACIj1C,EADAqkD,EAAiBztN,KAAKytN,eAAepP,GAGpCoP,IACDztN,KAAKytN,eAAepP,GAAcoP,EAAiB,IAGnDn2E,IACA8xB,EAAQppK,KAAK8vN,YAAY1wM,EAAM0oJ,IAGnC,IAAIwxD,EAAUloL,EAASitK,GAClBib,IACDA,EAAU,IAAI,GAAc,CACxB7tB,SAAU/rM,EAAQuuN,WAClBgL,IAAKv5N,EAAQu5N,IACbh9C,QAASv8K,EAAQu8K,QACjB6O,KAAMprL,EAAQuuN,aAAejuN,KAAKgnM,cAAgB,IAAIlc,MAE1D9qL,KAAKq6H,OAAOi/F,IAGZlwD,IACAppK,KAAK4vN,YAAYvkN,EAAOy8J,GAExBwxD,EAAQj/F,OAAO+uC,GAEfA,EAAMi1C,WAAaA,EACnBj1C,EAAMu/B,SAAWA,EACjBv/B,EAAMq/B,OAASA,EACfr/B,EAAM2kD,SAAWA,EACjB3kD,EAAM2mD,MAAQ/vN,KACdopK,EAAMs/B,SAAWA,EACjBt/B,EAAM4mD,SAAW5wM,EAAK0oJ,OAAOkoD,UAGjChwN,KAAK6vK,OAAOxsK,KAAK+lK,GACjBqkD,EAAepqN,KAAK+lK,GAGxB,YACI,OAAO,GAGX,YAAYhqJ,EAAM0oJ,GACd,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,EAC7CkmD,EAAYhuN,KAAKguN,YACjB3iN,EAAQ+T,EAAKsqM,YACnB,IAAI0G,EAAehvB,GAAW,GAAIqH,GAC9B/8B,EAAQtsJ,EAAK0oJ,OAAO4D,OAAS+8B,EAAO/8B,MAExC0kD,EAAepwN,KAAKg2N,iBAChB5F,EAAc/kN,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GjCjD3C,gBiCoDRtlB,EAAOnlM,MACH+H,EAAM7M,KAAO6M,EAAM5M,QACnBitK,EAAQtsJ,EAAK0oJ,OAAOozD,WAAazyB,EAAOyyB,WAAazyB,EAAO/8B,OAIhE,GAAW+8B,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB0kD,EAAa3kB,UAAYzrM,KAAKN,QAAQuuN,WAEtC,MAAM7kD,EAAQ,IAAI4kD,EAAU3iN,EAAO+kN,GAGnC,OAFAhnD,EAAMsC,MAAQA,EAEPtC,EAGX,WAAW/9J,GACP,MAAO,CAAEA,EAAM6gB,IAAK7gB,EAAM7M,KAAM6M,EAAM5M,MAAO4M,EAAM8gB,MAGvD,YAAY9gB,EAAOy8J,GACf,MAAM8mD,EAAW9mD,EAAO2gC,OAAO9sB,KACzB50K,EAAQ/G,KAAKi7N,WAAW5vN,GAC9B,IAAIglN,EAAYrwN,KAAKwtN,gBAAgBoB,GAErCyB,EAAYrwN,KAAKwtN,gBAAgBoB,GAC7ByB,GAAa,CAAE7mN,IAAK08J,GAAWtqJ,IAAKuqJ,IAExCkqD,EAAYrwN,KAAKwtN,gBAAgBoB,GAAY,CACzCplN,IAAKD,KAAKC,IAAI8J,MAAM/J,KAAMxC,EAAM4C,OAAO,CAAE0mN,EAAU7mN,OACnDoS,IAAKrS,KAAKqS,IAAItI,MAAM/J,KAAMxC,EAAM4C,OAAO,CAAE0mN,EAAUz0M,QAI3D,iBAAiBwtJ,EAAOj/J,GACpB,MAAMkB,EAAQ+9J,EAAM/9J,MAEpB,OAAOrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EACjCkB,EAAM7M,KAAM6M,EAAM8gB,KAClB9gB,EAAM6gB,IAAK7gB,EAAM5M,MAAO2qK,EAAMu/B,UAItC,kBACI,OAAO3oM,KAAK6vK,QAIpBuxB,GAAW,GAAiBngM,UAAW,IAExB,IAAA,GAAA,GC7Hf,MAAM,WAAgB,GAClB,YAAYoK,EAAO3L,GACfunD,MAAM57C,EAAO3L,GAEbM,KAAKyyN,aAGT,OAAOn4C,GACH,MAAM,QAAE56K,EAAO,MAAE2L,EAAO0kN,MAAOjuB,GAAU9hM,KACnCu5M,EAAYzX,EAAMirB,gBAAgBrtN,GACxC,IAAIy7N,EAAaC,EAEjBp7N,KAAKo7N,QAAUA,EAAU7hB,EAAUnG,QAAQ/nM,EAAMgwN,GAAIhwN,EAAMiwN,IAC3Dt7N,KAAKo6N,SAAWgB,EAChBp7N,KAAKu7N,cAAcjhD,GAEnBt6K,KAAKm7N,YAAcA,EAAc5hB,EAAUnG,QAAQ/nM,EAAM8V,MAAO9V,EAAM+V,OACtEphB,KAAKw7N,kBAAkBlhD,GAEvB,MAAMmhD,EAAaliB,EAAUnG,QAAQ/nM,EAAMqwN,QAE3C,GAAIrwN,EAAMq6B,KAAM,CACZ,MAAMi2L,EAAWpiB,EAAUnG,QAAQ/nM,EAAMq6B,MACzC1lC,KAAK47N,WAAa57N,KAAK67N,eAAevhD,EAAKqhD,GAG/C37N,KAAK87N,cAAgB97N,KAAK+7N,kBAAkBX,EAASD,GACrDn7N,KAAKg8N,aAAeh8N,KAAKi8N,iBAAiB3hD,EAAKmhD,GAE/Cz7N,KAAKs6K,IAAM6gD,EAAY9kM,QAAQ2M,KAAKo4L,GACpCp7N,KAAKs6N,aAGT,cAAchgD,GACVt6K,KAAKo7N,QAAQ3pD,GAAK6I,EAAI7I,GACtBzxK,KAAKo7N,QAAQzpD,GAAK2I,EAAI3I,GAG1B,kBAAkB2I,GACdt6K,KAAKm7N,YAAY1pD,GAAK6I,EAAI7I,GAC1BzxK,KAAKm7N,YAAYxpD,GAAK2I,EAAI3I,GAG9B,eAAe2I,EAAKqhD,GAChB,MAAO,CACH,CAAE,CAAErhD,EAAI7I,GAAIkqD,EAASjqD,IAAM,CAAE4I,EAAI3I,GAAIgqD,EAASjqD,MAItD,kBAAkB0pD,EAASD,GACvB,MAAM9uM,EAAM8uM,EAAYzkL,SAAS1L,EACjC,MAAO,CAAE,CACL,CAAE3e,EAAM,EAAG8uM,EAAYzpD,IAAM,CAAErlJ,EAAM,EAAG8uM,EAAYzpD,IACpD,CAAErlJ,EAAK8uM,EAAYzpD,IAAM,CAAErlJ,EAAK+uM,EAAQ1pD,KACzC,CACC,CAAErlJ,EAAM,EAAG8uM,EAAYvpD,IAAM,CAAEvlJ,EAAM,EAAG8uM,EAAYvpD,IACpD,CAAEvlJ,EAAK8uM,EAAYvpD,IAAM,CAAEvlJ,EAAK+uM,EAAQxpD,MAIhD,iBAAiB0I,EAAKmhD,GAClB,MAAO,CACH,CAAE,CAAEnhD,EAAI7I,GAAIgqD,EAAW/pD,IAAM,CAAE4I,EAAI3I,GAAI8pD,EAAW/pD,MAI1D,eAAehyK,GACX,MAAM2L,EAAQrL,KAAKqL,MACb6wN,EAAW7wN,EAAM6wN,UAAY,GAC7BC,EAA6C,EAAhC5yN,KAAK+mC,IAAIjlC,EAAMiwN,GAAKjwN,EAAMgwN,IACvCjoD,EAAW,GACjB,IAAIu/C,EAAUjzN,EAAQizN,SAAW,GAEjC,IAAK,IAAIjyN,EAAI,EAAGA,EAAIw7N,EAASp7N,OAAQJ,IAAK,CACtC,MAAM07N,EAAeF,EAASx7N,GAE1BiyN,EADAyJ,EAAe/wN,EAAMiwN,GAAKa,GAAcC,EAAe/wN,EAAMgwN,GAAKc,EACxDz8N,EAAQw8N,SAERx8N,EAAQu2K,SAEtB,IAAIomD,EAAgBj7B,GAAW,GAAIuxB,EAAQtpB,QAEtC,GAAQgzB,EAAc3wD,SAEnB2wD,EAAc3wD,MADd,GAAQ1rK,KAAK0rK,OACS1rK,KAAK0rK,MAGvB,IAAI,GAAMinD,EAAQ/oB,YAAYmpB,WlC1F5B,IkC0F0D15B,SAIxE,MAAMlL,EAAQ,IAAI,GAAa,CAC3B7qL,KAAMqvN,EAAQrvN,KACd8sC,MAAOuiL,EAAQ/6M,KACfiyJ,OAAQ8oD,EAAQ/6M,KAChBkgC,SAAU66K,EAAQ76K,SAClB8xJ,WAAY+oB,EAAQ/oB,WACpBP,OAAQgzB,EACRvuD,QAAS6kD,EAAQ7kD,UAGrBqgB,EAAM9iL,MAAQ+wN,EAEdhpD,EAAS/vK,KAAK8qL,GAIlB,OADAnuL,KAAKs8N,eAAelpD,GACbA,EAGX,eAAe8oD,GACX,MAAM3iB,EAAYv5M,KAAK+vN,MAAMhD,gBAAgB/sN,KAAKN,SAC5Cg3C,EAAS12C,KAAKs6K,IAAI5jI,SAExB,IAAK,IAAIh2C,EAAI,EAAGA,EAAIw7N,EAASp7N,OAAQJ,IAAK,CACtC,MACM2yN,EAAY9Z,EAAUnG,QADP8oB,EAASx7N,GAAG2K,OAG7BrL,KAAKN,QAAQ+rM,SACb4nB,EAAUnpG,KAAKxzE,EAAO1L,GAEtBqoL,EAAUnpG,UAAKh0G,EAAWwgC,EAAOvG,GAGrCnwC,KAAKs6K,IAAMt6K,KAAKs6K,IAAIt3I,KAAKqwL,GACzB6I,EAASx7N,GAAGmmM,OAAOwsB,IAI3B,WAAW3zN,GACP,MAAM63B,EAAQ0vB,MAAMuzK,WAAW96N,GACzBw8N,EAAWl8N,KAAKu8N,eAAe78N,GAErC,IAAK,IAAIgB,EAAI,EAAGA,EAAIw7N,EAASp7N,OAAQJ,IAAK,CACtC,MAAM+zC,EAAUynL,EAASx7N,GAAGypM,aACxB11J,GACAld,EAAM8iG,OAAO5lF,GAIrB,OAAOld,EAGX,YAAY6iD,EAAW16E,GACnBM,KAAK46N,UAAUxgJ,EAAW16E,EAASM,KAAK87N,cAAep8N,EAAQ88N,UAC/Dx8N,KAAK46N,UAAUxgJ,EAAW16E,EAASM,KAAKg8N,aAAct8N,EAAQg8N,QAC9D17N,KAAK46N,UAAUxgJ,EAAW16E,EAASM,KAAK47N,WAAYl8N,EAAQgmC,MAGhE,iBACI,OAAK1lC,KAAKN,QAAQ2pM,QAAU,IAAI39B,MACrB1rK,KAAKN,QAAQ2pM,OAAO39B,MAG3B1rK,KAAK0rK,MACE1rK,KAAK0rK,MAGTzkH,MAAM2xK,kBAIrBh1B,GAAkB,GAAS,CACvByF,OAAQ,CACJ0vB,YAAa,IAEjBlrL,KAAM,CACFuC,MAAO,GAEXsrL,OAAQ,CACJhwD,MAAO,WAEXhmI,KAAM,CACF0K,MAAO,EACPg5I,SAAU,OACV1d,MAAO,WAEXq9B,QAAS,CACL/N,SAAU,SAEd+/B,QAAS,CACL5wN,OAAQ,oRAUZ89L,UAAW,CACPn6B,QAAS,EACTu7B,OAAQ,CACJj5J,MAAO,EACP09H,QAAS,GAEbjgI,KAAM,CACFuC,MAAO,EACP09H,QAAS,IAGjB0jC,MAAO,CACHplC,SAAS,EACTttC,MAAO,IAEXo9F,SAAU,CACN9vD,SAAS,EACTx0J,KlC1MiB,EkC2MjBtU,KrSrNa,QqSsNbsmM,WAAYrjC,GACZ8iC,OAAQ,CACJj5J,MAAO,EACP09H,QAAS,GAEbA,QAAS,GAEbmI,SAAU,CACN7J,SAAS,EACTx0J,KlCrNiB,EkCsNjBtU,KAAMwiK,GACN8jC,WAAYrjC,GACZ8iC,OAAQ,CACJj5J,MAAO,EACP09H,QAAS,GAEbA,QAAS,KAIjBszB,GAAW,GAAQngM,UAAW,IAEf,IAAA,GAAA,GC9MA,GAnCf,cAA8B,GAC1B,cAAcq5K,GACVt6K,KAAKo7N,QAAQ1pD,GAAK4I,EAAI5I,GACtB1xK,KAAKo7N,QAAQxpD,GAAK0I,EAAI1I,GAG1B,kBAAkB0I,GACdt6K,KAAKm7N,YAAYzpD,GAAK4I,EAAI5I,GAC1B1xK,KAAKm7N,YAAYvpD,GAAK0I,EAAI1I,GAG9B,eAAe0I,EAAKqhD,GAChB,MAAO,CACH,CAAE,CAAEA,EAASlqD,GAAI6I,EAAI5I,IAAM,CAAEiqD,EAASlqD,GAAI6I,EAAI1I,MAItD,kBAAkBwpD,EAASD,GACvB,MAAM9uM,EAAM8uM,EAAYzkL,SAASvG,EACjC,MAAO,CAAE,CACL,CAAEgrL,EAAY1pD,GAAIplJ,EAAM,GAAK,CAAE8uM,EAAY1pD,GAAIplJ,EAAM,GACrD,CAAE8uM,EAAY1pD,GAAIplJ,GAAO,CAAE+uM,EAAQ3pD,GAAIplJ,IACxC,CACC,CAAE8uM,EAAYxpD,GAAItlJ,EAAM,GAAK,CAAE8uM,EAAYxpD,GAAItlJ,EAAM,GACrD,CAAE8uM,EAAYxpD,GAAItlJ,GAAO,CAAE+uM,EAAQzpD,GAAItlJ,KAI/C,iBAAiBiuJ,EAAKmhD,GAClB,MAAO,CACH,CAAE,CAAEA,EAAWhqD,GAAI6I,EAAI5I,IAAM,CAAE+pD,EAAWhqD,GAAI6I,EAAI1I,QCsF/C,GA5Gf,cAA2B,GACvB,SAASxyJ,EAAM0oJ,GACX,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,GAC7C,SAAE12H,EAAQ,QAAE1xC,GAAYM,KACxBqL,EAAQ+T,EAAKsqM,YAEbpyE,EAAW0jF,GADEh7N,KAAKi7N,WAAW5vN,IAE7Bq9L,EAAWD,EAAOrpL,KAAKi/L,GAC7B,IACIj1C,EADAqkD,EAAiBztN,KAAKytN,eAAepP,GAGpCoP,IACDztN,KAAKytN,eAAepP,GAAcoP,EAAiB,IAGnDn2E,IACA8xB,EAAQppK,KAAK8vN,YAAY1wM,EAAM0oJ,IAGnC,IAAIwxD,EAAUloL,EAASitK,GAClBib,IACDA,EAAU,IAAI,GAAc,CACxB7tB,SAAU/rM,EAAQuuN,WAClBgL,IAAKv5N,EAAQu5N,IACbh9C,QAASv8K,EAAQu8K,QACjB6O,KAAMprL,EAAQuuN,aAAejuN,KAAKgnM,cAAgB,IAAIlc,MAE1D9qL,KAAKq6H,OAAOi/F,IAGZlwD,IACAppK,KAAK4vN,YAAYvkN,EAAOy8J,GAExBwxD,EAAQj/F,OAAO+uC,GAEfA,EAAMi1C,WAAaA,EACnBj1C,EAAMu/B,SAAWA,EACjBv/B,EAAMq/B,OAASA,EACfr/B,EAAM2kD,SAAWA,EACjB3kD,EAAM2mD,MAAQ/vN,KACdopK,EAAMs/B,SAAWA,GAGrB1oM,KAAK6vK,OAAOxsK,KAAK+lK,GACjBqkD,EAAepqN,KAAK+lK,GAGxB,YACI,OAAIppK,KAAKN,QAAQuuN,WACN,GAGJ,GAGX,WAAW5iN,GACP,MAAO,CACHA,EAAM8V,MAAO9V,EAAMgwN,GAAIhwN,EAAMqwN,OAC7BrwN,EAAMiwN,GAAIjwN,EAAM+V,OAIxB,YAAY/V,EAAOy8J,GACf,MAAM8mD,EAAW9mD,EAAO2gC,OAAO9sB,KAC/B,IAAI00C,EAAYrwN,KAAKwtN,gBAAgBoB,GACjC7nN,EAAQ/G,KAAKi7N,WAAW5vN,GAAO1B,OAAO3J,KAAKy8N,eAAepxN,EAAM6wN,WAEhE,GAAQ7wN,EAAMq6B,QACd3+B,EAAQA,EAAM4C,OAAO0B,EAAMq6B,OAG/B2qL,EAAYrwN,KAAKwtN,gBAAgBoB,GAC7ByB,GAAa,CAAE7mN,IAAK08J,GAAWtqJ,IAAKuqJ,IAExCkqD,EAAYrwN,KAAKwtN,gBAAgBoB,GAAY,CACzCplN,IAAKD,KAAKC,IAAI8J,MAAM/J,KAAMxC,EAAM4C,OAAO,CAAE0mN,EAAU7mN,OACnDoS,IAAKrS,KAAKqS,IAAItI,MAAM/J,KAAMxC,EAAM4C,OAAO,CAAE0mN,EAAUz0M,QAI3D,iBAAiBwtJ,EAAOj/J,GACpB,MAAMkB,EAAQ+9J,EAAM/9J,MAEpB,OAAOrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EACjCkB,EAAM8V,MAAO9V,EAAMgwN,GAAIhwN,EAAMqwN,OAC7BrwN,EAAMiwN,GAAIjwN,EAAM+V,MAAO/V,EAAMq6B,KAAM0jI,EAAMu/B,UAIjD,eAAev1I,GACX,MAAMtyD,GAAUsyD,GAAS,IAAItyD,OACvB4G,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAMu/C,EAAOmT,EAAM1yD,GACf,GAAQu/C,IAAkB,OAATA,GACjBv4C,EAAOrE,KAAK48C,GAIpB,OAAOv4C,EAGX,+BACI,OAAO,ICvGA,GATf,cAA8B,GAC1B,UACI,MAAMurM,EAAOjzM,KAAK8hM,MAAM46B,WAAW18N,KAAKyoM,QAGxC,OAFazoM,KAAKi3K,WAAag8B,EAAK9iK,EAAI8iK,EAAKjoK,ICHtC,SAAS,GAAS3/B,GAC7B,OAAO,GAAQA,IAAoB,OAAVA,ECY7B,MAAM,WAAqB,GACvB,YAAYwnM,EAAUnzM,GAElBunD,MAAMvnD,GAENM,KAAK6yM,SAAWA,EAChB7yM,KAAKgnM,aAAe6L,EAAS7L,aAC7BhnM,KAAK28N,cAEL38N,KAAKgmL,SAGT,cAGIhmL,KAAK48N,YAAc,GACnB58N,KAAK68N,YAAc,GAEnB78N,KAAK6vK,OAAS,GACd7vK,KAAK0tN,aAAe,GACpB1tN,KAAK2tN,cAAgB,GACrB3tN,KAAK4tN,YAAc,GAGvB,SACI5tN,KAAK6tN,mBAAmB7tN,KAAK8tN,SAASl1L,KAAK54B,OAG/C,YAAYopK,EAAOtC,EAAOgB,GACtB,MAAMz8J,EAAQ+9J,EAAM/9J,MAAMy7J,GACpBg2D,EAAkBh2D,EAAQ,QAC1Bi2D,EAAWj2D,EAAQ,WACnBk2D,EAAYl2D,EAAQ,aACpB,SAAEinD,EAAQ,OAAEtlB,GAAW3gC,EACvBunD,EAAYjmD,EAAM1pK,QAAQ2vN,UAC1BC,EAAWxnD,EAAOi1D,GAClBxN,EAAYznD,EAAOk1D,GAEzB,GAAI9hM,GAAS7vB,GAAQ,CACjB,IAAI+/M,EACAlwL,GAASo0L,IAAap0L,GAASq0L,KAC/BnE,EAAa,CAAEl/L,IAAKojM,EAAUnjM,KAAMojM,IAGpCF,GAAa,GAAQA,EAAUyN,MAC/B98N,KAAKwvN,kBAAoBxvN,KAAKwvN,mBAAqB,CAAExkL,EAAG,GAAImF,EAAG,IAC/DnwC,KAAKwvN,kBAAkB1oD,GAAOinD,GAAY/tN,KAAKwvN,kBAAkB1oD,GAAOinD,IACpE,IAAI,GAAqBsB,EAAUyN,GAAkBr0B,EAAQ3hC,GAEjEskD,EAAaprN,KAAKwvN,kBAAkB1oD,GAAOinD,GAAU0B,cAAcpkN,EAAOgkN,EAAUyN,KAGpF1R,GACAprN,KAAK0vN,iBAAiBtE,EAAYhiD,EAAOtC,IAKrD,iBAAiBskD,EAAYhiD,EAAOtC,GAChC,MAAM,IAAE56I,EAAG,KAAEC,GAASi/L,GAChB,OAAE3iB,EAAQ/oM,SAAW2vN,UAAW3vN,IAAc0pK,EAC9C6N,EAAanQ,IAAUL,GACvBxmH,EAAO,GAEbmpH,EAAMtC,EAAQ,OAAS56I,EACvBk9I,EAAMtC,EAAQ,QAAU36I,EAExBi9I,EAAMimD,UAAYjmD,EAAMimD,WAAa,GACrC,MAAMQ,EAAW,IAAI,GAAgB3jM,EAAKC,EAAM8qJ,EAAYj3K,KAAMyoM,EAAQ/oM,GAC1E0pK,EAAMimD,UAAUhsN,KAAKwsN,GACrBzmD,EAAM/uC,OAAOw1F,GAEb5vK,EAAK6mH,GAAS56I,EACdlsB,KAAK4vN,YAAY3vK,EAAMwoJ,GACvBxoJ,EAAK6mH,GAAS36I,EACdnsB,KAAK4vN,YAAY3vK,EAAMwoJ,GAG3B,SAASp9L,EAAOy8J,GACZ,MAAM,EAAE98H,EAAC,EAAEmF,GAAM9kC,EACX0iN,EAAWjmD,EAAOimD,SAElBmH,EAAgBl1N,KAAK+0N,oBADZ/0N,KAAKN,QAAQ+oM,OAAOslB,IAE7BL,EAAe1tN,KAAK0tN,aAAaK,GAEvC,IAKI3kD,EALAqiD,EAAapgN,EACX,GAAS2/B,IAAM,GAASmF,KAC1Bs7K,EAAazrN,KAAKi9N,mBAAmBxR,EAAYyJ,IAIjDzJ,IACAriD,EAAQppK,KAAK8vN,YAAYrE,EAAY3jD,GACjCsB,IACAhqK,OAAOu8B,OAAOytI,EAAOtB,GACrB9nK,KAAKiwN,YAAY7mD,EAAO5C,GAAGsB,GAC3B9nK,KAAKiwN,YAAY7mD,EAAO3C,GAAGqB,IAE/B9nK,KAAK4vN,YAAYnE,EAAY3jD,EAAO2gC,SAGxCzoM,KAAK6vK,OAAOxsK,KAAK+lK,GACjBskD,EAAarqN,KAAK+lK,GAGtB,oBAAoBq/B,GAChB,OAAOA,EAAOysB,cAGlB,sBAEA,YAAY7pN,EAAOo9L,GACf,MAAMzG,EAAchiM,KAAKgnM,aAAa9E,MAC9Bg7B,MAAOC,EAAWC,MAAOC,GAAc50B,EAC/C,IAAI,EAAEz9J,EAAC,EAAEmF,GAAM9kC,EACXiyN,EAAat9N,KAAK48N,YAAYO,GAC9BI,EAAav9N,KAAK68N,YAAYQ,GAE9B,GAASryL,KACTsyL,EAAat9N,KAAK48N,YAAYO,GAC1BG,GAAc,CAAE9zN,IAAK08J,GAAWtqJ,IAAKuqJ,IAErC19J,GAASuiC,KACTA,EAAI02J,GAAUM,EAAah3J,IAG/BsyL,EAAW9zN,IAAMD,KAAKC,IAAI8zN,EAAW9zN,IAAKwhC,GAC1CsyL,EAAW1hN,IAAMrS,KAAKqS,IAAI0hN,EAAW1hN,IAAKovB,IAG1C,GAASmF,KACTotL,EAAav9N,KAAK68N,YAAYQ,GAC1BE,GAAc,CAAE/zN,IAAK08J,GAAWtqJ,IAAKuqJ,IAErC19J,GAAS0nC,KACTA,EAAIuxJ,GAAUM,EAAa7xJ,IAG/BotL,EAAW/zN,IAAMD,KAAKC,IAAI+zN,EAAW/zN,IAAK2mC,GAC1CotL,EAAW3hN,IAAMrS,KAAKqS,IAAI2hN,EAAW3hN,IAAKu0B,IAIlD,iBAAiBzwC,EAAS2L,EAAOy8J,GAC7B,MAAM,OAAE2gC,EAAM,SAAEslB,GAAajmD,EACvB3pH,EAAQ,CAAEv9C,SAAU6nM,EAAOynB,UAAW/C,SAAU,CAAE,OAAQ,UAAW,UAAW,WAAY,SAAU,SAAU,sBAAuB,wBAE7I,IAAIgD,EAASnwN,KAAK4tN,YAAYG,GACzB,GAAQoC,KACTnwN,KAAK4tN,YAAYG,GAAYoC,EAASnD,GAAYttN,EAAS,GAAIy+C,GAAO,IAG1E,IAAIiyK,EAAe1wN,EAUnB,OATIywN,IACAC,EAAehvB,GAAW,GAAI1hM,GAC9BstN,GAAYoD,EAAc,CACtB/kN,MAAOA,EACPo9L,OAAQA,EACRC,SAAU5gC,EAAO4gC,UAClBvqJ,IAGAiyK,EAGX,YACI,OAAO,GAGX,aAAa3nB,EAAQslB,GACjB,IAAIruN,EAAUM,KAAK2tN,cAAcI,GACjC,IAAKruN,EAAS,CACV,MAAMkB,EAAWZ,KAAKguN,YAAY/sN,UAAUL,SAC5CZ,KAAK2tN,cAAcI,GAAYruN,EAAU0hM,GAAW,GAAIxgM,EAAU,CAC9D+xN,QAAS,CACL7kD,QAAS26B,EAAO36B,SAEpBitD,QAAS,CACL5wN,OAAQnK,KAAKN,QAAQq7N,QAAQ5wN,QAEjC6lM,OAAQ,CACJ7lM,OAAQnK,KAAKN,QAAQswM,OAAO7lM,SAEjCs+L,GAGP,OAAO/oM,EAGX,YAAY2L,EAAOy8J,GACf,MAAM2gC,EAAS3gC,EAAO2gC,OACtB,IAAI2nB,EAAepwN,KAAKowN,aAAa3nB,EAAQ3gC,EAAOimD,UAChDriD,EAAQ5D,EAAO4D,OAAS+8B,EAAO/8B,MAEnC0kD,EAAepwN,KAAKg2N,iBAAiB5F,EAAc/kN,EAAOy8J,GAEtD,GAAW2gC,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB,MAAMtC,EAAQ,IAAI,GAAU/9J,EAAO+kN,GAKnC,OAJAhnD,EAAMsC,MAAQA,EAEd1rK,KAAKq6H,OAAO+uC,GAELA,EAGX,WAAWq/B,GACP,MAAQy0B,MAAOC,EAAWC,MAAOC,GAAc50B,EACzCoK,EAAW7yM,KAAK6yM,SAChBqqB,EAAQC,EAAYtqB,EAAS2qB,WAAWL,GAAatqB,EAASxB,MAC9D+rB,EAAQC,EAAYxqB,EAAS4qB,WAAWJ,GAAaxqB,EAASvB,MAEpE,IAAK4rB,EACD,MAAM,IAAIz2N,MAAM,qCAAuC02N,GAG3D,IAAKC,EACD,MAAM,IAAI32N,MAAM,qCAAuC42N,GAG3D,MAAO,CACHryL,EAAGkyL,EACH/sL,EAAGitL,GAIX,OAAO/4B,GACH,MAAMmsB,EAAcxwN,KAAK6vK,OACnB/tI,GAAS9hC,KAAKN,QAAQksK,KAC5B,IAAIi+C,EAAU,EAGd7pN,KAAK6tN,mBAAmB,CAACxiN,EAAOy8J,KAC5B,MAAMsB,EAAQonD,EAAY3G,KACpB6S,EAAa18N,KAAK08N,WAAW50D,EAAO2gC,QACpCyK,EAAQwpB,EAAW1xL,EAAEooK,QAAQ/nM,EAAM2/B,EAAG3/B,EAAM2/B,EAAGlJ,GAC/CqxK,EAAQupB,EAAWvsL,EAAEijK,QAAQ/nM,EAAM8kC,EAAG9kC,EAAM8kC,EAAGrO,GAErD,GAAIsnI,EACA,GAAI8pC,GAASC,EAAO,CAChB,MAAMyd,EAAY5wN,KAAK4wN,UAAU1d,EAAOC,GACxC/pC,EAAMy9B,OAAO+pB,QAEbxnD,EAAMgD,SAAU,IAK5BpsK,KAAKs6K,IAAM+pB,EAGf,UAAU6O,EAAOC,GACb,OAAO,IAAI,GAAID,EAAMzhC,GAAI0hC,EAAMzhC,GAAIwhC,EAAMvhC,GAAIwhC,EAAMvhC,IAGvD,mBAAmBrhJ,GACf,MAAQ7wB,SAAS,OAAE+oM,GAAQ,aAAEilB,GAAiB1tN,KAE9C,IAAK,IAAI+tN,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM0C,EAAgBhoB,EAAOslB,GACDL,EAAaK,KAErCL,EAAaK,GAAY,IAG7B,IAAK,IAAIlE,EAAU,EAAGA,EAAU4G,EAAcrxM,KAAKte,OAAQ+oN,IAAW,CAClE,MAAQH,YAAar+M,EAAK,OAAEy8J,GAAW9nK,KAAKwxN,WAAWf,EAAe1C,EAAUlE,GAEhFt5L,EAASllB,EAAO+1L,GAAW,CACvByoB,QAASA,EACTphB,OAAQgoB,EACR1C,SAAUA,EACVrlB,SAAU+nB,EAAcrxM,KAAKyqM,GAC7BkG,MAAO/vN,MACR8nK,MAKf,iBAAiBsB,EAAOj/J,GACpB,MAAMkB,EAAQ+9J,EAAM/9J,MACpB,OAAOrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQkB,EAAM2/B,EAAG3/B,EAAM8kC,GAGhE,kBACI,MAAM0/H,EAAS7vK,KAAK6vK,OACdnoK,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IACnCxlC,EAAOrE,MAAMwsK,EAAO3iI,IAAQ,IAAIqzB,QAEpC,OAAO74D,GAGfk8L,GAAkB,GAAc,CAC5B6E,OAAQ,GACRsyB,QAAS,CACL5wN,OAAQ,YAEZ6lM,OAAQ,CACJ7lM,OAAQ,YAEZyhK,MAAM,IAEVw1B,GAAW,GAAangM,UAAW,GAAoB,CACnDuwN,WAAY,GAAiBvwN,UAAUuwN,aAG5B,IAAA,GAAA,GC5Tf,MAAM,WAAe,GACjB,YAAYnmN,EAAO3L,GACfunD,MAAM57C,EAAO3L,GAEbM,KAAK2oM,SAAWt9L,EAAMs9L,SAG1B,kBACI,MAAMV,EAAYjoM,KAAKN,QAAQuoM,UACzBoB,EAASpB,EAAUoB,OACnBspB,EAAU3yN,KAAKN,QAAQizN,QACvBj8K,EAAS12C,KAAKs6K,IAAI5jI,SAClBw2H,GAAUylD,EAAQ/6M,KAAO+6M,EAAQtpB,OAAOj5J,MAAQi5J,EAAOj5J,OAAS,EAChEstL,EAAiB,IAAI,EAAK3gH,MAC1Bw2G,EAAS,IAAI,EAAKroC,OAAO,IAAI,EAAKA,OAAO,CAAEx0I,EAAO1L,EAAG0L,EAAOvG,EAAI+8H,EAAS,EAAIm8B,EAAOj5J,MAAQ,GAAK88H,EAASm8B,EAAOj5J,MAAQ,GAAI,CAC/Hu8H,OAAQ,CACJjB,MAAO,QAEX5tK,KAAMkC,KAAKgpM,eAAe,CACtBhO,SAAU,eACVtvB,MAAOinD,EAAQ/oB,WACf/qB,MAAO,CAAE,CACL9pK,OAAQ,EACR22J,MAAOinD,EAAQ/oB,WACf97B,QAAS,IACV,CACC/4J,OAAQ,EACR22J,MAAOinD,EAAQ/oB,WACf97B,QAAS,QAIfi7B,EAAU,IAAI,EAAK7d,OAAO,IAAI,EAAKA,OAAO,CAAEx0I,EAAO1L,EAAG0L,EAAOvG,GAAK+8H,GAAS,CAC7EP,OAAQ,CACJjB,MAAO29B,EAAO39B,OACV,IAAI,GAAMinD,EAAQ/oB,YAAYmpB,WxCnCxB,IwCmCsD15B,QAChEjpJ,MAAOi5J,EAAOj5J,MACd09H,QAASu7B,EAAOv7B,SAEpBhwK,KAAM,CACF4tK,MAAOinD,EAAQ/oB,WACf97B,QAASm6B,EAAUn6B,WAM3B,OAFA4vD,EAAerjG,OAAOk5F,EAAQxqB,GAEvB20B,GAIf,GAAOz8N,UAAUL,SAAWwgM,GAAW,GAAI,GAAOngM,UAAUL,SAAU,CAClEovM,OAAQ,CACJlsK,SAAU+hI,IAEdoiC,UAAW,CACPn6B,QAAS,EACTu7B,OAAQ,CACJ39B,MAAO,OACPt7H,MAAO,EACP09H,QAAS,MAKrB,GAAO7sK,UAAUL,SAASqnM,UAAU7Y,YAASl5K,EAE9B,IAAA,GAAA,GCnEf,MAAM,WAAoB,GACtB,cACIlW,KAAK29N,SAAWx3D,GAChBl/G,MAAM01K,cAGV,SAAStxN,EAAOy8J,GACO,OAAfz8J,EAAMuM,OAAkBvM,EAAMuM,KAAO,GAAMvM,EAAMuM,KAAO,GAAKkwJ,EAAO2gC,OAAOm1B,eAAexxD,UAC1FpsK,KAAK29N,SAAWp0N,KAAKqS,IAAI5b,KAAK29N,SAAUp0N,KAAK+mC,IAAIjlC,EAAMuM,OACvDqvC,MAAM6mK,SAASziN,EAAOy8J,KAEtB9nK,KAAK6vK,OAAOxsK,KAAK,MACjBrD,KAAK0tN,aAAa5lD,EAAOimD,UAAU1qN,KAAK,OAIhD,OAAOi3K,GACHt6K,KAAK69N,kBAAkBvjD,GACvBrzH,MAAM4/I,OAAOvsB,GAGjB,YACI,OAAO,GAGX,YAAYjvK,EAAOy8J,GACf,MAAM2gC,EAAS3gC,EAAO2gC,OAEhBpuK,EAAQytI,EAAO+hD,SzChCM,IyC+BPphB,EAAOrpL,KAAKte,QAE1Bg9N,EAAmB,CACrBzjM,MAAOA,EACP8qI,SzCnCuB,IyCmCgB9qI,EACvC/2B,KzCVG,UyCaP,IAAIooK,EAAQ5D,EAAO4D,OAAS+8B,EAAO/8B,MAC/BrgK,EAAMuM,KAAO,GAAK6wL,EAAOm1B,eAAexxD,UACxCV,EAAQ,GACJ+8B,EAAOm1B,eAAelyD,MAAOA,IAIrC,IAAI0kD,EAAehvB,GAAW,CAC1B4O,OAAQ,CACJn8G,UAAW,CACPx5D,MAAOA,EACP8qI,SzClDe,IyCkDwB9qI,KAGhDr6B,KAAKowN,aAAa3nB,EAAQ3gC,EAAOimD,UAAW,CAC3C4E,QAAS,CACLrvN,KAAMwiK,GACNujC,OAAQZ,EAAOY,OACfv7B,QAAS26B,EAAO36B,QAChBj6E,UAAWiqI,KAInB1N,EAAepwN,KAAKg2N,iBAAiB5F,EAAc/kN,EAAOy8J,GACtD,GAAW2gC,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB0kD,EAAauC,QAAQ/oB,WAAal+B,EAElC,MAAMtC,EAAQ,IAAI,GAAO/9J,EAAO+kN,GAKhC,OAJAhnD,EAAMsC,MAAQA,EAEd1rK,KAAKq6H,OAAO+uC,GAELA,EAGX,kBAAkBkR,GACd,MAAQ56K,SAAS,OAAE+oM,IAAazoM,KAC1Bm0M,EAAU5qM,KAAKC,IAAI8wK,EAAIlqI,QAASkqI,EAAIzQ,UAE1C,IAAK,IAAIkkD,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM0C,EAAgBhoB,EAAOslB,GACvBL,EAAe1tN,KAAK0tN,aAAaK,GAGjCgQ,GAFUtN,EAAcuN,SAAWz0N,KAAKqS,IAAc,IAAVu4L,EAAgB,KAE3C,EACjB8pB,GAFUxN,EAAcpyC,SAAqB,GAAV81B,GAElB,EACjB+pB,EAAU30N,KAAKwvC,GAAKglL,EAAOA,EAG3BI,GAFU50N,KAAKwvC,GAAKklL,EAAOA,EACLC,GACEl+N,KAAK29N,SAEnC,IAAK,IAAI9T,EAAU,EAAGA,EAAU6D,EAAa5sN,OAAQ+oN,IAAW,CAC5D,MAAMzgD,EAAQskD,EAAa7D,GAC3B,GAAIzgD,EAAO,CACP,MAAMg1D,EAAO70N,KAAK+mC,IAAI84H,EAAM/9J,MAAMuM,MAAQumN,EACpCjxD,EAAS3jK,KAAKsvC,MAAMqlL,EAAUE,GAAQ70N,KAAKwvC,IAE3Cq2I,EADa,GAAehmB,EAAM1pK,QAAQ0vL,OAAQ,IAC3B,EAAIliB,EAAS+wD,GAE1C78B,GAAWh4B,EAAM1pK,QAAS,CACtB0vL,OAAQA,EACRujC,QAAS,CACL/6M,KAAe,EAATs1J,EACNkiB,OAAQA,GAEZ4gB,OAAQ,CACJ5gB,OAAQA,EAAS,QAQzC,iBAAiBhmB,EAAOj/J,GACpB,MAAMkB,EAAQ+9J,EAAM/9J,MACpB,OAAOrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQkB,EAAM2/B,EAAG3/B,EAAM8kC,EAAG9kC,EAAMuM,KAAMwxJ,EAAMu/B,UAGrF,mBACA,iBAGJ/E,GAAkB,GAAa,CAC3Bm3B,QAAS,CACL5wN,OAAQ,OAEZ6lM,OAAQ,CACJ7lM,OAAQ,SAID,IAAA,GAAA,GCtIf,MAAM,WAAe,IAErBi3L,GAAW,GAAOngM,UAAW,IAEd,IAAA,GAAA,GCKf,MAAM,WAAe,GACjB,YAAYoK,EAAO3L,GACfunD,MAAMvnD,GAENM,KAAK6wN,UAAY7wN,KAAKN,QAAQmxN,UAC9B7wN,KAAK0rK,MAAQhsK,EAAQgsK,OAASnF,GAC9BvmK,KAAKqL,MAAQA,EAGjB,SACI,MAAM3L,EAAUM,KAAKN,QAEhBM,KAAK4yN,YACN5yN,KAAK4yN,WAAY,EAEb,GAAQ5yN,KAAKqL,MAAMw4B,UACnB7jC,KAAK6jC,OAAS,IAAI,GAAO,CACrBvgC,KAAM5D,EAAQmkC,OAAOsqJ,MACrByb,WAAYlqM,EAAQmkC,OAAO6nI,OAAS1rK,KAAK0rK,MACzCoC,QAASpuK,EAAQouK,QACjBshB,OAAQ1vL,EAAQ0vL,OAChBia,OAAQ3pM,EAAQmkC,OAAOwlK,OACvBE,OAAQljC,GACRqV,MAAOtV,KAGXpmK,KAAK6jC,OAAOx4B,MAAQrL,KAAKqL,MACzBrL,KAAK6jC,OAAO6kK,SAAW1oM,KAAK0oM,SAC5B1oM,KAAK6jC,OAAO4kK,OAASzoM,KAAKyoM,OAE1BzoM,KAAKq6H,OAAOr6H,KAAK6jC,SAGrB7jC,KAAKyyN,cAIb,OAAOn4C,GACHt6K,KAAKgmL,SAEL,MAAM,QAAEtmL,EAAO,OAAEmkC,EAAQksL,MAAOjuB,GAAU9hM,KACpCiuN,EAAavuN,EAAQuuN,WACrB1U,EAAYzX,EAAMirB,gBAAgB/sN,KAAKN,SACvCgxN,EAAe5uB,EAAM4uB,aAAa5uB,EAAMwrB,aAAc5tN,EAAQ2+M,WAAY9E,GAC1E8kB,EAAkB9kB,EAAUnG,QAAQpzM,KAAKqL,MAAMw4B,QAC/Cy6L,EAAcrQ,EAAaoQ,EAAkB3N,EAC7C6N,EAActQ,EAAayC,EAAe2N,EAEhD,GAAIx6L,EAAQ,CACR,MAAM26L,EAAa,IAAI,GACnBF,EAAY7sD,GAAI8sD,EAAY7sD,GAC5B4sD,EAAY3sD,GAAI4sD,EAAY3sD,IAEhC/tI,EAAOnkC,QAAQmqK,OAASokD,EAAauQ,EAAW30D,SAAWnqK,EAAQmkC,OAAOgK,KAAKuC,MAC/EvM,EAAOnkC,QAAQ0wC,MAAQ69K,EAAavuN,EAAQmkC,OAAOgK,KAAKuC,MAAQouL,EAAWpuL,QAC3EvM,EAAOgjK,OAAO23B,GAGdx+N,KAAK0xM,MACL1xM,KAAK0xM,KAAK7K,OAAOvsB,GAGrBt6K,KAAKs6K,IAAMA,EAGf,eACIrzH,MAAMigJ,eAEN,MAAMxnM,EAAUM,KAAKN,QACf6vC,EAAO,EAAK87I,KAAKye,SAAS9pM,KAAKs6K,IAAIyvB,SAAU,CAC/CjsM,KAAM,CACF4tK,MAAO1rK,KAAK0rK,MACZoC,QAASpuK,EAAQouK,SAErBnB,OAAQ,OAGRjtK,EAAQ2pM,OAAOj5J,MAAQ,GACvBb,EAAK7vC,QAAQb,IAAI,SAAU,CACvB6sK,MAAOhsK,EAAQ2pM,OAAO39B,OAAS1rK,KAAK0rK,MACpCt7H,MAAO1wC,EAAQ2pM,OAAOj5J,MACtBg5I,SAAU1pL,EAAQ2pM,OAAOjgB,SACzBtb,QAAS,GAAepuK,EAAQ2pM,OAAOv7B,QAASpuK,EAAQouK,WAIhE9tK,KAAKy+N,WAAalvL,EAElBmxJ,GAAiBnxJ,GACjBvvC,KAAKksL,OAAO7xD,OAAO9qF,GAGvB,kBACQvvC,KAAKy+N,aACLz+N,KAAK6zF,UAAY,EAAK4zG,UAAUz8L,OAC5BhL,KAAKy+N,WAAYz+N,KAAKN,QAAQm0F,YAK1C,gBAAgBpnD,GACZ,OAAO,EAAK4+I,KAAKye,SAAS9pM,KAAKs6K,IAAIyvB,SAAUt9J,GAGjD,kBACI,OAAOzsC,KAAKy+N,WAGhB,sBACI,MAAO,CACH3vG,KAAM9uH,KAAKs6K,IAAIyvB,SACf7d,OAAQlsL,KAAKy+N,WACb/+N,QAASM,KAAKN,SAItB,YAAYyK,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,IAIjD,GAAOlJ,UAAUy9N,cAAgB,GAAIz9N,UAAUy9N,cAE/C96B,GAAkB,GAAQ,CACtByF,OAAQ,CACJj5J,MAAO,GAEXq7J,UAAU,EACV39B,QAAS,EACTjqI,OAAQ,CACJsqJ,MAAO,GACPkb,OAAQ,CACJj5J,MAAO,EACPs7H,MAAO,SAEX79H,KAAM,CACFuC,MAAO,IAGf2qL,QAAS,CACL5wN,OAAQ,mCAIhBi3L,GAAW,GAAOngM,UAAW,IAC7BmgM,GAAW,GAAOngM,UAAW,IAEd,IAAA,GAAA,GCtJf,MAAM,WAAoB,GACtB,YAAY4xM,EAAUnzM,IAiH1B,SAAkBA,GACd,MAAM+oM,EAAS/oM,EAAQ+oM,OAEvB,IAAK,IAAI/nM,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,MAAMi+N,EAAal2B,EAAO/nM,GACpB0e,EAAOu/M,EAAWv/M,MACpBA,GAAS,GAAQA,EAAK,KAAQ,GAASA,EAAK,MAC5Cu/M,EAAWv/M,KAAO,CAAEA,KAPhC,CA/GiB1f,GAETunD,MAAM4rJ,EAAUnzM,GAGpB,iBAAiB6wN,GACb,MAAMn/K,EAAWpxC,KAAKoxC,SAChB2oL,EAAiB3oL,EAAStwC,OAEhC,IAAK,IAAIJ,EAAI,EAAGA,EAAIq5N,EAAgBr5N,IAChC0wC,EAAS1wC,GAAGmmM,OAAO0pB,EAAc7vN,IAIzC,UAAU0oK,GACN,MACMmwC,EAAYv5M,KAAK+sN,gBADR3jD,EAAMq/B,QAEfuO,EAAoBh3M,KAAK2uN,0BAA0BpV,GAEzD,MAAO,CAAEvC,EAAmB5tC,EAAM/9J,MAAMgL,SAAW2gM,GAGvD,YAAY53L,EAAM0oJ,GACd,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,GAC7C,QAAEpoK,EAAO,SAAE0xC,GAAapxC,KACxBqL,EAAQ+T,EAAKsqM,YAEnB,IAAIkV,EAAgBx9B,GAAW,CAC3BqK,UAAW/rM,EAAQuuN,WACnBllB,QAASN,EAAOM,QAChBsV,WAAYA,EACZ4P,WAAYvuN,EAAQuuN,YACrBxlB,GAEC/8B,EAAQtsJ,EAAK0oJ,OAAO4D,OAAS+8B,EAAO/8B,MACxCkzD,EAAgB5+N,KAAKg2N,iBACjB4I,EAAevzN,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GAGpD,GAAWtlB,EAAO/8B,SAClBA,EAAQkzD,EAAclzD,OAG1B,MAAMmzD,EAAS,IAAI,GAAOxzN,EAAOuzN,GACjCC,EAAOnzD,MAAQA,EAEf,IAAI4tD,EAAUloL,EAASitK,GAavB,OAZKib,IACDA,EAAU,IAAI,GAAc,CACxB7tB,SAAU/rM,EAAQuuN,WAClBgL,IAAKv5N,EAAQu5N,IACbh9C,QAASv8K,EAAQu8K,QACjB6O,KAAMprL,EAAQuuN,aAAejuN,KAAKgnM,cAAgB,IAAIlc,MAE1D9qL,KAAKq6H,OAAOi/F,IAGhBA,EAAQj/F,OAAOwkG,GAERA,EAGX,YAAYxzN,EAAOy8J,GACf,MAAM,QAAEzxJ,EAAO,OAAEwtB,GAAWx4B,EACtBujN,EAAW9mD,EAAO2gC,OAAO9sB,KAC/B,IAAI00C,EAAYrwN,KAAKwtN,gBAAgBoB,GAEjC,GAAQv4M,KAAa2uB,MAAM3uB,IAAY,GAAQwtB,IAAWmB,MAAMnB,MAChEwsL,EAAYrwN,KAAKwtN,gBAAgBoB,GAC7ByB,GAAa,CAAE7mN,IAAK08J,GAAWtqJ,IAAKuqJ,IAExCkqD,EAAU7mN,IAAMD,KAAKC,IAAI6mN,EAAU7mN,IAAK6M,EAASwtB,GACjDwsL,EAAUz0M,IAAMrS,KAAKqS,IAAIy0M,EAAUz0M,IAAKvF,EAASwtB,IAIzD,iBAAiBulI,EAAOj/J,GACpB,OAAOnK,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQi/J,EAAM/9J,MAAMgL,QAAS+yJ,EAAM/9J,MAAMw4B,QAGlF,WAAWzkB,GACP,OAAOA,EAAKsqM,YAAYrzM,QAG5B,UAAU+yJ,GAGN,OAFcA,EAAM/9J,MAAMgL,QAEX,EAGnB,kBACI,MAAMw5J,EAAS7vK,KAAK6vK,OAEpB7vK,KAAKg6N,uBAEL,IAAK,IAAI9sL,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQyG,EAAO3iI,GACrBk8H,EAAM1pK,QAAQm0F,UAAY7zF,KAAKN,QAAQm0F,UACvCu1E,EAAMg+B,oBAKlB,GAAYnmM,UAAU+4N,qBAAuB,GAAS/4N,UAAU+4N,qBAEhEp2B,GAAkB,GAAa,CAC3B/vG,UAAW,CACPvwF,KAAMwoN,MAgBC,IAAA,GAAA,GCnIf,MAAM,WAAoB,GACtB,YAAY9kB,EAActnM,GACtBunD,QAEAjnD,KAAKgnM,aAAeA,EACpBhnM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAGhD,SAASA,EAAS0pK,GACd,IAAI,WAAEwgC,EAAYP,QAAU39B,MAAO29B,IAAa3pM,EAEhD,GAAI0pK,EAAO,CACP,MAAM01D,EAAa11D,EAAMsC,OAAStC,EAAM1pK,QAAQgsK,MAChDk+B,EAAa,GAAeA,EAAYk1B,GACxCz1B,EAAS,GAAeA,EAAQy1B,GAGpC,MAAMj7C,EAAU2d,GAAW9hM,EAAQmkL,SAAW,GAAI,QAElD,MAAO,CACHk7C,gBAAiBn1B,EACjBovB,YAAa3vB,EACbruB,KAAMt7K,EAAQs7K,KACdtP,MAAOhsK,EAAQgsK,MACfoC,QAASpuK,EAAQouK,QACjBs7B,YAAa/H,GAAW3hM,EAAQ2pM,OAAOj5J,OACvC0xI,WAAYuf,GAAWxd,EAAQ50D,KAC/B+vG,cAAe39B,GAAWxd,EAAQ5Y,QAClC4W,YAAawf,GAAWxd,EAAQlyI,MAChCstL,aAAc59B,GAAWxd,EAAQjyI,QAIzC,KAAKlyC,EAASw/N,EAAgB91D,GAC1B1pK,EAAQyK,OAAS+0N,EAAe/0N,OAEhC,MAAMsiC,EAAQzsC,KAAKm/N,SAASD,EAAgB91D,GAC5C1pK,EAAQ+sC,MAAQA,GAEX,GAAQyyL,EAAexzD,QAAU,IAAI,GAAMj/H,EAAMsyL,iBAAiBzM,iBAAmB,MACtF5yN,EAAQyuE,UAAY,2BAGxBnuE,KAAKgnM,aAAao4B,O7CkCL,c6ClC0B1/N,GAEvCM,KAAKosK,SAAU,EAGnB,OACQpsK,KAAKgnM,cACLhnM,KAAKgnM,aAAao4B,O7C4BT,e6CzBbp/N,KAAKosK,SAAU,EAGnB,iBACWpsK,KAAKgnM,cAIpBpD,GAAkB,GAAa,CAC3ByF,OAAQ,CACJj5J,MAAO,GAEX09H,QAAS,IAGE,IAAA,GAAA,GCnEf,MAAM,WAAyB,GAC3B,YAAYk5B,EAAcq4B,EAAW3/N,GACjCunD,MAAM+/I,EAActnM,GAEpBM,KAAKq/N,UAAYA,EACjBr/N,KAAKs/N,cAAgBt4B,EAAa78L,OAClCnK,KAAKu/N,eAGT,eACI,MAAM5jD,EAAO37K,KAAKq/N,UAAU1jD,KAE5B,IAAIlxK,EAEAA,EAHakxK,EAAKk3B,SAETya,aACF3xC,EAAK0sC,YAAc,eAAiB,YAEpC1sC,EAAKj8K,QAAQ+rM,SAAW,QAAU,QAE7CzrM,KAAK4uN,SAAWnkN,EAGpB,OAAO2+J,GACH,MAAQi2D,WAAW,KAAE1jD,GAAM,QAAEj8K,GAAYM,KACzC,IAAIqL,EAAQswK,EAAKj8K,EAAQ8/N,WAAa,cAAgB,YAAYp2D,GAC9Dq2D,EAAiBp0N,EAEjB3L,EAAQyK,OACRs1N,EAAiBz/N,KAAKs/N,cAActwB,KAAKtvM,EAAQyK,OAAQkB,GAClDswK,EAAKj8K,QAAQ4D,OAASyiK,KAC7B05D,EAAiBz/N,KAAKs/N,cAActwB,KAAKrzB,EAAKj8K,QAAQswM,OAAOmQ,YAAYxkC,EAAKj8K,QAAQ84M,UAAWntM,IAGrGrL,KAAKmoM,KAAK,CACN/+B,MAAOA,EACPnuF,OAAQj7E,KAAK0/N,YACbL,UAAWr/N,KAAKq/N,UAChBh0N,MAAOo0N,EACP7Q,SAAU5uN,KAAK4uN,SACfwC,UAAWpxN,KAAKq/N,UAAU1jD,KAAKy1C,WAChCpxN,KAAKN,SAGZ,OACIM,KAAKgnM,aAAao4B,O9CkCL,c8ClC0B,CACnCC,UAAWr/N,KAAKq/N,UAChBzQ,SAAU5uN,KAAK4uN,SACfwC,UAAWpxN,KAAKq/N,UAAU1jD,KAAKy1C,YAIvC,YACI,MAAM,UAAEiO,EAAW3/N,SAAS,SAAEokC,EAAQ,QAAE+/I,IAAc7jL,KAChDyrM,GAAY4zB,EAAU1jD,KAAKj8K,QAAQ+rM,SACnCsG,EAAUstB,EAAUxxL,KAAKo+H,OAC/B,IAAIynD,EAAiBC,EAAevqD,EAsBpC,OApBIqiC,GACAioB,EAAkB7tD,GACd/hI,IAAa8hI,IACb+tD,EAAgBttD,GAChB+C,EAAQ2oC,EAAQrnC,aAAarB,UAAU,EAAGwa,KAE1C8vC,EAAgB/tD,GAChBwD,EAAQ2oC,EAAQ5nC,UAAUd,UAAU,GAAIwa,MAG5C8vC,EAAgB9tD,GACZ/hI,IAAamiI,IACbytD,EAAkBttD,GAClBgD,EAAQ2oC,EAAQ5nC,UAAUd,WAAWwa,EAAS,KAE9C6vC,EAAkBztD,GAClBmD,EAAQ2oC,EAAQznC,WAAWjB,UAAUwa,EAAS,KAI/C,CACHza,MAAOA,EACPsS,MAAO,CACHk4C,WAAYF,EACZjoB,SAAUkoB,KAM1B/vB,GAAkB,GAAkB,CAChC/f,QAAS,KAGE,IAAA,GAAA,GCxFf,MAAM,WAAkB,GACpB,YAAYmjB,EAAcrrB,EAAMj8K,GAC5BunD,MAAMvnD,GAENM,KAAK27K,KAAOA,EACZ37K,KAAKw/N,WAAa7jD,aAAgB,GAElC,MAAMujD,EAAiBl/N,KAAKN,QAAQq7N,QAEhCmE,EAAe9yD,UACfpsK,KAAK+6N,QAAU,IAAI,GAAiB/zB,EAAchnM,KAC9CohM,GAAW,GAAI89B,EAAgB,CAAEM,WAAYx/N,KAAKw/N,eAK9D,OAAOp2D,GACHppK,KAAKopK,MAAQA,EACbppK,KAAK2/N,WACL3/N,KAAK6tC,KAAKu+H,SAAQ,GAEdpsK,KAAK+6N,SACL/6N,KAAK+6N,QAAQ6E,OAAOx2D,GAI5B,OACIppK,KAAK6tC,KAAKu+H,SAAQ,GAEdpsK,KAAK+6N,SACL/6N,KAAK+6N,QAAQrlB,OAIrB,WACI,MAAM,KAAE/5B,EAAI,MAAEvS,GAAUppK,KAClByrM,EAAW9vB,EAAKj8K,QAAQ+rM,SACxBnxB,EAAMt6K,KAAK6/N,SACXC,EAAMr0B,EAAWhlC,GAAID,GACrB2oC,EAAY,IAAI,EAAK3I,MAAMlsB,EAAI7I,GAAI6I,EAAI5I,IAC7C,IAAIq+B,EAQJ,GALIA,EADAtE,EACU,IAAI,EAAKjF,MAAMlsB,EAAI3I,GAAI2I,EAAI5I,IAE3B,IAAI,EAAK80B,MAAMlsB,EAAI7I,GAAI6I,EAAI1I,IAGrCxI,EACA,GAAIppK,KAAKw/N,WAAY,CACjB,MAAMhqB,EAAO75B,EAAKy3B,QAAQz3B,EAAK8+B,mBAAmBrxC,IAClD+lC,EAAU2wB,GAAO/vB,EAAQ+vB,GAAOtqB,EAAK9+J,SAASopL,QAE9C3wB,EAAU2wB,GAAO/vB,EAAQ+vB,GAAO12D,EAAM02D,GAI9C9/N,KAAKs6K,IAAMA,EAEXt6K,KAAK6tC,KAAKsqI,OAAOg3B,GAAW13B,OAAOs4B,GAGvC,SACI,MAAMp0B,EAAO37K,KAAK27K,KACZs3B,EAAOt3B,EAAKq3B,KAAKC,KACjBnyM,EAASmyM,EAAKnyM,OACd2qM,EAAW9vB,EAAKj8K,QAAQ+rM,SACxBnxB,EAAMqB,EAAKo2B,UAAU17K,QACrBypM,EAAMr0B,EAAWjlC,GAAIC,GAC3B,IAAIs5D,EAEJ,IAAK,IAAIr/N,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAMs/N,EAAc/sB,EAAKvyM,GACrBs/N,EAAYtgO,QAAQ+rM,WAAaA,IAC5Bs0B,EAGDA,EAAY/8L,KAAKg9L,EAAYjuB,WAF7BguB,EAAcC,EAAYjuB,UAAU17K,SAUhD,OAHAikJ,EAAIwlD,EAAM,GAAKC,EAAYD,EAAM,GACjCxlD,EAAIwlD,EAAM,GAAKC,EAAYD,EAAM,GAE1BxlD,EAGX,eACIrzH,MAAMigJ,eAEN,MAAMxnM,EAAUM,KAAKN,QACrBM,KAAK6tC,KAAO,IAAI,EAAKw9I,KAAK,CACtB1e,OAAQ,CACJjB,MAAOhsK,EAAQgsK,MACft7H,MAAO1wC,EAAQ0wC,MACf09H,QAASpuK,EAAQouK,QACjBsb,SAAU1pL,EAAQ0pL,UAEtBhd,SAAS,IAGbpsK,KAAK2/N,WACL3/N,KAAKksL,OAAO7xD,OAAOr6H,KAAK6tC,MAG5B,UACQ7tC,KAAK+6N,SACL/6N,KAAK+6N,QAAQ5hL,UAGjB8N,MAAM9N,WAIdyqJ,GAAkB,GAAW,CACzBl4B,MAAO/F,GACPv1H,MAAO,EACPg/I,QAAS,EACT2rC,QAAS,CACL3uD,SAAS,KAIF,IAAA,GAAA,GC/Hf,MAAM,WAAuB,GACzB,YAAY1sK,EAASszM,GACjB/rJ,MAAMvnD,GACNM,KAAKgzM,KAAOA,EAGhB,aACI,MAAM5hK,EAAWpxC,KAAKoxC,SAChBtwC,EAASswC,EAAStwC,OAExB,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IACxB,IAAiC,IAA7B0wC,EAAS1wC,GAAGhB,QAAQksK,KACpB,OAAO,EAGf,OAAO,EAGX,WACI,OAAO5rK,KAAKgzM,KAAKitB,YAGrB,eAKI,GAJAjgO,KAAKksL,OAAS,IAAI,EAAKnvE,MAAM,CACzBqyE,OAAQ,IAGRpvL,KAAKkgO,aAAc,CACnB,MACMC,GADUngO,KAAKyzN,QAAUzzN,KAAKogO,YACXr2B,SACnB4rB,EAAW,EAAKtqC,KAAKye,SAASq2B,GACpCz/B,GAAiBi1B,GAEjB31N,KAAKksL,OAAOtgB,KAAK+pD,GACjB31N,KAAKqgO,gBAIb,YACI,OAAOrgO,KAGX,eACI,MAAQoxC,SAAUkvL,EAAM,QAAE7M,GAAYzzN,KAEtC,IAAK,IAAIU,EAAI,EAAGA,EAAI4/N,EAAOx/N,OAAQJ,IAAK,CACpC,MAAMmvK,EAASywD,EAAO5/N,GAAGmvK,QAAU,GAC7B/uK,EAAS+uK,EAAO/uK,OAEtB,IAAK,IAAI8vC,EAAI,EAAGA,EAAI9vC,EAAQ8vC,IAAK,CAC7B,MAAMw4H,EAAQyG,EAAOj/H,GACrB,GAAIw4H,IAA2B,IAAlBA,EAAMgD,SAAqBhD,EAAMm3D,aAAen3D,EAAMm3D,YAAY9M,GAC3E,GAAIrqD,EAAMo3D,eACNp3D,EAAMo3D,qBACH,CACH,MAAM,MAAE1hG,EAAK,KAAE4yE,GAAStoC,EAEpBtqC,GAASA,EAAMp/H,QAAQ0sK,UACnBttC,EAAM2hG,gBACN3hG,EAAM2hG,eAAehN,GAEzB30F,EAAMp/H,QAAQioM,QAAS,GAGvB+J,GAAQA,EAAKhyM,QAAQ0sK,UACrBslC,EAAKhyM,QAAQioM,QAAS,MAQ9C,UACI1gJ,MAAM9N,iBAECn5C,KAAKqmB,QAIpB,GAAeplB,UAAU8mM,aAAc,EAExB,IAAA,GAAA,GC/Ef,MAAM,WAAa,GACf,YAAYroM,GACRunD,MAAMvnD,GAENM,KAAKsuB,GAoMF,OAASoyM,KAlMZ1gO,KAAK0wM,cAEL1wM,KAAK4sE,QAAU,IAAI,GAEnB5sE,KAAKyoN,eAAiB,IAAI,GAAe,GAAIzoN,MAC7CA,KAAKq6H,OAAOr6H,KAAK4sE,SAEjB5sE,KAAKizM,KAAO,GACZjzM,KAAKsgO,OAAS,GAGlB,cACI,IAAIryB,EAAejuM,KAAKN,QAAQg5G,MAC5B,GAASu1F,KACTA,EAAe7M,GAAW,GAAI6M,EAAc,CACxCvyB,MAAOuyB,EAAanqK,SACpBA,SAAUuiI,MAIlBrmK,KAAK04G,MAAQ,GAAMioH,WAAW1yB,EAAcjuM,KAAM,GAAKiB,UAAUvB,QAAQg5G,OAG7E,WAAWijE,GACP37K,KAAK4sE,QAAQytD,OAAOshD,GACpB37K,KAAKizM,KAAK5vM,KAAKs4K,GACfA,EAAKq3B,KAAOhzM,KAGhB,aAAa27K,EAAM70D,GACf9mH,KAAK4sE,QAAQytD,OAAOshD,GACpB37K,KAAKizM,KAAKj5L,OAAO8sG,EAAK,EAAG60D,GACzBA,EAAKq3B,KAAOhzM,KAGhB,YAAY8hM,GACJ9hM,KAAKyoN,eAAepiM,SAAWrmB,KAAK4sE,SACpC5sE,KAAK4sE,QAAQytD,OAAOr6H,KAAKyoN,gBAG7BzoN,KAAKsgO,OAAOj9N,KAAKy+L,GACjB9hM,KAAKyoN,eAAepuF,OAAOynE,GAC3BA,EAAMkR,KAAOhzM,KAGjB,QACI,MAAM6yM,EAAW7yM,KAAKqmB,OAEtB,GAAIwsL,EAAU,CACV,IAAK,IAAInyM,EAAI,EAAGA,EAAIV,KAAKizM,KAAKnyM,OAAQJ,IAClCmyM,EAAS+tB,WAAW5gO,KAAKizM,KAAKvyM,IAGlC,IAAK,IAAIA,EAAI,EAAGA,EAAIV,KAAKsgO,OAAOx/N,OAAQJ,IACpCmyM,EAASguB,YAAY7gO,KAAKsgO,OAAO5/N,IAIzCV,KAAKizM,KAAO,GACZjzM,KAAKsgO,OAAS,GAEdtgO,KAAK4sE,QAAQzzB,UACbn5C,KAAK4sE,QAAQx7B,SAAW,GACxBpxC,KAAKyoN,eAAer3K,SAAW,GAGnC,OAAOizJ,GAEH,IAAIz3H,EACA,GAAK5sE,KAAKoxC,YAAcpxC,KAAK4sE,UAC7BA,EAAU5sE,KAAKoxC,SAAS1tC,OAG5BujD,MAAM4/I,OAAOxC,GAETz3H,GACA5sE,KAAKoxC,SAAS/tC,KAAKupE,GAGnB5sE,KAAK04G,QACL14G,KAAK0pM,WAAWh4B,IAAM1xK,KAAK04G,MAAM4hE,IAAIzQ,UAI7C,cACI,MAAMp9H,EAAQwa,MAAM+iJ,cAGpB,OAFAv9J,EAAM2iJ,QAAU,GAET3iJ,EAGX,iBACQzsC,KAAKN,QAAQ0sK,SACbpsK,KAAK0jN,kBAIb,YACI,OAAO1jN,KAGX,WACI,OAAOA,KAGX,kBACI,MAAMizM,EAAOjzM,KAAKizM,KACZ6tB,EAAU7tB,EAAKtpM,OAAO3J,KAAKqmB,OAAO4sL,MAClC8tB,EAAa,GACbC,EAAa,GAInB,IAAK,IAAItgO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMi7K,EAAOs3B,EAAKvyM,GACZ+qM,EAAW9vB,EAAKj8K,QAAQ+rM,SACxBmG,EAAYnG,EAAWs1B,EAAaC,EAC1C,IAAK,IAAIpwL,EAAI,EAAGA,EAAIkwL,EAAQhgO,OAAQ8vC,IAChC,GAAyB,IAArBghK,EAAU9wM,OAAc,CACxB,MAAMiyM,EAAU+tB,EAAQlwL,GACpB66J,IAAasH,EAAQrzM,QAAQ+rM,UAC7B,GAAOmG,EAAWj2B,EAAK+nC,gBAAgB3Q,MAO3D,UACI/yM,KAAKksL,OAAOttK,QAEZ5e,KAAK4sE,QAAQvmD,OAAS,KACtBrmB,KAAK4sE,QAAQo8H,eAAiBhpM,KAAKgpM,eAAepwK,KAAK54B,MACvDA,KAAK4sE,QAAQ46H,eACbxnM,KAAK4sE,QAAQvmD,OAASrmB,KAElBA,KAAK04G,OACL14G,KAAKksL,OAAO7xD,OAAOr6H,KAAK04G,MAAMwzE,QAGlClsL,KAAKksL,OAAO7xD,OAAOr6H,KAAK4sE,QAAQs/G,QAEhClsL,KAAKqnM,iBACLrnM,KAAKihO,eAGT,YACI,MAAMhuB,EAAOjzM,KAAKizM,KACZnyM,EAASmyM,EAAKnyM,OACdm/N,EAAY,IAAI,GAEtB,IAAK,IAAI/yL,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,MAAMyuI,EAAOs3B,EAAK/lK,GACZg0L,EAAiBvlD,EAAKj8K,QAAQ+rM,SAAWhlC,GAAID,GAC7CurC,EAAUp2B,EAAKo2B,UACrBkuB,EAAUiB,EAAiB,GAAKnvB,EAAQmvB,EAAiB,GACzDjB,EAAUiB,EAAiB,GAAKnvB,EAAQmvB,EAAiB,GAG7D,GAAqB,IAAjBjB,EAAUtuD,GAAU,CACpB,MAAMmvD,EAAU9gO,KAAKqmB,OAAO4sL,KACtBnyM,EAASggO,EAAQhgO,OAEvB,IAAK,IAAIosC,EAAM,EAAGA,EAAMpsC,EAAQosC,IAAO,CACnC,MAAMyuI,EAAOmlD,EAAQ5zL,GACrB,IAAKyuI,EAAKj8K,QAAQ+rM,SAAU,CACxB,MAAMsG,EAAUp2B,EAAKo2B,UACrBkuB,EAAUxuD,GAAKsgC,EAAQtgC,GACvBwuD,EAAUtuD,GAAKogC,EAAQpgC,KAInC,OAAOsuD,EAGX,UACI,OAAOjgO,KAAKyoN,eAAegL,QAG/B,eACI,MAAMhwI,EAAUzjF,KAAK+mM,aACjBtjH,GACAA,EAAQ27I,OjDhHA,aiDgHoB,CACxBpsB,KAAM,IAAI,GAAUhzM,MACpBgU,MAAOhU,KAAKmhO,UACZ12N,KAAMzK,KAAKN,QAAQ+K,QAMnC,IAAIi2N,GAAK,EAMT,GAAKz/N,UAAU8mM,aAAc,EAE7BnE,GAAkB,GAAM,CACpBxU,QAAS,EACT8Z,aAAa,EACbxwF,MAAO,CACHgjE,MAAOzV,IAEXmG,SAAS,IAGE,IAAA,GAAA,GC9NA,SAASg1D,GAAgBxtN,EAAO6gC,GAC3B,OAAZA,GACA7gC,EAAMvQ,KAAKoxC,GCAJ,SAAS4sL,GAAe54B,EAAQ3gC,EAAQ9zJ,GACnD,MAAMo4J,EAAUtE,EAAOsE,QACvB,GAAI,GAAQA,GACR,OAAOA,EAGX,MAAMk1D,EAAkB74B,EAAO64B,gBAC/B,OAAIA,EACOA,EAAgBttN,QAD3B,ECLW,SAASutN,GAAa94B,GACjC,MAAMrpL,EAAOqpL,EAAOrpL,KACdywJ,EAAS,GACf,IAAIzoI,EAAM,EACNxR,EAAQ,EAEZ,IAAK,IAAIsX,EAAM,EAAGA,EAAM9tB,EAAKte,OAAQosC,IAAO,CACxC,MAAM+8J,EAAY,GAAa5zL,QAAQu7M,UAAUnpB,EAAQv7J,GACzD,IAAI7hC,EAAQ4+L,EAAUyf,YAAYr+M,MAG9B5C,GAAS4C,KACTA,EAAQoG,WAAWpG,IAGnB6vB,GAAS7vB,IACT4+L,EAAU79B,SAA4D,IAAlDi1D,GAAe54B,EAAQwB,EAAUniC,OAAQ56H,GAE7D+8J,EAAU5+L,MAAQ9B,KAAK+mC,IAAIjlC,GAC3BwkK,EAAOxsK,KAAK4mM,GAERA,EAAU79B,UACVhlI,GAAO6iK,EAAU5+L,OAGP,IAAVA,GACAuqB,KAGJi6I,EAAOxsK,KAAK,MAIpB,MAAO,CACH64H,MAAO90F,EACPyoI,OAAQA,EACRj6I,MAAOA,GCxCA,SAAS4rM,GAAiBviO,EAAGC,GACxC,OAAID,GAAKC,EACED,EAAEuH,gBAAkBtH,EAAEsH,cAG1BvH,IAAMC,ECHF,SAASuiO,GAAmBh5B,EAAQl2L,GAC/C,MAAM7K,EAAS,GAET+hN,EAAc,GAAG9/M,OAAO4I,GAC9B,IAAK,IAAI26B,EAAM,EAAGA,EAAMu7J,EAAO3nM,OAAQosC,IAAO,CAC1C,MAAMujL,EAAgBhoB,EAAOv7J,GACzB+G,GAAQw8K,EAAcntN,KAAMmmN,IAC5B/hN,EAAOrE,KAAKotN,GAIpB,OAAO/oN,ECVI,SAASg6N,GAAa56D,EAAOqiD,EAAKnnB,GAC7C,GAAY,OAARmnB,EACA,OAAOA,EAGX,MAAM1zM,EAAM,SAAWqxJ,EACvB,IAAIz7J,EAAQ89M,EAAI1zM,GAOhB,OALKpK,IACDA,EAAQq2L,GAAUM,EAAa,GAAOl7B,EAAP,CAAoBqiD,IACnDA,EAAI1zM,GAAOpK,GAGRA,ECZI,SAASs2N,GAAWvf,EAAawf,GAC5C,MAAMt+N,EAAO8+M,EAAY9+M,KACnBu+N,EAAeD,aAA0BnpN,KAE/C,OAASnV,GAAQu+N,GAAiBL,GAAiBl+N,EAAMyiK,ICR9C,SAAS+7D,GAAkBluN,GACtC,OAAwB,IAAjBA,EAAM9S,OAAe8S,EAAM,GAAKA,ECG3C,MAAMmuN,GAAa,QAUnB,SAAS,GAASt5B,EAAQxoJ,GACtB,MACMypK,EADS,GAAarzM,QAAQu7M,UAAUnpB,EAAQ,KAAMxoJ,GACjCypK,YAE3B,IAAK,IAAI5iD,KAAS4iD,EACd,GAAI5oB,GAAoB4oB,EAAY5iD,IAChC,OAAO,EAKnB,SAASk7D,IAAS,MAAEz+N,EAAK,IAAEyG,EAAG,IAAER,EAAG,IAAEoS,EAAG,OAAEq0G,EAAM,QAAEgyG,EAAO,OAAEx5B,IACvD,IAAIy5B,EAAeC,EACfj1L,EAAM3pC,EACV,EAAA,CACI2pC,GAAOljC,EAGHi4N,EAAQ/0L,KACRi1L,EAAWlyG,EAAO/iF,GAClBg1L,EAAgB,GAASz5B,EAAQ05B,EAASliL,aAEzCz2C,GAAO0jC,GAAOA,GAAOtxB,IAAQsmN,GAEtC,GAAIA,EACA,OAAOC,EAIA,SAASC,GAAuB35B,EAAQpqK,EAAOzI,EAAOq6F,EAAQgyG,GACzE,MAAM,IAAEz4N,EAAG,IAAEoS,GAAQyiB,EACfgkM,EAAc74N,EAAM,GAAKA,EAAMosB,EAC/B0sM,EAAc1mN,EAAM,EAAIga,EAE9B,GAAIysM,GAAeC,EAAa,CAE5B,IAAI/0D,EAAUC,EACd,G1DhCY,gB0DbpB,SAA6Bi7B,GACzB,OAAIA,EAAOysB,cACAzsB,EAAOysB,cAGX6M,GAAWn5N,KAAK6/L,EAAOnlM,OAASmlM,EAAOjnL,MAAQ0nJ,G1DQtC,c0DbpB,CA2CkDu/B,GAGlC45B,IACA90D,EAAWt9C,EAAOzmH,EAAM,IAGxB84N,IACA90D,EAAWv9C,EAAOr0G,EAAM,QAEzB,CACH,IAAIumN,EAAUD,EACVG,IACAF,EAAWlyG,EAAOzmH,EAAM,GACxB04N,EAAgB,GAASz5B,EAAQ05B,EAASliL,MAYtCstH,EAXC20D,EAWUC,EAVAH,GAAS,CAChBz+N,MAAOiG,EACPQ,KAAM,EACNR,IAAK,EACLoS,IAAKga,EAAQ,EACbq6F,OAAQA,EACRgyG,QAASA,EACTx5B,OAAQA,KAOhB65B,IACAH,EAAWlyG,EAAOr0G,EAAM,GACxBsmN,EAAgB,GAASz5B,EAAQ05B,EAASliL,MAYtCutH,EAXC00D,EAWUC,EAVAH,GAAS,CAChBz+N,MAAOqY,EACP5R,IAAK,EACLR,IAAK,EACLoS,IAAKga,EAAQ,EACbq6F,OAAQA,EACRgyG,QAASA,EACTx5B,OAAQA,KAQpBl7B,IACAk7B,EAAOmvB,oBAAsBrqD,GAG7BC,IACAi7B,EAAO85B,oBAAsB/0D,IC7FzC,MAAM,WAAqB,GACvB,YAAYi7B,EAAQ/oM,EAASsnM,GACzB//I,MAAMvnD,GAENM,KAAKuwM,WAAW9H,EAAQ/oM,GACxBM,KAAKyoM,OAASA,EACdzoM,KAAKwiO,aACLxiO,KAAKsgO,OAAS,GACdtgO,KAAKN,QAAQ+iO,OAASziO,KAAKN,QAAQ+iO,QAAU,GAC7CziO,KAAKN,QAAQ+iO,OAAOrvK,MAAQ,GAC5BpzD,KAAKizM,KAAO,GACZjzM,KAAK0iO,WAAa,GAClB1iO,KAAKgnM,aAAeA,EACpBhnM,KAAK2iO,gBAAkBjjO,EAEvBM,KAAK4iO,cACL5iO,KAAKgmL,SACLhmL,KAAK6iO,mBAGT,cAEA,aACI,MAAMp6B,EAASzoM,KAAKyoM,OAEpB,IAAK,IAAI/nM,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAC/B+nM,EAAO/nM,GAAGsT,MAAQtT,EAI1B,cACI,MAAMutM,EAAejuM,KAAKN,QAAQg5G,OAAS,GACrCoqH,EAAe9iO,KAAKN,QAAQojO,aAC5BC,EAAc/iO,KAAKN,QAAQsjO,OAAS,GACpCC,EAAc15N,KAAKqS,IAAImnN,EAAYjiO,OAAQ,GAC3CkiO,EAAQ,GAERpiO,EAAWwgM,GAAW,CACxB1oF,MAAO,CACHgzD,MAAOuiC,EAAaviC,QAEzBo3D,GAEH,IAAK,IAAIpiO,EAAI,EAAGA,EAAIuiO,EAAaviO,IAAK,CAClC,MAAMhB,EAAU0hM,GAAW,GAAIxgM,EAAUmiO,EAAYriO,IACjD+H,GAAS/I,EAAQg5G,SACjBh5G,EAAQg5G,MAAQ0oF,GAAW,CAAEp9G,KAAMtkF,EAAQg5G,OAAS93G,EAAS83G,QAGjE,MAAMwqH,EAAc,IAAI,GAAKxjO,GAC7BwjO,EAAY/B,UAAYzgO,EAExBsiO,EAAM3/N,KAAK6/N,GACXljO,KAAKq6H,OAAO6oG,GAGhBljO,KAAKgjO,MAAQA,EAGjB,iBAAiBA,EAAQhjO,KAAKgjO,OAC1B,IAAK,IAAItiO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMsyM,EAAOgwB,EAAMtiO,GACnB,IAAK,IAAIkwC,EAAI,EAAGA,EAAIoiK,EAAKC,KAAKnyM,OAAQ8vC,IAAK,CACvC,MAAM+qI,EAAOq3B,EAAKC,KAAKriK,GACvB,GAAI+qI,EAAKj8K,QAAQ2/N,WAAa1jD,EAAKj8K,QAAQ2/N,UAAUjzD,QAAS,CAC1D,MAAM+2D,EAAmB,IAAI,GAAUnjO,KAAKgnM,aAAcrrB,EAAMA,EAAKj8K,QAAQ2/N,WAE7Er/N,KAAK0iO,WAAWr/N,KAAK8/N,GACrBnwB,EAAKpmI,QAAQytD,OAAO8oG,MAMpC,iBAAiBnwB,GACb,MAAM0vB,EAAa1iO,KAAK0iO,WAClBzvB,EAAOD,EAAKC,KAElB,IAAK,IAAIvyM,EAAIgiO,EAAW5hO,OAAS,EAAGJ,GAAK,EAAGA,IACxC,IAAK,IAAIkwC,EAAI,EAAGA,EAAIqiK,EAAKnyM,OAAQ8vC,IAC7B,GAAI8xL,EAAWhiO,GAAGi7K,OAASs3B,EAAKriK,GAAI,CAChC8xL,EAAW1oN,OAAOtZ,EAAG,GACrB,OAMhB,iBACI,MAAMgiO,EAAa1iO,KAAK0iO,WACxB,IAAK,IAAIx1L,EAAM,EAAGA,EAAMw1L,EAAW5hO,OAAQosC,IACvCw1L,EAAWx1L,GAAKwoK,OAIxB,SAASjrM,GACL,MAAMu4N,EAAQhjO,KAAKgjO,MACnB,IAAII,EAEJ,IAAK,IAAI1iO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAC9B,GAAIsiO,EAAMtiO,GAAGhB,QAAQ+K,OAASA,EAAM,CAChC24N,EAAeJ,EAAMtiO,GACrB,MAIR,OAAO0iO,GAAgBJ,EAAM,GAGjC,cAAc55D,GACV,MAAM45D,EAAQhjO,KAAKgjO,MACnB,IAAII,EAEJ,IAAK,IAAI1iO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAC9B,GAAIsiO,EAAMtiO,GAAG45K,IAAIvP,cAAc3B,GAAQ,CACnCg6D,EAAeJ,EAAMtiO,GACrB,MAIR,OAAO0iO,EAGX,WAAWznD,GACM37K,KAAKqjO,SAAS1nD,EAAKj8K,QAAQszM,MAEnCswB,WAAW3nD,GAChB37K,KAAKizM,KAAK5vM,KAAKs4K,GACfA,EAAKk3B,SAAW7yM,KAGpB,WAAWujO,GACP,MAAMC,EAAe,GAErB,IAAK,IAAI9iO,EAAI,EAAGA,EAAIV,KAAKizM,KAAKnyM,OAAQJ,IAAK,CACvC,MAAMi7K,EAAO37K,KAAKizM,KAAKvyM,GACnB6iO,IAAiB5nD,EACjB6nD,EAAangO,KAAKs4K,GAElBA,EAAKxiI,UAIbn5C,KAAKizM,KAAOuwB,EAGhB,YAAY1hC,EAAOkR,GACfhzM,KAAKsgO,OAAOj9N,KAAKy+L,GACbkR,EACAA,EAAKywB,YAAY3hC,GAEjB9hM,KAAKq6H,OAAOynE,GAIpB,YAAY4hC,GACR,MAAMC,EAAiB,GAEvB,IAAK,IAAIjjO,EAAI,EAAGA,EAAIV,KAAKsgO,OAAOx/N,OAAQJ,IAAK,CACzC,MAAMohM,EAAQ9hM,KAAKsgO,OAAO5/N,GACtBohM,IAAU4hC,EACVC,EAAetgO,KAAKy+L,GAEpBA,EAAM3oJ,UAIdn5C,KAAKsgO,OAASqD,EAGlB,YAAYl7B,GACR,MAAM7yK,EAAQ6yK,EAAO3nM,OACf2hO,EAASziO,KAAKN,QAAQ+iO,OACtBzyB,EAASyyB,EAAOzyB,QAAU,GAC1B4zB,EAAgBnB,EAAOmB,eAAiB,GACxCC,EAAsBD,EAAc5zB,QAAU,GAC9C5wL,EAAO,GAEb,IAAK,IAAI1e,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAM+vN,EAAgBhoB,EAAO/nM,GACvBojO,GAA0C,IAA1BrT,EAAcrkD,QACpC,IAAsC,IAAlCqkD,EAAcsT,gBACd,SAGJ,IAAI//I,EAAOysI,EAAchmN,KACzB,MAAM+oM,EAAgBswB,EAAgBthC,GAAYwN,GAAUxN,GAAYqhC,IAAwBrhC,GAAYwN,GACxGwD,IACAxvH,EAAOwvH,EAAc,CACjBxvH,KAAM,GAASA,GAAQA,EAAO,GAC9BykH,OAAQgoB,KAIhB,MAAM7vN,EAAW6vN,EAAcP,UAC/B,IAKI8T,EAAkBC,EALlBv4D,EAAQ+kD,EAAc/kD,MACtB,GAAWA,IAAU9qK,IACrB8qK,EAAQ9qK,EAAS8qK,OAIjBo4D,GACAE,EAAmB,GACnBC,EAAcv4D,IAEds4D,EAAmB,CACft4D,MAAOm4D,EAAoBn4D,MAC3BsP,KAAM6oD,EAAoB7oD,MAE9BipD,EAAcL,EAAcjR,QAAQjnD,OAGpC,GAAS1nF,IAAkB,KAATA,GAClB5kE,EAAK/b,KAAK,CACN2gF,KAAMA,EACNgsH,OAAQg0B,EACRC,YAAaA,EACbx7B,OAAQgoB,EACRrlK,OAAQ04K,IAKpB,GAAOrB,EAAOrvK,MAAOh0C,GAGzB,UAAU4jN,GACN,MAAMkB,EAAQ,GACRC,EAAQ,GAEd,IAAK,IAAIC,EAAS,EAAGA,EAASpB,EAAMliO,OAAQsjO,IAAU,CAClD,MAAMC,EAAWrB,EAAMoB,GAAQnxB,KAC/B,IAAK,IAAIqxB,EAAS,EAAGA,EAASD,EAASvjO,OAAQwjO,IAAU,CACrD,MAAM3oD,EAAO0oD,EAASC,GAClB3oD,EAAKj8K,QAAQ+rM,SACb04B,EAAM9gO,KAAKs4K,GAEXuoD,EAAM7gO,KAAKs4K,IAKvB,MAAO,CAAE3wI,EAAGk5L,EAAO/zL,EAAGg0L,EAAOI,IAAKL,EAAMv6N,OAAOw6N,IAGnD,oBACI,MAAM17B,EAASzoM,KAAKyoM,OACd+7B,EAAe,GAErB,IAAK,IAAI9jO,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,MAAM+vN,EAAgBhoB,EAAO/nM,GACvBsyM,EAAOhzM,KAAKykO,eAAehU,GAE7B+T,EAAaxxB,GACbwxB,EAAaxxB,GAAM3vM,KAAKotN,GAExB+T,EAAaxxB,GAAQ,CAAEyd,GAI/B,OAAO+T,EAGX,oBAAoB/7B,GAChB,MAAM/gM,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,MAAM+vN,EAAgBhoB,EAAO/nM,IACC,IAA1B+vN,EAAcrkD,SACd1kK,EAAOrE,KAAKotN,GAIpB,OAAO/oN,EAGX,OAAO28L,GACH,MACM2+B,EAAQhjO,KAAKgjO,MACb/5B,EAASzH,GAFCxhM,KAAKN,QAAQmzM,SAEK5J,QAElCjpM,KAAKs6K,IAAM+pB,EAAUhuK,QAAQozK,MAAMR,GACnCjpM,KAAK0kO,cAEL1kO,KAAK2kO,eACL3kO,KAAK4kO,WAAW5B,GAChBhjO,KAAK6kO,aAAa7B,GAGtB,OAAOA,GACH,MAAM8B,EAAa,GAAGn7N,OAAOq5N,GAC7BhjO,KAAKwiO,aAGL,MAAMz4N,EAAO/J,KAAK8mM,UACd/8L,GACAA,EAAKg7N,iBAGT,IAAK,IAAIrkO,EAAI,EAAGA,EAAIokO,EAAWhkO,OAAQJ,IACnCV,KAAKglO,iBAAiBF,EAAWpkO,IACjCokO,EAAWpkO,GAAGL,QAGlBL,KAAKgmL,OAAO8+C,GACZ9kO,KAAK2kO,eACL3kO,KAAK4kO,WAAW5kO,KAAKgjO,OACrBhjO,KAAK6kO,aAAaC,GAElB9kO,KAAK6iO,iBAAiBiC,GAEtB,IAAK,IAAIpkO,EAAI,EAAGA,EAAIokO,EAAWhkO,OAAQJ,IACnCokO,EAAWpkO,GAAGukO,UAItB,mBAAmBtpD,EAAMupD,GACrB,MAAMxlO,EAAUi8K,EAAKj8K,QACfylO,EAAiB,GAAGx7N,OACtBjK,EAAQ2iN,oBAAsB3iN,EAAQs3M,mBAEpCouB,EAAcF,EAAapkO,OAASqkO,EAAerkO,OACnD+xB,EAAesyM,EAAe,IAAM,EAE1C,IAAK,IAAIzkO,EAAI,EAAGA,EAAI0kO,EAAa1kO,IAC7BykO,EAAe9hO,KAAKwvB,GAGxB,OAAOsyM,EAGX,YAAYxpD,EAAM0pD,EAAYrO,EAAesO,GACzC,MAAM9vB,EAAO75B,EAAKy3B,QAAQ4jB,EAAeA,GAAe,GAClDuO,EAAW5pD,EAAKj8K,QAAQyc,QAAU,EAAI,EACtCqiN,EAAa6G,EAAWjyB,QAAQkyB,EAAqBA,GAAqB,GAC1EE,EAAaH,EAAW3lO,QAAQyc,QAAU,EAAI,EAC9CspN,EAAU9pD,EAAKrB,IAAIjR,UACrBm1D,EAAWh4D,GAAIg/D,GAAchwB,EAAKhvC,GAAI++D,GACtC/G,EAAW/3D,GAAI++D,GAAchwB,EAAK/uC,GAAI8+D,IAGtC5pD,EAAKq3B,OAASqyB,EAAWryB,MACzByyB,EAAQp8D,UAAU,EAAGsS,EAAKq3B,KAAK14B,IAAI5I,GAAK2zD,EAAWryB,KAAK14B,IAAI5I,IAGhEiK,EAAKkrB,OAAO4+B,GAGhB,UAAUvB,EAAOC,GACb,MAAMuB,EAAUxB,EAAM,GAChByB,EAAUxB,EAAM,GAChByB,EAAmB5lO,KAAKqiN,mBAAmBqjB,EAASvB,GACpD0B,EAAmB7lO,KAAKqiN,mBAAmBsjB,EAASzB,GACpD4B,EAAc,GACdC,EAAe,GACfC,EAAa,GACbC,EAAgB,GAEtB,IAAK,IAAIvlO,EAAI,EAAGA,EAAIyjO,EAAMrjO,OAAQJ,IAAK,CACnC,MAAMi7K,EAAOwoD,EAAMzjO,GACbsyM,EAAOr3B,EAAKq3B,KACZkzB,EAASlzB,EAAK1kL,GACd89I,GAAmC,IAAzBuP,EAAKj8K,QAAQ0sK,QAGvBnxF,EAASkrJ,GAAWjC,EAAOlxB,IAAS0yB,EAC1C,IAAIU,EAAkBR,EAElB3qJ,IAAWyqJ,IACXU,EAAkBpmO,KAAKqiN,mBAAmBpnI,EAAQkpJ,IAGtDnkO,KAAKqmO,YAAY1qD,EAAM1gG,EAAQ4qJ,EAAiBnlO,GAAI0lO,EAAgB1lO,IAEhEi7K,EAAKj8K,QAAQ4mO,WAIb,GAAM3qD,EAAKo2B,UAAUtgC,MAAQ,GAAMx2F,EAAO82H,UAAUtgC,MAEhDq0D,EAAYI,IACZvqD,EAAKkrB,OAAOlrB,EAAKrB,IACZ80B,QAAQ02B,EAAYI,GAAQ5rD,IAAKrU,IACjCoD,WAAWsS,EAAKj8K,QAAQupM,OAAQ,IAIrC78B,IACA05D,EAAYI,GAAUvqD,IAI1B,GAAMA,EAAKo2B,UAAUpgC,MAAQ,GAAM12F,EAAO82H,UAAUpgC,MAE/CgK,EAAK4qD,YACN5qD,EAAKj8K,QAAQswM,OAAOoB,QAAUz1B,EAAKj8K,QAAQswM,OAAOoB,OAClDz1B,EAAK4qD,WAAY,GAGrBvmO,KAAKqmO,YAAY1qD,EAAM1gG,EAAQ4qJ,EAAiBnlO,GAAI0lO,EAAgB1lO,IAGhEqlO,EAAaG,IACbvqD,EAAKkrB,OAAOlrB,EAAKrB,IACZ80B,QAAQ22B,EAAaG,GAAQ5rD,IAAKlU,IAClCiD,UAAUsS,EAAKj8K,QAAQupM,OAAQ,IAIpC78B,IACA25D,EAAaG,GAAUvqD,IAIrB,IAANj7K,GAAWilO,EAAQ3yB,OAASr3B,EAAKq3B,OACjCr3B,EAAKyzB,QAAQu2B,GACbhqD,EAAKkrB,OAAOlrB,EAAKrB,OAIzB,IAAK,IAAI55K,EAAI,EAAGA,EAAIwjO,EAAMpjO,OAAQJ,IAAK,CACnC,MAAMi7K,EAAOuoD,EAAMxjO,GACbsyM,EAAOr3B,EAAKq3B,KACZkzB,EAASlzB,EAAK1kL,GACd89I,GAAmC,IAAzBuP,EAAKj8K,QAAQ0sK,QAGvBnxF,EAASkrJ,GAAWhC,EAAOnxB,IAAS2yB,EAC1C,IAAIS,EAAkBP,EAClB5qJ,IAAW0qJ,IACXS,EAAkBpmO,KAAKqiN,mBAAmBpnI,EAAQipJ,IAGtDlkO,KAAKqmO,YAAY1qD,EAAM1gG,EAAQ2qJ,EAAiBllO,GAAI0lO,EAAgB1lO,IAEhEi7K,EAAKj8K,QAAQ4mO,WAIb,GAAM3qD,EAAKo2B,UAAUrgC,MAAQ,GAAMz2F,EAAO82H,UAAUrgC,MAE/CiK,EAAK4qD,YACN5qD,EAAKj8K,QAAQswM,OAAOoB,QAAUz1B,EAAKj8K,QAAQswM,OAAOoB,OAClDz1B,EAAK4qD,WAAY,GAErBvmO,KAAKqmO,YAAY1qD,EAAM1gG,EAAQ2qJ,EAAiBllO,GAAI0lO,EAAgB1lO,IAGhEslO,EAAWE,IACXvqD,EAAKkrB,OAAOlrB,EAAKrB,IACZ80B,QAAQ42B,EAAWE,GAAQ5rD,IAAKjU,IAChCgD,UAAU,GAAIsS,EAAKj8K,QAAQupM,SAIhC78B,IACA45D,EAAWE,GAAUvqD,IAIzB,GAAMA,EAAKo2B,UAAUngC,G9ThdN,K8Tgd+B,GAAM32F,EAAO82H,UAAUngC,G9ThdtD,K8TkdXq0D,EAAcC,IACdvqD,EAAKkrB,OAAOlrB,EAAKrB,IACZ80B,QAAQ62B,EAAcC,GAAQ5rD,IAAK1U,IACnCyD,UAAU,EAAGsS,EAAKj8K,QAAQupM,SAI/B78B,IACA65D,EAAcC,GAAUvqD,IAItB,IAANj7K,IACAi7K,EAAKyzB,QAAQs2B,GACb/pD,EAAKkrB,OAAOlrB,EAAKrB,QAK7B,gBAAgB0oD,GACZ,MAAM/vB,EAAOjzM,KAAKwmO,UAAUxD,GAAOuB,IAC7BkB,EAAUgB,GAAaxzB,GAC7B,IAAIyzB,EAAY,EAEhB,IAAK,IAAIhmO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMwiO,EAAcF,EAAMtiO,GAEtBwiO,EAAYjwB,KAAKnyM,OAAS,IAC1B4lO,EAAYn9N,KAAKqS,IACb8qN,EACAjB,EAAQr1L,QAAU8yL,EAAYx5B,WAAWt5J,UAKrD,GAAkB,IAAds2L,EACA,IAAK,IAAIhmO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMs/N,EAAc/sB,EAAKvyM,GAEpBs/N,EAAYtgO,QAAQ+rM,UACrBu0B,EAAYn5B,OAAOm5B,EAAY1lD,IAAIoqB,OAAOgiC,EAAW,KAMrE,iBAAiB1D,GACb,IAAI2D,EAEJ,IAAK,IAAIjmO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMwiO,EAAcF,EAAMtiO,GACpBuyM,EAAOiwB,EAAYjwB,KACnB2zB,EAAYr9N,KAAKqS,IAAI,EAAG6qN,GAAaxzB,GAAMppC,SAAWq5D,EAAYx5B,WAAW7/B,UAEnF,GAAkB,IAAd+8D,EAAiB,CACjB,IAAK,IAAIh2L,EAAI,EAAGA,EAAIqiK,EAAKnyM,OAAQ8vC,IAAK,CAClC,MAAMovL,EAAc/sB,EAAKriK,GAErBovL,EAAYtgO,QAAQ+rM,UACpBu0B,EAAYn5B,OACRm5B,EAAY1lD,IAAIoqB,OAAO,EAAGkiC,IAItCD,GAAW,GAInB,OAAOA,EAGX,QAAQ3D,GACJ,MAAM/vB,EAAOjzM,KAAKwmO,UAAUxD,GAAOuB,IACnC,IAAIsC,EAAU,EAEd,IAAK,IAAInmO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMwiO,EAAcF,EAAMtiO,GACpB2jO,EAAWnB,EAAYjwB,KACvB6zB,EAAU5D,EAAYx5B,WAE5B,GAAI26B,EAASvjO,OAAS,EAAG,CACrB,MAAM2kO,EAAUgB,GAAapC,GAEvB0C,EAAUx9N,KAAKqS,IAAIkrN,EAAQp1D,GAAK+zD,EAAQ/zD,GAAIo1D,EAAQl1D,GAAK6zD,EAAQ7zD,IAGvEi1D,EAAUt9N,KAAKqS,IAAIirN,EAASC,EAAQr1D,GAAKg0D,EAAQh0D,IAGjD,IAAK,IAAI7gI,EAAI,EAAGA,EAAIyzL,EAASvjO,OAAQ8vC,IAAK,CACtC,MAAMovL,EAAcqE,EAASzzL,GAE7BovL,EAAYn5B,OACRm5B,EAAY1lD,IAAIjR,UAAU,EAAG09D,MAM7C,IAAK,IAAIrmO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMs/N,EAAc/sB,EAAKvyM,GAEzBs/N,EAAYn5B,OACRm5B,EAAY1lD,IAAIjR,UAAUw9D,EAAS,KAK/C,WAAW7D,GACP,MAAM/vB,EAAOjzM,KAAKwmO,UAAUxD,GAE5B,IAAK,IAAItiO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAC9BV,KAAKgnO,eAAehE,EAAMtiO,IAG1BuyM,EAAKjoK,EAAElqC,OAAS,GAAKmyM,EAAK9iK,EAAErvC,OAAS,IACrCd,KAAKinO,UAAUh0B,EAAKjoK,EAAGioK,EAAK9iK,GAC5BnwC,KAAKknO,gBAAgBlE,GAErBhjO,KAAKmnO,qBAAqBl0B,GAE1BjzM,KAAKinO,UAAUh0B,EAAKjoK,EAAGioK,EAAK9iK,GACxBnwC,KAAKknO,gBAAgBlE,IACrBhjO,KAAKinO,UAAUh0B,EAAKjoK,EAAGioK,EAAK9iK,GAGhCnwC,KAAKonO,iBAAiBpE,GACtBhjO,KAAKinO,UAAUh0B,EAAKjoK,EAAGioK,EAAK9iK,GAExBnwC,KAAKonO,iBAAiBpE,IACtBhjO,KAAKinO,UAAUh0B,EAAKjoK,EAAGioK,EAAK9iK,GAGhCnwC,KAAKqnO,QAAQrE,IAIrB,qBAAqBsE,GACjB,MAAM,MAAEtE,GAAUhjO,KACZizM,EAAOs0B,GAAYvE,GACzB,IAAIwE,EAEJ,IAAK,IAAIt6L,EAAM,EAAGA,EAAM+lK,EAAKnyM,OAAQosC,IACpB+lK,EAAK/lK,GACT8jK,qBACLw2B,GAAU,GAIlB,GAAIA,EAAS,CACT,IAAK,IAAIt6L,EAAM,EAAGA,EAAM81L,EAAMliO,OAAQosC,IAClCltC,KAAKgnO,eAAehE,EAAM91L,IAG1Bo6L,EAAYt8L,EAAElqC,OAAS,GAAKwmO,EAAYn3L,EAAErvC,OAAS,IACnDd,KAAKinO,UAAUK,EAAYt8L,EAAGs8L,EAAYn3L,GAC1CnwC,KAAKknO,gBAAgBlE,KAKjC,eAAehwB,GACX,MAAMC,EAAOD,EAAKC,KACZnyM,EAASmyM,EAAKnyM,OAEpB,GAAIA,EAAS,EACT,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IACxBuyM,EAAKvyM,GAAGmmM,OAAOmM,EAAKtJ,YAKhC,aAAas5B,GACT,MAAM1C,EAAStgO,KAAKsgO,OACd1qM,EAAQ0qM,EAAOx/N,OACfw5K,EAAMt6K,KAAKs6K,IAEjB,IAAK,IAAI55K,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAM+mO,EAAYnH,EAAO5/N,GAAGsyM,KACvBy0B,IAAaxzL,GAAQwzL,EAAWzE,IACjC1C,EAAO5/N,GAAGmmM,OAAOvsB,IAK7B,cACI,MAAM,IAAEA,EAAG,MAAE0oD,GAAUhjO,KACjBijO,EAAcD,EAAMliO,OAC1B,IAAI4mO,EAAkBptD,EAAIzQ,SAEtB89D,EAAkB,EAClB14G,EAAMqrD,EAAI5I,GAEd,IAAK,IAAIhxK,EAAI,EAAGA,EAAIuiO,EAAaviO,IAAK,CAClC,MAAMwiO,EAAcF,EAAMtiO,GACpBmpK,EAASq5D,EAAYxjO,QAAQmqK,OAInC,GAFAq5D,EAAYxjO,QAAQ0wC,MAAQkqI,EAAIlqI,QAE3B8yL,EAAYxjO,QAAQmqK,OAElB,CACH,GAAIA,EAAOhoK,SAAWgoK,EAAOhoK,QAAQ,KAAM,CACvC,MAAM+lO,EAAWj2N,SAASk4J,EAAQ,IAAM,IACxCq5D,EAAYxjO,QAAQmqK,OAAS+9D,EAAWttD,EAAIzQ,SAGhDq5D,EAAYr8B,OAAOvsB,EAAIjkJ,SAEvBqxM,GAAmBxE,EAAYxjO,QAAQmqK,YATvC89D,IAaR,IAAK,IAAIjnO,EAAI,EAAGA,EAAIuiO,EAAaviO,IAAK,CAClC,MAAMwiO,EAAcF,EAAMtiO,GAErBwiO,EAAYxjO,QAAQmqK,SACrBq5D,EAAYxjO,QAAQmqK,OAAS69D,EAAkBC,GAIvD,IAAK,IAAIjnO,EAAI,EAAGA,EAAIuiO,EAAaviO,IAAK,CAClC,MAAMwiO,EAAcF,EAAMtiO,GACpBomO,EAAUxsD,EACXjkJ,QACA6zF,KAAKowD,EAAI7I,GAAIxiD,GAElBi0G,EAAYr8B,OAAOigC,GAGnB73G,GAAOi0G,EAAYxjO,QAAQmqK,QAInC,gBACI,MAAMopC,EAAOjzM,KAAKizM,KACZ40B,EAAY50B,EAAKnyM,OACvB,IAAIw5K,EAEJ,IAAK,IAAI55K,EAAI,EAAGA,EAAImnO,EAAWnnO,IAAK,CAChC,MAAMonO,EAAQ70B,EAAKvyM,GAEnB,IAAK,IAAIkwC,EAAI,EAAGA,EAAIi3L,EAAWj3L,IAAK,CAChC,MAAMm3L,EAAQ90B,EAAKriK,GAEnB,GAAIk3L,EAAMpoO,QAAQ+rM,WAAas8B,EAAMroO,QAAQ+rM,SAAU,CACnD,MAAMsG,EAAU+1B,EAAM/1B,UAAU17K,QAAQ2M,KAAK+kM,EAAMh2B,WAK/Cz3B,EAHCA,EAGKA,EAAIt3I,KAAK+uK,GAFTA,IAQtB,OAAOz3B,GAAOt6K,KAAKs6K,IAGvB,cACI,MAAM0oD,EAAQhjO,KAAKgjO,MACbp4B,EAAQ,GAEd,IAAK,IAAI19J,EAAM,EAAGA,EAAM81L,EAAMliO,OAAQosC,IAClC09J,EAAMvnM,KAAK2/N,EAAM91L,GAAK+yL,aAG1B,OAAOr1B,EAGX,mBAAmBo9B,GACf,MAAMp9B,EAAQ5qM,KAAKioO,cACnB,IAAK,IAAI/6L,EAAM,EAAGA,EAAM09J,EAAM9pM,OAAQosC,IAClC86L,EAAUn/N,MAAMxF,KAAK,EAAKgoL,KAAKye,SAASc,EAAM19J,GAAK68J,WAI3D,wBAAwB3gC,GACpB,MAAMwhC,EAAQ5qM,KAAKioO,cACnB,IAAK,IAAI/6L,EAAM,EAAGA,EAAM09J,EAAM9pM,OAAQosC,IAClC,GAAI09J,EAAM19J,GAAK69H,cAAc3B,GACzB,OAAO,EAKnB,eACIniH,MAAMigJ,eAEN,MAAMxnM,EAAUM,KAAKN,QAAQmzM,SAC7B,IAAI,QAAE/kC,EAAO,WAAE87B,EAAU,OAAEP,EAAS,IAAO3pM,EAiNnD,IAAuBgsK,EACF,MADEA,EAhNGk+B,IAiNW,OAAVl+B,GAA4B,SAAVA,GAA8B,gBAAVA,GAA4B,GAAQA,KAhNzFk+B,EAAarjC,GACbuH,EAAU,GAGd,MAAMo6D,EAAKloO,KAAK6oN,UAAY,IAAI,EAAKz9B,UAAU,CAC3CttL,KAAM,CACF4tK,MAAOk+B,EACP97B,QAASA,GAEbnB,OAAQ,CACJjB,MAAO29B,EAAOj5J,MAAQi5J,EAAO39B,MAAQ,GACrCt7H,MAAOi5J,EAAOj5J,MACdg5I,SAAUigB,EAAOjgB,UAErBgG,QAAS,IAGbpvL,KAAKmoO,mBAAmBD,GAExBloO,KAAKunM,aAAa2gC,GAGtB,sBAAsB1tB,GAClB,MAAM8lB,EAAStgO,KAAKsgO,OACd54N,EAAS,GAEf,GAAsB,OAAlB8yM,EACA,IAAK,IAAI95M,EAAI,EAAGA,EAAI4/N,EAAOx/N,OAAQJ,IAAK,CAEpC,GAAgC,eADlB4/N,EAAO5/N,GACXsyM,KAAKtzM,QAAQ+K,KACnB,SAGJ,MAAMolK,EAASywD,EAAO5/N,GAAG+sN,eAAejT,GACxC,GAAI3qC,GAAUA,EAAO/uK,OACjB,IAAK,IAAI8vC,EAAI,EAAGA,EAAIi/H,EAAO/uK,OAAQ8vC,IAAK,CACpC,MAAMw4H,EAAQyG,EAAOj/H,GACjBw4H,GAAS,GAAQA,EAAM/9J,QAA0B,OAAhB+9J,EAAM/9J,OACvC3D,EAAOrE,KAAK+lK,IAOhC,OAAO1hK,EAGX,oBAAoB0gO,GAChB,OAAOpoO,KAAKqoO,cAAAA,SAAsBj/D,GAC9B,OAAOA,EAAMq/B,OAAOz0L,QAAUo0N,KAItC,mBAAmB39N,GACf,OAAOzK,KAAKqoO,cAAAA,SAAsBj/D,GAC9B,OAAOA,EAAMq/B,OAAOh+L,OAASA,KAIrC,aAAa8lB,GACT,MAAM+vM,EAAStgO,KAAKsgO,OACd54N,EAAS,GAEf,IAAK,IAAIhH,EAAI,EAAGA,EAAI4/N,EAAOx/N,OAAQJ,IAAK,CACpC,MACMmvK,EADQywD,EAAO5/N,GACAmvK,OACrB,IAAK,IAAIj/H,EAAI,EAAGA,EAAIi/H,EAAO/uK,OAAQ8vC,IAAK,CACpC,MAAMw4H,EAAQyG,EAAOj/H,GACjBw4H,IAA2B,IAAlBA,EAAMgD,SAAqB77I,EAAS64I,IAC7C1hK,EAAOrE,KAAK+lK,IAKxB,OAAO1hK,EAGX,UAAU6oB,GACN,MAAM+vM,EAAStgO,KAAKsgO,OAEpB,IAAK,IAAI5/N,EAAI,EAAGA,EAAI4/N,EAAOx/N,OAAQJ,IAAK,CACpC,MACMmvK,EADQywD,EAAO5/N,GACAmvK,OACrB,IAAK,IAAIj/H,EAAI,EAAGA,EAAIi/H,EAAO/uK,OAAQ8vC,IAAK,CACpC,MAAMw4H,EAAQyG,EAAOj/H,GACrB,GAAIw4H,IAA2B,IAAlBA,EAAMgD,SAAqB77I,EAAS64I,GAC7C,OAAOA,IAMvB,YAAYA,GACR,MAAM45D,EAAQhjO,KAAKgjO,MAEnB,IAAK,IAAItiO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMsyM,EAAOgwB,EAAMtiO,GACnB,GAAIsyM,EAAK14B,IAAIvP,cAAc3B,GACvB,OAAO4pC,GAKnB,eACI,MAAMC,EAAOjzM,KAAKwmO,UAAUxmO,KAAKgjO,OAC3BkB,EAAQjxB,EAAKjoK,EACbm5L,EAAQlxB,EAAK9iK,EAEnBnwC,KAAKsoO,sBAAsBnE,EAAOD,GAClClkO,KAAKsoO,sBAAsBpE,EAAOC,GAGtC,sBAAsBlxB,EAAMiyB,GACxB,IAAIqD,EAAiB,EAErB,IAAK,IAAI7nO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMi7K,EAAOs3B,EAAKvyM,GACZsyM,EAAOr3B,EAAKq3B,KACZ/3H,EAASkrJ,GAAWjB,EAAclyB,IAASkyB,EAAa,GAExDsD,EAAYxoO,KAAKyoO,gBAAgB9sD,EADrBj7K,EAAI6nO,EACkCttJ,GAExD,GAAIutJ,EAAW,CACXD,IAEA,MAAMzhH,EAAMksF,EAAKC,KAAKpxM,QAAQ85K,GAAQ4sD,EACtCv1B,EAAK01B,aAAaF,EAAW1hH,KAKzC,gBAAgB60D,EAAMy1C,EAAWn2I,GAC7B,MAAM41H,EAAel1B,EAAKj8K,QAAQswM,OAC5BlsK,EAAW+sK,EAAa/sK,SAI9B,G9T13BW,Q8Tu3BIA,G9Tx2BF,U8Tw2BsBA,IAGT,IAFV+sK,EAAazkC,QAGzB,OAAO,KAGX,MAAM00D,EAAU9gO,KAAKwmO,UAAUxmO,KAAKgjO,OAE9BoD,EAAkBpmO,KAAKqiN,mBAAmBpnI,EAD3BA,EAAOv7E,QAAQ+rM,SAAWq1B,EAAQ91L,EAAI81L,EAAQ3wL,GAE7D9oC,E9Tj4BK,Q8Ti4BCy8B,EACNzF,EAAQ48C,EAAO58C,QACf2mJ,EAAO39K,EAAMg3B,EAAMziB,IAAMyiB,EAAM70B,IAGrC,GAFsB,GAAW48N,EAAgBhV,GAAY/yL,EAAM70B,IAAK60B,EAAMziB,KAE1DopK,GAAS,EACzB,OAAO,KAGXohD,EAAgBpsN,OAAOo3M,EAAY,EAAG,EAAGpsC,GACzC/pG,EAAOv7E,QAAQ2iN,mBAAqB+jB,EAEpC,MAAMoC,EAAY7sD,EAAKtlJ,QAUvB,OATAslJ,EAAK/8J,QAEL4pN,EAAU9oO,QAAQ+K,UAAOyL,EACzBsyN,EAAU9oO,QAAQmuC,KAAKu+H,SAAU,EAEjCo8D,EAAU9oO,QAAQ2/N,eAAYnpN,EAC9BsyN,EAAU9oO,QAAQ8xM,WAAQt7L,EAC1BsyN,EAAU9oO,QAAQkzM,eAAY18L,EAEvBsyN,GAIf,SAASG,GAAahtD,GAClB,OAAQA,EAAKq3B,KAAKC,KAAKrsK,KAAM3nC,GACzBA,EAAES,QAAQ+rM,WAAa9vB,EAAKj8K,QAAQ+rM,UAAYxsM,IAAM08K,IAA8B,IAAtB18K,EAAES,QAAQ0sK,SAIhF,SAASq6D,GAAaxzB,GAClB,MAAMnyM,EAASmyM,EAAKnyM,OACpB,IAAIw5K,EAEJ,IAAK,IAAI55K,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAMi7K,EAAOs3B,EAAKvyM,GACZ0rK,GAAmC,IAAzBuP,EAAKj8K,QAAQ0sK,QAC7B,GAAIA,GAAWu8D,GAAahtD,GAAO,CAC/B,MAAM8pD,EAAUr5D,EAAUuP,EAAK+tB,aAAe/tB,EAAKo2B,UAE9Cz3B,EAGDA,EAAIt3I,KAAKyiM,GAFTnrD,EAAMmrD,EAAQpvM,SAO1B,OAAOikJ,GAAO,IAAI,GAGtB,SAAS6rD,GAAWlzB,EAAMD,GACtB,IAAK,IAAItyM,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMu6E,EAASg4H,EAAKvyM,GACpB,GAAIu6E,GAAUA,EAAO+3H,OAASA,EAC1B,OAAO/3H,GASnB,MAAMssJ,GAAevE,GAAUA,EAAMpkO,OAAO,CAACisJ,EAAKmoD,IAASnoD,EAAIlhJ,OAAOqpM,EAAKC,MAAO,IAElFrP,GAAkB,GAAc,CAC5B6E,OAAQ,GACRoK,SAAU,CACN5J,OAAQ,IAEZW,WAAY,GACZP,OAAQ,CACJ39B,MAAO/F,GACPv1H,MAAO,GAEX0yL,aAAc,CACVpqH,MAAO,IAEX+pH,OAAQ,CACJmB,cAAe,CACX5zB,OAAQ,CACJtkC,MAAO,WAEXinD,QAAS,CACLjnD,MAAO,eAMR,IAAA,GAAA,GC/9BA,GAVa,CACxB6mD,MAAO,SAASzwB,EAAOrvL,GACnBzS,KAAK4oO,eAAe9mC,EAAOrvL,E5DkEX,kB4D/DpBk5K,MAAO,SAASmW,EAAOrvL,GACnBzS,KAAK4oO,eAAe9mC,EAAOrvL,E5D6DX,mB6DyCxB,SAASunE,GAASwtF,EAAW3jI,EAAQx4B,GACjC,IAAIk8J,EAAY1jI,EACZijI,EAAQU,EAEZ,GAAIA,EAAU3lK,QAAQ,MAAQ,EAAG,CAC7B,MAAMkF,EAAQygK,EAAU7oK,MAAM,KAE9B,KAAOoI,EAAMjG,OAAS,GAClBgmK,EAAQ//J,EAAMgpC,QACT,GAAQw3H,EAAUT,MACnBS,EAAUT,GAAS,IAEvBS,EAAYA,EAAUT,GAE1BA,EAAQ//J,EAAMgpC,QAGlBw3H,EAAUT,GAASz7J,EAGR,IAAA,GA9Hf,cAA+B,GAC3B,YAAYo9L,EAAQ+iB,EAAQqd,GACxB5hL,QAEA,MAAMsjK,EAAkBiB,EAAOjB,gBAAgB9hB,GACzCihB,EAAc8B,EAAO9B,YAAYjhB,GACjCwhB,EAAeuB,EAAOvB,aAAaxhB,EAAQ8hB,GAC3Cue,EAAe9oO,KAAK+oO,cAAgB,GACpCnoO,EAAWioO,EAAkB9tH,MAAM0tF,EAAOnlM,MAC1C0lO,EAAgBvgC,EAAOwgC,WAAaroO,EAE1CZ,KAAKkpO,QAAUzgC,EACfzoM,KAAKmpO,QAAU3d,EAEf,IAAK,IAAI9qN,EAAI,EAAGA,EAAI6pN,EAAgBzpN,OAAQJ,IAAK,CAC7C,MAAMomK,EAAQyjD,EAAgB7pN,GAC9B,IAAI0oO,EAEJ,GAAI,GAASJ,GACTI,EAAiBJ,EAAcliE,OAC5B,CAAA,GAAU,IAANpmK,IAAWuzC,GAAQ6yH,EAAO4iD,GAGjC,MAFA0f,EAAiBJ,EAKjBI,GACAN,EAAazlO,KAAK,CACdgmO,cAAeviE,EACfr8J,KAAMw/M,EAAavpN,GACnBoX,UAAW,GAAWsxN,GAAkBA,EAAiB,GAAWA,MAMpF,gBAAgBE,EAAW/xM,GACvB,MAAQ2xM,QAASzgC,EAAQsgC,cAAeD,GAAiB9oO,KACnDof,EAAOpf,KAAKupO,YAAYD,GAAa,IACrCE,EAAgBpqN,EAAK47L,UAAU,GACrC,IAAItzM,EAAS,GAEb,GAAI8hO,IAAkBtuM,GAASsuM,KAAmB,GAAQA,GAAgB,CACtE,MAAMj3M,EAAK,aACXA,EAAGtxB,UAAYuoO,EACf9hO,EAAS,IAAI6qB,EAGjB,IAAK,IAAI7xB,EAAI,EAAGA,EAAIooO,EAAahoO,OAAQJ,IAAK,CAC1C,MAAMomK,EAAQgiE,EAAapoO,GACrB+oO,EAAYzpO,KAAK0pO,WAAWtqN,EAAKtK,OAAQgyJ,EAAMuiE,eAC/Ch+N,EAAQy7J,EAAMhvJ,UAAU2xN,EAAWhhC,EAAQrpL,EAAK47L,UAAWzjL,GAEjE,KAAc,OAAVlsB,IAAkB,GAASA,IAAW,GAAQA,EAAMvK,SAAauK,aAAiBoN,MAAO,CACzF/Q,EAAS2D,EACT,MAEI,GAAQA,IACR2uE,GAAS8sF,EAAMr8J,KAAM/C,EAAQ2D,GAKzC,OAAO3D,EAGX,YAAYmoK,GACR,MAAQs5D,QAAS3d,EAAQ0d,QAASzgC,GAAWzoM,KACvC8U,EAAS,GACTkmM,EAAY,GAElB,IAAK,IAAIt6M,EAAI,EAAGA,EAAImvK,EAAO/uK,OAAQJ,IAAK,CACpC,MAAMmpN,EAAUh6C,EAAOnvK,GAEvBoU,EAAOzR,KAAKmoN,EAAOoG,UAAUnpB,EAAQohB,IACrC7O,EAAU33M,KAAKolM,EAAOrpL,KAAKyqM,IAG/B,MAAO,CACH/0M,OAAQA,EACRkmM,UAAWA,GAInB,WAAW57L,EAAM0nJ,GACb,MAAMhyJ,EAAS,GACT8gB,EAAQxW,EAAKte,OAEnB,IAAK,IAAIJ,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAMu/C,EAAO7gC,EAAK1e,GACZgpN,EAAczpK,EAAKypK,YACzB,IAAIr+M,EAGAA,EADA,GAAQq+M,EAAY5iD,IACZ4iD,EAAY5iD,GAEZ7mH,EAAK6nH,OAAOhB,GAGxBhyJ,EAAOzR,KAAKgI,GAGhB,OAAOyJ,ICpFA,eApBT60N,UAA0B,GAC5B,cACI1iL,QAEAjnD,KAAKkwN,UAAY,GAGrB,SAASzG,EAAamgB,GAClB,IAAK,IAAIlpO,EAAI,EAAGA,EAAI+oN,EAAY3oN,OAAQJ,IACpCV,KAAKkwN,UAAUzG,EAAY/oN,IAAMkpO,EAIzC,MAAMC,GACF,OAAO7pO,KAAKkwN,UAAU2Z,WAI9BF,EAAkBtzN,QAAU,IAAIszN,QCfhC,MAAM,WAAiB,GACnB,cACI,MAAM35B,EAAShwM,KAAKN,QAAQswM,OACtB85B,EAAc1oC,GAAW,GAAI4O,EAAQA,EAAOhnM,MAC5C+gO,EAAY3oC,GAAW,GAAI4O,EAAQA,EAAO/mM,IAE5C6gO,EAAY19D,UACZpsK,KAAKgqO,UAAYhqO,KAAKiqO,aAAaH,GACnC9pO,KAAKq6H,OAAOr6H,KAAKgqO,YAGjBD,EAAU39D,UACVpsK,KAAKkqO,QAAUlqO,KAAKiqO,aAAaF,GACjC/pO,KAAKq6H,OAAOr6H,KAAKkqO,UAIzB,aAAaxqO,GACT,MAAM8zM,EAAgBhR,GAAY9iM,GAC5BuqM,EAAYjqM,KAAKiqM,YAEvB,IAAI6oB,EAQJ,OALIA,EADAtf,EACYA,EAAcvJ,GAEdjqM,KAAKusC,YAAY7sC,EAAQyK,QAGlC,IAAI,GAAS2oN,EAChB1xB,GAAW,CACPqK,SAAUzrM,KAAKN,QAAQ+rM,UAE3B/rM,GACDuqM,GAGP,OAAO5F,GACHrkM,KAAKgmL,SAEL,MAAM,UAAEgkD,EAAS,QAAEE,EAAO,MAAE7+N,GAAUrL,KAEtCA,KAAKs6K,IAAM+pB,EAEP2lC,IACAA,EAAUtqO,QAAQmxN,UAAYxlN,EAAMrC,KAAOqC,EAAMpC,GACjD+gO,EAAUnjC,OAAOxC,IAGjB6lC,IACAA,EAAQxqO,QAAQmxN,UAAYxlN,EAAMpC,GAAKoC,EAAMrC,KAC7CkhO,EAAQrjC,OAAOxC,IAGfrkM,KAAK0xM,MACL1xM,KAAK0xM,KAAK7K,OAAOxC,IAK7B,GAASpjM,UAAUL,SAAWwgM,GAAW,GAAI,GAASngM,UAAUL,SAAU,CACtEovM,OAAQ,CACJ7lM,OAAQ,aAEZ4wN,QAAS,CACL5wN,OAAQ,SAID,IAAA,GAAA,GCnEf,MAAM,WAAsB,GACxB,YACI,OAAO,GAGX,WAAWiV,GACP,OAAOA,EAAKsqM,YAGhB,iBAAiBtgD,EAAOj/J,GACpB,OAAyB,OAArBi/J,EAAM/9J,MAAMrC,MAAoC,OAAnBogK,EAAM/9J,MAAMpC,GAClC,GAGJjJ,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQi/J,EAAM/9J,MAAMrC,KAAMogK,EAAM/9J,MAAMpC,IAG/E,UAAUmgK,GACN,OAAKA,EAIE,CAAEA,EAAM/9J,MAAMrC,KAAMogK,EAAM/9J,MAAMpC,IAH5B,EAMf,YAAYoC,EAAOy8J,GACf,MAAM8mD,EAAW9mD,EAAO2gC,OAAO9sB,MACzB,KAAE3yK,EAAI,GAAEC,GAAOoC,EACrB,IAAIglN,EAAYrwN,KAAKwtN,gBAAgBoB,GAEvB,OAAVvjN,GAAkB6vB,GAASlyB,IAASkyB,GAASjyB,KAC7ConN,EAAYrwN,KAAKwtN,gBAAgBoB,GAAYyB,GAAa,CAAE7mN,IAAK08J,GAAWtqJ,IAAKuqJ,IAEjFkqD,EAAU7mN,IAAMD,KAAKC,IAAI6mN,EAAU7mN,IAAKR,GACxCqnN,EAAUz0M,IAAMrS,KAAKqS,IAAIy0M,EAAUz0M,IAAK5S,GAExCqnN,EAAU7mN,IAAMD,KAAKC,IAAI6mN,EAAU7mN,IAAKP,GACxConN,EAAUz0M,IAAMrS,KAAKqS,IAAIy0M,EAAUz0M,IAAK3S,IAIhD,UAAUmgK,GACN,MAAM/9J,EAAQ+9J,EAAM/9J,MACpB,OAAOA,EAAMrC,KAAOqC,EAAMpC,IAIlC,GAAchI,UAAUkpO,WAAa,GAAiBlpO,UAAUkpO,WAEjD,IAAA,GAAA,GChDA,GANf,cAA6B,GACzB,WACI,OAAOnqO,KAAKqmB,SCWpB,MAAM,WAAuB,GACzB,YAAYhb,EAAO3L,GACfunD,QAEAjnD,KAAKqL,MAAQA,EACbrL,KAAKN,QAAUA,EACfM,KAAK6wN,UAAY,GAAe7wN,KAAKN,QAAQmxN,WAAW,GACxD7wN,KAAK0yN,iBAAkB,EACvB1yN,KAAKoqO,mBAGT,SACI,GAAIpqO,KAAK4yN,UACL,OAGJ5yN,KAAK4yN,WAAY,EAEjB,MAAM,QAAED,EAAO,OAAE3iB,GAAWhwM,KAAKN,QAC3B2L,EAAQrL,KAAKqL,MAEbg/N,EAAYrqO,KAAKqqO,UAAY,IAAI,GAAeh/N,EAAO+1L,GAAW,GAAIphM,KAAKN,QAAS,CACtFswM,OAAQA,EAAOhnM,KACf2pN,QAASA,EAAQ3pN,QAGfshO,EAAUtqO,KAAKsqO,QAAU,IAAI,GAAej/N,EAAO+1L,GAAW,GAAIphM,KAAKN,QAAS,CAClFswM,OAAQA,EAAO/mM,GACf0pN,QAASA,EAAQ1pN,MAGrBjJ,KAAKuqO,WAAWF,GAChBrqO,KAAKuqO,WAAWD,GAEhBtqO,KAAKq6H,OAAOgwG,GACZrqO,KAAKq6H,OAAOiwG,GAGhB,OAAOjmC,GACHrkM,KAAKgmL,SAEL,MAAQh9K,KAAMwhO,EAASvhO,GAAIwhO,GAAUpmC,EAErCrkM,KAAK0qO,eAAeF,EAASC,GAE7BzqO,KAAKqqO,UAAUxjC,OAAO2jC,GACtBxqO,KAAKsqO,QAAQzjC,OAAO4jC,GAEpBzqO,KAAKs6K,IAAMt6K,KAAKqqO,UAAUhX,YAAYh9L,QAAQ2M,KAAKhjC,KAAKsqO,QAAQjX,aAGpE,kBACI,MAAM97L,EAAQ,IAAI,EAAKwlF,MAIvB,OAHAxlF,EAAM8iG,OAAOr6H,KAAKqqO,UAAUniC,mBAC5B3wK,EAAM8iG,OAAOr6H,KAAKsqO,QAAQpiC,mBAEnB3wK,EAGX,kBACI,OAAOv3B,KAAKksL,OAGhB,sBACI,MAAO,CACHxsL,QAASM,KAAKN,QACdsJ,KAAMhJ,KAAKqqO,UAAU9hC,sBACrBt/L,GAAIjJ,KAAKsqO,QAAQ/hC,uBAIzB,gBACI,MAAMkrB,EAAUzzN,KAAK+vN,MAAM/c,KAAKygB,UAGhC,IAFqBA,GAAWA,EAAQzT,SAAShgN,KAAKs6K,KAErC,CACb,MAAMA,EAAMt6K,KAAKs6K,IACX5jI,EAAS4jI,EAAI5jI,SACbg9K,EAAkBztD,GACxB,IAAIj7H,EAAGmF,EAAGwjL,EAYV,OAVI3zN,KAAKN,QAAQ+rM,UACbzgK,EAAI0L,EAAO1L,EACXmF,EAAImqI,EAAI5I,GlEzFD,EkE0FPiiD,EAAgB/tD,KAEhB56H,EAAIsvI,EAAI3I,GlE5FD,EkE6FPxhI,EAAIuG,EAAOvG,EACXwjL,EAAgB9tD,IAGb,CACHuD,MAAO,IAAI,GAAMp+H,EAAGmF,GACpBurI,MAAO,CACHk4C,WAAYF,EACZjoB,SAAUkoB,KAM1B,YAAYxpN,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,GAG7C,YAAYmwK,GACR,OAAOt6K,KAAKs6K,IAAI0lC,SAAS1lC,GAG7B,iBACIt6K,KAAKqqO,UAAU7J,iBACfxgO,KAAKsqO,QAAQ9J,iBAGjB,mBACI,MAAMxwB,EAAShwM,KAAKN,QAAQswM,OACvBA,EAAO7lM,SACH6lM,EAAOhnM,MAASgnM,EAAOhnM,KAAKmB,SAC7B6lM,EAAOhnM,KAAO5J,OAAOu8B,OAAO,GAAIq0K,EAAOhnM,KAAM,CACzCmB,OA1HQ,SA8HX6lM,EAAO/mM,IAAO+mM,EAAO/mM,GAAGkB,SACzB6lM,EAAO/mM,GAAK7J,OAAOu8B,OAAO,GAAIq0K,EAAO/mM,GAAI,CACrCkB,OA/HM,UAqItB,eAAeqgO,EAASC,GACpB,MAAM,OAAEz6B,EAAM,SAAEvE,GAAazrM,KAAKN,QAElC,GA1IK,SA0IDswM,EAAOlsK,SAAmB,CAC1B,IAAI6mM,EAAmBC,EACnBn/B,EACIg/B,EAAM/4D,IAAM84D,EAAQ94D,IACpBk5D,ElEpIN,QkEqIMD,ElEpIN,UkEsIMC,ElEtIN,QkEuIMD,ElExIN,SkE2IMF,EAAMh5D,IAAM+4D,EAAQ/4D,IACpBm5D,EAAkB3kE,GAClB0kE,EAAoBvkE,KAEpBwkE,EAAkBxkE,GAClBukE,EAAoB1kE,IAIvB+pC,EAAOhnM,MAASgnM,EAAOhnM,KAAK86B,WAC7B9jC,KAAKqqO,UAAU3qO,QAAQswM,OAAOlsK,SAAW6mM,GAGxC36B,EAAO/mM,IAAO+mM,EAAO/mM,GAAG66B,WACzB9jC,KAAKsqO,QAAQ5qO,QAAQswM,OAAOlsK,SAAW8mM,IAKnD,WAAWxhE,GACPA,EAAMs/B,SAAW1oM,KAAK0oM,SACtBt/B,EAAMu/B,SAAW3oM,KAAK2oM,SACtBv/B,EAAMq/B,OAASzoM,KAAKyoM,OACpBr/B,EAAMsC,MAAQ1rK,KAAK0rK,MACnBtC,EAAM2mD,MAAQ/vN,KAAK+vN,OAI3B3uB,GAAW,GAAengM,UAAW,IACrCmgM,GAAW,GAAengM,UAAW,IAErC,GAAeA,UAAUL,SAAW,CAChC+xN,QAAS,CACLvmD,SAAS,EACTw9B,WAAYrjC,GACZ3uJ,KlElLiB,EkEmLjBtU,KAAMwiK,GACNujC,OAAQ,CACJj5J,MAAO,GAEX09H,QAAS,GAEbkiC,OAAQ,CACJ5jC,SAAS,EACT68B,OAAQzH,GAAW,GACnB3d,QAAS2d,GAAW,GACpB3tG,UAAW,CACPvwF,KlE1MG,SkE2MH+2B,MlE5MuB,KkE8M3ByJ,SAvMK,QAyMT0tK,MAAO,CACH1yE,MAAO,IAEXmpE,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,CACJ39B,MAAOnF,GACPn2H,MAAO,IAGfg/I,OrU9MwB,KqUgN5B2rC,QAAS,CACL5wN,OAAQ,cAID,IAAA,GAAA,GC3LA,GAvCf,cAA+B,GAE3B,uBACI,OAAOnK,KAAKu2N,mBAAmBv2N,KAAK8zN,iBAAiB9zN,KAAK6qO,aAG9D,gBACI,IAAIC,EAAe9qO,KAAK8qO,aAKxB,OAJK9qO,KAAK8qO,eACNA,EAAe9qO,KAAK8qO,aAAe9qO,KAAKu2N,mBAAmBv2N,KAAK8zN,iBAAiB9zN,KAAK2qK,aAAaxuJ,aAGhG2uN,EAGX,aAAar+L,GACT,MAAMnK,EAAS,IAAI,EAAK+oJ,KAAK5+I,GACvBs+L,EAAW,IAAI,EAAK1/C,KAAK5+I,GAE/BnK,EAAOq4G,SAASt3I,KAAKiQ,MAAMgvB,EAAOq4G,SAAU36I,KAAKy2N,kBACjDsU,EAASpwF,SAASt3I,KAAKiQ,MAAMy3N,EAASpwF,SAAU36I,KAAK62N,iBAErD72N,KAAKksL,OAAO7xD,OAAO/3F,GACnBtiC,KAAKksL,OAAO7xD,OAAO0wG,GAGvB,kBACI,OAAO,EAGX,aACI,OAAO/qO,KAAKqvM,WAAW5tM,IAAI2nK,GAASA,EAAMihE,WAG9C,WACI,OAAOrqO,KAAKqvM,WAAW5tM,IAAI2nK,GAASA,EAAMkhE,WCVnC,GAxBf,cAAqC,GAEjC,uBACI,OAAOtqO,KAAKgrO,oBAAoBhrO,KAAK6qO,YAGzC,gBACI,IAAIC,EAAe9qO,KAAK8qO,aAKxB,OAJK9qO,KAAK8qO,eACNA,EAAe9qO,KAAK8qO,aAAe9qO,KAAKgrO,oBAAoBhrO,KAAK2qK,aAAaxuJ,YAG3E2uN,EAGX,oBAAoBj7D,GAGhB,OAAA,IAF2B,IAELlpK,QAAQ3G,KAAK8zN,iBAAiBjkD,MClB5D,MAAM,WAA6B,GAE/B,uBACI,OAAO7vK,KAAKu2N,mBAAmBv2N,KAAKs0N,oBAAoBt0N,KAAK6qO,aAGjE,gBACI,IAAIC,EAAe9qO,KAAK8qO,aAMxB,OALK9qO,KAAK8qO,eACNA,EAAe9qO,KAAK8qO,aAAe9qO,KAAKu2N,mBAAmBv2N,KAAKs0N,oBAAoBt0N,KAAK2qK,eACzFmgE,EAAa3uN,WAGV2uN,GAIf1pC,GAAW,GAAqBngM,UAAW,IAE5B,IAAA,GAAA,GCuIA,eA/ITgqO,UAAuB,GAEzB,SACIhkL,MAAM++H,SAENhmL,KAAK00N,iBAGT,YACI,OAAO,GAGX,YAAYt1M,EAAM0oJ,GACd,MAAM,WAAEu2C,EAAU,SAAE1V,EAAQ,OAAEF,EAAM,SAAEslB,GAAajmD,EACnD,IAAIz8J,EAAQ+T,EAAKsqM,YAEjB,IAAK,GAASr+M,EAAMrC,QAAU,GAASqC,EAAMpC,IAAK,CAC9C,GAAIjJ,KAAK+0N,oBAAoBtsB,KAAYv/B,GAMrC,OAAO,KALP79J,EAAQ,CACJrC,KAAM,EACNC,GAAI,GAOhB,IAAImnN,EAAepwN,KAAKowN,aAAa3nB,EAAQslB,GAC7CqC,EAAepwN,KAAKg2N,iBAChB5F,EAAc/kN,EAAOs9L,EAAU0V,EAAY5V,EAAQslB,GAGvD,IAAIriD,EAAQtsJ,EAAK0oJ,OAAO4D,OAAS+8B,EAAO/8B,MACpC,GAAW+8B,EAAO/8B,SAClBA,EAAQ0kD,EAAa1kD,OAGzB,MAAMtC,EAAQ,IAAI,GAAe/9J,EAAO+kN,GAKxC,OAJAhnD,EAAMsC,MAAQA,EAEd1rK,KAAKq6H,OAAO+uC,GAELA,EAGX,cAAcimC,EAAYohB,EAAe1C,GACrC,MAAMthL,GAASgkL,EAAc5iL,MAAQ,IAAIpB,MACzC,IAAIs8I,EASJ,OAPIA,EADU,WAAVt8I,EACc,GACG,SAAVA,EACO,GAEA,GAGX,IAAIs8I,EAAYsmB,EAAYohB,EAAe1C,GAGtD,UAAU3kD,EAAO04C,GACb,OAAK14C,EAIE,CAAEA,EAAM/9J,MAAMrC,KAAMogK,EAAM/9J,MAAMpC,IAH5B,CAAE64M,EAAYA,GAM7B,UAAUvI,EAAWwV,GACjB,MAAMmc,EAAW3xB,EAAUnG,QAAQ2b,EAAU,GAAIA,EAAU,IAAK/uN,KAAKN,QAAQksK,MACvEu/D,EAAS5xB,EAAUnG,QAAQ2b,EAAU,GAAIA,EAAU,IAAK/uN,KAAKN,QAAQksK,MAC3E,GAAIs/D,GAAYC,EACZ,MAAO,CACHniO,KAAMkiO,EACNjiO,GAAIkiO,GAKhB,UAAUza,EAAcC,GACpB,MAAM,KAAE3nN,EAAI,GAAEC,GAAO0nN,EACrB,IAAIua,EAAUC,EAUd,OARInrO,KAAKN,QAAQuuN,YACbid,EAAW,IAAI,GAAIliO,EAAKyoK,GAAIi/C,EAAah/C,GAAI1oK,EAAK2oK,GAAI++C,EAAa9+C,IACnEu5D,EAAS,IAAI,GAAIliO,EAAGwoK,GAAIi/C,EAAah/C,GAAIzoK,EAAG0oK,GAAI++C,EAAa9+C,MAE7Ds5D,EAAW,IAAI,GAAIxa,EAAaj/C,GAAIzoK,EAAK0oK,GAAIg/C,EAAa/+C,GAAI3oK,EAAK4oK,IACnEu5D,EAAS,IAAI,GAAIza,EAAaj/C,GAAIxoK,EAAGyoK,GAAIg/C,EAAa/+C,GAAI1oK,EAAG2oK,KAG1D,CACH5oK,KAAMkiO,EACNjiO,GAAIkiO,GAIZ,SAAS/rN,EAAM0oJ,GACX,MAAM4hD,EAActqM,EAAKsqM,YACpBxuL,GAASwuL,EAAY1gN,QACtB0gN,EAAY1gN,KAAO0gN,EAAYzgN,IAG9BiyB,GAASwuL,EAAYzgN,MACtBygN,EAAYzgN,GAAKygN,EAAY1gN,MAGjCi+C,MAAM6mK,SAAS1uM,EAAM0oJ,GAGzB,YAAYz8J,EAAOy8J,GACf,GAAc,OAAVz8J,GAAkB6vB,GAAS7vB,EAAMrC,OAASkyB,GAAS7vB,EAAMpC,IAAK,CAC9D,MAAM2lN,EAAW9mD,EAAO2gC,OAAO9sB,KACzB00C,EAAYrwN,KAAKwtN,gBAAgBoB,GAAY5uN,KAAKwtN,gBAAgBoB,IAAa,CAAEplN,IAAK08J,GAAWtqJ,IAAKuqJ,KACtG,KAAEn9J,EAAI,GAAEC,GAAOoC,EAErBglN,EAAU7mN,IAAMD,KAAKC,IAAI6mN,EAAU7mN,IAAKR,EAAMC,GAC9ConN,EAAUz0M,IAAMrS,KAAKqS,IAAIy0M,EAAUz0M,IAAK5S,EAAMC,IAItD,iBAAiBmgK,EAAOj/J,GACpB,MAAMkB,EAAQ+9J,EAAM/9J,MAEpB,OAAOrL,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQkB,EAAMrC,KAAMqC,EAAMpC,IAGnE,kBACI,MAAM4mK,EAAS7vK,KAAK6vK,OACdnoK,EAAS,GACf,IAAK,IAAIwlC,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQyG,EAAO3iI,GACjBk8H,IACA1hK,EAAOrE,MAAM+lK,EAAMihE,WAAa,IAAI9pK,QACpC74D,EAAOrE,MAAM+lK,EAAMkhE,SAAW,IAAI/pK,SAI1C,OAAO74D,EAAOiC,OAAO3J,KAAK20N,mBAIlCvzB,GAAW6pC,EAAehqO,UAAW,GAAgB,UCtHtC,GApCf,cAAwB,GACpB,OAAOq5K,GACH,MAAM,QAAE56K,EAAO,MAAE2L,EAAO0kN,MAAOjuB,GAAU9hM,KACnCu5M,EAAYzX,EAAMirB,gBAAgBrtN,GAClC0rO,EAAU,GACVC,EAAU,GACVC,EAAW,GAEXnR,EAAS5gB,EAAUnG,QAAQ/nM,EAAM6gB,IAAK7gB,EAAM8gB,MAC5Co/M,EAAQhyB,EAAUnG,QAAQ/nM,EAAM7M,KAAM6M,EAAM7M,MAC5CgtO,EAAQjyB,EAAUnG,QAAQ/nM,EAAM5M,MAAO4M,EAAM5M,OAEnD8sO,EAAM95D,GAAK+5D,EAAM/5D,GAAK0oD,EAAO1oD,GAAK6I,EAAI7I,GACtC85D,EAAM55D,GAAK65D,EAAM75D,GAAKwoD,EAAOxoD,GAAK2I,EAAI3I,GAEtC,MAAMtlJ,EAAM8tM,EAAOzjL,SAAS1L,EAE5BogM,EAAQ/nO,KAAK,CAAEkoO,EAAM95D,GAAI85D,EAAM75D,KAC/B05D,EAAQ/nO,KAAK,CAAEgpB,EAAKk/M,EAAM75D,KAC1B25D,EAAQhoO,KAAK,CAAEgpB,EAAKm/M,EAAM95D,KAC1B25D,EAAQhoO,KAAK,CAAEmoO,EAAM75D,GAAI65D,EAAM95D,KAC/B45D,EAASjoO,KAAK,CAAEgpB,EAAK8tM,EAAOzoD,KAC5B45D,EAASjoO,KAAK,CAAEgpB,EAAK8tM,EAAOvoD,KAE5B5xK,KAAKq6N,MAAQ,CACT+Q,EAASC,EAASC,GAGtBtrO,KAAKs6K,IAAM6/C,EAAO9jM,QAAQ2M,KAAKuoM,EAAMl1M,QAAQ2M,KAAKwoM,IAElDxrO,KAAKs6N,aAGT,gBC1BW,GANf,cAAwB,GACpB,YACI,OAAO,KCGf,MAAM,WAAyB,GAC3B,YAAYtxN,EAAMC,EAAIw/L,GAClBxhJ,QAEAjnD,KAAKgJ,KAAOA,EACZhJ,KAAKiJ,GAAKA,EACVjJ,KAAKyoM,OAASA,EAGlB,aACI,MAAMz/L,EAAOhJ,KAAKgJ,MACVA,MAAQsxK,IAAKkwD,GAAWvhO,IAAMqxK,IAAKmwD,IAAYzqO,KACjD6vK,EAAS,GAEf,GAAI7mK,EAAKiuK,WAAY,CACjB,MAAM9mI,EAAInnC,EAAK6nN,UAAY2Z,EAAQ94D,GAAK84D,EAAQ54D,GAChD/B,EAAOxsK,KACH,CAAEmnO,EAAQ/4D,GAAIthI,GACd,CAAEs6L,EAAM94D,GAAIxhI,QAEb,CACH,MAAMnF,EAAIhiC,EAAK6nN,UAAY2Z,EAAQ74D,GAAK64D,EAAQ/4D,GAChD5B,EAAOxsK,KACH,CAAE2nC,EAAGw/L,EAAQ94D,IACb,CAAE1mI,EAAGy/L,EAAM74D,KAInB,OAAO/B,EAGX,eACI5oH,MAAMigJ,eAEN,MAAMr5J,EAAO7tC,KAAKyoM,OAAO56J,MAAQ,GAE3B3vC,EAAO,EAAKmtL,KAAK1gB,WAAW3qK,KAAKqvM,aAAc,CACjD1iC,OAAQ,CACJjB,MAAO79H,EAAK69H,MACZt7H,MAAOvC,EAAKuC,MACZ09H,QAASjgI,EAAKigI,QACdsb,SAAUv7I,EAAKu7I,YAIvBsX,GAAiBxiM,GACjB8B,KAAKksL,OAAO7xD,OAAOn8H,IAI3B0lM,GAAkB,GAAkB,CAChC/vG,UAAW,CACPvwF,KzEvDO,SyEwDP+2B,MzEzD2B,OyE6DpB,IAAA,GAAA,GCoCA,GA7Ff,cAA6B,GACzB,SACI4sB,MAAM++H,SACNhmL,KAAKypJ,iBAGT,mBAAmBl5H,GACf,MAAMk4K,EAASzoM,KAAKN,QAAQ+oM,OACtBgjC,EAAkBre,GAAgB3kB,GAClCxxB,GAAcj3K,KAAKN,QAAQuuN,WAEjC,IAAK,IAAIF,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM0C,EAAgBhoB,EAAOslB,GAC7B,IAAI7xF,EAAQ,EACR2sE,EAAe,EAEnB,IAAK,IAAIwV,EAAa,EAAGA,EAAaotB,EAAiBptB,IAAc,CACjE,MAAMj/L,EAAO,GAAa/I,QAAQu7M,UAAUnB,EAAepS,GACrDhzM,EAAQ+T,EAAKsqM,YAAYr+M,MACzBqgO,EAAUtsN,EAAK0oJ,OAAO4jE,QAC5B,IACIziO,EADAD,EAAOkzH,EAGPwvG,EAC8B,UAA1BA,EAAQllO,eACR4Y,EAAKsqM,YAAYr+M,MAAQ6wH,EACzBlzH,EAAO,EACPC,EAAKizH,IAEL98G,EAAKsqM,YAAYr+M,MAAQw9L,EACzB5/L,EAAKD,EAAO6/L,EACZA,EAAe,GAEZ3tK,GAAS7vB,KAChBw9L,GAAgBx9L,EAChB6wH,GAAS7wH,EACTpC,EAAKizH,GAGT3rG,EAASnR,EAAM,CACXupL,SAAU3oM,KAAKstN,aAAaiE,WAAWlT,GACvCA,WAAYA,EACZ5V,OAAQgoB,EACR1C,SAAUA,EACV7xF,MAAOA,EACP2sE,aAAcA,EACd7/L,KAAMA,EACNC,GAAIA,EACJguK,WAAYA,MAM5B,YAAY5rK,EAAOy8J,GACf7gH,MAAM2oK,YAAY,CAAEvkN,MAAOy8J,EAAO7+J,IAAM6+J,GAG5C,UAAUsB,GACN,OAAOA,EAAM/9J,OAAS,EAG1B,UAAU+9J,GACN,MAAO,CAAEA,EAAMpgK,KAAMogK,EAAMngK,IAG/B,iBACI,MAAMw/L,EAASzoM,KAAKN,QAAQ+oM,OACtBilB,EAAe1tN,KAAK0tN,aACpB/yE,EAAW36I,KAAK26I,SAAW,GAEjC,IAAK,IAAIozE,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM0C,EAAgBhoB,EAAOslB,GACvBl+C,EAAS69C,EAAaK,GAE5B,GAAIl+C,EAAQ,CACR,IAAI87D,EACJ,IAAK,IAAI9hB,EAAU,EAAGA,EAAUh6C,EAAO/uK,OAAQ+oN,IAAW,CACtD,MAAMzgD,EAAQyG,EAAOg6C,GAErB,GAAIzgD,GAASuiE,EAAW,CACpB,MAAM7gO,EAAU,IAAI,GAAiB6gO,EAAWviE,EAAOqnD,GACvD91E,EAASt3I,KAAKyH,GACd9K,KAAKq6H,OAAOvvH,GAGhB6gO,EAAYviE,OCjEhC,MAAMwiE,GAAc,C3EFP,OAwBS,eALH,YASS,qB2EzBtBC,GAAsB,CAAE7f,GAAME,IAAgBviN,OAAOiiO,IAE3D,MAAM,WAA4B,GAE9B,WAAWnjC,GAKP,GAJAzoM,KAAK8rO,kBAAoB,GACzB9rO,KAAKswN,eAAiB,GACtBtwN,KAAK+rO,sBAAwB,IAAI,GAE7BtjC,EAAO3nM,OAAS,EAAG,CACnBd,KAAKiuN,WAAah6K,GACdw0J,EAAO,GAAGnlM,KAAM,CAAEwoN,G3EVnB,S2EUgCI,G3EUzB,eAIM,oBARV,WAXW,sBAgBH,oB2EPd,IAAK,IAAIxrN,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,MAAM8gB,EAAQinL,EAAO/nM,GAAG8gB,MACxB,GAAIA,GAAwB,SAAfA,EAAMle,KAAiB,CAChCtD,KAAKgsO,UAAW,EAChB,SAOhB,OAAOhJ,EAAQhjO,KAAKgjO,OAChBhjO,KAAKisO,mBAAmBjJ,GACxBhjO,KAAKksO,oBAAoBlJ,GACzBhjO,KAAKmsO,yBAAyBnJ,GAC9BhjO,KAAKosO,aAAapJ,GAClBhjO,KAAKqsO,gBAAgBrJ,GAGzB,WAAWrnD,GACP,MAAMizC,EAAWjzC,EAAKj8K,QAAQ+K,KAE9Bw8C,MAAM25K,WAAWjlD,GAEbA,aAAgB,UACT37K,KAAK8rO,kBAAkBld,IAE9B5uN,KAAK+rO,sBAAsBtqL,MAAMmtK,UAC1B5uN,KAAKswN,eAAe1B,IAG3BjzC,IAAS37K,KAAKstN,qBACPttN,KAAKstN,aAGZ3xC,IAAS37K,KAAKu5M,kBACPv5M,KAAKu5M,UAIpB,aAAaypB,GACT,MAAMwB,EAAexkO,KAAKssO,oBAE1B,IAAK,IAAI5rO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMsyM,EAAOgwB,EAAMtiO,GACb6rO,EAAa/H,EAAaxxB,EAAKtzM,QAAQ+K,MAAQ,YAAc,GACnEzK,KAAKwsO,YAAYD,GAEjB,MAAME,EAAgBzsO,KAAK0sO,oBAAoBH,GAC/C,IAAKE,EACD,SAGJ,MAAM1mH,EAAS/lH,KAAK2sO,0BAA0BF,GAC9C,IAAK,IAAIG,EAAU,EAAGA,EAAU7mH,EAAOjlH,OAAQ8rO,IAC3C5sO,KAAK6sO,iBAAiB9mH,EAAO6mH,GAAU55B,IAKnD,iBAAiBvK,EAAQuK,GACrBhzM,KAAK8sO,gBACDrL,GAAmBh5B,EAAQ,C3EhF1B,OAwBS,iB2EwD2CuK,GAGzDhzM,KAAK+sO,qBACDtL,GAAmBh5B,EAAQ,C3EjEpB,YASS,sB2EwDiDuK,GAGrEhzM,KAAKgtO,eACDvL,GAAmBh5B,EAAQ,CAAEsjB,GAAQD,KAAQ9Y,GAGjDhzM,KAAKitO,oBACDxL,GAAmBh5B,EAAQ,C3EvElB,cADH,a2EwEmDuK,GAG7DhzM,KAAKktO,kBACDzL,GAAmBh5B,EAAQ,C3E5FxB,SAsBS,mB2EsE6CuK,GAG7DhzM,KAAKmtO,uBACD1L,GAAmBh5B,E3E/FX,e2E+FiCuK,GAG7ChzM,KAAKotO,mBACD3L,GAAmBh5B,EAAQ,C3EtGtB,UAuBS,oB2E+E+CuK,GAGjEhzM,KAAKqtO,gBACD5L,GAAmBh5B,E3EjGlB,Q2EiGiCuK,GAGtChzM,KAAKstO,qBACD7L,GAAmBh5B,EAAQ,C3EnFrB,YApBW,wB2EuGgDuK,GAGrEhzM,KAAKutO,gBACD9L,GAAmBh5B,EAAQ,CAAEujB,GAAME,KAAkBlZ,GAI7D,oBAAoBgwB,GAChB,MAAMv6B,EAASzoM,KAAKwtO,WAAaxtO,KAAKyoM,OAChCglC,EAAkB,GACxBztO,KAAK0tO,oBAAsB,GAC3B1tO,KAAK2tO,mBAAqB3tO,KAAK2tO,oBAAsB,GAErD,IAAK,IAAIjtO,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,IAAI+vN,EAAgBhoB,EAAO/nM,GAC3B,MAAM4sN,EAAettN,KAAKutN,mBAAmBkD,GACvCmd,EAAW5tO,KAAKqjO,SAAS/V,EAAa5tN,QAAQszM,MAIhDyd,GAHa+Q,GAAiBlU,EAAa5tN,QAAQ4D,KAAMyiK,KAE5C0qD,EAAcod,gBAAkB55L,GAAQ25L,EAAU5K,GAC/ChjO,KAAK8tO,gBAAgBrd,EAAenD,GAEpCttN,KAAK+tO,aAAatd,EAAenD,GAGrDmgB,EAAgBpqO,KAAKotN,GAGzBzwN,KAAK2tO,mBAAqB3tO,KAAK0tO,oBAC/B1tO,KAAK0tO,oBAAsB,KAE3B1tO,KAAKwtO,UAAY/kC,EACjBzoM,KAAKyoM,OAASglC,EAGlB,aAAahlC,EAAQ6kB,GACjB,MAAM0gB,GAAcvlC,EAAOrpL,MAAQ,IAAIte,OAGvC,GAFAwsN,EAAalU,WAAa7vM,KAAKqS,IAAI0xM,EAAalU,YAAc,EAAG40B,IAE3D9yM,GAASoyL,EAAa5tN,QAAQ8J,OAAQ0xB,GAASoyL,EAAa5tN,QAAQkc,KACtE,OAAO6sL,EAGX,MAAMpqK,EAAQivL,EAAa2gB,sBACrBC,EAAmBj6L,GAAQw0J,EAAOnlM,KAAMuoO,IACxCpb,EAAgBrvB,GAAW,GAAIqH,GAYrC,OAVAgoB,EAAcrxM,MAAQqxM,EAAcrxM,MAAQ,IAAIlb,MAAMm6B,EAAM70B,IAAK60B,EAAMziB,IAAM,GAEzEsyN,GACA9L,GAAuB3R,EAAepyL,EAAO2vM,EAAa9gM,IAAAA,CACtD+S,KAAMwoJ,EAAOrpL,KAAK8tB,GAClBy7J,SAAU2kB,EAAaiE,WAAWrkL,GAAK,GACvCmxK,WAAYnxK,EAAM7O,EAAM70B,MACvB0jC,GAAQ,GAAQu7J,EAAOrpL,KAAK8tB,KAG9BujL,EAGX,yBACIzwN,KAAK2tO,mBAAqB,GAG9B,mBAAmBllC,EAAQ6kB,GACvB,MAAM73M,EAAM,GAAIgzL,EAAOz0L,SAAWs5M,EAAa6gB,mBAC/C,GAAInuO,KAAK2tO,mBAAmBl4N,GAExB,OADAzV,KAAK0tO,oBAAoBj4N,GAAOzV,KAAK2tO,mBAAmBl4N,GACjDzV,KAAK2tO,mBAAmBl4N,GAGnC,MAAM2sM,EAAckL,EAAa5tN,QAC3Bs5M,EAAgBoJ,EAAYpJ,cAC5Bo1B,EAAW5M,GAAiBpf,EAAY9+M,KAAMyiK,IAC9CsoE,EAAU5lC,EAAOrpL,KACjBkvN,EAAQF,EAAW1M,GAAexY,GAClCxhN,EAAS,GACV0mO,GACD9gB,EAAaihB,gBAGjB,IAAK,IAAIrhM,EAAM,EAAGA,EAAMmhM,EAAQvtO,OAAQosC,IAAO,CAC3C,IAAIy7J,EAOJ,GALIA,EADAF,EAAOolC,cACIS,EAAM7lC,EAAOolC,cAAeQ,EAAQnhM,GAAMltC,KAAKgnM,aAAa9E,MAE5D8W,EAAc9rK,GAGzB,GAAQy7J,IAA0B,OAAbA,EAAmB,CACxC,MAAM0V,EAAaiP,EAAa5S,WAAW/R,GAC3CjhM,EAAO22M,GAAc32M,EAAO22M,IAAe,CAAEjrJ,MAAO,GAAIu1I,SAAUA,GAClEjhM,EAAO22M,GAAYjrJ,MAAM/vD,KAAK6pC,IAMtC,OAFAltC,KAAK0tO,oBAAoBj4N,GAAO/N,EAEzBA,EAGX,gBAAgB+gM,EAAQ6kB,GAEpB,IADgB7kB,EAAOrpL,KACVte,OACT,OAAO2nM,EAGX,MAAM6gC,EAAYtpO,KAAKwuO,mBAAmB/lC,EAAQ6kB,GAC5C5lN,EAAS05L,GAAW,GAAIqH,GACxBgmC,EAAa,IAAI,GAAiBrtC,GAAW,GAAIqH,GAAS,GAAapyL,QAAS,GAAkBA,SAClG+I,EAAO1X,EAAO0X,KAAO,GACrB47L,EAAYsS,EAAa5tN,QAAQs7M,WAAa,GAE9C38K,EAAQivL,EAAa2gB,sBACrBS,EAAgBxhM,IAClB,MAAMyhM,EAAczhM,EAAM7O,EAAM70B,IAChC,IAAI4/J,EAAQkgE,EAAUp8L,GAOtB,GANKk8H,IACDA,EAAQkgE,EAAUp8L,GAAO,IAG7Bk8H,EAAMi1C,WAAaswB,GAEdvlE,EAAMnpH,KAAM,CACb,MAAM0oJ,EAAW2kB,EAAaiE,WAAWrkL,GAAK,GAC9Ck8H,EAAMu/B,SAAWA,EACjBv/B,EAAMnpH,KAAOwuL,EAAWG,gBAAgBxlE,EAAMh2G,MAAOu1I,GAGzD,OAAOv/B,GAGX,IAAK,IAAIl8H,EAAM7O,EAAM70B,IAAK0jC,GAAO7O,EAAMziB,IAAKsxB,IAAO,CAC/C,MAAMk8H,EAAQslE,EAAaxhM,GAC3B9tB,EAAKgqJ,EAAMi1C,YAAcj1C,EAAMnpH,KAE3BmpH,EAAMh2G,OAASg2G,EAAMh2G,MAAMtyD,SAC3Bk6M,EAAU5xC,EAAMi1C,YAAcj1C,EAAMnpH,MAU5C,OANIhM,GAAQvsC,EAAOpE,KAAMuoO,KACrBzJ,GAAuB16N,EAAQ22B,EAAOivL,EAAa/R,aAAcmzB,EAAexhM,GAAQo8L,EAAUp8L,IAGtGogL,EAAa5tN,QAAQs7M,UAAYA,EAE1BtzM,EAGX,YAAYo6L,EAAOkR,GACf,MAAMvK,EAAS3G,EAAMpiM,QAAQ+oM,OACvB6kB,EAAettN,KAAKutN,mBAAmB9kB,EAAO,IACpD,IAAIsQ,EAAauU,EAAa5tN,QAAQq5M,WAClC81B,EAAkBtlO,KAAKqS,IAAI,EAAGwxM,GAAgB3kB,GAAUsQ,EAAWj4M,QAEvE,GAAI+tO,EAAkB,EAElB,IADA91B,EAAauU,EAAa5tN,QAAQq5M,WAAauU,EAAa5tN,QAAQq5M,WAAW70M,MAAM,GAC9E2qO,KACH91B,EAAW11M,KAAK,IAIxBrD,KAAK+rO,sBAAsBlpM,OAAOi/J,EAAM0rB,iBAExCvmK,MAAMw8K,YAAY3hC,EAAOkR,GAI7B,eAAevK,GACX,MAAM/oM,EAAUM,KAAKN,QACfkvN,EAAWnmB,EAAO9sB,KAOxB,OALainB,GADO,GAAGj5L,OAAOjK,EAAQ65M,YAAAA,SACEt6M,GAAK,OAAOA,EAAEwL,OAASmkN,KAAa,IAGlD,IAAI5b,QAFhBtzM,EAAQsjO,OAAS,CAAE,KACF,IAAM,IAAIv4N,MAAQ,UAMrD,mBAAmBg+L,GACf,MAAMmmB,EAAWnmB,EAAO6kB,aAClB3xC,EAAOizC,EAAW5uN,KAAK8rO,kBAAkBld,GAAY5uN,KAAKstN,aAEhE,IAAK3xC,EACD,MAAM,IAAIl1K,MAAM,4CAA8CmoN,GAGlE,OAAOjzC,EAGX,sBAAsBmzD,EAAa97B,GAC/B,MAAMxxL,EAAQstN,EAAYttN,MAI1B,MAAO,CACH8sM,UAAW9sM,EACX0sM,aALiB1sM,GAAwB,SAAfA,EAAMle,KAMhCsoK,KALSonC,EAAKtzM,QAAQksK,MAS9B,0BAA0B68B,GACtB,MAAMsmC,EAAe,GACfC,EAAS,GACf,IAAK,IAAI9hM,EAAM,EAAGA,EAAMu7J,EAAO3nM,OAAQosC,IAAO,CAC1C,MAAMziC,EAAOg+L,EAAOv7J,GAAKogL,cAAgB,cACpC0hB,EAAOh2N,eAAevO,KACvBukO,EAAOvkO,IAAQ,EACfskO,EAAa1rO,KAAKoH,IAI1B,MAAMs7G,EAAS,GACf,IAAK,IAAIu+G,EAAS,EAAGA,EAASyK,EAAajuO,OAAQwjO,IAAU,CACzD,MACM2K,EAAaC,GAAYzmC,EADlBsmC,EAAazK,GACmBA,GACnB,IAAtB2K,EAAWnuO,QAIfilH,EAAO1iH,KAAK4rO,GAGhB,OAAOlpH,EAGX,eAAe0iF,EAAQuK,GACnB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB0mC,EAAW,IAAI,GAASnvO,KAAMZ,OAAOu8B,OAAO,CAC9C8sK,OAAQA,EACRwlB,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBh9C,QAAS6yD,EAAY7yD,SACtBj8K,KAAKovO,sBAAsBN,EAAa97B,KAE3ChzM,KAAKyjO,YAAY0L,EAAUn8B,GAG/B,oBAAoBvK,EAAQuK,GACxB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB4mC,EAAmB,IAAI,GAAcrvO,KAAM,CAC7CyoM,OAAQA,EACRwlB,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBh9C,QAAS6yD,EAAY7yD,UAGzBj8K,KAAKyjO,YAAY4L,EAAkBr8B,GAGvC,kBAAkBvK,EAAQuK,GACtB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB6mC,EAAc,IAAI,GAAYtvO,KAAM,CACtCyoM,OAAQA,EACRwlB,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBh9C,QAAS6yD,EAAY7yD,QACrBrQ,KAAMonC,EAAKtzM,QAAQksK,OAGvB5rK,KAAKyjO,YAAY6L,EAAat8B,GAGlC,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MACMyuO,EAAY,IAAI,GAAUvvO,KAAMZ,OAAOu8B,OAAO,CAChDsyL,WAAYjuN,KAAKiuN,WACjBxlB,OAAQA,GACTzoM,KAAKovO,sBAJY3mC,EAAO,GAIgBuK,KAE3ChzM,KAAKyjO,YAAY8L,EAAWv8B,GAGhC,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MACM0uO,EAAY,IAAI,GAAUxvO,KAAMZ,OAAOu8B,OAAO,CAChDsyL,WAAYjuN,KAAKiuN,WACjBxlB,OAAQA,GACTzoM,KAAKovO,sBAJY3mC,EAAO,GAIgBuK,KAE3ChzM,KAAKyjO,YAAY+L,EAAWx8B,GAGhC,qBAAqBvK,EAAQuK,GACzB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAM2uO,EAAiB,IAAI,GAAezvO,KAAM,CAC5CiuN,WAAYjuN,KAAKiuN,WACjBxlB,OAAQA,EACR78B,KAAMonC,EAAKtzM,QAAQksK,OAGvB5rK,KAAKyjO,YAAYgM,EAAgBz8B,GAGrC,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB3G,EAAQ,IAAI,GAAU9hM,KAAM,CAC9BiuN,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBxwB,OAAQA,EACRxsB,QAAS6yD,EAAY7yD,QACrBrQ,KAAMonC,EAAKtzM,QAAQksK,OAGvB5rK,KAAKyjO,YAAY3hC,EAAOkR,GAG5B,uBAAuBvK,EAAQuK,GAC3B,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB3G,EAAQ,IAAI,GAAiB9hM,KAAM,CACrCiuN,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBxwB,OAAQA,EACRxsB,QAAS6yD,EAAY7yD,QACrBrQ,KAAMonC,EAAKtzM,QAAQksK,OAGvB5rK,KAAKyjO,YAAY3hC,EAAOkR,GAG5B,mBAAmBvK,EAAQuK,GACvB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB3G,EAAQ,IAAI,GAAa9hM,KAAM,CACjCiuN,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBxwB,OAAQA,EACRxsB,QAAS6yD,EAAY7yD,QACrBrQ,KAAMonC,EAAKtzM,QAAQksK,OAGvB5rK,KAAKyjO,YAAY3hC,EAAOkR,GAG5B,qBAAqBvK,EAAQuK,GACzB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrBinC,EAAiB,IAAI,GAAe1vO,KAAM,CAC5CyoM,OAAQA,EACRwlB,WAAYjuN,KAAKiuN,WACjBgL,IAAK6V,EAAY7V,IACjBh9C,QAAS6yD,EAAY7yD,UAGzBj8K,KAAKyjO,YAAYiM,EAAgB18B,GAGrC,qBAAqB28B,EAAkBC,GACnC,MAAMC,EAAiBpO,GAAmBzhO,KAAKyoM,OAAQ0jB,IAEvD,IAAK,IAAI4B,EAAW,EAAGA,EAAW/tN,KAAKyoM,OAAO3nM,OAAQitN,IAAY,CAC9D,MAAM0C,EAAgBzwN,KAAKyoM,OAAOslB,GAClC,GAAI95K,GAAQw8K,EAAcntN,KAAMsoO,IAAc,CAC1C,MAAM/9L,EAAO4iL,EAAc5iL,KACvBA,G3E7fP,S2E6feA,EAAKpB,OACbojM,EAAexsO,KAAKotN,IAKhC,IAAK,IAAI1C,EAAW,EAAGA,EAAW8hB,EAAe/uO,OAAQitN,IAAY,CACjE,MAAM+hB,EAAaD,EAAe9hB,GAAUT,cAAgB,GAC5D,GAAIwiB,IAAeH,IAAsBG,GAAoC,IAAtBF,EACnD,OAAO,GAKnB,eAAeD,EAAkBC,GAC7B,MAAMnnC,EAASzoM,KAAKyoM,OAEpB,IAAK,IAAIslB,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM+hB,EAAarnC,EAAOslB,GAAUT,cAAgB,GACpD,IAAKwiB,IAAeH,IAAsBG,GAAoC,IAAtBF,IAA6BnnC,EAAOslB,GAAU8f,cAClG,OAAO,GAKnB,2BACI,MAAM56B,EAAOjzM,KAAKizM,KAClB,IAAK,IAAIvyM,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IACzBuyM,EAAKvyM,aAAc,IACnBuyM,EAAKvyM,GAAG+vM,eAKpB,mBAAmBuyB,GACf,MAAM/U,EAAajuN,KAAKiuN,WAClBvoC,EAAc,GAAG/7K,OAAO3J,KAAKN,QAAQ4tN,cACrCra,EAAO,GAEb,IAAK,IAAIvyM,EAAI,EAAGA,EAAIglL,EAAY5kL,OAAQJ,IAAK,CACzC,IAAI0hN,EAAc18B,EAAYhlL,GAG9B,GAAIuzC,GAFaj0C,KAAKqjO,SAASjhB,EAAYpP,MAErBgwB,GAAQ,CAC1B,MAAM,KAAEv4N,EAAI,WAAEsuM,EAAa,IAAOqJ,EAelC,IAAIkL,EAUJ,GAxBAlL,EAAchhB,GAAW,CACrBqK,SAAUwiB,EACV9xM,SAAU8xM,GAAcjuN,KAAKgnM,aAAalc,IAC1CksB,kBAAmBiX,EAAa/nD,GAAY,GAC7Ck8C,GAEE,GAAQA,EAAYrL,aACrBqL,EAAYrL,UAAY/2M,KAAK+vO,eAG7B/vO,KAAKgwO,qBAAqBvlO,EAAM/J,KAChC0hN,EAAYrL,WAAY,GAMxBuW,EADAqU,GAAWvf,EAAarJ,EAAW,IACpB,IAAI,GAAiBqJ,EAAapiN,KAAKgnM,cAEvC,IAAI,GAAaob,EAAapiN,KAAKgnM,cAGtDthB,EAAYhlL,GAAGq4M,WAAauU,EAAa5tN,QAAQs5M,cAE7CvuM,EAAM,CACN,GAAIzK,KAAK8rO,kBAAkBrhO,GACvB,MAAM,IAAIhE,MAAM,2BAA4BgE,wBAEhDzK,KAAK8rO,kBAAkBrhO,GAAQ6iN,EAGnCA,EAAa8D,UAAY1wN,EACzBuyM,EAAK5vM,KAAKiqN,GACVttN,KAAKsjO,WAAWhW,IAIxB,MAAM2iB,EAAcjwO,KAAKstN,cAAgBra,EAAK,GAC9CjzM,KAAKstN,aAAe2iB,EAEhBhiB,EACAjuN,KAAKsxM,MAAQ2+B,EAEbjwO,KAAKqxM,MAAQ4+B,EAIrB,cACI,MAAMxnC,EAASzoM,KAAKyoM,OAEpB,IAAK,IAAI/nM,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAE/B,IAAKuzC,GADiBw0J,EAAO/nM,GACF4C,KAAMsoO,IAC7B,OAAO,EAIf,OAAO,EAGX,gBAAgB5I,GACZ,MAAMkN,EAAUlwO,KAAK+rO,sBACfoE,EAAeD,EAAQn1H,QACvB2qE,EAAc,GAAG/7K,OAAO3J,KAAKN,QAAQ65M,WACrC0U,EAAajuN,KAAKiuN,WAClBmiB,EAAc,CAAE3kC,UAAWwiB,EAAY9xM,QAAS8xM,GAAcjuN,KAAKgnM,aAAalc,KAChFmoB,EAAO,GAETjzM,KAAKgsO,WACLoE,EAAYpvB,kBAAmB,EAC/BovB,EAAYpgC,OAAS,CAAE7lM,OAAQ,OAGnC,IAAK,IAAIzJ,EAAI,EAAGA,EAAIglL,EAAY5kL,OAAQJ,IAAK,CACzC,MAAM0hN,EAAc18B,EAAYhlL,GAGhC,GAAIuzC,GAFaj0C,KAAKqjO,SAASjhB,EAAYpP,MAErBgwB,GAAQ,CAC1B,MAAMv4N,EAAO23M,EAAY33M,KACnB4lO,EAAmB7O,GAAiBpf,EAAY9+M,K3E5jBlD,O2E4jBuE,CAAEkG,IAAK,GAAKoS,IAAK,GAAM,CAAEpS,IAAK,EAAGoS,IAAK,GAC3GyiB,EAAQ6xM,EAAQn1H,MAAMtwG,IAAS0lO,GAAgBE,EAOrD,IAAI5pB,EALM,IAAN/lN,GAAW29B,GAAS8xM,IACpB9xM,EAAM70B,IAAMD,KAAKC,IAAI60B,EAAM70B,IAAK2mO,EAAa3mO,KAC7C60B,EAAMziB,IAAMrS,KAAKqS,IAAIyiB,EAAMziB,IAAKu0N,EAAav0N,MAK7C6qM,EADA+a,GAAiBpf,EAAY9+M,K3ErkB7B,O2EskBW,GAEA,GAGf,MAAMi2M,EAAY,IAAIkN,EAASpoL,EAAM70B,IAAK60B,EAAMziB,IAC5CwlL,GAAW,GAAIgvC,EAAahuB,GAC5BpiN,KAAKgnM,cAGT,GAAIv8L,EAAM,CACN,GAAIzK,KAAKswN,eAAe7lN,GACpB,MAAM,IAAIhE,MAAM,wBAAyBgE,wBAE7CzK,KAAKswN,eAAe7lN,GAAQ8uM,EAEhCA,EAAU6X,UAAY1wN,EAEtBuyM,EAAK5vM,KAAKk2M,GACVv5M,KAAKsjO,WAAW/pB,IAIxB,MAAM02B,EAAcjwO,KAAKu5M,WAAatG,EAAK,GAC3CjzM,KAAKu5M,UAAY02B,EAEbhiB,EACAjuN,KAAKqxM,MAAQ4+B,EAEbjwO,KAAKsxM,MAAQ2+B,EAIrB,eAAenuC,EAAOrvL,EAAGojC,GACrB,MAAMm+K,EAASlyB,EAAMwuC,kBAAkB79N,GACjC22J,EAAQ,IAAI,GAAM4qD,EAAOhpL,EAAGgpL,EAAO7jL,GACnC6iK,EAAOhzM,KAAKuwO,UAAUnnE,GACtB2vC,EAAa,GACbjkM,EAAS,GAEf,IAAKk+L,EACD,OAGJ,MAAM8tB,EAAU9tB,EAAKC,KACrB,IAAK,IAAIvyM,EAAI,EAAGA,EAAIogO,EAAQhgO,OAAQJ,IAAK,CACrC,MAAMi7K,EAAOmlD,EAAQpgO,GACjBi7K,EAAK9lC,SACLurF,GAAgBtsN,EAAQ6mK,EAAK9lC,SAASuzB,IAEtCg4D,GAAgBroB,EAAYp9B,EAAK0sC,YAAYj/C,IAI3B,IAAtB2vC,EAAWj4M,QACXsgO,GAAgBroB,EAAY/4M,KAAKstN,aAAajF,YAAYj/C,IAG1D2vC,EAAWj4M,OAAS,GAAKgU,EAAOhU,OAAS,GACzCghM,EAAMj3D,QAAQh1F,EAAW,CACrBpB,QAAS,GAAahiC,GACtBmxK,cAAenxK,EACfk2L,SAAUm5B,GAAkB/oB,GAC5B1tM,MAAOy2N,GAAkBhtN,KAKrC,UAAUs0J,GACN,MAAM45D,EAAQhjO,KAAKgjO,MAEnB,IAAK,IAAItiO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMwiO,EAAcF,EAAMtiO,GAC1B,GAAIwiO,EAAYx5B,WAAW3+B,cAAc3B,GACrC,OAAO85D,GAKnB,kBAAkBvnD,EAAMj8K,GACpB8wO,GAAkBxwO,KAAKN,QAASi8K,EAAMj8K,GACtC8wO,GAAkBxwO,KAAK2iO,gBAAiBhnD,EAAMj8K,IAItD,SAAS8wO,GAAkBC,EAAe90D,EAAMj8K,GAE5C0hM,GADmD,GAAGz3L,OAAlCgyK,aAAgB,GAAyB80D,EAAcnjB,aAA0BmjB,EAAcl3B,WAC5F59B,EAAKy1C,WAAY1xN,GAG5C,SAASwvO,GAAYzmC,EAAQ9sB,EAAM2oD,GAC/B,OAAO1hC,GAAK6F,GAAAA,SAAiB/mM,GACzB,OAAmB,IAAX4iO,IAAiB5iO,EAAE4rN,cAAkB5rN,EAAE4rN,eAAiB3xC,KAIxEioB,GAAkB,GAAqB,CACnC0pB,aAAc,GACd/T,UAAW,KAGfnY,GAAW,GAAoBngM,UAAW,IAE3B,IAAA,GAAA,GC9rBf,SAAS,KACLjB,KAAK8gL,mBAAoB,EAGd,IAAA,GAvEf,cAAwB,GACpB,cACI75H,QAEAjnD,KAAK0wO,QAAU,GAGnB,UACI1wO,KAAK0wO,QAAU,GAGnB,KAAK7gE,EAAQ/B,GACT,MAAM6iE,EAAc,GAAGhnO,OAAOkmK,GAC9B7vK,KAAK01M,OAEL,IAAK,IAAIh1M,EAAI,EAAGA,EAAIiwO,EAAY7vO,OAAQJ,IAAK,CACzC,MAAM0oK,EAAQunE,EAAYjwO,GACtB0oK,GAASA,EAAMwnE,iBAAmBxnE,EAAMynE,iBACxC7wO,KAAK8wO,qBAAqB1nE,GAAO,EAAM0E,GACvC9tK,KAAK0wO,QAAQrtO,KAAK+lK,KAK9B,qBAAqBA,EAAO++B,EAAMr6B,GAC9B,MAAMijE,GAAiB3nE,EAAM1pK,QAAQuoM,WAAa,IAAI+oC,OACtD,GAAID,EAAe,CACf,MAAMvhC,EAAY,CACd7G,SAAUv/B,EAAMu/B,SAChBF,OAAQr/B,EAAMq/B,OACdC,SAAUt/B,EAAMs/B,SAChBr9L,MAAO+9J,EAAM/9J,MACbylN,WAAY1nD,EAAM0nD,WAClBnwK,eAAgB,GAChBurI,OAAQ9iB,EAAM6nE,kBACd9oC,KAAMA,GAEV4oC,EAAcvhC,GACTA,EAAU1uB,mBACX1X,EAAMwnE,gBAAgBzoC,EAAMr6B,QAGhC1E,EAAMwnE,gBAAgBzoC,EAAMr6B,GAIpC,OACI,MAAM+B,EAAS7vK,KAAK0wO,QACpB,KAAO7gE,EAAO/uK,QACVd,KAAK8wO,qBAAqBjhE,EAAOnsK,OAAO,GAIhD,cAAc+wC,GACV,MAAMo7H,EAAS7vK,KAAK0wO,QAEpB,IAAK,IAAIhwO,EAAI,EAAGA,EAAImvK,EAAO/uK,OAAQJ,IAE/B,GAAI+zC,IADUo7H,EAAOnvK,GAEjB,OAAO,EAIf,OAAO,ICjEA,SAASwwO,GAAUz+N,EAAG0+N,GACjC,MAAM17N,GAAO07N,GAAY,IAAI3qO,cACvB46C,EAAQ3uC,EAAE2uC,MAGhB,MAFwB,SAAR3rC,KAAoB2rC,EAAMkzE,SAAWlzE,EAAMozE,UAAYpzE,EAAMizE,SAAYjzE,EAAM3rC,EAAM,OCH1F,SAAS27N,GAAkBjZ,GACtC,MAAMkZ,EAAS,GACf,IAAK,IAAInkM,EAAM,EAAGA,EAAMirL,EAAWr3N,OAAQosC,IAAO,CAC9C,MAAMmjL,EAAY8H,EAAWjrL,GACzBmjL,EAAU10C,KAAKj8K,QAAQ+K,OACvB4mO,EAAOhhB,EAAU10C,KAAKj8K,QAAQ+K,MAAQ,CAClCjB,IAAK6mN,EAAUhyL,MAAM70B,IACrBoS,IAAKy0M,EAAUhyL,MAAMziB,MAIjC,OAAOy1N,ECLX,MAAM,WAAiB,GACnB,YAAYx+B,EAAUnzM,GAClBunD,QAEAjnD,KAAK6yM,SAAWA,EAChB7yM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAGhD,MAAM+S,GAEF,OADAzS,KAAKsxO,QAAUJ,GAAUz+N,EAAGzS,KAAKN,QAAQ+V,KAClCzV,KAAKsxO,QAGhB,KAAK7+N,GACD,GAAIzS,KAAKsxO,QAAS,CACd,MAAMnZ,EAAan4N,KAAKm4N,WAAan4N,KAAKuxO,SAAS9+N,EAAG+zJ,IAAG78J,OAAO3J,KAAKuxO,SAAS9+N,EAAGg0J,KACjF,GAAI0xD,EAAWr3N,OAEX,OADAd,KAAKm4N,WAAaA,EACXiZ,GAAkBjZ,IAKrC,MACI,MAAM/sK,EAASprD,KAAKsxO,QAGpB,OAFAtxO,KAAKsxO,SAAU,EAERlmL,EAGX,MACI,MAAM,SAAEynJ,EAAQ,WAAEslB,GAAen4N,KACjC,GAAIm4N,EAAWr3N,OAAQ,CACnB,IAAK,IAAIosC,EAAM,EAAGA,EAAMirL,EAAWr3N,OAAQosC,IAAO,CAC9C,MAAM7O,EAAQ85L,EAAWjrL,GACzB2lK,EAAS29B,kBAAkBnyM,EAAMs9I,KAAMt9I,EAAMA,OAEjDw0K,EAAS2+B,OAAO3+B,EAASmwB,QAIjC,iBACWhjO,KAAK6yM,SAGhB,SAASpgM,EAAGqxB,GACR,MAAM+uK,EAAW7yM,KAAK6yM,SAChBviI,GAAS79D,EAAEqxB,GAAUwsC,MACrBgyH,GAAQtiM,KAAKN,QAAQ4iM,MAAQ,IAAI97L,cACjCirO,EAAc,GAEpB,GAAc,IAAVnhK,IAAgBgyH,GAAQ,IAAI97L,gBAAkBs9B,EAAU,CACxD,MAAMmvK,EAAOJ,EAASI,KACtB,IAAK,IAAI/lK,EAAM,EAAGA,EAAM+lK,EAAKnyM,OAAQosC,IAAO,CACxC,MAAMyuI,EAAOs3B,EAAK/lK,GAElB,GAAIpJ,IAAa0iI,KAAMmV,EAAKj8K,QAAQ+rM,UAAY3nK,IAAa2iI,IAAKkV,EAAKj8K,QAAQ+rM,SAAU,CACrF,MAAMptK,EAAQs9I,EAAK+1D,IAAIphK,GAEnBjyC,IACAA,EAAM88K,YAAa,EACnBs2B,EAAYpuO,KAAK,CACbs4K,KAAMA,EACNt9I,MAAOA,OAO3B,OAAOozM,GAIf,GAASxwO,UAAUvB,QAAU,CACzB+V,IAAK,OACL6sL,KAAM,QAGK,IAAA,GAAA,GC/Ef,MAAM,WAAsB,GACxB,YAAYR,EAAOpiM,GACfunD,QAEAjnD,KAAK8hM,MAAQA,EACb9hM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAC5CM,KAAKoyC,gBAGT,gBACI,MAAMu/L,EAAU3xO,KAAK4xO,SAAW5/L,SAASI,cAAc,OACvDu/L,EAAQxjK,UAAY,YACpB,MAAM0jK,EAAe7/L,SAASI,cAAc,OAC5Cy/L,EAAa1jK,UAAY,kBACzBwjK,EAAQ1pK,YAAY4pK,GAGxB,gBACQ7xO,KAAK4xO,SAAS79L,YACd/zC,KAAK4xO,SAAS79L,WAAWk1B,YAAYjpE,KAAK4xO,UAIlD,UAAUllM,GACN,GAAc1sC,KAAK4xO,SAAUllM,GAGjC,MAAMj6B,GACF,GAAIy+N,GAAUz+N,EAAGzS,KAAKN,QAAQ+V,KAAM,CAChC,MAAMqsL,EAAQ9hM,KAAK8hM,MACb14B,EAAQ04B,EAAMwuC,kBAAkB79N,GAChCq/N,EAAW9xO,KAAK+xO,UAAYjwC,EAAM6mB,UAAUqpB,YAAY5oE,GACxDqqD,EAAUqe,EAAWA,EAAS7R,YAAY5pM,QAAU,KAE1D,GAAIy7M,GAAYre,EAAS,CACrB,MAAM1+M,EAAS/U,KAAK8jL,iBAapB,OAXA2vC,EAAQpqD,UAAUt0J,EAAO48B,KAAM58B,EAAOk6G,KACtCjvH,KAAKiyO,iBAAmBxe,EAExBzhL,SAASzC,KAAK04B,YAAYjoE,KAAK4xO,UAC/B5xO,KAAKkyO,UAAU,CACXvgM,KAAMl/B,EAAE4vK,MAAQ,EAChBpzD,IAAKx8G,EAAE6vK,MAAQ,EACflyI,MAAO,EACPy5H,OAAQ,KAGL,GAGf,OAAO,EAGX,iBACI,MAAMy9B,EAAetnM,KAAK8hM,MAAMrtJ,SAC1B,YAAEotI,EAAW,WAAEC,GAAe,GAAcwlB,EAAc,CAAE,cAAe,eAC3EvyL,EAAS,GAAcuyL,GAE7B,MAAO,CACH31J,KAAMkwI,EAAc9sK,EAAO48B,KAC3Bs9E,IAAK6yD,EAAa/sK,EAAOk6G,KAIjC,KAAKx8G,GACgBzS,KAAK+xO,WAElB/xO,KAAKkyO,UAAUlyO,KAAKmyO,mBAAmB1/N,IAI/C,IAAIA,GAEA,GADiBzS,KAAK+xO,UACR,CACV,MAAMvuC,EAAgBxjM,KAAK8jL,iBACrBsuD,EAAoBpyO,KAAKmyO,mBAAmB1/N,GAWlD,OAVA2/N,EAAkBzgM,MAAQ6xJ,EAAc7xJ,KACxCygM,EAAkBnjH,KAAOu0E,EAAcv0E,IAIvCjvH,KAAKqyO,kBAFS,CAAErnM,EAAGonM,EAAkBzgM,KAAMxB,EAAGiiM,EAAkBnjH,KACpD,CAAEjkF,EAAGonM,EAAkBzgM,KAAOygM,EAAkBhiM,MAAOD,EAAGiiM,EAAkBnjH,IAAMmjH,EAAkBvoE,SAGhH7pK,KAAKsyO,uBACEtyO,KAAK+xO,UAELX,GAAkBpxO,KAAKm4N,aAItC,OACI,MAAMA,EAAan4N,KAAKm4N,WACxB,GAAIA,GAAcA,EAAWr3N,OAAQ,CACjC,MAAM+xM,EAAW7yM,KAAK8hM,MAAM6mB,UAC5B,IAAK,IAAIz7K,EAAM,EAAGA,EAAMirL,EAAWr3N,OAAQosC,IAAO,CAC9C,MAAMmjL,EAAY8H,EAAWjrL,GAC7B2lK,EAAS29B,kBAAkBngB,EAAU10C,KAAM00C,EAAUhyL,OAEzDw0K,EAAS2+B,OAAO3+B,EAASmwB,QAIjC,UACIhjO,KAAKsyO,uBACEtyO,KAAK4xO,gBACL5xO,KAAK8hM,MAGhB,kBAAkBv+L,EAAO8D,GACrB,MAAMi7L,GAAQtiM,KAAKN,QAAQ4iM,MAAQ,IAAI97L,cACjC2xN,EAAa,GAEbllB,EAAOjzM,KAAK+xO,UAAU9+B,KAC5B,IAAK,IAAI/lK,EAAM,EAAGA,EAAM+lK,EAAKnyM,OAAQosC,IAAO,CACxC,MAAMyuI,EAAOs3B,EAAK/lK,GACZu+J,EAAW9vB,EAAKj8K,QAAQ+rM,SAC9B,IAAMnJ,IAAS97B,IAAMilC,KAAenJ,IAAS77B,KAAKglC,IAAa,GAAQ9vB,EAAKy1C,WAAY,CACpF,MAAM/yL,EAAQs9I,EAAKsjC,YAAY17M,EAAO8D,GAClCg3B,GACA85L,EAAW90N,KAAK,CACZs4K,KAAMA,EACNt9I,MAAOA,KAMvBr+B,KAAKm4N,WAAaA,EAGtB,mBAAmB1lN,GACf,MAAMghN,EAAUzzN,KAAKiyO,iBACfM,EAAgB,CAClBvnM,EAAGv4B,EAAEu4B,EAAEunM,cACPpiM,EAAG19B,EAAE09B,EAAEoiM,gBAEHvnM,GAAKq2B,SAAUghH,GAASlyI,GAAKkxB,SAAUihH,IAAY7vK,EACrD6vL,GAAQtiM,KAAKN,QAAQ4iM,MAAQ,IAAI97L,cACvC,IAAImrC,EAAOpoC,KAAKC,IAAI+oO,EAAcvnM,EAAGq3I,GACjCpzD,EAAM1lH,KAAKC,IAAI+oO,EAAcpiM,EAAGmyI,GAChClyI,EAAQ7mC,KAAK+mC,IAAIiiM,EAAcvnM,EAAIq3I,GACnCxY,EAAStgK,KAAK+mC,IAAIiiM,EAAcpiM,EAAImyI,GA2BxC,OAzBIggB,IAAS97B,KACT70H,EAAO8hL,EAAQhiD,GACfrhI,EAAQqjL,EAAQrjL,SAEhBkyJ,IAAS77B,KACTx3C,EAAMwkG,EAAQ/hD,GACd7H,EAAS4pD,EAAQ5pD,UAGjBwY,EAAQoxC,EAAQ9hD,KAChBvhI,EAAQqjL,EAAQ9hD,GAAK4gE,EAAcvnM,GAGnCq3I,EAAQoxC,EAAQhiD,KAChBrhI,EAAQmiM,EAAcvnM,EAAIyoL,EAAQhiD,IAGlC6Q,EAAQmxC,EAAQ7hD,KAChB/H,EAAS4pD,EAAQ7hD,GAAK2gE,EAAcpiM,GAGpCmyI,EAAQmxC,EAAQ/hD,KAChB7H,EAAS0oE,EAAcpiM,EAAIsjL,EAAQ/hD,IAGhC,CACH//H,KAAMpoC,KAAKqS,IAAI+1B,EAAM8hL,EAAQhiD,IAC7BxiD,IAAK1lH,KAAKqS,IAAIqzG,EAAKwkG,EAAQ/hD,IAC3BthI,MAAOA,EACPy5H,OAAQA,IAKpB,GAAc5oK,UAAUvB,QAAU,CAC9B+V,IAAK,QACL6sL,KAAM,QAGK,IAAA,GAAA,GCpIA,GAnDf,cAA6B,GACzB,YAAYR,EAAOpiM,GACfunD,QAEAjnD,KAAK8hM,MAAQA,EACb9hM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAGhD,aAAa4wE,GACT,MAAMgyH,GAAQtiM,KAAKN,QAAQ4iM,MAAQ,IAAI97L,cACjC2xN,EAAa,GACbllB,EAAOjzM,KAAK8hM,MAAM6mB,UAAU1V,KAElC,IAAK,IAAI/lK,EAAM,EAAGA,EAAM+lK,EAAKnyM,OAAQosC,IAAO,CACxC,MAAMyuI,EAAOs3B,EAAK/lK,GACZu+J,EAAW9vB,EAAKj8K,QAAQ+rM,SAE9B,IAAMnJ,IAAS97B,IAAMilC,KAAenJ,IAAS77B,KAAKglC,IAAa9vB,EAAK62D,UAAW,CAC3E,MAAMn0M,EAAQs9I,EAAK62D,WAAWliK,GAE1BjyC,GACA85L,EAAW90N,KAAK,CACZs4K,KAAMA,EACNt9I,MAAOA,KAOvB,OADAr+B,KAAKm4N,WAAaA,EACXiZ,GAAkBjZ,GAG7B,OACI,MAAMA,EAAan4N,KAAKm4N,WAClBtlB,EAAW7yM,KAAK8hM,MAAM6mB,UAE5B,GAAIwP,GAAcA,EAAWr3N,QAAU+xM,EAAS29B,kBAAmB,CAC/D,IAAK,IAAItjM,EAAM,EAAGA,EAAMirL,EAAWr3N,OAAQosC,IAAO,CAC9C,MAAMmjL,EAAY8H,EAAWjrL,GAC7B2lK,EAAS29B,kBAAkBngB,EAAU10C,KAAM00C,EAAUhyL,OAEzDw0K,EAAS2+B,OAAO3+B,EAASmwB,QAIjC,iBACWhjO,KAAK8hM,QCHL,GA9Cf,cAA2B,GAEvB,YAAYpiM,EAASsnM,GACjB//I,MAAMvnD,GAENM,KAAKgnM,aAAeA,EAGxB,SACI,MAAM,SAAE51J,EAAQ,QAAE1xC,GAAYM,KACxByrM,EAAW/rM,EAAQ+rM,SAEzBzrM,KAAKksL,OAAS,IAAI,EAAKumD,OAAO,KAAM,CAChCx2D,QAASwvB,EAAW,EAAI/rM,EAAQu8K,QAChCE,YAAasvB,EAAW/rM,EAAQu8K,QAAU,EAC1CC,YAAauvB,EAAW,WAAa,aACrCtvL,QAASzc,EAAQorL,IACjB9O,WAAYyvB,EAAW,QAAU,WAGrC,IAAK,IAAIv+J,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IAAO,CAC5C,IAAIwlM,EAAathM,EAASlE,GAC1BwlM,EAAW7rC,OAAO,IAAI,IACtB6rC,EAAWlrC,gBAInB,OAAOltB,GACHt6K,KAAKksL,OAAOp9D,KAAKwrD,EAAIyvB,UACrB/pM,KAAKksL,OAAO2a,SACZ,MAAM56B,EAAOjsK,KAAKksL,OAAOxT,cAGrB14K,KAAKs6K,IADLrO,EACW4gC,GAAU5gC,GAEV,IAAI,GAIvB,eACIjsK,KAAKmnM,YAGT,kBCuFW,GA/Hf,cAAyB,GACrB,YAAYznM,GACRunD,MAAMvnD,GAENM,KAAK2yO,kBACAjzO,EAAQorL,KAIT9qL,KAAKogN,cACLpgN,KAAK6yN,iBAJL7yN,KAAK6yN,eACL7yN,KAAKogN,eAOb,kBACIpgN,KAAKo6E,UAAY,IAAI,GAAa,CAAEqxH,UAAU,EAAOzoK,MAAM,EAAO04I,MAAO7V,GAAQoW,QAASj8K,KAAKN,QAAQu8K,UACvGj8K,KAAKq6H,OAAOr6H,KAAKo6E,WAGrB,eACIp6E,KAAKo6E,UAAUigD,OAAO,IAAI,GAAar6H,KAAK4yO,kBAGhD,gBACI,MAAMlzO,EAAUM,KAAKN,QACfukO,EAAcvkO,EAAQukO,YAC5B,OAAO7iC,GAAW,GAAI1hM,EAAQizN,QAAS,CACnC/oB,WAAYq6B,EACZ56B,OAAQ,CACJ39B,MAAOu4D,KAKnB,cACI,MAAMvkO,EAAUM,KAAKN,QACfmxM,EAAezP,GAAW,GAAI1hM,EAAQswM,QAE5ChwM,KAAKo6E,UAAUigD,OAAO,IAAI,GAAQ36H,EAAQskF,KAAM6sH,IAGpD,iBACI5pJ,MAAMogJ,iBAEN,MAAM96G,EAASvsF,KAAKN,QAAQ6sF,QAAU,GAChCsmJ,EAAY7yO,KAAK8yO,aAAe,EAAKznD,KAAKye,SAAS9pM,KAAKo6E,UAAUkgG,IAAIyvB,SAAU,CAClFjsM,KAAM,CACF4tK,MAAOnF,GACPuH,QAAS,GAEbnB,OAAQ,KACRpgF,OAAQA,EAAO9/C,OAAS8/C,IAG5BvsF,KAAKunM,aAAasrC,GAGtB,MAAM3kC,EAAQz7L,GACV,MAAMgB,EAAOzT,KAAKwvM,UAAU/8L,IAEvBy7L,EAAOrjE,QnFLM,kBmFKqBp3H,IAAShB,GAAgB,gBAAXA,EAAEnP,MACnDmP,EAAEkuC,iBAIV,KAAKutJ,EAAQz7L,GACT,MAAMgB,EAAOzT,KAAKwvM,UAAU/8L,GAO5B,OALKy7L,EAAOrjE,QnFZM,kBmFYqBp3H,IACnCy6L,EAAO6kC,iBAAiBt/N,EAAK20N,YAAa30N,EAAKu/N,aAI5C,EAGX,IAAI9kC,EAAQz7L,GACRy7L,EAAO+kC,oBAEP/kC,EAAOrjE,QnFtBW,kBmFsBgB7qI,KAAKwvM,UAAU/8L,IAGrD,UAAUA,GACN,MAAM/S,EAAUM,KAAKN,QAErB,MAAO,CACH+0C,QAAS,GAAahiC,GACtBuxE,KAAMtkF,EAAQskF,KACdykH,OAAQ/oM,EAAQ+oM,OAChB2/B,YAAa1oO,EAAQ+oM,OAAOz0L,MAC5Bg/N,WAAYtzO,EAAQszO,YAI5B,eACI,MAAMtzO,EAAUM,KAAKN,QACf0oM,EAAe1oM,EAAQwsL,OAEzBkc,GACApoM,KAAKksL,OAASkc,EAAa,CACvBh9I,OAAQ1rD,EAAQ0rD,OAChBq9I,OAAQ/oM,EAAQ+oM,OAChBpnB,OAAQrhL,KAAKwoM,YACbwqC,WAAYtzO,EAAQszO,WACpBtzO,QAAS,CACLizN,QAAS3yN,KAAK4yO,gBACd5iC,OAAQtwM,EAAQswM,QAEpB9I,aAAc,KACVlnM,KAAKknM,eACLlnM,KAAKkmL,iBACLlmL,KAAKqnM,iBAEL,MAAMkI,EAAgBvvM,KAAKksL,OAI3B,cAFOlsL,KAAKksL,OAELqjB,KAGfvvM,KAAKmnM,aAELlgJ,MAAMugJ,iBCrHlB,MAAM,WAAe,GACjB,YAAY9nM,EAASsnM,EAAe,IAChC//I,MAAMvnD,GAENM,KAAKgnM,aAAeA,EAEf/yJ,GAAQj0C,KAAKN,QAAQokC,SAAU,CAAEuiI,GAAKD,GAAOR,GAAQK,GARnD,aASHjmK,KAAKN,QAAQokC,SAAWsiI,IAG5BpmK,KAAKkzO,mBAELlzO,KAAKmzO,kBAAkBzzO,EAAQg5G,OAE/B14G,KAAKozO,cAGT,mBACI,MAAM1zO,EAAUM,KAAKN,SACf,SAAEokC,EAAU43I,MAAO23D,GAAc3zO,EACvC,IAAIg8K,EAAQ53I,EACRylK,EAAS1jC,GAvBN,WAyBH/hI,EACA43I,EAAQzV,GACDhyH,GAAQnQ,EAAU,CAAEuiI,GAAKT,MAE5B8V,EADc,UAAd23D,EACQptE,GACa,QAAdotE,EACCjtE,GAEAP,GAEZ0jC,EAASzlK,GACFuvM,IACW,UAAdA,EACA9pC,EAASljC,GACY,QAAdgtE,IACP9pC,EAAS3jC,KAIjB5lK,KAAKo6E,UAAY,IAAI,GAAW,CAC5B6uH,OAAQvpM,EAAQupM,OAChBplB,QAASnkL,EAAQmkL,QACjB+lB,WAAYlqM,EAAQkqM,WACpBP,OAAQ3pM,EAAQ2pM,OAChBE,OAAQA,EACR7tB,MAAOA,EACP0T,OAAQ1vL,EAAQ0vL,OAChB8Z,aAAa,IAIblpM,KAAKszO,eADLtzO,KAAKuzO,WACiB,IAAI,GAAW,CACjChqC,OAAQA,EACR7tB,MAAOA,EACP0T,OAAQ1vL,EAAQ0vL,OAChB8Z,aAAa,IAGKlpM,KAAKo6E,UAG/Bp6E,KAAKq6H,OAAOr6H,KAAKo6E,WAGrB,cACI,MAAM4sH,EAAehnM,KAAK+mM,aACpBrnM,EAAUM,KAAKN,QACf+rM,EAAWzrM,KAAKi3K,aAChBu8D,EAAe,IAAI,GAAa,CAClC/nC,SAAUA,EACVxvB,QAASv8K,EAAQu8K,QACjB6O,IAAKkc,EAAalc,KACnBkc,GACH,IAAI5zI,EAAQ1zD,EAAQ0zD,MAEhB1zD,EAAQyc,UACRi3C,EAAQA,EAAMlvD,MAAM,GAAGiY,WAG3B,MAAMyZ,EAAQw9B,EAAMtyD,OAEpB,IAAK,IAAIJ,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAGvB8yO,EAAan5G,OAAO,IAAI,GAAW+mE,GAAW,GAAI,CAC9CuxB,QAASjzN,EAAQizN,QACjB3iB,OAAQtwM,EAAQswM,OAChBllB,IAAKkc,EAAalc,KACnBprL,EAAQugD,KANAmT,EAAM1yD,MASrB8yO,EAAaxtD,SACbhmL,KAAKszO,eAAej5G,OAAOm5G,GAG/B,aACI,MAAM,YAAEt3D,EAAW,SAAEp4I,GAAa9jC,KAAKN,QAIvC,MAzGO,WAsGWokC,GAxGP,eAwG8Bo4I,IACjC,GAAQA,GAzGL,eAyGoBA,EAA6BjoI,GAAQnQ,EAAU,CAAEmiI,GAAMG,MAK1F,WACI,OAAOpmK,KAAKo6E,UAAUhpC,SAAS,GAAGA,SAAStwC,OAAS,EAGxD,OAAOujM,GACH,MAAM3kM,EAAUM,KAAKN,QACf+zO,EAAYpvC,EAAUhuK,QAEvBr2B,KAAK0zO,YApHH,WAyHHh0O,EAAQokC,UACR9jC,KAAK2zO,sBAAsBF,GAC3BzzO,KAAKs6K,IAAMm5D,GAEXzzO,KAAK4zO,gBAAgBH,GAGrBzzO,KAAKuzO,YACLvzO,KAAK04G,MAAMmuF,OAAO,IAAI,GAAI7mM,KAAKo6E,UAAUkgG,IAAI7I,GAAIzxK,KAAK04G,MAAM4hE,IAAI5I,GAAI1xK,KAAKo6E,UAAUkgG,IAAI3I,GAAI3xK,KAAK04G,MAAM4hE,IAAI1I,MAZ1G5xK,KAAKs6K,IAAMm5D,EAgBnB,gBAAgBpvC,GACZ,MAAM,QAAE3kM,EAAO,UAAE06E,GAAcp6E,MACzB,SAAE8jC,EAAQ,MAAEsM,EAAK,OAAEy5H,GAAWnqK,EAC9BonH,EAAMhjF,IAAauiI,IAAOviI,IAAa8hI,GAASY,GAAIC,GACpDglC,EAAWzrM,KAAKi3K,aAChB48D,EAAcxvC,EAAUhuK,QAC9B,IAAIy9M,EAAezvC,EAAUhuK,QAEzByN,IAAamiI,IAAQniI,IAAasiI,KAClC0tE,EAAapiE,GAAKmiE,EAAYniE,GAAK,GAGnC+5B,GAAY5hC,GACZiqE,EAAaliE,GAAKkiE,EAAapiE,GAAK7H,EACpCiqE,EAAap4D,MAAMm4D,EAAaptE,GAAGrsF,EAAU16E,QAAQ6pM,UAC7CkC,GAAYr7J,IACpB0jM,EAAaniE,GAAKmiE,EAAariE,GAAKrhI,EACpC0jM,EAAap4D,MAAMm4D,EAAartE,GAAGpsF,EAAU16E,QAAQg8K,QAGzDthG,EAAUysH,OAAOitC,GACjBA,EAAe15J,EAAUkgG,IAEzB,MAAMA,EAAMw5D,EAAaz9M,SAErB32B,EAAQmnO,SAAWnnO,EAAQqnO,WAC3B+M,EAAazqE,UAAU3pK,EAAQmnO,QAASnnO,EAAQqnO,SAChD3sJ,EAAUysH,OAAOitC,IAGrBx5D,EAAIxzD,EAAM,GAAKu9E,EAAUv9E,EAAM,GAC/BwzD,EAAIxzD,EAAM,GAAKu9E,EAAUv9E,EAAM,GAE/B9mH,KAAKs6K,IAAMA,EAGf,sBAAsB+pB,GAClB,MAAM,QAAE3kM,EAAO,UAAE06E,GAAcp6E,MACzB,QAAE6mO,EAAO,QAAEE,EAAO,MAAE32L,EAAK,OAAEy5H,GAAWnqK,EACtC+rM,EAAWzrM,KAAKi3K,aACtB,IAAI68D,EAAezvC,EAAUhuK,QAEzBo1K,GAAY5hC,EACZiqE,EAAaliE,GAAKkiE,EAAapiE,GAAK7H,GAC5B4hC,GAAYr7J,IACpB0jM,EAAaniE,GAAKmiE,EAAariE,GAAKrhI,GAExCgqC,EAAUysH,OAAOitC,GACjBA,EAAe15J,EAAUkgG,IAEzBlgG,EAAUysH,OAAO,IAAI,GACjBggC,EAASE,EACTF,EAAUiN,EAAa1jM,QAAS22L,EAAU+M,EAAajqE,WAI/D,eACQ7pK,KAAK0zO,YACLzsL,MAAMugJ,eAId,kBAAkB9uF,GACd,IAAIu1F,EAAe7M,GAAW,GAAI,CAC9B11B,MAAO/F,GACP7hI,SAAUuiI,GACVqV,MAAO7V,IACRntD,GACC10B,EAAOiqH,EAAajqH,KAExB,GAAK00B,IAA2B,IAAlBA,EAAM0zD,QAApB,CAIA,GAAI,GAAQ6hC,IAAiBA,EAAa7hC,QAAS,CAC/C,MAAMonC,EAAgBhR,GAAYyL,GAC9BuF,EACAxvH,EAAOwvH,EAAc,CAAExvH,KAAMA,IACtBiqH,EAAa9jM,SACpB65E,EAAOhkF,KAAKgnM,aAAa78L,OAAO6kM,KAAKf,EAAa9jM,OAAQ65E,IAIlEhkF,KAAK04G,MAAQ,IAAI,GAAQ10B,EAAMiqH,GAE/BjuM,KAAK+zO,oBAEL/zO,KAAKg0O,4BAGT,oBACIh0O,KAAKi0O,OAAS,IAAI,GAAa,CAC3BxoC,UAAU,EACVzoK,MAAM,IAGVhjC,KAAKo6E,UAAUigD,OAAOr6H,KAAKi0O,QAG/B,WACI,OAAO7xC,QAAQpiM,KAAKN,QAAQg5G,QAAwC,IAA/B14G,KAAKN,QAAQg5G,MAAM0zD,SAG5D,2BACoBpsK,KAAKN,QAETg5G,MAAM50E,WAAa8hI,IAC3B5lK,KAAKi0O,OAAO55G,OAAOr6H,KAAKszO,gBACxBtzO,KAAKi0O,OAAO55G,OAAOr6H,KAAK04G,SAExB14G,KAAKi0O,OAAO55G,OAAOr6H,KAAK04G,OACxB14G,KAAKi0O,OAAO55G,OAAOr6H,KAAKszO,kBAKpC1vC,GAAkB,GAAQ,CACtB9/J,SAAUsiI,GACVhzG,MAAO,GACPyzK,QAAS,EACTE,QAAS,EACT99B,OAAQzH,GAAW,GACnB3d,QAAS2d,GAAW,GACpB6H,OAAQ,CACJ39B,MAAO/F,GACPv1H,MAAO,GAEX6P,KAAM,CACFssC,OAtQQ,UAuQR0vF,QAAS,GAEbA,QAAS,EACT2tB,WAAY,GACZxa,OAAQ,EACRujC,QAAS,CACLtpB,OAAQ,CACJj5J,MAAO,GAEXA,MAAO,GACPy5H,OAAQ,EACRvmK,KAAM,OACNo4K,MAAOzV,GACPsjC,OAAQ1jC,MAID,IAAA,GAAA,GC1PA,eApCTquE,UAAwB,GAE1B,cACIjtL,QAEAjnD,KAAKm0O,UAAY,GAGrB,SAAS7wO,EAAMmmN,GACXzpN,KAAKm0O,UAAU9wO,KAAK,CAChBC,KAAMA,EACNmmN,YAAaA,IAIrB,OAAO+jB,EAAW9tO,EAASsnM,GACvB,MAAMxwH,EAAWx2E,KAAKm0O,UACtB,IACI1rC,EADA1oM,EAAQy2E,EAAS,GAGrB,IAAK,IAAItpC,EAAM,EAAGA,EAAMspC,EAAS11E,OAAQosC,IAAO,CAC5C,MAAMruB,EAAQ23D,EAAStpC,GAGvB,GAFAu7J,EAASg5B,GAAmB+L,EAAW3uN,EAAM4qM,aAEzChhB,EAAO3nM,OAAS,EAAG,CACnBf,EAAQ8e,EACR,OAIR,OAAO,IAAI9e,EAAMuD,KAAKmlM,EAAQ/oM,EAASsnM,WAI/CktC,EAAgB79N,QAAU,IAAI69N,QCxB9B,SAASE,GAAUjmK,GACf,MAAM15B,EAAUzC,SAASI,cAAc,OAKvC,OAJI+7B,IACA15B,EAAQ05B,UAAYA,GAGjB15B,EAGX,SAAS4/L,GAAc5/L,GACnB,IAAIp+B,EAAUo+B,EACd,KAAOp+B,IAAYwsL,GAAWxsL,EAAS,aACnCA,EAAUA,EAAQ09B,WAGtB,OAAO19B,EAGX,MAAM,WAAkB,GACpB,YAAYyrL,EAAOwrB,EAAc5tN,EAASkpD,GACtC3B,QAEA,MAAMqgJ,EAAexF,EAAMrtJ,QAE3Bz0C,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAC5CM,KAAK8hM,MAAQA,EACb9hM,KAAK4oD,SAAWA,EAChB5oD,KAAKsnM,aAAeA,EACpBtnM,KAAKstN,aAAeA,EACpBttN,KAAKs0O,UAAYt0O,KAAKstN,wBAAwB,GAE9CttN,KAAKu0O,cAELv0O,KAAKosK,QAAUpsK,KAAKN,QAAQ0sK,SAAWk7B,EAAa1sB,aAEhD56K,KAAKosK,UACLpsK,KAAKw0O,iBAELx0O,KAAKnB,IAAImB,KAAKy0O,OAAOz0O,KAAKN,QAAQsJ,MAAOhJ,KAAKy0O,OAAOz0O,KAAKN,QAAQuJ,KAElEjJ,KAAKgoL,cAIb,OAAOgrB,GACH,OAAOhzM,KAAKstN,aAAata,OAASA,EAGtC,iBACI,MAAMtzM,EAAUM,KAAKN,QACfyxB,EAAUnxB,KAAKmxB,QAAUijN,GAAU,cACzC,GAAcjjN,EAAS,CACnB89F,IAAKvvH,EAAQqV,OAAOk6G,IACpBt9E,KAAMjyC,EAAQqV,OAAO48B,KACrBvB,MAAO1wC,EAAQ0wC,MACfy5H,OAAQnqK,EAAQmqK,OAChB1xH,UAAW,QAEf,MAAMu8L,EAAY10O,KAAK00O,UAAYN,GAAU,eAC7Cp0O,KAAK20O,SAAWP,GAAU,UAC1Bp0O,KAAK40O,UAAYR,GAAU,UAE3BjjN,EAAQ82C,YAAYjoE,KAAK20O,UACzBxjN,EAAQ82C,YAAYjoE,KAAK40O,WACzBzjN,EAAQ82C,YAAYysK,GAEpBA,EAAUzsK,YAAYmsK,GAAU,mBAEhC,MAAMS,EAAa70O,KAAK60O,WAAaT,GAAU,0BACzCU,EAAc90O,KAAK80O,YAAcV,GAAU,2BACjDS,EAAW5sK,YAAYmsK,MACvBU,EAAY7sK,YAAYmsK,MAExBM,EAAUzsK,YAAY4sK,GACtBH,EAAUzsK,YAAY6sK,GAEtB90O,KAAKsnM,aAAar/H,YAAY92C,GAC9B,MAAM4jN,EAAkB,GAAcL,EAAW,CAAE,kBAAmB,mBAAoB,WACpFM,EAAmB,GAAcH,EAAY,UAAUhrE,OACvDorE,EAAoB,GAAcH,EAAa,UAAUjrE,OAE/DnqK,EAAQg1O,UAAY,CAChBrrC,OAAQ,CACJ13J,KAAMojM,EAAgBG,gBACtBtjM,MAAOmjM,EAAgBI,mBAI/B,GAAcN,EAAY,CACtB5lH,KAAM8lH,EAAgBlrE,OAASmrE,GAAoB,IAGvD,GAAcF,EAAa,CACvB7lH,KAAM8lH,EAAgBlrE,OAASorE,GAAqB,IAGxD9jN,EAAQsb,MAAM2xC,QAAUjtD,EAAQsb,MAAM2xC,QAG1C,cACoC,IAA5Bp+E,KAAKN,QAAQ01O,aACbp1O,KAAKq1O,mBAAqBr1O,KAAKs1O,YAAY18M,KAAK54B,MAChD,GAAWA,KAAKmxB,QAAS,CACrB,CAAEi7L,IAAcpsN,KAAKq1O,sBAI7Br1O,KAAKu1O,WAAa,GAAiBvqO,OAAOhL,KAAKmxB,QAAS,CACpDqkN,iBAAiB,EACjBjyO,MAAOvD,KAAKy1O,OAAO78M,KAAK54B,MACxBkqH,KAAMlqH,KAAK01O,MAAM98M,KAAK54B,MACtBqH,IAAKrH,KAAK21O,KAAK/8M,KAAK54B,MACpBoiC,IAAKpiC,KAAK41O,KAAKh9M,KAAK54B,MACpB61O,MAAO71O,KAAK81O,OAAOl9M,KAAK54B,MACxB+1O,aAAc/1O,KAAKg2O,cAAcp9M,KAAK54B,MACtCi2O,cAAej2O,KAAKk2O,eAAet9M,KAAK54B,MACxCm2O,WAAYn2O,KAAKo2O,YAAYx9M,KAAK54B,QAI1C,cACI,MAAM,QAAEN,EAAO,aAAE4tN,GAAiBttN,KAC5Bs6K,EAAMgzC,EAAata,KAAKitB,YACxBj+B,EAAchiM,KAAK8hM,MAAMkF,aAAa9E,KAExCliM,KAAKs0O,WACLlzC,GAAW1hM,EAAS,CAChB8J,IAAKk4L,GAAUM,EAAatiM,EAAQ8J,KACpCoS,IAAK8lL,GAAUM,EAAatiM,EAAQkc,KACpC5S,KAAM04L,GAAUM,EAAatiM,EAAQsJ,MACrCC,GAAIy4L,GAAUM,EAAatiM,EAAQuJ,MAI3C,MAAM,YAAE44K,EAAW,WAAEC,GAAe,GAAc9hL,KAAKsnM,aAAc,CAAE,cAAe,eAEtFtnM,KAAKN,QAAU0hM,GAAW,GAAI,CAC1BhxJ,MAAOkqI,EAAIlqI,QACXy5H,OAAQyQ,EAAIzQ,SA5IO,GA6InBga,QAAS,CACLlyI,KAAMkwI,EACN5yD,IAAK6yD,GAET/sK,OAAQ,CACJ48B,KAAM2oI,EAAI7I,GAAKoQ,EACf5yD,IAAKqrD,EAAI5I,GAAKoQ,GAElB94K,KAAMtJ,EAAQ8J,IACdP,GAAIvJ,EAAQkc,KACblc,GAGP,UACQM,KAAKu1O,aACLv1O,KAAKu1O,WAAWp8L,iBACTn5C,KAAKu1O,YAGhB76N,aAAa1a,KAAKq2O,YAClBr2O,KAAKssL,OAAS,KAEVtsL,KAAKmxB,UACDnxB,KAAKq1O,qBACL,GAAar1O,KAAKmxB,QAAS,CACvB,CAAEi7L,IAAcpsN,KAAKq1O,qBAEzBr1O,KAAKq1O,mBAAqB,MAE9Br1O,KAAKsnM,aAAar+H,YAAYjpE,KAAKmxB,SACnCnxB,KAAKmxB,QAAU,MAIvB,gBAAgBkN,GAEZ,MAAO,CACHs9I,KAAM37K,KAAKstN,aAAa5tN,QACxBsJ,KAAMhJ,KAAK41I,OAAOv3G,EAAMr1B,MACxBC,GAAIjJ,KAAK41I,OAAOv3G,EAAMp1B,KAI9B,OAAOwJ,GACH,MAAM/S,EAAUM,KAAKN,QACfmkC,EAAS,GAAapxB,GAE5B,GAAIzS,KAAKssL,SAAWzoJ,EAChB,OAGJ7jC,KAAK8hM,MAAMmxC,oBACXjzO,KAAKssL,OAAS,CACVgqD,WAAYjC,GAAcxwM,IAAWA,EACrC0uM,cAAe9/N,EAAEu4B,EAAIv4B,EAAEu4B,EAAEq2B,SAAW,EACpChjC,MAAO,CACHr1B,KAAMhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC1BC,GAAIjJ,KAAKy0O,OAAO/0O,EAAQuJ,MAIhC,MAAMwK,EAAOzT,KAAKu2O,gBAAgB,CAC9BvtO,KAAMhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC1BC,GAAIjJ,KAAKy0O,OAAO/0O,EAAQuJ,MAGxBjJ,KAAK6qI,QtF5II,csF4IkBp3H,KAC3BzT,KAAKssL,OAAS,MAItB,OAAO75K,GACH,IAAIwnH,EAEAA,EADAj6H,KAAKssL,OACItsL,KAAKssL,OAAOgqD,WAEZjC,GAAc,GAAa5hO,IAEpCwnH,GACAjpC,GAASipC,EAAQ,mBAIzB,MAAMxnH,GACF,IAAKzS,KAAKssL,OACN,OAGJ,MAAQA,OAAQnuI,EAAK,QAAEz+C,EAAO,aAAE4tN,GAAiBttN,MAC3C,MAAEq+B,EAAOi4M,WAAYzyM,GAAWsa,EAChChiC,EAAUmxM,EAAa5tN,QAAQyc,QAC/BnT,EAAOhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC3BC,EAAKjJ,KAAKy0O,OAAO/0O,EAAQuJ,IACzBO,EAAMxJ,KAAKy0O,OAAO/0O,EAAQ8J,KAC1BoS,EAAM5b,KAAKy0O,OAAO/0O,EAAQkc,KAC1B00D,EAAQnyB,EAAMo0L,cAAgB9/N,EAAEu4B,EAAEq2B,SAClCm1K,EAAmBn4M,EAAMr1B,KAAzBwtO,EAAmCn4M,EAAMp1B,GACzCm0M,EAAO/+K,EAAMp1B,GAAKo1B,EAAMr1B,KACxB6uC,EAAQ,GAAc73C,KAAKmxB,QAAS,SAASif,OAASk9K,EAAaF,kBAAoB,GACvFr4M,EAASxL,KAAKw1B,MAAMuxC,EAAQz4B,IAAU17B,GAAW,EAAI,GAE3D,IAAK0nB,EACD,OAGJ,MAAMgxM,EAAahyC,GAAWh/J,EAAQ,iBAChCixM,EAAcjyC,GAAWh/J,EAAQ,kBAEnCg/J,GAAWh/J,EAAQ,+BACnBxF,EAAMr1B,KAAOO,KAAKC,IACdD,KAAKqS,IAAIpS,EAAKR,EAAO+L,GACrB6G,EAAMwhM,GAEV/+K,EAAMp1B,GAAKM,KAAKC,IACZ60B,EAAMr1B,KAAOo0M,EACbxhM,IAEIi5N,IAAe14N,GAAa24N,GAAe34N,GACnDkiB,EAAMr1B,KAAOO,KAAKC,IACdD,KAAKqS,IAAIpS,EAAKR,EAAO+L,GACrB6G,EAAM,GAEVyiB,EAAMp1B,GAAKM,KAAKqS,IAAIyiB,EAAMr1B,KAAO,EAAGq1B,EAAMp1B,MAClC4rO,GAAc14N,GAAa24N,IAAgB34N,KACnDkiB,EAAMp1B,GAAKM,KAAKC,IACZD,KAAKqS,IAAIpS,EAAM,EAAGP,EAAK8L,GACvB6G,GAEJyiB,EAAMr1B,KAAOO,KAAKC,IAAI60B,EAAMp1B,GAAK,EAAGo1B,EAAMr1B,OAG1Cq1B,EAAMr1B,OAASwtO,GAAiBn4M,EAAMp1B,KAAOutO,IAC7Cx2O,KAAKkqH,KAAK7rF,EAAMr1B,KAAMq1B,EAAMp1B,IAC5BjJ,KAAK6qI,QtF9MF,SsF8MkB7qI,KAAKu2O,gBAAgBl4M,KAIlD,OACI,GAAIr+B,KAAKssL,OAAQ,CACb,MAAMgqD,EAAat2O,KAAKssL,OAAOgqD,WAC3BA,ItVlSoB7hM,EsVmSR6hM,ItVlST7hM,EAAQ05B,YACnB15B,EAAQ05B,UAAY15B,EAAQ05B,UAAUhqE,QsViSN,kBtVjSyB,IAAIA,QAAQwiK,GAAa,MsVoS9E,MAAMtoI,EAAQr+B,KAAKssL,OAAOjuJ,MAC1Br+B,KAAKnB,IAAIw/B,EAAMr1B,KAAMq1B,EAAMp1B,IAC3BjJ,KAAK6qI,QtF1NE,YsF0NkB7qI,KAAKu2O,gBAAgBl4M,WAEvCr+B,KAAKssL,OtV1ST,IAAqB73I,EsV8ShC,KAAKhiC,GACD,MAAM,QAAE/S,EAAO,aAAE4tN,GAAiBttN,KAC5Bg0N,EAASh0N,KAAK8hM,MAAMwuC,kBAAkB79N,GACtC4rM,EAAaiP,EAAa7S,mBAAmB,IAAI,GAAMuZ,EAAOhpL,EAAGsiL,EAAahzC,IAAI5I,KAClF1oK,EAAOhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC3BC,EAAKjJ,KAAKy0O,OAAO/0O,EAAQuJ,IACzBO,EAAMxJ,KAAKy0O,OAAO/0O,EAAQ8J,KAC1BoS,EAAM5b,KAAKy0O,OAAO/0O,EAAQkc,KAC1BwhM,EAAOn0M,EAAKD,EAEZq1B,EAAQ,GACRo4M,EAA+B,IAAlBhkO,EAAE2uC,MAAMzH,MAC3B,IAAI5kC,EAASxL,KAAKw1B,MAHN/1B,EAAOo0M,EAAO,EAGIiB,GAE1Br+M,KAAKssL,QAAUmqD,IAKnBz2O,KAAK8hM,MAAMmxC,oBAEN3lB,EAAa5tN,QAAQq3M,WACtBhiM,IAGJspB,EAAMr1B,KAAOO,KAAKC,IACdD,KAAKqS,IAAIpS,EAAKR,EAAO+L,GACrB6G,EAAMwhM,GAGV/+K,EAAMp1B,GAAKM,KAAKC,IAAI60B,EAAMr1B,KAAOo0M,EAAMxhM,GAEvC5b,KAAKy1O,OAAOhjO,GACRzS,KAAKssL,SACLtsL,KAAKssL,OAAOjuJ,MAAQA,EACpBr+B,KAAK6qI,QtFpQF,SsFoQkB7qI,KAAKu2O,gBAAgBl4M,IAC1Cr+B,KAAK21O,SAIb,YAAYljO,GACR,IAAI69D,EAAQ+yH,GAAgB5wL,GAI5B,GAFAzS,KAAKy1O,OAAO,CAAE5xM,OAAQ7jC,KAAK00O,YAEvB10O,KAAKssL,OAAQ,CACb,MAAMjuJ,EAAQr+B,KAAKssL,OAAOjuJ,MAE1B5rB,EAAEkuC,iBACFluC,EAAE+iO,kBAEEjsO,KAAK+mC,IAAIggC,GAAS,IAClBA,GA1VU,GA6VVtwE,KAAKN,QAAQ01O,WAAWj5N,UACxBm0D,IAAU,GAGVtwE,KAAK1B,OAAOgyE,IACZtwE,KAAK6qI,QtF7RN,SsF6RsB,CACjB8wC,KAAM37K,KAAKstN,aAAa5tN,QACxB4wE,MAAOA,EACPszG,cAAenxK,EACfzJ,KAAMhJ,KAAK41I,OAAOv3G,EAAMr1B,MACxBC,GAAIjJ,KAAK41I,OAAOv3G,EAAMp1B,MAI1BjJ,KAAKq2O,YACL37N,aAAa1a,KAAKq2O,YAGtBr2O,KAAKq2O,WAAav7N,WAAW,KACzB9a,KAAK21O,QtF5RI,MsFiSrB,cAAcljO,GACV,MAAM/S,EAAUM,KAAKN,QAErBM,KAAKssL,OAAS,CACVjuJ,MAAO,CACHr1B,KAAMhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC1BC,GAAIjJ,KAAKy0O,OAAO/0O,EAAQuJ,MAGhC,MAAMwK,EAAOzT,KAAKu2O,gBAAgBv2O,KAAKssL,OAAOjuJ,OAE1Cr+B,KAAK6qI,QtF5TI,csF4TkBp3H,GAC3BzT,KAAKssL,OAAS,KAEd75K,EAAEkuC,iBAIV,cACQ3gD,KAAKssL,SACLtsL,KAAK6qI,QtFnUE,YsFmUkB7qI,KAAKu2O,gBAAgBv2O,KAAKssL,OAAOjuJ,eACnDr+B,KAAKssL,QAIpB,eAAe75K,GACX,MAAM,MAAEqvL,EAAOxV,OAAQnuI,EAAK,QAAEz+C,EAAO,aAAE4tN,GAAiBttN,KAClDq+B,EAAQ8f,EAAM9f,MACduyI,EAAKkxB,EAAM40C,oBAAoBjkO,EAAEopC,QAAQ,GAAG7Q,EAAEq2B,UAAUr2B,EACxD2N,EAAKmpJ,EAAM40C,oBAAoBjkO,EAAEopC,QAAQ,GAAG7Q,EAAEq2B,UAAUr2B,EACxD2G,EAAOpoC,KAAKC,IAAIonK,EAAIj4H,GACpB/G,EAAQroC,KAAKqS,IAAIg1J,EAAIj4H,GAE3BlmC,EAAEkuC,iBAEFtiB,EAAMr1B,KAAOskN,EAAa7S,mBAAmB,IAAI,GAAM9oK,KAAUjyC,EAAQ8J,IAEzE60B,EAAMp1B,GAAKqkN,EAAa7S,mBAAmB,IAAI,GAAM7oK,KAAWlyC,EAAQkc,IAExE5b,KAAKkqH,KAAK7rF,EAAMr1B,KAAMq1B,EAAMp1B,IAE5BjJ,KAAK6qI,QtFzVE,SsFyVc7qI,KAAKu2O,gBAAgBl4M,IAG9C,OAAOhzB,GACH,IAAI2I,EAAQ3I,EAMZ,OAJIA,aAAiBoN,OACjBzE,EAAQhU,KAAKstN,aAAa9S,cAAcnvM,IAGrC2I,EAGX,OAAOA,GACH,IAAI3I,EAAQ2I,EAQZ,OAPIhU,KAAKs0O,YACLjpO,EAAQrL,KAAKstN,aAAaiE,WAAWv9M,GACjC3I,EAAQrL,KAAKN,QAAQkc,MACrBvQ,EAAQrL,KAAKN,QAAQkc,MAItBvQ,EAGX,MAAMA,GACF,MAAMiiN,EAAettN,KAAKstN,aACpBt5M,EAAQhU,KAAKy0O,OAAOppO,GAE1B,OAAOiiN,EAAala,QAAQp/L,EAAOA,GAAO,GAG9C,KAAKhL,EAAMC,GACP,MAAMvJ,EAAUM,KAAKN,QACfyc,EAAUnc,KAAKstN,aAAa5tN,QAAQyc,SACpC,OAAEpH,EAAM,QAAE8uK,EAAS6wD,WAAW,OAAErrC,IAAa3pM,EAE7CkyC,EAAQz1B,EAAUnT,EAAOC,EACzB+7K,EAAO,KAAO7oK,EAAU,EAAI,GAElC,IAAIm+J,EAAMt6K,KAAK22O,MAJFx6N,EAAUlT,EAAKD,GAK5B,MAAM4tO,EAAgB,GAAMt8D,EAAI0K,GAAQjwK,EAAO48B,KAAOkyI,EAAQlyI,MAE9D,GAAc3xC,KAAK20O,SAAU,CACzBvkM,MAAOwmM,IAEX,GAAc52O,KAAK00O,UAAW,CAC1B/iM,KAAMilM,IAGVt8D,EAAMt6K,KAAK22O,MAAM/kM,GAEjB,MAAMilM,EAAiB,GAAMn3O,EAAQ0wC,OAASkqI,EAAI0K,GAAQjwK,EAAO48B,KAAOkyI,EAAQlyI,OAChF,GAAc3xC,KAAK40O,UAAW,CAC1BxkM,MAAOymM,IAGX,IAAI7/L,EAAWt3C,EAAQ0wC,MAAQymM,EAC3B7/L,IAAat3C,EAAQ0wC,QACrB4G,GAAYqyJ,EAAOz3J,OAGvB,GAAc5xC,KAAK40O,UAAW,CAC1BjjM,KAAMqF,IAEV,GAAch3C,KAAK00O,UAAW,CAC1BtkM,MAAO7mC,KAAKqS,IAAIlc,EAAQ0wC,OAASwmM,EAAgBC,GAAkBxtC,EAAOz3J,MAAO,KAIzF,IAAI5oC,EAAMC,GACN,MAAMvJ,EAAUM,KAAKN,QACf8J,EAAMxJ,KAAKy0O,OAAO/0O,EAAQ8J,KAC1BoS,EAAM5b,KAAKy0O,OAAO/0O,EAAQkc,KAC1B4pM,EAAY,GAAWxlN,KAAKy0O,OAAOzrO,GAAOQ,EAAKoS,GAC/Ck7N,EAAU,GAAW92O,KAAKy0O,OAAOxrO,GAAKu8M,EAAY,EAAG5pM,GAEvDlc,EAAQ0sK,SACRpsK,KAAKkqH,KAAKs7F,EAAWsxB,GAGzBp3O,EAAQsJ,KAAOhJ,KAAK41I,OAAO4vE,GAC3B9lN,EAAQuJ,GAAKjJ,KAAK41I,OAAOkhG,GAG7B,OAAOxmK,GACH,MAAM5wE,EAAUM,KAAKN,QACf8J,EAAMxJ,KAAKy0O,OAAO/0O,EAAQ8J,KAC1BoS,EAAM5b,KAAKy0O,OAAO/0O,EAAQkc,KAC1Bm7N,EAAOr3O,EAAQ01O,WAAW4B,KAC1BhuO,EAAOhJ,KAAKy0O,OAAO/0O,EAAQsJ,MAC3BC,EAAKjJ,KAAKy0O,OAAO/0O,EAAQuJ,IAC/B,IAAIo1B,EAAQ,CAAEr1B,KAAMA,EAAMC,GAAIA,GAC9B,MAAMutO,EAAWp1C,GAAW,GAAI/iK,GAqBhC,GAnBIr+B,KAAKssL,SACLjuJ,EAAQr+B,KAAKssL,OAAOjuJ,OAGpB04M,IAAS3wE,KACT/nI,EAAMr1B,KAAO,GACT,GAAWA,EAAOsnE,EAAO,EAAGrnE,EAAK,GACjCO,EAAKoS,IAITm7N,IAAS9wE,KACT5nI,EAAMp1B,GAAK,GACP,GAAWA,EAAKqnE,EAAOjyC,EAAMr1B,KAAO,EAAG4S,GACvCpS,EACAoS,IAIJyiB,EAAMr1B,OAASwtO,EAASxtO,MAAQq1B,EAAMp1B,KAAOutO,EAASvtO,GAEtD,OADAjJ,KAAKnB,IAAIw/B,EAAMr1B,KAAMq1B,EAAMp1B,KACpB,EAIf,QAAQwB,EAAMgJ,GACV,OAAQzT,KAAK4oD,UAAY5oD,KAAK8hM,OAAOj3D,QAAQpgI,EAAMgJ,IAI3DmwL,GAAkB,GAAW,CACzBx3B,SAAS,EACTgpE,WAAY,CACR4B,KAAM,QAEVxtO,IAAK28J,GACLvqJ,IAAKsqJ,KAGM,IAAA,GAAA,GChhBA,GA1Bf,cAAsB,GAClB,KAAKkD,GACD,IAAKA,IAAUA,EAAMs1D,eAAkB1+N,KAAK+8L,UAAY/8L,KAAK+8L,WAAa3zB,EACtE,OAGJ,MAAM1pK,EAAU0hM,GAAW,GAAIphM,KAAKN,QAAS0pK,EAAM1pK,QAAQq7N,SACrD9/I,EAASmuF,EAAMs1D,gBAEjBzjJ,GACAj7E,KAAK+8L,SAAW3zB,EAChBniH,MAAMkhJ,KAAK,CACP/+B,MAAOA,EACPnuF,OAAQA,GACTv7E,EAAS0pK,IAEZppK,KAAK01M,OAIb,cACW11M,KAAK+8L,SACZ91I,MAAMyuJ,SCrBd,MAAM,WAAsB,GACxB,YAAY7C,EAAUnzM,GAClBunD,MAAM4rJ,EAAS7L,aAActnM,GAE7BM,KAAK6yM,SAAWA,EAChB7yM,KAAKs/N,cAAgBzsB,EAAS7L,aAAa78L,OAG/C,OAAO0lK,EAAQmkD,GACX,MAAMijB,EAAgBr0C,GAAK/yB,GAAAA,SAAiBzG,GACxC,MAAM2xD,EAAU3xD,EAAMq/B,OAAOsyB,QAG7B,QAFiBA,IAA+B,IAApBA,EAAQ3uD,YAKxC,GAAI6qE,EAAcn2O,OAAS,EAAG,CAC1B,MAAMsoK,EAAQ6tE,EAAc,GACtBzhC,EAAOx1M,KAAK6yM,SAASya,aAAala,QAAQhqC,EAAMi1C,YAEhDpjI,EAAS+4I,EAASh0N,KAAKk3O,YAAYljB,EAAQxe,GAAQx1M,KAAKm3O,eAAe/tE,EAAOosC,GAEpFx1M,KAAKmoM,KAAK,CACNltH,OAAQA,EACRm8J,QAAQ,EACRvnE,OAAQA,EACR84B,SAAUv/B,EAAMu/B,SAChB0uC,aAAcr3O,KAAKs/N,cAActwB,KAAKhvM,KAAKN,QAAQ43O,eAAgBluE,EAAMu/B,UACzEF,OAAQzoM,KAAK6yM,SAASpK,QACvBzoM,KAAKN,UAIhB,YAAY0pK,EAAOosC,GAWf,OAVax1M,KAAK6yM,SAASya,aAMjB5tN,QAAQ+rM,WACdriC,EAAMp+H,EAAIwqK,EAAK9+J,SAAS1L,GAGrB,CACHo+H,MAAOA,EACPsS,MAXU,CACVk4C,WAAY,OACZnoB,SAAU,WAalB,eAAeriC,EAAOosC,GAClB,MAAMl7B,EAAMlR,EAAM2mD,MAAM/c,KAAKitB,YACvBx0B,EAAWzrM,KAAK6yM,SAASya,aAAa5tN,QAAQ+rM,SAC9C/0J,EAAS4jI,EAAI5jI,SACb6gM,EAAa/hC,EAAK9+J,SAMxB,IAAI8gM,EAOJ,OALIA,EADA/rC,EACc,IAAI,GAAM/0J,EAAO1L,EAAGusM,EAAWpnM,GAE/B,IAAI,GAAMonM,EAAWvsM,EAAG0L,EAAOvG,GAG1C,CACHi5H,MAAOouE,EACP97D,MAdU,CACVk4C,WAAY,SACZnoB,SAAU,YAiBtB7H,GAAkB,GAAe,CAC7B0zC,eAAgB,UAGL,IAAA,GAAA,GC5Ef,MAAM,WAA0B,EAAK7vC,UAEjC,QACI,MAAM,QAAEhzJ,EAAO,QAAE/0C,GAAYM,KAG7B,GAFay0C,EAAQw3H,OAEX,CACNjsK,KAAKgvC,OAAStvC,EAAQsvC,OACtB,MAAM2sI,EAAOj8K,EAAQ+rM,SAAWhlC,GAAID,GAE9BixE,EAAYz3O,KAAKy3O,UAAY,IAAI,EAAKjxC,MAAM,EAAG,GACrDixC,EAAU97D,GAAQkwC,GAElBp3K,EAAQ38B,UAAU,EAAKA,YAClB+/B,MAAM4/L,EAAUzsM,EAAGysM,EAAUtnM,SAGlCnwC,KAAKu8H,QAIb,KAAKzV,GACD,MAAM8hD,EAAS1gI,GAAiBloC,KAAKy3O,UAAUzsM,EAAG,EAAG87E,GAC/C+hD,EAAS3gI,GAAiBloC,KAAKy3O,UAAUtnM,EAAG,EAAG22E,GAErD9mH,KAAKy0C,QAAQ38B,UAAU,EAAKA,YACvB+/B,MAAM+wH,EAAQC,EAAQ7oK,KAAKgvC,SAIpC,QACIiY,MAAMs1E,QACNv8H,KAAKy0C,QAAQ38B,UAAU,OAI/B8rL,GAAkB,GAAmB,CACjCz+B,SzFxC+B,MyF2CnC,EAAKqwD,iBAAiBn/M,QAAQo/M,SAAS3J,GAAK,ICzC5C,MAAM,WAAwB,EAAKrkB,UAC/B,QACI,MAAM/wJ,EAAS12C,KAAK02C,OAAS12C,KAAKy0C,QAAQw3H,OAAOv1H,SACjD12C,KAAKy0C,QAAQ38B,UAAU,EAAKA,YACvB+/B,MAAMg0K,GAAaA,GAAan1K,IAIzC,KAAKowE,GACD9mH,KAAKy0C,QAAQ38B,UAAU,EAAKA,YACvB+/B,MAAMivE,EAAKA,EAAK9mH,KAAK02C,UAKlCktJ,GAAkB,GAAiB,CAC/B1jB,OAAQ,mBAGZ,EAAKs1C,iBAAiBn/M,QAAQo/M,S1FKf,S0FLgC,ICnB/C,MAAM,WAAwB,EAAKhuB,UAC/B,QACIznM,KAAK03O,OAAS13O,KAAKy0C,QAAQq5H,UAC3B9tK,KAAKy0C,QAAQq5H,QAAQ,GAGzB,KAAKhnD,GACD9mH,KAAKy0C,QAAQq5H,QAAQhnD,EAAM9mH,KAAK03O,SAIxC9zC,GAAkB,GAAiB,CAC/Bz+B,SAAU,IACV+a,OAAQ,WAGZ,EAAKs1C,iBAAiBn/M,QAAQo/M,S3FjBf,S2FiBgC,IChB/C,MAAM,WAAqB,EAAKhuB,UAC5B,QACIznM,KAAKy0C,QAAQ38B,UAAU,EAAKA,YACvB+/B,MAAMg0K,GAAaA,GAAa7rN,KAAKN,QAAQg3C,SAItD,KAAKowE,GACD9mH,KAAKy0C,QAAQ38B,UAAU,EAAKA,YACvB+/B,MAAMivE,EAAKA,EAAK9mH,KAAKN,QAAQg3C,UAK1CktJ,GAAkB,GAAc,CAC5B1jB,OAAQ,iBACR/a,S5FlB+B,M4FqBnC,EAAKqwD,iBAAiBn/M,QAAQo/M,SAASxJ,GAAK,ICd5C,MAAM,WAAyB,GAC3B,SACIhlK,MAAM++H,SAENhmL,KAAK00N,iBAGT,cAAcrlB,EAAYohB,EAAe1C,GAErC,IAAIC,EAQJ,OALIA,E7FCG,W6FLOyC,EAAchkL,MAIZ,GAEA,GAGT,IAAIuhL,EAAU3e,EAAYohB,EAAe1C,GAGpD,kBAEI,OADe9mK,MAAM4uK,kBACPlsN,OAAO3J,KAAK20N,WAG9B,mBAAmBtpN,EAAO6pN,GACtB,GAAIA,IAAkBhsD,GAAM,CACxB,MAAMyuE,EAAe,CACjB3sM,EAAG3/B,EAAM2/B,EACTmF,EAAG9kC,EAAM8kC,GAQb,OANK,GAASwnM,EAAa3sM,KACvB2sM,EAAa3sM,EAAI,GAEhB,GAAS2sM,EAAaxnM,KACvBwnM,EAAaxnM,EAAI,GAEdwnM,IAKnBv2C,GAAW,GAAiBngM,UAAW,IAExB,IAAA,GAAA,GCpCf,MAAM,WAAmB,GACrB,aACIjB,KAAKw9N,WAAa,GAClBx9N,KAAKy9N,WAAa,GAElBz9N,KAAK43O,kBAAoB,IAAI,GAC7B53O,KAAK63O,kBAAoB,IAAI,GAGjC,OAAO7U,EAAQhjO,KAAKgjO,OAChB,MAAMwB,EAAexkO,KAAKssO,oBAE1B,IAAK,IAAI5rO,EAAI,EAAGA,EAAIsiO,EAAMliO,OAAQJ,IAAK,CACnC,MAAMsyM,EAAOgwB,EAAMtiO,GACb6rO,EAAa/H,EAAaxxB,EAAKtzM,QAAQ+K,MAAQ,YAAc,GACnEzK,KAAKwsO,YAAYD,GACjB,MAAMuL,EAAiB93O,KAAK0sO,oBAAoBH,GAE3CuL,IAIL93O,KAAK+3O,mBACDtW,GAAmBqW,E9FOnB,W8FNA9kC,GAGJhzM,KAAKg4O,uBACDvW,GAAmBqW,E9FGd,e8FFL9kC,GAGJhzM,KAAKi4O,kBACDxW,GAAmBqW,E9FtBpB,U8FuBC9kC,IAIRhzM,KAAKk4O,WAAWlV,GAGpB,YAAYlhC,EAAOkR,GACfhzM,KAAK43O,kBAAkB/0M,OAAOi/J,EAAM86B,aACpC58N,KAAK63O,kBAAkBh1M,OAAOi/J,EAAM+6B,aAEpC51K,MAAMw8K,YAAY3hC,EAAOkR,GAG7B,WAAWr3B,GACP,MAAMizC,EAAWjzC,EAAKj8K,QAAQ+K,KAE9Bw8C,MAAM25K,WAAWjlD,GAEbA,EAAKj8K,QAAQ+rM,UACbzrM,KAAK63O,kBAAkBp2L,MAAMmtK,UACtB5uN,KAAKy9N,WAAW7O,KAEvB5uN,KAAK43O,kBAAkBn2L,MAAMmtK,UACtB5uN,KAAKw9N,WAAW5O,IAGvBjzC,IAAS37K,KAAKqxM,cACPrxM,KAAKqxM,MAGZ11B,IAAS37K,KAAKsxM,cACPtxM,KAAKsxM,MAKpB,eAAe7I,GACX,MAAM/oM,EAAUM,KAAKN,QACfy9N,EAAY10B,EAAOy0B,MAEnBA,EAAQt6B,GADO,GAAGj5L,OAAOjK,EAAQw9N,QAAAA,SACGj+N,GAAK,OAAOA,EAAEwL,OAAS0yN,KAAc,GACzEE,EAAY50B,EAAO20B,MAEnBA,EAAQx6B,GADO,GAAGj5L,OAAOjK,EAAQ09N,QAAAA,SACGn+N,GAAK,OAAOA,EAAEwL,OAAS4yN,KAAc,GAK/E,OAFkBH,GAAS,IAAIlqB,OAASoqB,GAAS,IAAIpqB,OAFvCtzM,EAAQsjO,OAAS,CAAE,KACH,GAAGv4N,MAAQ,UAM7C,mBAAmBg+L,EAAQuK,GACnBvK,EAAO3nM,OAAS,GAChBd,KAAKyjO,YACD,IAAI,GAAazjO,KAAM,CAAEyoM,OAAQA,EAAQ78B,KAAMonC,EAAKtzM,QAAQksK,OAC5DonC,GAKZ,uBAAuBvK,EAAQuK,GACvBvK,EAAO3nM,OAAS,GAChBd,KAAKyjO,YACD,IAAI,GAAiBzjO,KAAM,CAAEyoM,OAAQA,EAAQ78B,KAAMonC,EAAKtzM,QAAQksK,OAChEonC,GAKZ,kBAAkBvK,EAAQuK,GAClBvK,EAAO3nM,OAAS,GAChBd,KAAKyjO,YACD,IAAI,GAAYzjO,KAAM,CAAEyoM,OAAQA,EAAQ78B,KAAMonC,EAAKtzM,QAAQksK,OAC3DonC,GAKZ,aAAatzM,EAAS+rM,EAAU2lB,GAC5B,MAAMxC,EAAWlvN,EAAQ+K,KACnB0tO,EAAY1sC,EAAWzrM,KAAKy9N,WAAaz9N,KAAKw9N,WAC9C0S,EAAUzkC,EAAWzrM,KAAK63O,kBAAoB73O,KAAK43O,kBACnDx1B,EAAchhB,GAAW,CAAEjlL,SAAUsvL,GAAYzrM,KAAKgnM,aAAalc,KAAOprL,EAAS,CAAE+rM,SAAUA,IAC/F2sC,EAAQ5W,GAAiBpf,EAAY9+M,K9FnD/B,O8FoDN6sO,EAAeD,EAAQn1H,QACvBs1H,EAAmB+H,EAAQ,CAAE5uO,IAAK,GAAKoS,IAAK,GAAM,CAAEpS,IAAK,EAAGoS,IAAK,GACjEyiB,EAAQ6xM,EAAQn1H,MAAM6zG,IAAauhB,GAAgBE,EACnDgI,EAAc,CAAEj2B,EAAY54M,IAAK44M,EAAYxmM,KAC7C6sL,EAASzoM,KAAKyoM,OAEpB,IAAK,IAAIslB,EAAW,EAAGA,EAAWtlB,EAAO3nM,OAAQitN,IAAY,CACzD,MAAM0C,EAAgBhoB,EAAOslB,GACvBuqB,EAAiB7nB,EAAchlB,EAAW,QAAU,SAC1D,GAAK6sC,IAAmBl2B,EAAY33M,MAAwB,IAAd2mN,IAAoBknB,EAAiB,CAC/E,MAAMC,EAAkB,GAAaliO,QAAQu7M,UAAUnB,EAAe,GAAG/G,YACzE2uB,EAAYh1O,KAAKk1O,EAAgB9sC,EAAW,IAAM,MAElD,OASR,IAAI+sC,EASA/xB,EAdc,IAAd2K,GAAmB+e,IACnB9xM,EAAM70B,IAAMD,KAAKC,IAAI60B,EAAM70B,IAAK2mO,EAAa3mO,KAC7C60B,EAAMziB,IAAMrS,KAAKqS,IAAIyiB,EAAMziB,IAAKu0N,EAAav0N,MAKjD,IAAK,IAAIlb,EAAI,EAAGA,EAAI23O,EAAYv3O,OAAQJ,IACpC,GAAI23O,EAAY33O,aAAc+X,KAAM,CAChC+/N,GAAe,EACf,MAMJ/xB,EADA+a,GAAiBpf,EAAY9+M,KAAMyiK,MAAWq8C,EAAY9+M,MAAQk1O,EACvD,GACJJ,EACI,GAEA,GAGf,MAAMz8D,EAAO,IAAI8qC,EAASpoL,EAAM70B,IAAK60B,EAAMziB,IAAKwmM,EAAapiN,KAAKgnM,cAGlE,GAFArrB,EAAKy1C,UAAYA,EAEbxC,EAAU,CACV,GAAIupB,EAAUvpB,GACV,MAAM,IAAInoN,MAAM,GAAIglM,EAAW,IAAM,sBAAwBmjB,wBAEjEupB,EAAUvpB,GAAYjzC,EAK1B,OAFA37K,KAAKsjO,WAAW3nD,GAETA,EAGX,WAAWqnD,GACP,MAAMtjO,EAAUM,KAAKN,QACf+4O,EAAe,GAAG9uO,OAAOjK,EAAQw9N,OACjCgH,EAAQ,GACRwU,EAAe,GAAG/uO,OAAOjK,EAAQ09N,OACjC+G,EAAQ,GAEd,IAAK,IAAIj3L,EAAM,EAAGA,EAAMurM,EAAa33O,OAAQosC,IAErC+G,GADaj0C,KAAKqjO,SAASoV,EAAavrM,GAAK8lK,MAC3BgwB,IAClBkB,EAAM7gO,KAAKrD,KAAK24O,aAAaF,EAAavrM,IAAM,EAAOA,IAI/D,IAAK,IAAIA,EAAM,EAAGA,EAAMwrM,EAAa53O,OAAQosC,IAErC+G,GADaj0C,KAAKqjO,SAASqV,EAAaxrM,GAAK8lK,MAC3BgwB,IAClBmB,EAAM9gO,KAAKrD,KAAK24O,aAAaD,EAAaxrM,IAAM,EAAMA,IAI9DltC,KAAKqxM,MAAQrxM,KAAKqxM,OAAS6yB,EAAM,GACjClkO,KAAKsxM,MAAQtxM,KAAKsxM,OAAS6yB,EAAM,GAGrC,eAAeriC,EAAOrvL,EAAGojC,GACrB,MAAMm+K,EAASlyB,EAAMwuC,kBAAkB79N,GACjC22J,EAAQ,IAAI,GAAM4qD,EAAOhpL,EAAGgpL,EAAO7jL,GACnC2wL,EAAU9gO,KAAKizM,KACfnyM,EAASggO,EAAQhgO,OACjB83O,EAAU,GACVC,EAAU,GAEhB,IAAK,IAAIn4O,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAMi7K,EAAOmlD,EAAQpgO,GACfoU,EAAS6mK,EAAKj8K,QAAQ+rM,SAAWotC,EAAUD,EAC3CjnJ,EAAegqF,EAAK9lC,SAASuzB,GACd,OAAjBz3E,GACA78E,EAAOzR,KAAKsuF,GAIhBinJ,EAAQ93O,OAAS,GAAK+3O,EAAQ/3O,OAAS,GACvCghM,EAAMj3D,QAAQh1F,EAAW,CACrBpB,QAAS,GAAahiC,GACtBmxK,cAAenxK,EACfu4B,EAAG82L,GAAkB8W,GACrBzoM,EAAG2xL,GAAkB+W,KAKjC,kBAAkBl9D,EAAMj8K,GACpB,MAAM+rM,EAAW9vB,EAAKj8K,QAAQ+rM,SACxBwH,EAAOjzM,KAAKwmO,UAAUxmO,KAAKgjO,OAC3BhvN,GAASy3L,EAAWwH,EAAK9iK,EAAI8iK,EAAKjoK,GAAGnpC,QAAQ85K,GAEnD,GAAkB37K,KAAKN,QAASsU,EAAOy3L,EAAU/rM,GACjD,GAAkBM,KAAK2iO,gBAAiB3uN,EAAOy3L,EAAU/rM,IAIjE,SAAS,GAAkB+wO,EAAerf,EAAW3lB,EAAU/rM,GAE3D0hM,GADqB,GAAGz3L,OAAO8hM,EAAWglC,EAAcrT,MAAQqT,EAAcvT,OAAQ9L,GAC9D1xN,GAG5BkkM,GAAkB,GAAY,CAC1Bs5B,MAAO,GACPE,MAAO,KAGXh8B,GAAW,GAAWngM,UAAW,IAElB,IAAA,GAAA,GC/Pf,MAAM,WAAmB,GACrB,YAAYoK,EAAOi6L,EAAQ5lM,GACvBunD,MAAMvnD,GAENM,KAAKqL,MAAQA,EACbrL,KAAKslM,OAASA,EAGlB,SACI,MAAM0K,EAAShwM,KAAKN,QAAQswM,OACtBhJ,EAAehnM,KAAK+vN,MAAM/oB,aAChC,IAAI8rB,EAAY9yN,KAAKqL,MAErB,GAAIrL,KAAK4yN,YAA8B,IAAjB5yN,KAAKosK,QACvB,OAEJpsK,KAAK4yN,WAAY,EAEjB,MAAMpf,EAAgBhR,GAAYwN,GAC5B/F,EAAYjqM,KAAKiqM,YAQvB,GANIuJ,EACAsf,EAAYtf,EAAcvJ,GACnB+F,EAAO7lM,SACd2oN,EAAY9rB,EAAa78L,OAAO6kM,KAAKgB,EAAO7lM,OAAQ2oN,IAGpD9iB,EAAO5jC,UAAY0mD,GAA2B,IAAdA,GAAkB,CAClD,GAAI9iB,EAAOlsK,WAAa+hI,I/FiDjB,c+FjD2BmqC,EAAOlsK,SAAyB,CAC9D,IAAKksK,EAAOtkC,MAAO,CACf,MAAMotE,EAAkB,IAAI,GAAM94O,KAAKN,QAAQgsK,OAAO4mD,iBAElDtiB,EAAOtkC,MADPotE,EAAkB,IACHnzE,GAEAY,GAGlBypC,EAAOpG,aACRoG,EAAOpG,WAAa5pM,KAAKN,QAAQgsK,WAElC,CACH,MAAMqtE,EAAc/xC,EAAagyC,MAAMC,eAAejpC,OACtDA,EAAOtkC,MAAQskC,EAAOtkC,OAASqtE,EAAYrtE,MAC3CskC,EAAOpG,WAAaoG,EAAOpG,YAAcmvC,EAAYnvC,WAIzD5pM,KAAK8+H,MAAQ,IAAI,GAAQg0F,EAAW1xB,GAAW,GAAI4O,EAAQ,CACvDt0B,MAAO7V,GACP0jC,OAAQ,GACR11G,UAAW,CACPvwF,K/F1DL,S+F2DK+2B,MAAOr6B,KAAKk5O,kBAEhBjvC,GAEJjqM,KAAKq6H,OAAOr6H,KAAK8+H,QAIzB,OAAOulE,GACHrkM,KAAKgmL,SACLhmL,KAAKs6K,IAAM+pB,EACXrkM,KAAKmzN,cAGT,cACI,MAAQzzN,SAAWswM,OAAQmpC,GAAe,MAAEr6G,GAAU9+H,KAChDslM,EAAStlM,KAAKslM,OAAOjvK,QACrB+iN,EAAiBD,EAAcniM,SAC/BF,EAAQwuJ,EAAOvxI,SAErB,GAAI+qE,EAAO,CACP,MAAMu6G,EAAcv6G,EAAMw7C,IAAIzQ,SACxByvE,EAAax6G,EAAMw7C,IAAIlqI,QAC7B,IAAImpM,EAEJ,GAAIJ,EAAcr1M,WAAa+hI,GAC3By/B,EAAOp4B,OAAS3jK,KAAK+mC,KAAKg1J,EAAOp4B,OAASmsE,GAAe,GAAKA,EAC9DE,EAAKj0C,EAAOl8B,MAAMtyH,GAClBgoF,EAAM+nE,OAAO,IAAI,GAAI0yC,EAAGvuM,EAAGuuM,EAAGppM,EAAIkpM,EAAc,EAAGE,EAAGvuM,EAAGuuM,EAAGppM,SACzD,G/FJA,c+FIIgpM,EAAcr1M,SACrBwhK,EAAOp4B,OAASo4B,EAAOp4B,OAASmsE,EAAc,EAC9CE,EAAKj0C,EAAOl8B,MAAMtyH,GAClBgoF,EAAM+nE,OAAO,IAAI,GAAI0yC,EAAGvuM,EAAGuuM,EAAGppM,EAAIkpM,EAAc,EAAGE,EAAGvuM,EAAGuuM,EAAGppM,QACzD,CACH,IAAIshI,EACJ8nE,EAAKj0C,EAAOjvK,QAAQ/3B,OAAO86O,GAAgBhwE,MAAMtyH,GAC7CyiM,EAAGvuM,GAAKs6J,EAAO5uJ,OAAO1L,GACtBymI,EAAK8nE,EAAGvuM,EAAIsuM,EACZx6G,EAAMo9C,YAAc9V,KAEpBqL,EAAK8nE,EAAGvuM,EAAIsuM,EACZx6G,EAAMo9C,YAAcjW,IAExBnnC,EAAM+nE,OAAO,IAAI,GAAIp1B,EAAI8nE,EAAGppM,EAAIkpM,EAAaE,EAAGvuM,EAAGuuM,EAAGppM,MAKlE,eACI,MAAM,OAAEm1J,EAAM,QAAE5lM,GAAYM,KAI5B,GAFAinD,MAAMigJ,eAEFlnM,KAAKqL,MACL,GAAI3L,EAAQwsL,OAAQ,CAChB,MAAMld,GAAcs2B,EAAOt2B,WAAa,KAAO,IACzCkd,EAASxsL,EAAQwsL,OAAO,CAC1Byc,SAAU3oM,KAAK2oM,SACfD,SAAU1oM,KAAK0oM,SACfr9L,MAAOrL,KAAKqL,MACZo9L,OAAQzoM,KAAKyoM,OACbG,WAAY5oM,KAAK4oM,WACjBlyJ,OAAQ,IAAI,EAAK8vJ,MAAMlB,EAAO5uJ,OAAO1L,EAAGs6J,EAAO5uJ,OAAOvG,GACtD+8H,OAAQo4B,EAAOp4B,OACf+3B,YAAaK,EAAOL,YACpBj2B,WAAYA,EACZC,SAAUD,EAAas2B,EAAOxuJ,MAC9Bp3C,QAASA,EACT2hL,OAAQrhL,KAAKwoM,YACbtB,aAAc,KACV,MAAM3vK,EAAQ,IAAI,EAAKwlF,MAGvB,OAFA/8G,KAAKw5O,oBAAoBjiN,GAElBA,KAIX20J,GACAlsL,KAAKksL,OAAO7xD,OAAO6xD,QAGvBlsL,KAAKw5O,oBAAoBx5O,KAAKksL,QAK1C,oBAAoB30J,GAChB,MAAM,OAAE+tK,EAAM,QAAE5lM,GAAYM,KACtBy5O,EAAgB/5O,EAAQ2pM,QAAU,GASlC39B,EAAQhsK,EAAQgsK,MAChB5tK,EAAO,CACT4tK,MAAOA,EACPoC,QAASpuK,EAAQouK,SAEfoe,EAASlsL,KAAKg1N,cAAc1vB,EAAQlE,GAAW,CACjDtjM,KAAMA,EACN6uK,OAAQ,CACJmB,QAASpuK,EAAQouK,SAErBshB,OAAQ1vL,EAAQ0vL,QAlBLqqD,EAAcrpM,MAAQ,EAAI,CACrCu8H,OAAQ,CACJjB,MAAO+tE,EAAc/tE,MACrBt7H,MAAOqpM,EAAcrpM,MACrB09H,QAAS2rE,EAAc3rE,QACvBsb,SAAUqwD,EAAcrwD,WAE5B,KAcJ7xJ,EAAM8iG,OAAO6xD,GAETssC,GAAmB94N,IACnB63B,EAAM8iG,OAAOr6H,KAAK64N,sBAAsB3sC,EAAQ,CAC5C4sC,UAAWptD,EACXyT,aAAcrhL,GACfsjM,GAAW,CACV1qJ,OAAQ,CAAE4uJ,EAAO5uJ,OAAO1L,EAAGs6J,EAAO5uJ,OAAOvG,GACzC80J,YAAaK,EAAOL,YACpB/3B,OAAQo4B,EAAOp4B,OACf8R,WAAW,GACZt/K,EAAQqpM,WAInB,cAAczD,EAAQ5lM,GAClB,OAAIA,EAAQg6O,cACD,IAAI,EAAKxuD,OAAO,IAAI,EAAKA,OAAO,IAAI,EAAKsb,MAAMlB,EAAO5uJ,OAAO1L,EAAGs6J,EAAO5uJ,OAAOvG,GAAIm1J,EAAOp4B,QAASxtK,GAGtG,GAAa2W,QAAQgvM,WAAW/f,EAAQ5lM,GAGnD,kBACI,MAAM,QAAEA,EAAS4lM,QAAQ,OAAE5uJ,IAAa12C,KAExCohM,GAAW1hM,EAAS,CAChBm0F,UAAW,CACPn9C,OAAQ,CAAEA,EAAO1L,EAAG0L,EAAOvG,GAC3B9V,MAAOr6B,KAAKk5O,kBAIpBjyL,MAAMmgJ,kBAGV,gBAAgB1nM,GACZ,MAAMuoM,EAAYjoM,KAAKN,QAAQuoM,WAAa,GACtCoB,EAASpB,EAAUoB,QAAU,GAEnC,OAAOrpM,KAAKg1N,cAAch1N,KAAKslM,OAAQlE,GAAW,GAAI1hM,EAAS,CAC3D5B,KAAM,CACF4tK,MAAOu8B,EAAUv8B,MACjBoC,QAASm6B,EAAUn6B,SAEvBnB,OAAQ,CACJmB,QAASu7B,EAAOv7B,QAChB19H,MAAOi5J,EAAOj5J,MACds7H,MAAO29B,EAAO39B,UAK1B,kBACI,OAAO1rK,KAAKksL,OAAO96I,SAAS,GAGhC,sBACI,MAAMk0J,EAAStlM,KAAKslM,OAEpB,MAAO,CACH5lM,QAASM,KAAKN,QACdwtK,OAAQo4B,EAAOp4B,OACf+3B,YAAaK,EAAOL,YACpBvuJ,OAAQ,IAAI,EAAK8vJ,MAAMlB,EAAO5uJ,OAAO1L,EAAGs6J,EAAO5uJ,OAAOvG,GACtD6+H,WAAYs2B,EAAOt2B,WACnBC,SAAUq2B,EAAOxuJ,MAAQwuJ,EAAOt2B,WAChCkd,OAAQlsL,KAAKksL,QAIrB,gBACI,MAAMoZ,EAAStlM,KAAKslM,OAAOjvK,QAAQ/3B,O/F7OpB,G+F8OTinM,EAAWD,EAAOvxI,SAGxB,MAAO,CACHq1G,MAHak8B,EAAOl8B,MAAMm8B,GAI1B7pB,MAAOi+D,GAAiBp0C,EAAW,MAI3C,YAAYp7L,GACR,OAAOnK,KAAK+vN,MAAM8D,iBAAiB7zN,KAAMmK,GAG7C,YACI,MAAO,CACHu+L,SAAU1oM,KAAK0oM,SACfC,SAAU3oM,KAAK2oM,SACft9L,MAAOrL,KAAKqL,MACZo9L,OAAQzoM,KAAKyoM,OACbG,WAAY5oM,KAAK4oM,aAK7B,MAAMgxC,GAAS,GAAM,GAAI,IlWpQQ,IkWqQ3BC,GAAS,GAAM,GAAI,IlWrQQ,IkWuQjC,SAASF,GAAiB7iM,GACtB,MAAM43H,EAAU,GAAI53H,GACdg7H,EAAO,GAAMvoK,KAAKo/J,IAAI+F,GlWzQC,IkW0QvBmD,EAAS,GAAMtoK,KAAKm/J,IAAIgG,GlW1QD,IkW6Q7B,IAAIklD,EASAnoB,EASJ,OAhBImoB,EADArqN,KAAK+mC,IAAIwhI,GAAQ+nE,GACJh0E,GACNgM,EAAS,EACHzL,GAEAH,GAKbwlC,EADAliM,KAAK+mC,IAAIwhI,GAAQ8nE,GACN/zE,GACJiM,EAAO,EACHlM,GAEAS,GAGR,CACHutD,WAAYA,EACZnoB,SAAUA,GAIlB7H,GAAkB,GAAY,CAC1Bl4B,MAAOnF,GACPwiC,QAAS,CACL/N,SAAU,gBAEdqO,OAAQ,CACJj5J,MAAO,IAEX4/J,OAAQ,CACJ5jC,SAAS,EACTp1H,SAAU,GACVgkI,KlWlToB,kBkWmTpBiuB,OAAQzH,GAAW,IACnB9lB,MAAO5V,GACPspB,OAAQ,EACRtrJ,S/FpOY,c+FsOhB+vD,UAAW,CACPvwF,KAAM2oN,IAEVhkB,UAAW,CACP77B,SAAS,EACTi9B,OAAQ,CACJj5J,MAAO,IAGfg8H,SAAS,IAGbg1B,GAAW,GAAWngM,UAAW,IAElB,IAAA,GAAA,GC3RA,GAjDO,CAClB64O,iBAAkB,SAASzuO,EAAO+9J,EAAO1pK,GACrC,MAAMq6O,EAAgB/5O,KAAKN,QAAQ+iO,QAAU,GACvC0W,EAAgBY,EAAc/pC,QAAU,GACxC4zB,EAAgBmW,EAAcnW,eAAiB,GAC/CC,EAAsBD,EAAc5zB,QAAU,GAEpD,GAAItwM,IAAuC,IAA5BA,EAAQqkO,gBAA2B,CAC9C,MAAMiW,GAAmC,IAApBt6O,EAAQ0sK,QACvBonC,EAAgBwmC,EAAex3C,GAAY22C,GAC7C32C,GAAYqhC,IAAwBrhC,GAAY22C,GACpD,IAYInV,EAAkBC,EAZlBjgJ,EAAOtkF,EAAQipM,SAEf6K,IACAxvH,EAAOwvH,EAAc,CACjBxvH,KAAMA,EACNykH,OAAQ/oM,EAAQ+oM,OAChBC,SAAUhpM,EAAQgpM,SAClBE,WAAYlpM,EAAQkpM,WACpBv9L,MAAOA,KAKX2uO,GACAhW,EAAmB,GACnBC,EAAc76D,EAAMsC,QAEpBs4D,EAAmB,CACft4D,MAAOm4D,EAAoBn4D,MAC3BsP,KAAM6oD,EAAoB7oD,MAE9BipD,GAAeL,EAAcjR,SAAW,IAAIjnD,OAG5C,GAAS1nF,IAAkB,KAATA,GAClBhkF,KAAKi6O,YAAY52O,KAAK,CAClB+nD,OAAQ4uL,EACRhH,WAAYtzO,EAAQsU,MACpBgwE,KAAMA,EACNykH,OAAQ/oM,EAAQ+oM,OAChBw7B,YAAaA,EACbj0B,OAAQg0B,OC/B5B,MAAM,WAAiB,GACnB,YAAYnxB,EAAUnzM,GAClBunD,MAAMvnD,GAENM,KAAK6yM,SAAWA,EAChB7yM,KAAKgnM,aAAe6L,EAAS7L,aAC7BhnM,KAAK6vK,OAAS,GACd7vK,KAAKi6O,YAAc,GACnBj6O,KAAKgmL,SAGT,SACIhmL,KAAK6tN,mBAAmB7tN,KAAK8tN,SAASl1L,KAAK54B,OAG/C,mBAAmBuwB,GACf,MAAM,QAAE7wB,EAASmzM,UAAYnzM,SAAS,aAAEw6O,EAAe,MAAWl6O,KAC5Dm6O,EAAcD,EAAap5O,OAC3B2nM,EAAS/oM,EAAQ+oM,OACjB4kB,EAAc5kB,EAAO3nM,OAE3B,IAAK,IAAIitN,EAAW,EAAGA,EAAWV,EAAaU,IAAY,CACvD,MAAM0C,EAAgBhoB,EAAOslB,GACvB3uM,EAAOqxM,EAAcrxM,MACrB,MAAE88G,EAAK,OAAE2zC,EAAM,MAAEj6I,GAAU2rM,GAAa9Q,GACxC2pB,EAAgB,IAAMl+G,EAC5B,IAAIm+G,EAIA1qE,EAHCn0J,SAAS4+N,KACVC,EAAgB,IAAMzkN,GAKtB+5I,EADA,GAAQ8gD,EAAczhD,YACPyhD,EAAczhD,WAEdtvK,EAAQsvK,WAGvB++C,IAAaV,EAAc,GjGuCvB,eiGtCAoD,EAAczgB,OAAOlsK,WACrB2sL,EAAczgB,OAAOlsK,SAAW+hI,IAIxC,IAAK,IAAInlK,EAAI,EAAGA,EAAImvK,EAAO/uK,OAAQJ,IAAK,CACpC,MAAMupM,EAAYp6B,EAAOnvK,GACzB,IAAKupM,EACD,SAGJ,MAAM,OAAEniC,EAAM,MAAEz8J,EAAK,QAAE+gK,GAAY69B,EAC7BnzJ,EAAkB,IAAVzrC,EAAegvO,GAAkBhvO,EAAQ+uO,EAAkB,EACnEE,EAA0B,IAAhBl7N,EAAKte,QAAgBshM,QAAQt6B,EAAOwyE,SAE/C,GAAW7pB,EAAc/kD,SAC1B+kD,EAAc/kD,MAAQ5D,EAAO4D,OAASwuE,EAAax5O,EAAIy5O,IAG3D5pN,EAAS05K,EAAUyf,YAAYr+M,MAAO,IAAI,GAAK,KAAM,EAAG,EAAGskK,EAAc74H,GAAQ,CAC7Ei5K,MAAO/vN,KACP2oM,SAAU,GAAQ7gC,EAAO6gC,UAAY7gC,EAAO6gC,SAAW,GACvD30L,MAAOtT,EACP+nM,OAAQgoB,EACR1C,SAAUA,EACVrlB,SAAUtpL,EAAK1e,GACfkoM,WAAsB,IAAV1sE,EAAc7wH,EAAQ6wH,EAAQ,EAC1Co+G,QAASA,EACTvW,gBAAiBj8D,EAAOi8D,gBACxB33D,QAASA,EACTgjB,OAAQi+B,EAAcU,EACtBmrB,eAAgBl5O,KAAKk5O,eAAex4O,EAAGqtN,EAAUV,MAGrC,IAAZjhD,IACAuD,GAAgB74H,KAMhC,mBAAmBp3C,EAAS2L,EAAOy8J,GAC/B,MAAM2gC,EAAS3gC,EAAO2gC,OAEtBukB,GAAYttN,EAAS,CACjB2L,MAAOA,EACPo9L,OAAQA,EACRC,SAAU5gC,EAAO4gC,SACjBC,SAAU7gC,EAAO6gC,SACjBC,WAAY9gC,EAAO8gC,YACpB,CAAEhoM,SAAU6nM,EAAOynB,UAAW/C,SAAU,CAAE,OAAQ,UAAW,WAAY,SAAU,YAG1F,SAAS9hN,EAAOi6L,EAAQx9B,GACpB,MAAMyyE,EAAiBn5C,GAAW,GAAIt5B,EAAO2gC,OAAQ,CAAEz0L,MAAO8zJ,EAAO9zJ,QAKrE,GAJAhU,KAAKw6O,mBAAmBD,EAAgBlvO,EAAOy8J,GAE/C9nK,KAAK85O,iBAAiBzuO,EAAOkvO,EAAgBzyE,IAEtB,IAAnBA,EAAOsE,QACP,OAGJ,MAAMthK,EAAU,IAAI,GAAWO,EAAOi6L,EAAQi1C,GAC9Cn7O,OAAOu8B,OAAO7wB,EAASg9J,GACvB9nK,KAAKq6H,OAAOvvH,GACZ9K,KAAK6vK,OAAOxsK,KAAKyH,GAGrB,OAAOu5L,GACH,MAAM,QAAE3kM,EAAO,OAAEmwK,EAAM,cAAE4qE,EAAgB,IAAOz6O,KAC1C41B,EAAQi6I,EAAO/uK,OACfw5K,EAAM+pB,EAAUhuK,QAEhBqkN,EAAWnxO,KAAKC,IAAI8wK,EAAIlqI,QAASkqI,EAAIzQ,UACrC8wE,EAAeD,EAAW,EAC1BE,EAAiBF,EAAsB,IAAXA,EAC5BG,EAAS,IAAI,GAAIvgE,EAAI7I,GAAI6I,EAAI5I,GAAI4I,EAAI7I,GAAKipE,EAAUpgE,EAAI5I,GAAKgpE,GAC7DI,EAAeD,EAAOnkM,SACtBo3J,EAAYxzB,EAAI5jI,SAChB22K,EAAc3tN,EAAQ+oM,OAAO3nM,OAC7Bi6O,EAAiB,GACjBC,EAAkB,GACxB,IAAIn3D,EAAU,GAAenkL,EAAQmkL,QAAS+2D,GAE9C56O,KAAKqkM,UAAYA,EAEjBxgB,EAAUA,EAAU82D,EAdN,EAc6BA,EAd7B,EAcoD92D,EAClEg3D,EAAOxxE,UAAUykC,EAAU9iK,EAAI8vM,EAAa9vM,EAAG8iK,EAAU39J,EAAI2qM,EAAa3qM,GAE1E,MAAM+8H,EAASytE,EAAe92D,EACxBntI,EAAS,IAAI,GACfw2H,EAAS2tE,EAAOppE,GAAKoS,EACrB3W,EAAS2tE,EAAOnpE,GAAKmS,GAGzB,IAAK,IAAInjL,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAMoK,EAAU+kK,EAAOnvK,GACjB4kM,EAASx6L,EAAQw6L,OACjB8iC,EAAct9N,EAAQijN,SAI5B,GAHAzoB,EAAOp4B,OAASA,EAChBo4B,EAAO5uJ,OAASA,EAEZ+jM,EAAc35O,OAAQ,CACtB,MAAMm6O,EAAeR,EAAcrS,GACnC9iC,EAAOL,YAAcg2C,EAAah2C,YAClCK,EAAOp4B,OAAS+tE,EAAa/tE,OAG7Bk7D,IAAgB/a,EAAc,GAAKviN,EAAQwvO,UAC3Ch1C,EAAO5uJ,OAAS4uJ,EAAOjvK,QAAQ+2I,UAA0B,IAAhBk4B,EAAOp4B,QAAe9D,MAAMk8B,EAAOvxI,WAGhFjpD,EAAQ+7L,OAAOg0C,GAEf,MAAM/7G,EAAQh0H,EAAQg0H,MAClBA,GjG9EI,eiG+EAA,EAAMp/H,QAAQokC,UACVskM,IAAgB/a,EAAc,IAC1BvuF,EAAMo9C,cAAgB9V,GACtB40E,EAAgB33O,KAAKy7H,GAErBi8G,EAAe13O,KAAKy7H,IAOpCi8G,EAAej6O,OAAS,IACxBi6O,EAAezwN,KAAKtqB,KAAKk7O,iBAAgB,IACzCl7O,KAAKm7O,iBAAiBJ,IAGtBC,EAAgBl6O,OAAS,IACzBk6O,EAAgB1wN,KAAKtqB,KAAKk7O,iBAAgB,IAC1Cl7O,KAAKo7O,kBAAkBJ,IAG3Bh7O,KAAKs6K,IAAMugE,EAGf,iBAAiB7qC,GACb,MAAMqrC,EAAYr7O,KAAKs7O,sBAAsBtrC,GAE7ChwM,KAAKu7O,iBAAiBF,EAAWrrC,GAGrC,kBAAkBA,GACd,MAAMqrC,EAAYr7O,KAAKs7O,sBAAsBtrC,GAE7ChwM,KAAKu7O,iBAAiBF,EAAWrrC,GAGrC,sBAAsBA,GAClB,MAAMllM,EAAU,GAAK9K,KAAK6vK,QACpBy1B,EAASx6L,EAAQw6L,OACjB1vK,EAAQo6K,EAAOlvM,OAAS,EACxB06O,EAAKl2C,EAAOp4B,OAASpiK,EAAQpL,QAAQswM,OAAOh5J,SAC5CqkM,EAAY,GAClB,IAAII,EAAWzrC,EAAO,GAAG11B,IACrBtjI,EAAW,GAAMykM,EAAS/pE,IAAM4zB,EAAO5uJ,OAAOvG,EAAIqrM,EAAKC,EAAS5xE,SAAW4xE,EAAS5xE,SAAW,IAEnGwxE,EAAUh4O,KAAK2zC,GAEf,IAAK,IAAIt2C,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAGvB+6O,EAAWzrC,EAAOtvM,GAAG45K,IACrBtjI,EAAW,GAHOg5J,EAAOtvM,EAAI,GAAG45K,IAGL5I,GAAK+pE,EAAS7pE,IACzCypE,EAAUh4O,KAAK2zC,GAKnB,OAHAA,EAAW,GAAMsuJ,EAAO5uJ,OAAOvG,EAAIqrM,EAAKxrC,EAAOp6K,GAAO0kJ,IAAI1I,GAAKo+B,EAAOp6K,GAAO0kJ,IAAIzQ,SAAW,GAC5FwxE,EAAUh4O,KAAK2zC,GAERqkM,EAGX,iBAAiBA,EAAWrrC,GACxB,MAAMp6K,EAAQylN,EAAUv6O,OACxB,IAAI6wC,EAAMC,EAAO7b,EAEjB,IAAK,IAAIr1B,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAIvB,IAHAq1B,GAAaslN,EAAU36O,GACvBixC,EAAOC,EAAQlxC,EAERq1B,EAAY,IAAM4b,GAAQ,GAAKC,EAAQhc,IAC1CG,EAAY/1B,KAAK07O,cAAcL,EAAW36O,IAAKixC,EAAM5b,GACrDA,EAAY/1B,KAAK07O,cAAcL,EAAW36O,IAAKkxC,EAAO7b,GAI9D/1B,KAAK2kN,aAAa02B,EAAWrrC,GAGjC,cAAcqrC,EAAWpgK,EAAQn3C,EAAU63M,GACvC,IAAIj0O,EAASi0O,EACb,GAAIN,EAAUv3M,GAAY,EAAG,CACzB,MAAM83M,EAAYryO,KAAKC,IAAI6xO,EAAUv3M,GAAWp8B,GAChDA,GAAUk0O,EACVP,EAAUv3M,IAAa83M,EACvBP,EAAUpgK,IAAW2gK,EAGzB,OAAOl0O,EAGX,aAAa2zO,EAAWrrC,GACpB,MAAMllM,EAAU,GAAK9K,KAAK6vK,QACpBy1B,EAASx6L,EAAQw6L,OACjBuL,EAAe/lM,EAAQpL,QAAQswM,OAC/BY,EAAcZ,EAAOlvM,OACrB+6O,EAAgBhrC,EAAa75J,SACnC,IACI8kM,EADAC,EAAOz2C,EAAO5uJ,OAAOvG,GAAKm1J,EAAOp4B,OAAS2uE,GAAiB7rC,EAAO,GAAG11B,IAAIzQ,SAG7EwxE,EAAU,IAAM,EAChB,IAAK,IAAI36O,EAAI,EAAGA,EAAIkwM,EAAalwM,IAAK,CAClC,MAAMo+H,EAAQkxE,EAAOtvM,GACf45K,EAAMx7C,EAAMw7C,IAElByhE,GAAQV,EAAU36O,GAClBo7O,EAAO97O,KAAKg8O,YACR1hE,EAAI3I,GACJ2zB,EAAOjvK,QAAQ/3B,OAAOu9O,GACtBE,EACAA,EAAOzhE,EAAIzQ,SACX/qC,EAAMo9C,cAAgB9V,IAEtBtnC,EAAMo9C,cAAgB9V,IAClByqC,EAAan1B,QAAU5V,KACvBg2E,EAAOx2C,EAAOp4B,OAASo4B,EAAO5uJ,OAAO1L,EAAI6wM,GAE7C/8G,EAAM+nE,OAAO,IAAI,GAAIi1C,EAAOxhE,EAAIlqI,QAAS2rM,EAAMD,EAAMC,MAEjDlrC,EAAan1B,QAAU5V,KACvBg2E,EAAOx2C,EAAO5uJ,OAAO1L,EAAIs6J,EAAOp4B,OAAS2uE,GAE7C/8G,EAAM+nE,OAAO,IAAI,GAAIi1C,EAAOxhE,EAAIlqI,QAAS2rM,EAAMD,EAAMC,KAGzDA,GAAQzhE,EAAIzQ,UAIpB,eACI,MAAQnqK,SAAS,WAAEu8O,GAAY,OAAEpsE,GAAW7vK,KACtC41B,EAAQi6I,EAAO/uK,OAGrBmmD,MAAMigJ,eAENlnM,KAAKk8O,gBAAkB,GAEvB,IAAK,IAAIx7O,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAMoK,EAAU+kK,EAAOnvK,IACjB,OAAE4kM,EAAM,MAAExmE,GAAUh0H,EACpBgsC,EAAQwuJ,EAAOvxI,SACfooL,GAAmBrxO,EAAQpL,QAAQu8O,YAAc,IAAIvwE,OAASuwE,EAAWvwE,MAE/E,GAAI5sC,EAAO,CACP,MAAMs9G,EAAgB,IAAI,EAAK/wD,KAAK,CAChC1e,OAAQ,CACJjB,MAAOywE,EACP/rM,MAAO6rM,EAAW7rM,OAEtByjD,UAAW,CACPvwF,KjG3TT,SiG4TS+2B,MAAOvvB,EAAQouO,kBAIvB,GjG1OI,eiG0OAp6G,EAAMp/H,QAAQokC,SAA0B,CACxC,MAAMw2I,EAAMx7C,EAAMw7C,IACZk9D,EAAclyC,EAAO5uJ,OAC3B,IAEI2lM,EAAIh1O,EAAKi1O,EAFT/4O,EAAQ+hM,EAAOl8B,MAAMtyH,GACrBid,EAAS,IAAI,GAAMumH,EAAI7I,GAAI6I,EAAI5jI,SAASvG,GAG5C5sC,EAAQ+hM,EAAOjvK,QAAQ/3B,OAAO29O,EAAWp4D,SAASza,MAAMtyH,GACxDslM,EAAcjkE,OAAO50K,EAAMynC,EAAGznC,EAAM4sC,GAEhC2uF,EAAMo9C,cAAgB9V,IACtB/+J,EAAM,IAAI,GAAMizK,EAAI7I,GAAKwqE,EAAWp4D,QAASvJ,EAAI5jI,SAASvG,GAC1DmsM,EAAW,GAAa9E,EAAaj0O,EAAOwwD,EAAQ1sD,GACpD0sD,EAAS,IAAI,GAAM1sD,EAAI2jC,EArCzB,EAqCoC3jC,EAAI8oC,GACtCmsM,EAAWA,GAAYvoL,EACvBuoL,EAAStxM,EAAIzhC,KAAKC,IAAI8yO,EAAStxM,EAAG+oB,EAAO/oB,GAErChrC,KAAKu8O,cAAcD,EAAUh3C,EAAO5uJ,OAAQ4uJ,EAAOp4B,OAzCzD,IA0CMovE,EAAStxM,EAAIs6J,EAAO5uJ,OAAO1L,GAC3BqxM,EAAK/2C,EAAO5uJ,OAAO1L,EAAIs6J,EAAOp4B,OA3CpC,EA8CckvE,EAAc3kE,OAFlB3sK,EAAQpL,QAAQswM,OAAOt0B,QAAUqwC,GAC7BswB,EAAKtoL,EAAO/oB,EACSqxM,EAEA94O,EAAMynC,EAAIipK,EAGdooC,EALQ94O,EAAM4sC,GAOvCisM,EAAc3kE,OAAO1jH,EAAO/oB,EAAG3jC,EAAI8oC,KAEnCmsM,EAASnsM,EAAI9oC,EAAI8oC,EACjBisM,EAAc3kE,OAAO6kE,EAAStxM,EAAGsxM,EAASnsM,MAG9C9oC,EAAM,IAAI,GAAMizK,EAAI3I,GAAKsqE,EAAWp4D,QAASvJ,EAAI5jI,SAASvG,GAC1DmsM,EAAW,GAAa9E,EAAaj0O,EAAOwwD,EAAQ1sD,GACpD0sD,EAAS,IAAI,GAAM1sD,EAAI2jC,EA7DzB,EA6DoC3jC,EAAI8oC,GACtCmsM,EAAWA,GAAYvoL,EACvBuoL,EAAStxM,EAAIzhC,KAAKqS,IAAI0gO,EAAStxM,EAAG+oB,EAAO/oB,GAErChrC,KAAKu8O,cAAcD,EAAUh3C,EAAO5uJ,OAAQ4uJ,EAAOp4B,OAjEzD,IAkEMovE,EAAStxM,EAAIs6J,EAAO5uJ,OAAO1L,GAC3BqxM,EAAK/2C,EAAO5uJ,OAAO1L,EAAIs6J,EAAOp4B,OAnEpC,EAsEckvE,EAAc3kE,OAFlB3sK,EAAQpL,QAAQswM,OAAOt0B,QAAUqwC,GAC7BswB,EAAKtoL,EAAO/oB,EACSqxM,EAEA94O,EAAMynC,EAAIipK,EAGdooC,EALQ94O,EAAM4sC,GAOvCisM,EAAc3kE,OAAO1jH,EAAO/oB,EAAG3jC,EAAI8oC,KAEnCmsM,EAASnsM,EAAI9oC,EAAI8oC,EACjBisM,EAAc3kE,OAAO6kE,EAAStxM,EAAGsxM,EAASnsM,KAIlDisM,EAAc3kE,OAAOpwK,EAAI2jC,EAAG3jC,EAAI8oC,GAEhCnwC,KAAKk8O,gBAAgB74O,KAAK+4O,GAC1Bp8O,KAAKksL,OAAO7xD,OAAO+hH,MAMnC,eAGI,GAFAn1L,MAAMugJ,eAEFrvK,GAAKn4B,KAAKN,QAAQ+oM,OAAQ/oM,GAAWA,EAAQ88O,SAAU,CACvD,MAAMn4C,EAAYrkM,KAAKqkM,UACjBo4C,EAAYz8O,KAAKs6K,IAAI5jI,SACrBu1H,EAAOjsK,KAAKksL,OAAOjgB,OACzB,IAAKA,EACD,OAGJ,MAAMywE,EAAazwE,EAAKzB,cAElB3yH,EAAQtuC,KAAKC,KACdizO,EAAUtsM,EAAIk0J,EAAU3yB,KAAO+qE,EAAUtsM,EAAI87H,EAAKj9H,OAAOmB,IACzDk0J,EAAUzyB,GAAK6qE,EAAUtsM,IAAMusM,EAAWvsM,EAAIssM,EAAUtsM,IACxDssM,EAAUzxM,EAAIq5J,EAAU5yB,KAAOgrE,EAAUzxM,EAAIihI,EAAKj9H,OAAOhE,IACzDq5J,EAAU1yB,GAAK8qE,EAAUzxM,IAAM0xM,EAAW1xM,EAAIyxM,EAAUzxM,IAGzD6M,EAAQ,GACR73C,KAAKksL,OAAOp0K,UAAU,EAASA,YAAY+/B,MAAMA,EAAOA,EAAO,CAAE4kM,EAAUzxM,EAAGyxM,EAAUtsM,MAKpG,gBAAgBh0B,GACZ,MAAMwgO,EAAexgO,GAAW,EAAI,EAEpC,OAAO,SAASld,EAAGC,GAGf,QAFeD,EAAEonB,OAAOi/K,OAAOvxI,SAAW,KAAO,KACjC70D,EAAEmnB,OAAOi/K,OAAOvxI,SAAW,KAAO,KACxB4oL,GAIlC,YAAYC,EAAWt3C,EAAQ5zB,EAAIE,EAAIz5H,GACnC,MAAM,OAAE+0H,EAAQx2H,QAAU1L,EAAGynI,EAAItiI,EAAGuiI,IAAS4yB,EACvCnmM,EAAIoK,KAAKC,IAAID,KAAK+mC,IAAIoiI,EAAKhB,GAAKnoK,KAAK+mC,IAAIoiI,EAAKd,IAEpD,OAAIzyK,EAAI+tK,EACG0vE,EAGJnqE,EAAKlpK,KAAKsvC,KAAMq0H,EAASA,EAAW/tK,EAAIA,IAAOg5C,EAAY,GAAK,GAG3E,cAAcixH,EAAO1yH,EAAQw2H,GACzB,OAAO3jK,KAAK0+J,IAAIvxH,EAAO1L,EAAIo+H,EAAMp+H,EAAG,GAAKzhC,KAAK0+J,IAAIvxH,EAAOvG,EAAIi5H,EAAMj5H,EAAG,GAAK5mC,KAAK0+J,IAAIiF,EAAQ,GAGhG,iBAAiB9D,EAAOj/J,GACpB,OAAOnK,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAQi/J,EAAM/9J,OAGvD,eAAemvM,GACX,OAtbsB,GAsbfA,EAGX,YACI,OAAOx6M,MAIf,SAAS,GAAa68O,EAAIC,EAAIC,EAAIC,GAC9B,MACMC,GAAMD,EAAG7sM,EAAI4sM,EAAG5sM,IAAM2sM,EAAG9xM,EAAI6xM,EAAG7xM,IAAMgyM,EAAGhyM,EAAI+xM,EAAG/xM,IAAM8xM,EAAG3sM,EAAI0sM,EAAG1sM,GAEtE,IAAIzoC,EACJ,GAAW,IAAPu1O,EAAU,CACV,MAAMC,IALGF,EAAGhyM,EAAI+xM,EAAG/xM,IAAM6xM,EAAG1sM,EAAI4sM,EAAG5sM,IAAM6sM,EAAG7sM,EAAI4sM,EAAG5sM,IAAM0sM,EAAG7xM,EAAI+xM,EAAG/xM,IAKjDiyM,EAElBv1O,EAAS,IAAI,GACTm1O,EAAG7xM,EAAIkyM,GAAMJ,EAAG9xM,EAAI6xM,EAAG7xM,GACvB6xM,EAAG1sM,EAAI+sM,GAAMJ,EAAG3sM,EAAI0sM,EAAG1sM,IAI/B,OAAOzoC,EAGXk8L,GAAkB,GAAU,CACxB50B,WAAY,GACZitE,WAAY,CACR7rM,MAAO,EACPs7H,MAAO,UACPmY,QAAS,GAEb+/C,cAAe,CACXjR,QAAS,GACT3iB,OAAQ,MAIhB5O,GAAW,GAASngM,UAAW,IAE/B,GAASA,UAAU8mM,aAAc,EAElB,IAAA,GAAA,GC/cA,GAxBf,cAA0B,GACtB,SACI/nM,KAAKm9O,eAAen9O,KAAKyoM,QAG7B,eAAeA,GACX,MAAMqmC,EAAcrmC,EAAO,GACrB20C,EAAW,IAAI,GAASp9O,KAAM,CAChCyoM,OAAQA,EACR5kB,QAASirD,EAAYjrD,QACrB7U,WAAY8/D,EAAY9/D,WACxBitE,WAAYnN,EAAYmN,WACxBxZ,OAAQziO,KAAKN,QAAQ+iO,SAGzBziO,KAAKyjO,YAAY2Z,GAGrB,YAAYt7C,EAAOkR,GACf/rJ,MAAMw8K,YAAY3hC,EAAOkR,GACzB,GAAOhzM,KAAKN,QAAQ+iO,OAAOrvK,MAAO0uI,EAAMm4C,eCfhD,MAAM,WAAqB,GACvB,cACI,MAAQv6O,SAAWswM,OAAQmpC,GAAe,MAAEr6G,GAAU9+H,KAChDslM,EAAStlM,KAAKslM,OAAOjvK,QACrBygB,EAAQwuJ,EAAOvxI,SAErB,GAAI+qE,EAAO,CACP,MAAMu6G,EAAcv6G,EAAMw7C,IAAIzQ,SAC9B,GAAIsvE,EAAcr1M,WAAa+hI,GAAQ,CACnCy/B,EAAOp4B,SAAWo4B,EAAOp4B,OAASo4B,EAAOL,aAAe,EAExD,MAAMs0C,EAAKj0C,EAAOl8B,MAAMtyH,GAExBgoF,EAAM+nE,OAAO,IAAI,GAAI0yC,EAAGvuM,EAAGuuM,EAAGppM,EAAIkpM,EAAc,EAAGE,EAAGvuM,EAAGuuM,EAAGppM,SAE5D8W,MAAMksK,eAKlB,cAAc7tB,EAAQ5lM,GAClB,OAAO,GAAa2W,QAAQgvM,WAAW/f,EAAQ5lM,IAIvDkkM,GAAkB,GAAc,CAC5BmF,QAAS,CACL/N,SAAU,gBAEdgV,OAAQ,CACJlsK,SAAU+hI,IAEdhyE,UAAW,CACPvwF,KAAM2oN,MAId7qB,GAAW,GAAangM,UAAW,IAGpB,IAAA,GAAA,GCzCf,MAAM,WAAmB,GACrB,SAASoK,EAAOi6L,EAAQx9B,GACpB,MAAMyyE,EAAiBn5C,GAAW,GAAIt5B,EAAO2gC,OAAQ,CAAEz0L,MAAO8zJ,EAAO9zJ,QAKrE,GAJAhU,KAAKw6O,mBAAmBD,EAAgBlvO,EAAOy8J,GAE/C9nK,KAAK85O,iBAAiBzuO,EAAOkvO,EAAgBzyE,IAExCz8J,IAA4B,IAAnBy8J,EAAOsE,QACjB,OAGJ,MAAMthK,EAAU,IAAI,GAAaO,EAAOi6L,EAAQi1C,GAEhDn7O,OAAOu8B,OAAO7wB,EAASg9J,GACvB9nK,KAAKq6H,OAAOvvH,GACZ9K,KAAK6vK,OAAOxsK,KAAKyH,GAGrB,OAAOu5L,GACH,MAAM3kM,EAAUM,KAAKN,QACf46K,EAAM+pB,EAAUhuK,QAEhBqkN,EAAWnxO,KAAKC,IAAI8wK,EAAIlqI,QAASkqI,EAAIzQ,UACrC8wE,EAAeD,EAAW,EAE1BjyC,EAAS/oM,EAAQ+oM,OACjB4kB,EAAc5kB,EAAO3nM,OAE3B,IAAI+iL,EAAU,GAAenkL,EAAQmkL,QAJd62D,EAAsB,IAAXA,GAKlC72D,EAAUA,EAAU82D,EARN,EAQ6BA,EAR7B,EAQoD92D,EAElE,IAEIw5D,EAFAC,EAAY3C,EAAe92D,EAC3B05D,EAAoB,EAGxB,IAAK,IAAI78O,EAAI,EAAGA,EAAI2sN,EAAa3sN,IAAK,CAClC,MAAM+vN,EAAgBhoB,EAAO/nM,GACnB,IAANA,GACI,GAAQ+vN,EAAc4sB,YACtBA,EAAW5sB,EAAc4sB,SACzBC,GAAa7sB,EAAc4sB,UAI/B,GAAQ5sB,EAAc74M,MACtB0lO,GAAa7sB,EAAc74M,KAE3B2lO,IAGA,GAAQ9sB,EAAcxnB,SAAWvoM,IAAM2sN,EAAc,IACrDiwB,GAAa7sB,EAAcxnB,QAI9B,GAAQo0C,KAETA,GADqB1C,EAAe92D,IAAYwpC,EAAc,KACrC,IACzBiwB,GAAaD,GAGjB,IAEIzlO,EAAMs1J,EAFN+3B,EAAco4C,EACdp0C,EAAS,EAGbjpM,KAAKy6O,cAAgB,GAErB,IAAK,IAAI/5O,EAAI,EAAGA,EAAI2sN,EAAa3sN,IAAK,CAClC,MAAM+vN,EAAgBhoB,EAAO/nM,GAC7BkX,EAAO,GAAe64M,EAAc74M,KAAM0lO,EAAYC,GACtDt4C,GAAegE,EACf/7B,EAAS+3B,EAAcrtL,EACvB5X,KAAKy6O,cAAcp3O,KAAK,CAAE4hM,YAAaA,EAAa/3B,OAAQA,IAC5D+7B,EAASwnB,EAAcxnB,QAAU,EACjChE,EAAc/3B,EAGlBjmH,MAAM4/I,OAAOxC,GAGjB,eAAemW,EAAe4tB,EAAa/a,GACvC,OAnFwB,GAmFjB7S,EpGtFoB,KoGuFQ4tB,EAAc,IAAM/a,EAAc,IAK7EzpB,GAAkB,GAAY,CAC1B50B,WAAY,GACZitE,WAAY,CACR7rM,MAAO,EACPs7H,MAAO,UACPmY,QAAS,KAIF,IAAA,GAAA,GCNA,GAxFf,cAAgC,GAC5B,aACI7jL,KAAK+rO,sBAAwB,IAAI,GAGrC,SACI/rO,KAAKwsO,YAAYxsO,KAAKyoM,QACtBzoM,KAAKw9O,kBACLx9O,KAAKosO,eACLpsO,KAAKy9O,kBAGT,YACI,MAAM9hE,EAAO37K,KAAKu5M,UACZl7K,EAAQs9I,EAAKt9I,QAEbm3K,EAAO75B,EAAKy3B,QADIz3B,EAAKj8K,QAAQyc,QAAUkiB,EAAMziB,IAAMyiB,EAAM70B,KAEzDktC,EAAS12C,KAAK4lN,UAAUxS,QAAQ,GAAG18J,OACnC+uL,EAAU9pD,EAAKrB,IAAIjR,UACrB3yH,EAAO1L,EAAIwqK,EAAK/jC,GAChB/6H,EAAOvG,EAAIqlK,EAAK9jC,IAGpBiK,EAAKkrB,OAAO4+B,GAGhB,kBACI,MAAMyK,EAAUlwO,KAAK+rO,sBACfoE,EAAeD,EAAQn1H,QACvBqnG,EAAcpiN,KAAK09O,iBAAiB,CACtC18B,kBAAkB,EAClB5xB,QAAS,IAEb,IAAIq3B,EAAUk3B,ErG0CF,QqGxCRv7B,EAAY9+M,MACZmjN,EAAW,GACXk3B,EAAmB,CAAEn0O,IAAK,GAAKoS,IAAK,KAEpC6qM,EAAW,GACXk3B,EAAmB,CAAEn0O,IAAK,EAAGoS,IAAK,IAGtC,MAAMyiB,EAAQ6xM,EAAQn1H,MAAMtwG,OAAS0lO,GAAgBwN,EAEjDt/M,GAAS8xM,IACT9xM,EAAM70B,IAAMD,KAAKC,IAAI60B,EAAM70B,IAAK2mO,EAAa3mO,KAC7C60B,EAAMziB,IAAMrS,KAAKqS,IAAIyiB,EAAMziB,IAAKu0N,EAAav0N,MAGjD,MAAM29L,EAAY,IAAIkN,EAClBpoL,EAAM70B,IAAK60B,EAAMziB,IACjBwmM,EACApiN,KAAKgnM,cAGThnM,KAAKu5M,UAAYA,EACjBv5M,KAAKsjO,WAAW/pB,GAGpB,aACI,MAAQ75M,SAAWmzM,SAAUnzM,GAAS,UAAE65M,EAAS,UAAEqM,EAAS,IAAEtrC,GAAQt6K,KAChE46O,EAhEU,IAgEOrxO,KAAKC,IAAI8wK,EAAIlqI,QAASkqI,EAAIzQ,UAC3Cga,EAAU2d,GAAW9hM,EAAQmkL,SAAW,GAAI+2D,GAC5CpxC,EAAalvB,EAAIjkJ,QAAQozK,MAAM5lB,GAC/B4hD,EAAUj8B,EAAWnzK,QAE3BovM,EAAQ7zD,GAAK6zD,EAAQ/zD,GAAKnoK,KAAKC,IAAIi8N,EAAQr1L,QAASq1L,EAAQ57D,UAC5D47D,EAAQ/pD,MAAM8tB,EAAY/iC,GAAGZ,IAE7B,MAAM+3E,EAAenY,EAAQpvM,QAAQquK,OAAO,EAAG+gC,EAAQ57D,SAAW,GAElE+7C,EAAU/e,OAAO4+B,GACjBlsB,EAAU1S,OAAO+2C,GACjB,MAAMC,EAAatkC,EAAUxH,UAAUloC,SAAW0vC,EAAUj/B,IAAIzQ,SAChE0vC,EAAU1S,OAAO0S,EAAUj/B,IAAImvB,MAAM,CAAEx6E,IAAK4uH,KAE5C79O,KAAKylO,QAAUA,EACfzlO,KAAKinO,UAAUxB,GAGnB,gBACI,OAAOzlO,KAAKs6K,IAGhB,kBC1FJ,MAAM,WAA0B,GAC5B,UAAU44B,EAAOC,GACb,MACMqC,EAAO,GAAMsoC,SAAS5qC,EAAMx8J,OAAQw8J,EAAMlkC,WAD5BkkC,EAAMx8J,OAAOvG,EAAIgjK,EAAMzhC,IAG3C,OAAO,IAAI,GAAI8jC,EAAKxqK,EAAGwqK,EAAKrlK,EAAGqlK,EAAKxqK,EAAGwqK,EAAKrlK,IAIpDyzJ,GAAkB,GAAmB,CACjCh4B,MAAM,IAGK,IAAA,GAAA,GCdf,MAAM,WAAuB,IAG7B,GAAe3qK,UAAU2vN,UAAY,GAAkB3vN,UAAU2vN,UAEjEhtB,GAAkB,GAAgB,CAC9Bh4B,MAAM,IAGK,IAAA,GAAA,GCkBA,GA7Bf,cAAqC,GACjC,WAAWmrD,GACP,MAAMrgL,EAAS12C,KAAK+9O,mBACpBhnB,EAASt/C,OAAO/gI,EAAO1L,EAAG0L,EAAOvG,GAGrC,mBAGI,OAFkBnwC,KAAKqmB,OAAOwsL,SAAS+S,UACdtrC,IAAI5jI,SAIjC,iBACI,IAAIikG,EAAW36I,KAAKq2N,gBAEpB,IAAK17E,EAAU,CACX,MAAMjkG,EAAS12C,KAAK+9O,mBACd3mB,EAAiB,IAAI,IAAe,GACpC/nB,EAAarvM,KAAK6vK,SAExBw/B,EAAWhsM,KAAKqzC,GAChBikG,EAAW36I,KAAKq2N,gBAAkBe,EAAezwN,QAAQ0oM,GACzD10D,EAASj3I,MAGb,OAAOi3I,ICdA,GAXf,cAA+B,GAC3B,WAAWo8E,GACP,MACMrgL,EADY12C,KAAKqmB,OAAOwsL,SAAS+S,UACdtrC,IAAI5jI,SACvBsnM,EAAgB,IAAI,EAAKj3B,QAAQ,CAAErwK,EAAO1L,EAAG0L,EAAOvG,IAE1D4mL,EAASp8E,SAASjkE,QAAQsnK,GAC1BjnB,EAASp8E,SAASt3I,KAAK26O,KC4D/B,SAASC,GAAUh/O,EAAGC,GAClB,OAAOD,EAAEoM,MAAM2/B,EAAI9rC,EAAEmM,MAAM2/B,EAGhB,IAAA,GAlEf,cAA6B,GACzB,cAAcqkK,EAAYohB,EAAe1C,GAErC,IAAIjjN,EAOJ,OAJIA,E1GUG,Y0GdQ2lN,EAAc5iL,MAAQ,IAAIpB,MAI3B,IAAI,GAAuB4iK,EAAYohB,EAAe1C,GAEtD,IAAI,GAAiB1e,EAAYohB,EAAe1C,GAEvDjjN,EAGX,mBAAmBO,EAAO6pN,GACtB,IAAIyiB,EAYJ,OAVI,GAAStsO,EAAM2/B,I1GLP,gB0GKakqL,IACrByiB,EAAe,CACX3sM,EAAG3/B,EAAM2/B,EACTmF,EAAG9kC,EAAM8kC,GAET+kL,IAAkBhsD,KAClByuE,EAAaxnM,EAAI,IAIlBwnM,EAGX,oBAAoBlvC,GAChB,OAAOA,EAAOysB,eAAiBhsD,GAGnC,uBACI,MAAMu/B,EAASzoM,KAAKN,QAAQ+oM,OAE5B,IAAK,IAAIv7J,EAAM,EAAGA,EAAMu7J,EAAO3nM,OAAQosC,IACnC,G1GzBA,Q0GyBIltC,KAAK+0N,oBAAoBtsB,EAAOv7J,IAChC,OAAO,EAKnB,WAAW2iI,GAGP,GAFAA,EAAOvlJ,KAAK2zN,IAERj+O,KAAKk+O,uBACL,IAAK,IAAIhxM,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IAAO,CAC1C,MAAMk8H,EAAQyG,EAAO3iI,GACjBk8H,IAEK,GADSA,EAAM/9J,MACA8kC,I1GvC5B,Q0GuCkCnwC,KAAK+0N,oBAAoB3rD,EAAMq/B,gBAC9C54B,EAAO3iI,IAM9B,OAAO2iI,IClDf,MAAM,WAAsB,GACxB,kBACI,MAAM+1C,EAAY,IAAI,GAAU5lN,KAAKN,QAAQw9N,MAAOl9N,KAAKgnM,cAEzDhnM,KAAK4lN,UAAYA,EACjB5lN,KAAKqxM,MAAQuU,EACb5lN,KAAKsjO,WAAW1d,GAGpB,iBAAiBhlN,GACb,OAAOwgM,GAAWxgM,EAAU,CACxB8yM,eAAgB,CAAEpwM,KAAMoiK,IACxB+tC,eAAgB,CAAEnwM,KAAMoiK,KACzB1lK,KAAKN,QAAQ09N,OAGpB,kBACIn2K,MAAMw2L,kBACNz9O,KAAKsxM,MAAQtxM,KAAKu5M,UAGtB,YAAYzX,EAAOkR,GACfhzM,KAAK+rO,sBAAsBlpM,OAAOi/J,EAAM+6B,aAExC,GAAa57N,UAAUwiO,YAAY/vN,KAAK1T,KAAM8hM,EAAOkR,GAGzD,eACI,MAAMvK,EAASzoM,KAAK0sO,oBAAoB1sO,KAAKyoM,QACvCuK,EAAOhzM,KAAKgjO,MAAM,GAExBhjO,KAAKutO,gBACD9L,GAAmBh5B,EAAQ,C3GPpB,c2GQPuK,GAGJhzM,KAAK+3O,mBACDtW,GAAmBh5B,EAAQ,C3GXjB,iB2GYVuK,GAGJhzM,KAAK8sO,gBACDrL,GAAmBh5B,EAAQ,C3GlBpB,c2GmBPuK,GAIR,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMyuO,EAAY,IAAI,GAAevvO,KAAM,CAAEyoM,OAAQA,IAErDzoM,KAAKyjO,YAAY8L,EAAWv8B,GAGhC,mBAAmBvK,EAAQuK,GACvB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMq9O,EAAe,IAAI,GAAkBn+O,KAAM,CAAEyoM,OAAQA,IAE3DzoM,KAAKyjO,YAAY0a,EAAcnrC,GAGnC,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAM0uO,EAAY,IAAI,GAAexvO,KAAM,CAAEyoM,OAAQA,IAErDzoM,KAAKyjO,YAAY+L,EAAWx8B,GAGhC,eAAelR,EAAOrvL,EAAGojC,GACrB,MAAMm+K,EAASlyB,EAAMwuC,kBAAkB79N,GACjC22J,EAAQ,IAAI,GAAM4qD,EAAOhpL,EAAGgpL,EAAO7jL,GACnC+3K,EAASloN,KAAKqxM,MAAMx7D,SAASuzB,GAC7B++C,EAASnoN,KAAKsxM,MAAMz7D,SAASuzB,GAEpB,OAAX8+C,GAA8B,OAAXC,GACnBrmB,EAAMj3D,QAAQh1F,EAAW,CACrBpB,QAAS,GAAahiC,GACtBu4B,EAAGk9K,EACH/3K,EAAGg4K,IAKf,qBAGJvkB,GAAkB,GAAe,CAC7Bs5B,MAAO,GACPE,MAAO,KAGXh8B,GAAW,GAAcngM,UAAW,IAErB,IAAA,GAAA,GCjGf,MAAM,WAAuB,GAEzB,UAAUyvN,EAAcC,GACpB,MAAMytB,EAAc1tB,EAAah6K,OAAOvG,EAAIwgL,EAAUj/C,GAChD8jC,EAAO,GAAMsoC,SAASptB,EAAah6K,OAAQg6K,EAAa38J,SAAUqqL,GAExE,OAAO,IAAI,GAAI5oC,EAAKxqK,EAAGwqK,EAAKrlK,EAAGqlK,EAAKxqK,EAAGwqK,EAAKrlK,GAGhD,iBAGI,GAFA8W,MAAMytK,iBAEF10N,KAAK20N,WAAa30N,KAAK20N,UAAU7zN,OAAS,EAAG,CAC7C,MAAMu9O,EAxBlB,SAAyB1jG,GACrB,MAAM0jG,EAAiB,GACvB,IAAK,IAAInxM,EAAM,EAAGA,EAAMytG,EAAS75I,OAAQosC,IAAO,CAC5C,MAAMpiC,EAAU6vI,EAASztG,GACzBmxM,EAAevzO,EAAQijN,UAAYswB,EAAevzO,EAAQijN,WAAa,GACvEswB,EAAevzO,EAAQijN,UAAU1qN,KAAKyH,GAG1C,OAAOuzO,EARX,CAwBmDr+O,KAAK20N,WAE5C,IAAK,IAAIznL,EAAM,EAAGA,EAAMmxM,EAAev9O,OAAQosC,IAAO,CAClD,MAAMytG,EAAW0jG,EAAenxM,GAChC,GAAIytG,GAAYA,EAAS75I,OAAS,EAAG,CACjC,MAAMo2N,EAAav8E,EAAS,GAAG00D,WAAW,GACpCv2B,EAAc,GAAKn+B,GACnBw8E,EAAY,GAAKr+C,EAAYu2B,YAE7BivC,EAAkBnnB,EAAU9Y,aAAe8Y,EAAU/J,gBAAkB,EAD1B,IAA1B8J,EAAW7Y,YAEZigC,GACpB,GAAK3jG,GAAU00D,WAAWhsM,KAAK6zN,MAOnD,cAAc7nB,EAAYohB,EAAe1C,GAErC,IAAIC,EAGAA,E5GjCG,W4G6BOyC,EAAchkL,MAIZ,GAEA,GAGhB,MAAM3hC,EAAU,IAAIkjN,EAAU3e,EAAYohB,EAAe1C,GACnDmH,EAAgBl1N,KAAK+0N,oBAAoBtE,GAM/C,OAJIphB,EAAWvuM,SAAW2vN,EAAcrxM,KAAKte,Q5G9CjC,gB4G8C2Co0N,IACnDpqN,EAAQpL,QAAQgmD,QAAS,GAGtB56C,GAIf84L,GAAkB,GAAgB,CAC9Bh4B,MAAM,EACNqlD,aAAa,IAGF,IAAA,GAAA,GCxEA,GAJf,cAAqC,GACjC,gBCGW,GAJf,cAA+B,GAC3B,gBCgCW,GA7Bf,cAA6B,GACzB,cAAc5hB,EAAYohB,EAAe1C,EAAUkI,GAC/C,MACMxpL,GAASgkL,EAAc5iL,MAAQ,IAAIpB,MACzC,IAAI4qL,EACAnB,EACAprN,EAeJ,OAnBkB9K,KAAKN,QAAQ4uN,WAMdP,EAAW,GAAKkI,IAC7BC,EAAcD,EAAY5mB,WAAWnrM,MAAM,GAC3CmzN,EAAkBpB,G/GQf,W+GLHxpL,GACA3hC,EAAU,IAAI,GAAuBukM,EAAYohB,EAAe1C,EAAUsJ,EAAiBnB,GAC3FprN,EAAQpL,QAAQgmD,QAAS,IAEzB2pJ,EAAWhsM,KAAKgsM,EAAW,IAC3BvkM,EAAU,IAAI,GAAiBukM,EAAYohB,EAAe1C,EAAUsJ,EAAiBnB,IAGlFprN,EAGX,oBAAoB29L,GAChB,OAAOA,EAAOysB,eAAiBhsD,KC3BvC,MAAM,WAAqB,GACvB,YAAY79J,EAAO3L,GACfunD,MAAM57C,EAAO,KAAM3L,IAI3BkkM,GAAkB,GAAc,CAC5BmF,QAAS,CACL/N,SAAU,QAEdgV,OAAQ,CACJh5J,SAAU,MAIH,IAAA,GAAA,GCbf,MAAM,WAA2B,GAC7B,YAAYt3C,GACRunD,MAAMvnD,GAENM,KAAKV,QAAUI,EAAQorL,IAAM,GAAiB,GAGlD,OAAOwa,GACH,MAAM,QAAE5lM,EAAO,SAAE0xC,GAAapxC,MACxB,IAAEi5N,EAAG,QAAEh9C,GAAYv8K,EACnBk2B,EAAQwb,EAAStwC,OAEjBykN,EAAYjgB,EAAOxuJ,OADXlhB,EAAQqjM,EAAOh9C,GAAWrmJ,EAAQ,IAEhD,IAAIkhB,EAAQwuJ,EAAOt2B,WAAau2C,GAAa0T,EAAM,GAEnDj5N,KAAKV,QAAQ8xC,EAAW2B,IACpB,MAAMwrM,EAAaj5C,EAAOjvK,QAC1BkoN,EAAWvvE,WAAal4H,EACxBynM,EAAWznM,MAAQyuK,EAEfxyK,EAAMuyJ,SACNi5C,EAAWrxE,OAASn6H,EAAMuyJ,OAAOp4B,QAGrCn6H,EAAM8zJ,OAAO03C,GACbxrM,EAAMuyJ,OAASi5C,EAEfznM,GAASyuK,EAAaA,EAAYtpC,KAK9C2nB,GAAkB,GAAoB,CAClCq1B,IAAK,EACLh9C,QAAS,IAGE,IAAA,GAAA,GCxBA,GAjBf,cAA+B,GAC3B,OAAOqpB,GACH,MAAQ5lM,SAAS,QAAEyc,GAAS,SAAEi1B,GAAapxC,KACrCinM,EAAgB71J,EAAStwC,OACzBuoC,EAAQltB,EAAU8qL,EAAgB,EAAI,EACtC7zK,EAAOjX,GAAW,EAAI,EAE5Bnc,KAAKs6K,IAAM,IAAI,GAEf,IAAK,IAAI55K,EAAI2oC,EAAO3oC,GAAK,GAAKA,EAAIumM,EAAevmM,GAAK0yB,EAAM,CACxD,MAAMorN,EAAcptM,EAAS1wC,GAAG4kM,OAChCk5C,EAAYxvE,WAAas2B,EAAOt2B,WAChCwvE,EAAY1nM,MAAQwuJ,EAAOxuJ,SCNvC,MAAM,WAAsB,GACxB,YACI,OAAO,GAGX,cACI,OAAO,GAGX,YACI,OAAO,GAGX,aAAaw2K,EAAcjP,GACvB,OAAOiP,EAAala,QAAQiL,GAGhC,UAAUqS,EAAcC,GACpB,MAAMnb,EAAOkb,EAAar6L,QACpB8Z,EAAIugL,EAAah6K,OAAOvG,EAK9B,OAHAqlK,EAAKtoC,OAAS/8H,EAAIwgL,EAAUj/C,GAC5B8jC,EAAKvQ,YAAc90J,EAAIwgL,EAAU/+C,GAE1B4jC,EAGX,YAAYpsC,EAAOwnD,GACfxnD,EAAMk8B,OAASsrB,EACfxnD,EAAMy9B,SAGV,kBACI7mM,KAAKN,QAAQm0F,UAAUn9C,OAAS12C,KAAKs6K,IAAIyvB,SAASrzJ,SAClDuQ,MAAMmgJ,mBAId,GAAcnmM,UAAU4lM,OAAS,GAAiB5lM,UAAU4lM,OAE5DjD,GAAkB,GAAe,CAC7Bh4B,MAAM,EACNqlD,aAAa,EACbp9H,UAAW,CACPvwF,KAAM,SAIC,IAAA,GAAA,sBCxCTm7O,UAAsB,GACxB,kBACI,MAAMnxB,EAAe,IAAI,GAAkBttN,KAAKN,QAAQ4tN,aAActtN,KAAKgnM,cAE3EhnM,KAAK4lN,UAAY0H,EACjBttN,KAAKstN,aAAeA,EACpBttN,KAAKsjO,WAAWhW,GAChBttN,KAAKksO,sBACLlsO,KAAKmsO,2BAGT,iBAAiBvrO,GAeb,OAdIZ,KAAK0+O,eACLt9C,GAAWxgM,EAAU,CACjB8yM,eAAgB,CAAEpwM,KAAMoiK,IACxB+tC,eAAgB,CAAEnwM,KAAMoiK,MAI5B1lK,KAAK2+O,eACLv9C,GAAWxgM,EAAU,CACjBogN,kBAAkB,EAClBhR,OAAQ,CAAE7lM,OAAQ,QAInBi3L,GAAWxgM,EAAUZ,KAAKN,QAAQ65M,WAG7C,sBAEI,GAAoBt4M,UAAUirO,oBAAoBx4N,KAAK1T,KAAMA,KAAKgjO,OAGtE,2BACI,GAAoB/hO,UAAUkrO,yBAAyBz4N,KAAK1T,KAAMA,KAAKgjO,OAG3E,aAAavS,GAET,OAAOA,EAGX,eACI,MAAMhoB,EAASzoM,KAAK0sO,oBAAoB1sO,KAAKyoM,QACvCuK,EAAOhzM,KAAKgjO,MAAM,GAExBhjO,KAAK8sO,gBACDrL,GAAmBh5B,EAAQ,CpHrBpB,coHsBPuK,GAGJhzM,KAAKutO,gBACD9L,GAAmBh5B,EAAQ,CpHxBpB,coHyBPuK,GAGJhzM,KAAKgtO,eACDvL,GAAmBh5B,EAAQ,CpH9BlB,gBoH+BTuK,GAIR,aAAavK,GACT,MAAM/oM,EAAU,CAAE+oM,OAAQA,GACpBqmC,EAAcrmC,EAAO,GAC3B,GAAIqmC,EAAa,CACb,MAAMgJ,EAAiB93O,KAAK0sO,oBAAoBjkC,GAC1CjnL,EAAQstN,EAAYttN,MAC1B9hB,EAAQ4uN,UAAY9sM,GAASs2N,EAAeh3O,OAAS,EACrDpB,EAAQwuN,aAAe1sM,GAAwB,SAAfA,EAAMle,MAAmBw0O,EAAeh3O,OAAS,EAE7EpB,EAAQwuN,eACRluN,KAAK2+O,eAAgB,GAI7B,OAAOj/O,EAGX,gBAAgB+oM,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAM0uO,EAAY,IAAI,GAAexvO,KAAMA,KAAK4+O,aAAan2C,IAC7DzoM,KAAKyjO,YAAY+L,EAAWx8B,GAGhC,gBAAgBvK,EAAQuK,GACpB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMyuO,EAAY,IAAI,GAAevvO,KAAMA,KAAK4+O,aAAan2C,IAC7DzoM,KAAKyjO,YAAY8L,EAAWv8B,GAGhC,eAAevK,EAAQuK,GACnB,GAAsB,IAAlBvK,EAAO3nM,OACP,OAGJ,MAAMguO,EAAcrmC,EAAO,GACrB/oM,EAAUM,KAAK4+O,aAAan2C,GAClC/oM,EAAQu5N,IAAM6V,EAAY7V,IAC1Bv5N,EAAQu8K,QAAU6yD,EAAY7yD,QAE9B,MAAMkzD,EAAW,IAAI,GAAcnvO,KAAMN,GACzCM,KAAKyjO,YAAY0L,EAAUn8B,GAE3BhzM,KAAK0+O,eAAgB,EAGzB,qBACI,OAAO1+O,KAAKstN,aAGhB,eAAexrB,EAAOrvL,EAAGojC,GACrB,MAAMm+K,EAASlyB,EAAMwuC,kBAAkB79N,GACjC22J,EAAQ,IAAI,GAAM4qD,EAAOhpL,EAAGgpL,EAAO7jL,GACnCw4J,EAAW3oM,KAAKstN,aAAajF,YAAYj/C,GACzC/9J,EAAQrL,KAAKu5M,UAAU1jE,SAASuzB,GAErB,OAAbu/B,GAA+B,OAAVt9L,GACrBy2L,EAAMj3D,QAAQh1F,EAAW,CACrBpB,QAAS,GAAahiC,GACtBk2L,SAAUA,EACVt9L,MAAOA,IAKnB,4BAGJ+1L,GAAWq9C,EAAcx9O,UAAW,GAAqB,CACrDwiO,YAAa,GAAoBxiO,UAAUwiO,YAC3CqK,gBAAiB,GAAoB7sO,UAAU6sO,gBAC/CU,mBAAoB,GAAoBvtO,UAAUutO,2BAGtD5qC,GAAkB,GAAe,CAC7B0pB,aAAc,CACVvU,WAAY,IAEhBQ,UAAW,KAGA,IAAA,GAAA,GC7Jf,MAAM,WAAsB,GACxB,YAAYluM,EAAO3L,EAAS66O,GACxBtzL,MAAMvnD,GAENM,KAAKqL,MAAQA,EACbrL,KAAKN,QAAQsU,MAAQumO,EAAevmO,MAGxC,OAAO6qO,GACH,MAAMhvE,EAAS7vK,KAAK6vK,OACd/wC,EAAQ9+H,KAAKoxC,SAAS,GAE5BpxC,KAAKs6K,IAAM,IAAI,GAAIzK,EAAO,GAAG7kI,EAAG6kI,EAAO,GAAG1/H,EAAG0/H,EAAO,GAAG7kI,EAAG6kI,EAAO,GAAG1/H,GAEhE2uF,GACAA,EAAM+nE,OAAO,IAAI,GAAIg4C,EAASptE,GAAI5B,EAAO,GAAG1/H,EAAG0uM,EAASltE,GAAI9B,EAAO,GAAG1/H,IAI9E,eACI,MAAMzwC,EAAUM,KAAKN,QACrB,IAAIwsL,EAEJjlI,MAAMigJ,eAGFhb,EADAxsL,EAAQwsL,OACCxsL,EAAQwsL,OAAO,CACpByc,SAAU3oM,KAAK2oM,SACfD,SAAU1oM,KAAK0oM,SACfr9L,MAAOrL,KAAKqL,MACZo9L,OAAQzoM,KAAKyoM,OACbG,WAAY5oM,KAAK4oM,WACjB/4B,OAAQ7vK,KAAK6vK,OACbnwK,QAASA,EACT2hL,OAAQrhL,KAAKwoM,YACbtB,aAAc,IAAMlnM,KAAK8+O,eAGpB9+O,KAAK8+O,aAGd5yD,GACAlsL,KAAKksL,OAAO7xD,OAAO6xD,GAI3B,aACI,MAAMxsL,EAAUM,KAAKN,QACf2pM,EAAS3pM,EAAQ2pM,OAavB,OAZa,EAAKhe,KAAK1gB,WAAW3qK,KAAK6vK,OAAQ,CAC3C/xK,KAAM,CACF4tK,MAAOhsK,EAAQgsK,MACfoC,QAASpuK,EAAQouK,SAErBnB,OAAQ,CACJjB,MAAO29B,EAAO39B,MACdoC,QAASu7B,EAAOv7B,QAChB19H,MAAOi5J,EAAOj5J,SAEnB3xC,QAKP,gBAAgBguC,GACZ,OAAO,EAAK4+I,KAAK1gB,WAAW3qK,KAAK6vK,OAAQpjI,GAG7C,kBACI,OAAOzsC,KAAKksL,OAAO96I,SAAS,GAGhC,sBACI,MAAMlzC,EAAO,EAAKmtL,KAAK1gB,WAAW3qK,KAAK6vK,QAAQpxK,QAE/C,MAAO,CACHiB,QAASM,KAAKN,QACdxB,KAAMA,GAId,gBACI,MAAMo8K,EAAMt6K,KAAKs6K,IACjB,MAAO,CACHlR,MAAO,IAAI,GAAMkR,EAAI5jI,SAAS1L,EAAGsvI,EAAI5I,IACrCgK,MAAO,CACHk4C,WAAY,SACZnoB,SAAU,QAKtB,YAAYthM,GAER,OADcnK,KACD+vN,MAAM8D,iBADL7zN,KAC6BmK,IAInDy5L,GAAkB,GAAe,CAC7Bl4B,MAAOnF,GACP8iC,OAAQ,CACJj5J,MAAO,KAIfgxJ,GAAW,GAAcngM,UAAW,IAErB,IAAA,GAAA,GCxGf,MAAM,WAAoB,GACtB,YAAY4xM,EAAUnzM,GAClBunD,MAAMvnD,GAENM,KAAK6yM,SAAWA,EAChB7yM,KAAK6vK,OAAS,GACd7vK,KAAKgwM,OAAS,GACdhwM,KAAKi6O,YAAc,GACnBj6O,KAAKgmL,SAGT,iBAAiB5c,EAAOj/J,GACpB,OAAOnK,KAAKgnM,aAAa78L,OAAO6kM,KAAK7kM,EAAOi/J,EAAM/9J,OAGtD,SACI,MAAM,QAAE3L,EAASmzM,UAAYnzM,SAAS,aAAEw6O,EAAe,MAAWl6O,KAC5DyoM,EAAS/oM,EAAQ+oM,OAAO,GACxBrpL,EAAOqpL,EAAOrpL,KAEpB,IAAKA,EACD,OAGJ,MAAM,MAAE88G,EAAK,OAAE2zC,GAAW0xD,GAAa94B,GAEvC,IAAK,IAAI/nM,EAAI,EAAGA,EAAImvK,EAAO/uK,OAAQJ,IAAK,CACpC,MAAMupM,EAAYp6B,EAAOnvK,GAEzB,IAAKupM,EACD,SAGJ,IAAIniC,EAASmiC,EAAUniC,OAElB,GAAW2gC,EAAO/8B,SACnB+8B,EAAO/8B,MAAQ5D,EAAO4D,OAASwuE,EAAax5O,EAAIw5O,EAAap5O,SAGjEgnK,EAASs5B,GAAW,CAChBptL,MAAOtT,EACPqvN,MAAO/vN,KACPyoM,OAAQA,EACRC,SAAUtpL,EAAK1e,GACfkoM,WAAYqB,EAAU5+L,MAAQ6wH,GAC/B4rC,EAAQ,CAAEsE,QAAS69B,EAAU79B,UAEhC,MAAM/gK,EAAQ4+L,EAAUyf,YAAYr+M,MAC9BP,EAAU9K,KAAKg1N,cAAc3pN,EAAOy8J,GACpChpC,EAAQ9+H,KAAKogN,YAAY/0M,EAAOy8J,GAElCh9J,GAAWg0H,GACXh0H,EAAQuvH,OAAOyE,IAK3B,mBAAmBp/H,EAAS2L,EAAOy8J,GAC/B,MAAM2gC,EAAS3gC,EAAO2gC,OAEtBukB,GAAYttN,EAAS,CACjB2L,MAAOA,EACPo9L,OAAQA,EACRC,SAAU5gC,EAAO4gC,SACjB10L,MAAO8zJ,EAAO9zJ,OACf,CAAEpT,SAAU6nM,EAAOynB,UAAW/C,SAAU,CAAE,OAAQ,UAAW,WAAY,SAAU,YAG1F,cAAc9hN,EAAOy8J,GACjB,MAAM6lD,EAAgBvsB,GAAW,GAAIt5B,EAAO2gC,QAK5C,GAJAzoM,KAAKw6O,mBAAmB7sB,EAAetiN,EAAOy8J,GAE9C9nK,KAAK85O,iBAAiBzuO,EAAOsiN,EAAe7lD,IAErB,IAAnBA,EAAOsE,QAAmB,CAE1B,MAAMthK,EAAU,IAAI,GAAcO,EAAOsiN,EAAe7lD,GAMxD,OALA1oK,OAAOu8B,OAAO7wB,EAASg9J,GAEvB9nK,KAAKq6H,OAAOvvH,GACZ9K,KAAK6vK,OAAOxsK,KAAKyH,GAEVA,GAIf,YAAYO,EAAOy8J,GACf,MAAM,OAAE2gC,EAAM,SAAEC,GAAa5gC,EACvBkoC,EAAS5O,GAAW,GAAIphM,KAAKN,QAAQswM,OAAQvH,EAAOuH,QAC1D,IAAIhsH,EAAO34E,EAEX,GAAI2kM,EAAO5jC,QAAS,CAChB,MAAMonC,EAAgBhR,GAAYwN,GAC5B5wL,EAAO,CACTspL,SAAUA,EACVr9L,MAAOA,EACPu9L,WAAY9gC,EAAO8gC,WACnBD,SAAU7gC,EAAO6gC,SACjBF,OAAQA,GAQZ,GANI+K,EACAxvH,EAAOwvH,EAAcp0L,GACd4wL,EAAO7lM,SACd65E,EAAOhkF,KAAK6yM,SAAS7L,aAAa78L,OAAO6kM,KAAKgB,EAAO7lM,OAAQ65E,KAG5DgsH,EAAOtkC,MAAO,CACf,MAAMotE,EAAkB,IAAI,GAAMrwC,EAAO/8B,OAAO4mD,iBAE5CtiB,EAAOtkC,MADPotE,EAAkB,IACHnzE,GAEAY,GAEdypC,EAAOpG,aACRoG,EAAOpG,WAAanB,EAAO/8B,OAInC1rK,KAAKw6O,mBAAmBxqC,EAAQ3kM,EAAOy8J,GACvC,MAAMwwD,EAAU,IAAI,GAAQt0I,EAAMo9G,GAAW,CACzCmI,OAAQyG,EAAOlsK,UAChBksK,GAAS5wL,GAIZ,OAFApf,KAAKgwM,OAAO3sM,KAAKi1N,GAEVA,GAIf,eACI,MAAMtoB,EAAShwM,KAAKgwM,OACdnsB,EAAU,CAAElyI,KAAM,EAAGC,MAAO,GAElC,IAAK,IAAIlxC,EAAI,EAAGA,EAAIsvM,EAAOlvM,OAAQJ,IAAK,CACpC,MACMg7K,EADQs0B,EAAOtvM,GACDhB,QAAQg8K,MAC5B,GAAIA,IAAU7V,GAAQ,CAClB,MAAMz1H,EAAQ4/J,EAAOtvM,GAAG45K,IAAIlqI,QAExBsrI,IAAUzV,GACV4d,EAAQlyI,KAAOpoC,KAAKqS,IAAIioK,EAAQlyI,KAAMvB,GAEtCyzI,EAAQjyI,MAAQroC,KAAKqS,IAAIioK,EAAQjyI,MAAOxB,IAKpD,OAAOyzI,EAGX,mBAAmBvJ,EAAKlqI,EAAO2uM,GAC3B,MAAM,QAAEr/O,EAASmwK,OAAQl1B,GAAa36I,KAChC41B,EAAQ+kH,EAAS75I,OACjBk+O,EAAerkG,EAAS,GAC9B,IAAIskG,EAAaD,EAEjB,IAAK,IAAI9xM,EAAM,EAAGA,EAAMytG,EAAS75I,OAAQosC,IACjCytG,EAASztG,GAAK07J,WAAaq2C,EAAWr2C,aACtCq2C,EAAatkG,EAASztG,IAI9B,IAAIgyM,EAAiBF,EAAap2C,WAAaq2C,EAAWr2C,WAAcx4J,EACpE+uM,GAAkB/uM,EAAQ8uM,GAAiB,EAC3CE,EAAiB,EAErB,IAAK,IAAIlyM,EAAM,EAAGA,EAAMtX,EAAOsX,IAAO,CAClC,MAAM07J,EAAajuD,EAASztG,GAAK07J,WAC3By2C,EAAc1kG,EAASztG,EAAM,GAC7BoyM,EAAkBD,EAAcA,EAAYz2C,WAAaA,EACzD/4B,EAASl1B,EAASztG,GAAK2iI,OAAS,GAChChG,EAAUnqK,EAAqB,cAAKq/O,EAAcn2C,EAAem2C,EAAcnpN,EACrF,IAAI7gB,EAKAA,EAHC6zL,GAGSx4J,EAAQ8uM,GAAiBI,EAAiB12C,IAAe,EAF1D02C,EAAiB,EAAIlvM,EAAQ,EAK1Cr7B,EAAS,GAAWA,EAAQ,EAAGq7B,GAE/By/H,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAK0tE,EAAgB7kE,EAAI5I,GAAK0tE,IAC7DvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAKrhI,EAAQ+uM,EAAgB7kE,EAAI5I,GAAK0tE,IACrEvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAKrhI,EAAQr7B,EAAQulK,EAAI5I,GAAK7H,EAASu1E,IACtEvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAK18J,EAAQulK,EAAI5I,GAAK7H,EAASu1E,IAE9DD,EAAiBpqO,EACjBqqO,GAAkBv1E,EAASnqK,EAAQ6/O,eACnCL,EAAgB,GAAW9uM,EAAQ,EAAIr7B,EAAQ,EAAGq7B,IAI1D,oBAAoBkqI,EAAKlqI,EAAO2uM,GAC5B,MAAM,QAAEr/O,EAASmwK,OAAQl1B,GAAa36I,KAChC41B,EAAQ+kH,EAAS75I,OACjB0+O,EAAkB9/O,EAAQ+/O,WAAa,EAE7C,IAAIN,EAAiBK,EAAkB,GAAKpvM,EAAQA,EAAQ1wC,EAAQ+/O,WAAa,EACjF,MACMC,IADeF,EAAkBpvM,EAAQA,EAAyB,EAAjB+uM,IAFrCK,EAAkB9/O,EAAQ+/O,UAAYrvM,EAAQA,IAGf,EACjD,IAAIgvM,EAAiB,EAErB,IAAK,IAAIlyM,EAAM,EAAGA,EAAMtX,EAAOsX,IAAO,CAClC,MAAM2iI,EAASl1B,EAASztG,GAAK2iI,OAAS,GAChC+4B,EAAajuD,EAASztG,GAAK07J,WAC3B7zL,EAAUrV,EAAqB,cAAKggP,EAAc92C,EAAe82C,EAAc9pN,EAC/Ei0I,EAAUnqK,EAAqB,cAAKq/O,EAAcn2C,EAAem2C,EAAcnpN,EAErFi6I,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAK0tE,EAAgB7kE,EAAI5I,GAAK0tE,IAC7DvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAKrhI,EAAQ+uM,EAAgB7kE,EAAI5I,GAAK0tE,IACrEvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAKrhI,EAAQ+uM,EAAiBpqO,EAAQulK,EAAI5I,GAAK7H,EAASu1E,IACvFvvE,EAAOxsK,KAAK,IAAI,EAAKmjM,MAAMlsB,EAAI7I,GAAK0tE,EAAiBpqO,EAAOulK,EAAI5I,GAAK7H,EAASu1E,IAC9ED,GAAkBpqO,EAClBqqO,GAAkBv1E,EAASnqK,EAAQ6/O,gBAI3C,OAAOV,GACH,MAAMhvE,EAAS7vK,KAAK6vK,OACdj6I,EAAQi6I,EAAO/uK,OAErB,IAAK80B,EACD,OAGJ,MAAMl2B,EAAUM,KAAKN,QACf46K,EAAMukE,EAASxoN,QAAQozK,MAAMzpM,KAAK2/O,gBAClCZ,EAAczkE,EAAIzQ,SAAWnqK,EAAQ6/O,gBAAkB3pN,EAAQ,GAC/Dwa,EAAQkqI,EAAIlqI,QAEd1wC,EAAQkgP,aACR5/O,KAAK6/O,mBAAmBvlE,EAAKlqI,EAAO2uM,GAEpC/+O,KAAK8/O,oBAAoBxlE,EAAKlqI,EAAO2uM,GAGzC,IAAK,IAAI7xM,EAAM,EAAGA,EAAMtX,EAAOsX,IAC3B2iI,EAAO3iI,GAAK25J,OAAOg4C,IAK/Bj7C,GAAkB,GAAa,CAC3B67C,UAAW,GACXrvM,MAAO,IACPwvM,cAAc,EACdG,eAAe,EACfR,eAAgB,EAChBvvC,OAAQ,CACJ5jC,SAAS,EACTsP,MAAO7V,GACP/hI,SAAU+hI,GACVupB,OAAQ,KAIhBgS,GAAW,GAAYngM,UAAW,IAEnB,IAAA,GAAA,GC3Pf,MAAM++O,GAAQ,QACRC,GAAQ,QAERC,GAAM,MAMZ,GAAgB7pO,QAAQo/M,SAAS,GAAqB,CAClD3J,GAAKC,GAAQC,GAAME,GvHFV,OAwBS,eAnBF,cAMP,OAPE,SAsBS,iBAxBP,UAuBS,kBAJL,cADH,WASA,YApBW,sBAUV,YASS,sBuHrB5B,GAAgB71M,QAAQo/M,SAAS,GAAY,CvHe7B,UACK,cApBN,WuHQf,GAAgBp/M,QAAQo/M,SAAS,GAAa,CAAExJ,KAChD,GAAgB51M,QAAQo/M,SCpCxB,cAA4B,GACxB,SACIz1N,KAAKmgP,iBAAiBngP,KAAKyoM,QAG/B,iBAAiBA,GACb,MAAMqmC,EAAcrmC,EAAO,GACrB23C,EAAa,IAAI,GAAWpgP,KAAM,CACpCyoM,OAAQA,EACR5kB,QAASirD,EAAYjrD,QACrBo4D,WAAYnN,EAAYmN,WACxBxZ,OAAQziO,KAAKN,QAAQ+iO,SAGzBziO,KAAKyjO,YAAY2c,KDsBuB,CvHLlC,UuHMd,GAAgB/pO,QAAQo/M,SEnCxB,cAA6B,GACzB,SACIz1N,KAAKqgP,kBAAkBrgP,KAAKyoM,QAGhC,kBAAkBA,GACd,MAAMqmC,EAAcrmC,EAAO,GACrB63C,EAAc,IAAI,GAAYtgP,KAAM,CACtCyoM,OAAQA,EACRg6B,OAAQziO,KAAKN,QAAQ+iO,OACrBgd,UAAW3Q,EAAY2Q,UACvBM,cAAejR,EAAYiR,cAC3BH,aAAc9Q,EAAY8Q,aAC1BL,eAAgBzQ,EAAYyQ,eAC5Bt3C,UAAW6mC,EAAY7mC,YAG3BjoM,KAAKyjO,YAAY6c,GAGrB,YAAYx+C,EAAOkR,GACf/rJ,MAAMw8K,YAAY3hC,EAAOkR,GACzB,GAAOhzM,KAAKN,QAAQ+iO,OAAOrvK,MAAO0uI,EAAMm4C,eFaC,CvHLlC,WuHOf,GAAgB5jO,QAAQo/M,SAAS,GAAe,CvHF7B,YACA,YACG,iBuHCtB,GAAgBp/M,QAAQo/M,SAAS,GAAe,CvHA7B,YACE,cACF,cuHAnB,GAAap/M,QAAQo/M,SACjB,CAAE3J,GAAKC,GAAQC,GAAME,GvHnBZ,OAwBS,gBuHJlB,CAAE5lD,IAAS,CvHwCE,WuHxCU05E,GAvBT,WvHbM,WACC,cuHsCzB,GAAa3pO,QAAQo/M,SACjB,CvHHiB,cADH,WADC,YASS,qBuHHxB,CA/BS,OAKF,MA0BO,CvHmCD,WuHnCauqB,GA5BZ,aA+BlB,GAAa3pO,QAAQo/M,SACjB,CvHAc,YApBW,uBuHqBzB,CAAEnvD,IAAS,CvH8BE,WuH9BU05E,GAjCT,WACI,YAmCtB,GAAa3pO,QAAQo/M,SAAS,CvHpBX,YACA,YACG,gBuHkBmD,CAAEjvD,GAAGC,IAAK,CAAEu5E,KACrF,GAAa3pO,QAAQo/M,SAAS,CvHlBX,YACE,cACF,auHgBqD,CAAEnvD,IAAS,CAAE05E,KAErF,GAAa3pO,QAAQo/M,SACjB,CvH7BW,UuH8BX,CAAEnvD,IAAS,CvHsBE,WuHtBU05E,GAAO,kBAAmB,YAGrD,GAAkB3pO,QAAQo/M,SACtB,CAAE3J,GAAKC,GAAQC,GAAME,GvH1CZ,OAwBS,eAKJ,YApBW,uBuHkCzB,CAAE7gN,MAAO60O,GAAKx0E,MAAOu0E,GAAOjwB,SAAUiwB,GAAOM,SA/CrC,MA+CoDC,UAAWN,KAG3E,GAAkB7pO,QAAQo/M,SACtB,CvH1BiB,cADH,WADC,YASS,qBuHoBxB,CAAEzsN,KApDM,MAoDKC,GAAIi3O,GAAKx0E,MAAOu0E,GAAOjwB,SAAUiwB,KAGlD,GAAkB5pO,QAAQo/M,SACtB,CvHpCe,YACE,cACF,auHmCf,CAAEpqN,MAAO60O,GAAKx0E,MAAOu0E,KAGzB,GAAa5pO,QAAQo/M,SACjB,CvHnCY,UACK,cApBN,UuHuDX,CAAEjvD,GAAGC,IAAK,CAAEu5E,GA7DE,WvHXQ,YACC,aACD,YACC,euHwE3B,GAAa3pO,QAAQo/M,SACjB,CvH3DW,UuH2DC,CAAEjvD,GAAGC,GAAG,QAAU,CAAEu5E,GvHFnB,WuH/DC,aAoElB,GAAa3pO,QAAQo/M,SACjB,CvH7DgB,cAMP,QuHwDT,CAAE,OAAQ,OAAQ,MAAO,SAAW,CvHPvB,WuHOmCuqB,GAAO,YAtEzC,aAyElB,GAAkB3pO,QAAQo/M,SACtB,CvHlEgB,cAMP,QuH6DT,CAAEj3N,KAAM0hP,GAAK/zN,KAAM+zN,GAAKh0N,IA5EhB,MA4E0BztB,MAAOyhP,GACvCx0E,MAAOu0E,GAAO/kB,UAAW+kB,GAAOjwB,SAAUiwB,KAGhD,GAAa5pO,QAAQo/M,SACjB,CvH3Ea,UAuBS,mBuHqDtB,CAAE,QAAS,KAAM,SAAU,KAAM,QAAS,OAAQ,YAAc,CvHlBnD,WuHkB+DuqB,GAjF9D,aAoFlB,GAAkB3pO,QAAQo/M,SACtB,CvHhFa,UAuBS,mBuH0DtB,CAAEt0M,MAAO++N,GAAK7kB,GAAI6kB,GAAKxkB,OAAQwkB,GAAK5kB,GAAI4kB,GAAK9+N,MAAO8+N,GAAKx6M,KAAMw6M,GAAKhkB,SAAU+jB,GAC5Ev0E,MAAOu0E,GAAOjwB,SAAUiwB,KAG9B,GAAa5pO,QAAQo/M,SACjB,CvHpFW,SAsBS,kBuH+DpB,CAAE,UAAW,UAAY,CvH7BZ,WuH6BwBuqB,GAAO,kBA5F9B,aA+FlB,GAAkB3pO,QAAQo/M,SACtB,CvHzFW,SAsBS,kBuHoEpB,CAAEp/M,QAAS6pO,GAAKr8M,OAAQq8M,GAAKx0E,MAAOu0E,GAAOjwB,SAAUiwB,KAGzD,GAAa5pO,QAAQo/M,SACjB,CAAExJ,GvH3FQ,SuH4FV,CAAE3lD,IAAS,CvHvCE,WuHuCU05E,GAAO,UAAW,kBAAmB,YG5FhE,MAAMS,GAAa,C1HqDF,W0HrDcn6E,GAAOE,GAAGC,IAOzC,MAAM,WAAc,GAChB,YAAYhyH,EAAS0sK,EAAau/B,EAAcpoO,EAAU,IACtD2uC,QAEAjnD,KAAKmpD,UAAY,GACjBnpD,KAAKgnK,YAAY1uJ,EAAQswC,UACzB5oD,KAAKgnM,aAAe,IAAI,GAAahnM,KAAMsY,GAC3CtY,KAAKgnM,aAAagyC,MAAQ0H,EAE1B1gP,KAAK2gP,aAAalsM,GAElB,MAAM/0C,EAAU0hM,GAAW,GAAIphM,KAAKN,QAASyhN,GAC7CnhN,KAAK4gP,iBAAmBx/C,GAAW,GAAI1hM,GACvCM,KAAK6gP,OAASH,EACd1gP,KAAK8gP,WAAWphP,EAASghP,GAEzB1gP,KAAK+gP,gBACL/gP,KAAKghP,eAELhhP,KAAKihP,iBACL,GAAWC,aAAa//B,EAAa,KACjCnhN,KAAKmhP,YAAa,EACbnhP,KAAKgjF,aACNhjF,KAAK6qI,QAAQ,QACb7qI,KAAKohP,UACLphP,KAAKqhP,mBAKjB,aAAa5sM,GAGT,IAFAz0C,KAAKshP,iBAAiB7sM,GACtBA,EAAQhI,MAAM3I,SAAW,WAClB2Q,EAAQ22B,YACX32B,EAAQw0B,YAAYx0B,EAAQ22B,YAEhCprE,KAAKy0C,QAAUA,EAGnB,iBAAiBA,GACbu8C,GAASv8C,EAAS,WAGtB,WAAW/0C,EAASghP,GAChB,MAAMa,EAAe,GACf94C,EAAS/oM,EAAQ+oM,QAAU,GAEjC,IAAK,IAAI/nM,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAC/B6gP,EAAal+O,KAAKjE,OAAOu8B,OAAO,GAAI8sK,EAAO/nM,KAE/ChB,EAAQ+oM,OAAS84C,EAi/CzB,SAA4B7hP,GACxB,MAAM8hP,EAAUf,GAEhB,IAAK,IAAIvzM,EAAM,EAAGA,EAAMs0M,EAAQ1gP,OAAQosC,IAAO,CAC3C,MAAMu0M,EAAQD,EAAQt0M,GAAO,OACzBxtC,EAAQ+hP,KACR/hP,EAAQ8hP,EAAQt0M,GAAO,QAAUxtC,EAAQ+hP,UAClC/hP,EAAQ+hP,KAP3B,CA/+C2B/hP,GACnBM,KAAK0hP,cAAchiP,EAASghP,GAGC,OAAzBhhP,EAAQw6O,qBACDx6O,EAAQw6O,aAGnBl6O,KAAKN,QAAU0hM,GAAW,GAAIs/C,EAAchhP,GAC5CM,KAAK2hP,oBAGT,UACI,MAAMC,EAAY5hP,KAAKN,QAAQkiP,WAAa,GAI5C,MAAO,CACHxxM,MAJUwxM,EAAUxxM,MAAQz+B,SAASiwO,EAAUxxM,MAAO,IAAM7mC,KAAK2R,MAAMlb,KAAKy0C,QAAQkmI,aAKpF9Q,OAJW+3E,EAAU/3E,OAASl4J,SAASiwO,EAAU/3E,OAAQ,IAAMtgK,KAAK2R,MAAMlb,KAAKy0C,QAAQmmI,eAQ/F,OAAOv3H,GACH,MAAMzrC,EAAO5X,KAAKyjL,UACZF,EAAcvjL,KAAKq5K,MACnBm0B,EAAU51L,EAAKw4B,MAAQ,GAAKx4B,EAAKiyJ,OAAS,EAE5CxmH,GAASmqJ,KAAajqB,GAAe3rK,EAAKw4B,QAAUmzI,EAAYnzI,OAASx4B,EAAKiyJ,SAAW0Z,EAAY1Z,SACrG7pK,KAAKq5K,MAAQzhK,EACb5X,KAAKwjL,QAAQ5rK,EAAMyrC,GACnBrjD,KAAK6qI,QAAQ,SAAUjzH,IAChB41L,GAAWxtM,KAAK6hP,aAAe1pN,GAAKn4B,KAAK6hP,YAAangP,IAAMA,EAAE0qK,WACrEpsK,KAAK8hP,qBACL9hP,KAAK+hP,mBAIb,UACI/hP,KAAKgiP,uBAGT,OAAOC,GAIH,GAHAjiP,KAAK0hP,cAAc1hP,KAAKN,SACxBM,KAAK2hP,oBAEDM,EAAU,CACV,MAAMpvC,EAAW7yM,KAAKkiP,OAAOv5B,UACvB3V,EAAOH,EAASwwB,SAAS4e,GAC/BpvC,EAAS2+B,OAAOx+B,QAEhBhzM,KAAKohP,UAIb,QAAQ32O,GACJ,OAAO69M,GAAe79M,EAAMzK,KAAK2oN,UAAU1V,MAG/C,eAAexoM,GACX,OAAOzK,KAAKusN,QAAQ9hN,GAGxB,eAAeA,GACX,MAAMu4N,EAAQhjO,KAAK2oN,UAAUqa,MAE7B,IAAK,IAAI91L,EAAM,EAAGA,EAAM81L,EAAMliO,OAAQosC,IAClC,GAAI81L,EAAM91L,GAAKxtC,QAAQ+K,OAASA,EAC5B,OAAO,IAAI,GAAUu4N,EAAM91L,IAKvC,gBAAgBA,GACZ,MAAM81L,EAAQhjO,KAAK2oN,UAAUqa,MAC7B,GAAIA,EAAM91L,GACN,OAAO,IAAI,GAAU81L,EAAM91L,IAInC,WACI,OAAO,IAAI,GAAcltC,KAAK2oN,WAGlC,gBAAgBxgB,EAAM1nM,GAClB,MAAMoyM,EAAW7yM,KAAK2oN,UAChBmmB,GAAej8B,EAAS26B,WAAa36B,EAASpK,QAAU,IAAI,GAClE,IAAI54B,EAEJ,GAAI,GAAWpvK,GACXovK,EAASgjC,EAASw1B,aAAa5nO,OAC5B,CACH,IAAI0hP,EAAYC,EACZ,GAAS3hP,IACT0hP,EAAa1hP,EAAOgoM,OACpB25C,EAAe3hP,EAAOkoM,UAEtBw5C,EAAaC,EAAe3hP,EAI5BovK,E1HhKF,U0H+JEi/D,EAAYxrO,KACH++O,GAAoBxvC,EAASyvC,mBAAmBH,GAAaC,GAC/DtT,EAAYxrO,OAAS2oN,I1HhK7B,W0HgKoC6iB,EAAYxrO,KACtC++O,IAAqBxvC,EAASytB,OAAO,IAAM,IAAIzwD,OAAQuyE,GAEvDvvC,EAASyvC,mBAAmBH,GAIzCtyE,GACA7vK,KAAKuiP,sBAAsBp6C,EAAMt4B,GAIzC,sBAAsBs4B,EAAMt4B,GACxB,MAAMo4B,EAAYjoM,KAAKqoM,WACvB,IAAK,IAAIn7J,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IACnC+6J,EAAU6oC,qBAAqBjhE,EAAO3iI,GAAMi7J,GAIpD,YAAY1nM,GACR,MAAM22O,EAASp3O,KAAKwiP,kBACZC,SAAU1nB,EAASpS,UAAW9V,GAAa7yM,KACnD,IAAIopK,EAAOoxC,EAWX,GATI,GAAW/5M,IACX2oK,EAAQypC,EAAS6vC,UAAUjiP,GACvB2oK,GAASguE,IACT58B,EAAgBpxC,EAAMi1C,aAEnB+4B,GAAU,GAAQ32O,KACzB+5M,EAAgB3H,EAASya,aAAa9S,cAAc/5M,IAGpD22O,EAAAA,CACA,GAAI58B,GAAiB,EAAG,CACpB,MAAM3qC,EAAS7vK,KAAK2oN,UAAUg6B,sBAAsBnoC,GACpDugB,EAAQ6E,OAAO/vD,SAEZzG,GACP2xD,EAAQ5yB,KAAK/+B,GAIrB,cACIppK,KAAKyiP,SAAS/sC,OAGlB,eACI,MAAM9Y,EAAU58L,KAAK48L,QACf55J,EAAOhjC,KAAK4iP,eAEZhB,EAAY5hP,KAAKN,QAAQkiP,WAAa,GACxCA,EAAUxxM,OACV,GAAYpN,EAAM,CAAEoN,MAAOwxM,EAAUxxM,QAErCwxM,EAAU/3E,QACV,GAAY7mI,EAAM,CAAE6mI,OAAQ+3E,EAAU/3E,SAGrC+yB,GAAWA,EAAQl9L,QAAQ4D,OAAStD,KAAKN,QAAQmjP,UAWlD7iP,KAAK48L,QAAQh+K,QACb5e,KAAK48L,QAAQ9Q,WAXb9rL,KAAK8iP,kBAEL9iP,KAAK48L,QAAU,EAAKmmD,QAAQ/3O,OAAOg4B,EAAM,CACrC1/B,KAAMtD,KAAKN,QAAQmjP,WAGvB7iP,KAAK48L,QAAQhkK,KAAK,aAAc54B,KAAKgjP,2BACrChjP,KAAK48L,QAAQhkK,KAAK,aAAc54B,KAAKijP,4BAQ7C,eACI,OAAOjjP,KAAKy0C,QAGhB,UACI,MAAMyuM,EAAQljP,KAAKmjP,YACnBnjP,KAAKq5K,MAAQ,CACTjpI,MAAO8yM,EAAMxjP,QAAQ0wC,MACrBy5H,OAAQq5E,EAAMxjP,QAAQmqK,QAG1B7pK,KAAKojP,eAELpjP,KAAKkiP,OAASgB,EACdljP,KAAK2oN,UAAYu6B,EAAMv6B,UAEvBu6B,EAAM17C,gBAE2B,IAA7BxnM,KAAKN,QAAQ8vJ,aACb0zF,EAAM/nE,UAAAA,SAAkB1mI,GAChBA,EAAQo/C,WACRp/C,EAAQo/C,UAAUwvJ,WAK9BrjP,KAAKghP,eACLhhP,KAAK48L,QAAQ3Q,KAAKi3D,EAAMh3D,SAES,IAA7BlsL,KAAKN,QAAQ8vJ,aACb0zF,EAAM/nE,UAAAA,SAAkB1mI,GAChBA,EAAQo/C,WACRp/C,EAAQo/C,UAAUyvJ,UAK9BtjP,KAAKyiP,SAAWziP,KAAKujP,iBACrBvjP,KAAKqoM,WAAa,IAAI,GACtBroM,KAAK+hP,kBACL/hP,KAAKwjP,kBACLxjP,KAAKyjP,uBACLzjP,KAAK0jP,wBAEL1jP,KAAK6qI,Q1HzOE,U0H0OP84G,GAAkB3jP,KAAK2oN,UAAUqa,OAE5BhjO,KAAK4jP,WACN5jP,KAAK6jP,mBAIb,aAAaC,GACT,IAAI53D,EACJ,GAAI43D,IAAkBA,EAAc1zM,OAAS0zM,EAAcj6E,QAAUi6E,EAAcpkP,SAAU,CACzF,MAAMqkP,EAAiB/jP,KAAKN,QACtBA,EAAU0hM,GAAW,GAAI0iD,EAAcpkP,QAAS,CAClDkiP,UAAW,CACPxxM,MAAO0zM,EAAc1zM,MACrBy5H,OAAQi6E,EAAcj6E,UAI9Bm6E,GAAmBhkP,KAAK4gP,iBAAkBlhP,GAC1CM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAK4gP,iBAAkBlhP,GACrDM,KAAK8gP,WAAW9gP,KAAKN,QAASM,KAAK6gP,QACnC7gP,KAAKihP,iBAEL,MAAMiC,EAAQljP,KAAKmjP,YAEnBD,EAAM17C,eACNm8C,GAAkBT,EAAMv6B,UAAUqa,OAElC92C,EAASg3D,EAAMh3D,OAEflsL,KAAKN,QAAUqkP,OAEf73D,EAASlsL,KAAK48L,QAAQ/Z,eAG1B,OAAOqJ,EAGX,iBACI,OAAOlsL,KAAK2oN,qBAAqB,IAAuB3oN,KAAKN,QAAQq7N,SAAW/6N,KAAKN,QAAQq7N,QAAQqc,OAGzG,kBACI,MAAM13O,EAAUM,KAAKN,SACI,IAArBA,EAAQ2iM,WACRriM,KAAKikP,UAAY,IAAI,GAASjkP,KAAK2oN,UAAWjpN,EAAQ2iM,WAI9D,uBACI,MAAM6hD,EAAWlkP,KAAKN,QAAQwkP,SACxBxP,GAAawP,GAAY,IAAIxP,WAClB,IAAbwP,IAAoC,IAAdxP,IACtB10O,KAAKmkP,eAAiB,IAAI,GAAcnkP,KAAM00O,IAItD,wBACI,MAAMwP,EAAWlkP,KAAKN,QAAQwkP,SACxB9O,GAAc8O,GAAY,IAAI9O,YACnB,IAAb8O,IAAqC,IAAf9O,IACtBp1O,KAAKokP,gBAAkB,IAAI,GAAepkP,KAAMo1O,IAIxD,wBACI,MACM8O,EAAWlkP,KAAKN,QAAQwkP,SAExB9O,GAAc8O,GAAY,IAAI9O,WAC9BiP,IAJWrkP,KAAKN,QAAQ2iM,WAIe,IAAb6hD,IAAoC,KAFjDA,GAAY,IAAIxP,WAE4C10O,KAAKojM,iBAAiB,C1HvT1F,YAFN,OACI,a0HyTHkhD,IAA0B,IAAbJ,IAAqC,IAAf9O,KAA0Bp1O,KAAKojM,iBAAiB,C1HvT9E,YACN,OACI,Y0HsTH3uJ,EAAUz0C,KAAKy0C,QAEjBz0C,KAAKukP,kBAAoBF,GAAaC,GACtC7vM,EAAQhI,MAAMsT,YAAc//C,KAAKwkP,cAAgB,GACjDxkP,KAAKukP,kBAAmB,GAChBvkP,KAAKukP,kBAAsBF,GAAaC,IAChD7vM,EAAQhI,MAAMsT,YAAc,OAE5B//C,KAAKukP,kBAAmB,GAG5BvkP,KAAKykP,kBAAkBJ,GAAYC,GAGvC,iBAAiBI,EAAM1N,GACnB,MAAMn0L,EAAY7iD,KAAK6iD,UAClBA,IAIDA,EAAU8hM,YACV9hM,EAAU8hM,WAAWD,GAGrB7hM,EAAU+hM,YACV/hM,EAAU+hM,WAAW5N,IAI7B,iBACI,MAAQt3O,SAAWq7N,QAASmE,IAAqBl/N,KACjD,IAAI+6N,EAQJ,OALIA,EADA/6N,KAAKwiP,iBACKxiP,KAAK6kP,qBAAqB3lB,GAE1B,IAAI,GAAQl/N,KAAKgnM,aAAck4B,GAGtCnE,EAGX,qBAAqBr7N,GACjB,OAAO,IAAI,GAAcM,KAAK2oN,UAAWjpN,GAG7C,cAAcA,EAASghP,IAirC3B,SAA2BhhP,EAASghP,GAChC,MAAMoE,GAAsBpE,GAAgB,IAAgB,cAAK,GACjE,IAAI9xB,EAAUm2B,EAAc9xC,EAE5B,SAAS+xC,EAAe5iC,GACpB,MAAM6iC,GAAa7iC,GAAe,IAAI12C,OAASq5E,EAAar5E,MACtDhkK,EAAS05L,GAAW,GACtB0jD,EACAA,EAAkBl2B,GAClBm2B,EACAA,EAAan2B,GAAW,CACpB/gL,KAAM,CAAE69H,MAAOu5E,GACfj1C,OAAQ,CAAEtkC,MAAOu5E,GACjBvsI,MAAO,CAAEgzD,MAAOu5E,IAEpB7iC,GAKJ,cAFO16M,EAAOknN,GAEPlnN,EAGX,IAAK,IAAIwlC,EAAM,EAAGA,EAAMuzM,GAAW3/O,OAAQosC,IACvC0hL,EAAW6xB,GAAWvzM,GAAO,OAC7B63M,EAAerlP,EAAQqlP,cAAgB,GACvC9xC,EAAO,GAAGtpM,OAAOjK,EAAQkvN,IAEzB3b,EAAOA,EAAKxxM,IAAIujP,GAEhBtlP,EAAQkvN,GAAY3b,EAAKnyM,OAAS,EAAImyM,EAAOA,EAAK,GA9B1D,CAhrC0BvzM,EAASghP,GAktCnC,SAA6BhhP,EAASghP,GAClC,MAAMj4C,EAAS/oM,EAAQ+oM,OACjBy8C,EAAez8C,EAAO3nM,OACtBm4O,EAAiBv5O,EAAQu5O,eACzBkM,EAAiB/jD,GAAW,GAAI1hM,EAAQu5O,gBACxCmM,EAAsB1E,EAAet/C,GAAW,GAAIs/C,EAAazH,gBAAkB,GACnFoM,EAAsBjkD,GAAW,GAAIgkD,GAE3CE,GAA4BH,GAC5BG,GAA4BD,GAE5B,IAAK,IAAI3kP,EAAI,EAAGA,EAAIwkP,EAAcxkP,IAAK,CACnC,MAAMmpO,EAAaphC,EAAO/nM,GAAG4C,MAAQ5D,EAAQu5O,eAAe31O,KAEtD8sO,EAAchvC,GAChB,CAAEhiL,KAAM,IACRimO,EACAD,EAAoBvb,GACpB,CAAE9O,QAASr7N,EAAQq7N,SACnBoqB,EACAlM,EAAepP,IAGnBphC,EAAO/nM,GAAGwvN,UAAYkgB,EACtB3nC,EAAO/nM,GAAK0gM,GAAW,GAAIgvC,EAAa3nC,EAAO/nM,IAC/C+nM,EAAO/nM,GAAG0e,KAAOqpL,EAAO/nM,GAAG0e,MAAQ,IAzB3C,CAjtC4B1f,EAASghP,GAGjC,oBACI,MAAMhhP,EAAUM,KAAKN,QACf+oM,EAAS/oM,EAAQ+oM,OACjBv8J,EAASxsC,EAAQw6O,cAAgB,GAEvC,IAAK,IAAIx5O,EAAI,EAAGA,EAAI+nM,EAAO3nM,OAAQJ,IAAK,CACpC,MAAM+vN,EAAgBhoB,EAAO/nM,GACvB6kP,EAAcr5M,EAAOxrC,EAAIwrC,EAAOprC,QAChCF,EAAW6vN,EAAcP,UAE/BO,EAAc/kD,MAAQ+kD,EAAc/kD,OAAS65E,EACzC3kP,IACAA,EAAS8qK,MAAQ9qK,EAAS8qK,OAAS65E,IAK/C,YACI,MAAM7lP,EAAUM,KAAKN,QACfmzM,EAAW7yM,KAAKwlP,kBAChBtC,EAAQ,IAAI,GAAYljP,KAAKylP,iBAYnC,OAXAvC,EAAMphD,MAAQ9hM,KACdkjP,EAAMv6B,UAAY9V,EAElB,GAAM8tB,WAAWjhO,EAAQg5G,MAAOwqI,GAE5BxjP,EAAQ+iO,QAAU/iO,EAAQ+iO,OAAOr2D,SACjC82E,EAAM7oH,OAAO,IAAI,GAAOw4E,EAASnzM,QAAQ+iO,OAAQziO,KAAKgnM,eAE1Dk8C,EAAM7oH,OAAOw4E,GACbqwC,EAAMr8C,SAECq8C,EAGX,gBACI,MAAMxjP,EAAUM,KAAKN,QACfkY,EAAO5X,KAAKyjL,UAElB,OAAO2d,GAAW,CACd5xC,YAAa9vJ,EAAQ8vJ,YACrBp/G,MAAOx4B,EAAKw4B,O7XndK,I6XodjBy5H,OAAQjyJ,EAAKiyJ,Q7XtdK,K6XudnBnqK,EAAQkiP,WAGf,gBAAgB8D,GACZ,MAAMhmP,EAAUM,KAAKN,QAIrB,OAFiB,GAAgB2W,QAAQrL,OAAO06O,EAAa,GAAKhmP,EAAQ+oM,OAAQ/oM,EAASM,KAAKgnM,cAKpG,kBACI,MAAQ2hB,WAAW,KAAE1V,IAAWjzM,KAC1B2lP,EAAa3lP,KAAK6hP,YAAc,GAEtC,IAAK,IAAInhP,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMi7K,EAAOs3B,EAAKvyM,GACZhB,EAAUi8K,EAAKj8K,QACrB,GAAIi8K,aAAgB,IAAgBj8K,EAAQkmP,SAAWlmP,EAAQ+rM,SAAU,CACrE,MAAMptK,EAAQs9I,EAAKt9I,QAEbq2M,EAAY,IAAI,GAAU10O,KAAM27K,EAClCylB,GAAW,CAAE53L,IAAK60B,EAAM70B,IAAKoS,IAAKyiB,EAAMziB,KAAOlc,EAAQkmP,SAG3DD,EAAWtiP,KAAKqxO,KAK5B,aAAajiO,GACT,OAAOzS,KAAK6qI,Q1HlbC,c0HkbqBp4H,GAGtC,QAAQA,GACJ,OAAOzS,KAAK6qI,Q1HrbL,S0HqbqBp4H,GAGhC,WAAWA,GACP,OAAOzS,KAAK6qI,Q1HxbD,Y0HwbqBp4H,GAGpC,gBACIzS,KAAK6lP,cAAgB7lP,KAAK8iL,OAAOlqJ,KAAK54B,MACtCA,KAAKq1O,mBAAqBr1O,KAAKs1O,YAAY18M,KAAK54B,MAChDA,KAAK8lP,mBAAqB9lP,KAAKijL,YAAYrqJ,KAAK54B,MAChDA,KAAKgjP,0BAA4BhjP,KAAK+lP,WAAWntN,KAAK54B,MACtDA,KAAKijP,0BAA4BjjP,KAAKgmP,UAAUptN,KAAK54B,MAErDA,KAAKkjL,WAAa7gJ,GACdriC,KAAKkjL,WAAWtqJ,KAAK54B,MA5eT,IAifpB,YAAY4oD,GACJA,GACA5oD,KAAKmpD,UAAU9lD,KAAKulD,GAI5B,eAAeA,GACX,MAAM50C,EAAQhU,KAAKmpD,UAAUtnD,QAAQ+mD,GACjC50C,GAAS,GACThU,KAAKmpD,UAAUnvC,OAAOhG,EAAO,GAIrC,iBAAiBitK,GACb,MAAM93H,EAAYnpD,KAAKmpD,UACvB,IAAK,IAAIjc,EAAM,EAAGA,EAAMic,EAAUroD,OAAQosC,IACtC,GAAIic,EAAUjc,GAAKk2J,iBAAiBniB,GAChC,OAAO,EAKnB,QAAQx2K,EAAMgJ,EAAO,I1H5dJ,gB0H6dThJ,IACAgJ,EAAKwnE,OAAOmuF,MAAQppK,KAAKimP,uBAAuBxyO,EAAKwnE,OAAOmuF,QAEhE31J,EAAK4tK,OAASrhL,KAEd,MAAMmpD,EAAYnpD,KAAKmpD,UACvB,IAAIm4H,GAAqB,EACzB,IAAK,IAAIp0I,EAAM,EAAGA,EAAMic,EAAUroD,OAAQosC,IAClCic,EAAUjc,GAAK29F,QAAQpgI,EAAMgJ,KAC7B6tK,GAAqB,GAI7B,OAAOA,EAGX,gBACI,MAAM7sI,EAAUz0C,KAAKy0C,QAErBz0C,KAAKwkP,aAAe/vM,EAAQhI,MAAMsT,YAElC,GAAWtL,EAAS,CAChB,YAAiBz0C,KAAK6lP,cACtB,CAAEz5B,IAAcpsN,KAAKq1O,mBACrB,WAAgBr1O,KAAK8lP,qBAGrB9lP,KAAKkmP,0BACL,GAAWzxM,EAAS,CAAE,UAAez0C,KAAKkjL,aAG9CljL,KAAK6iD,UAAY,GAAiB73C,OAAOhL,KAAKy0C,QAAS,CACnDlxC,MAAOvD,KAAKy1O,OAAO78M,KAAK54B,MACxBkqH,KAAMlqH,KAAK01O,MAAM98M,KAAK54B,MACtBqH,IAAKrH,KAAK21O,KAAK/8M,KAAK54B,MACpBoiC,IAAKpiC,KAAK41O,KAAKh9M,KAAK54B,MACpB+1O,aAAc/1O,KAAKg2O,cAAcp9M,KAAK54B,MACtCi2O,cAAej2O,KAAKk2O,eAAet9M,KAAK54B,MACxCm2O,WAAYn2O,KAAKo2O,YAAYx9M,KAAK54B,QAGtCA,KAAKmmP,wBAGT,YAAY1zO,GACJzS,KAAKomP,gBACLpmP,KAAKomP,cAAc5zB,IAAIxyN,KAAMyS,GAC7BzS,KAAKomP,cAAgB,MAGrBpmP,KAAK2oN,UAAU09B,UACfrmP,KAAK6qI,Q1H3hBO,iB0H4hBZ7qI,KAAK2oN,UAAU09B,SAAU,GAIjC,mBACQrmP,KAAK6iD,WAAa7iD,KAAK6iD,UAAU3oB,QACjCl6B,KAAK6iD,UAAU3oB,SAIvB,cAAcznB,GACNzS,KAAKokP,kBAAoBpkP,KAAKsmP,mBAAmB7zO,KACjDzS,KAAKumP,iBAAmB9zO,EAAEukC,SAC1Bh3C,KAAKizO,oBACLjzO,KAAK48L,QAAQF,mBAIrB,YAAYjqL,GACJzS,KAAKwmP,WAAaxmP,KAAKsmP,mBAAmB7zO,KACtCzS,KAAK48L,SACL58L,KAAK48L,QAAQD,iBAEjB38L,KAAKwmP,UAAW,EAChBxmP,KAAK6qI,Q1H9iBA,U0H8iBkB,KAI/B,eAAep4H,GACX,MAAMg0O,EAAiBzmP,KAAKokP,gBAE5B,GAAIqC,IAAmBzmP,KAAKsmP,mBAAmB7zO,GAAI,CAC/CA,EAAEkuC,iBAEF,IAAI+lM,GAAcj0O,EAAEukC,SADYh3C,KAAKumP,iBACoB,EAEzD,GAAIh9O,KAAK+mC,IAAIo2M,IAAe,GAAK,CAC7BA,EAAan9O,KAAKw1B,MAAmB,GAAb2nN,GAExB1mP,KAAKumP,iBAAmB9zO,EAAEukC,SAC1B,MAAMvjC,EAAO,CAAE68D,MAAOo2K,EAAYvuB,WAAY,GAAWn4N,KAAK2oN,UAAU1V,MAAOrvB,cAAenxK,IAC1FzS,KAAKwmP,UAAaxmP,KAAK6qI,Q1HjkBxB,Y0HikB4Cp3H,KAEtCzT,KAAKwmP,WACNxmP,KAAKwmP,UAAW,IAGL/yO,EAAK0kN,WAAasuB,EAAeE,aAAaD,MAC9C1mP,KAAK6qI,Q1HvkB3B,O0HukByCp3H,IAC9BgzO,EAAezP,UAOnC,UAAUvkO,GACN,GAAIA,EAAEgiC,QAAS,CACX,MAAMA,EAAUz0C,KAAK4mP,qBAAqBn0O,EAAEgiC,QAAShiC,GAEjDgiC,GAAWA,EAAQoyM,OACnBpyM,EAAQoyM,MAAM7mP,KAAMyS,EAAEmxK,gBAKlC,OAAOnxK,GACH,MAAMuhN,EAASh0N,KAAKswO,kBAAkB79N,IAElCzS,KAAKsmP,mBAAmB7zO,IAAOzS,KAAK2oN,UAAUm+B,wBAAwB9yB,KAKtEh0N,KAAKojM,iBAAiB,C1HnmBf,YAFN,OACI,a0HqmBLpjM,KAAK+mP,iBAAiBt0O,EAAGuhN,E1HpmBlB,a0HumBPh0N,KAAKikP,WAAajkP,KAAKikP,UAAU1gP,MAAMkP,KACvCzS,KAAK48L,QAAQF,kBACb18L,KAAKizO,oBACLjzO,KAAKgnP,gBAAiB,EACtBhnP,KAAKgnM,aAAa+W,SAAU,GAG5B/9M,KAAKmkP,gBACDnkP,KAAKmkP,eAAe5gP,MAAMkP,IAC1BzS,KAAK6qI,Q1H/mBF,Y0H+mBsB,CAAEstF,WAAY,GAAWn4N,KAAK2oN,UAAU1V,MAAOrvB,cAAenxK,KAKnG,MAAMA,GACF,IAAMmxO,UAAWzlM,EAAO8lM,UAAW5hD,GAAariM,KAEhD,IAAIA,KAAKsmP,mBAAmB7zO,GAA5B,CAIA,GAAI4vL,EAAU,CACV,MAAMgvC,EAAShvC,EAASn4E,KAAKz3G,GAEzB4+N,IAAWrxO,KAAK6qI,Q1HjoBnB,O0HioBiC,CAAEstF,WAAYkZ,EAAQztD,cAAenxK,KACnE4vL,EAASqvC,WAEV,GAAIvzL,EAAO,CACd,MAAMkzL,EAAS,GACTp+B,EAAO90J,EAAM80J,KAEnB,IAAK,IAAIvyM,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMs/N,EAAc/sB,EAAKvyM,GAEzB,GADiBs/N,EAAYtgO,QAAQ+K,KACvB,CACV,MAAMkxK,EAAOqkD,EAAYtgO,QAAQ+rM,SAAWh5L,EAAE09B,EAAI19B,EAAEu4B,EAC9CslC,EAAQqrG,EAAK42D,cAAgB52D,EAAKt6G,SAE1B,IAAViP,IACA+gK,EAAOrR,EAAYtgO,QAAQ+K,MAAQu1N,EAAYne,eAAevxI,KAK1EnyB,EAAMg6K,WAAakZ,EACnBrxO,KAAK6qI,Q1HtpBJ,O0HspBkB,CACfstF,WAAYkZ,EACZztD,cAAenxK,IAInBzS,KAAKmkP,gBACLnkP,KAAKmkP,eAAej6H,KAAKz3G,IAIjC,KAAKA,GACD,GAAIzS,KAAKsmP,mBAAmB7zO,GACxB,OAGJ,MAAM4vL,EAAWriM,KAAKikP,UAatB,GAZI5hD,GAAYA,EAASh7L,IAAIoL,IACzBzS,KAAK48L,QAAQD,iBACb38L,KAAK6qI,Q1HxqBA,U0HwqBkB,CACnBstF,WAAY,GAAWn4N,KAAK2oN,UAAU1V,MACtCrvB,cAAenxK,IAEnBzS,KAAKgnP,gBAAiB,EACtBhnP,KAAKgnM,aAAa+W,SAAU,GAE5B/9M,KAAKinP,eAAex0O,E1H/qBf,W0HkrBLzS,KAAKmkP,eAAgB,CACrB,MAAM9S,EAASrxO,KAAKmkP,eAAe98O,IAAIoL,GACnC4+N,IAAWrxO,KAAK6qI,Q1HjrBnB,O0HirBiC,CAAEstF,WAAYkZ,EAAQztD,cAAenxK,MACnEzS,KAAKmkP,eAAenN,OACpBh3O,KAAK6qI,Q1HlrBJ,U0HkrBsB,CAAEstF,WAAYkZ,EAAQztD,cAAenxK,MAKxE,mBAAmBA,GACf,MAAMkzO,EAAa3lP,KAAK6hP,aAAe,GACvC,IAAK8D,EAAW7kP,OACZ,OAAO,EAGX,MAAMkzN,EAASh0N,KAAKswO,kBAAkB79N,GAChCugM,EAAOhzM,KAAK2oN,UAAUqpB,YAAYhe,GACxC,GAAIhhB,EACA,IAAK,IAAI9lK,EAAM,EAAGA,EAAMy4M,EAAW7kP,OAAQosC,IACvC,GAAIy4M,EAAWz4M,GAAKg6M,OAAOl0C,GACvB,OAAO,EAMvB,YAAYvgM,GACR,MAAM69D,EAAQ+yH,GAAgB5wL,GACxBg0O,EAAiBzmP,KAAKokP,gBACtBpwB,EAASh0N,KAAKswO,kBAAkB79N,GAEtC,IAAIzS,KAAKsmP,mBAAmB7zO,IAAOzS,KAAK2oN,UAAUm+B,wBAAwB9yB,GAI1E,GAAIyyB,EAAgB,CAChB,MAAMhzO,EAAO,CAAE68D,MAAOA,EAAO6nJ,WAAY,GAAWn4N,KAAK2oN,UAAU1V,MAAOrvB,cAAenxK,IACrFzS,KAAKwmP,UAAaxmP,KAAK6qI,Q1HrtBpB,Y0HqtBwCp3H,KAC3ChB,EAAEkuC,iBAEG3gD,KAAKwmP,WACNxmP,KAAKizO,oBACLjzO,KAAK48L,QAAQF,kBACb18L,KAAKwmP,UAAW,GAGhBxmP,KAAKq2O,YACL37N,aAAa1a,KAAKq2O,YAGtB5iO,EAAK0kN,WAAasuB,EAAeE,aAAar2K,GAC1C78D,EAAK0kN,aAAen4N,KAAK6qI,Q1HluBhC,O0HkuB8Cp3H,IACvCgzO,EAAezP,OAGnBh3O,KAAKq2O,WAAav7N,WAAW,KACzB9a,KAAK6qI,Q1HtuBR,U0HsuB0Bp3H,GACvBzT,KAAKwmP,UAAW,EACZxmP,KAAK48L,SACL58L,KAAK48L,QAAQD,kB1HxtBZ,U0H4tBV,CACH,IAAIx+I,EAAQn+C,KAAK4jP,UAQjB,GAPKzlM,GACiBn+C,KAAK+mP,iBAAiBt0O,EAAGuhN,E1HlvBxC,e0HovBC71K,EAAQn+C,KAAK4jP,WAIjBzlM,EAAO,CACP,MAAMgpM,EAAahpM,EAAMgpM,YAAc72K,EACvCnyB,EAAMgpM,WAAaA,EAAa72K,EAEhC,MAAM2iI,EAAOjzM,KAAK4jP,UAAU3wC,KACtBo+B,EAAS,GAEf,IAAK,IAAI3wO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMs/N,EAAc/sB,EAAKvyM,GACnBkuN,EAAWoR,EAAYtgO,QAAQ+K,KACjCmkN,IACAyiB,EAAOziB,GAAYoR,EAAY9d,YAAYilC,IAInDnnP,KAAK6qI,Q1HtwBR,O0HswBsB,CACfv6D,MAAOA,EACP6nJ,WAAYkZ,EACZztD,cAAenxK,IAGfzS,KAAKq2O,YACL37N,aAAa1a,KAAKq2O,YAGtBr2O,KAAKq2O,WAAav7N,WAAW,KACzB9a,KAAKinP,eAAex0O,E1HhxBvB,YAiBQ,O0HqwBrB,iBAAiBA,EAAGuhN,EAAQozB,GACxB,MAAMv0C,EAAW7yM,KAAKkiP,OAAOv5B,UACvB3V,EAAOH,EAASw0C,cAAcrzB,GAC9B/gB,EAAOJ,EAASI,KAAK/uM,MAAM,GAEjC,IAAK8uM,EACD,OAGJ,MAAMq+B,EAAS,GAAWp+B,GAERjzM,KAAK6qI,QAAQu8G,EAAY,CACvCjvB,WAAYkZ,EACZztD,cAAenxK,IAIfzS,KAAK6jP,oBAEL7jP,KAAKgnP,gBAAiB,EACtBhnP,KAAKizO,oBACLjzO,KAAK4jP,UAAY,CACbzrB,WAAYkZ,EACZr+B,KAAMA,EACNC,KAAMA,IAKlB,eAAexgM,EAAG20O,GACVpnP,KAAK4jP,YACL5jP,KAAK6qI,QAAQu8G,EAAY,CACrBjvB,WAAYn4N,KAAK4jP,UAAUzrB,WAC3Bv0C,cAAenxK,IAEnBzS,KAAKgnP,gBAAiB,EACtBhnP,KAAK4jP,UAAY,MAIzB,iBAAiBnxO,EAAG1S,GAChB,MAAM00C,EAAUz0C,KAAK48L,QAAQjZ,YAAYlxK,GACzC,GAAIgiC,EACA,OAAOz0C,KAAK4mP,qBAAqBnyM,EAAShiC,EAAG1S,GAIrD,qBAAqB00C,EAAShiC,EAAG1S,GAC7B,IACIunM,EADAjxL,EAAUo+B,EAEd,KAAOp+B,IAAYixL,GACfA,EAAejxL,EAAQixL,aACvBjxL,EAAUA,EAAQgQ,OAGtB,GAAIihL,EAYA,OAXIA,EAAa2H,WACb3H,EAAeA,EAAa2H,SAASx8L,EAAGzS,KAAKswO,kBAAkB79N,KAG/D1S,IACAunM,EAAeA,EAAaggD,QAAQvnP,GAChCunM,GAAgBA,EAAa2H,WAC7B3H,EAAeA,EAAa2H,aAI7B3H,EAIf,kBAAkB70L,GACd,MAAM80O,EAAc,GAAiB90O,GACrC,OAAOzS,KAAK02O,oBAAoB6Q,EAAYv8M,EAAGu8M,EAAYp3M,GAG/D,kBACI,IAAKnwC,KAAKwnP,SAAU,CAChB,MAAM,YAAE3lE,EAAW,WAAEC,GAAe,GAAc9hL,KAAKy0C,QAAS,CAAE,cAAe,eACjFz0C,KAAKwnP,SAAW,CACZv4H,IAAK6yD,EACLnwI,KAAMkwI,GAId,OAAO7hL,KAAKwnP,SAGhB,uBAAuBp+E,GACnB,MAAMya,EAAU7jL,KAAKynP,kBACf1yO,EAAS,GAAc/U,KAAKy0C,SAElC,MAAO,CACH9C,KAAM,GAAMy3H,EAAMp+H,EAAI64I,EAAQlyI,KAAO58B,EAAO48B,MAC5Cs9E,IAAK,GAAMm6C,EAAMj5H,EAAI0zI,EAAQ50D,IAAMl6G,EAAOk6G,MAMlD,oBAAoBx2E,EAASC,GACzB,MAAMjE,EAAUz0C,KAAKy0C,QACf1/B,EAAS,GAAc0/B,GACvBovI,EAAU7jL,KAAKynP,kBACfzjE,E5Ll7BC,SAAsBvvI,GACjC,IAAKA,EACD,OAAO,GAAOo4E,OAGlB,IAAI27C,EAAS,GAAgB/zH,GACzBpuB,EAASouB,EAAQk8E,cACrB,KAAOtqG,GAAQ,CACX,MAAMwlJ,EAAe,GAAgBxlJ,GACrCmiJ,EAASA,EAAO4C,aAAaS,GAC7BxlJ,EAASA,EAAOsqG,cAIpB,OADA63C,EAAOtpK,EAAIspK,EAAO1pK,EAAI0pK,EAAO/1J,EAAI+1J,EAAO/iK,EAAI,EACrC+iK,EAdI,C4Lk7B+B/zH,GAASrY,SACzCgtI,EAAQ,IAAI,EAASo9B,MACvB/tJ,EAAU1jC,EAAO48B,KAAOkyI,EAAQlyI,KAChC+G,EAAU3jC,EAAOk6G,IAAM40D,EAAQ50D,KACjCn3G,UAAUksK,GAEZ,OAAO,IAAI,GAAM5a,EAAMp+H,EAAGo+H,EAAMj5H,GAGpC,KAAK19B,GACD,MAAMi1O,EAAiB1nP,KAAK48L,QAAQjZ,YAAYlxK,GAC1CgiC,EAAUz0C,KAAK4mP,qBAAqBc,EAAgBj1O,GACpDk1O,EAAgB3nP,KAAKwiP,iBAEtBxiP,KAAK4nP,YAAYF,EAAgBj1O,IAAOk1O,GACzC3nP,KAAKizO,oBAGL0U,GACA3nP,KAAK6nP,oBAAoB7nP,KAAKswO,kBAAkB79N,GAAIA,GAAG,GAG3DzS,KAAK8nP,gBAAgBrzM,EAAShiC,GAG9BzS,KAAK+nP,aAAc,EACnBjtO,WAAW,KACP9a,KAAK+nP,aAAc,GACpB,GAGP,OAAOt1O,GACH,MAAMgiC,EAAUz0C,KAAKgoP,iBAAiBv1O,GACtCzS,KAAK8nP,gBAAgBrzM,EAAShiC,GAGlC,gBAAgBgiC,EAAShiC,GACrB,IAAI4D,EAAUo+B,EACd,KAAOp+B,GACCA,EAAQs1K,OACRt1K,EAAQs1K,MAAM3rL,KAAMyS,GAGxB4D,EAAUA,EAAQgQ,OAI1B,YAAYouB,EAAShiC,GACjB,GAAIzS,KAAKgnP,eACL,OAAO,EAGX,IAAI59E,EAAQppK,KAAK4mP,qBAAqBnyM,EAAShiC,GAAAA,SAAYgiC,GACvD,OAAQA,EAAQ89K,OAAS99K,EAAQvW,SAAWuW,aAAmB,OAGnE,MAAMwzM,EAAcjoP,KAAKkoP,aACnBC,EAAiBnoP,KAAK2oN,UAAUlgB,OAAO3nM,OAAS,EAChDsnP,EAAqBpoP,KAAKqoP,sBA0BhC,OAxBAroP,KAAKsoP,oBAAoBl/E,EAAO32J,GAE5B22J,GAAS6+E,IAAgB7+E,GAASA,EAAMmpD,OACxCvyN,KAAKkoP,aAAe9+E,EAEfppK,KAAKwiP,kBAAqBp5E,EAAMmpD,MAAMvyN,KAAMyS,KAC7CzS,KAAKuoP,gBAAgBn/E,GAEjBg/E,EACApoP,KAAKwoP,wBAAwBp/E,EAAO++E,GAEpCnoP,KAAKqoM,WAAWF,KAAK/+B,MAGrBA,GAASg/E,IACbD,GAAkBnoP,KAAKyoP,uBACvBzoP,KAAK0oP,qBAAqBt/E,GAAO,GACjCppK,KAAK2oP,oBAAoB3oP,KAAKyoP,qBAAqBr3M,SAAU,MAAM,GACnEpxC,KAAKyoP,qBAAuB,MAEhCzoP,KAAKqoM,YAAcroM,KAAKqoM,WAAWqN,OACnC11M,KAAKkoP,aAAe,MAGjB9+E,EAGX,gBAAgBA,GACWg4B,GAAW,GAAIphM,KAAKN,QAAQq7N,QAAS3xD,EAAM1pK,QAAQq7N,SACvD3uD,SACfpsK,KAAKyiP,SAASt6C,KAAK/+B,GAI3B,wBAAwB6+E,EAAaE,EAAgBS,GACjD,MAAMC,EAAgB7oP,KAAKyoP,qBAAuBzoP,KAAK8oP,wBAAwBb,GAE/E,GAAIE,EACAnoP,KAAK0oP,qBAAqBT,GAC1BjoP,KAAK2oP,oBAAoBE,EAAcz3M,SAAU,MAAM,GACvDpxC,KAAK2oP,oBAAoBE,EAAcz3M,SAAU62M,EAAYx/C,QAC7DzoM,KAAKqoM,WAAWF,KAAKygD,GAAmBX,OACrC,CACH,IAAIc,EAEJ,IAAKF,EAAcG,+BAEf,YADAhpP,KAAKqoM,WAAWF,KAAK8/C,GAIzBc,EAAiB/oP,KAAKipP,mBAAmBhB,EAAaY,GAElDE,GAAkBA,EAAejoP,QACjCd,KAAKqoM,WAAWF,KAAK4gD,EAAgB,EAAI/oP,KAAKkpP,6BAA6BjB,EAAYx/C,UAKnG,mBAAmBw/C,EAAaY,GAG5B,OAFgB7oP,KAAKmpP,oBAAoBN,EAAeZ,EAAY78O,aAEnD3K,OAAO2oK,GAASA,IAAU6+E,GAG/C,oBAAoB7tK,EAAW92E,GAC3B,IAAIusK,EAAS,GAEb,IAAK,IAAInvK,EAAI,EAAGA,EAAI05E,EAAUhpC,SAAStwC,OAAQJ,IAAK,CAChD,MAAM+zC,EAAU2lC,EAAUhpC,SAAS1wC,GAE/B+zC,EAAQrpC,cAAgB9H,EACxBusK,EAAOxsK,KAAKoxC,GACLA,EAAQrD,UAAYqD,EAAQrD,SAAStwC,SAC5C+uK,EAASA,EAAOlmK,OAAO3J,KAAKmpP,oBAAoB10M,EAASnxC,KAIjE,OAAOusK,EAGX,oBAAoBzG,EAAO32J,GACvB,MAAM22O,EAAeppP,KAAKomP,cAEtBgD,GAAgBA,IAAiBhgF,IACjCggF,EAAa52B,IAAIxyN,KAAMyS,GACvBzS,KAAKomP,cAAgB,MAGrBh9E,GAASggF,IAAiBhgF,GAASA,EAAMlrI,OACzCl+B,KAAKomP,cAAgBh9E,EACrBA,EAAMlrI,KAAKl+B,KAAMyS,IAIzB,qBAAqB22J,EAAOigF,GACxB,MAAMx2C,EAAW7yM,KAAK2oN,UAChB7nN,EAAS+xM,EAASpK,OAAO3nM,OAE/B,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAM4oP,EAAaz2C,EAASpK,OAAO/nM,GAC7B6oP,EAAiBvpP,KAAKwpP,4BAA4BF,GAClDG,EAAkBzpP,KAAKkpP,6BAA6BI,GAErDD,GAAgBC,IAAelgF,EAAMq/B,QAQtC6gD,EAAWx7E,QAAUy7E,EAEjBD,EAAWz7M,OACXy7M,EAAWz7M,KAAKigI,QAAUy7E,KAV9BD,EAAWC,eAAiBA,EAC5BD,EAAWx7E,QAAU27E,EAEjBH,EAAWz7M,OACXy7M,EAAWz7M,KAAKigI,QAAU27E,KAY1C,oBAAoBr2E,EAAUs2E,EAAcjoM,EAAOgnJ,GAC/C,IAAK,IAAI/nM,EAAI,EAAGA,EAAI0yK,EAAStyK,OAAQJ,IAAK,CACtC,MAAM+zC,EAAU2+H,EAAS1yK,GACnB4oP,EAAa70M,EAAQg0J,QAAUA,EAErC,GAAI6gD,GAAc70M,EAAQy3I,OAAQ,CAC9B,MAAMpe,EAAU26B,EAASA,EAAO36B,QAAUr5H,EAAQg0J,OAAO36B,SACrDw7E,IAAeI,GAAgBjoM,IAC/BhN,EAAQy3I,OAAOpe,QAAQrsH,EAAQ,EAAIqsH,GAIvCr5H,EAAQrD,UAAYqD,EAAQrD,SAAStwC,QACrCd,KAAK2oP,oBAAoBl0M,EAAQrD,SAAUs4M,EAAcjoM,EAAOhN,EAAQg0J,SAKpF,wBAAwBr/B,GACpB,IAAIy/E,EAAgBz/E,EAAM/iJ,OAE1B,KAAOwiO,IAAkBA,EAAch2C,UACnCg2C,EAAgBA,EAAcxiO,OAGlC,OAAOwiO,EAGX,sBACI,IAAIc,OAAsFzzO,IAA1DlW,KAAKN,QAAQu5O,eAAehxC,UAAUwhD,gBAClErB,EAAqBpoP,KAAKN,QAAQ+oM,OAAOhoM,OAAOiB,QAAqCwU,IAAhCxU,EAAEumM,UAAUwhD,iBAAgC3oP,OAAS,EAC9G,OAAO6oP,GAA6BvB,EAGxC,6BAA6B3/C,GAGzB,OAD4BA,EAAOR,UAAUwhD,iBADhBzpP,KAAKN,QAAQu5O,eAAehxC,UAAUwhD,iBAEThhD,EAAO36B,S7X/nCnC,E6XkoClC,4BAA4B26B,GACxB,OAAOA,EAAO8gD,gBAAkB9gD,EAAO36B,S7XnoCT,E6XsoClC,WAAWr7J,GACP,MAAM22J,EAAQppK,KAAK4nP,YAAYn1O,EAAEgiC,QAAShiC,EAAEmxK,eAExCxa,GAASA,EAAMspD,kBAAoB1yN,KAAK4pP,yBAA2B5pP,KAAKwiP,mBACxExiP,KAAK4pP,uBAAyB5pP,KAAK6pP,mBAAmBjxN,KAAK54B,MAC3D,GAAWgyC,SAAU,CACjB,UAAehyC,KAAK4pP,0BAKhC,mBAAmBn3O,GACf,MAAM,QAAE/S,EAAS+iP,SAAU1nB,EAAS1yB,WAAYJ,EAAWigD,aAAc9+E,GAAUppK,KAC7Eg0N,EAASh0N,KAAKswO,kBAAkB79N,GAEtC,GAAIzS,KAAK2oN,UAAUruC,IAAIvP,cAAcipD,GAAAA,CACjC,GAAI5qD,GAASA,EAAMspD,iBAAmBtpD,EAAMq/B,QAAUr/B,EAAM/iJ,OAAO4tM,gBAAiB,CAChF,MAAM61B,EAAc1gF,EAAM/iJ,OAAO4tM,gBAAgBD,EAAOhpL,EAAGgpL,EAAO7jL,EAAGi5H,EAAM2kD,UACvE+7B,GAAeA,IAAgB1gF,IAC/BppK,KAAKkoP,aAAe4B,GAEfA,EAAYv3B,MAAMvyN,KAAMyS,MACF2uL,GAAW,GAAI1hM,EAAQq7N,QAAS+uB,EAAYpqP,QAAQq7N,SACxD3uD,SACf2uD,EAAQ5yB,KAAK2hD,GAGjB7hD,EAAUE,KAAK2hD,UAK3B,GAAa93M,SAAU,CACnB,UAAehyC,KAAK4pP,yBAExB5pP,KAAKizO,oBACLjzO,KAAK4pP,uBAAyB,KAItC,WAAWn3O,GACP,MAAMuhN,EAASh0N,KAAKswO,kBAAkB79N,GAChCogM,EAAW7yM,KAAK2oN,UAItB,GAFA3oN,KAAK+pP,iBAAiB/1B,GAElBnhB,EAAS0f,MAAO,CAChB,MAAMy3B,EAAen3C,EAASi0C,wBAAwB9yB,GAClDg2B,GACAn3C,EAASwzC,SAAU,EACnBrmP,KAAK2oN,UAAU4J,MAAMvyN,KAAMyS,IACpBogM,EAASwzC,UAAY2D,IAC5BhqP,KAAK6qI,Q1HxpCG,iB0HypCRgoE,EAASwzC,SAAU,GAIvBrmP,KAAKwiP,kBACLxiP,KAAK6nP,oBAAoB7zB,EAAQvhN,GAIzC,iBAAiBuhN,GACb,MAAM0O,EAAa1iO,KAAK2oN,UAAU+Z,WAElC,IAAK,IAAIhiO,EAAI,EAAGA,EAAIgiO,EAAW5hO,OAAQJ,IAAK,CACxC,MAAM2V,EAAUqsN,EAAWhiO,GAEvB2V,EAAQikK,IAAIvP,cAAcipD,GAC1B39M,EAAQupN,OAAO5L,GAEf39M,EAAQq/L,QAKpB,oBAAoBse,EAAQvhN,EAAGu+N,GAC3B,GAAIhxO,KAAKgnP,eACL,OAGJ,MAAQtnP,SAAWq7N,QAASmE,GAAkBvW,UAAW9V,EAAU8V,WAAW,aAAE2E,GAAgBm1B,SAAU1nB,EAAS1yB,WAAYJ,GAAcjoM,KAE7I,GAAI6yM,EAASi0C,wBAAwB9yB,GAAS,CAC1C,MAAMhgN,EAAQs5M,EAAa7S,mBAAmBuZ,GAC9C,GAAIhgN,IAAUhU,KAAKiqP,qBAAwBjqP,KAAKkqP,kBAAoBlZ,EAAS,CACzE,MAAMnhE,EAASgjC,EAAS8vC,sBAAsB3uO,GACxCm2O,EAAYt6E,EAAOpuK,KAAAA,SAAa2nK,GAClC,OAAOA,EAAMomC,UAAU/8L,MAErB23O,EAAYD,EAAU,IAAM,GAClCC,EAAU38B,eAAiB08B,EAEvBt6E,EAAO/uK,OAAS,IAAMd,KAAK6qI,Q1HtsC1B,c0HssCgDu/G,IAC7ClrB,EAAe9yD,SACf2uD,EAAQ6E,OAAO/vD,EAAQmkD,GAG3B/rB,EAAUE,KAAKt4B,GAEf7vK,KAAKkqP,kBAAmB,GAExBnvB,EAAQrlB,OAGZ11M,KAAKiqP,mBAAqBj2O,OACnBg9N,GAAUhxO,KAAKkqP,mBACtBjiD,EAAUyN,OACVqlB,EAAQrlB,OACR11M,KAAKkqP,kBAAmB,QAErBlqP,KAAKkqP,mBACZjiD,EAAUyN,OACVqlB,EAAQrlB,OACR11M,KAAKiqP,mBAAqB,KAC1BjqP,KAAKkqP,kBAAmB,GAIhC,aAAaxqP,GACT,MAAMmzM,EAAW7yM,KAAK2oN,UACtB3oN,KAAKkjL,WAAWhpJ,SAEhB24K,EAASw3C,iBAETrqP,KAAKizO,kBAAkBvzO,GAG3B,kBAAkBA,GACd,MAAQ+iP,SAAU1nB,EAAS1yB,WAAYJ,GAAcjoM,KAErDA,KAAKkoP,aAAe,KACpBloP,KAAKomP,cAAgB,MAEjBrrB,GAAar7N,GAAWA,EAAQ4qP,iBAChCvvB,EAAQrlB,OAGZ11M,KAAKiqP,mBAAqB,KAC1BjqP,KAAKkqP,kBAAmB,EAEpBjiD,GACAA,EAAUyN,OAIlB,eACI11M,KAAKohP,UAGT,sBACQphP,KAAKuqP,iBACL9lF,cAAczkK,KAAKuqP,gBACnBvqP,KAAKuqP,eAAiB,MAI9B,iBACI,MACM7kE,EAAc,GAAG/7K,OADP3J,KAAKN,QACiB4tN,cAEtC,IAAK,IAAIgX,EAAS,EAAGA,EAAS5+C,EAAY5kL,OAAQwjO,IAAU,CACxD,MAAM3oD,EAAO+J,EAAY4+C,IACH,IAAlB3oD,EAAK6uE,UACLxqP,KAAKyqP,2BAA2B9uE,EAAM2oD,IAKlD,2BAA2B3oD,EAAM2oD,GAC7B,MAAM77B,EAASzoM,KAAKN,QAAQ+oM,OACtBy8C,EAAez8C,EAAO3nM,OACtB4pP,EAAmB,IAAI3nD,GAC7B,IAEIqrC,EAFAh7K,EAAQ,GACRu3L,GAAW,EAGf,IAAK,IAAI58B,EAAW,EAAGA,EAAWm3B,EAAcn3B,IAAY,CACxD,MAAMrsN,EAAI+mM,EAAOslB,GACX68B,EAASlpP,EAAE4rN,eAAiB3xC,EAAKlxK,OAAU/I,EAAE4rN,cAA2B,IAAXgX,EAC7DllN,EAAO1d,EAAE0d,KACT4uN,EAAa5uN,EAAKte,OAClB83B,EAAOl3B,EAAEmsO,eAAiB+c,EAGhC,GAFAD,EAAW/xN,GAAQ+xN,EAEf/xN,GAAQo1M,EAAa,EAAG,CACxBI,EAAWzM,GAAWhmD,EAAMutC,GAASxnN,EAAEmsO,cAAezuN,EAAK,KAE3D,MAAMkvN,EAAQF,EAAW1M,GAAexY,GAExC,IAAK,IAAI2hC,EAAS,EAAGA,EAAS7c,EAAY6c,IAAU,CAChD,MAAMC,EAAU1rO,EAAKyrO,GACfliD,EAAW2lC,EAAM5sO,EAAEmsO,cAAeid,EAAS9qP,KAAKgnM,aAAa9E,OAE/DksC,GAAasc,EAAiBzpO,IAAI0nL,KAClCv1I,EAAM/vD,KAAK,CAAEslM,EAAUmiD,IAElB1c,GACDsc,EAAiB7rP,IAAI8pM,GAAU,MAOnD,GAAIv1I,EAAMtyD,OAAS,EAAG,CACdstO,IACAh7K,EA0VhB,SAAqB23L,EAAU1gO,EAAW8tL,IACtC,MAAMU,EAZV,SAAmBA,EAAOxuL,EAAW8tL,IACjC,IAAK,IAAIz3M,EAAI,EAAGI,EAAS+3M,EAAM/3M,OAAQJ,EAAII,EAAQJ,IAC/C,GAAI2pB,EAASwuL,EAAMn4M,GAAIm4M,EAAMn4M,EAAI,IAAM,EAAG,CACtCm4M,EAAMvuL,KAAKD,GACX,MAIR,OAAOwuL,EARX,CAY4BkyC,EAAU1gO,GAC5BvpB,EAAS+3M,EAAM/3M,OACf4G,EAAS5G,EAAS,EAAI,CAAE+3M,EAAM,IAAO,GAE3C,IAAK,IAAIn4M,EAAI,EAAGA,EAAII,EAAQJ,IACiB,IAArC2pB,EAASwuL,EAAMn4M,GAAI,GAAKgH,KACxBA,EAAOrE,KAAKw1M,EAAMn4M,IAI1B,OAAOgH,EAXX,CA1VoC0rD,GAAAA,SAAgBn0D,EAAGC,GACnC,OAAOi5M,GAAal5M,EAAE,GAAIC,EAAE,QAIpC,MAAMwI,EAmWlB,SAAmBulM,GACf,MAAM+9C,EAAW/9C,EAAKnsM,OAChB4G,EAAS,GAEf,IAAK,IAAIujP,EAAQ,EAAGA,EAAQD,EAAUC,IAAS,CAC3C,MAAM9hC,EAAMlc,EAAKg+C,GACXC,EAAW/hC,EAAIroN,OAErB,IAAK,IAAIqqP,EAAQ,EAAGA,EAAQD,EAAUC,IAClCzjP,EAAOyjP,GAASzjP,EAAOyjP,IAAU,GACjCzjP,EAAOyjP,GAAO9nP,KAAK8lN,EAAIgiC,IAI/B,OAAOzjP,EAdX,CAnWqC0rD,GACzBuoH,EAAKo9B,WAAarxM,EAAO,QAClBijP,IACPhvE,EAAKo9B,WAAa,IAI1B,YAAYtQ,GACR,MAAMihB,EAAc,GAAarzM,QAAQqzM,YAAYjhB,GACrD,IAAI/gM,GAAS,EAEb,IAAK,IAAIhH,EAAI,EAAGA,EAAIgpN,EAAY5oN,OAAQJ,IAAK,CACzC,IAAIomK,EAAQ4iD,EAAYhpN,GAOxB,GANIomK,IAAUR,GACVQ,EAAQ,QAERA,GAAgB,SAGf,GAAQ2hC,EAAO3hC,IAAS,CACzBp/J,GAAS,EACT,OAIR,OAAOA,EAGX,uBACI,MAAMhI,EAAUM,KAAKN,QACrB,IAAI0rP,GAEwB,IAAxB1rP,EAAQ8vJ,cACR9vJ,EAAQ8vJ,aAAc,EACtB47F,GAAmB,GAGvBprP,KAAKohP,UAEDgK,IACA1rP,EAAQ8vJ,aAAc,GAI9B,iBAAiB44E,EAAa4K,GAC1B,MAAQrqB,UAAW9V,EAAUxK,WAAYJ,GAAcjoM,KACjDywN,GAAiB5d,EAAS26B,WAAa36B,EAASpK,QAAQ2/B,GAC9D,IAAIh1K,EAGAA,EADAnf,GAAQw8K,EAAcntN,KAAM,CAAE2oN,G1H94C5B,QACC,W0H84CKpZ,EAAS6vC,WAAAA,SAAmBt5E,GAChC,OAAOA,EAAMq/B,OAAOz0L,QAAUo0N,GAAeh/D,EAAMp1J,QAAUg/N,KAGzDngC,EAASw4C,oBAAoBjjB,GAGrCpoO,KAAKqoP,uBAAyB53B,EAAcrkD,SAAWh5G,EAIvDpzD,KAAKwoP,wBAFSp1L,EAAMtyD,OAASsyD,EAAM,GAAKA,EADjBy/I,EAASpK,OAAO3nM,OAAS,EAGIsyD,GAEpD60I,EAAUE,KAAK/0I,GAIvB,yBACI,OAAOpzD,KAAK2oN,UAAU+Z,WAAW5hO,QAAWd,KAAKyiP,UAAYziP,KAAKwiP,kBAAqBxiP,KAAKojM,iBAAiB,C1H73C7F,gBACA,kB0H+3CpB,yBACI,GAAapjM,KAAKy0C,QAAS,CACvB,UAAez0C,KAAKkjL,aAGpBljL,KAAKkmP,0BACL,GAAWlmP,KAAKy0C,QAAS,CACrB,UAAez0C,KAAKkjL,aAKhC,aAAaxjL,EAASs5O,GAClBgL,GAAmBhkP,KAAK4gP,iBAAkBlhP,GAC1CM,KAAK4gP,iBAAmBx/C,GAAWphM,KAAK4gP,iBAAkBlhP,GAC1DM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAK4gP,kBAE/B5H,IACAh5O,KAAK6gP,OAAS7H,EACdh5O,KAAKgnM,aAAagyC,MAAQA,GAE9Bh5O,KAAK8gP,WAAW9gP,KAAKN,QAASM,KAAK6gP,QAEnC7gP,KAAKmmP,wBAGT,WAAWzmP,EAASs5O,GAChBh5O,KAAKsrP,aAAa5rP,EAASs5O,GAC3Bh5O,KAAKihP,iBACLjhP,KAAKwxO,SACLxxO,KAAKurP,yBAGT,aAAazgE,GACT9qL,KAAKgnM,aAAalc,IAAMsX,QAAQtX,GAC5B9qL,KAAK48L,SAAiC,QAAtB58L,KAAK48L,QAAQt5L,MAC7BtD,KAAK8iP,kBAIb,eAAe5gD,GACXliM,KAAKgnM,aAAa9E,KAAOA,EAG7B,sBACIliM,KAAKgiP,uBAGT,UACIhiP,KAAKgjF,YAAa,EAElB,GAAahjF,KAAKy0C,QAAS,CACvB,YAAiBz0C,KAAK6lP,cACtB,CAAEz5B,IAAcpsN,KAAKq1O,mBACrB,UAAer1O,KAAKkjL,WACpB,WAAgBljL,KAAK8lP,qBAGrB9lP,KAAK6iD,YACL7iD,KAAK6iD,UAAU1J,iBACRn5C,KAAK6iD,WAGZ7iD,KAAK4pP,wBACL,GAAa53M,SAAU,CACnB,UAAehyC,KAAK4pP,yBAI5B5pP,KAAKojP,eAELpjP,KAAK8iP,kBAEL9iP,KAAKwrP,sBAGT,kBACI,MAAM5uD,EAAU58L,KAAK48L,QACjBA,IACAA,EAAQxb,OAAO,aAAcphL,KAAKgjP,2BAClCpmD,EAAQxb,OAAO,aAAcphL,KAAKijP,2BAClCrmD,EAAQzjJ,UAERn5C,KAAK48L,QAAU,MAIvB,qBACI,MAAM+oD,EAAa3lP,KAAK6hP,YAExB,GAAI8D,EACA,KAAOA,EAAW7kP,OAAS,GACvB6kP,EAAW51M,QAAQoJ,UAK/B,eACI,MAAM+pM,EAAQljP,KAAKkiP,OAEfgB,IACAA,EAAM/pM,UACNn5C,KAAKkiP,OAAS,MAGlBliP,KAAKizO,oBAELjzO,KAAK8hP,qBAED9hP,KAAKyiP,UACLziP,KAAKyiP,SAAStpM,UAGdn5C,KAAKqoM,YACLroM,KAAKqoM,WAAWlvJ,UAGhBn5C,KAAKmkP,iBACLnkP,KAAKmkP,eAAehrM,iBACbn5C,KAAKmkP,gBAGZnkP,KAAKikP,YACLjkP,KAAKikP,UAAU9qM,iBACRn5C,KAAKikP,WAGZjkP,KAAKokP,kBACLpkP,KAAKokP,gBAAgBjrM,iBACdn5C,KAAKokP,kBAiBxB,SAAS/B,GAAoBxyE,EAAQplK,GACjC,GAAIolK,EACA,IAAK,IAAI3iI,EAAM,EAAGA,EAAM2iI,EAAO/uK,OAAQosC,IACnC,GAAI2iI,EAAO3iI,GAAKy7J,WAAal+L,EACzB,MAAO,CAAEolK,EAAO3iI,IAqEhC,SAASo4M,GAA4BrM,UAC1BA,EAAewS,WACfxS,EAAeyS,cACfzS,EAAe0S,mBACf1S,EAAeprM,YACforM,EAAe2S,oBACf3S,EAAe4S,WACf5S,EAAe6S,aACf7S,EAAe7a,YACf6a,EAAe8S,oBACf9S,EAAe+S,eACf/S,EAAegT,mBACfhT,EAAeiT,cACfjT,EAAekT,mBACflT,EAAemT,YACfnT,EAAeoT,eACfpT,EAAepa,cACfoa,EAAeqT,sBACfrT,EAAesT,iBACftT,EAAeuT,iBACfvT,EAAewT,iBACfxT,EAAeyT,iBACfzT,EAAe0T,UAI1B,SAAS,GAAW15C,GAChB,MAAMo+B,EAAS,GAEf,IAAK,IAAI3wO,EAAI,EAAGA,EAAIuyM,EAAKnyM,OAAQJ,IAAK,CAClC,MAAMi7K,EAAOs3B,EAAKvyM,GACZkuN,EAAWjzC,EAAKj8K,QAAQ+K,KAC1BmkN,IACAyiB,EAAOziB,GAAYjzC,EAAKt9I,SAIhC,OAAOgzM,EA6CX,MAAMub,GAAc,CAAE,OAAQ,cAE9B,SAAS5I,GAAmBrhB,EAAiBjjO,GACzC,IAAK,IAAIonK,KAASpnK,EACd,IAAKu0C,GAAQ6yH,EAAO8lF,KAAgBltP,EAAQsZ,eAAe8tJ,GAAQ,CAC/D,MAAM+lF,EAAantP,EAAQonK,GACrBgmF,EAAgBnqB,EAAgB77D,GACtC,GAAI,GAAQgmF,GAAgB,CACxB,MAAMC,EAA2B,OAAfF,EACbE,IAAc,GAAQF,WAChBlqB,EAAgB77D,GACnBimF,UACOrtP,EAAQonK,IAEZgmF,GAAiB,GAASD,IAC7B,GAASC,IACT9I,GAAmB8I,EAAeD,KAQ1D,SAASlJ,GAAkB3gB,GACvB,IAAK,IAAI91L,EAAM,EAAGA,EAAM81L,EAAMliO,OAAQosC,IAClC81L,EAAM91L,GAAK+zL,eAInBr9B,GAAkB,GAAO,CACrBi/C,SAAU,GACVjB,UAAW,GACXnf,OAAQ,CACJr2D,SAAS,EACT4jC,OAAQ,IAEZsd,aAAc,GACd2rB,eAAgB,CACZ31O,KAAMyoN,GACN3sM,KAAM,GACN6oL,UAAW,CACP77B,SAAS,GAEb4jC,OAAQ,GACR4tB,eAAgB,CACZxxD,SAAS,IAGjBq8B,OAAQ,GACRyxC,aAAc,KACdnf,QAAS,CACL3uD,SAAS,GAEb5c,aAAa,EACb+pD,UAAW,GACX1G,SAAU,GACVn6F,MAAO,GACPwkH,MAAO,GACPE,MAAO,GACP4F,MAAO,CAAE,IACT3gC,UAAU,EACV6hD,UAAU,IAGC,IAAA,GAAA,GCjxDA,GA/Bf,cAA4B,GACxB,YAAYlwB,EAAQxe,GAChB,MACM/J,EADOzrM,KAAK6yM,SAASya,aACL5tN,QAAQ+rM,SACxB/vB,EAAQ+vB,EAAW,CACrBmoB,WAAY,OACZnoB,SAAU,UACV,CACAmoB,WAAY,SACZnoB,SAAU,UAGd,IAAIriC,EAQJ,OALIA,EADAqiC,EACQ,IAAI,GAAMzrM,KAAK6yM,SAASv4B,IAAI3I,GAAI6jC,EAAK9+J,SAASvG,GAE9C,IAAI,GAAMqlK,EAAK9+J,SAAS1L,GAnBzB,GAsBJ,CACHo+H,MAAOA,EACPsS,MAAOA,GAIf,eAAetS,EAAOosC,GAClB,OAAOx1M,KAAKk3O,YAAY,GAAI1hC,KC1BpC,MAEMw3C,GAAe,CAAElhC,G5HwBR,U4HtBf,SAASpW,GAAKtkK,GACV,MAAM+M,EAAQ,GACd,IAAK,IAAIjR,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IAAO,CAC5C,MAAM6F,EAAQ3B,EAASlE,GACvBiR,EAAMjR,GAAO6F,EAAMtG,MAAM6zJ,QACzBvtJ,EAAMtG,MAAM6zJ,QAAU,OAG1B,OAAOniJ,EAGX,SAAS,GAAK/M,EAAU+M,GACpB,IAAK,IAAIjR,EAAM,EAAGA,EAAMkE,EAAStwC,OAAQosC,IACrCkE,EAASlE,GAAKT,MAAM6zJ,QAAUniJ,EAAMjR,GAI5C,SAAS+/M,GAAW5hP,GAChB,OAAO6vB,GAAS7vB,GAAS,CAAEA,GAAUA,EA6JzCu4L,GA1JA,cAAwB,GACpB,iBAAiBnvJ,GACbu8C,GAASv8C,EAAS,eAGtB,aAAaA,GACTwS,MAAM05L,aAAalsM,GAEnBz0C,KAAKktP,cAAgB3jP,KAAK2R,MAAM,GAAYu5B,GAASrE,OAGzD,UACI,MAAMqE,EAAUz0C,KAAKy0C,QACf0J,EAAQu3J,GAAKjhK,EAAQisI,YAE3B1gL,KAAKktP,cAAgB3jP,KAAK2R,MAAM,GAAYu5B,GAASrE,OAErD,GAAKqE,EAAQisI,WAAYviI,GAEzB8I,MAAMu8H,UAGV,gBACI,MAAMo7D,EAAe5+O,KAAKN,QACpBytP,EAAQntP,KAAK4iP,eACbwK,EAAe13C,GAAKy3C,EAAMzsE,YAE1BuzB,EAAQjiK,SAASI,cAAc,QACrC6hK,EAAM/rI,UAAY,SAElBilL,EAAMllL,YAAYgsI,GAElB,MAAMv0M,EAAU0hM,GAAW,CACvBhxJ,MAAOpwC,KAAKqtP,WACZxjF,OAAQ,GAAYsjF,GAAOtjF,OAC3Bra,YAAaovF,EAAapvF,aAC3BovF,EAAagD,UAAW,CACvB0L,QAAQ,EACR5xE,OAAO,IAgBX,OAbA,GAAYyxE,EAAO,CACf/8M,MAAO1wC,EAAQ0wC,MACfy5H,OAAQnqK,EAAQmqK,SAGpBsjF,EAAMlkL,YAAYgrI,GAElB,GAAKk5C,EAAMzsE,WAAY0sE,GAEnBptP,KAAK48L,SACL58L,KAAK48L,QAAQ9Q,SAGVpsL,EAGX,eACI,IAAKM,KAAKmtP,MAAO,CACb,MAAMA,EAAQntP,KAAKmtP,MAAQn7M,SAASI,cAAc,QAClDpyC,KAAKy0C,QAAQwzB,YAAYklL,GAE7B,OAAOntP,KAAKmtP,MAGhB,gBAAgBzH,GACZ,MAAM7yC,EAAW5rJ,MAAMu+L,gBAAgBE,GAGvC,OAFA1lP,KAAKqtP,WAAartP,KAAKktP,eAAiBltP,KAAKutP,gBAAgB16C,GAEtDA,EAGX,gBAAgBA,GACZ,MAAMnzM,EAAUM,KAAKN,QACfupM,EAASzH,GAAW9hM,EAAQkiP,UAAU34C,QACtCq3B,EAASztB,EAASytB,OAClB6sB,EAAQntP,KAAK4iP,eACnB,IAAI1mH,EAAQ,EAGZ,IAAK,IAAIx7H,EAAI,EAAGA,EAAI4/N,EAAOx/N,OAAQJ,IAAK,CACpC,MAAM8sP,EAAeltB,EAAO5/N,GACtBouO,GAAe0e,EAAa9tP,QAAQ+oM,QAAU,IAAI,GACxD,IAAKqmC,EACD,SAGJ,GAAIA,EAAYxrO,OAASwoN,GACrB,OAjHS,IAoHb,G5H1FG,W4H0FCgjB,EAAYxrO,KACZ,OApHY,IAuHhB,GAAIwrO,EAAYxrO,OAAS2oN,GACrB,OAAO,GAAYkhC,GAAOtjF,OAG9B,MAAMyjD,EAAekgC,EAAalgC,aAClC,GAAIA,EAAc,CACd,MAAMmgC,EAAcngC,EAAaF,oBAC3BogC,EAAa9tP,QAAQ4uN,WAAar6K,GAAQ66L,EAAYxrO,KAAM,CAAEyoN,G5H/E5D,mB4H+EyFyhC,EAAa7/B,cAAc7sN,OAAS,GAErIo7H,EAAQ3yH,KAAKqS,IAAIsgH,EAAOuxH,IAIhC,IAAI71O,EAAOskH,EAAQx8H,EAAQguP,WAK3B,OAJI91O,EAAO,IACPA,GAAQqxL,EAAOt3J,KAAOs3J,EAAOr3J,OAG1Bh6B,EAGX,qBAAqBlY,GACjB,OAAO,IAAI,GAAcM,KAAK2oN,UAAWjpN,GAG7C,wBAAwByhN,GACpB,IAAIzhN,EAAUutP,GAAW9rC,GA6BzB,OA1BIzhN,EADA,GAAQA,GACE,CAAEu5O,eAAgB,CAAE75N,KAAM1f,IAE1B0hM,GAAW,GAAI1hM,GAGxBA,EAAQ+oM,SACT/oM,EAAQ+oM,OAAS,CAAE,CAAErpL,KAAM6tO,GAAWvtP,EAAQ0f,SAGlDgiL,GAAW1hM,EAAS,CAChBu5O,eAAgB,CACZ31O,KAAM5D,EAAQ4D,SAIlB2wC,GAAQv0C,EAAQ+oM,OAAO,GAAGnlM,KAAM0pP,KAChC/4M,GAAQv0C,EAAQu5O,eAAe31O,KAAM0pP,OACrCttP,EAAU0hM,GAAW,GAAI,CACrBksB,aAAc,CACV+R,UAAW,CACPjzD,SAAS,KAGlB1sK,IAGAA,IAIc,CACzBkiP,UAAW,CACP34C,OAAQ,GAEZ87C,aAAc,CACV34E,SAAS,EACTsnC,eAAgB,CACZtnC,SAAS,GAEbmtC,UAAW,CACPmH,aAAa,IAGrBu4B,eAAgB,CACZ31O,KAAM,OACN86N,KAAM,CACFvwL,KAAM,CACFuC,MAAO,KAGfq7M,IAAK,CACDjqO,OAAO,GAEXqiK,QAAS,EACTzzI,MAAO,GACP24J,QAAS,CACL/N,SAAU,MAEdiN,UAAW,CACP77B,SAAS,GAEbi9B,OAAQ,CACJj5J,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,IAGjB2uD,QAAS,CACL3uD,SAAS,EACTgrE,QAAQ,GAEZ9pB,aAAc,CACV+R,UAAW,CACPjzD,SAAS,EACT2uD,QAAS,CACL3uD,SAAS,KAIrBq2D,OAAQ,CACJr2D,SAAS,GAEb5c,aAAa,EAEbk+F,WAAY,EAEZ1qB,MAAO,CAAE,CAAEp3D,MAAM,MClNN,IAAA,GA5Bf,cAA+B,EAAK67B,UAEhC,QACIznM,KAAK2tP,gBAAkBl8O,WAAW,GAAczR,KAAKy0C,QAAS,WAAWq5H,SAG7E,KAAKhnD,GACD,GAAc9mH,KAAKy0C,QAAS,CACxBq5H,QAASp1J,OAAOwvB,GAAiBloC,KAAK2tP,gBAAiB,EAAG7mI,MAIlE,QACI7/D,MAAMs1E,QACN,GAAcv8H,KAAKy0C,QAAS,CACxB6rJ,QAAS,OACTxyB,QAASp1J,OAAO1Y,KAAK2tP,mBAI7B,SACI1mM,MAAMs1E,QACN,GAAcv8H,KAAKy0C,QAAS,CACxBq5H,QAASp1J,OAAO1Y,KAAK2tP,qBCvBjC,SAAS,GAAUx/K,EAAW1hC,GAC1B,MAAMmhN,EAAM57M,SAASI,cAAc,OAMnC,OALAw7M,EAAIz/K,UAAYA,EACZ1hC,IACAmhN,EAAInhN,MAAM2xC,QAAU3xC,GAGjBmhN,EAGX,MAAM,WAAsB,GACxB,YAAYxzK,EAAW4sH,EAActnM,GACjCunD,QAEAjnD,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASA,GAC5CM,KAAKo6E,UAAYA,EACjBp6E,KAAKgnM,aAAeA,EAEpB,MAAMnjB,EAAU,GAAczpG,EAAW,CAAE,cAAe,eAC1Dp6E,KAAK6tP,aAAe,CAChB5+H,IAAK40D,EAAQ/B,WACbnwI,KAAMkyI,EAAQhC,aAGlB7hL,KAAKw0O,iBACLp6J,EAAUnS,YAAYjoE,KAAKy0C,SAG/B,iBACI,MAAMA,EAAUz0C,KAAKy0C,QAAU,GAAU,mBAAoB,2DACvDsmL,EAAU/6N,KAAK+6N,QAAU,GAAU,6BACnC+yB,EAAS9tP,KAAK8tP,OAAS,GAAU,YAEvC/yB,EAAQ7yJ,UAAY,SAEpBzzB,EAAQwzB,YAAY8yJ,GACpBtmL,EAAQwzB,YAAY6lL,GAGxB,KAAK9kP,EAAMC,EAAIgjK,GACX,MAAM,QAAEx3H,EAAO,QAAE/0C,EAAO,OAAEouP,EAAM,QAAE/yB,GAAY/6N,KACxC+zD,EAAS,GAAOskJ,GAAOrvM,GAAQqvM,GAAOpvM,EAAKD,GAAQ,GACnD+kP,EAA6B,GAAf9hF,EAAK77H,QACnB49M,EAAS/hF,EAAKv1H,SAAS1L,EAAI+iN,EAI3Bl2M,GAHSo0H,EAAKv1H,SAAS1L,EACHgjN,IACZtuP,EAAQkc,IAAMlc,EAAQ8J,KAE9BuL,EAASg/C,EAASr0D,EAAQ8J,IAChC,IAAIw6E,EAAOhkF,KAAKgnM,aAAa9E,KAAK/3L,OAAOzK,EAAQyK,OAAQnB,EAAMC,GAC/D,MAAMq+B,EAAWk7J,GAAY9iM,GAE7BM,KAAKiuP,mBAEAjuP,KAAKkuP,WACN,GAAcz5M,EAAS,CACnB05M,WAAY,SACZ7tD,QAAS,UAEbtgM,KAAKkuP,UAAW,GAGhB5mN,IACA08C,EAAO18C,EAAS,CACZt+B,KAAMA,EACNC,GAAIA,KAIZ8xN,EAAQ7yJ,UAAY8b,EACpB,GAAc+2I,EAAS,CACnBppL,KAAMs6H,EAAKv1H,SAAS1L,EAAI+vL,EAAQpgD,YAAc,EAC9C1rD,IAAKg9C,EAAKyF,KAGd,MAAM08E,EAAe,GAAcrzB,EAAS,CAAE,YAAa,iBAAkB,WAE7E,GAAc+yB,EAAQ,CAClB19M,MAAO29M,EACPp8M,KAAMq8M,EAASj5O,EAAS8iC,EACxBo3E,IAAKg9C,EAAKyF,GAAK08E,EAAaC,UAAYD,EAAaE,eAAiBF,EAAavkF,OAAS,IAGhG,GAAcp1H,EAAS,CACnB05M,WAAY,YAIpB,mBACQnuP,KAAKuuP,cACL7zO,aAAa1a,KAAKuuP,cAGlBvuP,KAAKwuP,gBACLxuP,KAAKwuP,eAAet0N,SAI5B,OACIl6B,KAAKiuP,mBAELjuP,KAAKuuP,aAAezzO,WAAW,KAC3B9a,KAAKkuP,UAAW,EAChBluP,KAAKwuP,eAAiB,IAAI,GAAiBxuP,KAAKy0C,SAChDz0C,KAAKwuP,eAAenL,QACpBrjP,KAAKwuP,eAAelL,QACrBtjP,KAAKN,QAAQ+uP,WAGpB,UACIzuP,KAAKiuP,mBACDjuP,KAAKo6E,WACLp6E,KAAKo6E,UAAUnR,YAAYjpE,KAAKy0C,gBAE7Bz0C,KAAKo6E,iBACLp6E,KAAKgnM,oBACLhnM,KAAKy0C,eACLz0C,KAAK+6N,eACL/6N,KAAK8tP,QAIpBlqD,GAAkB,GAAe,CAC7Bz5L,OAAQ,gBACRskP,UAAW,MAGA,IAAA,GAAA,GCzHf,MAAM,WAAkB,GACpB,YAAY3sD,GACR76I,QAEAjnD,KAAK8hM,MAAQA,EACb,MAAMpiM,EAAUM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASoiM,EAAMpiM,QAAQu1C,WACpE2wM,EAASlmP,EAAQkmP,OACnBA,IACAA,EAAO58O,KAAOhJ,KAAK0hM,UAAUkkD,EAAO58O,MACpC48O,EAAO38O,GAAKjJ,KAAK0hM,UAAUkkD,EAAO38O,KAGjC,GAAQvJ,EAAQgvP,KAAKtiF,WACtB1sK,EAAQgvP,KAAKtiF,QAAU1sK,EAAQ0sK,SAGnCpsK,KAAK2uP,cAAgB,IAAI,GAAiB3uP,KAAM,CAC5C,KAAQ,QACR,QAAY,WACZ,KAAQ,QACR,QAAY,aAEhB8hM,EAAM96B,YAAYhnK,KAAK2uP,eAG3B,UAAUtjP,GACN,OAAOq2L,GAAU1hM,KAAK8hM,MAAMkF,aAAa9E,KAAM72L,GAGnD,QACQrL,KAAK00O,YACL10O,KAAK00O,UAAUv7L,UACfn5C,KAAK00O,UAAY,MAGjB10O,KAAK0uP,OACL1uP,KAAK0uP,KAAKv1M,UACVn5C,KAAK0uP,KAAO,MAIpB,UACQ1uP,KAAK8hM,QACL9hM,KAAK8hM,MAAM/6B,eAAe/mK,KAAK2uP,sBACxB3uP,KAAK8hM,OAGhB9hM,KAAK++F,QAGT,SACI/+F,KAAK4uP,cACL5uP,KAAK6uP,gBAGT,gBACI,MAAM,MAAE/sD,EAAK,QAAEpiM,GAAYM,KACrB27K,EAAO37K,KAAK8uP,YACZ,IAAEtlP,EAAG,IAAEoS,GAAQ+/J,EAAKozE,gBACpB,KAAE/lP,EAAI,GAAEC,EAAE,WAAEmsO,GAAe11O,EAAQkmP,OACnCoJ,GAgZVC,GAAahuP,UAhZe06K,EAiZrB,IAAIszE,IA/YwB,IAA3BtzE,EAAKyxC,oBAITptN,KAAK++F,QAGLiwJ,EAAU10E,IAAMqB,EAAKrB,IAErBt6K,KAAK00O,UAAY,IAAI,GAAU5yC,EAAOktD,EAAW,CAC7CxlP,IAAKA,EACLoS,IAAKA,EACL5S,KAAMA,GAAQQ,EACdP,GAAIA,GAAM2S,EACVw5N,WAAY,GAAeA,EAAY,CAAE4B,KAAM,SAC/C5qE,QAAS1sK,EAAQ0sK,SAClB,IAAI,GAAiBpsK,KAAM,CAC1BkvP,YAAa,eACbtJ,OAAQ,UACRuJ,UAAW,gBAGXzvP,EAAQgvP,KAAKtiF,UACbpsK,KAAK0uP,KAAO,IAAI,GAAc5sD,EAAMrtJ,QAASqtJ,EAAMkF,aAAc,CAC7Dx9L,IAAKA,EACLoS,IAAKA,EACL0rB,SAAUk7J,GAAY9iM,EAAQgvP,MAC9BvkP,OAAQzK,EAAQgvP,KAAKvkP,WAKjC,WACI,MACMwxK,EADW37K,KAAK8hM,MAAM0jD,iBAAgB,GACtB1Z,kBAAgC,YAEhD,IAAEtiO,EAAG,IAAEoS,GAAQ+/J,EAAKozE,eAEpBnJ,EAAS5lP,KAAKN,QAAQkmP,QAAU,GACtC,IAAI58O,EAAO48O,EAAO58O,MAAQQ,EACtBR,EAAOQ,IACPR,EAAOQ,GAGX,IAAIP,EAAK28O,EAAO38O,IAAM2S,EAClB3S,EAAK2S,IACL3S,EAAK2S,GAGT5b,KAAKN,QAAQkmP,OAASxkD,GAAW,GAAIwkD,EAAQ,CACzC58O,KAAMA,EACNC,GAAIA,IAGRjJ,KAAKovP,aAGT,YAAYC,GACR,MAAMx8C,EAAW7yM,KAAK8hM,MAAM6mB,UAExB9V,GACAA,EAAS2+B,OAAO,GAAK3+B,EAASmwB,OAAQqsB,GAI9C,eACI,MAAMvtD,EAAQ9hM,KAAK8hM,MACb+Q,EAAW/Q,EAAM6mB,UACjB2mC,EAAaz8C,EAASmwB,MAAM9+N,MAAM,GAAI,GAG5C2uM,EAAS26B,UAAY1rC,EAAMpiM,QAAQ+oM,OACnCoK,EAASnzM,QAAQ4tN,aAAexrB,EAAMpiM,QAAQ4tN,aAC9Cza,EAAS08C,yBAET18C,EAAS2+B,OAAO8d,GAGpB,MAAM78O,GACF,MAAM,MAAEqvL,EAAK,UAAE4yC,GAAc10O,KACvBg0N,EAASlyB,EAAMwuC,kBAAkB79N,EAAEmxK,eACnC4rE,EAAgBxvP,KAAK8uP,WACrBW,EAAYD,EAAcT,eAC1BW,EAAcF,EAAcx8C,KAAK14B,IAAIvP,cAAcipD,GAEnD31L,EAAQ5rB,EAAE0lN,WADHr2B,EAAM6mB,UAAU2E,aACG5tN,QAAQ+K,MAClCm7O,EAAS5lP,KAAKN,QAAQkmP,OAC5B,IAAIzgF,EAEJ,IAAK9mI,GAASqxN,IAAgBhb,EAC1B,OAIAvvE,EADAygF,EAAO58O,MAAQ48O,EAAO38O,GACXovM,GAAOutC,EAAO38O,IAAMovM,GAAOutC,EAAO58O,MAElCqvM,GAAOq8B,EAAUh1O,QAAQuJ,IAAMovM,GAAOq8B,EAAUh1O,QAAQsJ,MAGvE,MAAMA,EAAO,GAAO,GAChBqvM,GAAOh6K,EAAM70B,KACbimP,EAAUjmP,IAAK6uM,GAAOo3C,EAAU7zO,KAAOupJ,IAGrCl8J,EAAK,GAAO,GACdovM,GAAOrvM,GAAQm8J,EACfkzC,GAAOo3C,EAAUjmP,KAAO27J,EAAUsqF,EAAU7zO,MAGhD5b,KAAKN,QAAQkmP,OAAS,CAAE58O,KAAMA,EAAMC,GAAIA,GAEpCjJ,KAAKN,QAAQiwP,WACb3vP,KAAKovP,aACLpvP,KAAK4vP,gBAGTlb,EAAU71O,IAAImK,EAAMC,GAEpBjJ,KAAK6vP,SAAS7mP,EAAMC,GAGxB,WACIjJ,KAAKovP,aACLpvP,KAAKS,SACLT,KAAK4vP,eAED5vP,KAAK0uP,MACL1uP,KAAK0uP,KAAKh5C,OAIlB,gBACI,MAAQg/B,WAAah1O,SAAS,KAAEsJ,EAAI,GAAEC,IAAQvJ,SAAS,OAAEkmP,IAAa5lP,KAEtE4lP,EAAO58O,KAAOA,EACd48O,EAAO38O,GAAKA,EAGhB,aACI,MAAQvJ,SAAS,OAAEkmP,EAAS,IAAK,MAAE9jD,GAAU9hM,KACvC8gO,EAAUh/B,EAAMpiM,QAAQ4tN,cACxB,KAAEtkN,EAAI,GAAEC,GAAO28O,EAErB,IAAK,IAAI14M,EAAM,EAAGA,EAAM4zL,EAAQhgO,OAAQosC,IAAO,CAC3C,MAAMyuI,EAAOmlD,EAAQ5zL,GCxNV,eDyNPyuI,EAAKq3B,OACLr3B,EAAKnyK,IAAMR,EACX2yK,EAAK//J,IAAM3S,IAKvB,SACI,MAAM,MAAE64L,EAAOpiM,SAAS,OAAEkmP,IAAa5lP,KAEvC,IAAK8hM,EAAMsB,iBAAiB,CAAE,oBAC1B,OAGJ,MAAM0rD,EAAW9uP,KAAK8uP,WAChBr7O,EAAO,CACTzK,KAAM48O,EAAO58O,KACbC,GAAI28O,EAAO38O,IAGf,GAA8B,aAA1B6lP,EAASpvP,QAAQ4D,KAAqB,CACtC,MAAM8+M,EAAc,IAAI,GAAiBhhB,GAAW,CAChDoX,SAAU,OACX1W,EAAMpiM,QAAQ4tN,aAAa,GAAI,CAC9BvU,WAAY,CAAE6sC,EAAO58O,KAAM48O,EAAO38O,MAClC64L,EAAMkF,cAActnM,QAExB+T,EAAKzK,KAAOwuM,GAAY4K,EAAY54M,KAAM44M,EAAY1J,aAAc0J,EAAY5J,UAChF/kM,EAAKxK,GAAKuuM,GAAY4K,EAAYxmM,IAAKwmM,EAAY1J,aAAc0J,EAAY5J,UAGjFx4M,KAAK8hM,MAAMj3D,QAAQ,kBAAmBp3H,GAG1C,MAAMhB,GACF,MAAQqvL,OAAS6mB,WAAa2E,aAAc3xC,IAAQ,UAAE+4D,EAAWh1O,SAAS,OAAEkmP,EAAM,SAAE+J,IAAe3vP,KAC7F8uP,EAAW9uP,KAAK8uP,WACtB,IAAIx+K,EAAQ79D,EAAE69D,MAEd,IAAKokK,EACD,OAGJ,MAAMob,EAAShB,EAASt0C,cAAck6B,EAAUh1O,QAAQsJ,MAClD+mP,EAAOjB,EAASt0C,cAAck6B,EAAUh1O,QAAQuJ,IAEtDwJ,EAAEmxK,cAAcjjI,iBAEZp3C,KAAK+mC,IAAIggC,GAAS,IAClBA,GAlQc,GAqQdy/K,EAAOD,EAAS,GAChBpb,EAAUp2O,OAAOgyE,GACjBtwE,KAAKgwP,kBAELr0E,EAAKj8K,QAAQ8J,IAAMo8O,EAAO58O,KAC1B48O,EAAO58O,KAAO2yK,EAAKumC,YAAYzvM,EAAE69D,OAAO9mE,KAGxCmmP,IACA3vP,KAAKovP,aACLpvP,KAAK4vP,gBAGTlb,EAAU71O,IAAI+mP,EAAO58O,KAAM48O,EAAO38O,IAElCjJ,KAAK6vP,SAAS7vP,KAAKN,QAAQkmP,OAAO58O,KAAMhJ,KAAKN,QAAQkmP,OAAO38O,IAGhE,SAASwJ,GACLzS,KAAKiwP,SAASx9O,GAGlB,SAASzJ,EAAMC,GAGPjJ,KAAK0uP,MACL1uP,KAAK0uP,KAAKvmD,KAAKn/L,EAAMC,EAHRjJ,KAAK8hM,MAAM6mB,UAGUunC,iBAI1C,aAAaz9O,GACT,OAAOzS,KAAK8hM,MAAMquD,aAAa19O,GAGnC,QAAQA,GAGJ,OAFAzS,KAAK6vP,SAASp9O,EAAEzJ,KAAMyJ,EAAExJ,IAEjBjJ,KAAK8hM,MAAMsuD,QAAQ39O,GAG9B,WAAWA,GAUP,OATIzS,KAAK0uP,MACL1uP,KAAK0uP,KAAKh5C,OAGd11M,KAAKgwP,gBACLhwP,KAAKovP,aACLpvP,KAAKS,SACLT,KAAK4vP,eAEE5vP,KAAK8hM,MAAMuuD,WAAW59O,GAGjC,WACI,MAAMogM,EAAW7yM,KAAK8hM,MAAM6mB,UAE5B,GAAI9V,EACA,OAAOA,EAASi5B,kBAAgC,WAIxD,OAAO9iO,EAAMC,GACT,MAAM28O,EAAS5lP,KAAKN,QAAQkmP,OAa5B,OAXI58O,GAAQC,IACR28O,EAAO58O,KAAOhJ,KAAK0hM,UAAU14L,GAC7B48O,EAAO38O,GAAKjJ,KAAK0hM,UAAUz4L,GAE3BjJ,KAAKovP,aACLpvP,KAAKS,SACLT,KAAK4vP,eAEL5vP,KAAK00O,UAAU71O,IAAImK,EAAMC,IAGtB,CACHD,KAAM48O,EAAO58O,KACbC,GAAI28O,EAAO38O,IAInB,aAAavJ,EAAU,GAAIghP,EAAe,IACtC,GAAIhhP,EAAQ4wP,OACR,OAEJ5wP,EAAQ4wP,QAAS,EAEjB,MAAMC,EAAcnvD,GAAW,GAAIs/C,EAAazrM,UAAWv1C,EAAQu1C,WAC7D+tL,EAAQtjO,EAAQsjO,MAAQ,GAAGr5N,OAAOjK,EAAQsjO,OAC1CD,EAAc3hC,GAAW,GAAImvD,EAAYv9C,KAAM,CAAEvoM,KCtWxC,eDwWV8lP,EAAYnkF,UACb22D,EAAY32D,SAAU,EACtB22D,EAAYl5D,OAAS,IAGzBm5D,EAAM3/N,KAAK0/N,GAEX,GAAUytB,WAAW9wP,EAAS6wP,GAC9B,GAAUE,aAAa/wP,EAAS6wP,EAAa7P,GAGjD,kBAAkBhhP,EAAS6wP,GACvB,MAAM9nD,EAAS8nD,EAAY9nD,QAAU,GAC/BsmC,EAAervO,EAAQ4tN,aAAe,GAAG3jN,OAAOjK,EAAQ4tN,cACxDojC,EAAYhxP,EAAQ65M,UAAY,GAAG5vM,OAAOjK,EAAQ65M,WAGlDo3C,EAA6C,IADvBlvB,GAAmBh5B,EAAQ0jB,IACfrrN,OAElCwJ,EAAO82L,GAAW,CACpB99L,KAAM,OACN0vM,KC7XW,aD8XXiJ,iBAAkB00C,EAClB55C,UAAW45C,EACXC,WAAW,EACXvgD,WAAY,CAAEjkC,SAAS,GACvB2uD,QAAS,CAAE3uD,SAAS,GACpB4jC,OAAQ,CAAE58K,KAAM,GAChBo3N,SAAU+F,EAAYM,iBACtBxzC,kBAAmB,CACfh/F,QAAS,CAAE,GACXD,MAAO,CAAE,EAAG,GACZsE,KAAM,CAAE,EAAG,GACXi5F,MAAO,GACPptK,OAAQ,CAAE,GACVqtK,MAAO,CAAE,MAGXk1C,EAAOP,EAAYjjC,aAEzByhB,EAAa1rO,KACT+9L,GAAW,GAAI92L,EAAM,CACjBgzM,cAAe,KAChBwzC,EAAM,CACLrmP,KCpZO,aDqZPiuG,MAAO,KACP8/F,SAAU,MACVE,aAAc,OACd1I,OAAQ,CAAE5jC,SAAS,GACnBikC,WAAY,CAAEjkC,SAAS,KACvBg1B,GAAW,GAAI92L,EAAMwmP,EAAM,CAC3BrmP,KAAMsmP,oBACNzzC,cAAe,GACf5E,aAAc,OACd1I,OAAQ,CAAElsK,SAAU,IACpB8uK,UAAW,GACXyK,kBAAmB,CACfh/F,QAAS,IAEbioH,UAAU,IACVllC,GAAW,GAAI92L,EAAMwmP,EAAM,CAC3BrmP,KAAMsmP,mBACNzzC,cAAe,IACfjN,WAAY,CACRjgK,MAAO,IAEXwiK,UAAW,GACXl6F,MAAO,KACPs3F,OAAQ,CAAE5jC,SAAS,EAAOglC,QAAQ,GAClCk1B,UAAU,KAIlBoqB,EAAUrtP,KAAK+9L,GAAW,CACtB32L,KClbW,aDmbXuoM,KCnbW,aDobXU,eAAgB,CACZtnC,SAAS,GAEbA,SAAS,GACVmkF,EAAYh3C,YAGnB,oBAAoB75M,EAAS6wP,EAAa7P,GACtC,MAAMj4C,EAAS/oM,EAAQ+oM,OAAS/oM,EAAQ+oM,QAAU,GAC5CuoD,EAAkB,GAAGrnP,OAAO4mP,EAAY9nD,QAAU,IAClDyxC,EAAewG,EAAaxG,aAC5Bt5O,EAAW2vP,EAAYtX,eAE7B,IAAK,IAAI/rM,EAAM,EAAGA,EAAM8jN,EAAgBlwP,OAAQosC,IAC5Cu7J,EAAOplM,KACH+9L,GAAW,CACP11B,MAAOwuE,EAAahtM,EAAMgtM,EAAap5O,QACvC+sO,cAAe0iB,EAAYU,UAC3BltB,iBAAiB,EACjBhJ,QAAS,CACL3uD,SAAS,IAEdxrK,EAAUowP,EAAgB9jN,GAAM,CAC/ByuI,KC3cG,aD4cH2xC,aC5cG,aD6cHk9B,SAAU+F,EAAYM,qBAO1C,SAAS5B,MAMM,IAAA,GAAA,GE1TfrrD,GAvJA,cAAyB,GAErB,cAAclkM,EAASghP,GACnB,MAAMtwM,EAAQ,GAAYpwC,KAAKy0C,SAASrE,OpYAnB,IoYCrB,IAAI4oM,EAAQ0H,EAEZ,MAAMwQ,EAAgB,CAClBjY,eAAgB,CACZpL,cAAenuO,EAAQuxP,WAE3BlM,aAAc,CACVz3B,aAAc,CACV7iN,KAAM,UACNipM,eAAgB,CACZtnC,SAAS,GAEb4jC,OAAQ,CACJ58K,KAAM,GAEVi9K,WAAY,CACRjkC,SAAS,GAEbkxC,cAAe/zM,KAAK2R,MAAMk1B,EAxBlB,OA6BhB4oM,IACAA,EAAQ53C,GAAW,GAAI43C,EAAOkY,IAGlC,GAAU7N,MAAM3jP,EAASs5O,GAEzB/xL,MAAMy6L,cAAchiP,EAASs5O,GAGjC,iBAAiBvkM,GACbu8C,GAASv8C,EAAS,wBAGtB,WAAW/0C,GACPM,KAAKmxP,mBACLlqM,MAAMmqM,WAAW1xP,GAGrB,sBACI,MAAM8vJ,EAAcxvJ,KAAKN,QAAQ8vJ,YAEjCxvJ,KAAKN,QAAQ8vJ,aAAc,EAC3BxvJ,KAAKqxP,cACLrxP,KAAKN,QAAQ8vJ,YAAcA,EAG/B,UACIxvJ,KAAKsxP,sBAGT,UACI,MAAMr8M,EAAYj1C,KAAKi1C,WAElBj1C,KAAKuxP,UAAYt8M,GAAaA,EAAUv1C,QAAQ8xP,cACjDv8M,EAAU26M,eAEV5vP,KAAKqxP,cAIb,SACI,MAAM3xP,EAAUM,KAAKN,QAEf2tN,EAAczqB,GADL,GAAGj5L,OAAOjK,EAAQ+oM,OAAQ/oM,EAAQu1C,UAAUwzJ,SAAAA,SACjB/mM,GAAK,OAAOA,GAAKA,EAAE0qK,WAAYtrK,OACnEmlG,EAAQjmG,KAAKyxP,eAAiBpkC,EAGpC,OAFArtN,KAAKyxP,aAAepkC,EAEbpnH,EAGX,cACI,IAAIhxD,EAAYj1C,KAAKi1C,UAEhBA,IACDA,EAAYj1C,KAAKi1C,UAAY,IAAI,GAAUj1C,MAC3CA,KAAK6qI,QAAQ,mBAAoB,CAAE51F,UAAWA,KAGlDA,EAAU8pD,QACV9pD,EAAUy8M,WAEVzqM,MAAMm6L,UAENnsM,EAAU45M,gBAGd,oBAAoB76B,GAChB,MACMhhB,EADWhzM,KAAK2oN,UACAqpB,YAAYhe,GAE9BhhB,GD1GW,eC0GHA,EAAKtzM,QAAQ+K,KACrBzK,KAAKizO,oBAELhsL,MAAM4gM,oBAAoB7zB,GAIlC,iBACI/sK,MAAMg6L,iBACNjhP,KAAK2xP,0BAGT,0BACI,MAAMjsE,EAAc,GAAG/7K,OAAO3J,KAAKN,QAAQ4tN,cAC3C,IAAIvU,EAEJ,IAAK,IAAIurB,EAAS,EAAGA,EAAS5+C,EAAY5kL,OAAQwjO,IAAU,CACxD,MAAM3oD,EAAO+J,EAAY4+C,GD3Hd,eC4HP3oD,EAAKlxK,KACLsuM,EAAap9B,EAAKo9B,WACXA,GD9HA,eC8Hcp9B,EAAKq3B,OAC1Br3B,EAAKo9B,WAAaA,IAK9B,mBACQ/4M,KAAKi1C,YACLj1C,KAAKi1C,UAAUkE,UACfn5C,KAAKi1C,UAAY,MAIzB,UACIj1C,KAAKmxP,mBACLlqM,MAAM9N,UAGV,mBAAmB1mC,GACf,MAAMuhN,EAASh0N,KAAKswO,kBAAkB79N,GAChCugM,EAAOhzM,KAAK2oN,UAAUqpB,YAAYhe,GAExC,OAAO/sK,MAAMq/L,mBAAmB7zO,IAAOugM,GDpJxB,eCoJgCA,EAAKtzM,QAAQ+K,KAGhE,wBACSzK,KAAKukP,mBACNvkP,KAAKy0C,QAAQhI,MAAMsT,YAAc,OAEjC//C,KAAKukP,kBAAmB,KAKN,CAC1B0M,UAAW,OACXlM,aAAc,CACVz3B,aAAc,CACVhqN,KAAM,OACNk1M,SAAU,MACVzB,WAAW,GAEfwC,UAAW,CACPmH,aAAa,EACb1Q,OAAQ,CACJ7lM,OAAQ,OAIpB8qC,UAAW,CACP2wM,OAAQ,GACR3M,eAAgB,CACZtmB,QAAS,CACLvmD,SAAS,GAEb2uD,QAAS,CACL3uD,SAAS,GAEbv+H,KAAM,CACFuC,MAAO,IAGfs+M,KAAM,GACNtiF,SAAS,GAEb2uD,QAAS,CACL3uD,SAAS,GAEbq2D,OAAQ,CACJr2D,SAAS,KCnMjB,MAQMwlF,GAASroP,KAAKwvC,GAAK,ICNV,SAAS7S,GAAI+lI,EAAM5gK,GAC9B,MAAM2jC,EAASi9H,EAAK0xB,YACd/lL,EAAOq0J,EAAKwX,UACZxH,EAAUulB,GAAWn2L,GAK3B,OAHA4gK,EAAKnC,UAAU,CAAE96H,EAAOhE,EAAIixI,EAAQtqI,KAAM3C,EAAOmB,EAAI8rI,EAAQhtD,MAC7Dg9C,EAAKlC,QAAQ,CAAEnyJ,EAAKw4B,OAAS6rI,EAAQtqI,KAAOsqI,EAAQrqI,OAAQh6B,EAAKiyJ,QAAUoS,EAAQhtD,IAAMgtD,EAAQhR,UAE1FgB,ECPX,MAAQlvD,MAAK,GAAEsuE,KAAI,GAAEE,KAAI,IAAK,EAEf,SAASsmE,GAAkB/yH,EAAOp/H,GAC7C,MAAMy1M,EAAWr2E,EAAMw7C,IACjBg+C,EAAUx5F,EAAM1tF,SAAS,GAAGkpI,IAC5B+uB,EAAS3pM,EAAQ2pM,QAAU,GAC3BO,EAAalqM,EAAQkqM,YAAc,GAEnCz4K,EAAU,GAAK24K,SAAS,IAAI,EAAIxe,KAAK,CAAE6pB,EAAS1jC,GAAI0jC,EAASzjC,IAAM,CAAEyjC,EAAS/kK,QAAS+kK,EAAStrC,WAAa,CAC/G8C,OAAQ,KAGN3oF,EAAO,IAAI,GAAK86C,EAAM96C,KAAM,IAAI,EAAIwiH,MAAM8xB,EAAQ7mD,GAAI6mD,EAAQ5mD,IAAK,CACrEsJ,KAAMt7K,EAAQs7K,KACdl9K,KAAM,CAAE4tK,MAAOhsK,EAAQgsK,SAGrBomF,EAAgB5rN,GAAI89C,EAAKioF,OAAO51I,QAAS32B,EAAQmkL,SAEjDkuE,EAAW,GAAKjoD,SAASgoD,EAAe,CAC1CnlF,OAAQ,CACJjB,MAAO29B,EAAOj5J,MAAQi5J,EAAO39B,MAAQ,GACrCt7H,MAAOi5J,EAAOj5J,MACd09H,QAASu7B,EAAOv7B,QAChBsb,SAAUigB,EAAOjgB,SACjBzQ,SAAU,QACV4Q,QAAS,SAEbzrL,KAAM,CACF4tK,MAAOk+B,KAITx2B,EAAW,IAAI,GAKrB,OAJAA,EAAS/4C,OAAOlpG,GAChBiiJ,EAAS/4C,OAAO03H,GAChB3+E,EAAS/4C,OAAOr2C,GAETovF,ECtCI,SAAS4+E,GAAS3zN,EAAO70B,EAAKoS,GACzC,MAAM5S,EAAO,GAAQq1B,EAAMr1B,MAAQq1B,EAAMr1B,KAAOm9J,GAC1Cl9J,EAAK,GAAQo1B,EAAMp1B,IAAMo1B,EAAMp1B,GAAKi9J,GAK1C,OAHA7nI,EAAMr1B,KAAOO,KAAKqS,IAAIrS,KAAKC,IAAIP,EAAID,GAAOQ,GAC1C60B,EAAMp1B,GAAKM,KAAKC,IAAID,KAAKqS,IAAI3S,EAAID,GAAO4S,GAEjCyiB,ECPI,SAASorK,GAAMx9B,EAAM5gK,GAChC,MAAM4wK,EAAUulB,GAAWn2L,GAK3B,OAHA4wK,EAAQtqI,MAAQsqI,EAAQtqI,KAAMsqI,EAAQhtD,KAAOgtD,EAAQhtD,IACrDgtD,EAAQrqI,OAASqqI,EAAQrqI,MAAOqqI,EAAQhR,QAAUgR,EAAQhR,OAEnD/kI,GAAI+lI,EAAMgQ,GCHrB,MACQoP,KAAI,GAAE03D,QAAO,IAAK,EAE1B,MAAM,WAAc,GAEhB,YAAYtuM,EAAS0sK,EAAa63B,EAAO1gO,EAAU,IAC/C2uC,QAEAjnD,KAAKy0C,QAAUA,EACfz0C,KAAKg5O,MAAQA,EACbh5O,KAAKiyP,eAAiB,IAAI,GAAajyP,KAAMsY,GAC7CtY,KAAK4gP,iBAAmBx/C,GAAW,GAAIphM,KAAKN,QAASyhN,GACrDnhN,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAK4gP,kBACnC5gP,KAAK8gP,WAAW9H,GAEhBh5O,KAAKwxO,SAGT,UACQxxO,KAAK48L,UACL58L,KAAK48L,QAAQzjJ,UACbn5C,KAAK48L,QAAU,aAGZ58L,KAAKy0C,eACLz0C,KAAKkyP,eAGhB,MAAMC,GACF,MAAMC,EAAUpyP,KAAK+1C,SAAS,GAE9B,GAAyB,IAArBztC,UAAUxH,OACV,OAAOsxP,EAAQ/mP,QAGnB+mP,EAAQ/mP,MAAM8mP,GACdnyP,KAAKqyP,iBAAiBF,GAG1B,QACI,MAAMv1D,EAAU58L,KAAK48L,QAErBA,EAAQh+K,QACRg+K,EAAQ3Q,KAAKjsL,KAAKsyP,UAGtB,eACI,OAAOtyP,KAAKsyP,SAGhB,UAAUx9O,GACN,MAAMihC,EAAW/1C,KAAK+1C,SAChBw8M,EAAY,GAElB,GAAyB,IAArBjqP,UAAUxH,OAAc,CACxB,IAAK,IAAIJ,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjC6xP,EAAUlvP,KAAK0yC,EAASr1C,GAAG2K,SAG/B,OAAOknP,EAGX,GAAI,GAAQz9O,GACR,IAAK,IAAIpU,EAAI,EAAGA,EAAIoU,EAAOhU,OAAQJ,IAC3Bw6B,GAASpmB,EAAOpU,KAChBq1C,EAASr1C,GAAG2K,MAAMyJ,EAAOpU,IAKrCV,KAAKqyP,iBAAiBv9O,GAG1B,iBAAiBA,GACb,MAAMihC,EAAW,GAAGpsC,OAAO3J,KAAKN,QAAQ0yP,SAClCI,EAAc,GAAG7oP,OAAOmL,GAE9B,IAAK,IAAIpU,EAAI,EAAGA,EAAI8xP,EAAY1xP,OAAQJ,IACpCq1C,EAASr1C,GAAG2K,MAAQmnP,EAAY9xP,GAIxC,SACIV,KAAKsxP,sBAGT,sBACI,MAAM9hG,EAAcxvJ,KAAKN,QAAQ8vJ,YAEjCxvJ,KAAKyyP,oBAAmB,GAExBzyP,KAAKwxO,SAELxxO,KAAKyyP,mBAAmBjjG,GAG5B,SACI,MAAM53I,EAAO5X,KAAK0yP,eACZvhO,EAAU,IAAI,EAAIm6J,KAAK,CAAE,EAAG,GAAK,CAAE1zK,EAAKw4B,MAAOx4B,EAAKiyJ,SAE1D7pK,KAAKghP,eAELhhP,KAAK2yP,UAAY3yP,KAAK4yP,mBAEtB5yP,KAAK6yP,eAEL,MAAM5mF,EAAOw9B,GAAMt4K,EAAQ86I,OAAQjsK,KAAK8yP,kBACxC9yP,KAAK6mM,OAAO56B,GAGhB,WAAWvsK,EAASs5O,GAChBh5O,KAAK4gP,iBAAmBx/C,GAAWphM,KAAK4gP,iBAAkBlhP,GAC1DM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAK4gP,kBAEnC5gP,KAAK8gP,WAAW9H,GAEhBh5O,KAAKwxO,SAGT,aAAa1mD,GACT9qL,KAAKiyP,eAAennE,IAAMsX,QAAQtX,GAC9B9qL,KAAK48L,SAAiC,QAAtB58L,KAAK48L,QAAQt5L,OAC7BtD,KAAK48L,QAAQzjJ,UACbn5C,KAAK48L,QAAU,MAIvB,eAAesF,GACXliM,KAAKiyP,eAAe/vD,KAAOA,EAG/B,WAAW82C,GACP,IAAI+Z,EAAe/Z,GAASh5O,KAAKg5O,OAAS,GAC1Ch5O,KAAKg5O,MAAQ+Z,EAEb/yP,KAAKN,QAAU0hM,GAAW,GAAI2xD,EAAc/yP,KAAKN,SACjD,MAAMA,EAAUM,KAAKN,QACf0yP,EAAU1yP,EAAQ0yP,QAExB,GAAI,GAAQA,GAAU,CAClB,MAAMr8M,EAAW,GACjB,IAAK,IAAIr1C,EAAI,EAAGA,EAAI0xP,EAAQtxP,OAAQJ,IAChCq1C,EAAS1yC,KAAK+9L,GAAW,GAAI2xD,EAAaX,QAASA,EAAQ1xP,KAE/DhB,EAAQ0yP,QAAUr8M,GAI1B,mBACI,MAAMr2C,EAAUM,KAAKN,QAAQizP,UACvB/6O,EAAO5X,KAAK48L,QAAQhlL,OACpByxL,EAAS3pM,EAAQ2pM,QAAU,GACjC,IAAI2pD,EAAe,IAAI,EAAI1nE,KAAK,CAAE,EAAG,GAAK,CAAE1zK,EAAKw4B,MAAOx4B,EAAKiyJ,SAqB7D,OAnBA7pK,KAAK8yP,iBAAmBpzP,EAAQupM,QA1JjB,EA4JXI,EAAOj5J,MAAQ,IACf4iN,EAAevpD,GAAMupD,EAAc3pD,EAAOj5J,QAG5B,GAAK05J,SAASkpD,EAAc,CAC1CrmF,OAAQ,CACJjB,MAAO29B,EAAOj5J,MAAQi5J,EAAO39B,MAAQ,GACrCt7H,MAAOi5J,EAAOj5J,MACdg5I,SAAUigB,EAAOjgB,SACjBzQ,SAAU,QACV4Q,QAAS,SAEbzrL,KAAM,CACF4tK,MAAOhsK,EAAQkqM,cAO3B,eACI,MAAM,QAAElqM,EAAO,QAAEk9L,GAAY58L,KACvBy0C,EAAUz0C,KAAKizP,kBACfr7O,EAAO5X,KAAK0yP,eAElB,GAAYj+M,EAAS78B,GAEhBglL,GAAWA,EAAQl9L,QAAQ4D,OAAS5D,EAAQmjP,UAS7C7iP,KAAK48L,QAAQh+K,QACb5e,KAAK48L,QAAQ9Q,WATT8Q,GACAA,EAAQzjJ,UAGZn5C,KAAK48L,QAAU,GAAQ5xL,OAAOypC,EAAS,CACnCnxC,KAAM5D,EAAQmjP,YAQ1B,eACI,MAAMnjP,EAAUM,KAAKN,QACfkY,EAAO5X,KAAKkzP,WAMlB,OAJIxzP,EAAQizP,WACRvxD,GAAWxpL,EAAMlY,EAAQizP,WAGtB/6O,EAGX,kBAMI,OALK5X,KAAKkyP,iBACNlyP,KAAKkyP,eAAiBlgN,SAASI,cAAc,OAC7CpyC,KAAKy0C,QAAQwzB,YAAYjoE,KAAKkyP,iBAG3BlyP,KAAKkyP,eAGhB,UACI,OAAOlyP,KAAKkzP,WAGhB,WACI,MAAMz+M,EAAUz0C,KAAKy0C,QACf0+M,EAAcnzP,KAAKozP,eACzB,IAAIhjN,EAAQqE,EAAQkmI,YAChB9Q,EAASp1H,EAAQmmI,aAUrB,OARKxqI,IACDA,EAAQ+iN,EAAY/iN,OAGnBy5H,IACDA,EAASspF,EAAYtpF,QAGlB,CAAEz5H,MAAOA,EAAOy5H,OAAQA,GAGnC,eACI,MAAO,CACHz5H,ML/OU,IKgPVy5H,OLlPW,KKsPnB,mBAAmBx+J,GACfrL,KAAKN,QAAQ8vJ,YAAcnkJ,EAC3B,IAAK,IAAI3K,EAAI,EAAGA,EAAIV,KAAK+1C,SAASj1C,OAAQJ,IACtCV,KAAK+1C,SAASr1C,GAAGhB,QAAQm0F,UAAU27D,YAAcnkJ,GAK7Du4L,GAAkB,GAAO,CACrBiP,SAAU,GACVmmC,MAAO,UACP6J,SAAU,GACVuP,QAAS,GACTv6M,MAAO,GACP86M,UAAW,KAGA,IAAA,GAAA,GCpQf,MAAQtnE,KAAI,GAAEtuE,MAAK,IAAK,EAClB,GAAQ,EAAIypF,MAElB,SAAS6sD,GAAeC,EAAmB5jD,GACvC,MAAM,SAAE5rK,EAAQ,MAAE6rK,EAAK,MAAEC,GAAU0jD,EACnC,IAAI/vP,EAAO8D,EAiBX,OAfIisP,EAAkB7nD,UAClBloM,EAAQ,IAAI,GAAMosM,EAAO7rK,GACzBz8B,EAAM,IAAI,GAAMsoM,EAAQD,EAAY93L,KAAMksB,KAE1CvgC,EAAQ,IAAI,GAAMugC,EAAU8rK,GAC5BvoM,EAAM,IAAI,GAAMy8B,EAAU8rK,EAAQF,EAAY93L,OAGjC,IAAI,GAAK,CACtB+0J,OAAQ,CACJjB,MAAOgkC,EAAYhkC,MACnBt7H,MAAOs/J,EAAYt/J,SAExB+nI,OAAO50K,GAAOk0K,OAAOpwK,GAK5B,SAASksP,GAAYC,EAAWthD,EAAeohD,EAAmB5jD,GAC9D,MAAM95K,EAAQs8K,EAAcpxM,OAE5B,GAAI4uM,EAAYtjC,QAAS,CACrB,MAAM,OAAEglC,EAAM,QAAEW,GAAYuhD,EAC5B,IAAK,IAAI5yP,EAAIgvM,EAAY1uL,KAAMtgB,EAAIk1B,EAAOl1B,GAAKgvM,EAAYt8K,KACnD1yB,EAAIgvM,EAAYyC,UAAa,IAIjCmhD,EAAkB3jD,MAAQyB,EAASW,EAAQpgC,GAAKogC,EAAQpgC,GAAK+9B,EAAY93L,KACzE07O,EAAkB1jD,MAAQwB,EAASW,EAAQrgC,GAAKg+B,EAAY93L,KAAOm6L,EAAQrgC,GAC3E4hF,EAAkBxvN,SAAWouK,EAAcxxM,GAE3C8yP,EAAUn5H,OAAOg5H,GAAeC,EAAmB5jD,MAK/D,MAAM,WAAoB,GACtB,YAAYhwM,EAAS+jF,GACjB,IAAIo2H,EAAen6M,GAAW,IACzB,GAAQm6M,EAAa19L,WAAsC,IAA1B09L,EAAapO,WAAuBhoH,GAAW,IAAIqnG,MACrF+uB,EAAez6M,OAAOu8B,OAAO,GAAIk+K,EAAc,CAC3C19L,SAAS,KAIjB8qC,MAAM,EAAG,EAAG4yJ,EAAcp2H,GAE1BzjF,KAAKN,QAAQ4yM,UAAYtyM,KAAKN,QAAQ4yM,WAAatyM,KAAKN,QAAQsyM,UAAY,GAGhF,gBAAgBtyM,GACZ,IAAIm6M,EAAezY,GAAW,GAAIphM,KAAKN,QAASA,GAIhD,OAHAm6M,EAAezY,GAAW,GAAIyY,EAAe,CAAE7J,OAAQ,CAAEoB,OAAQyI,EAAazI,UAC9EyI,EAAa7H,UAAY6H,EAAa7H,WAAalO,GAAc+V,EAAarwM,IAAKqwM,EAAaj+L,KAEzFi+L,EAGX,cAGA,SACI,MAAMzmC,EAAWpzK,KAAKozK,SAAW,IAAI,GAC/B48B,EAAShwM,KAAKyzP,eACdC,EAAY1zP,KAAK2zP,aACjBC,EAAa5zP,KAAKuzP,cAClBliB,EAASrxO,KAAK6zP,eAIpB,OAFAzgF,EAAS/4C,OAAOq5H,EAAW1jD,EAAQ4jD,EAAYviB,GAExCj+D,EAGX,eACI,MAAM1zK,EAAUM,KAAKN,SACf,IAAE8J,EAAG,IAAEoS,EAAG,SAAE6vL,EAAUuE,QAAQ,OAAEoB,IAAa1xM,EAC7C2xO,EAAS3xO,EAAQ2xO,QAAU,GAC3Bj+D,EAAW,IAAI,GACfx9I,EAAQy7M,EAAOvwO,OACf41M,EAAYh3M,EAAQg3M,WAAah3M,EAAQywM,WAAWv4L,KAAO,EAEjE,IAAK,IAAIlX,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAM29B,EAAQ2zN,GAAS3gB,EAAO3wO,GAAI8I,EAAKoS,GACjC45L,EAAOx1M,KAAKozM,QAAQ/0K,EAAMr1B,KAAMq1B,EAAMp1B,IACtCiqM,EAAQzH,EAAWzrM,KAAK+xM,UAAYyD,EACpCrC,EAAQ1H,EAAW+J,EAAOx1M,KAAK+xM,UACjCtG,EACAyH,EAAMzhC,IAAMilC,GAAatF,GAAU,EAAI,GAEvC+B,EAAMvhC,IAAM8kC,GAAatF,GAAU,EAAI,GAG3Ch+B,EAAS/4C,OAAO,GAAKyvE,SAAS,IAAI,EAAIxe,KAAK,CAAE4nB,EAAMzhC,GAAI0hC,EAAMzhC,IAAM,CAAEwhC,EAAMvhC,GAAKuhC,EAAMzhC,GAAI0hC,EAAMvhC,GAAKuhC,EAAMzhC,KAAO,CAC9G5zK,KAAM,CAAE4tK,MAAOrtI,EAAMqtI,MAAOoC,QAASzvI,EAAMyvI,SAC3CnB,OAAQ,MAIhB,OAAOyG,EAGX,eACI,MAAM,OAAE48B,EAAM,QAAEtwM,GAAYM,KACtBozK,EAAW,IAAI,GAErB,IAAK,IAAI1yK,EAAI,EAAGA,EAAIsvM,EAAOlvM,OAAQJ,IAC/B0yK,EAAS/4C,OAAOw3H,GAAkB7hD,EAAOtvM,GAAIhB,EAAQswM,SAGzD,OAAO58B,EAGX,aACI,MAAMvlI,EAAO7tC,KAAKN,QAAQmuC,KACpBkkK,EAAU/xM,KAAK+xM,UACf3+B,EAAW,IAAI,GAErB,GAAIvlI,EAAKuC,MAAQ,GAAKvC,EAAKu+H,QAAS,CAChC,MAAM0nF,EAAW,IAAI,GAAK,CACtBnnF,OAAQ,CACJjB,MAAO79H,EAAK69H,MACZ0d,SAAUv7I,EAAKu7I,SACfh5I,MAAOvC,EAAKuC,SAIpB0jN,EAAS37E,OAAO45B,EAAQtgC,GAAIsgC,EAAQrgC,IAAI+F,OAAOs6B,EAAQpgC,GAAIogC,EAAQngC,IACnEwB,EAAS/4C,OAAOy5H,GAGpB,OAAO1gF,EAGX,cACI,MAAMkkC,EAAQ,IAAI,GACZ53M,EAAUM,KAAKN,QACfsyM,EAAYtyM,EAAQ2wM,WAAWjkC,QAAU1sK,EAAQsyM,UAAY,EAC7DshD,EAAoB,CACtB7nD,SAAU/rM,EAAQ+rM,SAClB2F,OAAQ1xM,EAAQswM,OAAOoB,OACvBW,QAAS/xM,KAAK+xM,WAQlB,OALAwhD,GAAYj8C,EAAOt3M,KAAKoyM,wBAAyBkhD,EAAmB5zP,EAAQ2wM,YAC5EkjD,GAAYj8C,EAAOt3M,KAAKqyM,wBAAyBihD,EAAmBlyD,GAAW,GAAI,CAC/E+Q,SAAUH,EAAYtyM,EAAQ4yM,WAC/B5yM,EAAQywM,aAEJmH,GAIf1T,GAAkB,GAAa,CAC3Bp6L,IAAK,EACLoS,IAAK,GAELy0L,WAAY,CACRz4L,KAAM,GACN8jK,MNrKO,SMsKPhQ,MAAO/F,GACPv1H,MN1KmB,GM2KnBg8H,SAAS,GAGb+jC,WAAY,CACRv4L,KAAM,GACN8jK,MN7KO,SM8KPhQ,MAAO/F,GACPv1H,MNlLmB,GMmLnBg8H,SAAS,GAGbv+H,KAAM,CACFuC,MNvLmB,IM0LvB4/J,OAAQ,CACJlsK,SNxLO,SMyLP+/I,QAAS,GAEbutB,QAAQ,EACRmB,aAAa,IAGF,IAAA,GAAA,GCrMf,MAAM,WAAgB,GAClB,YAAY16J,EAAOspK,GACfl6J,QAEA,MAAM,IAAEz9C,EAAG,IAAEoS,GAAQi8B,EAAMn4C,QACrBA,EAAUM,KAAKN,QAAU0hM,GAAW,GAAIphM,KAAKN,QAASyhN,GAE5DzhN,EAAQ5B,KAAO4B,EAAQgsK,MAEvB1rK,KAAK63C,MAAQA,EAGTn4C,EAAQ2L,MADR,GAAQ3L,EAAQ2L,OACA,GAAW3L,EAAQ2L,MAAO7B,EAAKoS,GAE/BpS,EAIxB,MAAMmgB,GACF,MAAMjqB,EAAUM,KAAKN,QAGrB,GAAyB,IAArB4I,UAAUxH,OACV,OAHUpB,EAAQ2L,MAMtB,MAAM,IAAE7B,EAAG,IAAEoS,GAAQ5b,KAAK63C,MAAMn4C,QAEhCA,EAAQq0P,UAAY,GAAQr0P,EAAQq0P,WAAar0P,EAAQ2L,MAAQ7B,EACjE9J,EAAQ2L,MAAQ,GAAWse,EAAUngB,EAAKoS,GAEtC5b,KAAKozK,UACLpzK,KAAKg0P,WAKjBpwD,GAAkB,GAAS,CACvBl4B,MAAO/F,KAGI,IAAA,GAAA,GCtCf,MAAM,WAAsB,GACxB,YAAY9tH,EAAOn4C,GACfunD,MAAMpP,EAAOn4C,GAEbM,KAAKN,QAAU0hM,GAAW,CACtBn3F,MAAO,CACHmiE,QAAS,GAAQ1sK,EAAQuqG,SAE9BjqG,KAAKN,SAGZ,SACI,MAAM,QAAEA,EAAO,MAAEm4C,GAAU73C,MACrB,OAAEoxM,EAAM,SAAE3F,GAAa5zJ,EAAMn4C,QAC7Bg0P,EAAY77M,EAAMk6J,UAClBkiD,EAAYv0P,EAAQuqG,MAAMryF,MAAQlY,EAAQkY,KAC1Cs8O,EAAkBx0P,EAAQkY,KAAO,EACjCqxL,EAASzH,GAAW9hM,EAAQupM,QAClC,IAGIkrD,EAAYC,EAAiBC,EAH7BpgD,EAAQxI,EACHxC,EAAOmI,EAAS,OAAS,SACzBnI,EAAOmI,EAAS,SAAW,OAGpC6C,EAAQ7C,GAAU6C,EAAQA,EAEtBxI,GACA4oD,EAAW,IAAI,GACXX,EAAUjiF,GAAKwiC,EAAOy/C,EAAUhiF,GAChCgiF,EAAUjiF,GAAKwiC,EAAOy/C,EAAU9hF,IAEhCw/B,EACAijD,EAAS5iF,IAAMwiF,EAEfI,EAAS1iF,IAAMsiF,ERnCX,eQsCJv0P,EAAQyuL,QACRimE,EAAkB,IAAI,GAClBV,EAAU/hF,GAAKsiC,EAAOy/C,EAAUhiF,GAAKwiF,EACrCR,EAAU/hF,GAAKsiC,EAAOy/C,EAAU9hF,GAAKsiF,GAEzCC,EAAaC,KAGjBC,EAAW,IAAI,GACXX,EAAUjiF,GAAIiiF,EAAUhiF,GAAKuiC,EAC7By/C,EAAU/hF,GAAI+hF,EAAUhiF,GAAKuiC,GAE7B7C,EACAijD,EAASziF,IAAMqiF,EAEfI,EAAS3iF,IAAMuiF,ERrDX,eQwDJv0P,EAAQyuL,QACRimE,EAAkB,IAAI,GAClBV,EAAUjiF,GAAKyiF,EAAiBR,EAAUhiF,GAAKuiC,EAC/Cy/C,EAAU/hF,GAAKuiF,EAAiBR,EAAUhiF,GAAKuiC,GAEnDkgD,EAAaC,IAIrBp0P,KAAKq0P,SAAWA,EAChBr0P,KAAKo0P,gBAAkBA,EACvBp0P,KAAKs6K,IAAM65E,GAAcE,EAASh+N,QAAQ6P,IAAIxmC,EAAQ2pM,OAAOj5J,OAGjE,oBACI,MAAM1wC,EAAUM,KAAKN,QAErB,MAAO,CACH5B,KAAM,CACF4tK,MAAOhsK,EAAQgsK,MACfoC,QAASpuK,EAAQouK,SAErBnB,OAAQ,GAAQjtK,EAAQ2pM,QAAU,CAC9B39B,MAAOhsK,EAAQ2pM,OAAOj5J,MAAQ1wC,EAAQ2pM,OAAO39B,OAAShsK,EAAQgsK,MAAQ,GACtEt7H,MAAO1wC,EAAQ2pM,OAAOj5J,MACtBg5I,SAAU1pL,EAAQ2pM,OAAOjgB,SACzBtb,QAASpuK,EAAQouK,SACjB,MAIZ,UACI,MAAM,MAAEj2H,EAAK,QAAEn4C,GAAYM,MACrB,OAAEoxM,EAAM,SAAE3F,GAAa5zJ,EAAMn4C,QAC7BupM,EAASzH,GAAW9hM,EAAQupM,QAMlC,OAJcwC,EACVxC,EAAOmI,EAAS,OAAS,SACzBnI,EAAOmI,EAAS,SAAW,QAMvCxN,GAAkB,GAAe,CAC7BzV,MRrGgB,aQuGhBlkF,MAAO,CACHo/F,OAAQ,CACJj5J,MAAO,IAIfs7H,MAAO/F,GACP0jC,OAAQ,CACJj5J,MAAO,GAEX09H,QAAS,EAETm7B,OAAQzH,GAAW,GACnB3tG,UAAW,CACPvwF,KRrHY,cQuHhB8oK,SAAS,IAGE,IAAA,GAAA,GC1Hf,MAAM,WAAoC,EAAQq7B,UAE9C,QACI,MAAM/nM,EAAUM,KAAKN,SACf,OAAEupM,EAAM,KAAEjgM,EAAI,GAAEC,EAAE,SAAEwiM,GAAa/rM,EACjCi8K,EAAO8vB,EAAW,KAAO,KAE3B/rM,EAAQ0xM,SAAW3F,GACnBziM,EAAK2yK,IAASstB,EAAQhgM,EAAG0yK,IAASstB,IAElCjgM,EAAK2yK,IAASstB,EAAQhgM,EAAG0yK,IAASstB,GAGtC,MAAMwuC,EAAYz3O,KAAKy3O,UAAY,IAAI,EAASjxC,MAAMx9L,EAAKyoK,GAAIzoK,EAAK0oK,IAC9D4iF,EAAUt0P,KAAKs0P,QAAU,IAAI,EAAS9tD,MAAMv9L,EAAGwoK,GAAIxoK,EAAGyoK,IAEnC,IAArBhyK,EAAQylK,WACRzlK,EAAQylK,SAAW57J,KAAKqS,IAAK67N,EAAU5pE,WAAWymF,GAAW50P,EAAQylK,SAAY,IAAM,IAI/F,KAAKr+C,GACD,MAAMytI,EAAarsN,GAAiBloC,KAAKy3O,UAAUzsM,EAAGhrC,KAAKs0P,QAAQtpN,EAAG87E,GAChE0tI,EAAatsN,GAAiBloC,KAAKy3O,UAAUtnM,EAAGnwC,KAAKs0P,QAAQnkN,EAAG22E,GAEtE9mH,KAAKy0C,QAAQ38B,UAAU,EAASA,YAAYuxJ,UAAUkrF,EAAYC,KAI1E5wD,GAAkB,GAA6B,CAC3C1jB,OTxBW,SSyBX/a,STlCiB,MSqCrB,EAAQqwD,iBAAiBn/M,QAAQo/M,STnCX,eSmCmC,IAE1C,IAAA,GAAA,GClCf,MAAM,GAAQ,EAAIjvB,MACZ,GAAO,EAAQnb,KAqEN,IAAA,GAnEf,cAAiC,GAC7B,YAAYxzI,EAAOn4C,GACfunD,MAAMpP,EAAOn4C,GAER,GAAQM,KAAKN,QAAQkY,QACtB5X,KAAKN,QAAQkY,KAA4C,GAArC5X,KAAK63C,MAAMn4C,QAAQ2wM,WAAWz4L,MAI1D,eACI,MAAM,MAAEigC,EAAOn4C,SAAS,KAAEkY,IAAW5X,KAC/BwzN,EAAW57M,EAAO,EAClBq6J,EAAQp6H,EAAMn4C,QAAQ0xM,QAAU,EAAI,EAC1C,IAAIjjB,EAYJ,OATIA,EADAt2I,EAAMn4C,QAAQ+rM,SACN,CACJ,IAAI,GAAM,EAAG,EAAI+nB,GAAW,IAAI,GAAM,EAAIvhD,EAAOr6J,EAAM,GAAI,IAAI,GAAM,EAAG,EAAI47M,IAGxE,CACJ,IAAI,GAAM,EAAIA,EAAU,GAAI,IAAI,GAAM,EAAG,EAAIvhD,EAAOr6J,GAAO,IAAI,GAAM,EAAI47M,EAAU,IAIpFrlC,EAGX,UACI,MAAM,MAAEt2I,EAAK,QAAEn4C,GAAYM,KACrB6zF,EAAY,IAAI,GAA4B7zF,KAAKozK,SAAUguB,GAAW1hM,EAAQm0F,UAAW,CAC3F43G,SAAU5zJ,EAAMn4C,QAAQ+rM,SACxB2F,OAAQv5J,EAAMn4C,QAAQ0xM,OACtBnI,OAAQjpM,KAAKy0P,QAAQ/0P,EAAQupM,QAC7BjgM,KAAM6uC,EAAMu7J,QAAQ1zM,EAAQq0P,WAC5B9qP,GAAI4uC,EAAMu7J,QAAQ1zM,EAAQ2L,WAGQ,IAAlC3L,EAAQm0F,UAAU27D,cAClB37D,EAAUn0F,QAAQylK,SAAW,GAGjCtxE,EAAUwvJ,QACVxvJ,EAAUyvJ,OAGd,SACI,MAAM,MAAEzrM,EAAK,QAAEn4C,GAAYM,KACrB00P,EAAiB10P,KAAK20P,oBACtBxmE,EAAQnuL,KAAK40P,aAAal1P,EAAQ2L,OAExC3L,EAAQm0F,UAAUvwF,KVzDJ,eU2Dd,MAAM8vK,EAAW,IAAI,GAAK,CACtBzG,OAAQ+nF,EAAe/nF,OACvB7uK,KAAM42P,EAAe52P,OACtBq6K,OAAOgW,EAAM,IAAI1W,OAAO0W,EAAM,IAAI1W,OAAO0W,EAAM,IAAI1vL,QAEhD+2M,EAAO39J,EAAMu7J,QAAQ1zM,EAAQ2L,OAKnC,OAJA+nK,EAASt7J,UAAU,EAAIA,YAAYuxJ,UAAUmsC,EAAK/jC,GAAI+jC,EAAK9jC,KAE3D1xK,KAAKozK,SAAWA,EAETA,ICnEf,MAAM,WAAkC,EAAQq0B,UAE5C,QACI,MAAM/nM,EAAUM,KAAKN,QACfi8K,EAAO37K,KAAK27K,KAAOj8K,EAAQ+rM,SAAWhlC,GAAID,GAC1Cv9J,EAAKjJ,KAAKiJ,GAAKvJ,EAAQm1P,UAAU,GAAGl5E,GACpC3yK,EAAOhJ,KAAKgJ,KAAOtJ,EAAQo1P,UAAU,GAAGn5E,GAErB,IAArBj8K,EAAQylK,WACRzlK,EAAQylK,SAAW57J,KAAKqS,IAAKrS,KAAK+mC,IAAIrnC,EAAKD,GAAQtJ,EAAQq1P,MAAS,IAAM,IAG9E/0P,KAAKonK,KAAKp+J,GAGd,KAAK89G,GACD,MAAMz7G,EAAQ68B,GAAiBloC,KAAKgJ,KAAMhJ,KAAKiJ,GAAI69G,GACnD9mH,KAAKonK,KAAK/7J,GAGd,KAAKA,GACD,MAAMwI,EAAS,MAAQ7T,KAAK27K,KAAKl+I,cAC3BoyI,EAAS7vK,KAAKN,QAAQm1P,UAE5BhlF,EAAO,GAAGh8J,GAAQxI,GAClBwkK,EAAO,GAAGh8J,GAAQxI,IAI1Bu4L,GAAkB,GAA2B,CACzC1jB,OXzBW,SW0BX60E,MXnCiB,MWsCrB,EAAQv/B,iBAAiBn/M,QAAQo/M,SXnCb,aWmCmC,IAExC,IAAA,GAAA,GCnCf,MAAQ14G,MAAK,GAAEsuE,KAAI,IAAK,EAkHT,IAAA,GAhHf,cAA+B,GAC3B,YAAYxzI,EAAOn4C,GACfunD,MAAMpP,EAAOn4C,GAER,GAAQM,KAAKN,QAAQkY,QACtB5X,KAAKN,QAAQkY,KAA4C,GAArC5X,KAAK63C,MAAMn4C,QAAQ2wM,WAAWz4L,MAI1D,aAAavM,GACT,MAAM,MAAEwsC,EAAK,QAAEn4C,GAAYM,MACrB,OAAEoxM,EAAM,SAAE3F,GAAa5zJ,EAAMn4C,QAC7BsK,EAAMonM,IAAW3F,GAAY,EAAI,EACjC7zL,EAAOlY,EAAQkY,KAAO5N,EACtBgrP,EAAUn9M,EAAMu7J,QAAQv7J,EAAMn4C,QAAQ8J,KACtCgsM,EAAO39J,EAAMu7J,QAAQ/nM,GACrBswK,EAAO8vB,EAAWhlC,GAAID,GACtByuF,EAAWxpD,EAAWjlC,GAAIC,GAC1BwiC,EAASjpM,KAAKy0P,UAAYzqP,EAE1B2uC,EAAK,IAAI,EAAI6tJ,MACnB7tJ,EAAGgjI,GAAQq5E,EAAQr5E,EAAO,KAC1BhjI,EAAGs8M,GAAYD,EAAQC,EAAW,KAElC,MAAMr8M,EAAK,IAAI,EAAI4tJ,MACnB5tJ,EAAG+iI,GAAQ65B,EAAK75B,EAAO,KACvB/iI,EAAGq8M,GAAYz/C,EAAKy/C,EAAW,KAE3BxpD,GACA9yJ,EAAG0wH,UAAU4/B,EAAQ,GACrBrwJ,EAAGywH,UAAU4/B,EAAQ,KAErBtwJ,EAAG0wH,UAAU,EAAG4/B,GAChBrwJ,EAAGywH,UAAU,EAAG4/B,IAGpB,MAAMp4B,EAAKj4H,EAAGviB,QACRsgJ,EAAKh+H,EAAGtiB,QAUd,OARIo1K,GACA56B,EAAGxH,UAAUzxJ,EAAM,GACnB++J,EAAGtN,UAAUzxJ,EAAM,KAEnBi5J,EAAGxH,UAAU,EAAGzxJ,GAChB++J,EAAGtN,UAAU,EAAGzxJ,IAGb,CAAE+gC,EAAIC,EAAIi4H,EAAI8F,GAGzB,UACI,MAAM,MAAE9+H,EAAK,QAAEn4C,GAAYM,KACrBmuL,EAAQnuL,KAAK40P,aAAal1P,EAAQ2L,OAClC6pP,EAAcl1P,KAAKk1P,YACnBC,EAAWn1P,KAAK40P,aAAal1P,EAAQq0P,WAE3CmB,EAAY/8E,OAAOgW,EAAM,IAAI1W,OAAO0W,EAAM,IAAI1W,OAAO0W,EAAM,IAAI1W,OAAO0W,EAAM,IAAI1vL,QAEhF,MAAMo1F,EAAY,IAAI,GAA0BqhK,EAAa9zD,GAAW1hM,EAAQm0F,UAAW,CACvF13E,QAAS07B,EAAMn4C,QAAQyc,QACvBsvL,SAAU5zJ,EAAMn4C,QAAQ+rM,SACxBqpD,UAAW,CAAEK,EAAS,GAAIA,EAAS,IACnCN,UAAW,CAAE1mE,EAAM,GAAIA,EAAM,QAGK,IAAlCzuL,EAAQm0F,UAAU27D,cAClB37D,EAAUn0F,QAAQylK,SAAW,GAGjCtxE,EAAUwvJ,QACVxvJ,EAAUyvJ,OAGd,SACI,MAAM/rN,EAAQ,IAAI,GACZm9N,EAAiB10P,KAAK20P,oBAExB30P,KAAKN,QAAQuqG,MAAMmiE,SACnB70I,EAAM8iG,OAAOr6H,KAAKo1P,eAGtB,MAAMhD,EAAUpyP,KAAKk1P,YAAc,IAAI,GAAK,CACxCvoF,OAAQ+nF,EAAe/nF,OACvB7uK,KAAM42P,EAAe52P,OAOzB,OAJAy5B,EAAM8iG,OAAO+3H,GAEbpyP,KAAKozK,SAAW77I,EAETA,EAGX,cACI,MAAM89N,EAAer1P,KAAKN,QAAQuqG,MAC5Bo/F,EAASgsD,EAAahsD,QAAU,GAChCgrD,EAAWr0P,KAAKq0P,SAASh+N,QAAQ6P,IAAImjK,EAAOj5J,OAAS,GAE3D,OAAO,IAAI,GAAK05J,SAASuqD,EAAStqD,SAAU,CACxCjsM,KAAM,CACF4tK,MAAO2pF,EAAa3pF,MACpBoC,QAASunF,EAAavnF,SAE1BnB,OAAQ,CACJjB,MAAO29B,EAAOj5J,MAAQi5J,EAAO39B,OAAS2pF,EAAa3pF,MAAQ,GAC3Dt7H,MAAOi5J,EAAOj5J,MACdg5I,SAAUigB,EAAOjgB,cCzGjC,MAGM,GAAQ,EAAQrsE,MAEtB,MAAM,WAAoB,GAEtB,OAAOkvD,GACH,MAAMl2H,EAAW/1C,KAAK+1C,SAChBu/M,EAAQrpF,EAAKj9H,OAAOhE,EACpBuqN,EAAQtpF,EAAKj9H,OAAOmB,EAEpBmqI,EAAM,IAAI,GAAIg7E,EAAOC,EAAOD,EAAQrpF,EAAK77H,QAASmlN,EAAQtpF,EAAKpC,UAErE7pK,KAAK63C,MAAMgvJ,OAAOvsB,GAClBt6K,KAAKw1P,kBAAkBl7E,GAEvB,IAAK,IAAI55K,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,SAGhB7mM,KAAKisK,KAAOjsK,KAAKy1P,QAAQn7E,GACzBt6K,KAAK01P,iBACL11P,KAAK21P,kBACL31P,KAAK41P,eACL51P,KAAK61P,QAGT,eACI,MAAM7tD,EAAU,IAAI,GACd8tD,EAAgB91P,KAAK63C,MAAMmuI,SAC3BjwI,EAAW/1C,KAAK+1C,SAEtBiyJ,EAAQ3tE,OAAOr6H,KAAK2yP,WACpB3qD,EAAQ3tE,OAAOy7H,GAEf,IAAK,IAAIp1P,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IAAK,CACtC,MAAM2V,EAAU0/B,EAASr1C,GACzBsnM,EAAQ3tE,OAAOhkH,EAAQ2vK,UACvB3vK,EAAQhL,MAAMgL,EAAQ3W,QAAQ2L,OAGlCrL,KAAKsyP,SAAWtqD,EAGpB,eACI,MAAMtoM,EAAUM,KAAKN,QACfm4C,EAAQ73C,KAAK63C,MAAQ,IAAI,GAAYn4C,EAAQm4C,MAAO73C,KAAKiyP,gBAE/DjyP,KAAK+1C,SAAW,GAEhB,IAAIA,EAAWr2C,EAAQ0yP,QACvBr8M,EAAW,GAAQA,GAAYA,EAAW,CAAEA,GAE5C,IAAK,IAAIr1C,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IAAK,CACtC,MAAMqjP,EAAiB3iD,GAAW,GAAIrrJ,EAASr1C,GAAI,CAC/CmzF,UAAW,CACP27D,YAAa9vJ,EAAQ8vJ,eAK7BxvJ,KAAK+1C,SAAS1yC,KAAK,IbrEjB,UamEkB0gP,EAAe51D,MAAkB,GAAqB,IAEvCt2I,EAAOksM,KAIlD,eACI,MAAMt4C,EAAWzrM,KAAKN,QAAQm4C,MAAM4zJ,SAEpC,MAAO,CACHr7J,MAAOq7J,EAtEO,GbFJ,IayEV5hC,OAAQ4hC,Eb3EG,IaKI,IA0EvB,QAAQnxB,GACJ,MAAM,MAAEziI,EAAK,SAAE9B,GAAa/1C,KACtB8tM,EAAYxzB,EAAI5jI,SACtB,IAMI9+B,EANAm+O,EAAchgN,EAAS,GAAGukI,IAAIjkJ,QAAQ2M,KAAK6U,EAAMyiI,KAErD,IAAK,IAAI55K,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1P,EAAY/yN,KAAK+S,EAASr1C,GAAG45K,IAAIjkJ,SAkBrC,OAdIwhB,EAAMn4C,QAAQ+rM,UACd7zL,EAAOm+O,EAAY3lN,QAAU,EAC7B2lN,EAAc,IAAI,GACdjoD,EAAU9iK,EAAIpzB,EAAM0iK,EAAI5I,GACxBo8B,EAAU9iK,EAAIpzB,EAAM0iK,EAAI1I,MAG5Bh6J,EAAOm+O,EAAYlsF,SAAW,EAC9BksF,EAAc,IAAI,GACdz7E,EAAI7I,GAAIq8B,EAAU39J,EAAIv4B,EACtB0iK,EAAI3I,GAAIm8B,EAAU39J,EAAIv4B,IAIvBm+O,EAGX,iBACI,MAAM,MAAEl+M,EAAK,SAAE9B,GAAa/1C,KACtBg2P,EAAWn+M,EAAMyiI,IACjBA,EAAMvkI,EAAS,GAAGukI,IAAIjkJ,QAAQ2M,KAAK6U,EAAMyiI,KACzCy7E,EAAc/1P,KAAKisK,KAEzB,IAAK,IAAIvrK,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjC45K,EAAIt3I,KAAK+S,EAASr1C,GAAG45K,IAAIjkJ,SAG7B,IAAIutF,EACA/rE,EAAMn4C,QAAQ+rM,UACd7nF,EAAOmyI,EAAYr/M,SAAS1L,EAAIsvI,EAAI5jI,SAAS1L,EAC7C6M,EAAMgvJ,OAAO,IAAI,GACbmvD,EAASvkF,GAAK7tD,EAAMmyI,EAAYrkF,GAChCskF,EAASrkF,GAAK/tD,EAAMmyI,EAAYnkF,OAGpChuD,EAAOmyI,EAAYr/M,SAASvG,EAAImqI,EAAI5jI,SAASvG,EAC7C0H,EAAMgvJ,OAAO,IAAI,GACbmvD,EAASvkF,GAAIukF,EAAStkF,GAAK9tD,EAC3BoyI,EAASrkF,GAAIqkF,EAASpkF,GAAKhuD,KAInC,IAAK,IAAIljH,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,OAAO7mM,KAAKisK,MAIhC,kBAAkBA,GACd,MAAM,MAAEp0H,GAAU73C,KAClB,IAAK63C,EAAMn4C,QAAQ+rM,SAAU,CACzB,MAAMwqD,EAAWp+M,EAAM6xJ,aAAat5J,QAAU67H,EAAK77H,QAC/C6lN,EAAW,IACXp+M,EAAMyiI,IAAIoqB,OAAOuxD,EAAU,GAC3Bp+M,EAAMyiI,IAAI80B,QAAQnjC,EAAM,UACxBp0H,EAAMgvJ,OAAOhvJ,EAAMyiI,OAK/B,kBACI,MAAM,MAAEziI,EAAK,SAAE9B,GAAa/1C,KACtBg2P,EAAWn+M,EAAMyiI,IAAIjkJ,QACrBywF,EAAMjvE,EAAMn4C,QAAQ+rM,SAAW,IAAM,IACrC0oD,EAAap+M,EAAS,GAAGukI,IAE/B,IAAK,IAAI55K,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCyzP,EAAWnxN,KAAK+S,EAASr1C,GAAG45K,IAAIjkJ,SAGpC2/N,EAASlvI,EAAM,IAAMv9G,KAAKqS,IAAIo6O,EAASlvI,EAAM,GAAKqtI,EAAWrtI,EAAM,GAAI,GACvEkvI,EAASlvI,EAAM,IAAMv9G,KAAKqS,IAAIu4O,EAAWrtI,EAAM,GAAKkvI,EAASlvI,EAAM,GAAI,GAEvEjvE,EAAMgvJ,OAAOmvD,GAEb,IAAK,IAAIt1P,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,OAAO7mM,KAAKisK,OAKpC23B,GAAkB,GAAa,CAC3Bp0C,aAAa,EACbmjG,UAAW,CACP/oD,WAAY,IAEhB/xJ,MAAO,CACH4zJ,UAAU,KAIH,IAAA,GAAA,GChLf,MAEQxgB,IAAG,GAAEI,KAAI,GAAEtuE,MAAK,IAAK,EAE7B,SAASm5I,GAAUn9E,EAAKo9E,EAAYtpI,EAAM6iF,GACtC,MAAM4H,EAAQ,IAAI,GACZ5gK,EAASqiI,EAAIriI,OACbw2H,EAAS6L,EAAIq9E,aAEnB,GAAI1mD,EAAYtjC,QACZ,IAAK,IAAI1rK,EAAI,EAAGA,EAAIy1P,EAAWr1P,OAAQJ,IAAK,CACxC,MAAM21P,EAAYt9E,EAAIzJ,QAAQ6mF,EAAWz1P,IACnC41P,EAAU,IAAI,EAAI9vD,MAAM9vJ,EAAO1L,EAAIkiI,EAASwiC,EAAY93L,KAAM8+B,EAAOvG,GAAGg5H,OAAOgtF,EAAWz1P,GAAIg2C,GAEpG4gK,EAAMj9E,OAAO,IAAI,GAAK,CAClBsyC,OAAQ,CACJjB,MAAOgkC,EAAYhkC,MACnBt7H,MAAOs/J,EAAYt/J,SAExB+nI,OAAOk+E,GAAW5+E,OAAO6+E,IAIpC,OAAOh/C,EAGX,SAASi/C,GAAavtP,EAAMC,EAAIyiK,EAAOoC,GACnC,MAAO,CAAE9kK,KAAMA,EAAMC,GAAIA,EAAIyiK,MAAOA,EAAOoC,QAASA,GAGxD,MAAM,WAAoB,GACtB,YAAYpuK,EAAS+jF,GACjBx8B,MAAM,EAAG,EAAGvnD,EAAS+jF,GAGzB,gBAAgB/jF,GACZ,MAAMm6M,EAAezY,GAAW,GAAIphM,KAAKN,QAASA,GAIlD,OAHAm6M,EAAa7H,UAAY6H,EAAa7H,WAAalO,GAAc+V,EAAarwM,IAAKqwM,EAAaj+L,KAChGi+L,EAAavH,UAAYuH,EAAavH,WAAauH,EAAa7H,UAAY,GAErE6H,EAGX,cAGA,OAAOnjK,EAAQw2H,GACX,MAAM6L,EAAM/4K,KAAKw2P,UAAU9/M,EAAQw2H,GAEnCltK,KAAKisK,KAAO8M,EAAI9M,OAChBjsK,KAAKy2P,cAAgBz2P,KAAKyzP,eAC1BzzP,KAAKs3M,MAAQt3M,KAAKuzP,cAClBvzP,KAAKqxO,OAASrxO,KAAK6zP,eAGvB,OAAO5nF,GACH,MAAMv1H,EAASu1H,EAAKv1H,SACdw2H,EAAS3jK,KAAKC,IAAIyiK,EAAKpC,SAAUoC,EAAK77H,SAAW,EAEvD,IAAI,GAAQpwC,KAAKisK,MAMb,OAAOjsK,KAAKgmL,OAAOtvI,EAAQw2H,GAL3BltK,KAAKisK,KAAOjsK,KAAK+4K,IAAI9M,OACrBjsK,KAAKktK,OAAOltK,KAAK+4K,IAAIq9E,cACrBp2P,KAAK02P,mBACL12P,KAAKyzP,eAMb,UAAUpoP,GACN,MAAM,IAAE7B,EAAG,IAAEoS,EAAG,QAAEO,EAAO,WAAE6yJ,EAAU,SAAEC,GAAajvK,KAAKN,QACnDo3C,EAAQm4H,EAAWD,EACzB,IAAItnK,EAQJ,OALIA,EADAyU,EACS8yJ,GAAY5jK,EAAQ7B,IAAQoS,EAAMpS,GAAOstC,GAEvCzrC,EAAQ7B,IAAQoS,EAAMpS,GAAOstC,EAASk4H,EAG9CtnK,EAhFc,IAmFzB,YACI,MAAM2pO,EAASrxO,KAAKN,QAAQ2xO,OAE5B,OAAOA,GAAUA,EAAOvwO,OAG5B,YACI,MAAM,WAAEuvM,EAAU,WAAEF,GAAenwM,KAAKN,QACxC,IAAIkY,EAAO,EASX,OARIy4L,EAAWjkC,UACXx0J,EAAOy4L,EAAWz4L,MAGlBu4L,EAAW/jC,UACXx0J,EAAOrO,KAAKqS,IAAIu0L,EAAWv4L,KAAMA,IAG9BA,EAGX,cACI,IAAIge,EAAQqxB,MAAM2pJ,cAClB,MAAMlxM,EAAUM,KAAKN,QAOrB,OANcA,EAAQuvK,SAAWvvK,EAAQsvK,YAE5B,KAAQtvK,EAAQkc,IAAMlc,EAAQsyM,WAAc,IACrDp8K,GAAS,GAGNA,EAGX,eACI,MAAMl2B,EAAUM,KAAKN,QACfq5K,EAAM/4K,KAAK+4K,IAAI1iJ,QACrB,IAAI62I,EAAS6L,EAAIq9E,aACjB,MAAMD,EAAan2P,KAAKm2P,WAAWp9E,EAAKr5K,EAAQsyM,WAC1C0E,EAAYh3M,EAAQg3M,UAAYh3M,EAAQg3M,WAAsB,GAATxpC,EACrDypF,EAAc,IAAI,GAExB,IAAIC,EAAyB,IAAT1pF,EAChB,GAAQxtK,EAAQk3P,eAChBA,EAAgBl3P,EAAQk3P,cAExBl3P,EAAQk3P,cAAgBA,EAG5B,MAAMzd,EAAgBz5O,EAAQswM,OACxB6mD,EdlIC,WckIU1d,EAAcr1M,SACzBgzN,EAAmB,GAAQ92P,KAAKy2P,eAElCI,IACA3pF,GAAUltK,KAAK+2P,YAEX/2P,KAAKg3P,cAAgBF,IACrB5pF,GAAUwpC,EAAYkgD,GAE1B79E,EAAIk+E,WAAW/pF,GAAQgqF,WAAWhqF,IAGtC,MAAM8iC,EAAShwM,KAAKgwM,OACdp6K,EAAQo6K,EAAOlvM,OACf+iL,EAAU2d,GAAW23C,EAAct1D,SACnCszE,GAAgBtzE,EAAQlyI,KAAOkyI,EAAQjyI,OAAS,EAChDwlN,GAAiBvzE,EAAQ50D,IAAM40D,EAAQ5Y,QAAU,EAEvD,IAAK,IAAIvqK,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAMo+H,EAAQkxE,EAAOtvM,GACfiuL,EAAY7vD,EAAMw7C,IAAIlqI,QAAU,EAChCw+I,EAAa9vD,EAAMw7C,IAAIzQ,SAAW,EAClC/yH,EAAQq/M,EAAWz1P,GACnB22P,GAAcvgN,EA1JH,KA0JmC86M,GAE9CrY,EAAKxgE,EAAIzJ,QAAQx4H,GACjB27H,EAAK8mE,EAAGvuM,EAAKzhC,KAAKm/J,IAAI2uF,IAAe1oE,EAAYwoE,IAAiBN,EAAW,GAAK,GAClFnkF,EAAK6mE,EAAGppM,EAAK5mC,KAAKo/J,IAAI0uF,IAAezoE,EAAawoE,IAAkBP,EAAW,GAAK,GAE1F/3H,EAAM+nE,OAAO,IAAI,GAAIp0B,EAAKkc,EAAWjc,EAAKkc,EAAYnc,EAAKkc,EAAWjc,EAAKkc,IAC3E,MAAM0oE,EAAW,IAAI,EAAI9wD,MAAM1nE,EAAMw7C,IAAI7I,GAAI3yC,EAAMw7C,IAAI5I,IAEvD,IAAI6lF,EACJ,GAAKT,EAGE,CACHS,EAAev3P,KAAKy2P,cAAcrlN,SAAS1wC,GAC3C,MAAM82P,EAAeD,EAAatrF,OAAOj9H,OAEnCyoN,EAAiBF,EAAaz/O,aAAe,EAAIA,YACvD2/O,EAAepuF,UAAUiuF,EAAStsN,EAAIwsN,EAAaxsN,EAAGssN,EAASnnN,EAAIqnN,EAAarnN,GAChFonN,EAAaz/O,UAAU2/O,QARvBF,EAAe1F,GAAkB/yH,EAAOp/H,EAAQswM,QAChD2mD,EAAYt8H,OAAOk9H,GAUvBv3P,KAAKisK,KAAO,EAAIqf,KAAKn0J,MAAMn3B,KAAKisK,KAAMsrF,EAAatrF,QAGvD,OAAO0qF,EAGX,mBACI,MAAMtlB,EAASrxO,KAAKqxO,OAAOjgM,SAE3B,GAAIigM,EAAOvwO,OAAS,EAAG,CACnB,MAAM,cAAE81P,EAAa,UAAElgD,GAAc12M,KAAKN,QAC1C,IAAIg4P,EAAc13P,KAAK23P,iBd1LpB,Wc4LC33P,KAAKN,QAAQswM,OAAOlsK,WACpB4zN,GAAehhD,EAAYkgD,GAG/B,MAAM1xD,EAAYwyD,EAAehhD,EAAY,EAE7C,IAAK,IAAIh2M,EAAI,EAAGA,EAAI2wO,EAAOvwO,OAAQJ,IAC/B2wO,EAAO3wO,GAAG8tK,UAAUyoF,WAAW/xD,GAAWgyD,WAAWhyD,GAGzDllM,KAAKisK,KAAO,EAAIqf,KAAKn0J,MAAMn3B,KAAKisK,KAAMjsK,KAAKqxO,OAAOplE,SAI1D,eACI,MAAMtxB,EAAW36I,KAAK43P,gBAChBC,EAAgBl9G,EAAS75I,OACzB4G,EAAS,IAAI,GAEnB,GAAImwP,EAAe,CACf,MAAM,UAAEnhD,EAAS,QAAEv6L,EAAO,cAAEy6O,GAAkB52P,KAAKN,QAC7Cg4P,EAAc13P,KAAK23P,iBAGzB33P,KAAKktK,OAAOltK,KAAKktK,SAAWwpC,EAAYkgD,GAExC,IAAK,IAAIl2P,EAAI,EAAGA,EAAIm3P,EAAen3P,IAAK,CACpC,MAAMoK,EAAU6vI,EAASj6I,GACnBsI,EAAOhJ,KAAKulN,UAAUz6M,EAAQqR,EAAU,KAAO,SAC/ClT,EAAKjJ,KAAKulN,UAAUz6M,EAASqR,EAAiB,OAAP,OAEzClT,EAAKD,GAAS,GACdtB,EAAO2yH,OAAOr6H,KAAKmzB,YAAYnqB,EAAMC,EAAIyuP,EAAa5sP,KAKlE,OAAOpD,EAGX,YAAYsnK,EAAYC,EAAUyoF,EAAah4P,GAC3C,MAAMg3M,EAAY12M,KAAKN,QAAQg3M,UACzBohD,EAAY,IAAI,EAAI7sE,IAAIjrL,KAAK+4K,IAAIriI,OAAQ,CAC3Co4H,QAAS4oF,EAAehhD,EAAY,EACpC3nC,QAAS2oF,EAAehhD,EAAY,EACpC1nC,WAAYA,EACZC,SAAUA,IAGd,OAAO,IAAI,GAAI6oF,EAAW,CACtBnrF,OAAQ,CACJv8H,MAAOsmK,EACPhrC,MAAOhsK,EAAQgsK,MACfoC,QAASpuK,EAAQouK,QACjByb,QAAS7pL,EAAQ6pL,WAK7B,gBACI,MAAM7pL,EAAUM,KAAKN,QACf2xO,EAAS3xO,EAAQ2xO,QAAU,GAC3Bz7M,EAAQy7M,EAAOvwO,OACf65I,EAAW,GAEjB,GAAI/kH,EAAO,CACP,MAAM,IAAEpsB,EAAG,IAAEoS,EAAKm8O,sBAAuBzkC,GAAiB5zN,EAC1Di7I,EAASt3I,KAAKkzP,GAAa/sP,EAAKoS,EAAK03M,IAErC,IAAK,IAAI5yN,EAAI,EAAGA,EAAIk1B,EAAOl1B,IAAK,CAC5B,MAAM29B,EAAQ2zN,GAAS3gB,EAAO3wO,GAAI8I,EAAKoS,GACjCi8O,EAAgBl9G,EAAS75I,OAE/B,IAAK,IAAI8vC,EAAI,EAAGA,EAAIinN,EAAejnN,IAAK,CACpC,MAAM9lC,EAAU6vI,EAAS/pG,GAEzB,GAAI9lC,EAAQ9B,MAAQq1B,EAAMr1B,MAAQq1B,EAAMr1B,MAAQ8B,EAAQ7B,GAAI,CACxD0xI,EAASt3I,KAAKkzP,GAAal4N,EAAMr1B,KAAMq1B,EAAMp1B,GAAIo1B,EAAMqtI,MAAOrtI,EAAMyvI,UAEhEhjK,EAAQ9B,MAAQq1B,EAAMp1B,IAAMo1B,EAAMp1B,IAAM6B,EAAQ7B,IAChD0xI,EAASt3I,KAAKkzP,GAAal4N,EAAMp1B,GAAI6B,EAAQ7B,GAAIqqN,EAAcj1L,EAAMyvI,UAGzEhjK,EAAQ7B,GAAKo1B,EAAMr1B,KAEnB,SAMhB,OAAO2xI,EAGX,iBACI,MAAM,IAAEo+B,EAAG,QAAEr5K,GAAYM,MACnB,UAAE02M,EAAS,cAAEkgD,EAAevmD,YAAcz4L,KAAMq4L,IAAoBvwM,EAC1E,IAAIwtK,EAQJ,OALIA,Ed9RI,Yc6RJxtK,EAAQswM,OAAOlsK,SACNi1I,EAAIq9E,aAAenmD,EAAgB2mD,EAAgBlgD,EAEnD39B,EAAIq9E,aAAe1/C,EAGzBxpC,EAGX,UAAUx2H,EAAQw2H,GACd,MAAMxtK,EAAUM,KAAKN,QASrB,OAPYM,KAAK+4K,IAAM,IAAI,EAAIkS,IAAIv0I,EAAQ,CACvCo4H,QAAS5B,EACT6B,QAAS7B,EACT8B,WAAYtvK,EAAQsvK,WA/SH,IAgTjBC,SAAUvvK,EAAQuvK,SAhTD,MAsTzB,cACI,MAAM,IAAE8J,EAAG,QAAEr5K,GAAYM,KACnBg4P,EAAUj/E,EAAI1iJ,QAEpBr2B,KAAKi4P,gBAAkBj4P,KAAKm2P,WAAWp9E,EAAKr5K,EAAQsyM,WACpDhyM,KAAKqwM,WAAa6lD,GAAU8B,EAASh4P,KAAKi4P,gBAAiBv4P,EAAmBA,EAAQ2wM,YAEtF,MAAM6nD,EAAW,IAAI,GACrBA,EAAS79H,OAAOr6H,KAAKqwM,YAErB,MAAMJ,EAAgBvwM,EAAQ2wM,WAAWz4L,KACnCs4L,EAAgBxwM,EAAQywM,WAAWv4L,KAIzC,GAFA5X,KAAKm4P,gBAAkBloD,EAAgBC,EdhU/B,YckUJxwM,EAAQswM,OAAOlsK,SAAsB,CACrC,MAAMopI,EAAS8qF,EAAQ5B,aACvB4B,EAAQf,WAAW/pF,EAAS+iC,EAAgBC,GACpCgnD,WAAWhqF,EAAS+iC,EAAgBC,GAOhD,OAJAlwM,KAAKo4P,gBAAkBp4P,KAAKq4P,oBAAoBr4P,KAAKm2P,WAAWp9E,EAAKr5K,EAAQ4yM,YAC7EtyM,KAAKmwM,WAAa+lD,GAAU8B,EAASh4P,KAAKo4P,gBAAiB14P,EAAmBA,EAAQywM,YACtF+nD,EAAS79H,OAAOr6H,KAAKmwM,YAEd+nD,EAGX,oBAAoB7xD,GAChB,MAAM3mM,EAAUM,KAAKN,QACfshB,EAAOthB,EAAQsyM,UAAYtyM,EAAQ4yM,UAEzC,IAAK,IAAI5xM,EAAI2lM,EAAOvlM,OAAS,EAAGJ,GAAK,EAAGA,IAChCA,EAAIsgB,GAAS,GACbqlL,EAAOrsL,OAAOtZ,EAAG,GAIzB,OAAO2lM,EAGX,WAAWpvD,EAAMuqE,GACb,MAAM9hN,EAAUM,KAAKN,QAGfo3C,EAAQmgG,EAAKg4B,SAAWh4B,EAAK+3B,WACnC,IAAIspF,GAFU54P,EAAQkc,IAAMlc,EAAQ8J,KAEZg4M,EACpB16F,EAAMmwB,EAAK+3B,WACX57I,EAAO0jB,EAAQwhN,EALH54P,EAAQyc,UAQpB2qG,GAAOhwE,EACP1jB,GAAQA,GAGR0jB,GAAS,KAAQp3C,EAAQkc,IAAM4lM,GAAc,IAC7C82C,GAAa,GAGjB,MAAMv+C,EAAY,GAClB,IAAK,IAAIr5M,EAAI,EAAGA,EAAI43P,EAAW53P,IAC3Bq5M,EAAU12M,KAAK,GAAMyjH,EnZrXF,ImZsXnBA,GAAO1zF,EAOX,OAJI,GAAM0zF,IAAQmwB,EAAKg4B,UACnB8qC,EAAU12M,KAAKyjH,GAGZizF,EAGX,OAAO1uM,GACH,IAAIA,EAKA,OAAOrL,KAAK+4K,IAAIq9E,aAJhBp2P,KAAK+4K,IAAIk+E,WAAW5rP,GAAO6rP,WAAW7rP,GACtCrL,KAAKu4P,gBAAgBv4P,KAAKqwM,WAAWj/J,SAAUpxC,KAAKi4P,iBACpDj4P,KAAKu4P,gBAAgBv4P,KAAKmwM,WAAW/+J,SAAUpxC,KAAKo4P,iBAAiB,GAM7E,gBAAgB9gD,EAAO6+C,EAAY5+J,GAC/B,MAAMqsB,EAAOrsB,GAASv3F,KAAKm4P,iBAAwB,EACnD,IAAIH,EAAUh4P,KAAK+4K,IACnB,MAAM7L,EAAS8qF,EAAQ5B,aAEnB7+J,Gd1YI,Yc0YKv3F,KAAKN,QAAQswM,OAAOlsK,UAAiC,IAAT8/E,IACrDo0I,EAAUh4P,KAAK+4K,IAAI1iJ,QACnB2hO,EAAQf,WAAW/pF,EAAStpD,GAAMszI,WAAWhqF,EAAStpD,IAG1D,IAAK,IAAIljH,EAAI,EAAGA,EAAI42M,EAAMx2M,OAAQJ,IAAK,CACnC,MAAM83P,EAAWR,EAAQ1oF,QAAQ6mF,EAAWz1P,IACtCi6I,EAAW28D,EAAM52M,GAAGi6I,SACpB89G,EAAQD,EAASxtN,EAAI2vG,EAAS,GAAG1/D,SAASjwC,EAC1C0tN,EAAQF,EAASroN,EAAIwqG,EAAS,GAAG1/D,SAAS9qC,EAEhDmnK,EAAM52M,GAAGoX,WAAAA,IAAc,EAAIA,WAAYuxJ,UAAUovF,EAAOC,MAKpE90D,GAAkB,GAAa,CAC3Bp6L,IAAK,EACLoS,IAAK,IAELy0L,WAAY,CACRz4L,KAAM,GACN8jK,MdlaO,ScmaPhQ,MAAO/F,GACPv1H,MdvamB,GcwanBg8H,SAAS,GAGb+jC,WAAY,CACRv4L,KAAM,GACN8jK,Md1aO,Sc2aPhQ,MAAO/F,GACPv1H,Md/amB,GcgbnBg8H,SAAS,GAGb4C,YAAa,GACbC,SAAU,IAEV+gC,OAAQ,CACJlsK,SdpbO,ScqbP+/I,QAAS,KAIF,IAAA,GAAA,GC9bf,MAAM,WAA+B,EAAQ4jB,UACzC,YAAYhzJ,EAAS/0C,GACjBunD,MAAMxS,EAAS/0C,GAEf,MAAMo+N,EAAmB99N,KAAKN,QAE9Bo+N,EAAiB34D,SAAW57J,KAAKqS,IAAKrS,KAAK+mC,IAAIwtL,EAAiB66B,SAAW76B,EAAiB86B,UAAY96B,EAAiB34D,SAAY,IAAM,GAG/I,KAAKr+C,GACD,MAAMpnH,EAAUM,KAAKN,QACfo3C,EAAQ5O,GAAiBxoC,EAAQk5P,SAAUl5P,EAAQi5P,SAAU7xI,GAEnE9mH,KAAKy0C,QAAQ38B,UAAU,EAASA,YAAYqxJ,OAAOryH,EAAOp3C,EAAQg3C,UAI1EktJ,GAAkB,GAAwB,CACtC1jB,OfZW,SeaX/a,SfvBkB,Me0BtB,EAAQqwD,iBAAiBn/M,QAAQo/M,SfdV,gBecmC,IAE3C,IAAA,GAAA,GCrBf,MACQvqC,OAAM,GAAEnuE,MAAK,GAAEsuE,KAAI,IAAK,EAEhC,MAAM,WAAsB,GAExB,SAASv0I,GACL92C,KAAKozK,SAASt7J,UAAU,EAAIA,YAAYqxJ,OAAOryH,EAAO92C,KAAK02C,SAG/D,UACI,MAAM,MAAEmB,EAAK,QAAEn4C,GAAYM,KACrB44P,EAAW/gN,EAAM0tK,UAAU7lN,EAAQq0P,WACnC4E,EAAW9gN,EAAM0tK,UAAU7lN,EAAQ2L,QAEH,IAAlC3L,EAAQm0F,UAAU27D,YAClBxvJ,KAAK64P,SAASF,GAEd,IAAI,GAAuB34P,KAAKozK,SAAUguB,GAAW1hM,EAAQm0F,UAAW,CACpE+kK,SAAUA,EACVD,SAAUA,KACVrV,OAIZ,SACI,MAAM,MAAEzrM,EAAK,QAAEn4C,GAAYM,KACrBozK,EAAW,IAAI,GAerB,OAb0B,IAAtB1zK,EAAQm0F,WACRutG,GAAW1hM,EAAQm0F,UAAW,CAC1Bm7E,WAAY,EACZt4H,OAAQmB,EAAMkhI,IAAIriI,OAClBv6B,QAAS07B,EAAMn4C,QAAQyc,UAI/Bi3J,EAAS/4C,OAAOr6H,KAAK84P,gBAAiB94P,KAAK+4P,cAE3C/4P,KAAKozK,SAAWA,EAChBpzK,KAAK64P,SAASjH,IAEPx+E,EAGX,OAAO2F,GACH,MAAMriI,EAAS12C,KAAK02C,OAASqiI,EAAIriI,OAC3B51C,EAAS,GAAWd,KAAKN,QAAQoB,QAAU,EAAG,GAAK,KACnDosK,EAASltK,KAAKktK,OAAS6L,EAAIq9E,aAAet1P,EAC1Ck4P,EAAUh5P,KAAKg5P,QAAUzvP,KAAKw1B,MAAMmuI,EAASltK,KAAKN,QAAQu5P,IAAIrhP,MAEpE5X,KAAKisK,KAAO,EAAIqf,KAAK3gB,WAAW,IAAI,EAAI67B,MAAM9vJ,EAAO1L,EAAIguN,EAAStiN,EAAOvG,EAAI6oN,GACjD,IAAI,EAAIxyD,MAAM9vJ,EAAO1L,EAAIguN,EAAStiN,EAAOvG,EAAI6oN,IAG7E,gBACI,MAAM9oD,EAAgBlwM,KAAK63C,MAAMn4C,QAAQywM,WAAWv4L,KAC9C8+B,EAAS12C,KAAK02C,OACdwiN,EAAcl5P,KAAKN,QAAQgsK,MAE3BytF,EAAa,IAAI,GAAK,CACxBr7P,KAAM,CAAE4tK,MAAOwtF,GACfvsF,OAAQ,CAAEjB,MAAOwtF,EAAa9oN,MhB9Df,MgBsEnB,OALA+oN,EAAWhhF,OAAOzhI,EAAO1L,EAAIhrC,KAAKktK,OAASgjC,EAAex5J,EAAOvG,GACtDsnI,OAAO/gI,EAAO1L,EAAG0L,EAAOvG,EAAKnwC,KAAKg5P,QAAU,GAC5CvhF,OAAO/gI,EAAO1L,EAAG0L,EAAOvG,EAAKnwC,KAAKg5P,QAAU,GAC5Cv6P,QAEJ06P,EAGX,aACI,MAAMz5P,EAAUM,KAAKN,QACf05P,EAAW15P,EAAQu5P,IAAIvtF,OAAShsK,EAAQgsK,MACxC04C,EAAS,IAAI,EAAIl5B,OAAOlrL,KAAK02C,OAAQ12C,KAAKg5P,SAOhD,OALY,IAAI,GAAO50C,EAAQ,CAC3BtmN,KAAM,CAAE4tK,MAAO0tF,GACfzsF,OAAQ,CAAEjB,MAAO0tF,MAO7Bx1D,GAAkB,GAAe,CAC7Bq1D,IAAK,CACDrhP,KAxFS,KA0FbyhP,MAAO,CACHjpN,MAAO,GACPy5H,OAAQ,IAEZh2E,UAAW,CACPvwF,KhB1Fe,gBgB2Ff6hK,ShBvGc,OgB2GP,IAAA,GAAA,GCpGf,MAAM,GAAQ,EAAQpoD,MA8JtB6mF,GA5JA,cAA0B,GAEtB,OAAO33B,GACH,MAAMl2H,EAAW/1C,KAAK+1C,SACtB/1C,KAAK63C,MAAMgvJ,OAAO56B,GAClBjsK,KAAKs5P,iBAAmBt5P,KAAK63C,MAAMo0H,KAEnC,IAAK,IAAIvrK,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,OAAO7mM,KAAK63C,MAAMkhI,KAC9B/4K,KAAKs5P,iBAAmB,EAAIhuE,KAAKn0J,MAAMn3B,KAAKs5P,iBAAkBvjN,EAASr1C,GAAGurK,MAG9EjsK,KAAKu5P,SAASttF,GACdjsK,KAAKw5P,WAAWvtF,GAChBjsK,KAAK41P,aAAa51P,KAAK2yP,UAAW58M,EAAU/1C,KAAK63C,OACjD73C,KAAK61P,QAGT,aAAalD,EAAW58M,EAAU8B,GAC9B,MAAMmwJ,EAAUhoM,KAAKsyP,SAAW,IAAI,GAEpCtqD,EAAQ3tE,OAAOs4H,GACf3qD,EAAQ3tE,OAAOxiF,EAAMy/J,OACrBtP,EAAQ3tE,OAAOxiF,EAAMw5L,QACrBrxO,KAAKy5P,eAAe1jN,GACpBiyJ,EAAQ3tE,OAAOxiF,EAAM4+M,eAGzB,eAAe1gN,GACX,IAAK,IAAIr1C,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IAAK,CACtC,MAAM2V,EAAU0/B,EAASr1C,GACzB2V,EAAQ2vK,SACRhmL,KAAKsyP,SAASj4H,OAAOhkH,EAAQ+8J,UAE7B/8J,EAAQhL,MAAMgL,EAAQ3W,QAAQ2L,QAItC,SAAS4gK,GACL,MAAM8M,EAAM/4K,KAAK63C,MAAMkhI,IAEjB3lJ,EAAO7pB,KAAK+mC,IAAItwC,KAAK05P,QADP15P,KAAKs5P,iBACuBrtF,IAChD,IAEImyC,EAASu7C,EAASr6C,EAASjzL,EAAKutO,EAFhCpwP,EAAM,GAAM4pB,EtZ7CO,GsZ8CnBxX,EAAM,IAAOwX,EtZ9CM,GsZgDnBymO,EAAY,EACZn5P,EAAI,EAER,SAAOA,IAAM,OACTm5P,EAAaD,IAAYt6C,EAAYu6C,EAAY,EAAK,EAElDA,EAAY,IAIZrwP,IAAQ6iB,IACR+xL,EAAUp+M,KAAK85P,WAAWtwP,EAAKyiK,EAAM8M,GACjC,GAAKqlC,GAAWA,GAAW,IAK/BxiM,IAAQyQ,IACRizL,EAAUt/M,KAAK85P,WAAWl+O,EAAKqwJ,EAAM8M,GACjC,GAAKumC,GAAWA,GAAW,KAM/BjzL,EADA+xL,EAAU,GAAKkB,EAAU,EACb,EAAN91M,EACC40M,EAAU,GAAKkB,EAAU,EACpB,EAAN1jM,EAEA,IAAQpS,EAAMoS,GAAO,GAAM,EtZ7ElB,GsZgFnB+9O,EAAU35P,KAAK85P,WAAWztO,EAAK4/I,EAAM8M,GACjC,GAAK4gF,GAAWA,GAAW,KAI/BC,EAAUt6C,EAENq6C,EAAU,GACV/9O,EAAMyQ,EACNizL,EAAUq6C,IAEVnwP,EAAM6iB,EACN+xL,EAAUu7C,GAKtB,WAAWvmO,EAAM64I,EAAM8M,GACnB,MAAMlhI,EAAQ73C,KAAK63C,MACb9B,EAAW/1C,KAAK+1C,SAChBm3H,EAAS6L,EAAIq9E,aACb2D,EAAWhhF,EAAI1iJ,QAErB0jO,EAAS9C,WAAW/pF,EAAS95I,GAAM8jO,WAAWhqF,EAAS95I,GAEvDykB,EAAMkhI,IAAMghF,EACZliN,EAAMgvJ,OAAO56B,GACbjsK,KAAKg6P,SAAWniN,EAAMo0H,KAEtB,IAAK,IAAIvrK,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,OAAOkzD,GACnB/5P,KAAKg6P,SAAW,EAAI1uE,KAAKn0J,MAAMn3B,KAAKg6P,SAAUjkN,EAASr1C,GAAGurK,MAG9D,OAAOjsK,KAAK05P,QAAQ15P,KAAKg6P,SAAU/tF,GAGvC,QAAQguF,EAAS3/E,GACb,OAAO/wK,KAAKC,IAAI8wK,EAAIlqI,QAAU6pN,EAAQ7pN,QAASkqI,EAAIzQ,SAAWowF,EAAQpwF,UAG1E,WAAWoC,GACP,MAAMiuF,EAAgBl6P,KAAKg6P,SAAStjN,SAC9Bo3J,EAAY7hC,EAAKv1H,SACjByjN,EAAWD,EAAclvN,EAAI8iK,EAAU9iK,EACvCovN,EAAWF,EAAc/pN,EAAI29J,EAAU39J,GACvC,MAAE0H,EAAK,SAAE9B,GAAa/1C,KAE5B63C,EAAMkhI,IAAIriI,OAAO1L,GAAKmvN,EACtBtiN,EAAMkhI,IAAIriI,OAAOvG,GAAKiqN,EAEtBviN,EAAMgvJ,OAAO56B,GAEb,IAAK,IAAIvrK,EAAI,EAAGA,EAAIq1C,EAASj1C,OAAQJ,IACjCq1C,EAASr1C,GAAGmmM,OAAOhvJ,EAAMkhI,KACzB/4K,KAAKg6P,SAAW,EAAI1uE,KAAKn0J,MAAM0gB,EAAMo0H,KAAMl2H,EAASr1C,GAAGurK,MAI/D,eACI,MAAMvsK,EAAUM,KAAKN,QACfq2C,EAAWr2C,EAAQ0yP,QACnBv6M,EAAQ73C,KAAK63C,MAAQ,IAAI,GAAYn4C,EAAQm4C,MAAO73C,KAAKiyP,gBAE/DjyP,KAAK+1C,SAAW,GAEhB,MAAMskN,EAAc,GAAQtkN,GAAYA,EAAW,CAAEA,GACrD,IAAK,IAAIr1C,EAAI,EAAGA,EAAI25P,EAAYv5P,OAAQJ,IAAK,CACzC,MAAM2V,EAAU,IAAI,GAAcwhC,EAAOupJ,GAAW,GAAIi5D,EAAY35P,GAAI,CACpEmzF,UAAW,CACP27D,YAAa9vJ,EAAQ8vJ,gBAI7BxvJ,KAAK+1C,SAAS1yC,KAAKgT,MAKA,CAC3Bm5I,aAAa,EACbmjG,UAAW,CACP/oD,WAAY,MCjIpBhG,GApCA,cAAuB,GAEnB,gBACI,MAAM,IAAEp6L,EAAG,IAAEoS,EAAG,sBAAEm8O,EAAqB,aAAEuC,GAAiBt6P,KAAKN,QAE/D,MAAO,CAAE,CAAEsJ,KAAMQ,EAAKP,GAAI2S,EAAK8vJ,MAAOqsF,EAAuBxuE,QAAS+wE,IAG1E,YACI,OAAO,EAGX,sBAAsBxjN,GAClB,MAAMy3H,EAAWvuK,KAAKqxO,OAAOjgM,SAAS,GAAGm9H,WAErCvuK,KAAKN,QAAQyc,QACboyJ,EAASgsF,YAAYzjN,GAErBy3H,EAASisF,cAAc1jN,GAI/B,SAAS9tC,EAAMC,EAAIvJ,GACf,MAAMyc,EAAUnc,KAAKN,QAAQyc,QAEvB6yJ,EAAahvK,KAAKulN,UAAUppM,EAAUlT,EAAKD,GAC3CimK,EAAWjvK,KAAKulN,UAAUppM,EAAUnT,EAAOC,GAE3Co1B,EAAQr+B,KAAKmzB,YAAY67I,EAAYC,EAAUjvK,KAAK23P,iBAAkBj4P,GAI5E,OAFAM,KAAKqxO,OAAOh3G,OAAOh8F,GAEZA,IAIa,CACxB70B,IAAK,EACLoS,IAAK,IAELy0L,WAAY,CACRjkC,SAAS,GAGb+jC,WAAY,CACR/jC,SAAS,GAGb4jC,OAAQ,CACJ5jC,SAAS,GAGb4C,WAAY,EACZC,SAAU,IACVqrF,aAAc,UCnDlB,MAAM,WAA8B,EAAQ7yD,UACxC,YAAYhzJ,EAAS/0C,GACjBunD,MAAMxS,EAAS/0C,GAEf,MAAMo+N,EAAmB99N,KAAKN,QACxBylK,EAAY57J,KAAK+mC,IAAIwtL,EAAiB66B,SAAW76B,EAAiB86B,UAAY96B,EAAiB34D,SAAY,IACjH24D,EAAiB34D,SAAW,GAAWA,EnBZzB,ImBID,KAUb,MAAMs1F,EAAahmN,EAAQ2+H,SAAS1zK,QAAQuhB,IAAI,gBAC1CyqJ,EAAQj3H,EAAQimN,eAClBD,IAAe/uF,IACf1rK,KAAKy6P,WAAa,IAAI,GAAMA,GAC5Bz6P,KAAK0rK,MAAQ,IAAI,GAAMA,IAI/B,KAAK5kD,GACD,MAAM,QAAEpnH,EAAO,WAAE+6P,EAAU,MAAE/uF,GAAU1rK,KACjC82C,EAAQ5O,GAAiBxoC,EAAQk5P,SAAUl5P,EAAQi5P,SAAU7xI,GAGnE,GAFA9mH,KAAKy0C,QAAQqC,MAAMA,GAEf40H,EAAO,CACP,MAAMn6H,EAAI,GAAMrJ,GAAiBuyN,EAAWlpN,EAAGm6H,EAAMn6H,EAAGu1E,IAClD+X,EAAI,GAAM32F,GAAiBuyN,EAAW57H,EAAG6sC,EAAM7sC,EAAG/X,IAClD5nH,EAAI,GAAMgpC,GAAiBuyN,EAAWv7P,EAAGwsK,EAAMxsK,EAAG4nH,IAExD9mH,KAAKy0C,QAAQk4H,OAAO,IAAI,GAAMp7H,EAAGstF,EAAG3/H,GAAGm6L,WAKnDuK,GAAkB,GAAuB,CACrC1jB,OnB5BW,SmB6BX/a,SnBvCkB,MmB0CtB,EAAQqwD,iBAAiBn/M,QAAQo/M,SnB7BJ,qBmB6BmC,IAEjD,IAAA,GAAA,GC8Cf7xB,GArFA,cAA2B,GAEvB,UACI,MAAM,MAAE/rJ,EAAK,QAAEn4C,GAAYM,KACrB44P,EAAW/gN,EAAM0tK,UAAU7lN,EAAQq0P,WACnC4E,EAAW9gN,EAAM0tK,UAAU7lN,EAAQ2L,OAErCrL,KAAK6zF,WACL7zF,KAAK6zF,UAAU0oC,SAGmB,IAAlC78H,EAAQm0F,UAAU27D,aAClBxvJ,KAAK82C,MAAM6hN,GACX34P,KAAK2sK,OAAO3sK,KAAK06P,kBAEjB16P,KAAK6zF,UAAY,IAAI,GAAsB7zF,KAAMohM,GAAW1hM,EAAQm0F,UAAW,CAC3E+kK,SAAUA,EACVD,SAAUA,KAGd34P,KAAK6zF,UAAUyvJ,QAIvB,MAAMj4O,GACF,MAAMkjK,EAAWvuK,KAAKozK,SAAS7E,WAC3BvuK,KAAK63C,MAAMn4C,QAAQyc,QACnBoyJ,EAASisF,cAAcnvP,GAEvBkjK,EAASgsF,YAAYlvP,GAEzBrL,KAAK63C,MAAM8iN,sBAAsBtvP,GAGrC,OAAOA,GACHrL,KAAKozK,SAASzG,OAAOthK,GAGzB,SACI,GAAIrL,KAAKozK,SACL,OAGJ,MAAM,MAAEv7H,EAAK,QAAEn4C,GAAYM,MAED,IAAtBN,EAAQm0F,WACRutG,GAAW1hM,EAAQm0F,UAAW,CAC1Bm7E,WAAY,EACZt4H,OAAQmB,EAAMkhI,IAAIriI,OAClBv6B,QAAS07B,EAAMn4C,QAAQyc,UAI/Bnc,KAAKozK,SAAWv7H,EAAM+iN,SAAS/iN,EAAMn4C,QAAQ8J,IAAKxJ,KAAKN,QAAQ2L,MAAO,CAClEqgK,MAAO1rK,KAAK06P,eACZ5sF,QAASpuK,EAAQouK,QACjByb,QAAS1xI,EAAMn4C,QAAQ46P,eAI/B,eACI,MAAM,IAAE9wP,EAAG,IAAEoS,GAAQ5b,KAAK63C,MAAMn4C,SAC1B,OAAEwsC,EAAM,MAAEw/H,EAAK,MAAErgK,GAAUrL,KAAKN,QAChCiyF,EAAez2D,GAAS7vB,GAASA,EAAQ7B,EAE/C,GAAI0iC,EACA,IAAK,IAAIgB,EAAM,EAAGA,EAAMhB,EAAOprC,OAAQosC,IAAO,CAC1C,MAAQw+H,MAAOmvF,EAAU,KAAE7xP,EAAOQ,EAAG,GAAEP,EAAK2S,GAAQswB,EAAOgB,GAE3D,GAAIlkC,GAAQ2oF,GAAgBA,GAAgB1oF,EACxC,OAAO4xP,EAKnB,OAAOnvF,EAGX,SACI1rK,KAAKgmL,SAELhmL,KAAKisK,KAAOjsK,KAAKozK,SAASnH,SAIF,CAC5Bp4E,UAAW,CACPvwF,KpB/EqB,qBoBgFrB6hK,SpB7Fc,OqBAtB,MAGM21F,GAAO,+BAEPC,GAAS,QAAUD,GACnBE,GAAS,QAAUF,GAInB,GAAQ,KAAA,CACVjsD,KAAM,CACFxF,OAAQ,CACJj5J,MAAO,IAGf0uF,MAAO,CACHk8C,KAAM+/E,GACNl3E,QAAS,GAEbh2I,KAAM,CACF/sC,OAAQ,GACRsvC,MAAO,GAEXg8H,SAAS,IAiOP,GAAkB1sK,IAAAA,CACpB0sK,SAAS,EACT4jC,OAAQ,CACJh1B,KAxPO,qCA0PX+tB,QAASrpM,EAAQorM,UAAY,GAAK,CAC9B9P,SAAU,QAEdojC,KA3NqB,CACrBn2B,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,KAGhBx7J,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IA8MTmtF,UA3M0B,CAC1BhzD,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,KAGhBx7J,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IA8LTotF,kBA5M0B,CAC1BjzD,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,KAGhBx7J,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IA+LT29E,IA5LoB,CACpBxyB,IAzEY,IA0EZh9C,QAzEgB,IAoQhBowE,QAxLwB,CACxB8O,cAAe,GACfC,UAAW,GACX/xD,OAAQ,CACJ0vB,YAAa,GACb3oL,MAAO,GAEX8qL,UA5EU,OA6EVjC,IAAK,EACLhxB,UAAW,CACPoB,OAAQ,CACJv7B,QAAS,EACT19H,MAAO,GAEXosL,SAAU,CACNpsL,MAAO,GAEX1K,KAAM,CACF0K,MAAO,GAEXsrL,OAAQ,CACJtrL,MAAO,IAGf1K,KAAM,CACF0K,MAAO,GAEXsrL,OAAQ,CACJtrL,MAAO,GAEX6rI,QAAS,GACTugD,SAAU,CACNpsL,MAAO,IAyJX87M,OArJuB,CACvB7iD,OAAQ,CACJj5J,MAAO,GAEX4/J,OAAQ,CACJpG,WA/GY,eAiHhB97B,QAAS,IA+IT+wD,OA5IuB,CACvB5F,IA5HY,IA6HZh9C,QA5HgB,GA6HhBp4I,OAAQ,CACJ6nI,MAAO,YAyIXygF,YArI4B,CAC5B9iD,OAAQ,CACJ0vB,YAAa,GACb3oL,MAAO,GAEX8qL,UAhIU,OAiIVjC,IAAK,EACLhxB,UAAW,CACPoB,OAAQ,CACJv7B,QAAS,EACT19H,MAAO,GAEXvC,KAAM,CACFuC,MAAO,IAGfvC,KAAM,CACF69H,MAlJM,OAmJNt7H,MAAO,GAEX6rI,QAAS,IAkHTyvE,OA/GuB,CACvBzyB,IA3JY,IA4JZh9C,QA3JgB,IAyQhB4vE,IA3CoB,CACpB77C,OAAQ,CACJpG,WAAY,GACZl+B,MAAO,GACPmY,QAAS,CACL50D,IAAK,EACLg8C,OAAQ,EACRt5H,KAAM,EACNC,MAAO,KAoCfk6M,MA5GsB,CACtB7iD,OAAQ,GA4GRoyD,OAhCuB,CACvBrrD,OAAQ,CACJpG,WAAY,GACZl+B,MAAO,GACPmY,QAAS,CACL50D,IAAK,EACLg8C,OAAQ,EACRt5H,KAAM,EACNC,MAAO,KAyBf0pN,oBAvD0B,CAC1BriC,IAAK,GACLprL,KAAM,CACF69H,MAvNM,OAwNNt7H,MAAO,GAEX6rI,QA3NgB,IA6QhBpuI,KA3GqB,CACrBuC,MAAO,GA2GPohK,MAAO,KACP46C,KAzGqB,CACrBnzB,IAAK,EACLhxB,UAAW,CACPp6J,KAAM,CACFigI,QAAS,EACT19H,MAAO,IAGfvC,KAAM,CACFuC,MAAO,GAEX6rI,QAAS,IA+FTwwE,UA5F0B,CAC1B5+M,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IAoFT4+E,UAjF0B,CAC1B/5B,QAAS,CACLvmD,SAAS,GAEbh8H,MAAO,GA8EPm8M,UA9F0B,CAC1B1+M,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IAsFT0+E,UAnF0B,CAC1B75B,QAAS,CACLvmD,SAAS,GAEbh8H,MAAO,GAgFPmrN,SA7EyB,CACzBtiC,IAzMY,IA0MZh9C,QAzMgB,IAqRhB0vE,YAzE4B,CAC5B1yB,IA9MY,IA+MZh9C,QA9MgB,IAsRhBgwE,YArE4B,CAC5B77M,MAAO,GAqEP27M,aAlPqB,CACrB9jD,UAAW,CACP0qB,QAAS,CACLtpB,OAAQ,KAGhBx7J,KAAM,CACFigI,QAAS,EACT19H,MAAO,GAEXuiL,QAAS,CACL/6M,KAAM,EACNw0J,SAAS,GAEb0B,QAAS,IAqOT0tF,gBA5MwB,CACxBL,cAAe,GACfC,UAAW,GACX/xD,OAAQ,CACJ0vB,YAAa,GACb3oL,MAAO,GAEX8qL,UA5EU,OA6EVjC,IAAK,EACLhxB,UAAW,CACPoB,OAAQ,CACJv7B,QAAS,EACT19H,MAAO,GAEXosL,SAAU,CACNpsL,MAAO,GAEX1K,KAAM,CACF0K,MAAO,GAEXsrL,OAAQ,CACJtrL,MAAO,IAGf1K,KAAM,CACF0K,MAAO,GAEXsrL,OAAQ,CACJtrL,MAAO,GAEX6rI,QAAS,GACTugD,SAAU,CACNpsL,MAAO,IA6KXk8M,eA/JuB,CACvBrzB,IA5HY,IA6HZh9C,QA5HgB,GA6HhBp4I,OAAQ,CACJ6nI,MAAO,YA4JXkgF,aAxHqB,CACrBx7M,MAAO,GAwHPu8M,UAtE0B,CAC1B1zB,IAAK,GACLprL,KAAM,CACF69H,MAvNM,OAwNNt7H,MAAO,GAEX6rI,QA3NgB,MAwSPw/E,GAAY,CAAC/7P,EAAU,MAAA,CAChCqlP,aA/QuB,CACvB/0C,OAAQ,CACJh1B,KAAM+/E,IAEVvpD,MAAO,KACP94F,MAAO,CACHsiE,KAAMggF,GACN/xD,OAAQ,IAyQZqkB,aAAc,CACV5Z,eAAgB,CACZtnC,SAAS,IAGjBn3H,UAAW,CACP+9J,KAAM,CACFnpC,OAAQ,GACRo/B,OAAQ,CACJh6E,IAAK,MAIjBgqH,eAAgB,GAAev5O,GAC/Bg5G,MA1BgB,CAChBsiE,KAAMggF,IA0BNv4B,OAvBiB,CACjBzyB,OAAQ,CACJh1B,KAAM+/E,OCrSR,GAAQ,CAAC97P,EAAGC,IAAOuT,GAAMvT,EAAED,EAAEwT,IAE7B,GAAO,CAACk+B,EAAIyQ,EAAO7wB,IACrBogB,EAAG+C,kBAAoB/C,EAAG+C,iBAAiB0N,EAAO7wB,GAEhD6wJ,GAAS,CAACzwI,EAAIyQ,EAAO7wB,IACvBogB,GAAMA,EAAGiD,qBAAuBjD,EAAGiD,oBAAoBwN,EAAO7wB,GAE5D,GAAO,OAEP,GAAiB9d,GAAKA,EAAEkuC,iBAExB+6M,GAAc,QAMpB,SAASC,GAAelpP,GACpB,OAAIA,EAAEnP,KAAKvD,MAAM27P,IACN,CACHr5E,MAAO5vK,EAAEspC,eAAe,GAAGsmI,MAC3BC,MAAO7vK,EAAEspC,eAAe,GAAGumI,MAC3B7pI,QAAShmC,EAAEspC,eAAe,GAAGtD,QAC7BC,QAASjmC,EAAEspC,eAAe,GAAGrD,QAC7Bp1C,KAAMmP,EAAEnP,KACRsgL,cAAenxK,EACfwoC,SAAS,GAIV,CACHonI,MAAO5vK,EAAE4vK,MACTC,MAAO7vK,EAAE6vK,MACT7pI,QAAShmC,EAAEgmC,QACXC,QAASjmC,EAAEimC,QACXmuL,QAASp0N,EAAEo0N,QACXE,QAASt0N,EAAEs0N,QACXzjO,KAAMmP,EAAEnP,KACRgxH,QAAS7hH,EAAE6hH,QACXE,SAAU/hH,EAAE+hH,SACZH,OAAQ5hH,EAAE4hH,OACVuvD,cAAenxK,GA8KR,IAAA,GA1KR,YAAMmpP,EACT,6BACI,MAA0B,oBAAX7pN,QAA2BA,OAAO+I,aAGrD,eACI,OAAO96C,KAAK2qL,SACV3qL,KAAK2qL,SAASh2I,cACd3C,SAGN,aAAY,MAAE6jM,EAAQ,GAAI,KAAE6O,EAAO,GAAI,QAAEmX,EAAU,GAAI,UAAEC,GAAY,IACjE97P,KAAK+7P,cAAgB,GAAMJ,GAAgB9lB,GAC3C71O,KAAKg8P,aAAe,GAAML,GAAgBjX,GAC1C1kP,KAAKi8P,gBAAkB,GAAMN,GAAgBE,GAC7C77P,KAAKk8P,cAAe,EACpBl8P,KAAKm8P,WAAaL,EAElB97P,KAAKo8P,YAAe3pP,IACS,IAArBA,EAAEopC,QAAQ/6C,QACVd,KAAK+7P,cAActpP,IAI3BzS,KAAKq8P,WAAc5pP,IACU,IAArBA,EAAEopC,QAAQ/6C,QACVd,KAAKg8P,aAAavpP,IAI1BzS,KAAKs8P,UAAa7pP,IAGW,IAArBA,EAAEopC,QAAQ/6C,QAA4C,IAA5B2R,EAAEspC,eAAej7C,SAC3Cd,KAAKi8P,gBAAgBxpP,GACrBzS,KAAKk8P,cAAe,EACpBphP,WAAW9a,KAAKu8P,cAlEH,OAsErBv8P,KAAKu8P,cAAgB,KACjBv8P,KAAKk8P,cAAe,GAGxBl8P,KAAKw8P,WAAc/pP,IACf,MAAM,MAAEknC,GAAUlnC,EAEbknC,GAASA,EAAQ,GAAM35C,KAAKk8P,eAIjC,GAAKl8P,KAAKgyC,SAAU,YAAahyC,KAAKkjL,YACtC,GAAKljL,KAAKgyC,SAAU,UAAWhyC,KAAKy8P,UACpCz8P,KAAK+7P,cAActpP,KAGvBzS,KAAKkjL,WAAczwK,IACfzS,KAAKg8P,aAAavpP,IAGtBzS,KAAKy8P,SAAYhqP,IACb2uK,GAAOphL,KAAKgyC,SAAU,YAAahyC,KAAKkjL,YACxC9B,GAAOphL,KAAKgyC,SAAU,UAAWhyC,KAAKy8P,UACtCz8P,KAAKi8P,gBAAgBxpP,IAGzBzS,KAAK08P,aAAgBjqP,IACbA,EAAEkqP,WAA0B,IAAblqP,EAAEinC,SACjB,GAAK15C,KAAKgyC,SAAU,cAAehyC,KAAK48P,cACxC,GAAK58P,KAAKgyC,SAAU,YAAahyC,KAAK68P,YACtC,GAAK78P,KAAKgyC,SAAU,gBAAiBhyC,KAAK68P,YAC1C,GAAK78P,KAAKgyC,SAAU,cAAe,IAEnChyC,KAAK+7P,cAActpP,KAI3BzS,KAAK48P,aAAgBnqP,IACbA,EAAEkqP,WACF38P,KAAKg8P,aAAavpP,IAI1BzS,KAAK68P,WAAcpqP,IACXA,EAAEkqP,YACFv7E,GAAOphL,KAAKgyC,SAAU,cAAehyC,KAAK48P,cAC1Cx7E,GAAOphL,KAAKgyC,SAAU,YAAahyC,KAAK68P,YACxCz7E,GAAOphL,KAAKgyC,SAAU,gBAAiBhyC,KAAK68P,YAC5Cz7E,GAAOphL,KAAKgyC,SAAU,cAAe,IAErChyC,KAAKi8P,gBAAgBxpP,KAKjC,OAAOgiC,GACCA,IAAYz0C,KAAK2qL,WAIjB3qL,KAAK2qL,UACL3qL,KAAK88P,qBAGT98P,KAAK2qL,SAAWl2I,EAChBz0C,KAAK+8P,kBAGT,iBACI,MAAMtoN,EAAUz0C,KAAK2qL,SAEjB3qL,KAAKg9P,eACL,GAAKvoN,EAAS,cAAez0C,KAAK08P,eAItC,GAAKjoN,EAAS,YAAaz0C,KAAKw8P,YAE3Bx8P,KAAKm8P,aACN,GAAK1nN,EAAS,aAAcz0C,KAAKo8P,aACjC,GAAK3nN,EAAS,YAAaz0C,KAAKq8P,YAChC,GAAK5nN,EAAS,WAAYz0C,KAAKs8P,aAIvC,qBACI,MAAM7nN,EAAUz0C,KAAK2qL,SAErB,GAAI3qL,KAAKg9P,eAML,OALA57E,GAAO3sI,EAAS,cAAez0C,KAAK08P,cACpCt7E,GAAOphL,KAAKgyC,SAAU,cAAehyC,KAAK48P,cAC1Cx7E,GAAOphL,KAAKgyC,SAAU,YAAahyC,KAAK68P,YACxCz7E,GAAOphL,KAAKgyC,SAAU,cAAe,SACrCovI,GAAOphL,KAAKgyC,SAAU,gBAAiBhyC,KAAK68P,YAIhDz7E,GAAO3sI,EAAS,YAAaz0C,KAAKw8P,YAE7Bx8P,KAAKm8P,aACN/6E,GAAO3sI,EAAS,aAAcz0C,KAAKo8P,aACnCh7E,GAAO3sI,EAAS,YAAaz0C,KAAKq8P,YAClCj7E,GAAO3sI,EAAS,WAAYz0C,KAAKs8P,YAIzC,eACI,OAAQt8P,KAAKm8P,YAAcP,EAAUqB,sBAGzC,QAAO,MAAEpnB,EAAQ,GAAI,KAAE6O,EAAO,GAAI,QAAEmX,EAAU,GAAI,UAAEC,GAAY,IAC5D97P,KAAK+7P,cAAgB,GAAMJ,GAAgB9lB,GAC3C71O,KAAKg8P,aAAe,GAAML,GAAgBjX,GAC1C1kP,KAAKi8P,gBAAkB,GAAMN,GAAgBE,GAC7C77P,KAAKm8P,WAAaL,EAGtB,UACI97P,KAAK88P,qBACL98P,KAAK2qL,SAAW,aAQxBixE,EAAU14H,QAAU04H,KAvKb,GCzCA,SAASsB,GAAUr5N,EAAQ0lD,EAAW7pF,EAASorD,GAKlD,OAJIhmC,EAAWplB,KACXorD,EAAiBprD,EACjBA,OAAUwW,GAEV40C,EACOoyM,GAAUr5N,EAAQ0lD,EAAW7pF,GAASwoD,KAAK,EAAIz0C,GAAQ+J,EAAQ/J,GAAQq3C,KAAkBr3C,GAAQq3C,EAAer3C,KAEpH,IAAI,EAAW8zC,KAY1B,SAAS41M,EAAkBC,EAAW7zK,EAAW/1C,EAAS+T,EAAY7nD,GAClE,IAAIsmD,EACJ,GA+BJ,SAAuBo3M,GACnB,OAAOA,GAAmD,mBAA/BA,EAAU1pN,kBAA4E,mBAAlC0pN,EAAUxpN,oBAD7F,CA/BsBwpN,GAAY,CAC1B,MAAMxvP,EAASwvP,EACfA,EAAU1pN,iBAAiB61C,EAAW/1C,EAAS9zC,GAC/CsmD,EAAc,IAAMp4C,EAAOgmC,oBAAoB21C,EAAW/1C,EAAS9zC,QAElE,GAuBT,SAAmC09P,GAC/B,OAAOA,GAAqC,mBAAjBA,EAAU35M,IAA8C,mBAAlB25M,EAAUz5M,IAD/E,CAvBuCy5M,GAAY,CAC3C,MAAMxvP,EAASwvP,EACfA,EAAU35M,GAAG8lC,EAAW/1C,GACxBwS,EAAc,IAAMp4C,EAAO+1C,IAAI4lC,EAAW/1C,QAEzC,GAeT,SAAiC4pN,GAC7B,OAAOA,GAA8C,mBAA1BA,EAAUC,aAAkE,mBAA7BD,EAAUE,eADxF,CAfqCF,GAAY,CACzC,MAAMxvP,EAASwvP,EACfA,EAAUC,YAAY9zK,EAAW/1C,GACjCwS,EAAc,IAAMp4C,EAAO0vP,eAAe/zK,EAAW/1C,OAEpD,CAAA,IAAI4pN,IAAaA,EAAUt8P,OAM5B,MAAM,IAAInB,UAAU,wBALpB,IAAK,IAAIe,EAAI,EAAGyC,EAAMi6P,EAAUt8P,OAAQJ,EAAIyC,EAAKzC,IAC7Cy8P,EAAkBC,EAAU18P,GAAI6oF,EAAW/1C,EAAS+T,EAAY7nD,GAMxE6nD,EAAWroC,IAAI8mC,GAzBnB,CAH0BniB,EAAQ0lD,GAAAA,SART92E,GAET80C,EAAWjsB,KADXhzB,UAAUxH,OAAS,EACH8T,MAAM3T,UAAUiD,MAAMwP,KAAKpL,WAG3BmK,KAGsB80C,EAAY7nD,KCXlE,MAAM69P,GAAsB,IAA0B,oBAAbvrN,SAEnCwrN,GAAY,CAACC,EAAct3J,EAASu3J,GAAkB,WAA2C,IAA1Bv3J,EAAQs3J,IAC/Et3J,EAAQs3J,GAAcE,iBAAoBD,GAC5Cv3J,EAAQs3J,GAAcrpK,gBAAkB+R,EAAQs3J,GAAc9rK,cAE5DisK,GAAa,CAACC,EAAe13J,EAASu3J,GAAkB,IAASG,EAAcj3N,KAAKn8B,GAAQ+yP,GAAU/yP,EAAM07F,EAASu3J,IAErHI,GAAgBC,GAAYA,GAAWA,EAAQ50M,UAAUroD,OAAS,EAElEk9P,GAAO,KACT,IAAI1vO,EAAK,GACT,IAAK,IAAI5tB,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,MAAMub,EAAyB,GAAhB1S,KAAK0S,SAAgB,EAC1B,IAANvb,GAAiB,KAANA,GAAkB,KAANA,GAAkB,KAANA,IACnC4tB,GAAM,KAGVA,IAAa,KAAN5tB,EAAW,EAAW,KAANA,EAAqB,EAATub,EAAa,EAAKA,GAASlD,SAAS,IAE3E,OAAOuV,sBAGL2vO,EACF,YAAYxpN,EAASk/D,GACjB3zG,KAAKy0C,QAAUA,EACfz0C,KAAK2zG,OAASA,EACd3zG,KAAKk+P,YAAa,EAClBl+P,KAAKm+P,WAAa,IAAI,GACtBn+P,KAAKo+P,UAAY,IAAI,GACrBp+P,KAAKq+P,aAAe,IAAI,GAE5B,WACIr+P,KAAKs+P,kBAET,YAAYn4J,GACJq3J,GAAU,aAAcr3J,IACxBnmG,KAAKs+P,kBAGb,cACIt+P,KAAKu+P,mBAET,kBACQhB,OACAv9P,KAAKu+P,mBACDv+P,KAAKk+P,aACLl+P,KAAKw+P,UAAY,IAAI,GAAU,CAC3B9Z,KAAOjyO,GAAMzS,KAAKo+P,UAAU9iO,KAAK7oB,GACjCojO,MAAQpjO,GAAMzS,KAAKm+P,WAAW7iO,KAAK7oB,GACnCopP,QAAUppP,GAAMzS,KAAKq+P,aAAa/iO,KAAK7oB,KAE3CzS,KAAK2zG,OAAO1E,kBAAkB,IAAMjvG,KAAKw+P,UAAUC,OAAOz+P,KAAKy0C,QAAQiiD,kBAInF,mBACQ12F,KAAKw+P,YACLx+P,KAAKw+P,UAAUrlN,UACfn5C,KAAKw+P,UAAY,cAI7BP,EAAmB5sM,UAAO,SAAoClyD,GAAK,OAAO,IAAKA,GAAK8+P,GAAoB,GAAyB,IAAoB,GAAyB,MAC9KA,EAAmBptM,UAAO,GAAyB,CAAEvtD,KAAM26P,EAAoBpnM,UAAW,CAAC,CAAC,GAAI,iBAAkB,KAAMtB,OAAQ,CAAE2oM,WAAY,cAAgB1oM,QAAS,CAAE2oM,WAAY,aAAcC,UAAW,YAAaC,aAAc,gBAAkBtnM,SAAU,CAAC,2BA8BhQ2nM,UAENA,EAAgBztM,UAAO,GAAwB,CAAE3tD,KAAMo7P,IACvDA,EAAgBpvM,UAAO,GAAwB,CAAEZ,QAAS,SAAiCvvD,GAAK,OAAO,IAAKA,GAAKu/P,IAAuBh3N,QAAS,CAAC,CAAC,4BAe7Ii3N,EACF,YAAYlqN,EAASk/D,EAAQn6C,GACzBx5D,KAAKy0C,QAAUA,EACfz0C,KAAK2zG,OAASA,EACd3zG,KAAKw5D,SAAWA,EAChBx5D,KAAK0jD,OAAS,GAElB,WACI,IAAK1jD,KAAKy0C,UAAYz0C,KAAKy0C,QAAQiiD,cAC/B,OAEJ,MAAMhzC,EAAS1jD,KAAK0jD,OACpB1jD,KAAK2mD,cAAgB,GACrB3mD,KAAK2zG,OAAO1E,kBAAkB,KAC1B,IAAK,IAAIxkG,KAAQi5C,EACTA,EAAO1qC,eAAevO,IACtBzK,KAAK2mD,cAActjD,KAAKrD,KAAKw5D,SAAS8wB,OAAOtqF,KAAKy0C,QAAQiiD,cAAejsF,EAAMzK,KAAKujF,MAAQ7/B,EAAOj5C,GAAMmuB,KAAK54B,KAAKujF,OAAS7/B,EAAOj5C,OAKnJ,cACI,GAAIzK,KAAK2mD,cAAe,CACpB,IAAK,IAAIzZ,EAAM,EAAGA,EAAMltC,KAAK2mD,cAAc7lD,OAAQosC,IAC/CltC,KAAK2mD,cAAczZ,KAEvBltC,KAAK2mD,cAAgB,cAIjCg4M,EAA8BttM,UAAO,SAA+ClyD,GAAK,OAAO,IAAKA,GAAKw/P,GAA+B,GAAyB,IAAoB,GAAyB,IAAgB,GAAyB,MACxPA,EAA8B9tM,UAAO,GAAyB,CAAEvtD,KAAMq7P,EAA+B9nM,UAAW,CAAC,CAAC,GAAI,4BAA6B,KAAMtB,OAAQ,CAAE7R,OAAQ,CAAC,4BAA6B,UAAW6/B,MAAO,gCA0BrNq7K,UAENA,EAAa3tM,UAAO,GAAwB,CAAE3tD,KAAMs7P,IACpDA,EAAatvM,UAAO,GAAwB,CAAEZ,QAAS,SAA8BvvD,GAAK,OAAO,IAAKA,GAAKy/P,YAU3G,MAAM,GACF,YAAYC,GACR7+P,KAAK6+P,mBAAqBA,EAC1B7+P,KAAK8rL,OAAS,IAAI,GAClB9rL,KAAK8+P,cAAe,EACpB9+P,KAAKm+C,MAAQ,EAEjB,WAAWvmC,EAAO5X,KAAK+6K,WACnB/6K,KAAK++P,UAAYnnP,EAAKw4B,MACtBpwC,KAAKg/P,WAAapnP,EAAKiyJ,OACvB7pK,KAAK8+P,cAAe,EAExB,eACSvB,MAGc,IAAfv9P,KAAKm+C,QACLn+C,KAAKm+C,MAAQ,EAEbn+C,KAAK6+P,mBAAmBp1M,SAASzpD,KAAMA,KAAK21C,OAGpD,UACI31C,KAAK6+P,mBAAmB3kO,OAAOl6B,MAEnC,YACI,IAAKA,KAAK2wH,cACN,OAEJ,MAAM,MAAEvgF,EAAK,OAAEy5H,GAAW7pK,KAAK+6K,UAE/B,OADiB3qI,IAAUpwC,KAAK++P,WAAal1F,IAAW7pK,KAAKg/P,gBAC7D,GAGAh/P,KAAK++P,UAAY3uN,EACjBpwC,KAAKg/P,WAAan1F,EAClB7pK,KAAK8+P,cAAe,EACpB9+P,KAAK8rL,OAAOvzI,QACL,GAEX,WACI,MAAM3gC,EAAO5X,KAAK+6K,UAClB/6K,KAAK++P,UAAYnnP,EAAKw4B,MACtBpwC,KAAKg/P,WAAapnP,EAAKiyJ,OAE3B,UACI,IAAIz5H,EAAQ,EACRy5H,EAAS,EAKb,OAJI7pK,KAAK2wH,gBACLk5C,EAAS7pK,KAAK2wH,cAAciqD,aAC5BxqI,EAAQpwC,KAAK2wH,cAAcgqD,aAExB,CAAE9Q,OAAAA,EAAQz5H,MAAAA,IAKzB,MAAMw9M,GAAMnhN,IACR,MAAMkE,EAAKqB,SAASI,cAAc,OAElC,OADAzB,EAAGlE,MAAM2xC,QAAU3xC,EACZkE,GAGLsuN,GAAa,8HAInB,MAAM,WAA4B,GAC9B,YAAYJ,EAAoBpqN,EAASk/D,GACrC1sD,MAAM43M,GACN7+P,KAAKy0C,QAAUA,EACfz0C,KAAK2zG,OAASA,EAElB,eACuB,IAAf3zG,KAAKm+C,MAMT8I,MAAMi4M,eALGl/P,KAAK6+P,mBAAmBM,YAAYn/P,OACrCA,KAAK6+P,mBAAmBp1M,SAASzpD,KAAMA,KAAKo/P,WAMxD,UAKI,GAJAn4M,MAAM9N,UACFn5C,KAAKwmD,cACLxmD,KAAKwmD,aAAaR,cAElBhmD,KAAK1B,OAAQ,CACb,MAAMm2C,EAAUz0C,KAAKy0C,QAAQiiD,cAC7BjiD,EAAQw0B,YAAYjpE,KAAK1B,QACzBm2C,EAAQw0B,YAAYjpE,KAAK0kM,QACzB1kM,KAAK1B,OAAO2qE,YAAYjpE,KAAKq/P,aAC7Br/P,KAAK1B,OAAS0B,KAAKq/P,YAAcr/P,KAAK0kM,OAAS1kM,KAAKy0C,QAAU,MAGtE,YACI,GAAIwS,MAAMm4M,YAEN,OADAp/P,KAAKyhD,SACE,EAGf,OACI,MAAMkvE,EAAgB3wH,KAAK2wH,cAAgB3wH,KAAKy0C,QAAQiiD,cAAci6B,cACtB,WAzCnB4wD,iBAyCZ5wD,EAzCmC,MAAM2uI,iBAyC1B,cAC5B3uI,EAAclkF,MAAM3I,SAAW,YAEnC9jC,KAAKm+C,MAAQ,EACbn+C,KAAKgmL,SACLhmL,KAAKyhD,QACLzhD,KAAKu/P,WACLv/P,KAAKsoD,YAET,SACI,MAAM7T,EAAUz0C,KAAKy0C,QAAQiiD,cAC7BjiD,EAAQhI,MAAM2xC,QAAU6gL,GACxBxqN,EAAQyrB,aAAa,MAAO,OAC5BlgE,KAAK1B,OAASsvP,GAAIqR,IAClBj/P,KAAKq/P,YAAczR,GApDA,wDAqDnB5tP,KAAK1B,OAAO2pE,YAAYjoE,KAAKq/P,aAC7B5qN,EAAQwzB,YAAYjoE,KAAK1B,QACzB0B,KAAK0kM,OAASkpD,GAAIqR,IAClB,MAAMO,EAAc5R,GAvDD6R,kFAwDnBz/P,KAAK0kM,OAAOz8H,YAAYu3L,GACxB/qN,EAAQwzB,YAAYjoE,KAAK0kM,QAE7B,QACI,MAAM26D,EAAcr/P,KAAKq/P,YACzBA,EAAY5yN,MAAM2D,MAAQ,WAC1BivN,EAAY5yN,MAAMo9H,OAAS,WAC3B,MAAMvrK,EAAS0B,KAAK1B,OACpBA,EAAO4jL,WAAa,IACpB5jL,EAAO0jL,UAAY,IACnB,MAAM0iB,EAAS1kM,KAAK0kM,OACpBA,EAAOxiB,WAAa,IACpBwiB,EAAO1iB,UAAY,IAEvB,YACIhiL,KAAK2zG,OAAO1E,kBAAkB,KAC1BjvG,KAAKwmD,aAAehqB,EAAM0gO,GAAUl9P,KAAK0kM,OAAQ,UAAWw4D,GAAUl9P,KAAK1B,OAAQ,WAC9EgqD,UAAU,KACXtoD,KAAKo/P,iBAMrB,MAAMM,GAAyC,oBAAnBC,eAI5B,MAAMC,WAA8B,GAChC,YAAYf,EAAoBpqN,EAASk/D,GACrC1sD,MAAM43M,GACN7+P,KAAKy0C,QAAUA,EACfz0C,KAAK2zG,OAASA,EAElB,mBACI,OAAO+rJ,GAEX,UACIz4M,MAAM9N,UACFn5C,KAAK6/P,iBACL7/P,KAAK6/P,eAAeC,aACpB9/P,KAAK6/P,eAAiB,MAE1B7/P,KAAK2wH,cAAgB,KAEzB,OACI3wH,KAAK2wH,cAAgB3wH,KAAKy0C,QAAQiiD,cAAci6B,cAChD3wH,KAAKu/P,WACLv/P,KAAKm+C,MAAQ,EACbn+C,KAAK2zG,OAAO1E,kBAAkB,KAC1BjvG,KAAK6/P,eAAiB,IAAIF,eAAe,KACrC3/P,KAAKo/P,cAETp/P,KAAK6/P,eAAehmI,QAAQ75H,KAAK2wH,qCASvCovI,EACF,YAAYpsJ,GACR3zG,KAAK2zG,OAASA,EACd3zG,KAAK8kK,UAAY,GACjB9kK,KAAKggQ,gBAAkB1jP,QAAQpU,QAAQ,MACvClI,KAAKm6B,MAAQn6B,KAAKm6B,MAAMvB,KAAK54B,MAEjC,SAASkkE,EAAUnmC,GACf/9B,KAAK8kK,UAAUzhK,KAAK,CAAE6gE,SAAAA,EAAUnmC,OAAAA,IAC3B/9B,KAAKwmD,cACNxmD,KAAK2zG,OAAO1E,kBAAkB,KAC1BjvG,KAAKwmD,aAAe,EAAKxmD,KAAKggQ,iBACzB13M,UAAUtoD,KAAKm6B,SAIhC,YAAY+pC,GACR,OAAOk+H,QAAQpiM,KAAK8kK,UAAU3sI,KAAK8nB,GAAQA,EAAKikB,WAAaA,IAEjE,OAAOA,GACH,MAAM4gG,EAAY9kK,KAAK8kK,UACjBlvI,EAAQkvI,EAAUhkK,OACxB,IAAK,IAAIosC,EAAM,EAAGA,EAAMtX,EAAOsX,IAC3B,GAAI43H,EAAU53H,GAAKg3B,WAAaA,EAK5B,OAJA4gG,EAAU9qJ,OAAOkzB,EAAK,QACjB43H,EAAUhkK,QACXd,KAAKgmD,eAMrB,cACIhmD,KAAKgmD,cAET,cACQhmD,KAAKwmD,eACLxmD,KAAKwmD,aAAaR,cAClBhmD,KAAKwmD,aAAe,MAG5B,QACIxmD,KAAK8kK,UAAUxlK,QAAQ2gD,IACnBA,EAAKliB,OAAOrqB,KAAKusC,EAAKikB,YAE1BlkE,KAAK8kK,UAAY,GACjB9kK,KAAKgmD,sBAGb+5M,EAAmB1uM,UAAO,SAAoClyD,GAAK,OAAO,IAAKA,GAAK4gQ,GAAoB,GAAgB,MACxHA,EAAmB1wM,WAAQ,GAA0B,CAAErB,MAAO+xM,EAAoBrxM,QAASqxM,EAAmB1uM,iCAmBxG4uM,EACF,YAAYpB,EAAoBpqN,EAASk/D,GAMrC3zG,KAAKkgQ,UAbc,GAiBnBlgQ,KAAK8rL,OAAS,IAAI,GAClB,MAAMq0E,EAAcP,GAAsBQ,YAAcR,GAAwB,GAChF5/P,KAAKqgQ,cAAgB,IAAIF,EAAYtB,EAAoBpqN,EAASk/D,GAElE3zG,KAAKwmD,aAAexmD,KAAKqgQ,cAAcv0E,OAClC5jI,KAAKo9G,GAFW,KAAQtlK,KAAKkgQ,WApBf,MAuBd53M,UAAU,KACNtoD,KAAKqgQ,cAAcvB,cACpB9+P,KAAK8rL,OAAOvzI,SAIxB,qBACIv4C,KAAKqgQ,cAAcnB,eAEvB,cACIl/P,KAAKwmD,aAAaR,cAClBhmD,KAAKqgQ,cAAclnN,UAEvB,WAAWvhC,GACP5X,KAAKqgQ,cAAcC,WAAW1oP,WAGtCqoP,EAAsB5uM,UAAO,SAAuClyD,GAAK,OAAO,IAAKA,GAAK8gQ,GAAuB,GAAyB,IAAqB,GAAyB,IAAoB,GAAyB,MACrOA,EAAsBtvM,UAAO,GAAyB,CAAErtD,KAAM28P,EAAuBppM,UAAW,CAAC,CAAC,wBAAyBtB,OAAQ,CAAE2qM,UAAW,aAAe1qM,QAAS,CAAEs2H,OAAQ,UAAY/2H,MAAO,EAAGC,KAAM,EAAG1tB,SAAU,SAAwCgsC,EAAIvnC,KAAUirB,cAAe,yBA2B1RupM,UAENA,EAAmBtvM,UAAO,GAAwB,CAAE3tD,KAAMi9P,IAC1DA,EAAmBjxM,UAAO,GAAwB,CAAEZ,QAAS,SAAoCvvD,GAAK,OAAO,IAAKA,GAAKohQ,IAA0B1xM,UAAW,CAAC,YAW7J,MAAM2xM,IAMN,IAAIC,GACJ,SAAWA,UACPA,EAAKA,EAAU,IAAI,IAAM,MACzBA,EAAKA,EAAgB,UAAI,IAAM,YAC/BA,EAAKA,EAAgB,UAAI,IAAM,YAC/BA,EAAKA,EAAiB,WAAI,IAAM,aAChCA,EAAKA,EAAc,QAAI,IAAM,UAC7BA,EAAKA,EAAgB,UAAI,GAAK,YAC9BA,EAAKA,EAAc,QAAI,IAAM,UAC7BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAU,IAAI,IAAM,MACzBA,EAAKA,EAAY,MAAI,IAAM,QAC3BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAS,GAAI,KAAO,KACzBA,EAAKA,EAAS,GAAI,KAAO,KACzBA,EAAKA,EAAU,IAAI,KAAO,MAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAW,KAAI,IAAM,OAC1BA,EAAKA,EAAoB,cAAI,KAAO,gBACpCA,EAAKA,EAAe,SAAI,IAAM,WAC9BA,EAAKA,EAAa,OAAI,IAAM,SAC5BA,EAAKA,EAAY,MAAI,IAAM,QAC3BA,EAAKA,EAAY,MAAI,IAAM,QAC3BA,EAAKA,EAAU,IAAI,GAAK,MA1DjBA,EAAX,CA2DG,IC5kBY,SAAS,GAAchsN,GAClC,OAAOA,EAAQE,eAAiBF,EAAQzC,UAAYyC,ECGzC,IAAA,GAFIA,GAAY,GAAcA,GAASG,YCEvC,GAFMH,GAAY,GAAcA,GAASstI,gBCFxD,IAAI2+E,GAAc,EAEH,SAASC,KACpB,IAAKD,IAAmC,oBAAb1uN,SAA0B,CACjD,MAAM47M,EAAM57M,SAASI,cAAc,OAEnCw7M,EAAInhN,MAAM2xC,QAAU,oEACpBwvK,EAAI1lL,UAAY,SAChBl2B,SAASzC,KAAK04B,YAAY2lL,GAE1B8S,GAAc9S,EAAIjzE,YAAcizE,EAAIG,YAEpC/7M,SAASzC,KAAK05B,YAAY2kL,GAG9B,OAAO8S,GCXI,SAASE,GAAensN,GACnC,MAAMosN,EAAM,GAAIpsN,GACVzC,EAAW,GAAYyC,GACvB/sC,EAAS,CACXmiK,OAAQg3F,EAAIC,YACZ1wN,MAAOywN,EAAIE,YAOf,OAJI/uN,EAASgvN,aAAehvN,EAASivN,aAAe,IAChDv5P,EAAO0oC,OAASuwN,MAGbj5P,ECOI,ICXA,GAVO+sC,IAClB,IAAIysN,EAAezsN,EAAQysN,aAE3B,KAAOA,GAAgD,WAAhCA,EAAaz0N,MAAM3I,UACtCo9N,EAAeA,EAAaA,aAGhC,OAAOA,GAAgB,GAAgBzsN,ICuB5B,GAhBCA,IACZ,IAAIq6E,EAAOr6E,EAAQs6E,yBACf,KAAEp9E,EAAI,IAAEs9E,GAAQH,EAMpB,OAJKA,EAAK+6C,QAAW/6C,EAAK1+E,QACtB0+E,EArBoB,CAACr6E,IACzB,MAAM,QAAE6rJ,EAAO,KAAE3uJ,EAAI,SAAE7N,GAAa2Q,EAAQhI,MAE5CgI,EAAQhI,MAAM6zJ,QAAU,GACxB7rJ,EAAQhI,MAAMkF,KAAO,WACrB8C,EAAQhI,MAAM3I,SAAW,WAEzB,MAAMgrF,EAAOr6E,EAAQs6E,wBAMrB,OAJAt6E,EAAQhI,MAAM6zJ,QAAUA,EACxB7rJ,EAAQhI,MAAMkF,KAAOA,EACrB8C,EAAQhI,MAAM3I,SAAWA,EAElBgrF,GAbiB,CAqBOr6E,IAGxB,CACHw6E,IAAKA,EACLt9E,KAAMA,EACNk4H,OAAQ/6C,EAAK+6C,OACbz5H,MAAO0+E,EAAK1+E,QC5BL,GAAA,CAACqE,EAAS0sN,KACrB,MAAMz5P,EAAS,GACf,IAAI4zB,EAAOmZ,EAAQV,WAEnB,KAAOzY,IACH5zB,EAAOrE,KAAKi4B,GAERA,IAAS6lO,IAEb7lO,EAAOA,EAAKyY,WAGhB,OAAOrsC,GCTI,SAAS05P,GAAe3sN,GACnC,MAAMstI,EAAkB,GAAWttI,GAC7BosN,EAAM,GAAIpsN,GAEhB,MAAO,CACHzJ,EAAG61N,EAAI7xI,aAAe+yD,EAAgBG,YAAc,EACpD/xI,EAAG0wN,EAAI3xI,aAAe6yD,EAAgBC,WAAa,GCP5C,IAAA,GAACvtI,GACRA,KAAaA,EAAQE,eAAiB,IAAIpF,KACnC6xN,GAAe3sN,GAGnB,CACHzJ,EAAGyJ,EAAQytI,WACX/xI,EAAGsE,EAAQutI,WCLJ,GAAA,CAACvtI,EAASpuB,EAAQwxB,EAAQ,KACrC,MAAMwpN,EAAsBh7O,EAAS,GAAaA,GAAU,MACtD,IAAE4oG,EAAG,KAAEt9E,EAAI,OAAEk4H,EAAM,MAAEz5H,GCFd,EAACqE,EAASpuB,KACvB,MAAMw6O,EAAM,GAAIpsN,GACV6sN,EAAgBT,EAAIt/E,iBAAiB9sI,GACrC1/B,EAAS,GAAW0/B,GACpBk8E,EAAgBtqG,GAAU,GAAaouB,GAEvCE,EAAgBF,EAAQE,cAG9B,IAAI4sN,EAAe,CAAEtyI,IAAK,EAAGt9E,KAAM,GAEnC,GAA+B,UAA3B2vN,EAAcx9N,UAJE6sF,IAAkBh8E,EAAcpF,MAAQohF,IAAkBh8E,EAAcotI,gBAIrC,CACnD,MAAMy/E,EAAeX,EAAIt/E,iBAAiB5wD,GAE1C4wI,EAAe,GAAW5wI,GAC1B4wI,EAAatyI,KAAOt9G,SAAS6vP,EAAalT,eAAgB,IAC1DiT,EAAa5vN,MAAQhgC,SAAS6vP,EAAatsB,gBAAiB,IAGhE,MAAO,CACHjmH,IAAKl6G,EAAOk6G,IAAMsyI,EAAatyI,IAC/Bt9E,KAAM58B,EAAO48B,KAAO4vN,EAAa5vN,KACjCk4H,OAAQ90J,EAAO80J,OACfz5H,MAAOr7B,EAAOq7B,QAvBL,CDEiCqE,EAAS4sN,IACjD,EAAEr2N,EAAC,EAAEmF,GEJA,EAACkxN,EAAqB5sN,IACjC4sN,EAAsB,GAAsBA,GCDjC,SAA8B5sN,GACzC,MAAMpuB,EAAS,GAAaouB,GAE5B,OAAOpuB,EAAS,GAAsBA,GAAU,CAAE2kB,EAAG,EAAGmF,EAAG,GAHhD,CDC6EsE,GAD7E,CFIiC4sN,EAAqB5sN,GAC3DE,EAAgBF,EAAQE,cACxB8sN,EAAgBJ,IAAwB1sN,EAAcpF,MAAQ8xN,IAAwB1sN,EAAcotI,gBAAkB,EAAIlqI,EAEhI,MAAO,CACHo3E,IAAKA,EAAM9+E,EAAIsxN,EACf9vN,KAAMA,EAAO3G,EAAIy2N,EACjB53F,OAAQA,EACRz5H,MAAOA,IIZf,MAAM,GAAM,SAAStM,EAAUlsB,EAAM8pP,GACjC,IAAIr0N,EAAS,EAUb,OARIvJ,EAAWlsB,EAAO8pP,IAClBr0N,EAASq0N,GAAgB59N,EAAWlsB,IAGpCksB,EAAW,IACXuJ,GAAUvJ,GAGPuJ,GAGL,GAAO,UAAS,OAAEt4B,EAAM,KAAE6C,EAAI,WAAE+pP,EAAU,aAAED,EAAY,iBAAEE,EAAgB,kBAAEC,EAAiB,OAAE54D,IACjG,IAAI57J,EAAS,EAEb,MAEMy0N,EAAc,EAAI74D,EAExB,GAAI44D,IAAsBD,GCtBhB,WDkBiBC,GCjBjB,WDiB4DA,GClB5D,WDmBeD,GClBf,WDkByDA,EAGqB,CACpF,MAAMG,ECnBH,QDmBoBH,GCrBnB,SDqB0DA,EAC1D7sP,EAAS,GAAKgtP,GACd10N,EAASz1B,EAAO+pP,EAAaG,EACzB/sP,EAASs4B,EAASz1B,EAAO8pP,IACzBr0N,EAAS,IAENt4B,GAAU,IAAMgtP,IACnBhtP,EAAS6C,EAAO8pP,IAChBr0N,KAAYs0N,EAAa/pP,EAAOkqP,IAGhC/sP,EAASs4B,EAAS,IAClBA,EAAS,IAKrB,OAAOA,GA+DI,IEzGA,GAACoH,IACZ,MAAM/sC,EAAS,GAEf,IAAIs6P,EAAUvtN,EAAQV,WAAWg0I,kBAEjC,KAAOi6E,GACCA,IAAYvtN,GACZ/sC,EAAOrE,KAAK2+P,GAGhBA,EAAUA,EAAQC,mBAEtB,OAAOv6P,GC8CX,MAAMw6P,IA0jBN,SAASr3H,GAAQpgI,EAAMi7K,GACnB,MAAO,CAAEpiL,KAAM,EAAiBmH,KAAAA,EAAMi7K,YAAAA,EAAahmL,QAAS,IA4DhE,SAAS,GAAQyiQ,EAASz1N,EAAS,MAC/B,MAAO,CAAEppC,KAAM,EAAiBopC,OAAAA,EAAQy1N,QAAAA,GAuE5C,SAASC,GAASC,EAAO3iQ,EAAU,MAC/B,MAAO,CAAE4D,KAAM,EAAkB++P,MAAAA,EAAO3iQ,QAAAA,GA0C5C,SAAS,GAAMukF,GACX,MAAO,CAAE3gF,KAAM,EAAeopC,OAAQu3C,EAAQlvE,OAAQ,MAgC1D,SAAS,GAAMtK,EAAMiiC,EAAQhtC,GACzB,MAAO,CAAE4D,KAAM,EAAemH,KAAAA,EAAMiiC,OAAAA,EAAQhtC,QAAAA,GA0NhD,SAAS,GAAW4iQ,EAAiBD,EAAO3iQ,EAAU,MAClD,MAAO,CAAE4D,KAAM,EAAoBi/P,KAAMD,EAAiBzuK,UAAWwuK,EAAO3iQ,QAAAA,GAiRhF,SAAS,GAAkB2wG,GACvB/zF,QAAQpU,QAAQ,MAAM8hD,KAAKqmD,GAsI/B,MAAMmyJ,GAKF,YAAYr9F,EAAW,EAAG9qI,EAAQ,GAC9Br6B,KAAKyiQ,WAAa,GAClBziQ,KAAK0iQ,YAAc,GACnB1iQ,KAAK2iQ,cAAgB,GACrB3iQ,KAAK4iQ,UAAW,EAChB5iQ,KAAKgjF,YAAa,EAClBhjF,KAAK6iQ,WAAY,EACjB7iQ,KAAK8iQ,aAAe,KACpB9iQ,KAAK+iQ,UAAY59F,EAAW9qI,EAMhC,YACSr6B,KAAK6iQ,YACN7iQ,KAAK6iQ,WAAY,EACjB7iQ,KAAKyiQ,WAAWnjQ,QAIhBizB,GAAMA,KACNvyB,KAAKyiQ,WAAa,IAO1B,QAAQlwO,GAAMvyB,KAAK0iQ,YAAYr/P,KAAKkvB,GAKpC,OAAOA,GAAMvyB,KAAKyiQ,WAAWp/P,KAAKkvB,GAKlC,UAAUA,GAAMvyB,KAAK2iQ,cAAct/P,KAAKkvB,GAIxC,aAAe,OAAOvyB,KAAK4iQ,SAI3B,QAIA,OACS5iQ,KAAKgjQ,eACNhjQ,KAAKijQ,WACLjjQ,KAAKkjQ,oBAETljQ,KAAK4iQ,UAAW,EAMpB,mBAAqB,GAAkB,IAGjC5iQ,KAAKmjQ,aAKX,WACInjQ,KAAK0iQ,YAAYpjQ,QAIjBizB,GAAMA,KACNvyB,KAAK0iQ,YAAc,GAKvB,SAIA,WAIA,SAAW1iQ,KAAKmjQ,YAIhB,UACSnjQ,KAAKgjF,aACNhjF,KAAKgjF,YAAa,EACbhjF,KAAKgjQ,cACNhjQ,KAAKijQ,WAETjjQ,KAAKmgL,SACLngL,KAAK2iQ,cAAcrjQ,QAInBizB,GAAMA,KACNvyB,KAAK2iQ,cAAgB,IAM7B,SAKA,YAAY7+N,IAIZ,cAAgB,OAAO,EAMvB,gBAAgBs/N,GAEZ,MAAMC,EAAuB,SAAbD,EAAuBpjQ,KAAK0iQ,YAAc1iQ,KAAKyiQ,WAC/DY,EAAQ/jQ,QAIRizB,GAAMA,KACN8wO,EAAQviQ,OAAS,GAqDzB,MAAMwiQ,GAIF,YAAYC,GACRvjQ,KAAKyiQ,WAAa,GAClBziQ,KAAK0iQ,YAAc,GACnB1iQ,KAAK6iQ,WAAY,EACjB7iQ,KAAK4iQ,UAAW,EAChB5iQ,KAAKgjF,YAAa,EAClBhjF,KAAK2iQ,cAAgB,GACrB3iQ,KAAK8iQ,aAAe,KACpB9iQ,KAAK+iQ,UAAY,EACjB/iQ,KAAKwjQ,QAAUD,EAEf,IAAIE,EAAY,EAEZC,EAAe,EAEfC,EAAa,EAEjB,MAAMznI,EAAQl8H,KAAKwjQ,QAAQ1iQ,OACd,GAATo7H,EACA,GAAkB,IAGZl8H,KAAKmjQ,aAGXnjQ,KAAKwjQ,QAAQlkQ,QAIbskQ,IACIA,EAAOC,OAAO,OAIJJ,GAAavnI,GACfl8H,KAAKmjQ,cAGbS,EAAOrtM,UAAU,OAIPmtM,GAAgBxnI,GAClBl8H,KAAK8jQ,eAGbF,EAAOG,QAAQ,OAILJ,GAAcznI,GAChBl8H,KAAKijQ,eAKrBjjQ,KAAK+iQ,UAAY/iQ,KAAKwjQ,QAAQ5kQ,OAAO,CAKpC66B,EAAMmqO,IAAWr6P,KAAKqS,IAAI6d,EAAMmqO,EAAOb,WAAa,GAMzD,YACS/iQ,KAAK6iQ,YACN7iQ,KAAK6iQ,WAAY,EACjB7iQ,KAAKyiQ,WAAWnjQ,QAIhBizB,GAAMA,KACNvyB,KAAKyiQ,WAAa,IAM1B,OAASziQ,KAAKwjQ,QAAQlkQ,QAItBskQ,GAAUA,EAAOjuN,QAKjB,QAAQpjB,GAAMvyB,KAAK0iQ,YAAYr/P,KAAKkvB,GAKpC,WACSvyB,KAAKgjQ,eACNhjQ,KAAK4iQ,UAAW,EAChB5iQ,KAAK0iQ,YAAYpjQ,QAIjBizB,GAAMA,KACNvyB,KAAK0iQ,YAAc,IAO3B,OAAOnwO,GAAMvyB,KAAKyiQ,WAAWp/P,KAAKkvB,GAKlC,UAAUA,GAAMvyB,KAAK2iQ,cAAct/P,KAAKkvB,GAIxC,aAAe,OAAOvyB,KAAK4iQ,SAI3B,OACS5iQ,KAAK8iQ,cACN9iQ,KAAK21C,OAET31C,KAAKijQ,WACLjjQ,KAAKwjQ,QAAQlkQ,QAIbskQ,GAAUA,EAAOtgB,QAKrB,QAAUtjP,KAAKwjQ,QAAQlkQ,QAIvBskQ,GAAUA,EAAOI,SAIjB,UAAYhkQ,KAAKwjQ,QAAQlkQ,QAIzBskQ,GAAUA,EAAOK,WAIjB,SACIjkQ,KAAKmjQ,YACLnjQ,KAAKwjQ,QAAQlkQ,QAIbskQ,GAAUA,EAAOzjF,UAKrB,UAAYngL,KAAK8jQ,aAKjB,aACS9jQ,KAAKgjF,aACNhjF,KAAKgjF,YAAa,EAClBhjF,KAAKmjQ,YACLnjQ,KAAKwjQ,QAAQlkQ,QAIbskQ,GAAUA,EAAOzqN,WACjBn5C,KAAK2iQ,cAAcrjQ,QAInBizB,GAAMA,KACNvyB,KAAK2iQ,cAAgB,IAM7B,QACI3iQ,KAAKwjQ,QAAQlkQ,QAIbskQ,GAAUA,EAAOniN,SACjBzhD,KAAKgjF,YAAa,EAClBhjF,KAAK6iQ,WAAY,EACjB7iQ,KAAK4iQ,UAAW,EAMpB,YAAYpjQ,GAER,MAAM0kQ,EAAiB1kQ,EAAIQ,KAAK+iQ,UAChC/iQ,KAAKwjQ,QAAQlkQ,QAIbskQ,IAEI,MAAM9/N,EAAW8/N,EAAOb,UAAYx5P,KAAKC,IAAI,EAAG06P,EAAiBN,EAAOb,WAAa,EACrFa,EAAOO,YAAYrgO,KAM3B,cAEI,IAAIt6B,EAAM,EAUV,OATAxJ,KAAKwjQ,QAAQlkQ,QAIbskQ,IAEI,MAAMpkQ,EAAIokQ,EAAOQ,cACjB56P,EAAMD,KAAKC,IAAIhK,EAAGgK,KAEfA,EAKX,gBACIxJ,KAAKwjQ,QAAQlkQ,QAIbskQ,IACQA,EAAOS,eACPT,EAAOS,kBASnB,gBAAgBjB,GAEZ,MAAMC,EAAuB,SAAbD,EAAuBpjQ,KAAK0iQ,YAAc1iQ,KAAKyiQ,WAC/DY,EAAQ/jQ,QAIRizB,GAAMA,KACN8wO,EAAQviQ,OAAS,GAgDzB,MC75DM,GAAM,CAAC,aACb,SAASwjQ,GAAsChxL,EAAIvnC,IACnD,MAAMw4N,GAAM,CAAC,KACPC,GAAa,CAAC11I,EAAM21I,IACjB31I,GACM,CAAE+6C,OAAQ,EAAGl4H,KAAM8yN,EAAU9yN,KAAMs9E,IAAKw1I,EAAUx1I,IAAK7+E,MAAO,GA8BvEs0N,GAAoB,IACG,oBAAX3yN,OAKZ4yN,GAAkB,cAQlBC,GAAiBnwN,GAPM,CAACA,GACnB,GAAGA,EAAQhI,MAAMwpN,WAAWxhN,EAAQhI,MAAMi6L,YAAYjyL,EAAQhI,MAAMm6L,YADlD,CAQGnyL,IALF,CAACA,IAC3B,MAAM/H,EAASqF,OAAOwvI,iBAAiB9sI,GACvC,MAAO,GAAG/H,EAAOupN,WAAWvpN,EAAOg6L,YAAYh6L,EAAOk6L,aAF5B,CAKoCnyL,GAwBlE,SAASxe,GAAQ4uO,GACb,IAAIn9P,EACAo9P,GAAS,EACb,MAAO,IAAIrxP,KACHqxP,IAGJp9P,EAASm9P,KAAOpxP,GAChBqxP,GAAS,GAHEp9P,GAUnB,MAAMq9P,GAA6B9uO,GAAQ,KACvC,IAAKsnO,MAA2C,OAAlBvrN,SAASzC,KACnC,OAAO,EAEX,MACMlpB,EAAS2rB,SAASI,cAAc,OACtC/rB,EAAOomB,MAAM30B,UAAY,6BACzBuO,EAAO6hD,UAAY,uDACnBl2B,SAASzC,KAAK04B,YAAY5hD,GAC1B,MAAM2+O,EALM,KAKQ3+O,EAAO+qB,SAAS,GAAG29E,wBAAwBE,IAE/D,OADAj9E,SAASzC,KAAK05B,YAAY5iD,GACnB2+O,IAuBLC,GAAY,CAACn2I,EAAMj3E,IAChBi3E,GAAkB,IAAVj3E,EAGN,CACHgyH,OAAQ/6C,EAAK+6C,OAAShyH,EACtBlG,KAAMm9E,EAAKn9E,KAAOkG,EAClBo3E,IAAKH,EAAKG,IAAMp3E,EAChBzH,MAAO0+E,EAAK1+E,MAAQyH,GANbi3E,EAUTo2I,GAAS,CACX,YACA,cACA,eACA,aACA,cACA,kCAKEC,EACF,UAAU9uP,EAAS+uP,GACf,MAAO,CACHzzN,KAAMt7B,EAAQs7B,KAAOyzN,EAASzzN,KAC9Bs9E,IAAK54G,EAAQ44G,IAAMm2I,EAASn2I,KAGpC,UAAUH,EAAMg/H,GACZ,OC9KO,SAAmBh/H,EAAMg/H,GACpC,MAAO,CACH7+H,IAAKH,EAAKG,IAAM6+H,EAAO39M,EACvBwB,KAAMm9E,EAAKn9E,KAAOm8M,EAAO9iN,EACzB6+H,OAAQ/6C,EAAK+6C,OACbz5H,MAAO0+E,EAAK1+E,OALL,CD8KU0+E,EAAMg/H,GAE3B,MAAMvmN,GACF,ME/KM,CAAC7nC,IACX,MAAM,WAAE2lQ,EAAU,YAAEC,EAAW,YAAEC,EAAW,aAAEC,EAAY,OAAEv8D,EAAS,IAAOvpM,EACtE+lQ,EAAmBH,EAAY1xC,WAC/B8xC,EAAiBJ,EAAY75D,SAC7Bk6D,EAAoBH,EAAa5xC,WACjCgyC,EAAkBJ,EAAa/5D,SAErC,IAAIo6D,EAAmB58D,EAAO2qB,YAAc,EACxCkyC,EAAiB78D,EAAOwC,UAAY,EAEpCx8E,EAAMo2I,EAAWp2I,IACjBt9E,EAAO0zN,EAAW1zN,KAsCtB,MLlDU,WKcN+zN,IACAz2I,GAAOo2I,EAAWx7F,QLdZ,WKiBN67F,GLhBM,WKgB6BA,IACnCz2I,GAAO1lH,KAAKw1B,MAAMsmO,EAAWx7F,OAAS,ILnBhC,WKsBN+7F,IACA32I,GAAOs2I,EAAY17F,OACnBi8F,IAAmB,GLvBb,WK0BNF,GLzBM,WKyB8BA,IACpC32I,GAAO1lH,KAAKw1B,MAAMwmO,EAAY17F,OAAS,GACvCi8F,IAAmB,GLzBd,UK4BLL,IACA9zN,GAAQ0zN,EAAWj1N,OLhCb,WKmCNq1N,GLlCM,WKkC+BA,IACrC9zN,GAAQpoC,KAAKw1B,MAAMsmO,EAAWj1N,MAAQ,ILjCjC,UKoCLu1N,IACAh0N,GAAQ4zN,EAAYn1N,MACpBy1N,IAAqB,GLzCf,WK4CNF,GL3CM,WK2CgCA,IACtCh0N,GAAQpoC,KAAKw1B,MAAMwmO,EAAYn1N,MAAQ,GACvCy1N,IAAqB,GAGlB,CACH52I,IAAKA,EAAM62I,EACXn0N,KAAMA,EAAOk0N,IAnDP,CF+KOt+N,GAEjB,eAAeoJ,GACX,MdlLe,CAAC8D,IACpB,IAAKA,EAAQs6E,sBAAuB,CAChC,MAAMg3I,EAAWnF,GAAensN,GAChC,MAAO,CACHw2H,OAAQ86F,EAASl8F,OACjBl4H,KAAM,EACNC,MAAOm0N,EAAS31N,MAChB6+E,IAAK,GAIb,MAAM,OAAEg8C,EAAM,KAAEt5H,EAAI,MAAEC,EAAK,IAAEq9E,GAAQx6E,EAAQs6E,wBAE7C,MAAO,CACHk8C,OAAAA,EACAt5H,KAAAA,EACAC,MAAAA,EACAq9E,IAAAA,IAjBe,CckLOjvH,KAAK02F,cAAc/lD,IAE7C,cAAcA,GACV,MAAMoB,EAAS/xC,KAAKgmQ,YACpB,IAAKj0N,IAAWpB,EACZ,MAAO,GAEX,MAAMs1N,EAAiBl0N,EAAOwvI,iBAAiBvhL,KAAK02F,cAAc/lD,IAClE,OAAOu0N,GAAOzjQ,IAAIu5K,IAAAA,CAAWvlK,IAAKulK,EAAM3vK,MAAO46P,EAAejrF,MAElE,YACI,OAAO0pF,KAAsB3yN,OAAS,KAE1C,gBAAgBpB,GACZ,QAAKA,KAGI3wC,KAAK02F,cAAc/lD,GAAIuwN,aAEpC,OAAOvwN,GACH,OAAKA,EAGE,GAAO3wC,KAAK02F,cAAc/lD,IAFtB,KAIf,cAAcA,EAAIu1N,GACd,IAAKv1N,EACD,OAAO,KAEX,MAAM8D,EAAUz0C,KAAK02F,cAAc/lD,IAC7B,KAAEgB,EAAI,IAAEs9E,EAAG,WAAE2hC,GAAen8G,EAAQhI,MAC1CgI,EAAQhI,MAAMmkH,WAAa,OAC3Bn8G,EAAQhI,MAAMkF,KAAUu0N,EAAgBv0N,KAAnB,KACrB8C,EAAQhI,MAAMwiF,IAASi3I,EAAgBj3I,IAAnB,KACpB,MAAMk3I,EAAgB,GAAO1xN,GAO7B,OANAA,EAAQhI,MAAMkF,KAAOA,EACrB8C,EAAQhI,MAAMwiF,IAAMA,EAIpBx6E,EAAQhI,MAAMmkH,WAAaA,EACpBu1G,EAEX,cAAcx1N,GACV,OAAKA,EAGEA,EAAG+lD,eAAiB/lD,EAFhB,KAIf,SAAS8D,EAAS2xN,EAAOvuN,EAAQ,GAC7B,OAAKpD,GAAY2xN,EAGV,GAAmBpmQ,KAAK02F,cAAcjiD,GAAUz0C,KAAK02F,cAAc0vK,GAAQvuN,GAFvE,KAIf,aAAai3E,EAAMg/H,GACf,OG5OO,SAAsBh/H,EAAMg/H,GACvC,MAAO,CACH7+H,IAAKH,EAAKG,IAAM6+H,EAAO39M,EACvBwB,KAAMm9E,EAAKn9E,KAAOm8M,EAAO9iN,EACzB6+H,OAAQ/6C,EAAK+6C,OACbz5H,MAAO0+E,EAAK1+E,OALL,CH4Oa0+E,EAAMg/H,GAE9B,eAAevmN,GACX,MJlMe,CAAC7nC,IACpB,MAAM,WAAE2lQ,EAAU,YAAEC,EAAW,YAAEC,EAAW,aAAEC,EAAY,WAAEa,EAAU,SAAEC,EAAQ,OAAEr9D,EAAS,IAAOvpM,GAC1FuvH,IAAKs3I,EAAY50N,KAAM60N,EAAa38F,OAAQ48F,EAAer2N,MAAOs2N,GAAiBnB,GACnF17F,OAAQ88F,EAAgBv2N,MAAOw2N,GAAkBN,EACnDT,EAAmB58D,EAAO2qB,YAAc,EACxCkyC,EAAiB78D,EAAOwC,UAAY,EAE1C,IAAI95J,EAAO,EACPs9E,EAAM,EAEV,MAAM43I,EQrDE,SRqDiBR,EAAWzyC,WAC9BkzC,EQtDE,SRsDeT,EAAW56D,SQvD3B,QRyDH46D,EAAW56D,WACXx8E,GAAO,GAAIs3I,EAAYE,EAAeE,IQ1DnC,QR6DHN,EAAWzyC,aACXjiL,GAAQ,GAAI60N,EAAaE,EAAcE,IAGvCE,IACA73I,GAAO,GAAK,CACRg6E,OAAQ68D,EACR/wP,OAAQwxP,EACR3uP,KAAM6uP,EACN9E,WAAY0D,EAAWx7F,OACvB63F,aAAciF,EACd/E,iBAAkB0D,EAAY75D,SAC9Bo2D,kBAAmB2D,EAAa/5D,YAIpCo7D,IACAl1N,GAAQ,GAAK,CACTs3J,OAAQ48D,EACR9wP,OAAQyxP,EACR5uP,KAAM8uP,EACN/E,WAAY0D,EAAWj1N,MACvBsxN,aAAckF,EACdhF,iBAAkB0D,EAAY1xC,WAC9BiuC,kBAAmB2D,EAAa5xC,cAGxC,MAAMmzC,EAAoBF,GAA6B,IAATl1N,EACxCq1N,EAAkBF,GAA0B,IAAR73I,EAE1C,MAAO,CACHg4I,QAASF,GAAqBC,EAC9B3mO,KAAM,CACFuzL,WAAYmzC,EACZt7D,SAAUu7D,GAEdjyP,OAAQ,CACJ48B,KAAMA,EACNs9E,IAAKA,KAvDM,CIkMO1nF,GAE1B,eAAeoJ,GACX,OAAOywN,GAAephQ,KAAK02F,cAAc/lD,IAE7C,kBAAkBA,GACd,MA1KkB,CAAC8D,IACvB,MAAMyyN,EAAiB,GACvB,IAAK3J,OAA0BmH,KAC3B,OAAOwC,EAEX,IAAI7gP,EAASouB,EAAQk8E,cACrB,KAAOtqG,IACCs+O,GAAgB/7P,KAAKg8P,GAAcv+O,KAAYA,EAAO8gP,aAAa,qBACnED,EAAe7jQ,KAAKgjB,GAExBA,EAASA,EAAOsqG,cAGpB,OADAu2I,EAAe7jQ,KAAK0uC,QACbm1N,GAbe,CA0KOlnQ,KAAK02F,cAAc/lD,IAEhD,sBAAsBA,GAClB,MAAMy2N,EAAyBpnQ,KAAKqnQ,0BAA0B12N,GAC9D,OAAKy2N,EAGE,GAAOA,GAFH,KAIf,sBAAsBz2N,GAClB,MAAMy2N,EAAyBpnQ,KAAKqnQ,0BAA0B12N,GAC9D,OAAKy2N,EAGE,CACHp8N,EAAGo8N,EAAuBllF,WAC1B/xI,EAAGi3N,EAAuBplF,WAJnB,CAAEh3I,EAAG,EAAGmF,EAAG,GAO1B,0BAA0BQ,GACtB,IAAKA,IAAOo0N,KACR,OAAO,KAEX,IAAI1+O,EAASrmB,KAAK02F,cAAc/lD,GAAIggF,cACpC,KAAOtqG,GAAQ,CACX,GAAkD,SAA9C0rB,OAAOwvI,iBAAiBl7J,GAAQvO,UAChC,OAAOuO,EAEXA,EAASA,EAAOsqG,cAEpB,OAAO,KAEX,oBAAoBhgF,GAChB,QAAS3wC,KAAKqnQ,0BAA0B12N,GAE5C,eAAeA,GACX,OAAO,GAAkB3wC,KAAK02F,cAAc/lD,IAEhD,OAAOsqC,EAAQb,GACX,MA/JO,EAACa,EAAQb,KACpB,IAAKa,IAAWsiL,OAA0BmH,KACtC,OAAO,KAEX,MAAM1C,EK5HK,EAAC/mL,EAAQb,KACpB,MAAM8sL,EAAiB,GAAQjsL,GAC/B,IACIqsL,EACA5/P,EAFA6/P,EAAmBntL,EAIvB,KAAOmtL,IACHD,EAAkBE,GAASD,GAE3B7/P,EAASw/P,EAAetoQ,OACpB,CAAC+B,EAAMnB,IAAMmB,EAAKgJ,OAAO29P,EAAgB7mQ,OAAOiB,GAAKA,IAAMlC,IAC3D,IACF,IAEEkI,IAEJ6/P,EAAmBA,EAAiB52I,cAGxC,OAAOjpH,GAnBI,CL4HsBuzE,EAAQb,GACzC,IAAK4nL,EACD,OAAO,KAEX,MAAMt6P,EAAS,CAACuzE,GAAQtxE,OAAO,GAAQsxE,EAAQ+mL,IAAUpjQ,OAAO,CAACoV,EAAOxU,KACpE,MAAMioQ,EAAcjoQ,EAAEitC,MAAM2iJ,QAAUr9I,OAAOwvI,iBAAiB/hL,GAAG4vL,OAC3D/4K,EAAU1E,SAAS81P,EAAa,IACtC,OAAOpxP,EAAUrC,EAAQqC,EAAUrC,GACpC,GACH,OAAOtM,EAAUA,EAAS,EAAK,MAbpB,CA+JO1H,KAAK02F,cAAczb,GAASj7E,KAAK02F,cAActc,IAEjE,YACI,OAAKmjL,MAA0BmH,MAGxBjzP,YAAYugC,SAAS+vI,gBAAgB2lF,YAAc31N,OAAOgvN,YAAYxnE,QAAQ,KAF1E,EAIf,WACI,OAAOv5L,KAAK2nQ,YAAc,UAGlCxC,EAAW9zM,UAAO,SAA4BlyD,GAAK,OAAO,IAAKA,GAAKgmQ,IACpEA,EAAW91M,WAAQ,GAA0B,CAAErB,MAAOm3M,EAAYz2M,QAASy2M,EAAW9zM,kBAoBtF,MAAMu2M,GAAQ,IAAIp2M,GAAe,2CAK3Bq2M,EACF,YAAYC,EAAMjwN,EAAQ,GACtB73C,KAAK8nQ,KAAOA,EACZ9nQ,KAAK63C,MAAQA,EAEjB,aAAatQ,GACT,MAAM,OAAE0zC,EAAM,QAAExmC,EAAO,YAAE6wN,EAAW,aAAEE,EAAY,OAAEv8D,EAAQl0L,OAAQ0vP,EAAS,aAAEsD,GAAiBxgO,EAC1FsQ,EAAQ73C,KAAK63C,OAAS,EAEtBwtN,EAD6B,UAAjB0C,GAA6B/nQ,KAAK8nQ,KAAKE,gBAAgBvzN,GACaz0C,KAAKioQ,aAAahtL,EAAQxmC,EAASgwN,EAAW5sN,GAArG73C,KAAKkoQ,aAAajtL,EAAQxmC,EAASgwN,EAAW5sN,GACvE0tN,EAAcN,GAAUjlQ,KAAK8nQ,KAAK/yP,OAAO0/B,GAAUoD,GAQzD,OAPe73C,KAAK8nQ,KAAKpsF,MAAM,CAC3B4pF,YAAaA,EACbD,WAAYA,EACZG,aAAcA,EACdD,YAAaA,EACbt8D,OAAAA,IAIR,aAAahuH,EAAQxmC,EAASgwN,EAAW5sN,GACrC,MAAMswN,EAAYnoQ,KAAKooQ,sBAAsBntL,EAAQxmC,GAC/Cq6E,EAAO01I,GAAWxkQ,KAAK8nQ,KAAK/yP,OAAOkmE,GAASwpL,GAC5C4D,EAAa,EAAIxwN,EACjBywN,EAActoQ,KAAK8nQ,KAAKS,sBAAsB9zN,GACtC,IAAVoD,GAAeywN,IACfA,EAAYt9N,GAAKq9N,EACjBC,EAAYn4N,GAAKk4N,GAErB,MAAMG,EAAcxoQ,KAAK8nQ,KAAKW,sBAAsBh0N,GAKpD,OAJc,IAAVoD,GAAe2wN,IACfA,EAAY72N,MAAQ02N,EACpBG,EAAYv5I,KAAOo5I,GAEhBroQ,KAAK8nQ,KAAKY,aAAa1oQ,KAAK8nQ,KAAKa,UApUnB,EAAC75I,EAAM85I,IAC3BA,EAGU,CACX/+F,OAAQ/6C,EAAK+6C,OACbl4H,KAAMm9E,EAAKn9E,KAAOi3N,EAAej3N,KACjCs9E,IAAKH,EAAKG,IAAM25I,EAAe35I,IAC/B7+E,MAAO0+E,EAAK1+E,OANL0+E,EAFc,CAoUkDm2I,GAAUn2I,EAAMj3E,GAAQ2wN,GAAcF,GAAcH,GAE/H,sBAAsBltL,EAAQxmC,GAC1B,OAAOwmC,EAAS,CAAEjwC,EAAG,EAAGmF,EAAG,GAAMnwC,KAAK8nQ,KAAK1G,eAAe3sN,GAE9D,aAAawmC,EAAQxmC,EAASgwN,EAAW5sN,GACrC,MAAMi3E,EAAO01I,GAAWxkQ,KAAK8nQ,KAAKhkO,SAASm3C,EAAQxmC,EAASoD,GAAQ4sN,GACpE,OAAOQ,GAAUn2I,EAAMj3E,WAG/BgwN,EAAax2M,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAK0oQ,GAAc,GAAgB,IAAa,GAAgBD,GAAO,KAC1IC,EAAax4M,WAAQ,GAA0B,CAAErB,MAAO65M,EAAcn5M,QAASm5M,EAAax2M,iCAkBtFw3M,EACF,YAAYf,EAAMjwN,EAAQ,GACtB73C,KAAK8nQ,KAAOA,EACZ9nQ,KAAK63C,MAAQA,EAEjB,gBAAgBtQ,GACZ,MAAM,OAAE0zC,EAAM,gBAAEirL,EAAe,QAAEzxN,EAAO,YAAE6wN,EAAW,aAAEE,EAAY,WAAEa,EAAU,OAAEp9D,GAAW1hK,EACtFwoF,EAAM/vH,KAAK8nQ,KACXjwN,EAAQ73C,KAAK63C,OAAS,EACtB2rJ,EAAgBzzE,EAAI+4I,cAAcr0N,EAASyxN,GAC3CX,EAAcN,GAAUzhE,EAAe3rJ,GACvCkxN,EAAe9D,GAAUl1I,EAAIh7G,OAAOkmE,GAASpjC,GAC7CwtN,EAAab,GAAWuE,EAAc7C,GACtCI,EAAW/+N,EAAS++N,UAAYv2I,EAAIi5I,eAAev0N,GACzD6xN,EAASl2N,MAAQk2N,EAASl2N,MAAQyH,EAClCyuN,EAASz8F,OAASy8F,EAASz8F,OAAShyH,EACpC,MAAMnwC,EAASqoH,EAAIk5I,eAAe,CAC9B3D,YAAAA,EACAD,WAAAA,EACAgB,WAAAA,EACAb,aAAAA,EACAD,YAAAA,EACAt8D,OAAAA,EACAq9D,SAAAA,IAEE7B,EAAY10I,EAAIm5I,UAAUhD,EAAiBx+P,EAAOqN,QACxD,MAAO,CACHsrB,KAAM34B,EAAO24B,KACb4mO,QAASv/P,EAAOu/P,QAChBlyP,OAAQ0vP,WAIpBoE,EAAgBx3M,UAAO,SAAiClyD,GAAK,OAAO,IAAKA,GAAK0pQ,GAAiB,GAAgB,IAAa,GAAgBjB,GAAO,KACnJiB,EAAgBx5M,WAAQ,GAA0B,CAAErB,MAAO66M,EAAiBn6M,QAASm6M,EAAgBx3M,iCAkB/F83M,EACF,YAAYrB,EAAMpzJ,GACd10G,KAAK8nQ,KAAOA,EACZ9nQ,KAAK00G,MAAQA,EAEjB,UAAUnkF,GACDgtO,MAGLv9P,KAAK00G,MAAMzF,kBAAkB,KACzBjvG,KAAKwmD,aAAe02M,GAAUl9P,KAAK8nQ,KAAK9B,YAAa,UAChD99M,KAAKo9G,GAnWC,IAAO,KAoWbh9G,UAAU,IAAM/3B,OAG7B,cACSvwB,KAAKwmD,cAGVxmD,KAAKwmD,aAAaR,cAEtB,iBACI,OAAOhmD,KAAKwmD,cAAgBxmD,KAAKwmD,aAAad,eAGtDyjN,EAAc93M,UAAO,SAA+BlyD,GAAK,OAAO,IAAKA,GAAKgqQ,GAAe,GAAgB,IAAa,GAAgB,MACtIA,EAAc95M,WAAQ,GAA0B,CAAErB,MAAOm7M,EAAez6M,QAASy6M,EAAc93M,iCAiBzF+3M,EACF,YAAYtB,EAAMpzJ,GACd10G,KAAK8nQ,KAAOA,EACZ9nQ,KAAK00G,MAAQA,EAEjB,WAAWjgE,GAGP,OAFAz0C,KAAKgmD,cACLhmD,KAAKy0C,QAAUA,EACRz0C,KAEX,UAAUuwB,GACN,IAAKA,IAAagtO,OAA0Bv9P,KAAKy0C,QAC7C,OAEJ,MAAMiiD,EAAgB12F,KAAK8nQ,KAAKpxK,cAAc12F,KAAKy0C,SAC7C40N,EAAarpQ,KAAK8nQ,KAAKwB,kBAAkBtpQ,KAAKy0C,SACpDz0C,KAAK00G,MAAMzF,kBAAkB,KACzB,MAAMtjD,EAAc09M,EAAW5nQ,IAAIjC,GAAK09P,GAAU19P,EAAG,UAAU0oD,KAAKo9G,GApZzD,IAAO,MA8ZlBtlK,KAAKwmD,aAAehqB,KAASmvB,GAAarD,UATtB71C,IAChB,MAAMoxB,EAASpxB,EAAEoxB,OACX63B,EAAW2tM,EAAW5oQ,OAAOjB,GAAKA,IAAMqkC,GAAQ/iC,OAAS,EACzDyoQ,EAAa1lO,IAAWmO,SACxBw3N,EAAW3lO,IAAWkO,QACxB2pB,GAAY6tM,GAAcC,IAC1Bj5O,EAASvwB,KAAK4xI,UAAUl7C,EAAe7yD,QAMvD,cACS7jC,KAAKwmD,cAGVxmD,KAAKwmD,aAAaR,cAEtB,UAAUqrD,EAAMj3B,GACZ,MAAMqvL,EAAWzpQ,KAAK8nQ,KAAK4B,eAAer4J,GACpCs4J,EAAgB3pQ,KAAK8nQ,KAAK4B,eAAetvL,GAC/C,QA3Ce,EA2COuvL,EAAc16I,IAAMw6I,EAASx+F,QA3CpC,EA8COw+F,EAASx6I,IAAM06I,EAAc1+F,QA9CpC,EAiDOw+F,EAAS93N,KAAOg4N,EAAc/3N,OAjDrC,EAoDO+3N,EAAch4N,KAAO83N,EAAS73N,eAM5Dw3N,EAAkB/3M,UAAO,SAAmClyD,GAAK,OAAO,IAAKA,GAAKiqQ,GAAmB,GAAgB,IAAa,GAAgB,MAClJA,EAAkB/5M,WAAQ,GAA0B,CAAErB,MAAOo7M,EAAmB16M,QAAS06M,EAAkB/3M,kBAU3G,MAMMu4M,GAAc,iBAAG,CAEvB,OAAyBzxN,IACrB,MAAMN,EANC,OAMOM,GAPL,SAOyBA,EAAqB,SAAW,SAGlE,IAAInJ,EAaJ,OAXIA,EAZK,SAWLmJ,EACS,MAdJ,SAgBAA,EAfC,QAAA,UAkBDA,EAnBA,OAuBI,SAEN,CACH50C,MAAO,CAAEuU,UAAc+/B,EAAH,MAA2BgyN,gBAAiB76N,GAChE3nC,IAAK,CAAEyQ,UAAc+/B,EAAH,SAG1B,MAAwBM,IACpB,MAAMkxH,EA/BG,SA+BSlxH,GA9BR,UA8B8BA,EAAsB,aAAe,aAG7E,MAAO,CACH50C,MAAO,CAAEuU,UAAW,GAAGuxJ,KAlCjB,UA+BIlxH,GA9BL,SA8B4BA,GAAsB,IAAM,SAI7D9wC,IAAK,CAAEyQ,UAAcuxJ,EAAH,UAG1B,KAAsB,KAAA,CAEd9lK,MAAO,CAAEuqK,QAAS,GAClBzmK,IAAK,CAAEymK,QAAS,KAGxB,KAAsB,KAAA,CAIdvqK,MAAO,CAAEuU,UAAW,YACpBzQ,IAAK,CAAEyQ,UAAW,eA5CN,sBAkDdgyP,EACF,YAAYC,GACR/pQ,KAAK+pQ,iBAAmBA,EACxB/pQ,KAAKuD,MAAQ,IAAI,GACjBvD,KAAKqH,IAAM,IAAI,GAEnB,KAAKotC,EAAS/0C,EAAS2gC,GACnB,IAAKrgC,KAAKqgC,MAAQrgC,KAAKqgC,KAAKuzL,aAAevzL,EAAKuzL,YAC5C5zN,KAAKqgC,KAAKorK,WAAaprK,EAAKorK,SAAU,CACtCzrM,KAAKqgC,KAAOA,EACZ,MAAM/8B,EAAO5D,EAAQ4D,MA9DZ,QA+DH0mQ,EAAWJ,GAAetmQ,GAChC,GAAI0mQ,EAAU,CACV,MACMC,EAASD,EADGhqQ,KAAKw3C,aAAanX,EAAM3gC,IAE1CM,KAAKkqQ,WAAWz1N,EAASw1N,EAAQvqQ,QAEhC,GAAI+nE,KACL,MAAM,IAAIhhE,MAAM,gCAAgCnD,8DAI5D,cACItD,KAAKmqQ,aAET,WAAW11N,EAASw1N,EAAQvqQ,GACxBM,KAAKmqQ,aACL,MAAMhlG,EAAWzlK,EAAQylK,UA9ER,IA+EXz2G,EAAU1uD,KAAK+pQ,iBAAiBhvI,MAAM,CACxC,GAAMkvI,EAAO1mQ,OACb,GAAW4hK,EAAH,aAAyB,GAAM8kG,EAAO5iQ,QAE5Cu8P,EAAS5jQ,KAAK4jQ,OAASl1M,EAAQ1jD,OAAOypC,GAC5CmvN,EAAOC,OAAO,KACV7jQ,KAAKqH,IAAIkxC,OACTv4C,KAAKmqQ,eAETnqQ,KAAKuD,MAAMg1C,OACXqrN,EAAOtgB,OAEX,aAAajjN,EAAM3gC,GACf,IAAIy4C,EAAYz4C,EAAQy4C,WA/FnB,OAgHL,OAhBI9X,EAAKuzL,aAlGJ,SAmGGz7K,EACAA,EAnGF,QAAA,UAqGOA,IACLA,EAvGH,SA0GD9X,EAAKorK,WAxGJ,SAyGGtzJ,EACAA,EAzGL,KAAA,OA2GUA,IACLA,EA7GH,SAgHEA,EAEX,aACQn4C,KAAK4jQ,SACL5jQ,KAAK4jQ,OAAOzqN,UACZn5C,KAAK4jQ,OAAS,cAI1BkG,EAAiBz4M,UAAO,SAAkClyD,GAAK,OAAO,IAAKA,GAAK2qQ,GAAkB,GAAgB,MAClHA,EAAiBz6M,WAAQ,GAA0B,CAAErB,MAAO87M,EAAkBp7M,QAASo7M,EAAiBz4M,kBASxG,MAAM+4M,GAAiB,CAAEz4N,MAAO,IAAOs9E,IAAK,sBAsBtCo7I,EACF,YAAYjwL,EAAWkwL,EAAeC,EAAYC,EAAkBC,EAAgBC,EAAoBC,EAAkB9iJ,EAAWnT,GACjI10G,KAAKo6E,UAAYA,EACjBp6E,KAAKsqQ,cAAgBA,EACrBtqQ,KAAKuqQ,WAAaA,EAClBvqQ,KAAKwqQ,iBAAmBA,EACxBxqQ,KAAKyqQ,eAAiBA,EACtBzqQ,KAAK0qQ,mBAAqBA,EAC1B1qQ,KAAK2qQ,iBAAmBA,EACxB3qQ,KAAK6nH,UAAYA,EACjB7nH,KAAK00G,MAAQA,EAKb10G,KAAK4qQ,SAAU,EAKf5qQ,KAAKslQ,YAAc,CAAE1xC,WAAY,OAAQnoB,SAAU,UAKnDzrM,KAAK6qQ,UAAY,CAAEj3C,WAAY,MAAOnoB,SAAU,QAKhDzrM,KAAK8qQ,WAAa,CAAEl3C,WAAY,OAAQnoB,SAAU,OAIlDzrM,KAAK+qQ,kBAAmB,EAiGxB/qQ,KAAK+nQ,aAAe,QAOpB/nQ,KAAK+U,OAASq1P,GAKdpqQ,KAAKgrQ,oBAAsB,IAAI,GAI/BhrQ,KAAKvB,MAAQ,IAAI,GAIjBuB,KAAKxB,KAAO,IAAI,GAIhBwB,KAAKirQ,eAAiB,IAAI,GAC1BjrQ,KAAKggQ,gBAAkB1jP,QAAQpU,QAAQ,MACvClI,KAAKkrQ,cAAe,EACpBlrQ,KAAK6nH,UAAU72B,SAAS5W,EAAUsc,cAnLd,yBAoLpB12F,KAAKmrQ,mBAET,WACInrQ,KAAKorQ,WAAaprQ,KAAKorQ,WAAWxyO,KAAK54B,MACvCA,KAAKyqQ,eAAeniN,UAAUtoD,KAAKorQ,YACnCprQ,KAAKqrQ,uBAAyBrrQ,KAAK2qQ,iBAAiBpnQ,MAAM+kD,UAAUtoD,KAAKsrQ,iBAAiB1yO,KAAK54B,OAC/FA,KAAKqrQ,uBAAuBnsP,IAAIlf,KAAK2qQ,iBAAiBtjQ,IAAIihD,UAAUtoD,KAAKurQ,eAAe3yO,KAAK54B,QAC7FA,KAAK0qQ,mBAAmBc,WAAWxrQ,KAAKi7E,QAAUj7E,KAAKo6E,WAAW9xB,UAAUtoD,KAAKyrQ,SAAS7yO,KAAK54B,OAC/FA,KAAKmmQ,cAAgBiE,GACrBpqQ,KAAK0rQ,YACL1rQ,KAAK2rQ,iBACL3rQ,KAAKmrQ,mBAET,YAAYhlK,GACJA,EAAQ4kK,kBACR/qQ,KAAK2rQ,iBAELxlK,EAAQ4hK,cACR/nQ,KAAKmrQ,mBAGb,kBACInrQ,KAAKorQ,aACAprQ,KAAK4qQ,SACN5qQ,KAAKggQ,gBAAgBh2M,KAAK,KACtBhqD,KAAKurQ,mBAIjB,qBACQvrQ,KAAKkrQ,aACLlrQ,KAAKkrQ,cAAe,EAGxBlrQ,KAAK00G,MAAMzF,kBAAkB,KAIzBjvG,KAAK4rQ,wBACL5rQ,KAAK6rQ,uBAAyB,EAAK7rQ,KAAKggQ,iBACnC13M,UAAUtoD,KAAKorQ,cAG5B,cACIprQ,KAAKgrQ,oBAAoBhkN,WACzBhnD,KAAKirQ,eAAejkN,WACpBhnD,KAAKvB,MAAM85C,OACXv4C,KAAKvB,MAAMuoD,WACXhnD,KAAKyqQ,eAAezkN,cACpBhmD,KAAK0qQ,mBAAmB1kN,cACxBhmD,KAAKqrQ,uBAAuBrlN,cAC5BhmD,KAAK4rQ,wBAKT,WACI5rQ,KAAKorQ,aAET,mBACIprQ,KAAK6nH,UAAU32B,YAAYlxF,KAAKo6E,UAAUsc,cAAe,+BAE7D,iBACI12F,KAAK6nH,UAAU72B,SAAShxF,KAAKo6E,UAAUsc,cAAe,+BACtD12F,KAAKxB,KAAK+5C,OACVv4C,KAAKxB,KAAKwoD,WAEd,oBACI,OAAOhnD,KAAK8rQ,eAEhB,kBAAkBrH,GACdzkQ,KAAK+rQ,kBAAkB,OAAWtH,EAAU9yN,KAAb,MAC/B3xC,KAAK+rQ,kBAAkB,MAAUtH,EAAUx1I,IAAb,MAC9BjvH,KAAK8rQ,eAAiBrH,EAE1B,YACQzkQ,KAAKi7E,QACLj7E,KAAK+rQ,kBAAkB,UAAWrzP,OAAO1Y,KAAKuqQ,WAAWn7E,OAAOpvL,KAAKi7E,OAAQj7E,KAAKo6E,aAG1F,aACI,IAAKmjL,KACD,OAEJ,MAAM,KAAEl9N,EAAMtrB,OAAQ0vP,GAAczkQ,KAAK8jC,WACpC9jC,KAAKmmQ,gBAj4BQ,EAAC6F,EAAWC,KAClC,MAAQt6N,KAAMu6N,EAASj9I,IAAKk9I,GAAWH,GAC/Br6N,KAAMy6N,EAASn9I,IAAKo9I,GAAWJ,EACvC,OAAO1iQ,KAAK+mC,IAAI47N,EAAUE,IAAY,GAAK7iQ,KAAK+mC,IAAI67N,EAASE,IAAW,GAHlD,CAi4B2BrsQ,KAAKmmQ,cAAe1B,KAC7DzkQ,KAAKmmQ,cAAgB1B,EACjB3G,GAAa99P,KAAKirQ,iBAClBjrQ,KAAK00G,MAAMvF,IAAI,IAAMnvG,KAAKirQ,eAAe1yN,KAAK,CAAExjC,OAAQ0vP,EAAWpkO,KAAAA,MAGvErgC,KAAK4qQ,SACL5qQ,KAAK2qQ,iBAAiBrnB,KAAKtjP,KAAKssQ,iBAAiB51K,cAAe12F,KAAK4qQ,QAASvqO,GAElFrgC,KAAKusQ,aAAajM,aAEtB,WACI,MAAMkM,EAAgBxsQ,KAAKsqQ,cAAcmC,aAAa,CAClDxxL,OAAQj7E,KAAKi7E,OACbqqL,YAAatlQ,KAAKslQ,YAClB7wN,QAASz0C,KAAKo6E,UACdorL,aAAcxlQ,KAAK8qQ,WACnB7hE,OAAQjpM,KAAKipM,OACbl0L,OAAQ/U,KAAK+U,OACbgzP,aAAc/nQ,KAAK+nQ,eAEvB,OAAO/nQ,KAAKwqQ,iBAAiBkC,gBAAgB,CACzCzxL,OAAQj7E,KAAKi7E,OACbqqL,YAAatlQ,KAAKslQ,YAClBe,WAAYrmQ,KAAK6qQ,UACjB3E,gBAAiBsG,EACjB/3N,QAASz0C,KAAKo6E,UACdorL,aAAcxlQ,KAAK8qQ,WACnB7hE,OAAQjpM,KAAKipM,SAGrB,SAAS0jE,GACL,MAAMC,EAAoB9O,GAAa99P,KAAKgrQ,qBACxC2B,IAAiBC,EACjB5sQ,KAAKorQ,aAEAwB,GACL5sQ,KAAK00G,MAAMvF,IAAI,KACXnvG,KAAKgrQ,oBAAoBzyN,SAIrC,iBACSv4C,KAAKi7E,QAAWj7E,KAAK+qQ,kBAG1B/qQ,KAAKuqQ,WAAWsC,cAAc7sQ,KAAKi7E,QAC9B37E,QAAQoC,GAAK1B,KAAK+rQ,kBAAkBrqQ,EAAE+T,IAAK/T,EAAE2J,QAEtD,mBAEIrL,KAAK6nH,UADgC,UAAtB7nH,KAAK+nQ,aAA2B,WAAa,eACrC/nQ,KAAKo6E,UAAUsc,cA3TZ,+BA6T9B,kBAAkBjsF,EAAMY,GACpBrL,KAAK6nH,UAAUx2B,SAASrxF,KAAKo6E,UAAUsc,cAAejsF,EAAMY,GAEhE,wBACQrL,KAAK6rQ,wBACL7rQ,KAAK6rQ,uBAAuB7lN,sBAIxCqkN,EAAeh5M,UAAO,SAAgClyD,GAAK,OAAO,IAAKA,GAAKkrQ,GAAgB,GAAyB,IAAoB,GAAyB,IAAe,GAAyB,IAAa,GAAyB,IAAkB,GAAyB,IAAgB,GAAyB,IAAoB,GAAyB,IAAmB,GAAyB,IAAmB,GAAyB,MACzcA,EAAe15M,UAAO,GAAyB,CAAErtD,KAAM+mQ,EAAgBxzM,UAAW,CAAC,CAAC,gBAAiBC,UAAW,SAA8Bwc,EAAIvnC,GAI1I,IAAI+gO,EAJsJ,EAALx5L,IACrJ,GAAmB,IAAK,GACxB,GAAmB,IAAuB,IACnC,EAALA,IAEF,GAAsBw5L,EAAK,QAA0B/gO,EAAIugO,iBAAmBQ,EAAGzjO,OAC/E,GAAsByjO,EAAK,QAA0B/gO,EAAIwgO,aAAeO,EAAGzjO,SAC1EksB,OAAQ,CAAEq1M,QAAS,UAAWtF,YAAa,cAAeuF,UAAW,YAAaC,WAAY,aAAcC,iBAAkB,mBAAoBhD,aAAc,eAAgBhzP,OAAQ,SAAUkmE,OAAQ,SAAU8xL,WAAY,aAAc9jE,OAAQ,UAAYzzI,QAAS,CAAEw1M,oBAAqB,sBAAuBvsQ,MAAO,QAASD,KAAM,OAAQysQ,eAAgB,kBAAoBx1M,SAAU,CAAC,eAAgBsB,SAAU,CAAC,GAA0B,CAAC,GAAc,GAAkB,GAAY,GAAiB,GAAe,KAAqB,IAA8B7B,mBAAoBqvM,GAAKxvM,MAAO,EAAGC,KAAM,EAAGC,OAAQ,CAAC,CAAC,EAAG,UAAW,EAAG,WAAY,CAAC,YAAa,IAAK,CAAC,EAAG,mBAAoB,QAAS,CAAC,EAAG,YAAa,WAAY3tB,SAAU,SAAiCgsC,EAAIvnC,GAAgB,EAALunC,IAC1xB,KACA,GAAsB,EAAG,MAAO,EAAG,GACnC,GAAoB,GACpB,GAAkB,EAAGgxL,GAAuC,EAAG,EAAG,cAAe,GACjF,GAAsB,EAAG,sBAAuB,GAChD,GAAkB,UAAA,WAAqF,OAAOv4N,EAAIihO,cAClH,KACA,MACO,EAAL15L,IACF,GAAkB,UAAWvnC,EAAIghO,YACjC,GAAiB,GACjB,GAAkB,mBAAoBhhO,EAAI6gC,QAA1C,CAAmD,OAAQ7gC,EAAI6gC,SAC/D,GAAiB,GACjB,GAAkB,YAAa,OAC9B6H,WAAY,CAAC,GAAgB,GAAyB,GAAa,IAA+Bzd,cAAe,UAkF1H,MA4CMi2M,GAAkB,IAAIz7M,GAAe,sCAQrC07M,EACF,YAAYC,EAAgBhqK,EAA0BhxC,EAAUioB,GAC5Dp6E,KAAKmtQ,eAAiBA,EACtBntQ,KAAKmjG,yBAA2BA,EAChCnjG,KAAKmyD,SAAWA,EAChBnyD,KAAKo6E,UAAYA,EAOrB,wBAEI,MAAMgzL,EAAiBptQ,KAAKmtQ,eAAej7L,YAAc,GACzD,GAAIk7L,EAAe,GACf,OAAOA,EAAe,GAE1B,MAAM,IAAI3mQ,MAAM,gQAUpB,4BACI,OAAOzG,KAAKo6E,UAAYp6E,KAAKo6E,UAAUsc,cAAgB12F,KAAKqtQ,qBAAqBrtQ,KAAKstQ,mBAyC1F,KAAK5tQ,EAAU,IACX,MAAM,UAAEg6E,EAAS,MAAE2yE,GAAUrsJ,KAAKutQ,YAAY7tQ,EAAQktE,SAChD4gM,EAAoBxtQ,KAAKytQ,YAAYphH,EAAO3sJ,EAAQguQ,UACpDC,EAAgBH,EAAkBtpM,SACxClkE,KAAK4tQ,uBAAuBJ,EAAmB9tQ,GAC/C8tQ,EAAkB7tK,kBAAkBoW,gBAChCr8B,GACAA,EAAUimB,kBAAkBoW,gBAEhC,MAAM83J,EAAe7tQ,KAAKqtQ,qBAAqBG,GAC/C,MAAO,CACH/uQ,MAAO,KArIG,IAACg2C,EAsIHilC,GACAA,EAAUvgC,UAEdq0N,EAAkBr0N,WAzIX1E,EA2IOo5N,IA1IXp5N,EAAQV,YACnBU,EAAQV,WAAWk1B,YAAYx0B,IA2I3Bm4B,QAAS8M,EACT0sL,MAAOoH,EACPM,yBAA0BH,EAAc3C,oBACxC+C,WAAYJ,EAAclvQ,MAC1BovQ,aAAcA,EACdG,UAAWL,EAAcnvQ,KACzByvQ,oBAAqBN,EAAc1C,gBAG3C,YAAY5+G,EAAOjyE,GACf,MAAMozL,EAAoBxtQ,KAAKk2J,gBAAgB,GAAgB7J,EAAOjyE,GAItE,OAHKA,GACDp6E,KAAKkuQ,sBAAsBjmM,YAAYjoE,KAAKqtQ,qBAAqBG,IAE9DA,EAQX,qBAAqBvsL,GACjB,OAAOA,EAAa5f,SAASq1B,cASjC,oBAAoBy3K,GAChB,OAAOnuQ,KAAKmjG,yBAAyBuS,wBAAwBy4J,GASjE,gBAAgBA,EAAgB9hH,EAAOjyE,GACnC,MAAM1rB,EAAU1uD,KAAKouQ,oBAAoBD,GACzC,GAAI/zL,EACA,OAAOA,EAAU87E,gBAAgBxnG,OAASx4C,EAAWlW,KAAKmyD,SAAUk6F,GAEnE,CACD,MAAM3yE,EAAYhrB,EAAQ1jD,OAAOhL,KAAKmyD,SAAUk6F,GAEhD,OADArsJ,KAAKmtQ,eAAeh3J,WAAWz8B,EAAUrf,UAClCqf,GAUf,uBAAuBA,EAAWh6E,GAM9B,OALAN,OAAO+tC,oBAAoBztC,GACtBe,OAAOm8B,GAAiB,YAATA,GAAsBl9B,EAAQktE,mBAAmB2wB,IAChE97F,IAAKm7B,IACN88C,EAAUxV,SAAStnC,GAAQl9B,EAAQk9B,KAEhC88C,EAQX,YAAY9M,GACR,IAAKA,GAAWA,aAAmB2wB,GAC/B,MAAO,CAAE7jB,UAAW,KAAM2yE,MAAO,CAAC,KAEtC,MAAM3yE,EAAY15E,KAAKk2J,gBAAgBtpF,GAEvC,MAAO,CACH8M,UAAWA,EACX2yE,MAAO,CAHG3yE,EAAY,CAACA,EAAUrY,SAASq1B,eAAiB,aASvEw2K,EAAa77M,UAAO,SAA8BlyD,GAAK,OAAO,IAAKA,GAAK+tQ,GAAc,GAAgB,IAAwB,GAAgB,IAAkC,GAAgB,IAAkB,GAAgBD,GAAiB,KACnPC,EAAa79M,WAAQ,GAA0B,CAAErB,MAAOk/M,EAAcx+M,QAASw+M,EAAa77M,iCAiDtFg9M,UAENA,EAAYp9M,UAAO,GAAwB,CAAE3tD,KAAM+qQ,IACnDA,EAAY/+M,UAAO,GAAwB,CAAEZ,QAAS,SAA6BvvD,GAAK,OAAO,IAAKA,GAAKkvQ,IAAmBx/M,UAAW,CAAC,IAAennB,QAAS,CAAC,CAAC,GAAc,aMh3CzK,SAAS,GAAK9R,GACjB,OAAQhoB,GAAWA,EAAO+7C,KAAK,IAAI2kN,GAAa14O,IAEpD,MAAM04O,GACF,YAAYpyI,GACRl8H,KAAKk8H,MAAQA,EAEjB,KAAK30E,EAAY35C,GACb,OAAOA,EAAO06C,UAAU,IAAI,GAAef,EAAYvnD,KAAKk8H,SAGpE,MAAM,WAAuB,EACzB,YAAY50E,EAAa40E,GACrBj1E,MAAMK,GACNtnD,KAAKk8H,MAAQA,EACbl8H,KAAK41B,MAAQ,EAEjB,MAAMoV,KACIhrC,KAAK41B,MAAQ51B,KAAKk8H,OACpBl8H,KAAKsnD,YAAYhsB,KAAK0P,uBCL5BujO,EACF,cAIIvuQ,KAAKmmG,QAAU,IAAI,EAOvB,OAAO2kF,GACH9qL,KAAKmmG,QAAQ7qE,KAAK,CAAEwvJ,IAAAA,IAQxB,IAAIr1K,YAIR84P,EAAel9M,UAAO,SAAgClyD,GAAK,OAAO,IAAKA,GAAKovQ,IAC5EA,EAAel/M,WAAQ,GAA0B,CAAErB,MAAOugN,EAAgB7/M,QAAS6/M,EAAel9M,iCAW5Fm9M,EACF,eACI,OAAO,EAEX,YAAYroK,GACRnmG,KAAKy1N,SAAStvH,GACV/mG,OAAOC,KAAK8mG,GAASv/D,KAAKkgI,IAAU3gE,EAAQ2gE,GAAO62F,kBACnD39P,KAAKyjF,QAAQgrL,gBAGrB,WACIzuQ,KAAKwmD,aAAexmD,KAAKyjF,QAAQ0iB,QAAQj+C,KAAK,GAAK,IAAII,UAAU,IAAMtoD,KAAKy1N,SAASz1N,OAEzF,SAASmmG,GACQ/mG,OAAOC,KAAK8mG,GACpB7mG,QAAQmW,GAAOzV,KAAKyjF,QAAQgyI,SAAShgN,EAAKzV,KAAKyV,GAAMzV,KAAK0uQ,WAEnE,cACQ1uQ,KAAKwmD,cACLxmD,KAAKwmD,aAAaR,sBAI9BwoN,EAAkBn9M,UAAO,SAAmClyD,GAAK,OAAO,IAAKA,GAAKqvQ,IAClFA,EAAkB39M,UAAO,GAAyB,CAAEvtD,KAAMkrQ,EAAmBz3M,SAAU,CAAC,YAYxF,MAAM,GAAM,IAAIvF,GAAe,gCAQzBm9M,GAAc,IAAIn9M,GAAe,8CAOjCo9M,EACF,YAAY1lO,EAAQ2lO,EAAgBC,GAChC9uQ,KAAKkpC,OAASA,EACdlpC,KAAK6uQ,eAAiBA,EACtB7uQ,KAAK8uQ,KAAOA,EACZ9uQ,KAAKmmG,QAAU,IAAI,GAAgB,CAAE2kF,IAAK9qL,KAAK8uQ,OAC/C9uQ,KAAK+uQ,WAAa,GACdF,IACA7uQ,KAAKwmD,aAAeqoN,EAAe1oK,QAC9Bj+C,KAAK,EAAI,EAAG4iI,IAAAA,UAAkB50K,IAAR40K,EAAoBA,EAAM9qL,KAAK8uQ,MAAO1sO,GAAI0oJ,GAAO9qL,KAAK8uQ,KAAOhkF,IACnFxiI,UAAUwiI,IACX9qL,KAAK+uQ,WAAa,GAClB/uQ,KAAKmmG,QAAQ7qE,KAAK,CAAEwvJ,IAAAA,OAIhC,UACI,OAAO9qL,KAAK8uQ,KAEhB,cACQ9uQ,KAAKwmD,cACLxmD,KAAKwmD,aAAaR,cAG1B,IAAIgpN,GACA,MAAMv5P,EAAMzV,KAAKyV,IAAIu5P,GACrB,OAAOhvQ,KAAK+uQ,WAAWt5P,GAE3B,SAASu5P,EAAU3jQ,EAAOqjQ,GAAW,GACjC,MAAMj5P,EAAMzV,KAAKyV,IAAIu5P,GACrB,IAAI9nP,EAAU7b,EACd,IAAKqjQ,EAAU,CACX,GAAI1uQ,KAAK+uQ,WAAW/1P,eAAevD,GAC/B,OAEJyR,EAAUlnB,KAAK6yB,aAAapd,EAAKpK,GAErCrL,KAAK+uQ,WAAWt5P,GAAOyR,EAE3B,gBACIlnB,KAAKmmG,QAAQ7qE,KAAK,CAAEwvJ,IAAK9qL,KAAK8qL,MAElC,IAAIkkF,GACA,OAAOhvQ,KAAKkpC,OAAS,IAAM8lO,EAE/B,aAAav5P,EAAKpK,GACd,IAAKrL,KAAK6uQ,eACN,OAAOxjQ,EAEX,MAAM4jQ,EAAMjvQ,KAAK6uQ,eAAe5tP,IAAIxL,GACpC,YAAgBS,IAAR+4P,EAAqB5jQ,EAAQ4jQ,UAG7CL,EAAoBv9M,UAAO,SAAqClyD,GAAK,OAAO,IAAKA,GAAKyvQ,GAAqB,GAAgBD,IAAc,GAAgB,GAAgB,GAAI,GAAgB,GAAK,KAClMC,EAAoBv/M,WAAQ,GAA0B,CAAErB,MAAO4gN,EAAqBlgN,QAASkgN,EAAoBv9M,kBC7JlG,SAAS,GAAShmD,GAC7B,MAAwB,iBAAVA,ECClB,MAAMu/B,GAAe,eAErB,MAAMskO,GACF,aAAY,KAAEzkQ,EAAI,QAAEyc,IAChB,IAAKzc,IAASyc,EACV,MAAM,IAAIzgB,MAAM,yDAGpBzG,KAAKyK,KAAOA,EACZzK,KAAKknB,QAAUA,EAGnB,iBAAiBpS,GACb,MAAMq6P,EAAgB,GAAQr6P,GAExBs6P,EAAmBpvQ,KAAKknB,QAAQ/iB,QAAQymC,IAAAA,SAAuB7qC,EAAOiU,GACxE,OAAOm7P,EAAcx9P,SAASqC,EAAO,QAGzC,MAAO,GAAGhU,KAAKyK,SAAS2kQ,IAG5B,SAASt6P,GACL,OAAO,IAAIrO,MAAMzG,KAAKqvQ,cAAcv6P,KAI5C,MAAM,GAAU,SAAS3N,GACrB,OAAOA,EAAIvI,OAAO,CAACK,EAAGC,IAAMD,EAAE0K,OAAOzK,GAAI,KAYvC,IATwB4mD,GC9Bf,CACX,SAAY,gCACZ,WAAc,iFACd,uBAA0B,wEAC1B,iBAAoB,oCACpB,kBAAqB,uJACrB,UAAa,iFACb,WAAc,oFACd,WAAc,kJACd,gBAAmB,0HACnB,iBAAoB,yFD0Bb1mD,OAAOC,KAAKymD,IAAQlnD,QAAAA,SALA6uC,EAAMhjC,GAE7B,OADAgjC,EAAKhjC,GAAQ,IAAIykQ,GAAU,CAAEzkQ,KAAAA,EAAMyc,QAAS4+B,GAAOr7C,KAC5CgjC,IAGkC,KAN5B,IAASqY,GELvB,MAAMwpN,GC5BO,CAChBC,GAAI,CACA9kQ,KAAM,KACNge,SAAU,CACN88J,QAAS,CACLiqF,QAAS,qBACTC,aAAc,MAElBC,SAAU,MAEdC,UAAW,KACXC,QAAS,CACLC,QAAS,CACLC,QAAS,IACTv4O,MAAO,IACP52B,KAAM,IACNovQ,YAAa,IACbC,SAAU,IACVjuJ,UAAW,IACXkuJ,YAAa,IACbC,uBAAwB,OACxBC,SAAU,SACVC,SAAU,SACVC,IAAK,MACLC,cAAe,KAEnBR,QAAS,CACLS,SAAU,CACN,KAEJ9jE,UAAW,CACP,IAGR+jE,WAAY,CACRD,SAAU,CACN,OAEJ9jE,UAAW,IAEfgkE,QAAS,CACLF,SAAU,CACN,MAEJ9jE,UAAW,CACP,IAGRikE,SAAU,CACNH,SAAU,CACN,MAEJ9jE,UAAW,CACP,GAEJ,wBAAyB,MACzB,0BAA2B,OAE/BkkE,WAAY,CACRC,IAAK,CACDC,YAAa,gBACb,wBAAyB,gBACzB,0BAA2B,iBAC3B/7O,OAAQ,OAEZg8O,IAAK,CACDD,YAAa,OACb,wBAAyB,OACzB,0BAA2B,QAC3B/7O,OAAQ,SACR,oBAAqB,UAEzBi8O,IAAK,CACDF,YAAa,YACb,wBAAyB,YACzB,0BAA2B,aAC3B/7O,OAAQ,IACR,oBAAqB,MAG7Bk8O,eAAgB,MAChBC,WAAY,CACRV,SAAU,CACN,KACA,QAEJ9jE,UAAW,CACP,KAIZykE,SAAU,CACNC,UAAW,SACXC,cAAe,MACfb,SAAU,CACNviO,EAAG,QACHqjO,EAAG,kBACHrwQ,EAAG,QACHswQ,EAAG,SACHnhO,EAAG,QACHs2H,EAAG,SACH8qG,EAAG,4BACH1yI,EAAG,eACH2yI,EAAG,kBACHryQ,EAAG,SACHsyQ,EAAG,YACH/vQ,EAAG,gCACHm+F,EAAG,kCAEP6xK,gBAAiB,CACbr6K,KAAM,eACNs6K,KAAM,eACNC,OAAQ,WACRC,MAAO,WACPC,iBAAkB,CACdC,GAAI,MACJC,IAAK,SACLC,KAAM,YACNjkO,EAAG,IACHkkO,EAAG,MACHC,KAAM,WACNC,MAAO,cACPC,GAAI,MACJC,IAAK,WACLC,IAAK,UACLC,KAAM,cACNC,KAAM,aACNC,GAAI,MACJC,MAAO,UACPC,OAAQ,aACRC,QAAS,gBACT10J,EAAG,MACH20J,EAAG,KACHC,GAAI,SACJC,GAAI,QACJC,IAAK,YACLC,IAAK,WACLC,KAAM,cACNC,KAAM,aACNC,IAAK,WACLC,IAAK,UACLhC,EAAG,IACHiC,GAAI,MACJC,IAAK,SACLC,IAAK,MACLC,KAAM,QACNC,MAAO,WACPC,MAAO,SACP,kBAAmB,qBACnB,oBAAqB,qBACrBxzJ,GAAI,QACJjwE,EAAG,IACH0jO,GAAI,MACJC,IAAK,QACLC,KAAM,WACNC,KAAM,QACNC,MAAO,WACPC,OAAQ,cACRC,MAAO,SACPC,KAAM,QACNC,MAAO,SACP,eAAgB,kBAChB,iBAAkB,oBAG1BC,YAAa,CACTj9K,KAAM,iBACNs6K,KAAM,cACNC,OAAQ,YACRC,MAAO,UAEX1xD,YAAa,CACT9oH,KAAM,kBACNs6K,KAAM,YACNC,OAAQ,WACRC,MAAO,UAEXnvJ,KAAM,CACFv4G,OAAQ,CACJoqQ,YAAa,CACT,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,KAEJixD,MAAO,CACH,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ2C,KAAM,CACF,SACA,SACA,UACA,YACA,WACA,SACA,aAGR,cAAe,CACXD,YAAa,CACT,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,KAEJixD,MAAO,CACH,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ2C,KAAM,CACF,SACA,SACA,UACA,YACA,WACA,SACA,cAIZjmO,OAAQ,CACJpkC,OAAQ,CACJoqQ,YAAa,CACT,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEJ4zD,KAAM,CACF,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,aAGR,cAAe,CACXD,YAAa,CACT,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEJ4zD,KAAM,CACF,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,cAIZC,SAAU,CACNtqQ,OAAQ,CACJoqQ,YAAa,CACT,KACA,KACA,KACA,MAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,KAEJ4zD,KAAM,CACF,cACA,cACA,cACA,gBAGR,cAAe,CACXD,YAAa,CACT,KACA,KACA,KACA,MAEJ3zD,OAAQ,CACJ,IACA,IACA,IACA,KAEJ4zD,KAAM,CACF,cACA,cACA,cACA,iBAIZzxJ,WAAY,CACR54G,OAAQ,CACJoqQ,YAAa,CACTG,SAAU,WACVC,GAAI,KACJ,iBAAkB,KAClBC,KAAM,OACNC,GAAI,KACJ,iBAAkB,KAClBC,SAAU,iBACVC,WAAY,mBACZC,SAAU,iBACVC,OAAQ,YAEZr0D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dO,qBAAsB,SACtBjrN,MAAO,CACH45G,SAAU,CACN,CACI1hY,IAAK,kBAET,CACIA,IAAK,gBAET,CACIA,IAAK,WAET,CACIA,IAAK,kBAGbize,mBAAoB,CAChB,CACIhwY,MAAO,UACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,WAET,CACIijG,MAAO,gBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,gBAET,CACIijG,MAAO,kBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,kBAET,CACIijG,MAAO,mBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,mBAET,CACIijG,MAAO,YACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,YAET,CACIijG,MAAO,oBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,qBAGboze,cAAe,CACX,CACInwY,MAAO,kBACPjjG,IAAK,gBAKrB,sCAAuC,CACnCshY,UAAW,sBACXC,kBAAmB,sBACnB+wG,cAAe,8BACfC,aAAc,uBACdC,aAAc,UACdO,qBAAsB,SACtBjrN,MAAO,CACH45G,SAAU,CACN,CACI1hY,IAAK,kBAET,CACIA,IAAK,gBAET,CACIA,IAAK,WAET,CACIA,IAAK,kBAGbize,mBAAoB,CAChB,CACIhwY,MAAO,UACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,WAET,CACIijG,MAAO,gBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,gBAET,CACIijG,MAAO,kBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,kBAET,CACIijG,MAAO,mBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,mBAET,CACIijG,MAAO,YACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,YAET,CACIijG,MAAO,oBACPiwY,gBAAiB,QACjBC,kBAAmB,QACnBnze,IAAK,qBAGboze,cAAe,CACX,CACInwY,MAAO,kBACPjjG,IAAK,gBAKrB,8BAA+B,CAC3BshY,UAAW,oCACXC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","sourceRoot":"webpack:///","sourcesContent":["module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","module.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = { sep: '/' }\ntry {\n path = require('path')\n} catch (er) {}\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = require('brace-expansion')\n\nvar plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n return s.split('').reduce(function (set, c) {\n set[c] = true\n return set\n }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n options = options || {}\n return function (p, i, list) {\n return minimatch(p, pattern, options)\n }\n}\n\nfunction ext (a, b) {\n a = a || {}\n b = b || {}\n var t = {}\n Object.keys(b).forEach(function (k) {\n t[k] = b[k]\n })\n Object.keys(a).forEach(function (k) {\n t[k] = a[k]\n })\n return t\n}\n\nminimatch.defaults = function (def) {\n if (!def || !Object.keys(def).length) return minimatch\n\n var orig = minimatch\n\n var m = function minimatch (p, pattern, options) {\n return orig.minimatch(p, pattern, ext(def, options))\n }\n\n m.Minimatch = function Minimatch (pattern, options) {\n return new orig.Minimatch(pattern, ext(def, options))\n }\n\n return m\n}\n\nMinimatch.defaults = function (def) {\n if (!def || !Object.keys(def).length) return Minimatch\n return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('glob pattern string required')\n }\n\n if (!options) options = {}\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n // \"\" only matches \"\"\n if (pattern.trim() === '') return p === ''\n\n return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n if (!(this instanceof Minimatch)) {\n return new Minimatch(pattern, options)\n }\n\n if (typeof pattern !== 'string') {\n throw new TypeError('glob pattern string required')\n }\n\n if (!options) options = {}\n pattern = pattern.trim()\n\n // windows support: need to use /, not \\\n if (path.sep !== '/') {\n pattern = pattern.split(path.sep).join('/')\n }\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n\n // make the set of regexps etc.\n this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n // don't do it more than once.\n if (this._made) return\n\n var pattern = this.pattern\n var options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n var set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = console.error\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(function (s) {\n return s.split(slashSplit)\n })\n\n this.debug(this.pattern, set)\n\n // glob --> regexps\n set = set.map(function (s, si, set) {\n return s.map(this.parse, this)\n }, this)\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(function (s) {\n return s.indexOf(false) === -1\n })\n\n this.debug(this.pattern, set)\n\n this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n var pattern = this.pattern\n var negate = false\n var options = this.options\n var negateOffset = 0\n\n if (options.nonegate) return\n\n for (var i = 0, l = pattern.length\n ; i < l && pattern.charAt(i) === '!'\n ; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.substr(negateOffset)\n this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n if (!options) {\n if (this instanceof Minimatch) {\n options = this.options\n } else {\n options = {}\n }\n }\n\n pattern = typeof pattern === 'undefined'\n ? this.pattern : pattern\n\n if (typeof pattern === 'undefined') {\n throw new TypeError('undefined pattern')\n }\n\n if (options.nobrace ||\n !pattern.match(/\\{.*\\}/)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n if (pattern.length > 1024 * 64) {\n throw new TypeError('pattern is too long')\n }\n\n var options = this.options\n\n // shortcuts\n if (!options.noglobstar && pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n var re = ''\n var hasMagic = !!options.nocase\n var escaping = false\n // ? => one single character\n var patternListStack = []\n var negativeLists = []\n var stateChar\n var inClass = false\n var reClassStart = -1\n var classStart = -1\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set.\n var patternStart = pattern.charAt(0) === '.' ? '' // anything\n // not (start or / followed by . or .. followed by / or end)\n : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n : '(?!\\\\.)'\n var self = this\n\n function clearStateChar () {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n self.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (var i = 0, len = pattern.length, c\n ; (i < len) && (c = pattern.charAt(i))\n ; i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping && reSpecials[c]) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n switch (c) {\n case '/':\n // completely not allowed, even escaped.\n // Should already be path-split by now.\n return false\n\n case '\\\\':\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n self.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(':\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n patternListStack.push({\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close\n })\n // negation is (?:(?!js)[^/]*)\n re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n\n case ')':\n if (inClass || !patternListStack.length) {\n re += '\\\\)'\n continue\n }\n\n clearStateChar()\n hasMagic = true\n var pl = patternListStack.pop()\n // negation is (?:(?!js)[^/]*)\n // The others are (?:)\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(pl)\n }\n pl.reEnd = re.length\n continue\n\n case '|':\n if (inClass || !patternListStack.length || escaping) {\n re += '\\\\|'\n escaping = false\n continue\n }\n\n clearStateChar()\n re += '|'\n continue\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n // handle the case where we left a class open.\n // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n if (inClass) {\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n var cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + cs + ']')\n } catch (er) {\n // not a valid class!\n var sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n hasMagic = hasMagic || sp[1]\n inClass = false\n continue\n }\n }\n\n // finish up the class.\n hasMagic = true\n inClass = false\n re += c\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (escaping) {\n // no need\n escaping = false\n } else if (reSpecials[c]\n && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.substr(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n var tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n var t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n var addPatternStart = false\n switch (re.charAt(0)) {\n case '.':\n case '[':\n case '(': addPatternStart = true\n }\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (var n = negativeLists.length - 1; n > -1; n--) {\n var nl = negativeLists[n]\n\n var nlBefore = re.slice(0, nl.reStart)\n var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n var nlAfter = re.slice(nl.reEnd)\n\n nlLast += nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n var openParensBefore = nlBefore.split('(').length - 1\n var cleanAfter = nlAfter\n for (i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n var dollar = ''\n if (nlAfter === '' && isSub !== SUBPARSE) {\n dollar = '$'\n }\n var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n re = newRe\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n var flags = options.nocase ? 'i' : ''\n try {\n var regExp = new RegExp('^' + re + '$', flags)\n } catch (er) {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n\n regExp._glob = pattern\n regExp._src = re\n\n return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n var set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n var options = this.options\n\n var twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n var flags = options.nocase ? 'i' : ''\n\n var re = set.map(function (pattern) {\n return pattern.map(function (p) {\n return (p === GLOBSTAR) ? twoStar\n : (typeof p === 'string') ? regExpEscape(p)\n : p._src\n }).join('\\\\\\/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) {\n this.regexp = false\n }\n return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n options = options || {}\n var mm = new Minimatch(pattern, options)\n list = list.filter(function (f) {\n return mm.match(f)\n })\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\nMinimatch.prototype.match = match\nfunction match (f, partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n var options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n var set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n var filename\n var i\n for (i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (i = 0; i < set.length; i++) {\n var pattern = set[i]\n var file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n var hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n if (options.nocase) {\n hit = f.toLowerCase() === p.toLowerCase()\n } else {\n hit = f === p\n }\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')\n return emptyFileEnd\n }\n\n // should be unreachable.\n throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n","// Copyright Joyent, Inc. and other Node contributors.\r\n//\r\n// Permission is hereby granted, free of charge, to any person obtaining a\r\n// copy of this software and associated documentation files (the\r\n// \"Software\"), to deal in the Software without restriction, including\r\n// without limitation the rights to use, copy, modify, merge, publish,\r\n// distribute, sublicense, and/or sell copies of the Software, and to permit\r\n// persons to whom the Software is furnished to do so, subject to the\r\n// following conditions:\r\n//\r\n// The above copyright notice and this permission notice shall be included\r\n// in all copies or substantial portions of the Software.\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\r\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\r\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n'use strict';\r\n\r\n\r\nvar isWindows = process.platform === 'win32';\r\nvar util = require('util');\r\n\r\n\r\n// resolves . and .. elements in a path array with directory names there\r\n// must be no slashes or device names (c:\\) in the array\r\n// (so also no leading and trailing slashes - it does not distinguish\r\n// relative and absolute paths)\r\nfunction normalizeArray(parts, allowAboveRoot) {\r\n var res = [];\r\n for (var i = 0; i < parts.length; i++) {\r\n var p = parts[i];\r\n\r\n // ignore empty parts\r\n if (!p || p === '.')\r\n continue;\r\n\r\n if (p === '..') {\r\n if (res.length && res[res.length - 1] !== '..') {\r\n res.pop();\r\n } else if (allowAboveRoot) {\r\n res.push('..');\r\n }\r\n } else {\r\n res.push(p);\r\n }\r\n }\r\n\r\n return res;\r\n}\r\n\r\n// returns an array with empty elements removed from either end of the input\r\n// array or the original array if no elements need to be removed\r\nfunction trimArray(arr) {\r\n var lastIndex = arr.length - 1;\r\n var start = 0;\r\n for (; start <= lastIndex; start++) {\r\n if (arr[start])\r\n break;\r\n }\r\n\r\n var end = lastIndex;\r\n for (; end >= 0; end--) {\r\n if (arr[end])\r\n break;\r\n }\r\n\r\n if (start === 0 && end === lastIndex)\r\n return arr;\r\n if (start > end)\r\n return [];\r\n return arr.slice(start, end + 1);\r\n}\r\n\r\n// Regex to split a windows path into three parts: [*, device, slash,\r\n// tail] windows-only\r\nvar splitDeviceRe =\r\n /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\r\n\r\n// Regex to split the tail part of the above into [*, dir, basename, ext]\r\nvar splitTailRe =\r\n /^([\\s\\S]*?)((?:\\.{1,2}|[^\\\\\\/]+?|)(\\.[^.\\/\\\\]*|))(?:[\\\\\\/]*)$/;\r\n\r\nvar win32 = {};\r\n\r\n// Function to split a filename into [root, dir, basename, ext]\r\nfunction win32SplitPath(filename) {\r\n // Separate device+slash from tail\r\n var result = splitDeviceRe.exec(filename),\r\n device = (result[1] || '') + (result[2] || ''),\r\n tail = result[3] || '';\r\n // Split the tail into dir, basename and extension\r\n var result2 = splitTailRe.exec(tail),\r\n dir = result2[1],\r\n basename = result2[2],\r\n ext = result2[3];\r\n return [device, dir, basename, ext];\r\n}\r\n\r\nfunction win32StatPath(path) {\r\n var result = splitDeviceRe.exec(path),\r\n device = result[1] || '',\r\n isUnc = !!device && device[1] !== ':';\r\n return {\r\n device: device,\r\n isUnc: isUnc,\r\n isAbsolute: isUnc || !!result[2], // UNC paths are always absolute\r\n tail: result[3]\r\n };\r\n}\r\n\r\nfunction normalizeUNCRoot(device) {\r\n return '\\\\\\\\' + device.replace(/^[\\\\\\/]+/, '').replace(/[\\\\\\/]+/g, '\\\\');\r\n}\r\n\r\n// path.resolve([from ...], to)\r\nwin32.resolve = function() {\r\n var resolvedDevice = '',\r\n resolvedTail = '',\r\n resolvedAbsolute = false;\r\n\r\n for (var i = arguments.length - 1; i >= -1; i--) {\r\n var path;\r\n if (i >= 0) {\r\n path = arguments[i];\r\n } else if (!resolvedDevice) {\r\n path = process.cwd();\r\n } else {\r\n // Windows has the concept of drive-specific current working\r\n // directories. If we've resolved a drive letter but not yet an\r\n // absolute path, get cwd for that drive. We're sure the device is not\r\n // an unc path at this points, because unc paths are always absolute.\r\n path = process.env['=' + resolvedDevice];\r\n // Verify that a drive-local cwd was found and that it actually points\r\n // to our drive. If not, default to the drive's root.\r\n if (!path || path.substr(0, 3).toLowerCase() !==\r\n resolvedDevice.toLowerCase() + '\\\\') {\r\n path = resolvedDevice + '\\\\';\r\n }\r\n }\r\n\r\n // Skip empty and invalid entries\r\n if (!util.isString(path)) {\r\n throw new TypeError('Arguments to path.resolve must be strings');\r\n } else if (!path) {\r\n continue;\r\n }\r\n\r\n var result = win32StatPath(path),\r\n device = result.device,\r\n isUnc = result.isUnc,\r\n isAbsolute = result.isAbsolute,\r\n tail = result.tail;\r\n\r\n if (device &&\r\n resolvedDevice &&\r\n device.toLowerCase() !== resolvedDevice.toLowerCase()) {\r\n // This path points to another device so it is not applicable\r\n continue;\r\n }\r\n\r\n if (!resolvedDevice) {\r\n resolvedDevice = device;\r\n }\r\n if (!resolvedAbsolute) {\r\n resolvedTail = tail + '\\\\' + resolvedTail;\r\n resolvedAbsolute = isAbsolute;\r\n }\r\n\r\n if (resolvedDevice && resolvedAbsolute) {\r\n break;\r\n }\r\n }\r\n\r\n // Convert slashes to backslashes when `resolvedDevice` points to an UNC\r\n // root. Also squash multiple slashes into a single one where appropriate.\r\n if (isUnc) {\r\n resolvedDevice = normalizeUNCRoot(resolvedDevice);\r\n }\r\n\r\n // At this point the path should be resolved to a full absolute path,\r\n // but handle relative paths to be safe (might happen when process.cwd()\r\n // fails)\r\n\r\n // Normalize the tail path\r\n resolvedTail = normalizeArray(resolvedTail.split(/[\\\\\\/]+/),\r\n !resolvedAbsolute).join('\\\\');\r\n\r\n return (resolvedDevice + (resolvedAbsolute ? '\\\\' : '') + resolvedTail) ||\r\n '.';\r\n};\r\n\r\n\r\nwin32.normalize = function(path) {\r\n var result = win32StatPath(path),\r\n device = result.device,\r\n isUnc = result.isUnc,\r\n isAbsolute = result.isAbsolute,\r\n tail = result.tail,\r\n trailingSlash = /[\\\\\\/]$/.test(tail);\r\n\r\n // Normalize the tail path\r\n tail = normalizeArray(tail.split(/[\\\\\\/]+/), !isAbsolute).join('\\\\');\r\n\r\n if (!tail && !isAbsolute) {\r\n tail = '.';\r\n }\r\n if (tail && trailingSlash) {\r\n tail += '\\\\';\r\n }\r\n\r\n // Convert slashes to backslashes when `device` points to an UNC root.\r\n // Also squash multiple slashes into a single one where appropriate.\r\n if (isUnc) {\r\n device = normalizeUNCRoot(device);\r\n }\r\n\r\n return device + (isAbsolute ? '\\\\' : '') + tail;\r\n};\r\n\r\n\r\nwin32.isAbsolute = function(path) {\r\n return win32StatPath(path).isAbsolute;\r\n};\r\n\r\nwin32.join = function() {\r\n var paths = [];\r\n for (var i = 0; i < arguments.length; i++) {\r\n var arg = arguments[i];\r\n if (!util.isString(arg)) {\r\n throw new TypeError('Arguments to path.join must be strings');\r\n }\r\n if (arg) {\r\n paths.push(arg);\r\n }\r\n }\r\n\r\n var joined = paths.join('\\\\');\r\n\r\n // Make sure that the joined path doesn't start with two slashes, because\r\n // normalize() will mistake it for an UNC path then.\r\n //\r\n // This step is skipped when it is very clear that the user actually\r\n // intended to point at an UNC path. This is assumed when the first\r\n // non-empty string arguments starts with exactly two slashes followed by\r\n // at least one more non-slash character.\r\n //\r\n // Note that for normalize() to treat a path as an UNC path it needs to\r\n // have at least 2 components, so we don't filter for that here.\r\n // This means that the user can use join to construct UNC paths from\r\n // a server name and a share name; for example:\r\n // path.join('//server', 'share') -> '\\\\\\\\server\\\\share\\')\r\n if (!/^[\\\\\\/]{2}[^\\\\\\/]/.test(paths[0])) {\r\n joined = joined.replace(/^[\\\\\\/]{2,}/, '\\\\');\r\n }\r\n\r\n return win32.normalize(joined);\r\n};\r\n\r\n\r\n// path.relative(from, to)\r\n// it will solve the relative path from 'from' to 'to', for instance:\r\n// from = 'C:\\\\orandea\\\\test\\\\aaa'\r\n// to = 'C:\\\\orandea\\\\impl\\\\bbb'\r\n// The output of the function should be: '..\\\\..\\\\impl\\\\bbb'\r\nwin32.relative = function(from, to) {\r\n from = win32.resolve(from);\r\n to = win32.resolve(to);\r\n\r\n // windows is not case sensitive\r\n var lowerFrom = from.toLowerCase();\r\n var lowerTo = to.toLowerCase();\r\n\r\n var toParts = trimArray(to.split('\\\\'));\r\n\r\n var lowerFromParts = trimArray(lowerFrom.split('\\\\'));\r\n var lowerToParts = trimArray(lowerTo.split('\\\\'));\r\n\r\n var length = Math.min(lowerFromParts.length, lowerToParts.length);\r\n var samePartsLength = length;\r\n for (var i = 0; i < length; i++) {\r\n if (lowerFromParts[i] !== lowerToParts[i]) {\r\n samePartsLength = i;\r\n break;\r\n }\r\n }\r\n\r\n if (samePartsLength == 0) {\r\n return to;\r\n }\r\n\r\n var outputParts = [];\r\n for (var i = samePartsLength; i < lowerFromParts.length; i++) {\r\n outputParts.push('..');\r\n }\r\n\r\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\r\n\r\n return outputParts.join('\\\\');\r\n};\r\n\r\n\r\nwin32._makeLong = function(path) {\r\n // Note: this will *probably* throw somewhere.\r\n if (!util.isString(path))\r\n return path;\r\n\r\n if (!path) {\r\n return '';\r\n }\r\n\r\n var resolvedPath = win32.resolve(path);\r\n\r\n if (/^[a-zA-Z]\\:\\\\/.test(resolvedPath)) {\r\n // path is local filesystem path, which needs to be converted\r\n // to long UNC path.\r\n return '\\\\\\\\?\\\\' + resolvedPath;\r\n } else if (/^\\\\\\\\[^?.]/.test(resolvedPath)) {\r\n // path is network UNC path, which needs to be converted\r\n // to long UNC path.\r\n return '\\\\\\\\?\\\\UNC\\\\' + resolvedPath.substring(2);\r\n }\r\n\r\n return path;\r\n};\r\n\r\n\r\nwin32.dirname = function(path) {\r\n var result = win32SplitPath(path),\r\n root = result[0],\r\n dir = result[1];\r\n\r\n if (!root && !dir) {\r\n // No dirname whatsoever\r\n return '.';\r\n }\r\n\r\n if (dir) {\r\n // It has a dirname, strip trailing slash\r\n dir = dir.substr(0, dir.length - 1);\r\n }\r\n\r\n return root + dir;\r\n};\r\n\r\n\r\nwin32.basename = function(path, ext) {\r\n var f = win32SplitPath(path)[2];\r\n // TODO: make this comparison case-insensitive on windows?\r\n if (ext && f.substr(-1 * ext.length) === ext) {\r\n f = f.substr(0, f.length - ext.length);\r\n }\r\n return f;\r\n};\r\n\r\n\r\nwin32.extname = function(path) {\r\n return win32SplitPath(path)[3];\r\n};\r\n\r\n\r\nwin32.format = function(pathObject) {\r\n if (!util.isObject(pathObject)) {\r\n throw new TypeError(\r\n \"Parameter 'pathObject' must be an object, not \" + typeof pathObject\r\n );\r\n }\r\n\r\n var root = pathObject.root || '';\r\n\r\n if (!util.isString(root)) {\r\n throw new TypeError(\r\n \"'pathObject.root' must be a string or undefined, not \" +\r\n typeof pathObject.root\r\n );\r\n }\r\n\r\n var dir = pathObject.dir;\r\n var base = pathObject.base || '';\r\n if (!dir) {\r\n return base;\r\n }\r\n if (dir[dir.length - 1] === win32.sep) {\r\n return dir + base;\r\n }\r\n return dir + win32.sep + base;\r\n};\r\n\r\n\r\nwin32.parse = function(pathString) {\r\n if (!util.isString(pathString)) {\r\n throw new TypeError(\r\n \"Parameter 'pathString' must be a string, not \" + typeof pathString\r\n );\r\n }\r\n var allParts = win32SplitPath(pathString);\r\n if (!allParts || allParts.length !== 4) {\r\n throw new TypeError(\"Invalid path '\" + pathString + \"'\");\r\n }\r\n return {\r\n root: allParts[0],\r\n dir: allParts[0] + allParts[1].slice(0, -1),\r\n base: allParts[2],\r\n ext: allParts[3],\r\n name: allParts[2].slice(0, allParts[2].length - allParts[3].length)\r\n };\r\n};\r\n\r\n\r\nwin32.sep = '\\\\';\r\nwin32.delimiter = ';';\r\n\r\n\r\n// Split a filename into [root, dir, basename, ext], unix version\r\n// 'root' is just a slash, or nothing.\r\nvar splitPathRe =\r\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\r\nvar posix = {};\r\n\r\n\r\nfunction posixSplitPath(filename) {\r\n return splitPathRe.exec(filename).slice(1);\r\n}\r\n\r\n\r\n// path.resolve([from ...], to)\r\n// posix version\r\nposix.resolve = function() {\r\n var resolvedPath = '',\r\n resolvedAbsolute = false;\r\n\r\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\r\n var path = (i >= 0) ? arguments[i] : process.cwd();\r\n\r\n // Skip empty and invalid entries\r\n if (!util.isString(path)) {\r\n throw new TypeError('Arguments to path.resolve must be strings');\r\n } else if (!path) {\r\n continue;\r\n }\r\n\r\n resolvedPath = path + '/' + resolvedPath;\r\n resolvedAbsolute = path[0] === '/';\r\n }\r\n\r\n // At this point the path should be resolved to a full absolute path, but\r\n // handle relative paths to be safe (might happen when process.cwd() fails)\r\n\r\n // Normalize the path\r\n resolvedPath = normalizeArray(resolvedPath.split('/'),\r\n !resolvedAbsolute).join('/');\r\n\r\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\r\n};\r\n\r\n// path.normalize(path)\r\n// posix version\r\nposix.normalize = function(path) {\r\n var isAbsolute = posix.isAbsolute(path),\r\n trailingSlash = path && path[path.length - 1] === '/';\r\n\r\n // Normalize the path\r\n path = normalizeArray(path.split('/'), !isAbsolute).join('/');\r\n\r\n if (!path && !isAbsolute) {\r\n path = '.';\r\n }\r\n if (path && trailingSlash) {\r\n path += '/';\r\n }\r\n\r\n return (isAbsolute ? '/' : '') + path;\r\n};\r\n\r\n// posix version\r\nposix.isAbsolute = function(path) {\r\n return path.charAt(0) === '/';\r\n};\r\n\r\n// posix version\r\nposix.join = function() {\r\n var path = '';\r\n for (var i = 0; i < arguments.length; i++) {\r\n var segment = arguments[i];\r\n if (!util.isString(segment)) {\r\n throw new TypeError('Arguments to path.join must be strings');\r\n }\r\n if (segment) {\r\n if (!path) {\r\n path += segment;\r\n } else {\r\n path += '/' + segment;\r\n }\r\n }\r\n }\r\n return posix.normalize(path);\r\n};\r\n\r\n\r\n// path.relative(from, to)\r\n// posix version\r\nposix.relative = function(from, to) {\r\n from = posix.resolve(from).substr(1);\r\n to = posix.resolve(to).substr(1);\r\n\r\n var fromParts = trimArray(from.split('/'));\r\n var toParts = trimArray(to.split('/'));\r\n\r\n var length = Math.min(fromParts.length, toParts.length);\r\n var samePartsLength = length;\r\n for (var i = 0; i < length; i++) {\r\n if (fromParts[i] !== toParts[i]) {\r\n samePartsLength = i;\r\n break;\r\n }\r\n }\r\n\r\n var outputParts = [];\r\n for (var i = samePartsLength; i < fromParts.length; i++) {\r\n outputParts.push('..');\r\n }\r\n\r\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\r\n\r\n return outputParts.join('/');\r\n};\r\n\r\n\r\nposix._makeLong = function(path) {\r\n return path;\r\n};\r\n\r\n\r\nposix.dirname = function(path) {\r\n var result = posixSplitPath(path),\r\n root = result[0],\r\n dir = result[1];\r\n\r\n if (!root && !dir) {\r\n // No dirname whatsoever\r\n return '.';\r\n }\r\n\r\n if (dir) {\r\n // It has a dirname, strip trailing slash\r\n dir = dir.substr(0, dir.length - 1);\r\n }\r\n\r\n return root + dir;\r\n};\r\n\r\n\r\nposix.basename = function(path, ext) {\r\n var f = posixSplitPath(path)[2];\r\n // TODO: make this comparison case-insensitive on windows?\r\n if (ext && f.substr(-1 * ext.length) === ext) {\r\n f = f.substr(0, f.length - ext.length);\r\n }\r\n return f;\r\n};\r\n\r\n\r\nposix.extname = function(path) {\r\n return posixSplitPath(path)[3];\r\n};\r\n\r\n\r\nposix.format = function(pathObject) {\r\n if (!util.isObject(pathObject)) {\r\n throw new TypeError(\r\n \"Parameter 'pathObject' must be an object, not \" + typeof pathObject\r\n );\r\n }\r\n\r\n var root = pathObject.root || '';\r\n\r\n if (!util.isString(root)) {\r\n throw new TypeError(\r\n \"'pathObject.root' must be a string or undefined, not \" +\r\n typeof pathObject.root\r\n );\r\n }\r\n\r\n var dir = pathObject.dir ? pathObject.dir + posix.sep : '';\r\n var base = pathObject.base || '';\r\n return dir + base;\r\n};\r\n\r\n\r\nposix.parse = function(pathString) {\r\n if (!util.isString(pathString)) {\r\n throw new TypeError(\r\n \"Parameter 'pathString' must be a string, not \" + typeof pathString\r\n );\r\n }\r\n var allParts = posixSplitPath(pathString);\r\n if (!allParts || allParts.length !== 4) {\r\n throw new TypeError(\"Invalid path '\" + pathString + \"'\");\r\n }\r\n allParts[1] = allParts[1] || '';\r\n allParts[2] = allParts[2] || '';\r\n allParts[3] = allParts[3] || '';\r\n\r\n return {\r\n root: allParts[0],\r\n dir: allParts[0] + allParts[1].slice(0, -1),\r\n base: allParts[2],\r\n ext: allParts[3],\r\n name: allParts[2].slice(0, allParts[2].length - allParts[3].length)\r\n };\r\n};\r\n\r\n\r\nposix.sep = '/';\r\nposix.delimiter = ':';\r\n\r\n\r\nif (isWindows)\r\n module.exports = win32;\r\nelse /* posix */\r\n module.exports = posix;\r\n\r\nmodule.exports.posix = posix;\r\nmodule.exports.win32 = win32;\r\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n","/**\n * @license\n * Lodash \n * Copyright OpenJS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.21';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function',\n INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading whitespace. */\n var reTrimStart = /^\\s+/;\n\n /** Used to match a single whitespace character. */\n var reWhitespace = /\\s/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\n var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\n function baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision && nativeIsFinite(number)) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': '\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\n\nfunction fillBlack(abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (abstract.attributes && (abstract.attributes.fill || force)) {\n abstract.attributes.fill = 'black';\n }\n\n return abstract;\n}\n\nfunction deGroup(abstract) {\n if (abstract.tag === 'g') {\n return abstract.children;\n } else {\n return [abstract];\n }\n}\n\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [fillBlack(_objectSpread({\n tag: mainPath.tag,\n attributes: _objectSpread({}, mainPath.attributes, trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var isUploadedIcon = prefix === 'fak';\n var widthClass = isUploadedIcon ? '' : \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== '' || !!c;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n } : {};\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread({}, uploadedIconWidthStyle, extra.styles)\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.15.3\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && Object.keys(PREFIX_TO_STYLE).indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n delete abstract[0].attributes.id;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n var titleId = node.getAttribute('data-fa-title-id');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n titleId: node.getAttribute('data-fa-title-id'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: node.getAttribute('data-fa-mask-id'),\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n\n var _icon$slice = icon.slice(4),\n _icon$slice2 = _slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n\n var element = null;\n\n if (Array.isArray(vectorData)) {\n element = {\n tag: 'g',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n fill: 'currentColor',\n d: vectorData[0]\n }\n }, {\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n fill: 'currentColor',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData\n }\n };\n }\n\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n var content = styles.getPropertyValue('content');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== 'none' && content !== '') {\n var _content = styles.getPropertyValue('content');\n\n var prefix = ~['Solid', 'Regular', 'Light', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(_content.length === 3 ? _content.substr(1, 1) : _content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse {\\n color: #fff;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var customPropPatt = new RegExp(\"\\\\--\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes4 = params.classes,\n classes = _params$classes4 === void 0 ? [] : _params$classes4;\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: [\"\".concat(config.familyPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n","import { __decorate, __param } from 'tslib';\nimport { ɵɵdefineInjectable, Injectable, Input, Directive, Optional, HostBinding, Component, Renderer2, ElementRef, NgModule } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { findIconDefinition, parse, icon, counter, text } from '@fortawesome/fontawesome-svg-core';\n\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/platform-browser';\n\nconst _c0 = [[[\"fa-icon\"], [\"fa-duotone-icon\"], [\"fa-layers-text\"], [\"fa-layers-counter\"]]];\nconst _c1 = [\"fa-icon, fa-duotone-icon, fa-layers-text, fa-layers-counter\"];\nconst _c2 = [[[\"fa-icon\", \"stackItemSize\", \"\"], [\"fa-duotone-icon\", \"stackItemSize\", \"\"]]];\nconst _c3 = [\"fa-icon[stackItemSize],fa-duotone-icon[stackItemSize]\"];\nlet FaConfig = class FaConfig {\n constructor() {\n /**\n * Default prefix to use, when one is not provided with the icon name.\n *\n * @default 'fas'\n */\n this.defaultPrefix = 'fas';\n /**\n * Provides a fallback icon to use whilst main icon is being loaded asynchronously.\n * When value is null, then fa-icon component will throw an error if icon input is missing.\n * When value is not null, then the provided icon will be used as a fallback icon if icon input is missing.\n *\n * @default null\n */\n this.fallbackIcon = null;\n /**\n * Whether components should lookup icon definitions in the global icon\n * library (the one available from\n * `import { library } from '@fortawesome/fontawesome-svg-core')`.\n *\n * See https://github.com/FortAwesome/angular-fontawesome/blob/master/docs/usage/icon-library.md\n * for detailed description of library modes.\n *\n * - 'unset' - Components should lookup icon definitions in the global library\n * and emit warning if they find a definition there. This option is a default\n * to assist existing applications with a migration. Applications are expected\n * to switch to using {@link FaIconLibrary}.\n * - true - Components should lookup icon definitions in the global library.\n * Note that global icon library is deprecated and support for it will be\n * removed. This option can be used to temporarily suppress warnings.\n * - false - Components should not lookup icon definitions in the global\n * library. Library will throw an error if missing icon is found in the global\n * library.\n *\n * @deprecated This option is deprecated since 0.5.0. In 0.6.0 default will\n * be changed to false. In 0.7.0 the option will be removed together with the\n * support for the global icon library.\n *\n * @default false\n */\n this.globalLibrary = false;\n }\n};\nFaConfig.ɵfac = function FaConfig_Factory(t) { return new (t || FaConfig)(); };\nFaConfig.ɵprov = ɵɵdefineInjectable({ factory: function FaConfig_Factory() { return new FaConfig(); }, token: FaConfig, providedIn: \"root\" });\n\nlet FaIconLibrary = class FaIconLibrary {\n constructor() {\n this.definitions = {};\n }\n addIcons(...icons) {\n for (const icon of icons) {\n if (!(icon.prefix in this.definitions)) {\n this.definitions[icon.prefix] = {};\n }\n this.definitions[icon.prefix][icon.iconName] = icon;\n }\n }\n addIconPacks(...packs) {\n for (const pack of packs) {\n const icons = Object.keys(pack).map((key) => pack[key]);\n this.addIcons(...icons);\n }\n }\n getIconDefinition(prefix, name) {\n if (prefix in this.definitions && name in this.definitions[prefix]) {\n return this.definitions[prefix][name];\n }\n return null;\n }\n};\nFaIconLibrary.ɵfac = function FaIconLibrary_Factory(t) { return new (t || FaIconLibrary)(); };\nFaIconLibrary.ɵprov = ɵɵdefineInjectable({ factory: function FaIconLibrary_Factory() { return new FaIconLibrary(); }, token: FaIconLibrary, providedIn: \"root\" });\n\nconst faWarnIfIconDefinitionMissing = (iconSpec) => {\n throw new Error(`Could not find icon with iconName=${iconSpec.iconName} and prefix=${iconSpec.prefix} in the icon library.`);\n};\n\nconst faWarnIfIconSpecMissing = () => {\n throw new Error('Property `icon` is required for `fa-icon`/`fa-duotone-icon` components.');\n};\n\n/**\n * Fontawesome class list.\n * Returns classes array by props.\n */\nconst faClassList = (props) => {\n const classes = {\n 'fa-spin': props.spin,\n 'fa-pulse': props.pulse,\n 'fa-fw': props.fixedWidth,\n 'fa-border': props.border,\n 'fa-inverse': props.inverse,\n 'fa-layers-counter': props.counter,\n 'fa-flip-horizontal': props.flip === 'horizontal' || props.flip === 'both',\n 'fa-flip-vertical': props.flip === 'vertical' || props.flip === 'both',\n [`fa-${props.size}`]: props.size !== null,\n [`fa-rotate-${props.rotate}`]: props.rotate !== null,\n [`fa-pull-${props.pull}`]: props.pull !== null,\n [`fa-stack-${props.stackItemSize}`]: props.stackItemSize != null,\n };\n return Object.keys(classes)\n .map((key) => (classes[key] ? key : null))\n .filter((key) => key);\n};\n\n/**\n * Returns if is IconLookup or not.\n */\nconst isIconLookup = (i) => {\n return i.prefix !== undefined && i.iconName !== undefined;\n};\n\n/**\n * Normalizing icon spec.\n */\nconst faNormalizeIconSpec = (iconSpec, defaultPrefix) => {\n if (isIconLookup(iconSpec)) {\n return iconSpec;\n }\n if (Array.isArray(iconSpec) && iconSpec.length === 2) {\n return { prefix: iconSpec[0], iconName: iconSpec[1] };\n }\n if (typeof iconSpec === 'string') {\n return { prefix: defaultPrefix, iconName: iconSpec };\n }\n};\n\nlet FaStackItemSizeDirective = class FaStackItemSizeDirective {\n constructor() {\n /**\n * Specify whether icon inside {@link FaStackComponent} should be rendered in\n * regular size (1x) or as a larger icon (2x).\n */\n this.stackItemSize = '1x';\n }\n ngOnChanges(changes) {\n if ('size' in changes) {\n throw new Error('fa-icon is not allowed to customize size when used inside fa-stack. ' +\n 'Set size on the enclosing fa-stack instead: ....');\n }\n }\n};\nFaStackItemSizeDirective.ɵfac = function FaStackItemSizeDirective_Factory(t) { return new (t || FaStackItemSizeDirective)(); };\nFaStackItemSizeDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FaStackItemSizeDirective, selectors: [[\"fa-icon\", \"stackItemSize\", \"\"], [\"fa-duotone-icon\", \"stackItemSize\", \"\"]], inputs: { stackItemSize: \"stackItemSize\", size: \"size\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n__decorate([\n Input()\n], FaStackItemSizeDirective.prototype, \"stackItemSize\", void 0);\n__decorate([\n Input()\n], FaStackItemSizeDirective.prototype, \"size\", void 0);\n\nlet FaIconComponent = class FaIconComponent {\n constructor(sanitizer, config, iconLibrary, stackItem) {\n this.sanitizer = sanitizer;\n this.config = config;\n this.iconLibrary = iconLibrary;\n this.stackItem = stackItem;\n this.classes = [];\n }\n ngOnChanges(changes) {\n if (this.icon == null && this.config.fallbackIcon == null) {\n return faWarnIfIconSpecMissing();\n }\n let iconToBeRendered = null;\n if (this.icon == null) {\n iconToBeRendered = this.config.fallbackIcon;\n }\n else {\n iconToBeRendered = this.icon;\n }\n if (changes) {\n const iconDefinition = this.findIconDefinition(iconToBeRendered);\n if (iconDefinition != null) {\n const params = this.buildParams();\n this.renderIcon(iconDefinition, params);\n }\n }\n }\n /**\n * Programmatically trigger rendering of the icon.\n *\n * This method is useful, when creating {@link FaIconComponent} dynamically or\n * changing its inputs programmatically as in these cases icon won't be\n * re-rendered automatically.\n */\n render() {\n this.ngOnChanges({});\n }\n findIconDefinition(i) {\n const lookup = faNormalizeIconSpec(i, this.config.defaultPrefix);\n if ('icon' in lookup) {\n return lookup;\n }\n const definition = this.iconLibrary.getIconDefinition(lookup.prefix, lookup.iconName);\n if (definition != null) {\n return definition;\n }\n const globalDefinition = findIconDefinition(lookup);\n if (globalDefinition != null) {\n const message = 'Global icon library is deprecated. ' +\n 'Consult https://github.com/FortAwesome/angular-fontawesome/blob/master/UPGRADING.md ' +\n 'for the migration instructions.';\n if (this.config.globalLibrary === 'unset') {\n console.error('FontAwesome: ' + message);\n }\n else if (!this.config.globalLibrary) {\n throw new Error(message);\n }\n return globalDefinition;\n }\n faWarnIfIconDefinitionMissing(lookup);\n return null;\n }\n buildParams() {\n const classOpts = {\n flip: this.flip,\n spin: this.spin,\n pulse: this.pulse,\n border: this.border,\n inverse: this.inverse,\n size: this.size || null,\n pull: this.pull || null,\n rotate: this.rotate || null,\n fixedWidth: typeof this.fixedWidth === 'boolean' ? this.fixedWidth : this.config.fixedWidth,\n stackItemSize: this.stackItem != null ? this.stackItem.stackItemSize : null,\n };\n const parsedTransform = typeof this.transform === 'string' ? parse.transform(this.transform) : this.transform;\n return {\n title: this.title,\n transform: parsedTransform,\n classes: [...faClassList(classOpts), ...this.classes],\n mask: this.mask != null ? this.findIconDefinition(this.mask) : null,\n styles: this.styles != null ? this.styles : {},\n symbol: this.symbol,\n attributes: {\n role: this.a11yRole,\n },\n };\n }\n renderIcon(definition, params) {\n const renderedIcon = icon(definition, params);\n this.renderedIconHTML = this.sanitizer.bypassSecurityTrustHtml(renderedIcon.html.join('\\n'));\n }\n};\nFaIconComponent.ɵfac = function FaIconComponent_Factory(t) { return new (t || FaIconComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DomSanitizer), ɵngcc0.ɵɵdirectiveInject(FaConfig), ɵngcc0.ɵɵdirectiveInject(FaIconLibrary), ɵngcc0.ɵɵdirectiveInject(FaStackItemSizeDirective, 8)); };\nFaIconComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaIconComponent, selectors: [[\"fa-icon\"]], hostAttrs: [1, \"ng-fa-icon\"], hostVars: 2, hostBindings: function FaIconComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"innerHTML\", ctx.renderedIconHTML, ɵngcc0.ɵɵsanitizeHtml);\n ɵngcc0.ɵɵattribute(\"title\", ctx.title);\n } }, inputs: { classes: \"classes\", icon: \"icon\", title: \"title\", spin: \"spin\", pulse: \"pulse\", mask: \"mask\", styles: \"styles\", flip: \"flip\", size: \"size\", pull: \"pull\", border: \"border\", inverse: \"inverse\", symbol: \"symbol\", rotate: \"rotate\", fixedWidth: \"fixedWidth\", transform: \"transform\", a11yRole: \"a11yRole\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function FaIconComponent_Template(rf, ctx) { }, encapsulation: 2 });\nFaIconComponent.ctorParameters = () => [\n { type: DomSanitizer },\n { type: FaConfig },\n { type: FaIconLibrary },\n { type: FaStackItemSizeDirective, decorators: [{ type: Optional }] }\n];\n__decorate([\n Input()\n], FaIconComponent.prototype, \"icon\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"title\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"spin\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"pulse\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"mask\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"styles\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"flip\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"size\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"pull\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"border\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"inverse\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"symbol\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"rotate\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"fixedWidth\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"classes\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"transform\", void 0);\n__decorate([\n Input()\n], FaIconComponent.prototype, \"a11yRole\", void 0);\n__decorate([\n HostBinding('innerHTML')\n], FaIconComponent.prototype, \"renderedIconHTML\", void 0);\nFaIconComponent = __decorate([ __param(3, Optional())\n], FaIconComponent);\n\nlet FaDuotoneIconComponent = class FaDuotoneIconComponent extends FaIconComponent {\n findIconDefinition(i) {\n const lookup = super.findIconDefinition(i);\n if (lookup != null && lookup.prefix !== 'fad') {\n throw new Error('The specified icon does not appear to be a Duotone icon. ' +\n 'Check that you specified the correct style: ' +\n ` ` +\n `or use: instead.`);\n }\n return lookup;\n }\n buildParams() {\n const params = super.buildParams();\n if (this.swapOpacity === true || this.swapOpacity === 'true') {\n params.classes.push('fa-swap-opacity');\n }\n if (this.primaryOpacity != null) {\n params.styles['--fa-primary-opacity'] = this.primaryOpacity.toString();\n }\n if (this.secondaryOpacity != null) {\n params.styles['--fa-secondary-opacity'] = this.secondaryOpacity.toString();\n }\n if (this.primaryColor != null) {\n params.styles['--fa-primary-color'] = this.primaryColor;\n }\n if (this.secondaryColor != null) {\n params.styles['--fa-secondary-color'] = this.secondaryColor;\n }\n return params;\n }\n};\nFaDuotoneIconComponent.ɵfac = function FaDuotoneIconComponent_Factory(t) { return ɵFaDuotoneIconComponent_BaseFactory(t || FaDuotoneIconComponent); };\nFaDuotoneIconComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaDuotoneIconComponent, selectors: [[\"fa-duotone-icon\"]], inputs: { swapOpacity: \"swapOpacity\", primaryOpacity: \"primaryOpacity\", secondaryOpacity: \"secondaryOpacity\", primaryColor: \"primaryColor\", secondaryColor: \"secondaryColor\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function FaDuotoneIconComponent_Template(rf, ctx) { }, encapsulation: 2 });\n__decorate([\n Input()\n], FaDuotoneIconComponent.prototype, \"swapOpacity\", void 0);\n__decorate([\n Input()\n], FaDuotoneIconComponent.prototype, \"primaryOpacity\", void 0);\n__decorate([\n Input()\n], FaDuotoneIconComponent.prototype, \"secondaryOpacity\", void 0);\n__decorate([\n Input()\n], FaDuotoneIconComponent.prototype, \"primaryColor\", void 0);\n__decorate([\n Input()\n], FaDuotoneIconComponent.prototype, \"secondaryColor\", void 0);\n\n/**\n * Warns if parent component not existing.\n */\nconst faWarnIfParentNotExist = (parent, parentName, childName) => {\n if (!parent) {\n throw new Error(`${childName} should be used as child of ${parentName} only.`);\n }\n};\n\n/**\n * Fontawesome layers.\n */\nlet FaLayersComponent = class FaLayersComponent {\n constructor(renderer, elementRef, config) {\n this.renderer = renderer;\n this.elementRef = elementRef;\n this.config = config;\n }\n ngOnInit() {\n this.renderer.addClass(this.elementRef.nativeElement, 'fa-layers');\n this.fixedWidth = typeof this.fixedWidth === 'boolean' ? this.fixedWidth : this.config.fixedWidth;\n }\n ngOnChanges(changes) {\n if ('size' in changes) {\n if (changes.size.currentValue != null) {\n this.renderer.addClass(this.elementRef.nativeElement, `fa-${changes.size.currentValue}`);\n }\n if (changes.size.previousValue != null) {\n this.renderer.removeClass(this.elementRef.nativeElement, `fa-${changes.size.previousValue}`);\n }\n }\n }\n};\nFaLayersComponent.ɵfac = function FaLayersComponent_Factory(t) { return new (t || FaLayersComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(FaConfig)); };\nFaLayersComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaLayersComponent, selectors: [[\"fa-layers\"]], hostVars: 2, hostBindings: function FaLayersComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"fa-fw\", ctx.fixedWidth);\n } }, inputs: { fixedWidth: \"fixedWidth\", size: \"size\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function FaLayersComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c0);\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\nFaLayersComponent.ctorParameters = () => [\n { type: Renderer2 },\n { type: ElementRef },\n { type: FaConfig }\n];\n__decorate([\n Input()\n], FaLayersComponent.prototype, \"size\", void 0);\n__decorate([\n Input(), HostBinding('class.fa-fw')\n], FaLayersComponent.prototype, \"fixedWidth\", void 0);\n\nlet FaLayersCounterComponent = class FaLayersCounterComponent {\n constructor(parent, sanitizer) {\n this.parent = parent;\n this.sanitizer = sanitizer;\n this.classes = [];\n faWarnIfParentNotExist(this.parent, 'FaLayersComponent', this.constructor.name);\n }\n ngOnChanges(changes) {\n if (changes) {\n const params = this.buildParams();\n this.updateContent(params);\n }\n }\n buildParams() {\n return {\n title: this.title,\n classes: this.classes,\n styles: this.styles,\n };\n }\n updateContent(params) {\n this.renderedHTML = this.sanitizer.bypassSecurityTrustHtml(counter(this.content || '', params).html.join(''));\n }\n};\nFaLayersCounterComponent.ɵfac = function FaLayersCounterComponent_Factory(t) { return new (t || FaLayersCounterComponent)(ɵngcc0.ɵɵdirectiveInject(FaLayersComponent, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DomSanitizer)); };\nFaLayersCounterComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaLayersCounterComponent, selectors: [[\"fa-layers-counter\"]], hostAttrs: [1, \"ng-fa-layers-counter\"], hostVars: 1, hostBindings: function FaLayersCounterComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"innerHTML\", ctx.renderedHTML, ɵngcc0.ɵɵsanitizeHtml);\n } }, inputs: { classes: \"classes\", content: \"content\", title: \"title\", styles: \"styles\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function FaLayersCounterComponent_Template(rf, ctx) { }, encapsulation: 2 });\nFaLayersCounterComponent.ctorParameters = () => [\n { type: FaLayersComponent, decorators: [{ type: Optional }] },\n { type: DomSanitizer }\n];\n__decorate([\n Input()\n], FaLayersCounterComponent.prototype, \"content\", void 0);\n__decorate([\n Input()\n], FaLayersCounterComponent.prototype, \"title\", void 0);\n__decorate([\n Input()\n], FaLayersCounterComponent.prototype, \"styles\", void 0);\n__decorate([\n Input()\n], FaLayersCounterComponent.prototype, \"classes\", void 0);\n__decorate([\n HostBinding('innerHTML')\n], FaLayersCounterComponent.prototype, \"renderedHTML\", void 0);\nFaLayersCounterComponent = __decorate([ __param(0, Optional())\n], FaLayersCounterComponent);\n\nlet FaLayersTextComponent = class FaLayersTextComponent {\n constructor(parent, sanitizer) {\n this.parent = parent;\n this.sanitizer = sanitizer;\n this.classes = [];\n faWarnIfParentNotExist(this.parent, 'FaLayersComponent', this.constructor.name);\n }\n ngOnChanges(changes) {\n if (changes) {\n const params = this.buildParams();\n this.updateContent(params);\n }\n }\n /**\n * Updating params by component props.\n */\n buildParams() {\n const classOpts = {\n flip: this.flip,\n spin: this.spin,\n pulse: this.pulse,\n border: this.border,\n inverse: this.inverse,\n size: this.size || null,\n pull: this.pull || null,\n rotate: this.rotate || null,\n fixedWidth: this.fixedWidth,\n };\n const parsedTransform = typeof this.transform === 'string' ? parse.transform(this.transform) : this.transform;\n return {\n transform: parsedTransform,\n classes: [...faClassList(classOpts), ...this.classes],\n title: this.title,\n styles: this.styles,\n };\n }\n updateContent(params) {\n this.renderedHTML = this.sanitizer.bypassSecurityTrustHtml(text(this.content || '', params).html.join('\\n'));\n }\n};\nFaLayersTextComponent.ɵfac = function FaLayersTextComponent_Factory(t) { return new (t || FaLayersTextComponent)(ɵngcc0.ɵɵdirectiveInject(FaLayersComponent, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DomSanitizer)); };\nFaLayersTextComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaLayersTextComponent, selectors: [[\"fa-layers-text\"]], hostAttrs: [1, \"ng-fa-layers-text\"], hostVars: 1, hostBindings: function FaLayersTextComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"innerHTML\", ctx.renderedHTML, ɵngcc0.ɵɵsanitizeHtml);\n } }, inputs: { classes: \"classes\", content: \"content\", title: \"title\", styles: \"styles\", spin: \"spin\", pulse: \"pulse\", flip: \"flip\", size: \"size\", pull: \"pull\", border: \"border\", inverse: \"inverse\", rotate: \"rotate\", fixedWidth: \"fixedWidth\", transform: \"transform\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function FaLayersTextComponent_Template(rf, ctx) { }, encapsulation: 2 });\nFaLayersTextComponent.ctorParameters = () => [\n { type: FaLayersComponent, decorators: [{ type: Optional }] },\n { type: DomSanitizer }\n];\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"content\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"title\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"styles\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"classes\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"spin\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"pulse\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"flip\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"size\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"pull\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"border\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"inverse\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"rotate\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"fixedWidth\", void 0);\n__decorate([\n Input()\n], FaLayersTextComponent.prototype, \"transform\", void 0);\n__decorate([\n HostBinding('innerHTML')\n], FaLayersTextComponent.prototype, \"renderedHTML\", void 0);\nFaLayersTextComponent = __decorate([ __param(0, Optional())\n], FaLayersTextComponent);\n\nlet FaStackComponent = class FaStackComponent {\n constructor(renderer, elementRef) {\n this.renderer = renderer;\n this.elementRef = elementRef;\n }\n ngOnInit() {\n this.renderer.addClass(this.elementRef.nativeElement, 'fa-stack');\n }\n ngOnChanges(changes) {\n if ('size' in changes) {\n if (changes.size.currentValue != null) {\n this.renderer.addClass(this.elementRef.nativeElement, `fa-${changes.size.currentValue}`);\n }\n if (changes.size.previousValue != null) {\n this.renderer.removeClass(this.elementRef.nativeElement, `fa-${changes.size.previousValue}`);\n }\n }\n }\n};\nFaStackComponent.ɵfac = function FaStackComponent_Factory(t) { return new (t || FaStackComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nFaStackComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FaStackComponent, selectors: [[\"fa-stack\"]], inputs: { size: \"size\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c3, decls: 1, vars: 0, template: function FaStackComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c2);\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\nFaStackComponent.ctorParameters = () => [\n { type: Renderer2 },\n { type: ElementRef }\n];\n__decorate([\n Input()\n], FaStackComponent.prototype, \"size\", void 0);\n\nlet FontAwesomeModule = class FontAwesomeModule {\n};\nFontAwesomeModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: FontAwesomeModule });\nFontAwesomeModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function FontAwesomeModule_Factory(t) { return new (t || FontAwesomeModule)(); } });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaConfig, [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], function () { return []; }, null); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaIconLibrary, [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], function () { return []; }, null); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaStackItemSizeDirective, [{\n type: Directive,\n args: [{\n // tslint:disable-next-line:directive-selector\n selector: 'fa-icon[stackItemSize],fa-duotone-icon[stackItemSize]'\n }]\n }], function () { return []; }, { stackItemSize: [{\n type: Input\n }], size: [{\n type: Input\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaIconComponent, [{\n type: Component,\n args: [{\n selector: 'fa-icon',\n template: ``,\n host: {\n class: 'ng-fa-icon',\n '[attr.title]': 'title'\n }\n }]\n }], function () { return [{ type: ɵngcc1.DomSanitizer }, { type: FaConfig }, { type: FaIconLibrary }, { type: FaStackItemSizeDirective, decorators: [{\n type: Optional\n }] }]; }, { classes: [{\n type: Input\n }], renderedIconHTML: [{\n type: HostBinding,\n args: ['innerHTML']\n }], icon: [{\n type: Input\n }], title: [{\n type: Input\n }], spin: [{\n type: Input\n }], pulse: [{\n type: Input\n }], mask: [{\n type: Input\n }], styles: [{\n type: Input\n }], flip: [{\n type: Input\n }], size: [{\n type: Input\n }], pull: [{\n type: Input\n }], border: [{\n type: Input\n }], inverse: [{\n type: Input\n }], symbol: [{\n type: Input\n }], rotate: [{\n type: Input\n }], fixedWidth: [{\n type: Input\n }], transform: [{\n type: Input\n }], a11yRole: [{\n type: Input\n }] }); })();\nconst ɵFaDuotoneIconComponent_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(FaDuotoneIconComponent);\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaDuotoneIconComponent, [{\n type: Component,\n args: [{\n selector: 'fa-duotone-icon',\n template: ``\n }]\n }], null, { swapOpacity: [{\n type: Input\n }], primaryOpacity: [{\n type: Input\n }], secondaryOpacity: [{\n type: Input\n }], primaryColor: [{\n type: Input\n }], secondaryColor: [{\n type: Input\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaLayersComponent, [{\n type: Component,\n args: [{\n selector: 'fa-layers',\n template: `\n \n `\n }]\n }], function () { return [{ type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }, { type: FaConfig }]; }, { fixedWidth: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['class.fa-fw']\n }], size: [{\n type: Input\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaLayersCounterComponent, [{\n type: Component,\n args: [{\n selector: 'fa-layers-counter',\n template: '',\n host: {\n class: 'ng-fa-layers-counter'\n }\n }]\n }], function () { return [{ type: FaLayersComponent, decorators: [{\n type: Optional\n }] }, { type: ɵngcc1.DomSanitizer }]; }, { classes: [{\n type: Input\n }], renderedHTML: [{\n type: HostBinding,\n args: ['innerHTML']\n }], content: [{\n type: Input\n }], title: [{\n type: Input\n }], styles: [{\n type: Input\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaLayersTextComponent, [{\n type: Component,\n args: [{\n selector: 'fa-layers-text',\n template: '',\n host: {\n class: 'ng-fa-layers-text'\n }\n }]\n }], function () { return [{ type: FaLayersComponent, decorators: [{\n type: Optional\n }] }, { type: ɵngcc1.DomSanitizer }]; }, { classes: [{\n type: Input\n }], renderedHTML: [{\n type: HostBinding,\n args: ['innerHTML']\n }], content: [{\n type: Input\n }], title: [{\n type: Input\n }], styles: [{\n type: Input\n }], spin: [{\n type: Input\n }], pulse: [{\n type: Input\n }], flip: [{\n type: Input\n }], size: [{\n type: Input\n }], pull: [{\n type: Input\n }], border: [{\n type: Input\n }], inverse: [{\n type: Input\n }], rotate: [{\n type: Input\n }], fixedWidth: [{\n type: Input\n }], transform: [{\n type: Input\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FaStackComponent, [{\n type: Component,\n args: [{\n selector: 'fa-stack',\n // TODO: See if it is better to select fa-icon and throw if it does not have stackItemSize directive\n template: `\n \n `\n }]\n }], function () { return [{ type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }]; }, { size: [{\n type: Input\n }] }); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(FontAwesomeModule, { declarations: [FaIconComponent,\n FaDuotoneIconComponent,\n FaLayersComponent,\n FaLayersTextComponent,\n FaLayersCounterComponent,\n FaStackComponent,\n FaStackItemSizeDirective], exports: [FaIconComponent,\n FaDuotoneIconComponent,\n FaLayersComponent,\n FaLayersTextComponent,\n FaLayersCounterComponent,\n FaStackComponent,\n FaStackItemSizeDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FontAwesomeModule, [{\n type: NgModule,\n args: [{\n declarations: [\n FaIconComponent,\n FaDuotoneIconComponent,\n FaLayersComponent,\n FaLayersTextComponent,\n FaLayersCounterComponent,\n FaStackComponent,\n FaStackItemSizeDirective,\n ],\n exports: [\n FaIconComponent,\n FaDuotoneIconComponent,\n FaLayersComponent,\n FaLayersTextComponent,\n FaLayersCounterComponent,\n FaStackComponent,\n FaStackItemSizeDirective,\n ],\n entryComponents: [FaIconComponent, FaDuotoneIconComponent]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { FaConfig, FaDuotoneIconComponent, FaIconComponent, FaIconLibrary, FaLayersComponent, FaLayersCounterComponent, FaLayersTextComponent, FaStackComponent, FaStackItemSizeDirective, FontAwesomeModule };\n\n//# sourceMappingURL=angular-fontawesome.js.map","
\n
\n \n
\n
0\" [style.height.px]=\"height\">\n \n
\n
\n
\n \n
","import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';\nimport {process, SortDescriptor} from '@progress/kendo-data-query';\nimport {RequestState} from '../../api/request-handler';\nimport {faCheck} from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'app-autoselect-list',\n templateUrl: './autoselect-list.component.html',\n styleUrls: ['./autoselect-list.component.scss']\n})\nexport class AutoselectListComponent implements OnInit, OnChanges {\n RequestState = RequestState;\n @Input() hasSearch = true;\n @Input() height = 300;\n @Input() state = RequestState.Waiting;\n @Input() data;\n @Input() keyField;\n @Input() displayField;\n @Input() subDisplayField;\n @Input() selectedOption;\n @Input() sort = true;\n @Input() useCheckIcon = false;\n @Output() itemSelect = new EventEmitter();\n faCheck = faCheck;\n\n result = {\n data: []\n };\n\n public view: any[] = [];\n\n constructor() { }\n\n ngOnInit(): void {\n this.updateResults('');\n this.loadMore();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // console.log(JSON.stringify(this.state), RequestState.Complete, changes, JSON.stringify(this.data));\n this.updateResults('');\n }\n\n onValueChange(query) { // on search textbox change\n this.updateResults(query);\n }\n\n onListItemSelect(key) {\n this.selectedOption = key;\n this.itemSelect.emit(this.selectedOption);\n }\n\n updateResults(query) {\n // apply filters\n this.result = process(this.data, {\n sort: ((this.sort) ? [{ field: 'label', dir: 'asc' }] : null),\n filter: {\n logic: 'and',\n filters: [\n {field: 'label', operator: 'contains', value: query},\n ]\n }\n });\n // put selected items from main array\n const selectedItems = [];\n for (let key = 0; key < this.result.data.length; key++) {\n const item = this.result.data[key];\n if (item[this.keyField] === this.selectedOption) {\n selectedItems.push(item);\n this.result.data.splice(key, 1);\n }\n }\n // add selected items back at top\n for (let key = selectedItems.length - 1; key >= 0; key--) {\n this.result.data.unshift(selectedItems[key]);\n }\n // console.log(this.result);\n // reset view\n this.view = [];\n this.loadMore();\n }\n\n loadMore(): void {\n const next = this.view.length;\n this.view = [\n ...this.view,\n ...this.result.data.slice(next, next + 25)\n ];\n }\n}\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {RequestState} from '../../../api/request-handler';\nimport {DetailChoicesService} from '../detail-choices.service';\nimport {ApiService} from '../../../api/api.service';\nimport {RefreshHandlerService} from '../../../api/refresh-handler.service';\n\n@ComponentLookup('DetailAccountFilterComponent')\n@Component({\n selector: 'app-detail-account-filter',\n templateUrl: './detail-account-filter.component.html',\n styleUrls: ['./detail-account-filter.component.scss']\n})\nexport class DetailAccountFilterComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n @Input() metricId;\n\n constructor(\n private apiService: ApiService,\n private detailChoicesService: DetailChoicesService,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/search/accountdetails');\n this.requestHandler.sendRequest('/search/accountdetails');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // console.log(apiData);\n if (apiData.hasOwnProperty('accountdetails')) {\n const buildData = [];\n for (const account of apiData.accountdetails) {\n buildData.push({\n label: account.accountname, // or customersrno\n key: account.accountid\n });\n }\n this.data = buildData;\n }\n }\n });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest('/search/accountdetails');\n },\n this.requestHandler.getRelativeParams('/search/accountdetails')\n );\n\n this.selectedItem = this.detailChoicesService.getFilter('detailAccountFilter');\n this.detailChoicesService.onUpdate('accountId', (productLine) => {\n // update selectedItem to empty\n this.selectedItem = null;\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.detailChoicesService.clearUpdateListener('accountId');\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.detailChoicesService.setFilter('detailAccountFilter', selectedItem, true);\n }\n}\n","
\n
Accounts
\n
\n \n \n
\n
\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {RequestState} from '../../../api/request-handler';\nimport {DetailChoicesService} from '../detail-choices.service';\nimport {ApiService} from '../../../api/api.service';\nimport {RefreshHandlerService} from '../../../api/refresh-handler.service';\n\n@ComponentLookup('DetailAssayFilterComponent')\n@Component({\n selector: 'app-detail-assay-filter',\n templateUrl: './detail-assay-filter.component.html',\n styleUrls: ['./detail-assay-filter.component.scss']\n})\nexport class DetailAssayFilterComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n rawList = [];\n selectedItem;\n requestHandler;\n @Input() metricId;\n\n constructor(\n private apiService: ApiService,\n private detailChoicesService: DetailChoicesService,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/search/assaysdetails');\n this.requestHandler.sendRequest('/search/assaysdetails', { metricid: this.metricId });\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // console.log(apiData);\n if (apiData.hasOwnProperty('assaysDetails')) {\n const buildData = [];\n for (const assay of apiData.assaysDetails) {\n buildData.push({\n label: assay.assays, // or customersrno\n key: assay.assaysid\n });\n }\n this.data = buildData;\n }\n this.rawList = apiData.assaysDetails;\n }\n });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest('/search/assaysdetails', { metricid: this.metricId });\n },\n this.requestHandler.getRelativeParams('/search/assaysdetails')\n );\n this.selectedItem = this.detailChoicesService.getFilter('detailAssayFilter');\n this.detailChoicesService.onUpdate('diseaseStateId', (diseaseState) => {\n // filter list contents\n const buildData = [];\n const added = [];\n for (const assay of this.rawList) {\n for (const ds of assay.diseasestate) {\n if ((ds === diseaseState || diseaseState === null)\n && added.indexOf(assay.assaysid) === -1\n ) {\n buildData.push({\n label: assay.assays, // or customersrno\n key: assay.assaysid\n });\n added.push(assay.assaysid);\n }\n }\n }\n this.data = buildData;\n\n // update selectedItem to empty\n this.selectedItem = null;\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.detailChoicesService.clearUpdateListener('diseaseStateId');\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.detailChoicesService.setFilter('detailAssayFilter', selectedItem, true);\n this.detailChoicesService.callUpdateListenerByKey('assayId', selectedItem);\n }\n}\n","
\n
Assays
\n
\n \n \n
\n
\n","import { OnInit, OnDestroy } from '@angular/core';\r\nimport {ApiService} from '../../api/api.service';\r\nimport {DetailChoicesService} from './detail-choices.service';\r\n\r\nexport class ToggleSwitches implements OnInit, OnDestroy {\r\n config = [];\r\n updateListener = '';\r\n selectedValues = {};\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private detailChoicesService: DetailChoicesService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n for (const item of this.config) {\r\n this.selectedValues[item.key] = this.detailChoicesService.getFilter(item.key);\r\n }\r\n this.detailChoicesService.onUpdate(this.updateListener, (diseaseState) => {\r\n // update selectedItem to empty\r\n for (const item of this.config) {\r\n this.selectedValues[item.key] = item.defaultValue;\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.detailChoicesService.clearUpdateListener(this.updateListener);\r\n }\r\n\r\n toggleSwitchValue(key, value) {\r\n value = !value;\r\n this.selectedValues[key] = value;\r\n this.detailChoicesService.setFilter(key, value, true);\r\n }\r\n}\r\n","
\n
Capital/Service/Assay/Other
\n
\n
\n
\n \n
\n
\n {{item.label}}\n
\n
\n
\n
\n","import { Component, Input } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {ToggleSwitches} from '../toggle-switches';\n\n@ComponentLookup('DetailCapitalServiceAssaySwitchesFilterComponent')\n@Component({\n selector: 'app-detail-capital-service-assay-switches-filter',\n templateUrl: './detail-capital-service-assay-switches-filter.component.html',\n styleUrls: ['./detail-capital-service-assay-switches-filter.component.scss']\n})\nexport class DetailCapitalServiceAssaySwitchesFilterComponent extends ToggleSwitches {\n @Input() metricId;\n\n updateListener = 'capitalServiceAssaySwitches';\n config = [\n {\n key: 'detailIsCapitalFilter',\n label: 'Capital',\n defaultValue: true\n },\n {\n key: 'detailIsServiceFilter',\n label: 'Service',\n defaultValue: true\n },\n {\n key: 'detailIsReagentFilter',\n label: 'Reagent/Assay',\n defaultValue: true\n },\n {\n key: 'detailIsOtherFilter',\n label: 'Other',\n defaultValue: true\n }\n ];\n}\n","
\n
Categories
\n
\n
\n
\n \n
\n
\n {{item.label}}\n
\n
\n
\n
\n","import { Component, Input } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {ToggleSwitches} from '../toggle-switches';\n\n@ComponentLookup('DetailCategorySwitchesFilterComponent')\n@Component({\n selector: 'app-detail-category-switches-filter',\n templateUrl: './detail-category-switches-filter.component.html',\n styleUrls: ['./detail-category-switches-filter.component.scss']\n})\nexport class DetailCategorySwitchesFilterComponent extends ToggleSwitches {\n @Input() metricId;\n\n updateListener = 'categorySwitches';\n config = [\n {\n key: 'detailIsReagentFilter',\n label: 'Reagent',\n defaultValue: true\n },\n {\n key: 'detailIsFieldServiceContractFilter',\n label: 'Field Service Contract',\n defaultValue: true\n },\n {\n key: 'detailIsOtherFilter',\n label: 'Other',\n defaultValue: true\n }\n ];\n}\n","import {Component, OnDestroy, OnInit, Input} from '@angular/core';\nimport {faSearch} from '@fortawesome/free-solid-svg-icons';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {RequestState} from '../../../api/request-handler';\nimport {ApiService} from '../../../api/api.service';\nimport {DetailChoicesService} from '../detail-choices.service';\n\n@ComponentLookup('DetailCustomerFilterComponent')\n@Component({\n selector: 'app-detail-customer-filter',\n templateUrl: './detail-customer-filter.component.html',\n styleUrls: ['./detail-customer-filter.component.scss']\n})\nexport class DetailCustomerFilterComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n rawCustomers = [];\n selectedItem;\n requestHandler;\n @Input() metricId;\n\n faSearch = faSearch;\n\n constructor(\n private apiService: ApiService,\n private detailChoicesService: DetailChoicesService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/customer/details');\n this.requestHandler.sendRequest('/customer/details');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // console.log(apiData);\n if (apiData.hasOwnProperty('customers')) {\n const buildData = [];\n for (const customer of apiData.customers) {\n buildData.push({\n label: customer.name, // or customersrno\n key: customer.customerid\n });\n }\n this.data = buildData;\n }\n this.rawCustomers = apiData.customers;\n }\n });\n this.selectedItem = this.detailChoicesService.getFilter('detailCustomerIdFilter');\n this.detailChoicesService.onUpdate('productLineId', (productLine) => {\n // filter list contents\n const buildData = [];\n const addedCustomerIds = [];\n for (const customer of this.rawCustomers) {\n for (const pl of customer.productlines) {\n if ((pl === productLine || productLine === null)\n && addedCustomerIds.indexOf(customer.customerid) === -1) {\n buildData.push({\n label: customer.name, // or customersrno\n key: customer.customerid\n });\n addedCustomerIds.push(customer.customerid);\n }\n }\n }\n this.data = buildData;\n\n // update selectedItem to empty\n this.selectedItem = null;\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.detailChoicesService.clearUpdateListener('productLineId');\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.detailChoicesService.setFilter('detailCustomerIdFilter', selectedItem, true);\n this.detailChoicesService.callUpdateListenerByKey('customerId', selectedItem);\n // this.personaService.setPersonaOption(PersonaTypes.Customer, selectedItem, '');\n }\n}\n","
\n
Customers
\n \n \n
\n\n\n \n \n \n \n\n\n\n\n\n\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {RequestState} from '../../../api/request-handler';\nimport {DetailChoicesService} from '../detail-choices.service';\nimport {ApiService} from '../../../api/api.service';\nimport {RefreshHandlerService} from '../../../api/refresh-handler.service';\n\n@ComponentLookup('DetailDiseaseStateFilterComponent')\n@Component({\n selector: 'app-detail-disease-state-filter',\n templateUrl: './detail-disease-state-filter.component.html',\n styleUrls: ['./detail-disease-state-filter.component.scss']\n})\nexport class DetailDiseaseStateFilterComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n rawList = [];\n selectedItem;\n requestHandler;\n @Input() metricId;\n\n constructor(\n private apiService: ApiService,\n private detailChoicesService: DetailChoicesService,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/search/diseasestatedetails');\n this.requestHandler.sendRequest('/search/diseasestatedetails', { metricid: this.metricId });\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // console.log(apiData);\n if (apiData.hasOwnProperty('diseaseStateDetails')) {\n const buildData = [];\n for (const diseasestate of apiData.diseaseStateDetails) {\n buildData.push({\n label: diseasestate.diseasestate, // or customersrno\n key: diseasestate.diseasestateid\n });\n }\n this.data = buildData;\n }\n this.rawList = apiData.diseaseStateDetails;\n }\n });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest('/search/diseasestatedetails', { metricid: this.metricId });\n },\n this.requestHandler.getRelativeParams('/search/diseasestatedetails')\n );\n this.selectedItem = this.detailChoicesService.getFilter('detailDiseaseStateFilter');\n this.detailChoicesService.onUpdate('assayId', (assay) => {\n // filter list contents\n const buildData = [];\n const added = [];\n for (const diseasestate of this.rawList) {\n for (const asid of diseasestate.assays) {\n if ((asid === assay || assay === null)\n && added.indexOf(diseasestate.diseasestateid) === -1\n ) {\n buildData.push({\n label: diseasestate.diseasestate, // or customersrno\n key: diseasestate.diseasestateid\n });\n added.push(diseasestate.diseasestateid);\n }\n }\n }\n this.data = buildData;\n\n // update selectedItem to empty\n this.selectedItem = null;\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.detailChoicesService.clearUpdateListener('assayId');\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.detailChoicesService.setFilter('detailDiseaseStateFilter', selectedItem, true);\n this.detailChoicesService.callUpdateListenerByKey('diseaseStateId', selectedItem);\n // this.personaService.setPersonaOption(PersonaTypes.Customer, selectedItem, '');\n }\n}\n","
\n
LOB - Disease State
\n
\n \n \n
\n
\n","import {Component, OnDestroy, OnInit, Input} from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport {RequestState} from '../../../api/request-handler';\nimport {ApiService} from '../../../api/api.service';\nimport {DetailChoicesService} from '../detail-choices.service';\n\n@ComponentLookup('DetailProductLineFilterComponent')\n@Component({\n selector: 'app-detail-product-line-filter',\n templateUrl: './detail-product-line-filter.component.html',\n styleUrls: ['./detail-product-line-filter.component.scss']\n})\nexport class DetailProductLineFilterComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n rawProductLines = [];\n selectedItem;\n requestHandler;\n @Input() metricId;\n\n constructor(\n private apiService: ApiService,\n private detailChoicesService: DetailChoicesService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/productline/details');\n this.requestHandler.sendRequest('/productline/details');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n if (apiData.hasOwnProperty('productlines')) {\n const buildData = [];\n for (const productline of apiData.productlines) {\n buildData.push({\n label: productline.productname,\n key: productline.productlineid\n });\n }\n this.data = buildData;\n }\n this.rawProductLines = apiData.productlines;\n }\n });\n this.selectedItem = this.detailChoicesService.getFilter('detailProductLineFilter');\n this.detailChoicesService.onUpdate('customerId', (customerId) => {\n // filter list contents\n const buildData = [];\n const addedProductLines = [];\n for (const productline of this.rawProductLines) {\n for (const customerId2 of productline.customers) {\n if ((customerId === customerId2 || customerId === null)\n && addedProductLines.indexOf(productline.productlineid) === -1) {\n buildData.push({\n label: productline.productname,\n key: productline.productlineid\n });\n addedProductLines.push(productline.productlineid);\n }\n }\n }\n this.data = buildData;\n\n // update selectedItem to empty\n this.selectedItem = null;\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.detailChoicesService.clearUpdateListener('customerId');\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.detailChoicesService.setFilter('detailProductLineFilter', selectedItem, true);\n this.detailChoicesService.callUpdateListenerByKey('productLineId', selectedItem);\n // this.personaService.setPersonaOption(PersonaTypes.ProductLine, selectedItem, '');\n }\n}\n","
\n
Product Lines
\n \n \n
\n\n\n\n\n\n\n","import { Input, Component, OnInit } from '@angular/core';\nimport {ComponentLookup} from '../../../decorators/component-lookup';\nimport { TileReference } from '../../../dashboards/tile-reference';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n@ComponentLookup('BrPlaceholderComponent')\n@Component({\n selector: 'app-br-placeholder',\n templateUrl: './br-placeholder.component.html',\n styleUrls: ['./br-placeholder.component.scss']\n})\nexport class BrPlaceholderComponent extends TileComponent implements OnInit {\n @Input() tileReference: TileReference;\n\n translateApiDataForChart(apiData) {\n // override for currency preference\n console.log(this.tileReference);\n console.log(apiData);\n }\n\n}\n","

br-placeholder works!

\n","
\n

{{preferences.title}}

\n \n
\n \n
\n No data!\n
\n
\n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileComponent } from '../../../tiles/base/tile.component';\nimport { RenderEvent } from '@progress/kendo-angular-charts';\nimport { Rect, Circle as CircleGeometry } from '@progress/kendo-drawing/geometry';\nimport { Group, Path, Layout, Text } from '@progress/kendo-drawing';\n\n@ComponentLookup('BrStackedBarLineChartComponent')\n@Component({\n selector: 'app-br-stacked-bar-line-chart',\n templateUrl: './br-stacked-bar-line-chart.component.html',\n styleUrls: ['./br-stacked-bar-line-chart.component.scss']\n})\n\nexport class BrStackedBarLineChartComponent extends TileComponent implements OnInit {\n axis1LabelSegments = 4;\n axis2LabelSegments = 4;\n yAxisLabel = '';\n\n\n defaultPreferences() {\n return {\n periodsToShow: 4,\n showTitle: true,\n valueAxis1Label: '{0}',\n valueAxis2Label: '{0}'\n };\n }\n\n translateApiDataForChart(apiData) {\n if (apiData.yAxisLabel) { this.yAxisLabel = apiData.yAxisLabel; }\n\n const chartStackSeries = [{\n name: '',\n color: '#3498DB', // '#ff0000',\n type: 'column',\n gap: .5,\n border: {\n color: '#000',\n width: 1,\n dashType: 'solid'\n },\n data: [],\n axis: 'axis1',\n tooltip: {\n visible: true,\n format: '{0}',\n background: '#aa0061',\n padding: '2'\n }\n }];\n\n const chartCategories = [];\n\n let maxValue = 0;\n let minValue = 0;\n let markUnits = 10;\n\n let values = [];\n if ('bar_values' in apiData) {\n values = apiData.bar_values;\n } else if ('values' in apiData) {\n values = apiData.values;\n }\n for (const row of values.reverse()) {\n chartCategories.push(row.key);\n const intValue = parseInt(row.value, 10);\n if (intValue > maxValue) {\n maxValue = intValue;\n }\n chartStackSeries[0].data.push(intValue);\n // stacked bar\n /*\n for (chartDataItemKey = 0; chartDataItemKey < chartDataColumn.stacks.length; chartDataItemKey++) {\n const chartDataItem = chartDataColumn.stacks[chartDataItemKey];\n const intValue = parseInt(chartDataItem, 10);\n\n chartStackSeries[chartDataItemKey].data.push(intValue);\n }*/\n\n }\n\n const zero = '0';\n const valueSize = maxValue.toString().length;\n const roundSizeStr = '1'.padEnd(valueSize, zero);\n const roundSize = parseInt(roundSizeStr, 10);\n\n markUnits = roundSize;\n maxValue = this.roundUp(maxValue * 1.2, roundSize);\n if (apiData.chartTopLimit) { maxValue = apiData.chartTopLimit; }\n if (apiData.chartBottomLimit) { minValue = apiData.chartBottomLimit; }\n if (this.apiData.yAxisMajorUnit) { markUnits = this.apiData.yAxisMajorUnit; }\n\n // fix to allow a max of 14 data y axis labels on chart\n const markUnitsPointCount = maxValue / markUnits;\n if (markUnitsPointCount > 14) {\n const markUnitsFactor = this.roundUp(markUnitsPointCount / 14, 1);\n markUnits = markUnits * markUnitsFactor;\n }\n\n // console.log(chartCategories);\n // console.log(chartSeries);\n const valueAxis1 = {\n name: 'axis1',\n labels: {\n // https://github.com/telerik/kendo-intl/blob/master/docs/num-formatting/index.md\n // cannot currently add format of #K, add issue to https://github.com/telerik/kendo-intl/issues\n format: '{0}',\n content: (e) => {\n return e.value;\n },\n position: 'start',\n visible: true\n },\n max: maxValue,\n min: minValue,\n majorUnit: markUnits,\n line: {\n visible: false\n },\n title: {\n text: this.yAxisLabel,\n color: '#000000'\n },\n tooltip: {\n visible: true,\n format: '{0}',\n background: '#aa0061',\n padding: '2'\n }\n };\n\n\n this.chartOptions = {\n seriesDefaults: {\n type: 'column',\n stack: true\n },\n series: chartStackSeries,\n chartArea: {\n border: {\n color: '#000',\n width: 1,\n dashType: 'solid'\n }\n },\n valueAxis: [valueAxis1], // removed valueAxis2\n categoryAxis: {\n categories: chartCategories,\n majorGridLines: {\n visible: false\n },\n labels: {\n rotation: -45\n }\n }\n };\n }\n\n roundUp(value, toTheNearest) {\n return Math.ceil(value / toTheNearest) * toTheNearest;\n }\n\n isDataFound(value) {\n const dataFound = (value !== undefined && value !== null && (Array.isArray(value.values) && value.values.length > 0));\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","
\n \n
\n

{{apiData.title}}

\n

{{preferences.subHeading}}

\n
\n \n \n \n \n
\n
\n No data!\n
\n
\n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n@ComponentLookup('BrMultiLineChartComponent')\n@Component({\n selector: 'app-br-multi-line-chart',\n templateUrl: './br-multi-line-chart.component.html',\n styleUrls: ['./br-multi-line-chart.component.scss']\n})\n\nexport class BrMultiLineChartComponent extends TileComponent implements OnInit {\n getLineColor(apiData, i) {\n if (this.preferences.hasOwnProperty('rowColorOverrides') && this.preferences.rowColorOverrides[i] !== null) {\n return this.preferences.rowColorOverrides[i];\n }\n if (this.preferences.hasOwnProperty('colorsByIndex')) {\n const colorsByIndex = this.preferences.colorsByIndex;\n return apiData.linecolors[colorsByIndex[i]];\n }\n return apiData.linecolors[i];\n }\n\n translateApiDataForChart(apiData) {\n const categoryList = [];\n const seriesList = [];\n let categoryField = [];\n\n if (apiData.names) {\n categoryField = apiData.names;\n }\n\n let yaxisleftlabel = apiData.yaxisleftlabel;\n if ('yaxisleftlabel' in this.preferences) {\n yaxisleftlabel = this.preferences.yaxisleftlabel;\n }\n\n let yaxisrightlabel = apiData.yaxisrightlabel;\n if ('yaxisrightlabel' in this.preferences) {\n yaxisrightlabel = this.preferences.yaxisrightlabel;\n }\n\n let values = apiData.values;\n //if ('periodsToShow' in this.preferences) {\n // only use the last x periods in the chart\n // values = values.slice(Math.max(values.length - this.preferences.periodsToShow, 1));\n //}\n let minValue = 0;\n if ('min' in this.preferences) {\n minValue = this.preferences.min;\n }\n\n //console.log('Testing Function', values);\n for (const value of values) {\n categoryList.push(value.xlabel);\n for (let i = 0; i < value.points.length; i++) {\n let excludeLines = [];\n if (this.preferences.hasOwnProperty('excludeLines')) {\n excludeLines = this.preferences.excludeLines;\n }\n\n //console.log(\"TEST Exclude Lines\", excludeLines);\n if (!excludeLines.includes(i)) { // if exclusions do not include i\n if (typeof seriesList[i] === 'undefined') {\n seriesList[i] = {\n data: [],\n missingValues: 'gap',\n color: this.getLineColor(apiData, i)\n };\n if ('names2' in apiData) {\n seriesList[i].name = apiData.names2[i];\n }\n if ('axisassigments' in apiData) {\n seriesList[i].axis = apiData.axisassigments[i];\n }\n }\n seriesList[i].data.push(((value.points[i] !== 'N/A') ? value.points[i] : null));\n }\n }\n }\n\n //console.log(\"Series List\", seriesList);\n let tickCount = 4;\n if ('tickCount' in this.preferences) {\n tickCount = this.preferences.tickCount;\n }\n const axis2Max = this.nextHighestNumberDivisibleBy(apiData.yleftmax, tickCount - 1);\n const valueAxis = [];\n if ('yaxisleftlabel' in apiData) {\n valueAxis.push({\n name: 'left',\n labels: {\n format: '{0}',\n position: 'start'\n },\n title: {\n text: yaxisleftlabel\n },\n line: {\n visible: false\n },\n axisCrossingValue: -10,\n max: axis2Max,\n min: minValue,\n majorUnit: axis2Max / (tickCount - 1)\n });\n }\n if ('yaxisrightlabel' in apiData) {\n let yrightmax = axis2Max;\n if ('yrightmax' in apiData) {\n yrightmax = this.apiData.yrightmax;\n }\n let tickCountRight = tickCount;\n if ('yrighttickcount' in apiData) {\n tickCountRight = this.apiData.yrighttickcount;\n }\n valueAxis.push({\n name: 'right',\n labels: {\n format: '{0}',\n position: 'end'\n },\n title: {\n text: yaxisrightlabel\n },\n line: {\n visible: false\n },\n axisCrossingValue: -10,\n max: yrightmax,\n min: minValue,\n majorUnit: yrightmax / (tickCountRight - 1)\n });\n }\n this.chartOptions = {\n legend: {\n align: 'center',\n position: 'top',\n labels: {\n font: '10pt sans-serif'\n }\n },\n seriesDefaults: {\n type: 'line',\n area: {\n line: {\n style: 'smooth'\n }\n }\n },\n series: seriesList,\n valueAxis: valueAxis,\n categoryAxis: {\n categories: categoryList,\n majorGridLines: {\n visible: false\n },\n labels: {\n rotation: -45,\n position: 'start'\n }\n }\n };\n }\n}\n","
\n

{{preferences.title}}

\n \n \n \n \n
\n","import { Input, Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileReference } from '../../../dashboards/tile-reference';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n//@ComponentLookup('BrMultiBarChartComponent')\n@Component({\n selector: 'app-br-multi-bar-chart',\n templateUrl: './br-multi-bar-chart.component.html',\n styleUrls: ['./br-multi-bar-chart.component.scss']\n})\n\n\nexport class BrMultiBarChartComponent extends TileComponent implements OnInit {\n\n public name1;\n public name2;\n public periods = [];\n public value1 = [];\n public value2 = [];\n yAxisLabel = '';\n\n defaultPreferences() {\n return {\n periodsToShow: 4,\n showTitle: true,\n };\n }\n\n translateApiDataForChart(apiData: any) {\n if (apiData.names[0]) { this.name1 = apiData.names[0]; }\n if (apiData.names[1]) { this.name2 = apiData.names[1]; }\n // console.log('WAIT TIME VALUES', apiData);\n\n const periods: any[] = [];\n const value1: any[] = [];\n const value2: any[] = [];\n\n let maxValue = 0;\n\n let values = [];\n values = apiData.values;\n\n for (const row of values.reverse()) {\n periods.push(row.key);\n value1.push(row.value1);\n value2.push(row.value2);\n }\n //console.log('Values From value1', value1);\n }\n\n isDataFound(apiData) {\n const dataFound = super.isDataFound(apiData);\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","
\r\n

{{preferences.title}}

\r\n \r\n
\r\n

{{strChartTitle}}

\r\n

{{preferences.subHeading}}

\r\n \r\n \r\n \r\n
\r\n
\r\n No data!\r\n
\r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileReference } from '../../../dashboards/tile-reference';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n@Component({\n selector: 'app-br-line-chart',\n templateUrl: './br-line-chart.component.html',\n styleUrls: ['./br-line-chart.component.scss']\n})\n\nexport class BrLineChartComponent extends TileComponent implements OnInit {\n\n defaultPreferences() {\n return {\n showTitle: true\n };\n }\n\n strChartTitle;\n strTitle;\n strYAxis = '';\n strYAxis2 = '';\n chartTopLimit;\n chartBottomLimit;\n\n chartValues: any[];\n\n translateApiDataForChart(apiData: any) {\n const chartStackSeries = [{\n name: '',\n color: '#3498DB', // '#ff0000',\n type: 'line',\n data: [],\n axis: 'axis1',\n tooltip: {\n visible: true,\n format: '{0}',\n background: '#aa0061',\n padding: '2'\n }\n }];\n\n // console.log('Test JSON ITEM--', JSON.stringify(apiData));\n this.strChartTitle = apiData.title;\n this.strYAxis = apiData.yAxisLabel;\n this.strYAxis2 = apiData.yAxisLabel2;\n\n const chartCategories = [];\n let maxValue = 0;\n let minValue = 0;\n let roundSize = 0;\n\n for (const row of apiData.values) {\n chartCategories.push(row.key);\n const intValue = parseInt(row.value, 10);\n if (intValue > maxValue) {\n maxValue = intValue;\n }\n chartStackSeries[0].data.push(intValue);\n }\n\n const zero = '0';\n const valueSize = maxValue.toString().length;\n const roundSizeStr = '1'.padEnd(valueSize, zero);\n roundSize = 10;\n maxValue = this.roundUp(maxValue * 1.2, roundSize);\n\n if (this.apiData.chartTopLimit) { maxValue = this.apiData.chartTopLimit; }\n if (this.apiData.chartBottomLimit) { minValue = this.apiData.chartBottomLimit; }\n if (this.apiData.yAxisMajorUnit) { roundSize = this.apiData.yAxisMajorUnit; }\n\n // console.log('API DATA', this.apiData);\n\n const valueAxis1 = {\n name: 'axis1',\n labels: {\n // https://github.com/telerik/kendo-intl/blob/master/docs/num-formatting/index.md\n // cannot currently add format of #K, add issue to https://github.com/telerik/kendo-intl/issues\n format: '{0}',\n content: (e) => {\n return e.value;\n },\n position: 'start',\n visible: true\n },\n max: maxValue,\n min: minValue,\n majorUnit: roundSize,\n line: {\n visible: false\n },\n title: {\n text: this.strYAxis,\n color: '#000000'\n },\n tooltip: {\n visible: true,\n format: '{0}',\n background: '#aa0061',\n padding: '2'\n }\n };\n\n this.chartOptions = {\n seriesDefaults: {\n type: 'line',\n area: {\n line: {\n style: 'smooth'\n }\n }\n },\n series: chartStackSeries,\n chartArea: {\n border: {\n color: '#000',\n width: 1,\n dashType: 'solid'\n }\n },\n valueAxis: [valueAxis1], // removed valueAxis2\n categoryAxis: {\n categories: chartCategories,\n majorGridLines: {\n visible: false\n },\n labels: {\n rotation: -45\n }\n }\n };\n // throw new Error('Method not implemented.');\n }\n\n roundUp(value, toTheNearest) {\n return Math.ceil(value / toTheNearest) * toTheNearest;\n }\n\n isDataFound(value) {\n let dataFound = (value !== undefined && value !== null && (Array.isArray(value.values) && value.values.length > 0));\n let atLeastOneValueNotNull = false;\n if (value !== undefined && 'values' in value) {\n for (const item of value.values) {\n if (item.value !== null) {\n atLeastOneValueNotNull = true;\n }\n }\n }\n if (!atLeastOneValueNotNull) {\n dataFound = false;\n }\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","
\r\n

{{preferences.title}}

\r\n \r\n \r\n \r\n
","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileComponent } from '../../../tiles/base/tile.component';\nimport { RenderEvent } from '@progress/kendo-angular-charts';\nimport { Rect, Circle as CircleGeometry } from '@progress/kendo-drawing/geometry';\nimport { Group, Path, Layout, Text } from '@progress/kendo-drawing';\n\n@Component({\n selector: 'app-br-pie-chart',\n templateUrl: './br-pie-chart.component.html',\n styleUrls: ['./br-pie-chart.component.scss']\n})\n\nexport class BrPieChartComponent extends TileComponent implements OnInit {\n\n private goalPercent: number;\n private center: any;\n private radius: number;\n\n // Necessary to bind `this` to the AppComponent instance\n public visualHandler = this.visual.bind(this);\n\n translateApiDataForChart(apiData) {\n const pieDataTemp: any[] = [];\n for (const pieItem of apiData.values) {\n pieDataTemp.push({\n value: pieItem.value,\n category:pieItem.category,\n dashType: 'solid'\n });\n }\n // console.log(this.goalPercent);\n\n this.chartOptions = {\n pieData: pieDataTemp\n };\n // console.log('chartOptions', this.chartOptions);\n }\n\n public legendItemVisual = (args: any) => {\n const path = new Path({\n stroke: {\n color: args.series.data[args.pointIndex].color,\n dashType: args.series.data[args.pointIndex].dashType,\n width: 3\n }\n }).moveTo(0, 0).lineTo(15, 0).close();\n const text = new Text(args.series.data[args.pointIndex].category, [0, 0]);\n const layout = new Layout(new Rect([0, 0], [Number.MAX_VALUE, 0]), {\n alignItems: 'center',\n spacing: 5\n });\n\n layout.append(path, text);\n layout.reflow();\n\n return layout;\n }\n\n public visual(e: any): Group {\n // Obtain parameters for the segments\n this.center = e.center;\n this.radius = e.radius;\n\n // console.log(\"Metric: \" + this.apiData.title + \", Center: \" + this.center + \", Start Angle: \" + e.startAngle\n // + \", End Angle: \" + e.endAngle + \", Percentage: \" + e.percentage + \", Radius: \" + this.radius\n // + \", Goal Percent: \" + this.goalPercent);\n // Create default visual\n return e.createVisual();\n }\n\n public onRender(e: RenderEvent): void {\n // The center and radius are populated by now.\n // We can ask a circle geometry to calculate the bounding rectangle for us.\n //\n // http://www.telerik.com/kendo-angular-ui/components/drawing/api/geometry/Circle/\n\n if (this.preferences.showGoal === false) {\n return;\n }\n const c = this.center;\n // console.log(\"Metric: \" + this.apiData.title + \", Center: \" + c + \", radius: \" + this.radius);\n const circleGeometry = new CircleGeometry([c.x, c.y], this.radius);\n\n // Reflow the text in the bounding box\n //\n // http://www.telerik.com/kendo-angular-ui/components/drawing/api/Layout\n // http://www.telerik.com/kendo-angular-ui/components/drawing/api/LayoutOptions\n /*const path = new Path({\n stroke: {\n color: '#000',\n dashType: 'dash',\n width: 1\n }\n });*/\n\n // The starting point (or when 0 is passed) is at: 0.25\n // 1 degree equals 1/360; starting point center-right\n const calcGoalPercent = this.goalPercent - 0.25; // 0.90 - 0.25 to make starting point relative to top-center\n\n const point = circleGeometry.pointAt(360 * calcGoalPercent);\n\n //path.moveTo(c.x, c.y).lineTo(point.x, point.y);\n\n // Draw it on the Chart drawing surface\n // http://www.telerik.com/kendo-angular-ui/components/charts/api/ChartComponent/#toc-surface\n //e.sender.surface.draw(path);\n }\n\n isDataFound(apiData) {\n const dataFound = super.isDataFound(apiData);\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","
\n

{{preferences.title}}

\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n No data found\n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n@ComponentLookup('StackedBarChartByProductComponent')\n@Component({\n selector: 'app-br-stacked-bar-chart-by-product',\n templateUrl: './br-stacked-bar-chart-by-product.component.html',\n styleUrls: ['./br-stacked-bar-chart-by-product.component.scss']\n})\n\nexport class BrStackedBarChartByProductComponent extends TileComponent implements OnInit {\n protected defaultPreferences() {\n return {\n showTitle: true,\n valueAxis1Label: '{0}',\n valueAxis2Label: '{0}'\n };\n }\n\n\n translateApiDataForChart(apiData) {\n if (this.preferences.hasOwnProperty('apiObjectKey')) {\n apiData = apiData.range[this.preferences.apiObjectKey];\n }\n\n const chartStackSeries = {\n name: '',\n colorField: 'valueColor',\n type: 'column',\n gap: .5,\n border: {\n color: '#000',\n width: 1,\n dashType: 'solid'\n },\n data: [],\n axis: 'axis1'\n };\n\n const chartCategories = [];\n const valueAxis1Label = this.getPreference('valueAxis1Label');\n const valueAxis2Label = this.getPreference('valueAxis2Label');\n\n let values = apiData.values;\n if ('periodsToShow' in this.preferences) {\n // only use the last x periods in the chart\n values = values.slice(Math.max(values.length - this.preferences.periodsToShow, 1));\n }\n\n for (const chartDataColumnKey in values) {\n if (chartDataColumnKey in values) {\n const chartDataColumn = values[chartDataColumnKey];\n const chartDataColumnColor = apiData.stackcolors[chartDataColumnKey];\n chartCategories.push(chartDataColumn.xlabel);\n const chartDataItem = chartDataColumn.stacks[0];\n let intValue = parseInt(chartDataItem, 10);\n if (valueAxis1Label === '#K') {\n intValue /= 1000;\n }\n chartStackSeries.data.push({\n value: intValue,\n valueColor: chartDataColumnColor,\n tooltip: {\n visible: true,\n format: '{0}'\n }\n });\n }\n }\n\n const chartSeries = [chartStackSeries];\n const valueAxis1 = {\n name: 'axis1',\n labels: {\n // https://github.com/telerik/kendo-intl/blob/master/docs/num-formatting/index.md\n // cannot currently add format of #K, add issue to https://github.com/telerik/kendo-intl/issues\n format: valueAxis1Label,\n position: 'start',\n visible: true\n },\n line: {\n visible: false\n },\n title: {}\n };\n\n if ('yaxisleftlabel' in apiData) {\n valueAxis1.title = {\n text: apiData.yaxisleftlabel,\n color: apiData.yaxisleftlabelcolor\n };\n } else {\n valueAxis1.labels.visible = false;\n }\n\n this.chartOptions = {\n seriesDefaults: {\n type: 'column',\n stack: false\n },\n\n series: chartSeries,\n chartArea: {\n border: {\n color: '#000',\n width: 1,\n dashType: 'solid'\n },\n height: 400\n },\n\n valueAxis: [valueAxis1],\n categoryAxis: {\n categories: chartCategories,\n majorGridLines: {\n visible: false\n },\n labels: {\n rotation: -45\n }\n }\n };\n }\n\n isDataFound(apiData) {\n const dataFound = super.isDataFound(apiData);\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","import { Input, Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileReference } from '../../../dashboards/tile-reference';\nimport { TileComponent } from '../../../tiles/base/tile.component';\n\n@ComponentLookup('BrTextIndicatorsComponent')\n@Component({\n selector: 'app-br-text-indicator',\n templateUrl: './br-text-indicator.component.html',\n styleUrls: ['./br-text-indicator.component.scss']\n})\n\nexport class BrTextIndicatorComponent extends TileComponent implements OnInit {\n defaultPreferences() {\n return {\n showTitle: true\n };\n }\n\n title = 'No Title Listed';\n strScore = 0\n strColor = 'gray';\n strSubTitle = 'No Subtitle Listed';\n\n translateApiDataForChart(apiData) {\n // console.log(this.tileReference.apiSource);\n // console.log('ALCM Score', apiData.values['score']);\n this.title = apiData.title;\n this.strSubTitle = apiData.subtitle;\n if (apiData.values['score'].score) { this.strScore = apiData.values['score'].score; };\n if (apiData.values['score'].color) { this.strColor = apiData.values['score'].color; };\n }\n\n isDataFound(apiData) {\n const dataFound = super.isDataFound(apiData);\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\n return dataFound;\n }\n}\n","\n
\n \n \n \n \n

{{title}}

\n \n {{strScore}}\n \n
\n \n {{strSubTitle}}\n \n
\n
\n
\n","\n
\n \n

{{title}}

\n \n
\n
\n\n","import { Input, Component, OnInit } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup';\r\nimport { TileReference } from '../../../dashboards/tile-reference';\r\nimport { TileComponent } from '../../../tiles/base/tile.component';\r\n\r\n@Component({\r\n selector: 'app-br-top-items',\r\n templateUrl: './br-top-items.component.html',\r\n styleUrls: ['./br-top-items.component.scss']\r\n})\r\n\r\nexport class BrTopItemsComponent extends TileComponent implements OnInit {\r\n protected defaultPreferences() {\r\n return {\r\n showTitle: true\r\n };\r\n }\r\n\r\n title = 'Customer NPS Scores';\r\n overallColor = 'gray';\r\n fieldColor = 'gray';\r\n techColor = 'gray';\r\n\r\n overallScore = 'N/A';\r\n fieldScore = 'N/A';\r\n techScore = 'N/A';\r\n\r\n translateApiDataForChart(apiData: any) {\r\n //console.log('Test JSON ITEM--', JSON.stringify(apiData));\r\n //console.log('NPS Details--', apiData.values);\r\n this.title = apiData.title;\r\n if (apiData.values['overall'].overallScore) { this.overallScore = apiData.values['overall'].overallScore; }\r\n if (apiData.values['overall'].overallColor) { this.overallColor = apiData.values['overall'].overallColor };\r\n if (apiData.values['field'].fieldScore) { this.fieldScore = apiData.values['field'].fieldScore };\r\n if (apiData.values['field'].fieldColor) { this.fieldColor = apiData.values['field'].fieldColor };\r\n if (apiData.values['tech'].techScore) { this.techScore = apiData.values['tech'].techScore };\r\n if (apiData.values['tech'].techColor) { this.techColor = apiData.values['tech'].techColor; };\r\n // throw new Error('Method not implemented.');\r\n }\r\n isDataFound(apiData) {\r\n const dataFound = super.isDataFound(apiData);\r\n this.nodatacheckService.setHasData(this.tileReference.apiSource, dataFound);\r\n return dataFound;\r\n }\r\n}\r\n","\r\n
\r\n

Multi-Line Chart

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n No data found\r\n
\r\n
\r\n\r\n\r\n","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport { TileComponent } from '../../../tiles/base/tile.component';\nimport { RenderEvent } from '@progress/kendo-angular-charts';\nimport { Rect, Circle as CircleGeometry } from '@progress/kendo-drawing/geometry';\nimport { Group, Path, Layout, Text } from '@progress/kendo-drawing';\n\n@Component({\n selector: 'app-br-example-pie-chart',\n templateUrl: './br-example-pie-chart.component.html',\n styleUrls: ['./br-example-pie-chart.component.scss']\n})\nexport class BrExamplePieChartComponent extends TileComponent implements OnInit {\n\n years = ['assay1', 'assay2', 'assay3', 'assay4', 'assay5'];\n\n students = [\n { name: 'Al', values: [90, 91, 92, 93, 94] },\n { name: 'Brad', values: [89, 88, 87, 86, 85] },\n { name: 'Carl', values: [80, 81, 82, 83, 84] },\n { name: 'Dave', values: [85, 86, 87, 88, 89] },\n ];\n\n translateApiDataForChart(apiData) {\n\n }\n}\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport { ComponentLookup } from '../../../decorators/component-lookup';\nimport {TileReference} from '../../../dashboards/tile-reference';\nimport {BaseTileComponent} from '../../../tiles/base/base-tile.component';\nimport {RequestState} from '../../../api/request-handler';\n\n@ComponentLookup('ApiTestComponent')\n@Component({\n selector: 'app-api-test',\n templateUrl: './api-test.component.html',\n styleUrls: ['./api-test.component.scss']\n})\nexport class ApiTestComponent extends BaseTileComponent implements OnInit, OnDestroy {\n @Input() tileReference: TileReference;\n public apiData;\n public chartOptions;\n protected refreshHandleKey;\n protected requestHandler;\n apiCallIncrement = 1;\n queryParams;\n\n ngOnInit(): void {\n this.setupPreferences();\n this.requestHandler = this.callApiSource(this.tileReference.apiSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.setApiCallResponse(apiData, 0);\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.tileReference.apiSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.tileReference.apiSource));\n }\n\n refreshCall() {\n // { force_call_via_unique_param: this.apiCallIncrement}\n this.requestHandler.sendRequest(this.tileReference.apiSource); // , null, true\n this.apiCallIncrement++;\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n }\n\n setApiCallResponse(apiData, apiDataIndex) {\n this.apiData = apiData;\n }\n\n getQueryParams2() {\n this.queryParams = this.detailQueryParamsService.getQueryParams();\n this.queryParams['component'] = 'DdtLoaderComponent';\n this.queryParams['apiUrl'] = this.tileReference.apiSource;\n return this.queryParams;\n }\n}\n","{{ tileReference.apiSource }}
\n
\n\nDDT","import { Injectable } from '@angular/core';\nimport {PersonaLevels} from '../configuration/persona-levels';\nimport {ApiService} from './api.service';\nimport {RefreshHandlerService} from './refresh-handler.service';\nimport {AuthenticationService} from '../authentication/authentication.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PersonaOptionsService {\n requestHandlers = {};\n\n config = PersonaLevels;\n\n constructor(\n private apiService: ApiService,\n private refreshHandlerService: RefreshHandlerService,\n private authService: AuthenticationService\n ) { }\n\n initialLoad() {\n // preload values for the menus, so user need not wait\n this.loadPersonaOptions('level1Service');\n this.loadPersonaOptions('level2ServiceCustomers');\n this.loadPersonaOptions('level2ServiceInstruments');\n this.loadPersonaOptions('level1Amb');\n }\n\n loadPersonaOptions(configType) {\n // api calls\n if (!(configType in this.config)) {\n console.error(\n 'persona.service.ts: Cannot call loadPersonaOptions(configType)' +\n ' for a configType not existing in the configuration array.'\n );\n }\n for (const apiCall of this.config[configType].apiCalls) {\n this.loadPersonaOptionList(apiCall.mappingKey, configType);\n }\n }\n\n loadPersonaOptionList(mappingKey, configType) {\n if (!(mappingKey in this.requestHandlers)) {\n this.requestHandlers[mappingKey] = this.apiService.get(mappingKey);\n this.requestHandlers[mappingKey].sendRequest(mappingKey);\n if (configType === 'level2ServiceCustomers' || configType === 'level2ServiceInstruments') {\n this.refreshHandlerService.onRefreshEvent(\n (index) => {\n this.requestHandlers[mappingKey].sendRequest(mappingKey);\n },\n this.requestHandlers[mappingKey].getRelativeParams(mappingKey)\n );\n }\n } else { // this may not be needed due to the refresh handler\n this.requestHandlers[mappingKey].sendRequest(mappingKey);\n }\n }\n}\n","import { Observable } from '../Observable';\nimport { noop } from '../util/noop';\nexport const NEVER = new Observable(noop);\nexport function never() {\n return NEVER;\n}\n//# sourceMappingURL=never.js.map","import { empty } from './observable/empty';\nimport { of } from './observable/of';\nimport { throwError } from './observable/throwError';\nexport var NotificationKind;\n(function (NotificationKind) {\n NotificationKind[\"NEXT\"] = \"N\";\n NotificationKind[\"ERROR\"] = \"E\";\n NotificationKind[\"COMPLETE\"] = \"C\";\n})(NotificationKind || (NotificationKind = {}));\nexport class Notification {\n constructor(kind, value, error) {\n this.kind = kind;\n this.value = value;\n this.error = error;\n this.hasValue = kind === 'N';\n }\n observe(observer) {\n switch (this.kind) {\n case 'N':\n return observer.next && observer.next(this.value);\n case 'E':\n return observer.error && observer.error(this.error);\n case 'C':\n return observer.complete && observer.complete();\n }\n }\n do(next, error, complete) {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return next && next(this.value);\n case 'E':\n return error && error(this.error);\n case 'C':\n return complete && complete();\n }\n }\n accept(nextOrObserver, error, complete) {\n if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n return this.observe(nextOrObserver);\n }\n else {\n return this.do(nextOrObserver, error, complete);\n }\n }\n toObservable() {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return of(this.value);\n case 'E':\n return throwError(this.error);\n case 'C':\n return empty();\n }\n throw new Error('unexpected notification kind value');\n }\n static createNext(value) {\n if (typeof value !== 'undefined') {\n return new Notification('N', value);\n }\n return Notification.undefinedValueNotification;\n }\n static createError(err) {\n return new Notification('E', undefined, err);\n }\n static createComplete() {\n return Notification.completeNotification;\n }\n}\nNotification.completeNotification = new Notification('C');\nNotification.undefinedValueNotification = new Notification('N', undefined);\n//# sourceMappingURL=Notification.js.map","import { async } from '../scheduler/async';\nimport { isDate } from '../util/isDate';\nimport { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nexport function delay(delay, scheduler = async) {\n const absoluteDelay = isDate(delay);\n const delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n return (source) => source.lift(new DelayOperator(delayFor, scheduler));\n}\nclass DelayOperator {\n constructor(delay, scheduler) {\n this.delay = delay;\n this.scheduler = scheduler;\n }\n call(subscriber, source) {\n return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n }\n}\nclass DelaySubscriber extends Subscriber {\n constructor(destination, delay, scheduler) {\n super(destination);\n this.delay = delay;\n this.scheduler = scheduler;\n this.queue = [];\n this.active = false;\n this.errored = false;\n }\n static dispatch(state) {\n const source = state.source;\n const queue = source.queue;\n const scheduler = state.scheduler;\n const destination = state.destination;\n while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n queue.shift().notification.observe(destination);\n }\n if (queue.length > 0) {\n const delay = Math.max(0, queue[0].time - scheduler.now());\n this.schedule(state, delay);\n }\n else {\n this.unsubscribe();\n source.active = false;\n }\n }\n _schedule(scheduler) {\n this.active = true;\n const destination = this.destination;\n destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n source: this, destination: this.destination, scheduler: scheduler\n }));\n }\n scheduleNotification(notification) {\n if (this.errored === true) {\n return;\n }\n const scheduler = this.scheduler;\n const message = new DelayMessage(scheduler.now() + this.delay, notification);\n this.queue.push(message);\n if (this.active === false) {\n this._schedule(scheduler);\n }\n }\n _next(value) {\n this.scheduleNotification(Notification.createNext(value));\n }\n _error(err) {\n this.errored = true;\n this.queue = [];\n this.destination.error(err);\n this.unsubscribe();\n }\n _complete() {\n this.scheduleNotification(Notification.createComplete());\n this.unsubscribe();\n }\n}\nclass DelayMessage {\n constructor(time, notification) {\n this.time = time;\n this.notification = notification;\n }\n}\n//# sourceMappingURL=delay.js.map","export function isDate(value) {\n return value instanceof Date && !isNaN(+value);\n}\n//# sourceMappingURL=isDate.js.map","/**\n * @license Angular v9.0.7\n * (c) 2010-2020 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable, InjectionToken, ApplicationRef, PLATFORM_ID, APP_INITIALIZER, Injector, NgModule } from '@angular/core';\nimport { defer, throwError, fromEvent, of, concat, Subject, NEVER, merge } from 'rxjs';\nimport { map, filter, switchMap, publish, take, tap, delay } from 'rxjs/operators';\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/src/low_level.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nimport * as ɵngcc0 from '@angular/core';\nconst ERR_SW_NOT_SUPPORTED = 'Service workers are disabled or not supported by this browser';\n/**\n * An event emitted when a new version of the app is available.\n *\n * \\@publicApi\n * @record\n */\nfunction UpdateAvailableEvent() { }\nif (false) {\n /** @type {?} */\n UpdateAvailableEvent.prototype.type;\n /** @type {?} */\n UpdateAvailableEvent.prototype.current;\n /** @type {?} */\n UpdateAvailableEvent.prototype.available;\n}\n/**\n * An event emitted when a new version of the app has been downloaded and activated.\n *\n * \\@publicApi\n * @record\n */\nfunction UpdateActivatedEvent() { }\nif (false) {\n /** @type {?} */\n UpdateActivatedEvent.prototype.type;\n /** @type {?|undefined} */\n UpdateActivatedEvent.prototype.previous;\n /** @type {?} */\n UpdateActivatedEvent.prototype.current;\n}\n/**\n * An event emitted when a `PushEvent` is received by the service worker.\n * @record\n */\nfunction PushEvent() { }\nif (false) {\n /** @type {?} */\n PushEvent.prototype.type;\n /** @type {?} */\n PushEvent.prototype.data;\n}\n/**\n * @record\n */\nfunction TypedEvent() { }\nif (false) {\n /** @type {?} */\n TypedEvent.prototype.type;\n}\n/**\n * @record\n */\nfunction StatusEvent() { }\nif (false) {\n /** @type {?} */\n StatusEvent.prototype.type;\n /** @type {?} */\n StatusEvent.prototype.nonce;\n /** @type {?} */\n StatusEvent.prototype.status;\n /** @type {?|undefined} */\n StatusEvent.prototype.error;\n}\n/**\n * @param {?} message\n * @return {?}\n */\nfunction errorObservable(message) {\n return defer((/**\n * @return {?}\n */\n () => throwError(new Error(message))));\n}\n/**\n * \\@publicApi\n */\nclass NgswCommChannel {\n /**\n * @param {?} serviceWorker\n */\n constructor(serviceWorker) {\n this.serviceWorker = serviceWorker;\n if (!serviceWorker) {\n this.worker = this.events = this.registration = errorObservable(ERR_SW_NOT_SUPPORTED);\n }\n else {\n /** @type {?} */\n const controllerChangeEvents = fromEvent(serviceWorker, 'controllerchange');\n /** @type {?} */\n const controllerChanges = controllerChangeEvents.pipe(map((/**\n * @return {?}\n */\n () => serviceWorker.controller)));\n /** @type {?} */\n const currentController = defer((/**\n * @return {?}\n */\n () => of(serviceWorker.controller)));\n /** @type {?} */\n const controllerWithChanges = concat(currentController, controllerChanges);\n this.worker = controllerWithChanges.pipe(filter((/**\n * @param {?} c\n * @return {?}\n */\n (c) => !!c)));\n this.registration = (/** @type {?} */ ((this.worker.pipe(switchMap((/**\n * @return {?}\n */\n () => serviceWorker.getRegistration()))))));\n /** @type {?} */\n const rawEvents = fromEvent(serviceWorker, 'message');\n /** @type {?} */\n const rawEventPayload = rawEvents.pipe(map((/**\n * @param {?} event\n * @return {?}\n */\n event => event.data)));\n /** @type {?} */\n const eventsUnconnected = rawEventPayload.pipe(filter((/**\n * @param {?} event\n * @return {?}\n */\n event => event && event.type)));\n /** @type {?} */\n const events = (/** @type {?} */ (eventsUnconnected.pipe(publish())));\n events.connect();\n this.events = events;\n }\n }\n /**\n * @param {?} action\n * @param {?} payload\n * @return {?}\n */\n postMessage(action, payload) {\n return this.worker\n .pipe(take(1), tap((/**\n * @param {?} sw\n * @return {?}\n */\n (sw) => {\n sw.postMessage(Object.assign({ action }, payload));\n })))\n .toPromise()\n .then((/**\n * @return {?}\n */\n () => undefined));\n }\n /**\n * @param {?} type\n * @param {?} payload\n * @param {?} nonce\n * @return {?}\n */\n postMessageWithStatus(type, payload, nonce) {\n /** @type {?} */\n const waitForStatus = this.waitForStatus(nonce);\n /** @type {?} */\n const postMessage = this.postMessage(type, payload);\n return Promise.all([waitForStatus, postMessage]).then((/**\n * @return {?}\n */\n () => undefined));\n }\n /**\n * @return {?}\n */\n generateNonce() { return Math.round(Math.random() * 10000000); }\n /**\n * @template T\n * @param {?} type\n * @return {?}\n */\n eventsOfType(type) {\n /** @type {?} */\n const filterFn = (/**\n * @param {?} event\n * @return {?}\n */\n (event) => event.type === type);\n return this.events.pipe(filter(filterFn));\n }\n /**\n * @template T\n * @param {?} type\n * @return {?}\n */\n nextEventOfType(type) {\n return this.eventsOfType(type).pipe(take(1));\n }\n /**\n * @param {?} nonce\n * @return {?}\n */\n waitForStatus(nonce) {\n return this.eventsOfType('STATUS')\n .pipe(filter((/**\n * @param {?} event\n * @return {?}\n */\n event => event.nonce === nonce)), take(1), map((/**\n * @param {?} event\n * @return {?}\n */\n event => {\n if (event.status) {\n return undefined;\n }\n throw new Error((/** @type {?} */ (event.error)));\n })))\n .toPromise();\n }\n /**\n * @return {?}\n */\n get isEnabled() { return !!this.serviceWorker; }\n}\nif (false) {\n /** @type {?} */\n NgswCommChannel.prototype.worker;\n /** @type {?} */\n NgswCommChannel.prototype.registration;\n /** @type {?} */\n NgswCommChannel.prototype.events;\n /**\n * @type {?}\n * @private\n */\n NgswCommChannel.prototype.serviceWorker;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/src/push.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * Subscribe and listen to\n * [Web Push Notifications](https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Best_Practices)\n * through Angular Service Worker.\n *\n * \\@usageNotes\n *\n * You can inject a `SwPush` instance into any component or service\n * as a dependency.\n *\n * \n *\n * To subscribe, call `SwPush.requestSubscription()`, which asks the user for permission.\n * The call returns a `Promise` with a new\n * [`PushSubscription`](https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription)\n * instance.\n *\n * \n *\n * A request is rejected if the user denies permission, or if the browser\n * blocks or does not support the Push API or ServiceWorkers.\n * Check `SwPush.isEnabled` to confirm status.\n *\n * Invoke Push Notifications by pushing a message with the following payload.\n *\n * ```ts\n * {\n * \"notification\": {\n * \"actions\": NotificationAction[],\n * \"badge\": USVString\n * \"body\": DOMString,\n * \"data\": any,\n * \"dir\": \"auto\"|\"ltr\"|\"rtl\",\n * \"icon\": USVString,\n * \"image\": USVString,\n * \"lang\": DOMString,\n * \"renotify\": boolean,\n * \"requireInteraction\": boolean,\n * \"silent\": boolean,\n * \"tag\": DOMString,\n * \"timestamp\": DOMTimeStamp,\n * \"title\": DOMString,\n * \"vibrate\": number[]\n * }\n * }\n * ```\n *\n * Only `title` is required. See `Notification`\n * [instance properties](https://developer.mozilla.org/en-US/docs/Web/API/Notification#Instance_properties).\n *\n * While the subscription is active, Service Worker listens for\n * [PushEvent](https://developer.mozilla.org/en-US/docs/Web/API/PushEvent)\n * occurrences and creates\n * [Notification](https://developer.mozilla.org/en-US/docs/Web/API/Notification)\n * instances in response.\n *\n * Unsubscribe using `SwPush.unsubscribe()`.\n *\n * An application can subscribe to `SwPush.notificationClicks` observable to be notified when a user\n * clicks on a notification. For example:\n *\n * \n *\n * @see [Push Notifications](https://developers.google.com/web/fundamentals/codelabs/push-notifications/)\n * @see [Angular Push Notifications](https://blog.angular-university.io/angular-push-notifications/)\n * @see [MDN: Push API](https://developer.mozilla.org/en-US/docs/Web/API/Push_API)\n * @see [MDN: Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API)\n * @see [MDN: Web Push API Notifications best practices](https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Best_Practices)\n *\n * \\@publicApi\n */\nclass SwPush {\n /**\n * @param {?} sw\n */\n constructor(sw) {\n this.sw = sw;\n this.subscriptionChanges = new Subject();\n if (!sw.isEnabled) {\n this.messages = NEVER;\n this.notificationClicks = NEVER;\n this.subscription = NEVER;\n return;\n }\n this.messages = this.sw.eventsOfType('PUSH').pipe(map((/**\n * @param {?} message\n * @return {?}\n */\n message => message.data)));\n this.notificationClicks =\n this.sw.eventsOfType('NOTIFICATION_CLICK').pipe(map((/**\n * @param {?} message\n * @return {?}\n */\n (message) => message.data)));\n this.pushManager = this.sw.registration.pipe(map((/**\n * @param {?} registration\n * @return {?}\n */\n registration => registration.pushManager)));\n /** @type {?} */\n const workerDrivenSubscriptions = this.pushManager.pipe(switchMap((/**\n * @param {?} pm\n * @return {?}\n */\n pm => pm.getSubscription())));\n this.subscription = merge(workerDrivenSubscriptions, this.subscriptionChanges);\n }\n /**\n * True if the Service Worker is enabled (supported by the browser and enabled via\n * `ServiceWorkerModule`).\n * @return {?}\n */\n get isEnabled() { return this.sw.isEnabled; }\n /**\n * Subscribes to Web Push Notifications,\n * after requesting and receiving user permission.\n *\n * @param {?} options An object containing the `serverPublicKey` string.\n * @return {?} A Promise that resolves to the new subscription object.\n */\n requestSubscription(options) {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n /** @type {?} */\n const pushOptions = { userVisibleOnly: true };\n /** @type {?} */\n let key = this.decodeBase64(options.serverPublicKey.replace(/_/g, '/').replace(/-/g, '+'));\n /** @type {?} */\n let applicationServerKey = new Uint8Array(new ArrayBuffer(key.length));\n for (let i = 0; i < key.length; i++) {\n applicationServerKey[i] = key.charCodeAt(i);\n }\n pushOptions.applicationServerKey = applicationServerKey;\n return this.pushManager.pipe(switchMap((/**\n * @param {?} pm\n * @return {?}\n */\n pm => pm.subscribe(pushOptions))), take(1))\n .toPromise()\n .then((/**\n * @param {?} sub\n * @return {?}\n */\n sub => {\n this.subscriptionChanges.next(sub);\n return sub;\n }));\n }\n /**\n * Unsubscribes from Service Worker push notifications.\n *\n * @return {?} A Promise that is resolved when the operation succeeds, or is rejected if there is no\n * active subscription or the unsubscribe operation fails.\n */\n unsubscribe() {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n /** @type {?} */\n const doUnsubscribe = (/**\n * @param {?} sub\n * @return {?}\n */\n (sub) => {\n if (sub === null) {\n throw new Error('Not subscribed to push notifications.');\n }\n return sub.unsubscribe().then((/**\n * @param {?} success\n * @return {?}\n */\n success => {\n if (!success) {\n throw new Error('Unsubscribe failed!');\n }\n this.subscriptionChanges.next(null);\n }));\n });\n return this.subscription.pipe(take(1), switchMap(doUnsubscribe)).toPromise();\n }\n /**\n * @private\n * @param {?} input\n * @return {?}\n */\n decodeBase64(input) { return atob(input); }\n}\nSwPush.ɵfac = function SwPush_Factory(t) { return new (t || SwPush)(ɵngcc0.ɵɵinject(NgswCommChannel)); };\nSwPush.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SwPush, factory: SwPush.ɵfac });\n/** @nocollapse */\nSwPush.ctorParameters = () => [\n { type: NgswCommChannel }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SwPush, [{\n type: Injectable\n }], function () { return [{ type: NgswCommChannel }]; }, null); })();\nif (false) {\n /**\n * Emits the payloads of the received push notification messages.\n * @type {?}\n */\n SwPush.prototype.messages;\n /**\n * Emits the payloads of the received push notification messages as well as the action the user\n * interacted with. If no action was used the `action` property contains an empty string `''`.\n *\n * Note that the `notification` property does **not** contain a\n * [Notification][Mozilla Notification] object but rather a\n * [NotificationOptions](https://notifications.spec.whatwg.org/#dictdef-notificationoptions)\n * object that also includes the `title` of the [Notification][Mozilla Notification] object.\n *\n * [Mozilla Notification]: https://developer.mozilla.org/en-US/docs/Web/API/Notification\n * @type {?}\n */\n SwPush.prototype.notificationClicks;\n /**\n * Emits the currently active\n * [PushSubscription](https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription)\n * associated to the Service Worker registration or `null` if there is no subscription.\n * @type {?}\n */\n SwPush.prototype.subscription;\n /**\n * @type {?}\n * @private\n */\n SwPush.prototype.pushManager;\n /**\n * @type {?}\n * @private\n */\n SwPush.prototype.subscriptionChanges;\n /**\n * @type {?}\n * @private\n */\n SwPush.prototype.sw;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/src/update.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * Subscribe to update notifications from the Service Worker, trigger update\n * checks, and forcibly activate updates.\n *\n * \\@publicApi\n */\nclass SwUpdate {\n /**\n * @param {?} sw\n */\n constructor(sw) {\n this.sw = sw;\n if (!sw.isEnabled) {\n this.available = NEVER;\n this.activated = NEVER;\n return;\n }\n this.available = this.sw.eventsOfType('UPDATE_AVAILABLE');\n this.activated = this.sw.eventsOfType('UPDATE_ACTIVATED');\n }\n /**\n * True if the Service Worker is enabled (supported by the browser and enabled via\n * `ServiceWorkerModule`).\n * @return {?}\n */\n get isEnabled() { return this.sw.isEnabled; }\n /**\n * @return {?}\n */\n checkForUpdate() {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n /** @type {?} */\n const statusNonce = this.sw.generateNonce();\n return this.sw.postMessageWithStatus('CHECK_FOR_UPDATES', { statusNonce }, statusNonce);\n }\n /**\n * @return {?}\n */\n activateUpdate() {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n /** @type {?} */\n const statusNonce = this.sw.generateNonce();\n return this.sw.postMessageWithStatus('ACTIVATE_UPDATE', { statusNonce }, statusNonce);\n }\n}\nSwUpdate.ɵfac = function SwUpdate_Factory(t) { return new (t || SwUpdate)(ɵngcc0.ɵɵinject(NgswCommChannel)); };\nSwUpdate.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SwUpdate, factory: SwUpdate.ɵfac });\n/** @nocollapse */\nSwUpdate.ctorParameters = () => [\n { type: NgswCommChannel }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SwUpdate, [{\n type: Injectable\n }], function () { return [{ type: NgswCommChannel }]; }, null); })();\nif (false) {\n /**\n * Emits an `UpdateAvailableEvent` event whenever a new app version is available.\n * @type {?}\n */\n SwUpdate.prototype.available;\n /**\n * Emits an `UpdateActivatedEvent` event whenever the app has been updated to a new version.\n * @type {?}\n */\n SwUpdate.prototype.activated;\n /**\n * @type {?}\n * @private\n */\n SwUpdate.prototype.sw;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/src/module.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * Token that can be used to provide options for `ServiceWorkerModule` outside of\n * `ServiceWorkerModule.register()`.\n *\n * You can use this token to define a provider that generates the registration options at runtime,\n * for example via a function call:\n *\n * {\\@example service-worker/registration-options/module.ts region=\"registration-options\"\n * header=\"app.module.ts\"}\n *\n * \\@publicApi\n * @abstract\n */\nclass SwRegistrationOptions {\n}\nif (false) {\n /**\n * Whether the ServiceWorker will be registered and the related services (such as `SwPush` and\n * `SwUpdate`) will attempt to communicate and interact with it.\n *\n * Default: true\n * @type {?}\n */\n SwRegistrationOptions.prototype.enabled;\n /**\n * A URL that defines the ServiceWorker's registration scope; that is, what range of URLs it can\n * control. It will be used when calling\n * [ServiceWorkerContainer#register()](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register).\n * @type {?}\n */\n SwRegistrationOptions.prototype.scope;\n /**\n * Defines the ServiceWorker registration strategy, which determines when it will be registered\n * with the browser.\n *\n * The default behavior of registering once the application stabilizes (i.e. as soon as there are\n * no pending micro- and macro-tasks), is designed register the ServiceWorker as soon as possible\n * but without affecting the application's first time load.\n *\n * Still, there might be cases where you want more control over when the ServiceWorker is\n * registered (e.g. there might be a long-running timeout or polling interval, preventing the app\n * to stabilize). The available option are:\n *\n * - `registerWhenStable`: Register as soon as the application stabilizes (no pending\n * micro-/macro-tasks).\n * - `registerImmediately`: Register immediately.\n * - `registerWithDelay:`: Register with a delay of `` milliseconds. For\n * example, use `registerWithDelay:5000` to register the ServiceWorker after 5 seconds. If\n * `` is omitted, is defaults to `0`, which will register the ServiceWorker as soon\n * as possible but still asynchronously, once all pending micro-tasks are completed.\n * - An [Observable](guide/observables) factory function: A function that returns an `Observable`.\n * The function will be used at runtime to obtain and subscribe to the `Observable` and the\n * ServiceWorker will be registered as soon as the first value is emitted.\n *\n * Default: 'registerWhenStable'\n * @type {?}\n */\n SwRegistrationOptions.prototype.registrationStrategy;\n}\n/** @type {?} */\nconst SCRIPT = new InjectionToken('NGSW_REGISTER_SCRIPT');\n/**\n * @param {?} injector\n * @param {?} script\n * @param {?} options\n * @param {?} platformId\n * @return {?}\n */\nfunction ngswAppInitializer(injector, script, options, platformId) {\n /** @type {?} */\n const initializer = (/**\n * @return {?}\n */\n () => {\n if (!(isPlatformBrowser(platformId) && ('serviceWorker' in navigator) &&\n options.enabled !== false)) {\n return;\n }\n // Wait for service worker controller changes, and fire an INITIALIZE action when a new SW\n // becomes active. This allows the SW to initialize itself even if there is no application\n // traffic.\n navigator.serviceWorker.addEventListener('controllerchange', (/**\n * @return {?}\n */\n () => {\n if (navigator.serviceWorker.controller !== null) {\n navigator.serviceWorker.controller.postMessage({ action: 'INITIALIZE' });\n }\n }));\n /** @type {?} */\n let readyToRegister$;\n if (typeof options.registrationStrategy === 'function') {\n readyToRegister$ = options.registrationStrategy();\n }\n else {\n const [strategy, ...args] = (options.registrationStrategy || 'registerWhenStable').split(':');\n switch (strategy) {\n case 'registerImmediately':\n readyToRegister$ = of(null);\n break;\n case 'registerWithDelay':\n readyToRegister$ = of(null).pipe(delay(+args[0] || 0));\n break;\n case 'registerWhenStable':\n /** @type {?} */\n const appRef = injector.get(ApplicationRef);\n readyToRegister$ = appRef.isStable.pipe(filter((/**\n * @param {?} stable\n * @return {?}\n */\n stable => stable)));\n break;\n default:\n // Unknown strategy.\n throw new Error(`Unknown ServiceWorker registration strategy: ${options.registrationStrategy}`);\n }\n }\n // Don't return anything to avoid blocking the application until the SW is registered.\n // Catch and log the error if SW registration fails to avoid uncaught rejection warning.\n readyToRegister$.pipe(take(1)).subscribe((/**\n * @return {?}\n */\n () => navigator.serviceWorker.register(script, { scope: options.scope })\n .catch((/**\n * @param {?} err\n * @return {?}\n */\n err => console.error('Service worker registration failed with:', err)))));\n });\n return initializer;\n}\n/**\n * @param {?} opts\n * @param {?} platformId\n * @return {?}\n */\nfunction ngswCommChannelFactory(opts, platformId) {\n return new NgswCommChannel(isPlatformBrowser(platformId) && opts.enabled !== false ? navigator.serviceWorker :\n undefined);\n}\n/**\n * \\@publicApi\n */\nclass ServiceWorkerModule {\n /**\n * Register the given Angular Service Worker script.\n *\n * If `enabled` is set to `false` in the given options, the module will behave as if service\n * workers are not supported by the browser, and the service worker will not be registered.\n * @param {?} script\n * @param {?=} opts\n * @return {?}\n */\n static register(script, opts = {}) {\n return {\n ngModule: ServiceWorkerModule,\n providers: [\n { provide: SCRIPT, useValue: script },\n { provide: SwRegistrationOptions, useValue: opts },\n {\n provide: NgswCommChannel,\n useFactory: ngswCommChannelFactory,\n deps: [SwRegistrationOptions, PLATFORM_ID]\n },\n {\n provide: APP_INITIALIZER,\n useFactory: ngswAppInitializer,\n deps: [Injector, SCRIPT, SwRegistrationOptions, PLATFORM_ID],\n multi: true,\n },\n ],\n };\n }\n}\nServiceWorkerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ServiceWorkerModule });\nServiceWorkerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ServiceWorkerModule_Factory(t) { return new (t || ServiceWorkerModule)(); }, providers: [SwPush, SwUpdate] });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ServiceWorkerModule, [{\n type: NgModule,\n args: [{\n providers: [SwPush, SwUpdate]\n }]\n }], null, null); })();\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/src/index.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/public_api.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/service-worker/index.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ServiceWorkerModule, SwPush, SwRegistrationOptions, SwUpdate, NgswCommChannel as ɵangular_packages_service_worker_service_worker_a, SCRIPT as ɵangular_packages_service_worker_service_worker_b, ngswAppInitializer as ɵangular_packages_service_worker_service_worker_c, ngswCommChannelFactory as ɵangular_packages_service_worker_service_worker_d };\n\n//# sourceMappingURL=service-worker.js.map","import { Subject } from '../Subject';\nimport { multicast } from './multicast';\nexport function publish(selector) {\n return selector ?\n multicast(() => new Subject(), selector) :\n multicast(new Subject());\n}\n//# sourceMappingURL=publish.js.map","import {Injectable} from \"@angular/core\";\nimport {HttpClient, HttpParams, HttpHeaders} from \"@angular/common/http\";\nimport { ApiService } from './api.service';\nimport { environment } from '../../environments/environment';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PushNotificationService {\n\n subscribeRoute = 'pushnotifications/subscribe';\n sendRoute = 'pushnotifications/send';\n\n apiUrl = environment.proxyServerUrl + '/proxy2.php';\n\n constructor(private apiService: ApiService, private http: HttpClient) {\n }\n\n /*addPushSubscriber(sub: any) {\n const requestHandler = this.apiService.get(this.subscribeRoute);\n let subsJsonString = JSON.stringify(sub);\n console.log(subsJsonString);\n let subsObj = JSON.parse(subsJsonString);\n console.log(subsObj);\n let params = { endpoint: subsObj.endpoint, expirationTime: subsObj.expirationTime, p256dh: subsObj.keys.p256dh, auth: subsObj.keys.auth };\n console.log(params);\n return requestHandler.sendRequest(this.subscribeRoute, params);\n } \n\n send() {\n const requestHandler = this.apiService.get(this.sendRoute);\n requestHandler.sendRequest(this.sendRoute);\n } */\n\n addPushSubscriber(sub:any) {\n const formData = new HttpParams({\n fromObject: {\n route: this.subscribeRoute,\n post: JSON.stringify(sub)\n }\n });\n const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');\n return this.http.post(this.apiUrl + '?route=' + this.subscribeRoute, formData, {headers: headers, withCredentials: true });\n }\n\n send() { \n return this.http.post(this.apiUrl + '?route=' + this.sendRoute, null);\n }\n \n}\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar CryptoUtils = /** @class */ (function () {\r\n function CryptoUtils() {\r\n }\r\n /**\r\n * Creates a new random GUID\r\n * @returns string (GUID)\r\n */\r\n CryptoUtils.createNewGuid = function () {\r\n /*\r\n * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or\r\n * pseudo-random numbers.\r\n * The algorithm is as follows:\r\n * Set the two most significant bits (bits 6 and 7) of the\r\n * clock_seq_hi_and_reserved to zero and one, respectively.\r\n * Set the four most significant bits (bits 12 through 15) of the\r\n * time_hi_and_version field to the 4-bit version number from\r\n * Section 4.1.3. Version4\r\n * Set all the other bits to randomly (or pseudo-randomly) chosen\r\n * values.\r\n * UUID = time-low \"-\" time-mid \"-\"time-high-and-version \"-\"clock-seq-reserved and low(2hexOctet)\"-\" node\r\n * time-low = 4hexOctet\r\n * time-mid = 2hexOctet\r\n * time-high-and-version = 2hexOctet\r\n * clock-seq-and-reserved = hexOctet:\r\n * clock-seq-low = hexOctet\r\n * node = 6hexOctet\r\n * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\r\n * y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10\r\n * y values are 8, 9, A, B\r\n */\r\n var cryptoObj = window.crypto; // for IE 11\r\n if (cryptoObj && cryptoObj.getRandomValues) {\r\n var buffer = new Uint8Array(16);\r\n cryptoObj.getRandomValues(buffer);\r\n // buffer[6] and buffer[7] represents the time_hi_and_version field. We will set the four most significant bits (4 through 7) of buffer[6] to represent decimal number 4 (UUID version number).\r\n buffer[6] |= 0x40; // buffer[6] | 01000000 will set the 6 bit to 1.\r\n buffer[6] &= 0x4f; // buffer[6] & 01001111 will set the 4, 5, and 7 bit to 0 such that bits 4-7 == 0100 = \"4\".\r\n // buffer[8] represents the clock_seq_hi_and_reserved field. We will set the two most significant bits (6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.\r\n buffer[8] |= 0x80; // buffer[8] | 10000000 will set the 7 bit to 1.\r\n buffer[8] &= 0xbf; // buffer[8] & 10111111 will set the 6 bit to 0.\r\n return CryptoUtils.decimalToHex(buffer[0]) + CryptoUtils.decimalToHex(buffer[1])\r\n + CryptoUtils.decimalToHex(buffer[2]) + CryptoUtils.decimalToHex(buffer[3])\r\n + \"-\" + CryptoUtils.decimalToHex(buffer[4]) + CryptoUtils.decimalToHex(buffer[5])\r\n + \"-\" + CryptoUtils.decimalToHex(buffer[6]) + CryptoUtils.decimalToHex(buffer[7])\r\n + \"-\" + CryptoUtils.decimalToHex(buffer[8]) + CryptoUtils.decimalToHex(buffer[9])\r\n + \"-\" + CryptoUtils.decimalToHex(buffer[10]) + CryptoUtils.decimalToHex(buffer[11])\r\n + CryptoUtils.decimalToHex(buffer[12]) + CryptoUtils.decimalToHex(buffer[13])\r\n + CryptoUtils.decimalToHex(buffer[14]) + CryptoUtils.decimalToHex(buffer[15]);\r\n }\r\n else {\r\n var guidHolder = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\r\n var hex = \"0123456789abcdef\";\r\n var r = 0;\r\n var guidResponse = \"\";\r\n for (var i = 0; i < 36; i++) {\r\n if (guidHolder[i] !== \"-\" && guidHolder[i] !== \"4\") {\r\n // each x and y needs to be random\r\n r = Math.random() * 16 | 0;\r\n }\r\n if (guidHolder[i] === \"x\") {\r\n guidResponse += hex[r];\r\n }\r\n else if (guidHolder[i] === \"y\") {\r\n // clock-seq-and-reserved first hex is filtered and remaining hex values are random\r\n r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??\r\n r |= 0x8; // set pos 3 to 1 as 1???\r\n guidResponse += hex[r];\r\n }\r\n else {\r\n guidResponse += guidHolder[i];\r\n }\r\n }\r\n return guidResponse;\r\n }\r\n };\r\n /**\r\n * verifies if a string is GUID\r\n * @param guid\r\n */\r\n CryptoUtils.isGuid = function (guid) {\r\n var regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n return regexGuid.test(guid);\r\n };\r\n /**\r\n * Decimal to Hex\r\n *\r\n * @param num\r\n */\r\n CryptoUtils.decimalToHex = function (num) {\r\n var hex = num.toString(16);\r\n while (hex.length < 2) {\r\n hex = \"0\" + hex;\r\n }\r\n return hex;\r\n };\r\n // See: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_4_%E2%80%93_escaping_the_string_before_encoding_it\r\n /**\r\n * encoding string to base64 - platform specific check\r\n *\r\n * @param input\r\n */\r\n CryptoUtils.base64Encode = function (input) {\r\n return btoa(encodeURIComponent(input).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\r\n return String.fromCharCode(Number(\"0x\" + p1));\r\n }));\r\n };\r\n /**\r\n * Decodes a base64 encoded string.\r\n *\r\n * @param input\r\n */\r\n CryptoUtils.base64Decode = function (input) {\r\n var encodedString = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n switch (encodedString.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n encodedString += \"==\";\r\n break;\r\n case 3:\r\n encodedString += \"=\";\r\n break;\r\n default:\r\n throw new Error(\"Invalid base64 string\");\r\n }\r\n return decodeURIComponent(atob(encodedString).split(\"\").map(function (c) {\r\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\r\n }).join(\"\"));\r\n };\r\n /**\r\n * deserialize a string\r\n *\r\n * @param query\r\n */\r\n CryptoUtils.deserialize = function (query) {\r\n var match; // Regex for replacing addition symbol with a space\r\n var pl = /\\+/g;\r\n var search = /([^&=]+)=([^&]*)/g;\r\n var decode = function (s) { return decodeURIComponent(s.replace(pl, \" \")); };\r\n var obj = {};\r\n match = search.exec(query);\r\n while (match) {\r\n obj[decode(match[1])] = decode(match[2]);\r\n match = search.exec(query);\r\n }\r\n return obj;\r\n };\r\n return CryptoUtils;\r\n}());\r\nexport { CryptoUtils };\r\n//# sourceMappingURL=CryptoUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n * Constants\r\n */\r\nvar Constants = /** @class */ (function () {\r\n function Constants() {\r\n }\r\n Object.defineProperty(Constants, \"libraryName\", {\r\n get: function () { return \"Msal.js\"; } // used in telemetry sdkName\r\n ,\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"claims\", {\r\n get: function () { return \"claims\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"clientId\", {\r\n get: function () { return \"clientId\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"adalIdToken\", {\r\n get: function () { return \"adal.idtoken\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"cachePrefix\", {\r\n get: function () { return \"msal\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"scopes\", {\r\n get: function () { return \"scopes\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"no_account\", {\r\n get: function () { return \"NO_ACCOUNT\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"upn\", {\r\n get: function () { return \"upn\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"domain_hint\", {\r\n get: function () { return \"domain_hint\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"prompt_select_account\", {\r\n get: function () { return \"&prompt=select_account\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"prompt_none\", {\r\n get: function () { return \"&prompt=none\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"prompt\", {\r\n get: function () { return \"prompt\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"response_mode_fragment\", {\r\n get: function () { return \"&response_mode=fragment\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"resourceDelimiter\", {\r\n get: function () { return \"|\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"cacheDelimiter\", {\r\n get: function () { return \".\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"popUpWidth\", {\r\n get: function () { return this._popUpWidth; },\r\n set: function (width) {\r\n this._popUpWidth = width;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"popUpHeight\", {\r\n get: function () { return this._popUpHeight; },\r\n set: function (height) {\r\n this._popUpHeight = height;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"login\", {\r\n get: function () { return \"LOGIN\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"renewToken\", {\r\n get: function () { return \"RENEW_TOKEN\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"unknown\", {\r\n get: function () { return \"UNKNOWN\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"ADFS\", {\r\n get: function () { return \"adfs\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"homeAccountIdentifier\", {\r\n get: function () { return \"homeAccountIdentifier\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"common\", {\r\n get: function () { return \"common\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"openidScope\", {\r\n get: function () { return \"openid\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"profileScope\", {\r\n get: function () { return \"profile\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"oidcScopes\", {\r\n get: function () { return [this.openidScope, this.profileScope]; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"interactionTypeRedirect\", {\r\n get: function () { return \"redirectInteraction\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"interactionTypePopup\", {\r\n get: function () { return \"popupInteraction\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"interactionTypeSilent\", {\r\n get: function () { return \"silentInteraction\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Constants, \"inProgress\", {\r\n get: function () { return \"inProgress\"; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Constants._popUpWidth = 483;\r\n Constants._popUpHeight = 600;\r\n return Constants;\r\n}());\r\nexport { Constants };\r\n/**\r\n * Keys in the hashParams\r\n */\r\nexport var ServerHashParamKeys;\r\n(function (ServerHashParamKeys) {\r\n ServerHashParamKeys[\"SCOPE\"] = \"scope\";\r\n ServerHashParamKeys[\"STATE\"] = \"state\";\r\n ServerHashParamKeys[\"ERROR\"] = \"error\";\r\n ServerHashParamKeys[\"ERROR_DESCRIPTION\"] = \"error_description\";\r\n ServerHashParamKeys[\"ACCESS_TOKEN\"] = \"access_token\";\r\n ServerHashParamKeys[\"ID_TOKEN\"] = \"id_token\";\r\n ServerHashParamKeys[\"EXPIRES_IN\"] = \"expires_in\";\r\n ServerHashParamKeys[\"SESSION_STATE\"] = \"session_state\";\r\n ServerHashParamKeys[\"CLIENT_INFO\"] = \"client_info\";\r\n})(ServerHashParamKeys || (ServerHashParamKeys = {}));\r\n/**\r\n * @hidden\r\n * @ignore\r\n * response_type from OpenIDConnect\r\n * References: https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html & https://tools.ietf.org/html/rfc6749#section-4.2.1\r\n *\r\n */\r\nexport var ResponseTypes = {\r\n id_token: \"id_token\",\r\n token: \"token\",\r\n id_token_token: \"id_token token\"\r\n};\r\n/**\r\n * @hidden\r\n * CacheKeys for MSAL\r\n */\r\nexport var TemporaryCacheKeys;\r\n(function (TemporaryCacheKeys) {\r\n TemporaryCacheKeys[\"AUTHORITY\"] = \"authority\";\r\n TemporaryCacheKeys[\"ACQUIRE_TOKEN_ACCOUNT\"] = \"acquireTokenAccount\";\r\n TemporaryCacheKeys[\"SESSION_STATE\"] = \"session.state\";\r\n TemporaryCacheKeys[\"STATE_LOGIN\"] = \"state.login\";\r\n TemporaryCacheKeys[\"STATE_ACQ_TOKEN\"] = \"state.acquireToken\";\r\n TemporaryCacheKeys[\"STATE_RENEW\"] = \"state.renew\";\r\n TemporaryCacheKeys[\"NONCE_IDTOKEN\"] = \"nonce.idtoken\";\r\n TemporaryCacheKeys[\"LOGIN_REQUEST\"] = \"login.request\";\r\n TemporaryCacheKeys[\"RENEW_STATUS\"] = \"token.renew.status\";\r\n TemporaryCacheKeys[\"URL_HASH\"] = \"urlHash\";\r\n TemporaryCacheKeys[\"INTERACTION_STATUS\"] = \"interaction_status\";\r\n TemporaryCacheKeys[\"REDIRECT_REQUEST\"] = \"redirect_request\";\r\n})(TemporaryCacheKeys || (TemporaryCacheKeys = {}));\r\nexport var PersistentCacheKeys;\r\n(function (PersistentCacheKeys) {\r\n PersistentCacheKeys[\"IDTOKEN\"] = \"idtoken\";\r\n PersistentCacheKeys[\"CLIENT_INFO\"] = \"client.info\";\r\n})(PersistentCacheKeys || (PersistentCacheKeys = {}));\r\nexport var ErrorCacheKeys;\r\n(function (ErrorCacheKeys) {\r\n ErrorCacheKeys[\"LOGIN_ERROR\"] = \"login.error\";\r\n ErrorCacheKeys[\"ERROR\"] = \"error\";\r\n ErrorCacheKeys[\"ERROR_DESC\"] = \"error.description\";\r\n})(ErrorCacheKeys || (ErrorCacheKeys = {}));\r\nexport var DEFAULT_AUTHORITY = \"https://login.microsoftonline.com/common/\";\r\nexport var AAD_INSTANCE_DISCOVERY_ENDPOINT = DEFAULT_AUTHORITY + \"/discovery/instance?api-version=1.1&authorization_endpoint=\";\r\nexport var WELL_KNOWN_SUFFIX = \".well-known/openid-configuration\";\r\n/**\r\n * @hidden\r\n * SSO Types - generated to populate hints\r\n */\r\nexport var SSOTypes;\r\n(function (SSOTypes) {\r\n SSOTypes[\"ACCOUNT\"] = \"account\";\r\n SSOTypes[\"SID\"] = \"sid\";\r\n SSOTypes[\"LOGIN_HINT\"] = \"login_hint\";\r\n SSOTypes[\"ORGANIZATIONS\"] = \"organizations\";\r\n SSOTypes[\"CONSUMERS\"] = \"consumers\";\r\n SSOTypes[\"ID_TOKEN\"] = \"id_token\";\r\n SSOTypes[\"ACCOUNT_ID\"] = \"accountIdentifier\";\r\n SSOTypes[\"HOMEACCOUNT_ID\"] = \"homeAccountIdentifier\";\r\n})(SSOTypes || (SSOTypes = {}));\r\n/**\r\n * @hidden\r\n */\r\nexport var BlacklistedEQParams = [\r\n SSOTypes.SID,\r\n SSOTypes.LOGIN_HINT\r\n];\r\nexport var NetworkRequestType = {\r\n GET: \"GET\",\r\n POST: \"POST\"\r\n};\r\n/**\r\n * we considered making this \"enum\" in the request instead of string, however it looks like the allowed list of\r\n * prompt values kept changing over past couple of years. There are some undocumented prompt values for some\r\n * internal partners too, hence the choice of generic \"string\" type instead of the \"enum\"\r\n * @hidden\r\n */\r\nexport var PromptState = {\r\n LOGIN: \"login\",\r\n SELECT_ACCOUNT: \"select_account\",\r\n CONSENT: \"consent\",\r\n NONE: \"none\"\r\n};\r\n/**\r\n * Frame name prefixes for the hidden iframe created in silent frames\r\n */\r\nexport var FramePrefix = {\r\n ID_TOKEN_FRAME: \"msalIdTokenFrame\",\r\n TOKEN_FRAME: \"msalRenewFrame\"\r\n};\r\n//# sourceMappingURL=Constants.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { ClientConfigurationErrorMessage, ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { XhrClient } from \"../XHRClient\";\r\nimport { UrlUtils } from \"../utils/UrlUtils\";\r\nimport { TrustedAuthority } from \"./TrustedAuthority\";\r\nimport { NetworkRequestType, Constants, WELL_KNOWN_SUFFIX } from \"../utils/Constants\";\r\n/**\r\n * @hidden\r\n */\r\nexport var AuthorityType;\r\n(function (AuthorityType) {\r\n AuthorityType[AuthorityType[\"Default\"] = 0] = \"Default\";\r\n AuthorityType[AuthorityType[\"Adfs\"] = 1] = \"Adfs\";\r\n})(AuthorityType || (AuthorityType = {}));\r\n/**\r\n * @hidden\r\n */\r\nvar Authority = /** @class */ (function () {\r\n function Authority(authority, validateAuthority, authorityMetadata) {\r\n this.IsValidationEnabled = validateAuthority;\r\n this.CanonicalAuthority = authority;\r\n this.validateAsUri();\r\n this.tenantDiscoveryResponse = authorityMetadata;\r\n }\r\n Authority.isAdfs = function (authorityUrl) {\r\n var components = UrlUtils.GetUrlComponents(authorityUrl);\r\n var pathSegments = components.PathSegments;\r\n return (pathSegments.length && pathSegments[0].toLowerCase() === Constants.ADFS);\r\n };\r\n Object.defineProperty(Authority.prototype, \"AuthorityType\", {\r\n get: function () {\r\n return Authority.isAdfs(this.canonicalAuthority) ? AuthorityType.Adfs : AuthorityType.Default;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"Tenant\", {\r\n get: function () {\r\n return this.CanonicalAuthorityUrlComponents.PathSegments[0];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"AuthorizationEndpoint\", {\r\n get: function () {\r\n this.validateResolved();\r\n return this.tenantDiscoveryResponse.AuthorizationEndpoint.replace(/{tenant}|{tenantid}/g, this.Tenant);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"EndSessionEndpoint\", {\r\n get: function () {\r\n this.validateResolved();\r\n return this.tenantDiscoveryResponse.EndSessionEndpoint.replace(/{tenant}|{tenantid}/g, this.Tenant);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"SelfSignedJwtAudience\", {\r\n get: function () {\r\n this.validateResolved();\r\n return this.tenantDiscoveryResponse.Issuer.replace(/{tenant}|{tenantid}/g, this.Tenant);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Authority.prototype.validateResolved = function () {\r\n if (!this.hasCachedMetadata()) {\r\n throw \"Please call ResolveEndpointsAsync first\";\r\n }\r\n };\r\n Object.defineProperty(Authority.prototype, \"CanonicalAuthority\", {\r\n /**\r\n * A URL that is the authority set by the developer\r\n */\r\n get: function () {\r\n return this.canonicalAuthority;\r\n },\r\n set: function (url) {\r\n this.canonicalAuthority = UrlUtils.CanonicalizeUri(url);\r\n this.canonicalAuthorityUrlComponents = null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"CanonicalAuthorityUrlComponents\", {\r\n get: function () {\r\n if (!this.canonicalAuthorityUrlComponents) {\r\n this.canonicalAuthorityUrlComponents = UrlUtils.GetUrlComponents(this.CanonicalAuthority);\r\n }\r\n return this.canonicalAuthorityUrlComponents;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Authority.prototype, \"DefaultOpenIdConfigurationEndpoint\", {\r\n // http://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\r\n get: function () {\r\n return (this.AuthorityType === AuthorityType.Adfs) ? \"\" + this.CanonicalAuthority + WELL_KNOWN_SUFFIX : this.CanonicalAuthority + \"v2.0/\" + WELL_KNOWN_SUFFIX;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Given a string, validate that it is of the form https://domain/path\r\n */\r\n Authority.prototype.validateAsUri = function () {\r\n var components;\r\n try {\r\n components = this.CanonicalAuthorityUrlComponents;\r\n }\r\n catch (e) {\r\n throw ClientConfigurationErrorMessage.invalidAuthorityType;\r\n }\r\n if (!components.Protocol || components.Protocol.toLowerCase() !== \"https:\") {\r\n throw ClientConfigurationErrorMessage.authorityUriInsecure;\r\n }\r\n if (!components.PathSegments || components.PathSegments.length < 1) {\r\n throw ClientConfigurationErrorMessage.authorityUriInvalidPath;\r\n }\r\n };\r\n /**\r\n * Calls the OIDC endpoint and returns the response\r\n */\r\n Authority.prototype.DiscoverEndpoints = function (openIdConfigurationEndpoint, telemetryManager, correlationId) {\r\n var client = new XhrClient();\r\n var httpMethod = NetworkRequestType.GET;\r\n var httpEvent = telemetryManager.createAndStartHttpEvent(correlationId, httpMethod, openIdConfigurationEndpoint, \"openIdConfigurationEndpoint\");\r\n return client.sendRequestAsync(openIdConfigurationEndpoint, httpMethod, /* enableCaching: */ true)\r\n .then(function (response) {\r\n httpEvent.httpResponseStatus = response.statusCode;\r\n telemetryManager.stopEvent(httpEvent);\r\n return {\r\n AuthorizationEndpoint: response.body[\"authorization_endpoint\"],\r\n EndSessionEndpoint: response.body[\"end_session_endpoint\"],\r\n Issuer: response.body[\"issuer\"]\r\n };\r\n })\r\n .catch(function (err) {\r\n httpEvent.serverErrorCode = err;\r\n telemetryManager.stopEvent(httpEvent);\r\n throw err;\r\n });\r\n };\r\n /**\r\n * Returns a promise.\r\n * Checks to see if the authority is in the cache\r\n * Discover endpoints via openid-configuration\r\n * If successful, caches the endpoint for later use in OIDC\r\n */\r\n Authority.prototype.resolveEndpointsAsync = function (telemetryManager, correlationId) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var host, openIdConfigurationEndpointResponse, _a;\r\n return tslib_1.__generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!this.IsValidationEnabled) return [3 /*break*/, 3];\r\n host = this.canonicalAuthorityUrlComponents.HostNameAndPort;\r\n if (!(TrustedAuthority.getTrustedHostList().length === 0)) return [3 /*break*/, 2];\r\n return [4 /*yield*/, TrustedAuthority.setTrustedAuthoritiesFromNetwork(this.canonicalAuthority, telemetryManager, correlationId)];\r\n case 1:\r\n _b.sent();\r\n _b.label = 2;\r\n case 2:\r\n if (!TrustedAuthority.IsInTrustedHostList(host)) {\r\n throw ClientConfigurationError.createUntrustedAuthorityError(host);\r\n }\r\n _b.label = 3;\r\n case 3:\r\n openIdConfigurationEndpointResponse = this.GetOpenIdConfigurationEndpoint();\r\n _a = this;\r\n return [4 /*yield*/, this.DiscoverEndpoints(openIdConfigurationEndpointResponse, telemetryManager, correlationId)];\r\n case 4:\r\n _a.tenantDiscoveryResponse = _b.sent();\r\n return [2 /*return*/, this.tenantDiscoveryResponse];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Checks if there is a cached tenant discovery response with required fields.\r\n */\r\n Authority.prototype.hasCachedMetadata = function () {\r\n return !!(this.tenantDiscoveryResponse &&\r\n this.tenantDiscoveryResponse.AuthorizationEndpoint &&\r\n this.tenantDiscoveryResponse.EndSessionEndpoint &&\r\n this.tenantDiscoveryResponse.Issuer);\r\n };\r\n /**\r\n * Returns a promise which resolves to the OIDC endpoint\r\n * Only responds with the endpoint\r\n */\r\n Authority.prototype.GetOpenIdConfigurationEndpoint = function () {\r\n return this.DefaultOpenIdConfigurationEndpoint;\r\n };\r\n return Authority;\r\n}());\r\nexport { Authority };\r\n//# sourceMappingURL=Authority.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nexport var AuthErrorMessage = {\r\n unexpectedError: {\r\n code: \"unexpected_error\",\r\n desc: \"Unexpected error in authentication.\"\r\n },\r\n noWindowObjectError: {\r\n code: \"no_window_object\",\r\n desc: \"No window object available. Details:\"\r\n }\r\n};\r\n/**\r\n * General error class thrown by the MSAL.js library.\r\n */\r\nvar AuthError = /** @class */ (function (_super) {\r\n tslib_1.__extends(AuthError, _super);\r\n function AuthError(errorCode, errorMessage) {\r\n var _this = _super.call(this, errorMessage) || this;\r\n Object.setPrototypeOf(_this, AuthError.prototype);\r\n _this.errorCode = errorCode;\r\n _this.errorMessage = errorMessage;\r\n _this.name = \"AuthError\";\r\n return _this;\r\n }\r\n AuthError.createUnexpectedError = function (errDesc) {\r\n return new AuthError(AuthErrorMessage.unexpectedError.code, AuthErrorMessage.unexpectedError.desc + \": \" + errDesc);\r\n };\r\n AuthError.createNoWindowObjectError = function (errDesc) {\r\n return new AuthError(AuthErrorMessage.noWindowObjectError.code, AuthErrorMessage.noWindowObjectError.desc + \" \" + errDesc);\r\n };\r\n return AuthError;\r\n}(Error));\r\nexport { AuthError };\r\n//# sourceMappingURL=AuthError.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar StringUtils = /** @class */ (function () {\r\n function StringUtils() {\r\n }\r\n /**\r\n * Check if a string is empty\r\n *\r\n * @param str\r\n */\r\n StringUtils.isEmpty = function (str) {\r\n return (typeof str === \"undefined\" || !str || 0 === str.length);\r\n };\r\n /**\r\n * Check if a string's value is a valid JSON object\r\n *\r\n * @param str\r\n */\r\n StringUtils.validateAndParseJsonCacheKey = function (str) {\r\n try {\r\n var parsedKey = JSON.parse(str);\r\n /**\r\n * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object\r\n * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check\r\n * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.\r\n *\r\n */\r\n return (parsedKey && typeof parsedKey === \"object\") ? parsedKey : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n };\r\n return StringUtils;\r\n}());\r\nexport { StringUtils };\r\n//# sourceMappingURL=StringUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { AuthError } from \"./AuthError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nexport var ClientAuthErrorMessage = {\r\n endpointResolutionError: {\r\n code: \"endpoints_resolution_error\",\r\n desc: \"Error: could not resolve endpoints. Please check network and try again.\"\r\n },\r\n popUpWindowError: {\r\n code: \"popup_window_error\",\r\n desc: \"Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser.\"\r\n },\r\n tokenRenewalError: {\r\n code: \"token_renewal_error\",\r\n desc: \"Token renewal operation failed due to timeout.\"\r\n },\r\n invalidIdToken: {\r\n code: \"invalid_id_token\",\r\n desc: \"Invalid ID token format.\"\r\n },\r\n invalidStateError: {\r\n code: \"invalid_state_error\",\r\n desc: \"Invalid state.\"\r\n },\r\n nonceMismatchError: {\r\n code: \"nonce_mismatch_error\",\r\n desc: \"Nonce is not matching, Nonce received: \"\r\n },\r\n loginProgressError: {\r\n code: \"login_progress_error\",\r\n desc: \"Login_In_Progress: Error during login call - login is already in progress.\"\r\n },\r\n acquireTokenProgressError: {\r\n code: \"acquiretoken_progress_error\",\r\n desc: \"AcquireToken_In_Progress: Error during login call - login is already in progress.\"\r\n },\r\n userCancelledError: {\r\n code: \"user_cancelled\",\r\n desc: \"User cancelled the flow.\"\r\n },\r\n callbackError: {\r\n code: \"callback_error\",\r\n desc: \"Error occurred in token received callback function.\"\r\n },\r\n userLoginRequiredError: {\r\n code: \"user_login_error\",\r\n desc: \"User login is required. For silent calls, request must contain either sid or login_hint\"\r\n },\r\n userDoesNotExistError: {\r\n code: \"user_non_existent\",\r\n desc: \"User object does not exist. Please call a login API.\"\r\n },\r\n clientInfoDecodingError: {\r\n code: \"client_info_decoding_error\",\r\n desc: \"The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause.\"\r\n },\r\n clientInfoNotPopulatedError: {\r\n code: \"client_info_not_populated_error\",\r\n desc: \"The service did not populate client_info in the response, Please verify with the service team\"\r\n },\r\n nullOrEmptyIdToken: {\r\n code: \"null_or_empty_id_token\",\r\n desc: \"The idToken is null or empty. Please review the trace to determine the root cause.\"\r\n },\r\n idTokenNotParsed: {\r\n code: \"id_token_parsing_error\",\r\n desc: \"ID token cannot be parsed. Please review stack trace to determine root cause.\"\r\n },\r\n tokenEncodingError: {\r\n code: \"token_encoding_error\",\r\n desc: \"The token to be decoded is not encoded correctly.\"\r\n },\r\n invalidInteractionType: {\r\n code: \"invalid_interaction_type\",\r\n desc: \"The interaction type passed to the handler was incorrect or unknown\"\r\n },\r\n cacheParseError: {\r\n code: \"cannot_parse_cache\",\r\n desc: \"The cached token key is not a valid JSON and cannot be parsed\"\r\n },\r\n blockTokenRequestsInHiddenIframe: {\r\n code: \"block_token_requests\",\r\n desc: \"Token calls are blocked in hidden iframes\"\r\n }\r\n};\r\n/**\r\n * Error thrown when there is an error in the client code running on the browser.\r\n */\r\nvar ClientAuthError = /** @class */ (function (_super) {\r\n tslib_1.__extends(ClientAuthError, _super);\r\n function ClientAuthError(errorCode, errorMessage) {\r\n var _this = _super.call(this, errorCode, errorMessage) || this;\r\n _this.name = \"ClientAuthError\";\r\n Object.setPrototypeOf(_this, ClientAuthError.prototype);\r\n return _this;\r\n }\r\n ClientAuthError.createEndpointResolutionError = function (errDetail) {\r\n var errorMessage = ClientAuthErrorMessage.endpointResolutionError.desc;\r\n if (errDetail && !StringUtils.isEmpty(errDetail)) {\r\n errorMessage += \" Details: \" + errDetail;\r\n }\r\n return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code, errorMessage);\r\n };\r\n ClientAuthError.createPopupWindowError = function (errDetail) {\r\n var errorMessage = ClientAuthErrorMessage.popUpWindowError.desc;\r\n if (errDetail && !StringUtils.isEmpty(errDetail)) {\r\n errorMessage += \" Details: \" + errDetail;\r\n }\r\n return new ClientAuthError(ClientAuthErrorMessage.popUpWindowError.code, errorMessage);\r\n };\r\n ClientAuthError.createTokenRenewalTimeoutError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.tokenRenewalError.code, ClientAuthErrorMessage.tokenRenewalError.desc);\r\n };\r\n ClientAuthError.createInvalidIdTokenError = function (idToken) {\r\n return new ClientAuthError(ClientAuthErrorMessage.invalidIdToken.code, ClientAuthErrorMessage.invalidIdToken.desc + \" Given token: \" + idToken);\r\n };\r\n // TODO: Is this not a security flaw to send the user the state expected??\r\n ClientAuthError.createInvalidStateError = function (invalidState, actualState) {\r\n return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code, ClientAuthErrorMessage.invalidStateError.desc + \" \" + invalidState + \", state expected : \" + actualState + \".\");\r\n };\r\n // TODO: Is this not a security flaw to send the user the Nonce expected??\r\n ClientAuthError.createNonceMismatchError = function (invalidNonce, actualNonce) {\r\n return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code, ClientAuthErrorMessage.nonceMismatchError.desc + \" \" + invalidNonce + \", nonce expected : \" + actualNonce + \".\");\r\n };\r\n ClientAuthError.createLoginInProgressError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.loginProgressError.code, ClientAuthErrorMessage.loginProgressError.desc);\r\n };\r\n ClientAuthError.createAcquireTokenInProgressError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.acquireTokenProgressError.code, ClientAuthErrorMessage.acquireTokenProgressError.desc);\r\n };\r\n ClientAuthError.createUserCancelledError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.userCancelledError.code, ClientAuthErrorMessage.userCancelledError.desc);\r\n };\r\n ClientAuthError.createErrorInCallbackFunction = function (errorDesc) {\r\n return new ClientAuthError(ClientAuthErrorMessage.callbackError.code, ClientAuthErrorMessage.callbackError.desc + \" \" + errorDesc + \".\");\r\n };\r\n ClientAuthError.createUserLoginRequiredError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.userLoginRequiredError.code, ClientAuthErrorMessage.userLoginRequiredError.desc);\r\n };\r\n ClientAuthError.createUserDoesNotExistError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.userDoesNotExistError.code, ClientAuthErrorMessage.userDoesNotExistError.desc);\r\n };\r\n ClientAuthError.createClientInfoDecodingError = function (caughtError) {\r\n return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code, ClientAuthErrorMessage.clientInfoDecodingError.desc + \" Failed with error: \" + caughtError);\r\n };\r\n ClientAuthError.createClientInfoNotPopulatedError = function (caughtError) {\r\n return new ClientAuthError(ClientAuthErrorMessage.clientInfoNotPopulatedError.code, ClientAuthErrorMessage.clientInfoNotPopulatedError.desc + \" Failed with error: \" + caughtError);\r\n };\r\n ClientAuthError.createIdTokenNullOrEmptyError = function (invalidRawTokenString) {\r\n return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyIdToken.code, ClientAuthErrorMessage.nullOrEmptyIdToken.desc + \" Raw ID Token Value: \" + invalidRawTokenString);\r\n };\r\n ClientAuthError.createIdTokenParsingError = function (caughtParsingError) {\r\n return new ClientAuthError(ClientAuthErrorMessage.idTokenNotParsed.code, ClientAuthErrorMessage.idTokenNotParsed.desc + \" Failed with error: \" + caughtParsingError);\r\n };\r\n ClientAuthError.createTokenEncodingError = function (incorrectlyEncodedToken) {\r\n return new ClientAuthError(ClientAuthErrorMessage.tokenEncodingError.code, ClientAuthErrorMessage.tokenEncodingError.desc + \" Attempted to decode: \" + incorrectlyEncodedToken);\r\n };\r\n ClientAuthError.createInvalidInteractionTypeError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.invalidInteractionType.code, ClientAuthErrorMessage.invalidInteractionType.desc);\r\n };\r\n ClientAuthError.createCacheParseError = function (key) {\r\n var errorMessage = \"invalid key: \" + key + \", \" + ClientAuthErrorMessage.cacheParseError.desc;\r\n return new ClientAuthError(ClientAuthErrorMessage.cacheParseError.code, errorMessage);\r\n };\r\n ClientAuthError.createBlockTokenRequestsInHiddenIframeError = function () {\r\n return new ClientAuthError(ClientAuthErrorMessage.blockTokenRequestsInHiddenIframe.code, ClientAuthErrorMessage.blockTokenRequestsInHiddenIframe.desc);\r\n };\r\n return ClientAuthError;\r\n}(AuthError));\r\nexport { ClientAuthError };\r\n//# sourceMappingURL=ClientAuthError.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { ClientAuthError } from \"./ClientAuthError\";\r\nexport var ClientConfigurationErrorMessage = {\r\n configurationNotSet: {\r\n code: \"no_config_set\",\r\n desc: \"Configuration has not been set. Please call the UserAgentApplication constructor with a valid Configuration object.\"\r\n },\r\n storageNotSupported: {\r\n code: \"storage_not_supported\",\r\n desc: \"The value for the cacheLocation is not supported.\"\r\n },\r\n noRedirectCallbacksSet: {\r\n code: \"no_redirect_callbacks\",\r\n desc: \"No redirect callbacks have been set. Please call handleRedirectCallback() with the appropriate function arguments before continuing. \" +\r\n \"More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics.\"\r\n },\r\n invalidCallbackObject: {\r\n code: \"invalid_callback_object\",\r\n desc: \"The object passed for the callback was invalid. \" +\r\n \"More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics.\"\r\n },\r\n scopesRequired: {\r\n code: \"scopes_required\",\r\n desc: \"Scopes are required to obtain an access token.\"\r\n },\r\n emptyScopes: {\r\n code: \"empty_input_scopes_error\",\r\n desc: \"Scopes cannot be passed as empty array.\"\r\n },\r\n nonArrayScopes: {\r\n code: \"nonarray_input_scopes_error\",\r\n desc: \"Scopes cannot be passed as non-array.\"\r\n },\r\n invalidPrompt: {\r\n code: \"invalid_prompt_value\",\r\n desc: \"Supported prompt values are 'login', 'select_account', 'consent' and 'none'\",\r\n },\r\n invalidAuthorityType: {\r\n code: \"invalid_authority_type\",\r\n desc: \"The given authority is not a valid type of authority supported by MSAL. Please see here for valid authorities: .\"\r\n },\r\n authorityUriInsecure: {\r\n code: \"authority_uri_insecure\",\r\n desc: \"Authority URIs must use https.\"\r\n },\r\n authorityUriInvalidPath: {\r\n code: \"authority_uri_invalid_path\",\r\n desc: \"Given authority URI is invalid.\"\r\n },\r\n unsupportedAuthorityValidation: {\r\n code: \"unsupported_authority_validation\",\r\n desc: \"The authority validation is not supported for this authority type.\"\r\n },\r\n untrustedAuthority: {\r\n code: \"untrusted_authority\",\r\n desc: \"The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter or set validateAuthority=false.\"\r\n },\r\n b2cAuthorityUriInvalidPath: {\r\n code: \"b2c_authority_uri_invalid_path\",\r\n desc: \"The given URI for the B2C authority is invalid.\"\r\n },\r\n b2cKnownAuthoritiesNotSet: {\r\n code: \"b2c_known_authorities_not_set\",\r\n desc: \"Must set known authorities when validateAuthority is set to True and using B2C\"\r\n },\r\n claimsRequestParsingError: {\r\n code: \"claims_request_parsing_error\",\r\n desc: \"Could not parse the given claims request object.\"\r\n },\r\n emptyRequestError: {\r\n code: \"empty_request_error\",\r\n desc: \"Request object is required.\"\r\n },\r\n invalidCorrelationIdError: {\r\n code: \"invalid_guid_sent_as_correlationId\",\r\n desc: \"Please set the correlationId as a valid guid\"\r\n },\r\n telemetryConfigError: {\r\n code: \"telemetry_config_error\",\r\n desc: \"Telemetry config is not configured with required values\"\r\n },\r\n ssoSilentError: {\r\n code: \"sso_silent_error\",\r\n desc: \"request must contain either sid or login_hint\"\r\n },\r\n invalidAuthorityMetadataError: {\r\n code: \"authority_metadata_error\",\r\n desc: \"Invalid authorityMetadata. Must be a JSON object containing authorization_endpoint, end_session_endpoint, and issuer fields.\"\r\n }\r\n};\r\n/**\r\n * Error thrown when there is an error in configuration of the .js library.\r\n */\r\nvar ClientConfigurationError = /** @class */ (function (_super) {\r\n tslib_1.__extends(ClientConfigurationError, _super);\r\n function ClientConfigurationError(errorCode, errorMessage) {\r\n var _this = _super.call(this, errorCode, errorMessage) || this;\r\n _this.name = \"ClientConfigurationError\";\r\n Object.setPrototypeOf(_this, ClientConfigurationError.prototype);\r\n return _this;\r\n }\r\n ClientConfigurationError.createNoSetConfigurationError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.configurationNotSet.code, \"\" + ClientConfigurationErrorMessage.configurationNotSet.desc);\r\n };\r\n ClientConfigurationError.createStorageNotSupportedError = function (givenCacheLocation) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.storageNotSupported.code, ClientConfigurationErrorMessage.storageNotSupported.desc + \" Given location: \" + givenCacheLocation);\r\n };\r\n ClientConfigurationError.createRedirectCallbacksNotSetError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.noRedirectCallbacksSet.code, ClientConfigurationErrorMessage.noRedirectCallbacksSet.desc);\r\n };\r\n ClientConfigurationError.createInvalidCallbackObjectError = function (callbackObject) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCallbackObject.code, ClientConfigurationErrorMessage.invalidCallbackObject.desc + \" Given value for callback function: \" + callbackObject);\r\n };\r\n ClientConfigurationError.createEmptyScopesArrayError = function (scopesValue) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopes.code, ClientConfigurationErrorMessage.emptyScopes.desc + \" Given value: \" + scopesValue + \".\");\r\n };\r\n ClientConfigurationError.createScopesNonArrayError = function (scopesValue) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.nonArrayScopes.code, ClientConfigurationErrorMessage.nonArrayScopes.desc + \" Given value: \" + scopesValue + \".\");\r\n };\r\n ClientConfigurationError.createScopesRequiredError = function (scopesValue) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.scopesRequired.code, ClientConfigurationErrorMessage.scopesRequired.desc + \" Given value: \" + scopesValue);\r\n };\r\n ClientConfigurationError.createInvalidPromptError = function (promptValue) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code, ClientConfigurationErrorMessage.invalidPrompt.desc + \" Given value: \" + promptValue);\r\n };\r\n ClientConfigurationError.createClaimsRequestParsingError = function (claimsRequestParseError) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code, ClientConfigurationErrorMessage.claimsRequestParsingError.desc + \" Given value: \" + claimsRequestParseError);\r\n };\r\n ClientConfigurationError.createEmptyRequestError = function () {\r\n var _a = ClientConfigurationErrorMessage.emptyRequestError, code = _a.code, desc = _a.desc;\r\n return new ClientConfigurationError(code, desc);\r\n };\r\n ClientConfigurationError.createInvalidCorrelationIdError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCorrelationIdError.code, ClientConfigurationErrorMessage.invalidCorrelationIdError.desc);\r\n };\r\n ClientConfigurationError.createKnownAuthoritiesNotSetError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.b2cKnownAuthoritiesNotSet.code, ClientConfigurationErrorMessage.b2cKnownAuthoritiesNotSet.desc);\r\n };\r\n ClientConfigurationError.createInvalidAuthorityTypeError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityType.code, ClientConfigurationErrorMessage.invalidAuthorityType.desc);\r\n };\r\n ClientConfigurationError.createUntrustedAuthorityError = function (host) {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code, ClientConfigurationErrorMessage.untrustedAuthority.desc + \" Provided Authority: \" + host);\r\n };\r\n ClientConfigurationError.createTelemetryConfigError = function (config) {\r\n var _a = ClientConfigurationErrorMessage.telemetryConfigError, code = _a.code, desc = _a.desc;\r\n var requiredKeys = {\r\n applicationName: \"string\",\r\n applicationVersion: \"string\",\r\n telemetryEmitter: \"function\"\r\n };\r\n var missingKeys = Object.keys(requiredKeys)\r\n .reduce(function (keys, key) {\r\n return config[key] ? keys : keys.concat([key + \" (\" + requiredKeys[key] + \")\"]);\r\n }, []);\r\n return new ClientConfigurationError(code, desc + \" mising values: \" + missingKeys.join(\",\"));\r\n };\r\n ClientConfigurationError.createSsoSilentError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.ssoSilentError.code, ClientConfigurationErrorMessage.ssoSilentError.desc);\r\n };\r\n ClientConfigurationError.createInvalidAuthorityMetadataError = function () {\r\n return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadataError.code, ClientConfigurationErrorMessage.invalidAuthorityMetadataError.desc);\r\n };\r\n return ClientConfigurationError;\r\n}(ClientAuthError));\r\nexport { ClientConfigurationError };\r\n//# sourceMappingURL=ClientConfigurationError.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { ClientConfigurationError } from \"./error/ClientConfigurationError\";\r\nimport { Constants } from \"./utils/Constants\";\r\nvar ScopeSet = /** @class */ (function () {\r\n function ScopeSet() {\r\n }\r\n /**\r\n * Check if there are dup scopes in a given request\r\n *\r\n * @param cachedScopes\r\n * @param scopes\r\n */\r\n // TODO: Rename this, intersecting scopes isn't a great name for duplicate checker\r\n ScopeSet.isIntersectingScopes = function (cachedScopes, scopes) {\r\n var convertedCachedScopes = this.trimAndConvertArrayToLowerCase(cachedScopes.slice());\r\n var requestScopes = this.trimAndConvertArrayToLowerCase(scopes.slice());\r\n for (var i = 0; i < requestScopes.length; i++) {\r\n if (convertedCachedScopes.indexOf(requestScopes[i].toLowerCase()) > -1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n /**\r\n * Check if a given scope is present in the request\r\n *\r\n * @param cachedScopes\r\n * @param scopes\r\n */\r\n ScopeSet.containsScope = function (cachedScopes, scopes) {\r\n var convertedCachedScopes = this.trimAndConvertArrayToLowerCase(cachedScopes.slice());\r\n var requestScopes = this.trimAndConvertArrayToLowerCase(scopes.slice());\r\n return requestScopes.every(function (value) { return convertedCachedScopes.indexOf(value.toString().toLowerCase()) >= 0; });\r\n };\r\n /**\r\n * Trims and converts string to lower case\r\n *\r\n * @param scopes\r\n */\r\n // TODO: Rename this, too generic name for a function that only deals with scopes\r\n ScopeSet.trimAndConvertToLowerCase = function (scope) {\r\n return scope.trim().toLowerCase();\r\n };\r\n /**\r\n * Performs trimAndConvertToLowerCase on string array\r\n * @param scopes\r\n */\r\n ScopeSet.trimAndConvertArrayToLowerCase = function (scopes) {\r\n var _this = this;\r\n return scopes.map(function (scope) { return _this.trimAndConvertToLowerCase(scope); });\r\n };\r\n /**\r\n * Trims each scope in scopes array\r\n * @param scopes\r\n */\r\n ScopeSet.trimScopes = function (scopes) {\r\n return scopes.map(function (scope) { return scope.trim(); });\r\n };\r\n /**\r\n * Remove one element from a scope array\r\n *\r\n * @param scopes\r\n * @param scope\r\n */\r\n // TODO: Rename this, too generic name for a function that only deals with scopes\r\n ScopeSet.removeElement = function (scopes, scope) {\r\n var scopeVal = this.trimAndConvertToLowerCase(scope);\r\n return scopes.filter(function (value) { return value !== scopeVal; });\r\n };\r\n /**\r\n * Parse the scopes into a formatted scopeList\r\n * @param scopes\r\n */\r\n ScopeSet.parseScope = function (scopes) {\r\n var scopeList = \"\";\r\n if (scopes) {\r\n for (var i = 0; i < scopes.length; ++i) {\r\n scopeList += (i !== scopes.length - 1) ? scopes[i] + \" \" : scopes[i];\r\n }\r\n }\r\n return scopeList;\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Used to validate the scopes input parameter requested by the developer.\r\n * @param {Array} scopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.\r\n * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not\r\n * @ignore\r\n */\r\n ScopeSet.validateInputScope = function (scopes, scopesRequired) {\r\n if (!scopes) {\r\n if (scopesRequired) {\r\n throw ClientConfigurationError.createScopesRequiredError(scopes);\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n // Check that scopes is an array object (also throws error if scopes == null)\r\n if (!Array.isArray(scopes)) {\r\n throw ClientConfigurationError.createScopesNonArrayError(scopes);\r\n }\r\n // Check that scopes is not an empty array\r\n if (scopes.length < 1 && scopesRequired) {\r\n throw ClientConfigurationError.createEmptyScopesArrayError(scopes.toString());\r\n }\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Extracts scope value from the state sent with the authentication request.\r\n * @param {string} state\r\n * @returns {string} scope.\r\n * @ignore\r\n */\r\n ScopeSet.getScopeFromState = function (state) {\r\n if (state) {\r\n var splitIndex = state.indexOf(Constants.resourceDelimiter);\r\n if (splitIndex > -1 && splitIndex + 1 < state.length) {\r\n return state.substring(splitIndex + 1);\r\n }\r\n }\r\n return \"\";\r\n };\r\n /**\r\n * @ignore\r\n * Appends extraScopesToConsent if passed\r\n * @param {@link AuthenticationParameters}\r\n */\r\n ScopeSet.appendScopes = function (reqScopes, reqExtraScopesToConsent) {\r\n if (reqScopes) {\r\n var convertedExtraScopes = reqExtraScopesToConsent ? this.trimAndConvertArrayToLowerCase(reqExtraScopesToConsent.slice()) : null;\r\n var convertedReqScopes = this.trimAndConvertArrayToLowerCase(reqScopes.slice());\r\n return convertedExtraScopes ? convertedReqScopes.concat(convertedExtraScopes) : convertedReqScopes;\r\n }\r\n return null;\r\n };\r\n // #endregion\r\n /**\r\n * @ignore\r\n * Returns true if the scopes array only contains openid and/or profile\r\n */\r\n ScopeSet.onlyContainsOidcScopes = function (scopes) {\r\n var scopesCount = scopes.length;\r\n var oidcScopesFound = 0;\r\n if (scopes.indexOf(Constants.openidScope) > -1) {\r\n oidcScopesFound += 1;\r\n }\r\n if (scopes.indexOf(Constants.profileScope) > -1) {\r\n oidcScopesFound += 1;\r\n }\r\n return (scopesCount > 0 && scopesCount === oidcScopesFound);\r\n };\r\n /**\r\n * @ignore\r\n * Returns true if the scopes array only contains openid and/or profile\r\n */\r\n ScopeSet.containsAnyOidcScopes = function (scopes) {\r\n var containsOpenIdScope = scopes.indexOf(Constants.openidScope) > -1;\r\n var containsProfileScope = scopes.indexOf(Constants.profileScope) > -1;\r\n return (containsOpenIdScope || containsProfileScope);\r\n };\r\n /**\r\n * @ignore\r\n * Returns true if the clientId is the only scope in the array\r\n */\r\n ScopeSet.onlyContainsClientId = function (scopes, clientId) {\r\n // Double negation to force false value returned in case scopes is null\r\n return !!scopes && (scopes.indexOf(clientId) > -1 && scopes.length === 1);\r\n };\r\n /**\r\n * @ignore\r\n * Adds missing OIDC scopes to scopes array without duplication. Since STS requires OIDC scopes for\r\n * all implicit flow requests, 'openid' and 'profile' should always be included in the final request\r\n */\r\n ScopeSet.appendDefaultScopes = function (scopes) {\r\n var extendedScopes = scopes;\r\n if (extendedScopes.indexOf(Constants.openidScope) === -1) {\r\n extendedScopes.push(Constants.openidScope);\r\n }\r\n if (extendedScopes.indexOf(Constants.profileScope) === -1) {\r\n extendedScopes.push(Constants.profileScope);\r\n }\r\n return extendedScopes;\r\n };\r\n /**\r\n * @ignore\r\n * Removes present OIDC scopes from scopes array.\r\n */\r\n ScopeSet.removeDefaultScopes = function (scopes) {\r\n return scopes.filter(function (scope) {\r\n return (scope !== Constants.openidScope && scope !== Constants.profileScope);\r\n });\r\n };\r\n /**\r\n * @ignore\r\n * Removes clientId from scopes array if included as only scope. If it's not the only scope, it is treated as a resource scope.\r\n * @param scopes Array: Pre-normalized scopes array\r\n * @param clientId string: The application's clientId that is searched for in the scopes array\r\n */\r\n ScopeSet.translateClientIdIfSingleScope = function (scopes, clientId) {\r\n return this.onlyContainsClientId(scopes, clientId) ? Constants.oidcScopes : scopes;\r\n };\r\n return ScopeSet;\r\n}());\r\nexport { ScopeSet };\r\n//# sourceMappingURL=ScopeSet.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { Constants, SSOTypes, ServerHashParamKeys } from \"./Constants\";\r\nimport { ScopeSet } from \"../ScopeSet\";\r\nimport { StringUtils } from \"./StringUtils\";\r\nimport { CryptoUtils } from \"./CryptoUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar UrlUtils = /** @class */ (function () {\r\n function UrlUtils() {\r\n }\r\n /**\r\n * generates the URL with QueryString Parameters\r\n * @param scopes\r\n */\r\n UrlUtils.createNavigateUrl = function (serverRequestParams) {\r\n var str = this.createNavigationUrlString(serverRequestParams);\r\n var authEndpoint = serverRequestParams.authorityInstance.AuthorizationEndpoint;\r\n // if the endpoint already has queryparams, lets add to it, otherwise add the first one\r\n if (authEndpoint.indexOf(\"?\") < 0) {\r\n authEndpoint += \"?\";\r\n }\r\n else {\r\n authEndpoint += \"&\";\r\n }\r\n var requestUrl = \"\" + authEndpoint + str.join(\"&\");\r\n return requestUrl;\r\n };\r\n /**\r\n * Generate the array of all QueryStringParams to be sent to the server\r\n * @param scopes\r\n */\r\n UrlUtils.createNavigationUrlString = function (serverRequestParams) {\r\n var scopes = ScopeSet.appendDefaultScopes(serverRequestParams.scopes);\r\n var str = [];\r\n str.push(\"response_type=\" + serverRequestParams.responseType);\r\n str.push(\"scope=\" + encodeURIComponent(ScopeSet.parseScope(scopes)));\r\n str.push(\"client_id=\" + encodeURIComponent(serverRequestParams.clientId));\r\n str.push(\"redirect_uri=\" + encodeURIComponent(serverRequestParams.redirectUri));\r\n str.push(\"state=\" + encodeURIComponent(serverRequestParams.state));\r\n str.push(\"nonce=\" + encodeURIComponent(serverRequestParams.nonce));\r\n str.push(\"client_info=1\");\r\n str.push(\"x-client-SKU=\" + serverRequestParams.xClientSku);\r\n str.push(\"x-client-Ver=\" + serverRequestParams.xClientVer);\r\n if (serverRequestParams.promptValue) {\r\n str.push(\"prompt=\" + encodeURIComponent(serverRequestParams.promptValue));\r\n }\r\n if (serverRequestParams.claimsValue) {\r\n str.push(\"claims=\" + encodeURIComponent(serverRequestParams.claimsValue));\r\n }\r\n if (serverRequestParams.queryParameters) {\r\n str.push(serverRequestParams.queryParameters);\r\n }\r\n if (serverRequestParams.extraQueryParameters) {\r\n str.push(serverRequestParams.extraQueryParameters);\r\n }\r\n str.push(\"client-request-id=\" + encodeURIComponent(serverRequestParams.correlationId));\r\n return str;\r\n };\r\n /**\r\n * Returns current window URL as redirect uri\r\n */\r\n UrlUtils.getCurrentUrl = function () {\r\n return window.location.href.split(\"?\")[0].split(\"#\")[0];\r\n };\r\n /**\r\n * Returns given URL with query string removed\r\n */\r\n UrlUtils.removeHashFromUrl = function (url) {\r\n return url.split(\"#\")[0];\r\n };\r\n /**\r\n * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d\r\n * @param href The url\r\n * @param tenantId The tenant id to replace\r\n */\r\n UrlUtils.replaceTenantPath = function (url, tenantId) {\r\n var lowerCaseUrl = url.toLowerCase();\r\n var urlObject = this.GetUrlComponents(lowerCaseUrl);\r\n var pathArray = urlObject.PathSegments;\r\n if (tenantId && (pathArray.length !== 0 && (pathArray[0] === Constants.common || pathArray[0] === SSOTypes.ORGANIZATIONS || pathArray[0] === SSOTypes.CONSUMERS))) {\r\n pathArray[0] = tenantId;\r\n }\r\n return this.constructAuthorityUriFromObject(urlObject, pathArray);\r\n };\r\n UrlUtils.constructAuthorityUriFromObject = function (urlObject, pathArray) {\r\n return this.CanonicalizeUri(urlObject.Protocol + \"//\" + urlObject.HostNameAndPort + \"/\" + pathArray.join(\"/\"));\r\n };\r\n /**\r\n * Checks if an authority is common (ex. https://a:b/common/)\r\n * @param url The url\r\n * @returns true if authority is common and false otherwise\r\n */\r\n UrlUtils.isCommonAuthority = function (url) {\r\n var authority = this.CanonicalizeUri(url);\r\n var pathArray = this.GetUrlComponents(authority).PathSegments;\r\n return (pathArray.length !== 0 && pathArray[0] === Constants.common);\r\n };\r\n /**\r\n * Checks if an authority is for organizations (ex. https://a:b/organizations/)\r\n * @param url The url\r\n * @returns true if authority is for and false otherwise\r\n */\r\n UrlUtils.isOrganizationsAuthority = function (url) {\r\n var authority = this.CanonicalizeUri(url);\r\n var pathArray = this.GetUrlComponents(authority).PathSegments;\r\n return (pathArray.length !== 0 && pathArray[0] === SSOTypes.ORGANIZATIONS);\r\n };\r\n /**\r\n * Checks if an authority is for consumers (ex. https://a:b/consumers/)\r\n * @param url The url\r\n * @returns true if authority is for and false otherwise\r\n */\r\n UrlUtils.isConsumersAuthority = function (url) {\r\n var authority = this.CanonicalizeUri(url);\r\n var pathArray = this.GetUrlComponents(authority).PathSegments;\r\n return (pathArray.length !== 0 && pathArray[0] === SSOTypes.CONSUMERS);\r\n };\r\n /**\r\n * Parses out the components from a url string.\r\n * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.\r\n */\r\n UrlUtils.GetUrlComponents = function (url) {\r\n if (!url) {\r\n throw \"Url required\";\r\n }\r\n // https://gist.github.com/curtisz/11139b2cfcaef4a261e0\r\n var regEx = RegExp(\"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\\\?([^#]*))?(#(.*))?\");\r\n var match = url.match(regEx);\r\n if (!match || match.length < 6) {\r\n throw \"Valid url required\";\r\n }\r\n var urlComponents = {\r\n Protocol: match[1],\r\n HostNameAndPort: match[4],\r\n AbsolutePath: match[5]\r\n };\r\n var pathSegments = urlComponents.AbsolutePath.split(\"/\");\r\n pathSegments = pathSegments.filter(function (val) { return val && val.length > 0; }); // remove empty elements\r\n urlComponents.PathSegments = pathSegments;\r\n if (match[6]) {\r\n urlComponents.Search = match[6];\r\n }\r\n if (match[8]) {\r\n urlComponents.Hash = match[8];\r\n }\r\n return urlComponents;\r\n };\r\n /**\r\n * Given a url or path, append a trailing slash if one doesnt exist\r\n *\r\n * @param url\r\n */\r\n UrlUtils.CanonicalizeUri = function (url) {\r\n if (url) {\r\n url = url.toLowerCase();\r\n }\r\n if (url && !UrlUtils.endsWith(url, \"/\")) {\r\n url += \"/\";\r\n }\r\n return url;\r\n };\r\n /**\r\n * Checks to see if the url ends with the suffix\r\n * Required because we are compiling for es5 instead of es6\r\n * @param url\r\n * @param str\r\n */\r\n // TODO: Rename this, not clear what it is supposed to do\r\n UrlUtils.endsWith = function (url, suffix) {\r\n if (!url || !suffix) {\r\n return false;\r\n }\r\n return url.indexOf(suffix, url.length - suffix.length) !== -1;\r\n };\r\n /**\r\n * Utils function to remove the login_hint and domain_hint from the i/p extraQueryParameters\r\n * @param url\r\n * @param name\r\n */\r\n UrlUtils.urlRemoveQueryStringParameter = function (url, name) {\r\n if (StringUtils.isEmpty(url)) {\r\n return url;\r\n }\r\n var regex = new RegExp(\"(\\\\&\" + name + \"=)[^\\&]+\");\r\n url = url.replace(regex, \"\");\r\n // name=value&\r\n regex = new RegExp(\"(\" + name + \"=)[^\\&]+&\");\r\n url = url.replace(regex, \"\");\r\n // name=value\r\n regex = new RegExp(\"(\" + name + \"=)[^\\&]+\");\r\n url = url.replace(regex, \"\");\r\n return url;\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * Returns the anchor part(#) of the URL\r\n */\r\n UrlUtils.getHashFromUrl = function (urlStringOrFragment) {\r\n var hashIndex1 = urlStringOrFragment.indexOf(\"#\");\r\n var hashIndex2 = urlStringOrFragment.indexOf(\"#/\");\r\n if (hashIndex2 > -1) {\r\n return urlStringOrFragment.substring(hashIndex2 + 2);\r\n }\r\n else if (hashIndex1 > -1) {\r\n return urlStringOrFragment.substring(hashIndex1 + 1);\r\n }\r\n return urlStringOrFragment;\r\n };\r\n /**\r\n * @hidden\r\n * Check if the url contains a hash with known properties\r\n * @ignore\r\n */\r\n UrlUtils.urlContainsHash = function (urlString) {\r\n var parameters = UrlUtils.deserializeHash(urlString);\r\n return (parameters.hasOwnProperty(ServerHashParamKeys.ERROR_DESCRIPTION) ||\r\n parameters.hasOwnProperty(ServerHashParamKeys.ERROR) ||\r\n parameters.hasOwnProperty(ServerHashParamKeys.ACCESS_TOKEN) ||\r\n parameters.hasOwnProperty(ServerHashParamKeys.ID_TOKEN));\r\n };\r\n /**\r\n * @hidden\r\n * Returns deserialized portion of URL hash\r\n * @ignore\r\n */\r\n UrlUtils.deserializeHash = function (urlFragment) {\r\n var hash = UrlUtils.getHashFromUrl(urlFragment);\r\n return CryptoUtils.deserialize(hash);\r\n };\r\n /**\r\n * @ignore\r\n * @param {string} URI\r\n * @returns {string} host from the URI\r\n *\r\n * extract URI from the host\r\n */\r\n UrlUtils.getHostFromUri = function (uri) {\r\n // remove http:// or https:// from uri\r\n var extractedUri = String(uri).replace(/^(https?:)\\/\\//, \"\");\r\n extractedUri = extractedUri.split(\"/\")[0];\r\n return extractedUri;\r\n };\r\n return UrlUtils;\r\n}());\r\nexport { UrlUtils };\r\n//# sourceMappingURL=UrlUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { CryptoUtils } from \"../utils/CryptoUtils\";\r\nimport { UrlUtils } from \"../utils/UrlUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar AccessTokenKey = /** @class */ (function () {\r\n function AccessTokenKey(authority, clientId, scopes, uid, utid) {\r\n this.authority = UrlUtils.CanonicalizeUri(authority);\r\n this.clientId = clientId;\r\n this.scopes = scopes;\r\n this.homeAccountIdentifier = CryptoUtils.base64Encode(uid) + \".\" + CryptoUtils.base64Encode(utid);\r\n }\r\n return AccessTokenKey;\r\n}());\r\nexport { AccessTokenKey };\r\n//# sourceMappingURL=AccessTokenKey.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar AccessTokenValue = /** @class */ (function () {\r\n function AccessTokenValue(accessToken, idToken, expiresIn, homeAccountIdentifier) {\r\n this.accessToken = accessToken;\r\n this.idToken = idToken;\r\n this.expiresIn = expiresIn;\r\n this.homeAccountIdentifier = homeAccountIdentifier;\r\n }\r\n return AccessTokenValue;\r\n}());\r\nexport { AccessTokenValue };\r\n//# sourceMappingURL=AccessTokenValue.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { CryptoUtils } from \"./utils/CryptoUtils\";\r\nimport { SSOTypes, Constants, PromptState, ResponseTypes } from \"./utils/Constants\";\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\nimport { ScopeSet } from \"./ScopeSet\";\r\nimport { version as libraryVersion } from \"./packageMetadata\";\r\n/**\r\n * Nonce: OIDC Nonce definition: https://openid.net/specs/openid-connect-core-1_0.html#IDToken\r\n * State: OAuth Spec: https://tools.ietf.org/html/rfc6749#section-10.12\r\n * @hidden\r\n */\r\nvar ServerRequestParameters = /** @class */ (function () {\r\n /**\r\n * Constructor\r\n * @param authority\r\n * @param clientId\r\n * @param scope\r\n * @param responseType\r\n * @param redirectUri\r\n * @param state\r\n */\r\n function ServerRequestParameters(authority, clientId, responseType, redirectUri, scopes, state, correlationId) {\r\n this.authorityInstance = authority;\r\n this.clientId = clientId;\r\n this.nonce = CryptoUtils.createNewGuid();\r\n // set scope to clientId if null\r\n this.scopes = scopes ? scopes.slice() : Constants.oidcScopes;\r\n this.scopes = ScopeSet.trimScopes(this.scopes);\r\n // set state (already set at top level)\r\n this.state = state;\r\n // set correlationId\r\n this.correlationId = correlationId;\r\n // telemetry information\r\n this.xClientSku = \"MSAL.JS\";\r\n this.xClientVer = libraryVersion;\r\n this.responseType = responseType;\r\n this.redirectUri = redirectUri;\r\n }\r\n Object.defineProperty(ServerRequestParameters.prototype, \"authority\", {\r\n get: function () {\r\n return this.authorityInstance ? this.authorityInstance.CanonicalAuthority : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * Utility to populate QueryParameters and ExtraQueryParameters to ServerRequestParamerers\r\n * @param request\r\n * @param serverAuthenticationRequest\r\n */\r\n ServerRequestParameters.prototype.populateQueryParams = function (account, request, adalIdTokenObject, silentCall) {\r\n var queryParameters = {};\r\n if (request) {\r\n // add the prompt parameter to serverRequestParameters if passed\r\n if (request.prompt) {\r\n this.promptValue = request.prompt;\r\n }\r\n // Add claims challenge to serverRequestParameters if passed\r\n if (request.claimsRequest) {\r\n this.claimsValue = request.claimsRequest;\r\n }\r\n // if the developer provides one of these, give preference to developer choice\r\n if (ServerRequestParameters.isSSOParam(request)) {\r\n queryParameters = this.constructUnifiedCacheQueryParameter(request, null);\r\n }\r\n }\r\n if (adalIdTokenObject) {\r\n queryParameters = this.constructUnifiedCacheQueryParameter(null, adalIdTokenObject);\r\n }\r\n /*\r\n * adds sid/login_hint if not populated\r\n * this.logger.verbose(\"Calling addHint parameters\");\r\n */\r\n queryParameters = this.addHintParameters(account, queryParameters);\r\n // sanity check for developer passed extraQueryParameters\r\n var eQParams = request ? request.extraQueryParameters : null;\r\n // Populate the extraQueryParameters to be sent to the server\r\n this.queryParameters = ServerRequestParameters.generateQueryParametersString(queryParameters);\r\n this.extraQueryParameters = ServerRequestParameters.generateQueryParametersString(eQParams, silentCall);\r\n };\r\n // #region QueryParam helpers\r\n /**\r\n * Constructs extraQueryParameters to be sent to the server for the AuthenticationParameters set by the developer\r\n * in any login() or acquireToken() calls\r\n * @param idTokenObject\r\n * @param extraQueryParameters\r\n * @param sid\r\n * @param loginHint\r\n */\r\n // TODO: check how this behaves when domain_hint only is sent in extraparameters and idToken has no upn.\r\n ServerRequestParameters.prototype.constructUnifiedCacheQueryParameter = function (request, idTokenObject) {\r\n // preference order: account > sid > login_hint\r\n var ssoType;\r\n var ssoData;\r\n var serverReqParam = {};\r\n // if account info is passed, account.sid > account.login_hint\r\n if (request) {\r\n if (request.account) {\r\n var account = request.account;\r\n if (account.sid) {\r\n ssoType = SSOTypes.SID;\r\n ssoData = account.sid;\r\n }\r\n else if (account.userName) {\r\n ssoType = SSOTypes.LOGIN_HINT;\r\n ssoData = account.userName;\r\n }\r\n }\r\n // sid from request\r\n else if (request.sid) {\r\n ssoType = SSOTypes.SID;\r\n ssoData = request.sid;\r\n }\r\n // loginHint from request\r\n else if (request.loginHint) {\r\n ssoType = SSOTypes.LOGIN_HINT;\r\n ssoData = request.loginHint;\r\n }\r\n }\r\n // adalIdToken retrieved from cache\r\n else if (idTokenObject) {\r\n if (idTokenObject.hasOwnProperty(Constants.upn)) {\r\n ssoType = SSOTypes.ID_TOKEN;\r\n ssoData = idTokenObject[\"upn\"];\r\n }\r\n }\r\n serverReqParam = this.addSSOParameter(ssoType, ssoData);\r\n return serverReqParam;\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Adds login_hint to authorization URL which is used to pre-fill the username field of sign in page for the user if known ahead of time\r\n * domain_hint if added skips the email based discovery process of the user - only supported for interactive calls in implicit_flow\r\n * domain_req utid received as part of the clientInfo\r\n * login_req uid received as part of clientInfo\r\n * Also does a sanity check for extraQueryParameters passed by the user to ensure no repeat queryParameters\r\n *\r\n * @param {@link Account} account - Account for which the token is requested\r\n * @param queryparams\r\n * @param {@link ServerRequestParameters}\r\n * @ignore\r\n */\r\n ServerRequestParameters.prototype.addHintParameters = function (account, qParams) {\r\n /*\r\n * This is a final check for all queryParams added so far; preference order: sid > login_hint\r\n * sid cannot be passed along with login_hint or domain_hint, hence we check both are not populated yet in queryParameters\r\n */\r\n if (account && !qParams[SSOTypes.SID]) {\r\n // sid - populate only if login_hint is not already populated and the account has sid\r\n var populateSID = !qParams[SSOTypes.LOGIN_HINT] && account.sid && this.promptValue === PromptState.NONE;\r\n if (populateSID) {\r\n qParams = this.addSSOParameter(SSOTypes.SID, account.sid, qParams);\r\n }\r\n // login_hint - account.userName\r\n else {\r\n var populateLoginHint = !qParams[SSOTypes.LOGIN_HINT] && account.userName && !StringUtils.isEmpty(account.userName);\r\n if (populateLoginHint) {\r\n qParams = this.addSSOParameter(SSOTypes.LOGIN_HINT, account.userName, qParams);\r\n }\r\n }\r\n }\r\n return qParams;\r\n };\r\n /**\r\n * Add SID to extraQueryParameters\r\n * @param sid\r\n */\r\n ServerRequestParameters.prototype.addSSOParameter = function (ssoType, ssoData, ssoParam) {\r\n if (!ssoParam) {\r\n ssoParam = {};\r\n }\r\n if (!ssoData) {\r\n return ssoParam;\r\n }\r\n switch (ssoType) {\r\n case SSOTypes.SID: {\r\n ssoParam[SSOTypes.SID] = ssoData;\r\n break;\r\n }\r\n case SSOTypes.ID_TOKEN: {\r\n ssoParam[SSOTypes.LOGIN_HINT] = ssoData;\r\n break;\r\n }\r\n case SSOTypes.LOGIN_HINT: {\r\n ssoParam[SSOTypes.LOGIN_HINT] = ssoData;\r\n break;\r\n }\r\n }\r\n return ssoParam;\r\n };\r\n /**\r\n * Utility to generate a QueryParameterString from a Key-Value mapping of extraQueryParameters passed\r\n * @param extraQueryParameters\r\n */\r\n ServerRequestParameters.generateQueryParametersString = function (queryParameters, silentCall) {\r\n var paramsString = null;\r\n if (queryParameters) {\r\n Object.keys(queryParameters).forEach(function (key) {\r\n // sid cannot be passed along with login_hint or domain_hint\r\n if (key === Constants.domain_hint && (silentCall || queryParameters[SSOTypes.SID])) {\r\n return;\r\n }\r\n if (!paramsString) {\r\n paramsString = key + \"=\" + encodeURIComponent(queryParameters[key]);\r\n }\r\n else {\r\n paramsString += \"&\" + key + \"=\" + encodeURIComponent(queryParameters[key]);\r\n }\r\n });\r\n }\r\n return paramsString;\r\n };\r\n // #endregion\r\n /**\r\n * Check to see if there are SSO params set in the Request\r\n * @param request\r\n */\r\n ServerRequestParameters.isSSOParam = function (request) {\r\n return !!(request && (request.account || request.sid || request.loginHint));\r\n };\r\n /**\r\n * Returns the correct response_type string attribute for an acquireToken request configuration\r\n * @param accountsMatch boolean: Determines whether the account in the request matches the cached account\r\n * @param scopes Array: AuthenticationRequest scopes configuration\r\n * @param loginScopesOnly boolean: True if the scopes array ONLY contains the clientId or any combination of OIDC scopes, without resource scopes\r\n */\r\n ServerRequestParameters.determineResponseType = function (accountsMatch, scopes) {\r\n // Supports getting an id_token by sending in clientId as only scope or OIDC scopes as only scopes\r\n if (ScopeSet.onlyContainsOidcScopes(scopes)) {\r\n return ResponseTypes.id_token;\r\n }\r\n // If accounts match, check if OIDC scopes are included, otherwise return id_token_token\r\n return (accountsMatch) ? this.responseTypeForMatchingAccounts(scopes) : ResponseTypes.id_token_token;\r\n };\r\n /**\r\n * Returns the correct response_type string attribute for an acquireToken request configuration that contains an\r\n * account that matches the account in the MSAL cache.\r\n * @param scopes Array: AuthenticationRequest scopes configuration\r\n */\r\n ServerRequestParameters.responseTypeForMatchingAccounts = function (scopes) {\r\n // Opt-into also requesting an ID token by sending in 'openid', 'profile' or both along with resource scopes when login is not necessary.\r\n return (ScopeSet.containsAnyOidcScopes(scopes)) ? ResponseTypes.id_token_token : ResponseTypes.token;\r\n };\r\n return ServerRequestParameters;\r\n}());\r\nexport { ServerRequestParameters };\r\n//# sourceMappingURL=ServerRequestParameters.js.map","/* eslint-disable header/header */\r\nexport var name = \"msal\";\r\nexport var version = \"1.4.11\";\r\n//# sourceMappingURL=packageMetadata.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { NetworkRequestType } from \"./utils/Constants\";\r\n/**\r\n * XHR client for JSON endpoints\r\n * https://www.npmjs.com/package/async-promise\r\n * @hidden\r\n */\r\nvar XhrClient = /** @class */ (function () {\r\n function XhrClient() {\r\n }\r\n XhrClient.prototype.sendRequestAsync = function (url, method, enableCaching) {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(method, url, /* async: */ true);\r\n if (enableCaching) {\r\n /*\r\n * TODO: (shivb) ensure that this can be cached\r\n * xhr.setRequestHeader(\"Cache-Control\", \"Public\");\r\n */\r\n }\r\n xhr.onload = function () {\r\n if (xhr.status < 200 || xhr.status >= 300) {\r\n reject(_this.handleError(xhr.responseText));\r\n }\r\n var jsonResponse;\r\n try {\r\n jsonResponse = JSON.parse(xhr.responseText);\r\n }\r\n catch (e) {\r\n reject(_this.handleError(xhr.responseText));\r\n }\r\n var response = {\r\n statusCode: xhr.status,\r\n body: jsonResponse\r\n };\r\n resolve(response);\r\n };\r\n xhr.onerror = function () {\r\n reject(xhr.status);\r\n };\r\n if (method === NetworkRequestType.GET) {\r\n xhr.send();\r\n }\r\n else {\r\n throw \"not implemented\";\r\n }\r\n });\r\n };\r\n XhrClient.prototype.handleError = function (responseText) {\r\n var jsonResponse;\r\n try {\r\n jsonResponse = JSON.parse(responseText);\r\n if (jsonResponse[\"error\"]) {\r\n return jsonResponse[\"error\"];\r\n }\r\n else {\r\n throw responseText;\r\n }\r\n }\r\n catch (e) {\r\n return responseText;\r\n }\r\n };\r\n return XhrClient;\r\n}());\r\nexport { XhrClient };\r\n//# sourceMappingURL=XHRClient.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { XhrClient } from \"../XHRClient\";\r\nimport { AAD_INSTANCE_DISCOVERY_ENDPOINT, NetworkRequestType } from \"../utils/Constants\";\r\nimport { UrlUtils } from \"../utils/UrlUtils\";\r\nvar TrustedAuthority = /** @class */ (function () {\r\n function TrustedAuthority() {\r\n }\r\n /**\r\n *\r\n * @param validateAuthority\r\n * @param knownAuthorities\r\n */\r\n TrustedAuthority.setTrustedAuthoritiesFromConfig = function (validateAuthority, knownAuthorities) {\r\n if (validateAuthority && !this.getTrustedHostList().length) {\r\n knownAuthorities.forEach(function (authority) {\r\n TrustedAuthority.TrustedHostList.push(authority.toLowerCase());\r\n });\r\n }\r\n };\r\n /**\r\n *\r\n * @param telemetryManager\r\n * @param correlationId\r\n */\r\n TrustedAuthority.getAliases = function (authorityToVerify, telemetryManager, correlationId) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var client, httpMethod, instanceDiscoveryEndpoint, httpEvent;\r\n return tslib_1.__generator(this, function (_a) {\r\n client = new XhrClient();\r\n httpMethod = NetworkRequestType.GET;\r\n instanceDiscoveryEndpoint = \"\" + AAD_INSTANCE_DISCOVERY_ENDPOINT + authorityToVerify + \"oauth2/v2.0/authorize\";\r\n httpEvent = telemetryManager.createAndStartHttpEvent(correlationId, httpMethod, instanceDiscoveryEndpoint, \"getAliases\");\r\n return [2 /*return*/, client.sendRequestAsync(instanceDiscoveryEndpoint, httpMethod, true)\r\n .then(function (response) {\r\n httpEvent.httpResponseStatus = response.statusCode;\r\n telemetryManager.stopEvent(httpEvent);\r\n return response.body[\"metadata\"];\r\n })\r\n .catch(function (err) {\r\n httpEvent.serverErrorCode = err;\r\n telemetryManager.stopEvent(httpEvent);\r\n throw err;\r\n })];\r\n });\r\n });\r\n };\r\n /**\r\n *\r\n * @param telemetryManager\r\n * @param correlationId\r\n */\r\n TrustedAuthority.setTrustedAuthoritiesFromNetwork = function (authorityToVerify, telemetryManager, correlationId) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var metadata, host;\r\n return tslib_1.__generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.getAliases(authorityToVerify, telemetryManager, correlationId)];\r\n case 1:\r\n metadata = _a.sent();\r\n metadata.forEach(function (entry) {\r\n var authorities = entry[\"aliases\"];\r\n authorities.forEach(function (authority) {\r\n TrustedAuthority.TrustedHostList.push(authority.toLowerCase());\r\n });\r\n });\r\n host = UrlUtils.GetUrlComponents(authorityToVerify).HostNameAndPort;\r\n if (TrustedAuthority.getTrustedHostList().length && !TrustedAuthority.IsInTrustedHostList(host)) {\r\n // Custom Domain scenario, host is trusted because Instance Discovery call succeeded\r\n TrustedAuthority.TrustedHostList.push(host.toLowerCase());\r\n }\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n TrustedAuthority.getTrustedHostList = function () {\r\n return this.TrustedHostList;\r\n };\r\n /**\r\n * Checks to see if the host is in a list of trusted hosts\r\n * @param host\r\n */\r\n TrustedAuthority.IsInTrustedHostList = function (host) {\r\n return this.TrustedHostList.indexOf(host.toLowerCase()) > -1;\r\n };\r\n TrustedAuthority.TrustedHostList = [];\r\n return TrustedAuthority;\r\n}());\r\nexport { TrustedAuthority };\r\n//# sourceMappingURL=TrustedAuthority.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\nimport { version as libraryVersion } from \"./packageMetadata\";\r\nexport var LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"Error\"] = 0] = \"Error\";\r\n LogLevel[LogLevel[\"Warning\"] = 1] = \"Warning\";\r\n LogLevel[LogLevel[\"Info\"] = 2] = \"Info\";\r\n LogLevel[LogLevel[\"Verbose\"] = 3] = \"Verbose\";\r\n})(LogLevel || (LogLevel = {}));\r\nvar Logger = /** @class */ (function () {\r\n function Logger(localCallback, options) {\r\n if (options === void 0) { options = {}; }\r\n /**\r\n * @hidden\r\n */\r\n this.level = LogLevel.Info;\r\n var _a = options.correlationId, correlationId = _a === void 0 ? \"\" : _a, _b = options.level, level = _b === void 0 ? LogLevel.Info : _b, _c = options.piiLoggingEnabled, piiLoggingEnabled = _c === void 0 ? false : _c;\r\n this.localCallback = localCallback;\r\n this.correlationId = correlationId;\r\n this.level = level;\r\n this.piiLoggingEnabled = piiLoggingEnabled;\r\n }\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.logMessage = function (logLevel, logMessage, containsPii) {\r\n if ((logLevel > this.level) || (!this.piiLoggingEnabled && containsPii)) {\r\n return;\r\n }\r\n var timestamp = new Date().toUTCString();\r\n var log;\r\n if (!StringUtils.isEmpty(this.correlationId)) {\r\n log = timestamp + \":\" + this.correlationId + \"-\" + libraryVersion + \"-\" + LogLevel[logLevel] + (containsPii ? \"-pii\" : \"\") + \" \" + logMessage;\r\n }\r\n else {\r\n log = timestamp + \":\" + libraryVersion + \"-\" + LogLevel[logLevel] + (containsPii ? \"-pii\" : \"\") + \" \" + logMessage;\r\n }\r\n this.executeCallback(logLevel, log, containsPii);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.executeCallback = function (level, message, containsPii) {\r\n if (this.localCallback) {\r\n this.localCallback(level, message, containsPii);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.error = function (message) {\r\n this.logMessage(LogLevel.Error, message, false);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.errorPii = function (message) {\r\n this.logMessage(LogLevel.Error, message, true);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.warning = function (message) {\r\n this.logMessage(LogLevel.Warning, message, false);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.warningPii = function (message) {\r\n this.logMessage(LogLevel.Warning, message, true);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.info = function (message) {\r\n this.logMessage(LogLevel.Info, message, false);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.infoPii = function (message) {\r\n this.logMessage(LogLevel.Info, message, true);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.verbose = function (message) {\r\n this.logMessage(LogLevel.Verbose, message, false);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Logger.prototype.verbosePii = function (message) {\r\n this.logMessage(LogLevel.Verbose, message, true);\r\n };\r\n Logger.prototype.isPiiLoggingEnabled = function () {\r\n return this.piiLoggingEnabled;\r\n };\r\n return Logger;\r\n}());\r\nexport { Logger };\r\n//# sourceMappingURL=Logger.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { CryptoUtils } from \"./utils/CryptoUtils\";\r\nimport { ClientAuthError } from \"./error/ClientAuthError\";\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar ClientInfo = /** @class */ (function () {\r\n function ClientInfo(rawClientInfo, authority) {\r\n if (!rawClientInfo || StringUtils.isEmpty(rawClientInfo)) {\r\n this.uid = \"\";\r\n this.utid = \"\";\r\n return;\r\n }\r\n try {\r\n var decodedClientInfo = CryptoUtils.base64Decode(rawClientInfo);\r\n var clientInfo = JSON.parse(decodedClientInfo);\r\n if (clientInfo) {\r\n if (clientInfo.hasOwnProperty(\"uid\")) {\r\n this.uid = authority ? ClientInfo.stripPolicyFromUid(clientInfo.uid, authority) : clientInfo.uid;\r\n }\r\n if (clientInfo.hasOwnProperty(\"utid\")) {\r\n this.utid = clientInfo.utid;\r\n }\r\n }\r\n }\r\n catch (e) {\r\n throw ClientAuthError.createClientInfoDecodingError(e);\r\n }\r\n }\r\n Object.defineProperty(ClientInfo.prototype, \"uid\", {\r\n get: function () {\r\n return this._uid ? this._uid : \"\";\r\n },\r\n set: function (uid) {\r\n this._uid = uid;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ClientInfo.prototype, \"utid\", {\r\n get: function () {\r\n return this._utid ? this._utid : \"\";\r\n },\r\n set: function (utid) {\r\n this._utid = utid;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ClientInfo.createClientInfoFromIdToken = function (idToken, authority) {\r\n var clientInfo = {\r\n uid: idToken.subject,\r\n utid: \"\"\r\n };\r\n return new ClientInfo(CryptoUtils.base64Encode(JSON.stringify(clientInfo)), authority);\r\n };\r\n ClientInfo.stripPolicyFromUid = function (uid, authority) {\r\n var uidSegments = uid.split(\"-\");\r\n // Reverse the url segments so the last one is more easily accessible\r\n var urlSegments = authority.split(\"/\").reverse();\r\n var policy = \"\";\r\n if (!StringUtils.isEmpty(urlSegments[0])) {\r\n policy = urlSegments[0];\r\n }\r\n else if (urlSegments.length > 1) {\r\n // If the original url had a trailing slash, urlSegments[0] would be \"\" so take the next element\r\n policy = urlSegments[1];\r\n }\r\n if (uidSegments[uidSegments.length - 1] === policy) {\r\n // If the last segment of uid matches the last segment of authority url, remove the last segment of uid\r\n return uidSegments.slice(0, uidSegments.length - 1).join(\"-\");\r\n }\r\n return uid;\r\n };\r\n ClientInfo.prototype.encodeClientInfo = function () {\r\n var clientInfo = JSON.stringify({ uid: this.uid, utid: this.utid });\r\n return CryptoUtils.base64Encode(clientInfo);\r\n };\r\n return ClientInfo;\r\n}());\r\nexport { ClientInfo };\r\n//# sourceMappingURL=ClientInfo.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar TimeUtils = /** @class */ (function () {\r\n function TimeUtils() {\r\n }\r\n /**\r\n * Returns time in seconds for expiration based on string value passed in.\r\n *\r\n * @param expiresIn\r\n */\r\n TimeUtils.parseExpiresIn = function (expiresIn) {\r\n // if AAD did not send \"expires_in\" property, use default expiration of 3599 seconds, for some reason AAD sends 3599 as \"expires_in\" value instead of 3600\r\n if (!expiresIn) {\r\n expiresIn = \"3599\";\r\n }\r\n return parseInt(expiresIn, 10);\r\n };\r\n /**\r\n * Return the current time in Unix time (seconds). Date.getTime() returns in milliseconds.\r\n */\r\n TimeUtils.now = function () {\r\n return Math.round(new Date().getTime() / 1000.0);\r\n };\r\n /**\r\n * Returns the amount of time in milliseconds since the page loaded.\r\n */\r\n TimeUtils.relativeNowMs = function () {\r\n return window.performance.now();\r\n };\r\n return TimeUtils;\r\n}());\r\nexport { TimeUtils };\r\n//# sourceMappingURL=TimeUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { CryptoUtils } from \"./CryptoUtils\";\r\nimport { StringUtils } from \"./StringUtils\";\r\nimport { TimeUtils } from \"./TimeUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar TokenUtils = /** @class */ (function () {\r\n function TokenUtils() {\r\n }\r\n /**\r\n * decode a JWT\r\n *\r\n * @param jwtToken\r\n */\r\n TokenUtils.decodeJwt = function (jwtToken) {\r\n if (StringUtils.isEmpty(jwtToken)) {\r\n return null;\r\n }\r\n var idTokenPartsRegex = /^([^\\.\\s]*)\\.([^\\.\\s]+)\\.([^\\.\\s]*)$/;\r\n var matches = idTokenPartsRegex.exec(jwtToken);\r\n if (!matches || matches.length < 4) {\r\n // this._requestContext.logger.warn(\"The returned id_token is not parseable.\");\r\n return null;\r\n }\r\n var crackedToken = {\r\n header: matches[1],\r\n JWSPayload: matches[2],\r\n JWSSig: matches[3]\r\n };\r\n return crackedToken;\r\n };\r\n /**\r\n * Evaluates whether token cache item expiration is within expiration offset range\r\n * @param tokenCacheItem\r\n */\r\n TokenUtils.validateExpirationIsWithinOffset = function (expiration, tokenRenewalOffsetSeconds) {\r\n var offset = tokenRenewalOffsetSeconds || 300;\r\n return expiration && (expiration > TimeUtils.now() + offset);\r\n };\r\n /**\r\n * Extract IdToken by decoding the RAWIdToken\r\n *\r\n * @param encodedIdToken\r\n */\r\n TokenUtils.extractIdToken = function (encodedIdToken) {\r\n // id token will be decoded to get the username\r\n var decodedToken = this.decodeJwt(encodedIdToken);\r\n if (!decodedToken) {\r\n return null;\r\n }\r\n try {\r\n var base64IdToken = decodedToken[\"JWSPayload\"];\r\n var base64Decoded = CryptoUtils.base64Decode(base64IdToken);\r\n if (!base64Decoded) {\r\n // this._requestContext.logger.info(\"The returned id_token could not be base64 url safe decoded.\");\r\n return null;\r\n }\r\n // ECMA script has JSON built-in support\r\n return JSON.parse(base64Decoded);\r\n }\r\n catch (err) {\r\n // this._requestContext.logger.error(\"The returned id_token could not be decoded\" + err);\r\n }\r\n return null;\r\n };\r\n return TokenUtils;\r\n}());\r\nexport { TokenUtils };\r\n//# sourceMappingURL=TokenUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { ClientAuthError } from \"./error/ClientAuthError\";\r\nimport { TokenUtils } from \"./utils/TokenUtils\";\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar IdToken = /** @class */ (function () {\r\n /* tslint:disable:no-string-literal */\r\n function IdToken(rawIdToken) {\r\n if (StringUtils.isEmpty(rawIdToken)) {\r\n throw ClientAuthError.createIdTokenNullOrEmptyError(rawIdToken);\r\n }\r\n try {\r\n this.rawIdToken = rawIdToken;\r\n this.claims = TokenUtils.extractIdToken(rawIdToken);\r\n if (this.claims) {\r\n if (this.claims.hasOwnProperty(\"iss\")) {\r\n this.issuer = this.claims[\"iss\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"oid\")) {\r\n this.objectId = this.claims[\"oid\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"sub\")) {\r\n this.subject = this.claims[\"sub\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"tid\")) {\r\n this.tenantId = this.claims[\"tid\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"ver\")) {\r\n this.version = this.claims[\"ver\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"preferred_username\")) {\r\n this.preferredName = this.claims[\"preferred_username\"];\r\n }\r\n else if (this.claims.hasOwnProperty(\"upn\")) {\r\n this.preferredName = this.claims[\"upn\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"name\")) {\r\n this.name = this.claims[\"name\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"nonce\")) {\r\n this.nonce = this.claims[\"nonce\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"exp\")) {\r\n this.expiration = this.claims[\"exp\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"home_oid\")) {\r\n this.homeObjectId = this.claims[\"home_oid\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"sid\")) {\r\n this.sid = this.claims[\"sid\"];\r\n }\r\n if (this.claims.hasOwnProperty(\"cloud_instance_host_name\")) {\r\n this.cloudInstance = this.claims[\"cloud_instance_host_name\"];\r\n }\r\n /* tslint:enable:no-string-literal */\r\n }\r\n }\r\n catch (e) {\r\n /*\r\n * TODO: This error here won't really every be thrown, since extractIdToken() returns null if the decodeJwt() fails.\r\n * Need to add better error handling here to account for being unable to decode jwts.\r\n */\r\n throw ClientAuthError.createIdTokenParsingError(e);\r\n }\r\n }\r\n return IdToken;\r\n}());\r\nexport { IdToken };\r\n//# sourceMappingURL=IdToken.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar AccessTokenCacheItem = /** @class */ (function () {\r\n function AccessTokenCacheItem(key, value) {\r\n this.key = key;\r\n this.value = value;\r\n }\r\n return AccessTokenCacheItem;\r\n}());\r\nexport { AccessTokenCacheItem };\r\n//# sourceMappingURL=AccessTokenCacheItem.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { AuthError } from \"../error/AuthError\";\r\n/**\r\n * @hidden\r\n */\r\nvar BrowserStorage = /** @class */ (function () {\r\n function BrowserStorage(cacheLocation) {\r\n if (!window) {\r\n throw AuthError.createNoWindowObjectError(\"Browser storage class could not find window object\");\r\n }\r\n var storageSupported = typeof window[cacheLocation] !== \"undefined\" && window[cacheLocation] !== null;\r\n if (!storageSupported) {\r\n throw ClientConfigurationError.createStorageNotSupportedError(cacheLocation);\r\n }\r\n this.cacheLocation = cacheLocation;\r\n }\r\n /**\r\n * add value to storage\r\n * @param key\r\n * @param value\r\n * @param enableCookieStorage\r\n */\r\n BrowserStorage.prototype.setItem = function (key, value, enableCookieStorage) {\r\n window[this.cacheLocation].setItem(key, value);\r\n if (enableCookieStorage) {\r\n this.setItemCookie(key, value);\r\n }\r\n };\r\n /**\r\n * get one item by key from storage\r\n * @param key\r\n * @param enableCookieStorage\r\n */\r\n BrowserStorage.prototype.getItem = function (key, enableCookieStorage) {\r\n if (enableCookieStorage && this.getItemCookie(key)) {\r\n return this.getItemCookie(key);\r\n }\r\n return window[this.cacheLocation].getItem(key);\r\n };\r\n /**\r\n * remove value from storage\r\n * @param key\r\n */\r\n BrowserStorage.prototype.removeItem = function (key) {\r\n return window[this.cacheLocation].removeItem(key);\r\n };\r\n /**\r\n * clear storage (remove all items from it)\r\n */\r\n BrowserStorage.prototype.clear = function () {\r\n return window[this.cacheLocation].clear();\r\n };\r\n /**\r\n * add value to cookies\r\n * @param cName\r\n * @param cValue\r\n * @param expires\r\n */\r\n BrowserStorage.prototype.setItemCookie = function (cName, cValue, expires) {\r\n var cookieStr = encodeURIComponent(cName) + \"=\" + encodeURIComponent(cValue) + \";path=/;\";\r\n if (expires) {\r\n var expireTime = this.getCookieExpirationTime(expires);\r\n cookieStr += \"expires=\" + expireTime + \";\";\r\n }\r\n document.cookie = cookieStr;\r\n };\r\n /**\r\n * get one item by key from cookies\r\n * @param cName\r\n */\r\n BrowserStorage.prototype.getItemCookie = function (cName) {\r\n var name = encodeURIComponent(cName) + \"=\";\r\n var ca = document.cookie.split(\";\");\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) === \" \") {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n return decodeURIComponent(c.substring(name.length, c.length));\r\n }\r\n }\r\n return \"\";\r\n };\r\n /**\r\n * Clear an item in the cookies by key\r\n * @param cName\r\n */\r\n BrowserStorage.prototype.clearItemCookie = function (cName) {\r\n this.setItemCookie(cName, \"\", -1);\r\n };\r\n /**\r\n * Get cookie expiration time\r\n * @param cookieLifeDays\r\n */\r\n BrowserStorage.prototype.getCookieExpirationTime = function (cookieLifeDays) {\r\n var today = new Date();\r\n var expr = new Date(today.getTime() + cookieLifeDays * 24 * 60 * 60 * 1000);\r\n return expr.toUTCString();\r\n };\r\n return BrowserStorage;\r\n}());\r\nexport { BrowserStorage };\r\n//# sourceMappingURL=BrowserStorage.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { Constants, PromptState, BlacklistedEQParams } from \"./Constants\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { ScopeSet } from \"../ScopeSet\";\r\nimport { StringUtils } from \"./StringUtils\";\r\nimport { CryptoUtils } from \"./CryptoUtils\";\r\nimport { TimeUtils } from \"./TimeUtils\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\n/**\r\n * @hidden\r\n */\r\nvar RequestUtils = /** @class */ (function () {\r\n function RequestUtils() {\r\n }\r\n /**\r\n * @ignore\r\n *\r\n * @param request\r\n * @param isLoginCall\r\n * @param cacheStorage\r\n * @param clientId\r\n *\r\n * validates all request parameters and generates a consumable request object\r\n */\r\n RequestUtils.validateRequest = function (request, isLoginCall, clientId, interactionType) {\r\n // Throw error if request is empty for acquire * calls\r\n if (!isLoginCall && !request) {\r\n throw ClientConfigurationError.createEmptyRequestError();\r\n }\r\n var scopes;\r\n var extraQueryParameters;\r\n if (request) {\r\n // if extraScopesToConsent is passed in loginCall, append them to the login request; Validate and filter scopes (the validate function will throw if validation fails)\r\n scopes = isLoginCall ? ScopeSet.appendScopes(request.scopes, request.extraScopesToConsent) : request.scopes;\r\n ScopeSet.validateInputScope(scopes, !isLoginCall);\r\n scopes = ScopeSet.translateClientIdIfSingleScope(scopes, clientId);\r\n // validate prompt parameter\r\n this.validatePromptParameter(request.prompt);\r\n // validate extraQueryParameters\r\n extraQueryParameters = this.validateEQParameters(request.extraQueryParameters, request.claimsRequest);\r\n // validate claimsRequest\r\n this.validateClaimsRequest(request.claimsRequest);\r\n }\r\n // validate and generate state and correlationId\r\n var state = this.validateAndGenerateState(request && request.state, interactionType);\r\n var correlationId = this.validateAndGenerateCorrelationId(request && request.correlationId);\r\n var validatedRequest = tslib_1.__assign({}, request, { extraQueryParameters: extraQueryParameters,\r\n scopes: scopes,\r\n state: state,\r\n correlationId: correlationId });\r\n return validatedRequest;\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * Utility to test if valid prompt value is passed in the request\r\n * @param request\r\n */\r\n RequestUtils.validatePromptParameter = function (prompt) {\r\n if (prompt) {\r\n if ([PromptState.LOGIN, PromptState.SELECT_ACCOUNT, PromptState.CONSENT, PromptState.NONE].indexOf(prompt) < 0) {\r\n throw ClientConfigurationError.createInvalidPromptError(prompt);\r\n }\r\n }\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * Removes unnecessary or duplicate query parameters from extraQueryParameters\r\n * @param request\r\n */\r\n RequestUtils.validateEQParameters = function (extraQueryParameters, claimsRequest) {\r\n var eQParams = tslib_1.__assign({}, extraQueryParameters);\r\n if (!eQParams) {\r\n return null;\r\n }\r\n if (claimsRequest) {\r\n // this.logger.warning(\"Removed duplicate claims from extraQueryParameters. Please use either the claimsRequest field OR pass as extraQueryParameter - not both.\");\r\n delete eQParams[Constants.claims];\r\n }\r\n BlacklistedEQParams.forEach(function (param) {\r\n if (eQParams[param]) {\r\n // this.logger.warning(\"Removed duplicate \" + param + \" from extraQueryParameters. Please use the \" + param + \" field in request object.\");\r\n delete eQParams[param];\r\n }\r\n });\r\n return eQParams;\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * Validates the claims passed in request is a JSON\r\n * TODO: More validation will be added when the server team tells us how they have actually implemented claims\r\n * @param claimsRequest\r\n */\r\n RequestUtils.validateClaimsRequest = function (claimsRequest) {\r\n if (!claimsRequest) {\r\n return;\r\n }\r\n try {\r\n JSON.parse(claimsRequest);\r\n }\r\n catch (e) {\r\n throw ClientConfigurationError.createClaimsRequestParsingError(e);\r\n }\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * generate unique state per request\r\n * @param userState User-provided state value\r\n * @returns State string include library state and user state\r\n */\r\n RequestUtils.validateAndGenerateState = function (userState, interactionType) {\r\n return !StringUtils.isEmpty(userState) ? \"\" + RequestUtils.generateLibraryState(interactionType) + Constants.resourceDelimiter + userState : RequestUtils.generateLibraryState(interactionType);\r\n };\r\n /**\r\n * Generates the state value used by the library.\r\n *\r\n * @returns Base64 encoded string representing the state\r\n */\r\n RequestUtils.generateLibraryState = function (interactionType) {\r\n var stateObject = {\r\n id: CryptoUtils.createNewGuid(),\r\n ts: TimeUtils.now(),\r\n method: interactionType\r\n };\r\n var stateString = JSON.stringify(stateObject);\r\n return CryptoUtils.base64Encode(stateString);\r\n };\r\n /**\r\n * Decodes the state value into a StateObject\r\n *\r\n * @param state State value returned in the request\r\n * @returns Parsed values from the encoded state value\r\n */\r\n RequestUtils.parseLibraryState = function (state) {\r\n var libraryState = decodeURIComponent(state).split(Constants.resourceDelimiter)[0];\r\n if (CryptoUtils.isGuid(libraryState)) {\r\n // If state is guid, assume timestamp is now and is redirect, as redirect should be only method where this can happen.\r\n return {\r\n id: libraryState,\r\n ts: TimeUtils.now(),\r\n method: Constants.interactionTypeRedirect\r\n };\r\n }\r\n try {\r\n var stateString = CryptoUtils.base64Decode(libraryState);\r\n var stateObject = JSON.parse(stateString);\r\n return stateObject;\r\n }\r\n catch (e) {\r\n throw ClientAuthError.createInvalidStateError(state, null);\r\n }\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * validate correlationId and generate if not valid or not set by the user\r\n * @param correlationId\r\n */\r\n RequestUtils.validateAndGenerateCorrelationId = function (correlationId) {\r\n // validate user set correlationId or set one for the user if null\r\n if (correlationId && !CryptoUtils.isGuid(correlationId)) {\r\n throw ClientConfigurationError.createInvalidCorrelationIdError();\r\n }\r\n return CryptoUtils.isGuid(correlationId) ? correlationId : CryptoUtils.createNewGuid();\r\n };\r\n /**\r\n * Create a request signature\r\n * @param request\r\n */\r\n RequestUtils.createRequestSignature = function (request) {\r\n return \"\" + request.scopes.join(\" \").toLowerCase() + Constants.resourceDelimiter + request.authority;\r\n };\r\n return RequestUtils;\r\n}());\r\nexport { RequestUtils };\r\n//# sourceMappingURL=RequestUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { Constants, PersistentCacheKeys, TemporaryCacheKeys, ErrorCacheKeys, ServerHashParamKeys } from \"../utils/Constants\";\r\nimport { AccessTokenCacheItem } from \"./AccessTokenCacheItem\";\r\nimport { BrowserStorage } from \"./BrowserStorage\";\r\nimport { RequestUtils } from \"../utils/RequestUtils\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { IdToken } from \"../IdToken\";\r\n/**\r\n * @hidden\r\n */\r\nvar AuthCache = /** @class */ (function (_super) {\r\n tslib_1.__extends(AuthCache, _super);\r\n function AuthCache(clientId, cacheLocation, storeAuthStateInCookie) {\r\n var _this = _super.call(this, cacheLocation) || this;\r\n _this.clientId = clientId;\r\n // This is hardcoded to true for now. We may make this configurable in the future\r\n _this.rollbackEnabled = true;\r\n _this.migrateCacheEntries(storeAuthStateInCookie);\r\n return _this;\r\n }\r\n /**\r\n * Support roll back to old cache schema until the next major release: true by default now\r\n * @param storeAuthStateInCookie\r\n */\r\n AuthCache.prototype.migrateCacheEntries = function (storeAuthStateInCookie) {\r\n var _this = this;\r\n var idTokenKey = Constants.cachePrefix + \".\" + PersistentCacheKeys.IDTOKEN;\r\n var clientInfoKey = Constants.cachePrefix + \".\" + PersistentCacheKeys.CLIENT_INFO;\r\n var errorKey = Constants.cachePrefix + \".\" + ErrorCacheKeys.ERROR;\r\n var errorDescKey = Constants.cachePrefix + \".\" + ErrorCacheKeys.ERROR_DESC;\r\n var idTokenValue = _super.prototype.getItem.call(this, idTokenKey);\r\n var idToken;\r\n if (idTokenValue) {\r\n try {\r\n idToken = new IdToken(idTokenValue);\r\n }\r\n catch (e) {\r\n return;\r\n }\r\n }\r\n if (idToken && idToken.claims && idToken.claims.aud === this.clientId) {\r\n var clientInfoValue = _super.prototype.getItem.call(this, clientInfoKey);\r\n var errorValue = _super.prototype.getItem.call(this, errorKey);\r\n var errorDescValue = _super.prototype.getItem.call(this, errorDescKey);\r\n var values_1 = [idTokenValue, clientInfoValue, errorValue, errorDescValue];\r\n var keysToMigrate = [PersistentCacheKeys.IDTOKEN, PersistentCacheKeys.CLIENT_INFO, ErrorCacheKeys.ERROR, ErrorCacheKeys.ERROR_DESC];\r\n keysToMigrate.forEach(function (cacheKey, index) { return _this.duplicateCacheEntry(cacheKey, values_1[index], storeAuthStateInCookie); });\r\n }\r\n };\r\n /**\r\n * Utility function to help with roll back keys\r\n * @param newKey\r\n * @param value\r\n * @param storeAuthStateInCookie\r\n */\r\n AuthCache.prototype.duplicateCacheEntry = function (newKey, value, storeAuthStateInCookie) {\r\n if (value) {\r\n this.setItem(newKey, value, storeAuthStateInCookie);\r\n }\r\n };\r\n /**\r\n * Prepend msal. to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)\r\n * @param key\r\n * @param addInstanceId\r\n */\r\n AuthCache.prototype.generateCacheKey = function (key, addInstanceId) {\r\n try {\r\n // Defined schemas do not need the key appended\r\n JSON.parse(key);\r\n return key;\r\n }\r\n catch (e) {\r\n if (key.indexOf(\"\" + Constants.cachePrefix) === 0 || key.indexOf(Constants.adalIdToken) === 0) {\r\n return key;\r\n }\r\n return addInstanceId ? Constants.cachePrefix + \".\" + this.clientId + \".\" + key : Constants.cachePrefix + \".\" + key;\r\n }\r\n };\r\n /**\r\n * Validates that the input cache key contains the account search terms (clientId and homeAccountIdentifier) and\r\n * then whether or not it contains the \"scopes\", depending on the token type being searched for. With matching account\r\n * search terms, Access Token search tries to match the \"scopes\" keyword, while Id Token search expects \"scopes\" to not be included.\r\n * @param key\r\n * @param clientId\r\n * @param homeAccountIdentifier\r\n * @param tokenType\r\n */\r\n AuthCache.prototype.matchKeyForType = function (key, clientId, homeAccountIdentifier, tokenType) {\r\n // All valid token cache item keys are valid JSON objects, ignore keys that aren't\r\n var parsedKey = StringUtils.validateAndParseJsonCacheKey(key);\r\n if (!parsedKey) {\r\n return null;\r\n }\r\n // Does the cache item match the request account\r\n var accountMatches = key.match(clientId) && key.match(homeAccountIdentifier);\r\n // Does the cache item match the requested token type\r\n var tokenTypeMatches = false;\r\n switch (tokenType) {\r\n case ServerHashParamKeys.ACCESS_TOKEN:\r\n // Cache item is an access token if scopes are included in the cache item key\r\n tokenTypeMatches = !!key.match(Constants.scopes);\r\n break;\r\n case ServerHashParamKeys.ID_TOKEN:\r\n // Cache may be an ID token if scopes are NOT included in the cache item key\r\n tokenTypeMatches = !key.match(Constants.scopes);\r\n break;\r\n }\r\n return (accountMatches && tokenTypeMatches) ? parsedKey : null;\r\n };\r\n /**\r\n * add value to storage\r\n * @param key\r\n * @param value\r\n * @param enableCookieStorage\r\n */\r\n AuthCache.prototype.setItem = function (key, value, enableCookieStorage) {\r\n _super.prototype.setItem.call(this, this.generateCacheKey(key, true), value, enableCookieStorage);\r\n // Values stored in cookies will have rollback disabled to minimize cookie length\r\n if (this.rollbackEnabled && !enableCookieStorage) {\r\n _super.prototype.setItem.call(this, this.generateCacheKey(key, false), value, enableCookieStorage);\r\n }\r\n };\r\n /**\r\n * get one item by key from storage\r\n * @param key\r\n * @param enableCookieStorage\r\n */\r\n AuthCache.prototype.getItem = function (key, enableCookieStorage) {\r\n return _super.prototype.getItem.call(this, this.generateCacheKey(key, true), enableCookieStorage);\r\n };\r\n /**\r\n * remove value from storage\r\n * @param key\r\n */\r\n AuthCache.prototype.removeItem = function (key) {\r\n _super.prototype.removeItem.call(this, this.generateCacheKey(key, true));\r\n if (this.rollbackEnabled) {\r\n _super.prototype.removeItem.call(this, this.generateCacheKey(key, false));\r\n }\r\n };\r\n /**\r\n * Reset the cache items\r\n */\r\n AuthCache.prototype.resetCacheItems = function () {\r\n var storage = window[this.cacheLocation];\r\n var key;\r\n for (key in storage) {\r\n // Check if key contains msal prefix; For now, we are clearing all cache items created by MSAL.js\r\n if (storage.hasOwnProperty(key) && (key.indexOf(Constants.cachePrefix) !== -1)) {\r\n _super.prototype.removeItem.call(this, key);\r\n // TODO: Clear cache based on client id (clarify use cases where this is needed)\r\n }\r\n }\r\n };\r\n /**\r\n * Reset all temporary cache items\r\n */\r\n AuthCache.prototype.resetTempCacheItems = function (state) {\r\n var _this = this;\r\n var stateId = state && RequestUtils.parseLibraryState(state).id;\r\n var isTokenRenewalInProgress = this.tokenRenewalInProgress(state);\r\n var storage = window[this.cacheLocation];\r\n // check state and remove associated cache\r\n if (stateId && !isTokenRenewalInProgress) {\r\n Object.keys(storage).forEach(function (key) {\r\n if (key.indexOf(stateId) !== -1) {\r\n _this.removeItem(key);\r\n _super.prototype.clearItemCookie.call(_this, key);\r\n }\r\n });\r\n }\r\n // delete the interaction status cache\r\n this.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n this.removeItem(TemporaryCacheKeys.REDIRECT_REQUEST);\r\n };\r\n /**\r\n * Set cookies for IE\r\n * @param cName\r\n * @param cValue\r\n * @param expires\r\n */\r\n AuthCache.prototype.setItemCookie = function (cName, cValue, expires) {\r\n _super.prototype.setItemCookie.call(this, this.generateCacheKey(cName, true), cValue, expires);\r\n if (this.rollbackEnabled) {\r\n _super.prototype.setItemCookie.call(this, this.generateCacheKey(cName, false), cValue, expires);\r\n }\r\n };\r\n AuthCache.prototype.clearItemCookie = function (cName) {\r\n _super.prototype.clearItemCookie.call(this, this.generateCacheKey(cName, true));\r\n if (this.rollbackEnabled) {\r\n _super.prototype.clearItemCookie.call(this, this.generateCacheKey(cName, false));\r\n }\r\n };\r\n /**\r\n * get one item by key from cookies\r\n * @param cName\r\n */\r\n AuthCache.prototype.getItemCookie = function (cName) {\r\n return _super.prototype.getItemCookie.call(this, this.generateCacheKey(cName, true));\r\n };\r\n /**\r\n * Get all tokens of a certain type from the cache\r\n * @param clientId\r\n * @param homeAccountIdentifier\r\n * @param tokenType\r\n */\r\n AuthCache.prototype.getAllTokensByType = function (clientId, homeAccountIdentifier, tokenType) {\r\n var _this = this;\r\n var results = Object.keys(window[this.cacheLocation]).reduce(function (tokens, key) {\r\n var matchedTokenKey = _this.matchKeyForType(key, clientId, homeAccountIdentifier, tokenType);\r\n if (matchedTokenKey) {\r\n var value = _this.getItem(key);\r\n if (value) {\r\n try {\r\n var newAccessTokenCacheItem = new AccessTokenCacheItem(matchedTokenKey, JSON.parse(value));\r\n return tokens.concat([newAccessTokenCacheItem]);\r\n }\r\n catch (err) {\r\n // Skip cache items with non-valid JSON values\r\n return tokens;\r\n }\r\n }\r\n }\r\n return tokens;\r\n }, []);\r\n return results;\r\n };\r\n /**\r\n * Get all access tokens in the cache\r\n * @param clientId\r\n * @param homeAccountIdentifier\r\n */\r\n AuthCache.prototype.getAllAccessTokens = function (clientId, homeAccountIdentifier) {\r\n return this.getAllTokensByType(clientId, homeAccountIdentifier, ServerHashParamKeys.ACCESS_TOKEN);\r\n };\r\n /**\r\n * Get all id tokens in the cache in the form of AccessTokenCacheItem objects so they are\r\n * in a normalized format and can make use of the existing cached access token validation logic\r\n */\r\n AuthCache.prototype.getAllIdTokens = function (clientId, homeAccountIdentifier) {\r\n return this.getAllTokensByType(clientId, homeAccountIdentifier, ServerHashParamKeys.ID_TOKEN);\r\n };\r\n /**\r\n * Get all access and ID tokens in the cache\r\n * @param clientId\r\n * @param homeAccountIdentifier\r\n */\r\n AuthCache.prototype.getAllTokens = function (clientId, homeAccountIdentifier) {\r\n var accessTokens = this.getAllAccessTokens(clientId, homeAccountIdentifier);\r\n var idTokens = this.getAllIdTokens(clientId, homeAccountIdentifier);\r\n return accessTokens.concat(idTokens);\r\n };\r\n /**\r\n * Return if the token renewal is still in progress\r\n *\r\n * @param stateValue\r\n */\r\n AuthCache.prototype.tokenRenewalInProgress = function (stateValue) {\r\n var renewStatus = this.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.RENEW_STATUS, stateValue));\r\n return !!(renewStatus && renewStatus === Constants.inProgress);\r\n };\r\n /**\r\n * Clear all cookies\r\n */\r\n AuthCache.prototype.clearMsalCookie = function (state) {\r\n var _this = this;\r\n /*\r\n * If state is truthy, remove values associated with that request.\r\n * Otherwise, remove all MSAL cookies.\r\n */\r\n if (state) {\r\n this.clearItemCookie(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN, state));\r\n this.clearItemCookie(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_LOGIN, state));\r\n this.clearItemCookie(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.LOGIN_REQUEST, state));\r\n this.clearItemCookie(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_ACQ_TOKEN, state));\r\n }\r\n else {\r\n var cookies = document.cookie.split(\";\");\r\n cookies.forEach(function (cookieString) {\r\n var cookieName = cookieString.trim().split(\"=\")[0];\r\n if (cookieName.indexOf(Constants.cachePrefix) > -1) {\r\n _super.prototype.clearItemCookie.call(_this, cookieName);\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Create acquireTokenAccountKey to cache account object\r\n * @param accountId\r\n * @param state\r\n */\r\n AuthCache.generateAcquireTokenAccountKey = function (accountId, state) {\r\n var stateId = RequestUtils.parseLibraryState(state).id;\r\n return \"\" + TemporaryCacheKeys.ACQUIRE_TOKEN_ACCOUNT + Constants.resourceDelimiter + accountId + Constants.resourceDelimiter + stateId;\r\n };\r\n /**\r\n * Create authorityKey to cache authority\r\n * @param state\r\n */\r\n AuthCache.generateAuthorityKey = function (state) {\r\n return AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.AUTHORITY, state);\r\n };\r\n /**\r\n * Generates the cache key for temporary cache items, using request state\r\n * @param tempCacheKey Cache key prefix\r\n * @param state Request state value\r\n */\r\n AuthCache.generateTemporaryCacheKey = function (tempCacheKey, state) {\r\n // Use the state id (a guid), in the interest of shorter key names, which is important for cookies.\r\n var stateId = RequestUtils.parseLibraryState(state).id;\r\n return \"\" + tempCacheKey + Constants.resourceDelimiter + stateId;\r\n };\r\n return AuthCache;\r\n}(BrowserStorage));\r\nexport { AuthCache };\r\n//# sourceMappingURL=AuthCache.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { CryptoUtils } from \"./utils/CryptoUtils\";\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\n/**\r\n * accountIdentifier combination of idToken.uid and idToken.utid\r\n * homeAccountIdentifier combination of clientInfo.uid and clientInfo.utid\r\n * userName idToken.preferred_username\r\n * name idToken.name\r\n * idToken idToken\r\n * sid idToken.sid - session identifier\r\n * environment idtoken.issuer (the authority that issues the token)\r\n */\r\nvar Account = /** @class */ (function () {\r\n /**\r\n * Creates an Account Object\r\n * @praram accountIdentifier\r\n * @param homeAccountIdentifier\r\n * @param userName\r\n * @param name\r\n * @param idToken\r\n * @param sid\r\n * @param environment\r\n */\r\n function Account(accountIdentifier, homeAccountIdentifier, userName, name, idTokenClaims, sid, environment) {\r\n this.accountIdentifier = accountIdentifier;\r\n this.homeAccountIdentifier = homeAccountIdentifier;\r\n this.userName = userName;\r\n this.name = name;\r\n // will be deprecated soon\r\n this.idToken = idTokenClaims;\r\n this.idTokenClaims = idTokenClaims;\r\n this.sid = sid;\r\n this.environment = environment;\r\n }\r\n /**\r\n * @hidden\r\n * @param idToken\r\n * @param clientInfo\r\n */\r\n Account.createAccount = function (idToken, clientInfo) {\r\n // create accountIdentifier\r\n var accountIdentifier = idToken.objectId || idToken.subject;\r\n // create homeAccountIdentifier\r\n var uid = clientInfo ? clientInfo.uid : \"\";\r\n var utid = clientInfo ? clientInfo.utid : \"\";\r\n var homeAccountIdentifier;\r\n if (!StringUtils.isEmpty(uid)) {\r\n homeAccountIdentifier = StringUtils.isEmpty(utid) ? CryptoUtils.base64Encode(uid) : CryptoUtils.base64Encode(uid) + \".\" + CryptoUtils.base64Encode(utid);\r\n }\r\n return new Account(accountIdentifier, homeAccountIdentifier, idToken.preferredName, idToken.name, idToken.claims, idToken.sid, idToken.issuer);\r\n };\r\n /**\r\n * Utils function to compare two Account objects - used to check if the same user account is logged in\r\n *\r\n * @param a1: Account object\r\n * @param a2: Account object\r\n */\r\n Account.compareAccounts = function (a1, a2) {\r\n if (!a1 || !a2) {\r\n return false;\r\n }\r\n if (a1.homeAccountIdentifier && a2.homeAccountIdentifier) {\r\n if (a1.homeAccountIdentifier === a2.homeAccountIdentifier) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n return Account;\r\n}());\r\nexport { Account };\r\n//# sourceMappingURL=Account.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { UrlUtils } from \"./UrlUtils\";\r\nimport { TemporaryCacheKeys, Constants } from \"./Constants\";\r\nimport { TimeUtils } from \"./TimeUtils\";\r\nvar WindowUtils = /** @class */ (function () {\r\n function WindowUtils() {\r\n }\r\n /**\r\n * @hidden\r\n * Checks if the current page is running in an iframe.\r\n * @ignore\r\n */\r\n WindowUtils.isInIframe = function () {\r\n return window.parent !== window;\r\n };\r\n /**\r\n * @hidden\r\n * Check if the current page is running in a popup.\r\n * @ignore\r\n */\r\n WindowUtils.isInPopup = function () {\r\n return !!(window.opener && window.opener !== window);\r\n };\r\n /**\r\n * @hidden\r\n * @param prefix\r\n * @param scopes\r\n * @param authority\r\n */\r\n WindowUtils.generateFrameName = function (prefix, requestSignature) {\r\n return \"\" + prefix + Constants.resourceDelimiter + requestSignature;\r\n };\r\n /**\r\n * @hidden\r\n * Polls an iframe until it loads a url with a hash\r\n * @ignore\r\n */\r\n WindowUtils.monitorIframeForHash = function (contentWindow, timeout, urlNavigate, logger) {\r\n return new Promise(function (resolve, reject) {\r\n /*\r\n * Polling for iframes can be purely timing based,\r\n * since we don't need to account for interaction.\r\n */\r\n var nowMark = TimeUtils.relativeNowMs();\r\n var timeoutMark = nowMark + timeout;\r\n logger.verbose(\"monitorWindowForIframe polling started\");\r\n var intervalId = setInterval(function () {\r\n if (TimeUtils.relativeNowMs() > timeoutMark) {\r\n logger.error(\"monitorIframeForHash unable to find hash in url, timing out\");\r\n logger.errorPii(\"monitorIframeForHash polling timed out for url: \" + urlNavigate);\r\n clearInterval(intervalId);\r\n reject(ClientAuthError.createTokenRenewalTimeoutError());\r\n return;\r\n }\r\n var href;\r\n try {\r\n /*\r\n * Will throw if cross origin,\r\n * which should be caught and ignored\r\n * since we need the interval to keep running while on STS UI.\r\n */\r\n href = contentWindow.location.href;\r\n }\r\n catch (e) { }\r\n if (href && UrlUtils.urlContainsHash(href)) {\r\n logger.verbose(\"monitorIframeForHash found url in hash\");\r\n clearInterval(intervalId);\r\n resolve(contentWindow.location.hash);\r\n }\r\n }, WindowUtils.POLLING_INTERVAL_MS);\r\n });\r\n };\r\n /**\r\n * @hidden\r\n * Polls a popup until it loads a url with a hash\r\n * @ignore\r\n */\r\n WindowUtils.monitorPopupForHash = function (contentWindow, timeout, urlNavigate, logger) {\r\n return new Promise(function (resolve, reject) {\r\n /*\r\n * Polling for popups needs to be tick-based,\r\n * since a non-trivial amount of time can be spent on interaction (which should not count against the timeout).\r\n */\r\n var maxTicks = timeout / WindowUtils.POLLING_INTERVAL_MS;\r\n var ticks = 0;\r\n logger.verbose(\"monitorWindowForHash polling started\");\r\n var intervalId = setInterval(function () {\r\n if (contentWindow.closed) {\r\n logger.error(\"monitorWindowForHash window closed\");\r\n clearInterval(intervalId);\r\n reject(ClientAuthError.createUserCancelledError());\r\n return;\r\n }\r\n var href;\r\n try {\r\n /*\r\n * Will throw if cross origin,\r\n * which should be caught and ignored\r\n * since we need the interval to keep running while on STS UI.\r\n */\r\n href = contentWindow.location.href;\r\n }\r\n catch (e) { }\r\n // Don't process blank pages or cross domain\r\n if (!href || href === \"about:blank\") {\r\n return;\r\n }\r\n /*\r\n * Only run clock when we are on same domain for popups\r\n * as popup operations can take a long time.\r\n */\r\n ticks++;\r\n if (href && UrlUtils.urlContainsHash(href)) {\r\n logger.verbose(\"monitorPopupForHash found url in hash\");\r\n clearInterval(intervalId);\r\n var hash = contentWindow.location.hash;\r\n WindowUtils.clearUrlFragment(contentWindow);\r\n resolve(hash);\r\n }\r\n else if (ticks > maxTicks) {\r\n logger.error(\"monitorPopupForHash unable to find hash in url, timing out\");\r\n logger.errorPii(\"monitorPopupForHash polling timed out for url: \" + urlNavigate);\r\n clearInterval(intervalId);\r\n reject(ClientAuthError.createTokenRenewalTimeoutError());\r\n }\r\n }, WindowUtils.POLLING_INTERVAL_MS);\r\n });\r\n };\r\n /**\r\n * @hidden\r\n * Loads iframe with authorization endpoint URL\r\n * @ignore\r\n */\r\n WindowUtils.loadFrame = function (urlNavigate, frameName, timeoutMs, logger) {\r\n var _this = this;\r\n /*\r\n * This trick overcomes iframe navigation in IE\r\n * IE does not load the page consistently in iframe\r\n */\r\n logger.infoPii(\"LoadFrame: \" + frameName);\r\n return new Promise(function (resolve, reject) {\r\n setTimeout(function () {\r\n var frameHandle = _this.loadFrameSync(urlNavigate, frameName, logger);\r\n if (!frameHandle) {\r\n reject(\"Unable to load iframe with name: \" + frameName);\r\n return;\r\n }\r\n resolve(frameHandle);\r\n }, timeoutMs);\r\n });\r\n };\r\n /**\r\n * @hidden\r\n * Loads the iframe synchronously when the navigateTimeFrame is set to `0`\r\n * @param urlNavigate\r\n * @param frameName\r\n * @param logger\r\n */\r\n WindowUtils.loadFrameSync = function (urlNavigate, frameName, logger) {\r\n var frameHandle = WindowUtils.addHiddenIFrame(frameName, logger);\r\n // returning to handle null in loadFrame, also to avoid null object access errors\r\n if (!frameHandle) {\r\n return null;\r\n }\r\n else if (frameHandle.src === \"\" || frameHandle.src === \"about:blank\") {\r\n frameHandle.src = urlNavigate;\r\n logger.infoPii(\"Frame Name : \" + frameName + \" Navigated to: \" + urlNavigate);\r\n }\r\n return frameHandle;\r\n };\r\n /**\r\n * @hidden\r\n * Adds the hidden iframe for silent token renewal.\r\n * @ignore\r\n */\r\n WindowUtils.addHiddenIFrame = function (iframeId, logger) {\r\n if (typeof iframeId === \"undefined\") {\r\n return null;\r\n }\r\n logger.infoPii(\"Add msal frame to document:\" + iframeId);\r\n var adalFrame = document.getElementById(iframeId);\r\n if (!adalFrame) {\r\n if (document.createElement &&\r\n document.documentElement &&\r\n (window.navigator.userAgent.indexOf(\"MSIE 5.0\") === -1)) {\r\n var ifr = document.createElement(\"iframe\");\r\n ifr.setAttribute(\"id\", iframeId);\r\n ifr.setAttribute(\"aria-hidden\", \"true\");\r\n ifr.style.visibility = \"hidden\";\r\n ifr.style.position = \"absolute\";\r\n ifr.style.width = ifr.style.height = \"0\";\r\n ifr.style.border = \"0\";\r\n ifr.setAttribute(\"sandbox\", \"allow-scripts allow-same-origin allow-forms\");\r\n adalFrame = document.getElementsByTagName(\"body\")[0].appendChild(ifr);\r\n }\r\n else if (document.body && document.body.insertAdjacentHTML) {\r\n document.body.insertAdjacentHTML(\"beforeend\", \"\");\r\n }\r\n if (window.frames && window.frames[iframeId]) {\r\n adalFrame = window.frames[iframeId];\r\n }\r\n }\r\n return adalFrame;\r\n };\r\n /**\r\n * @hidden\r\n * Removes a hidden iframe from the page.\r\n * @ignore\r\n */\r\n WindowUtils.removeHiddenIframe = function (iframe) {\r\n if (document.body === iframe.parentNode) {\r\n document.body.removeChild(iframe);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * Find and return the iframe element with the given hash\r\n * @ignore\r\n */\r\n WindowUtils.getIframeWithHash = function (hash) {\r\n var iframes = document.getElementsByTagName(\"iframe\");\r\n var iframeArray = Array.apply(null, Array(iframes.length)).map(function (iframe, index) { return iframes.item(index); }); // eslint-disable-line prefer-spread\r\n return iframeArray.filter(function (iframe) {\r\n try {\r\n return iframe.contentWindow.location.hash === hash;\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n })[0];\r\n };\r\n /**\r\n * @hidden\r\n * Returns an array of all the popups opened by MSAL\r\n * @ignore\r\n */\r\n WindowUtils.getPopups = function () {\r\n if (!window.openedWindows) {\r\n window.openedWindows = [];\r\n }\r\n return window.openedWindows;\r\n };\r\n /**\r\n * @hidden\r\n * Find and return the popup with the given hash\r\n * @ignore\r\n */\r\n WindowUtils.getPopUpWithHash = function (hash) {\r\n return WindowUtils.getPopups().filter(function (popup) {\r\n try {\r\n return popup.location.hash === hash;\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n })[0];\r\n };\r\n /**\r\n * @hidden\r\n * Add the popup to the known list of popups\r\n * @ignore\r\n */\r\n WindowUtils.trackPopup = function (popup) {\r\n WindowUtils.getPopups().push(popup);\r\n };\r\n /**\r\n * @hidden\r\n * Close all popups\r\n * @ignore\r\n */\r\n WindowUtils.closePopups = function () {\r\n WindowUtils.getPopups().forEach(function (popup) { return popup.close(); });\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * blocks any login/acquireToken calls to reload from within a hidden iframe (generated for silent calls)\r\n */\r\n WindowUtils.blockReloadInHiddenIframes = function () {\r\n // return an error if called from the hidden iframe created by the msal js silent calls\r\n if (UrlUtils.urlContainsHash(window.location.hash) && WindowUtils.isInIframe()) {\r\n throw ClientAuthError.createBlockTokenRequestsInHiddenIframeError();\r\n }\r\n };\r\n /**\r\n *\r\n * @param cacheStorage\r\n */\r\n WindowUtils.checkIfBackButtonIsPressed = function (cacheStorage) {\r\n var redirectCache = cacheStorage.getItem(TemporaryCacheKeys.REDIRECT_REQUEST);\r\n // if redirect request is set and there is no hash\r\n if (redirectCache && !UrlUtils.urlContainsHash(window.location.hash)) {\r\n var splitCache = redirectCache.split(Constants.resourceDelimiter);\r\n splitCache.shift();\r\n var state = splitCache.length > 0 ? splitCache.join(Constants.resourceDelimiter) : null;\r\n cacheStorage.resetTempCacheItems(state);\r\n }\r\n };\r\n /**\r\n * Removes url fragment from browser url\r\n */\r\n WindowUtils.clearUrlFragment = function (contentWindow) {\r\n contentWindow.location.hash = \"\";\r\n // Office.js sets history.replaceState to null\r\n if (typeof contentWindow.history.replaceState === \"function\") {\r\n // Full removes \"#\" from url\r\n contentWindow.history.replaceState(null, null, \"\" + contentWindow.location.pathname + contentWindow.location.search);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * Interval in milliseconds that we poll a window\r\n * @ignore\r\n */\r\n WindowUtils.POLLING_INTERVAL_MS = 50;\r\n return WindowUtils;\r\n}());\r\nexport { WindowUtils };\r\n//# sourceMappingURL=WindowUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { ResponseTypes, ServerHashParamKeys } from \"./Constants\";\r\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nvar ResponseUtils = /** @class */ (function () {\r\n function ResponseUtils() {\r\n }\r\n ResponseUtils.setResponseIdToken = function (originalResponse, idTokenObj) {\r\n if (!originalResponse) {\r\n return null;\r\n }\r\n else if (!idTokenObj) {\r\n return originalResponse;\r\n }\r\n var exp = Number(idTokenObj.expiration);\r\n if (exp && !originalResponse.expiresOn) {\r\n originalResponse.expiresOn = new Date(exp * 1000);\r\n }\r\n return tslib_1.__assign({}, originalResponse, { idToken: idTokenObj, idTokenClaims: idTokenObj.claims, uniqueId: idTokenObj.objectId || idTokenObj.subject, tenantId: idTokenObj.tenantId });\r\n };\r\n ResponseUtils.buildAuthResponse = function (idToken, authResponse, serverAuthenticationRequest, account, scopes, accountState) {\r\n switch (serverAuthenticationRequest.responseType) {\r\n case ResponseTypes.id_token:\r\n authResponse = tslib_1.__assign({}, authResponse, { tokenType: ServerHashParamKeys.ID_TOKEN, account: account, scopes: scopes, accountState: accountState });\r\n authResponse = ResponseUtils.setResponseIdToken(authResponse, idToken);\r\n return (authResponse.idToken) ? authResponse : null;\r\n case ResponseTypes.id_token_token:\r\n authResponse = ResponseUtils.setResponseIdToken(authResponse, idToken);\r\n return (authResponse && authResponse.accessToken && authResponse.idToken) ? authResponse : null;\r\n case ResponseTypes.token:\r\n authResponse = ResponseUtils.setResponseIdToken(authResponse, idToken);\r\n return authResponse;\r\n default:\r\n return null;\r\n }\r\n };\r\n return ResponseUtils;\r\n}());\r\nexport { ResponseUtils };\r\n//# sourceMappingURL=ResponseUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\n/**\r\n * @hidden\r\n */\r\nimport { Authority } from \"./Authority\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nvar AuthorityFactory = /** @class */ (function () {\r\n function AuthorityFactory() {\r\n }\r\n AuthorityFactory.saveMetadataFromNetwork = function (authorityInstance, telemetryManager, correlationId) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var metadata;\r\n return tslib_1.__generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, authorityInstance.resolveEndpointsAsync(telemetryManager, correlationId)];\r\n case 1:\r\n metadata = _a.sent();\r\n this.metadataMap.set(authorityInstance.CanonicalAuthority, metadata);\r\n return [2 /*return*/, metadata];\r\n }\r\n });\r\n });\r\n };\r\n AuthorityFactory.getMetadata = function (authorityUrl) {\r\n return this.metadataMap.get(authorityUrl);\r\n };\r\n AuthorityFactory.saveMetadataFromConfig = function (authorityUrl, authorityMetadataJson) {\r\n try {\r\n if (authorityMetadataJson) {\r\n var parsedMetadata = JSON.parse(authorityMetadataJson);\r\n if (!parsedMetadata.authorization_endpoint || !parsedMetadata.end_session_endpoint || !parsedMetadata.issuer) {\r\n throw ClientConfigurationError.createInvalidAuthorityMetadataError();\r\n }\r\n this.metadataMap.set(authorityUrl, {\r\n AuthorizationEndpoint: parsedMetadata.authorization_endpoint,\r\n EndSessionEndpoint: parsedMetadata.end_session_endpoint,\r\n Issuer: parsedMetadata.issuer\r\n });\r\n }\r\n }\r\n catch (e) {\r\n throw ClientConfigurationError.createInvalidAuthorityMetadataError();\r\n }\r\n };\r\n /**\r\n * Create an authority object of the correct type based on the url\r\n * Performs basic authority validation - checks to see if the authority is of a valid type (eg aad, b2c)\r\n */\r\n AuthorityFactory.CreateInstance = function (authorityUrl, validateAuthority, authorityMetadata) {\r\n if (StringUtils.isEmpty(authorityUrl)) {\r\n return null;\r\n }\r\n if (authorityMetadata) {\r\n // todo: log statements\r\n this.saveMetadataFromConfig(authorityUrl, authorityMetadata);\r\n }\r\n return new Authority(authorityUrl, validateAuthority, this.metadataMap.get(authorityUrl));\r\n };\r\n AuthorityFactory.metadataMap = new Map();\r\n return AuthorityFactory;\r\n}());\r\nexport { AuthorityFactory };\r\n//# sourceMappingURL=AuthorityFactory.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { Logger } from \"./Logger\";\r\nimport { UrlUtils } from \"./utils/UrlUtils\";\r\n/**\r\n * Defaults for the Configuration Options\r\n */\r\nvar FRAME_TIMEOUT = 6000;\r\nvar OFFSET = 300;\r\nvar NAVIGATE_FRAME_WAIT = 500;\r\nvar DEFAULT_AUTH_OPTIONS = {\r\n clientId: \"\",\r\n authority: null,\r\n validateAuthority: true,\r\n authorityMetadata: \"\",\r\n knownAuthorities: [],\r\n redirectUri: function () { return UrlUtils.getCurrentUrl(); },\r\n postLogoutRedirectUri: function () { return UrlUtils.getCurrentUrl(); },\r\n navigateToLoginRequestUrl: true\r\n};\r\nvar DEFAULT_CACHE_OPTIONS = {\r\n cacheLocation: \"sessionStorage\",\r\n storeAuthStateInCookie: false\r\n};\r\nvar DEFAULT_SYSTEM_OPTIONS = {\r\n logger: new Logger(null),\r\n loadFrameTimeout: FRAME_TIMEOUT,\r\n tokenRenewalOffsetSeconds: OFFSET,\r\n navigateFrameWait: NAVIGATE_FRAME_WAIT\r\n};\r\nvar DEFAULT_FRAMEWORK_OPTIONS = {\r\n isAngular: false,\r\n unprotectedResources: new Array(),\r\n protectedResourceMap: new Map()\r\n};\r\n/**\r\n * MSAL function that sets the default options when not explicitly configured from app developer\r\n *\r\n * @param TAuthOptions\r\n * @param TCacheOptions\r\n * @param TSystemOptions\r\n * @param TFrameworkOptions\r\n * @param TAuthorityDataOptions\r\n *\r\n * @returns TConfiguration object\r\n */\r\nexport function buildConfiguration(_a) {\r\n var auth = _a.auth, _b = _a.cache, cache = _b === void 0 ? {} : _b, _c = _a.system, system = _c === void 0 ? {} : _c, _d = _a.framework, framework = _d === void 0 ? {} : _d;\r\n var overlayedConfig = {\r\n auth: tslib_1.__assign({}, DEFAULT_AUTH_OPTIONS, auth),\r\n cache: tslib_1.__assign({}, DEFAULT_CACHE_OPTIONS, cache),\r\n system: tslib_1.__assign({}, DEFAULT_SYSTEM_OPTIONS, system),\r\n framework: tslib_1.__assign({}, DEFAULT_FRAMEWORK_OPTIONS, framework)\r\n };\r\n return overlayedConfig;\r\n}\r\n//# sourceMappingURL=Configuration.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { AuthError } from \"./AuthError\";\r\nexport var ServerErrorMessage = {\r\n serverUnavailable: {\r\n code: \"server_unavailable\",\r\n desc: \"Server is temporarily unavailable.\"\r\n },\r\n unknownServerError: {\r\n code: \"unknown_server_error\"\r\n },\r\n};\r\n/**\r\n * Error thrown when there is an error with the server code, for example, unavailability.\r\n */\r\nvar ServerError = /** @class */ (function (_super) {\r\n tslib_1.__extends(ServerError, _super);\r\n function ServerError(errorCode, errorMessage) {\r\n var _this = _super.call(this, errorCode, errorMessage) || this;\r\n _this.name = \"ServerError\";\r\n Object.setPrototypeOf(_this, ServerError.prototype);\r\n return _this;\r\n }\r\n ServerError.createServerUnavailableError = function () {\r\n return new ServerError(ServerErrorMessage.serverUnavailable.code, ServerErrorMessage.serverUnavailable.desc);\r\n };\r\n ServerError.createUnknownServerError = function (errorDesc) {\r\n return new ServerError(ServerErrorMessage.unknownServerError.code, errorDesc);\r\n };\r\n return ServerError;\r\n}(AuthError));\r\nexport { ServerError };\r\n//# sourceMappingURL=ServerError.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { ServerError } from \"./ServerError\";\r\nexport var InteractionRequiredAuthErrorMessage = {\r\n interactionRequired: {\r\n code: \"interaction_required\"\r\n },\r\n consentRequired: {\r\n code: \"consent_required\"\r\n },\r\n loginRequired: {\r\n code: \"login_required\"\r\n },\r\n};\r\n/**\r\n * Error thrown when the user is required to perform an interactive token request.\r\n */\r\nvar InteractionRequiredAuthError = /** @class */ (function (_super) {\r\n tslib_1.__extends(InteractionRequiredAuthError, _super);\r\n function InteractionRequiredAuthError(errorCode, errorMessage) {\r\n var _this = _super.call(this, errorCode, errorMessage) || this;\r\n _this.name = \"InteractionRequiredAuthError\";\r\n Object.setPrototypeOf(_this, InteractionRequiredAuthError.prototype);\r\n return _this;\r\n }\r\n InteractionRequiredAuthError.isInteractionRequiredError = function (errorString) {\r\n var interactionRequiredCodes = [\r\n InteractionRequiredAuthErrorMessage.interactionRequired.code,\r\n InteractionRequiredAuthErrorMessage.consentRequired.code,\r\n InteractionRequiredAuthErrorMessage.loginRequired.code\r\n ];\r\n return errorString && interactionRequiredCodes.indexOf(errorString) > -1;\r\n };\r\n InteractionRequiredAuthError.createLoginRequiredAuthError = function (errorDesc) {\r\n return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.loginRequired.code, errorDesc);\r\n };\r\n InteractionRequiredAuthError.createInteractionRequiredAuthError = function (errorDesc) {\r\n return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.interactionRequired.code, errorDesc);\r\n };\r\n InteractionRequiredAuthError.createConsentRequiredAuthError = function (errorDesc) {\r\n return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.consentRequired.code, errorDesc);\r\n };\r\n return InteractionRequiredAuthError;\r\n}(ServerError));\r\nexport { InteractionRequiredAuthError };\r\n//# sourceMappingURL=InteractionRequiredAuthError.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nexport function buildResponseStateOnly(state) {\r\n return {\r\n uniqueId: \"\",\r\n tenantId: \"\",\r\n tokenType: \"\",\r\n idToken: null,\r\n idTokenClaims: null,\r\n accessToken: \"\",\r\n scopes: null,\r\n expiresOn: null,\r\n account: null,\r\n accountState: state,\r\n fromCache: false\r\n };\r\n}\r\n//# sourceMappingURL=AuthResponse.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nexport var EVENT_NAME_PREFIX = \"msal.\";\r\nexport var EVENT_NAME_KEY = \"event_name\";\r\nexport var START_TIME_KEY = \"start_time\";\r\nexport var ELAPSED_TIME_KEY = \"elapsed_time\";\r\nexport var TELEMETRY_BLOB_EVENT_NAMES = {\r\n MsalCorrelationIdConstStrKey: \"Microsoft.MSAL.correlation_id\",\r\n ApiTelemIdConstStrKey: \"msal.api_telem_id\",\r\n ApiIdConstStrKey: \"msal.api_id\",\r\n BrokerAppConstStrKey: \"Microsoft_MSAL_broker_app\",\r\n CacheEventCountConstStrKey: \"Microsoft_MSAL_cache_event_count\",\r\n HttpEventCountTelemetryBatchKey: \"Microsoft_MSAL_http_event_count\",\r\n IdpConstStrKey: \"Microsoft_MSAL_idp\",\r\n IsSilentTelemetryBatchKey: \"\",\r\n IsSuccessfulConstStrKey: \"Microsoft_MSAL_is_successful\",\r\n ResponseTimeConstStrKey: \"Microsoft_MSAL_response_time\",\r\n TenantIdConstStrKey: \"Microsoft_MSAL_tenant_id\",\r\n UiEventCountTelemetryBatchKey: \"Microsoft_MSAL_ui_event_count\"\r\n};\r\n// This is used to replace the real tenant in telemetry info\r\nexport var TENANT_PLACEHOLDER = \"\";\r\n//# sourceMappingURL=TelemetryConstants.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nvar _a;\r\nimport * as tslib_1 from \"tslib\";\r\nimport TelemetryEvent from \"./TelemetryEvent\";\r\nimport { TELEMETRY_BLOB_EVENT_NAMES } from \"./TelemetryConstants\";\r\nimport { scrubTenantFromUri, hashPersonalIdentifier, prependEventNamePrefix } from \"./TelemetryUtils\";\r\nexport var EVENT_KEYS = {\r\n AUTHORITY: prependEventNamePrefix(\"authority\"),\r\n AUTHORITY_TYPE: prependEventNamePrefix(\"authority_type\"),\r\n PROMPT: prependEventNamePrefix(\"ui_behavior\"),\r\n TENANT_ID: prependEventNamePrefix(\"tenant_id\"),\r\n USER_ID: prependEventNamePrefix(\"user_id\"),\r\n WAS_SUCESSFUL: prependEventNamePrefix(\"was_successful\"),\r\n API_ERROR_CODE: prependEventNamePrefix(\"api_error_code\"),\r\n LOGIN_HINT: prependEventNamePrefix(\"login_hint\")\r\n};\r\nexport var API_CODE;\r\n(function (API_CODE) {\r\n API_CODE[API_CODE[\"AcquireTokenRedirect\"] = 2001] = \"AcquireTokenRedirect\";\r\n API_CODE[API_CODE[\"AcquireTokenSilent\"] = 2002] = \"AcquireTokenSilent\";\r\n API_CODE[API_CODE[\"AcquireTokenPopup\"] = 2003] = \"AcquireTokenPopup\";\r\n API_CODE[API_CODE[\"LoginRedirect\"] = 2004] = \"LoginRedirect\";\r\n API_CODE[API_CODE[\"LoginPopup\"] = 2005] = \"LoginPopup\";\r\n API_CODE[API_CODE[\"Logout\"] = 2006] = \"Logout\";\r\n})(API_CODE || (API_CODE = {}));\r\nexport var API_EVENT_IDENTIFIER;\r\n(function (API_EVENT_IDENTIFIER) {\r\n API_EVENT_IDENTIFIER[\"AcquireTokenRedirect\"] = \"AcquireTokenRedirect\";\r\n API_EVENT_IDENTIFIER[\"AcquireTokenSilent\"] = \"AcquireTokenSilent\";\r\n API_EVENT_IDENTIFIER[\"AcquireTokenPopup\"] = \"AcquireTokenPopup\";\r\n API_EVENT_IDENTIFIER[\"LoginRedirect\"] = \"LoginRedirect\";\r\n API_EVENT_IDENTIFIER[\"LoginPopup\"] = \"LoginPopup\";\r\n API_EVENT_IDENTIFIER[\"Logout\"] = \"Logout\";\r\n})(API_EVENT_IDENTIFIER || (API_EVENT_IDENTIFIER = {}));\r\nvar mapEventIdentiferToCode = (_a = {},\r\n _a[API_EVENT_IDENTIFIER.AcquireTokenSilent] = API_CODE.AcquireTokenSilent,\r\n _a[API_EVENT_IDENTIFIER.AcquireTokenPopup] = API_CODE.AcquireTokenPopup,\r\n _a[API_EVENT_IDENTIFIER.AcquireTokenRedirect] = API_CODE.AcquireTokenRedirect,\r\n _a[API_EVENT_IDENTIFIER.LoginPopup] = API_CODE.LoginPopup,\r\n _a[API_EVENT_IDENTIFIER.LoginRedirect] = API_CODE.LoginRedirect,\r\n _a[API_EVENT_IDENTIFIER.Logout] = API_CODE.Logout,\r\n _a);\r\nvar ApiEvent = /** @class */ (function (_super) {\r\n tslib_1.__extends(ApiEvent, _super);\r\n function ApiEvent(correlationId, piiEnabled, apiEventIdentifier) {\r\n var _this = _super.call(this, prependEventNamePrefix(\"api_event\"), correlationId, apiEventIdentifier) || this;\r\n if (apiEventIdentifier) {\r\n _this.apiCode = mapEventIdentiferToCode[apiEventIdentifier];\r\n _this.apiEventIdentifier = apiEventIdentifier;\r\n }\r\n _this.piiEnabled = piiEnabled;\r\n return _this;\r\n }\r\n Object.defineProperty(ApiEvent.prototype, \"apiEventIdentifier\", {\r\n set: function (apiEventIdentifier) {\r\n this.event[TELEMETRY_BLOB_EVENT_NAMES.ApiTelemIdConstStrKey] = apiEventIdentifier;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"apiCode\", {\r\n set: function (apiCode) {\r\n this.event[TELEMETRY_BLOB_EVENT_NAMES.ApiIdConstStrKey] = apiCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"authority\", {\r\n set: function (uri) {\r\n this.event[EVENT_KEYS.AUTHORITY] = scrubTenantFromUri(uri).toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"apiErrorCode\", {\r\n set: function (errorCode) {\r\n this.event[EVENT_KEYS.API_ERROR_CODE] = errorCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"tenantId\", {\r\n set: function (tenantId) {\r\n this.event[EVENT_KEYS.TENANT_ID] = this.piiEnabled && tenantId ?\r\n hashPersonalIdentifier(tenantId)\r\n : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"accountId\", {\r\n set: function (accountId) {\r\n this.event[EVENT_KEYS.USER_ID] = this.piiEnabled && accountId ?\r\n hashPersonalIdentifier(accountId)\r\n : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"wasSuccessful\", {\r\n get: function () {\r\n return this.event[EVENT_KEYS.WAS_SUCESSFUL] === true;\r\n },\r\n set: function (wasSuccessful) {\r\n this.event[EVENT_KEYS.WAS_SUCESSFUL] = wasSuccessful;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"loginHint\", {\r\n set: function (loginHint) {\r\n this.event[EVENT_KEYS.LOGIN_HINT] = this.piiEnabled && loginHint ?\r\n hashPersonalIdentifier(loginHint)\r\n : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"authorityType\", {\r\n set: function (authorityType) {\r\n this.event[EVENT_KEYS.AUTHORITY_TYPE] = authorityType.toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ApiEvent.prototype, \"promptType\", {\r\n set: function (promptType) {\r\n this.event[EVENT_KEYS.PROMPT] = promptType.toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return ApiEvent;\r\n}(TelemetryEvent));\r\nexport default ApiEvent;\r\n//# sourceMappingURL=ApiEvent.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { TENANT_PLACEHOLDER, EVENT_NAME_PREFIX } from \"./TelemetryConstants\";\r\nimport { CryptoUtils } from \"../utils/CryptoUtils\";\r\nimport { UrlUtils } from \"../utils/UrlUtils\";\r\nimport { Authority } from \"../authority/Authority\";\r\nexport var scrubTenantFromUri = function (uri) {\r\n var url = UrlUtils.GetUrlComponents(uri);\r\n // validate trusted host\r\n if (Authority.isAdfs(uri)) {\r\n /**\r\n * returning what was passed because the library needs to work with uris that are non\r\n * AAD trusted but passed by users such as B2C or others.\r\n * HTTP Events for instance can take a url to the open id config endpoint\r\n */\r\n return uri;\r\n }\r\n var pathParams = url.PathSegments;\r\n if (pathParams && pathParams.length >= 2) {\r\n var tenantPosition = pathParams[1] === \"tfp\" ? 2 : 1;\r\n if (tenantPosition < pathParams.length) {\r\n pathParams[tenantPosition] = TENANT_PLACEHOLDER;\r\n }\r\n }\r\n return url.Protocol + \"//\" + url.HostNameAndPort + \"/\" + pathParams.join(\"/\");\r\n};\r\nexport var hashPersonalIdentifier = function (valueToHash) {\r\n /*\r\n * TODO sha256 this\r\n * Current test runner is being funny with node libs that are webpacked anyway\r\n * need a different solution\r\n */\r\n return CryptoUtils.base64Encode(valueToHash);\r\n};\r\nexport var prependEventNamePrefix = function (suffix) { return \"\" + EVENT_NAME_PREFIX + (suffix || \"\"); };\r\nexport var supportsBrowserPerformance = function () { return !!(typeof window !== \"undefined\" &&\r\n \"performance\" in window &&\r\n window.performance.mark &&\r\n window.performance.measure); };\r\nexport var endBrowserPerformanceMeasurement = function (measureName, startMark, endMark) {\r\n if (supportsBrowserPerformance()) {\r\n window.performance.mark(endMark);\r\n window.performance.measure(measureName, startMark, endMark);\r\n window.performance.clearMeasures(measureName);\r\n window.performance.clearMarks(startMark);\r\n window.performance.clearMarks(endMark);\r\n }\r\n};\r\nexport var startBrowserPerformanceMeasurement = function (startMark) {\r\n if (supportsBrowserPerformance()) {\r\n window.performance.mark(startMark);\r\n }\r\n};\r\n//# sourceMappingURL=TelemetryUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { TELEMETRY_BLOB_EVENT_NAMES, EVENT_NAME_KEY, START_TIME_KEY, ELAPSED_TIME_KEY } from \"./TelemetryConstants\";\r\nimport { prependEventNamePrefix, startBrowserPerformanceMeasurement, endBrowserPerformanceMeasurement } from \"./TelemetryUtils\";\r\nimport { CryptoUtils } from \"../utils/CryptoUtils\";\r\nvar TelemetryEvent = /** @class */ (function () {\r\n function TelemetryEvent(eventName, correlationId, eventLabel) {\r\n var _a;\r\n this.eventId = CryptoUtils.createNewGuid();\r\n this.label = eventLabel;\r\n this.event = (_a = {},\r\n _a[prependEventNamePrefix(EVENT_NAME_KEY)] = eventName,\r\n _a[prependEventNamePrefix(ELAPSED_TIME_KEY)] = -1,\r\n _a[\"\" + TELEMETRY_BLOB_EVENT_NAMES.MsalCorrelationIdConstStrKey] = correlationId,\r\n _a);\r\n }\r\n TelemetryEvent.prototype.setElapsedTime = function (time) {\r\n this.event[prependEventNamePrefix(ELAPSED_TIME_KEY)] = time;\r\n };\r\n TelemetryEvent.prototype.stop = function () {\r\n // Set duration of event\r\n this.setElapsedTime(+Date.now() - +this.startTimestamp);\r\n endBrowserPerformanceMeasurement(this.displayName, this.perfStartMark, this.perfEndMark);\r\n };\r\n TelemetryEvent.prototype.start = function () {\r\n this.startTimestamp = Date.now();\r\n this.event[prependEventNamePrefix(START_TIME_KEY)] = this.startTimestamp;\r\n startBrowserPerformanceMeasurement(this.perfStartMark);\r\n };\r\n Object.defineProperty(TelemetryEvent.prototype, \"telemetryCorrelationId\", {\r\n get: function () {\r\n return this.event[\"\" + TELEMETRY_BLOB_EVENT_NAMES.MsalCorrelationIdConstStrKey];\r\n },\r\n set: function (value) {\r\n this.event[\"\" + TELEMETRY_BLOB_EVENT_NAMES.MsalCorrelationIdConstStrKey] = value;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(TelemetryEvent.prototype, \"eventName\", {\r\n get: function () {\r\n return this.event[prependEventNamePrefix(EVENT_NAME_KEY)];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n TelemetryEvent.prototype.get = function () {\r\n return tslib_1.__assign({}, this.event, { eventId: this.eventId });\r\n };\r\n Object.defineProperty(TelemetryEvent.prototype, \"key\", {\r\n get: function () {\r\n return this.telemetryCorrelationId + \"_\" + this.eventId + \"-\" + this.eventName;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(TelemetryEvent.prototype, \"displayName\", {\r\n get: function () {\r\n return \"Msal-\" + this.label + \"-\" + this.telemetryCorrelationId;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(TelemetryEvent.prototype, \"perfStartMark\", {\r\n get: function () {\r\n return \"start-\" + this.key;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(TelemetryEvent.prototype, \"perfEndMark\", {\r\n get: function () {\r\n return \"end-\" + this.key;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return TelemetryEvent;\r\n}());\r\nexport default TelemetryEvent;\r\n//# sourceMappingURL=TelemetryEvent.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { TELEMETRY_BLOB_EVENT_NAMES } from \"./TelemetryConstants\";\r\nimport TelemetryEvent from \"./TelemetryEvent\";\r\nimport { prependEventNamePrefix } from \"./TelemetryUtils\";\r\nvar DefaultEvent = /** @class */ (function (_super) {\r\n tslib_1.__extends(DefaultEvent, _super);\r\n // TODO Platform Type\r\n function DefaultEvent(platform, correlationId, clientId, eventCount) {\r\n var _this = _super.call(this, prependEventNamePrefix(\"default_event\"), correlationId, \"DefaultEvent\") || this;\r\n _this.event[prependEventNamePrefix(\"client_id\")] = clientId;\r\n _this.event[prependEventNamePrefix(\"sdk_plaform\")] = platform.sdk;\r\n _this.event[prependEventNamePrefix(\"sdk_version\")] = platform.sdkVersion;\r\n _this.event[prependEventNamePrefix(\"application_name\")] = platform.applicationName;\r\n _this.event[prependEventNamePrefix(\"application_version\")] = platform.applicationVersion;\r\n _this.event[prependEventNamePrefix(\"effective_connection_speed\")] = platform.networkInformation && platform.networkInformation.connectionSpeed;\r\n _this.event[\"\" + TELEMETRY_BLOB_EVENT_NAMES.UiEventCountTelemetryBatchKey] = _this.getEventCount(prependEventNamePrefix(\"ui_event\"), eventCount);\r\n _this.event[\"\" + TELEMETRY_BLOB_EVENT_NAMES.HttpEventCountTelemetryBatchKey] = _this.getEventCount(prependEventNamePrefix(\"http_event\"), eventCount);\r\n _this.event[\"\" + TELEMETRY_BLOB_EVENT_NAMES.CacheEventCountConstStrKey] = _this.getEventCount(prependEventNamePrefix(\"cache_event\"), eventCount);\r\n return _this;\r\n // / Device id?\r\n }\r\n DefaultEvent.prototype.getEventCount = function (eventName, eventCount) {\r\n if (!eventCount[eventName]) {\r\n return 0;\r\n }\r\n return eventCount[eventName];\r\n };\r\n return DefaultEvent;\r\n}(TelemetryEvent));\r\nexport default DefaultEvent;\r\n//# sourceMappingURL=DefaultEvent.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport TelemetryEvent from \"./TelemetryEvent\";\r\nimport { scrubTenantFromUri, prependEventNamePrefix } from \"./TelemetryUtils\";\r\nimport { ServerRequestParameters } from \"../ServerRequestParameters\";\r\nexport var EVENT_KEYS = {\r\n HTTP_PATH: prependEventNamePrefix(\"http_path\"),\r\n USER_AGENT: prependEventNamePrefix(\"user_agent\"),\r\n QUERY_PARAMETERS: prependEventNamePrefix(\"query_parameters\"),\r\n API_VERSION: prependEventNamePrefix(\"api_version\"),\r\n RESPONSE_CODE: prependEventNamePrefix(\"response_code\"),\r\n O_AUTH_ERROR_CODE: prependEventNamePrefix(\"oauth_error_code\"),\r\n HTTP_METHOD: prependEventNamePrefix(\"http_method\"),\r\n REQUEST_ID_HEADER: prependEventNamePrefix(\"request_id_header\"),\r\n SPE_INFO: prependEventNamePrefix(\"spe_info\"),\r\n SERVER_ERROR_CODE: prependEventNamePrefix(\"server_error_code\"),\r\n SERVER_SUB_ERROR_CODE: prependEventNamePrefix(\"server_sub_error_code\"),\r\n URL: prependEventNamePrefix(\"url\")\r\n};\r\nvar HttpEvent = /** @class */ (function (_super) {\r\n tslib_1.__extends(HttpEvent, _super);\r\n function HttpEvent(correlationId, eventLabel) {\r\n return _super.call(this, prependEventNamePrefix(\"http_event\"), correlationId, eventLabel) || this;\r\n }\r\n Object.defineProperty(HttpEvent.prototype, \"url\", {\r\n set: function (url) {\r\n var scrubbedUri = scrubTenantFromUri(url);\r\n this.event[EVENT_KEYS.URL] = scrubbedUri && scrubbedUri.toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"httpPath\", {\r\n set: function (httpPath) {\r\n this.event[EVENT_KEYS.HTTP_PATH] = scrubTenantFromUri(httpPath).toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"userAgent\", {\r\n set: function (userAgent) {\r\n this.event[EVENT_KEYS.USER_AGENT] = userAgent;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"queryParams\", {\r\n set: function (queryParams) {\r\n this.event[EVENT_KEYS.QUERY_PARAMETERS] = ServerRequestParameters.generateQueryParametersString(queryParams);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"apiVersion\", {\r\n set: function (apiVersion) {\r\n this.event[EVENT_KEYS.API_VERSION] = apiVersion.toLowerCase();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"httpResponseStatus\", {\r\n set: function (statusCode) {\r\n this.event[EVENT_KEYS.RESPONSE_CODE] = statusCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"oAuthErrorCode\", {\r\n set: function (errorCode) {\r\n this.event[EVENT_KEYS.O_AUTH_ERROR_CODE] = errorCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"httpMethod\", {\r\n set: function (httpMethod) {\r\n this.event[EVENT_KEYS.HTTP_METHOD] = httpMethod;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"requestIdHeader\", {\r\n set: function (requestIdHeader) {\r\n this.event[EVENT_KEYS.REQUEST_ID_HEADER] = requestIdHeader;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"speInfo\", {\r\n /**\r\n * Indicates whether the request was executed on a ring serving SPE traffic.\r\n * An empty string indicates this occurred on an outer ring, and the string \"I\"\r\n * indicates the request occurred on the inner ring\r\n */\r\n set: function (speInfo) {\r\n this.event[EVENT_KEYS.SPE_INFO] = speInfo;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"serverErrorCode\", {\r\n set: function (errorCode) {\r\n this.event[EVENT_KEYS.SERVER_ERROR_CODE] = errorCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(HttpEvent.prototype, \"serverSubErrorCode\", {\r\n set: function (subErrorCode) {\r\n this.event[EVENT_KEYS.SERVER_SUB_ERROR_CODE] = subErrorCode;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return HttpEvent;\r\n}(TelemetryEvent));\r\nexport default HttpEvent;\r\n//# sourceMappingURL=HttpEvent.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport DefaultEvent from \"./DefaultEvent\";\r\nimport { Constants } from \"../utils/Constants\";\r\nimport ApiEvent from \"./ApiEvent\";\r\nimport HttpEvent from \"./HttpEvent\";\r\nimport { version as libraryVersion } from \"../packageMetadata\";\r\nvar TelemetryManager = /** @class */ (function () {\r\n function TelemetryManager(config, telemetryEmitter, logger) {\r\n // correlation Id to list of events\r\n this.completedEvents = {};\r\n // event key to event\r\n this.inProgressEvents = {};\r\n // correlation id to map of eventname to count\r\n this.eventCountByCorrelationId = {};\r\n // Implement after API EVENT\r\n this.onlySendFailureTelemetry = false;\r\n // TODO THROW if bad options\r\n this.telemetryPlatform = tslib_1.__assign({ sdk: Constants.libraryName, sdkVersion: libraryVersion, networkInformation: {\r\n // @ts-ignore\r\n connectionSpeed: typeof navigator !== \"undefined\" && navigator.connection && navigator.connection.effectiveType\r\n } }, config.platform);\r\n this.clientId = config.clientId;\r\n this.onlySendFailureTelemetry = config.onlySendFailureTelemetry;\r\n /*\r\n * TODO, when i get to wiring this through, think about what it means if\r\n * a developer does not implement telem at all, we still instrument, but telemetryEmitter can be\r\n * optional?\r\n */\r\n this.telemetryEmitter = telemetryEmitter;\r\n this.logger = logger;\r\n }\r\n TelemetryManager.getTelemetrymanagerStub = function (clientId, logger) {\r\n var applicationName = \"UnSetStub\";\r\n var applicationVersion = \"0.0\";\r\n var telemetryEmitter = function () { };\r\n var telemetryPlatform = {\r\n applicationName: applicationName,\r\n applicationVersion: applicationVersion\r\n };\r\n var telemetryManagerConfig = {\r\n platform: telemetryPlatform,\r\n clientId: clientId\r\n };\r\n return new this(telemetryManagerConfig, telemetryEmitter, logger);\r\n };\r\n TelemetryManager.prototype.startEvent = function (event) {\r\n this.logger.verbose(\"Telemetry Event started: \" + event.key);\r\n if (!this.telemetryEmitter) {\r\n return;\r\n }\r\n event.start();\r\n this.inProgressEvents[event.key] = event;\r\n };\r\n TelemetryManager.prototype.stopEvent = function (event) {\r\n this.logger.verbose(\"Telemetry Event stopped: \" + event.key);\r\n if (!this.telemetryEmitter || !this.inProgressEvents[event.key]) {\r\n return;\r\n }\r\n event.stop();\r\n this.incrementEventCount(event);\r\n var completedEvents = this.completedEvents[event.telemetryCorrelationId];\r\n this.completedEvents[event.telemetryCorrelationId] = (completedEvents || []).concat([event]);\r\n delete this.inProgressEvents[event.key];\r\n };\r\n TelemetryManager.prototype.flush = function (correlationId) {\r\n var _this = this;\r\n this.logger.verbose(\"Flushing telemetry events: \" + correlationId);\r\n // If there is only unfinished events should this still return them?\r\n if (!this.telemetryEmitter || !this.completedEvents[correlationId]) {\r\n return;\r\n }\r\n var orphanedEvents = this.getOrphanedEvents(correlationId);\r\n orphanedEvents.forEach(function (event) { return _this.incrementEventCount(event); });\r\n var eventsToFlush = this.completedEvents[correlationId].concat(orphanedEvents);\r\n delete this.completedEvents[correlationId];\r\n var eventCountsToFlush = this.eventCountByCorrelationId[correlationId];\r\n delete this.eventCountByCorrelationId[correlationId];\r\n // TODO add funcitonality for onlyFlushFailures after implementing api event? ??\r\n if (!eventsToFlush || !eventsToFlush.length) {\r\n return;\r\n }\r\n var defaultEvent = new DefaultEvent(this.telemetryPlatform, correlationId, this.clientId, eventCountsToFlush);\r\n var eventsWithDefaultEvent = eventsToFlush.concat([defaultEvent]);\r\n this.telemetryEmitter(eventsWithDefaultEvent.map(function (e) { return e.get(); }));\r\n };\r\n TelemetryManager.prototype.createAndStartApiEvent = function (correlationId, apiEventIdentifier) {\r\n var apiEvent = new ApiEvent(correlationId, this.logger.isPiiLoggingEnabled(), apiEventIdentifier);\r\n this.startEvent(apiEvent);\r\n return apiEvent;\r\n };\r\n TelemetryManager.prototype.stopAndFlushApiEvent = function (correlationId, apiEvent, wasSuccessful, errorCode) {\r\n apiEvent.wasSuccessful = wasSuccessful;\r\n if (errorCode) {\r\n apiEvent.apiErrorCode = errorCode;\r\n }\r\n this.stopEvent(apiEvent);\r\n this.flush(correlationId);\r\n };\r\n TelemetryManager.prototype.createAndStartHttpEvent = function (correlation, httpMethod, url, eventLabel) {\r\n var httpEvent = new HttpEvent(correlation, eventLabel);\r\n httpEvent.url = url;\r\n httpEvent.httpMethod = httpMethod;\r\n this.startEvent(httpEvent);\r\n return httpEvent;\r\n };\r\n TelemetryManager.prototype.incrementEventCount = function (event) {\r\n var _a;\r\n /*\r\n * TODO, name cache event different?\r\n * if type is cache event, change name\r\n */\r\n var eventName = event.eventName;\r\n var eventCount = this.eventCountByCorrelationId[event.telemetryCorrelationId];\r\n if (!eventCount) {\r\n this.eventCountByCorrelationId[event.telemetryCorrelationId] = (_a = {},\r\n _a[eventName] = 1,\r\n _a);\r\n }\r\n else {\r\n eventCount[eventName] = eventCount[eventName] ? eventCount[eventName] + 1 : 1;\r\n }\r\n };\r\n TelemetryManager.prototype.getOrphanedEvents = function (correlationId) {\r\n var _this = this;\r\n return Object.keys(this.inProgressEvents)\r\n .reduce(function (memo, eventKey) {\r\n if (eventKey.indexOf(correlationId) !== -1) {\r\n var event_1 = _this.inProgressEvents[eventKey];\r\n delete _this.inProgressEvents[eventKey];\r\n return memo.concat([event_1]);\r\n }\r\n return memo;\r\n }, []);\r\n };\r\n return TelemetryManager;\r\n}());\r\nexport default TelemetryManager;\r\n//# sourceMappingURL=TelemetryManager.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport { ScopeSet } from \"../ScopeSet\";\r\nimport { UrlUtils } from \"./UrlUtils\";\r\n/**\r\n * @hidden\r\n */\r\nvar AuthCacheUtils = /** @class */ (function () {\r\n function AuthCacheUtils() {\r\n }\r\n AuthCacheUtils.filterTokenCacheItemsByScope = function (tokenCacheItems, requestScopes) {\r\n return tokenCacheItems.filter(function (cacheItem) {\r\n var cachedScopes = cacheItem.key.scopes.split(\" \");\r\n var searchScopes = ScopeSet.removeDefaultScopes(requestScopes);\r\n // If requestScopes contain only default scopes search for default scopes otherwise search for everything but default scopes\r\n return searchScopes.length === 0 ? ScopeSet.containsScope(cachedScopes, requestScopes) : ScopeSet.containsScope(cachedScopes, searchScopes);\r\n });\r\n };\r\n AuthCacheUtils.filterTokenCacheItemsByAuthority = function (tokenCacheItems, authority) {\r\n return tokenCacheItems.filter(function (cacheItem) { return UrlUtils.CanonicalizeUri(cacheItem.key.authority) === authority; });\r\n };\r\n AuthCacheUtils.filterTokenCacheItemsByDomain = function (tokenCacheItems, requestDomain) {\r\n return tokenCacheItems.filter(function (cacheItem) {\r\n var cacheItemDomain = UrlUtils.GetUrlComponents(cacheItem.key.authority).HostNameAndPort;\r\n return cacheItemDomain === requestDomain;\r\n });\r\n };\r\n return AuthCacheUtils;\r\n}());\r\nexport { AuthCacheUtils };\r\n//# sourceMappingURL=AuthCacheUtils.js.map","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as tslib_1 from \"tslib\";\r\nimport { AccessTokenKey } from \"./cache/AccessTokenKey\";\r\nimport { AccessTokenValue } from \"./cache/AccessTokenValue\";\r\nimport { ServerRequestParameters } from \"./ServerRequestParameters\";\r\nimport { AuthorityType } from \"./authority/Authority\";\r\nimport { ClientInfo } from \"./ClientInfo\";\r\nimport { IdToken } from \"./IdToken\";\r\nimport { AuthCache } from \"./cache/AuthCache\";\r\nimport { Account } from \"./Account\";\r\nimport { ScopeSet } from \"./ScopeSet\";\r\nimport { StringUtils } from \"./utils/StringUtils\";\r\nimport { WindowUtils } from \"./utils/WindowUtils\";\r\nimport { TokenUtils } from \"./utils/TokenUtils\";\r\nimport { TimeUtils } from \"./utils/TimeUtils\";\r\nimport { UrlUtils } from \"./utils/UrlUtils\";\r\nimport { RequestUtils } from \"./utils/RequestUtils\";\r\nimport { ResponseUtils } from \"./utils/ResponseUtils\";\r\nimport { AuthorityFactory } from \"./authority/AuthorityFactory\";\r\nimport { buildConfiguration } from \"./Configuration\";\r\nimport { ClientConfigurationError } from \"./error/ClientConfigurationError\";\r\nimport { AuthError } from \"./error/AuthError\";\r\nimport { ClientAuthError, ClientAuthErrorMessage } from \"./error/ClientAuthError\";\r\nimport { ServerError } from \"./error/ServerError\";\r\nimport { InteractionRequiredAuthError } from \"./error/InteractionRequiredAuthError\";\r\nimport { buildResponseStateOnly } from \"./AuthResponse\";\r\nimport TelemetryManager from \"./telemetry/TelemetryManager\";\r\nimport { API_EVENT_IDENTIFIER } from \"./telemetry/ApiEvent\";\r\nimport { Constants, ServerHashParamKeys, ResponseTypes, TemporaryCacheKeys, PersistentCacheKeys, ErrorCacheKeys, FramePrefix } from \"./utils/Constants\";\r\nimport { CryptoUtils } from \"./utils/CryptoUtils\";\r\nimport { TrustedAuthority } from \"./authority/TrustedAuthority\";\r\nimport { AuthCacheUtils } from \"./utils/AuthCacheUtils\";\r\n// default authority\r\nvar DEFAULT_AUTHORITY = \"https://login.microsoftonline.com/common\";\r\n/**\r\n * UserAgentApplication class\r\n *\r\n * Object Instance that the developer can use to make loginXX OR acquireTokenXX functions\r\n */\r\nvar UserAgentApplication = /** @class */ (function () {\r\n /**\r\n * @constructor\r\n * Constructor for the UserAgentApplication used to instantiate the UserAgentApplication object\r\n *\r\n * Important attributes in the Configuration object for auth are:\r\n * - clientID: the application ID of your application.\r\n * You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n * - authority: the authority URL for your application.\r\n *\r\n * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n * It is of the form https://login.microsoftonline.com/<Enter_the_Tenant_Info_Here>.\r\n * If your application supports Accounts in one organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n * If your application supports Accounts in any organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with organizations.\r\n * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace \"Enter_the_Tenant_Info_Here\" value with common.\r\n * To restrict support to Personal Microsoft accounts only, replace \"Enter_the_Tenant_Info_Here\" value with consumers.\r\n *\r\n *\r\n * In Azure B2C, authority is of the form https://<instance>/tfp/<tenant>/<policyName>/\r\n *\r\n * @param {@link (Configuration:type)} configuration object for the MSAL UserAgentApplication instance\r\n */\r\n function UserAgentApplication(configuration) {\r\n // callbacks for token/error\r\n this.authResponseCallback = null;\r\n this.tokenReceivedCallback = null;\r\n this.errorReceivedCallback = null;\r\n // Set the Configuration\r\n this.config = buildConfiguration(configuration);\r\n this.logger = this.config.system.logger;\r\n this.clientId = this.config.auth.clientId;\r\n this.inCookie = this.config.cache.storeAuthStateInCookie;\r\n this.telemetryManager = this.getTelemetryManagerFromConfig(this.config.system.telemetry, this.clientId);\r\n TrustedAuthority.setTrustedAuthoritiesFromConfig(this.config.auth.validateAuthority, this.config.auth.knownAuthorities);\r\n AuthorityFactory.saveMetadataFromConfig(this.config.auth.authority, this.config.auth.authorityMetadata);\r\n // if no authority is passed, set the default: \"https://login.microsoftonline.com/common\"\r\n this.authority = this.config.auth.authority || DEFAULT_AUTHORITY;\r\n // cache keys msal - typescript throws an error if any value other than \"localStorage\" or \"sessionStorage\" is passed\r\n this.cacheStorage = new AuthCache(this.clientId, this.config.cache.cacheLocation, this.inCookie);\r\n // Initialize window handling code\r\n window.activeRenewals = {};\r\n window.renewStates = [];\r\n window.callbackMappedToRenewStates = {};\r\n window.promiseMappedToRenewStates = {};\r\n window.msal = this;\r\n var urlHash = window.location.hash;\r\n var urlContainsHash = UrlUtils.urlContainsHash(urlHash);\r\n // check if back button is pressed\r\n WindowUtils.checkIfBackButtonIsPressed(this.cacheStorage);\r\n // On the server 302 - Redirect, handle this\r\n if (urlContainsHash) {\r\n var stateInfo = this.getResponseState(urlHash);\r\n if (stateInfo.method === Constants.interactionTypeRedirect) {\r\n this.handleRedirectAuthenticationResponse(urlHash);\r\n }\r\n }\r\n }\r\n Object.defineProperty(UserAgentApplication.prototype, \"authority\", {\r\n /**\r\n * Method to manage the authority URL.\r\n *\r\n * @returns {string} authority\r\n */\r\n get: function () {\r\n return this.authorityInstance.CanonicalAuthority;\r\n },\r\n /**\r\n * setter for the authority URL\r\n * @param {string} authority\r\n */\r\n // If the developer passes an authority, create an instance\r\n set: function (val) {\r\n this.authorityInstance = AuthorityFactory.CreateInstance(val, this.config.auth.validateAuthority);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Get the current authority instance from the MSAL configuration object\r\n *\r\n * @returns {@link Authority} authority instance\r\n */\r\n UserAgentApplication.prototype.getAuthorityInstance = function () {\r\n return this.authorityInstance;\r\n };\r\n UserAgentApplication.prototype.handleRedirectCallback = function (authOrTokenCallback, errorReceivedCallback) {\r\n if (!authOrTokenCallback) {\r\n throw ClientConfigurationError.createInvalidCallbackObjectError(authOrTokenCallback);\r\n }\r\n // Set callbacks\r\n if (errorReceivedCallback) {\r\n this.tokenReceivedCallback = authOrTokenCallback;\r\n this.errorReceivedCallback = errorReceivedCallback;\r\n this.logger.warning(\"This overload for callback is deprecated - please change the format of the callbacks to a single callback as shown: (err: AuthError, response: AuthResponse).\");\r\n }\r\n else {\r\n this.authResponseCallback = authOrTokenCallback;\r\n }\r\n if (this.redirectError) {\r\n this.authErrorHandler(Constants.interactionTypeRedirect, this.redirectError, this.redirectResponse);\r\n }\r\n else if (this.redirectResponse) {\r\n this.authResponseHandler(Constants.interactionTypeRedirect, this.redirectResponse);\r\n }\r\n };\r\n /**\r\n * Public API to verify if the URL contains the hash with known properties\r\n * @param hash\r\n */\r\n UserAgentApplication.prototype.urlContainsHash = function (hash) {\r\n this.logger.verbose(\"UrlContainsHash has been called\");\r\n return UrlUtils.urlContainsHash(hash);\r\n };\r\n UserAgentApplication.prototype.authResponseHandler = function (interactionType, response, resolve) {\r\n this.logger.verbose(\"AuthResponseHandler has been called\");\r\n if (interactionType === Constants.interactionTypeRedirect) {\r\n this.logger.verbose(\"Interaction type is redirect\");\r\n if (this.errorReceivedCallback) {\r\n this.logger.verbose(\"Two callbacks were provided to handleRedirectCallback, calling success callback with response\");\r\n this.tokenReceivedCallback(response);\r\n }\r\n else if (this.authResponseCallback) {\r\n this.logger.verbose(\"One callback was provided to handleRedirectCallback, calling authResponseCallback with response\");\r\n this.authResponseCallback(null, response);\r\n }\r\n }\r\n else if (interactionType === Constants.interactionTypePopup) {\r\n this.logger.verbose(\"Interaction type is popup, resolving\");\r\n resolve(response);\r\n }\r\n else {\r\n throw ClientAuthError.createInvalidInteractionTypeError();\r\n }\r\n };\r\n UserAgentApplication.prototype.authErrorHandler = function (interactionType, authErr, response, reject) {\r\n this.logger.verbose(\"AuthErrorHandler has been called\");\r\n // set interaction_status to complete\r\n this.cacheStorage.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n if (interactionType === Constants.interactionTypeRedirect) {\r\n this.logger.verbose(\"Interaction type is redirect\");\r\n if (this.errorReceivedCallback) {\r\n this.logger.verbose(\"Two callbacks were provided to handleRedirectCallback, calling error callback\");\r\n this.errorReceivedCallback(authErr, response.accountState);\r\n }\r\n else if (this.authResponseCallback) {\r\n this.logger.verbose(\"One callback was provided to handleRedirectCallback, calling authResponseCallback with error\");\r\n this.authResponseCallback(authErr, response);\r\n }\r\n else {\r\n this.logger.verbose(\"handleRedirectCallback has not been called and no callbacks are registered, throwing error\");\r\n throw authErr;\r\n }\r\n }\r\n else if (interactionType === Constants.interactionTypePopup) {\r\n this.logger.verbose(\"Interaction type is popup, rejecting\");\r\n reject(authErr);\r\n }\r\n else {\r\n throw ClientAuthError.createInvalidInteractionTypeError();\r\n }\r\n };\r\n // #endregion\r\n /**\r\n * Use when initiating the login process by redirecting the user's browser to the authorization endpoint.\r\n * @param {@link (AuthenticationParameters:type)}\r\n */\r\n UserAgentApplication.prototype.loginRedirect = function (userRequest) {\r\n this.logger.verbose(\"LoginRedirect has been called\");\r\n // validate request\r\n var request = RequestUtils.validateRequest(userRequest, true, this.clientId, Constants.interactionTypeRedirect);\r\n this.acquireTokenInteractive(Constants.interactionTypeRedirect, true, request, null, null);\r\n };\r\n /**\r\n * Use when you want to obtain an access_token for your API by redirecting the user's browser window to the authorization endpoint.\r\n * @param {@link (AuthenticationParameters:type)}\r\n *\r\n * To renew idToken, please pass clientId as the only scope in the Authentication Parameters\r\n */\r\n UserAgentApplication.prototype.acquireTokenRedirect = function (userRequest) {\r\n this.logger.verbose(\"AcquireTokenRedirect has been called\");\r\n // validate request\r\n var request = RequestUtils.validateRequest(userRequest, false, this.clientId, Constants.interactionTypeRedirect);\r\n this.acquireTokenInteractive(Constants.interactionTypeRedirect, false, request, null, null);\r\n };\r\n /**\r\n * Use when initiating the login process via opening a popup window in the user's browser\r\n *\r\n * @param {@link (AuthenticationParameters:type)}\r\n *\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object\r\n */\r\n UserAgentApplication.prototype.loginPopup = function (userRequest) {\r\n var _this = this;\r\n this.logger.verbose(\"LoginPopup has been called\");\r\n // validate request\r\n var request = RequestUtils.validateRequest(userRequest, true, this.clientId, Constants.interactionTypePopup);\r\n var apiEvent = this.telemetryManager.createAndStartApiEvent(request.correlationId, API_EVENT_IDENTIFIER.LoginPopup);\r\n return new Promise(function (resolve, reject) {\r\n _this.acquireTokenInteractive(Constants.interactionTypePopup, true, request, resolve, reject);\r\n })\r\n .then(function (resp) {\r\n _this.logger.verbose(\"Successfully logged in\");\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, true);\r\n return resp;\r\n })\r\n .catch(function (error) {\r\n _this.cacheStorage.resetTempCacheItems(request.state);\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, false, error.errorCode);\r\n throw error;\r\n });\r\n };\r\n /**\r\n * Use when you want to obtain an access_token for your API via opening a popup window in the user's browser\r\n * @param {@link AuthenticationParameters}\r\n *\r\n * To renew idToken, please pass clientId as the only scope in the Authentication Parameters\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object\r\n */\r\n UserAgentApplication.prototype.acquireTokenPopup = function (userRequest) {\r\n var _this = this;\r\n this.logger.verbose(\"AcquireTokenPopup has been called\");\r\n // validate request\r\n var request = RequestUtils.validateRequest(userRequest, false, this.clientId, Constants.interactionTypePopup);\r\n var apiEvent = this.telemetryManager.createAndStartApiEvent(request.correlationId, API_EVENT_IDENTIFIER.AcquireTokenPopup);\r\n return new Promise(function (resolve, reject) {\r\n _this.acquireTokenInteractive(Constants.interactionTypePopup, false, request, resolve, reject);\r\n })\r\n .then(function (resp) {\r\n _this.logger.verbose(\"Successfully acquired token\");\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, true);\r\n return resp;\r\n })\r\n .catch(function (error) {\r\n _this.cacheStorage.resetTempCacheItems(request.state);\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, false, error.errorCode);\r\n throw error;\r\n });\r\n };\r\n // #region Acquire Token\r\n /**\r\n * Use when initiating the login process or when you want to obtain an access_token for your API,\r\n * either by redirecting the user's browser window to the authorization endpoint or via opening a popup window in the user's browser.\r\n * @param {@link (AuthenticationParameters:type)}\r\n *\r\n * To renew idToken, please pass clientId as the only scope in the Authentication Parameters\r\n */\r\n UserAgentApplication.prototype.acquireTokenInteractive = function (interactionType, isLoginCall, request, resolve, reject) {\r\n var _this = this;\r\n this.logger.verbose(\"AcquireTokenInteractive has been called\");\r\n // block the request if made from the hidden iframe\r\n WindowUtils.blockReloadInHiddenIframes();\r\n var interactionProgress = this.cacheStorage.getItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n if (interactionType === Constants.interactionTypeRedirect) {\r\n this.cacheStorage.setItem(TemporaryCacheKeys.REDIRECT_REQUEST, \"\" + Constants.inProgress + Constants.resourceDelimiter + request.state);\r\n }\r\n // If already in progress, do not proceed\r\n if (interactionProgress === Constants.inProgress) {\r\n var thrownError = isLoginCall ? ClientAuthError.createLoginInProgressError() : ClientAuthError.createAcquireTokenInProgressError();\r\n var stateOnlyResponse = buildResponseStateOnly(this.getAccountState(request.state));\r\n this.cacheStorage.resetTempCacheItems(request.state);\r\n this.authErrorHandler(interactionType, thrownError, stateOnlyResponse, reject);\r\n return;\r\n }\r\n // Get the account object if a session exists\r\n var account;\r\n if (request && request.account && !isLoginCall) {\r\n account = request.account;\r\n this.logger.verbose(\"Account set from request\");\r\n }\r\n else {\r\n account = this.getAccount();\r\n this.logger.verbose(\"Account set from MSAL Cache\");\r\n }\r\n // If no session exists, prompt the user to login.\r\n if (!account && !ServerRequestParameters.isSSOParam(request)) {\r\n if (isLoginCall) {\r\n // extract ADAL id_token if exists\r\n var adalIdToken = this.extractADALIdToken();\r\n // silent login if ADAL id_token is retrieved successfully - SSO\r\n if (adalIdToken && !request.scopes) {\r\n this.logger.info(\"ADAL's idToken exists. Extracting login information from ADAL's idToken\");\r\n var tokenRequest = this.buildIDTokenRequest(request);\r\n this.silentLogin = true;\r\n this.acquireTokenSilent(tokenRequest).then(function (response) {\r\n _this.silentLogin = false;\r\n _this.logger.info(\"Unified cache call is successful\");\r\n _this.authResponseHandler(interactionType, response, resolve);\r\n return;\r\n }, function (error) {\r\n _this.silentLogin = false;\r\n _this.logger.error(\"Error occurred during unified cache ATS: \" + error);\r\n // proceed to login since ATS failed\r\n _this.acquireTokenHelper(null, interactionType, isLoginCall, request, resolve, reject);\r\n });\r\n }\r\n // No ADAL token found, proceed to login\r\n else {\r\n this.logger.verbose(\"Login call but no token found, proceed to login\");\r\n this.acquireTokenHelper(null, interactionType, isLoginCall, request, resolve, reject);\r\n }\r\n }\r\n // AcquireToken call, but no account or context given, so throw error\r\n else {\r\n this.logger.verbose(\"AcquireToken call, no context or account given\");\r\n this.logger.info(\"User login is required\");\r\n var stateOnlyResponse = buildResponseStateOnly(this.getAccountState(request.state));\r\n this.cacheStorage.resetTempCacheItems(request.state);\r\n this.authErrorHandler(interactionType, ClientAuthError.createUserLoginRequiredError(), stateOnlyResponse, reject);\r\n return;\r\n }\r\n }\r\n // User session exists\r\n else {\r\n this.logger.verbose(\"User session exists, login not required\");\r\n this.acquireTokenHelper(account, interactionType, isLoginCall, request, resolve, reject);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n * Helper function to acquireToken\r\n *\r\n */\r\n UserAgentApplication.prototype.acquireTokenHelper = function (account, interactionType, isLoginCall, request, resolve, reject) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var requestSignature, serverAuthenticationRequest, acquireTokenAuthority, popUpWindow, responseType, loginStartPage, urlNavigate, hash, error_1, navigate, err_1;\r\n return tslib_1.__generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n this.logger.verbose(\"AcquireTokenHelper has been called\");\r\n this.logger.verbose(\"Interaction type: \" + interactionType + \". isLoginCall: \" + isLoginCall);\r\n // Track the acquireToken progress\r\n this.cacheStorage.setItem(TemporaryCacheKeys.INTERACTION_STATUS, Constants.inProgress);\r\n requestSignature = request.scopes ? request.scopes.join(\" \").toLowerCase() : Constants.oidcScopes.join(\" \");\r\n this.logger.verbosePii(\"Request signature: \" + requestSignature);\r\n acquireTokenAuthority = (request && request.authority) ? AuthorityFactory.CreateInstance(request.authority, this.config.auth.validateAuthority, request.authorityMetadata) : this.authorityInstance;\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 11, , 12]);\r\n if (!!acquireTokenAuthority.hasCachedMetadata()) return [3 /*break*/, 3];\r\n this.logger.verbose(\"No cached metadata for authority\");\r\n return [4 /*yield*/, AuthorityFactory.saveMetadataFromNetwork(acquireTokenAuthority, this.telemetryManager, request.correlationId)];\r\n case 2:\r\n _a.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n this.logger.verbose(\"Cached metadata found for authority\");\r\n _a.label = 4;\r\n case 4:\r\n responseType = isLoginCall ? ResponseTypes.id_token : this.getTokenType(account, request.scopes);\r\n loginStartPage = request.redirectStartPage || window.location.href;\r\n serverAuthenticationRequest = new ServerRequestParameters(acquireTokenAuthority, this.clientId, responseType, this.getRedirectUri(request && request.redirectUri), request.scopes, request.state, request.correlationId);\r\n this.logger.verbose(\"Finished building server authentication request\");\r\n this.updateCacheEntries(serverAuthenticationRequest, account, isLoginCall, loginStartPage);\r\n this.logger.verbose(\"Updating cache entries\");\r\n // populate QueryParameters (sid/login_hint) and any other extraQueryParameters set by the developer\r\n serverAuthenticationRequest.populateQueryParams(account, request);\r\n this.logger.verbose(\"Query parameters populated from account\");\r\n urlNavigate = UrlUtils.createNavigateUrl(serverAuthenticationRequest) + Constants.response_mode_fragment;\r\n // set state in cache\r\n if (interactionType === Constants.interactionTypeRedirect) {\r\n if (!isLoginCall) {\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_ACQ_TOKEN, request.state), serverAuthenticationRequest.state, this.inCookie);\r\n this.logger.verbose(\"State cached for redirect\");\r\n this.logger.verbosePii(\"State cached: \" + serverAuthenticationRequest.state);\r\n }\r\n else {\r\n this.logger.verbose(\"Interaction type redirect but login call is true. State not cached\");\r\n }\r\n }\r\n else if (interactionType === Constants.interactionTypePopup) {\r\n window.renewStates.push(serverAuthenticationRequest.state);\r\n window.requestType = isLoginCall ? Constants.login : Constants.renewToken;\r\n this.logger.verbose(\"State saved to window\");\r\n this.logger.verbosePii(\"State saved: \" + serverAuthenticationRequest.state);\r\n // Register callback to capture results from server\r\n this.registerCallback(serverAuthenticationRequest.state, requestSignature, resolve, reject);\r\n }\r\n else {\r\n this.logger.verbose(\"Invalid interaction error. State not cached\");\r\n throw ClientAuthError.createInvalidInteractionTypeError();\r\n }\r\n if (!(interactionType === Constants.interactionTypePopup)) return [3 /*break*/, 9];\r\n this.logger.verbose(\"Interaction type is popup. Generating popup window\");\r\n // Generate a popup window\r\n try {\r\n popUpWindow = this.openPopup(urlNavigate, \"msal\", Constants.popUpWidth, Constants.popUpHeight);\r\n // Push popup window handle onto stack for tracking\r\n WindowUtils.trackPopup(popUpWindow);\r\n }\r\n catch (e) {\r\n this.logger.info(ClientAuthErrorMessage.popUpWindowError.code + \":\" + ClientAuthErrorMessage.popUpWindowError.desc);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR, ClientAuthErrorMessage.popUpWindowError.code);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR_DESC, ClientAuthErrorMessage.popUpWindowError.desc);\r\n if (reject) {\r\n reject(ClientAuthError.createPopupWindowError());\r\n return [2 /*return*/];\r\n }\r\n }\r\n if (!popUpWindow) return [3 /*break*/, 8];\r\n _a.label = 5;\r\n case 5:\r\n _a.trys.push([5, 7, , 8]);\r\n return [4 /*yield*/, WindowUtils.monitorPopupForHash(popUpWindow, this.config.system.loadFrameTimeout, urlNavigate, this.logger)];\r\n case 6:\r\n hash = _a.sent();\r\n this.handleAuthenticationResponse(hash);\r\n // Request completed successfully, set to completed\r\n this.cacheStorage.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n this.logger.info(\"Closing popup window\");\r\n // TODO: Check how this can be extracted for any framework specific code?\r\n if (this.config.framework.isAngular) {\r\n this.broadcast(\"msal:popUpHashChanged\", hash);\r\n }\r\n WindowUtils.closePopups();\r\n return [3 /*break*/, 8];\r\n case 7:\r\n error_1 = _a.sent();\r\n if (reject) {\r\n reject(error_1);\r\n }\r\n if (this.config.framework.isAngular) {\r\n this.broadcast(\"msal:popUpClosed\", error_1.errorCode + Constants.resourceDelimiter + error_1.errorMessage);\r\n }\r\n else {\r\n // Request failed, set to canceled\r\n this.cacheStorage.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n popUpWindow.close();\r\n }\r\n return [3 /*break*/, 8];\r\n case 8: return [3 /*break*/, 10];\r\n case 9:\r\n // If onRedirectNavigate is implemented, invoke it and provide urlNavigate\r\n if (request.onRedirectNavigate) {\r\n this.logger.verbose(\"Invoking onRedirectNavigate callback\");\r\n navigate = request.onRedirectNavigate(urlNavigate);\r\n // Returning false from onRedirectNavigate will stop navigation\r\n if (navigate !== false) {\r\n this.logger.verbose(\"onRedirectNavigate did not return false, navigating\");\r\n this.navigateWindow(urlNavigate);\r\n }\r\n else {\r\n this.logger.verbose(\"onRedirectNavigate returned false, stopping navigation\");\r\n }\r\n }\r\n else {\r\n // Otherwise, perform navigation\r\n this.logger.verbose(\"Navigating window to urlNavigate\");\r\n this.navigateWindow(urlNavigate);\r\n }\r\n _a.label = 10;\r\n case 10: return [3 /*break*/, 12];\r\n case 11:\r\n err_1 = _a.sent();\r\n this.logger.error(err_1);\r\n this.cacheStorage.resetTempCacheItems(request.state);\r\n this.authErrorHandler(interactionType, ClientAuthError.createEndpointResolutionError(err_1.toString), buildResponseStateOnly(request.state), reject);\r\n if (popUpWindow) {\r\n popUpWindow.close();\r\n }\r\n return [3 /*break*/, 12];\r\n case 12: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * API interfacing idToken request when applications already have a session/hint acquired by authorization client applications\r\n * @param request\r\n */\r\n UserAgentApplication.prototype.ssoSilent = function (request) {\r\n this.logger.verbose(\"ssoSilent has been called\");\r\n // throw an error on an empty request\r\n if (!request) {\r\n throw ClientConfigurationError.createEmptyRequestError();\r\n }\r\n // throw an error on no hints passed\r\n if (!request.sid && !request.loginHint) {\r\n throw ClientConfigurationError.createSsoSilentError();\r\n }\r\n return this.acquireTokenSilent(tslib_1.__assign({}, request, { scopes: Constants.oidcScopes }));\r\n };\r\n /**\r\n * Use this function to obtain a token before every call to the API / resource provider\r\n *\r\n * MSAL return's a cached token when available\r\n * Or it send's a request to the STS to obtain a new token using a hidden iframe.\r\n *\r\n * @param {@link AuthenticationParameters}\r\n *\r\n * To renew idToken, please pass clientId as the only scope in the Authentication Parameters\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object\r\n *\r\n */\r\n UserAgentApplication.prototype.acquireTokenSilent = function (userRequest) {\r\n var _this = this;\r\n this.logger.verbose(\"AcquireTokenSilent has been called\");\r\n // validate the request\r\n var request = RequestUtils.validateRequest(userRequest, false, this.clientId, Constants.interactionTypeSilent);\r\n var apiEvent = this.telemetryManager.createAndStartApiEvent(request.correlationId, API_EVENT_IDENTIFIER.AcquireTokenSilent);\r\n var requestSignature = RequestUtils.createRequestSignature(request);\r\n return new Promise(function (resolve, reject) { return tslib_1.__awaiter(_this, void 0, void 0, function () {\r\n var scope, account, adalIdToken, responseType, serverAuthenticationRequest, adalIdTokenObject, userContainedClaims, authErr, cacheResultResponse, logMessage, err_2;\r\n return tslib_1.__generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n // block the request if made from the hidden iframe\r\n WindowUtils.blockReloadInHiddenIframes();\r\n scope = request.scopes.join(\" \").toLowerCase();\r\n this.logger.verbosePii(\"Serialized scopes: \" + scope);\r\n if (request.account) {\r\n account = request.account;\r\n this.logger.verbose(\"Account set from request\");\r\n }\r\n else {\r\n account = this.getAccount();\r\n this.logger.verbose(\"Account set from MSAL Cache\");\r\n }\r\n adalIdToken = this.cacheStorage.getItem(Constants.adalIdToken);\r\n // In the event of no account being passed in the config, no session id, and no pre-existing adalIdToken, user will need to log in\r\n if (!account && !(request.sid || request.loginHint) && StringUtils.isEmpty(adalIdToken)) {\r\n this.logger.info(\"User login is required\");\r\n // The promise rejects with a UserLoginRequiredError, which should be caught and user should be prompted to log in interactively\r\n return [2 /*return*/, reject(ClientAuthError.createUserLoginRequiredError())];\r\n }\r\n responseType = this.getTokenType(account, request.scopes);\r\n this.logger.verbose(\"Response type: \" + responseType);\r\n serverAuthenticationRequest = new ServerRequestParameters(AuthorityFactory.CreateInstance(request.authority, this.config.auth.validateAuthority, request.authorityMetadata), this.clientId, responseType, this.getRedirectUri(request.redirectUri), request.scopes, request.state, request.correlationId);\r\n this.logger.verbose(\"Finished building server authentication request\");\r\n // populate QueryParameters (sid/login_hint) and any other extraQueryParameters set by the developer\r\n if (ServerRequestParameters.isSSOParam(request) || account) {\r\n serverAuthenticationRequest.populateQueryParams(account, request, null, true);\r\n this.logger.verbose(\"Query parameters populated from existing SSO or account\");\r\n }\r\n // if user didn't pass login_hint/sid and adal's idtoken is present, extract the login_hint from the adalIdToken\r\n else if (!account && !StringUtils.isEmpty(adalIdToken)) {\r\n adalIdTokenObject = TokenUtils.extractIdToken(adalIdToken);\r\n this.logger.verbose(\"ADAL's idToken exists. Extracting login information from ADAL's idToken to populate query parameters\");\r\n serverAuthenticationRequest.populateQueryParams(account, null, adalIdTokenObject, true);\r\n }\r\n else {\r\n this.logger.verbose(\"No additional query parameters added\");\r\n }\r\n userContainedClaims = request.claimsRequest || serverAuthenticationRequest.claimsValue;\r\n // If request.forceRefresh is set to true, force a request for a new token instead of getting it from the cache\r\n if (!userContainedClaims && !request.forceRefresh) {\r\n try {\r\n cacheResultResponse = this.getCachedToken(serverAuthenticationRequest, account);\r\n }\r\n catch (e) {\r\n authErr = e;\r\n }\r\n }\r\n if (!cacheResultResponse) return [3 /*break*/, 1];\r\n this.logger.verbose(\"Token found in cache lookup\");\r\n this.logger.verbosePii(\"Scopes found: \" + JSON.stringify(cacheResultResponse.scopes));\r\n resolve(cacheResultResponse);\r\n return [2 /*return*/, null];\r\n case 1:\r\n if (!authErr) return [3 /*break*/, 2];\r\n this.logger.infoPii(authErr.errorCode + \":\" + authErr.errorMessage);\r\n reject(authErr);\r\n return [2 /*return*/, null];\r\n case 2:\r\n logMessage = void 0;\r\n if (userContainedClaims) {\r\n logMessage = \"Skipped cache lookup since claims were given\";\r\n }\r\n else if (request.forceRefresh) {\r\n logMessage = \"Skipped cache lookup since request.forceRefresh option was set to true\";\r\n }\r\n else {\r\n logMessage = \"No valid token found in cache lookup\";\r\n }\r\n this.logger.verbose(logMessage);\r\n // Cache result can return null if cache is empty. In that case, set authority to default value if no authority is passed to the API.\r\n if (!serverAuthenticationRequest.authorityInstance) {\r\n serverAuthenticationRequest.authorityInstance = request.authority ?\r\n AuthorityFactory.CreateInstance(request.authority, this.config.auth.validateAuthority, request.authorityMetadata)\r\n : this.authorityInstance;\r\n }\r\n this.logger.verbosePii(\"Authority instance: \" + serverAuthenticationRequest.authority);\r\n _a.label = 3;\r\n case 3:\r\n _a.trys.push([3, 7, , 8]);\r\n if (!!serverAuthenticationRequest.authorityInstance.hasCachedMetadata()) return [3 /*break*/, 5];\r\n this.logger.verbose(\"No cached metadata for authority\");\r\n return [4 /*yield*/, AuthorityFactory.saveMetadataFromNetwork(serverAuthenticationRequest.authorityInstance, this.telemetryManager, request.correlationId)];\r\n case 4:\r\n _a.sent();\r\n this.logger.verbose(\"Authority has been updated with endpoint discovery response\");\r\n return [3 /*break*/, 6];\r\n case 5:\r\n this.logger.verbose(\"Cached metadata found for authority\");\r\n _a.label = 6;\r\n case 6:\r\n /*\r\n * refresh attempt with iframe\r\n * Already renewing for this scope, callback when we get the token.\r\n */\r\n if (window.activeRenewals[requestSignature]) {\r\n this.logger.verbose(\"Renewing token in progress. Registering callback\");\r\n // Active renewals contains the state for each renewal.\r\n this.registerCallback(window.activeRenewals[requestSignature], requestSignature, resolve, reject);\r\n }\r\n else {\r\n if (request.scopes && ScopeSet.onlyContainsOidcScopes(request.scopes)) {\r\n /*\r\n * App uses idToken to send to api endpoints\r\n * Default scope is tracked as OIDC scopes to store this token\r\n */\r\n this.logger.verbose(\"OpenID Connect scopes only, renewing idToken\");\r\n this.silentLogin = true;\r\n this.renewIdToken(requestSignature, resolve, reject, account, serverAuthenticationRequest);\r\n }\r\n else {\r\n // renew access token\r\n this.logger.verbose(\"Renewing access token\");\r\n this.renewToken(requestSignature, resolve, reject, account, serverAuthenticationRequest);\r\n }\r\n }\r\n return [3 /*break*/, 8];\r\n case 7:\r\n err_2 = _a.sent();\r\n this.logger.error(err_2);\r\n reject(ClientAuthError.createEndpointResolutionError(err_2.toString()));\r\n return [2 /*return*/, null];\r\n case 8: return [2 /*return*/];\r\n }\r\n });\r\n }); })\r\n .then(function (res) {\r\n _this.logger.verbose(\"Successfully acquired token\");\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, true);\r\n return res;\r\n })\r\n .catch(function (error) {\r\n _this.cacheStorage.resetTempCacheItems(request.state);\r\n _this.telemetryManager.stopAndFlushApiEvent(request.correlationId, apiEvent, false, error.errorCode);\r\n throw error;\r\n });\r\n };\r\n // #endregion\r\n // #region Popup Window Creation\r\n /**\r\n * @hidden\r\n *\r\n * Configures popup window for login.\r\n *\r\n * @param urlNavigate\r\n * @param title\r\n * @param popUpWidth\r\n * @param popUpHeight\r\n * @ignore\r\n * @hidden\r\n */\r\n UserAgentApplication.prototype.openPopup = function (urlNavigate, title, popUpWidth, popUpHeight) {\r\n this.logger.verbose(\"OpenPopup has been called\");\r\n try {\r\n /**\r\n * adding winLeft and winTop to account for dual monitor\r\n * using screenLeft and screenTop for IE8 and earlier\r\n */\r\n var winLeft = window.screenLeft ? window.screenLeft : window.screenX;\r\n var winTop = window.screenTop ? window.screenTop : window.screenY;\r\n /**\r\n * window.innerWidth displays browser window\"s height and width excluding toolbars\r\n * using document.documentElement.clientWidth for IE8 and earlier\r\n */\r\n var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\r\n var left = ((width / 2) - (popUpWidth / 2)) + winLeft;\r\n var top_1 = ((height / 2) - (popUpHeight / 2)) + winTop;\r\n // open the window\r\n var popupWindow = window.open(urlNavigate, title, \"width=\" + popUpWidth + \", height=\" + popUpHeight + \", top=\" + top_1 + \", left=\" + left + \", scrollbars=yes\");\r\n if (!popupWindow) {\r\n throw ClientAuthError.createPopupWindowError();\r\n }\r\n if (popupWindow.focus) {\r\n popupWindow.focus();\r\n }\r\n return popupWindow;\r\n }\r\n catch (e) {\r\n this.cacheStorage.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n throw ClientAuthError.createPopupWindowError(e.toString());\r\n }\r\n };\r\n // #endregion\r\n // #region Iframe Management\r\n /**\r\n * @hidden\r\n * Calling _loadFrame but with a timeout to signal failure in loadframeStatus. Callbacks are left.\r\n * registered when network errors occur and subsequent token requests for same resource are registered to the pending request.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.loadIframeTimeout = function (urlNavigate, frameName, requestSignature) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var expectedState, iframe, _a, hash, error_2;\r\n return tslib_1.__generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n expectedState = window.activeRenewals[requestSignature];\r\n this.logger.verbosePii(\"Set loading state to pending for: \" + requestSignature + \":\" + expectedState);\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.RENEW_STATUS, expectedState), Constants.inProgress);\r\n if (!this.config.system.navigateFrameWait) return [3 /*break*/, 2];\r\n return [4 /*yield*/, WindowUtils.loadFrame(urlNavigate, frameName, this.config.system.navigateFrameWait, this.logger)];\r\n case 1:\r\n _a = _b.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n _a = WindowUtils.loadFrameSync(urlNavigate, frameName, this.logger);\r\n _b.label = 3;\r\n case 3:\r\n iframe = _a;\r\n _b.label = 4;\r\n case 4:\r\n _b.trys.push([4, 6, , 7]);\r\n return [4 /*yield*/, WindowUtils.monitorIframeForHash(iframe.contentWindow, this.config.system.loadFrameTimeout, urlNavigate, this.logger)];\r\n case 5:\r\n hash = _b.sent();\r\n if (hash) {\r\n this.handleAuthenticationResponse(hash);\r\n }\r\n return [3 /*break*/, 7];\r\n case 6:\r\n error_2 = _b.sent();\r\n if (this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.RENEW_STATUS, expectedState)) === Constants.inProgress) {\r\n // fail the iframe session if it's in pending state\r\n this.logger.verbose(\"Loading frame has timed out after: \" + (this.config.system.loadFrameTimeout / 1000) + \" seconds for scope/authority \" + requestSignature + \":\" + expectedState);\r\n // Error after timeout\r\n if (expectedState && window.callbackMappedToRenewStates[expectedState]) {\r\n window.callbackMappedToRenewStates[expectedState](null, error_2);\r\n }\r\n this.cacheStorage.removeItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.RENEW_STATUS, expectedState));\r\n }\r\n WindowUtils.removeHiddenIframe(iframe);\r\n throw error_2;\r\n case 7:\r\n WindowUtils.removeHiddenIframe(iframe);\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n // #endregion\r\n // #region General Helpers\r\n /**\r\n * @hidden\r\n * Used to redirect the browser to the STS authorization endpoint\r\n * @param {string} urlNavigate - URL of the authorization endpoint\r\n */\r\n UserAgentApplication.prototype.navigateWindow = function (urlNavigate, popupWindow) {\r\n // Navigate if valid URL\r\n if (urlNavigate && !StringUtils.isEmpty(urlNavigate)) {\r\n var navigateWindow = popupWindow ? popupWindow : window;\r\n var logMessage = popupWindow ? \"Navigated Popup window to:\" + urlNavigate : \"Navigate to:\" + urlNavigate;\r\n this.logger.infoPii(logMessage);\r\n navigateWindow.location.assign(urlNavigate);\r\n }\r\n else {\r\n this.logger.info(\"Navigate url is empty\");\r\n throw AuthError.createUnexpectedError(\"Navigate url is empty\");\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * Used to add the developer requested callback to the array of callbacks for the specified scopes. The updated array is stored on the window object\r\n * @param {string} expectedState - Unique state identifier (guid).\r\n * @param {string} scope - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.\r\n * @param {Function} resolve - The resolve function of the promise object.\r\n * @param {Function} reject - The reject function of the promise object.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.registerCallback = function (expectedState, requestSignature, resolve, reject) {\r\n var _this = this;\r\n // track active renewals\r\n window.activeRenewals[requestSignature] = expectedState;\r\n // initialize callbacks mapped array\r\n if (!window.promiseMappedToRenewStates[expectedState]) {\r\n window.promiseMappedToRenewStates[expectedState] = [];\r\n }\r\n // indexing on the current state, push the callback params to callbacks mapped\r\n window.promiseMappedToRenewStates[expectedState].push({ resolve: resolve, reject: reject });\r\n // Store the server response in the current window??\r\n if (!window.callbackMappedToRenewStates[expectedState]) {\r\n window.callbackMappedToRenewStates[expectedState] = function (response, error) {\r\n // reset active renewals\r\n window.activeRenewals[requestSignature] = null;\r\n // for all promiseMappedtoRenewStates for a given 'state' - call the reject/resolve with error/token respectively\r\n for (var i = 0; i < window.promiseMappedToRenewStates[expectedState].length; ++i) {\r\n try {\r\n if (error) {\r\n window.promiseMappedToRenewStates[expectedState][i].reject(error);\r\n }\r\n else if (response) {\r\n window.promiseMappedToRenewStates[expectedState][i].resolve(response);\r\n }\r\n else {\r\n _this.cacheStorage.resetTempCacheItems(expectedState);\r\n throw AuthError.createUnexpectedError(\"Error and response are both null\");\r\n }\r\n }\r\n catch (e) {\r\n _this.logger.warning(e);\r\n }\r\n }\r\n // reset\r\n window.promiseMappedToRenewStates[expectedState] = null;\r\n window.callbackMappedToRenewStates[expectedState] = null;\r\n };\r\n }\r\n };\r\n // #endregion\r\n // #region Logout\r\n /**\r\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n */\r\n UserAgentApplication.prototype.logout = function (correlationId) {\r\n this.logger.verbose(\"Logout has been called\");\r\n this.logoutAsync(correlationId);\r\n };\r\n /**\r\n * Async version of logout(). Use to log out the current user.\r\n * @param correlationId Request correlationId\r\n */\r\n UserAgentApplication.prototype.logoutAsync = function (correlationId) {\r\n return tslib_1.__awaiter(this, void 0, void 0, function () {\r\n var requestCorrelationId, apiEvent, correlationIdParam, postLogoutQueryParam, urlNavigate, error_3;\r\n return tslib_1.__generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n requestCorrelationId = correlationId || CryptoUtils.createNewGuid();\r\n apiEvent = this.telemetryManager.createAndStartApiEvent(requestCorrelationId, API_EVENT_IDENTIFIER.Logout);\r\n this.clearCache();\r\n this.account = null;\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 5, , 6]);\r\n if (!!this.authorityInstance.hasCachedMetadata()) return [3 /*break*/, 3];\r\n this.logger.verbose(\"No cached metadata for authority\");\r\n return [4 /*yield*/, AuthorityFactory.saveMetadataFromNetwork(this.authorityInstance, this.telemetryManager, correlationId)];\r\n case 2:\r\n _a.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n this.logger.verbose(\"Cached metadata found for authority\");\r\n _a.label = 4;\r\n case 4:\r\n correlationIdParam = \"client-request-id=\" + requestCorrelationId;\r\n postLogoutQueryParam = void 0;\r\n if (this.getPostLogoutRedirectUri()) {\r\n postLogoutQueryParam = \"&post_logout_redirect_uri=\" + encodeURIComponent(this.getPostLogoutRedirectUri());\r\n this.logger.verbose(\"redirectUri found and set\");\r\n }\r\n else {\r\n postLogoutQueryParam = \"\";\r\n this.logger.verbose(\"No redirectUri set for app. postLogoutQueryParam is empty\");\r\n }\r\n urlNavigate = void 0;\r\n if (this.authorityInstance.EndSessionEndpoint) {\r\n urlNavigate = this.authorityInstance.EndSessionEndpoint + \"?\" + correlationIdParam + postLogoutQueryParam;\r\n this.logger.verbose(\"EndSessionEndpoint found and urlNavigate set\");\r\n this.logger.verbosePii(\"urlNavigate set to: \" + this.authorityInstance.EndSessionEndpoint);\r\n }\r\n else {\r\n urlNavigate = this.authority + \"oauth2/v2.0/logout?\" + correlationIdParam + postLogoutQueryParam;\r\n this.logger.verbose(\"No endpoint, urlNavigate set to default\");\r\n }\r\n this.telemetryManager.stopAndFlushApiEvent(requestCorrelationId, apiEvent, true);\r\n this.logger.verbose(\"Navigating window to urlNavigate\");\r\n this.navigateWindow(urlNavigate);\r\n return [3 /*break*/, 6];\r\n case 5:\r\n error_3 = _a.sent();\r\n this.telemetryManager.stopAndFlushApiEvent(requestCorrelationId, apiEvent, false, error_3.errorCode);\r\n return [3 /*break*/, 6];\r\n case 6: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * @hidden\r\n * Clear all access tokens and ID tokens in the cache.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.clearCache = function () {\r\n this.logger.verbose(\"Clearing cache\");\r\n window.renewStates = [];\r\n var tokenCacheItems = this.cacheStorage.getAllTokens(Constants.clientId, Constants.homeAccountIdentifier);\r\n for (var i = 0; i < tokenCacheItems.length; i++) {\r\n this.cacheStorage.removeItem(JSON.stringify(tokenCacheItems[i].key));\r\n }\r\n this.cacheStorage.resetCacheItems();\r\n this.cacheStorage.clearMsalCookie();\r\n this.logger.verbose(\"Cache cleared\");\r\n };\r\n /**\r\n * @hidden\r\n * Clear a given access token from the cache.\r\n *\r\n * @param accessToken\r\n */\r\n UserAgentApplication.prototype.clearCacheForScope = function (accessToken) {\r\n this.logger.verbose(\"Clearing access token from cache\");\r\n var accessTokenItems = this.cacheStorage.getAllAccessTokens(Constants.clientId, Constants.homeAccountIdentifier);\r\n for (var i = 0; i < accessTokenItems.length; i++) {\r\n var token = accessTokenItems[i];\r\n if (token.value.accessToken === accessToken) {\r\n this.cacheStorage.removeItem(JSON.stringify(token.key));\r\n this.logger.verbosePii(\"Access token removed: \" + token.key);\r\n }\r\n }\r\n };\r\n // #endregion\r\n // #region Response\r\n /**\r\n * @hidden\r\n * @ignore\r\n * Checks if the redirect response is received from the STS. In case of redirect, the url fragment has either id_token, access_token or error.\r\n * @param {string} hash - Hash passed from redirect page.\r\n * @returns {Boolean} - true if response contains id_token, access_token or error, false otherwise.\r\n */\r\n UserAgentApplication.prototype.isCallback = function (hash) {\r\n this.logger.info(\"isCallback will be deprecated in favor of urlContainsHash in MSAL.js v2.0.\");\r\n this.logger.verbose(\"isCallback has been called\");\r\n return UrlUtils.urlContainsHash(hash);\r\n };\r\n /**\r\n * @hidden\r\n * Used to call the constructor callback with the token/error\r\n * @param {string} [hash=window.location.hash] - Hash fragment of Url.\r\n */\r\n UserAgentApplication.prototype.processCallBack = function (hash, stateInfo, parentCallback) {\r\n this.logger.info(\"ProcessCallBack has been called. Processing callback from redirect response\");\r\n // get the state info from the hash\r\n if (!stateInfo) {\r\n this.logger.verbose(\"StateInfo is null, getting stateInfo from hash\");\r\n stateInfo = this.getResponseState(hash);\r\n }\r\n var response;\r\n var authErr;\r\n // Save the token info from the hash\r\n try {\r\n response = this.saveTokenFromHash(hash, stateInfo);\r\n }\r\n catch (err) {\r\n authErr = err;\r\n }\r\n try {\r\n // Clear the cookie in the hash\r\n this.cacheStorage.clearMsalCookie(stateInfo.state);\r\n var accountState = this.getAccountState(stateInfo.state);\r\n if (response) {\r\n if ((stateInfo.requestType === Constants.renewToken) || response.accessToken) {\r\n if (window.parent !== window) {\r\n this.logger.verbose(\"Window is in iframe, acquiring token silently\");\r\n }\r\n else {\r\n this.logger.verbose(\"Acquiring token interactive in progress\");\r\n }\r\n this.logger.verbose(\"Response tokenType set to \" + ServerHashParamKeys.ACCESS_TOKEN);\r\n response.tokenType = ServerHashParamKeys.ACCESS_TOKEN;\r\n }\r\n else if (stateInfo.requestType === Constants.login) {\r\n this.logger.verbose(\"Response tokenType set to \" + ServerHashParamKeys.ID_TOKEN);\r\n response.tokenType = ServerHashParamKeys.ID_TOKEN;\r\n }\r\n if (!parentCallback) {\r\n this.logger.verbose(\"Setting redirectResponse\");\r\n this.redirectResponse = response;\r\n return;\r\n }\r\n }\r\n else if (!parentCallback) {\r\n this.logger.verbose(\"Response is null, setting redirectResponse with state\");\r\n this.redirectResponse = buildResponseStateOnly(accountState);\r\n this.redirectError = authErr;\r\n this.cacheStorage.resetTempCacheItems(stateInfo.state);\r\n return;\r\n }\r\n this.logger.verbose(\"Calling callback provided to processCallback\");\r\n parentCallback(response, authErr);\r\n }\r\n catch (err) {\r\n this.logger.error(\"Error occurred in token received callback function: \" + err);\r\n throw ClientAuthError.createErrorInCallbackFunction(err.toString());\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * This method must be called for processing the response received from the STS if using popups or iframes. It extracts the hash, processes the token or error\r\n * information and saves it in the cache. It then resolves the promises with the result.\r\n * @param {string} [hash=window.location.hash] - Hash fragment of Url.\r\n */\r\n UserAgentApplication.prototype.handleAuthenticationResponse = function (hash) {\r\n this.logger.verbose(\"HandleAuthenticationResponse has been called\");\r\n // retrieve the hash\r\n var locationHash = hash || window.location.hash;\r\n // if (window.parent !== window), by using self, window.parent becomes equal to window in getResponseState method specifically\r\n var stateInfo = this.getResponseState(locationHash);\r\n this.logger.verbose(\"Obtained state from response\");\r\n var tokenResponseCallback = window.callbackMappedToRenewStates[stateInfo.state];\r\n this.processCallBack(locationHash, stateInfo, tokenResponseCallback);\r\n };\r\n /**\r\n * @hidden\r\n * This method must be called for processing the response received from the STS when using redirect flows. It extracts the hash, processes the token or error\r\n * information and saves it in the cache. The result can then be accessed by user registered callbacks.\r\n * @param {string} [hash=window.location.hash] - Hash fragment of Url.\r\n */\r\n UserAgentApplication.prototype.handleRedirectAuthenticationResponse = function (hash) {\r\n this.logger.info(\"Returned from redirect url\");\r\n this.logger.verbose(\"HandleRedirectAuthenticationResponse has been called\");\r\n // clear hash from window\r\n WindowUtils.clearUrlFragment(window);\r\n this.logger.verbose(\"Window.location.hash cleared\");\r\n // if (window.parent !== window), by using self, window.parent becomes equal to window in getResponseState method specifically\r\n var stateInfo = this.getResponseState(hash);\r\n // if set to navigate to loginRequest page post login\r\n if (this.config.auth.navigateToLoginRequestUrl && window.parent === window) {\r\n this.logger.verbose(\"Window.parent is equal to window, not in popup or iframe. Navigation to login request url after login turned on\");\r\n var loginRequestUrl = this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.LOGIN_REQUEST, stateInfo.state), this.inCookie);\r\n // Redirect to home page if login request url is null (real null or the string null)\r\n if (!loginRequestUrl || loginRequestUrl === \"null\") {\r\n this.logger.error(\"Unable to get valid login request url from cache, redirecting to home page\");\r\n window.location.assign(\"/\");\r\n return;\r\n }\r\n else {\r\n this.logger.verbose(\"Valid login request url obtained from cache\");\r\n var currentUrl = UrlUtils.removeHashFromUrl(window.location.href);\r\n var finalRedirectUrl = UrlUtils.removeHashFromUrl(loginRequestUrl);\r\n if (currentUrl !== finalRedirectUrl) {\r\n this.logger.verbose(\"Current url is not login request url, navigating\");\r\n this.logger.verbosePii(\"CurrentUrl: \" + currentUrl + \", finalRedirectUrl: \" + finalRedirectUrl);\r\n window.location.assign(\"\" + finalRedirectUrl + hash);\r\n return;\r\n }\r\n else {\r\n this.logger.verbose(\"Current url matches login request url\");\r\n var loginRequestUrlComponents = UrlUtils.GetUrlComponents(loginRequestUrl);\r\n if (loginRequestUrlComponents.Hash) {\r\n this.logger.verbose(\"Login request url contains hash, resetting non-msal hash\");\r\n window.location.hash = loginRequestUrlComponents.Hash;\r\n }\r\n }\r\n }\r\n }\r\n else if (!this.config.auth.navigateToLoginRequestUrl) {\r\n this.logger.verbose(\"Default navigation to start page after login turned off\");\r\n }\r\n this.processCallBack(hash, stateInfo, null);\r\n };\r\n /**\r\n * @hidden\r\n * Creates a stateInfo object from the URL fragment and returns it.\r\n * @param {string} hash - Hash passed from redirect page\r\n * @returns {TokenResponse} an object created from the redirect response from AAD comprising of the keys - parameters, requestType, stateMatch, stateResponse and valid.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.getResponseState = function (hash) {\r\n this.logger.verbose(\"GetResponseState has been called\");\r\n var parameters = UrlUtils.deserializeHash(hash);\r\n var stateResponse;\r\n if (!parameters) {\r\n throw AuthError.createUnexpectedError(\"Hash was not parsed correctly.\");\r\n }\r\n if (parameters.hasOwnProperty(ServerHashParamKeys.STATE)) {\r\n this.logger.verbose(\"Hash contains state. Creating stateInfo object\");\r\n var parsedState = RequestUtils.parseLibraryState(parameters[\"state\"]);\r\n stateResponse = {\r\n requestType: Constants.unknown,\r\n state: parameters[\"state\"],\r\n timestamp: parsedState.ts,\r\n method: parsedState.method,\r\n stateMatch: false\r\n };\r\n }\r\n else {\r\n throw AuthError.createUnexpectedError(\"Hash does not contain state.\");\r\n }\r\n /*\r\n * async calls can fire iframe and login request at the same time if developer does not use the API as expected\r\n * incoming callback needs to be looked up to find the request type\r\n */\r\n // loginRedirect\r\n if (stateResponse.state === this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_LOGIN, stateResponse.state), this.inCookie) || stateResponse.state === this.silentAuthenticationState) {\r\n this.logger.verbose(\"State matches cached state, setting requestType to login\");\r\n stateResponse.requestType = Constants.login;\r\n stateResponse.stateMatch = true;\r\n return stateResponse;\r\n }\r\n // acquireTokenRedirect\r\n else if (stateResponse.state === this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_ACQ_TOKEN, stateResponse.state), this.inCookie)) {\r\n this.logger.verbose(\"State matches cached state, setting requestType to renewToken\");\r\n stateResponse.requestType = Constants.renewToken;\r\n stateResponse.stateMatch = true;\r\n return stateResponse;\r\n }\r\n // external api requests may have many renewtoken requests for different resource\r\n if (!stateResponse.stateMatch) {\r\n this.logger.verbose(\"State does not match cached state, setting requestType to type from window\");\r\n stateResponse.requestType = window.requestType;\r\n var statesInParentContext = window.renewStates;\r\n for (var i = 0; i < statesInParentContext.length; i++) {\r\n if (statesInParentContext[i] === stateResponse.state) {\r\n this.logger.verbose(\"Matching state found for request\");\r\n stateResponse.stateMatch = true;\r\n break;\r\n }\r\n }\r\n if (!stateResponse.stateMatch) {\r\n this.logger.verbose(\"Matching state not found for request\");\r\n }\r\n }\r\n return stateResponse;\r\n };\r\n // #endregion\r\n // #region Token Processing (Extract to TokenProcessing.ts)\r\n /**\r\n * @hidden\r\n * Used to get token for the specified set of scopes from the cache\r\n * @param {@link ServerRequestParameters} - Request sent to the STS to obtain an id_token/access_token\r\n * @param {Account} account - Account for which the scopes were requested\r\n */\r\n UserAgentApplication.prototype.getCachedToken = function (serverAuthenticationRequest, account) {\r\n this.logger.verbose(\"GetCachedToken has been called\");\r\n var scopes = serverAuthenticationRequest.scopes;\r\n /**\r\n * Id Token should be returned in every acquireTokenSilent call. The only exception is a response_type = token\r\n * request when a valid ID Token is not present in the cache.\r\n */\r\n var idToken = this.getCachedIdToken(serverAuthenticationRequest, account);\r\n var authResponse = this.getCachedAccessToken(serverAuthenticationRequest, account, scopes);\r\n var accountState = this.getAccountState(serverAuthenticationRequest.state);\r\n return ResponseUtils.buildAuthResponse(idToken, authResponse, serverAuthenticationRequest, account, scopes, accountState);\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Uses passed in authority to further filter an array of tokenCacheItems until only the token being searched for remains, then returns that tokenCacheItem.\r\n * This method will throw if authority filtering still yields multiple matching tokens and will return null if not tokens match the authority passed in.\r\n *\r\n * @param authority\r\n * @param tokenCacheItems\r\n * @param request\r\n * @param requestScopes\r\n * @param tokenType\r\n */\r\n UserAgentApplication.prototype.getTokenCacheItemByAuthority = function (authority, tokenCacheItems, requestScopes, tokenType) {\r\n var _this = this;\r\n var filteredAuthorityItems;\r\n if (UrlUtils.isCommonAuthority(authority) || UrlUtils.isOrganizationsAuthority(authority) || UrlUtils.isConsumersAuthority(authority)) {\r\n filteredAuthorityItems = AuthCacheUtils.filterTokenCacheItemsByDomain(tokenCacheItems, UrlUtils.GetUrlComponents(authority).HostNameAndPort);\r\n }\r\n else {\r\n filteredAuthorityItems = AuthCacheUtils.filterTokenCacheItemsByAuthority(tokenCacheItems, authority);\r\n }\r\n if (filteredAuthorityItems.length === 1) {\r\n return filteredAuthorityItems[0];\r\n }\r\n else if (filteredAuthorityItems.length > 1) {\r\n this.logger.warning(\"Multiple matching tokens found. Cleaning cache and requesting a new token.\");\r\n filteredAuthorityItems.forEach(function (accessTokenCacheItem) {\r\n _this.cacheStorage.removeItem(JSON.stringify(accessTokenCacheItem.key));\r\n });\r\n return null;\r\n }\r\n else {\r\n this.logger.verbose(\"No matching tokens of type \" + tokenType + \" found\");\r\n return null;\r\n }\r\n };\r\n /**\r\n *\r\n * @hidden\r\n *\r\n * Searches the token cache for an ID Token that matches the request parameter and returns it as an IdToken object.\r\n *\r\n * @param serverAuthenticationRequest\r\n * @param account\r\n */\r\n UserAgentApplication.prototype.getCachedIdToken = function (serverAuthenticationRequest, account) {\r\n this.logger.verbose(\"Getting all cached tokens of type ID Token\");\r\n var idTokenCacheItems = this.cacheStorage.getAllIdTokens(this.clientId, account ? account.homeAccountIdentifier : null);\r\n var matchAuthority = serverAuthenticationRequest.authority || this.authority;\r\n var idTokenCacheItem = this.getTokenCacheItemByAuthority(matchAuthority, idTokenCacheItems, null, ServerHashParamKeys.ID_TOKEN);\r\n if (idTokenCacheItem) {\r\n this.logger.verbose(\"Evaluating ID token found\");\r\n var idTokenIsStillValid = this.evaluateTokenExpiration(idTokenCacheItem);\r\n if (idTokenIsStillValid) {\r\n this.logger.verbose(\"ID token expiration is within offset, using ID token found in cache\");\r\n var idTokenValue = idTokenCacheItem.value;\r\n if (idTokenValue) {\r\n this.logger.verbose(\"ID Token found in cache is valid and unexpired\");\r\n }\r\n else {\r\n this.logger.verbose(\"ID Token found in cache is invalid\");\r\n }\r\n return (idTokenValue) ? new IdToken(idTokenValue.idToken) : null;\r\n }\r\n else {\r\n this.logger.verbose(\"Cached ID token is expired, removing from cache\");\r\n this.cacheStorage.removeItem(JSON.stringify(idTokenCacheItem.key));\r\n return null;\r\n }\r\n }\r\n else {\r\n this.logger.verbose(\"No tokens found\");\r\n return null;\r\n }\r\n };\r\n /**\r\n *\r\n * @hidden\r\n *\r\n * Searches the token cache for an access token that matches the request parameters and returns it as an AuthResponse.\r\n *\r\n * @param serverAuthenticationRequest\r\n * @param account\r\n * @param scopes\r\n */\r\n UserAgentApplication.prototype.getCachedAccessToken = function (serverAuthenticationRequest, account, scopes) {\r\n this.logger.verbose(\"Getting all cached tokens of type Access Token\");\r\n var tokenCacheItems = this.cacheStorage.getAllAccessTokens(this.clientId, account ? account.homeAccountIdentifier : null);\r\n var scopeFilteredTokenCacheItems = AuthCacheUtils.filterTokenCacheItemsByScope(tokenCacheItems, scopes);\r\n var matchAuthority = serverAuthenticationRequest.authority || this.authority;\r\n // serverAuthenticationRequest.authority can only be common or organizations if not null\r\n var accessTokenCacheItem = this.getTokenCacheItemByAuthority(matchAuthority, scopeFilteredTokenCacheItems, scopes, ServerHashParamKeys.ACCESS_TOKEN);\r\n if (!accessTokenCacheItem) {\r\n this.logger.verbose(\"No matching token found when filtering by scope and authority\");\r\n return null;\r\n }\r\n else {\r\n serverAuthenticationRequest.authorityInstance = AuthorityFactory.CreateInstance(accessTokenCacheItem.key.authority, this.config.auth.validateAuthority);\r\n this.logger.verbose(\"Evaluating access token found\");\r\n var tokenIsStillValid = this.evaluateTokenExpiration(accessTokenCacheItem);\r\n // The response value will stay null if token retrieved from the cache is expired, otherwise it will be populated with said token's data\r\n if (tokenIsStillValid) {\r\n this.logger.verbose(\"Access token expiration is within offset, using access token found in cache\");\r\n if (!account) {\r\n account = this.getAccount();\r\n if (!account) {\r\n throw AuthError.createUnexpectedError(\"Account should not be null here.\");\r\n }\r\n }\r\n var aState = this.getAccountState(serverAuthenticationRequest.state);\r\n var response = {\r\n uniqueId: \"\",\r\n tenantId: \"\",\r\n tokenType: ServerHashParamKeys.ACCESS_TOKEN,\r\n idToken: null,\r\n idTokenClaims: null,\r\n accessToken: accessTokenCacheItem.value.accessToken,\r\n scopes: accessTokenCacheItem.key.scopes.split(\" \"),\r\n expiresOn: new Date(Number(accessTokenCacheItem.value.expiresIn) * 1000),\r\n account: account,\r\n accountState: aState,\r\n fromCache: true\r\n };\r\n return response;\r\n }\r\n else {\r\n this.logger.verbose(\"Access token expired, removing from cache\");\r\n this.cacheStorage.removeItem(JSON.stringify(accessTokenCacheItem.key));\r\n return null;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns true if the token passed in is within the acceptable expiration time offset, false if it is expired.\r\n * @param tokenCacheItem\r\n * @param serverAuthenticationRequest\r\n */\r\n UserAgentApplication.prototype.evaluateTokenExpiration = function (tokenCacheItem) {\r\n var expiration = Number(tokenCacheItem.value.expiresIn);\r\n return TokenUtils.validateExpirationIsWithinOffset(expiration, this.config.system.tokenRenewalOffsetSeconds);\r\n };\r\n /**\r\n * @hidden\r\n * Check if ADAL id_token exists and return if exists.\r\n *\r\n */\r\n UserAgentApplication.prototype.extractADALIdToken = function () {\r\n this.logger.verbose(\"ExtractADALIdToken has been called\");\r\n var adalIdToken = this.cacheStorage.getItem(Constants.adalIdToken);\r\n return (!StringUtils.isEmpty(adalIdToken)) ? TokenUtils.extractIdToken(adalIdToken) : null;\r\n };\r\n /**\r\n * @hidden\r\n * Acquires access token using a hidden iframe.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.renewToken = function (requestSignature, resolve, reject, account, serverAuthenticationRequest) {\r\n this.logger.verbose(\"RenewToken has been called\");\r\n this.logger.verbosePii(\"RenewToken scope and authority: \" + requestSignature);\r\n var frameName = WindowUtils.generateFrameName(FramePrefix.TOKEN_FRAME, requestSignature);\r\n WindowUtils.addHiddenIFrame(frameName, this.logger);\r\n this.updateCacheEntries(serverAuthenticationRequest, account, false);\r\n this.logger.verbosePii(\"RenewToken expected state: \" + serverAuthenticationRequest.state);\r\n // Build urlNavigate with \"prompt=none\" and navigate to URL in hidden iFrame\r\n var urlNavigate = UrlUtils.urlRemoveQueryStringParameter(UrlUtils.createNavigateUrl(serverAuthenticationRequest), Constants.prompt) + Constants.prompt_none + Constants.response_mode_fragment;\r\n window.renewStates.push(serverAuthenticationRequest.state);\r\n window.requestType = Constants.renewToken;\r\n this.logger.verbose(\"Set window.renewState and requestType\");\r\n this.registerCallback(serverAuthenticationRequest.state, requestSignature, resolve, reject);\r\n this.logger.infoPii(\"Navigate to: \" + urlNavigate);\r\n this.loadIframeTimeout(urlNavigate, frameName, requestSignature).catch(function (error) { return reject(error); });\r\n };\r\n /**\r\n * @hidden\r\n * Renews idtoken for app's own backend when clientId is passed as a single scope in the scopes array.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.renewIdToken = function (requestSignature, resolve, reject, account, serverAuthenticationRequest) {\r\n this.logger.info(\"RenewIdToken has been called\");\r\n var frameName = WindowUtils.generateFrameName(FramePrefix.ID_TOKEN_FRAME, requestSignature);\r\n WindowUtils.addHiddenIFrame(frameName, this.logger);\r\n this.updateCacheEntries(serverAuthenticationRequest, account, false);\r\n this.logger.verbose(\"RenewIdToken expected state: \" + serverAuthenticationRequest.state);\r\n // Build urlNavigate with \"prompt=none\" and navigate to URL in hidden iFrame\r\n var urlNavigate = UrlUtils.urlRemoveQueryStringParameter(UrlUtils.createNavigateUrl(serverAuthenticationRequest), Constants.prompt) + Constants.prompt_none + Constants.response_mode_fragment;\r\n if (this.silentLogin) {\r\n this.logger.verbose(\"Silent login is true, set silentAuthenticationState\");\r\n window.requestType = Constants.login;\r\n this.silentAuthenticationState = serverAuthenticationRequest.state;\r\n }\r\n else {\r\n this.logger.verbose(\"Not silent login, set window.renewState and requestType\");\r\n window.requestType = Constants.renewToken;\r\n window.renewStates.push(serverAuthenticationRequest.state);\r\n }\r\n // note: scope here is clientId\r\n this.registerCallback(serverAuthenticationRequest.state, requestSignature, resolve, reject);\r\n this.logger.infoPii(\"Navigate to:\\\" \" + urlNavigate);\r\n this.loadIframeTimeout(urlNavigate, frameName, requestSignature).catch(function (error) { return reject(error); });\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * This method builds an Access Token Cache item and saves it to the cache, returning the original\r\n * AuthResponse augmented with a parsed expiresOn attribute.\r\n *\r\n * @param response The AuthResponse object that contains the token to be saved\r\n * @param authority The authority under which the ID token will be cached\r\n * @param scopes The scopes to be added to the cache item key (undefined for ID token cache items)\r\n * @param clientInfo Client Info object that is used to generate the homeAccountIdentifier\r\n * @param expiration Token expiration timestamp\r\n */\r\n UserAgentApplication.prototype.saveToken = function (response, authority, scopes, clientInfo, expiration) {\r\n var accessTokenKey = new AccessTokenKey(authority, this.clientId, scopes, clientInfo.uid, clientInfo.utid);\r\n var accessTokenValue = new AccessTokenValue(response.accessToken, response.idToken.rawIdToken, expiration.toString(), clientInfo.encodeClientInfo());\r\n this.cacheStorage.setItem(JSON.stringify(accessTokenKey), JSON.stringify(accessTokenValue));\r\n if (expiration) {\r\n this.logger.verbose(\"New expiration set for token\");\r\n response.expiresOn = new Date(expiration * 1000);\r\n }\r\n else {\r\n this.logger.error(\"Could not parse expiresIn parameter for access token\");\r\n }\r\n return response;\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * This method sets up the elements of an ID Token cache item and calls saveToken to save it in\r\n * Access Token Cache item format for the client application to use.\r\n *\r\n * @param response The AuthResponse object that will be used to build the cache item\r\n * @param authority The authority under which the ID token will be cached\r\n * @param parameters The response's Hash Params, which contain the ID token returned from the server\r\n * @param clientInfo Client Info object that is used to generate the homeAccountIdentifier\r\n * @param idTokenObj ID Token object from which the ID token's expiration is extracted\r\n */\r\n /* tslint:disable:no-string-literal */\r\n UserAgentApplication.prototype.saveIdToken = function (response, authority, parameters, clientInfo, idTokenObj) {\r\n this.logger.verbose(\"SaveIdToken has been called\");\r\n var idTokenResponse = tslib_1.__assign({}, response);\r\n // Scopes are undefined so they don't show up in ID token cache key\r\n var scopes;\r\n idTokenResponse.scopes = Constants.oidcScopes;\r\n idTokenResponse.accessToken = parameters[ServerHashParamKeys.ID_TOKEN];\r\n var expiration = Number(idTokenObj.expiration);\r\n // Set ID Token item in cache\r\n this.logger.verbose(\"Saving ID token to cache\");\r\n return this.saveToken(idTokenResponse, authority, scopes, clientInfo, expiration);\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * This method sets up the elements of an Access Token cache item and calls saveToken to save it to the cache\r\n *\r\n * @param response The AuthResponse object that will be used to build the cache item\r\n * @param authority The authority under which the access token will be cached\r\n * @param parameters The response's Hash Params, which contain the access token returned from the server\r\n * @param clientInfo Client Info object that is used to generate the homeAccountIdentifier\r\n */\r\n /* tslint:disable:no-string-literal */\r\n UserAgentApplication.prototype.saveAccessToken = function (response, authority, parameters, clientInfo) {\r\n this.logger.verbose(\"SaveAccessToken has been called\");\r\n var accessTokenResponse = tslib_1.__assign({}, response);\r\n // read the scopes\r\n var scope = parameters[ServerHashParamKeys.SCOPE];\r\n var consentedScopes = scope.split(\" \");\r\n // retrieve all access tokens from the cache, remove the dup scopes\r\n var accessTokenCacheItems = this.cacheStorage.getAllAccessTokens(this.clientId, authority);\r\n this.logger.verbose(\"Retrieving all access tokens from cache and removing duplicates\");\r\n for (var i = 0; i < accessTokenCacheItems.length; i++) {\r\n var accessTokenCacheItem = accessTokenCacheItems[i];\r\n if (accessTokenCacheItem.key.homeAccountIdentifier === response.account.homeAccountIdentifier) {\r\n var cachedScopes = accessTokenCacheItem.key.scopes.split(\" \");\r\n if (ScopeSet.isIntersectingScopes(cachedScopes, consentedScopes)) {\r\n this.cacheStorage.removeItem(JSON.stringify(accessTokenCacheItem.key));\r\n }\r\n }\r\n }\r\n accessTokenResponse.accessToken = parameters[ServerHashParamKeys.ACCESS_TOKEN];\r\n accessTokenResponse.scopes = consentedScopes;\r\n var expiresIn = TimeUtils.parseExpiresIn(parameters[ServerHashParamKeys.EXPIRES_IN]);\r\n var parsedState = RequestUtils.parseLibraryState(parameters[ServerHashParamKeys.STATE]);\r\n var expiration = parsedState.ts + expiresIn;\r\n this.logger.verbose(\"Saving access token to cache\");\r\n return this.saveToken(accessTokenResponse, authority, scope, clientInfo, expiration);\r\n };\r\n /**\r\n * @hidden\r\n * Saves token or error received in the response from AAD in the cache. In case of id_token, it also creates the account object.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.saveTokenFromHash = function (hash, stateInfo) {\r\n this.logger.verbose(\"SaveTokenFromHash has been called\");\r\n this.logger.info(\"State status: \" + stateInfo.stateMatch + \"; Request type: \" + stateInfo.requestType);\r\n var response = {\r\n uniqueId: \"\",\r\n tenantId: \"\",\r\n tokenType: \"\",\r\n idToken: null,\r\n idTokenClaims: null,\r\n accessToken: null,\r\n scopes: [],\r\n expiresOn: null,\r\n account: null,\r\n accountState: \"\",\r\n fromCache: false\r\n };\r\n var error;\r\n var hashParams = UrlUtils.deserializeHash(hash);\r\n var authorityKey = \"\";\r\n var acquireTokenAccountKey = \"\";\r\n var idTokenObj = null;\r\n // If server returns an error\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.ERROR_DESCRIPTION) || hashParams.hasOwnProperty(ServerHashParamKeys.ERROR)) {\r\n this.logger.verbose(\"Server returned an error\");\r\n this.logger.infoPii(\"Error : \" + hashParams[ServerHashParamKeys.ERROR] + \"; Error description: \" + hashParams[ServerHashParamKeys.ERROR_DESCRIPTION]);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR, hashParams[ServerHashParamKeys.ERROR]);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR_DESC, hashParams[ServerHashParamKeys.ERROR_DESCRIPTION]);\r\n // login\r\n if (stateInfo.requestType === Constants.login) {\r\n this.logger.verbose(\"RequestType is login, caching login error, generating authorityKey\");\r\n this.cacheStorage.setItem(ErrorCacheKeys.LOGIN_ERROR, hashParams[ServerHashParamKeys.ERROR_DESCRIPTION] + \":\" + hashParams[ServerHashParamKeys.ERROR]);\r\n authorityKey = AuthCache.generateAuthorityKey(stateInfo.state);\r\n }\r\n // acquireToken\r\n if (stateInfo.requestType === Constants.renewToken) {\r\n this.logger.verbose(\"RequestType is renewToken, generating acquireTokenAccountKey\");\r\n authorityKey = AuthCache.generateAuthorityKey(stateInfo.state);\r\n var account = this.getAccount();\r\n var accountId = void 0;\r\n if (account && !StringUtils.isEmpty(account.homeAccountIdentifier)) {\r\n accountId = account.homeAccountIdentifier;\r\n this.logger.verbose(\"AccountId is set\");\r\n }\r\n else {\r\n accountId = Constants.no_account;\r\n this.logger.verbose(\"AccountId is set as no_account\");\r\n }\r\n acquireTokenAccountKey = AuthCache.generateAcquireTokenAccountKey(accountId, stateInfo.state);\r\n }\r\n var hashErr = hashParams[ServerHashParamKeys.ERROR];\r\n var hashErrDesc = hashParams[ServerHashParamKeys.ERROR_DESCRIPTION];\r\n if (InteractionRequiredAuthError.isInteractionRequiredError(hashErr) ||\r\n InteractionRequiredAuthError.isInteractionRequiredError(hashErrDesc)) {\r\n error = new InteractionRequiredAuthError(hashParams[ServerHashParamKeys.ERROR], hashParams[ServerHashParamKeys.ERROR_DESCRIPTION]);\r\n }\r\n else {\r\n error = new ServerError(hashParams[ServerHashParamKeys.ERROR], hashParams[ServerHashParamKeys.ERROR_DESCRIPTION]);\r\n }\r\n }\r\n // If the server returns \"Success\"\r\n else {\r\n this.logger.verbose(\"Server returns success\");\r\n // Verify the state from redirect and record tokens to storage if exists\r\n if (stateInfo.stateMatch) {\r\n this.logger.info(\"State is right\");\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.SESSION_STATE)) {\r\n this.logger.verbose(\"Fragment has session state, caching\");\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.SESSION_STATE, stateInfo.state), hashParams[ServerHashParamKeys.SESSION_STATE]);\r\n }\r\n response.accountState = this.getAccountState(stateInfo.state);\r\n var clientInfo = void 0;\r\n // Process access_token\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.ACCESS_TOKEN)) {\r\n this.logger.info(\"Fragment has access token\");\r\n response.accessToken = hashParams[ServerHashParamKeys.ACCESS_TOKEN];\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.SCOPE)) {\r\n response.scopes = hashParams[ServerHashParamKeys.SCOPE].split(\" \");\r\n }\r\n // retrieve the id_token from response if present\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.ID_TOKEN)) {\r\n this.logger.verbose(\"Fragment has id_token\");\r\n idTokenObj = new IdToken(hashParams[ServerHashParamKeys.ID_TOKEN]);\r\n }\r\n else {\r\n this.logger.verbose(\"No idToken on fragment, getting idToken from cache\");\r\n idTokenObj = new IdToken(this.cacheStorage.getItem(PersistentCacheKeys.IDTOKEN));\r\n }\r\n response = ResponseUtils.setResponseIdToken(response, idTokenObj);\r\n // set authority\r\n var authority = this.populateAuthority(stateInfo.state, this.inCookie, this.cacheStorage, idTokenObj);\r\n this.logger.verbose(\"Got authority from cache\");\r\n // retrieve client_info - if it is not found, generate the uid and utid from idToken\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.CLIENT_INFO)) {\r\n this.logger.verbose(\"Fragment has clientInfo\");\r\n clientInfo = new ClientInfo(hashParams[ServerHashParamKeys.CLIENT_INFO], authority);\r\n }\r\n else if (this.authorityInstance.AuthorityType === AuthorityType.Adfs) {\r\n clientInfo = ClientInfo.createClientInfoFromIdToken(idTokenObj, authority);\r\n }\r\n else {\r\n this.logger.warning(\"ClientInfo not received in the response from AAD\");\r\n }\r\n response.account = Account.createAccount(idTokenObj, clientInfo);\r\n this.logger.verbose(\"Account object created from response\");\r\n var accountKey = void 0;\r\n if (response.account && !StringUtils.isEmpty(response.account.homeAccountIdentifier)) {\r\n this.logger.verbose(\"AccountKey set\");\r\n accountKey = response.account.homeAccountIdentifier;\r\n }\r\n else {\r\n this.logger.verbose(\"AccountKey set as no_account\");\r\n accountKey = Constants.no_account;\r\n }\r\n acquireTokenAccountKey = AuthCache.generateAcquireTokenAccountKey(accountKey, stateInfo.state);\r\n var acquireTokenAccountKey_noaccount = AuthCache.generateAcquireTokenAccountKey(Constants.no_account, stateInfo.state);\r\n this.logger.verbose(\"AcquireTokenAccountKey generated\");\r\n var cachedAccount = this.cacheStorage.getItem(acquireTokenAccountKey);\r\n var acquireTokenAccount = void 0;\r\n // Check with the account in the Cache\r\n if (!StringUtils.isEmpty(cachedAccount)) {\r\n acquireTokenAccount = JSON.parse(cachedAccount);\r\n this.logger.verbose(\"AcquireToken request account retrieved from cache\");\r\n if (response.account && acquireTokenAccount && Account.compareAccounts(response.account, acquireTokenAccount)) {\r\n response = this.saveAccessToken(response, authority, hashParams, clientInfo);\r\n this.logger.info(\"The user object received in the response is the same as the one passed in the acquireToken request\");\r\n }\r\n else {\r\n this.logger.warning(\"The account object created from the response is not the same as the one passed in the acquireToken request\");\r\n }\r\n }\r\n else if (!StringUtils.isEmpty(this.cacheStorage.getItem(acquireTokenAccountKey_noaccount))) {\r\n this.logger.verbose(\"No acquireToken account retrieved from cache\");\r\n response = this.saveAccessToken(response, authority, hashParams, clientInfo);\r\n }\r\n }\r\n // Process id_token\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.ID_TOKEN)) {\r\n this.logger.info(\"Fragment has idToken\");\r\n // set the idToken\r\n idTokenObj = new IdToken(hashParams[ServerHashParamKeys.ID_TOKEN]);\r\n // set authority\r\n var authority = this.populateAuthority(stateInfo.state, this.inCookie, this.cacheStorage, idTokenObj);\r\n response = ResponseUtils.setResponseIdToken(response, idTokenObj);\r\n if (hashParams.hasOwnProperty(ServerHashParamKeys.CLIENT_INFO)) {\r\n this.logger.verbose(\"Fragment has clientInfo\");\r\n clientInfo = new ClientInfo(hashParams[ServerHashParamKeys.CLIENT_INFO], authority);\r\n }\r\n else if (this.authorityInstance.AuthorityType === AuthorityType.Adfs) {\r\n clientInfo = ClientInfo.createClientInfoFromIdToken(idTokenObj, authority);\r\n }\r\n else {\r\n this.logger.warning(\"ClientInfo not received in the response from AAD\");\r\n }\r\n this.account = Account.createAccount(idTokenObj, clientInfo);\r\n response.account = this.account;\r\n this.logger.verbose(\"Account object created from response\");\r\n if (idTokenObj && idTokenObj.nonce) {\r\n this.logger.verbose(\"IdToken has nonce\");\r\n // check nonce integrity if idToken has nonce - throw an error if not matched\r\n var cachedNonce = this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN, stateInfo.state), this.inCookie);\r\n if (idTokenObj.nonce !== cachedNonce) {\r\n this.account = null;\r\n this.cacheStorage.setItem(ErrorCacheKeys.LOGIN_ERROR, \"Nonce Mismatch. Expected Nonce: \" + cachedNonce + \",\" + \"Actual Nonce: \" + idTokenObj.nonce);\r\n this.logger.error(\"Nonce Mismatch. Expected Nonce: \" + cachedNonce + \", Actual Nonce: \" + idTokenObj.nonce);\r\n error = ClientAuthError.createNonceMismatchError(cachedNonce, idTokenObj.nonce);\r\n }\r\n // Save the token\r\n else {\r\n this.logger.verbose(\"Nonce matches, saving idToken to cache\");\r\n this.cacheStorage.setItem(PersistentCacheKeys.IDTOKEN, hashParams[ServerHashParamKeys.ID_TOKEN], this.inCookie);\r\n this.cacheStorage.setItem(PersistentCacheKeys.CLIENT_INFO, clientInfo.encodeClientInfo(), this.inCookie);\r\n // Save idToken as access token item for app itself\r\n this.saveIdToken(response, authority, hashParams, clientInfo, idTokenObj);\r\n }\r\n }\r\n else {\r\n this.logger.verbose(\"No idToken or no nonce. Cache key for Authority set as state\");\r\n authorityKey = stateInfo.state;\r\n acquireTokenAccountKey = stateInfo.state;\r\n this.logger.error(\"Invalid id_token received in the response\");\r\n error = ClientAuthError.createInvalidIdTokenError(idTokenObj);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR, error.errorCode);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR_DESC, error.errorMessage);\r\n }\r\n }\r\n }\r\n // State mismatch - unexpected/invalid state\r\n else {\r\n this.logger.verbose(\"State mismatch\");\r\n authorityKey = stateInfo.state;\r\n acquireTokenAccountKey = stateInfo.state;\r\n var expectedState = this.cacheStorage.getItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_LOGIN, stateInfo.state), this.inCookie);\r\n this.logger.error(\"State Mismatch. Expected State: \" + expectedState + \", Actual State: \" + stateInfo.state);\r\n error = ClientAuthError.createInvalidStateError(stateInfo.state, expectedState);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR, error.errorCode);\r\n this.cacheStorage.setItem(ErrorCacheKeys.ERROR_DESC, error.errorMessage);\r\n }\r\n }\r\n // Set status to completed\r\n this.cacheStorage.removeItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.RENEW_STATUS, stateInfo.state));\r\n this.cacheStorage.resetTempCacheItems(stateInfo.state);\r\n this.logger.verbose(\"Status set to complete, temporary cache cleared\");\r\n // this is required if navigateToLoginRequestUrl=false\r\n if (this.inCookie) {\r\n this.logger.verbose(\"InCookie is true, setting authorityKey in cookie\");\r\n this.cacheStorage.setItemCookie(authorityKey, \"\", -1);\r\n this.cacheStorage.clearMsalCookie(stateInfo.state);\r\n }\r\n if (error) {\r\n // Error case, set status to cancelled\r\n throw error;\r\n }\r\n if (!response) {\r\n throw AuthError.createUnexpectedError(\"Response is null\");\r\n }\r\n return response;\r\n };\r\n /**\r\n * Set Authority when saving Token from the hash\r\n * @param state\r\n * @param inCookie\r\n * @param cacheStorage\r\n * @param idTokenObj\r\n * @param response\r\n */\r\n UserAgentApplication.prototype.populateAuthority = function (state, inCookie, cacheStorage, idTokenObj) {\r\n this.logger.verbose(\"PopulateAuthority has been called\");\r\n var authorityKey = AuthCache.generateAuthorityKey(state);\r\n var cachedAuthority = cacheStorage.getItem(authorityKey, inCookie);\r\n // retrieve the authority from cache and replace with tenantID\r\n return StringUtils.isEmpty(cachedAuthority) ? cachedAuthority : UrlUtils.replaceTenantPath(cachedAuthority, idTokenObj.tenantId);\r\n };\r\n /* tslint:enable:no-string-literal */\r\n // #endregion\r\n // #region Account\r\n /**\r\n * Returns the signed in account\r\n * (the account object is created at the time of successful login)\r\n * or null when no state is found\r\n * @returns {@link Account} - the account object stored in MSAL\r\n */\r\n UserAgentApplication.prototype.getAccount = function () {\r\n // if a session already exists, get the account from the session\r\n if (this.account) {\r\n return this.account;\r\n }\r\n // frame is used to get idToken and populate the account for the given session\r\n var rawIdToken = this.cacheStorage.getItem(PersistentCacheKeys.IDTOKEN, this.inCookie);\r\n var rawClientInfo = this.cacheStorage.getItem(PersistentCacheKeys.CLIENT_INFO, this.inCookie);\r\n if (!StringUtils.isEmpty(rawIdToken) && !StringUtils.isEmpty(rawClientInfo)) {\r\n var idToken = new IdToken(rawIdToken);\r\n var clientInfo = new ClientInfo(rawClientInfo, \"\");\r\n this.account = Account.createAccount(idToken, clientInfo);\r\n return this.account;\r\n }\r\n // if login not yet done, return null\r\n return null;\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Extracts state value from the accountState sent with the authentication request.\r\n * @returns {string} scope.\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.getAccountState = function (state) {\r\n if (state) {\r\n var splitIndex = state.indexOf(Constants.resourceDelimiter);\r\n if (splitIndex > -1 && splitIndex + 1 < state.length) {\r\n return state.substring(splitIndex + 1);\r\n }\r\n }\r\n return state;\r\n };\r\n /**\r\n * Use to get a list of unique accounts in MSAL cache based on homeAccountIdentifier.\r\n *\r\n * @param {@link Array} Account - all unique accounts in MSAL cache.\r\n */\r\n UserAgentApplication.prototype.getAllAccounts = function () {\r\n var accounts = [];\r\n var accessTokenCacheItems = this.cacheStorage.getAllAccessTokens(Constants.clientId, Constants.homeAccountIdentifier);\r\n for (var i = 0; i < accessTokenCacheItems.length; i++) {\r\n var idToken = new IdToken(accessTokenCacheItems[i].value.idToken);\r\n var clientInfo = new ClientInfo(accessTokenCacheItems[i].value.homeAccountIdentifier, \"\");\r\n var account = Account.createAccount(idToken, clientInfo);\r\n accounts.push(account);\r\n }\r\n return this.getUniqueAccounts(accounts);\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Used to filter accounts based on homeAccountIdentifier\r\n * @param {Array} Accounts - accounts saved in the cache\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.getUniqueAccounts = function (accounts) {\r\n if (!accounts || accounts.length <= 1) {\r\n return accounts;\r\n }\r\n var flags = [];\r\n var uniqueAccounts = [];\r\n for (var index = 0; index < accounts.length; ++index) {\r\n if (accounts[index].homeAccountIdentifier && flags.indexOf(accounts[index].homeAccountIdentifier) === -1) {\r\n flags.push(accounts[index].homeAccountIdentifier);\r\n uniqueAccounts.push(accounts[index]);\r\n }\r\n }\r\n return uniqueAccounts;\r\n };\r\n // #endregion\r\n // #region Angular\r\n /**\r\n * @hidden\r\n *\r\n * Broadcast messages - Used only for Angular? *\r\n * @param eventName\r\n * @param data\r\n */\r\n UserAgentApplication.prototype.broadcast = function (eventName, data) {\r\n var evt = new CustomEvent(eventName, { detail: data });\r\n window.dispatchEvent(evt);\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Helper function to retrieve the cached token\r\n *\r\n * @param scopes\r\n * @param {@link Account} account\r\n * @param state\r\n * @return {@link AuthResponse} AuthResponse\r\n */\r\n UserAgentApplication.prototype.getCachedTokenInternal = function (scopes, account, state, correlationId) {\r\n // Get the current session's account object\r\n var accountObject = account || this.getAccount();\r\n if (!accountObject) {\r\n return null;\r\n }\r\n // Construct AuthenticationRequest based on response type; set \"redirectUri\" from the \"request\" which makes this call from Angular - for this.getRedirectUri()\r\n var newAuthority = this.authorityInstance ? this.authorityInstance : AuthorityFactory.CreateInstance(this.authority, this.config.auth.validateAuthority);\r\n var responseType = this.getTokenType(accountObject, scopes);\r\n var serverAuthenticationRequest = new ServerRequestParameters(newAuthority, this.clientId, responseType, this.getRedirectUri(), scopes, state, correlationId);\r\n // get cached token\r\n return this.getCachedToken(serverAuthenticationRequest, account);\r\n };\r\n /**\r\n * @hidden\r\n *\r\n * Get scopes for the Endpoint - Used in Angular to track protected and unprotected resources without interaction from the developer app\r\n * Note: Please check if we need to set the \"redirectUri\" from the \"request\" which makes this call from Angular - for this.getRedirectUri()\r\n *\r\n * @param endpoint\r\n */\r\n UserAgentApplication.prototype.getScopesForEndpoint = function (endpoint) {\r\n // if user specified list of unprotectedResources, no need to send token to these endpoints, return null.\r\n if (this.config.framework.unprotectedResources.length > 0) {\r\n for (var i = 0; i < this.config.framework.unprotectedResources.length; i++) {\r\n if (endpoint.indexOf(this.config.framework.unprotectedResources[i]) > -1) {\r\n return null;\r\n }\r\n }\r\n }\r\n // process all protected resources and send the matched one\r\n if (this.config.framework.protectedResourceMap.size > 0) {\r\n for (var _i = 0, _a = Array.from(this.config.framework.protectedResourceMap.keys()); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n // configEndpoint is like /api/Todo requested endpoint can be /api/Todo/1\r\n if (endpoint.indexOf(key) > -1) {\r\n return this.config.framework.protectedResourceMap.get(key);\r\n }\r\n }\r\n }\r\n /*\r\n * default resource will be clientid if nothing specified\r\n * App will use idtoken for calls to itself\r\n * check if it's staring from http or https, needs to match with app host\r\n */\r\n if (endpoint.indexOf(\"http://\") > -1 || endpoint.indexOf(\"https://\") > -1) {\r\n if (UrlUtils.getHostFromUri(endpoint) === UrlUtils.getHostFromUri(this.getRedirectUri())) {\r\n return new Array(this.clientId);\r\n }\r\n }\r\n else {\r\n /*\r\n * in angular level, the url for $http interceptor call could be relative url,\r\n * if it's relative call, we'll treat it as app backend call.\r\n */\r\n return new Array(this.clientId);\r\n }\r\n // if not the app's own backend or not a domain listed in the endpoints structure\r\n return null;\r\n };\r\n /**\r\n * Return boolean flag to developer to help inform if login is in progress\r\n * @returns {boolean} true/false\r\n */\r\n UserAgentApplication.prototype.getLoginInProgress = function () {\r\n return this.cacheStorage.getItem(TemporaryCacheKeys.INTERACTION_STATUS) === Constants.inProgress;\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * @param loginInProgress\r\n */\r\n UserAgentApplication.prototype.setInteractionInProgress = function (inProgress) {\r\n if (inProgress) {\r\n this.cacheStorage.setItem(TemporaryCacheKeys.INTERACTION_STATUS, Constants.inProgress);\r\n }\r\n else {\r\n this.cacheStorage.removeItem(TemporaryCacheKeys.INTERACTION_STATUS);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * @param loginInProgress\r\n */\r\n UserAgentApplication.prototype.setloginInProgress = function (loginInProgress) {\r\n this.setInteractionInProgress(loginInProgress);\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * returns the status of acquireTokenInProgress\r\n */\r\n UserAgentApplication.prototype.getAcquireTokenInProgress = function () {\r\n return this.cacheStorage.getItem(TemporaryCacheKeys.INTERACTION_STATUS) === Constants.inProgress;\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * @param acquireTokenInProgress\r\n */\r\n UserAgentApplication.prototype.setAcquireTokenInProgress = function (acquireTokenInProgress) {\r\n this.setInteractionInProgress(acquireTokenInProgress);\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * returns the logger handle\r\n */\r\n UserAgentApplication.prototype.getLogger = function () {\r\n return this.logger;\r\n };\r\n /**\r\n * Sets the logger callback.\r\n * @param logger Logger callback\r\n */\r\n UserAgentApplication.prototype.setLogger = function (logger) {\r\n this.logger = logger;\r\n };\r\n // #endregion\r\n // #region Getters and Setters\r\n /**\r\n * Use to get the redirect uri configured in MSAL or null.\r\n * Evaluates redirectUri if its a function, otherwise simply returns its value.\r\n *\r\n * @returns {string} redirect URL\r\n */\r\n UserAgentApplication.prototype.getRedirectUri = function (reqRedirectUri) {\r\n if (reqRedirectUri) {\r\n return reqRedirectUri;\r\n }\r\n else if (typeof this.config.auth.redirectUri === \"function\") {\r\n return this.config.auth.redirectUri();\r\n }\r\n return this.config.auth.redirectUri;\r\n };\r\n /**\r\n * Use to get the post logout redirect uri configured in MSAL or null.\r\n * Evaluates postLogoutredirectUri if its a function, otherwise simply returns its value.\r\n *\r\n * @returns {string} post logout redirect URL\r\n */\r\n UserAgentApplication.prototype.getPostLogoutRedirectUri = function () {\r\n if (typeof this.config.auth.postLogoutRedirectUri === \"function\") {\r\n return this.config.auth.postLogoutRedirectUri();\r\n }\r\n return this.config.auth.postLogoutRedirectUri;\r\n };\r\n /**\r\n * Use to get the current {@link Configuration} object in MSAL\r\n *\r\n * @returns {@link Configuration}\r\n */\r\n UserAgentApplication.prototype.getCurrentConfiguration = function () {\r\n if (!this.config) {\r\n throw ClientConfigurationError.createNoSetConfigurationError();\r\n }\r\n return this.config;\r\n };\r\n /**\r\n * @ignore\r\n *\r\n * Utils function to create the Authentication\r\n * @param {@link account} account object\r\n * @param scopes\r\n *\r\n * @returns {string} token type: token, id_token or id_token token\r\n *\r\n */\r\n UserAgentApplication.prototype.getTokenType = function (accountObject, scopes) {\r\n var accountsMatch = Account.compareAccounts(accountObject, this.getAccount());\r\n return ServerRequestParameters.determineResponseType(accountsMatch, scopes);\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * Sets the cachekeys for and stores the account information in cache\r\n * @param account\r\n * @param state\r\n * @hidden\r\n */\r\n UserAgentApplication.prototype.setAccountCache = function (account, state) {\r\n // Cache acquireTokenAccountKey\r\n var accountId = account ? this.getAccountId(account) : Constants.no_account;\r\n var acquireTokenAccountKey = AuthCache.generateAcquireTokenAccountKey(accountId, state);\r\n this.cacheStorage.setItem(acquireTokenAccountKey, JSON.stringify(account));\r\n };\r\n /**\r\n * @hidden\r\n * @ignore\r\n *\r\n * Sets the cacheKey for and stores the authority information in cache\r\n * @param state\r\n * @param authority\r\n * @hidden\r\n */\r\n UserAgentApplication.prototype.setAuthorityCache = function (state, authority) {\r\n // Cache authorityKey\r\n var authorityKey = AuthCache.generateAuthorityKey(state);\r\n this.cacheStorage.setItem(authorityKey, UrlUtils.CanonicalizeUri(authority), this.inCookie);\r\n };\r\n /**\r\n * Updates account, authority, and nonce in cache\r\n * @param serverAuthenticationRequest\r\n * @param account\r\n * @hidden\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.updateCacheEntries = function (serverAuthenticationRequest, account, isLoginCall, loginStartPage) {\r\n // Cache Request Originator Page\r\n if (loginStartPage) {\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.LOGIN_REQUEST, serverAuthenticationRequest.state), loginStartPage, this.inCookie);\r\n }\r\n // Cache account and authority\r\n if (isLoginCall) {\r\n // Cache the state\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.STATE_LOGIN, serverAuthenticationRequest.state), serverAuthenticationRequest.state, this.inCookie);\r\n }\r\n else {\r\n this.setAccountCache(account, serverAuthenticationRequest.state);\r\n }\r\n // Cache authorityKey\r\n this.setAuthorityCache(serverAuthenticationRequest.state, serverAuthenticationRequest.authority);\r\n // Cache nonce\r\n this.cacheStorage.setItem(AuthCache.generateTemporaryCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN, serverAuthenticationRequest.state), serverAuthenticationRequest.nonce, this.inCookie);\r\n };\r\n /**\r\n * Returns the unique identifier for the logged in account\r\n * @param account\r\n * @hidden\r\n * @ignore\r\n */\r\n UserAgentApplication.prototype.getAccountId = function (account) {\r\n // return `${account.accountIdentifier}` + Constants.resourceDelimiter + `${account.homeAccountIdentifier}`;\r\n var accountId;\r\n if (!StringUtils.isEmpty(account.homeAccountIdentifier)) {\r\n accountId = account.homeAccountIdentifier;\r\n }\r\n else {\r\n accountId = Constants.no_account;\r\n }\r\n return accountId;\r\n };\r\n /**\r\n * @ignore\r\n * @param extraQueryParameters\r\n *\r\n * Construct 'tokenRequest' from the available data in adalIdToken\r\n */\r\n UserAgentApplication.prototype.buildIDTokenRequest = function (request) {\r\n var tokenRequest = {\r\n scopes: Constants.oidcScopes,\r\n authority: this.authority,\r\n account: this.getAccount(),\r\n extraQueryParameters: request.extraQueryParameters,\r\n correlationId: request.correlationId\r\n };\r\n return tokenRequest;\r\n };\r\n /**\r\n * @ignore\r\n * @param config\r\n * @param clientId\r\n *\r\n * Construct TelemetryManager from Configuration\r\n */\r\n UserAgentApplication.prototype.getTelemetryManagerFromConfig = function (config, clientId) {\r\n if (!config) { // if unset\r\n return TelemetryManager.getTelemetrymanagerStub(clientId, this.logger);\r\n }\r\n // if set then validate\r\n var applicationName = config.applicationName, applicationVersion = config.applicationVersion, telemetryEmitter = config.telemetryEmitter;\r\n if (!applicationName || !applicationVersion || !telemetryEmitter) {\r\n throw ClientConfigurationError.createTelemetryConfigError(config);\r\n }\r\n // if valid then construct\r\n var telemetryPlatform = {\r\n applicationName: applicationName,\r\n applicationVersion: applicationVersion\r\n };\r\n var telemetryManagerConfig = {\r\n platform: telemetryPlatform,\r\n clientId: clientId\r\n };\r\n return new TelemetryManager(telemetryManagerConfig, telemetryEmitter, this.logger);\r\n };\r\n return UserAgentApplication;\r\n}());\r\nexport { UserAgentApplication };\r\n//# sourceMappingURL=UserAgentApplication.js.map","import { __decorate, __param, __awaiter } from 'tslib';\nimport { Injectable, InjectionToken, Inject, NgModule } from '@angular/core';\nimport { BehaviorSubject, from } from 'rxjs';\nimport { filter, map, mergeMap, tap } from 'rxjs/operators';\nimport { UserAgentApplication, UrlUtils, WindowUtils, InteractionRequiredAuthError, ServerHashParamKeys } from 'msal';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { Minimatch } from 'minimatch';\nimport { Location, PlatformLocation, CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/router';\nimport * as ɵngcc2 from '@angular/common';\nlet BroadcastService = class BroadcastService {\r\n constructor() {\r\n this._msalSubject = new BehaviorSubject(1);\r\n this.msalItem$ = this._msalSubject.asObservable();\r\n }\r\n broadcast(type, payload) {\r\n this._msalSubject.next({ type, payload });\r\n }\r\n getMSALSubject() {\r\n return this._msalSubject;\r\n }\r\n getMSALItem() {\r\n return this.msalItem$;\r\n }\r\n subscribe(type, callback) {\r\n return this.msalItem$\r\n .pipe(filter(message => message.type === type), map(message => message.payload))\r\n .subscribe(callback);\r\n }\r\n};\nBroadcastService.ɵfac = function BroadcastService_Factory(t) { return new (t || BroadcastService)(); };\nBroadcastService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: BroadcastService, factory: BroadcastService.ɵfac });\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass MSALError {\r\n constructor(error, errorDesc, scopes) {\r\n this._error = \"\";\r\n this._errorDesc = \"\";\r\n this._scopes = \"\";\r\n this._error = error;\r\n if (errorDesc) {\r\n this._errorDesc = errorDesc;\r\n }\r\n if (scopes) {\r\n this._scopes = scopes;\r\n }\r\n }\r\n get error() {\r\n return this._error;\r\n }\r\n set error(value) {\r\n this._error = value;\r\n }\r\n get errorDesc() {\r\n return this._errorDesc;\r\n }\r\n set errorDesc(value) {\r\n this._errorDesc = value;\r\n }\r\n get scopes() {\r\n return this._scopes;\r\n }\r\n set scopes(value) {\r\n this._scopes = value;\r\n }\r\n}\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst MSAL_CONFIG = new InjectionToken(\"MSAL_CONFIG\");\r\nconst MSAL_CONFIG_ANGULAR = new InjectionToken(\"MSAL_CONFIG_ANGULAR\");\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst buildMsalConfig = (config) => {\r\n return Object.assign(Object.assign({}, config), { framework: Object.assign(Object.assign({}, config.framework), { isAngular: true }) });\r\n};\r\nconst ɵ0 = buildMsalConfig;\r\nlet MsalService = class MsalService extends UserAgentApplication {\r\n constructor(msalConfig, msalAngularConfig, router, broadcastService) {\r\n super(buildMsalConfig(msalConfig));\r\n this.msalConfig = msalConfig;\r\n this.msalAngularConfig = msalAngularConfig;\r\n this.router = router;\r\n this.broadcastService = broadcastService;\r\n window.addEventListener(\"msal:popUpHashChanged\", () => {\r\n this.getLogger().verbose(\"popUpHashChanged \");\r\n });\r\n window.addEventListener(\"msal:popUpClosed\", (e) => {\r\n const errorParts = e.detail.split(\"|\");\r\n const msalError = new MSALError(errorParts[0], errorParts[1]);\r\n if (this.getLoginInProgress()) {\r\n broadcastService.broadcast(\"msal:loginFailure\", msalError);\r\n this.setloginInProgress(false);\r\n }\r\n else if (this.getAcquireTokenInProgress()) {\r\n broadcastService.broadcast(\"msal:acquireTokenFailure\", msalError);\r\n this.setAcquireTokenInProgress(false);\r\n }\r\n });\r\n }\r\n loginPopup(request) {\r\n return super.loginPopup(request)\r\n .then((authResponse) => {\r\n this.broadcastService.broadcast(\"msal:loginSuccess\", authResponse);\r\n return authResponse;\r\n })\r\n .catch((error) => {\r\n this.broadcastService.broadcast(\"msal:loginFailure\", error);\r\n this.getLogger().error(\"Error during login:\\n\" + error.errorMessage);\r\n throw error;\r\n });\r\n }\r\n ssoSilent(request) {\r\n return super.ssoSilent(request)\r\n .then((authResponse) => {\r\n this.broadcastService.broadcast(\"msal:ssoSuccess\", authResponse);\r\n return authResponse;\r\n })\r\n .catch((error) => {\r\n this.broadcastService.broadcast(\"msal:ssoFailure\", error);\r\n this.getLogger().error(\"Error during login:\\n\" + error.errorMessage);\r\n throw error;\r\n });\r\n }\r\n acquireTokenSilent(request) {\r\n return super.acquireTokenSilent(request)\r\n .then((authResponse) => {\r\n this.broadcastService.broadcast(\"msal:acquireTokenSuccess\", authResponse);\r\n return authResponse;\r\n })\r\n .catch((error) => {\r\n this.broadcastService.broadcast(\"msal:acquireTokenFailure\", error);\r\n this.getLogger().error(\"Error when acquiring token for scopes: \" + request.scopes + \" \" + error);\r\n throw error;\r\n });\r\n }\r\n acquireTokenPopup(request) {\r\n return super.acquireTokenPopup(request)\r\n .then((authResponse) => {\r\n this.broadcastService.broadcast(\"msal:acquireTokenSuccess\", authResponse);\r\n return authResponse;\r\n })\r\n .catch((error) => {\r\n this.broadcastService.broadcast(\"msal:acquireTokenFailure\", error);\r\n this.getLogger().error(\"Error when acquiring token for scopes : \" + request.scopes + \" \" + error);\r\n throw error;\r\n });\r\n }\r\n handleRedirectCallback(authOrTokenCallback, errorReceivedCallback) {\r\n super.handleRedirectCallback((authError, authResponse) => {\r\n if (authError) {\r\n if (!this.getAccount()) {\r\n this.broadcastService.broadcast(\"msal:loginFailure\", authError);\r\n }\r\n else {\r\n this.broadcastService.broadcast(\"msal:acquireTokenFailure\", authError);\r\n }\r\n if (errorReceivedCallback) {\r\n errorReceivedCallback(authError, authResponse.accountState);\r\n }\r\n else {\r\n authOrTokenCallback(authError, authResponse);\r\n }\r\n }\r\n else if (authResponse) {\r\n if (authResponse.tokenType === \"id_token\") {\r\n this.broadcastService.broadcast(\"msal:loginSuccess\", authResponse);\r\n }\r\n else {\r\n this.broadcastService.broadcast(\"msal:acquireTokenSuccess\", authResponse);\r\n }\r\n if (errorReceivedCallback) {\r\n authOrTokenCallback(authResponse);\r\n }\r\n else {\r\n authOrTokenCallback(null, authResponse);\r\n }\r\n }\r\n });\r\n }\r\n clearCacheForScope(accessToken) {\r\n return super.clearCacheForScope(accessToken);\r\n }\r\n getScopesForEndpoint(endpoint) {\r\n if ((this.msalConfig.framework && this.msalConfig.framework.unprotectedResources) || (this.msalAngularConfig && this.msalAngularConfig.unprotectedResources)) {\r\n this.getLogger().info(\"unprotectedResources is deprecated and ignored. msalAngularConfig.protectedResourceMap now supports glob patterns\");\r\n }\r\n const frameworkProtectedResourceMap = this.msalConfig.framework && this.msalConfig.framework.protectedResourceMap;\r\n if (frameworkProtectedResourceMap) {\r\n this.getLogger().info(\"msalConfig.framework.protectedResourceMap is deprecated, use msalAngularConfig.protectedResourceMap\");\r\n }\r\n const protectedResourceMap = frameworkProtectedResourceMap && frameworkProtectedResourceMap.size ? frameworkProtectedResourceMap : new Map(this.msalAngularConfig.protectedResourceMap);\r\n const protectedResourcesArray = Array.from(protectedResourceMap.keys());\r\n const keyMatchesEndpointArray = protectedResourcesArray.filter(key => {\r\n const minimatch = new Minimatch(key);\r\n return minimatch.match(endpoint) || endpoint.indexOf(key) > -1;\r\n });\r\n // process all protected resources and send the first matched resource\r\n if (keyMatchesEndpointArray.length > 0) {\r\n if (keyMatchesEndpointArray.length > 1) {\r\n this.getLogger().warning(\"Multiple entries in protectedResourceMap found for resource. Using first entry.\");\r\n this.getLogger().warningPii(`Multiple entries found for: ${endpoint}`);\r\n }\r\n const keyForEndpoint = keyMatchesEndpointArray[0];\r\n if (keyForEndpoint) {\r\n return protectedResourceMap.get(keyForEndpoint);\r\n }\r\n }\r\n /*\r\n * default resource will be clientid if nothing specified\r\n * App will use idtoken for calls to itself\r\n * check if it's staring from http or https, needs to match with app host\r\n */\r\n if (endpoint.indexOf(\"http://\") > -1 || endpoint.indexOf(\"https://\") > -1) {\r\n if (UrlUtils.getHostFromUri(endpoint) === UrlUtils.getHostFromUri(super.getRedirectUri())) {\r\n return new Array(this.msalConfig.auth.clientId);\r\n }\r\n }\r\n else {\r\n /*\r\n * in angular level, the url for $http interceptor call could be relative url,\r\n * if it's relative call, we'll treat it as app backend call.\r\n */\r\n return new Array(this.msalConfig.auth.clientId);\r\n }\r\n // if not the app's own backend or not a domain listed in the endpoints structure\r\n return null;\r\n }\r\n};\nMsalService.ɵfac = function MsalService_Factory(t) { return new (t || MsalService)(ɵngcc0.ɵɵinject(MSAL_CONFIG), ɵngcc0.ɵɵinject(MSAL_CONFIG_ANGULAR), ɵngcc0.ɵɵinject(ɵngcc1.Router), ɵngcc0.ɵɵinject(BroadcastService)); };\nMsalService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: MsalService, factory: MsalService.ɵfac });\r\nMsalService.ctorParameters = () => [\r\n { type: undefined, decorators: [{ type: Inject, args: [MSAL_CONFIG,] }] },\r\n { type: undefined, decorators: [{ type: Inject, args: [MSAL_CONFIG_ANGULAR,] }] },\r\n { type: Router },\r\n { type: BroadcastService }\r\n];\r\nMsalService = __decorate([ __param(0, Inject(MSAL_CONFIG)),\r\n __param(1, Inject(MSAL_CONFIG_ANGULAR))\r\n], MsalService);\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nlet MsalGuard = class MsalGuard {\r\n constructor(msalConfig, msalAngularConfig, authService, router, activatedRoute, location, platformLocation, broadcastService) {\r\n this.msalConfig = msalConfig;\r\n this.msalAngularConfig = msalAngularConfig;\r\n this.authService = authService;\r\n this.router = router;\r\n this.activatedRoute = activatedRoute;\r\n this.location = location;\r\n this.platformLocation = platformLocation;\r\n this.broadcastService = broadcastService;\r\n }\r\n /**\r\n * Builds the absolute url for the destination page\r\n * @param path Relative path of requested page\r\n * @returns Full destination url\r\n */\r\n getDestinationUrl(path) {\r\n // Absolute base url for the application (default to origin if base element not present)\r\n const baseElements = document.getElementsByTagName(\"base\");\r\n const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);\r\n // Path of page (including hash, if using hash routing)\r\n const pathUrl = this.location.prepareExternalUrl(path);\r\n // Hash location strategy\r\n if (pathUrl.startsWith(\"#\")) {\r\n return `${baseUrl}/${pathUrl}`;\r\n }\r\n /*\r\n * If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).\r\n * Since baseUrl also includes /base, can just concatentate baseUrl + path\r\n */\r\n return `${baseUrl}${path}`;\r\n }\r\n /**\r\n * Interactively prompt the user to login\r\n * @param url Path of the requested page\r\n */\r\n loginInteractively(url) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (this.msalAngularConfig.popUp) {\r\n return this.authService.loginPopup({\r\n scopes: this.msalAngularConfig.consentScopes,\r\n extraQueryParameters: this.msalAngularConfig.extraQueryParameters\r\n })\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n const redirectStartPage = this.getDestinationUrl(url);\r\n this.authService.loginRedirect({\r\n redirectStartPage,\r\n scopes: this.msalAngularConfig.consentScopes,\r\n extraQueryParameters: this.msalAngularConfig.extraQueryParameters\r\n });\r\n });\r\n }\r\n canActivate(route, state) {\r\n this.authService.getLogger().verbose(\"location change event from old url to new url\");\r\n /*\r\n * If a page with MSAL Guard is set as the redirect for acquireTokenSilent,\r\n * short-circuit to prevent redirecting or popups.\r\n */\r\n if (UrlUtils.urlContainsHash(window.location.hash) && WindowUtils.isInIframe()) {\r\n this.authService.getLogger().warning(\"redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.\");\r\n return false;\r\n }\r\n if (!this.authService.getAccount()) {\r\n return this.loginInteractively(state.url);\r\n }\r\n return this.authService.acquireTokenSilent({\r\n scopes: [this.msalConfig.auth.clientId]\r\n })\r\n .then(() => true)\r\n .catch((error) => {\r\n if (InteractionRequiredAuthError.isInteractionRequiredError(error.errorCode)) {\r\n this.authService.getLogger().info(\"Interaction required error in MSAL Guard, prompting for interaction.\");\r\n return this.loginInteractively(state.url);\r\n }\r\n this.authService.getLogger().error(`Non-interaction error in MSAL Guard: ${error.errorMessage}`);\r\n throw error;\r\n });\r\n }\r\n};\nMsalGuard.ɵfac = function MsalGuard_Factory(t) { return new (t || MsalGuard)(ɵngcc0.ɵɵinject(MSAL_CONFIG), ɵngcc0.ɵɵinject(MSAL_CONFIG_ANGULAR), ɵngcc0.ɵɵinject(MsalService), ɵngcc0.ɵɵinject(ɵngcc1.Router), ɵngcc0.ɵɵinject(ɵngcc1.ActivatedRoute), ɵngcc0.ɵɵinject(ɵngcc2.Location), ɵngcc0.ɵɵinject(ɵngcc2.PlatformLocation), ɵngcc0.ɵɵinject(BroadcastService)); };\nMsalGuard.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: MsalGuard, factory: MsalGuard.ɵfac });\r\nMsalGuard.ctorParameters = () => [\r\n { type: undefined, decorators: [{ type: Inject, args: [MSAL_CONFIG,] }] },\r\n { type: undefined, decorators: [{ type: Inject, args: [MSAL_CONFIG_ANGULAR,] }] },\r\n { type: MsalService },\r\n { type: Router },\r\n { type: ActivatedRoute },\r\n { type: Location },\r\n { type: PlatformLocation },\r\n { type: BroadcastService }\r\n];\r\nMsalGuard = __decorate([ __param(0, Inject(MSAL_CONFIG)),\r\n __param(1, Inject(MSAL_CONFIG_ANGULAR))\r\n], MsalGuard);\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nlet MsalInterceptor = class MsalInterceptor {\r\n constructor(auth, broadcastService) {\r\n this.auth = auth;\r\n this.broadcastService = broadcastService;\r\n }\r\n intercept(req, next) {\r\n const scopes = this.auth.getScopesForEndpoint(req.url);\r\n this.auth.getLogger().verbose(\"Url: \" + req.url + \" maps to scopes: \" + scopes);\r\n // If there are no scopes set for this request, do nothing.\r\n if (!scopes) {\r\n return next.handle(req);\r\n }\r\n let token;\r\n // Acquire a token for this request, and attach as proper auth header.\r\n return from(this.auth.acquireTokenSilent({ scopes })\r\n .then((response) => {\r\n token = response.tokenType === ServerHashParamKeys.ID_TOKEN ? response.idToken.rawIdToken : response.accessToken;\r\n const authHeader = `Bearer ${token}`;\r\n return req.clone({\r\n setHeaders: {\r\n Authorization: authHeader,\r\n }\r\n });\r\n }))\r\n .pipe(mergeMap(nextReq => next.handle(nextReq)), tap(() => { }, err => {\r\n if (err instanceof HttpErrorResponse && err.status === 401) {\r\n this.auth.clearCacheForScope(token);\r\n this.broadcastService.broadcast(\"msal:notAuthorized\", err.message);\r\n }\r\n }));\r\n }\r\n};\nMsalInterceptor.ɵfac = function MsalInterceptor_Factory(t) { return new (t || MsalInterceptor)(ɵngcc0.ɵɵinject(MsalService), ɵngcc0.ɵɵinject(BroadcastService)); };\nMsalInterceptor.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: MsalInterceptor, factory: MsalInterceptor.ɵfac });\r\nMsalInterceptor.ctorParameters = () => [\r\n { type: MsalService },\r\n { type: BroadcastService }\r\n];\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst defaultMsalAngularConfiguration = {\r\n consentScopes: [],\r\n popUp: false,\r\n extraQueryParameters: {},\r\n unprotectedResources: [],\r\n protectedResourceMap: []\r\n};\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nvar MsalModule_1;\r\nlet MsalModule = MsalModule_1 = class MsalModule {\r\n static forRoot(config, angularConfig = defaultMsalAngularConfiguration) {\r\n return {\r\n ngModule: MsalModule_1,\r\n providers: [\r\n {\r\n provide: MSAL_CONFIG,\r\n useValue: config\r\n },\r\n {\r\n provide: MSAL_CONFIG_ANGULAR,\r\n useValue: angularConfig\r\n },\r\n MsalService\r\n ]\r\n };\r\n }\r\n};\nMsalModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: MsalModule });\nMsalModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function MsalModule_Factory(t) { return new (t || MsalModule)(); }, providers: [MsalGuard, BroadcastService], imports: [[CommonModule]] });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BroadcastService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MsalService, [{\n type: Injectable\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [MSAL_CONFIG]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MSAL_CONFIG_ANGULAR]\n }] }, { type: ɵngcc1.Router }, { type: BroadcastService }]; }, null); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MsalGuard, [{\n type: Injectable\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [MSAL_CONFIG]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MSAL_CONFIG_ANGULAR]\n }] }, { type: MsalService }, { type: ɵngcc1.Router }, { type: ɵngcc1.ActivatedRoute }, { type: ɵngcc2.Location }, { type: ɵngcc2.PlatformLocation }, { type: BroadcastService }]; }, null); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MsalInterceptor, [{\n type: Injectable\n }], function () { return [{ type: MsalService }, { type: BroadcastService }]; }, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MsalModule, { imports: function () { return [CommonModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MsalModule, [{\n type: NgModule,\n args: [{\n imports: [CommonModule],\n declarations: [],\n providers: [MsalGuard, BroadcastService]\n }]\n }], null, null); })();\n\n/**\r\n * Generated bundle index. Do not edit.\r\n */\n\nexport { BroadcastService, MSAL_CONFIG, MSAL_CONFIG_ANGULAR, MsalGuard, MsalInterceptor, MsalModule, MsalService, defaultMsalAngularConfiguration as ɵa };\n\n//# sourceMappingURL=azure-msal-angular.js.map","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { InjectionToken, Injectable, EventEmitter, Component, ElementRef, HostBinding, Output, Input, isDevMode, Directive, NgZone, Renderer2, Optional, Inject, forwardRef, NgModule } from '@angular/core';\nimport { filter, debounceTime, take } from 'rxjs/operators';\nimport { fromEvent } from 'rxjs';\nimport { PopupService, PopupModule } from '@progress/kendo-angular-popup';\nimport { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Obsolete. Provide the TooltipSettings class instead.\n *\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc2 from '@angular/common';\nimport * as ɵngcc3 from '@progress/kendo-angular-popup';\n\nvar I18N_0;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the close button\n * @meaning kendo.tooltip.closeTitle\n */ \n const MSG_EXTERNAL_1245147641110884896$$DIST_FESM2015_INDEX_JS_1 = goog.getMsg(\"Close\");\n I18N_0 = MSG_EXTERNAL_1245147641110884896$$DIST_FESM2015_INDEX_JS_1;\n}\nelse {\n I18N_0 = $localize `:kendo.tooltip.closeTitle|The title of the close button␟de53b3f74f2d4a81b5c3f54c0ac1269cb017bd4f␟1245147641110884896:Close`;\n}\nconst _c2 = [\"closeTitle\", I18N_0];\nfunction TooltipContentComponent_div_3_ng_template_1_Template(rf, ctx) { }\nconst _c3 = function (a0, a1) { return { $implicit: a0, anchor: a1 }; };\nfunction TooltipContentComponent_div_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 7);\n ɵngcc0.ɵɵtemplate(1, TooltipContentComponent_div_3_ng_template_1_Template, 0, 0, \"ng-template\", 3);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r253 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r253.titleTemplate)(\"ngTemplateOutlet\", ctx_r253.titleTemplate)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(3, _c3, ctx_r253.anchor, ctx_r253.anchor));\n} }\nfunction TooltipContentComponent_ng_template_4_Template(rf, ctx) { }\nfunction TooltipContentComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const ctx_r255 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r255.templateString, \" \");\n} }\nfunction TooltipContentComponent_div_6_Template(rf, ctx) { if (rf & 1) {\n const _r260 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 8);\n ɵngcc0.ɵɵlistener(\"click\", function TooltipContentComponent_div_6_Template_div_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r260); const ctx_r259 = ɵngcc0.ɵɵnextContext(); return ctx_r259.onCloseClick($event); });\n ɵngcc0.ɵɵelement(1, \"a\", 9);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r256 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r256.closeButtonTitle);\n} }\nfunction TooltipContentComponent_div_7_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"div\", 10);\n} if (rf & 2) {\n const ctx_r257 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r257.calloutPositionClass());\n} }\nconst TOOLTIP_SETTINGS = new InjectionToken('kendo-ui-tooltip-settings');\n/**\n * Provides a global configuration for the Kendo UI Tooltip. Once injected through\n * the `AppComponent` constructor, the configuration properties can be overridden.\n *\n * @example\n * ```ts-no-run\n * import { TooltipSettings } from '@progress/kendo-angular-tooltip';\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n *
\n * \n *
`,\n * providers: [{\n * provide: TooltipSettings,\n * useFactory: (): TooltipSettings => ({\n * // Override default values of tooltips if wanted\n * position: 'right'\n * })\n * }]\n * })\n * export class AppComponent { }\n * ```\n */\nclass TooltipSettings {\n}\nTooltipSettings.ɵfac = function TooltipSettings_Factory(t) { return new (t || TooltipSettings)(); };\nTooltipSettings.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: TooltipSettings, factory: TooltipSettings.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TooltipSettings, [{\n type: Injectable\n }], null, null); })();\n\n/**\n * @hidden\n */\nfunction align(position, offset) {\n let anchorAlign = {};\n let popupAlign = {};\n let popupMargin = {};\n switch (position) {\n case 'top':\n anchorAlign = { horizontal: 'center', vertical: 'top' };\n popupAlign = { horizontal: 'center', vertical: 'bottom' };\n popupMargin = { horizontal: 0, vertical: offset };\n break;\n case 'bottom':\n anchorAlign = { horizontal: 'center', vertical: 'bottom' };\n popupAlign = { horizontal: 'center', vertical: 'top' };\n popupMargin = { horizontal: 0, vertical: offset };\n break;\n case 'right':\n anchorAlign = { horizontal: 'right', vertical: 'center' };\n popupAlign = { horizontal: 'left', vertical: 'center' };\n popupMargin = { horizontal: offset, vertical: 0 };\n break;\n case 'left':\n anchorAlign = { horizontal: 'left', vertical: 'center' };\n popupAlign = { horizontal: 'right', vertical: 'center' };\n popupMargin = { horizontal: offset, vertical: 0 };\n break;\n default: break;\n }\n return {\n anchorAlign,\n popupAlign,\n popupMargin\n };\n}\n/**\n * @hidden\n */\nfunction collision(inputcollision, position) {\n if (inputcollision) {\n return inputcollision;\n }\n if (position === 'top' || position === 'bottom') {\n return { horizontal: 'fit', vertical: 'flip' };\n }\n return { horizontal: 'flip', vertical: 'fit' };\n}\nfunction isDocumentNode(container) {\n return container.nodeType === 9;\n}\n/**\n * @hidden\n */\nfunction closest(element, selector) {\n if (element.closest) {\n return element.closest(selector);\n }\n const matches = Element.prototype.matches ?\n (el, sel) => el.matches(sel)\n : (el, sel) => el.msMatchesSelector(sel);\n let node = element;\n while (node && !isDocumentNode(node)) {\n if (matches(node, selector)) {\n return node;\n }\n node = node.parentNode;\n }\n}\n/**\n * @hidden\n */\nfunction contains(container, child) {\n if (!container) {\n return false;\n }\n if (isDocumentNode(container)) {\n return false;\n }\n if (container.contains) {\n return container.contains(child);\n }\n if (container.compareDocumentPosition) {\n // tslint:disable-next-line\n return !!(container.compareDocumentPosition(child) & Node.DOCUMENT_POSITION_CONTAINED_BY);\n }\n}\n/**\n * @hidden\n */\nconst hasParent = (node, parent) => {\n while (node && node !== parent) {\n node = node.parentNode;\n }\n return node;\n};\n/**\n * @hidden\n */\nfunction getCenterOffset(item, dir, size) {\n const rect = item.getBoundingClientRect();\n return rect[dir] + (rect[size] / 2);\n}\n/**\n * @hidden\n */\nfunction containsItem(collection, item) {\n return collection.indexOf(item) !== -1;\n}\n\n/**\n * @hidden\n */\nclass TooltipContentComponent {\n constructor(content, localizationService) {\n this.content = content;\n this.localizationService = localizationService;\n this.close = new EventEmitter();\n this.tooltipWidth = null;\n this.tooltipHeight = null;\n this.callout = true;\n this.calloutStyles = (position, calloutSize, isFlip) => {\n const styles = {};\n const isVertical = position === 'top' || position === 'bottom';\n const flipDeg = '180deg';\n const zeroDeg = '0deg';\n if (!isFlip) {\n styles.transform = isVertical ? `rotateX(${zeroDeg})` : `rotateY(${zeroDeg})`;\n return styles;\n }\n if (position === 'top') {\n styles.bottom = 'unset';\n }\n else if (position === 'bottom') {\n styles.top = 'unset';\n }\n else if (position === 'left') {\n styles.right = 'unset';\n }\n else if (position === 'right') {\n styles.left = 'unset';\n }\n styles[position] = `${-calloutSize}px`;\n styles.transform = isVertical ? `rotateX(${flipDeg})` : `rotateY(${flipDeg})`;\n return styles;\n };\n this.direction = localizationService.rtl ? 'rtl' : 'ltr';\n }\n get cssClasses() {\n return 'k-widget k-tooltip';\n }\n get className() {\n return this.closable;\n }\n get cssPosition() {\n return 'relative';\n }\n ngOnInit() {\n this.dynamicRTLSubscription = this.localizationService.changes\n .subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n get closeButtonTitle() {\n return this.closeTitle || this.localizationService.get('closeTitle');\n }\n calloutPositionClass() {\n return {\n 'top': 'k-callout-s',\n 'left': 'k-callout-e',\n 'bottom': 'k-callout-n',\n 'right': 'k-callout-w'\n }[this.position];\n }\n onCloseClick(event) {\n event.preventDefault();\n this.close.emit();\n }\n updateCalloutPosition(position, isFlip) {\n if (!this.callout) {\n return;\n }\n const callout = this.content.nativeElement.querySelector('.k-callout');\n const isVertical = position === 'top' || position === 'bottom';\n const size = isVertical ? 'width' : 'height';\n const dir = isVertical ? 'left' : 'top';\n const offsetProperty = isVertical ? 'marginLeft' : 'marginTop';\n const calloutSize = callout.getBoundingClientRect()[size];\n const anchorCenter = getCenterOffset(this.anchor.nativeElement, dir, size);\n const contentCenter = getCenterOffset(this.content.nativeElement, dir, size);\n const diff = Math.abs(contentCenter - anchorCenter);\n if (diff > 1 || diff === 0 || Math.round(diff) === 0) {\n const newMargin = contentCenter - anchorCenter + (calloutSize / 2);\n callout.style[offsetProperty] = `${-newMargin}px`;\n }\n const calloutStyles = this.calloutStyles(position, calloutSize, isFlip);\n Object.keys(calloutStyles).forEach((style) => {\n callout.style[style] = calloutStyles[style];\n });\n }\n}\nTooltipContentComponent.ɵfac = function TooltipContentComponent_Factory(t) { return new (t || TooltipContentComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nTooltipContentComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TooltipContentComponent, selectors: [[\"kendo-tooltip\"]], hostVars: 11, hostBindings: function TooltipContentComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵclassMap(ctx.cssClasses);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.tooltipWidth, \"px\")(\"height\", ctx.tooltipHeight, \"px\")(\"position\", ctx.cssPosition);\n ɵngcc0.ɵɵclassProp(\"k-tooltip-closable\", ctx.className);\n } }, inputs: { tooltipWidth: \"tooltipWidth\", tooltipHeight: \"tooltipHeight\", titleTemplate: \"titleTemplate\", anchor: \"anchor\", closable: \"closable\", templateRef: \"templateRef\", templateString: \"templateString\" }, outputs: { close: \"close\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.tooltip'\n }\n ])], decls: 8, vars: 10, consts: [[\"kendoTooltipLocalizedMessages\", \"\", 6, \"closeTitle\"], [1, \"k-tooltip-content\"], [\"class\", \"k-tooltip-title\", 4, \"ngIf\"], [3, \"ngIf\", \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [3, \"ngIf\"], [\"class\", \"k-tooltip-button\", 3, \"click\", 4, \"ngIf\"], [\"class\", \"k-callout\", 3, \"ngClass\", 4, \"ngIf\"], [1, \"k-tooltip-title\"], [1, \"k-tooltip-button\", 3, \"click\"], [\"href\", \"#\", 1, \"k-icon\", \"k-i-close\"], [1, \"k-callout\", 3, \"ngClass\"]], template: function TooltipContentComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c2);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"div\", 1);\n ɵngcc0.ɵɵtemplate(3, TooltipContentComponent_div_3_Template, 2, 6, \"div\", 2);\n ɵngcc0.ɵɵtemplate(4, TooltipContentComponent_ng_template_4_Template, 0, 0, \"ng-template\", 3);\n ɵngcc0.ɵɵtemplate(5, TooltipContentComponent_ng_template_5_Template, 1, 1, \"ng-template\", 4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(6, TooltipContentComponent_div_6_Template, 2, 1, \"div\", 5);\n ɵngcc0.ɵɵtemplate(7, TooltipContentComponent_div_7_Template, 1, 1, \"div\", 6);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.titleTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.templateRef)(\"ngTemplateOutlet\", ctx.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(7, _c3, ctx.anchor, ctx.anchor));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.templateString);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.closable);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.callout);\n } }, directives: function () { return [LocalizedMessagesDirective, ɵngcc2.NgIf, ɵngcc2.NgTemplateOutlet, ɵngcc2.NgClass]; }, encapsulation: 2 });\n/** @nocollapse */\nTooltipContentComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: LocalizationService }\n];\nTooltipContentComponent.propDecorators = {\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n close: [{ type: Output }],\n cssClasses: [{ type: HostBinding, args: ['class',] }],\n className: [{ type: HostBinding, args: ['class.k-tooltip-closable',] }],\n cssPosition: [{ type: HostBinding, args: ['style.position',] }],\n tooltipWidth: [{ type: HostBinding, args: ['style.width.px',] }, { type: Input }],\n tooltipHeight: [{ type: HostBinding, args: ['style.height.px',] }, { type: Input }],\n titleTemplate: [{ type: Input }],\n anchor: [{ type: Input }],\n closable: [{ type: Input }],\n templateRef: [{ type: Input }],\n templateString: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TooltipContentComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-tooltip',\n template: `\n \n \n\n
\n
\n \n \n
\n\n \n \n \n {{ templateString }}\n \n
\n\n
\n \n
\n\n
\n `,\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.tooltip'\n }\n ]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.LocalizationService }]; }, { close: [{\n type: Output\n }], tooltipWidth: [{\n type: HostBinding,\n args: ['style.width.px']\n }, {\n type: Input\n }], tooltipHeight: [{\n type: HostBinding,\n args: ['style.height.px']\n }, {\n type: Input\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], cssClasses: [{\n type: HostBinding,\n args: ['class']\n }], className: [{\n type: HostBinding,\n args: ['class.k-tooltip-closable']\n }], cssPosition: [{\n type: HostBinding,\n args: ['style.position']\n }], titleTemplate: [{\n type: Input\n }], anchor: [{\n type: Input\n }], closable: [{\n type: Input\n }], templateRef: [{\n type: Input\n }], templateString: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the [Kendo UI Tooltip directive for Angular]({% slug overview_tooltip %}).\n * Used to display additional information that is related to an element.\n *\n * @example\n * ```ts-no-run\n *
\n * foo\n *
\n * ```\n */\nclass TooltipDirective {\n constructor(tooltipWrapper, ngZone, renderer, popupService, settings, legacySettings) {\n this.tooltipWrapper = tooltipWrapper;\n this.ngZone = ngZone;\n this.renderer = renderer;\n this.popupService = popupService;\n /**\n * Specifies a selector for elements within a container which will display a tooltip\n * ([see example]({% slug anchorelements_tooltip %})). The possible values include any\n * DOM `selector`. The default value is `[title]`.\n */\n this.filter = '[title]';\n /**\n * Specifies the position of the Tooltip that is relative to the\n * anchor element ([see example]({% slug positioning_tooltip %})).\n *\n * The possible values are:\n * * `top` (default)\n * * `bottom`\n * * `left`\n * * `right`\n */\n this.position = 'top';\n /**\n * Specifies the delay in milliseconds before the Tooltip is shown.\n * * `100` (default) milliseconds.\n */\n this.showAfter = 100;\n /**\n * Specifies if the Тooltip will display a callout arrow.\n *\n * The possible values are:\n * * `true` (default)\n * * `false`\n */\n this.callout = true;\n /**\n * Specifies if the Тooltip will display a **Close** button\n * ([see example]({% slug closable_tooltip %})).\n *\n * The possible values are:\n * * `true`\n * * `false`\n */\n this.closable = false;\n /**\n * Specifies the offset in pixels between the Tooltip and the anchor. Defaults to `6` pixels.\n * If the `callout` property is set to `true`, the offset is rendered from the callout arrow.\n * If the `callout` property is set to `false`, the offset is rendered from the content of the Tooltip.\n */\n this.offset = 6;\n this.anchor = null;\n this.validPositions = ['top', 'bottom', 'right', 'left'];\n this.validShowOptions = ['hover', 'click', 'none'];\n Object.assign(this, settings, legacySettings);\n this.ngZone.runOutsideAngular(() => {\n const wrapper = this.tooltipWrapper.nativeElement;\n this.anchorTitleSubscription = fromEvent(wrapper, 'mouseover')\n .pipe(filter(() => this.filter !== ''))\n .subscribe((e) => {\n const filterElement = closest(e.target, this.filter);\n if (filterElement) {\n this.hideElementTitle({ nativeElement: filterElement });\n }\n });\n this.mouseOverSubscription = fromEvent(wrapper, 'mouseover')\n .pipe(debounceTime(100), filter(() => this.filter !== ''))\n .subscribe(e => this.onMouseOver(e));\n this.mouseOutSubscription = fromEvent(wrapper, 'mouseout')\n .pipe(debounceTime(100))\n .subscribe(e => this.onMouseOut(e));\n });\n }\n /**\n * Sets the content of the Tooltip as a template reference\n * ([see example]({% slug templates_tooltip %})).\n */\n set tooltipTemplate(value) {\n this.template = value;\n }\n get tooltipTemplate() { return this.template; }\n /**\n * Shows the Tooltip.\n * @param anchor— ElementRef|Element.\n * Specifies the element that will be used as an anchor. The Tooltip opens relative to that element.\n */\n show(anchor) {\n if (this.popupRef) {\n return;\n }\n if (anchor instanceof Element) {\n anchor = { nativeElement: anchor };\n }\n this.anchor = anchor;\n if (this.showOn === 'hover') {\n if (this.popupRef) {\n return;\n }\n clearTimeout(this.showTimeout);\n this.showTimeout = window.setTimeout(() => this.showContent(this.anchor), this.showAfter);\n }\n else {\n this.hideElementTitle(this.anchor);\n this.showContent(this.anchor);\n }\n }\n /**\n * Hides the Tooltip.\n */\n hide() {\n clearTimeout(this.showTimeout);\n const anchor = this.anchor && this.anchor.nativeElement;\n if (anchor && anchor.getAttribute('data-title')) {\n if (!anchor.getAttribute('title')) {\n anchor.setAttribute('title', anchor.getAttribute('data-title'));\n }\n anchor.setAttribute('data-title', '');\n }\n if (this.popupMouseOutSubscription) {\n this.popupMouseOutSubscription.unsubscribe();\n }\n if (this.closeClickSubscription) {\n this.closeClickSubscription.unsubscribe();\n }\n this.closePopup();\n }\n /**\n * Toggle visibility of the Tooltip.\n *\n * @param anchor— ElementRef|Element. Specifies the element that will be used as an anchor.\n * @param show— Optional. Boolean. Specifies if the Tooltip will be rendered.\n */\n toggle(anchor, show) {\n const previousAnchor = this.anchor && this.anchor.nativeElement;\n if (anchor instanceof Element) {\n anchor = { nativeElement: anchor };\n }\n if (previousAnchor !== anchor.nativeElement) {\n this.hide();\n }\n if (previousAnchor === anchor.nativeElement && this.showOn === 'click') {\n this.hide();\n }\n if (typeof show === 'undefined') {\n show = !this.popupRef;\n }\n if (show) {\n this.show(anchor);\n }\n else {\n this.hide();\n }\n }\n ngOnInit() {\n if (this.showOn === undefined) {\n this.showOn = 'hover';\n }\n this.verifyProperties();\n }\n ngOnChanges(changes) {\n if (changes.showOn) {\n this.subscribeClick();\n }\n }\n ngAfterViewChecked() {\n if (!this.popupRef) {\n return;\n }\n if (this.anchor &&\n !hasParent(this.anchor.nativeElement || this.anchor, this.tooltipWrapper.nativeElement)) {\n this.anchor = null;\n this.hide();\n }\n }\n ngOnDestroy() {\n this.hide();\n this.template = null;\n this.anchorTitleSubscription.unsubscribe();\n this.mouseOverSubscription.unsubscribe();\n this.mouseOutSubscription.unsubscribe();\n if (this.mouseClickSubscription) {\n this.mouseClickSubscription.unsubscribe();\n }\n if (this.popupPositionChangeSubscription) {\n this.popupPositionChangeSubscription.unsubscribe();\n }\n if (this.popupMouseOutSubscription) {\n this.popupMouseOutSubscription.unsubscribe();\n }\n }\n showContent(anchorRef) {\n if (!anchorRef.nativeElement.getAttribute('data-title') && !this.template) {\n return;\n }\n this.ngZone.run(() => {\n this.openPopup(anchorRef);\n this.bindContent(this.popupRef.content, anchorRef);\n });\n this.popupRef.popupAnchorViewportLeave\n .pipe(take(1))\n .subscribe(() => this.hide());\n }\n bindContent(contentComponent, anchorRef) {\n const content = contentComponent.instance;\n this.closeClickSubscription = content.close\n .subscribe(() => { this.hide(); });\n if (!this.template) {\n content.templateString = this.anchor.nativeElement.getAttribute('data-title');\n }\n else {\n content.templateRef = this.template;\n }\n if (this.titleTemplate) {\n content.titleTemplate = this.titleTemplate;\n }\n content.closeTitle = this.closeTitle;\n content.anchor = anchorRef;\n content.callout = this.callout;\n content.closable = this.closable;\n content.position = this.position;\n content.tooltipWidth = this.tooltipWidth;\n content.tooltipHeight = this.tooltipHeight;\n this.popupRef.content.changeDetectorRef.detectChanges();\n }\n hideElementTitle(elementRef) {\n const element = elementRef.nativeElement;\n if (element.getAttribute('title')) {\n element.setAttribute('data-title', element.getAttribute('title'));\n element.setAttribute('title', '');\n }\n }\n openPopup(anchorRef) {\n const alignSettings = align(this.position, this.offset);\n const anchorAlign = alignSettings.anchorAlign;\n const popupAlign = alignSettings.popupAlign;\n const popupMargin = alignSettings.popupMargin;\n this.popupRef = this.popupService.open({\n anchor: anchorRef,\n anchorAlign,\n animate: false,\n content: TooltipContentComponent,\n collision: collision(this.collision, this.position),\n margin: popupMargin,\n popupAlign,\n popupClass: 'k-popup-transparent'\n });\n this.renderer.addClass(this.popupRef.popupElement, 'k-tooltip-wrapper');\n if (this.tooltipClass) {\n this.renderer.addClass(this.popupRef.popupElement, this.tooltipClass);\n }\n const popupInstance = this.popupRef.content.instance;\n if (popupInstance.callout) {\n this.popupPositionChangeSubscription = this.popupRef.popupPositionChange\n .subscribe(({ flip }) => {\n const isFlip = flip.horizontal === true || flip.vertical === true;\n popupInstance.updateCalloutPosition(this.position, isFlip);\n });\n }\n if (this.showOn === 'hover') {\n this.ngZone.runOutsideAngular(() => {\n const popup = this.popupRef.popupElement;\n this.popupMouseOutSubscription = fromEvent(popup, 'mouseout')\n .subscribe((e) => this.onMouseOut(e));\n });\n }\n }\n closePopup() {\n if (this.popupRef) {\n this.popupRef.close();\n this.popupRef = null;\n }\n if (this.popupPositionChangeSubscription) {\n this.popupPositionChangeSubscription.unsubscribe();\n }\n }\n subscribeClick() {\n if (this.mouseClickSubscription) {\n this.mouseClickSubscription.unsubscribe();\n }\n if (this.showOn === 'click') {\n this.mouseClickSubscription = fromEvent(document, 'click')\n .pipe(filter(() => this.filter !== ''))\n .subscribe(e => this.onMouseClick(e, this.tooltipWrapper.nativeElement));\n }\n }\n onMouseClick(e, wrapper) {\n const target = e.target;\n const filterElement = closest(target, this.filter);\n const popup = this.popupRef && this.popupRef.popupElement;\n if (popup) {\n if (popup.contains(target)) {\n return;\n }\n if (this.closable) {\n return;\n }\n }\n if (wrapper.contains(target) && filterElement) {\n this.toggle(filterElement, true);\n }\n else if (popup) {\n this.hide();\n }\n }\n onMouseOver(e) {\n const filterElement = closest(e.target, this.filter);\n if (this.showOn !== 'hover') {\n return;\n }\n if (filterElement) {\n this.toggle(filterElement, true);\n }\n }\n onMouseOut(e) {\n if (this.showOn !== 'hover') {\n return;\n }\n if (this.closable) {\n return;\n }\n const popup = this.popupRef && this.popupRef.popupElement;\n const relatedTarget = e.relatedTarget;\n if (relatedTarget && this.anchor && contains(this.anchor.nativeElement, relatedTarget)) {\n return;\n }\n if (relatedTarget && contains(popup, relatedTarget)) {\n return;\n }\n this.hide();\n }\n verifyProperties() {\n if (!isDevMode()) {\n return;\n }\n if (!containsItem(this.validPositions, this.position)) {\n throw new Error(`Invalid value provided for position property.The available options are 'top', 'bottom', 'left', or 'right'.`);\n }\n if (!containsItem(this.validShowOptions, this.showOn)) {\n throw new Error(`Invalid value provided for showOn property.The available options are 'hover' or 'none'.`);\n }\n }\n}\nTooltipDirective.ɵfac = function TooltipDirective_Factory(t) { return new (t || TooltipDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.PopupService), ɵngcc0.ɵɵdirectiveInject(TooltipSettings, 8), ɵngcc0.ɵɵdirectiveInject(TOOLTIP_SETTINGS, 8)); };\nTooltipDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TooltipDirective, selectors: [[\"\", \"kendoTooltip\", \"\"]], inputs: { filter: \"filter\", position: \"position\", showAfter: \"showAfter\", callout: \"callout\", closable: \"closable\", offset: \"offset\", tooltipTemplate: \"tooltipTemplate\", showOn: \"showOn\", titleTemplate: \"titleTemplate\", tooltipWidth: \"tooltipWidth\", tooltipHeight: \"tooltipHeight\", tooltipClass: \"tooltipClass\", collision: \"collision\", closeTitle: \"closeTitle\" }, exportAs: [\"kendoTooltip\"], features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nTooltipDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: NgZone },\n { type: Renderer2 },\n { type: PopupService },\n { type: TooltipSettings, decorators: [{ type: Optional }] },\n { type: TooltipSettings, decorators: [{ type: Optional }, { type: Inject, args: [TOOLTIP_SETTINGS,] }] }\n];\nTooltipDirective.propDecorators = {\n filter: [{ type: Input }],\n position: [{ type: Input }],\n titleTemplate: [{ type: Input }],\n showOn: [{ type: Input }],\n showAfter: [{ type: Input }],\n callout: [{ type: Input }],\n closable: [{ type: Input }],\n offset: [{ type: Input }],\n tooltipWidth: [{ type: Input }],\n tooltipHeight: [{ type: Input }],\n tooltipClass: [{ type: Input }],\n collision: [{ type: Input }],\n closeTitle: [{ type: Input }],\n tooltipTemplate: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TooltipDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoTooltip]',\n exportAs: 'kendoTooltip'\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc3.PopupService }, { type: TooltipSettings, decorators: [{\n type: Optional\n }] }, { type: TooltipSettings, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [TOOLTIP_SETTINGS]\n }] }]; }, { filter: [{\n type: Input\n }], position: [{\n type: Input\n }], showAfter: [{\n type: Input\n }], callout: [{\n type: Input\n }], closable: [{\n type: Input\n }], offset: [{\n type: Input\n }], tooltipTemplate: [{\n type: Input\n }], showOn: [{\n type: Input\n }], titleTemplate: [{\n type: Input\n }], tooltipWidth: [{\n type: Input\n }], tooltipHeight: [{\n type: Input\n }], tooltipClass: [{\n type: Input\n }], collision: [{\n type: Input\n }], closeTitle: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends ComponentMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoTooltipLocalizedMessages\", \"\"]], inputs: { closeTitle: \"closeTitle\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ComponentMessages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\nLocalizedMessagesDirective.propDecorators = {\n closeTitle: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: ComponentMessages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: `[kendoTooltipLocalizedMessages]`\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { closeTitle: [{\n type: Input\n }] }); })();\n\nconst COMPONENT_DIRECTIVES = [TooltipDirective, TooltipContentComponent, LocalizedMessagesDirective];\nconst COMPONENT_MODULES = [PopupModule];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Tooltip component.\n *\n * The package exports:\n * - `KendoTooltipDirective`—The Tooltip directive class.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Tooltip module\n * import { TooltipModule } from '@progress/kendo-angular-tooltip';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * _@NgModule{{\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, TooltipModule], // import TooltipModule module\n * bootstrap: [AppComponent]\n * }}\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n * ```\n */\nclass TooltipModule {\n}\nTooltipModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: TooltipModule });\nTooltipModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function TooltipModule_Factory(t) { return new (t || TooltipModule)(); }, imports: [[CommonModule, ...COMPONENT_MODULES]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(TooltipModule, { declarations: function () { return [TooltipDirective,\n TooltipContentComponent,\n LocalizedMessagesDirective]; }, imports: function () { return [CommonModule,\n PopupModule]; }, exports: function () { return [TooltipDirective,\n TooltipContentComponent,\n LocalizedMessagesDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TooltipModule, [{\n type: NgModule,\n args: [{\n declarations: [COMPONENT_DIRECTIVES],\n entryComponents: [TooltipContentComponent],\n imports: [CommonModule, ...COMPONENT_MODULES],\n exports: [COMPONENT_DIRECTIVES]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { LocalizedMessagesDirective, TooltipContentComponent, TooltipDirective, TooltipModule, TooltipSettings, TOOLTIP_SETTINGS };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUpBNkNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztxaUJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OzswQkFRRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4qIENvcHlyaWdodCDCqSAyMDIwIFByb2dyZXNzIFNvZnR3YXJlIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKiBMaWNlbnNlZCB1bmRlciBjb21tZXJjaWFsIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLm1kIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IEluamVjdGlvblRva2VuLCBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE91dHB1dCwgSW5wdXQsIGlzRGV2TW9kZSwgRGlyZWN0aXZlLCBOZ1pvbmUsIFJlbmRlcmVyMiwgT3B0aW9uYWwsIEluamVjdCwgZm9yd2FyZFJlZiwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgZGVib3VuY2VUaW1lLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb3B1cFNlcnZpY2UsIFBvcHVwTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItcG9wdXAnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSwgTDEwTl9QUkVGSVgsIENvbXBvbmVudE1lc3NhZ2VzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIE9ic29sZXRlLiBQcm92aWRlIHRoZSBUb29sdGlwU2V0dGluZ3MgY2xhc3MgaW5zdGVhZC5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IFRPT0xUSVBfU0VUVElOR1MgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2tlbmRvLXVpLXRvb2x0aXAtc2V0dGluZ3MnKTtcbi8qKlxuICogUHJvdmlkZXMgYSBnbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIEtlbmRvIFVJIFRvb2x0aXAuIE9uY2UgaW5qZWN0ZWQgdGhyb3VnaFxuICogdGhlIGBBcHBDb21wb25lbnRgIGNvbnN0cnVjdG9yLCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGNhbiBiZSBvdmVycmlkZGVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1uby1ydW5cbiAqIGltcG9ydCB7IFRvb2x0aXBTZXR0aW5ncyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRvb2x0aXAnO1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgIDxkaXYga2VuZG9Ub29sdGlwPlxuICogICAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIlNhdmVzIHRoZSBjdXJyZW50IGRvY3VtZW50XCI+U2F2ZTwvYnV0dG9uPlxuICogICAgICA8L2Rpdj5gLFxuICogICAgcHJvdmlkZXJzOiBbe1xuICogICAgICAgIHByb3ZpZGU6IFRvb2x0aXBTZXR0aW5ncyxcbiAqICAgICAgICB1c2VGYWN0b3J5OiAoKTogVG9vbHRpcFNldHRpbmdzID0+ICh7XG4gKiAgICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IHZhbHVlcyBvZiB0b29sdGlwcyBpZiB3YW50ZWRcbiAqICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnXG4gKiAgICAgICAgfSlcbiAqICAgIH1dXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAqIGBgYFxuICovXG5jbGFzcyBUb29sdGlwU2V0dGluZ3Mge1xufVxuVG9vbHRpcFNldHRpbmdzLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gYWxpZ24ocG9zaXRpb24sIG9mZnNldCkge1xuICAgIGxldCBhbmNob3JBbGlnbiA9IHt9O1xuICAgIGxldCBwb3B1cEFsaWduID0ge307XG4gICAgbGV0IHBvcHVwTWFyZ2luID0ge307XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgYW5jaG9yQWxpZ24gPSB7IGhvcml6b250YWw6ICdjZW50ZXInLCB2ZXJ0aWNhbDogJ3RvcCcgfTtcbiAgICAgICAgICAgIHBvcHVwQWxpZ24gPSB7IGhvcml6b250YWw6ICdjZW50ZXInLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfTtcbiAgICAgICAgICAgIHBvcHVwTWFyZ2luID0geyBob3Jpem9udGFsOiAwLCB2ZXJ0aWNhbDogb2Zmc2V0IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIGFuY2hvckFsaWduID0geyBob3Jpem9udGFsOiAnY2VudGVyJywgdmVydGljYWw6ICdib3R0b20nIH07XG4gICAgICAgICAgICBwb3B1cEFsaWduID0geyBob3Jpem9udGFsOiAnY2VudGVyJywgdmVydGljYWw6ICd0b3AnIH07XG4gICAgICAgICAgICBwb3B1cE1hcmdpbiA9IHsgaG9yaXpvbnRhbDogMCwgdmVydGljYWw6IG9mZnNldCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIGFuY2hvckFsaWduID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ2NlbnRlcicgfTtcbiAgICAgICAgICAgIHBvcHVwQWxpZ24gPSB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdjZW50ZXInIH07XG4gICAgICAgICAgICBwb3B1cE1hcmdpbiA9IHsgaG9yaXpvbnRhbDogb2Zmc2V0LCB2ZXJ0aWNhbDogMCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgYW5jaG9yQWxpZ24gPSB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdjZW50ZXInIH07XG4gICAgICAgICAgICBwb3B1cEFsaWduID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ2NlbnRlcicgfTtcbiAgICAgICAgICAgIHBvcHVwTWFyZ2luID0geyBob3Jpem9udGFsOiBvZmZzZXQsIHZlcnRpY2FsOiAwIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuY2hvckFsaWduLFxuICAgICAgICBwb3B1cEFsaWduLFxuICAgICAgICBwb3B1cE1hcmdpblxuICAgIH07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gY29sbGlzaW9uKGlucHV0Y29sbGlzaW9uLCBwb3NpdGlvbikge1xuICAgIGlmIChpbnB1dGNvbGxpc2lvbikge1xuICAgICAgICByZXR1cm4gaW5wdXRjb2xsaXNpb247XG4gICAgfVxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgIHJldHVybiB7IGhvcml6b250YWw6ICdmaXQnLCB2ZXJ0aWNhbDogJ2ZsaXAnIH07XG4gICAgfVxuICAgIHJldHVybiB7IGhvcml6b250YWw6ICdmbGlwJywgdmVydGljYWw6ICdmaXQnIH07XG59XG5mdW5jdGlvbiBpc0RvY3VtZW50Tm9kZShjb250YWluZXIpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLm5vZGVUeXBlID09PSA5O1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBpZiAoZWxlbWVudC5jbG9zZXN0KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA/XG4gICAgICAgIChlbCwgc2VsKSA9PiBlbC5tYXRjaGVzKHNlbClcbiAgICAgICAgOiAoZWwsIHNlbCkgPT4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsKTtcbiAgICBsZXQgbm9kZSA9IGVsZW1lbnQ7XG4gICAgd2hpbGUgKG5vZGUgJiYgIWlzRG9jdW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKG5vZGUsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnMoY29udGFpbmVyLCBjaGlsZCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzRG9jdW1lbnROb2RlKGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5zKSB7XG4gICAgICAgIHJldHVybiBjb250YWluZXIuY29udGFpbnMoY2hpbGQpO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICByZXR1cm4gISEoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNoaWxkKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKTtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzUGFyZW50ID0gKG5vZGUsIHBhcmVudCkgPT4ge1xuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHBhcmVudCkge1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2VudGVyT2Zmc2V0KGl0ZW0sIGRpciwgc2l6ZSkge1xuICAgIGNvbnN0IHJlY3QgPSBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiByZWN0W2Rpcl0gKyAocmVjdFtzaXplXSAvIDIpO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zSXRlbShjb2xsZWN0aW9uLCBpdGVtKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihpdGVtKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBUb29sdGlwQ29udGVudENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoY29udGVudCwgbG9jYWxpemF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UgPSBsb2NhbGl6YXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnRvb2x0aXBXaWR0aCA9IG51bGw7XG4gICAgICAgIHRoaXMudG9vbHRpcEhlaWdodCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FsbG91dCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FsbG91dFN0eWxlcyA9IChwb3NpdGlvbiwgY2FsbG91dFNpemUsIGlzRmxpcCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XG4gICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gcG9zaXRpb24gPT09ICd0b3AnIHx8IHBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgICAgICAgICAgIGNvbnN0IGZsaXBEZWcgPSAnMTgwZGVnJztcbiAgICAgICAgICAgIGNvbnN0IHplcm9EZWcgPSAnMGRlZyc7XG4gICAgICAgICAgICBpZiAoIWlzRmxpcCkge1xuICAgICAgICAgICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSBpc1ZlcnRpY2FsID8gYHJvdGF0ZVgoJHt6ZXJvRGVnfSlgIDogYHJvdGF0ZVkoJHt6ZXJvRGVnfSlgO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9ICd1bnNldCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gJ3Vuc2V0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSAndW5zZXQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9ICd1bnNldCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZXNbcG9zaXRpb25dID0gYCR7LWNhbGxvdXRTaXplfXB4YDtcbiAgICAgICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSBpc1ZlcnRpY2FsID8gYHJvdGF0ZVgoJHtmbGlwRGVnfSlgIDogYHJvdGF0ZVkoJHtmbGlwRGVnfSlgO1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBsb2NhbGl6YXRpb25TZXJ2aWNlLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgfVxuICAgIGdldCBjc3NDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gJ2std2lkZ2V0IGstdG9vbHRpcCc7XG4gICAgfVxuICAgIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NhYmxlO1xuICAgIH1cbiAgICBnZXQgY3NzUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAncmVsYXRpdmUnO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlLmNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgcnRsIH0pID0+IHRoaXMuZGlyZWN0aW9uID0gcnRsID8gJ3J0bCcgOiAnbHRyJyk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNSVExTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgY2xvc2VCdXR0b25UaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VUaXRsZSB8fCB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0KCdjbG9zZVRpdGxlJyk7XG4gICAgfVxuICAgIGNhbGxvdXRQb3NpdGlvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3RvcCc6ICdrLWNhbGxvdXQtcycsXG4gICAgICAgICAgICAnbGVmdCc6ICdrLWNhbGxvdXQtZScsXG4gICAgICAgICAgICAnYm90dG9tJzogJ2stY2FsbG91dC1uJyxcbiAgICAgICAgICAgICdyaWdodCc6ICdrLWNhbGxvdXQtdydcbiAgICAgICAgfVt0aGlzLnBvc2l0aW9uXTtcbiAgICB9XG4gICAgb25DbG9zZUNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICB1cGRhdGVDYWxsb3V0UG9zaXRpb24ocG9zaXRpb24sIGlzRmxpcCkge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbG91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxvdXQgPSB0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuay1jYWxsb3V0Jyk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nO1xuICAgICAgICBjb25zdCBzaXplID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICAgICAgY29uc3QgZGlyID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgICAgICBjb25zdCBvZmZzZXRQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luVG9wJztcbiAgICAgICAgY29uc3QgY2FsbG91dFNpemUgPSBjYWxsb3V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3NpemVdO1xuICAgICAgICBjb25zdCBhbmNob3JDZW50ZXIgPSBnZXRDZW50ZXJPZmZzZXQodGhpcy5hbmNob3IubmF0aXZlRWxlbWVudCwgZGlyLCBzaXplKTtcbiAgICAgICAgY29uc3QgY29udGVudENlbnRlciA9IGdldENlbnRlck9mZnNldCh0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudCwgZGlyLCBzaXplKTtcbiAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGNvbnRlbnRDZW50ZXIgLSBhbmNob3JDZW50ZXIpO1xuICAgICAgICBpZiAoZGlmZiA+IDEgfHwgZGlmZiA9PT0gMCB8fCBNYXRoLnJvdW5kKGRpZmYpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdNYXJnaW4gPSBjb250ZW50Q2VudGVyIC0gYW5jaG9yQ2VudGVyICsgKGNhbGxvdXRTaXplIC8gMik7XG4gICAgICAgICAgICBjYWxsb3V0LnN0eWxlW29mZnNldFByb3BlcnR5XSA9IGAkey1uZXdNYXJnaW59cHhgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxvdXRTdHlsZXMgPSB0aGlzLmNhbGxvdXRTdHlsZXMocG9zaXRpb24sIGNhbGxvdXRTaXplLCBpc0ZsaXApO1xuICAgICAgICBPYmplY3Qua2V5cyhjYWxsb3V0U3R5bGVzKS5mb3JFYWNoKChzdHlsZSkgPT4ge1xuICAgICAgICAgICAgY2FsbG91dC5zdHlsZVtzdHlsZV0gPSBjYWxsb3V0U3R5bGVzW3N0eWxlXTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuVG9vbHRpcENvbnRlbnRDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRvb2x0aXAnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIga2VuZG9Ub29sdGlwTG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgICAgIGkxOG4tY2xvc2VUaXRsZT1cImtlbmRvLnRvb2x0aXAuY2xvc2VUaXRsZXxUaGUgdGl0bGUgb2YgdGhlIGNsb3NlIGJ1dHRvblwiXG4gICAgICAgICAgICBjbG9zZVRpdGxlPVwiQ2xvc2VcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLXRvb2x0aXAtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImstdG9vbHRpcC10aXRsZVwiICpuZ0lmPVwidGl0bGVUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdJZl09XCJ0aXRsZVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGl0bGVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogYW5jaG9yLCBhbmNob3I6IGFuY2hvciB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICBbbmdJZl09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogYW5jaG9yLCBhbmNob3I6IGFuY2hvciB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW25nSWZdPVwidGVtcGxhdGVTdHJpbmdcIj5cbiAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZVN0cmluZyB9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNsb3NhYmxlXCIgY2xhc3M9XCJrLXRvb2x0aXAtYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2VDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiay1pY29uIGstaS1jbG9zZVwiIFthdHRyLnRpdGxlXT1cImNsb3NlQnV0dG9uVGl0bGVcIj48L2E+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLWNhbGxvdXRcIiAqbmdJZj1cImNhbGxvdXRcIiBbbmdDbGFzc109XCJjYWxsb3V0UG9zaXRpb25DbGFzcygpXCI+PC9kaXY+XG4gICAgYCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLnRvb2x0aXAnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRvb2x0aXBDb250ZW50Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuVG9vbHRpcENvbnRlbnRDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZGlyZWN0aW9uOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNzc0NsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzJyxdIH1dLFxuICAgIGNsYXNzTmFtZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay10b29sdGlwLWNsb3NhYmxlJyxdIH1dLFxuICAgIGNzc1Bvc2l0aW9uOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5wb3NpdGlvbicsXSB9XSxcbiAgICB0b29sdGlwV2lkdGg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLndpZHRoLnB4JyxdIH0sIHsgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9vbHRpcEhlaWdodDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuaGVpZ2h0LnB4JyxdIH0sIHsgdHlwZTogSW5wdXQgfV0sXG4gICAgdGl0bGVUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYW5jaG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjbG9zYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRlbXBsYXRlU3RyaW5nOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgVG9vbHRpcCBkaXJlY3RpdmUgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfdG9vbHRpcCAlfSkuXG4gKiBVc2VkIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlbGF0ZWQgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtbm8tcnVuXG4gKiA8ZGl2IGtlbmRvVG9vbHRpcD5cbiAqICAgIDxhIHRpdGxlPVwiVG9vbHRpcCB0aXRsZVwiIGhyZWY9XCJmb29cIj5mb288L2E+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5jbGFzcyBUb29sdGlwRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b29sdGlwV3JhcHBlciwgbmdab25lLCByZW5kZXJlciwgcG9wdXBTZXJ2aWNlLCBzZXR0aW5ncywgbGVnYWN5U2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy50b29sdGlwV3JhcHBlciA9IHRvb2x0aXBXcmFwcGVyO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBhIHNlbGVjdG9yIGZvciBlbGVtZW50cyB3aXRoaW4gYSBjb250YWluZXIgd2hpY2ggd2lsbCBkaXNwbGF5IGEgdG9vbHRpcFxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFuY2hvcmVsZW1lbnRzX3Rvb2x0aXAgJX0pKS4gVGhlIHBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlIGFueVxuICAgICAgICAgKiBET00gYHNlbGVjdG9yYC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYFt0aXRsZV1gLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSAnW3RpdGxlXSc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBUb29sdGlwIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlXG4gICAgICAgICAqIGFuY2hvciBlbGVtZW50IChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcG9zaXRpb25pbmdfdG9vbHRpcCAlfSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBgdG9wYCAoZGVmYXVsdClcbiAgICAgICAgICogKiBgYm90dG9tYFxuICAgICAgICAgKiAqIGBsZWZ0YFxuICAgICAgICAgKiAqIGByaWdodGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSAndG9wJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgVG9vbHRpcCBpcyBzaG93bi5cbiAgICAgICAgICogKiBgMTAwYCAoZGVmYXVsdCkgbWlsbGlzZWNvbmRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaG93QWZ0ZXIgPSAxMDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlINCib29sdGlwIHdpbGwgZGlzcGxheSBhIGNhbGxvdXQgYXJyb3cuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAqIGB0cnVlYCAoZGVmYXVsdClcbiAgICAgICAgICogKiBgZmFsc2VgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhbGxvdXQgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSDQom9vbHRpcCB3aWxsIGRpc3BsYXkgYSAqKkNsb3NlKiogYnV0dG9uXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgY2xvc2FibGVfdG9vbHRpcCAlfSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBgdHJ1ZWBcbiAgICAgICAgICogKiBgZmFsc2VgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NhYmxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIG9mZnNldCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgVG9vbHRpcCBhbmQgdGhlIGFuY2hvci4gRGVmYXVsdHMgdG8gYDZgIHBpeGVscy5cbiAgICAgICAgICogSWYgdGhlIGBjYWxsb3V0YCBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgb2Zmc2V0IGlzIHJlbmRlcmVkIGZyb20gdGhlIGNhbGxvdXQgYXJyb3cuXG4gICAgICAgICAqIElmIHRoZSBgY2FsbG91dGAgcHJvcGVydHkgaXMgc2V0IHRvIGBmYWxzZWAsIHRoZSBvZmZzZXQgaXMgcmVuZGVyZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgVG9vbHRpcC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gNjtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbGlkUG9zaXRpb25zID0gWyd0b3AnLCAnYm90dG9tJywgJ3JpZ2h0JywgJ2xlZnQnXTtcbiAgICAgICAgdGhpcy52YWxpZFNob3dPcHRpb25zID0gWydob3ZlcicsICdjbGljaycsICdub25lJ107XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgc2V0dGluZ3MsIGxlZ2FjeVNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMudG9vbHRpcFdyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yVGl0bGVTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQod3JhcHBlciwgJ21vdXNlb3ZlcicpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyICE9PSAnJykpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBjbG9zZXN0KGUudGFyZ2V0LCB0aGlzLmZpbHRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlRWxlbWVudFRpdGxlKHsgbmF0aXZlRWxlbWVudDogZmlsdGVyRWxlbWVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubW91c2VPdmVyU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHdyYXBwZXIsICdtb3VzZW92ZXInKVxuICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApLCBmaWx0ZXIoKCkgPT4gdGhpcy5maWx0ZXIgIT09ICcnKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4gdGhpcy5vbk1vdXNlT3ZlcihlKSk7XG4gICAgICAgICAgICB0aGlzLm1vdXNlT3V0U3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHdyYXBwZXIsICdtb3VzZW91dCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHRoaXMub25Nb3VzZU91dChlKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSBUb29sdGlwIGFzIGEgdGVtcGxhdGUgcmVmZXJlbmNlXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyB0ZW1wbGF0ZXNfdG9vbHRpcCAlfSkpLlxuICAgICAqL1xuICAgIHNldCB0b29sdGlwVGVtcGxhdGUodmFsdWUpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRlbXBsYXRlKCkgeyByZXR1cm4gdGhpcy50ZW1wbGF0ZTsgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBUb29sdGlwLlxuICAgICAqIEBwYXJhbSBhbmNob3ImbWRhc2g7IEVsZW1lbnRSZWZ8RWxlbWVudC5cbiAgICAgKiBTcGVjaWZpZXMgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYW4gYW5jaG9yLiBUaGUgVG9vbHRpcCBvcGVucyByZWxhdGl2ZSB0byB0aGF0IGVsZW1lbnQuXG4gICAgICovXG4gICAgc2hvdyhhbmNob3IpIHtcbiAgICAgICAgaWYgKHRoaXMucG9wdXBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5jaG9yIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgYW5jaG9yID0geyBuYXRpdmVFbGVtZW50OiBhbmNob3IgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09uID09PSAnaG92ZXInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3B1cFJlZikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dDb250ZW50KHRoaXMuYW5jaG9yKSwgdGhpcy5zaG93QWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oaWRlRWxlbWVudFRpdGxlKHRoaXMuYW5jaG9yKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnQodGhpcy5hbmNob3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGVzIHRoZSBUb29sdGlwLlxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0KTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5hbmNob3IgJiYgdGhpcy5hbmNob3IubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IuZ2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJykpIHtcbiAgICAgICAgICAgIGlmICghYW5jaG9yLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkge1xuICAgICAgICAgICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYW5jaG9yLmdldEF0dHJpYnV0ZSgnZGF0YS10aXRsZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGl0bGUnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wdXBNb3VzZU91dFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3B1cE1vdXNlT3V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xvc2VDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUNsaWNrU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIHRoZSBUb29sdGlwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFuY2hvciZtZGFzaDsgRWxlbWVudFJlZnxFbGVtZW50LiBTcGVjaWZpZXMgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYW4gYW5jaG9yLlxuICAgICAqIEBwYXJhbSBzaG93Jm1kYXNoOyBPcHRpb25hbC4gQm9vbGVhbi4gU3BlY2lmaWVzIGlmIHRoZSBUb29sdGlwIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICovXG4gICAgdG9nZ2xlKGFuY2hvciwgc2hvdykge1xuICAgICAgICBjb25zdCBwcmV2aW91c0FuY2hvciA9IHRoaXMuYW5jaG9yICYmIHRoaXMuYW5jaG9yLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChhbmNob3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgICBhbmNob3IgPSB7IG5hdGl2ZUVsZW1lbnQ6IGFuY2hvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aW91c0FuY2hvciAhPT0gYW5jaG9yLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aW91c0FuY2hvciA9PT0gYW5jaG9yLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5zaG93T24gPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNob3cgPSAhdGhpcy5wb3B1cFJlZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdykge1xuICAgICAgICAgICAgdGhpcy5zaG93KGFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd09uID0gJ2hvdmVyJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcmlmeVByb3BlcnRpZXMoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5zaG93T24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5wb3B1cFJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFuY2hvciAmJlxuICAgICAgICAgICAgIWhhc1BhcmVudCh0aGlzLmFuY2hvci5uYXRpdmVFbGVtZW50IHx8IHRoaXMuYW5jaG9yLCB0aGlzLnRvb2x0aXBXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmFuY2hvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvclRpdGxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubW91c2VPdmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubW91c2VPdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUNsaWNrU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wdXBQb3NpdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFBvc2l0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wdXBNb3VzZU91dFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3B1cE1vdXNlT3V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvd0NvbnRlbnQoYW5jaG9yUmVmKSB7XG4gICAgICAgIGlmICghYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJykgJiYgIXRoaXMudGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoYW5jaG9yUmVmKTtcbiAgICAgICAgICAgIHRoaXMuYmluZENvbnRlbnQodGhpcy5wb3B1cFJlZi5jb250ZW50LCBhbmNob3JSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cEFuY2hvclZpZXdwb3J0TGVhdmVcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICB9XG4gICAgYmluZENvbnRlbnQoY29udGVudENvbXBvbmVudCwgYW5jaG9yUmVmKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb250ZW50Q29tcG9uZW50Lmluc3RhbmNlO1xuICAgICAgICB0aGlzLmNsb3NlQ2xpY2tTdWJzY3JpcHRpb24gPSBjb250ZW50LmNsb3NlXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5oaWRlKCk7IH0pO1xuICAgICAgICBpZiAoIXRoaXMudGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGNvbnRlbnQudGVtcGxhdGVTdHJpbmcgPSB0aGlzLmFuY2hvci5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10aXRsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC50ZW1wbGF0ZVJlZiA9IHRoaXMudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGl0bGVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgY29udGVudC50aXRsZVRlbXBsYXRlID0gdGhpcy50aXRsZVRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQuY2xvc2VUaXRsZSA9IHRoaXMuY2xvc2VUaXRsZTtcbiAgICAgICAgY29udGVudC5hbmNob3IgPSBhbmNob3JSZWY7XG4gICAgICAgIGNvbnRlbnQuY2FsbG91dCA9IHRoaXMuY2FsbG91dDtcbiAgICAgICAgY29udGVudC5jbG9zYWJsZSA9IHRoaXMuY2xvc2FibGU7XG4gICAgICAgIGNvbnRlbnQucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICBjb250ZW50LnRvb2x0aXBXaWR0aCA9IHRoaXMudG9vbHRpcFdpZHRoO1xuICAgICAgICBjb250ZW50LnRvb2x0aXBIZWlnaHQgPSB0aGlzLnRvb2x0aXBIZWlnaHQ7XG4gICAgICAgIHRoaXMucG9wdXBSZWYuY29udGVudC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGhpZGVFbGVtZW50VGl0bGUoZWxlbWVudFJlZikge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9wZW5Qb3B1cChhbmNob3JSZWYpIHtcbiAgICAgICAgY29uc3QgYWxpZ25TZXR0aW5ncyA9IGFsaWduKHRoaXMucG9zaXRpb24sIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgY29uc3QgYW5jaG9yQWxpZ24gPSBhbGlnblNldHRpbmdzLmFuY2hvckFsaWduO1xuICAgICAgICBjb25zdCBwb3B1cEFsaWduID0gYWxpZ25TZXR0aW5ncy5wb3B1cEFsaWduO1xuICAgICAgICBjb25zdCBwb3B1cE1hcmdpbiA9IGFsaWduU2V0dGluZ3MucG9wdXBNYXJnaW47XG4gICAgICAgIHRoaXMucG9wdXBSZWYgPSB0aGlzLnBvcHVwU2VydmljZS5vcGVuKHtcbiAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yUmVmLFxuICAgICAgICAgICAgYW5jaG9yQWxpZ24sXG4gICAgICAgICAgICBhbmltYXRlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFRvb2x0aXBDb250ZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgY29sbGlzaW9uOiBjb2xsaXNpb24odGhpcy5jb2xsaXNpb24sIHRoaXMucG9zaXRpb24pLFxuICAgICAgICAgICAgbWFyZ2luOiBwb3B1cE1hcmdpbixcbiAgICAgICAgICAgIHBvcHVwQWxpZ24sXG4gICAgICAgICAgICBwb3B1cENsYXNzOiAnay1wb3B1cC10cmFuc3BhcmVudCdcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQsICdrLXRvb2x0aXAtd3JhcHBlcicpO1xuICAgICAgICBpZiAodGhpcy50b29sdGlwQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQsIHRoaXMudG9vbHRpcENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3B1cEluc3RhbmNlID0gdGhpcy5wb3B1cFJlZi5jb250ZW50Lmluc3RhbmNlO1xuICAgICAgICBpZiAocG9wdXBJbnN0YW5jZS5jYWxsb3V0KSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUG9zaXRpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnBvcHVwUmVmLnBvcHVwUG9zaXRpb25DaGFuZ2VcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGZsaXAgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmxpcCA9IGZsaXAuaG9yaXpvbnRhbCA9PT0gdHJ1ZSB8fCBmbGlwLnZlcnRpY2FsID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvcHVwSW5zdGFuY2UudXBkYXRlQ2FsbG91dFBvc2l0aW9uKHRoaXMucG9zaXRpb24sIGlzRmxpcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93T24gPT09ICdob3ZlcicpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3B1cCA9IHRoaXMucG9wdXBSZWYucG9wdXBFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBNb3VzZU91dFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudChwb3B1cCwgJ21vdXNlb3V0JylcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5vbk1vdXNlT3V0KGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlUG9wdXAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcHVwUmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3B1cFBvc2l0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUG9zaXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVDbGljaygpIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUNsaWNrU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvd09uID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlQ2xpY2tTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyICE9PSAnJykpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHRoaXMub25Nb3VzZUNsaWNrKGUsIHRoaXMudG9vbHRpcFdyYXBwZXIubmF0aXZlRWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uTW91c2VDbGljayhlLCB3cmFwcGVyKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBjb25zdCBmaWx0ZXJFbGVtZW50ID0gY2xvc2VzdCh0YXJnZXQsIHRoaXMuZmlsdGVyKTtcbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLnBvcHVwUmVmICYmIHRoaXMucG9wdXBSZWYucG9wdXBFbGVtZW50O1xuICAgICAgICBpZiAocG9wdXApIHtcbiAgICAgICAgICAgIGlmIChwb3B1cC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2FibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBwZXIuY29udGFpbnModGFyZ2V0KSAmJiBmaWx0ZXJFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZShmaWx0ZXJFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Nb3VzZU92ZXIoZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJFbGVtZW50ID0gY2xvc2VzdChlLnRhcmdldCwgdGhpcy5maWx0ZXIpO1xuICAgICAgICBpZiAodGhpcy5zaG93T24gIT09ICdob3ZlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGUoZmlsdGVyRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Nb3VzZU91dChlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dPbiAhPT0gJ2hvdmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsb3NhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLnBvcHVwUmVmICYmIHRoaXMucG9wdXBSZWYucG9wdXBFbGVtZW50O1xuICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZS5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICBpZiAocmVsYXRlZFRhcmdldCAmJiB0aGlzLmFuY2hvciAmJiBjb250YWlucyh0aGlzLmFuY2hvci5uYXRpdmVFbGVtZW50LCByZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWxhdGVkVGFyZ2V0ICYmIGNvbnRhaW5zKHBvcHVwLCByZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgICB2ZXJpZnlQcm9wZXJ0aWVzKCkge1xuICAgICAgICBpZiAoIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250YWluc0l0ZW0odGhpcy52YWxpZFBvc2l0aW9ucywgdGhpcy5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBwcm92aWRlZCBmb3IgcG9zaXRpb24gcHJvcGVydHkuVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZSAndG9wJywgJ2JvdHRvbScsICdsZWZ0Jywgb3IgJ3JpZ2h0Jy5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zSXRlbSh0aGlzLnZhbGlkU2hvd09wdGlvbnMsIHRoaXMuc2hvd09uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkIGZvciBzaG93T24gcHJvcGVydHkuVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZSAnaG92ZXInIG9yICdub25lJy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblRvb2x0aXBEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb1Rvb2x0aXBdJyxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvVG9vbHRpcCdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVG9vbHRpcERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBQb3B1cFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFRvb2x0aXBTZXR0aW5ncywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSxcbiAgICB7IHR5cGU6IFRvb2x0aXBTZXR0aW5ncywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtUT09MVElQX1NFVFRJTkdTLF0gfV0gfVxuXTtcblRvb2x0aXBEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3NpdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGl0bGVUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2hvd09uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzaG93QWZ0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNhbGxvdXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNsb3NhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvZmZzZXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRvb2x0aXBXaWR0aDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9vbHRpcEhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9vbHRpcENsYXNzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2xsaXNpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNsb3NlVGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRvb2x0aXBUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIENvbXBvbmVudE1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50TWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IGBba2VuZG9Ub29sdGlwTG9jYWxpemVkTWVzc2FnZXNdYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Mb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNsb3NlVGl0bGU6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG5jb25zdCBDT01QT05FTlRfRElSRUNUSVZFUyA9IFtUb29sdGlwRGlyZWN0aXZlLCBUb29sdGlwQ29udGVudENvbXBvbmVudCwgTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmVdO1xuY29uc3QgQ09NUE9ORU5UX01PRFVMRVMgPSBbUG9wdXBNb2R1bGVdO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgVG9vbHRpcCBjb21wb25lbnQuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYEtlbmRvVG9vbHRpcERpcmVjdGl2ZWAmbWRhc2g7VGhlIFRvb2x0aXAgZGlyZWN0aXZlIGNsYXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiAvLyBJbXBvcnQgdGhlIFRvb2x0aXAgbW9kdWxlXG4gKiBpbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdG9vbHRpcCc7XG4gKlxuICogLy8gVGhlIGJyb3dzZXIgcGxhdGZvcm0gd2l0aCBhIGNvbXBpbGVyXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIC8vIEltcG9ydCB0aGUgYXBwIGNvbXBvbmVudFxuICogX0BOZ01vZHVsZXt7XG4gKiAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgIGltcG9ydHM6ICAgICAgW0Jyb3dzZXJNb2R1bGUsIFRvb2x0aXBNb2R1bGVdLCAvLyBpbXBvcnQgVG9vbHRpcE1vZHVsZSBtb2R1bGVcbiAqICAgIGJvb3RzdHJhcDogICAgW0FwcENvbXBvbmVudF1cbiAqIH19XG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKlxuICogLy8gQ29tcGlsZSBhbmQgbGF1bmNoIHRoZSBtb2R1bGVcbiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAqIGBgYFxuICovXG5jbGFzcyBUb29sdGlwTW9kdWxlIHtcbn1cblRvb2x0aXBNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0NPTVBPTkVOVF9ESVJFQ1RJVkVTXSxcbiAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtUb29sdGlwQ29udGVudENvbXBvbmVudF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgLi4uQ09NUE9ORU5UX01PRFVMRVNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtDT01QT05FTlRfRElSRUNUSVZFU11cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgeyBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgVG9vbHRpcENvbnRlbnRDb21wb25lbnQsIFRvb2x0aXBEaXJlY3RpdmUsIFRvb2x0aXBNb2R1bGUsIFRvb2x0aXBTZXR0aW5ncywgVE9PTFRJUF9TRVRUSU5HUyB9O1xuIl19","import {Component, Input, OnInit} from '@angular/core';\nimport {Router, ActivatedRoute} from '@angular/router';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-tool-selector',\n templateUrl: './tool-selector.component.html',\n styleUrls: ['./tool-selector.component.scss']\n})\nexport class ToolSelectorComponent implements OnInit {\n @Input() selectedOption = ToolSelectionOptions.mycrl;\n\n toolOptions = [\n {\n key: ToolSelectionOptions.mycrl,\n title: 'MyCRL',\n icon: '',\n tooltip: '',\n routerLink: '/'\n },\n {\n key: ToolSelectionOptions.ct,\n title: 'Always ON Customer Health',\n icon: '',\n tooltip: '',\n routerLink: '/aoh'\n },\n {\n key: ToolSelectionOptions.alerts,\n title: 'Predictive Alerts',\n icon: '',\n tooltip: '',\n routerLink: '/alerts'\n },\n {\n key: ToolSelectionOptions.gsalerts,\n title: 'Global Alerts',\n icon: '',\n tooltip: '',\n routerLink: '/gsalerts'\n },\n {\n key: ToolSelectionOptions.businessreview,\n title: 'Business Review',\n icon: '',\n tooltip: '',\n routerLink: '/businessReview'\n }\n ];\n\n constructor(private router: Router, private route: ActivatedRoute) {}\n\n ngOnInit(): void {\n }\n\n getToolOption(key) {\n for (const option of this.toolOptions) {\n if (option.key === key) {\n return option;\n }\n }\n return null;\n }\n\n valueChange(value) {\n const toolOption = this.getToolOption(value);\n this.router.navigate([toolOption.routerLink], {relativeTo: this.route});\n }\n}\n","
\n \n
","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { Injectable, EventEmitter, Directive, ElementRef, Renderer2, Optional, NgZone, Input, Output, HostBinding, HostListener, isDevMode, Component, ContentChildren, NgModule, TemplateRef, ViewContainerRef, InjectionToken, Inject, ChangeDetectorRef, ContentChild, ViewChild } from '@angular/core';\nimport { BehaviorSubject, Subject, fromEvent, merge } from 'rxjs';\nimport { Keys, isChanged, isDocumentAvailable, hasObservers, guid } from '@progress/kendo-angular-common';\nimport { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';\nimport { filter } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { PopupService, PopupModule } from '@progress/kendo-angular-popup';\n\n/**\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc2 from '@angular/common';\nimport * as ɵngcc3 from '@progress/kendo-angular-popup';\n\nconst _c0 = [[[\"\", \"kendoButton\", \"\"]]];\nconst _c1 = [\"[kendoButton]\"];\nfunction ListComponent_li_1_1_ng_template_0_Template(rf, ctx) { }\nconst _c2 = function (a0, a1) { return { templateRef: a0, $implicit: a1 }; };\nfunction ListComponent_li_1_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ListComponent_li_1_1_ng_template_0_Template, 0, 0, \"ng-template\", 5);\n} if (rf & 2) {\n const dataItem_r1 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r3 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction2(1, _c2, ctx_r3.itemTemplate == null ? null : ctx_r3.itemTemplate.templateRef, dataItem_r1));\n} }\nfunction ListComponent_li_1_ng_template_2_span_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 8);\n} if (rf & 2) {\n const dataItem_r1 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r7 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r7.getIconClasses(dataItem_r1));\n} }\nfunction ListComponent_li_1_ng_template_2_img_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"img\", 9);\n} if (rf & 2) {\n const dataItem_r1 = ɵngcc0.ɵɵnextContext(2).$implicit;\n ɵngcc0.ɵɵproperty(\"src\", dataItem_r1.imageUrl, ɵngcc0.ɵɵsanitizeUrl);\n} }\nfunction ListComponent_li_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ListComponent_li_1_ng_template_2_span_0_Template, 1, 1, \"span\", 6);\n ɵngcc0.ɵɵtemplate(1, ListComponent_li_1_ng_template_2_img_1_Template, 1, 1, \"img\", 7);\n ɵngcc0.ɵɵtext(2);\n} if (rf & 2) {\n const dataItem_r1 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r4 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngIf\", dataItem_r1.icon || dataItem_r1.iconClass);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", dataItem_r1.imageUrl);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r4.getText(dataItem_r1), \" \");\n} }\nconst _c3 = function (a1) { return { \"k-item\": true, \"k-state-disabled\": a1 }; };\nfunction ListComponent_li_1_Template(rf, ctx) { if (rf & 1) {\n const _r13 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function ListComponent_li_1_Template_li_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r13); const index_r2 = ctx.index; const ctx_r12 = ɵngcc0.ɵɵnextContext(); return ctx_r12.onClick(index_r2); })(\"blur\", function ListComponent_li_1_Template_li_blur_0_listener() { ɵngcc0.ɵɵrestoreView(_r13); const ctx_r14 = ɵngcc0.ɵɵnextContext(); return ctx_r14.onBlur(); });\n ɵngcc0.ɵɵtemplate(1, ListComponent_li_1_1_Template, 1, 4, undefined, 3);\n ɵngcc0.ɵɵtemplate(2, ListComponent_li_1_ng_template_2_Template, 3, 3, \"ng-template\", 4);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const dataItem_r1 = ctx.$implicit;\n const index_r2 = ctx.index;\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"index\", index_r2)(\"ngClass\", ɵngcc0.ɵɵpureFunction1(5, _c3, dataItem_r1.disabled));\n ɵngcc0.ɵɵattribute(\"aria-disabled\", dataItem_r1.disabled ? true : false);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r0.itemTemplate == null ? null : ctx_r0.itemTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !(ctx_r0.itemTemplate == null ? null : ctx_r0.itemTemplate.templateRef));\n} }\nconst _c4 = [\"button\"];\nconst _c5 = [\"arrowButton\"];\nconst _c6 = [\"popupTemplate\"];\nconst _c7 = [\"container\"];\nfunction SplitButtonComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {\n const _r21 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-button-list\", 6);\n ɵngcc0.ɵɵlistener(\"onItemClick\", function SplitButtonComponent_ng_template_6_Template_kendo_button_list_onItemClick_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r21); const ctx_r20 = ɵngcc0.ɵɵnextContext(); return ctx_r20.onItemClick($event); })(\"keydown\", function SplitButtonComponent_ng_template_6_Template_kendo_button_list_keydown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r21); const ctx_r22 = ɵngcc0.ɵɵnextContext(); return ctx_r22.keyDownHandler($event); })(\"keypress\", function SplitButtonComponent_ng_template_6_Template_kendo_button_list_keypress_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r21); const ctx_r23 = ɵngcc0.ɵɵnextContext(); return ctx_r23.keyPressHandler($event); })(\"keyup\", function SplitButtonComponent_ng_template_6_Template_kendo_button_list_keyup_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r21); const ctx_r24 = ɵngcc0.ɵɵnextContext(); return ctx_r24.keyUpHandler($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r18 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"id\", ctx_r18.listId)(\"data\", ctx_r18.data)(\"textField\", ctx_r18.textField)(\"itemTemplate\", ctx_r18.itemTemplate);\n ɵngcc0.ɵɵattribute(\"dir\", ctx_r18.dir);\n} }\nconst _c8 = [\"*\"];\nconst _c9 = [\"buttonList\"];\nfunction DropDownButtonComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n const _r31 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-button-list\", 4, 5);\n ɵngcc0.ɵɵlistener(\"onItemClick\", function DropDownButtonComponent_ng_template_3_Template_kendo_button_list_onItemClick_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r31); const ctx_r30 = ɵngcc0.ɵɵnextContext(); return ctx_r30.onItemClick($event); })(\"keydown\", function DropDownButtonComponent_ng_template_3_Template_kendo_button_list_keydown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r31); const ctx_r32 = ɵngcc0.ɵɵnextContext(); return ctx_r32.keyDownHandler($event); })(\"keypress\", function DropDownButtonComponent_ng_template_3_Template_kendo_button_list_keypress_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r31); const ctx_r33 = ɵngcc0.ɵɵnextContext(); return ctx_r33.keyPressHandler($event); })(\"keyup\", function DropDownButtonComponent_ng_template_3_Template_kendo_button_list_keyup_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r31); const ctx_r34 = ɵngcc0.ɵɵnextContext(); return ctx_r34.keyUpHandler($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r27 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"id\", ctx_r27.listId)(\"data\", ctx_r27.data)(\"textField\", ctx_r27.textField)(\"itemTemplate\", ctx_r27.itemTemplate);\n ɵngcc0.ɵɵattribute(\"dir\", ctx_r27.dir);\n} }\nfunction ChipComponent_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 7);\n} if (rf & 2) {\n const ctx_r35 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r35.selectedIconClasses);\n} }\nfunction ChipComponent_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 8);\n} if (rf & 2) {\n const ctx_r36 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r36.iconClasses);\n} }\nfunction ChipComponent_span_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 9);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r37 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r37.label, \" \");\n} }\nfunction ChipComponent_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!label\"]);\n} }\nfunction ChipComponent_span_6_Template(rf, ctx) { if (rf & 1) {\n const _r41 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"span\", 10);\n ɵngcc0.ɵɵlistener(\"click\", function ChipComponent_span_6_Template_span_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r41); const ctx_r40 = ɵngcc0.ɵɵnextContext(); return ctx_r40.onRemoveClick($event); });\n ɵngcc0.ɵɵelement(1, \"span\", 11);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r39 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r39.removeIconClasses);\n} }\nclass KendoButtonService {\n constructor() {\n this.buttonLookChange = new BehaviorSubject('default');\n this.buttonClicked = new Subject();\n this.buttonClicked$ = this.buttonClicked.asObservable();\n }\n click(button) {\n this.buttonClicked.next(button);\n }\n setButtonLook(look) {\n this.buttonLookChange.next(look);\n }\n}\nKendoButtonService.ɵfac = function KendoButtonService_Factory(t) { return new (t || KendoButtonService)(); };\nKendoButtonService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: KendoButtonService, factory: KendoButtonService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(KendoButtonService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst SPAN_TAG_NAME = 'SPAN';\n/**\n * Represents the Kendo UI Button component for Angular.\n */\nclass ButtonDirective {\n constructor(element, renderer, service, localization, ngZone) {\n this.service = service;\n this.ngZone = ngZone;\n /**\n * Provides visual styling that indicates if the Button is active.\n * By default, `toggleable` is set to `false`.\n */\n this.toggleable = false;\n /**\n * Adds visual weight to the Button and makes it primary.\n */\n this.primary = false;\n /**\n * Changes the visual appearance by using alternative styling options\n * ([more information and examples]({% slug appearance_button %})).\n *\n * The available values are:\n * * [`ButtonLook`]({% slug api_buttons_buttonlook %}) = `flat` | `outline`\n * * `clear`\n */\n this.look = 'default';\n /**\n * @hidden\n */\n this.role = 'button';\n /**\n * Fires each time the selected state of a toggleable button is changed.\n *\n * The event argument is the new selected state (boolean).\n */\n this.selectedChange = new EventEmitter();\n /**\n * Fires each time the user clicks the button.\n */\n this.click = new EventEmitter();\n this.isDisabled = false;\n this.isIcon = false;\n this.isIconClass = false;\n this._focused = false;\n this.domEvents = [];\n this.direction = localization.rtl ? 'rtl' : 'ltr';\n this.localizationChangeSubscription = localization.changes\n .subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n this.element = element.nativeElement;\n this.renderer = renderer;\n }\n /**\n * Backwards-compatible alias\n *\n * @hidden\n */\n get togglable() {\n return this.toggleable;\n }\n /**\n * @hidden\n */\n set togglable(value) {\n this.toggleable = value;\n }\n /**\n * Sets the selected state of the Button.\n */\n get selected() {\n return this._selected || false;\n }\n set selected(value) {\n this._selected = value;\n }\n /**\n * @hidden\n */\n set tabIndex(index) {\n this.element.tabIndex = index;\n }\n get tabIndex() {\n return this.element.tabIndex;\n }\n /**\n * Defines the name for an existing icon in a Kendo UI theme.\n * The icon is rendered inside the Button by a `span.k-icon` element.\n */\n set icon(icon) {\n if (icon) {\n this.iconSetter(icon, () => {\n this.isIcon = true;\n const classes = 'k-icon k-i-' + icon;\n this.addIcon(classes);\n });\n }\n else {\n this.isIcon = false;\n this.updateIconNode();\n }\n }\n /**\n * Defines a CSS class—or multiple classes separated by spaces—\n * which are applied to a `span` element inside the Button. Allows the usage of custom icons.\n */\n set iconClass(iconClassName) {\n if (iconClassName) {\n this.iconSetter(iconClassName, () => {\n this.isIconClass = true;\n this.addIcon(iconClassName);\n });\n }\n else {\n this.isIconClass = false;\n this.updateIconNode();\n }\n }\n /**\n * Defines a URL which is used for an `img` element inside the Button.\n * The URL can be relative or absolute. If relative, it is evaluated with relation to the web page URL.\n */\n set imageUrl(imageUrl) {\n if (imageUrl) {\n this.iconSetter(imageUrl, this.addImgIcon.bind(this));\n }\n else {\n this.removeImageNode();\n }\n }\n /**\n * If set to `true`, it disables the Button.\n */\n set disabled(disabled) {\n this.isDisabled = disabled;\n this.renderer.setProperty(this.element, 'disabled', disabled);\n }\n get disabled() {\n return this.isDisabled;\n }\n set isFocused(isFocused) {\n this.toggleClass('k-state-focused', isFocused);\n this._focused = isFocused;\n }\n get isFocused() {\n return this._focused;\n }\n get classButton() {\n return true;\n }\n get classPrimary() {\n return this.primary;\n }\n get isFlat() {\n return this.look === 'flat';\n }\n get isBare() {\n return this.look === 'bare';\n }\n get isOutline() {\n return this.look === 'outline';\n }\n get isClear() {\n return this.look === 'clear';\n }\n get roleSetter() {\n return this.role;\n }\n get classDisabled() {\n return this.isDisabled;\n }\n get classActive() {\n return this.selected;\n }\n get getDirection() {\n return this.direction;\n }\n /**\n * @hidden\n */\n onFocus() {\n this.isFocused = true;\n }\n /**\n * @hidden\n */\n onBlur() {\n this.isFocused = false;\n }\n ngOnInit() {\n const isSpan = this.element.tagName === SPAN_TAG_NAME;\n if (this.service) {\n this.buttonLookChangeSubscription = this.service.buttonLookChange\n .pipe(filter((look) => look !== 'default'))\n .subscribe((look) => this.look = look);\n }\n if (!this.element.hasAttribute('role') && this.togglable) {\n this.toggleAriaPressed(this.toggleable);\n }\n if (this.role) {\n this.setAttribute('role', this.role);\n }\n this.ngZone.runOutsideAngular(() => {\n this.domEvents.push(this.renderer.listen(this.element, 'click', this._onButtonClick.bind(this)));\n this.domEvents.push(this.renderer.listen(this.element, 'keydown', (event) => {\n if (isSpan && (event.keyCode === Keys.Space || event.keyCode === Keys.Enter)) {\n this.click.emit(event);\n this._onButtonClick();\n }\n }));\n });\n }\n ngOnChanges(change) {\n if (isChanged('togglable', change) || isChanged('toggleable', change)) {\n this.toggleAriaPressed(this.toggleable);\n }\n }\n ngAfterViewChecked() {\n this.setIconTextClasses();\n }\n ngOnDestroy() {\n this.imageNode = null;\n this.iconNode = null;\n this.renderer = null;\n this.localizationChangeSubscription.unsubscribe();\n if (this.service && this.buttonLookChangeSubscription) {\n this.buttonLookChangeSubscription.unsubscribe();\n }\n clearTimeout(this.deferTimeout);\n this.domEvents.forEach(unbindHandler => unbindHandler());\n }\n /**\n * Focuses the Button component.\n */\n focus() {\n if (isDocumentAvailable()) {\n this.element.focus();\n this.isFocused = true;\n }\n }\n /**\n * Blurs the Button component.\n */\n blur() {\n if (isDocumentAvailable()) {\n this.element.blur();\n this.isFocused = false;\n }\n }\n /**\n * @hidden\n */\n setAttribute(attribute, value) {\n this.renderer.setAttribute(this.element, attribute, value);\n }\n /**\n * @hidden\n */\n removeAttribute(attribute) {\n this.renderer.removeAttribute(this.element, attribute);\n }\n /**\n * @hidden\n *\n * Internal setter that triggers selectedChange\n */\n setSelected(value) {\n const changed = this.selected !== value;\n this.selected = value;\n this.setAttribute('aria-pressed', this.selected.toString());\n this.toggleClass('k-state-active', this.selected);\n if (changed && hasObservers(this.selectedChange)) {\n this.ngZone.run(() => {\n this.selectedChange.emit(value);\n });\n }\n }\n toggleAriaPressed(shouldSet) {\n if (!isDocumentAvailable()) {\n return;\n }\n if (shouldSet) {\n this.setAttribute('aria-pressed', this.selected.toString());\n }\n else {\n this.removeAttribute('aria-pressed');\n }\n }\n hasText() {\n if (isDocumentAvailable()) {\n return String(this.element.textContent).trim().length > 0;\n }\n else {\n return false;\n }\n }\n addImgIcon(imageUrl) {\n let renderer = this.renderer;\n if (this.imageNode) {\n renderer.setProperty(this.imageNode, 'src', imageUrl);\n }\n else if (isDocumentAvailable()) {\n this.imageNode = renderer.createElement('img');\n renderer.setProperty(this.imageNode, 'src', imageUrl);\n renderer.setProperty(this.imageNode, 'className', 'k-image');\n renderer.setAttribute(this.imageNode, 'role', 'presentation');\n this.prependChild(this.imageNode);\n }\n }\n addIcon(classNames) {\n let renderer = this.renderer;\n if (this.iconNode) {\n renderer.setProperty(this.iconNode, 'className', classNames);\n }\n else if (isDocumentAvailable()) {\n this.iconNode = renderer.createElement('span');\n renderer.setProperty(this.iconNode, 'className', classNames);\n renderer.setAttribute(this.iconNode, 'role', 'presentation');\n this.prependChild(this.iconNode);\n }\n }\n prependChild(node) {\n this.defer(() => {\n if (this.renderer && node !== this.element.firstChild) {\n this.renderer.insertBefore(this.element, node, this.element.firstChild);\n }\n });\n }\n defer(callback) {\n this.ngZone.runOutsideAngular(() => {\n this.deferTimeout = setTimeout(callback, 0);\n });\n }\n iconSetter(icon, insertIcon) {\n if (icon) {\n insertIcon(icon);\n }\n this.setIconTextClasses();\n }\n removeImageNode() {\n if (this.imageNode && this.renderer.parentNode(this.imageNode)) {\n this.renderer.removeChild(this.element, this.imageNode);\n this.imageNode = null;\n }\n }\n removeIconNode() {\n if (this.iconNode && this.renderer.parentNode(this.iconNode)) {\n this.renderer.removeChild(this.element, this.iconNode);\n this.iconNode = null;\n }\n }\n updateIconNode() {\n if (!this.isIcon && !this.isIconClass) {\n this.removeIconNode();\n }\n }\n setIconTextClasses() {\n const hasIcon = this.isIcon || this.isIconClass || this.imageNode;\n const hasText = this.hasText();\n this.toggleClass('k-button-icon', hasIcon && !hasText);\n this.toggleClass('k-button-icontext', hasIcon && hasText);\n }\n toggleClass(className, add) {\n if (add) {\n this.renderer.addClass(this.element, className);\n }\n else {\n this.renderer.removeClass(this.element, className);\n }\n }\n _onButtonClick() {\n if (!this.disabled && this.service) {\n this.ngZone.run(() => {\n this.service.click(this);\n });\n }\n if (this.togglable && !this.service) {\n this.setSelected(!this.selected);\n }\n }\n}\nButtonDirective.ɵfac = function ButtonDirective_Factory(t) { return new (t || ButtonDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(KendoButtonService, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nButtonDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ButtonDirective, selectors: [[\"button\", \"kendoButton\", \"\"], [\"span\", \"kendoButton\", \"\"]], hostVars: 19, hostBindings: function ButtonDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"focus\", function ButtonDirective_focus_HostBindingHandler() { return ctx.onFocus(); })(\"blur\", function ButtonDirective_blur_HostBindingHandler() { return ctx.onBlur(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.roleSetter)(\"aria-disabled\", ctx.classDisabled)(\"dir\", ctx.getDirection);\n ɵngcc0.ɵɵclassProp(\"k-button\", ctx.classButton)(\"k-primary\", ctx.classPrimary)(\"k-flat\", ctx.isFlat)(\"k-bare\", ctx.isBare)(\"k-outline\", ctx.isOutline)(\"k-button-clear\", ctx.isClear)(\"k-state-disabled\", ctx.classDisabled)(\"k-state-active\", ctx.classActive);\n } }, inputs: { toggleable: \"toggleable\", primary: \"primary\", look: \"look\", role: \"role\", togglable: \"togglable\", selected: \"selected\", tabIndex: \"tabIndex\", icon: \"icon\", iconClass: \"iconClass\", imageUrl: \"imageUrl\", disabled: \"disabled\" }, outputs: { selectedChange: \"selectedChange\", click: \"click\" }, exportAs: [\"kendoButton\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nButtonDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: KendoButtonService, decorators: [{ type: Optional }] },\n { type: LocalizationService },\n { type: NgZone }\n];\nButtonDirective.propDecorators = {\n toggleable: [{ type: Input }],\n togglable: [{ type: Input }],\n primary: [{ type: Input }],\n look: [{ type: Input }],\n selected: [{ type: Input }],\n tabIndex: [{ type: Input }],\n icon: [{ type: Input }],\n iconClass: [{ type: Input }],\n imageUrl: [{ type: Input }],\n disabled: [{ type: Input }],\n role: [{ type: Input }],\n selectedChange: [{ type: Output }],\n click: [{ type: Output }],\n classButton: [{ type: HostBinding, args: ['class.k-button',] }],\n classPrimary: [{ type: HostBinding, args: ['class.k-primary',] }],\n isFlat: [{ type: HostBinding, args: ['class.k-flat',] }],\n isBare: [{ type: HostBinding, args: ['class.k-bare',] }],\n isOutline: [{ type: HostBinding, args: ['class.k-outline',] }],\n isClear: [{ type: HostBinding, args: ['class.k-button-clear',] }],\n roleSetter: [{ type: HostBinding, args: ['attr.role',] }],\n classDisabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.k-state-disabled',] }],\n classActive: [{ type: HostBinding, args: ['class.k-state-active',] }],\n getDirection: [{ type: HostBinding, args: ['attr.dir',] }],\n onFocus: [{ type: HostListener, args: ['focus',] }],\n onBlur: [{ type: HostListener, args: ['blur',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonDirective, [{\n type: Directive,\n args: [{\n exportAs: 'kendoButton',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ],\n selector: 'button[kendoButton], span[kendoButton]' // tslint:disable-line\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: KendoButtonService, decorators: [{\n type: Optional\n }] }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { toggleable: [{\n type: Input\n }], primary: [{\n type: Input\n }], look: [{\n type: Input\n }], role: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], click: [{\n type: Output\n }], togglable: [{\n type: Input\n }], selected: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], icon: [{\n type: Input\n }], iconClass: [{\n type: Input\n }], imageUrl: [{\n type: Input\n }], disabled: [{\n type: Input\n }], classButton: [{\n type: HostBinding,\n args: ['class.k-button']\n }], classPrimary: [{\n type: HostBinding,\n args: ['class.k-primary']\n }], isFlat: [{\n type: HostBinding,\n args: ['class.k-flat']\n }], isBare: [{\n type: HostBinding,\n args: ['class.k-bare']\n }], isOutline: [{\n type: HostBinding,\n args: ['class.k-outline']\n }], isClear: [{\n type: HostBinding,\n args: ['class.k-button-clear']\n }], roleSetter: [{\n type: HostBinding,\n args: ['attr.role']\n }], classDisabled: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }, {\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], classActive: [{\n type: HostBinding,\n args: ['class.k-state-active']\n }], getDirection: [{\n type: HostBinding,\n args: ['attr.dir']\n }], onFocus: [{\n type: HostListener,\n args: ['focus']\n }], onBlur: [{\n type: HostListener,\n args: ['blur']\n }] }); })();\n\n/* tslint:disable:no-null-keyword */\n/* tslint:disable:no-bitwise */\nconst resolvedPromise = Promise.resolve(null);\n/**\n * @hidden\n */\nconst isPresent = (value) => value !== null && value !== undefined;\n/**\n * @hidden\n */\nconst tick = (f) => (resolvedPromise.then(f));\n/**\n * @hidden\n */\nfunction isDocumentNode(container) {\n return container.nodeType === 9;\n}\n/**\n * @hidden\n */\nfunction closest(element, selector) {\n if (element.closest) {\n return element.closest(selector);\n }\n const matches = Element.prototype.matches ?\n (el, sel) => el.matches(sel)\n : (el, sel) => el.msMatchesSelector(sel);\n let node = element;\n while (node && !isDocumentNode(node)) {\n if (matches(node, selector)) {\n return node;\n }\n node = node.parentNode;\n }\n}\n\n/**\n * @hidden\n */\nclass PreventableEvent {\n constructor() {\n this.prevented = false;\n }\n /**\n * Prevents the default action for a specified event.\n * In this way, the source component suppresses the built-in behavior that follows the event.\n */\n preventDefault() {\n this.prevented = true;\n }\n /**\n * If the event is prevented by any of its subscribers, returns `true`.\n *\n * @returns `true` if the default action was prevented. Otherwise, returns `false`.\n */\n isDefaultPrevented() {\n return this.prevented;\n }\n}\n\n/**\n * @hidden\n */\nconst tabindex = 'tabindex';\n/**\n * Represents the Kendo UI ButtonGroup component for Angular.\n */\nclass ButtonGroupComponent {\n constructor(service, localization, element) {\n this.service = service;\n this.element = element;\n /**\n * By default, the selection mode of the ButtonGroup is set to `multiple`.\n */\n this.selection = 'multiple';\n /**\n * Changes the visual appearance by using alternative styling options\n * ([more information and examples]({% slug styling_buttongroup %})).\n * The `look` property of the ButtonGroup takes precedence over the `look` property\n * of the individual buttons that are part of the group.\n *\n * The available values are:\n * * `flat`\n * * `outline`\n */\n this.look = 'default';\n /**\n * Fires every time keyboard navigation occurs.\n */\n this.navigate = new EventEmitter();\n this._tabIndex = 0;\n this.currentTabIndex = 0;\n this.localizationChangeSubscription = localization.changes.subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n }\n /**\n * Specifies the [`tabIndex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the component.\n */\n set tabIndex(value) {\n this._tabIndex = value;\n this.currentTabIndex = value;\n }\n get tabIndex() {\n return this._tabIndex;\n }\n get wrapperClass() {\n return true;\n }\n get disabledClass() {\n return this.disabled;\n }\n get stretchedClass() {\n return !!this.width;\n }\n get isFlat() {\n return this.look === 'flat';\n }\n get isBare() {\n return this.look === 'bare';\n }\n get isOutline() {\n return this.look === 'outline';\n }\n get getRole() {\n return this.isSelectionSingle() ? 'radiogroup' : 'group';\n }\n get dir() {\n return this.direction;\n }\n get ariaDisabled() {\n return this.disabled;\n }\n get wrapperWidth() {\n return this.width;\n }\n get wrapperTabIndex() {\n return this.disabled ? undefined : this.currentTabIndex;\n }\n /**\n * @hidden\n */\n keydown(event) {\n if (!this.disabled) {\n this.navigateFocus(event);\n }\n }\n /**\n * @hidden\n */\n onFocus() {\n this.currentTabIndex = -1;\n const focusedIndex = this.buttons.toArray().findIndex(current => current.element.tabIndex !== -1);\n const index = focusedIndex === -1 ? 0 : focusedIndex;\n this.focus(this.buttons.filter((_current, i) => {\n return i === index;\n }));\n }\n /**\n * @hidden\n */\n focusout(event) {\n if (event.relatedTarget && event.relatedTarget.parentNode !== this.element.nativeElement) {\n this.defocus(this.buttons.toArray());\n this.currentTabIndex = this.tabIndex;\n }\n }\n ngOnInit() {\n this.service.setButtonLook(this.look);\n this.subscription = this.service.buttonClicked$.subscribe((button) => {\n let newSelectionValue;\n if (this.isSelectionSingle()) {\n newSelectionValue = true;\n this.deactivate(this.buttons.filter(current => current !== button));\n }\n else {\n this.defocus(this.buttons.toArray());\n newSelectionValue = !button.selected;\n }\n if (button.togglable) {\n button.setSelected(newSelectionValue);\n }\n button.setAttribute(tabindex, \"0\");\n });\n }\n ngOnChanges(change) {\n if (isChanged('disabled', change)) {\n this.buttons.forEach((button) => {\n if (isPresent(this.disabled)) {\n button.disabled = this.disabled;\n }\n });\n }\n }\n ngAfterContentInit() {\n this.buttons.forEach((button) => {\n if (button.selected) {\n button.setAttribute(tabindex, \"0\");\n }\n else {\n button.setAttribute(tabindex, \"-1\");\n }\n });\n }\n ngAfterViewChecked() {\n if (this.buttons.length) {\n this.buttons.first.renderer.addClass(this.buttons.first.element, 'k-group-start');\n this.buttons.last.renderer.addClass(this.buttons.last.element, 'k-group-end');\n }\n }\n ngOnDestroy() {\n this.subscription.unsubscribe();\n this.localizationChangeSubscription.unsubscribe();\n }\n ngAfterContentChecked() {\n this.verifySettings();\n }\n navigateFocus(event) {\n let focusedIndex = this.buttons.toArray().findIndex(current => current.element.tabIndex !== -1);\n const firstIndex = 0;\n const lastIndex = this.buttons.length - 1;\n const eventArgs = new PreventableEvent();\n if (event.keyCode === Keys.ArrowRight && focusedIndex < lastIndex) {\n this.navigate.emit(eventArgs);\n if (!eventArgs.isDefaultPrevented()) {\n this.defocus(this.buttons.toArray());\n this.focus(this.buttons.filter((_current, index) => {\n return index === focusedIndex + 1;\n }));\n }\n }\n if (event.keyCode === Keys.ArrowLeft && focusedIndex > firstIndex) {\n this.navigate.emit(eventArgs);\n if (!eventArgs.isDefaultPrevented()) {\n this.defocus(this.buttons.toArray());\n this.focus(this.buttons.filter((_current, index) => {\n return index === focusedIndex - 1;\n }));\n }\n }\n }\n deactivate(buttons) {\n buttons.forEach((button) => {\n button.setSelected(false);\n button.setAttribute(tabindex, \"-1\");\n });\n }\n activate(buttons) {\n buttons.forEach((button) => {\n button.setSelected(true);\n button.setAttribute(tabindex, \"0\");\n button.focus();\n });\n }\n defocus(buttons) {\n buttons.forEach((button) => {\n button.setAttribute(tabindex, \"-1\");\n });\n }\n focus(buttons) {\n buttons.forEach((button) => {\n button.setAttribute(tabindex, \"0\");\n button.focus();\n });\n }\n verifySettings() {\n if (isDevMode()) {\n if (this.isSelectionSingle() && this.buttons.filter(button => button.selected).length > 1) {\n throw new Error('Having multiple selected buttons with single selection mode is not supported');\n }\n }\n }\n isSelectionSingle() {\n return this.selection === 'single';\n }\n}\nButtonGroupComponent.ɵfac = function ButtonGroupComponent_Factory(t) { return new (t || ButtonGroupComponent)(ɵngcc0.ɵɵdirectiveInject(KendoButtonService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nButtonGroupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ButtonGroupComponent, selectors: [[\"kendo-buttongroup\"]], contentQueries: function ButtonGroupComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ButtonDirective, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.buttons = _t);\n } }, hostVars: 18, hostBindings: function ButtonGroupComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function ButtonGroupComponent_keydown_HostBindingHandler($event) { return ctx.keydown($event); })(\"focus\", function ButtonGroupComponent_focus_HostBindingHandler() { return ctx.onFocus(); })(\"focusout\", function ButtonGroupComponent_focusout_HostBindingHandler($event) { return ctx.focusout($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.getRole)(\"dir\", ctx.dir)(\"aria-disabled\", ctx.ariaDisabled)(\"tabindex\", ctx.wrapperTabIndex);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.wrapperWidth);\n ɵngcc0.ɵɵclassProp(\"k-button-group\", ctx.wrapperClass)(\"k-state-disabled\", ctx.disabledClass)(\"k-button-group-stretched\", ctx.stretchedClass)(\"k-button-group-flat\", ctx.isFlat)(\"k-button-group-bare\", ctx.isBare)(\"k-button-group-outline\", ctx.isOutline);\n } }, inputs: { selection: \"selection\", look: \"look\", tabIndex: \"tabIndex\", disabled: \"disabled\", width: \"width\" }, outputs: { navigate: \"navigate\" }, exportAs: [\"kendoButtonGroup\"], features: [ɵngcc0.ɵɵProvidersFeature([\n KendoButtonService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.buttongroup'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function ButtonGroupComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c0);\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\n/** @nocollapse */\nButtonGroupComponent.ctorParameters = () => [\n { type: KendoButtonService },\n { type: LocalizationService },\n { type: ElementRef }\n];\nButtonGroupComponent.propDecorators = {\n disabled: [{ type: Input, args: ['disabled',] }],\n selection: [{ type: Input, args: ['selection',] }],\n width: [{ type: Input, args: ['width',] }],\n look: [{ type: Input }],\n tabIndex: [{ type: Input }],\n navigate: [{ type: Output }],\n buttons: [{ type: ContentChildren, args: [ButtonDirective,] }],\n wrapperClass: [{ type: HostBinding, args: ['class.k-button-group',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }],\n stretchedClass: [{ type: HostBinding, args: ['class.k-button-group-stretched',] }],\n isFlat: [{ type: HostBinding, args: ['class.k-button-group-flat',] }],\n isBare: [{ type: HostBinding, args: ['class.k-button-group-bare',] }],\n isOutline: [{ type: HostBinding, args: ['class.k-button-group-outline',] }],\n getRole: [{ type: HostBinding, args: ['attr.role',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n ariaDisabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }],\n wrapperWidth: [{ type: HostBinding, args: ['style.width',] }],\n wrapperTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],\n keydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n onFocus: [{ type: HostListener, args: ['focus',] }],\n focusout: [{ type: HostListener, args: ['focusout', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonGroupComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoButtonGroup',\n providers: [\n KendoButtonService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.buttongroup'\n }\n ],\n selector: 'kendo-buttongroup',\n template: `\n \n `\n }]\n }], function () { return [{ type: KendoButtonService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ElementRef }]; }, { selection: [{\n type: Input,\n args: ['selection']\n }], look: [{\n type: Input\n }], navigate: [{\n type: Output\n }], tabIndex: [{\n type: Input\n }], wrapperClass: [{\n type: HostBinding,\n args: ['class.k-button-group']\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], stretchedClass: [{\n type: HostBinding,\n args: ['class.k-button-group-stretched']\n }], isFlat: [{\n type: HostBinding,\n args: ['class.k-button-group-flat']\n }], isBare: [{\n type: HostBinding,\n args: ['class.k-button-group-bare']\n }], isOutline: [{\n type: HostBinding,\n args: ['class.k-button-group-outline']\n }], getRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], ariaDisabled: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }], wrapperWidth: [{\n type: HostBinding,\n args: ['style.width']\n }], wrapperTabIndex: [{\n type: HostBinding,\n args: ['attr.tabindex']\n }], keydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], onFocus: [{\n type: HostListener,\n args: ['focus']\n }], focusout: [{\n type: HostListener,\n args: ['focusout', ['$event']]\n }], disabled: [{\n type: Input,\n args: ['disabled']\n }], width: [{\n type: Input,\n args: ['width']\n }], buttons: [{\n type: ContentChildren,\n args: [ButtonDirective]\n }] }); })();\n\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmodules'] }})\n * definition for the Button directive.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Button module\n * import { ButtonModule } from '@progress/kendo-angular-buttons';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, ButtonModule], // import Button module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass ButtonModule {\n}\nButtonModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ButtonModule });\nButtonModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ButtonModule_Factory(t) { return new (t || ButtonModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ButtonModule, { declarations: [ButtonDirective], exports: [ButtonDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonModule, [{\n type: NgModule,\n args: [{\n declarations: [ButtonDirective],\n exports: [ButtonDirective]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n *\n * The exported package module.\n *\n * The package exports:\n * - `ButtonGroupComponent`—The ButtonGroupComponent component class.\n */\nclass ButtonGroupModule {\n}\nButtonGroupModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ButtonGroupModule });\nButtonGroupModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ButtonGroupModule_Factory(t) { return new (t || ButtonGroupModule)(); }, imports: [[CommonModule, ButtonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ButtonGroupModule, { declarations: function () { return [ButtonGroupComponent]; }, imports: function () { return [CommonModule,\n ButtonModule]; }, exports: function () { return [ButtonGroupComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonGroupModule, [{\n type: NgModule,\n args: [{\n declarations: [ButtonGroupComponent],\n exports: [ButtonGroupComponent],\n imports: [CommonModule, ButtonModule]\n }]\n }], null, null); })();\n\n/* tslint:disable:directive-selector-name */\n/**\n * Used for rendering the list item content.\n *\n * To define the item template, nest a `` tag with the `kendoItemTemplate` directive inside the component tag.\n *\n * For the DropDownButton, use the `kendoDropDownButtonItemTemplate` directive.\n * For the SplitButton, use the `kendoSplitButtonItemTemplate` directive.\n *\n * The template context is set to the current component. To get a reference to the current data item, use the `let-dataItem` directive.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * {{dataItem}} option\n * \n * \n * \n * \n * {{dataItem}} option\n * \n * \n * `\n * })\n * class AppComponent {\n * public listItems: Array = [{\n * text: 'item1',\n * icon: 'refresh',\n * disabled: false,\n * click: (dataItem: any) => {\n * //action\n * }\n * }, {\n * text: 'item2',\n * icon: 'refresh',\n * disabled: false,\n * click: (dataItem: any) => {\n * //action\n * }\n * }]\n * }\n * ```\n *\n * For more examples, refer to the article on the [DropDownList templates]({% slug overview_ddl %}#templates).\n */\nclass ButtonItemTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nButtonItemTemplateDirective.ɵfac = function ButtonItemTemplateDirective_Factory(t) { return new (t || ButtonItemTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nButtonItemTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ButtonItemTemplateDirective, selectors: [[\"\", \"kendoDropDownButtonItemTemplate\", \"\"], [\"\", \"kendoSplitButtonItemTemplate\", \"\"]] });\n/** @nocollapse */\nButtonItemTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonItemTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDropDownButtonItemTemplate],[kendoSplitButtonItemTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * @hidden\n */\nclass ListComponent {\n constructor() {\n this.onItemClick = new EventEmitter();\n this.onItemBlur = new EventEmitter();\n }\n getText(dataItem) {\n if (dataItem) {\n return this.textField ? dataItem[this.textField] : dataItem.text || dataItem;\n }\n return undefined;\n }\n getIconClasses(dataItem) {\n const icon = dataItem.icon ? 'k-icon k-i-' + dataItem.icon : undefined;\n const classes = {};\n classes[icon || dataItem.iconClass] = true;\n return classes;\n }\n onClick(index) {\n this.onItemClick.emit(index);\n }\n onBlur() {\n this.onItemBlur.emit();\n }\n}\nListComponent.ɵfac = function ListComponent_Factory(t) { return new (t || ListComponent)(); };\nListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ListComponent, selectors: [[\"kendo-button-list\"]], inputs: { data: \"data\", textField: \"textField\", itemTemplate: \"itemTemplate\" }, outputs: { onItemClick: \"onItemClick\", onItemBlur: \"onItemBlur\" }, decls: 2, vars: 1, consts: [[\"unselectable\", \"on\", 1, \"k-list\", \"k-reset\"], [\"role\", \"menuitem\", \"unselectable\", \"on\", \"tabindex\", \"-1\", \"kendoButtonFocusable\", \"\", 3, \"index\", \"ngClass\", \"click\", \"blur\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"menuitem\", \"unselectable\", \"on\", \"tabindex\", \"-1\", \"kendoButtonFocusable\", \"\", 3, \"index\", \"ngClass\", \"click\", \"blur\"], [4, \"ngIf\"], [3, \"ngIf\"], [3, \"templateContext\"], [3, \"ngClass\", 4, \"ngIf\"], [\"class\", \"k-image\", \"alt\", \"\", 3, \"src\", 4, \"ngIf\"], [3, \"ngClass\"], [\"alt\", \"\", 1, \"k-image\", 3, \"src\"]], template: function ListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"ul\", 0);\n ɵngcc0.ɵɵtemplate(1, ListComponent_li_1_Template, 3, 7, \"li\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.data);\n } }, directives: function () { return [ɵngcc2.NgForOf, FocusableDirective, ɵngcc2.NgClass, ɵngcc2.NgIf, TemplateContextDirective]; }, encapsulation: 2 });\nListComponent.propDecorators = {\n data: [{ type: Input }],\n textField: [{ type: Input }],\n itemTemplate: [{ type: Input }],\n onItemClick: [{ type: Output }],\n onItemBlur: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ListComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-button-list',\n template: `\n
    \n
  • \n \n \n \n \n \n {{ getText(dataItem) }}\n \n
  • \n
\n `\n }]\n }], function () { return []; }, { onItemClick: [{\n type: Output\n }], onItemBlur: [{\n type: Output\n }], data: [{\n type: Input\n }], textField: [{\n type: Input\n }], itemTemplate: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass FocusService {\n constructor() {\n this.onFocus = new EventEmitter();\n }\n isFocused(index) {\n return index === this.focused;\n }\n focus(index) {\n if (this.isFocused(index)) {\n return;\n }\n this.focused = index;\n this.onFocus.emit(index);\n }\n resetFocus() {\n this.focused = -1;\n }\n get focused() {\n return this.focusedIndex;\n }\n set focused(index) {\n this.focusedIndex = index;\n this.onFocus.emit(index);\n }\n}\nFocusService.ɵfac = function FocusService_Factory(t) { return new (t || FocusService)(); };\nFocusService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: FocusService, factory: FocusService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FocusService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass FocusableDirective {\n constructor(focusService, elementRef) {\n this.focusService = focusService;\n this.element = elementRef.nativeElement;\n this.subscribeEvents();\n }\n get focusedClassName() {\n return this.focusService.isFocused(this.index);\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n this.unsubscribeEvents();\n }\n subscribeEvents() {\n if (!isDocumentAvailable()) {\n return;\n }\n this.focusSubscription = this.focusService.onFocus.subscribe((index) => {\n if (this.index === index) {\n this.element.focus();\n }\n });\n }\n unsubscribeEvents() {\n if (!isDocumentAvailable()) {\n return;\n }\n if (this.focusSubscription) {\n this.focusSubscription.unsubscribe();\n }\n }\n}\nFocusableDirective.ɵfac = function FocusableDirective_Factory(t) { return new (t || FocusableDirective)(ɵngcc0.ɵɵdirectiveInject(FocusService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nFocusableDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FocusableDirective, selectors: [[\"\", \"kendoButtonFocusable\", \"\"]], hostVars: 2, hostBindings: function FocusableDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-state-focused\", ctx.focusedClassName);\n } }, inputs: { index: \"index\" } });\n/** @nocollapse */\nFocusableDirective.ctorParameters = () => [\n { type: FocusService },\n { type: ElementRef }\n];\nFocusableDirective.propDecorators = {\n index: [{ type: Input }],\n focusedClassName: [{ type: HostBinding, args: ['class.k-state-focused',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FocusableDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoButtonFocusable]'\n }]\n }], function () { return [{ type: FocusService }, { type: ɵngcc0.ElementRef }]; }, { focusedClassName: [{\n type: HostBinding,\n args: ['class.k-state-focused']\n }], index: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass TemplateContextDirective {\n constructor(viewContainerRef) {\n this.viewContainerRef = viewContainerRef;\n }\n set templateContext(context) {\n if (this.insertedViewRef) {\n this.viewContainerRef.remove(this.viewContainerRef.indexOf(this.insertedViewRef));\n this.insertedViewRef = undefined;\n }\n if (context.templateRef) {\n this.insertedViewRef = this.viewContainerRef.createEmbeddedView(context.templateRef, context);\n }\n }\n}\nTemplateContextDirective.ɵfac = function TemplateContextDirective_Factory(t) { return new (t || TemplateContextDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef)); };\nTemplateContextDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TemplateContextDirective, selectors: [[\"\", \"templateContext\", \"\"]], inputs: { templateContext: \"templateContext\" } });\n/** @nocollapse */\nTemplateContextDirective.ctorParameters = () => [\n { type: ViewContainerRef }\n];\nTemplateContextDirective.propDecorators = {\n templateContext: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TemplateContextDirective, [{\n type: Directive,\n args: [{\n selector: '[templateContext]' // tslint:disable-line:directive-selector\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }]; }, { templateContext: [{\n type: Input\n }] }); })();\n\nconst EXPORTED_DIRECTIVES = [\n ListComponent,\n FocusableDirective,\n ButtonItemTemplateDirective,\n TemplateContextDirective\n];\n/**\n * @hidden\n */\nclass ListModule {\n}\nListModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ListModule });\nListModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ListModule_Factory(t) { return new (t || ListModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ListModule, { declarations: function () { return [ListComponent,\n FocusableDirective,\n ButtonItemTemplateDirective,\n TemplateContextDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [ListComponent,\n FocusableDirective,\n ButtonItemTemplateDirective,\n TemplateContextDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ListModule, [{\n type: NgModule,\n args: [{\n declarations: [EXPORTED_DIRECTIVES],\n exports: [EXPORTED_DIRECTIVES],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nvar KeyEvents;\n(function (KeyEvents) {\n KeyEvents[KeyEvents[\"keydown\"] = 0] = \"keydown\";\n KeyEvents[KeyEvents[\"keypress\"] = 1] = \"keypress\";\n KeyEvents[KeyEvents[\"keyup\"] = 2] = \"keyup\";\n})(KeyEvents || (KeyEvents = {}));\n\n/**\n * @hidden\n */\nvar NavigationAction;\n(function (NavigationAction) {\n NavigationAction[NavigationAction[\"Undefined\"] = 0] = \"Undefined\";\n NavigationAction[NavigationAction[\"Open\"] = 1] = \"Open\";\n NavigationAction[NavigationAction[\"Close\"] = 2] = \"Close\";\n NavigationAction[NavigationAction[\"Enter\"] = 3] = \"Enter\";\n NavigationAction[NavigationAction[\"EnterPress\"] = 4] = \"EnterPress\";\n NavigationAction[NavigationAction[\"EnterUp\"] = 5] = \"EnterUp\";\n NavigationAction[NavigationAction[\"Tab\"] = 6] = \"Tab\";\n NavigationAction[NavigationAction[\"Esc\"] = 7] = \"Esc\";\n NavigationAction[NavigationAction[\"Navigate\"] = 8] = \"Navigate\";\n})(NavigationAction || (NavigationAction = {}));\n\n/* tslint:disable:deprecation */\n/**\n * @hidden\n */\nclass ListButton {\n constructor(focusService, navigationService, wrapperRef, _zone, localization, cdr) {\n this.focusService = focusService;\n this.navigationService = navigationService;\n this.wrapperRef = wrapperRef;\n this._zone = _zone;\n this.cdr = cdr;\n this._open = false;\n this._disabled = false;\n this._active = false;\n this._popupSettings = { animate: true, popupClass: '' };\n this.listId = guid();\n this._isFocused = false;\n this.focusService = focusService;\n this.navigationService = navigationService;\n this.wrapper = wrapperRef.nativeElement;\n this.localizationChangeSubscription = localization.changes.subscribe(({ rtl }) => (this.direction = rtl ? 'rtl' : 'ltr'));\n this.subscribeEvents();\n }\n get popupClasses() {\n const popupClasses = ['k-list-container', 'k-reset', 'k-group'];\n if (this._popupSettings.popupClass) {\n popupClasses.push(this._popupSettings.popupClass);\n }\n return popupClasses.join(' ');\n }\n get openState() {\n return this._open;\n }\n set openState(open) {\n this._open = open;\n }\n /**\n * @hidden\n */\n togglePopupVisibility() {\n if (this._disabled) {\n return;\n }\n this.openState = !this.openState;\n if (!this.openState) {\n this.focusService.focus(-1);\n }\n }\n /**\n * @hidden\n */\n onItemClick(index) {\n this.emitItemClickHandler(index);\n setTimeout(() => this.focusWrapper(), 1);\n }\n ngOnDestroy() {\n this.openState = false;\n this.unsubscribeEvents();\n clearTimeout(this.focusFirstTimeout);\n clearTimeout(this.blurTimeout);\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n }\n subscribeEvents() {\n if (!isDocumentAvailable()) {\n return;\n }\n this.subscribeListItemFocusEvent();\n this.subscribeComponentBlurredEvent();\n this.subscribeNavigationEvents();\n }\n subscribeListItemFocusEvent() {\n this.focusSubscription = this.focusService.onFocus.subscribe(() => {\n this._isFocused = true;\n });\n }\n subscribeComponentBlurredEvent() {\n this._zone.runOutsideAngular(() => {\n this.tabSubscription = this.navigationService.tab.pipe(filter(() => this._isFocused)).subscribe(this.handleTab.bind(this));\n this.componentBlurredSubscription = fromEvent(document, 'click')\n .pipe(filter((event) => !this.wrapperContains(event.target)), filter(() => this._isFocused))\n .subscribe(() => this._zone.run(() => this.blurWrapper()));\n });\n }\n subscribeNavigationEvents() {\n this.navigationSubscription = this.navigationService.navigate.subscribe(this.focusService.focus.bind(this.focusService));\n this.enterUpSubscription = this.navigationService.enterup.subscribe(() => {\n this.enterHandler();\n this.focusWrapper();\n });\n this.openSubscription = this.navigationService.open.subscribe(() => {\n if (!this._open) {\n this.togglePopupVisibility();\n this.focusFirstItem();\n }\n else {\n this.focusWrapper();\n }\n });\n this.closeSubscription = merge(this.navigationService.close, this.navigationService.esc).subscribe(() => this.focusWrapper());\n }\n enterHandler() { } // tslint:disable-line\n unsubscribeEvents() {\n if (!isDocumentAvailable()) {\n return;\n }\n this.unsubscribe(this.componentBlurredSubscription);\n this.unsubscribe(this.focusSubscription);\n this.unsubscribe(this.navigationSubscription);\n this.unsubscribe(this.enterPressSubscription);\n this.unsubscribe(this.enterUpSubscription);\n this.unsubscribe(this.openSubscription);\n this.unsubscribe(this.closeSubscription);\n this.unsubscribe(this.tabSubscription);\n }\n unsubscribe(subscription) {\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n keyDownHandler(event) {\n this.keyHandler(event);\n }\n /**\n * @hidden\n */\n keyPressHandler(event) {\n this.keyHandler(event, KeyEvents.keypress);\n }\n /**\n * @hidden\n */\n keyUpHandler(event) {\n this.keyHandler(event, KeyEvents.keyup);\n }\n /**\n * @hidden\n */\n keyHandler(event, keyEvent) {\n if (this._disabled) {\n return;\n }\n let focused = this.focusService.focused || 0;\n const eventData = event;\n const action = this.navigationService.process({\n altKey: eventData.altKey,\n current: focused,\n keyCode: eventData.keyCode,\n keyEvent: keyEvent,\n max: this._data ? this._data.length - 1 : 0,\n min: 0\n });\n if (action !== NavigationAction.Undefined &&\n action !== NavigationAction.Tab &&\n (action !== NavigationAction.Enter || (action === NavigationAction.Enter && this._open))) {\n if (event.keyCode === Keys.Space && action === NavigationAction.EnterUp) {\n this._open = false;\n }\n else {\n eventData.preventDefault();\n }\n }\n }\n emitItemClickHandler(index) {\n const dataItem = this._data[index];\n if (this._itemClick) {\n this._itemClick.emit(dataItem);\n }\n if (dataItem && dataItem.click && !dataItem.disabled) {\n dataItem.click(dataItem);\n }\n }\n focusFirstItem() {\n if (this._data && isPresent(this._data[0])) {\n this.focusFirstTimeout = setTimeout(() => this.focusService.focus(0), 1);\n }\n }\n focusWrapper() {\n if (this._open) {\n this.togglePopupVisibility();\n this.focusButton();\n }\n }\n wrapperContains(element) {\n return this.wrapper === element || this.wrapper.contains(element);\n }\n blurWrapper(emit = true) {\n if (this._open) {\n this.togglePopupVisibility();\n }\n this._isFocused = false;\n if (emit) {\n this._blur.emit();\n this.cdr.markForCheck();\n }\n }\n focusButton() {\n if (this.button) {\n this.button.nativeElement.focus();\n }\n }\n handleTab() {\n this.focusButton();\n this.blurWrapper(false);\n }\n}\nListButton.ɵfac = function ListButton_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nListButton.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ListButton });\n\n\n/**\n * @hidden\n */\nconst NAVIGATION_CONFIG = new InjectionToken('navigation.config');\n\n/**\n * @hidden\n */\nclass NavigationService {\n constructor(config) {\n this.navigate = new EventEmitter();\n this.open = new EventEmitter();\n this.close = new EventEmitter();\n this.enter = new EventEmitter();\n this.enterpress = new EventEmitter();\n this.enterup = new EventEmitter();\n this.tab = new EventEmitter();\n this.esc = new EventEmitter();\n this.useLeftRightArrows = config.useLeftRightArrows;\n }\n process(args) {\n const keyCode = args.keyCode;\n const keyEvent = args.keyEvent;\n let index;\n let action = NavigationAction.Undefined;\n if (keyEvent === KeyEvents.keypress) {\n if (this.isEnter(keyCode)) {\n action = NavigationAction.EnterPress;\n }\n }\n else if (keyEvent === KeyEvents.keyup) {\n if (this.isEnter(keyCode)) {\n action = NavigationAction.EnterUp;\n }\n }\n else {\n if (args.altKey && keyCode === Keys.ArrowDown) {\n action = NavigationAction.Open;\n }\n else if (args.altKey && keyCode === Keys.ArrowUp) {\n action = NavigationAction.Close;\n }\n else if (this.isEnter(keyCode)) {\n action = NavigationAction.Enter;\n }\n else if (keyCode === Keys.Escape) {\n action = NavigationAction.Esc;\n }\n else if (keyCode === Keys.Tab) {\n action = NavigationAction.Tab;\n }\n else if (keyCode === Keys.ArrowUp || (this.useLeftRightArrows && keyCode === Keys.ArrowLeft)) {\n index = this.next({\n current: args.current,\n start: args.max,\n end: args.min,\n step: -1\n });\n action = NavigationAction.Navigate;\n }\n else if (keyCode === Keys.ArrowDown || (this.useLeftRightArrows && keyCode === Keys.ArrowRight)) {\n index = this.next({\n current: args.current,\n start: args.min,\n end: args.max,\n step: 1\n });\n action = NavigationAction.Navigate;\n }\n }\n if (action !== NavigationAction.Undefined) {\n this[NavigationAction[action].toLowerCase()].emit(index);\n }\n return action;\n }\n isEnter(keyCode) {\n return keyCode === Keys.Enter || keyCode === Keys.Space;\n }\n next(args) {\n if (!isPresent(args.current)) {\n return args.start;\n }\n else {\n return args.current !== args.end ? args.current + args.step : args.end;\n }\n }\n}\nNavigationService.ɵfac = function NavigationService_Factory(t) { return new (t || NavigationService)(ɵngcc0.ɵɵinject(NAVIGATION_CONFIG)); };\nNavigationService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: NavigationService, factory: NavigationService.ɵfac });\n/** @nocollapse */\nNavigationService.ctorParameters = () => [\n { type: undefined, decorators: [{ type: Inject, args: [NAVIGATION_CONFIG,] }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationService, [{\n type: Injectable\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [NAVIGATION_CONFIG]\n }] }]; }, null); })();\n\n/* tslint:disable:no-access-missing-member */\nconst NAVIGATION_SETTINGS = {\n useLeftRightArrows: true\n};\nconst ɵ0 = NAVIGATION_SETTINGS;\nconst NAVIGATION_SETTINGS_PROVIDER = {\n provide: NAVIGATION_CONFIG,\n useValue: ɵ0\n};\n/**\n * Represents the Kendo UI SplitButton component for Angular.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * Paste\n * `\n * })\n *\n * class AppComponent {\n * public data: Array = [{\n * text: 'Keep Text Only',\n * icon: 'paste-plain-text',\n * click: () => { console.log('Keep Text Only click handler'); }\n * }, {\n * text: 'Paste as HTML',\n * icon: 'paste-as-html'\n * }, {\n * text: 'Paste Markdown',\n * icon: 'paste-markdown'\n * }, {\n * text: 'Set Default Paste'\n * }];\n *\n * public onSplitButtonClick(dataItem: any): void {\n * console.log('Paste');\n * }\n *\n * public onSplitButtonItemClick(dataItem: any): void {\n * if (dataItem) {\n * console.log(dataItem.text);\n * }\n * }\n * }\n * ```\n */\nclass SplitButtonComponent extends ListButton {\n constructor(focusService, navigationService, wrapperRef, zone, popupService, elRef, localization, cdr) {\n super(focusService, navigationService, wrapperRef, zone, localization, cdr);\n this.popupService = popupService;\n this.elRef = elRef;\n /**\n * Sets the text of the SplitButton.\n */\n this.text = '';\n /**\n * Defines an icon to be rendered next to the button text\n * ([see example]({% slug databinding_splitbutton %}#toc-arrays-of-complex-data)).\n */\n this.icon = '';\n /**\n * Defines an icon with a custom CSS class to be rendered next to the button text\n * ([see example]({% slug databinding_splitbutton %}#toc-arrays-of-complex-data)).\n */\n this.iconClass = '';\n /**\n * Defines the location of an image to be displayed next to the button text\n * ([see example]({% slug databinding_splitbutton %}#toc-arrays-of-complex-data)).\n */\n this.imageUrl = '';\n /**\n * Changes the visual appearance by using alternative styling options.\n *\n * The available values are:\n * * `flat`\n * * `outline`\n */\n this.look = 'default';\n /**\n * Specifies the [`tabIndex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the component.\n */\n this.tabIndex = 0;\n /**\n * Specifies the name of the [font icon]({% slug icons %}#toc-list-of-font-icons) that will\n * be rendered for the button which opens the popup.\n */\n this.arrowButtonIcon = 'arrow-s';\n /**\n * Fires each time the user clicks the main button.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * Reply\n * \n * `\n * })\n * class AppComponent {\n * public data: Array = ['Reply All', 'Forward', 'Reply & Delete'];\n *\n * public onSplitButtonClick(): void {\n * console.log('SplitButton click');\n * }\n * }\n * ```\n *\n */\n this.buttonClick = new EventEmitter();\n /**\n * Fires each time the user clicks on the drop-down list. The event data contains the data item bound to the clicked list item.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * Reply\n * \n * `\n * })\n * class AppComponent {\n * public data: Array = ['Reply All', 'Forward', 'Reply & Delete'];\n *\n * public onSplitButtonItemClick(dataItem?: string): void {\n * if (dataItem) {\n * console.log(dataItem);\n * }\n * }\n * }\n * ```\n *\n */\n this.itemClick = new EventEmitter();\n /**\n * Fires each time the SplitButton gets focused.\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the SplitButton gets blurred.\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event, the popup will remain closed.\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event, the popup will remain open.\n */\n this.close = new EventEmitter();\n this.listId = guid();\n /**\n * @hidden\n */\n this.activeArrow = false;\n this.buttonText = '';\n this.lockFocus = false;\n this._itemClick = this.itemClick;\n this._blur = this.onBlur;\n }\n /**\n * When set to `true`, disables a SplitButton item\n * ([see example]({% slug databinding_splitbutton %}#toc-arrays-of-complex-data)).\n */\n set disabled(value) {\n this._disabled = value;\n }\n get disabled() {\n return this._disabled;\n }\n /**\n * Configures the popup of the SplitButton.\n *\n * The available options are:\n * - `animate: Boolean`—Controls the popup animation. By default, the open and close animations are enabled.\n * - `popupClass: String`—Specifies a list of CSS classes that are used to style the popup.\n * - `appendTo: \"root\" | \"component\" | ViewContainerRef`—Specifies the component to which the popup will be appended.\n * - `align: \"left\" | \"center\" | \"right\"`—Specifies the alignment of the popup.\n */\n set popupSettings(settings) {\n this._popupSettings = Object.assign({ animate: true, popupClass: '' }, settings);\n }\n get popupSettings() {\n return this._popupSettings;\n }\n /**\n * Sets the data of the SplitButton.\n *\n * > The data has to be provided in an array-like list.\n */\n set data(data) {\n this._data = data || [];\n }\n get data() {\n if (!this._data) {\n this.data = [];\n }\n return this._data;\n }\n /**\n * @hidden\n */\n set openState(open) {\n if (this.disabled) {\n return;\n }\n const eventArgs = new PreventableEvent();\n if (open) {\n this.open.emit(eventArgs);\n }\n else {\n this.close.emit(eventArgs);\n }\n if (eventArgs.isDefaultPrevented()) {\n return;\n }\n this._toggle(open);\n }\n /**\n * @hidden\n */\n get openState() {\n return this._open;\n }\n /**\n * @hidden\n */\n get active() {\n return this._active;\n }\n /**\n * @hidden\n */\n get componentTabIndex() {\n return this.disabled ? -1 : this.tabIndex;\n }\n set isFocused(value) {\n this._isFocused = value;\n }\n get isFocused() {\n return this._isFocused && !this._disabled;\n }\n get widgetClasses() {\n return true;\n }\n get dir() {\n return this.direction;\n }\n /**\n * @hidden\n */\n get ariaLabel() {\n return `${this.buttonText} splitbutton`;\n }\n /**\n * @hidden\n */\n onButtonFocus() {\n if (!this.isFocused) {\n this._isFocused = true;\n this.onFocus.emit();\n }\n }\n /**\n * @hidden\n */\n onArrowButtonClick() {\n this.lockFocus = true;\n this.togglePopupVisibility();\n }\n /**\n * @hidden\n */\n toggleButtonActiveState(enable) {\n this._active = enable;\n }\n /**\n * @hidden\n */\n toggleArrowButtonActiveState(enable) {\n this.activeArrow = enable;\n }\n /**\n * @hidden\n */\n onButtonClick() {\n this.lockFocus = true;\n this.buttonClick.emit();\n }\n /**\n * @hidden\n */\n onButtonBlur() {\n if (!this.isOpen && !this.lockFocus) {\n this.blurWrapper();\n }\n this.lockFocus = false;\n }\n /**\n * @hidden\n */\n keydown(event) {\n this.keyDownHandler(event);\n if (event.keyCode === Keys.Space) {\n this._active = true;\n }\n }\n /**\n * @hidden\n */\n keypress(event) {\n this.keyPressHandler(event);\n }\n /**\n * @hidden\n */\n keyup(event) {\n this._active = false;\n if (event.keyCode !== Keys.Space) {\n this.keyUpHandler(event);\n }\n }\n /**\n * @hidden\n */\n ngAfterViewInit() {\n this.updateButtonText();\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n if (changes.hasOwnProperty('text')) {\n this.updateButtonText();\n }\n }\n /**\n * @hidden\n */\n togglePopupVisibility() {\n super.togglePopupVisibility();\n if (isDocumentAvailable() && this.lockFocus) {\n this.button.nativeElement.focus();\n }\n }\n /**\n * @hidden\n */\n wrapperContains(element) {\n return (this.wrapper === element || this.wrapper.contains(element) || (this.popupRef && this.popupRef.popupElement.contains(element)));\n }\n /**\n * @hidden\n */\n get anchorAlign() {\n let align = { horizontal: this.popupSettings.align || 'left', vertical: 'bottom' };\n if (this.direction === 'rtl' && !isPresent(this.popupSettings.align)) {\n align.horizontal = 'right';\n }\n return align;\n }\n /**\n * @hidden\n */\n get popupAlign() {\n let align = { horizontal: this.popupSettings.align || 'left', vertical: 'top' };\n if (this.direction === 'rtl' && !isPresent(this.popupSettings.align)) {\n align.horizontal = 'right';\n }\n return align;\n }\n /**\n * Focuses the SplitButton component.\n */\n focus() {\n if (isDocumentAvailable()) {\n this.button.nativeElement.focus();\n }\n }\n /**\n * Blurs the SplitButton component.\n */\n blur() {\n if (isDocumentAvailable()) {\n this.button.nativeElement.blur();\n this.blurWrapper();\n }\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroyPopup();\n }\n /**\n * Toggles the visibility of the popup.\n * If the `toggle` method is used to open or close the popup, the `open` and `close` events will not be fired.\n *\n * @param open - The state of the popup.\n */\n toggle(open) {\n if (this.disabled) {\n return;\n }\n tick(() => this._toggle(open === undefined ? !this._open : open));\n }\n /**\n * Returns the current open state of the popup.\n */\n get isOpen() {\n return this.openState;\n }\n enterHandler() {\n if (this.disabled) {\n return;\n }\n if (this.openState) {\n let focused = this.focusService.focused;\n if (isPresent(focused) && focused !== -1) {\n this.emitItemClickHandler(focused);\n }\n }\n else {\n this.buttonClick.emit();\n }\n }\n updateButtonText() {\n if (isDocumentAvailable()) {\n let innerText = this.wrapper.innerText\n .split('\\n')\n .join('')\n .trim();\n //setTimout is needed because of `Expression has changed after it was checked.` error;\n setTimeout(() => (this.buttonText = innerText), 0);\n }\n }\n get appendTo() {\n const { appendTo } = this.popupSettings;\n if (!appendTo || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.containerRef : appendTo;\n }\n _toggle(open) {\n this._open = open;\n this.destroyPopup();\n if (this._open) {\n this.createPopup();\n }\n }\n createPopup() {\n this.popupRef = this.popupService.open({\n anchor: this.elRef,\n anchorAlign: this.anchorAlign,\n animate: this.popupSettings.animate,\n appendTo: this.appendTo,\n content: this.popupTemplate,\n popupAlign: this.popupAlign,\n popupClass: this.popupClasses\n });\n this.popupRef.popupAnchorViewportLeave.subscribe(() => (this.openState = false));\n this.popupRef.popupOpen.subscribe(this.focusFirstItem.bind(this));\n }\n destroyPopup() {\n if (this.popupRef) {\n this.popupRef.close();\n this.popupRef = null;\n }\n }\n}\nSplitButtonComponent.ɵfac = function SplitButtonComponent_Factory(t) { return new (t || SplitButtonComponent)(ɵngcc0.ɵɵdirectiveInject(FocusService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nSplitButtonComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SplitButtonComponent, selectors: [[\"kendo-splitbutton\"]], contentQueries: function SplitButtonComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ButtonItemTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.itemTemplate = _t.first);\n } }, viewQuery: function SplitButtonComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(_c4, true);\n ɵngcc0.ɵɵstaticViewQuery(_c5, true, ElementRef);\n ɵngcc0.ɵɵstaticViewQuery(_c6, true);\n ɵngcc0.ɵɵstaticViewQuery(_c7, true, ViewContainerRef);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.button = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.arrowButton = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.popupTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.containerRef = _t.first);\n } }, hostVars: 9, hostBindings: function SplitButtonComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function SplitButtonComponent_keydown_HostBindingHandler($event) { return ctx.keydown($event); })(\"keypress\", function SplitButtonComponent_keypress_HostBindingHandler($event) { return ctx.keypress($event); })(\"keyup\", function SplitButtonComponent_keyup_HostBindingHandler($event) { return ctx.keyup($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-state-focused\", ctx.isFocused)(\"k-widget\", ctx.widgetClasses)(\"k-split-button\", ctx.widgetClasses)(\"k-button-group\", ctx.widgetClasses);\n } }, inputs: { text: \"text\", icon: \"icon\", iconClass: \"iconClass\", imageUrl: \"imageUrl\", look: \"look\", tabIndex: \"tabIndex\", arrowButtonIcon: \"arrowButtonIcon\", disabled: \"disabled\", popupSettings: \"popupSettings\", data: \"data\", textField: \"textField\", buttonClass: \"buttonClass\", arrowButtonClass: \"arrowButtonClass\" }, outputs: { buttonClick: \"buttonClick\", itemClick: \"itemClick\", onFocus: \"focus\", onBlur: \"blur\", open: \"open\", close: \"close\" }, exportAs: [\"kendoSplitButton\"], features: [ɵngcc0.ɵɵProvidersFeature([\n FocusService,\n NavigationService,\n NAVIGATION_SETTINGS_PROVIDER,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.splitbutton'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature, ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c8, decls: 10, vars: 22, consts: [[\"kendoButton\", \"\", \"role\", \"listbox\", \"type\", \"button\", 3, \"look\", \"tabindex\", \"disabled\", \"icon\", \"iconClass\", \"imageUrl\", \"ngClass\", \"focus\", \"click\", \"blur\", \"mousedown\", \"mouseup\"], [\"button\", \"\"], [\"kendoButton\", \"\", \"type\", \"button\", 3, \"disabled\", \"icon\", \"look\", \"tabindex\", \"ngClass\", \"click\", \"mousedown\", \"mouseup\"], [\"arrowButton\", \"\"], [\"popupTemplate\", \"\"], [\"container\", \"\"], [3, \"id\", \"data\", \"textField\", \"itemTemplate\", \"onItemClick\", \"keydown\", \"keypress\", \"keyup\"]], template: function SplitButtonComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"button\", 0, 1);\n ɵngcc0.ɵɵlistener(\"focus\", function SplitButtonComponent_Template_button_focus_0_listener() { return ctx.onButtonFocus(); })(\"click\", function SplitButtonComponent_Template_button_click_0_listener() { return ctx.onButtonClick(); })(\"blur\", function SplitButtonComponent_Template_button_blur_0_listener() { return ctx.onButtonBlur(); })(\"mousedown\", function SplitButtonComponent_Template_button_mousedown_0_listener() { return ctx.toggleButtonActiveState(true); })(\"mouseup\", function SplitButtonComponent_Template_button_mouseup_0_listener() { return ctx.toggleButtonActiveState(false); });\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵprojection(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(4, \"button\", 2, 3);\n ɵngcc0.ɵɵlistener(\"click\", function SplitButtonComponent_Template_button_click_4_listener() { return ctx.onArrowButtonClick(); })(\"mousedown\", function SplitButtonComponent_Template_button_mousedown_4_listener() { return ctx.toggleArrowButtonActiveState(true); })(\"mouseup\", function SplitButtonComponent_Template_button_mouseup_4_listener() { return ctx.toggleArrowButtonActiveState(false); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(6, SplitButtonComponent_ng_template_6_Template, 1, 5, \"ng-template\", null, 4, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵelementContainer(8, null, 5);\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx.active);\n ɵngcc0.ɵɵproperty(\"look\", ctx.look)(\"tabindex\", ctx.componentTabIndex)(\"disabled\", ctx.disabled)(\"icon\", ctx.icon)(\"iconClass\", ctx.iconClass)(\"imageUrl\", ctx.imageUrl)(\"ngClass\", ctx.buttonClass);\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabled)(\"aria-expanded\", ctx.openState)(\"aria-haspopup\", true)(\"aria-owns\", ctx.listId)(\"aria-label\", ctx.ariaLabel);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.text, \"\");\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx.activeArrow);\n ɵngcc0.ɵɵproperty(\"disabled\", ctx.disabled)(\"icon\", ctx.arrowButtonIcon)(\"look\", ctx.look)(\"tabindex\", 0 - 1)(\"ngClass\", ctx.arrowButtonClass);\n } }, directives: [ButtonDirective, ɵngcc2.NgClass, ListComponent], encapsulation: 2 });\n/** @nocollapse */\nSplitButtonComponent.ctorParameters = () => [\n { type: FocusService },\n { type: NavigationService },\n { type: ElementRef },\n { type: NgZone },\n { type: PopupService },\n { type: ElementRef },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nSplitButtonComponent.propDecorators = {\n text: [{ type: Input }],\n icon: [{ type: Input }],\n iconClass: [{ type: Input }],\n imageUrl: [{ type: Input }],\n look: [{ type: Input }],\n disabled: [{ type: Input }],\n popupSettings: [{ type: Input }],\n tabIndex: [{ type: Input }],\n textField: [{ type: Input }],\n data: [{ type: Input }],\n buttonClass: [{ type: Input }],\n arrowButtonClass: [{ type: Input }],\n arrowButtonIcon: [{ type: Input }],\n buttonClick: [{ type: Output }],\n itemClick: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n itemTemplate: [{ type: ContentChild, args: [ButtonItemTemplateDirective,] }],\n button: [{ type: ViewChild, args: ['button', { static: true },] }],\n arrowButton: [{ type: ViewChild, args: ['arrowButton', { static: true, read: ElementRef },] }],\n popupTemplate: [{ type: ViewChild, args: ['popupTemplate', { static: true },] }],\n containerRef: [{ type: ViewChild, args: ['container', { read: ViewContainerRef, static: true },] }],\n isFocused: [{ type: HostBinding, args: ['class.k-state-focused',] }],\n widgetClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-split-button',] }, { type: HostBinding, args: ['class.k-button-group',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n keydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n keypress: [{ type: HostListener, args: ['keypress', ['$event'],] }],\n keyup: [{ type: HostListener, args: ['keyup', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitButtonComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoSplitButton',\n providers: [\n FocusService,\n NavigationService,\n NAVIGATION_SETTINGS_PROVIDER,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.splitbutton'\n }\n ],\n selector: 'kendo-splitbutton',\n template: `\n \n {{ text }}\n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: FocusService }, { type: NavigationService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc3.PopupService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { text: [{\n type: Input\n }], icon: [{\n type: Input\n }], iconClass: [{\n type: Input\n }], imageUrl: [{\n type: Input\n }], look: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], arrowButtonIcon: [{\n type: Input\n }], buttonClick: [{\n type: Output\n }], itemClick: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], disabled: [{\n type: Input\n }], popupSettings: [{\n type: Input\n }], data: [{\n type: Input\n }], isFocused: [{\n type: HostBinding,\n args: ['class.k-state-focused']\n }], widgetClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-split-button']\n }, {\n type: HostBinding,\n args: ['class.k-button-group']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], keydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], keypress: [{\n type: HostListener,\n args: ['keypress', ['$event']]\n }], keyup: [{\n type: HostListener,\n args: ['keyup', ['$event']]\n }], textField: [{\n type: Input\n }], buttonClass: [{\n type: Input\n }], arrowButtonClass: [{\n type: Input\n }], itemTemplate: [{\n type: ContentChild,\n args: [ButtonItemTemplateDirective]\n }], button: [{\n type: ViewChild,\n args: ['button', { static: true }]\n }], arrowButton: [{\n type: ViewChild,\n args: ['arrowButton', { static: true, read: ElementRef }]\n }], popupTemplate: [{\n type: ViewChild,\n args: ['popupTemplate', { static: true }]\n }], containerRef: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef, static: true }]\n }] }); })();\n\n/**\n * @hidden\n *\n * The exported package module.\n *\n * The package exports:\n * - `SplitButtonComponent`—The SplitButtonComponent component class.\n */\nclass SplitButtonModule {\n}\nSplitButtonModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SplitButtonModule });\nSplitButtonModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SplitButtonModule_Factory(t) { return new (t || SplitButtonModule)(); }, imports: [[CommonModule, PopupModule, ButtonModule, ListModule],\n ListModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SplitButtonModule, { declarations: function () { return [SplitButtonComponent]; }, imports: function () { return [CommonModule, PopupModule,\n ButtonModule,\n ListModule]; }, exports: function () { return [SplitButtonComponent,\n ListModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitButtonModule, [{\n type: NgModule,\n args: [{\n declarations: [SplitButtonComponent],\n exports: [SplitButtonComponent, ListModule],\n imports: [CommonModule, PopupModule, ButtonModule, ListModule]\n }]\n }], null, null); })();\n\n/* tslint:disable:no-access-missing-member */\nconst NAVIGATION_SETTINGS$1 = {\n useLeftRightArrows: true\n};\nconst ɵ0$1 = NAVIGATION_SETTINGS$1;\nconst NAVIGATION_SETTINGS_PROVIDER$1 = {\n provide: NAVIGATION_CONFIG,\n useValue: ɵ0$1\n};\n/**\n * Represents the Kendo UI DropDownButton component for Angular.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * User Settings\n * \n * `\n * })\n * class AppComponent {\n * public data: Array = [{\n * text: 'My Profile'\n * }, {\n * text: 'Friend Requests'\n * }, {\n * text: 'Account Settings'\n * }, {\n * text: 'Support'\n * }, {\n * text: 'Log Out'\n * }];\n * }\n * ```\n */\nclass DropDownButtonComponent extends ListButton {\n constructor(focusService, navigationService, wrapperRef, zone, popupService, elRef, localization, cdr) {\n super(focusService, navigationService, wrapperRef, zone, localization, cdr);\n this.popupService = popupService;\n this.elRef = elRef;\n /**\n * Defines the name of an existing icon in a Kendo UI theme.\n */\n this.icon = '';\n /**\n * Defines the list of CSS classes which are used for styling the Button with custom icons.\n */\n this.iconClass = '';\n /**\n * Defines a URL for styling the button with a custom image.\n */\n this.imageUrl = '';\n /**\n * Adds visual weight to the default button and makes it primary.\n */\n this.primary = false;\n /**\n * Changes the visual appearance by using alternative styling options.\n *\n * The available values are:\n * * `flat`\n * * `outline`\n */\n this.look = 'default';\n /**\n * Specifies the [`tabIndex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the component.\n */\n this.tabIndex = 0;\n /**\n * Fires each time the user clicks on a drop-down list item. The event data contains the data item bound to the clicked list item.\n */\n this.itemClick = new EventEmitter();\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event, the popup will remain closed.\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event, the popup will remain open.\n */\n this.close = new EventEmitter();\n /**\n * Fires each time the DropDownButton gets focused.\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the DropDownButton gets blurred.\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n this.listId = guid();\n this._itemClick = this.itemClick;\n this._blur = this.onBlur;\n }\n /**\n * Configures the popup of the DropDownButton.\n *\n * The available options are:\n * - `animate: Boolean`—Controls the popup animation. By default, the open and close animations are enabled.\n * - `popupClass: String`—Specifies a list of CSS classes that are used to style the popup.\n * - `appendTo: \"root\" | \"component\" | ViewContainerRef`—Specifies the component to which the popup will be appended.\n * - `align: \"left\" | \"center\" | \"right\"`—Specifies the alignment of the popup.\n */\n set popupSettings(settings) {\n this._popupSettings = Object.assign({ animate: true, popupClass: '' }, settings);\n }\n get popupSettings() {\n return this._popupSettings;\n }\n /**\n * Sets the disabled state of the DropDownButton.\n */\n set disabled(value) {\n if (value && this.openState) {\n this.openState = false;\n }\n this._disabled = value;\n }\n get disabled() {\n return this._disabled;\n }\n /**\n * Sets or gets the data of the DropDownButton.\n *\n * > The data has to be provided in an array-like list.\n */\n set data(data) {\n this._data = data || [];\n }\n get data() {\n return this._data;\n }\n /**\n * @hidden\n */\n set openState(open) {\n if (this.disabled) {\n return;\n }\n const eventArgs = new PreventableEvent();\n if (open) {\n this.open.emit(eventArgs);\n }\n else {\n this.close.emit(eventArgs);\n }\n if (eventArgs.isDefaultPrevented()) {\n return;\n }\n this._toggle(open);\n }\n /**\n * @hidden\n */\n get openState() {\n return this._open;\n }\n /**\n * @hidden\n */\n get componentTabIndex() {\n return this.disabled ? (-1) : this.tabIndex;\n }\n get appendTo() {\n const { appendTo } = this.popupSettings;\n if (!appendTo || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.container : appendTo;\n }\n get focused() {\n return this._isFocused && !this._disabled;\n }\n get widgetClasses() {\n return true;\n }\n get dir() {\n return this.direction;\n }\n /**\n * @hidden\n */\n get active() {\n return this._active;\n }\n /**\n * @hidden\n */\n keydown(event) {\n this.keyDownHandler(event);\n if (event.keyCode === Keys.Space) {\n this._active = true;\n }\n }\n /**\n * @hidden\n */\n keypress(event) {\n this.keyPressHandler(event);\n }\n /**\n * @hidden\n */\n keyup(event) {\n this.keyUpHandler(event);\n this._active = false;\n }\n /**\n * @hidden\n */\n mousedown(event) {\n if (this._disabled) {\n event.preventDefault();\n }\n this._active = true;\n }\n /**\n * @hidden\n */\n mouseup(event) {\n if (this._disabled) {\n event.preventDefault();\n }\n this._active = false;\n }\n /**\n * @hidden\n */\n openPopup() {\n this.togglePopupVisibility();\n }\n /**\n * @hidden\n */\n onButtonBlur() {\n if (!this.isOpen) {\n this.blurWrapper();\n }\n }\n /**\n * @hidden\n */\n get anchorAlign() {\n let align = { horizontal: this.popupSettings.align || 'left', vertical: 'bottom' };\n if (this.direction === 'rtl' && !isPresent(this.popupSettings.align)) {\n align.horizontal = 'right';\n }\n return align;\n }\n /**\n * @hidden\n */\n get popupAlign() {\n let align = { horizontal: this.popupSettings.align || 'left', vertical: 'top' };\n if (this.direction === 'rtl' && !isPresent(this.popupSettings.align)) {\n align.horizontal = 'right';\n }\n return align;\n }\n /**\n * Focuses the DropDownButton component.\n */\n focus() {\n if (isDocumentAvailable()) {\n this.button.nativeElement.focus();\n }\n }\n /**\n * Blurs the DropDownButton component.\n */\n blur() {\n if (isDocumentAvailable()) {\n this.button.nativeElement.blur();\n this.blurWrapper();\n }\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroyPopup();\n }\n /**\n * Toggles the visibility of the popup.\n * If the `toggle` method is used to open or close the popup, the `open` and `close` events will not be fired.\n *\n * @param open - The state of the popup.\n */\n toggle(open) {\n if (this.disabled) {\n return;\n }\n tick(() => (this._toggle((open === undefined) ? !this._open : open)));\n }\n /**\n * Returns the current open state of the popup.\n */\n get isOpen() {\n return this.openState;\n }\n /**\n * @hidden\n */\n handleFocus() {\n if (!this._disabled && !this._isFocused) {\n this._isFocused = true;\n this.onFocus.emit();\n }\n }\n /**\n * @hidden\n */\n wrapperContains(element) {\n return this.wrapper === element\n || this.wrapper.contains(element)\n || (this.popupRef && this.popupRef.popupElement.contains(element));\n }\n subscribeNavigationEvents() {\n this.navigationSubscription = this.navigationService.navigate\n .subscribe(this.onArrowKeyNavigate.bind(this));\n this.enterUpSubscription = this.navigationService.enterup.subscribe(this.onNavigationEnterUp.bind(this));\n this.openSubscription = this.navigationService.open.subscribe(this.onNavigationOpen.bind(this));\n this.closeSubscription = merge(this.navigationService.close, this.navigationService.esc).subscribe(this.onNavigationClose.bind(this));\n }\n onNavigationEnterUp() {\n if (!this._disabled && !this.openState) {\n this._active = false;\n }\n if (this.openState) {\n let focused = this.focusService.focused;\n if (isPresent(focused) && focused !== -1) {\n this.emitItemClickHandler(focused);\n }\n }\n this.togglePopupVisibility();\n if (!this.openState && isDocumentAvailable()) {\n this.button.nativeElement.focus();\n }\n }\n onNavigationOpen() {\n if (!this._disabled && !this.openState) {\n this.togglePopupVisibility();\n }\n }\n onNavigationClose() {\n if (this.openState) {\n this.togglePopupVisibility();\n if (isDocumentAvailable()) {\n this.button.nativeElement.focus();\n }\n }\n }\n onArrowKeyNavigate(index) {\n this.focusService.focus(index);\n }\n _toggle(open) {\n if (this._open === open) {\n return;\n }\n this._open = open;\n this.destroyPopup();\n if (this._open) {\n this.createPopup();\n }\n }\n createPopup() {\n this.popupRef = this.popupService.open({\n anchor: this.elRef,\n anchorAlign: this.anchorAlign,\n animate: this.popupSettings.animate,\n appendTo: this.appendTo,\n content: this.popupTemplate,\n popupAlign: this.popupAlign,\n popupClass: this.popupClasses\n });\n this.popupRef.popupAnchorViewportLeave.subscribe(() => this.openState = false);\n this.popupRef.popupOpen.subscribe(this.focusFirstItem.bind(this));\n }\n destroyPopup() {\n if (this.popupRef) {\n this.popupRef.close();\n this.popupRef = null;\n }\n }\n}\nDropDownButtonComponent.ɵfac = function DropDownButtonComponent_Factory(t) { return new (t || DropDownButtonComponent)(ɵngcc0.ɵɵdirectiveInject(FocusService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nDropDownButtonComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DropDownButtonComponent, selectors: [[\"kendo-dropdownbutton\"]], contentQueries: function DropDownButtonComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ButtonItemTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.itemTemplate = _t.first);\n } }, viewQuery: function DropDownButtonComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(_c4, true);\n ɵngcc0.ɵɵstaticViewQuery(_c9, true);\n ɵngcc0.ɵɵstaticViewQuery(_c6, true);\n ɵngcc0.ɵɵstaticViewQuery(_c7, true, ViewContainerRef);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.button = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.buttonList = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.popupTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n } }, hostVars: 7, hostBindings: function DropDownButtonComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function DropDownButtonComponent_keydown_HostBindingHandler($event) { return ctx.keydown($event); })(\"keypress\", function DropDownButtonComponent_keypress_HostBindingHandler($event) { return ctx.keypress($event); })(\"keyup\", function DropDownButtonComponent_keyup_HostBindingHandler($event) { return ctx.keyup($event); })(\"mousedown\", function DropDownButtonComponent_mousedown_HostBindingHandler($event) { return ctx.mousedown($event); })(\"mouseup\", function DropDownButtonComponent_mouseup_HostBindingHandler($event) { return ctx.mouseup($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-state-focused\", ctx.focused)(\"k-widget\", ctx.widgetClasses)(\"k-dropdown-button\", ctx.widgetClasses);\n } }, inputs: { icon: \"icon\", iconClass: \"iconClass\", imageUrl: \"imageUrl\", primary: \"primary\", look: \"look\", tabIndex: \"tabIndex\", popupSettings: \"popupSettings\", disabled: \"disabled\", data: \"data\", textField: \"textField\", buttonClass: \"buttonClass\" }, outputs: { itemClick: \"itemClick\", open: \"open\", close: \"close\", onFocus: \"focus\", onBlur: \"blur\" }, exportAs: [\"kendoDropDownButton\"], features: [ɵngcc0.ɵɵProvidersFeature([\n FocusService,\n NavigationService,\n NAVIGATION_SETTINGS_PROVIDER$1,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.dropdownbutton'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c8, decls: 7, vars: 14, consts: [[\"kendoButton\", \"\", \"role\", \"menu\", \"type\", \"button\", 3, \"tabindex\", \"disabled\", \"icon\", \"iconClass\", \"imageUrl\", \"ngClass\", \"look\", \"primary\", \"click\", \"focus\", \"blur\"], [\"button\", \"\"], [\"popupTemplate\", \"\"], [\"container\", \"\"], [3, \"id\", \"data\", \"textField\", \"itemTemplate\", \"onItemClick\", \"keydown\", \"keypress\", \"keyup\"], [\"buttonList\", \"\"]], template: function DropDownButtonComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"button\", 0, 1);\n ɵngcc0.ɵɵlistener(\"click\", function DropDownButtonComponent_Template_button_click_0_listener() { return ctx.openPopup(); })(\"focus\", function DropDownButtonComponent_Template_button_focus_0_listener() { return ctx.handleFocus(); })(\"blur\", function DropDownButtonComponent_Template_button_blur_0_listener() { return ctx.onButtonBlur(); });\n ɵngcc0.ɵɵprojection(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, DropDownButtonComponent_ng_template_3_Template, 2, 5, \"ng-template\", null, 2, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵelementContainer(5, null, 3);\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx.active);\n ɵngcc0.ɵɵproperty(\"tabindex\", ctx.componentTabIndex)(\"disabled\", ctx.disabled)(\"icon\", ctx.icon)(\"iconClass\", ctx.iconClass)(\"imageUrl\", ctx.imageUrl)(\"ngClass\", ctx.buttonClass)(\"look\", ctx.look)(\"primary\", ctx.primary);\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabled)(\"aria-expanded\", ctx.openState)(\"aria-haspopup\", true)(\"aria-owns\", ctx.listId);\n } }, directives: [ButtonDirective, ɵngcc2.NgClass, ListComponent], encapsulation: 2 });\n/** @nocollapse */\nDropDownButtonComponent.ctorParameters = () => [\n { type: FocusService },\n { type: NavigationService },\n { type: ElementRef },\n { type: NgZone },\n { type: PopupService },\n { type: ElementRef },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nDropDownButtonComponent.propDecorators = {\n icon: [{ type: Input }],\n iconClass: [{ type: Input }],\n imageUrl: [{ type: Input }],\n popupSettings: [{ type: Input }],\n textField: [{ type: Input }],\n disabled: [{ type: Input }],\n data: [{ type: Input }],\n primary: [{ type: Input }],\n look: [{ type: Input }],\n buttonClass: [{ type: Input }],\n tabIndex: [{ type: Input }],\n itemClick: [{ type: Output }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n focused: [{ type: HostBinding, args: ['class.k-state-focused',] }],\n widgetClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-dropdown-button',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n itemTemplate: [{ type: ContentChild, args: [ButtonItemTemplateDirective,] }],\n button: [{ type: ViewChild, args: ['button', { static: true },] }],\n buttonList: [{ type: ViewChild, args: ['buttonList', { static: true },] }],\n popupTemplate: [{ type: ViewChild, args: ['popupTemplate', { static: true },] }],\n container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef, static: true },] }],\n keydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n keypress: [{ type: HostListener, args: ['keypress', ['$event'],] }],\n keyup: [{ type: HostListener, args: ['keyup', ['$event'],] }],\n mousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],\n mouseup: [{ type: HostListener, args: ['mouseup', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DropDownButtonComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoDropDownButton',\n providers: [\n FocusService,\n NavigationService,\n NAVIGATION_SETTINGS_PROVIDER$1,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.dropdownbutton'\n }\n ],\n selector: 'kendo-dropdownbutton',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: FocusService }, { type: NavigationService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc3.PopupService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { icon: [{\n type: Input\n }], iconClass: [{\n type: Input\n }], imageUrl: [{\n type: Input\n }], primary: [{\n type: Input\n }], look: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], itemClick: [{\n type: Output\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], popupSettings: [{\n type: Input\n }], disabled: [{\n type: Input\n }], data: [{\n type: Input\n }], focused: [{\n type: HostBinding,\n args: ['class.k-state-focused']\n }], widgetClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-dropdown-button']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], keydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], keypress: [{\n type: HostListener,\n args: ['keypress', ['$event']]\n }], keyup: [{\n type: HostListener,\n args: ['keyup', ['$event']]\n }], mousedown: [{\n type: HostListener,\n args: ['mousedown', ['$event']]\n }], mouseup: [{\n type: HostListener,\n args: ['mouseup', ['$event']]\n }], textField: [{\n type: Input\n }], buttonClass: [{\n type: Input\n }], itemTemplate: [{\n type: ContentChild,\n args: [ButtonItemTemplateDirective]\n }], button: [{\n type: ViewChild,\n args: ['button', { static: true }]\n }], buttonList: [{\n type: ViewChild,\n args: ['buttonList', { static: true }]\n }], popupTemplate: [{\n type: ViewChild,\n args: ['popupTemplate', { static: true }]\n }], container: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef, static: true }]\n }] }); })();\n\n/**\n * @hidden\n *\n * The exported package module.\n *\n * The package exports:\n * - `DropDownButtonComponent`—The DropDownButtonComponent component class.\n */\nclass DropDownButtonModule {\n}\nDropDownButtonModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DropDownButtonModule });\nDropDownButtonModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DropDownButtonModule_Factory(t) { return new (t || DropDownButtonModule)(); }, imports: [[CommonModule, PopupModule, ListModule, ButtonModule],\n ListModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DropDownButtonModule, { declarations: function () { return [DropDownButtonComponent]; }, imports: function () { return [CommonModule, PopupModule,\n ListModule,\n ButtonModule]; }, exports: function () { return [DropDownButtonComponent,\n ListModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DropDownButtonModule, [{\n type: NgModule,\n args: [{\n declarations: [DropDownButtonComponent],\n exports: [DropDownButtonComponent, ListModule],\n imports: [CommonModule, PopupModule, ListModule, ButtonModule]\n }]\n }], null, null); })();\n\n/**\n * Displays a Chip that represents an input, attribute or an action.\n */\nclass ChipComponent {\n constructor(element, renderer, ngZone, localizationService) {\n this.element = element;\n this.renderer = renderer;\n this.ngZone = ngZone;\n this.localizationService = localizationService;\n /**\n * Changes the visual appearance by using alternative styling options.\n *\n * The available values are:\n * * `filled`\n * * `outlined`\n */\n this.look = 'filled';\n /**\n * Specifies the selected state of the Chip.\n */\n this.selected = false;\n /**\n * Specifies if the Chip will be removable or not.\n * If the property is set to `true`, the Chip renders a remove icon.\n */\n this.removable = false;\n /**\n * Specifies the Chip type.\n *\n * The possible values are:\n * - `none` (default)\n * - `success`\n * - `error`\n * - `warning`\n * - `info`\n */\n this.type = 'none';\n /**\n * If set to `true`, the Chip will be disabled.\n */\n this.disabled = false;\n /**\n * Fires each time the user clicks the remove icon of the Chip.\n */\n this.remove = new EventEmitter();\n this.tabIndex = 0;\n this.hostClass = true;\n this.focused = false;\n this.direction = localizationService.rtl ? 'rtl' : 'ltr';\n }\n get outlineClass() {\n return this.look === 'outlined';\n }\n get filledClass() {\n return this.look === 'filled';\n }\n get hasIconClass() {\n return this.icon || this.iconClass ? true : false;\n }\n get disabledClass() {\n return this.disabled;\n }\n get selectedClass() {\n return this.selected;\n }\n get focusedClass() {\n return this.focused;\n }\n ngOnInit() {\n this.dynamicRTLSubscription = this.localizationService.changes\n .subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n if (this.detachDomEvents) {\n this.detachDomEvents();\n }\n }\n ngAfterViewInit() {\n const chip = this.element.nativeElement;\n const typeClass = this.typeClass();\n if (this.type !== 'none') {\n this.renderer.addClass(chip, typeClass);\n }\n this.attachElementEventHandlers(chip);\n }\n /**\n * @hidden\n */\n get iconClasses() {\n if (this.icon) {\n return `k-icon k-i-${this.icon}`;\n }\n if (this.iconClass) {\n return `${this.iconClass}`;\n }\n }\n /**\n * @hidden\n */\n get selectedIconClasses() {\n if (this.selectedIcon) {\n return `${this.selectedIcon}`;\n }\n return `k-icon k-i-check`;\n }\n /**\n * @hidden\n */\n get removeIconClasses() {\n if (this.removeIcon) {\n return `${this.removeIcon}`;\n }\n return `k-icon k-i-close-circle`;\n }\n /**\n * @hidden\n */\n typeClass() {\n return {\n 'none': '',\n 'success': 'k-chip-success',\n 'warning': 'k-chip-warning',\n 'error': 'k-chip-error',\n 'info': 'k-chip-info'\n }[this.type];\n }\n /**\n * Focuses the Chip component.\n */\n focus() {\n if (isDocumentAvailable()) {\n this.element.nativeElement.focus();\n }\n }\n /**\n * Blurs the Chip component.\n */\n blur() {\n if (isDocumentAvailable()) {\n this.element.nativeElement.blur();\n }\n }\n /**\n * @hidden\n */\n onRemoveClick(e) {\n if (this.removable) {\n this.remove.emit({ sender: this, originalEvent: e });\n }\n }\n attachElementEventHandlers(chip) {\n this.ngZone.runOutsideAngular(() => {\n const focusListener = this.renderer.listen(chip, 'focus', () => {\n this.renderer.addClass(chip, 'k-chip-focused');\n });\n const blurListener = this.renderer.listen(chip, 'blur', () => {\n this.renderer.removeClass(chip, 'k-chip-focused');\n });\n this.detachDomEvents = () => {\n focusListener();\n blurListener();\n };\n });\n }\n}\nChipComponent.ɵfac = function ChipComponent_Factory(t) { return new (t || ChipComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nChipComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ChipComponent, selectors: [[\"kendo-chip\"]], hostVars: 16, hostBindings: function ChipComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.tabIndex)(\"dir\", ctx.direction);\n ɵngcc0.ɵɵclassProp(\"k-chip\", ctx.hostClass)(\"k-chip-outline\", ctx.outlineClass)(\"k-chip-filled\", ctx.filledClass)(\"k-chip-has-icon\", ctx.hasIconClass)(\"k-chip-disabled\", ctx.disabledClass)(\"k-chip-selected\", ctx.selectedClass)(\"k-chip-focused\", ctx.focusedClass);\n } }, inputs: { look: \"look\", selected: \"selected\", removable: \"removable\", type: \"type\", disabled: \"disabled\", label: \"label\", icon: \"icon\", iconClass: \"iconClass\", selectedIcon: \"selectedIcon\", removeIcon: \"removeIcon\" }, outputs: { remove: \"remove\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chip'\n }\n ])], ngContentSelectors: _c8, decls: 7, vars: 5, consts: [[1, \"k-selected-icon-wrapper\"], [\"class\", \"k-selected-icon\", 3, \"ngClass\", 4, \"ngIf\"], [\"class\", \"k-chip-icon\", 3, \"ngClass\", 4, \"ngIf\"], [1, \"k-chip-content\"], [\"class\", \"k-chip-label\", 4, \"ngIf\"], [4, \"ngIf\"], [\"class\", \"k-remove-icon\", 3, \"click\", 4, \"ngIf\"], [1, \"k-selected-icon\", 3, \"ngClass\"], [1, \"k-chip-icon\", 3, \"ngClass\"], [1, \"k-chip-label\"], [1, \"k-remove-icon\", 3, \"click\"], [3, \"ngClass\"]], template: function ChipComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"span\", 0);\n ɵngcc0.ɵɵtemplate(1, ChipComponent_span_1_Template, 1, 1, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(2, ChipComponent_span_2_Template, 1, 1, \"span\", 2);\n ɵngcc0.ɵɵelementStart(3, \"span\", 3);\n ɵngcc0.ɵɵtemplate(4, ChipComponent_span_4_Template, 2, 1, \"span\", 4);\n ɵngcc0.ɵɵtemplate(5, ChipComponent_5_Template, 1, 0, undefined, 5);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(6, ChipComponent_span_6_Template, 2, 1, \"span\", 6);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.selected);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.icon || ctx.iconClass);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.label);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.label);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.removable);\n } }, directives: [ɵngcc2.NgIf, ɵngcc2.NgClass], encapsulation: 2 });\n/** @nocollapse */\nChipComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone },\n { type: LocalizationService }\n];\nChipComponent.propDecorators = {\n look: [{ type: Input }],\n label: [{ type: Input }],\n icon: [{ type: Input }],\n iconClass: [{ type: Input }],\n selected: [{ type: Input }],\n selectedIcon: [{ type: Input }],\n removable: [{ type: Input }],\n removeIcon: [{ type: Input }],\n type: [{ type: Input }],\n disabled: [{ type: Input }],\n remove: [{ type: Output }],\n tabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],\n hostClass: [{ type: HostBinding, args: ['class.k-chip',] }],\n outlineClass: [{ type: HostBinding, args: ['class.k-chip-outline',] }],\n filledClass: [{ type: HostBinding, args: ['class.k-chip-filled',] }],\n hasIconClass: [{ type: HostBinding, args: ['class.k-chip-has-icon',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-chip-disabled',] }],\n selectedClass: [{ type: HostBinding, args: ['class.k-chip-selected',] }],\n focusedClass: [{ type: HostBinding, args: ['class.k-chip-focused',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ChipComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-chip',\n template: `\n \n \n \n \n\n \n \n\n \n \n {{ label }}\n \n \n \n\n \n \n \n `,\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chip'\n }\n ]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }, { type: ɵngcc1.LocalizationService }]; }, { look: [{\n type: Input\n }], selected: [{\n type: Input\n }], removable: [{\n type: Input\n }], type: [{\n type: Input\n }], disabled: [{\n type: Input\n }], remove: [{\n type: Output\n }], tabIndex: [{\n type: HostBinding,\n args: ['attr.tabindex']\n }], hostClass: [{\n type: HostBinding,\n args: ['class.k-chip']\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], outlineClass: [{\n type: HostBinding,\n args: ['class.k-chip-outline']\n }], filledClass: [{\n type: HostBinding,\n args: ['class.k-chip-filled']\n }], hasIconClass: [{\n type: HostBinding,\n args: ['class.k-chip-has-icon']\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-chip-disabled']\n }], selectedClass: [{\n type: HostBinding,\n args: ['class.k-chip-selected']\n }], focusedClass: [{\n type: HostBinding,\n args: ['class.k-chip-focused']\n }], label: [{\n type: Input\n }], icon: [{\n type: Input\n }], iconClass: [{\n type: Input\n }], selectedIcon: [{\n type: Input\n }], removeIcon: [{\n type: Input\n }] }); })();\n\nclass ChipListComponent {\n constructor(localizationService) {\n this.localizationService = localizationService;\n this.hostClass = true;\n /**\n * Sets the selection mode of the ChipList.\n *\n * The available values are:\n * * `none` (default)\n * * `single`\n * * `multiple`\n */\n this.selection = 'none';\n /**\n * Fires each time when the ChipList selection is changed.\n */\n this.selectedChange = new EventEmitter();\n /**\n * Fires each time the user clicks on the remove icon of the Chip.\n */\n this.remove = new EventEmitter();\n this.direction = localizationService.rtl ? 'rtl' : 'ltr';\n }\n get single() {\n return this.selection === 'single';\n }\n get multiple() {\n return this.selection === 'multiple';\n }\n /**\n * @hidden\n */\n onClick($event) {\n const target = $event.target;\n const isRemoveClicked = closest(target, '.k-remove-icon');\n const clickedChip = closest(target, '.k-chip');\n const chip = this.chips.find((chip) => clickedChip === chip.element.nativeElement);\n if (isRemoveClicked && clickedChip) {\n const removeEventArgs = { sender: this, originalEvent: $event, removedChip: chip };\n this.remove.emit(removeEventArgs);\n }\n if (this.selection !== 'none' && clickedChip && !isRemoveClicked) {\n this.setSelection(chip);\n }\n }\n ngOnInit() {\n this.dynamicRTLSubscription = this.localizationService.changes\n .subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n selectedChips() {\n return this.chips.reduce((acc, cur, idx) => { return cur.selected ? acc.concat(idx) : acc; }, []);\n }\n /**\n * Updates the selection on click of a Chip. Emits events.\n */\n setSelection(chip) {\n if (this.selection === 'single') {\n this.clearSelection(chip);\n }\n chip.selected = !chip.selected;\n this.selectedChange.emit(this.selectedChips());\n }\n clearSelection(chip) {\n this.chips.forEach((c) => {\n if (chip !== c) {\n c.selected = false;\n }\n });\n }\n}\nChipListComponent.ɵfac = function ChipListComponent_Factory(t) { return new (t || ChipListComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nChipListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ChipListComponent, selectors: [[\"kendo-chip-list\"]], contentQueries: function ChipListComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ChipComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.chips = _t);\n } }, hostVars: 7, hostBindings: function ChipListComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function ChipListComponent_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵclassProp(\"k-chip-list\", ctx.hostClass)(\"k-selection-single\", ctx.single)(\"k-selection-multiple\", ctx.multiple);\n } }, inputs: { selection: \"selection\" }, outputs: { selectedChange: \"selectedChange\", remove: \"remove\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chip-list'\n }\n ])], ngContentSelectors: _c8, decls: 1, vars: 0, template: function ChipListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\n/** @nocollapse */\nChipListComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nChipListComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-chip-list',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n selection: [{ type: Input }],\n selectedChange: [{ type: Output }],\n remove: [{ type: Output }],\n chips: [{ type: ContentChildren, args: [ChipComponent,] }],\n single: [{ type: HostBinding, args: ['class.k-selection-single',] }],\n multiple: [{ type: HostBinding, args: ['class.k-selection-multiple',] }],\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ChipListComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-chip-list',\n template: `\n \n `,\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chip-list'\n }\n ]\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-chip-list']\n }], selection: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], remove: [{\n type: Output\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], single: [{\n type: HostBinding,\n args: ['class.k-selection-single']\n }], multiple: [{\n type: HostBinding,\n args: ['class.k-selection-multiple']\n }], onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], chips: [{\n type: ContentChildren,\n args: [ChipComponent]\n }] }); })();\n\nconst exportedModules = [\n ChipComponent,\n ChipListComponent\n];\nconst declarations = [\n ...exportedModules\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Chip and ChipList components.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Chip module\n * import { ChipModule } from '@progress/kendo-angular-buttons';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, ChipModule], // import Chip module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * ```\n */\nclass ChipModule {\n}\nChipModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ChipModule });\nChipModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ChipModule_Factory(t) { return new (t || ChipModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ChipModule, { declarations: function () { return [ChipComponent,\n ChipListComponent]; }, imports: function () { return [CommonModule]; }, exports: function () { return [ChipComponent,\n ChipListComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ChipModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations],\n exports: [exportedModules],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmodules'] }})\n * definition for the Buttons components.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Buttons module\n * import { ButtonsModule } from '@progress/kendo-angular-buttons';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, ButtonsModule], // import Buttons module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass ButtonsModule {\n}\nButtonsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ButtonsModule });\nButtonsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ButtonsModule_Factory(t) { return new (t || ButtonsModule)(); }, imports: [ButtonGroupModule,\n ButtonModule,\n SplitButtonModule,\n DropDownButtonModule,\n ChipModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ButtonsModule, { exports: [ButtonGroupModule,\n ButtonModule,\n SplitButtonModule,\n DropDownButtonModule,\n ChipModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ButtonsModule, [{\n type: NgModule,\n args: [{\n exports: [ButtonGroupModule, ButtonModule, SplitButtonModule, DropDownButtonModule, ChipModule]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { KendoButtonService, FocusService, FocusableDirective, ButtonItemTemplateDirective, ListButton, ListComponent, ListModule, TemplateContextDirective, NAVIGATION_CONFIG, NavigationService, ButtonDirective, ButtonDirective as Button, ButtonGroupComponent, ButtonGroupComponent as ButtonGroup, ButtonGroupModule, ButtonModule, ButtonsModule, SplitButtonComponent, SplitButtonComponent as SplitButton, SplitButtonModule, DropDownButtonComponent, DropDownButtonComponent as DropDownButton, DropDownButtonModule, ChipComponent, ChipListComponent, ChipModule };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs0Q0FhRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQWlCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OzBCQU1FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VNQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OEpBcUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozt1Q0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VMQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7bUhBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJGQXlFRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyRkF3REU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dFQXlDRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQWVFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OzswQkFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4qIENvcHlyaWdodCDCqSAyMDIwIFByb2dyZXNzIFNvZnR3YXJlIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKiBMaWNlbnNlZCB1bmRlciBjb21tZXJjaWFsIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLm1kIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9wdGlvbmFsLCBOZ1pvbmUsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIGlzRGV2TW9kZSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIE5nTW9kdWxlLCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbnRlbnRDaGlsZCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIGZyb21FdmVudCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEtleXMsIGlzQ2hhbmdlZCwgaXNEb2N1bWVudEF2YWlsYWJsZSwgaGFzT2JzZXJ2ZXJzLCBndWlkIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UsIEwxME5fUFJFRklYIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUG9wdXBTZXJ2aWNlLCBQb3B1cE1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXBvcHVwJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEtlbmRvQnV0dG9uU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uTG9va0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoJ2RlZmF1bHQnKTtcbiAgICAgICAgdGhpcy5idXR0b25DbGlja2VkID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5idXR0b25DbGlja2VkJCA9IHRoaXMuYnV0dG9uQ2xpY2tlZC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgY2xpY2soYnV0dG9uKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uQ2xpY2tlZC5uZXh0KGJ1dHRvbik7XG4gICAgfVxuICAgIHNldEJ1dHRvbkxvb2sobG9vaykge1xuICAgICAgICB0aGlzLmJ1dHRvbkxvb2tDaGFuZ2UubmV4dChsb29rKTtcbiAgICB9XG59XG5LZW5kb0J1dHRvblNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbmNvbnN0IFNQQU5fVEFHX05BTUUgPSAnU1BBTic7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIEtlbmRvIFVJIEJ1dHRvbiBjb21wb25lbnQgZm9yIEFuZ3VsYXIuXG4gKi9cbmNsYXNzIEJ1dHRvbkRpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgcmVuZGVyZXIsIHNlcnZpY2UsIGxvY2FsaXphdGlvbiwgbmdab25lKSB7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICAvKipcbiAgICAgICAgICogUHJvdmlkZXMgdmlzdWFsIHN0eWxpbmcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIEJ1dHRvbiBpcyBhY3RpdmUuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGB0b2dnbGVhYmxlYCBpcyBzZXQgdG8gYGZhbHNlYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9nZ2xlYWJsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyB2aXN1YWwgd2VpZ2h0IHRvIHRoZSBCdXR0b24gYW5kIG1ha2VzIGl0IHByaW1hcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnByaW1hcnkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoYW5nZXMgdGhlIHZpc3VhbCBhcHBlYXJhbmNlIGJ5IHVzaW5nIGFsdGVybmF0aXZlIHN0eWxpbmcgb3B0aW9uc1xuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzXSh7JSBzbHVnIGFwcGVhcmFuY2VfYnV0dG9uICV9KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBhdmFpbGFibGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBbYEJ1dHRvbkxvb2tgXSh7JSBzbHVnIGFwaV9idXR0b25zX2J1dHRvbmxvb2sgJX0pID0gYGZsYXRgIHwgYG91dGxpbmVgXG4gICAgICAgICAqICogYGNsZWFyYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb29rID0gJ2RlZmF1bHQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yb2xlID0gJ2J1dHRvbic7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHNlbGVjdGVkIHN0YXRlIG9mIGEgdG9nZ2xlYWJsZSBidXR0b24gaXMgY2hhbmdlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGV2ZW50IGFyZ3VtZW50IGlzIHRoZSBuZXcgc2VsZWN0ZWQgc3RhdGUgKGJvb2xlYW4pLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzSWNvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzSWNvbkNsYXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBsb2NhbGl6YXRpb24ucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSBsb2NhbGl6YXRpb24uY2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBydGwgfSkgPT4gdGhpcy5kaXJlY3Rpb24gPSBydGwgPyAncnRsJyA6ICdsdHInKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJhY2t3YXJkcy1jb21wYXRpYmxlIGFsaWFzXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHRvZ2dsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCB0b2dnbGFibGUodmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2dnbGVhYmxlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdGVkIHN0YXRlIG9mIHRoZSBCdXR0b24uXG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIHNldCBzZWxlY3RlZCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IHRhYkluZGV4KGluZGV4KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC50YWJJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFiSW5kZXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIG5hbWUgZm9yIGFuIGV4aXN0aW5nIGljb24gaW4gYSBLZW5kbyBVSSB0aGVtZS5cbiAgICAgKiBUaGUgaWNvbiBpcyByZW5kZXJlZCBpbnNpZGUgdGhlIEJ1dHRvbiBieSBhIGBzcGFuLmstaWNvbmAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzZXQgaWNvbihpY29uKSB7XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICB0aGlzLmljb25TZXR0ZXIoaWNvbiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNJY29uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc2VzID0gJ2staWNvbiBrLWktJyArIGljb247XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJY29uKGNsYXNzZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSWNvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uTm9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBDU1MgY2xhc3MmbWRhc2g7b3IgbXVsdGlwbGUgY2xhc3NlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzJm1kYXNoO1xuICAgICAqIHdoaWNoIGFyZSBhcHBsaWVkIHRvIGEgYHNwYW5gIGVsZW1lbnQgaW5zaWRlIHRoZSBCdXR0b24uIEFsbG93cyB0aGUgdXNhZ2Ugb2YgY3VzdG9tIGljb25zLlxuICAgICAqL1xuICAgIHNldCBpY29uQ2xhc3MoaWNvbkNsYXNzTmFtZSkge1xuICAgICAgICBpZiAoaWNvbkNsYXNzTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5pY29uU2V0dGVyKGljb25DbGFzc05hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzSWNvbkNsYXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEljb24oaWNvbkNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNJY29uQ2xhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbk5vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgVVJMIHdoaWNoIGlzIHVzZWQgZm9yIGFuIGBpbWdgIGVsZW1lbnQgaW5zaWRlIHRoZSBCdXR0b24uXG4gICAgICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHJlbGF0aXZlLCBpdCBpcyBldmFsdWF0ZWQgd2l0aCByZWxhdGlvbiB0byB0aGUgd2ViIHBhZ2UgVVJMLlxuICAgICAqL1xuICAgIHNldCBpbWFnZVVybChpbWFnZVVybCkge1xuICAgICAgICBpZiAoaW1hZ2VVcmwpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvblNldHRlcihpbWFnZVVybCwgdGhpcy5hZGRJbWdJY29uLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVJbWFnZU5vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYHRydWVgLCBpdCBkaXNhYmxlcyB0aGUgQnV0dG9uLlxuICAgICAqL1xuICAgIHNldCBkaXNhYmxlZChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnQsICdkaXNhYmxlZCcsIGRpc2FibGVkKTtcbiAgICB9XG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgaXNGb2N1c2VkKGlzRm9jdXNlZCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdrLXN0YXRlLWZvY3VzZWQnLCBpc0ZvY3VzZWQpO1xuICAgICAgICB0aGlzLl9mb2N1c2VkID0gaXNGb2N1c2VkO1xuICAgIH1cbiAgICBnZXQgaXNGb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZDtcbiAgICB9XG4gICAgZ2V0IGNsYXNzQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzUHJpbWFyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeTtcbiAgICB9XG4gICAgZ2V0IGlzRmxhdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9vayA9PT0gJ2ZsYXQnO1xuICAgIH1cbiAgICBnZXQgaXNCYXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rID09PSAnYmFyZSc7XG4gICAgfVxuICAgIGdldCBpc091dGxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2sgPT09ICdvdXRsaW5lJztcbiAgICB9XG4gICAgZ2V0IGlzQ2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2sgPT09ICdjbGVhcic7XG4gICAgfVxuICAgIGdldCByb2xlU2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlO1xuICAgIH1cbiAgICBnZXQgY2xhc3NEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IGNsYXNzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZDtcbiAgICB9XG4gICAgZ2V0IGdldERpcmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc3QgaXNTcGFuID0gdGhpcy5lbGVtZW50LnRhZ05hbWUgPT09IFNQQU5fVEFHX05BTUU7XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uTG9va0NoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuc2VydmljZS5idXR0b25Mb29rQ2hhbmdlXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChsb29rKSA9PiBsb29rICE9PSAnZGVmYXVsdCcpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxvb2spID0+IHRoaXMubG9vayA9IGxvb2spO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lmhhc0F0dHJpYnV0ZSgncm9sZScpICYmIHRoaXMudG9nZ2xhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUFyaWFQcmVzc2VkKHRoaXMudG9nZ2xlYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm9sZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCB0aGlzLnJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9tRXZlbnRzLnB1c2godGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50LCAnY2xpY2snLCB0aGlzLl9vbkJ1dHRvbkNsaWNrLmJpbmQodGhpcykpKTtcbiAgICAgICAgICAgIHRoaXMuZG9tRXZlbnRzLnB1c2godGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50LCAna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1NwYW4gJiYgKGV2ZW50LmtleUNvZGUgPT09IEtleXMuU3BhY2UgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5FbnRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25CdXR0b25DbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZSkge1xuICAgICAgICBpZiAoaXNDaGFuZ2VkKCd0b2dnbGFibGUnLCBjaGFuZ2UpIHx8IGlzQ2hhbmdlZCgndG9nZ2xlYWJsZScsIGNoYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQXJpYVByZXNzZWQodGhpcy50b2dnbGVhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuc2V0SWNvblRleHRDbGFzc2VzKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmltYWdlTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaWNvbk5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZSAmJiB0aGlzLmJ1dHRvbkxvb2tDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uTG9va0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlZmVyVGltZW91dCk7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLmZvckVhY2godW5iaW5kSGFuZGxlciA9PiB1bmJpbmRIYW5kbGVyKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBCdXR0b24gY29tcG9uZW50LlxuICAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgQnV0dG9uIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5lbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5lbGVtZW50LCBhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbCBzZXR0ZXIgdGhhdCB0cmlnZ2VycyBzZWxlY3RlZENoYW5nZVxuICAgICAqL1xuICAgIHNldFNlbGVjdGVkKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLnNlbGVjdGVkICE9PSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgdGhpcy5zZWxlY3RlZC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnay1zdGF0ZS1hY3RpdmUnLCB0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKGNoYW5nZWQgJiYgaGFzT2JzZXJ2ZXJzKHRoaXMuc2VsZWN0ZWRDaGFuZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b2dnbGVBcmlhUHJlc3NlZChzaG91bGRTZXQpIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkU2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgdGhpcy5zZWxlY3RlZC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNUZXh0KCkge1xuICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMuZWxlbWVudC50ZXh0Q29udGVudCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkSW1nSWNvbihpbWFnZVVybCkge1xuICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgICBpZiAodGhpcy5pbWFnZU5vZGUpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW1hZ2VOb2RlLCAnc3JjJywgaW1hZ2VVcmwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZU5vZGUgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW1hZ2VOb2RlLCAnc3JjJywgaW1hZ2VVcmwpO1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbWFnZU5vZGUsICdjbGFzc05hbWUnLCAnay1pbWFnZScpO1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuaW1hZ2VOb2RlLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMucHJlcGVuZENoaWxkKHRoaXMuaW1hZ2VOb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRJY29uKGNsYXNzTmFtZXMpIHtcbiAgICAgICAgbGV0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgICAgaWYgKHRoaXMuaWNvbk5vZGUpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaWNvbk5vZGUsICdjbGFzc05hbWUnLCBjbGFzc05hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbk5vZGUgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmljb25Ob2RlLCAnY2xhc3NOYW1lJywgY2xhc3NOYW1lcyk7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5pY29uTm9kZSwgJ3JvbGUnLCAncHJlc2VudGF0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLnByZXBlbmRDaGlsZCh0aGlzLmljb25Ob2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcmVwZW5kQ2hpbGQobm9kZSkge1xuICAgICAgICB0aGlzLmRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyICYmIG5vZGUgIT09IHRoaXMuZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBub2RlLCB0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZlcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlZmVyVGltZW91dCA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWNvblNldHRlcihpY29uLCBpbnNlcnRJY29uKSB7XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICBpbnNlcnRJY29uKGljb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SWNvblRleHRDbGFzc2VzKCk7XG4gICAgfVxuICAgIHJlbW92ZUltYWdlTm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOb2RlICYmIHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmltYWdlTm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50LCB0aGlzLmltYWdlTm9kZSk7XG4gICAgICAgICAgICB0aGlzLmltYWdlTm9kZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlSWNvbk5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmljb25Ob2RlICYmIHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmljb25Ob2RlKSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQsIHRoaXMuaWNvbk5vZGUpO1xuICAgICAgICAgICAgdGhpcy5pY29uTm9kZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlSWNvbk5vZGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ljb24gJiYgIXRoaXMuaXNJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSWNvbk5vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRJY29uVGV4dENsYXNzZXMoKSB7XG4gICAgICAgIGNvbnN0IGhhc0ljb24gPSB0aGlzLmlzSWNvbiB8fCB0aGlzLmlzSWNvbkNsYXNzIHx8IHRoaXMuaW1hZ2VOb2RlO1xuICAgICAgICBjb25zdCBoYXNUZXh0ID0gdGhpcy5oYXNUZXh0KCk7XG4gICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2stYnV0dG9uLWljb24nLCBoYXNJY29uICYmICFoYXNUZXh0KTtcbiAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnay1idXR0b24taWNvbnRleHQnLCBoYXNJY29uICYmIGhhc1RleHQpO1xuICAgIH1cbiAgICB0b2dnbGVDbGFzcyhjbGFzc05hbWUsIGFkZCkge1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9vbkJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5zZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5jbGljayh0aGlzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRvZ2dsYWJsZSAmJiAhdGhpcy5zZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkKCF0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkJ1dHRvbkRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9CdXR0b24nLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2J1dHRvbltrZW5kb0J1dHRvbl0sIHNwYW5ba2VuZG9CdXR0b25dJyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJ1dHRvbkRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogS2VuZG9CdXR0b25TZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5CdXR0b25EaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdG9nZ2xlYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9nZ2xhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwcmltYXJ5OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb29rOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGFiSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW1hZ2VVcmw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByb2xlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RlZENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2xhc3NCdXR0b246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYnV0dG9uJyxdIH1dLFxuICAgIGNsYXNzUHJpbWFyeTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1wcmltYXJ5JyxdIH1dLFxuICAgIGlzRmxhdDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1mbGF0JyxdIH1dLFxuICAgIGlzQmFyZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1iYXJlJyxdIH1dLFxuICAgIGlzT3V0bGluZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1vdXRsaW5lJyxdIH1dLFxuICAgIGlzQ2xlYXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYnV0dG9uLWNsZWFyJyxdIH1dLFxuICAgIHJvbGVTZXR0ZXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIucm9sZScsXSB9XSxcbiAgICBjbGFzc0Rpc2FibGVkOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmFyaWEtZGlzYWJsZWQnLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0YXRlLWRpc2FibGVkJyxdIH1dLFxuICAgIGNsYXNzQWN0aXZlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0YXRlLWFjdGl2ZScsXSB9XSxcbiAgICBnZXREaXJlY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIG9uRm9jdXM6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydmb2N1cycsXSB9XSxcbiAgICBvbkJsdXI6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydibHVyJyxdIH1dXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby1udWxsLWtleXdvcmQgKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgKi9cbmNvbnN0IHJlc29sdmVkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1ByZXNlbnQgPSAodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdGljayA9IChmKSA9PiAocmVzb2x2ZWRQcm9taXNlLnRoZW4oZikpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGlzRG9jdW1lbnROb2RlKGNvbnRhaW5lcikge1xuICAgIHJldHVybiBjb250YWluZXIubm9kZVR5cGUgPT09IDk7XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGlmIChlbGVtZW50LmNsb3Nlc3QpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID9cbiAgICAgICAgKGVsLCBzZWwpID0+IGVsLm1hdGNoZXMoc2VsKVxuICAgICAgICA6IChlbCwgc2VsKSA9PiBlbC5tc01hdGNoZXNTZWxlY3RvcihzZWwpO1xuICAgIGxldCBub2RlID0gZWxlbWVudDtcbiAgICB3aGlsZSAobm9kZSAmJiAhaXNEb2N1bWVudE5vZGUobm9kZSkpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMobm9kZSwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFByZXZlbnRhYmxlRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByZXZlbnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGEgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEluIHRoaXMgd2F5LCB0aGUgc291cmNlIGNvbXBvbmVudCBzdXBwcmVzc2VzIHRoZSBidWlsdC1pbiBiZWhhdmlvciB0aGF0IGZvbGxvd3MgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLnByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBldmVudCBpcyBwcmV2ZW50ZWQgYnkgYW55IG9mIGl0cyBzdWJzY3JpYmVycywgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRlZmF1bHQgYWN0aW9uIHdhcyBwcmV2ZW50ZWQuIE90aGVyd2lzZSwgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqL1xuICAgIGlzRGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudGVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHRhYmluZGV4ID0gJ3RhYmluZGV4Jztcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgS2VuZG8gVUkgQnV0dG9uR3JvdXAgY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICovXG5jbGFzcyBCdXR0b25Hcm91cENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSwgbG9jYWxpemF0aW9uLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgc2VsZWN0aW9uIG1vZGUgb2YgdGhlIEJ1dHRvbkdyb3VwIGlzIHNldCB0byBgbXVsdGlwbGVgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSAnbXVsdGlwbGUnO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hhbmdlcyB0aGUgdmlzdWFsIGFwcGVhcmFuY2UgYnkgdXNpbmcgYWx0ZXJuYXRpdmUgc3R5bGluZyBvcHRpb25zXG4gICAgICAgICAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXNdKHslIHNsdWcgc3R5bGluZ19idXR0b25ncm91cCAlfSkpLlxuICAgICAgICAgKiBUaGUgYGxvb2tgIHByb3BlcnR5IG9mIHRoZSBCdXR0b25Hcm91cCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGBsb29rYCBwcm9wZXJ0eVxuICAgICAgICAgKiBvZiB0aGUgaW5kaXZpZHVhbCBidXR0b25zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYXZhaWxhYmxlIHZhbHVlcyBhcmU6XG4gICAgICAgICAqICogYGZsYXRgXG4gICAgICAgICAqICogYG91dGxpbmVgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvb2sgPSAnZGVmYXVsdCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBldmVyeSB0aW1lIGtleWJvYXJkIG5hdmlnYXRpb24gb2NjdXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gbG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIFtgdGFiSW5kZXhgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL3RhYmluZGV4KSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHNldCB0YWJJbmRleCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWJJbmRleCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJJbmRleDtcbiAgICB9XG4gICAgZ2V0IHdyYXBwZXJDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IHN0cmV0Y2hlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLndpZHRoO1xuICAgIH1cbiAgICBnZXQgaXNGbGF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rID09PSAnZmxhdCc7XG4gICAgfVxuICAgIGdldCBpc0JhcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2sgPT09ICdiYXJlJztcbiAgICB9XG4gICAgZ2V0IGlzT3V0bGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9vayA9PT0gJ291dGxpbmUnO1xuICAgIH1cbiAgICBnZXQgZ2V0Um9sZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3Rpb25TaW5nbGUoKSA/ICdyYWRpb2dyb3VwJyA6ICdncm91cCc7XG4gICAgfVxuICAgIGdldCBkaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZ2V0IGFyaWFEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuICAgIGdldCB3cmFwcGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuICAgIH1cbiAgICBnZXQgd3JhcHBlclRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IHVuZGVmaW5lZCA6IHRoaXMuY3VycmVudFRhYkluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAga2V5ZG93bihldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVGb2N1cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRhYkluZGV4ID0gLTE7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRJbmRleCA9IHRoaXMuYnV0dG9ucy50b0FycmF5KCkuZmluZEluZGV4KGN1cnJlbnQgPT4gY3VycmVudC5lbGVtZW50LnRhYkluZGV4ICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZm9jdXNlZEluZGV4ID09PSAtMSA/IDAgOiBmb2N1c2VkSW5kZXg7XG4gICAgICAgIHRoaXMuZm9jdXModGhpcy5idXR0b25zLmZpbHRlcigoX2N1cnJlbnQsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpID09PSBpbmRleDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZm9jdXNvdXQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQucmVsYXRlZFRhcmdldC5wYXJlbnROb2RlICE9PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5kZWZvY3VzKHRoaXMuYnV0dG9ucy50b0FycmF5KCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiSW5kZXggPSB0aGlzLnRhYkluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0QnV0dG9uTG9vayh0aGlzLmxvb2spO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuc2VydmljZS5idXR0b25DbGlja2VkJC5zdWJzY3JpYmUoKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1NlbGVjdGlvblZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25TaW5nbGUoKSkge1xuICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvblZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUodGhpcy5idXR0b25zLmZpbHRlcihjdXJyZW50ID0+IGN1cnJlbnQgIT09IGJ1dHRvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZvY3VzKHRoaXMuYnV0dG9ucy50b0FycmF5KCkpO1xuICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvblZhbHVlID0gIWJ1dHRvbi5zZWxlY3RlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidXR0b24udG9nZ2xhYmxlKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnNldFNlbGVjdGVkKG5ld1NlbGVjdGlvblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUodGFiaW5kZXgsIFwiMFwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZSkge1xuICAgICAgICBpZiAoaXNDaGFuZ2VkKCdkaXNhYmxlZCcsIGNoYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSh0YWJpbmRleCwgXCIwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSh0YWJpbmRleCwgXCItMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5maXJzdC5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJ1dHRvbnMuZmlyc3QuZWxlbWVudCwgJ2stZ3JvdXAtc3RhcnQnKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5sYXN0LnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYnV0dG9ucy5sYXN0LmVsZW1lbnQsICdrLWdyb3VwLWVuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5U2V0dGluZ3MoKTtcbiAgICB9XG4gICAgbmF2aWdhdGVGb2N1cyhldmVudCkge1xuICAgICAgICBsZXQgZm9jdXNlZEluZGV4ID0gdGhpcy5idXR0b25zLnRvQXJyYXkoKS5maW5kSW5kZXgoY3VycmVudCA9PiBjdXJyZW50LmVsZW1lbnQudGFiSW5kZXggIT09IC0xKTtcbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuYnV0dG9ucy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSBuZXcgUHJldmVudGFibGVFdmVudCgpO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5BcnJvd1JpZ2h0ICYmIGZvY3VzZWRJbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZS5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgICAgICBpZiAoIWV2ZW50QXJncy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmb2N1cyh0aGlzLmJ1dHRvbnMudG9BcnJheSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKHRoaXMuYnV0dG9ucy5maWx0ZXIoKF9jdXJyZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IGZvY3VzZWRJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlzLkFycm93TGVmdCAmJiBmb2N1c2VkSW5kZXggPiBmaXJzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgICAgIGlmICghZXZlbnRBcmdzLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZvY3VzKHRoaXMuYnV0dG9ucy50b0FycmF5KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXModGhpcy5idXR0b25zLmZpbHRlcigoX2N1cnJlbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA9PT0gZm9jdXNlZEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVhY3RpdmF0ZShidXR0b25zKSB7XG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b24uc2V0U2VsZWN0ZWQoZmFsc2UpO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSh0YWJpbmRleCwgXCItMVwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFjdGl2YXRlKGJ1dHRvbnMpIHtcbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICAgICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUodGFiaW5kZXgsIFwiMFwiKTtcbiAgICAgICAgICAgIGJ1dHRvbi5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmb2N1cyhidXR0b25zKSB7XG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKHRhYmluZGV4LCBcIi0xXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9jdXMoYnV0dG9ucykge1xuICAgICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSh0YWJpbmRleCwgXCIwXCIpO1xuICAgICAgICAgICAgYnV0dG9uLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2ZXJpZnlTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvblNpbmdsZSgpICYmIHRoaXMuYnV0dG9ucy5maWx0ZXIoYnV0dG9uID0+IGJ1dHRvbi5zZWxlY3RlZCkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSGF2aW5nIG11bHRpcGxlIHNlbGVjdGVkIGJ1dHRvbnMgd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0aW9uU2luZ2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gPT09ICdzaW5nbGUnO1xuICAgIH1cbn1cbkJ1dHRvbkdyb3VwQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb0J1dHRvbkdyb3VwJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgS2VuZG9CdXR0b25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uYnV0dG9uZ3JvdXAnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tYnV0dG9uZ3JvdXAnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltrZW5kb0J1dHRvbl1cIj48L25nLWNvbnRlbnQ+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5CdXR0b25Hcm91cENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEtlbmRvQnV0dG9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9XG5dO1xuQnV0dG9uR3JvdXBDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Rpc2FibGVkJyxdIH1dLFxuICAgIHNlbGVjdGlvbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnc2VsZWN0aW9uJyxdIH1dLFxuICAgIHdpZHRoOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyd3aWR0aCcsXSB9XSxcbiAgICBsb29rOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbmF2aWdhdGU6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBidXR0b25zOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtCdXR0b25EaXJlY3RpdmUsXSB9XSxcbiAgICB3cmFwcGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYnV0dG9uLWdyb3VwJyxdIH1dLFxuICAgIGRpc2FibGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnLF0gfV0sXG4gICAgc3RyZXRjaGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYnV0dG9uLWdyb3VwLXN0cmV0Y2hlZCcsXSB9XSxcbiAgICBpc0ZsYXQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYnV0dG9uLWdyb3VwLWZsYXQnLF0gfV0sXG4gICAgaXNCYXJlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWJ1dHRvbi1ncm91cC1iYXJlJyxdIH1dLFxuICAgIGlzT3V0bGluZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1idXR0b24tZ3JvdXAtb3V0bGluZScsXSB9XSxcbiAgICBnZXRSb2xlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnJvbGUnLF0gfV0sXG4gICAgZGlyOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICBhcmlhRGlzYWJsZWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1kaXNhYmxlZCcsXSB9XSxcbiAgICB3cmFwcGVyV2lkdGg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLndpZHRoJyxdIH1dLFxuICAgIHdyYXBwZXJUYWJJbmRleDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50YWJpbmRleCcsXSB9XSxcbiAgICBrZXlkb3duOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5ZG93bicsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBvbkZvY3VzOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnZm9jdXMnLF0gfV0sXG4gICAgZm9jdXNvdXQ6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydmb2N1c291dCcsIFsnJGV2ZW50J10sXSB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlcyddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIEJ1dHRvbiBkaXJlY3RpdmUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgQnV0dG9uIG1vZHVsZVxuICogaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItYnV0dG9ucyc7XG4gKlxuICogLy8gVGhlIGJyb3dzZXIgcGxhdGZvcm0gd2l0aCBhIGNvbXBpbGVyXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIC8vIEltcG9ydCB0aGUgYXBwIGNvbXBvbmVudFxuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiAvLyBEZWZpbmUgdGhlIGFwcCBtb2R1bGVcbiAqIF9ATmdNb2R1bGUoe1xuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sIC8vIGRlY2xhcmUgYXBwIGNvbXBvbmVudFxuICogICAgIGltcG9ydHM6ICAgICAgW0Jyb3dzZXJNb2R1bGUsIEJ1dHRvbk1vZHVsZV0sIC8vIGltcG9ydCBCdXR0b24gbW9kdWxlXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBCdXR0b25Nb2R1bGUge1xufVxuQnV0dG9uTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtCdXR0b25EaXJlY3RpdmVdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtCdXR0b25EaXJlY3RpdmVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICpcbiAqIFRoZSBleHBvcnRlZCBwYWNrYWdlIG1vZHVsZS5cbiAqXG4gKiBUaGUgcGFja2FnZSBleHBvcnRzOlxuICogLSBgQnV0dG9uR3JvdXBDb21wb25lbnRgJm1kYXNoO1RoZSBCdXR0b25Hcm91cENvbXBvbmVudCBjb21wb25lbnQgY2xhc3MuXG4gKi9cbmNsYXNzIEJ1dHRvbkdyb3VwTW9kdWxlIHtcbn1cbkJ1dHRvbkdyb3VwTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtCdXR0b25Hcm91cENvbXBvbmVudF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW0J1dHRvbkdyb3VwQ29tcG9uZW50XSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBCdXR0b25Nb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOmRpcmVjdGl2ZS1zZWxlY3Rvci1uYW1lICovXG4vKipcbiAqIFVzZWQgZm9yIHJlbmRlcmluZyB0aGUgbGlzdCBpdGVtIGNvbnRlbnQuXG4gKlxuICogVG8gZGVmaW5lIHRoZSBpdGVtIHRlbXBsYXRlLCBuZXN0IGEgYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZSBga2VuZG88Q29tcG9uZW50TmFtZT5JdGVtVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGNvbXBvbmVudCB0YWcuXG4gKlxuICogRm9yIHRoZSBEcm9wRG93bkJ1dHRvbiwgdXNlIHRoZSBga2VuZG9Ecm9wRG93bkJ1dHRvbkl0ZW1UZW1wbGF0ZWAgZGlyZWN0aXZlLlxuICogRm9yIHRoZSBTcGxpdEJ1dHRvbiwgdXNlIHRoZSBga2VuZG9TcGxpdEJ1dHRvbkl0ZW1UZW1wbGF0ZWAgZGlyZWN0aXZlLlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGUgY3VycmVudCBjb21wb25lbnQuIFRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBkYXRhIGl0ZW0sIHVzZSB0aGUgYGxldC1kYXRhSXRlbWAgZGlyZWN0aXZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tc3BsaXRidXR0b24gW2RhdGFdPVwibGlzdEl0ZW1zXCI+XG4gKiAgICA8bmctdGVtcGxhdGUga2VuZG9TcGxpdEJ1dHRvbkl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XG4gKiAgICAgIDxzcGFuPnt7ZGF0YUl0ZW19fSBvcHRpb248L3NwYW4+XG4gKiAgICA8L25nLXRlbXBsYXRlPlxuICogIDwva2VuZG8tc3BsaXRidXR0b24+XG4gKiAgPGtlbmRvLWRyb3Bkb3duYnV0dG9uIFtkYXRhXT1cImxpc3RJdGVtc1wiPlxuICogICAgPG5nLXRlbXBsYXRlIGtlbmRvRHJvcERvd25CdXR0b25JdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxuICogICAgICA8c3Bhbj57e2RhdGFJdGVtfX0gb3B0aW9uPC9zcGFuPlxuICogICAgPC9uZy10ZW1wbGF0ZT5cbiAqICA8L2tlbmRvLWRyb3Bkb3duYnV0dG9uPlxuICogYFxuICogfSlcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgIHB1YmxpYyBsaXN0SXRlbXM6IEFycmF5PGFueT4gPSBbe1xuICogICAgICB0ZXh0OiAnaXRlbTEnLFxuICogICAgICBpY29uOiAncmVmcmVzaCcsXG4gKiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAqICAgICAgY2xpY2s6IChkYXRhSXRlbTogYW55KSA9PiB7XG4gKiAgICAgICAgICAvL2FjdGlvblxuICogICAgICB9XG4gKiAgfSwge1xuICogICAgICB0ZXh0OiAnaXRlbTInLFxuICogICAgICBpY29uOiAncmVmcmVzaCcsXG4gKiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAqICAgICAgY2xpY2s6IChkYXRhSXRlbTogYW55KSA9PiB7XG4gKiAgICAgICAgICAvL2FjdGlvblxuICogICAgICB9XG4gKiAgfV1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEZvciBtb3JlIGV4YW1wbGVzLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiB0aGUgW0Ryb3BEb3duTGlzdCB0ZW1wbGF0ZXNdKHslIHNsdWcgb3ZlcnZpZXdfZGRsICV9I3RlbXBsYXRlcykuXG4gKi9cbmNsYXNzIEJ1dHRvbkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkJ1dHRvbkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJvcERvd25CdXR0b25JdGVtVGVtcGxhdGVdLFtrZW5kb1NwbGl0QnV0dG9uSXRlbVRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQnV0dG9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExpc3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uSXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLm9uSXRlbUJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGdldFRleHQoZGF0YUl0ZW0pIHtcbiAgICAgICAgaWYgKGRhdGFJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RmllbGQgPyBkYXRhSXRlbVt0aGlzLnRleHRGaWVsZF0gOiBkYXRhSXRlbS50ZXh0IHx8IGRhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldEljb25DbGFzc2VzKGRhdGFJdGVtKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkYXRhSXRlbS5pY29uID8gJ2staWNvbiBrLWktJyArIGRhdGFJdGVtLmljb24gOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSB7fTtcbiAgICAgICAgY2xhc3Nlc1tpY29uIHx8IGRhdGFJdGVtLmljb25DbGFzc10gPSB0cnVlO1xuICAgICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9XG4gICAgb25DbGljayhpbmRleCkge1xuICAgICAgICB0aGlzLm9uSXRlbUNsaWNrLmVtaXQoaW5kZXgpO1xuICAgIH1cbiAgICBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMub25JdGVtQmx1ci5lbWl0KCk7XG4gICAgfVxufVxuTGlzdENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tYnV0dG9uLWxpc3QnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDx1bCBjbGFzcz1cImstbGlzdCBrLXJlc2V0XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cbiAgICAgICAgICAgIDxsaSByb2xlPVwibWVudWl0ZW1cIiB1bnNlbGVjdGFibGU9XCJvblwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIGtlbmRvQnV0dG9uRm9jdXNhYmxlXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGFJdGVtIG9mIGRhdGE7IGxldCBpbmRleCA9IGluZGV4O1wiXG4gICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2staXRlbSc6IHRydWUsICdrLXN0YXRlLWRpc2FibGVkJzogZGF0YUl0ZW0uZGlzYWJsZWR9XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGljayhpbmRleClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRhdGFJdGVtLmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXRlbVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IGl0ZW1UZW1wbGF0ZT8udGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGFJdGVtXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXRlbVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhSXRlbS5pY29uIHx8IGRhdGFJdGVtLmljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRJY29uQ2xhc3NlcyhkYXRhSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGFJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRhdGFJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0VGV4dChkYXRhSXRlbSkgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkxpc3RDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGV4dEZpZWxkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpdGVtVGVtcGxhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9uSXRlbUNsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgb25JdGVtQmx1cjogW3sgdHlwZTogT3V0cHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRm9jdXNTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBpc0ZvY3VzZWQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLmZvY3VzZWQ7XG4gICAgfVxuICAgIGZvY3VzKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRm9jdXNlZChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBpbmRleDtcbiAgICAgICAgdGhpcy5vbkZvY3VzLmVtaXQoaW5kZXgpO1xuICAgIH1cbiAgICByZXNldEZvY3VzKCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSAtMTtcbiAgICB9XG4gICAgZ2V0IGZvY3VzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWRJbmRleDtcbiAgICB9XG4gICAgc2V0IGZvY3VzZWQoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5vbkZvY3VzLmVtaXQoaW5kZXgpO1xuICAgIH1cbn1cbkZvY3VzU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZvY3VzYWJsZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZm9jdXNTZXJ2aWNlLCBlbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuZm9jdXNTZXJ2aWNlID0gZm9jdXNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gICAgfVxuICAgIGdldCBmb2N1c2VkQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2N1c1NlcnZpY2UuaXNGb2N1c2VkKHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlRXZlbnRzKCkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24gPSB0aGlzLmZvY3VzU2VydmljZS5vbkZvY3VzLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW5zdWJzY3JpYmVFdmVudHMoKSB7XG4gICAgICAgIGlmICghaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkZvY3VzYWJsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQnV0dG9uRm9jdXNhYmxlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRm9jdXNhYmxlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRm9jdXNTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH1cbl07XG5Gb2N1c2FibGVEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvY3VzZWRDbGFzc05hbWU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZm9jdXNlZCcsXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFRlbXBsYXRlQ29udGV4dERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lclJlZikge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmO1xuICAgIH1cbiAgICBzZXQgdGVtcGxhdGVDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zZXJ0ZWRWaWV3UmVmKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYucmVtb3ZlKHRoaXMudmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuaW5zZXJ0ZWRWaWV3UmVmKSk7XG4gICAgICAgICAgICB0aGlzLmluc2VydGVkVmlld1JlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC50ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRlZFZpZXdSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQudGVtcGxhdGVSZWYsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdbdGVtcGxhdGVDb250ZXh0XScgLy8gdHNsaW50OmRpc2FibGUtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9XG5dO1xuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRlbXBsYXRlQ29udGV4dDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbmNvbnN0IEVYUE9SVEVEX0RJUkVDVElWRVMgPSBbXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBGb2N1c2FibGVEaXJlY3RpdmUsXG4gICAgQnV0dG9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIFRlbXBsYXRlQ29udGV4dERpcmVjdGl2ZVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMaXN0TW9kdWxlIHtcbn1cbkxpc3RNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0VYUE9SVEVEX0RJUkVDVElWRVNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtFWFBPUlRFRF9ESVJFQ1RJVkVTXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xudmFyIEtleUV2ZW50cztcbihmdW5jdGlvbiAoS2V5RXZlbnRzKSB7XG4gICAgS2V5RXZlbnRzW0tleUV2ZW50c1tcImtleWRvd25cIl0gPSAwXSA9IFwia2V5ZG93blwiO1xuICAgIEtleUV2ZW50c1tLZXlFdmVudHNbXCJrZXlwcmVzc1wiXSA9IDFdID0gXCJrZXlwcmVzc1wiO1xuICAgIEtleUV2ZW50c1tLZXlFdmVudHNbXCJrZXl1cFwiXSA9IDJdID0gXCJrZXl1cFwiO1xufSkoS2V5RXZlbnRzIHx8IChLZXlFdmVudHMgPSB7fSkpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xudmFyIE5hdmlnYXRpb25BY3Rpb247XG4oZnVuY3Rpb24gKE5hdmlnYXRpb25BY3Rpb24pIHtcbiAgICBOYXZpZ2F0aW9uQWN0aW9uW05hdmlnYXRpb25BY3Rpb25bXCJVbmRlZmluZWRcIl0gPSAwXSA9IFwiVW5kZWZpbmVkXCI7XG4gICAgTmF2aWdhdGlvbkFjdGlvbltOYXZpZ2F0aW9uQWN0aW9uW1wiT3BlblwiXSA9IDFdID0gXCJPcGVuXCI7XG4gICAgTmF2aWdhdGlvbkFjdGlvbltOYXZpZ2F0aW9uQWN0aW9uW1wiQ2xvc2VcIl0gPSAyXSA9IFwiQ2xvc2VcIjtcbiAgICBOYXZpZ2F0aW9uQWN0aW9uW05hdmlnYXRpb25BY3Rpb25bXCJFbnRlclwiXSA9IDNdID0gXCJFbnRlclwiO1xuICAgIE5hdmlnYXRpb25BY3Rpb25bTmF2aWdhdGlvbkFjdGlvbltcIkVudGVyUHJlc3NcIl0gPSA0XSA9IFwiRW50ZXJQcmVzc1wiO1xuICAgIE5hdmlnYXRpb25BY3Rpb25bTmF2aWdhdGlvbkFjdGlvbltcIkVudGVyVXBcIl0gPSA1XSA9IFwiRW50ZXJVcFwiO1xuICAgIE5hdmlnYXRpb25BY3Rpb25bTmF2aWdhdGlvbkFjdGlvbltcIlRhYlwiXSA9IDZdID0gXCJUYWJcIjtcbiAgICBOYXZpZ2F0aW9uQWN0aW9uW05hdmlnYXRpb25BY3Rpb25bXCJFc2NcIl0gPSA3XSA9IFwiRXNjXCI7XG4gICAgTmF2aWdhdGlvbkFjdGlvbltOYXZpZ2F0aW9uQWN0aW9uW1wiTmF2aWdhdGVcIl0gPSA4XSA9IFwiTmF2aWdhdGVcIjtcbn0pKE5hdmlnYXRpb25BY3Rpb24gfHwgKE5hdmlnYXRpb25BY3Rpb24gPSB7fSkpO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpkZXByZWNhdGlvbiAqL1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExpc3RCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGZvY3VzU2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UsIHdyYXBwZXJSZWYsIF96b25lLCBsb2NhbGl6YXRpb24sIGNkcikge1xuICAgICAgICB0aGlzLmZvY3VzU2VydmljZSA9IGZvY3VzU2VydmljZTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZSA9IG5hdmlnYXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLndyYXBwZXJSZWYgPSB3cmFwcGVyUmVmO1xuICAgICAgICB0aGlzLl96b25lID0gX3pvbmU7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLl9vcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wb3B1cFNldHRpbmdzID0geyBhbmltYXRlOiB0cnVlLCBwb3B1cENsYXNzOiAnJyB9O1xuICAgICAgICB0aGlzLmxpc3RJZCA9IGd1aWQoKTtcbiAgICAgICAgdGhpcy5faXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9jdXNTZXJ2aWNlID0gZm9jdXNTZXJ2aWNlO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gbmF2aWdhdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSBsb2NhbGl6YXRpb24uY2hhbmdlcy5zdWJzY3JpYmUoKHsgcnRsIH0pID0+ICh0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cicpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICB9XG4gICAgZ2V0IHBvcHVwQ2xhc3NlcygpIHtcbiAgICAgICAgY29uc3QgcG9wdXBDbGFzc2VzID0gWydrLWxpc3QtY29udGFpbmVyJywgJ2stcmVzZXQnLCAnay1ncm91cCddO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXBTZXR0aW5ncy5wb3B1cENsYXNzKSB7XG4gICAgICAgICAgICBwb3B1cENsYXNzZXMucHVzaCh0aGlzLl9wb3B1cFNldHRpbmdzLnBvcHVwQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3B1cENsYXNzZXMuam9pbignICcpO1xuICAgIH1cbiAgICBnZXQgb3BlblN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgICB9XG4gICAgc2V0IG9wZW5TdGF0ZShvcGVuKSB7XG4gICAgICAgIHRoaXMuX29wZW4gPSBvcGVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlUG9wdXBWaXNpYmlsaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5TdGF0ZSA9ICF0aGlzLm9wZW5TdGF0ZTtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW5TdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c1NlcnZpY2UuZm9jdXMoLTEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkl0ZW1DbGljayhpbmRleCkge1xuICAgICAgICB0aGlzLmVtaXRJdGVtQ2xpY2tIYW5kbGVyKGluZGV4KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzV3JhcHBlcigpLCAxKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMub3BlblN0YXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNGaXJzdFRpbWVvdXQpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVFdmVudHMoKSB7XG4gICAgICAgIGlmICghaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVMaXN0SXRlbUZvY3VzRXZlbnQoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVDb21wb25lbnRCbHVycmVkRXZlbnQoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVOYXZpZ2F0aW9uRXZlbnRzKCk7XG4gICAgfVxuICAgIHN1YnNjcmliZUxpc3RJdGVtRm9jdXNFdmVudCgpIHtcbiAgICAgICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9jdXNTZXJ2aWNlLm9uRm9jdXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdWJzY3JpYmVDb21wb25lbnRCbHVycmVkRXZlbnQoKSB7XG4gICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50YWJTdWJzY3JpcHRpb24gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnRhYi5waXBlKGZpbHRlcigoKSA9PiB0aGlzLl9pc0ZvY3VzZWQpKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVUYWIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEJsdXJyZWRTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldmVudCkgPT4gIXRoaXMud3JhcHBlckNvbnRhaW5zKGV2ZW50LnRhcmdldCkpLCBmaWx0ZXIoKCkgPT4gdGhpcy5faXNGb2N1c2VkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuYmx1cldyYXBwZXIoKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3Vic2NyaWJlTmF2aWdhdGlvbkV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5uYXZpZ2F0ZS5zdWJzY3JpYmUodGhpcy5mb2N1c1NlcnZpY2UuZm9jdXMuYmluZCh0aGlzLmZvY3VzU2VydmljZSkpO1xuICAgICAgICB0aGlzLmVudGVyVXBTdWJzY3JpcHRpb24gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmVudGVydXAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzV3JhcHBlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcGVuU3Vic2NyaXB0aW9uID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vcGVuLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX29wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNXcmFwcGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlU3Vic2NyaXB0aW9uID0gbWVyZ2UodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jbG9zZSwgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5lc2MpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvY3VzV3JhcHBlcigpKTtcbiAgICB9XG4gICAgZW50ZXJIYW5kbGVyKCkgeyB9IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICB1bnN1YnNjcmliZUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKHRoaXMuY29tcG9uZW50Qmx1cnJlZFN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUodGhpcy5mb2N1c1N1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUodGhpcy5uYXZpZ2F0aW9uU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSh0aGlzLmVudGVyUHJlc3NTdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKHRoaXMuZW50ZXJVcFN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUodGhpcy5vcGVuU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSh0aGlzLmNsb3NlU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSh0aGlzLnRhYlN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAga2V5RG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5rZXlIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtleVByZXNzSGFuZGxlcihldmVudCkge1xuICAgICAgICB0aGlzLmtleUhhbmRsZXIoZXZlbnQsIEtleUV2ZW50cy5rZXlwcmVzcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBrZXlVcEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5rZXlIYW5kbGVyKGV2ZW50LCBLZXlFdmVudHMua2V5dXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAga2V5SGFuZGxlcihldmVudCwga2V5RXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvY3VzZWQgPSB0aGlzLmZvY3VzU2VydmljZS5mb2N1c2VkIHx8IDA7XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnByb2Nlc3Moe1xuICAgICAgICAgICAgYWx0S2V5OiBldmVudERhdGEuYWx0S2V5LFxuICAgICAgICAgICAgY3VycmVudDogZm9jdXNlZCxcbiAgICAgICAgICAgIGtleUNvZGU6IGV2ZW50RGF0YS5rZXlDb2RlLFxuICAgICAgICAgICAga2V5RXZlbnQ6IGtleUV2ZW50LFxuICAgICAgICAgICAgbWF4OiB0aGlzLl9kYXRhID8gdGhpcy5fZGF0YS5sZW5ndGggLSAxIDogMCxcbiAgICAgICAgICAgIG1pbjogMFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gTmF2aWdhdGlvbkFjdGlvbi5VbmRlZmluZWQgJiZcbiAgICAgICAgICAgIGFjdGlvbiAhPT0gTmF2aWdhdGlvbkFjdGlvbi5UYWIgJiZcbiAgICAgICAgICAgIChhY3Rpb24gIT09IE5hdmlnYXRpb25BY3Rpb24uRW50ZXIgfHwgKGFjdGlvbiA9PT0gTmF2aWdhdGlvbkFjdGlvbi5FbnRlciAmJiB0aGlzLl9vcGVuKSkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlzLlNwYWNlICYmIGFjdGlvbiA9PT0gTmF2aWdhdGlvbkFjdGlvbi5FbnRlclVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnREYXRhLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEl0ZW1DbGlja0hhbmRsZXIoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgZGF0YUl0ZW0gPSB0aGlzLl9kYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1DbGljaykge1xuICAgICAgICAgICAgdGhpcy5faXRlbUNsaWNrLmVtaXQoZGF0YUl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhSXRlbSAmJiBkYXRhSXRlbS5jbGljayAmJiAhZGF0YUl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGRhdGFJdGVtLmNsaWNrKGRhdGFJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb2N1c0ZpcnN0SXRlbSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEgJiYgaXNQcmVzZW50KHRoaXMuX2RhdGFbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzU2VydmljZS5mb2N1cygwKSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9jdXNXcmFwcGVyKCkge1xuICAgICAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCdXR0b24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3cmFwcGVyQ29udGFpbnMoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVyID09PSBlbGVtZW50IHx8IHRoaXMud3JhcHBlci5jb250YWlucyhlbGVtZW50KTtcbiAgICB9XG4gICAgYmx1cldyYXBwZXIoZW1pdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXBWaXNpYmlsaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChlbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9ibHVyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvY3VzQnV0dG9uKCkge1xuICAgICAgICBpZiAodGhpcy5idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVUYWIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNCdXR0b24oKTtcbiAgICAgICAgdGhpcy5ibHVyV3JhcHBlcihmYWxzZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgTkFWSUdBVElPTl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ25hdmlnYXRpb24uY29uZmlnJyk7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBOYXZpZ2F0aW9uU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMub3BlbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5lbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5lbnRlcnByZXNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmVudGVydXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMudGFiID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmVzYyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy51c2VMZWZ0UmlnaHRBcnJvd3MgPSBjb25maWcudXNlTGVmdFJpZ2h0QXJyb3dzO1xuICAgIH1cbiAgICBwcm9jZXNzKGFyZ3MpIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGFyZ3Mua2V5Q29kZTtcbiAgICAgICAgY29uc3Qga2V5RXZlbnQgPSBhcmdzLmtleUV2ZW50O1xuICAgICAgICBsZXQgaW5kZXg7XG4gICAgICAgIGxldCBhY3Rpb24gPSBOYXZpZ2F0aW9uQWN0aW9uLlVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGtleUV2ZW50ID09PSBLZXlFdmVudHMua2V5cHJlc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRW50ZXIoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24gPSBOYXZpZ2F0aW9uQWN0aW9uLkVudGVyUHJlc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5RXZlbnQgPT09IEtleUV2ZW50cy5rZXl1cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFbnRlcihrZXlDb2RlKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9IE5hdmlnYXRpb25BY3Rpb24uRW50ZXJVcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmFsdEtleSAmJiBrZXlDb2RlID09PSBLZXlzLkFycm93RG93bikge1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9IE5hdmlnYXRpb25BY3Rpb24uT3BlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3MuYWx0S2V5ICYmIGtleUNvZGUgPT09IEtleXMuQXJyb3dVcCkge1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9IE5hdmlnYXRpb25BY3Rpb24uQ2xvc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzRW50ZXIoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24gPSBOYXZpZ2F0aW9uQWN0aW9uLkVudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PT0gS2V5cy5Fc2NhcGUpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24gPSBOYXZpZ2F0aW9uQWN0aW9uLkVzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT09IEtleXMuVGFiKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uID0gTmF2aWdhdGlvbkFjdGlvbi5UYWI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09PSBLZXlzLkFycm93VXAgfHwgKHRoaXMudXNlTGVmdFJpZ2h0QXJyb3dzICYmIGtleUNvZGUgPT09IEtleXMuQXJyb3dMZWZ0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudDogYXJncy5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogYXJncy5tYXgsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogYXJncy5taW4sXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IC0xXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWN0aW9uID0gTmF2aWdhdGlvbkFjdGlvbi5OYXZpZ2F0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT09IEtleXMuQXJyb3dEb3duIHx8ICh0aGlzLnVzZUxlZnRSaWdodEFycm93cyAmJiBrZXlDb2RlID09PSBLZXlzLkFycm93UmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBhcmdzLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBhcmdzLm1pbixcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBhcmdzLm1heCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9IE5hdmlnYXRpb25BY3Rpb24uTmF2aWdhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gTmF2aWdhdGlvbkFjdGlvbi5VbmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXNbTmF2aWdhdGlvbkFjdGlvblthY3Rpb25dLnRvTG93ZXJDYXNlKCldLmVtaXQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIGlzRW50ZXIoa2V5Q29kZSkge1xuICAgICAgICByZXR1cm4ga2V5Q29kZSA9PT0gS2V5cy5FbnRlciB8fCBrZXlDb2RlID09PSBLZXlzLlNwYWNlO1xuICAgIH1cbiAgICBuZXh0KGFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQoYXJncy5jdXJyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Muc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYXJncy5jdXJyZW50ICE9PSBhcmdzLmVuZCA/IGFyZ3MuY3VycmVudCArIGFyZ3Muc3RlcCA6IGFyZ3MuZW5kO1xuICAgICAgICB9XG4gICAgfVxufVxuTmF2aWdhdGlvblNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk5hdmlnYXRpb25TZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOQVZJR0FUSU9OX0NPTkZJRyxdIH1dIH1cbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOm5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlciAqL1xuY29uc3QgTkFWSUdBVElPTl9TRVRUSU5HUyA9IHtcbiAgICB1c2VMZWZ0UmlnaHRBcnJvd3M6IHRydWVcbn07XG5jb25zdCDJtTAgPSBOQVZJR0FUSU9OX1NFVFRJTkdTO1xuY29uc3QgTkFWSUdBVElPTl9TRVRUSU5HU19QUk9WSURFUiA9IHtcbiAgICBwcm92aWRlOiBOQVZJR0FUSU9OX0NPTkZJRyxcbiAgICB1c2VWYWx1ZTogybUwXG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBLZW5kbyBVSSBTcGxpdEJ1dHRvbiBjb21wb25lbnQgZm9yIEFuZ3VsYXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBfQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiB0ZW1wbGF0ZTogYFxuICogIDxrZW5kby1zcGxpdGJ1dHRvbiBbZGF0YV09XCJkYXRhXCIgW2ljb25dPVwiJ3Bhc3RlJ1wiXG4gKiAgICAgIChpdGVtQ2xpY2spPVwib25TcGxpdEJ1dHRvbkl0ZW1DbGljaygkZXZlbnQpXCJcbiAqICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uU3BsaXRCdXR0b25DbGljaygpXCI+UGFzdGU8L2tlbmRvLXNwbGl0YnV0dG9uPlxuICogYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0YTogQXJyYXk8YW55PiA9IFt7XG4gKiAgICAgICB0ZXh0OiAnS2VlcCBUZXh0IE9ubHknLFxuICogICAgICAgaWNvbjogJ3Bhc3RlLXBsYWluLXRleHQnLFxuICogICAgICAgY2xpY2s6ICgpID0+IHsgY29uc29sZS5sb2coJ0tlZXAgVGV4dCBPbmx5IGNsaWNrIGhhbmRsZXInKTsgfVxuICogICB9LCB7XG4gKiAgICAgICB0ZXh0OiAnUGFzdGUgYXMgSFRNTCcsXG4gKiAgICAgICBpY29uOiAncGFzdGUtYXMtaHRtbCdcbiAqICAgfSwge1xuICogICAgICAgdGV4dDogJ1Bhc3RlIE1hcmtkb3duJyxcbiAqICAgICAgIGljb246ICdwYXN0ZS1tYXJrZG93bidcbiAqICAgfSwge1xuICogICAgICAgdGV4dDogJ1NldCBEZWZhdWx0IFBhc3RlJ1xuICogICB9XTtcbiAqXG4gKiAgIHB1YmxpYyBvblNwbGl0QnV0dG9uQ2xpY2soZGF0YUl0ZW06IGFueSk6IHZvaWQge1xuICogICAgICAgY29uc29sZS5sb2coJ1Bhc3RlJyk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvblNwbGl0QnV0dG9uSXRlbUNsaWNrKGRhdGFJdGVtOiBhbnkpOiB2b2lkIHtcbiAqICAgICAgIGlmIChkYXRhSXRlbSkge1xuICogICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGFJdGVtLnRleHQpO1xuICogICAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgU3BsaXRCdXR0b25Db21wb25lbnQgZXh0ZW5kcyBMaXN0QnV0dG9uIHtcbiAgICBjb25zdHJ1Y3Rvcihmb2N1c1NlcnZpY2UsIG5hdmlnYXRpb25TZXJ2aWNlLCB3cmFwcGVyUmVmLCB6b25lLCBwb3B1cFNlcnZpY2UsIGVsUmVmLCBsb2NhbGl6YXRpb24sIGNkcikge1xuICAgICAgICBzdXBlcihmb2N1c1NlcnZpY2UsIG5hdmlnYXRpb25TZXJ2aWNlLCB3cmFwcGVyUmVmLCB6b25lLCBsb2NhbGl6YXRpb24sIGNkcik7XG4gICAgICAgIHRoaXMucG9wdXBTZXJ2aWNlID0gcG9wdXBTZXJ2aWNlO1xuICAgICAgICB0aGlzLmVsUmVmID0gZWxSZWY7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBTcGxpdEJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGV4dCA9ICcnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyBhbiBpY29uIHRvIGJlIHJlbmRlcmVkIG5leHQgdG8gdGhlIGJ1dHRvbiB0ZXh0XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0YWJpbmRpbmdfc3BsaXRidXR0b24gJX0jdG9jLWFycmF5cy1vZi1jb21wbGV4LWRhdGEpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbiA9ICcnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyBhbiBpY29uIHdpdGggYSBjdXN0b20gQ1NTIGNsYXNzIHRvIGJlIHJlbmRlcmVkIG5leHQgdG8gdGhlIGJ1dHRvbiB0ZXh0XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0YWJpbmRpbmdfc3BsaXRidXR0b24gJX0jdG9jLWFycmF5cy1vZi1jb21wbGV4LWRhdGEpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbkNsYXNzID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiBhbiBpbWFnZSB0byBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRhYmluZGluZ19zcGxpdGJ1dHRvbiAlfSN0b2MtYXJyYXlzLW9mLWNvbXBsZXgtZGF0YSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbWFnZVVybCA9ICcnO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hhbmdlcyB0aGUgdmlzdWFsIGFwcGVhcmFuY2UgYnkgdXNpbmcgYWx0ZXJuYXRpdmUgc3R5bGluZyBvcHRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYXZhaWxhYmxlIHZhbHVlcyBhcmU6XG4gICAgICAgICAqICogYGZsYXRgXG4gICAgICAgICAqICogYG91dGxpbmVgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvb2sgPSAnZGVmYXVsdCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIFtgdGFiSW5kZXhgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL3RhYmluZGV4KSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIFtmb250IGljb25dKHslIHNsdWcgaWNvbnMgJX0jdG9jLWxpc3Qtb2YtZm9udC1pY29ucykgdGhhdCB3aWxsXG4gICAgICAgICAqIGJlIHJlbmRlcmVkIGZvciB0aGUgYnV0dG9uIHdoaWNoIG9wZW5zIHRoZSBwb3B1cC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXJyb3dCdXR0b25JY29uID0gJ2Fycm93LXMnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIGNsaWNrcyB0aGUgbWFpbiBidXR0b24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgICAgICAgPGtlbmRvLXNwbGl0YnV0dG9uIChidXR0b25DbGljayk9XCJvblNwbGl0QnV0dG9uQ2xpY2soKVwiIFtkYXRhXT1cImRhdGFcIj5cbiAgICAgICAgICogICAgICAgICAgICBSZXBseVxuICAgICAgICAgKiAgICAgICAgPC9rZW5kby1zcGxpdGJ1dHRvbj5cbiAgICAgICAgICogICAgYFxuICAgICAgICAgKiB9KVxuICAgICAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgICBwdWJsaWMgZGF0YTogQXJyYXk8YW55PiA9IFsnUmVwbHkgQWxsJywgJ0ZvcndhcmQnLCAnUmVwbHkgJiBEZWxldGUnXTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgcHVibGljIG9uU3BsaXRCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgICogICAgICBjb25zb2xlLmxvZygnU3BsaXRCdXR0b24gY2xpY2snKTtcbiAgICAgICAgICogICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgdXNlciBjbGlja3Mgb24gdGhlIGRyb3AtZG93biBsaXN0LiBUaGUgZXZlbnQgZGF0YSBjb250YWlucyB0aGUgZGF0YSBpdGVtIGJvdW5kIHRvIHRoZSBjbGlja2VkIGxpc3QgaXRlbS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogX0BDb21wb25lbnQoe1xuICAgICAgICAgKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgICAgICAgPGtlbmRvLXNwbGl0YnV0dG9uIChpdGVtQ2xpY2spPVwib25TcGxpdEJ1dHRvbkl0ZW1DbGljaygkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiPlxuICAgICAgICAgKiAgICAgICAgICBSZXBseVxuICAgICAgICAgKiAgICAgIDwva2VuZG8tc3BsaXRidXR0b24+XG4gICAgICAgICAqICAgIGBcbiAgICAgICAgICogfSlcbiAgICAgICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgICAgICogICAgcHVibGljIGRhdGE6IEFycmF5PGFueT4gPSBbJ1JlcGx5IEFsbCcsICdGb3J3YXJkJywgJ1JlcGx5ICYgRGVsZXRlJ107XG4gICAgICAgICAqXG4gICAgICAgICAqICAgcHVibGljIG9uU3BsaXRCdXR0b25JdGVtQ2xpY2soZGF0YUl0ZW0/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgICogICAgICAgIGlmIChkYXRhSXRlbSkge1xuICAgICAgICAgKiAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGFJdGVtKTtcbiAgICAgICAgICogICAgICAgfVxuICAgICAgICAgKiAgICB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLml0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgU3BsaXRCdXR0b24gZ2V0cyBmb2N1c2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBTcGxpdEJ1dHRvbiBnZXRzIGJsdXJyZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgcG9wdXAgaXMgYWJvdXQgdG8gb3Blbi5cbiAgICAgICAgICogVGhpcyBldmVudCBpcyBwcmV2ZW50YWJsZS4gSWYgeW91IGNhbmNlbCB0aGUgZXZlbnQsIHRoZSBwb3B1cCB3aWxsIHJlbWFpbiBjbG9zZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIGNsb3NlLlxuICAgICAgICAgKiBUaGlzIGV2ZW50IGlzIHByZXZlbnRhYmxlLiBJZiB5b3UgY2FuY2VsIHRoZSBldmVudCwgdGhlIHBvcHVwIHdpbGwgcmVtYWluIG9wZW4uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmxpc3RJZCA9IGd1aWQoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlQXJyb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idXR0b25UZXh0ID0gJyc7XG4gICAgICAgIHRoaXMubG9ja0ZvY3VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2l0ZW1DbGljayA9IHRoaXMuaXRlbUNsaWNrO1xuICAgICAgICB0aGlzLl9ibHVyID0gdGhpcy5vbkJsdXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZGlzYWJsZXMgYSBTcGxpdEJ1dHRvbiBpdGVtXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRhYmluZGluZ19zcGxpdGJ1dHRvbiAlfSN0b2MtYXJyYXlzLW9mLWNvbXBsZXgtZGF0YSkpLlxuICAgICAqL1xuICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgcG9wdXAgb2YgdGhlIFNwbGl0QnV0dG9uLlxuICAgICAqXG4gICAgICogVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgICAgKiAtIGBhbmltYXRlOiBCb29sZWFuYCZtZGFzaDtDb250cm9scyB0aGUgcG9wdXAgYW5pbWF0aW9uLiBCeSBkZWZhdWx0LCB0aGUgb3BlbiBhbmQgY2xvc2UgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZC5cbiAgICAgKiAtIGBwb3B1cENsYXNzOiBTdHJpbmdgJm1kYXNoO1NwZWNpZmllcyBhIGxpc3Qgb2YgQ1NTIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuXG4gICAgICogLSBgYXBwZW5kVG86IFwicm9vdFwiIHwgXCJjb21wb25lbnRcIiB8IFZpZXdDb250YWluZXJSZWZgJm1kYXNoO1NwZWNpZmllcyB0aGUgY29tcG9uZW50IHRvIHdoaWNoIHRoZSBwb3B1cCB3aWxsIGJlIGFwcGVuZGVkLlxuICAgICAqIC0gYGFsaWduOiBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCJgJm1kYXNoO1NwZWNpZmllcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBzZXQgcG9wdXBTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9wb3B1cFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7IGFuaW1hdGU6IHRydWUsIHBvcHVwQ2xhc3M6ICcnIH0sIHNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0IHBvcHVwU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBTcGxpdEJ1dHRvbi5cbiAgICAgKlxuICAgICAqID4gVGhlIGRhdGEgaGFzIHRvIGJlIHByb3ZpZGVkIGluIGFuIGFycmF5LWxpa2UgbGlzdC5cbiAgICAgKi9cbiAgICBzZXQgZGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhIHx8IFtdO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCBvcGVuU3RhdGUob3Blbikge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IG5ldyBQcmV2ZW50YWJsZUV2ZW50KCk7XG4gICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4uZW1pdChldmVudEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50QXJncy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RvZ2dsZShvcGVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBvcGVuU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBjb21wb25lbnRUYWJJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMudGFiSW5kZXg7XG4gICAgfVxuICAgIHNldCBpc0ZvY3VzZWQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faXNGb2N1c2VkID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBpc0ZvY3VzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0ZvY3VzZWQgJiYgIXRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBnZXQgd2lkZ2V0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBkaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBhcmlhTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmJ1dHRvblRleHR9IHNwbGl0YnV0dG9uYDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQnV0dG9uRm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uRm9jdXMuZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkFycm93QnV0dG9uQ2xpY2soKSB7XG4gICAgICAgIHRoaXMubG9ja0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRvZ2dsZUJ1dHRvbkFjdGl2ZVN0YXRlKGVuYWJsZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBlbmFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0b2dnbGVBcnJvd0J1dHRvbkFjdGl2ZVN0YXRlKGVuYWJsZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZUFycm93ID0gZW5hYmxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25CdXR0b25DbGljaygpIHtcbiAgICAgICAgdGhpcy5sb2NrRm9jdXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQnV0dG9uQmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiAmJiAhdGhpcy5sb2NrRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuYmx1cldyYXBwZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvY2tGb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAga2V5ZG93bihldmVudCkge1xuICAgICAgICB0aGlzLmtleURvd25IYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleXMuU3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtleXByZXNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMua2V5UHJlc3NIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtleXVwKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gS2V5cy5TcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5rZXlVcEhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQnV0dG9uVGV4dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndGV4dCcpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRvblRleHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlUG9wdXBWaXNpYmlsaXR5KCkge1xuICAgICAgICBzdXBlci50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICAgICAgaWYgKGlzRG9jdW1lbnRBdmFpbGFibGUoKSAmJiB0aGlzLmxvY2tGb2N1cykge1xuICAgICAgICAgICAgdGhpcy5idXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB3cmFwcGVyQ29udGFpbnMoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlciA9PT0gZWxlbWVudCB8fCB0aGlzLndyYXBwZXIuY29udGFpbnMoZWxlbWVudCkgfHwgKHRoaXMucG9wdXBSZWYgJiYgdGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQuY29udGFpbnMoZWxlbWVudCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBhbmNob3JBbGlnbigpIHtcbiAgICAgICAgbGV0IGFsaWduID0geyBob3Jpem9udGFsOiB0aGlzLnBvcHVwU2V0dGluZ3MuYWxpZ24gfHwgJ2xlZnQnLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfTtcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncnRsJyAmJiAhaXNQcmVzZW50KHRoaXMucG9wdXBTZXR0aW5ncy5hbGlnbikpIHtcbiAgICAgICAgICAgIGFsaWduLmhvcml6b250YWwgPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBwb3B1cEFsaWduKCkge1xuICAgICAgICBsZXQgYWxpZ24gPSB7IGhvcml6b250YWw6IHRoaXMucG9wdXBTZXR0aW5ncy5hbGlnbiB8fCAnbGVmdCcsIHZlcnRpY2FsOiAndG9wJyB9O1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdydGwnICYmICFpc1ByZXNlbnQodGhpcy5wb3B1cFNldHRpbmdzLmFsaWduKSkge1xuICAgICAgICAgICAgYWxpZ24uaG9yaXpvbnRhbCA9ICdyaWdodCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsaWduO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBTcGxpdEJ1dHRvbiBjb21wb25lbnQuXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmIChpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgU3BsaXRCdXR0b24gY29tcG9uZW50LlxuICAgICAqL1xuICAgIGJsdXIoKSB7XG4gICAgICAgIGlmIChpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5ibHVyV3JhcHBlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lQb3B1cCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwb3B1cC5cbiAgICAgKiBJZiB0aGUgYHRvZ2dsZWAgbWV0aG9kIGlzIHVzZWQgdG8gb3BlbiBvciBjbG9zZSB0aGUgcG9wdXAsIHRoZSBgb3BlbmAgYW5kIGBjbG9zZWAgZXZlbnRzIHdpbGwgbm90IGJlIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZW4gLSBUaGUgc3RhdGUgb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIHRvZ2dsZShvcGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGljaygoKSA9PiB0aGlzLl90b2dnbGUob3BlbiA9PT0gdW5kZWZpbmVkID8gIXRoaXMuX29wZW4gOiBvcGVuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3BlbiBzdGF0ZSBvZiB0aGUgcG9wdXAuXG4gICAgICovXG4gICAgZ2V0IGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlblN0YXRlO1xuICAgIH1cbiAgICBlbnRlckhhbmRsZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgZm9jdXNlZCA9IHRoaXMuZm9jdXNTZXJ2aWNlLmZvY3VzZWQ7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KGZvY3VzZWQpICYmIGZvY3VzZWQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0SXRlbUNsaWNrSGFuZGxlcihmb2N1c2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUJ1dHRvblRleHQoKSB7XG4gICAgICAgIGlmIChpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIGxldCBpbm5lclRleHQgPSB0aGlzLndyYXBwZXIuaW5uZXJUZXh0XG4gICAgICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxuICAgICAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgICAvL3NldFRpbW91dCBpcyBuZWVkZWQgYmVjYXVzZSBvZiBgRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC5gIGVycm9yO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5idXR0b25UZXh0ID0gaW5uZXJUZXh0KSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFwcGVuZFRvKCkge1xuICAgICAgICBjb25zdCB7IGFwcGVuZFRvIH0gPSB0aGlzLnBvcHVwU2V0dGluZ3M7XG4gICAgICAgIGlmICghYXBwZW5kVG8gfHwgYXBwZW5kVG8gPT09ICdyb290Jykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwZW5kVG8gPT09ICdjb21wb25lbnQnID8gdGhpcy5jb250YWluZXJSZWYgOiBhcHBlbmRUbztcbiAgICB9XG4gICAgX3RvZ2dsZShvcGVuKSB7XG4gICAgICAgIHRoaXMuX29wZW4gPSBvcGVuO1xuICAgICAgICB0aGlzLmRlc3Ryb3lQb3B1cCgpO1xuICAgICAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZVBvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwUmVmID0gdGhpcy5wb3B1cFNlcnZpY2Uub3Blbih7XG4gICAgICAgICAgICBhbmNob3I6IHRoaXMuZWxSZWYsXG4gICAgICAgICAgICBhbmNob3JBbGlnbjogdGhpcy5hbmNob3JBbGlnbixcbiAgICAgICAgICAgIGFuaW1hdGU6IHRoaXMucG9wdXBTZXR0aW5ncy5hbmltYXRlLFxuICAgICAgICAgICAgYXBwZW5kVG86IHRoaXMuYXBwZW5kVG8sXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnBvcHVwVGVtcGxhdGUsXG4gICAgICAgICAgICBwb3B1cEFsaWduOiB0aGlzLnBvcHVwQWxpZ24sXG4gICAgICAgICAgICBwb3B1cENsYXNzOiB0aGlzLnBvcHVwQ2xhc3Nlc1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cEFuY2hvclZpZXdwb3J0TGVhdmUuc3Vic2NyaWJlKCgpID0+ICh0aGlzLm9wZW5TdGF0ZSA9IGZhbHNlKSk7XG4gICAgICAgIHRoaXMucG9wdXBSZWYucG9wdXBPcGVuLnN1YnNjcmliZSh0aGlzLmZvY3VzRmlyc3RJdGVtLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBkZXN0cm95UG9wdXAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcHVwUmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblNwbGl0QnV0dG9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb1NwbGl0QnV0dG9uJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgRm9jdXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgTkFWSUdBVElPTl9TRVRUSU5HU19QUk9WSURFUixcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLnNwbGl0YnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXNwbGl0YnV0dG9uJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBrZW5kb0J1dHRvblxuICAgICAgICAgICAgI2J1dHRvblxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbbG9va109XCJsb29rXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJjb21wb25lbnRUYWJJbmRleFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2ljb25dPVwiaWNvblwiXG4gICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1hY3RpdmVdPVwiYWN0aXZlXCJcbiAgICAgICAgICAgIFtpY29uQ2xhc3NdPVwiaWNvbkNsYXNzXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJpbWFnZVVybFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJidXR0b25DbGFzc1wiXG4gICAgICAgICAgICAoZm9jdXMpPVwib25CdXR0b25Gb2N1cygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKClcIlxuICAgICAgICAgICAgKGJsdXIpPVwib25CdXR0b25CbHVyKClcIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJ0b2dnbGVCdXR0b25BY3RpdmVTdGF0ZSh0cnVlKVwiXG4gICAgICAgICAgICAobW91c2V1cCk9XCJ0b2dnbGVCdXR0b25BY3RpdmVTdGF0ZShmYWxzZSlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW5TdGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImxpc3RJZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHRleHQgfX08bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBrZW5kb0J1dHRvblxuICAgICAgICAgICAgI2Fycm93QnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtjbGFzcy5rLXN0YXRlLWFjdGl2ZV09XCJhY3RpdmVBcnJvd1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2ljb25dPVwiYXJyb3dCdXR0b25JY29uXCJcbiAgICAgICAgICAgIFtsb29rXT1cImxvb2tcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFycm93QnV0dG9uQ2xhc3NcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXJyb3dCdXR0b25DbGljaygpXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwidG9nZ2xlQXJyb3dCdXR0b25BY3RpdmVTdGF0ZSh0cnVlKVwiXG4gICAgICAgICAgICAobW91c2V1cCk9XCJ0b2dnbGVBcnJvd0J1dHRvbkFjdGl2ZVN0YXRlKGZhbHNlKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwb3B1cFRlbXBsYXRlPlxuICAgICAgICAgICAgPGtlbmRvLWJ1dHRvbi1saXN0XG4gICAgICAgICAgICAgICAgW2lkXT1cImxpc3RJZFwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJ0ZXh0RmllbGRcIlxuICAgICAgICAgICAgICAgIFtpdGVtVGVtcGxhdGVdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAob25JdGVtQ2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5RG93bkhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleXByZXNzKT1cImtleVByZXNzSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwia2V5VXBIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRpcl09XCJkaXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9rZW5kby1idXR0b24tbGlzdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU3BsaXRCdXR0b25Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBGb2N1c1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IFBvcHVwU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcblNwbGl0QnV0dG9uQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRleHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW1hZ2VVcmw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvb2s6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3B1cFNldHRpbmdzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGV4dEZpZWxkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBidXR0b25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXJyb3dCdXR0b25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXJyb3dCdXR0b25JY29uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBidXR0b25DbGljazogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGl0ZW1DbGljazogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIG9uRm9jdXM6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydmb2N1cycsXSB9XSxcbiAgICBvbkJsdXI6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydibHVyJyxdIH1dLFxuICAgIG9wZW46IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGl0ZW1UZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQnV0dG9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgYnV0dG9uOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnYnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGFycm93QnV0dG9uOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnYXJyb3dCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sXG4gICAgcG9wdXBUZW1wbGF0ZTogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3BvcHVwVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAgY29udGFpbmVyUmVmOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGlzRm9jdXNlZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1mb2N1c2VkJyxdIH1dLFxuICAgIHdpZGdldENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zcGxpdC1idXR0b24nLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWJ1dHRvbi1ncm91cCcsXSB9XSxcbiAgICBkaXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIGtleWRvd246IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydrZXlkb3duJywgWyckZXZlbnQnXSxdIH1dLFxuICAgIGtleXByZXNzOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5cHJlc3MnLCBbJyRldmVudCddLF0gfV0sXG4gICAga2V5dXA6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydrZXl1cCcsIFsnJGV2ZW50J10sXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKlxuICogVGhlIGV4cG9ydGVkIHBhY2thZ2UgbW9kdWxlLlxuICpcbiAqIFRoZSBwYWNrYWdlIGV4cG9ydHM6XG4gKiAtIGBTcGxpdEJ1dHRvbkNvbXBvbmVudGAmbWRhc2g7VGhlIFNwbGl0QnV0dG9uQ29tcG9uZW50IGNvbXBvbmVudCBjbGFzcy5cbiAqL1xuY2xhc3MgU3BsaXRCdXR0b25Nb2R1bGUge1xufVxuU3BsaXRCdXR0b25Nb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1NwbGl0QnV0dG9uQ29tcG9uZW50XSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbU3BsaXRCdXR0b25Db21wb25lbnQsIExpc3RNb2R1bGVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFBvcHVwTW9kdWxlLCBCdXR0b25Nb2R1bGUsIExpc3RNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOm5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlciAqL1xuY29uc3QgTkFWSUdBVElPTl9TRVRUSU5HUyQxID0ge1xuICAgIHVzZUxlZnRSaWdodEFycm93czogdHJ1ZVxufTtcbmNvbnN0IMm1MCQxID0gTkFWSUdBVElPTl9TRVRUSU5HUyQxO1xuY29uc3QgTkFWSUdBVElPTl9TRVRUSU5HU19QUk9WSURFUiQxID0ge1xuICAgIHByb3ZpZGU6IE5BVklHQVRJT05fQ09ORklHLFxuICAgIHVzZVZhbHVlOiDJtTAkMVxufTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgS2VuZG8gVUkgRHJvcERvd25CdXR0b24gY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tZHJvcGRvd25idXR0b24gW2RhdGFdPVwiZGF0YVwiPlxuICogICAgVXNlciBTZXR0aW5nc1xuICogIDwva2VuZG8tZHJvcGRvd25idXR0b24+XG4gKiBgXG4gKiB9KVxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgcHVibGljIGRhdGE6IEFycmF5PGFueT4gPSBbe1xuICogICAgICAgdGV4dDogJ015IFByb2ZpbGUnXG4gKiAgIH0sIHtcbiAqICAgICAgIHRleHQ6ICdGcmllbmQgUmVxdWVzdHMnXG4gKiAgIH0sIHtcbiAqICAgICAgIHRleHQ6ICdBY2NvdW50IFNldHRpbmdzJ1xuICogICB9LCB7XG4gKiAgICAgICB0ZXh0OiAnU3VwcG9ydCdcbiAqICAgfSwge1xuICogICAgICAgdGV4dDogJ0xvZyBPdXQnXG4gKiAgIH1dO1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIERyb3BEb3duQnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgTGlzdEJ1dHRvbiB7XG4gICAgY29uc3RydWN0b3IoZm9jdXNTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgd3JhcHBlclJlZiwgem9uZSwgcG9wdXBTZXJ2aWNlLCBlbFJlZiwgbG9jYWxpemF0aW9uLCBjZHIpIHtcbiAgICAgICAgc3VwZXIoZm9jdXNTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgd3JhcHBlclJlZiwgem9uZSwgbG9jYWxpemF0aW9uLCBjZHIpO1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgdGhpcy5lbFJlZiA9IGVsUmVmO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBpY29uIGluIGEgS2VuZG8gVUkgdGhlbWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmljb24gPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGxpc3Qgb2YgQ1NTIGNsYXNzZXMgd2hpY2ggYXJlIHVzZWQgZm9yIHN0eWxpbmcgdGhlIEJ1dHRvbiB3aXRoIGN1c3RvbSBpY29ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbkNsYXNzID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIGEgVVJMIGZvciBzdHlsaW5nIHRoZSBidXR0b24gd2l0aCBhIGN1c3RvbSBpbWFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW1hZ2VVcmwgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgdmlzdWFsIHdlaWdodCB0byB0aGUgZGVmYXVsdCBidXR0b24gYW5kIG1ha2VzIGl0IHByaW1hcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnByaW1hcnkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoYW5nZXMgdGhlIHZpc3VhbCBhcHBlYXJhbmNlIGJ5IHVzaW5nIGFsdGVybmF0aXZlIHN0eWxpbmcgb3B0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGF2YWlsYWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAqIGBmbGF0YFxuICAgICAgICAgKiAqIGBvdXRsaW5lYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb29rID0gJ2RlZmF1bHQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBbYHRhYkluZGV4YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9HbG9iYWxfYXR0cmlidXRlcy90YWJpbmRleCkgb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGRyb3AtZG93biBsaXN0IGl0ZW0uIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIHRoZSBkYXRhIGl0ZW0gYm91bmQgdG8gdGhlIGNsaWNrZWQgbGlzdCBpdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIG9wZW4uXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50LCB0aGUgcG9wdXAgd2lsbCByZW1haW4gY2xvc2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVuID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBwb3B1cCBpcyBhYm91dCB0byBjbG9zZS5cbiAgICAgICAgICogVGhpcyBldmVudCBpcyBwcmV2ZW50YWJsZS4gSWYgeW91IGNhbmNlbCB0aGUgZXZlbnQsIHRoZSBwb3B1cCB3aWxsIHJlbWFpbiBvcGVuLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgRHJvcERvd25CdXR0b24gZ2V0cyBmb2N1c2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBEcm9wRG93bkJ1dHRvbiBnZXRzIGJsdXJyZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICAgICAgdGhpcy5saXN0SWQgPSBndWlkKCk7XG4gICAgICAgIHRoaXMuX2l0ZW1DbGljayA9IHRoaXMuaXRlbUNsaWNrO1xuICAgICAgICB0aGlzLl9ibHVyID0gdGhpcy5vbkJsdXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIHBvcHVwIG9mIHRoZSBEcm9wRG93bkJ1dHRvbi5cbiAgICAgKlxuICAgICAqIFRoZSBhdmFpbGFibGUgb3B0aW9ucyBhcmU6XG4gICAgICogLSBgYW5pbWF0ZTogQm9vbGVhbmAmbWRhc2g7Q29udHJvbHMgdGhlIHBvcHVwIGFuaW1hdGlvbi4gQnkgZGVmYXVsdCwgdGhlIG9wZW4gYW5kIGNsb3NlIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQuXG4gICAgICogLSBgcG9wdXBDbGFzczogU3RyaW5nYCZtZGFzaDtTcGVjaWZpZXMgYSBsaXN0IG9mIENTUyBjbGFzc2VzIHRoYXQgYXJlIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLlxuICAgICAqIC0gYGFwcGVuZFRvOiBcInJvb3RcIiB8IFwiY29tcG9uZW50XCIgfCBWaWV3Q29udGFpbmVyUmVmYCZtZGFzaDtTcGVjaWZpZXMgdGhlIGNvbXBvbmVudCB0byB3aGljaCB0aGUgcG9wdXAgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICAgKiAtIGBhbGlnbjogXCJsZWZ0XCIgfCBcImNlbnRlclwiIHwgXCJyaWdodFwiYCZtZGFzaDtTcGVjaWZpZXMgdGhlIGFsaWdubWVudCBvZiB0aGUgcG9wdXAuXG4gICAgICovXG4gICAgc2V0IHBvcHVwU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcG9wdXBTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oeyBhbmltYXRlOiB0cnVlLCBwb3B1cENsYXNzOiAnJyB9LCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldCBwb3B1cFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBTZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIERyb3BEb3duQnV0dG9uLlxuICAgICAqL1xuICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5vcGVuU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgZGF0YSBvZiB0aGUgRHJvcERvd25CdXR0b24uXG4gICAgICpcbiAgICAgKiA+IFRoZSBkYXRhIGhhcyB0byBiZSBwcm92aWRlZCBpbiBhbiBhcnJheS1saWtlIGxpc3QuXG4gICAgICovXG4gICAgc2V0IGRhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YSB8fCBbXTtcbiAgICB9XG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IG9wZW5TdGF0ZShvcGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0gbmV3IFByZXZlbnRhYmxlRXZlbnQoKTtcbiAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3Blbi5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRBcmdzLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG9nZ2xlKG9wZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG9wZW5TdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY29tcG9uZW50VGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gKC0xKSA6IHRoaXMudGFiSW5kZXg7XG4gICAgfVxuICAgIGdldCBhcHBlbmRUbygpIHtcbiAgICAgICAgY29uc3QgeyBhcHBlbmRUbyB9ID0gdGhpcy5wb3B1cFNldHRpbmdzO1xuICAgICAgICBpZiAoIWFwcGVuZFRvIHx8IGFwcGVuZFRvID09PSAncm9vdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGVuZFRvID09PSAnY29tcG9uZW50JyA/IHRoaXMuY29udGFpbmVyIDogYXBwZW5kVG87XG4gICAgfVxuICAgIGdldCBmb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNGb2N1c2VkICYmICF0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IHdpZGdldENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZGlyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAga2V5ZG93bihldmVudCkge1xuICAgICAgICB0aGlzLmtleURvd25IYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleXMuU3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtleXByZXNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMua2V5UHJlc3NIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtleXVwKGV2ZW50KSB7XG4gICAgICAgIHRoaXMua2V5VXBIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBtb3VzZWRvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBtb3VzZXVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9wZW5Qb3B1cCgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQnV0dG9uQmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5ibHVyV3JhcHBlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYW5jaG9yQWxpZ24oKSB7XG4gICAgICAgIGxldCBhbGlnbiA9IHsgaG9yaXpvbnRhbDogdGhpcy5wb3B1cFNldHRpbmdzLmFsaWduIHx8ICdsZWZ0JywgdmVydGljYWw6ICdib3R0b20nIH07XG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3J0bCcgJiYgIWlzUHJlc2VudCh0aGlzLnBvcHVwU2V0dGluZ3MuYWxpZ24pKSB7XG4gICAgICAgICAgICBhbGlnbi5ob3Jpem9udGFsID0gJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxpZ247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgcG9wdXBBbGlnbigpIHtcbiAgICAgICAgbGV0IGFsaWduID0geyBob3Jpem9udGFsOiB0aGlzLnBvcHVwU2V0dGluZ3MuYWxpZ24gfHwgJ2xlZnQnLCB2ZXJ0aWNhbDogJ3RvcCcgfTtcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncnRsJyAmJiAhaXNQcmVzZW50KHRoaXMucG9wdXBTZXR0aW5ncy5hbGlnbikpIHtcbiAgICAgICAgICAgIGFsaWduLmhvcml6b250YWwgPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgRHJvcERvd25CdXR0b24gY29tcG9uZW50LlxuICAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQmx1cnMgdGhlIERyb3BEb3duQnV0dG9uIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbi5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICAgIHRoaXMuYmx1cldyYXBwZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95UG9wdXAoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAuXG4gICAgICogSWYgdGhlIGB0b2dnbGVgIG1ldGhvZCBpcyB1c2VkIHRvIG9wZW4gb3IgY2xvc2UgdGhlIHBvcHVwLCB0aGUgYG9wZW5gIGFuZCBgY2xvc2VgIGV2ZW50cyB3aWxsIG5vdCBiZSBmaXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVuIC0gVGhlIHN0YXRlIG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICB0b2dnbGUob3Blbikge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRpY2soKCkgPT4gKHRoaXMuX3RvZ2dsZSgob3BlbiA9PT0gdW5kZWZpbmVkKSA/ICF0aGlzLl9vcGVuIDogb3BlbikpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBvcGVuIHN0YXRlIG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBnZXQgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuU3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVGb2N1cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiAhdGhpcy5faXNGb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzLmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgd3JhcHBlckNvbnRhaW5zKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlciA9PT0gZWxlbWVudFxuICAgICAgICAgICAgfHwgdGhpcy53cmFwcGVyLmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICB8fCAodGhpcy5wb3B1cFJlZiAmJiB0aGlzLnBvcHVwUmVmLnBvcHVwRWxlbWVudC5jb250YWlucyhlbGVtZW50KSk7XG4gICAgfVxuICAgIHN1YnNjcmliZU5hdmlnYXRpb25FdmVudHMoKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGVcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5vbkFycm93S2V5TmF2aWdhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZW50ZXJVcFN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZW50ZXJ1cC5zdWJzY3JpYmUodGhpcy5vbk5hdmlnYXRpb25FbnRlclVwLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLm9wZW5TdWJzY3JpcHRpb24gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9wZW4uc3Vic2NyaWJlKHRoaXMub25OYXZpZ2F0aW9uT3Blbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jbG9zZVN1YnNjcmlwdGlvbiA9IG1lcmdlKHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY2xvc2UsIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZXNjKS5zdWJzY3JpYmUodGhpcy5vbk5hdmlnYXRpb25DbG9zZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgb25OYXZpZ2F0aW9uRW50ZXJVcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiAhdGhpcy5vcGVuU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGF0ZSkge1xuICAgICAgICAgICAgbGV0IGZvY3VzZWQgPSB0aGlzLmZvY3VzU2VydmljZS5mb2N1c2VkO1xuICAgICAgICAgICAgaWYgKGlzUHJlc2VudChmb2N1c2VkKSAmJiBmb2N1c2VkICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEl0ZW1DbGlja0hhbmRsZXIoZm9jdXNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW5TdGF0ZSAmJiBpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbk5hdmlnYXRpb25PcGVuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmICF0aGlzLm9wZW5TdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cFZpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbk5hdmlnYXRpb25DbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgaWYgKGlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkFycm93S2V5TmF2aWdhdGUoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5mb2N1c1NlcnZpY2UuZm9jdXMoaW5kZXgpO1xuICAgIH1cbiAgICBfdG9nZ2xlKG9wZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX29wZW4gPT09IG9wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5kZXN0cm95UG9wdXAoKTtcbiAgICAgICAgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVQb3B1cCgpIHtcbiAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgICAgICAgYW5jaG9yOiB0aGlzLmVsUmVmLFxuICAgICAgICAgICAgYW5jaG9yQWxpZ246IHRoaXMuYW5jaG9yQWxpZ24sXG4gICAgICAgICAgICBhbmltYXRlOiB0aGlzLnBvcHVwU2V0dGluZ3MuYW5pbWF0ZSxcbiAgICAgICAgICAgIGFwcGVuZFRvOiB0aGlzLmFwcGVuZFRvLFxuICAgICAgICAgICAgY29udGVudDogdGhpcy5wb3B1cFRlbXBsYXRlLFxuICAgICAgICAgICAgcG9wdXBBbGlnbjogdGhpcy5wb3B1cEFsaWduLFxuICAgICAgICAgICAgcG9wdXBDbGFzczogdGhpcy5wb3B1cENsYXNzZXNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9wdXBSZWYucG9wdXBBbmNob3JWaWV3cG9ydExlYXZlLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9wZW5TdGF0ZSA9IGZhbHNlKTtcbiAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cE9wZW4uc3Vic2NyaWJlKHRoaXMuZm9jdXNGaXJzdEl0ZW0uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGRlc3Ryb3lQb3B1cCgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9wdXBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXBSZWYuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucG9wdXBSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuRHJvcERvd25CdXR0b25Db21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvRHJvcERvd25CdXR0b24nLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBGb2N1c1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBOQVZJR0FUSU9OX1NFVFRJTkdTX1BST1ZJREVSJDEsXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5kcm9wZG93bmJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kcm9wZG93bmJ1dHRvbicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGJ1dHRvbiBrZW5kb0J1dHRvbiAjYnV0dG9uXG4gICAgICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJjb21wb25lbnRUYWJJbmRleFwiXG4gICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1hY3RpdmVdPVwiYWN0aXZlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbaWNvbl09XCJpY29uXCJcbiAgICAgICAgICAgIFtpY29uQ2xhc3NdPVwiaWNvbkNsYXNzXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJpbWFnZVVybFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJidXR0b25DbGFzc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlblBvcHVwKClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cImhhbmRsZUZvY3VzKClcIlxuICAgICAgICAgICAgKGJsdXIpPVwib25CdXR0b25CbHVyKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW5TdGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImxpc3RJZFwiXG4gICAgICAgICAgICBbbG9va109XCJsb29rXCJcbiAgICAgICAgICAgIFtwcmltYXJ5XT1cInByaW1hcnlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwb3B1cFRlbXBsYXRlPlxuICAgICAgICAgICAgPGtlbmRvLWJ1dHRvbi1saXN0XG4gICAgICAgICAgICAgICAgI2J1dHRvbkxpc3RcbiAgICAgICAgICAgICAgICBbaWRdPVwibGlzdElkXCJcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cInRleHRGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIChvbkl0ZW1DbGljayk9XCJvbkl0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwia2V5UHJlc3NIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJrZXlVcEhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlyXT1cImRpclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2tlbmRvLWJ1dHRvbi1saXN0PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Ecm9wRG93bkJ1dHRvbkNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEZvY3VzU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmF2aWdhdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9XG5dO1xuRHJvcERvd25CdXR0b25Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaWNvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWNvbkNsYXNzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpbWFnZVVybDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcG9wdXBTZXR0aW5nczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGV4dEZpZWxkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcHJpbWFyeTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9vazogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYnV0dG9uQ2xhc3M6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpdGVtQ2xpY2s6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBvcGVuOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2xvc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBvbkZvY3VzOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnZm9jdXMnLF0gfV0sXG4gICAgb25CbHVyOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnYmx1cicsXSB9XSxcbiAgICBmb2N1c2VkOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0YXRlLWZvY3VzZWQnLF0gfV0sXG4gICAgd2lkZ2V0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay13aWRnZXQnLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRyb3Bkb3duLWJ1dHRvbicsXSB9XSxcbiAgICBkaXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIGl0ZW1UZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQnV0dG9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgYnV0dG9uOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnYnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGJ1dHRvbkxpc3Q6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydidXR0b25MaXN0JywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIHBvcHVwVGVtcGxhdGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwb3B1cFRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGNvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBrZXlkb3duOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5ZG93bicsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBrZXlwcmVzczogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2tleXByZXNzJywgWyckZXZlbnQnXSxdIH1dLFxuICAgIGtleXVwOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5dXAnLCBbJyRldmVudCddLF0gfV0sXG4gICAgbW91c2Vkb3duOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnbW91c2Vkb3duJywgWyckZXZlbnQnXSxdIH1dLFxuICAgIG1vdXNldXA6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydtb3VzZXVwJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBUaGUgZXhwb3J0ZWQgcGFja2FnZSBtb2R1bGUuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYERyb3BEb3duQnV0dG9uQ29tcG9uZW50YCZtZGFzaDtUaGUgRHJvcERvd25CdXR0b25Db21wb25lbnQgY29tcG9uZW50IGNsYXNzLlxuICovXG5jbGFzcyBEcm9wRG93bkJ1dHRvbk1vZHVsZSB7XG59XG5Ecm9wRG93bkJ1dHRvbk1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbRHJvcERvd25CdXR0b25Db21wb25lbnRdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtEcm9wRG93bkJ1dHRvbkNvbXBvbmVudCwgTGlzdE1vZHVsZV0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUG9wdXBNb2R1bGUsIExpc3RNb2R1bGUsIEJ1dHRvbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBEaXNwbGF5cyBhIENoaXAgdGhhdCByZXByZXNlbnRzIGFuIGlucHV0LCBhdHRyaWJ1dGUgb3IgYW4gYWN0aW9uLlxuICovXG5jbGFzcyBDaGlwQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCByZW5kZXJlciwgbmdab25lLCBsb2NhbGl6YXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uU2VydmljZSA9IGxvY2FsaXphdGlvblNlcnZpY2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGFuZ2VzIHRoZSB2aXN1YWwgYXBwZWFyYW5jZSBieSB1c2luZyBhbHRlcm5hdGl2ZSBzdHlsaW5nIG9wdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBhdmFpbGFibGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBgZmlsbGVkYFxuICAgICAgICAgKiAqIGBvdXRsaW5lZGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubG9vayA9ICdmaWxsZWQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgQ2hpcC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgQ2hpcCB3aWxsIGJlIHJlbW92YWJsZSBvciBub3QuXG4gICAgICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgQ2hpcCByZW5kZXJzIGEgcmVtb3ZlIGljb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBDaGlwIHR5cGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAtIGBub25lYCAoZGVmYXVsdClcbiAgICAgICAgICogLSBgc3VjY2Vzc2BcbiAgICAgICAgICogLSBgZXJyb3JgXG4gICAgICAgICAqIC0gYHdhcm5pbmdgXG4gICAgICAgICAqIC0gYGluZm9gXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSAnbm9uZSc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgQ2hpcCB3aWxsIGJlIGRpc2FibGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIGNsaWNrcyB0aGUgcmVtb3ZlIGljb24gb2YgdGhlIENoaXAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuaG9zdENsYXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gbG9jYWxpemF0aW9uU2VydmljZS5ydGwgPyAncnRsJyA6ICdsdHInO1xuICAgIH1cbiAgICBnZXQgb3V0bGluZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rID09PSAnb3V0bGluZWQnO1xuICAgIH1cbiAgICBnZXQgZmlsbGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2sgPT09ICdmaWxsZWQnO1xuICAgIH1cbiAgICBnZXQgaGFzSWNvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uIHx8IHRoaXMuaWNvbkNsYXNzID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgZGlzYWJsZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZDtcbiAgICB9XG4gICAgZ2V0IGZvY3VzZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNlZDtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uU2VydmljZS5jaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cicpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGV0YWNoRG9tRXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaERvbUV2ZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgY2hpcCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0eXBlQ2xhc3MgPSB0aGlzLnR5cGVDbGFzcygpO1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2hpcCwgdHlwZUNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dGFjaEVsZW1lbnRFdmVudEhhbmRsZXJzKGNoaXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGljb25DbGFzc2VzKCkge1xuICAgICAgICBpZiAodGhpcy5pY29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYGstaWNvbiBrLWktJHt0aGlzLmljb259YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmljb25DbGFzc31gO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWRJY29uQ2xhc3NlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJY29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5zZWxlY3RlZEljb259YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGstaWNvbiBrLWktY2hlY2tgO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHJlbW92ZUljb25DbGFzc2VzKCkge1xuICAgICAgICBpZiAodGhpcy5yZW1vdmVJY29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5yZW1vdmVJY29ufWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBrLWljb24gay1pLWNsb3NlLWNpcmNsZWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0eXBlQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbm9uZSc6ICcnLFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnOiAnay1jaGlwLXN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ3dhcm5pbmcnOiAnay1jaGlwLXdhcm5pbmcnLFxuICAgICAgICAgICAgJ2Vycm9yJzogJ2stY2hpcC1lcnJvcicsXG4gICAgICAgICAgICAnaW5mbyc6ICdrLWNoaXAtaW5mbydcbiAgICAgICAgfVt0aGlzLnR5cGVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBDaGlwIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgaWYgKGlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgQ2hpcCBjb21wb25lbnQuXG4gICAgICovXG4gICAgYmx1cigpIHtcbiAgICAgICAgaWYgKGlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvblJlbW92ZUNsaWNrKGUpIHtcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZS5lbWl0KHsgc2VuZGVyOiB0aGlzLCBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF0dGFjaEVsZW1lbnRFdmVudEhhbmRsZXJzKGNoaXApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGNoaXAsICdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNoaXAsICdrLWNoaXAtZm9jdXNlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBibHVyTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihjaGlwLCAnYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNoaXAsICdrLWNoaXAtZm9jdXNlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRldGFjaERvbUV2ZW50cyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb2N1c0xpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgYmx1ckxpc3RlbmVyKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5DaGlwQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jaGlwJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8c3BhbiBjbGFzcz1cImstc2VsZWN0ZWQtaWNvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstc2VsZWN0ZWQtaWNvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRJY29uQ2xhc3Nlc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cImljb24gfHwgaWNvbkNsYXNzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1jaGlwLWljb25cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiaWNvbkNsYXNzZXNcIlxuICAgICAgICA+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cImstY2hpcC1jb250ZW50XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstY2hpcC1sYWJlbFwiICpuZ0lmPVwibGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhbGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cInJlbW92YWJsZVwiXG4gICAgICAgICAgICBjbGFzcz1cImstcmVtb3ZlLWljb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInJlbW92ZUljb25DbGFzc2VzXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgYCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLmNoaXAnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNoaXBDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuQ2hpcENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBsb29rOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWNvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWNvbkNsYXNzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0ZWRJY29uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZW1vdmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJlbW92ZUljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHR5cGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZW1vdmU6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50YWJpbmRleCcsXSB9XSxcbiAgICBob3N0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2hpcCcsXSB9XSxcbiAgICBvdXRsaW5lQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2hpcC1vdXRsaW5lJyxdIH1dLFxuICAgIGZpbGxlZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNoaXAtZmlsbGVkJyxdIH1dLFxuICAgIGhhc0ljb25DbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jaGlwLWhhcy1pY29uJyxdIH1dLFxuICAgIGRpc2FibGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2hpcC1kaXNhYmxlZCcsXSB9XSxcbiAgICBzZWxlY3RlZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNoaXAtc2VsZWN0ZWQnLF0gfV0sXG4gICAgZm9jdXNlZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNoaXAtZm9jdXNlZCcsXSB9XSxcbiAgICBkaXJlY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dXG59O1xuXG5jbGFzcyBDaGlwTGlzdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UgPSBsb2NhbGl6YXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmhvc3RDbGFzcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gbW9kZSBvZiB0aGUgQ2hpcExpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBhdmFpbGFibGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBgbm9uZWAgKGRlZmF1bHQpXG4gICAgICAgICAqICogYHNpbmdsZWBcbiAgICAgICAgICogKiBgbXVsdGlwbGVgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9ICdub25lJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB3aGVuIHRoZSBDaGlwTGlzdCBzZWxlY3Rpb24gaXMgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSByZW1vdmUgaWNvbiBvZiB0aGUgQ2hpcC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGxvY2FsaXphdGlvblNlcnZpY2UucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICB9XG4gICAgZ2V0IHNpbmdsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uID09PSAnc2luZ2xlJztcbiAgICB9XG4gICAgZ2V0IG11bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gPT09ICdtdWx0aXBsZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKCRldmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBpc1JlbW92ZUNsaWNrZWQgPSBjbG9zZXN0KHRhcmdldCwgJy5rLXJlbW92ZS1pY29uJyk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRDaGlwID0gY2xvc2VzdCh0YXJnZXQsICcuay1jaGlwJyk7XG4gICAgICAgIGNvbnN0IGNoaXAgPSB0aGlzLmNoaXBzLmZpbmQoKGNoaXApID0+IGNsaWNrZWRDaGlwID09PSBjaGlwLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmIChpc1JlbW92ZUNsaWNrZWQgJiYgY2xpY2tlZENoaXApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZUV2ZW50QXJncyA9IHsgc2VuZGVyOiB0aGlzLCBvcmlnaW5hbEV2ZW50OiAkZXZlbnQsIHJlbW92ZWRDaGlwOiBjaGlwIH07XG4gICAgICAgICAgICB0aGlzLnJlbW92ZS5lbWl0KHJlbW92ZUV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICE9PSAnbm9uZScgJiYgY2xpY2tlZENoaXAgJiYgIWlzUmVtb3ZlQ2xpY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oY2hpcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uU2VydmljZS5jaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cicpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0ZWRDaGlwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpcHMucmVkdWNlKChhY2MsIGN1ciwgaWR4KSA9PiB7IHJldHVybiBjdXIuc2VsZWN0ZWQgPyBhY2MuY29uY2F0KGlkeCkgOiBhY2M7IH0sIFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIG9uIGNsaWNrIG9mIGEgQ2hpcC4gRW1pdHMgZXZlbnRzLlxuICAgICAqL1xuICAgIHNldFNlbGVjdGlvbihjaGlwKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oY2hpcCk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpcC5zZWxlY3RlZCA9ICFjaGlwLnNlbGVjdGVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZENoaXBzKCkpO1xuICAgIH1cbiAgICBjbGVhclNlbGVjdGlvbihjaGlwKSB7XG4gICAgICAgIHRoaXMuY2hpcHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaXAgIT09IGMpIHtcbiAgICAgICAgICAgICAgICBjLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkNoaXBMaXN0Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jaGlwLWxpc3QnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICBgLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uY2hpcC1saXN0J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DaGlwTGlzdENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkNoaXBMaXN0Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jaGlwLWxpc3QnLF0gfV0sXG4gICAgZGlyZWN0aW9uOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICBzZWxlY3Rpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNlbGVjdGVkQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcmVtb3ZlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2hpcHM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NoaXBDb21wb25lbnQsXSB9XSxcbiAgICBzaW5nbGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc2VsZWN0aW9uLXNpbmdsZScsXSB9XSxcbiAgICBtdWx0aXBsZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zZWxlY3Rpb24tbXVsdGlwbGUnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG5jb25zdCBleHBvcnRlZE1vZHVsZXMgPSBbXG4gICAgQ2hpcENvbXBvbmVudCxcbiAgICBDaGlwTGlzdENvbXBvbmVudFxuXTtcbmNvbnN0IGRlY2xhcmF0aW9ucyA9IFtcbiAgICAuLi5leHBvcnRlZE1vZHVsZXNcbl07XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBDaGlwIGFuZCBDaGlwTGlzdCBjb21wb25lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiAvLyBJbXBvcnQgdGhlIENoaXAgbW9kdWxlXG4gKiBpbXBvcnQgeyBDaGlwTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItYnV0dG9ucyc7XG4gKlxuICogLy8gVGhlIGJyb3dzZXIgcGxhdGZvcm0gd2l0aCBhIGNvbXBpbGVyXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIC8vIEltcG9ydCB0aGUgYXBwIGNvbXBvbmVudFxuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiAvLyBEZWZpbmUgdGhlIGFwcCBtb2R1bGVcbiAqIF9ATmdNb2R1bGUoe1xuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sIC8vIGRlY2xhcmUgYXBwIGNvbXBvbmVudFxuICogICAgIGltcG9ydHM6ICAgICAgW0Jyb3dzZXJNb2R1bGUsIENoaXBNb2R1bGVdLCAvLyBpbXBvcnQgQ2hpcCBtb2R1bGVcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDaGlwTW9kdWxlIHtcbn1cbkNoaXBNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2RlY2xhcmF0aW9uc10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkTW9kdWxlc10sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlcyddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIEJ1dHRvbnMgY29tcG9uZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzLW5vLXJ1blxuICogLy8gSW1wb3J0IHRoZSBCdXR0b25zIG1vZHVsZVxuICogaW1wb3J0IHsgQnV0dG9uc01vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWJ1dHRvbnMnO1xuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBCdXR0b25zTW9kdWxlXSwgLy8gaW1wb3J0IEJ1dHRvbnMgbW9kdWxlXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBCdXR0b25zTW9kdWxlIHtcbn1cbkJ1dHRvbnNNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtCdXR0b25Hcm91cE1vZHVsZSwgQnV0dG9uTW9kdWxlLCBTcGxpdEJ1dHRvbk1vZHVsZSwgRHJvcERvd25CdXR0b25Nb2R1bGUsIENoaXBNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0IHsgS2VuZG9CdXR0b25TZXJ2aWNlLCBGb2N1c1NlcnZpY2UsIEZvY3VzYWJsZURpcmVjdGl2ZSwgQnV0dG9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLCBMaXN0QnV0dG9uLCBMaXN0Q29tcG9uZW50LCBMaXN0TW9kdWxlLCBUZW1wbGF0ZUNvbnRleHREaXJlY3RpdmUsIE5BVklHQVRJT05fQ09ORklHLCBOYXZpZ2F0aW9uU2VydmljZSwgQnV0dG9uRGlyZWN0aXZlLCBCdXR0b25EaXJlY3RpdmUgYXMgQnV0dG9uLCBCdXR0b25Hcm91cENvbXBvbmVudCwgQnV0dG9uR3JvdXBDb21wb25lbnQgYXMgQnV0dG9uR3JvdXAsIEJ1dHRvbkdyb3VwTW9kdWxlLCBCdXR0b25Nb2R1bGUsIEJ1dHRvbnNNb2R1bGUsIFNwbGl0QnV0dG9uQ29tcG9uZW50LCBTcGxpdEJ1dHRvbkNvbXBvbmVudCBhcyBTcGxpdEJ1dHRvbiwgU3BsaXRCdXR0b25Nb2R1bGUsIERyb3BEb3duQnV0dG9uQ29tcG9uZW50LCBEcm9wRG93bkJ1dHRvbkNvbXBvbmVudCBhcyBEcm9wRG93bkJ1dHRvbiwgRHJvcERvd25CdXR0b25Nb2R1bGUsIENoaXBDb21wb25lbnQsIENoaXBMaXN0Q29tcG9uZW50LCBDaGlwTW9kdWxlIH07XG4iXX0=","\n Global Service/Vendor Links\n\n\n \n","import { Component, OnInit, Input, ViewChild, ElementRef, HostListener } from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {faBookmark} from '@fortawesome/free-solid-svg-icons';\nimport {AuthenticationService} from '../../authentication/authentication.service';\n\n@Component({\n selector: 'app-bookmarks',\n templateUrl: './bookmarks.component.html',\n styleUrls: ['./bookmarks.component.scss']\n})\nexport class BookmarksComponent implements OnInit {\n faBookmark = faBookmark;\n RequestState = RequestState;\n @Input() displayTitles;\n\n bkMenuViable = false;\n anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n popupAlign = { horizontal: 'left', vertical: 'top' };\n collision = { horizontal: 'fit', vertical: 'fit' };\n\n @ViewChild('bkanchor') public anchor: ElementRef;\n @ViewChild('bkpopup', { read: ElementRef }) public popup: ElementRef;\n\n apiRoute = '/links/en-US-US';\n requestHandler;\n apiState;\n data = [];\n\n constructor(\n private apiService: ApiService,\n private authService: AuthenticationService\n ) { }\n\n ngOnInit(): void {\n this.authService.onAuth(() => {\n this.requestHandler = this.apiService.get(this.apiRoute);\n this.requestHandler.sendRequest(this.apiRoute, []);\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const bookmarks = JSON.parse(response.body);\n\n const links = bookmarks.globallink;\n links.sort(this.sortBookmarks);\n\n this.data = links;\n }\n });\n });\n }\n\n sortBookmarks(i, j) {\n const iValue = i.displayname.toUpperCase();\n const jValue = j.displayname.toUpperCase();\n let compare = 0;\n if (iValue > jValue) {\n compare = 1;\n } else if (iValue < jValue) {\n compare = -1;\n }\n return compare;\n }\n\n onToggle(): void {\n this.bkMenuViable = !this.bkMenuViable;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.bkMenuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if ((this.bkMenuViable && !this.contains(event.target)) || (!this.bkMenuViable && this.contains(event.target))) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n}\n","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { Directive, ElementRef, Renderer2, NgZone, Input, HostBinding, forwardRef, Component, NgModule, EventEmitter, isDevMode, ChangeDetectorRef, ContentChild, ViewChild } from '@angular/core';\nimport { isDocumentAvailable, guid, KendoInput } from '@progress/kendo-angular-common';\nimport { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';\nimport { CommonModule } from '@angular/common';\nimport { NgControl } from '@angular/forms';\nimport { Observable, Subscription } from 'rxjs';\n\n/**\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc2 from '@angular/common';\n\nvar I18N_0;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text for the optional segment of a FloatingLabel component\n * @meaning kendo.floatinglabel.optional\n */ \n const MSG_EXTERNAL_356911862062553631$$DIST_FESM2015_INDEX_JS_1 = goog.getMsg(\"Optional\");\n I18N_0 = MSG_EXTERNAL_356911862062553631$$DIST_FESM2015_INDEX_JS_1;\n}\nelse {\n I18N_0 = $localize `:kendo.floatinglabel.optional|The text for the optional segment of a FloatingLabel component␟d6b1dd6fb7530bd600b430042425d10b22163d1f␟356911862062553631:Optional`;\n}\nconst _c2 = [\"optional\", I18N_0];\nfunction FloatingLabelComponent_label_3_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 4);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r225 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\"(\", ctx_r225.textFor(\"optional\"), \")\");\n} }\nfunction FloatingLabelComponent_label_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"label\", 2);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵtemplate(2, FloatingLabelComponent_label_3_span_2_Template, 2, 1, \"span\", 3);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r224 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"for\", ctx_r224.id);\n ɵngcc0.ɵɵattribute(\"id\", ctx_r224.labelId);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r224.text, \"\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r224.optional);\n} }\nconst _c3 = [\"*\"];\nvar I18N_4;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text for the optional segment of a Label component\n * @meaning kendo.label.optional\n */ \n const MSG_EXTERNAL_3476218486854814180$$DIST_FESM2015_INDEX_JS_5 = goog.getMsg(\"Optional\");\n I18N_4 = MSG_EXTERNAL_3476218486854814180$$DIST_FESM2015_INDEX_JS_5;\n}\nelse {\n I18N_4 = $localize `:kendo.label.optional|The text for the optional segment of a Label component␟a1cd4a8f359a22151d7e73f2887fbb2967cd389a␟3476218486854814180:Optional`;\n}\nconst _c6 = [\"optional\", I18N_4];\nfunction LabelComponent_span_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 3);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r226 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\"(\", ctx_r226.textFor(\"optional\"), \")\");\n} }\nconst isUploadComponent = (component) => component.wrapper && component.wrapper.tagName === 'KENDO-UPLOAD';\n/**\n * @hidden\n */\nconst getNativeInputContent = (element) => element.querySelector('kendo-label > input, kendo-label > textarea, kendo-label > select');\n/**\n * @hidden\n */\nconst isActiveCheckboxOrRadio = (component) => component instanceof HTMLInputElement && /^(checkbox|radio)$/.test(component.type) && !component.hidden;\n/**\n * @hidden\n */\nconst isNestedOrAssociated = (component, label) => component.parentElement === label || label.hasAttribute('for');\n/**\n * @hidden\n */\nconst shouldClickComponent = (component, label) => isActiveCheckboxOrRadio(component) && !isNestedOrAssociated(component, label);\n/**\n * @hidden\n */\nconst getRootElement = (element) => {\n if (!element) {\n return null;\n }\n let rootElement = element;\n while (rootElement.parentElement) {\n rootElement = rootElement.parentElement;\n }\n return rootElement;\n};\n\n/**\n * Represents the [Kendo UI Label directive for Angular]({% slug overview_label %}).\n * The Label associates a focusable Angular component or an HTML element\n * with a `label` tag by using the `[for]` property binding.\n *\n * To associate a component by using the `label` element, either:\n * * Set the `[for]` property binding to a\n * [template reference variable]({{ site.data.urls.angular['templatesyntax'] }}#template-reference-variables--var-), or\n * * Set the `[for]` property binding to an `id` HTML string value.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n *
\n *
\n * \n * \n *
\n *\n *
\n * \n * \n *
\n *
\n * `\n * })\n * class AppComponent { }\n * ```\n */\nclass LabelDirective {\n constructor(label, renderer, zone) {\n this.label = label;\n this.renderer = renderer;\n this.zone = zone;\n this.labelClass = true;\n this.handleClick = () => {\n const component = this.getFocusableComponent();\n if (!component) {\n return;\n }\n if (isUploadComponent(component)) {\n component.fileSelect.nativeElement.click();\n }\n if (component.focus) {\n component.focus();\n }\n // https://www.w3.org/TR/html52/sec-forms.html#labelable-element\n if (shouldClickComponent(component, this.label.nativeElement)) {\n component.click();\n }\n };\n }\n get labelFor() {\n if (typeof this.for === 'string') {\n return this.for;\n }\n if (!isDocumentAvailable()) {\n return null;\n }\n const component = this.getFocusableComponent() || {};\n return component.focusableId || component.id || null;\n }\n /**\n * @hidden\n */\n ngAfterViewInit() {\n this.setAriaLabelledby();\n this.zone.runOutsideAngular(() => this.clickListener = this.renderer.listen(this.label.nativeElement, 'click', this.handleClick));\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n if (this.clickListener) {\n this.clickListener();\n }\n }\n /**\n * @hidden\n */\n setAriaLabelledby() {\n if (!isDocumentAvailable()) {\n return;\n }\n const component = this.getFocusableComponent();\n if (component && component.focusableId) {\n const rootElement = getRootElement(this.label.nativeElement);\n const labelTarget = rootElement.querySelector(`#${component.focusableId}`);\n if (!labelTarget) {\n return;\n }\n const labelElement = this.label.nativeElement;\n const id = labelElement.id || `k-${guid()}`;\n if (!labelElement.getAttribute('id')) {\n this.renderer.setAttribute(labelElement, 'id', id);\n }\n this.renderer.setAttribute(labelTarget, 'aria-labelledby', id);\n }\n }\n getFocusableComponent() {\n const target = this.for;\n return target && target.focus !== undefined ? target : null;\n }\n}\nLabelDirective.ɵfac = function LabelDirective_Factory(t) { return new (t || LabelDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nLabelDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LabelDirective, selectors: [[\"label\", \"for\", \"\"]], hostVars: 3, hostBindings: function LabelDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"for\", ctx.labelFor);\n ɵngcc0.ɵɵclassProp(\"k-label\", ctx.labelClass);\n } }, inputs: { for: \"for\" } });\n/** @nocollapse */\nLabelDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nLabelDirective.propDecorators = {\n for: [{ type: Input }],\n labelFor: [{ type: HostBinding, args: ['attr.for',] }],\n labelClass: [{ type: HostBinding, args: ['class.k-label',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LabelDirective, [{\n type: Directive,\n args: [{\n selector: 'label[for]' //tslint:disable-line:directive-selector\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { labelClass: [{\n type: HostBinding,\n args: ['class.k-label']\n }], labelFor: [{\n type: HostBinding,\n args: ['attr.for']\n }], for: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass Messages extends ComponentMessages {\n}\nMessages.ɵfac = function Messages_Factory(t) { return ɵMessages_BaseFactory(t || Messages); };\nMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages, inputs: { optional: \"optional\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages.propDecorators = {\n optional: [{ type: Input }]\n};\nconst ɵMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages);\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoLabelLocalizedMessages\", \"\"], [\"\", \"kendoFloatingLabelLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: `\n [kendoLabelLocalizedMessages],\n [kendoFloatingLabelLocalizedMessages]\n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages\n * ([see example]({% slug label_globalization %}#toc-localization)).\n */\nclass CustomMessagesComponent extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nCustomMessagesComponent.ɵfac = function CustomMessagesComponent_Factory(t) { return new (t || CustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CustomMessagesComponent, selectors: [[\"kendo-label-messages\"], [\"kendo-floatinglabel-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ],\n selector: 'kendo-label-messages, kendo-floatinglabel-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\nconst SHARED_DIRECTIVES = [\n LocalizedMessagesDirective,\n CustomMessagesComponent\n];\n/**\n * @hidden\n */\nclass SharedDirectivesModule {\n}\nSharedDirectivesModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SharedDirectivesModule });\nSharedDirectivesModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SharedDirectivesModule_Factory(t) { return new (t || SharedDirectivesModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SharedDirectivesModule, { declarations: [LocalizedMessagesDirective,\n CustomMessagesComponent], exports: [LocalizedMessagesDirective,\n CustomMessagesComponent] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SharedDirectivesModule, [{\n type: NgModule,\n args: [{\n declarations: [SHARED_DIRECTIVES],\n exports: [SHARED_DIRECTIVES]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass FloatingLabelInputAdapter {\n constructor(component, formControl) {\n this.component = component;\n const isObservableOrEventEmitter = (event) => event instanceof Observable || event instanceof EventEmitter;\n if (isObservableOrEventEmitter(component.onFocus)) {\n this.onFocus = component.onFocus;\n }\n if (isObservableOrEventEmitter(component.autoFillStart)) {\n this.autoFillStart = component.autoFillStart;\n }\n if (isObservableOrEventEmitter(component.autoFillEnd)) {\n this.autoFillEnd = component.autoFillEnd;\n }\n if (isObservableOrEventEmitter(component.onBlur)) {\n this.onBlur = component.onBlur;\n }\n if (formControl) {\n this.onValueChange = formControl.valueChanges;\n }\n else if (component.onValueChange) {\n this.onValueChange = component.onValueChange;\n }\n }\n get focusableId() {\n const component = this.component;\n if ('focusableId' in component) {\n return component.focusableId;\n }\n else if ('id' in component) {\n return component.id;\n }\n return \"\";\n }\n set focusableId(value) {\n const component = this.component;\n if ('focusableId' in component) {\n component.focusableId = value;\n }\n else if ('id' in component) {\n component.id = value;\n }\n }\n}\n\nconst isFunction = (x) => Object.prototype.toString.call(x) === '[object Function]';\n/**\n * Represents the [Kendo UI FloatingLabel component for Angular]({% slug overview_floatinglabel %}).\n * Provides floating labels to `input` elements.\n *\n * The FloatingLabel supports both Template and Reactive Forms and\n * [can contain Kendo UI for Angular Input components such as `kendo-combobox` and `kendo-numerictextbox`,\n * or HTML Input elements with the `kendoTextBox` directive applied]({% slug overview_floatinglabel %}#toc-implementing-floating-labels).\n *\n * @example\n * ```ts\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public name = 'John';\n * }\n *\n * ```\n */\nclass FloatingLabelComponent {\n constructor(elementRef, renderer, changeDetectorRef, localization) {\n this.elementRef = elementRef;\n this.renderer = renderer;\n this.changeDetectorRef = changeDetectorRef;\n this.localization = localization;\n this.hostClasses = true;\n /**\n * @hidden\n */\n this.focused = false;\n /**\n * @hidden\n */\n this.empty = true;\n /**\n * @hidden\n */\n this.invalid = false;\n /**\n * @hidden\n */\n this.labelId = `k-${guid()}`;\n this.autoFillStarted = false;\n this.direction = localization.rtl ? 'rtl' : 'ltr';\n this.renderer.removeAttribute(this.elementRef.nativeElement, \"id\");\n }\n get focusedClass() {\n return this.focused;\n }\n get invalidClass() {\n return this.invalid;\n }\n /**\n * @hidden\n */\n ngAfterContentInit() {\n this.validateSetup();\n const control = new FloatingLabelInputAdapter(this.kendoInput || this.formControl.valueAccessor, this.formControl);\n this.addHandlers(control);\n this.setLabelFor(control);\n }\n ngAfterViewInit() {\n if (this.kendoInput) {\n this.setAriaLabelledby(this.kendoInput);\n }\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n textFor(key) {\n return this.localization.get(key);\n }\n subscribe(control, eventName, handler) {\n if (control[eventName] instanceof EventEmitter) {\n const subscription = control[eventName].subscribe(handler);\n if (!this.subscription) {\n this.subscription = subscription;\n }\n else {\n this.subscription.add(subscription);\n }\n }\n }\n updateState() {\n const empty = value => {\n // zero is not an empty value (e.g., NumericTextBox)\n if (value === 0 || value === false) {\n return false;\n }\n // empty arrays are an empty value (e.g., MultiSelect)\n if (Array.isArray(value) && !value.length) {\n return true;\n }\n return !value;\n };\n const formControl = this.formControl;\n if (formControl) {\n const valueAccessor = formControl.valueAccessor;\n if (isFunction(valueAccessor.isEmpty)) {\n this.empty = valueAccessor.isEmpty();\n }\n else {\n this.empty = empty(formControl.value);\n }\n this.invalid = formControl.invalid && (formControl.touched || formControl.dirty);\n }\n else {\n this.empty = isFunction(this.kendoInput.isEmpty) ?\n this.kendoInput.isEmpty() : empty(this.kendoInput.value);\n }\n if (this.empty) {\n this.renderer.addClass(this.elementRef.nativeElement, 'k-state-empty');\n }\n else {\n this.renderer.removeClass(this.elementRef.nativeElement, 'k-state-empty');\n }\n this.changeDetectorRef.markForCheck();\n }\n setAriaLabelledby(component) {\n const componentId = component.focusableId || component.id;\n if (componentId) {\n const focusableElement = this.elementRef.nativeElement.querySelector(`#${componentId}`);\n this.renderer.setAttribute(focusableElement, 'aria-labelledby', this.labelId);\n }\n }\n setLabelFor(control) {\n const controlId = control.focusableId || control.id;\n if (this.id && controlId) {\n // input wins\n this.id = controlId;\n }\n else if (this.id) {\n control.focusableId = this.id;\n }\n else if (controlId) {\n this.id = controlId;\n }\n else {\n const id = `k-${guid()}`;\n control.focusableId = id;\n this.id = id;\n }\n }\n handleAutofill(control) {\n this.subscribe(control, 'autoFillStart', () => {\n this.autoFillStarted = true;\n this.renderer.removeClass(this.elementRef.nativeElement, 'k-state-empty');\n });\n this.subscribe(control, 'autoFillEnd', () => {\n if (this.autoFillStarted) {\n this.autoFillStarted = false;\n if (this.empty) {\n this.renderer.addClass(this.elementRef.nativeElement, 'k-state-empty');\n }\n }\n });\n }\n addHandlers(control) {\n const setFocus = (isFocused) => () => {\n this.focused = isFocused;\n this.updateState();\n };\n this.subscribe(control, 'onFocus', setFocus(true));\n this.subscribe(control, 'onBlur', setFocus(false));\n this.handleAutofill(control);\n const updateState = () => this.updateState();\n updateState();\n this.subscribe(control, 'onValueChange', updateState);\n }\n validateSetup() {\n if (!this.formControl && !this.kendoInput) {\n if (isDevMode()) {\n throw new Error(\"The FloatingLabelComponent requires a Kendo Input component\" +\n \" or a forms-bound component to function properly.\");\n }\n return;\n }\n }\n}\nFloatingLabelComponent.ɵfac = function FloatingLabelComponent_Factory(t) { return new (t || FloatingLabelComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nFloatingLabelComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FloatingLabelComponent, selectors: [[\"kendo-floatinglabel\"]], contentQueries: function FloatingLabelComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, KendoInput, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, NgControl, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.kendoInput = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.formControl = _t.first);\n } }, hostVars: 7, hostBindings: function FloatingLabelComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵclassProp(\"k-floating-label-container\", ctx.hostClasses)(\"k-state-focused\", ctx.focusedClass)(\"k-state-invalid\", ctx.invalidClass);\n } }, inputs: { id: \"id\", text: \"text\", optional: \"optional\" }, exportAs: [\"kendoFloatingLabel\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.floatinglabel'\n }\n ])], ngContentSelectors: _c3, decls: 4, vars: 1, consts: [[\"kendoFloatingLabelLocalizedMessages\", \"\", 6, \"optional\"], [\"class\", \"k-label\", 3, \"for\", 4, \"ngIf\"], [1, \"k-label\", 3, \"for\"], [\"class\", \"k-label-optional\", 4, \"ngIf\"], [1, \"k-label-optional\"]], template: function FloatingLabelComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c2);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵprojection(2);\n ɵngcc0.ɵɵtemplate(3, FloatingLabelComponent_label_3_Template, 3, 4, \"label\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.text);\n } }, directives: [LocalizedMessagesDirective, ɵngcc2.NgIf], encapsulation: 2 });\n/** @nocollapse */\nFloatingLabelComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: ChangeDetectorRef },\n { type: LocalizationService }\n];\nFloatingLabelComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-floating-label-container',] }],\n focusedClass: [{ type: HostBinding, args: ['class.k-state-focused',] }],\n invalidClass: [{ type: HostBinding, args: ['class.k-state-invalid',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n id: [{ type: Input }],\n text: [{ type: Input }],\n optional: [{ type: Input }],\n kendoInput: [{ type: ContentChild, args: [KendoInput,] }],\n formControl: [{ type: ContentChild, args: [NgControl,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FloatingLabelComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-floatinglabel',\n exportAs: 'kendoFloatingLabel',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.floatinglabel'\n }\n ],\n template: `\n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.LocalizationService }]; }, { hostClasses: [{\n type: HostBinding,\n args: ['class.k-floating-label-container']\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], focusedClass: [{\n type: HostBinding,\n args: ['class.k-state-focused']\n }], invalidClass: [{\n type: HostBinding,\n args: ['class.k-state-invalid']\n }], id: [{\n type: Input\n }], text: [{\n type: Input\n }], optional: [{\n type: Input\n }], kendoInput: [{\n type: ContentChild,\n args: [KendoInput]\n }], formControl: [{\n type: ContentChild,\n args: [NgControl]\n }] }); })();\n\nconst COMPONENT_DIRECTIVES = [FloatingLabelComponent];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the TextBox directive.\n *\n * @example\n *\n * ```ts-no-run\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, FloatingLabelModule], // import FloatingLabel module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass FloatingLabelModule {\n}\nFloatingLabelModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: FloatingLabelModule });\nFloatingLabelModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function FloatingLabelModule_Factory(t) { return new (t || FloatingLabelModule)(); }, imports: [[CommonModule, SharedDirectivesModule],\n SharedDirectivesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(FloatingLabelModule, { declarations: function () { return [FloatingLabelComponent]; }, imports: function () { return [CommonModule,\n SharedDirectivesModule]; }, exports: function () { return [FloatingLabelComponent,\n SharedDirectivesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FloatingLabelModule, [{\n type: NgModule,\n args: [{\n declarations: [...COMPONENT_DIRECTIVES],\n exports: [...COMPONENT_DIRECTIVES, SharedDirectivesModule],\n imports: [CommonModule, SharedDirectivesModule]\n }]\n }], null, null); })();\n\n/**\n * Represents the [Kendo UI Label component for Angular]({% slug label_basic %}).\n *\n * Associates a label with input elements or components.\n *\n * @example\n * ```ts\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public name = 'John';\n * }\n *\n * ```\n */\nclass LabelComponent {\n constructor(elementRef, renderer, localization) {\n this.elementRef = elementRef;\n this.renderer = renderer;\n this.localization = localization;\n this.subscriptions = new Subscription();\n this.direction = localization.rtl ? 'rtl' : 'ltr';\n this.renderer.removeAttribute(this.elementRef.nativeElement, 'id');\n }\n /**\n * @hidden\n */\n ngAfterContentInit() {\n if (this.for) {\n this.control = this.for;\n return;\n }\n const nativeInputContent = getNativeInputContent(this.elementRef.nativeElement);\n if (nativeInputContent) {\n if (!nativeInputContent.hasAttribute('id')) {\n this.renderer.setAttribute(nativeInputContent, 'id', `k-${guid()}`);\n }\n this.control = nativeInputContent;\n return;\n }\n this.control = this.kendoInput;\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => {\n this.direction = rtl ? 'rtl' : 'ltr';\n }));\n }\n /**\n * @hidden\n */\n ngAfterViewInit() {\n this.labelDirective.setAriaLabelledby();\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n textFor(key) {\n return this.localization.get(key);\n }\n}\nLabelComponent.ɵfac = function LabelComponent_Factory(t) { return new (t || LabelComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLabelComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: LabelComponent, selectors: [[\"kendo-label\"]], contentQueries: function LabelComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, KendoInput, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.kendoInput = _t.first);\n } }, viewQuery: function LabelComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(LabelDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.labelDirective = _t.first);\n } }, hostVars: 1, hostBindings: function LabelComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n } }, inputs: { text: \"text\", for: \"for\", optional: \"optional\" }, exportAs: [\"kendoLabel\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.label'\n }\n ])], ngContentSelectors: _c3, decls: 6, vars: 5, consts: [[\"kendoLabelLocalizedMessages\", \"\", 6, \"optional\"], [3, \"for\"], [\"class\", \"k-label-optional\", 4, \"ngIf\"], [1, \"k-label-optional\"]], template: function LabelComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c6);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"label\", 1);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵtemplate(4, LabelComponent_span_4_Template, 2, 1, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵprojection(5);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-label-empty\", !ctx.text);\n ɵngcc0.ɵɵproperty(\"for\", ctx.control);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.text, \"\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.optional);\n } }, directives: [LocalizedMessagesDirective,\n LabelDirective, ɵngcc2.NgIf], encapsulation: 2 });\n/** @nocollapse */\nLabelComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService }\n];\nLabelComponent.propDecorators = {\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n text: [{ type: Input }],\n for: [{ type: Input }],\n optional: [{ type: Input }],\n labelDirective: [{ type: ViewChild, args: [LabelDirective, { static: true },] }],\n kendoInput: [{ type: ContentChild, args: [KendoInput, { static: true },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LabelComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-label',\n exportAs: 'kendoLabel',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.label'\n }\n ],\n template: `\n \n \n \n {{ text }}({{textFor('optional')}})\n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }]; }, { direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], text: [{\n type: Input\n }], for: [{\n type: Input\n }], optional: [{\n type: Input\n }], labelDirective: [{\n type: ViewChild,\n args: [LabelDirective, { static: true }]\n }], kendoInput: [{\n type: ContentChild,\n args: [KendoInput, { static: true }]\n }] }); })();\n\nconst COMPONENT_DIRECTIVES$1 = [\n LabelDirective,\n LabelComponent\n];\n/**\n * The exported package module.\n *\n * The package exports:\n * - `LabelDirective`—The Label directive class.\n * - `LabelComponent`—The Label component class\n * - `FLoatingLabel`—The FloatingLabel component class.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Label module\n * import { LabelModule } from '@progress/kendo-angular-label';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, LabelModule], // import Label module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass LabelModule {\n}\nLabelModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: LabelModule });\nLabelModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function LabelModule_Factory(t) { return new (t || LabelModule)(); }, imports: [[CommonModule, SharedDirectivesModule],\n FloatingLabelModule,\n SharedDirectivesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(LabelModule, { declarations: function () { return [LabelDirective,\n LabelComponent]; }, imports: function () { return [CommonModule,\n SharedDirectivesModule]; }, exports: function () { return [LabelDirective,\n LabelComponent,\n FloatingLabelModule,\n SharedDirectivesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LabelModule, [{\n type: NgModule,\n args: [{\n imports: [CommonModule, SharedDirectivesModule],\n declarations: [...COMPONENT_DIRECTIVES$1],\n exports: [...COMPONENT_DIRECTIVES$1, FloatingLabelModule, SharedDirectivesModule]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { LocalizedMessagesDirective, Messages, SharedDirectivesModule, LabelDirective, LabelModule, FloatingLabelModule, FloatingLabelComponent, LabelComponent, CustomMessagesComponent };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzttQ0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs4SUFBQztBQUNEO0FBQ0E7QUFDQTtxRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2tEQWNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7eUpBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7MEJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29GQXdCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBEQTBCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IMKpIDIwMjAgUHJvZ3Jlc3MgU29mdHdhcmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qIExpY2Vuc2VkIHVuZGVyIGNvbW1lcmNpYWwgbGljZW5zZS4gU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE5nWm9uZSwgSW5wdXQsIEhvc3RCaW5kaW5nLCBmb3J3YXJkUmVmLCBDb21wb25lbnQsIE5nTW9kdWxlLCBFdmVudEVtaXR0ZXIsIGlzRGV2TW9kZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbnRlbnRDaGlsZCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0RvY3VtZW50QXZhaWxhYmxlLCBndWlkLCBLZW5kb0lucHV0IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudE1lc3NhZ2VzLCBMb2NhbGl6YXRpb25TZXJ2aWNlLCBMMTBOX1BSRUZJWCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWwxMG4nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNVcGxvYWRDb21wb25lbnQgPSAoY29tcG9uZW50KSA9PiBjb21wb25lbnQud3JhcHBlciAmJiBjb21wb25lbnQud3JhcHBlci50YWdOYW1lID09PSAnS0VORE8tVVBMT0FEJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBnZXROYXRpdmVJbnB1dENvbnRlbnQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdrZW5kby1sYWJlbCA+IGlucHV0LCBrZW5kby1sYWJlbCA+IHRleHRhcmVhLCBrZW5kby1sYWJlbCA+IHNlbGVjdCcpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzQWN0aXZlQ2hlY2tib3hPclJhZGlvID0gKGNvbXBvbmVudCkgPT4gY29tcG9uZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAvXihjaGVja2JveHxyYWRpbykkLy50ZXN0KGNvbXBvbmVudC50eXBlKSAmJiAhY29tcG9uZW50LmhpZGRlbjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc05lc3RlZE9yQXNzb2NpYXRlZCA9IChjb21wb25lbnQsIGxhYmVsKSA9PiBjb21wb25lbnQucGFyZW50RWxlbWVudCA9PT0gbGFiZWwgfHwgbGFiZWwuaGFzQXR0cmlidXRlKCdmb3InKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBzaG91bGRDbGlja0NvbXBvbmVudCA9IChjb21wb25lbnQsIGxhYmVsKSA9PiBpc0FjdGl2ZUNoZWNrYm94T3JSYWRpbyhjb21wb25lbnQpICYmICFpc05lc3RlZE9yQXNzb2NpYXRlZChjb21wb25lbnQsIGxhYmVsKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBnZXRSb290RWxlbWVudCA9IChlbGVtZW50KSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgcm9vdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHdoaWxlIChyb290RWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJvb3RFbGVtZW50O1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgTGFiZWwgZGlyZWN0aXZlIGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X2xhYmVsICV9KS5cbiAqIFRoZSBMYWJlbCBhc3NvY2lhdGVzIGEgZm9jdXNhYmxlIEFuZ3VsYXIgY29tcG9uZW50IG9yIGFuIEhUTUwgZWxlbWVudFxuICogd2l0aCBhIGBsYWJlbGAgdGFnIGJ5IHVzaW5nIHRoZSBgW2Zvcl1gIHByb3BlcnR5IGJpbmRpbmcuXG4gKlxuICogVG8gYXNzb2NpYXRlIGEgY29tcG9uZW50IGJ5IHVzaW5nIHRoZSBgbGFiZWxgIGVsZW1lbnQsIGVpdGhlcjpcbiAqICogU2V0IHRoZSBgW2Zvcl1gIHByb3BlcnR5IGJpbmRpbmcgdG8gYVxuICogW3RlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsndGVtcGxhdGVzeW50YXgnXSB9fSN0ZW1wbGF0ZS1yZWZlcmVuY2UtdmFyaWFibGVzLS12YXItKSwgb3JcbiAqICogU2V0IHRoZSBgW2Zvcl1gIHByb3BlcnR5IGJpbmRpbmcgdG8gYW4gYGlkYCBIVE1MIHN0cmluZyB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIF9AQ29tcG9uZW50KHtcbiAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqIHRlbXBsYXRlOiBgXG4gKiAgPGRpdiBjbGFzcz1cInJvdyBleGFtcGxlLXdyYXBwZXJcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQ1MHB4O1wiPlxuICogICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBleGFtcGxlLWNvbFwiPlxuICogICAgICA8bGFiZWwgW2Zvcl09XCJkYXRlcGlja2VyXCI+RGF0ZVBpY2tlcjogPC9sYWJlbD5cbiAqICAgICAgPGtlbmRvLWRhdGVwaWNrZXIgI2RhdGVwaWNrZXI+PC9rZW5kby1kYXRlcGlja2VyPlxuICogICAgPC9kaXY+XG4gKlxuICogICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBleGFtcGxlLWNvbFwiPlxuICogICAgICA8bGFiZWwgW2Zvcl09XCInaW5wdXQnXCI+SW5wdXQ6IDwvbGFiZWw+XG4gKiAgICAgIDxpbnB1dCBpZD1cImlucHV0XCIgLz5cbiAqICAgIDwvZGl2PlxuICogIDwvZGl2PlxuICogYFxuICogfSlcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAqIGBgYFxuICovXG5jbGFzcyBMYWJlbERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IobGFiZWwsIHJlbmRlcmVyLCB6b25lKSB7XG4gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLmxhYmVsQ2xhc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRGb2N1c2FibGVDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVXBsb2FkQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZmlsZVNlbGVjdC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUyL3NlYy1mb3Jtcy5odG1sI2xhYmVsYWJsZS1lbGVtZW50XG4gICAgICAgICAgICBpZiAoc2hvdWxkQ2xpY2tDb21wb25lbnQoY29tcG9uZW50LCB0aGlzLmxhYmVsLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBsYWJlbEZvcigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRGb2N1c2FibGVDb21wb25lbnQoKSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5mb2N1c2FibGVJZCB8fCBjb21wb25lbnQuaWQgfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRBcmlhTGFiZWxsZWRieSgpO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5jbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5sYWJlbC5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5jbGlja0xpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldEFyaWFMYWJlbGxlZGJ5KCkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZ2V0Rm9jdXNhYmxlQ29tcG9uZW50KCk7XG4gICAgICAgIGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50LmZvY3VzYWJsZUlkKSB7XG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IGdldFJvb3RFbGVtZW50KHRoaXMubGFiZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBsYWJlbFRhcmdldCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2NvbXBvbmVudC5mb2N1c2FibGVJZH1gKTtcbiAgICAgICAgICAgIGlmICghbGFiZWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsYWJlbEVsZW1lbnQgPSB0aGlzLmxhYmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGxhYmVsRWxlbWVudC5pZCB8fCBgay0ke2d1aWQoKX1gO1xuICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobGFiZWxFbGVtZW50LCAnaWQnLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShsYWJlbFRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRGb2N1c2FibGVDb21wb25lbnQoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZm9yO1xuICAgICAgICByZXR1cm4gdGFyZ2V0ICYmIHRhcmdldC5mb2N1cyAhPT0gdW5kZWZpbmVkID8gdGFyZ2V0IDogbnVsbDtcbiAgICB9XG59XG5MYWJlbERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbGFiZWxbZm9yXScgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5MYWJlbERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5MYWJlbERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBmb3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxhYmVsRm9yOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmZvcicsXSB9XSxcbiAgICBsYWJlbENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWxhYmVsJyxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBDb21wb25lbnRNZXNzYWdlcyB7XG59XG5NZXNzYWdlcy5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBvcHRpb25hbDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIE1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IGBcbiAgICAgIFtrZW5kb0xhYmVsTG9jYWxpemVkTWVzc2FnZXNdLFxuICAgICAgW2tlbmRvRmxvYXRpbmdMYWJlbExvY2FsaXplZE1lc3NhZ2VzXVxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQ3VzdG9tIGNvbXBvbmVudCBtZXNzYWdlcyBvdmVycmlkZSBkZWZhdWx0IGNvbXBvbmVudCBtZXNzYWdlc1xuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBsYWJlbF9nbG9iYWxpemF0aW9uICV9I3RvYy1sb2NhbGl6YXRpb24pKS5cbiAqL1xuY2xhc3MgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbkN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tbGFiZWwtbWVzc2FnZXMsIGtlbmRvLWZsb2F0aW5nbGFiZWwtbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DdXN0b21NZXNzYWdlc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuY29uc3QgU0hBUkVEX0RJUkVDVElWRVMgPSBbXG4gICAgTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUsXG4gICAgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnRcbl07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2hhcmVkRGlyZWN0aXZlc01vZHVsZSB7XG59XG5TaGFyZWREaXJlY3RpdmVzTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTSEFSRURfRElSRUNUSVZFU10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1NIQVJFRF9ESVJFQ1RJVkVTXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRmxvYXRpbmdMYWJlbElucHV0QWRhcHRlciB7XG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50LCBmb3JtQ29udHJvbCkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgY29uc3QgaXNPYnNlcnZhYmxlT3JFdmVudEVtaXR0ZXIgPSAoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSB8fCBldmVudCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcjtcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZU9yRXZlbnRFbWl0dGVyKGNvbXBvbmVudC5vbkZvY3VzKSkge1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzID0gY29tcG9uZW50Lm9uRm9jdXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZU9yRXZlbnRFbWl0dGVyKGNvbXBvbmVudC5hdXRvRmlsbFN0YXJ0KSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvRmlsbFN0YXJ0ID0gY29tcG9uZW50LmF1dG9GaWxsU3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZU9yRXZlbnRFbWl0dGVyKGNvbXBvbmVudC5hdXRvRmlsbEVuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0ZpbGxFbmQgPSBjb21wb25lbnQuYXV0b0ZpbGxFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZU9yRXZlbnRFbWl0dGVyKGNvbXBvbmVudC5vbkJsdXIpKSB7XG4gICAgICAgICAgICB0aGlzLm9uQmx1ciA9IGNvbXBvbmVudC5vbkJsdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UgPSBmb3JtQ29udHJvbC52YWx1ZUNoYW5nZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50Lm9uVmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSA9IGNvbXBvbmVudC5vblZhbHVlQ2hhbmdlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmb2N1c2FibGVJZCgpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG4gICAgICAgIGlmICgnZm9jdXNhYmxlSWQnIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5mb2N1c2FibGVJZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgnaWQnIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgc2V0IGZvY3VzYWJsZUlkKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50O1xuICAgICAgICBpZiAoJ2ZvY3VzYWJsZUlkJyBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5mb2N1c2FibGVJZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCdpZCcgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaWQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBGbG9hdGluZ0xhYmVsIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19mbG9hdGluZ2xhYmVsICV9KS5cbiAqIFByb3ZpZGVzIGZsb2F0aW5nIGxhYmVscyB0byBgaW5wdXRgIGVsZW1lbnRzLlxuICpcbiAqIFRoZSBGbG9hdGluZ0xhYmVsIHN1cHBvcnRzIGJvdGggVGVtcGxhdGUgYW5kIFJlYWN0aXZlIEZvcm1zIGFuZFxuICogW2NhbiBjb250YWluIEtlbmRvIFVJIGZvciBBbmd1bGFyIElucHV0IGNvbXBvbmVudHMgc3VjaCBhcyBga2VuZG8tY29tYm9ib3hgIGFuZCBga2VuZG8tbnVtZXJpY3RleHRib3hgLFxuICogb3IgSFRNTCBJbnB1dCBlbGVtZW50cyB3aXRoIHRoZSBga2VuZG9UZXh0Qm94YCBkaXJlY3RpdmUgYXBwbGllZF0oeyUgc2x1ZyBvdmVydmlld19mbG9hdGluZ2xhYmVsICV9I3RvYy1pbXBsZW1lbnRpbmctZmxvYXRpbmctbGFiZWxzKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8a2VuZG8tZmxvYXRpbmdsYWJlbCB0ZXh0PVwiRmlyc3QgbmFtZVwiPlxuICogICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibmFtZVwiIGtlbmRvVGV4dEJveCAvPlxuICogICAgIDwva2VuZG8tZmxvYXRpbmdsYWJlbD5cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIG5hbWUgPSAnSm9obic7XG4gKiB9XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIEZsb2F0aW5nTGFiZWxDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIHJlbmRlcmVyLCBjaGFuZ2VEZXRlY3RvclJlZiwgbG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZiA9IGNoYW5nZURldGVjdG9yUmVmO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3NlcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW1wdHkgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxhYmVsSWQgPSBgay0ke2d1aWQoKX1gO1xuICAgICAgICB0aGlzLmF1dG9GaWxsU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGxvY2FsaXphdGlvbi5ydGwgPyAncnRsJyA6ICdsdHInO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgXCJpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGZvY3VzZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNlZDtcbiAgICB9XG4gICAgZ2V0IGludmFsaWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVNldHVwKCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRmxvYXRpbmdMYWJlbElucHV0QWRhcHRlcih0aGlzLmtlbmRvSW5wdXQgfHwgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUFjY2Vzc29yLCB0aGlzLmZvcm1Db250cm9sKTtcbiAgICAgICAgdGhpcy5hZGRIYW5kbGVycyhjb250cm9sKTtcbiAgICAgICAgdGhpcy5zZXRMYWJlbEZvcihjb250cm9sKTtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5rZW5kb0lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLnNldEFyaWFMYWJlbGxlZGJ5KHRoaXMua2VuZG9JbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRleHRGb3Ioa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbi5nZXQoa2V5KTtcbiAgICB9XG4gICAgc3Vic2NyaWJlKGNvbnRyb2wsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgICBpZiAoY29udHJvbFtldmVudE5hbWVdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjb250cm9sW2V2ZW50TmFtZV0uc3Vic2NyaWJlKGhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5ID0gdmFsdWUgPT4ge1xuICAgICAgICAgICAgLy8gemVybyBpcyBub3QgYW4gZW1wdHkgdmFsdWUgKGUuZy4sIE51bWVyaWNUZXh0Qm94KVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVtcHR5IGFycmF5cyBhcmUgYW4gZW1wdHkgdmFsdWUgKGUuZy4sIE11bHRpU2VsZWN0KVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udHJvbDtcbiAgICAgICAgaWYgKGZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFjY2Vzc29yID0gZm9ybUNvbnRyb2wudmFsdWVBY2Nlc3NvcjtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlQWNjZXNzb3IuaXNFbXB0eSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtcHR5ID0gdmFsdWVBY2Nlc3Nvci5pc0VtcHR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtcHR5ID0gZW1wdHkoZm9ybUNvbnRyb2wudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkID0gZm9ybUNvbnRyb2wuaW52YWxpZCAmJiAoZm9ybUNvbnRyb2wudG91Y2hlZCB8fCBmb3JtQ29udHJvbC5kaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5ID0gaXNGdW5jdGlvbih0aGlzLmtlbmRvSW5wdXQuaXNFbXB0eSkgP1xuICAgICAgICAgICAgICAgIHRoaXMua2VuZG9JbnB1dC5pc0VtcHR5KCkgOiBlbXB0eSh0aGlzLmtlbmRvSW5wdXQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnay1zdGF0ZS1lbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2stc3RhdGUtZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBzZXRBcmlhTGFiZWxsZWRieShjb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBjb21wb25lbnQuZm9jdXNhYmxlSWQgfHwgY29tcG9uZW50LmlkO1xuICAgICAgICBpZiAoY29tcG9uZW50SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAjJHtjb21wb25lbnRJZH1gKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGZvY3VzYWJsZUVsZW1lbnQsICdhcmlhLWxhYmVsbGVkYnknLCB0aGlzLmxhYmVsSWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldExhYmVsRm9yKGNvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgY29udHJvbElkID0gY29udHJvbC5mb2N1c2FibGVJZCB8fCBjb250cm9sLmlkO1xuICAgICAgICBpZiAodGhpcy5pZCAmJiBjb250cm9sSWQpIHtcbiAgICAgICAgICAgIC8vIGlucHV0IHdpbnNcbiAgICAgICAgICAgIHRoaXMuaWQgPSBjb250cm9sSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pZCkge1xuICAgICAgICAgICAgY29udHJvbC5mb2N1c2FibGVJZCA9IHRoaXMuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbElkKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gY29udHJvbElkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBgay0ke2d1aWQoKX1gO1xuICAgICAgICAgICAgY29udHJvbC5mb2N1c2FibGVJZCA9IGlkO1xuICAgICAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUF1dG9maWxsKGNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoY29udHJvbCwgJ2F1dG9GaWxsU3RhcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF1dG9GaWxsU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnay1zdGF0ZS1lbXB0eScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoY29udHJvbCwgJ2F1dG9GaWxsRW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0ZpbGxTdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRmlsbFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnay1zdGF0ZS1lbXB0eScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZEhhbmRsZXJzKGNvbnRyb2wpIHtcbiAgICAgICAgY29uc3Qgc2V0Rm9jdXMgPSAoaXNGb2N1c2VkKSA9PiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBpc0ZvY3VzZWQ7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKGNvbnRyb2wsICdvbkZvY3VzJywgc2V0Rm9jdXModHJ1ZSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZShjb250cm9sLCAnb25CbHVyJywgc2V0Rm9jdXMoZmFsc2UpKTtcbiAgICAgICAgdGhpcy5oYW5kbGVBdXRvZmlsbChjb250cm9sKTtcbiAgICAgICAgY29uc3QgdXBkYXRlU3RhdGUgPSAoKSA9PiB0aGlzLnVwZGF0ZVN0YXRlKCk7XG4gICAgICAgIHVwZGF0ZVN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKGNvbnRyb2wsICdvblZhbHVlQ2hhbmdlJywgdXBkYXRlU3RhdGUpO1xuICAgIH1cbiAgICB2YWxpZGF0ZVNldHVwKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wgJiYgIXRoaXMua2VuZG9JbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIEZsb2F0aW5nTGFiZWxDb21wb25lbnQgcmVxdWlyZXMgYSBLZW5kbyBJbnB1dCBjb21wb25lbnRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIG9yIGEgZm9ybXMtYm91bmQgY29tcG9uZW50IHRvIGZ1bmN0aW9uIHByb3Blcmx5LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn1cbkZsb2F0aW5nTGFiZWxDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWZsb2F0aW5nbGFiZWwnLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9GbG9hdGluZ0xhYmVsJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLmZsb2F0aW5nbGFiZWwnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIga2VuZG9GbG9hdGluZ0xhYmVsTG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgICAgIGkxOG4tb3B0aW9uYWw9XCJrZW5kby5mbG9hdGluZ2xhYmVsLm9wdGlvbmFsfFRoZSB0ZXh0IGZvciB0aGUgb3B0aW9uYWwgc2VnbWVudCBvZiBhIEZsb2F0aW5nTGFiZWwgY29tcG9uZW50XCJcbiAgICAgICAgICAgIG9wdGlvbmFsPVwiT3B0aW9uYWxcIlxuICAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8bGFiZWwgKm5nSWY9XCJ0ZXh0XCIgW2Zvcl09XCJpZFwiIFthdHRyLmlkXT1cImxhYmVsSWRcIiBjbGFzcz1cImstbGFiZWxcIj5cbiAgICAgICAgICAgIHt7IHRleHQgfX08c3BhbiAqbmdJZj1cIm9wdGlvbmFsXCIgY2xhc3M9XCJrLWxhYmVsLW9wdGlvbmFsXCI+KHt7dGV4dEZvcignb3B0aW9uYWwnKX19KTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZsb2F0aW5nTGFiZWxDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5GbG9hdGluZ0xhYmVsQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZsb2F0aW5nLWxhYmVsLWNvbnRhaW5lcicsXSB9XSxcbiAgICBmb2N1c2VkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZm9jdXNlZCcsXSB9XSxcbiAgICBpbnZhbGlkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtaW52YWxpZCcsXSB9XSxcbiAgICBkaXJlY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0ZXh0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvcHRpb25hbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAga2VuZG9JbnB1dDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbS2VuZG9JbnB1dCxdIH1dLFxuICAgIGZvcm1Db250cm9sOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtOZ0NvbnRyb2wsXSB9XVxufTtcblxuY29uc3QgQ09NUE9ORU5UX0RJUkVDVElWRVMgPSBbRmxvYXRpbmdMYWJlbENvbXBvbmVudF07XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBUZXh0Qm94IGRpcmVjdGl2ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzLW5vLXJ1blxuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBGbG9hdGluZ0xhYmVsTW9kdWxlXSwgLy8gaW1wb3J0IEZsb2F0aW5nTGFiZWwgbW9kdWxlXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBGbG9hdGluZ0xhYmVsTW9kdWxlIHtcbn1cbkZsb2F0aW5nTGFiZWxNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWy4uLkNPTVBPTkVOVF9ESVJFQ1RJVkVTXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbLi4uQ09NUE9ORU5UX0RJUkVDVElWRVMsIFNoYXJlZERpcmVjdGl2ZXNNb2R1bGVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNoYXJlZERpcmVjdGl2ZXNNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIExhYmVsIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBsYWJlbF9iYXNpYyAlfSkuXG4gKlxuICogQXNzb2NpYXRlcyBhIGxhYmVsIHdpdGggaW5wdXQgZWxlbWVudHMgb3IgY29tcG9uZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8a2VuZG8tbGFiZWwgW2Zvcl09XCJpbnB1dFwiIHRleHQ9XCJGaXJzdCBuYW1lXCI+XG4gKiAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJuYW1lXCIga2VuZG9UZXh0Qm94ICNpbnB1dCAvPlxuICogICAgIDwva2VuZG8tbGFiZWw+XG4gKiAgIGBcbiAqIH0pXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyBuYW1lID0gJ0pvaG4nO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBMYWJlbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgcmVuZGVyZXIsIGxvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gbG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaWQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wgPSB0aGlzLmZvcjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXRpdmVJbnB1dENvbnRlbnQgPSBnZXROYXRpdmVJbnB1dENvbnRlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAobmF0aXZlSW5wdXRDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoIW5hdGl2ZUlucHV0Q29udGVudC5oYXNBdHRyaWJ1dGUoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShuYXRpdmVJbnB1dENvbnRlbnQsICdpZCcsIGBrLSR7Z3VpZCgpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gbmF0aXZlSW5wdXRDb250ZW50O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbCA9IHRoaXMua2VuZG9JbnB1dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5sYWJlbERpcmVjdGl2ZS5zZXRBcmlhTGFiZWxsZWRieSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0ZXh0Rm9yKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KGtleSk7XG4gICAgfVxufVxuTGFiZWxDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWxhYmVsJyxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvTGFiZWwnLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8ubGFiZWwnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIga2VuZG9MYWJlbExvY2FsaXplZE1lc3NhZ2VzXG4gICAgICAgICAgICBpMThuLW9wdGlvbmFsPVwia2VuZG8ubGFiZWwub3B0aW9uYWx8VGhlIHRleHQgZm9yIHRoZSBvcHRpb25hbCBzZWdtZW50IG9mIGEgTGFiZWwgY29tcG9uZW50XCJcbiAgICAgICAgICAgIG9wdGlvbmFsPVwiT3B0aW9uYWxcIlxuICAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBbZm9yXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgW2NsYXNzLmstbGFiZWwtZW1wdHldPVwiIXRleHRcIj5cbiAgICAgICAgICAgIHt7IHRleHQgfX08c3BhbiAqbmdJZj1cIm9wdGlvbmFsXCIgY2xhc3M9XCJrLWxhYmVsLW9wdGlvbmFsXCI+KHt7dGV4dEZvcignb3B0aW9uYWwnKX19KTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTGFiZWxDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkxhYmVsQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5kaXInLF0gfV0sXG4gICAgdGV4dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvcHRpb25hbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbGFiZWxEaXJlY3RpdmU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0xhYmVsRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAga2VuZG9JbnB1dDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbS2VuZG9JbnB1dCwgeyBzdGF0aWM6IHRydWUgfSxdIH1dXG59O1xuXG5jb25zdCBDT01QT05FTlRfRElSRUNUSVZFUyQxID0gW1xuICAgIExhYmVsRGlyZWN0aXZlLFxuICAgIExhYmVsQ29tcG9uZW50XG5dO1xuLyoqXG4gKiBUaGUgZXhwb3J0ZWQgcGFja2FnZSBtb2R1bGUuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYExhYmVsRGlyZWN0aXZlYCZtZGFzaDtUaGUgTGFiZWwgZGlyZWN0aXZlIGNsYXNzLlxuICogLSBgTGFiZWxDb21wb25lbnRgJm1kYXNoO1RoZSBMYWJlbCBjb21wb25lbnQgY2xhc3NcbiAqIC0gYEZMb2F0aW5nTGFiZWxgJm1kYXNoO1RoZSBGbG9hdGluZ0xhYmVsIGNvbXBvbmVudCBjbGFzcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzLW5vLXJ1blxuICogLy8gSW1wb3J0IHRoZSBMYWJlbCBtb2R1bGVcbiAqIGltcG9ydCB7IExhYmVsTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbGFiZWwnO1xuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBMYWJlbE1vZHVsZV0sIC8vIGltcG9ydCBMYWJlbCBtb2R1bGVcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICpcbiAqIC8vIENvbXBpbGUgYW5kIGxhdW5jaCB0aGUgbW9kdWxlXG4gKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIExhYmVsTW9kdWxlIHtcbn1cbkxhYmVsTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTaGFyZWREaXJlY3RpdmVzTW9kdWxlXSxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFsuLi5DT01QT05FTlRfRElSRUNUSVZFUyQxXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbLi4uQ09NUE9ORU5UX0RJUkVDVElWRVMkMSwgRmxvYXRpbmdMYWJlbE1vZHVsZSwgU2hhcmVkRGlyZWN0aXZlc01vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgeyBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgTWVzc2FnZXMsIFNoYXJlZERpcmVjdGl2ZXNNb2R1bGUsIExhYmVsRGlyZWN0aXZlLCBMYWJlbE1vZHVsZSwgRmxvYXRpbmdMYWJlbE1vZHVsZSwgRmxvYXRpbmdMYWJlbENvbXBvbmVudCwgTGFiZWxDb21wb25lbnQsIEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IH07XG4iXX0=","\n Preferences\n\n\n
Please Wait!
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
","import { Component, OnInit, Input, ViewChild, ElementRef, HostListener } from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {faCog} from '@fortawesome/free-solid-svg-icons';\nimport {PreferenceSelectionService} from '../../preferences/preference-selection.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {PreferenceApiConnectorService} from '../../preferences/preference-api-connector.service';\nimport {NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../navbar-builder.service';\n\n@Component({\n selector: 'app-preferences',\n templateUrl: './preferences.component.html',\n styleUrls: ['./preferences.component.scss']\n})\nexport class PreferencesComponent implements OnInit {\n navFilterSelection: NavFilterSelection = null;\n faCog = faCog;\n RequestState = RequestState;\n @Input() displayTitles;\n primaryDisabled = false;\n secondaryDisabled = false;\n tertiaryDisabled = false;\n\n bkMenuViable = false;\n anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n popupAlign = { horizontal: 'left', vertical: 'top' };\n collision = { horizontal: 'fit', vertical: 'fit' };\n\n @ViewChild('bkanchor') public anchor: ElementRef;\n @ViewChild('bkpopup', { read: ElementRef }) public popup: ElementRef;\n\n requestHandler;\n apiState;\n preferences;\n\n constructor(\n private apiService: ApiService,\n private refreshHandlerService: RefreshHandlerService,\n private preferenceSelectionService: PreferenceSelectionService,\n private preferenceApiConnectorService: PreferenceApiConnectorService,\n private navbarBuilderService: NavbarBuilderService\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection: NavFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n this.requestHandler = this.apiService.get('/preference');\n this.requestHandler.sendRequest('/preference');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n if (!this.preferenceSelectionService.arePreferencesLoaded()) {\n this.preferences = JSON.parse(response.body);\n this.requireOne();\n } else {\n this.preferences = this.preferenceSelectionService.getPreferences();\n }\n }\n });\n this.refreshHandlerService.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest('/preference');\n },\n this.requestHandler.getRelativeParams('/preference')\n );\n }\n\n saveSelections() {\n this.preferenceApiConnectorService.savePreferences(this.preferences);\n this.onToggle();\n // this.preferenceSelectionService.setPreferences(this.preferences);\n }\n\n showCurrency() {\n return !this.navFilterSelection.hasOwnProperty('prefCurrencyChoices') || this.navFilterSelection.prefCurrencyChoices === true;\n }\n\n toggle(type) {\n if (this.preferences[type] === 'True') {\n this.preferences[type] = 'False';\n } else {\n this.preferences[type] = 'True';\n }\n this.requireOne();\n }\n requireOne() {\n this.primaryDisabled = false;\n this.secondaryDisabled = false;\n this.tertiaryDisabled = false;\n let countChecked = 0;\n if (this.preferences.primary === 'True') {\n countChecked++;\n }\n if (this.preferences.secondary === 'True') {\n countChecked++;\n }\n if (this.preferences.tertiary === 'True') {\n countChecked++;\n }\n if (countChecked === 1) {\n if (this.preferences.primary === 'True') {\n this.primaryDisabled = true;\n }\n if (this.preferences.secondary === 'True') {\n this.secondaryDisabled = true;\n }\n if (this.preferences.tertiary === 'True') {\n this.tertiaryDisabled = true;\n }\n }\n }\n\n onToggle(): void {\n this.bkMenuViable = !this.bkMenuViable;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.bkMenuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if ((this.bkMenuViable && !this.contains(event.target)) || (!this.bkMenuViable && this.contains(event.target))) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n}\n","export enum Personas {TssAmbassador, CuaManager, Manager, Customer, CtCustomer, CtAccount, Instrument, SN, CuaAmbManager, AccountRep, CuaAmb, AmbManager, GeoLocation, Account}\r\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {AuthenticationService} from '../../authentication/authentication.service';\n\n@Component({\n selector: 'app-tss-ambassador-selector',\n templateUrl: './tss-ambassador-selector.component.html',\n styleUrls: ['./tss-ambassador-selector.component.scss']\n})\nexport class TssAmbassadorSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n userName;\n user511;\n userUPI;\n authSet = false;\n dataHasExtras = false;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n private authService: AuthenticationService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/users/tss');\n this.requestHandler.sendRequest('/users/tss');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const user of apiData.users) {\n buildData.push({\n label: user.firstname + ' ' + user.lastname,\n key: user.abbottid\n });\n }\n this.data = buildData;\n this.dataHasExtras = false;\n this.customizeData();\n }\n });\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n this.userName = userInfo.firstname + ' ' + userInfo.lastname;\n this.user511 = userInfo.abbottid;\n this.userUPI = userInfo.upi;\n this.authSet = true;\n this.customizeData();\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.TSS);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.TSS);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n customizeData() {\n if (!this.dataHasExtras && this.authSet) {\n this.data.unshift({ label: '* ' + this.userName, key: this.user511 });\n this.dataHasExtras = true;\n }\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.TSS, selectedItem, label);\n }\n}\n","\r\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-manager-selector',\n templateUrl: './manager-selector.component.html',\n styleUrls: ['./manager-selector.component.scss']\n})\nexport class ManagerSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(private apiService: ApiService, private personaService: PersonaService) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/users/manager');\n this.requestHandler.sendRequest('/users/manager');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const user of apiData.users) {\n buildData.push({\n label: user.name,\n key: user.managerid\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Manager);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Manager);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.Manager, selectedItem, label);\n }\n}\n","\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {SelectedManagerService} from '../../control_tower/selected-manager.service';\n\n@Component({\n selector: 'app-cua-manager-selector',\n templateUrl: './cua-manager-selector.component.html',\n styleUrls: ['./cua-manager-selector.component.scss']\n})\nexport class CuaManagerSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n private selectedManagerService: SelectedManagerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('cua/manager_list');\n this.requestHandler.sendRequest('cua/manager_list');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const user of apiData) {\n buildData.push({\n label: user.firstName + ' ' + user.lastName,\n key: user.mgr511,\n upi: user.mgrUpi\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.CuaManager);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.CuaManager);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.selectedManagerService.setManager(selectedItem.upi, selectedItem.key, selectedItem.label)\n this.personaService.setPersonaOption(PersonaTypes.CuaManager, selectedItem, label);\n this.selectedManagerService.setManager(selectedItem.upi, selectedItem.key, selectedItem.label)\n }\n}\n","\n","import {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-geo-location-selector',\n templateUrl: './geo-location-selector.component.html',\n styleUrls: ['./geo-location-selector.component.scss']\n})\nexport class GeoLocationSelectorComponent implements OnInit, OnDestroy {\n selectedTab = 'areas';\n selectedItem;\n requestHandler;\n\n @Input() apiConfig;\n\n apiState;\n areaData = [];\n countryData = [];\n molecularOrgData = [];\n regionData = [];\n serviceManagerData = [];\n\n // selectedArea;\n // selectedCountry;\n // selectedMolecularOrg;\n // selectedRegion;\n // selectedServiceManager;\n\n constructor(private apiService: ApiService, private personaService: PersonaService) { }\n\n ngOnInit(): void {\n let apiRoute = null;\n if (this.apiConfig === 'serviceMetrics') {\n apiRoute = '/geography_service';\n }\n if (this.apiConfig === 'ambassador') {\n apiRoute = '/geography_amb';\n }\n this.requestHandler = this.apiService.get(apiRoute);\n this.requestHandler.sendRequest(apiRoute);\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n let buildData;\n\n // areas\n buildData = [];\n if (apiData.areas) {\n for (const location of apiData.areas) {\n buildData.push({\n label: location.name,\n key: location.id\n });\n }\n }\n this.areaData = buildData;\n\n // countries\n buildData = [];\n if (apiData.countries) {\n for (const location of apiData.countries) {\n buildData.push({\n label: location.name,\n key: location.id\n });\n }\n }\n this.countryData = buildData;\n\n // molecular orgs\n buildData = [];\n if (apiData.molecularorgs) {\n for (const location of apiData.molecularorgs) {\n buildData.push({\n label: location.name,\n key: location.id\n });\n }\n }\n this.molecularOrgData = buildData;\n\n // regions\n buildData = [];\n if (apiData.regions) {\n for (const location of apiData.regions) {\n buildData.push({\n label: location.name,\n key: location.id\n });\n }\n }\n this.regionData = buildData;\n\n // service managers\n buildData = [];\n if (apiData.servicemanagers) {\n for (const location of apiData.servicemanagers) {\n buildData.push({\n label: location.name,\n key: location.id\n });\n }\n }\n this.serviceManagerData = buildData;\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.GEO);\n if (this.selectedItem !== '' && this.selectedItem !== null) {\n this.selectedTab = this.getTypeOfSelectedItem(this.selectedItem);\n }\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.GEO);\n if (this.selectedItem !== '' && this.selectedItem !== null && this.apiState === RequestState.Complete) {\n this.selectedTab = this.getTypeOfSelectedItem(this.selectedItem);\n }\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.GEO);\n if (this.selectedItem !== '' && this.selectedItem !== null) {\n this.selectedTab = this.getTypeOfSelectedItem(this.selectedItem);\n }\n });\n }\n\n getTypeOfSelectedItem(selectedItem) {\n for (const item of this.areaData) {\n if (item.key === selectedItem) {\n return 'areas';\n }\n }\n for (const item of this.countryData) {\n if (item.key === selectedItem) {\n return 'countries';\n }\n }\n for (const item of this.molecularOrgData) {\n if (item.key === selectedItem) {\n return 'molecular';\n }\n }\n for (const item of this.regionData) {\n if (item.key === selectedItem) {\n return 'regions';\n }\n }\n for (const item of this.serviceManagerData) {\n if (item.key === selectedItem) {\n return 'service';\n }\n }\n }\n\n getLabel(type, key) {\n let data = null;\n switch (type) {\n case 'areas':\n data = this.areaData;\n break;\n case 'countries':\n data = this.countryData;\n break;\n case 'molecular':\n data = this.molecularOrgData;\n break;\n case 'regions':\n data = this.regionData;\n break;\n case 'service':\n data = this.serviceManagerData;\n break;\n }\n if (data) {\n for (const item of data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n onSelectedChange(selectedTab) {\n this.selectedTab = selectedTab;\n }\n\n setSelectedItem(type, selectedItem) {\n this.selectedItem = selectedItem;\n this.selectedTab = type;\n const label = this.getLabel(type, selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.GEO, selectedItem, label);\n }\n}\n","
\n \n \n \n \n \n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {AuthenticationService} from '../../authentication/authentication.service';\n\n@Component({\n selector: 'app-manager-amb-selector',\n templateUrl: './manager-amb-selector.component.html',\n styleUrls: ['./manager-amb-selector.component.scss']\n})\nexport class ManagerAmbSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n userName;\n user511;\n userUPI;\n isAMB;\n isAMBManager;\n isSuperUser;\n authSet = false;\n dataHasExtras = false;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n private authService: AuthenticationService\n ) { }\n\n ngOnInit(): void {\n if (this.isAMBManager) {\n this.requestHandler = this.apiService.get('/users/amb_tss');\n this.requestHandler.sendRequest('/users/amb_tss');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const user of apiData.users) {\n buildData.push({\n label: user.firstname,\n key: user.abbottid,\n type: 'amb'\n });\n }\n this.data = buildData;\n this.dataHasExtras = false;\n this.customizeData();\n }\n });\n }\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n this.userName = userInfo.firstname + ' ' + userInfo.lastname;\n this.user511 = userInfo.abbottid;\n this.userUPI = userInfo.upi;\n this.isAMB = userInfo.isAMB;\n this.isAMBManager = userInfo.isAMBManager;\n this.isSuperUser = userInfo.isSuperUser;\n this.authSet = true;\n this.customizeData();\n });\n // this.data = [\n // { label: 'Manager Overview', key: '12117547', overview: true },\n // { label: 'Test Amb 1', key: 'YOUNGJX13', overview: true },\n // { label: 'Test Amb 2', key: 'COLEYAR', overview: true },\n // { label: 'Test Amb 3', key: 'CHANDSN', overview: true }\n // ];\n }\n\n customizeData() {\n /**\n * if isamb add item for non manager\n * if ismanager add item for manager overview\n */\n if (!this.dataHasExtras && this.authSet) {\n if (this.isSuperUser || !this.isAMBManager || this.isAMB) {\n this.data.unshift({ label: '* ' + this.userName, key: this.user511, type: 'authuser' });\n this.apiState = RequestState.Complete;\n }\n if (this.isAMBManager) {\n this.data.unshift({ label: 'Manager Overview', key: this.userUPI, type: 'ambmanager' });\n }\n this.dataHasExtras = true;\n }\n }\n\n ngOnDestroy(): void {\n if (this.requestHandler !== undefined) {\n this.requestHandler.cancelSubscription();\n }\n }\n\n getDataItemByKeyField(keyField) {\n for (const item of this.data) {\n if (keyField === item.key) {\n return item;\n }\n }\n return null;\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const dataItem = this.getDataItemByKeyField(selectedItem);\n if (dataItem.type === 'authuser') {\n this.personaService.setPersonaOption(PersonaTypes.ManagersSpecifcAmb, this.user511, this.userName);\n } else if (dataItem.type === 'ambmanager') {\n this.personaService.setPersonaOption(PersonaTypes.ManagerOverview, this.userUPI, this.userName);\n } else {\n this.personaService.setPersonaOption(PersonaTypes.ManagersSpecifcAmb, dataItem.key, dataItem.label);\n }\n }\n}\n","\n\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-account-rep',\n templateUrl: './account-rep.component.html',\n styleUrls: ['./account-rep.component.scss']\n})\nexport class AccountRepComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('cua/account_rep_list');\n this.requestHandler.sendRequest('cua/account_rep_list');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const user of apiData) {\n buildData.push({\n label: user.firstName + ' ' + user.lastName + ' (' + user.acctRep511 + ')',\n key: user.acctRepUpi\n });\n }\n this.data = buildData;\n }\n });\n }\n\n ngOnDestroy(): void {\n if (this.requestHandler !== undefined) {\n this.requestHandler.cancelSubscription();\n }\n }\n\n getDataItemByKeyField(keyField) {\n for (const item of this.data) {\n if (keyField === item.key) {\n return item;\n }\n }\n return null;\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const dataItem = this.getDataItemByKeyField(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.AccountRep, dataItem.key, dataItem.label);\n }\n}\n","\r\n\r\n","\n
\n
\n \n
\n
\n {{noResultsMessage}}\n
\n
\n
\n
\n

{{title}}

\n
\n
\n
\n
Loading...
\n
\n
\n
\n

{{title}}

\n
\n Please Type at least 4 characters Above to Search!\n
\n
\n
\n

{{title}}

\n
\n
\n
\n
Waiting...
\n
\n
\n
\n

{{title}}

\n
\n Request could not be called, a pre requisite failed.\n
\n
\n
\n

{{title}}

\n
\n There was an error!\n
\n
\n
","import {Component, Input, OnInit} from '@angular/core';\nimport {RequestState} from '../request-handler';\n\n@Component({\n selector: 'app-state-handler-search',\n templateUrl: './state-handler-search.component.html',\n styleUrls: ['./state-handler-search.component.scss']\n})\nexport class StateHandlerSearchComponent implements OnInit {\n RequestState = RequestState;\n @Input() requestState: RequestState;\n @Input() data;\n @Input() title;\n @Input() showTitle;\n @Input() noDataCheck: boolean = true;\n @Input() noResultsMessage = 'No Search Results Found!';\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n hasData(data) {\n if (!data) {\n return false;\n }\n if (Array.isArray(data) && data.length === 0) {\n return false;\n }\n return true;\n }\n}\n","
\n \n
\n
\n \n
\n
0\">\n
\n \n
100\" class=\"more-records-message\">\n {{totalRecordsReturned}} account1\">s listed out of {{totalRecordsFound}}.\n
Please narrow your search criteria more to view additional results.
\n
\n
\n
\n","import {Component, EventEmitter, OnInit, OnDestroy, Input, Output} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {ApiService} from '../../api/api.service';\nimport {FilterChoicesService} from '../../filter_selection/filter-choices.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-customer-select-list',\n templateUrl: './customer-select-list.component.html',\n styleUrls: ['./customer-select-list.component.scss']\n})\nexport class CustomerSelectListComponent implements OnInit, OnDestroy {\n apiRoute = 'cua/customer_search';\n requestHandler;\n RequestState = RequestState;\n state = RequestState.Waiting;\n data;\n keyField = 'key';\n displayField = 'label';\n @Input() selectedOption;\n @Output() itemSelect = new EventEmitter();\n totalRecordsFound;\n totalRecordsReturned;\n\n result = {\n data: []\n };\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n private filterChoices: FilterChoicesService,\n protected refreshHandlerService: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiRoute);\n this.requestHandler.sendRequest(this.apiRoute);\n this.requestHandler.onStateChange((state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n this.totalRecordsFound = apiData.totalRecordsFound;\n this.totalRecordsReturned = apiData.totalRecordsReturned;\n\n const buildData = [];\n for (const customer of apiData.data) {\n buildData.push({\n label: customer.customerName + ' (' + customer.customerNum + ')', // or customersrno\n key: customer.uniqueCustomerKey\n });\n }\n this.data = buildData;\n }\n });\n this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.apiRoute);\n }, this.requestHandler.getRelativeParams(this.apiRoute));\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n onValueChange(query) { // on search textbox change\n if (query.length >= 4) {\n this.filterChoices.setFilter('searchQueryCuaCustomer', query);\n }\n }\n\n onListItemSelect(key) {\n this.selectedOption = key;\n this.itemSelect.emit(this.selectedOption);\n }\n}\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-ct-customer-selector',\n templateUrl: './ct-customer-selector.component.html',\n styleUrls: ['./ct-customer-selector.component.scss']\n})\nexport class CtCustomerSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('cua/customer_search');\n this.requestHandler.sendRequest('cua/customer_search');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const customer of apiData.data) {\n buildData.push({\n label: customer.customerName, // or customersrno\n key: customer.uniqueCustomerKey\n });\n }\n this.data = buildData;\n }\n });\n this.personaService.setCustomerOverride(true);\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Customer);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Customer);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.Customer, selectedItem, label);\n this.personaService.setCustomerOverride(true);\n }\n}\n","\n","
\n \n
\n
\n \n
\n
0\">\n
\n \n
100\" class=\"more-records-message\">\n {{totalRecordsReturned}} account1\">s listed out of {{totalRecordsFound}}.\n
Please narrow your search criteria more to view additional results.
\n
\n
\n
\n","import {Component, EventEmitter, OnInit, OnDestroy, Input, Output} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {ApiService} from '../../api/api.service';\nimport {FilterChoicesService} from '../../filter_selection/filter-choices.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-account-select-list',\n templateUrl: './account-select-list.component.html',\n styleUrls: ['./account-select-list.component.scss']\n})\nexport class AccountSelectListComponent implements OnInit, OnDestroy {\n apiRoute = 'cua/account_search';\n requestHandler;\n RequestState = RequestState;\n state = RequestState.Waiting;\n data;\n keyField = 'key';\n displayField = 'label';\n @Input() selectedOption;\n @Output() itemSelect = new EventEmitter();\n totalRecordsFound;\n totalRecordsReturned;\n\n result = {\n data: []\n };\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n private filterChoices: FilterChoicesService,\n protected refreshHandlerService: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiRoute);\n this.requestHandler.sendRequest(this.apiRoute);\n this.requestHandler.onStateChange((state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n this.totalRecordsFound = apiData.totalRecordsFound;\n this.totalRecordsReturned = apiData.totalRecordsReturned;\n\n const buildData = [];\n for (const account of apiData.data) {\n buildData.push({\n label: account.acctEntityName + ' (' + account.acctEntityId + ')',\n key: account.acctEntityId\n });\n }\n this.data = buildData;\n }\n });\n this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.apiRoute);\n }, this.requestHandler.getRelativeParams(this.apiRoute));\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n onValueChange(query) { // on search textbox change\n if (query.length >= 4) {\n this.filterChoices.setFilter('searchQueryCuaAccount', query);\n }\n }\n\n onListItemSelect(key) {\n this.selectedOption = key;\n this.itemSelect.emit(this.selectedOption);\n }\n}\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-ct-account-selector',\n templateUrl: './ct-account-selector.component.html',\n styleUrls: ['./ct-account-selector.component.scss']\n})\nexport class CtAccountSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('cua/account_search');\n this.requestHandler.sendRequest('cua/account_search');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const customer of apiData.data) {\n buildData.push({\n label: customer.\n acctEntityName, // or customersrno\n key: customer.acctEntityId\n });\n }\n this.data = buildData;\n }\n });\n this.personaService.setCustomerOverride(true);\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Account);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Account);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.Account, selectedItem, label);\n this.personaService.setCustomerOverride(true);\n }\n}\n","\n","\n \n
{{menuText1}}
\n
{{menuText2}}
\n
\n \n
\n
1\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n","import { Component, OnInit, ElementRef, HostListener, ViewChild, Input, ChangeDetectorRef } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {Personas} from '../../configuration/personas';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-persona-selector',\n templateUrl: './persona-selector.component.html',\n styleUrls: ['./persona-selector.component.scss']\n})\nexport class PersonaSelectorComponent implements OnInit {\n DashboardOptions = DashboardOptions;\n Personas = Personas;\n PersonaTypes = PersonaTypes;\n navFilterSelection: NavFilterSelection;\n menuViable = false;\n selectedTab = null;\n isAMB = false;\n isAMBManager = false;\n isSuperUser = false;\n isService = false;\n\n lastSelectedDashboardTabInfo = null;\n selectedType = null;\n selectedValue = null;\n selectedLabel = null;\n menuText1 = '';\n menuText2 = '';\n\n @Input() disabled = false;\n @Input() anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n @Input() popupAlign = { horizontal: 'left', vertical: 'top' };\n\n @ViewChild('anchor') public anchor: ElementRef;\n @ViewChild('popup', { read: ElementRef }) public popup: ElementRef;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private authService: AuthenticationService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService,\n private cdRef: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n this.isAMB = userInfo.isAMB;\n this.isAMBManager = userInfo.isAMBManager;\n this.isSuperUser = userInfo.isSuperUser;\n this.updateSelections();\n });\n\n this.personaService.onPersonaChoiceUpdate(() => {\n this.updateSelections();\n });\n this.selectedTabService.onTabChange(() => {\n this.updateSelections();\n });\n this.updateSelections();\n this.isService = this.personaService.getServiceVsAmbState();\n this.onResize();\n }\n\n updateSelections() {\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n const level1Choice = this.personaService.getLevel1Choice();\n this.selectedType = level1Choice.type;\n this.selectedValue = level1Choice.value;\n this.selectedLabel = level1Choice.label;\n\n if (this.selectedType === null || this.selectedType === undefined) {\n if (this.lastSelectedDashboardTabInfo === DashboardOptions.dashboard) {\n this.menuText1 = 'Select TSS, Manager or Location';\n this.selectedType = PersonaTypes.TSS;\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.customer) {\n this.menuText1 = 'Select Location';\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.instruments) {\n this.menuText1 = 'Select Location';\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.ambassador) {\n const textPieces = [];\n if (this.isAMB) {\n textPieces.push('Ambassador');\n } else if (this.isAMBManager) {\n textPieces.push('Ambassador');\n textPieces.push('Manager');\n this.selectedType = PersonaTypes.AbbottIdAmb;\n } else if (this.isSuperUser) {\n textPieces.push('Location');\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.controltower) {\n textPieces.push('Customer');\n }\n this.menuText1 = 'Select ' + this.buildPhrase(textPieces);\n }\n this.menuText2 = '';\n } else {\n if (this.selectedType === PersonaTypes.GEO) {\n this.menuText1 = 'Location';\n } else if (this.selectedType === PersonaTypes.CuaManager) {\n this.menuText1 = 'Manager';\n } else if (this.selectedType === PersonaTypes.ManagerOverview) {\n this.menuText1 = 'Manager';\n } else if (this.selectedType === PersonaTypes.CuaAmbManager) {\n this.menuText1 = 'Ambassador /Manager';\n } else if (this.selectedType === PersonaTypes.AccountRep) {\n this.menuText1 = 'Account Rep';\n } else if (this.selectedType === PersonaTypes.CuaAmb) {\n this.menuText1 = 'Ambassador /Manager';\n } else if (this.selectedType === PersonaTypes.ManagersSpecifcAmb) {\n this.menuText1 = 'Ambassador';\n } else if (this.selectedType === PersonaTypes.Amb) {\n this.menuText1 = 'Ambassador';\n } else if (this.selectedType === PersonaTypes.Account) {\n this.menuText1 = 'Account';\n } else {\n this.menuText1 = this.selectedType;\n }\n this.menuText2 = this.selectedLabel;\n }\n if (this.selectedType === PersonaTypes.Customer) {\n this.selectedType = PersonaTypes.CtCustomer;\n }\n this.onSelectedChange(this.selectedType);\n this.cdRef.detectChanges();\n }\n\n buildPhrase(list) {\n list[list.length - 1] = 'or ' + list[list.length - 1];\n let str = list.join(', ');\n const pos = str.lastIndexOf(',');\n str = str.substring(0, pos) + str.substring(pos + 1);\n return str;\n }\n\n onToggle(): void {\n if (!this.disabled) {\n this.menuViable = !this.menuViable;\n }\n }\n\n isActiveOption(persona) {\n return this.navFilterSelection.personaOptions.includes(persona);\n }\n\n getMenuTabOptions() {\n const isService = this.personaService.getServiceVsAmbState();\n const menuTabs = [Personas.TssAmbassador, Personas.Manager, Personas.CuaManager, Personas.AccountRep];\n if (this.isAMBManager || this.isAMB || this.isSuperUser) {\n menuTabs.push(Personas.AmbManager);\n }\n if (isService || this.isSuperUser) {\n menuTabs.push(Personas.GeoLocation);\n }\n return menuTabs;\n }\n\n countActiveOptions(personas) {\n let count = 0;\n for (const persona of personas) {\n if (this.navFilterSelection.personaOptions.includes(persona)) {\n count += 1;\n }\n }\n return count;\n }\n\n onSelectedChange(selectedPersona) {\n if (\n selectedPersona === PersonaTypes.ManagersSpecifcAmb\n || selectedPersona === PersonaTypes.Amb\n ) {\n this.selectedTab = PersonaTypes.ManagerOverview;\n } else {\n this.selectedTab = selectedPersona;\n }\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if (!this.contains(event.target) && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (target.classList.contains('list-group-item')) {\n return false;\n }\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n}\n","import {Input, OnInit} from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {FilterChoicesService} from '../filter-choices.service';\n\nexport abstract class ToggleSwitchComponent implements OnInit {\n @Input() displayTitles;\n stateOn = true;\n navFilterSelection: NavFilterSelection;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n protected filterChoices: FilterChoicesService\n ) { }\n\n ngOnInit(): void {\n this.stateOn = this.defaultValue();\n if (!this.filterChoices.isFilterSet(this.filterKey())) {\n this.filterChoices.setFilter(this.filterKey(), this.stateOn);\n } else {\n this.stateOn = this.filterChoices.getFilter(this.filterKey());\n }\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n }\n\n abstract filterKey();\n abstract defaultValue();\n\n toggle() {\n this.stateOn = !this.stateOn;\n this.filterChoices.setFilter(this.filterKey(), this.stateOn);\n }\n}\n","\n \n \n \n Legacy Customer List\n \n \n Current Customer List\n \n \n","import { Component } from '@angular/core';\nimport {ToggleSwitchComponent} from '../toggle-switch.component';\n\n@Component({\n selector: 'app-customer-toggle',\n templateUrl: './customer-toggle.component.html',\n styleUrls: ['./customer-toggle.component.scss']\n})\nexport class CustomerToggleComponent extends ToggleSwitchComponent {\n filterKey() {\n return 'customerToggle';\n }\n defaultValue() {\n return false;\n }\n}\n","\n \n \n \n My Instruments for Customers\n \n \n All Instruments for Customers\n \n \n","import { Component } from '@angular/core';\nimport {ToggleSwitchComponent} from '../toggle-switch.component';\n\n@Component({\n selector: 'app-instrument-toggle',\n templateUrl: './instrument-toggle.component.html',\n styleUrls: ['./instrument-toggle.component.scss']\n})\nexport class InstrumentToggleComponent extends ToggleSwitchComponent {\n filterKey() {\n return 'instrumentToggle';\n }\n defaultValue() {\n return true;\n }\n}\n","\n \n \n \n Customers w/Track Systems\n \n \n All Customers\n \n \n","import { Component } from '@angular/core';\nimport {ToggleSwitchComponent} from '../toggle-switch.component';\n\n@Component({\n selector: 'app-track-toggle',\n templateUrl: './track-toggle.component.html',\n styleUrls: ['./track-toggle.component.scss']\n})\nexport class TrackToggleComponent extends ToggleSwitchComponent {\n filterKey() {\n return 'trackToggle';\n }\n defaultValue() {\n return false;\n }\n}\n","\n \n \n \n Flagship Instruments\n \n \n All Instruments\n \n \n","import { Component } from '@angular/core';\nimport {ToggleSwitchComponent} from '../toggle-switch.component';\n\n@Component({\n selector: 'app-flagship-toggle',\n templateUrl: './flagship-toggle.component.html',\n styleUrls: ['./flagship-toggle.component.scss']\n})\nexport class FlagshipToggleComponent extends ToggleSwitchComponent {\n filterKey() {\n return 'flagshipToggle';\n }\n defaultValue() {\n return false;\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n \n \n","import {Component, Input, OnInit} from '@angular/core';\nimport {NavbarBuilderService} from '../navbar-builder.service';\nimport {NavFilterSelection} from '../../configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-parameter-switches',\n templateUrl: './parameter-switches.component.html',\n styleUrls: ['./parameter-switches.component.scss']\n})\nexport class ParameterSwitchesComponent implements OnInit {\n navFilterSelection: NavFilterSelection;\n\n @Input() displayTitles;\n\n constructor(private navbarBuilderService: NavbarBuilderService) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n }\n}\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-customer-selector',\n templateUrl: './customer-selector.component.html',\n styleUrls: ['./customer-selector.component.scss']\n})\nexport class CustomerSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/customer/details');\n this.requestHandler.sendRequest('/customer/details');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const customer of apiData.customers) {\n buildData.push({\n label: customer.name + ' - ' + customer.customersrno, // or customersrno\n sub_label: customer.city,\n key: customer.customerid\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Customer);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Customer);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.Customer, selectedItem, label);\n }\n}\n","\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-instrument-selector',\n templateUrl: './instrument-selector.component.html',\n styleUrls: ['./instrument-selector.component.scss']\n})\nexport class InstrumentSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/productline/details');\n this.requestHandler.sendRequest('/productline/details');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const productline of apiData.productlines) {\n buildData.push({\n label: productline.productname,\n key: productline.productlineid\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.ProductLine);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.ProductLine);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.ProductLine, selectedItem, label);\n }\n}\n","\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-sn-selector',\n templateUrl: './sn-selector.component.html',\n styleUrls: ['./sn-selector.component.scss']\n})\nexport class SnSelectorComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/productline/sn');\n this.requestHandler.sendRequest('/productline/sn');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const productline of apiData.productlines) {\n buildData.push({\n label: productline.productname + ': ' + productline.sn,\n sub_label: productline.country,\n key: productline.productlineid\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.SN);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.SN);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.SN, selectedItem, label);\n }\n}\n","\n","import {Component, OnDestroy, OnInit} from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-account-selector',\n templateUrl: './account.component.html',\n styleUrls: ['./account.component.scss']\n})\nexport class AccountComponent implements OnInit, OnDestroy {\n apiState;\n data = [];\n selectedItem;\n requestHandler;\n\n constructor(\n private apiService: ApiService,\n private personaService: PersonaService,\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get('/search/accountdetails');\n this.requestHandler.sendRequest('/search/accountdetails');\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const account of apiData.accountdetails) {\n buildData.push({\n label: account.accountname,\n key: account.accountid\n });\n }\n this.data = buildData;\n }\n });\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Account);\n this.personaService.onPersonaChoiceUpdate(() => {\n this.selectedItem = this.personaService.getPersonaOption(PersonaTypes.Account);\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.personaService.setPersonaOption(PersonaTypes.Account, selectedItem, label);\n }\n}\n","\n\n","\n \n
{{menuText1}}
\n
{{menuText2}}
\n
\n \n
\n
1\">\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n\n","import { Component, OnInit, ElementRef, HostListener, ViewChild, Input } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {Personas} from '../../configuration/personas';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-persona-selector2',\n templateUrl: './persona-selector2.component.html',\n styleUrls: ['./persona-selector2.component.scss']\n})\nexport class PersonaSelector2Component implements OnInit {\n DashboardOptions = DashboardOptions;\n Personas = Personas;\n PersonaTypes = PersonaTypes;\n navFilterSelection: NavFilterSelection;\n menuViable = false;\n selectedTab = null;\n isAMB = false;\n isAMBManager = false;\n isSuperUser = false;\n\n lastSelectedDashboardTabInfo = null;\n selectedType = null;\n selectedValue = null;\n selectedLabel = null;\n menuText1 = '';\n menuText2 = '';\n\n @Input() anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n @Input() popupAlign = { horizontal: 'left', vertical: 'top' };\n\n @ViewChild('anchor') public anchor: ElementRef;\n @ViewChild('popup', { read: ElementRef }) public popup: ElementRef;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private authService: AuthenticationService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n this.isAMB = userInfo.isAMB;\n this.isAMBManager = userInfo.isAMBManager;\n this.isSuperUser = userInfo.isSuperUser;\n this.updateSelections();\n });\n\n this.personaService.onPersonaChoiceUpdate(() => {\n this.updateSelections();\n });\n this.selectedTabService.onTabChange(() => {\n this.updateSelections();\n });\n this.updateSelections();\n this.onResize();\n }\n\n updateSelections() {\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n const level2Choice = this.personaService.getLevel2Choice();\n if (level2Choice) {\n this.selectedType = level2Choice.type;\n this.selectedValue = level2Choice.value;\n this.selectedLabel = level2Choice.label;\n\n if (this.selectedType === null\n || this.selectedType === undefined\n || this.selectedValue === null\n || this.selectedValue === undefined\n || this.selectedValue === ''\n || this.selectedValue === 'all'\n ) {\n if (\n this.lastSelectedDashboardTabInfo === DashboardOptions.customer\n || this.lastSelectedDashboardTabInfo === DashboardOptions.controltower\n ) {\n this.menuText1 = 'Select Customer';\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.instruments) {\n this.menuText1 = 'Select Instrument or SN';\n this.selectedType = PersonaTypes.ProductLine;\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.ambassador) {\n this.menuText1 = 'Select Account';\n this.selectedType = PersonaTypes.Account;\n }\n this.menuText2 = '';\n } else {\n this.menuText1 = this.selectedType;\n this.menuText2 = this.selectedLabel;\n }\n this.onSelectedChange(this.selectedType);\n } else if (this.lastSelectedDashboardTabInfo === DashboardOptions.controltower) {\n this.menuText1 = 'Select Customer';\n }\n }\n\n onToggle(): void {\n this.menuViable = !this.menuViable;\n }\n\n isActiveOption(persona) {\n return this.navFilterSelection.personaOptions.includes(persona);\n }\n\n countActiveOptions(personas) {\n let count = 0;\n for (const persona of personas) {\n if (this.navFilterSelection.personaOptions.includes(persona)) {\n count += 1;\n }\n }\n return count;\n }\n\n onSelectedChange(selectedPersona) {\n this.selectedTab = selectedPersona;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if (!this.contains(event.target) && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (target.classList.contains('list-group-item')) {\n return false;\n }\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n}\n","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { EventEmitter, TemplateRef, Component, ElementRef, Input, Output, HostBinding, Optional, InjectionToken, Renderer2, ChangeDetectorRef, ContentChild, ViewChild, HostListener, Injectable, isDevMode, ComponentFactoryResolver, Inject, NgZone, Directive, Host, ViewChildren, ViewContainerRef, forwardRef, NgModule } from '@angular/core';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';\nimport { Subject, merge, Subscription, of } from 'rxjs';\nimport { filter, map, take, share, tap, switchMap, takeUntil } from 'rxjs/operators';\nimport { DraggableDirective, isChanged, isDocumentAvailable, DraggableModule } from '@progress/kendo-angular-common';\nimport { offset, scrollPosition, positionWithScroll, getDocumentElement, getWindowViewPort } from '@progress/kendo-popup-common';\nimport { Button } from '@progress/kendo-angular-buttons';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Specifies the action buttons of the Dialog\n * ([see example]({% slug actionbuttons_dialog %})).\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/common';\nimport * as ɵngcc2 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc3 from '@progress/kendo-angular-common';\n\nfunction DialogActionsComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!actions\"]);\n} }\nfunction DialogActionsComponent_ng_container_1_button_1_Template(rf, ctx) { if (rf & 1) {\n const _r122 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"button\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function DialogActionsComponent_ng_container_1_button_1_Template_button_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r122); const action_r120 = ctx.$implicit; const ctx_r121 = ɵngcc0.ɵɵnextContext(2); return ctx_r121.onButtonClick(action_r120, $event); });\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const action_r120 = ctx.$implicit;\n const ctx_r119 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r119.buttonClass(action_r120));\n ɵngcc0.ɵɵattribute(\"aria-label\", action_r120.text);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", action_r120.text, \" \");\n} }\nfunction DialogActionsComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, DialogActionsComponent_ng_container_1_button_1_Template, 2, 3, \"button\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r117 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r117.actions);\n} }\nfunction DialogActionsComponent_2_ng_template_0_Template(rf, ctx) { }\nfunction DialogActionsComponent_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DialogActionsComponent_2_ng_template_0_Template, 0, 0, \"ng-template\", 3);\n} if (rf & 2) {\n const ctx_r118 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r118.actions);\n} }\nconst _c0 = [\"*\"];\nvar I18N_1;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the close button\n * @meaning kendo.dialog.closeTitle\n */ \n const MSG_EXTERNAL_7499923323865444383$$DIST_FESM2015_INDEX_JS_2 = goog.getMsg(\"Close\");\n I18N_1 = MSG_EXTERNAL_7499923323865444383$$DIST_FESM2015_INDEX_JS_2;\n}\nelse {\n I18N_1 = $localize `:kendo.dialog.closeTitle|The title of the close button␟9b2bd34897f127e69e5f02f64692fca98a5a7572␟7499923323865444383:Close`;\n}\nconst _c3 = [\"closeTitle\", I18N_1];\nfunction DialogComponent_kendo_dialog_titlebar_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-dialog-titlebar\", 7);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r124 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"closeTitle\", ctx_r124.closeTitle)(\"id\", ctx_r124.titleId);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r124.title);\n} }\nfunction DialogComponent_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!title\"]);\n} }\nfunction DialogComponent_7_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 1, [\"*ngIf\", \"!contentTemplate\"]);\n} }\nfunction DialogComponent_8_ng_template_0_Template(rf, ctx) { }\nfunction DialogComponent_8_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DialogComponent_8_ng_template_0_Template, 0, 0, \"ng-template\", 8);\n} if (rf & 2) {\n const ctx_r127 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r127.contentTemplate);\n} }\nfunction DialogComponent_9_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 2, [\"*ngIf\", \"!actions\"]);\n} }\nfunction DialogComponent_kendo_dialog_actions_10_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-dialog-actions\", 9);\n} if (rf & 2) {\n const ctx_r129 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"actions\", ctx_r129.actions)(\"layout\", ctx_r129.actionsLayout);\n} }\nconst _c4 = [[[\"kendo-dialog-titlebar\"]], \"*\", [[\"kendo-dialog-actions\"]]];\nconst _c5 = [\"kendo-dialog-titlebar\", \"*\", \"kendo-dialog-actions\"];\nfunction WindowTitleBarComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!template\"]);\n} }\nfunction WindowTitleBarComponent_1_ng_template_0_Template(rf, ctx) { }\nconst _c6 = function (a0) { return { \"$implicit\": a0 }; };\nfunction WindowTitleBarComponent_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, WindowTitleBarComponent_1_ng_template_0_Template, 0, 0, \"ng-template\", 1);\n} if (rf & 2) {\n const ctx_r132 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r132.template)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction1(2, _c6, ctx_r132.service));\n} }\nvar I18N_7;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the close button\n * @meaning kendo.window.closeTitle\n */ \n const MSG_EXTERNAL_2849207436137160812$$DIST_FESM2015_INDEX_JS_8 = goog.getMsg(\"Close\");\n I18N_7 = MSG_EXTERNAL_2849207436137160812$$DIST_FESM2015_INDEX_JS_8;\n}\nelse {\n I18N_7 = $localize `:kendo.window.closeTitle|The title of the close button␟bb50cb526949482fc976fd868573ab283580ee69␟2849207436137160812:Close`;\n}\nvar I18N_9;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the restore button\n * @meaning kendo.window.restoreTitle\n */ \n const MSG_EXTERNAL_3443120027481340803$$DIST_FESM2015_INDEX_JS_10 = goog.getMsg(\"Restore\");\n I18N_9 = MSG_EXTERNAL_3443120027481340803$$DIST_FESM2015_INDEX_JS_10;\n}\nelse {\n I18N_9 = $localize `:kendo.window.restoreTitle|The title of the restore button␟9a9ce231f0396e40adcfa80bfa76e546e0085be0␟3443120027481340803:Restore`;\n}\nvar I18N_11;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the maximize button\n * @meaning kendo.window.maximizeTitle\n */ \n const MSG_EXTERNAL_7793415109119115257$$DIST_FESM2015_INDEX_JS_12 = goog.getMsg(\"Maximize\");\n I18N_11 = MSG_EXTERNAL_7793415109119115257$$DIST_FESM2015_INDEX_JS_12;\n}\nelse {\n I18N_11 = $localize `:kendo.window.maximizeTitle|The title of the maximize button␟42bc654ef8767c5df5277aa88941b94f8d373b4d␟7793415109119115257:Maximize`;\n}\nvar I18N_13;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the minimize button\n * @meaning kendo.window.minimizeTitle\n */ \n const MSG_EXTERNAL_7581084655285341827$$DIST_FESM2015_INDEX_JS_14 = goog.getMsg(\"Minimize\");\n I18N_13 = MSG_EXTERNAL_7581084655285341827$$DIST_FESM2015_INDEX_JS_14;\n}\nelse {\n I18N_13 = $localize `:kendo.window.minimizeTitle|The title of the minimize button␟7ca9f9b41a23760f7f74e91ee4c76d5a5f4a706c␟7581084655285341827:Minimize`;\n}\nconst _c15 = [\"closeTitle\", I18N_7, \"restoreTitle\", I18N_9, \"maximizeTitle\", I18N_11, \"minimizeTitle\", I18N_13];\nfunction WindowComponent_kendo_window_titlebar_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-window-titlebar\", 5);\n ɵngcc0.ɵɵelementStart(1, \"div\", 6);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(3, \"div\", 7);\n ɵngcc0.ɵɵelement(4, \"button\", 8);\n ɵngcc0.ɵɵelement(5, \"button\", 9);\n ɵngcc0.ɵɵelement(6, \"button\", 10);\n ɵngcc0.ɵɵelement(7, \"button\", 11);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r134 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"template\", ctx_r134.titleBarTemplate);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r134.title);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r134.minimizeButtonTitle)(\"aria-label\", ctx_r134.minimizeButtonTitle);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r134.maximizeButtonTitle)(\"aria-label\", ctx_r134.maximizeButtonTitle);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r134.restoreButtonTitle)(\"aria-label\", ctx_r134.restoreButtonTitle);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r134.closeButtonTitle)(\"aria-label\", ctx_r134.closeButtonTitle);\n} }\nfunction WindowComponent_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!showDefaultTitleBar\"]);\n} }\nfunction WindowComponent_div_5_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 1, [\"*ngIf\", \"!contentTemplate\"]);\n} }\nfunction WindowComponent_div_5_2_ng_template_0_Template(rf, ctx) { }\nfunction WindowComponent_div_5_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, WindowComponent_div_5_2_ng_template_0_Template, 0, 0, \"ng-template\", 13);\n} if (rf & 2) {\n const ctx_r139 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r139.contentTemplate);\n} }\nfunction WindowComponent_div_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 12);\n ɵngcc0.ɵɵtemplate(1, WindowComponent_div_5_1_Template, 1, 0, undefined, 2);\n ɵngcc0.ɵɵtemplate(2, WindowComponent_div_5_2_Template, 1, 1, undefined, 2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r136 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"hidden\", ctx_r136.state === \"minimized\" && ctx_r136.keepContent);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r136.contentTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r136.contentTemplate);\n} }\nfunction WindowComponent_ng_template_6_div_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"div\", 15);\n} if (rf & 2) {\n const dir_r142 = ctx.$implicit;\n ɵngcc0.ɵɵproperty(\"direction\", dir_r142);\n} }\nfunction WindowComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, WindowComponent_ng_template_6_div_0_Template, 1, 1, \"div\", 14);\n} if (rf & 2) {\n const ctx_r137 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r137.resizeDirections);\n} }\nconst _c16 = [[[\"kendo-window-titlebar\"]], \"*\"];\nconst _c17 = [\"kendo-window-titlebar\", \"*\"];\nclass DialogActionsComponent {\n constructor(el) {\n this.el = el;\n /**\n * Specifies the possible layout of the action buttons.\n */\n this.layout = 'stretched';\n /**\n * Fires when the user clicks an action button.\n */\n this.action = new EventEmitter();\n this.buttonGroupClassName = true;\n }\n get className() {\n return this.layout === 'stretched';\n }\n /**\n * @hidden\n */\n actionTemplate() {\n return this.actions instanceof TemplateRef;\n }\n /**\n * @hidden\n */\n onButtonClick(action, _e) {\n this.action.emit(action);\n }\n /**\n * @hidden\n */\n buttonClass(action) {\n const classes = ['k-button'];\n if (action.primary) {\n classes.push('k-primary');\n }\n return classes.join(' ');\n }\n}\nDialogActionsComponent.ɵfac = function DialogActionsComponent_Factory(t) { return new (t || DialogActionsComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nDialogActionsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DialogActionsComponent, selectors: [[\"kendo-dialog-actions\"]], hostVars: 4, hostBindings: function DialogActionsComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-dialog-buttongroup\", ctx.buttonGroupClassName)(\"k-dialog-button-layout-stretched\", ctx.className);\n } }, inputs: { layout: \"layout\", actions: \"actions\" }, outputs: { action: \"action\" }, ngContentSelectors: _c0, decls: 3, vars: 3, consts: [[4, \"ngIf\"], [\"type\", \"button\", 3, \"ngClass\", \"click\", 4, \"ngFor\", \"ngForOf\"], [\"type\", \"button\", 3, \"ngClass\", \"click\"], [3, \"ngTemplateOutlet\"]], template: function DialogActionsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, DialogActionsComponent_0_Template, 1, 0, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, DialogActionsComponent_ng_container_1_Template, 2, 1, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(2, DialogActionsComponent_2_Template, 1, 1, undefined, 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.actions);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.actionTemplate());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.actionTemplate());\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgForOf, ɵngcc1.NgClass, ɵngcc1.NgTemplateOutlet], encapsulation: 2 });\n/** @nocollapse */\nDialogActionsComponent.ctorParameters = () => [\n { type: ElementRef }\n];\nDialogActionsComponent.propDecorators = {\n actions: [{ type: Input }],\n layout: [{ type: Input }],\n action: [{ type: Output }],\n buttonGroupClassName: [{ type: HostBinding, args: ['class.k-dialog-buttongroup',] }],\n className: [{ type: HostBinding, args: ['class.k-dialog-button-layout-stretched',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogActionsComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-dialog-actions',\n template: `\n \n \n \n {{ action.text }}\n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }]; }, { layout: [{\n type: Input\n }], action: [{\n type: Output\n }], buttonGroupClassName: [{\n type: HostBinding,\n args: ['class.k-dialog-buttongroup']\n }], className: [{\n type: HostBinding,\n args: ['class.k-dialog-button-layout-stretched']\n }], actions: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass PreventableEvent {\n constructor() {\n this.prevented = false;\n }\n /**\n * Prevents the default action for a specified event.\n * In this way, the source component suppresses the built-in behavior that follows the event.\n */\n preventDefault() {\n this.prevented = true;\n }\n /**\n * If the event is prevented by any of its subscribers, returns `true`.\n *\n * @returns `true` if the default action was prevented. Otherwise, returns `false`.\n */\n isDefaultPrevented() {\n return this.prevented;\n }\n}\n\n/**\n * Represents the [Kendo UI DialogTitleBar component for Angular]({% slug api_dialog_dialogtitlebarcomponent %}).\n *\n * It is used as part of the Dialog content when the component is created dynamically by using an [Angular service]({% slug service_dialog %}).\n */\nclass DialogTitleBarComponent {\n constructor(hostElement, localizationService) {\n this.hostElement = hostElement;\n this.localizationService = localizationService;\n /**\n * Fires when the close button of the title-bar is clicked.\n */\n this.close = new EventEmitter();\n }\n get className() {\n return true;\n }\n get closeButtonTitle() {\n return this.localizationService.get('closeTitle');\n }\n ngAfterViewChecked() {\n const element = this.hostElement.nativeElement;\n element.setAttribute('id', this.id);\n }\n /**\n * @hidden\n */\n onCloseClick(e) {\n e.preventDefault();\n const eventArgs = new PreventableEvent();\n this.close.emit(eventArgs);\n }\n}\nDialogTitleBarComponent.ɵfac = function DialogTitleBarComponent_Factory(t) { return new (t || DialogTitleBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService, 8)); };\nDialogTitleBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DialogTitleBarComponent, selectors: [[\"kendo-dialog-titlebar\"]], hostVars: 4, hostBindings: function DialogTitleBarComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-window-titlebar\", ctx.className)(\"k-dialog-titlebar\", ctx.className);\n } }, inputs: { id: \"id\", closeTitle: \"closeTitle\" }, outputs: { close: \"close\" }, ngContentSelectors: _c0, decls: 5, vars: 2, consts: [[1, \"k-window-title\", \"k-dialog-title\"], [1, \"k-window-actions\", \"k-dialog-actions\"], [\"href\", \"#\", \"role\", \"button\", 1, \"k-button\", \"k-bare\", \"k-button-icon\", \"k-window-action\", \"k-dialog-action\", \"k-dialog-close\", 3, \"click\"], [1, \"k-icon\", \"k-i-x\"]], template: function DialogTitleBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"div\", 1);\n ɵngcc0.ɵɵelementStart(3, \"a\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function DialogTitleBarComponent_Template_a_click_3_listener($event) { return ctx.onCloseClick($event); });\n ɵngcc0.ɵɵelement(4, \"span\", 3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵattribute(\"title\", ctx.closeButtonTitle)(\"aria-label\", ctx.closeButtonTitle);\n } }, encapsulation: 2 });\n/** @nocollapse */\nDialogTitleBarComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: LocalizationService, decorators: [{ type: Optional }] }\n];\nDialogTitleBarComponent.propDecorators = {\n close: [{ type: Output }],\n id: [{ type: Input }],\n closeTitle: [{ type: Input }],\n className: [{ type: HostBinding, args: ['class.k-window-titlebar',] }, { type: HostBinding, args: ['class.k-dialog-titlebar',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogTitleBarComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-dialog-titlebar',\n template: `\n
\n \n
\n\n
\n \n \n \n
\n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc2.LocalizationService, decorators: [{\n type: Optional\n }] }]; }, { close: [{\n type: Output\n }], className: [{\n type: HostBinding,\n args: ['class.k-window-titlebar']\n }, {\n type: HostBinding,\n args: ['class.k-dialog-titlebar']\n }], id: [{\n type: Input\n }], closeTitle: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nconst isPresent = (value) => value !== null && value !== undefined;\n/**\n * @hidden\n */\nconst isTruthy = (value) => !!value;\nconst toClassList = (classNames) => String(classNames).trim().split(' ');\nconst focusableRegex = /^(?:a|input|select|textarea|button|object)$/i;\n/**\n * @hidden\n */\nvar Keys;\n(function (Keys) {\n Keys[Keys[\"esc\"] = 27] = \"esc\";\n Keys[Keys[\"tab\"] = 9] = \"tab\";\n Keys[Keys[\"enter\"] = 13] = \"enter\";\n Keys[Keys[\"space\"] = 32] = \"space\";\n Keys[Keys[\"ctrl\"] = 17] = \"ctrl\";\n Keys[Keys[\"shift\"] = 16] = \"shift\";\n Keys[Keys[\"left\"] = 37] = \"left\";\n Keys[Keys[\"up\"] = 38] = \"up\";\n Keys[Keys[\"right\"] = 39] = \"right\";\n Keys[Keys[\"down\"] = 40] = \"down\";\n})(Keys || (Keys = {}));\n/**\n * @hidden\n */\nconst DIALOG_ELEMENTS_HANDLING_ESC_KEY = 'k-dialog-wrapper k-dialog-buttongroup k-dialog-action';\n/**\n * @hidden\n */\nconst DIALOG_ELEMENTS_HANDLING_ARROWS = 'k-dialog-buttongroup';\n/**\n * @hidden\n */\nconst WINDOW_CLASSES = 'k-window';\n/**\n * @hidden\n */\nconst hasClasses = (element, classNames) => {\n const namesList = toClassList(classNames);\n return Boolean(toClassList(element.className).find((className) => namesList.indexOf(className) >= 0));\n};\n/**\n * @hidden\n */\nconst isVisible = (element) => {\n const rect = element.getBoundingClientRect();\n return !!(rect.width && rect.height) && window.getComputedStyle(element).visibility !== 'hidden';\n};\n/**\n * @hidden\n */\nconst isFocusable = (element, checkVisibility = true) => {\n if (element.tagName) {\n const tagName = element.tagName.toLowerCase();\n const tabIndex = element.getAttribute('tabIndex');\n const validTabIndex = tabIndex !== null && !isNaN(tabIndex) && tabIndex > -1;\n let focusable = false;\n if (focusableRegex.test(tagName)) {\n focusable = !element.disabled;\n }\n else {\n focusable = validTabIndex;\n }\n return focusable && (!checkVisibility || isVisible(element));\n }\n return false;\n};\n/**\n * @hidden\n */\nconst focusableSelector = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '*[tabindex]',\n '*[contenteditable]'\n].join(',');\n/**\n * @hidden\n */\nconst preventDefault = ({ originalEvent: event }) => {\n event.stopPropagation();\n event.preventDefault();\n};\n/**\n * @hidden\n */\nconst RESIZE_DIRECTIONS = ['n', 'e', 's', 'w', 'se', 'sw', 'ne', 'nw'];\n/**\n * @hidden\n */\nconst OFFSET_STYLES = ['top', 'left', 'width', 'height'];\n/**\n * @hidden\n */\nconst isString = (value) => value instanceof String || typeof value === 'string';\n/**\n * @hidden\n */\nconst isNumber = (value) => typeof value === 'number' && isFinite(value);\n/**\n * @hidden\n */\nconst createValueWithUnit = (value) => value + (isNumber(value) ? 'px' : '');\n\n/**\n * The settings for the Dialog actions when the Dialog is opened through `DialogService`\n * ([see example]({% slug api_dialog_dialogservice %}#toc-open)).\n */\nclass DialogAction {\n}\n/**\n * Indicates that the **Close** button is clicked. Used when the results from\n * the Dialogs that are opened through `DialogService` are filtered\n * ([see example]({% slug api_dialog_dialogservice %}#toc-open)).\n */\nclass DialogCloseResult {\n}\n/**\n * The settings that can be used when the Dialog is opened through `DialogService`.\n * ([see example]({% slug api_dialog_dialogservice %}#toc-open)).\n */\nclass DialogSettings {\n}\n/**\n * Holds references to the object instance and published events of the Dialog.\n * Controls the Dialogs that were opened through the `DialogService`\n * ([see example]({% slug api_dialog_dialogservice %}#toc-open)).\n */\nclass DialogRef {\n}\n\n/**\n * @hidden\n */\nconst DIALOG_LOCALIZATION_SERVICE = new InjectionToken('Dialog LocalizationService');\n\n/**\n * Represents the [Kendo UI Dialog component for Angular]({% slug overview_dialog_dialogs %}).\n */\nclass DialogComponent {\n constructor(_elRef, _renderer, localization, cdr) {\n this._elRef = _elRef;\n this._renderer = _renderer;\n this.cdr = cdr;\n /**\n * Specifies the layout of the action buttons in the Dialog.\n * This option is only applicable if the action buttons are specified through the `actions` options.\n *\n * @default 'stretched'\n */\n this.actionsLayout = 'stretched';\n /**\n * @hidden\n */\n this.titleId = null;\n /**\n * Fires when the user clicks an action button of the Dialog.\n * The event is fired only when the action buttons are specified through the `actions` options.\n */\n this.action = new EventEmitter();\n /**\n * Fires when the user clicks the **Close** button of the Dialog.\n */\n this.close = new EventEmitter();\n this.tabIndex = 0;\n this.subscriptions = [];\n this.direction = localization.rtl ? 'rtl' : 'ltr';\n this.subscriptions.push(localization.changes.subscribe(({ rtl }) => (this.direction = rtl ? 'rtl' : 'ltr')));\n this.titleId = this.generateTitleId();\n }\n get dir() {\n return this.direction;\n }\n /**\n * @hidden\n */\n onComponentKeydown(event) {\n const target = event.target;\n const parent = target.parentElement;\n if (hasClasses(target, DIALOG_ELEMENTS_HANDLING_ESC_KEY) || hasClasses(parent, DIALOG_ELEMENTS_HANDLING_ESC_KEY)) {\n if (event.keyCode === Keys.esc) {\n this.close.emit(new DialogCloseResult());\n }\n }\n if (hasClasses(target, 'k-button') &&\n hasClasses(parent, DIALOG_ELEMENTS_HANDLING_ARROWS) &&\n (event.keyCode === Keys.left || event.keyCode === Keys.right)) {\n this.handleActionButtonFocus(parent, event.keyCode);\n }\n if (event.keyCode === Keys.tab) {\n this.keepFocusWithinComponent(target, event);\n }\n }\n ngAfterContentInit() {\n this.bubble('close', this.titlebarContent);\n if (this.titlebarContent) {\n this.titlebarContent.id = this.titleId;\n }\n }\n ngAfterViewInit() {\n this.handleInitialFocus();\n this.bubble('close', this.titlebarView);\n this.bubble('action', this.actionsView);\n if (this.titlebarView || this.titlebarContent) {\n //Needed for Dialogs created via service\n this._renderer.setAttribute(this._elRef.nativeElement.querySelector('.k-dialog'), 'aria-labelledby', this.titleId);\n }\n }\n ngOnInit() {\n this._renderer.removeAttribute(this._elRef.nativeElement, 'title');\n this.cdr.detectChanges();\n }\n ngOnDestroy() {\n this.subscriptions.forEach(s => s.unsubscribe());\n this.subscriptions = [];\n }\n /**\n * Focuses the wrapper of the Dialog component.\n */\n focus() {\n const wrapper = this._elRef.nativeElement;\n if (isPresent(wrapper)) {\n wrapper.focus();\n }\n }\n /**\n * @hidden\n */\n handleInitialFocus() {\n const wrapper = this._elRef.nativeElement;\n const primaryButton = wrapper.querySelector('.k-primary');\n if (this.autoFocusedElement) {\n const initiallyFocusedElement = wrapper.querySelector(this.autoFocusedElement);\n if (initiallyFocusedElement) {\n initiallyFocusedElement.focus();\n }\n }\n else if (this.shouldFocusPrimary(primaryButton)) {\n primaryButton.focus();\n }\n else {\n wrapper.focus();\n }\n }\n /**\n * @hidden\n */\n handleActionButtonFocus(parent, key) {\n const focusableActionButtons = this.getAllFocusableChildren(parent);\n for (let i = 0; i < focusableActionButtons.length; i++) {\n const current = focusableActionButtons[i];\n if (current === document.activeElement) {\n if (key === Keys.left && i > 0) {\n focusableActionButtons[i - 1].focus();\n break;\n }\n if (key === Keys.right && i < focusableActionButtons.length - 1) {\n focusableActionButtons[i + 1].focus();\n break;\n }\n }\n }\n }\n /**\n * @hidden\n */\n keepFocusWithinComponent(target, event) {\n const firstFocusable = this._elRef.nativeElement;\n const lastFocusable = this.getLastFocusableElement(firstFocusable);\n const tabBeforeFirstFocusable = target === firstFocusable && event.shiftKey;\n const tabAfterLastFocusable = !event.shiftKey && isPresent(lastFocusable) && target === lastFocusable;\n const tabWithNoFocusable = !isPresent(lastFocusable) && !event.shiftKey;\n if (tabBeforeFirstFocusable || tabWithNoFocusable) {\n event.preventDefault();\n firstFocusable.focus();\n }\n if (tabAfterLastFocusable) {\n event.preventDefault();\n lastFocusable.focus();\n }\n }\n /**\n * @hidden\n */\n shouldFocusPrimary(el) {\n return isPresent(el) && isFocusable(el);\n }\n /**\n * @hidden\n */\n getAllFocusableChildren(parent) {\n return parent.querySelectorAll(focusableSelector);\n }\n /**\n * @hidden\n */\n getLastFocusableElement(parent) {\n const all = this.getAllFocusableChildren(parent);\n return all.length > 0 ? all[all.length - 1] : null;\n }\n /**\n * @hidden\n */\n generateTitleId() {\n return 'kendo-dialog-title-' + Math.ceil(Math.random() * 1000000).toString();\n }\n get wrapperClass() {\n return true;\n }\n get styles() {\n const styles = {};\n if (this.width) {\n styles.width = createValueWithUnit(this.width);\n }\n if (this.height) {\n styles.height = createValueWithUnit(this.height);\n }\n if (this.minWidth) {\n styles.minWidth = createValueWithUnit(this.minWidth);\n }\n if (this.maxWidth) {\n styles.maxWidth = createValueWithUnit(this.maxWidth);\n }\n if (this.minHeight) {\n styles.minHeight = createValueWithUnit(this.minHeight);\n }\n if (this.maxHeight) {\n styles.maxHeight = createValueWithUnit(this.maxHeight);\n }\n return styles;\n }\n bubble(eventName, component) {\n if (component) {\n const emit = e => this[eventName].emit(e);\n const s = component[eventName].subscribe(emit);\n this.subscriptions.push(s);\n }\n }\n}\nDialogComponent.ɵfac = function DialogComponent_Factory(t) { return new (t || DialogComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nDialogComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DialogComponent, selectors: [[\"kendo-dialog\"]], contentQueries: function DialogComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, DialogTitleBarComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.titlebarContent = _t.first);\n } }, viewQuery: function DialogComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(DialogTitleBarComponent, true);\n ɵngcc0.ɵɵviewQuery(DialogActionsComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.titlebarView = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.actionsView = _t.first);\n } }, hostVars: 4, hostBindings: function DialogComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function DialogComponent_keydown_HostBindingHandler($event) { return ctx.onComponentKeydown($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabIndex\", ctx.tabIndex)(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-dialog-wrapper\", ctx.wrapperClass);\n } }, inputs: { actionsLayout: \"actionsLayout\", actions: \"actions\", autoFocusedElement: \"autoFocusedElement\", title: \"title\", width: \"width\", minWidth: \"minWidth\", maxWidth: \"maxWidth\", height: \"height\", minHeight: \"minHeight\", maxHeight: \"maxHeight\" }, outputs: { action: \"action\", close: \"close\" }, exportAs: [\"kendoDialog\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: DIALOG_LOCALIZATION_SERVICE,\n useExisting: LocalizationService\n },\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.dialog'\n }\n ])], ngContentSelectors: _c5, decls: 11, vars: 9, consts: [[\"kendoDialogLocalizedMessages\", \"\", 6, \"closeTitle\"], [1, \"k-overlay\"], [\"role\", \"dialog\", 1, \"k-widget\", \"k-window\", \"k-dialog\", 3, \"ngStyle\"], [3, \"closeTitle\", \"id\", 4, \"ngIf\"], [4, \"ngIf\"], [1, \"k-content\", \"k-window-content\", \"k-dialog-content\"], [3, \"actions\", \"layout\", 4, \"ngIf\"], [3, \"closeTitle\", \"id\"], [3, \"ngTemplateOutlet\"], [3, \"actions\", \"layout\"]], template: function DialogComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c4);\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c3);\n ɵngcc0.ɵɵelement(2, \"div\", 1);\n ɵngcc0.ɵɵelementStart(3, \"div\", 2);\n ɵngcc0.ɵɵtemplate(4, DialogComponent_kendo_dialog_titlebar_4_Template, 2, 3, \"kendo-dialog-titlebar\", 3);\n ɵngcc0.ɵɵtemplate(5, DialogComponent_5_Template, 1, 0, undefined, 4);\n ɵngcc0.ɵɵelementStart(6, \"div\", 5);\n ɵngcc0.ɵɵtemplate(7, DialogComponent_7_Template, 1, 0, undefined, 4);\n ɵngcc0.ɵɵtemplate(8, DialogComponent_8_Template, 1, 1, undefined, 4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(9, DialogComponent_9_Template, 1, 0, undefined, 4);\n ɵngcc0.ɵɵtemplate(10, DialogComponent_kendo_dialog_actions_10_Template, 1, 2, \"kendo-dialog-actions\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"@overlayAppear\", undefined);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx.styles)(\"@dialogSlideInAppear\", undefined);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.title);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.title);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.contentTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.contentTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.actions);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.actions);\n } }, directives: function () { return [LocalizedMessagesDirective, ɵngcc1.NgStyle, ɵngcc1.NgIf, DialogTitleBarComponent, ɵngcc1.NgTemplateOutlet, DialogActionsComponent]; }, encapsulation: 2, data: { animation: [\n trigger('overlayAppear', [\n state('in', style({ opacity: 1 })),\n transition('void => *', [style({ opacity: 0.1 }), animate('.3s cubic-bezier(.2, .6, .4, 1)')])\n ]),\n trigger('dialogSlideInAppear', [\n state('in', style({ transform: 'translate(0, 0)' })),\n transition('void => *', [style({ transform: 'translate(0, -10%)' }), animate('.3s cubic-bezier(.2, 1, .2, 1)')])\n ])\n ] } });\n/** @nocollapse */\nDialogComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nDialogComponent.propDecorators = {\n actions: [{ type: Input }],\n actionsLayout: [{ type: Input }],\n autoFocusedElement: [{ type: Input }],\n title: [{ type: Input }],\n width: [{ type: Input }],\n minWidth: [{ type: Input }],\n maxWidth: [{ type: Input }],\n height: [{ type: Input }],\n minHeight: [{ type: Input }],\n maxHeight: [{ type: Input }],\n action: [{ type: Output }],\n close: [{ type: Output }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n tabIndex: [{ type: HostBinding, args: ['attr.tabIndex',] }],\n titlebarContent: [{ type: ContentChild, args: [DialogTitleBarComponent,] }],\n titlebarView: [{ type: ViewChild, args: [DialogTitleBarComponent,] }],\n actionsView: [{ type: ViewChild, args: [DialogActionsComponent,] }],\n onComponentKeydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n wrapperClass: [{ type: HostBinding, args: ['class.k-dialog-wrapper',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogComponent, [{\n type: Component,\n args: [{\n animations: [\n trigger('overlayAppear', [\n state('in', style({ opacity: 1 })),\n transition('void => *', [style({ opacity: 0.1 }), animate('.3s cubic-bezier(.2, .6, .4, 1)')])\n ]),\n trigger('dialogSlideInAppear', [\n state('in', style({ transform: 'translate(0, 0)' })),\n transition('void => *', [style({ transform: 'translate(0, -10%)' }), animate('.3s cubic-bezier(.2, 1, .2, 1)')])\n ])\n ],\n exportAs: 'kendoDialog',\n providers: [\n LocalizationService,\n {\n provide: DIALOG_LOCALIZATION_SERVICE,\n useExisting: LocalizationService\n },\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.dialog'\n }\n ],\n selector: 'kendo-dialog',\n template: `\n \n
\n\n
\n {{ title }}\n \n\n
\n \n \n
\n\n \n \n
\n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { actionsLayout: [{\n type: Input\n }], action: [{\n type: Output\n }], close: [{\n type: Output\n }], tabIndex: [{\n type: HostBinding,\n args: ['attr.tabIndex']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], onComponentKeydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], wrapperClass: [{\n type: HostBinding,\n args: ['class.k-dialog-wrapper']\n }], actions: [{\n type: Input\n }], autoFocusedElement: [{\n type: Input\n }], title: [{\n type: Input\n }], width: [{\n type: Input\n }], minWidth: [{\n type: Input\n }], maxWidth: [{\n type: Input\n }], height: [{\n type: Input\n }], minHeight: [{\n type: Input\n }], maxHeight: [{\n type: Input\n }], titlebarContent: [{\n type: ContentChild,\n args: [DialogTitleBarComponent]\n }], titlebarView: [{\n type: ViewChild,\n args: [DialogTitleBarComponent]\n }], actionsView: [{\n type: ViewChild,\n args: [DialogActionsComponent]\n }] }); })();\n\n/**\n * The base class which will be extended by a component that is provided as content through `content`\n * ([see example]({% slug service_dialog %}#toc-passing-title-content-and-actions-as-a-single-component)).\n */\nclass DialogContentBase {\n constructor(dialog) {\n this.dialog = dialog;\n }\n /**\n * @hidden\n */\n ngAfterViewInit() {\n if (this.dialogTitleBar) {\n // when opening component inside dialog with service AND the component has defined its own titlebar\n this.dialogTitleBar.close.pipe(filter((e) => !e.isDefaultPrevented())).subscribe(() => {\n this.dialog.close();\n });\n }\n if (this.dialogActions) {\n if (this.dialogActions.actions) {\n this.dialogActions.action.subscribe(action => this.dialog.dialog.instance.action.emit(action));\n }\n }\n }\n}\nDialogContentBase.ɵfac = function DialogContentBase_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nDialogContentBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DialogContentBase, viewQuery: function DialogContentBase_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(DialogTitleBarComponent, true);\n ɵngcc0.ɵɵviewQuery(DialogActionsComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dialogTitleBar = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dialogActions = _t.first);\n } } });\nDialogContentBase.propDecorators = {\n dialogTitleBar: [{ type: ViewChild, args: [DialogTitleBarComponent,] }],\n dialogActions: [{ type: ViewChild, args: [DialogActionsComponent,] }]\n};\n\n\n/**\n * @hidden\n */\nclass DialogContainerService {\n set container(container) {\n DialogContainerService.container = container;\n }\n get container() {\n return DialogContainerService.container;\n }\n}\nDialogContainerService.ɵfac = function DialogContainerService_Factory(t) { return new (t || DialogContainerService)(); };\nDialogContainerService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DialogContainerService, factory: DialogContainerService.ɵfac });\nDialogContainerService.container = null;\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogContainerService, [{\n type: Injectable\n }], null, null); })();\n\n// tslint:disable:max-line-length\nconst isNotComponent = (component) => isString(component) || component instanceof TemplateRef;\nclass DialogInjector {\n constructor(getDialogRef, parentInjector) {\n this.getDialogRef = getDialogRef;\n this.parentInjector = parentInjector;\n }\n get(token, notFoundValue) {\n if (token === DialogRef) {\n return this.getDialogRef();\n }\n return this.parentInjector.get(token, notFoundValue);\n }\n}\n/**\n * A service for opening Dialog windows dynamically\n * ([see example]({% slug service_dialog %})).\n */\nclass DialogService {\n constructor(\n /**\n * @hidden\n */\n resolver, containerService) {\n this.resolver = resolver;\n this.containerService = containerService;\n }\n /**\n * Opens a Dialog window. Requires an element in the application that uses the\n * [`kendoDialogContainer`]({% slug api_dialog_dialogcontainerdirective %}) directive.\n * Created Dialogs will be mounted in the DOM directly after that element.\n *\n * @param {DialogAction} options - The options that define the Dialog.\n * @returns {DialogRef} - A reference to the Dialog object and the convenience properties.\n *\n * @example\n *\n * ```ts-no-run\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n *
\n * `\n * })\n * export class AppComponent {\n * constructor( private dialogService: DialogService ) {}\n *\n * public open() {\n * var dialog = this.dialogService.open({\n * title: \"Please confirm\",\n * content: \"Are you sure?\",\n * actions: [\n * { text: \"No\" },\n * { text: \"Yes\", primary: true }\n * ]\n * });\n *\n * dialog.result.subscribe((result) => {\n * if (result instanceof DialogCloseResult) {\n * console.log(\"close\");\n * } else {\n * console.log(\"action\", result);\n * }\n * });\n * }\n * }\n * ```\n *\n */\n open(options) {\n const factory = this.resolver.resolveComponentFactory(DialogComponent);\n const container = options.appendTo || this.containerService.container;\n if (!container) {\n throw new Error(`\nCannot attach dialog to the page.\nAdd an element that uses the kendoDialogContainer directive, or set the 'appendTo' property.\nSee https://www.telerik.com/kendo-angular-ui/components/dialogs/dialog/service/.\n `);\n }\n // create DialogRef to (1) pass as result, (2) provide through injector\n const dialogRef = {\n close: () => {\n /* noop */\n },\n content: null,\n dialog: null,\n result: null\n };\n return this.initializeDialog(options.content, factory, container, dialogRef, options);\n }\n initializeDialog(component, factory, container, dialogRef, options) {\n const content = this.contentFrom(component, container, dialogRef);\n const dialog = container.createComponent(factory, undefined, undefined, content.nodes);\n dialogRef.dialog = dialog;\n dialog.changeDetectorRef.markForCheck();\n // copy @Input options to dialog instance\n this.applyOptions(dialog.instance, options);\n // create close handler and result stream\n const apiClose = new Subject();\n const close = (e) => {\n if (e instanceof PreventableEvent) {\n e = new DialogCloseResult();\n }\n apiClose.next(e || new DialogCloseResult());\n if (content.componentRef) {\n content.componentRef.destroy();\n }\n dialog.destroy();\n };\n const result = merge(apiClose, \n // triggered when the titlebar or actions are defined in DialogSettings\n merge(dialog.instance.close, dialog.instance.action).pipe(map(e => (e instanceof PreventableEvent ? new DialogCloseResult() : e)), filter(e => {\n if (options.preventAction) {\n // add dialogRef only when using component\n const dialogRefParameter = isNotComponent(component) ? undefined : dialogRef;\n return !options.preventAction(e, dialogRefParameter);\n }\n return true;\n }))).pipe(take(1), \n // Takes care for multiple subscriptions:\n // We subscribe internaly and the user may subscribe to get a close result - dialog.result.subscribe().\n // This causes multiple subscriptions to the same source and thus multiple emissions. share() solves that.\n share());\n result.subscribe(close);\n dialogRef.close = close;\n dialogRef.result = result;\n if (component && isDevMode()) {\n const hasContentTitle = content.nodes[0] && content.nodes[0].length > 0;\n const hasContentActions = content.nodes[2] && content.nodes[2].length > 0;\n const multipleTitles = options.title && hasContentTitle;\n const multipleActions = options.actions && hasContentActions;\n if (component.prototype instanceof DialogContentBase) {\n // content component extends DialogContentBase\n if (multipleTitles || multipleActions) {\n console.warn(`\n Multiple Title and/or Actions configurations detected.\n When using a component as content, provide the title and actions either in the component's markup\n or via the title and actions properties of the DialogSettings object, but not both.\n See https://www.telerik.com/kendo-angular-ui/components/dialogs/dialog/service/#toc-passing-title-content-and-actions-as-a-single-component'`);\n }\n }\n else {\n if (hasContentTitle || hasContentActions) {\n console.warn(`\n When Title and/or Actions markup is provided in content component's template,\n the component needs to inherit the DialogContentBase class to ensure that close and result events are properly hooked.\n See https://www.telerik.com/kendo-angular-ui/components/dialogs/dialog/service/#toc-passing-title-content-and-actions-as-a-single-component'`);\n }\n }\n }\n return dialogRef;\n }\n applyOptions(instance, options) {\n instance.title = options.title;\n instance.actions = options.actions;\n instance.actionsLayout = options.actionsLayout || 'stretched';\n instance.width = options.width;\n instance.minWidth = options.minWidth;\n instance.maxWidth = options.maxWidth;\n instance.height = options.height;\n instance.minHeight = options.minHeight;\n instance.maxHeight = options.maxHeight;\n instance.autoFocusedElement = options.autoFocusedElement;\n instance.closeTitle = options.closeTitle;\n if (options.content instanceof TemplateRef) {\n instance.contentTemplate = options.content;\n }\n }\n contentFrom(content, container, dialogRef) {\n const renderer = container.injector.get(Renderer2);\n let nodes = [];\n let titleNodes = [];\n let actionNodes = [];\n let componentRef = null;\n if (typeof content === 'string') {\n nodes = [renderer.createText(content)];\n }\n else if (content && !(content instanceof TemplateRef)) {\n // Component\n const injector = new DialogInjector(() => dialogRef, container.injector);\n const factory = this.resolver.resolveComponentFactory(content);\n componentRef = container.createComponent(factory, undefined, injector);\n titleNodes = Array.from(componentRef.location.nativeElement.querySelectorAll('kendo-dialog-titlebar'));\n nodes = [componentRef.location.nativeElement];\n actionNodes = Array.from(componentRef.location.nativeElement.querySelectorAll('kendo-dialog-actions'));\n dialogRef.content = componentRef;\n }\n return {\n componentRef,\n nodes: [\n titleNodes,\n nodes,\n actionNodes // \n ]\n };\n }\n}\nDialogService.ɵfac = function DialogService_Factory(t) { return new (t || DialogService)(ɵngcc0.ɵɵinject(ɵngcc0.ComponentFactoryResolver), ɵngcc0.ɵɵinject(DialogContainerService)); };\nDialogService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DialogService, factory: DialogService.ɵfac });\n/** @nocollapse */\nDialogService.ctorParameters = () => [\n { type: ComponentFactoryResolver },\n { type: DialogContainerService, decorators: [{ type: Inject, args: [DialogContainerService,] }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.ComponentFactoryResolver }, { type: DialogContainerService, decorators: [{\n type: Inject,\n args: [DialogContainerService]\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nlet newZIndex = 10002;\n/**\n * @hidden\n */\nconst DEFAULT_OPTIONS = {\n draggable: true,\n height: null,\n left: null,\n minHeight: 100,\n minWidth: 120,\n position: 'absolute',\n resizable: true,\n state: 'default',\n top: null,\n width: null\n};\n/**\n * @hidden\n */\nconst createMoveStream = (el, ev) => mouseDown => {\n return el.kendoDrag\n .pipe(takeUntil(el.kendoRelease.pipe(tap(() => { ev.emit(); }))), map(({ pageX, pageY }) => ({\n originalX: mouseDown.pageX,\n originalY: mouseDown.pageY,\n pageX,\n pageY\n })));\n};\n/**\n * @hidden\n */\nclass DragResizeService {\n constructor(ngZone) {\n this.ngZone = ngZone;\n this.close = new EventEmitter();\n this.focus = new EventEmitter();\n this.change = new EventEmitter();\n this.stateChange = new EventEmitter();\n this.dragStart = new EventEmitter();\n this.dragEnd = new EventEmitter();\n this.resizeStart = new EventEmitter();\n this.resizeEnd = new EventEmitter();\n this.options = Object.assign({}, DEFAULT_OPTIONS);\n this.lastAction = null;\n this.subscriptions = new Subscription();\n this.dragSubscription = new Subscription();\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n if (this.dragSubscription) {\n this.dragSubscription.unsubscribe();\n }\n }\n init(el) {\n const state$$1 = this.options.state;\n let options = this.options;\n this.window = el;\n if (state$$1 !== 'default') {\n this.restoreOptions = Object.assign({}, options);\n }\n if (state$$1 === 'minimized') {\n options.height = 0;\n options.minHeight = 0;\n }\n if (state$$1 === 'maximized') {\n options.position = 'fixed';\n }\n }\n onDrag(el) {\n this.subscriptions.add(this.ngZone.runOutsideAngular(() => {\n let startPosition;\n let dragStarted;\n this.dragSubscription = el.kendoPress\n .pipe(tap((ev) => {\n if (!ev.isTouch) {\n preventDefault(ev);\n }\n this.focus.emit();\n startPosition = this.currentPosition();\n dragStarted = false;\n }), switchMap(createMoveStream(el, this.dragEnd)))\n .subscribe(({ pageX, pageY, originalX, originalY }) => {\n if (!dragStarted) {\n this.ensureWidth();\n this.dragStart.emit();\n dragStarted = true;\n }\n this.handleDrag({\n originalX, originalY,\n pageX, pageY, startPosition\n });\n });\n }));\n }\n handleDrag({ originalX, originalY, pageX, pageY, startPosition }) {\n this.options.left = startPosition.x + pageX - originalX;\n this.options.top = startPosition.y + pageY - originalY;\n if (this.options.state === 'minimized' && isPresent(this.restoreOptions)) {\n this.restoreOptions.left = this.options.left;\n this.restoreOptions.top = this.options.top;\n }\n this.change.emit({\n left: startPosition.x + pageX - originalX,\n top: startPosition.y + pageY - originalY\n });\n }\n onResize(handle, direction) {\n this.subscriptions.add(this.ngZone.runOutsideAngular(() => {\n let startOffsetAndPosition;\n let resizeStarted = false;\n handle.kendoPress.pipe(tap((ev) => {\n preventDefault(ev);\n this.focus.emit();\n startOffsetAndPosition = this.currentOffsetAndPosition();\n resizeStarted = false;\n }), switchMap(createMoveStream(handle, this.resizeEnd)))\n .subscribe(({ pageX, pageY, originalX, originalY }) => {\n if (!resizeStarted) {\n this.resizeStart.emit(direction);\n resizeStarted = true;\n }\n let deltaX = pageX - originalX;\n let deltaY = pageY - originalY;\n this.handleResize(startOffsetAndPosition, direction, deltaX, deltaY);\n });\n }));\n }\n handleResize(initial, dir, deltaX, deltaY) {\n const old = this.options;\n let ev = {};\n if (dir.indexOf('e') >= 0) {\n const newWidth = initial.width + deltaX;\n if (newWidth !== old.width && newWidth >= old.minWidth) {\n ev.width = newWidth;\n }\n }\n if (dir.indexOf('n') >= 0) {\n const newHeight = initial.height - deltaY;\n const newTop = initial.y + deltaY;\n if (newHeight !== old.height && newHeight >= old.minHeight && newTop !== old.top) {\n ev.height = newHeight;\n ev.top = newTop;\n }\n }\n if (dir.indexOf('s') >= 0) {\n const newHeight = initial.height + deltaY;\n if (newHeight !== old.height && newHeight >= old.minHeight) {\n ev.height = newHeight;\n }\n }\n if (dir.indexOf('w') >= 0) {\n const newLeft = initial.x + deltaX;\n const newWidth = initial.width - deltaX;\n if (newWidth !== old.width && newWidth >= old.minWidth && newLeft !== old.left) {\n ev.width = newWidth;\n ev.left = newLeft;\n }\n }\n if (isPresent(ev.width) || isPresent(ev.height)) {\n OFFSET_STYLES.forEach((style$$1) => {\n if (isPresent(ev[style$$1])) {\n this.options[style$$1] = ev[style$$1];\n }\n });\n this.change.emit(ev);\n }\n }\n restoreAction() {\n this.lastAction = 'restore';\n this.defaultState();\n }\n defaultState() {\n if (isPresent(this.restoreOptions)) {\n this.options = Object.assign({}, this.restoreOptions);\n }\n this.options.state = 'default';\n this.stateChange.emit('default');\n }\n storeOptions() {\n this.restoreOptions = Object.assign({}, this.options);\n }\n maximizeAction() {\n this.lastAction = 'maximize';\n this.maximizeState();\n }\n maximizeState() {\n this.storeOptions();\n const wnd = this.windowViewPort;\n this.options = Object.assign({}, this.options, {\n height: wnd.height,\n left: 0,\n position: 'fixed',\n state: 'maximized',\n top: 0,\n width: wnd.width\n });\n this.stateChange.emit('maximized');\n }\n minimizeAction() {\n this.lastAction = 'minimize';\n this.minimizeState();\n }\n minimizeState() {\n this.storeOptions();\n this.options = Object.assign({}, this.options, {\n height: null,\n minHeight: 0,\n state: 'minimized'\n });\n this.stateChange.emit('minimized');\n }\n /**\n * Handles manual changes of the 'state' property.\n * Required to distinguish them from action clicks.\n */\n applyManualState() {\n const state$$1 = this.options.state;\n switch (state$$1) {\n case 'default':\n this.clearHeight();\n this.defaultState();\n break;\n case 'maximized':\n this.clearHeight();\n this.maximizeState();\n break;\n case 'minimized':\n this.minimizeState();\n break;\n default:\n break;\n }\n }\n closeAction() {\n this.close.emit();\n }\n ensureWidth() {\n const windowOffset = offset(this.window.nativeElement);\n if (!isPresent(this.options.width)) {\n this.options.width = windowOffset.width;\n this.change.emit({ width: windowOffset.width });\n }\n }\n clearHeight() {\n if (this.options.height === 0) {\n delete this.options.height;\n }\n if (this.options.minHeight === 0) {\n delete this.options.minHeight;\n }\n }\n center() {\n if (this.options.state === 'maximized') {\n return;\n }\n let scroll = scrollPosition(this.window.nativeElement);\n let wnd = this.windowViewPort;\n let wrapper = offset(this.window.nativeElement);\n let ev = {};\n if (!isPresent(this.options.left)) {\n this.options.left = scroll.x + Math.max(0, (wnd.width - wrapper.width) / 2);\n ev.left = this.options.left;\n }\n if (!isPresent(this.options.top)) {\n this.options.top = scroll.y + Math.max(0, (wnd.height - wrapper.height) / 2);\n ev.top = this.options.top;\n }\n this.change.emit(ev);\n }\n currentOffsetAndPosition() {\n const o = this.options;\n const off = offset(this.window.nativeElement);\n return Object.assign({}, this.currentPosition(), {\n height: o.height ? o.height : off.height,\n width: o.width ? o.width : off.width\n });\n }\n currentPosition() {\n const o = this.options;\n if (!o.top || !o.left) {\n this.setPosition();\n }\n return {\n x: this.options.left,\n y: this.options.top\n };\n }\n setPosition() {\n const wrapper = positionWithScroll(this.window.nativeElement, getDocumentElement(this.window.nativeElement));\n this.options.left = wrapper.left;\n this.options.top = wrapper.top;\n }\n setRestoreOption(style$$1, value) {\n if (isPresent(this.restoreOptions)) {\n this.restoreOptions[style$$1] = value;\n }\n }\n get nextPossibleZIndex() {\n return newZIndex;\n }\n get nextZIndex() {\n return newZIndex++;\n }\n get windowViewPort() {\n return getWindowViewPort(this.window.nativeElement);\n }\n}\nDragResizeService.ɵfac = function DragResizeService_Factory(t) { return new (t || DragResizeService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nDragResizeService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DragResizeService, factory: DragResizeService.ɵfac });\n/** @nocollapse */\nDragResizeService.ctorParameters = () => [\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DragResizeService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * @hidden\n */\nclass ResizeHandleDirective {\n constructor(draggable, el, renderer, service) {\n this.draggable = draggable;\n this.el = el;\n this.renderer = renderer;\n this.service = service;\n this.subscriptions = new Subscription();\n }\n get hostClass() {\n return true;\n }\n ngOnInit() {\n this.setDisplay();\n this.renderer.addClass(this.el.nativeElement, 'k-resize-' + this.direction);\n this.subscriptions.add(of(this.draggable).subscribe(handle => {\n this.service.onResize(handle, this.direction);\n }));\n this.subscriptions.add(this.service.resizeStart.subscribe((dir) => {\n if (dir !== this.direction) {\n this.setDisplay('none');\n }\n }));\n this.subscriptions.add(this.service.dragStart.subscribe(() => {\n this.setDisplay('none');\n }));\n this.subscriptions.add(merge(this.service.resizeEnd, this.service.dragEnd).subscribe(() => {\n this.setDisplay('block');\n }));\n this.subscriptions.add(this.service.stateChange.subscribe((state$$1) => {\n this.setDisplay(state$$1 === 'default' ? 'block' : 'none');\n }));\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n setDisplay(value = 'block') {\n this.renderer.setStyle(this.el.nativeElement, 'display', this.service.options.state === 'default' ? value : 'none');\n }\n}\nResizeHandleDirective.ɵfac = function ResizeHandleDirective_Factory(t) { return new (t || ResizeHandleDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc3.DraggableDirective, 1), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService)); };\nResizeHandleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ResizeHandleDirective, selectors: [[\"\", \"kendoWindowResizeHandle\", \"\"]], hostVars: 2, hostBindings: function ResizeHandleDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-resize-handle\", ctx.hostClass);\n } }, inputs: { direction: \"direction\" } });\n/** @nocollapse */\nResizeHandleDirective.ctorParameters = () => [\n { type: DraggableDirective, decorators: [{ type: Host }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService }\n];\nResizeHandleDirective.propDecorators = {\n direction: [{ type: Input }],\n hostClass: [{ type: HostBinding, args: ['class.k-resize-handle',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ResizeHandleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoWindowResizeHandle]'\n }]\n }], function () { return [{ type: ɵngcc3.DraggableDirective, decorators: [{\n type: Host\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService }]; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-resize-handle']\n }], direction: [{\n type: Input\n }] }); })();\n\nclass WindowTitleBarComponent {\n constructor(el, service, ngZone) {\n this.el = el;\n this.ngZone = ngZone;\n this.service = service;\n }\n ngOnInit() {\n this.dragDirective = new DraggableDirective(this.el, this.ngZone);\n this.dragDirective.ngOnInit();\n if (this.isDraggable) {\n this.subscribeDrag();\n }\n this.subscribeStateChange();\n }\n ngOnDestroy() {\n this.dragDirective.ngOnDestroy();\n this.unsubscribeDrag();\n this.unsubscribeState();\n }\n /**\n * @hidden\n */\n subscribeDrag() {\n this.unsubscribeDrag();\n this.dragSubscription = of(this.dragDirective).subscribe(titleBar => {\n this.service.onDrag(titleBar);\n });\n }\n /**\n * @hidden\n */\n subscribeStateChange() {\n this.stateSubscription = this.service.stateChange.subscribe((state$$1) => {\n if (this.service.options.draggable) {\n if (state$$1 === 'maximized') {\n this.unsubscribeDrag();\n }\n else {\n this.subscribeDrag();\n }\n }\n });\n }\n /**\n * @hidden\n */\n unsubscribeDrag() {\n if (this.dragSubscription) {\n this.service.dragSubscription.unsubscribe();\n this.dragSubscription.unsubscribe();\n this.dragSubscription = null;\n }\n }\n /**\n * @hidden\n */\n unsubscribeState() {\n if (this.stateSubscription) {\n this.stateSubscription.unsubscribe();\n this.stateSubscription = null;\n }\n }\n get className() {\n return true;\n }\n get touchAction() {\n if (this.isDraggable) {\n return 'none';\n }\n }\n /**\n * @hidden\n */\n handle(ev) {\n const target = ev.target;\n const state$$1 = this.service.options.state;\n if (!hasClasses(target, 'k-icon') && !isFocusable(target, false) && this.service.options.resizable) {\n if (state$$1 === 'default') {\n this.service.maximizeAction();\n }\n else if (state$$1 === 'maximized') {\n this.service.restoreAction();\n }\n }\n }\n get isDraggable() {\n const options = this.service.options;\n return options.draggable && options.state !== 'maximized';\n }\n}\nWindowTitleBarComponent.ɵfac = function WindowTitleBarComponent_Factory(t) { return new (t || WindowTitleBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(DragResizeService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nWindowTitleBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: WindowTitleBarComponent, selectors: [[\"kendo-window-titlebar\"]], hostVars: 6, hostBindings: function WindowTitleBarComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"dblclick\", function WindowTitleBarComponent_dblclick_HostBindingHandler($event) { return ctx.handle($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"touch-action\", ctx.touchAction);\n ɵngcc0.ɵɵclassProp(\"k-window-titlebar\", ctx.className)(\"k-dialog-titlebar\", ctx.className);\n } }, inputs: { template: \"template\" }, ngContentSelectors: _c0, decls: 2, vars: 2, consts: [[4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function WindowTitleBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, WindowTitleBarComponent_0_Template, 1, 0, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, WindowTitleBarComponent_1_Template, 1, 4, undefined, 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.template);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.template);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgTemplateOutlet], encapsulation: 2 });\n/** @nocollapse */\nWindowTitleBarComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: DragResizeService },\n { type: NgZone }\n];\nWindowTitleBarComponent.propDecorators = {\n template: [{ type: Input }],\n className: [{ type: HostBinding, args: ['class.k-window-titlebar',] }, { type: HostBinding, args: ['class.k-dialog-titlebar',] }],\n touchAction: [{ type: HostBinding, args: ['style.touch-action',] }],\n handle: [{ type: HostListener, args: ['dblclick', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowTitleBarComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-window-titlebar',\n template: `\n \n \n
\n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: DragResizeService }, { type: ɵngcc0.NgZone }]; }, { className: [{\n type: HostBinding,\n args: ['class.k-window-titlebar']\n }, {\n type: HostBinding,\n args: ['class.k-dialog-titlebar']\n }], touchAction: [{\n type: HostBinding,\n args: ['style.touch-action']\n }], handle: [{\n type: HostListener,\n args: ['dblclick', ['$event']]\n }], template: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass NavigationService {\n constructor(window) {\n this.window = window;\n }\n process(ev) {\n const key = ev.keyCode;\n switch (key) {\n case Keys.up:\n case Keys.down:\n case Keys.left:\n case Keys.right: {\n ev.preventDefault();\n this.handleArrow(key, ev);\n break;\n }\n case Keys.esc:\n this.handleEscape();\n break;\n default:\n break;\n }\n }\n handleArrow(key, ev) {\n const options = this.window.options;\n if (ev.altKey) {\n this.handleStateChange(key, options.state);\n return;\n }\n if ((ev.ctrlKey || ev.metaKey) && options.state === 'default') {\n this.handleResize(key);\n }\n else {\n this.handleDrag(key);\n }\n }\n handleEscape() {\n this.window.closeAction();\n }\n handleDrag(key) {\n let options = this.window.options;\n if (!options.draggable) {\n return;\n }\n const offset$$1 = this.window.currentOffsetAndPosition();\n let restoreOptions = this.window.restoreOptions;\n let ev = {};\n let delta = 10;\n if (key === Keys.left || key === Keys.up) {\n delta *= -1;\n }\n switch (key) {\n case Keys.left:\n case Keys.right: {\n ev.left = offset$$1.x + delta;\n options.left = ev.left;\n break;\n }\n case Keys.up:\n case Keys.down: {\n ev.top = offset$$1.y + delta;\n options.top = ev.top;\n break;\n }\n default:\n break;\n }\n if (options.state === 'minimized' && isPresent(restoreOptions)) {\n restoreOptions.left = options.left;\n restoreOptions.top = options.top;\n }\n this.window.change.emit(ev);\n }\n handleResize(key) {\n const options = this.window.options;\n if (!options.resizable) {\n return;\n }\n const offset$$1 = this.window.currentOffsetAndPosition();\n let newWidth;\n let newHeight;\n let ev = {};\n let delta = 10;\n if (key === Keys.left || key === Keys.up) {\n delta *= -1;\n }\n switch (key) {\n case Keys.left:\n case Keys.right: {\n newWidth = offset$$1.width + delta;\n if (newWidth !== options.width && newWidth >= options.minWidth) {\n ev.width = newWidth;\n }\n break;\n }\n case Keys.up:\n case Keys.down: {\n newHeight = offset$$1.height + delta;\n if (newHeight !== options.height && newHeight >= options.minHeight) {\n ev.height = newHeight;\n }\n break;\n }\n default:\n break;\n }\n if (isPresent(ev.width) || isPresent(ev.height)) {\n OFFSET_STYLES.forEach((style$$1) => {\n if (isPresent(ev[style$$1])) {\n this.window.options[style$$1] = ev[style$$1];\n }\n });\n this.window.change.emit(ev);\n }\n }\n handleStateChange(key, state$$1) {\n if ((state$$1 === 'minimized' && key === Keys.up) ||\n (state$$1 === 'maximized' && key === Keys.down)) {\n this.window.restoreAction();\n return;\n }\n if (state$$1 === 'default') {\n if (key === Keys.up) {\n this.window.maximizeAction();\n }\n else if (key === Keys.down) {\n this.window.minimizeAction();\n }\n }\n }\n}\nNavigationService.ɵfac = function NavigationService_Factory(t) { return new (t || NavigationService)(ɵngcc0.ɵɵinject(DragResizeService)); };\nNavigationService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: NavigationService, factory: NavigationService.ɵfac });\n/** @nocollapse */\nNavigationService.ctorParameters = () => [\n { type: DragResizeService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationService, [{\n type: Injectable\n }], function () { return [{ type: DragResizeService }]; }, null); })();\n\n/**\n * Represents the [Kendo UI Window component for Angular]({% slug overview_window_dialogs %}).\n */\nclass WindowComponent {\n constructor(el, renderer, service, navigation, ngZone, localization) {\n this.el = el;\n this.renderer = renderer;\n this.service = service;\n this.navigation = navigation;\n this.ngZone = ngZone;\n this.localization = localization;\n /**\n * Specifies if the content of the component is persisted in the DOM when minimized.\n * @default false\n */\n this.keepContent = false;\n /**\n * Fires when the user starts to move the Window.\n */\n this.dragStart = new EventEmitter();\n /**\n * Fires when the Window was moved by the user.\n */\n this.dragEnd = new EventEmitter();\n /**\n * Fires when the user starts to resize the Window.\n */\n this.resizeStart = new EventEmitter();\n /**\n * Fires when the Window was resized by the user.\n */\n this.resizeEnd = new EventEmitter();\n /**\n * Fires when the user closes the Window.\n */\n this.close = new EventEmitter();\n /**\n * Fires when the `width` property of the component was updated. The event is triggered only after the resizing\n * has ended. The event data contains the new width. Allows a two-way binding of the `width` property.\n */\n this.widthChange = new EventEmitter();\n /**\n * Fires when the `height` property of the component was updated. The event is triggered only after the resizing\n * has ended. The event data contains the new height. Allows a two-way binding of the `height` property.\n */\n this.heightChange = new EventEmitter();\n /**\n * Fires when the `top` property of the component was updated. The event is triggered only after the dragging\n * and resizing have ended. The event data contains the new top offset. Allows a two-way binding of the `top` property.\n */\n this.topChange = new EventEmitter();\n /**\n * Fires when the `left` property of the component was updated. The event is triggered only after the dragging\n * and resizing have ended. The event data contains the new left offset. Allows a two-way binding of the `left` property.\n */\n this.leftChange = new EventEmitter();\n /**\n * Fires when the `state` property of the component was updated. The event data contains the new state. Allows a\n * two-way binding of the `state` property.\n */\n this.stateChange = new EventEmitter();\n this.tabIndex = 0;\n this.draged = false;\n this.resized = false;\n this.windowSubscription = new Subscription();\n this.direction = this.localization.rtl ? 'rtl' : 'ltr';\n this.localizationChangeSubscription = this.localization.changes\n .subscribe(({ rtl }) => this.direction = rtl ? 'rtl' : 'ltr');\n this.resizeDirections = RESIZE_DIRECTIONS;\n this.subscribeEvents();\n }\n /**\n * Specifies whether the user will be able to drag the component.\n * @default true\n */\n set draggable(value) {\n this.options.draggable = value;\n }\n get draggable() {\n return this.options.draggable;\n }\n /**\n * Specifies whether the user will be able to resize the component.\n * @default true\n */\n set resizable(value) {\n this.options.resizable = value;\n }\n get resizable() {\n return this.options.resizable;\n }\n /**\n * Specifies the initial state of the component.\n * If not specified, the value is set to `default`.\n *\n * The possible values are:\n * * `minimized`\n * * `maximized`\n * * `default`\n */\n set state(value) {\n this.options.state = value;\n }\n get state() {\n return this.options.state;\n }\n /**\n * Specifies the minimum width of the component.\n * The `minWidth` property has to be set in pixels.\n * @default 120\n */\n set minWidth(value) {\n this.setOption('minWidth', value);\n }\n get minWidth() {\n return this.options.minWidth;\n }\n /**\n * Specifies the minimum height of the Window.\n * The `minHeight` property has to be set in pixels.\n * @default 100\n */\n set minHeight(value) {\n this.setOption('minHeight', value);\n }\n get minHeight() {\n return this.options.minHeight;\n }\n /**\n * Specifies the width of the Window.\n * The `width` property has to be set in pixels.\n */\n set width(value) {\n this.setOption('width', value);\n }\n get width() {\n return this.options.width;\n }\n /**\n * Specifies the height of the Window.\n * The `height` property has to be set in pixels.\n */\n set height(value) {\n this.setOption('height', value);\n }\n get height() {\n return this.options.height;\n }\n /**\n * Specifies the initial top offset of the Window.\n * The `top` property has to be set in pixels.\n */\n set top(value) {\n this.setOption('top', value);\n }\n get top() {\n return this.options.top;\n }\n /**\n * Specifies the initial left offset of the Window.\n * Numeric values are treated as pixels.\n */\n set left(value) {\n this.setOption('left', value);\n }\n get left() {\n return this.options.left;\n }\n get closeButtonTitle() {\n if (this.messages && this.messages.closeTitle) {\n return this.messages.closeTitle;\n }\n return this.localization.get('closeTitle');\n }\n get restoreButtonTitle() {\n if (this.messages && this.messages.restoreTitle) {\n return this.messages.restoreTitle;\n }\n return this.localization.get('restoreTitle');\n }\n get maximizeButtonTitle() {\n if (this.messages && this.messages.maximizeTitle) {\n return this.messages.maximizeTitle;\n }\n return this.localization.get('maximizeTitle');\n }\n get minimizeButtonTitle() {\n if (this.messages && this.messages.minimizeTitle) {\n return this.messages.minimizeTitle;\n }\n return this.localization.get('minimizeTitle');\n }\n get hostClasses() {\n return true;\n }\n get dir() {\n return this.direction;\n }\n ngAfterViewInit() {\n this.setNextZIndex();\n this.handleInitialFocus();\n this.ngZone.runOutsideAngular(() => Promise.resolve(null).then(() => this.setInitialOffset()));\n }\n ngOnInit() {\n this.renderer.removeAttribute(this.el.nativeElement, 'title');\n this.service.init(this.el);\n }\n ngOnChanges(changes) {\n OFFSET_STYLES.forEach((style$$1) => {\n if (isChanged(style$$1, changes)) {\n this.setStyle(style$$1, this.options[style$$1]);\n }\n });\n if (isChanged('draggable', changes)) {\n const titleBar = isPresent(this.titleBarContent) ? this.titleBarContent : this.titleBarView;\n if (isTruthy(changes.draggable.currentValue)) {\n titleBar.subscribeDrag();\n }\n else {\n titleBar.unsubscribeDrag();\n }\n }\n if (isChanged('state', changes)) {\n if (isPresent(this.service.lastAction)) {\n this.service.lastAction = null;\n }\n else {\n this.service.applyManualState();\n this.updateAllOffset();\n }\n }\n }\n ngOnDestroy() {\n if (this.windowSubscription) {\n this.windowSubscription.unsubscribe();\n }\n this.localizationChangeSubscription.unsubscribe();\n }\n /**\n * Focuses the wrapper of the Window component.\n */\n focus() {\n const wrapper = this.el.nativeElement;\n if (isPresent(wrapper)) {\n wrapper.focus();\n }\n }\n /**\n * Brings the current Window component on top of other Window components on the page.\n */\n bringToFront() {\n this.setNextZIndex();\n }\n /**\n * Manually updates the `width` or `height` option of the Window.\n * The required style will be applied to the Window wrapper element and the\n * corresponding property of the component instance will be updated.\n * This method is intended to be used for sizing dynamically created components using the\n * [`WindowService`]({% slug api_dialog_windowservice %})\n * @param {WindowDimensionSetting} dimension - The option that will be updated\n * @param {number} value - The value set in pixels\n */\n setDimension(dimension, value) {\n this.setOption(dimension, value);\n this.setStyle(dimension, value);\n }\n /**\n * Manually updates the `top` or `left` offset of the Window.\n * The required style will be applied to the Window wrapper element and the\n * corresponding property of the component instance will be updated.\n * This method is intended to be used for positioning dynamically created components using the\n * [`WindowService`]({% slug api_dialog_windowservice %})\n * @param {WindowOffsetSetting} offset - The option that will be updated\n * @param {number} value - The value set in pixels\n */\n setOffset(offset$$1, value) {\n this.setOption(offset$$1, value);\n this.setStyle(offset$$1, value);\n }\n get showDefaultTitleBar() {\n return !isPresent(this.titleBarContent);\n }\n get styleMinWidth() {\n return this.minWidth + 'px';\n }\n get styleMinHeight() {\n return this.minHeight + 'px';\n }\n get stylePosition() {\n return this.options.position;\n }\n get wrapperMaximizedClass() {\n return this.state === 'maximized';\n }\n get wrapperMinimizedClass() {\n return this.state === 'minimized';\n }\n /**\n * @hidden\n */\n onComponentKeydown(event) {\n if (hasClasses(event.target, WINDOW_CLASSES)) {\n this.navigation.process(event);\n }\n }\n /**\n * @hidden\n */\n onComponentFocus() {\n this.renderer.addClass(this.el.nativeElement, 'k-state-focused');\n this.setNextZIndex();\n }\n /**\n * @hidden\n */\n onComponentBlur() {\n this.renderer.removeClass(this.el.nativeElement, 'k-state-focused');\n }\n subscribeEvents() {\n if (!isDocumentAvailable()) {\n return;\n }\n this.windowSubscription.add(this.service.focus.subscribe(() => {\n this.el.nativeElement.focus();\n }));\n this.windowSubscription.add(this.service.dragStart.subscribe(() => {\n this.draged = true;\n this.ngZone.run(() => {\n this.dragStart.emit();\n });\n }));\n this.windowSubscription.add(this.service.dragEnd.subscribe(() => {\n if (this.draged) {\n this.draged = false;\n this.ngZone.run(() => {\n this.dragEnd.emit();\n });\n }\n }));\n this.windowSubscription.add(this.service.close.subscribe(() => {\n this.close.emit();\n }));\n this.windowSubscription.add(this.service.resizeStart.subscribe(() => {\n this.resized = true;\n this.ngZone.run(() => {\n this.resizeStart.emit();\n });\n }));\n this.windowSubscription.add(this.service.resizeEnd.subscribe(() => {\n if (this.resized) {\n this.resized = false;\n this.ngZone.run(() => {\n this.resizeEnd.emit();\n });\n }\n }));\n this.windowSubscription.add(this.service.change.subscribe((ev) => {\n OFFSET_STYLES.forEach((style$$1) => {\n if (isPresent(ev[style$$1])) {\n this.setStyle(style$$1, ev[style$$1]);\n if (this.state !== 'maximized') {\n const emitter = this[style$$1 + 'Change'];\n if (emitter.observers.length) {\n this.ngZone.run(() => {\n emitter.emit(ev[style$$1]);\n });\n }\n }\n }\n });\n }));\n this.windowSubscription.add(this.service.stateChange.subscribe((state$$1) => {\n if (isPresent(this.service.lastAction)) {\n this.updateAllOffset();\n this.stateChange.emit(state$$1);\n }\n }));\n }\n setNextZIndex() {\n const currentZIndex = this.el.nativeElement.style['z-index'];\n const nextPossibleZIndex = this.service.nextPossibleZIndex;\n if (!currentZIndex || (nextPossibleZIndex - currentZIndex > 1)) {\n this.renderer.setStyle(this.el.nativeElement, \"z-index\", this.service.nextZIndex);\n }\n }\n setInitialOffset() {\n if (this.state !== 'maximized') {\n this.updateAllOffset();\n if (!isPresent(this.left) || !isPresent(this.top)) {\n this.service.center();\n }\n }\n else {\n const viewPort = this.service.windowViewPort;\n this.setStyle('width', viewPort.width);\n this.setStyle('height', viewPort.height);\n this.setStyle('top', 0);\n this.setStyle('left', 0);\n }\n }\n updateAllOffset() {\n OFFSET_STYLES.forEach((style$$1) => {\n if (isPresent(this[style$$1])) {\n this.setStyle(style$$1, this[style$$1]);\n }\n else {\n this.removeStyle(style$$1);\n }\n });\n }\n setStyle(style$$1, value) {\n this.renderer.setStyle(this.el.nativeElement, style$$1, value + 'px');\n }\n removeStyle(style$$1) {\n this.renderer.removeStyle(this.el.nativeElement, style$$1);\n }\n get options() {\n return this.service.options;\n }\n setOption(style$$1, value) {\n if (typeof value !== 'number' && typeof value !== 'string') {\n return;\n }\n const parsedValue = (typeof value === 'number') ? value : parseInt(value, 10);\n this.options[style$$1] = parsedValue;\n this.service.setRestoreOption(style$$1, parsedValue);\n }\n handleInitialFocus() {\n const wrapper = this.el.nativeElement;\n if (this.autoFocusedElement) {\n const initiallyFocusedElement = wrapper.querySelector(this.autoFocusedElement);\n if (initiallyFocusedElement) {\n initiallyFocusedElement.focus();\n }\n }\n else {\n this.focus();\n }\n }\n}\nWindowComponent.ɵfac = function WindowComponent_Factory(t) { return new (t || WindowComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nWindowComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: WindowComponent, selectors: [[\"kendo-window\"]], contentQueries: function WindowComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, WindowTitleBarComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.titleBarContent = _t.first);\n } }, viewQuery: function WindowComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(WindowTitleBarComponent, true);\n ɵngcc0.ɵɵviewQuery(ResizeHandleDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.titleBarView = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.resizeHandles = _t);\n } }, hostVars: 16, hostBindings: function WindowComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function WindowComponent_keydown_HostBindingHandler($event) { return ctx.onComponentKeydown($event); })(\"focus\", function WindowComponent_focus_HostBindingHandler() { return ctx.onComponentFocus(); })(\"blur\", function WindowComponent_blur_HostBindingHandler() { return ctx.onComponentBlur(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabIndex\", ctx.tabIndex)(\"dir\", ctx.dir);\n ɵngcc0.ɵɵstyleProp(\"min-width\", ctx.styleMinWidth)(\"min-height\", ctx.styleMinHeight)(\"position\", ctx.stylePosition);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-window\", ctx.hostClasses)(\"k-window-maximized\", ctx.wrapperMaximizedClass)(\"k-window-minimized\", ctx.wrapperMinimizedClass);\n } }, inputs: { keepContent: \"keepContent\", draggable: \"draggable\", resizable: \"resizable\", state: \"state\", minWidth: \"minWidth\", minHeight: \"minHeight\", width: \"width\", height: \"height\", top: \"top\", left: \"left\", autoFocusedElement: \"autoFocusedElement\", title: \"title\" }, outputs: { dragStart: \"dragStart\", dragEnd: \"dragEnd\", resizeStart: \"resizeStart\", resizeEnd: \"resizeEnd\", close: \"close\", widthChange: \"widthChange\", heightChange: \"heightChange\", topChange: \"topChange\", leftChange: \"leftChange\", stateChange: \"stateChange\" }, exportAs: [\"kendoWindow\"], features: [ɵngcc0.ɵɵProvidersFeature([\n DragResizeService,\n NavigationService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.window'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c17, decls: 7, vars: 4, consts: [[\"kendoWindowLocalizedMessages\", \"\", 6, \"closeTitle\", \"restoreTitle\", \"maximizeTitle\", \"minimizeTitle\"], [3, \"template\", 4, \"ngIf\"], [4, \"ngIf\"], [\"class\", \"k-content k-window-content\", 3, \"hidden\", 4, \"ngIf\"], [3, \"ngIf\"], [3, \"template\"], [1, \"k-window-title\"], [1, \"k-window-actions\"], [\"kendoWindowMinimizeAction\", \"\"], [\"kendoWindowMaximizeAction\", \"\"], [\"kendoWindowRestoreAction\", \"\"], [\"kendoWindowCloseAction\", \"\"], [1, \"k-content\", \"k-window-content\", 3, \"hidden\"], [3, \"ngTemplateOutlet\"], [\"kendoWindowResizeHandle\", \"\", \"kendoDraggable\", \"\", 3, \"direction\", 4, \"ngFor\", \"ngForOf\"], [\"kendoWindowResizeHandle\", \"\", \"kendoDraggable\", \"\", 3, \"direction\"]], template: function WindowComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c16);\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c15);\n ɵngcc0.ɵɵelementContainerStart(2);\n ɵngcc0.ɵɵtemplate(3, WindowComponent_kendo_window_titlebar_3_Template, 8, 10, \"kendo-window-titlebar\", 1);\n ɵngcc0.ɵɵtemplate(4, WindowComponent_4_Template, 1, 0, undefined, 2);\n ɵngcc0.ɵɵtemplate(5, WindowComponent_div_5_Template, 3, 3, \"div\", 3);\n ɵngcc0.ɵɵtemplate(6, WindowComponent_ng_template_6_Template, 1, 1, \"ng-template\", 4);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showDefaultTitleBar);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.showDefaultTitleBar);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.state !== \"minimized\" || ctx.keepContent);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.resizable);\n } }, directives: function () { return [LocalizedMessagesDirective, ɵngcc1.NgIf, WindowTitleBarComponent,\n WindowMinimizeActionDirective,\n WindowMaximizeActionDirective,\n WindowRestoreActionDirective,\n WindowCloseActionDirective, ɵngcc1.NgTemplateOutlet, ɵngcc1.NgForOf, ResizeHandleDirective, ɵngcc3.DraggableDirective]; }, encapsulation: 2 });\n/** @nocollapse */\nWindowComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService },\n { type: NavigationService },\n { type: NgZone },\n { type: LocalizationService }\n];\nWindowComponent.propDecorators = {\n autoFocusedElement: [{ type: Input }],\n title: [{ type: Input }],\n draggable: [{ type: Input }],\n resizable: [{ type: Input }],\n keepContent: [{ type: Input }],\n state: [{ type: Input }],\n minWidth: [{ type: Input }],\n minHeight: [{ type: Input }],\n width: [{ type: Input }],\n height: [{ type: Input }],\n top: [{ type: Input }],\n left: [{ type: Input }],\n dragStart: [{ type: Output }],\n dragEnd: [{ type: Output }],\n resizeStart: [{ type: Output }],\n resizeEnd: [{ type: Output }],\n close: [{ type: Output }],\n widthChange: [{ type: Output }],\n heightChange: [{ type: Output }],\n topChange: [{ type: Output }],\n leftChange: [{ type: Output }],\n stateChange: [{ type: Output }],\n tabIndex: [{ type: HostBinding, args: ['attr.tabIndex',] }],\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-window',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n titleBarView: [{ type: ViewChild, args: [WindowTitleBarComponent,] }],\n titleBarContent: [{ type: ContentChild, args: [WindowTitleBarComponent,] }],\n resizeHandles: [{ type: ViewChildren, args: [ResizeHandleDirective,] }],\n styleMinWidth: [{ type: HostBinding, args: ['style.minWidth',] }],\n styleMinHeight: [{ type: HostBinding, args: ['style.minHeight',] }],\n stylePosition: [{ type: HostBinding, args: ['style.position',] }],\n wrapperMaximizedClass: [{ type: HostBinding, args: ['class.k-window-maximized',] }],\n wrapperMinimizedClass: [{ type: HostBinding, args: ['class.k-window-minimized',] }],\n onComponentKeydown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n onComponentFocus: [{ type: HostListener, args: ['focus',] }],\n onComponentBlur: [{ type: HostListener, args: ['blur',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoWindow',\n providers: [\n DragResizeService,\n NavigationService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.window'\n }\n ],\n selector: 'kendo-window',\n template: `\n \n \n\n \n
{{ title }}
\n
\n \n \n \n \n
\n
\n \n\n
\n \n \n
\n\n \n
\n
\n
\n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService }, { type: NavigationService }, { type: ɵngcc0.NgZone }, { type: ɵngcc2.LocalizationService }]; }, { keepContent: [{\n type: Input\n }], dragStart: [{\n type: Output\n }], dragEnd: [{\n type: Output\n }], resizeStart: [{\n type: Output\n }], resizeEnd: [{\n type: Output\n }], close: [{\n type: Output\n }], widthChange: [{\n type: Output\n }], heightChange: [{\n type: Output\n }], topChange: [{\n type: Output\n }], leftChange: [{\n type: Output\n }], stateChange: [{\n type: Output\n }], tabIndex: [{\n type: HostBinding,\n args: ['attr.tabIndex']\n }], draggable: [{\n type: Input\n }], resizable: [{\n type: Input\n }], state: [{\n type: Input\n }], minWidth: [{\n type: Input\n }], minHeight: [{\n type: Input\n }], width: [{\n type: Input\n }], height: [{\n type: Input\n }], top: [{\n type: Input\n }], left: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-window']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], styleMinWidth: [{\n type: HostBinding,\n args: ['style.minWidth']\n }], styleMinHeight: [{\n type: HostBinding,\n args: ['style.minHeight']\n }], stylePosition: [{\n type: HostBinding,\n args: ['style.position']\n }], wrapperMaximizedClass: [{\n type: HostBinding,\n args: ['class.k-window-maximized']\n }], wrapperMinimizedClass: [{\n type: HostBinding,\n args: ['class.k-window-minimized']\n }], onComponentKeydown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], onComponentFocus: [{\n type: HostListener,\n args: ['focus']\n }], onComponentBlur: [{\n type: HostListener,\n args: ['blur']\n }], autoFocusedElement: [{\n type: Input\n }], title: [{\n type: Input\n }], titleBarView: [{\n type: ViewChild,\n args: [WindowTitleBarComponent]\n }], titleBarContent: [{\n type: ContentChild,\n args: [WindowTitleBarComponent]\n }], resizeHandles: [{\n type: ViewChildren,\n args: [ResizeHandleDirective]\n }] }); })();\n\nclass WindowMaximizeActionDirective extends Button {\n constructor(el, renderer, _service, localization, ngZone) {\n super(el, renderer, null, localization, ngZone);\n this.buttonType = 'button';\n this.window = _service;\n this.look = 'bare';\n this.icon = 'window-maximize';\n }\n /**\n * @hidden\n */\n onClick() {\n if (!this.isDisabled) {\n this.window.maximizeAction();\n }\n }\n get visible() {\n return this.window.options.state === 'default' ? 'inline-flex' : 'none';\n }\n}\nWindowMaximizeActionDirective.ɵfac = function WindowMaximizeActionDirective_Factory(t) { return new (t || WindowMaximizeActionDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nWindowMaximizeActionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WindowMaximizeActionDirective, selectors: [[\"button\", \"kendoWindowMaximizeAction\", \"\"]], hostVars: 3, hostBindings: function WindowMaximizeActionDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function WindowMaximizeActionDirective_click_HostBindingHandler() { return ctx.onClick(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.buttonType);\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n } }, inputs: { window: \"window\" }, exportAs: [\"kendoWindowMaximizeAction\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nWindowMaximizeActionDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService, decorators: [{ type: Optional }] },\n { type: LocalizationService },\n { type: NgZone }\n];\nWindowMaximizeActionDirective.propDecorators = {\n window: [{ type: Input }],\n buttonType: [{ type: HostBinding, args: ['attr.type',] }],\n onClick: [{ type: HostListener, args: ['click',] }],\n visible: [{ type: HostBinding, args: ['style.display',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowMaximizeActionDirective, [{\n type: Directive,\n args: [{\n exportAs: 'kendoWindowMaximizeAction',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ],\n selector: 'button[kendoWindowMaximizeAction]' // tslint:disable-line\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService, decorators: [{\n type: Optional\n }] }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { buttonType: [{\n type: HostBinding,\n args: ['attr.type']\n }], window: [{\n type: Input\n }], onClick: [{\n type: HostListener,\n args: ['click']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }] }); })();\n\nclass WindowMinimizeActionDirective extends Button {\n constructor(el, renderer, _service, localization, ngZone) {\n super(el, renderer, null, localization, ngZone);\n this.buttonType = 'button';\n this.window = _service;\n this.look = 'bare';\n this.icon = 'window-minimize';\n }\n /**\n * @hidden\n */\n onClick() {\n if (!this.isDisabled) {\n this.window.minimizeAction();\n }\n }\n get visible() {\n return this.window.options.state === 'default' ? 'inline-flex' : 'none';\n }\n}\nWindowMinimizeActionDirective.ɵfac = function WindowMinimizeActionDirective_Factory(t) { return new (t || WindowMinimizeActionDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nWindowMinimizeActionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WindowMinimizeActionDirective, selectors: [[\"button\", \"kendoWindowMinimizeAction\", \"\"]], hostVars: 3, hostBindings: function WindowMinimizeActionDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function WindowMinimizeActionDirective_click_HostBindingHandler() { return ctx.onClick(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.buttonType);\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n } }, inputs: { window: \"window\" }, exportAs: [\"kendoWindowMinimizeAction\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nWindowMinimizeActionDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService, decorators: [{ type: Optional }] },\n { type: LocalizationService },\n { type: NgZone }\n];\nWindowMinimizeActionDirective.propDecorators = {\n window: [{ type: Input }],\n buttonType: [{ type: HostBinding, args: ['attr.type',] }],\n onClick: [{ type: HostListener, args: ['click',] }],\n visible: [{ type: HostBinding, args: ['style.display',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowMinimizeActionDirective, [{\n type: Directive,\n args: [{\n exportAs: 'kendoWindowMinimizeAction',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ],\n selector: 'button[kendoWindowMinimizeAction]' // tslint:disable-line\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService, decorators: [{\n type: Optional\n }] }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { buttonType: [{\n type: HostBinding,\n args: ['attr.type']\n }], window: [{\n type: Input\n }], onClick: [{\n type: HostListener,\n args: ['click']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }] }); })();\n\nclass WindowCloseActionDirective extends Button {\n constructor(el, renderer, _service, localization, ngZone) {\n super(el, renderer, null, localization, ngZone);\n this.buttonType = 'button';\n this.window = _service;\n this.look = 'bare';\n this.icon = 'close';\n }\n /**\n * @hidden\n */\n onClick() {\n if (!this.isDisabled) {\n this.window.closeAction();\n }\n }\n}\nWindowCloseActionDirective.ɵfac = function WindowCloseActionDirective_Factory(t) { return new (t || WindowCloseActionDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nWindowCloseActionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WindowCloseActionDirective, selectors: [[\"button\", \"kendoWindowCloseAction\", \"\"]], hostVars: 1, hostBindings: function WindowCloseActionDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function WindowCloseActionDirective_click_HostBindingHandler() { return ctx.onClick(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.buttonType);\n } }, inputs: { window: \"window\" }, exportAs: [\"kendoWindowCloseAction\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nWindowCloseActionDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService, decorators: [{ type: Optional }] },\n { type: LocalizationService },\n { type: NgZone }\n];\nWindowCloseActionDirective.propDecorators = {\n window: [{ type: Input }],\n buttonType: [{ type: HostBinding, args: ['attr.type',] }],\n onClick: [{ type: HostListener, args: ['click',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowCloseActionDirective, [{\n type: Directive,\n args: [{\n exportAs: 'kendoWindowCloseAction',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ],\n selector: 'button[kendoWindowCloseAction]' // tslint:disable-line\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService, decorators: [{\n type: Optional\n }] }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { buttonType: [{\n type: HostBinding,\n args: ['attr.type']\n }], window: [{\n type: Input\n }], onClick: [{\n type: HostListener,\n args: ['click']\n }] }); })();\n\nclass WindowRestoreActionDirective extends Button {\n constructor(el, renderer, _service, localization, ngZone) {\n super(el, renderer, null, localization, ngZone);\n this.buttonType = 'button';\n this.window = _service;\n this.look = 'bare';\n this.icon = 'window-restore';\n }\n /**\n * @hidden\n */\n onClick() {\n if (!this.isDisabled) {\n this.window.restoreAction();\n }\n }\n get visible() {\n return this.window.options.state === 'default' ? 'none' : 'inline-flex';\n }\n}\nWindowRestoreActionDirective.ɵfac = function WindowRestoreActionDirective_Factory(t) { return new (t || WindowRestoreActionDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DragResizeService, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nWindowRestoreActionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WindowRestoreActionDirective, selectors: [[\"button\", \"kendoWindowRestoreAction\", \"\"]], hostVars: 3, hostBindings: function WindowRestoreActionDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function WindowRestoreActionDirective_click_HostBindingHandler() { return ctx.onClick(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.buttonType);\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n } }, inputs: { window: \"window\" }, exportAs: [\"kendoWindowRestoreAction\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nWindowRestoreActionDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: DragResizeService, decorators: [{ type: Optional }] },\n { type: LocalizationService },\n { type: NgZone }\n];\nWindowRestoreActionDirective.propDecorators = {\n window: [{ type: Input }],\n buttonType: [{ type: HostBinding, args: ['attr.type',] }],\n onClick: [{ type: HostListener, args: ['click',] }],\n visible: [{ type: HostBinding, args: ['style.display',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowRestoreActionDirective, [{\n type: Directive,\n args: [{\n exportAs: 'kendoWindowRestoreAction',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.button'\n }\n ],\n selector: 'button[kendoWindowRestoreAction]' // tslint:disable-line\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DragResizeService, decorators: [{\n type: Optional\n }] }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { buttonType: [{\n type: HostBinding,\n args: ['attr.type']\n }], window: [{\n type: Input\n }], onClick: [{\n type: HostListener,\n args: ['click']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }] }); })();\n\n/**\n * The settings for the Window actions when the Window is opened through `WindowService`\n * ([see example]({% slug api_dialog_windowservice %}#toc-open)).\n */\nclass WindowSettings {\n}\n/**\n * Indicates that the **Close** button of a Window that is opened through `WindowService` is clicked.\n */\nclass WindowCloseResult {\n}\n/**\n * Holds references to the object instance of the Window.\n * Controls the Windows that were opened through `WindowService`\n * ([see example]({% slug api_dialog_windowservice %}#toc-open)).\n */\nclass WindowRef {\n}\n\n/**\n * @hidden\n */\nclass WindowContainerService {\n set container(container) {\n WindowContainerService.container = container;\n }\n get container() {\n return WindowContainerService.container;\n }\n}\nWindowContainerService.ɵfac = function WindowContainerService_Factory(t) { return new (t || WindowContainerService)(); };\nWindowContainerService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: WindowContainerService, factory: WindowContainerService.ɵfac });\nWindowContainerService.container = null;\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowContainerService, [{\n type: Injectable\n }], null, null); })();\n\nclass WindowInjector {\n constructor(getWindowRef, parentInjector) {\n this.getWindowRef = getWindowRef;\n this.parentInjector = parentInjector;\n }\n get(token, notFoundValue) {\n if (token === WindowRef) {\n return this.getWindowRef();\n }\n return this.parentInjector.get(token, notFoundValue);\n }\n}\n/**\n * A service for opening Windows dynamically\n * ([see example]({% slug service_window %})).\n */\nclass WindowService {\n constructor(\n /**\n * @hidden\n */\n resolver, containerService) {\n this.resolver = resolver;\n this.containerService = containerService;\n }\n /**\n * Opens a Window component.\n *\n * @param {WindowSettings} settings - The settings that define the Window.\n * @returns {WindowRef} - A reference to the Window object.\n *\n * @example\n *\n * ```ts-no-run\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n *
\n * `\n * })\n * export class AppComponent {\n * constructor( private windowService: WindowService ) {}\n *\n * public open() {\n * var window = this.windowService.open({\n * title: \"My window\",\n * content: \"My content!\"\n * });\n *\n * window.result.subscribe((result) => {\n * if (result instanceof WindowCloseResult) {\n * console.log(\"Window was closed\");\n * }\n * });\n * }\n * }\n * ```\n *\n */\n open(settings) {\n const factory = this.resolver.resolveComponentFactory(WindowComponent);\n const container = settings.appendTo || this.containerService.container;\n if (!container) {\n throw new Error(`Cannot attach window to the page.\n Add an element that uses the kendoWindowContainer directive, or set the 'appendTo' property.\n See https://www.telerik.com/kendo-angular-ui/components/dialogs/window/service/\n `);\n }\n const windowRef = {\n close: () => { },\n content: null,\n result: null,\n window: null\n };\n const content = this.contentFrom(settings.content, container, windowRef);\n const window = container.createComponent(factory, undefined, undefined, content.nodes);\n windowRef.window = window;\n this.applyOptions(window.instance, settings);\n const apiClose = new Subject();\n const close = (e) => {\n apiClose.next(e || new WindowCloseResult());\n if (content.componentRef) {\n content.componentRef.destroy();\n }\n window.destroy();\n };\n const result = merge(apiClose, window.instance.close).pipe(take(1));\n result.subscribe(close);\n windowRef.close = close;\n windowRef.result = result;\n window.changeDetectorRef.markForCheck();\n return windowRef;\n }\n applyOptions(instance, options) {\n if (isPresent(options.title)) {\n instance.title = options.title;\n }\n if (isPresent(options.keepContent)) {\n instance.keepContent = options.keepContent;\n }\n if (isPresent(options.width)) {\n instance.width = options.width;\n }\n if (isPresent(options.minWidth)) {\n instance.minWidth = options.minWidth;\n }\n if (isPresent(options.height)) {\n instance.height = options.height;\n }\n if (isPresent(options.minHeight)) {\n instance.minHeight = options.minHeight;\n }\n if (isPresent(options.left)) {\n instance.left = options.left;\n }\n if (isPresent(options.top)) {\n instance.top = options.top;\n }\n if (isPresent(options.draggable)) {\n instance.draggable = options.draggable;\n }\n if (isPresent(options.resizable)) {\n instance.resizable = options.resizable;\n }\n if (isPresent(options.messages && options.messages.closeTitle)) {\n instance.messages.closeTitle = options.messages.closeTitle;\n }\n if (isPresent(options.messages && options.messages.restoreTitle)) {\n instance.messages.restoreTitle = options.messages.restoreTitle;\n }\n if (isPresent(options.messages && options.messages.maximizeTitle)) {\n instance.messages.maximizeTitle = options.messages.maximizeTitle;\n }\n if (isPresent(options.messages && options.messages.minimizeTitle)) {\n instance.messages.minimizeTitle = options.messages.minimizeTitle;\n }\n if (isPresent(options.autoFocusedElement)) {\n instance.autoFocusedElement = options.autoFocusedElement;\n }\n if (isPresent(options.state)) {\n instance.state = options.state;\n if (options.state === 'minimized') {\n instance.keepContent = true;\n }\n }\n if (options.content instanceof TemplateRef) {\n instance.contentTemplate = options.content;\n }\n if (options.titleBarContent instanceof TemplateRef) {\n instance.titleBarTemplate = options.titleBarContent;\n }\n }\n contentFrom(content, container, windowRef) {\n const renderer = container.injector.get(Renderer2);\n let nodes = [];\n let componentRef = null;\n if (typeof content === 'string') {\n nodes = [renderer.createText(content)];\n }\n else if (content && !(content instanceof TemplateRef)) {\n const injector = new WindowInjector(() => windowRef, container.injector);\n const factory = this.resolver.resolveComponentFactory(content);\n componentRef = container.createComponent(factory, undefined, injector);\n nodes = [componentRef.location.nativeElement];\n windowRef.content = componentRef;\n }\n return {\n componentRef,\n nodes: [\n [],\n nodes // Content\n ]\n };\n }\n}\nWindowService.ɵfac = function WindowService_Factory(t) { return new (t || WindowService)(ɵngcc0.ɵɵinject(ɵngcc0.ComponentFactoryResolver), ɵngcc0.ɵɵinject(WindowContainerService)); };\nWindowService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: WindowService, factory: WindowService.ɵfac });\n/** @nocollapse */\nWindowService.ctorParameters = () => [\n { type: ComponentFactoryResolver },\n { type: WindowContainerService, decorators: [{ type: Inject, args: [WindowContainerService,] }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.ComponentFactoryResolver }, { type: WindowContainerService, decorators: [{\n type: Inject,\n args: [WindowContainerService]\n }] }]; }, null); })();\n\n/**\n * Provides an insertion point for the Dialogs which are created through the\n * Dialog service ([see example]({% slug api_dialog_dialogservice %}#toc-open)).\n * Created Dialogs will be mounted after that element.\n *\n * @example\n * ```html-no-run\n *
\n * ```\n */\nclass DialogContainerDirective {\n constructor(container, service) {\n service.container = container;\n }\n}\nDialogContainerDirective.ɵfac = function DialogContainerDirective_Factory(t) { return new (t || DialogContainerDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(DialogContainerService)); };\nDialogContainerDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DialogContainerDirective, selectors: [[\"\", \"kendoDialogContainer\", \"\"]] });\n/** @nocollapse */\nDialogContainerDirective.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: DialogContainerService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogContainerDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDialogContainer]'\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: DialogContainerService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass Messages extends ComponentMessages {\n}\nMessages.ɵfac = function Messages_Factory(t) { return ɵMessages_BaseFactory(t || Messages); };\nMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages, inputs: { closeTitle: \"closeTitle\", restoreTitle: \"restoreTitle\", maximizeTitle: \"maximizeTitle\", minimizeTitle: \"minimizeTitle\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages.propDecorators = {\n closeTitle: [{ type: Input }],\n restoreTitle: [{ type: Input }],\n maximizeTitle: [{ type: Input }],\n minimizeTitle: [{ type: Input }]\n};\nconst ɵMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages);\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoDialogLocalizedMessages\", \"\"], [\"\", \"kendoWindowLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: `\n [kendoDialogLocalizedMessages],\n [kendoWindowLocalizedMessages]\n `\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages\n * ([see example]({% slug globalization_dialogs %}#toc-localization)).\n */\nclass CustomMessagesComponent extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nCustomMessagesComponent.ɵfac = function CustomMessagesComponent_Factory(t) { return new (t || CustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CustomMessagesComponent, selectors: [[\"kendo-dialog-messages\"], [\"kendo-window-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-dialog-messages, kendo-window-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, null); })();\n\n/**\n * @hidden\n */\nconst SHARED_DIRECTIVES = [\n DialogActionsComponent,\n CustomMessagesComponent,\n LocalizedMessagesDirective\n];\n/**\n * @hidden\n */\nclass SharedModule {\n}\nSharedModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SharedModule });\nSharedModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SharedModule_Factory(t) { return new (t || SharedModule)(); }, imports: [[CommonModule],\n CommonModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SharedModule, { declarations: function () { return [DialogActionsComponent,\n CustomMessagesComponent,\n LocalizedMessagesDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [DialogActionsComponent,\n CustomMessagesComponent,\n LocalizedMessagesDirective,\n CommonModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SharedModule, [{\n type: NgModule,\n args: [{\n declarations: [SHARED_DIRECTIVES],\n exports: [SHARED_DIRECTIVES, CommonModule],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nconst DIALOG_DIRECTIVES = [\n DialogComponent,\n DialogTitleBarComponent\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Dialog component that includes all Dialog components and directives.\n * Imports `DialogModule` into the [root module]({{ site.data.urls.angular['ngmodules'] }}#angular-modularity)\n * of your application or into any other sub-module that will use the Dialog component.\n *\n * @example\n * ```ts-no-run\n * import { NgModule } from '@angular/core';\n * import { BrowserModule } from '@angular/platform-browser';\n * import { DialogModule } from '@progress/kendo-angular-dialog';\n * import { AppComponent } from './app.component';\n *\n * _@NgModule({\n * bootstrap: [AppComponent],\n * declarations: [AppComponent],\n * imports: [BrowserModule, DialogModule]\n * })\n * export class AppModule {\n * }\n * ```\n */\nclass DialogModule {\n}\nDialogModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DialogModule });\nDialogModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DialogModule_Factory(t) { return new (t || DialogModule)(); }, providers: [DialogContainerService, DialogService], imports: [[SharedModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DialogModule, { declarations: [DialogComponent,\n DialogTitleBarComponent,\n DialogContainerDirective], imports: [SharedModule], exports: [DialogComponent,\n DialogTitleBarComponent,\n DialogActionsComponent,\n CustomMessagesComponent,\n LocalizedMessagesDirective,\n DialogContainerDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogModule, [{\n type: NgModule,\n args: [{\n declarations: [DIALOG_DIRECTIVES, DialogContainerDirective],\n entryComponents: [DIALOG_DIRECTIVES],\n exports: [DIALOG_DIRECTIVES, SHARED_DIRECTIVES, DialogContainerDirective],\n imports: [SharedModule],\n providers: [DialogContainerService, DialogService]\n }]\n }], null, null); })();\n\n/**\n * Provides an insertion point for the Windows which are created through the\n * Window service ([see example]({% slug api_dialog_windowservice %}#toc-open)).\n * Created Windows will be mounted after that element.\n *\n * @example\n * ```html-no-run\n *
\n * ```\n */\nclass WindowContainerDirective {\n constructor(container, service) {\n service.container = container;\n }\n}\nWindowContainerDirective.ɵfac = function WindowContainerDirective_Factory(t) { return new (t || WindowContainerDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(WindowContainerService)); };\nWindowContainerDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WindowContainerDirective, selectors: [[\"\", \"kendoWindowContainer\", \"\"]] });\n/** @nocollapse */\nWindowContainerDirective.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: WindowContainerService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowContainerDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoWindowContainer]'\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: WindowContainerService }]; }, null); })();\n\nconst WINDOW_DIRECTIVES = [\n ResizeHandleDirective,\n WindowComponent,\n WindowTitleBarComponent,\n WindowCloseActionDirective,\n WindowMinimizeActionDirective,\n WindowMaximizeActionDirective,\n WindowRestoreActionDirective\n];\nconst ENTRY_COMPONENTS = [\n WindowComponent,\n WindowTitleBarComponent\n];\nconst exportedModules = [\n WindowComponent,\n WindowCloseActionDirective,\n WindowMinimizeActionDirective,\n WindowMaximizeActionDirective,\n WindowRestoreActionDirective,\n WindowTitleBarComponent\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Window component. Imports `WindowModule` into the\n * [root module]({{ site.data.urls.angular['ngmodules'] }}#angular-modularity)\n * of your application or into any other sub-module that will use the Window component.\n *\n * @example\n * ```ts-no-run\n * import { NgModule } from '@angular/core';\n * import { BrowserModule } from '@angular/platform-browser';\n * import { WindowModule } from '@progress/kendo-angular-window';\n * import { AppComponent } from './app.component';\n *\n * _@NgModule({\n * bootstrap: [AppComponent],\n * declarations: [AppComponent],\n * imports: [BrowserModule, WindowModule]\n * })\n * export class AppModule {\n * }\n * ```\n */\nclass WindowModule {\n}\nWindowModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: WindowModule });\nWindowModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function WindowModule_Factory(t) { return new (t || WindowModule)(); }, providers: [WindowContainerService, WindowService], imports: [[SharedModule, DraggableModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(WindowModule, { declarations: function () { return [ResizeHandleDirective,\n WindowComponent,\n WindowTitleBarComponent,\n WindowCloseActionDirective,\n WindowMinimizeActionDirective,\n WindowMaximizeActionDirective,\n WindowRestoreActionDirective,\n WindowContainerDirective]; }, imports: function () { return [SharedModule,\n DraggableModule]; }, exports: function () { return [WindowComponent,\n WindowCloseActionDirective,\n WindowMinimizeActionDirective,\n WindowMaximizeActionDirective,\n WindowRestoreActionDirective,\n WindowTitleBarComponent,\n DialogActionsComponent,\n CustomMessagesComponent,\n LocalizedMessagesDirective,\n WindowContainerDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WindowModule, [{\n type: NgModule,\n args: [{\n declarations: [WINDOW_DIRECTIVES, WindowContainerDirective],\n entryComponents: [ENTRY_COMPONENTS],\n exports: [exportedModules, SHARED_DIRECTIVES, WindowContainerDirective],\n imports: [SharedModule, DraggableModule],\n providers: [WindowContainerService, WindowService]\n }]\n }], null, null); })();\n\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Dialogs components.\n *\n * @example\n *\n * ```ts-no-run\n * import { DialogsModule } from '@progress/kendo-angular-dialog';\n *\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { NgModule } from '@angular/core';\n *\n * import { AppComponent } from './app.component';\n *\n * _@NgModule({\n * declarations: [AppComponent],\n * imports: [BrowserModule, DialogsModule],\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass DialogsModule {\n}\nDialogsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DialogsModule });\nDialogsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DialogsModule_Factory(t) { return new (t || DialogsModule)(); }, imports: [DialogModule,\n WindowModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DialogsModule, { exports: [DialogModule,\n WindowModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DialogsModule, [{\n type: NgModule,\n args: [{\n exports: [DialogModule, WindowModule]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { DIALOG_DIRECTIVES, DialogContainerDirective, DialogContainerService, CustomMessagesComponent, DIALOG_LOCALIZATION_SERVICE, LocalizedMessagesDirective, Messages, SHARED_DIRECTIVES, SharedModule, DragResizeService, NavigationService, WindowContainerDirective, WindowContainerService, ResizeHandleDirective, DialogComponent, DialogTitleBarComponent, DialogContentBase, DialogActionsComponent, DialogService, DialogCloseResult, DialogRef, DialogSettings, DialogAction, WindowComponent, WindowTitleBarComponent, WindowMaximizeActionDirective, WindowMinimizeActionDirective, WindowCloseActionDirective, WindowRestoreActionDirective, WindowSettings, WindowRef, WindowCloseResult, WindowService, DialogModule, WindowModule, DialogsModule };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7aUhBb0JFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs2QkF1QkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFpREU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7V0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O2tJQUFDO0FBQ0Q7OzswQkFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt1R0FHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzttSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7dUVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzsrQ0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O2lGQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzttSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7MkVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUpBMERFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztrREFhRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztrREFhRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O2tEQWFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztrREFhRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztrSUFBQztBQUNEOzs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VHQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzRJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O21IQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztnUEFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtxRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2tEQWNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7eUpBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBU0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NElBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7bUhBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQVNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OzBCQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IMKpIDIwMjAgUHJvZ3Jlc3MgU29mdHdhcmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qIExpY2Vuc2VkIHVuZGVyIGNvbW1lcmNpYWwgbGljZW5zZS4gU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBUZW1wbGF0ZVJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBIb3N0QmluZGluZywgT3B0aW9uYWwsIEluamVjdGlvblRva2VuLCBSZW5kZXJlcjIsIENoYW5nZURldGVjdG9yUmVmLCBDb250ZW50Q2hpbGQsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyLCBJbmplY3RhYmxlLCBpc0Rldk1vZGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0LCBOZ1pvbmUsIERpcmVjdGl2ZSwgSG9zdCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmLCBmb3J3YXJkUmVmLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlLCBMMTBOX1BSRUZJWCwgQ29tcG9uZW50TWVzc2FnZXMgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1sMTBuJztcbmltcG9ydCB7IFN1YmplY3QsIG1lcmdlLCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgc2hhcmUsIHRhcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEcmFnZ2FibGVEaXJlY3RpdmUsIGlzQ2hhbmdlZCwgaXNEb2N1bWVudEF2YWlsYWJsZSwgRHJhZ2dhYmxlTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IG9mZnNldCwgc2Nyb2xsUG9zaXRpb24sIHBvc2l0aW9uV2l0aFNjcm9sbCwgZ2V0RG9jdW1lbnRFbGVtZW50LCBnZXRXaW5kb3dWaWV3UG9ydCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1wb3B1cC1jb21tb24nO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItYnV0dG9ucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgYWN0aW9uIGJ1dHRvbnMgb2YgdGhlIERpYWxvZ1xuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBhY3Rpb25idXR0b25zX2RpYWxvZyAlfSkpLlxuICovXG5jbGFzcyBEaWFsb2dBY3Rpb25zQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbCkge1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHBvc3NpYmxlIGxheW91dCBvZiB0aGUgYWN0aW9uIGJ1dHRvbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxheW91dCA9ICdzdHJldGNoZWQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYW4gYWN0aW9uIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmJ1dHRvbkdyb3VwQ2xhc3NOYW1lID0gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0ID09PSAnc3RyZXRjaGVkJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGFjdGlvblRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkJ1dHRvbkNsaWNrKGFjdGlvbiwgX2UpIHtcbiAgICAgICAgdGhpcy5hY3Rpb24uZW1pdChhY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgYnV0dG9uQ2xhc3MoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbJ2stYnV0dG9uJ107XG4gICAgICAgIGlmIChhY3Rpb24ucHJpbWFyeSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdrLXByaW1hcnknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxufVxuRGlhbG9nQWN0aW9uc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZGlhbG9nLWFjdGlvbnMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiIWFjdGlvbnNcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYWN0aW9uVGVtcGxhdGUoKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJ1dHRvbkNsYXNzKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGFjdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFjdGlvbi50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24udGV4dCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aW9uc1wiICpuZ0lmPVwiYWN0aW9uVGVtcGxhdGUoKVwiPjwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EaWFsb2dBY3Rpb25zQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9XG5dO1xuRGlhbG9nQWN0aW9uc0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBhY3Rpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsYXlvdXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGlvbjogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGJ1dHRvbkdyb3VwQ2xhc3NOYW1lOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRpYWxvZy1idXR0b25ncm91cCcsXSB9XSxcbiAgICBjbGFzc05hbWU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZGlhbG9nLWJ1dHRvbi1sYXlvdXQtc3RyZXRjaGVkJyxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUHJldmVudGFibGVFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYSBzcGVjaWZpZWQgZXZlbnQuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBzb3VyY2UgY29tcG9uZW50IHN1cHByZXNzZXMgdGhlIGJ1aWx0LWluIGJlaGF2aW9yIHRoYXQgZm9sbG93cyB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMucHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzIHByZXZlbnRlZCBieSBhbnkgb2YgaXRzIHN1YnNjcmliZXJzLCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVmYXVsdCBhY3Rpb24gd2FzIHByZXZlbnRlZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgaXNEZWZhdWx0UHJldmVudGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2ZW50ZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBEaWFsb2dUaXRsZUJhciBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgYXBpX2RpYWxvZ19kaWFsb2d0aXRsZWJhcmNvbXBvbmVudCAlfSkuXG4gKlxuICogSXQgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEaWFsb2cgY29udGVudCB3aGVuIHRoZSBjb21wb25lbnQgaXMgY3JlYXRlZCBkeW5hbWljYWxseSBieSB1c2luZyBhbiBbQW5ndWxhciBzZXJ2aWNlXSh7JSBzbHVnIHNlcnZpY2VfZGlhbG9nICV9KS5cbiAqL1xuY2xhc3MgRGlhbG9nVGl0bGVCYXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGhvc3RFbGVtZW50LCBsb2NhbGl6YXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlID0gbG9jYWxpemF0aW9uU2VydmljZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbiBvZiB0aGUgdGl0bGUtYmFyIGlzIGNsaWNrZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGNsb3NlQnV0dG9uVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0KCdjbG9zZVRpdGxlJyk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5pZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsb3NlQ2xpY2soZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IG5ldyBQcmV2ZW50YWJsZUV2ZW50KCk7XG4gICAgICAgIHRoaXMuY2xvc2UuZW1pdChldmVudEFyZ3MpO1xuICAgIH1cbn1cbkRpYWxvZ1RpdGxlQmFyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kaWFsb2ctdGl0bGViYXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLXdpbmRvdy10aXRsZSBrLWRpYWxvZy10aXRsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiay13aW5kb3ctYWN0aW9ucyBrLWRpYWxvZy1hY3Rpb25zXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjbG9zZUJ1dHRvblRpdGxlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNsb3NlQnV0dG9uVGl0bGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1idXR0b24gay1iYXJlIGstYnV0dG9uLWljb24gay13aW5kb3ctYWN0aW9uIGstZGlhbG9nLWFjdGlvbiBrLWRpYWxvZy1jbG9zZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWkteFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EaWFsb2dUaXRsZUJhckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5EaWFsb2dUaXRsZUJhckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjbG9zZVRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjbGFzc05hbWU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2luZG93LXRpdGxlYmFyJyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kaWFsb2ctdGl0bGViYXInLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1ByZXNlbnQgPSAodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNUcnV0aHkgPSAodmFsdWUpID0+ICEhdmFsdWU7XG5jb25zdCB0b0NsYXNzTGlzdCA9IChjbGFzc05hbWVzKSA9PiBTdHJpbmcoY2xhc3NOYW1lcykudHJpbSgpLnNwbGl0KCcgJyk7XG5jb25zdCBmb2N1c2FibGVSZWdleCA9IC9eKD86YXxpbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2k7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xudmFyIEtleXM7XG4oZnVuY3Rpb24gKEtleXMpIHtcbiAgICBLZXlzW0tleXNbXCJlc2NcIl0gPSAyN10gPSBcImVzY1wiO1xuICAgIEtleXNbS2V5c1tcInRhYlwiXSA9IDldID0gXCJ0YWJcIjtcbiAgICBLZXlzW0tleXNbXCJlbnRlclwiXSA9IDEzXSA9IFwiZW50ZXJcIjtcbiAgICBLZXlzW0tleXNbXCJzcGFjZVwiXSA9IDMyXSA9IFwic3BhY2VcIjtcbiAgICBLZXlzW0tleXNbXCJjdHJsXCJdID0gMTddID0gXCJjdHJsXCI7XG4gICAgS2V5c1tLZXlzW1wic2hpZnRcIl0gPSAxNl0gPSBcInNoaWZ0XCI7XG4gICAgS2V5c1tLZXlzW1wibGVmdFwiXSA9IDM3XSA9IFwibGVmdFwiO1xuICAgIEtleXNbS2V5c1tcInVwXCJdID0gMzhdID0gXCJ1cFwiO1xuICAgIEtleXNbS2V5c1tcInJpZ2h0XCJdID0gMzldID0gXCJyaWdodFwiO1xuICAgIEtleXNbS2V5c1tcImRvd25cIl0gPSA0MF0gPSBcImRvd25cIjtcbn0pKEtleXMgfHwgKEtleXMgPSB7fSkpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IERJQUxPR19FTEVNRU5UU19IQU5ETElOR19FU0NfS0VZID0gJ2stZGlhbG9nLXdyYXBwZXIgay1kaWFsb2ctYnV0dG9uZ3JvdXAgay1kaWFsb2ctYWN0aW9uJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBESUFMT0dfRUxFTUVOVFNfSEFORExJTkdfQVJST1dTID0gJ2stZGlhbG9nLWJ1dHRvbmdyb3VwJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBXSU5ET1dfQ0xBU1NFUyA9ICdrLXdpbmRvdyc7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzQ2xhc3NlcyA9IChlbGVtZW50LCBjbGFzc05hbWVzKSA9PiB7XG4gICAgY29uc3QgbmFtZXNMaXN0ID0gdG9DbGFzc0xpc3QoY2xhc3NOYW1lcyk7XG4gICAgcmV0dXJuIEJvb2xlYW4odG9DbGFzc0xpc3QoZWxlbWVudC5jbGFzc05hbWUpLmZpbmQoKGNsYXNzTmFtZSkgPT4gbmFtZXNMaXN0LmluZGV4T2YoY2xhc3NOYW1lKSA+PSAwKSk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzVmlzaWJsZSA9IChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuICEhKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0ZvY3VzYWJsZSA9IChlbGVtZW50LCBjaGVja1Zpc2liaWxpdHkgPSB0cnVlKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSkge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgICAgIGNvbnN0IHZhbGlkVGFiSW5kZXggPSB0YWJJbmRleCAhPT0gbnVsbCAmJiAhaXNOYU4odGFiSW5kZXgpICYmIHRhYkluZGV4ID4gLTE7XG4gICAgICAgIGxldCBmb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZVJlZ2V4LnRlc3QodGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZSA9ICFlbGVtZW50LmRpc2FibGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9jdXNhYmxlID0gdmFsaWRUYWJJbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9jdXNhYmxlICYmICghY2hlY2tWaXNpYmlsaXR5IHx8IGlzVmlzaWJsZShlbGVtZW50KSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZm9jdXNhYmxlU2VsZWN0b3IgPSBbXG4gICAgJ2FbaHJlZl0nLFxuICAgICdhcmVhW2hyZWZdJyxcbiAgICAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pJyxcbiAgICAnc2VsZWN0Om5vdChbZGlzYWJsZWRdKScsXG4gICAgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsXG4gICAgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLFxuICAgICdpZnJhbWUnLFxuICAgICdvYmplY3QnLFxuICAgICdlbWJlZCcsXG4gICAgJypbdGFiaW5kZXhdJyxcbiAgICAnKltjb250ZW50ZWRpdGFibGVdJ1xuXS5qb2luKCcsJyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgcHJldmVudERlZmF1bHQgPSAoeyBvcmlnaW5hbEV2ZW50OiBldmVudCB9KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgUkVTSVpFX0RJUkVDVElPTlMgPSBbJ24nLCAnZScsICdzJywgJ3cnLCAnc2UnLCAnc3cnLCAnbmUnLCAnbncnXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBPRkZTRVRfU1RZTEVTID0gWyd0b3AnLCAnbGVmdCcsICd3aWR0aCcsICdoZWlnaHQnXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1N0cmluZyA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc051bWJlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY3JlYXRlVmFsdWVXaXRoVW5pdCA9ICh2YWx1ZSkgPT4gdmFsdWUgKyAoaXNOdW1iZXIodmFsdWUpID8gJ3B4JyA6ICcnKTtcblxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgZm9yIHRoZSBEaWFsb2cgYWN0aW9ucyB3aGVuIHRoZSBEaWFsb2cgaXMgb3BlbmVkIHRocm91Z2ggYERpYWxvZ1NlcnZpY2VgXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwaV9kaWFsb2dfZGlhbG9nc2VydmljZSAlfSN0b2Mtb3BlbikpLlxuICovXG5jbGFzcyBEaWFsb2dBY3Rpb24ge1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgKipDbG9zZSoqIGJ1dHRvbiBpcyBjbGlja2VkLiBVc2VkIHdoZW4gdGhlIHJlc3VsdHMgZnJvbVxuICogdGhlIERpYWxvZ3MgdGhhdCBhcmUgb3BlbmVkIHRocm91Z2ggYERpYWxvZ1NlcnZpY2VgIGFyZSBmaWx0ZXJlZFxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBhcGlfZGlhbG9nX2RpYWxvZ3NlcnZpY2UgJX0jdG9jLW9wZW4pKS5cbiAqL1xuY2xhc3MgRGlhbG9nQ2xvc2VSZXN1bHQge1xufVxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHRoZSBEaWFsb2cgaXMgb3BlbmVkIHRocm91Z2ggYERpYWxvZ1NlcnZpY2VgLlxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBhcGlfZGlhbG9nX2RpYWxvZ3NlcnZpY2UgJX0jdG9jLW9wZW4pKS5cbiAqL1xuY2xhc3MgRGlhbG9nU2V0dGluZ3Mge1xufVxuLyoqXG4gKiBIb2xkcyByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgaW5zdGFuY2UgYW5kIHB1Ymxpc2hlZCBldmVudHMgb2YgdGhlIERpYWxvZy5cbiAqIENvbnRyb2xzIHRoZSBEaWFsb2dzIHRoYXQgd2VyZSBvcGVuZWQgdGhyb3VnaCB0aGUgYERpYWxvZ1NlcnZpY2VgXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwaV9kaWFsb2dfZGlhbG9nc2VydmljZSAlfSN0b2Mtb3BlbikpLlxuICovXG5jbGFzcyBEaWFsb2dSZWYge1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgRElBTE9HX0xPQ0FMSVpBVElPTl9TRVJWSUNFID0gbmV3IEluamVjdGlvblRva2VuKCdEaWFsb2cgTG9jYWxpemF0aW9uU2VydmljZScpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBEaWFsb2cgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X2RpYWxvZ19kaWFsb2dzICV9KS5cbiAqL1xuY2xhc3MgRGlhbG9nQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihfZWxSZWYsIF9yZW5kZXJlciwgbG9jYWxpemF0aW9uLCBjZHIpIHtcbiAgICAgICAgdGhpcy5fZWxSZWYgPSBfZWxSZWY7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBhY3Rpb24gYnV0dG9ucyBpbiB0aGUgRGlhbG9nLlxuICAgICAgICAgKiBUaGlzIG9wdGlvbiBpcyBvbmx5IGFwcGxpY2FibGUgaWYgdGhlIGFjdGlvbiBidXR0b25zIGFyZSBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgYGFjdGlvbnNgIG9wdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0ICdzdHJldGNoZWQnXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGlvbnNMYXlvdXQgPSAnc3RyZXRjaGVkJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGVJZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhbiBhY3Rpb24gYnV0dG9uIG9mIHRoZSBEaWFsb2cuXG4gICAgICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbmx5IHdoZW4gdGhlIGFjdGlvbiBidXR0b25zIGFyZSBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgYGFjdGlvbnNgIG9wdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSAqKkNsb3NlKiogYnV0dG9uIG9mIHRoZSBEaWFsb2cuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gbG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoeyBydGwgfSkgPT4gKHRoaXMuZGlyZWN0aW9uID0gcnRsID8gJ3J0bCcgOiAnbHRyJykpKTtcbiAgICAgICAgdGhpcy50aXRsZUlkID0gdGhpcy5nZW5lcmF0ZVRpdGxlSWQoKTtcbiAgICB9XG4gICAgZ2V0IGRpcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Db21wb25lbnRLZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChoYXNDbGFzc2VzKHRhcmdldCwgRElBTE9HX0VMRU1FTlRTX0hBTkRMSU5HX0VTQ19LRVkpIHx8IGhhc0NsYXNzZXMocGFyZW50LCBESUFMT0dfRUxFTUVOVFNfSEFORExJTkdfRVNDX0tFWSkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlzLmVzYykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdChuZXcgRGlhbG9nQ2xvc2VSZXN1bHQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0NsYXNzZXModGFyZ2V0LCAnay1idXR0b24nKSAmJlxuICAgICAgICAgICAgaGFzQ2xhc3NlcyhwYXJlbnQsIERJQUxPR19FTEVNRU5UU19IQU5ETElOR19BUlJPV1MpICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5sZWZ0IHx8IGV2ZW50LmtleUNvZGUgPT09IEtleXMucmlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbkJ1dHRvbkZvY3VzKHBhcmVudCwgZXZlbnQua2V5Q29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleXMudGFiKSB7XG4gICAgICAgICAgICB0aGlzLmtlZXBGb2N1c1dpdGhpbkNvbXBvbmVudCh0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuYnViYmxlKCdjbG9zZScsIHRoaXMudGl0bGViYXJDb250ZW50KTtcbiAgICAgICAgaWYgKHRoaXMudGl0bGViYXJDb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlYmFyQ29udGVudC5pZCA9IHRoaXMudGl0bGVJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlSW5pdGlhbEZvY3VzKCk7XG4gICAgICAgIHRoaXMuYnViYmxlKCdjbG9zZScsIHRoaXMudGl0bGViYXJWaWV3KTtcbiAgICAgICAgdGhpcy5idWJibGUoJ2FjdGlvbicsIHRoaXMuYWN0aW9uc1ZpZXcpO1xuICAgICAgICBpZiAodGhpcy50aXRsZWJhclZpZXcgfHwgdGhpcy50aXRsZWJhckNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vTmVlZGVkIGZvciBEaWFsb2dzIGNyZWF0ZWQgdmlhIHNlcnZpY2VcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rLWRpYWxvZycpLCAnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy50aXRsZUlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICd0aXRsZScpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSB3cmFwcGVyIG9mIHRoZSBEaWFsb2cgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh3cmFwcGVyKSkge1xuICAgICAgICAgICAgd3JhcHBlci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVJbml0aWFsRm9jdXMoKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwcmltYXJ5QnV0dG9uID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuay1wcmltYXJ5Jyk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9Gb2N1c2VkRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbGx5Rm9jdXNlZEVsZW1lbnQgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IodGhpcy5hdXRvRm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGluaXRpYWxseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbGx5Rm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNob3VsZEZvY3VzUHJpbWFyeShwcmltYXJ5QnV0dG9uKSkge1xuICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd3JhcHBlci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVBY3Rpb25CdXR0b25Gb2N1cyhwYXJlbnQsIGtleSkge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVBY3Rpb25CdXR0b25zID0gdGhpcy5nZXRBbGxGb2N1c2FibGVDaGlsZHJlbihwYXJlbnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvY3VzYWJsZUFjdGlvbkJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmb2N1c2FibGVBY3Rpb25CdXR0b25zW2ldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBLZXlzLmxlZnQgJiYgaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlQWN0aW9uQnV0dG9uc1tpIC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IEtleXMucmlnaHQgJiYgaSA8IGZvY3VzYWJsZUFjdGlvbkJ1dHRvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVBY3Rpb25CdXR0b25zW2kgKyAxXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGtlZXBGb2N1c1dpdGhpbkNvbXBvbmVudCh0YXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzYWJsZSA9IHRoaXMuZ2V0TGFzdEZvY3VzYWJsZUVsZW1lbnQoZmlyc3RGb2N1c2FibGUpO1xuICAgICAgICBjb25zdCB0YWJCZWZvcmVGaXJzdEZvY3VzYWJsZSA9IHRhcmdldCA9PT0gZmlyc3RGb2N1c2FibGUgJiYgZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIGNvbnN0IHRhYkFmdGVyTGFzdEZvY3VzYWJsZSA9ICFldmVudC5zaGlmdEtleSAmJiBpc1ByZXNlbnQobGFzdEZvY3VzYWJsZSkgJiYgdGFyZ2V0ID09PSBsYXN0Rm9jdXNhYmxlO1xuICAgICAgICBjb25zdCB0YWJXaXRoTm9Gb2N1c2FibGUgPSAhaXNQcmVzZW50KGxhc3RGb2N1c2FibGUpICYmICFldmVudC5zaGlmdEtleTtcbiAgICAgICAgaWYgKHRhYkJlZm9yZUZpcnN0Rm9jdXNhYmxlIHx8IHRhYldpdGhOb0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGZpcnN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYkFmdGVyTGFzdEZvY3VzYWJsZSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxhc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2hvdWxkRm9jdXNQcmltYXJ5KGVsKSB7XG4gICAgICAgIHJldHVybiBpc1ByZXNlbnQoZWwpICYmIGlzRm9jdXNhYmxlKGVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldEFsbEZvY3VzYWJsZUNoaWxkcmVuKHBhcmVudCkge1xuICAgICAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZm9jdXNhYmxlU2VsZWN0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0TGFzdEZvY3VzYWJsZUVsZW1lbnQocGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IHRoaXMuZ2V0QWxsRm9jdXNhYmxlQ2hpbGRyZW4ocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIGFsbC5sZW5ndGggPiAwID8gYWxsW2FsbC5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVRpdGxlSWQoKSB7XG4gICAgICAgIHJldHVybiAna2VuZG8tZGlhbG9nLXRpdGxlLScgKyBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGdldCB3cmFwcGVyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgc3R5bGVzKCkge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHN0eWxlcy53aWR0aCA9IGNyZWF0ZVZhbHVlV2l0aFVuaXQodGhpcy53aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZXMuaGVpZ2h0ID0gY3JlYXRlVmFsdWVXaXRoVW5pdCh0aGlzLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGgpIHtcbiAgICAgICAgICAgIHN0eWxlcy5taW5XaWR0aCA9IGNyZWF0ZVZhbHVlV2l0aFVuaXQodGhpcy5taW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHN0eWxlcy5tYXhXaWR0aCA9IGNyZWF0ZVZhbHVlV2l0aFVuaXQodGhpcy5tYXhXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluSGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZXMubWluSGVpZ2h0ID0gY3JlYXRlVmFsdWVXaXRoVW5pdCh0aGlzLm1pbkhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4SGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZXMubWF4SGVpZ2h0ID0gY3JlYXRlVmFsdWVXaXRoVW5pdCh0aGlzLm1heEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICB9XG4gICAgYnViYmxlKGV2ZW50TmFtZSwgY29tcG9uZW50KSB7XG4gICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVtaXQgPSBlID0+IHRoaXNbZXZlbnROYW1lXS5lbWl0KGUpO1xuICAgICAgICAgICAgY29uc3QgcyA9IGNvbXBvbmVudFtldmVudE5hbWVdLnN1YnNjcmliZShlbWl0KTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgfVxufVxuRGlhbG9nQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdvdmVybGF5QXBwZWFyJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtzdHlsZSh7IG9wYWNpdHk6IDAuMSB9KSwgYW5pbWF0ZSgnLjNzIGN1YmljLWJlemllciguMiwgLjYsIC40LCAxKScpXSlcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoJ2RpYWxvZ1NsaWRlSW5BcHBlYXInLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgwLCAwKScgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDAsIC0xMCUpJyB9KSwgYW5pbWF0ZSgnLjNzIGN1YmljLWJlemllciguMiwgMSwgLjIsIDEpJyldKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb0RpYWxvZycsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERJQUxPR19MT0NBTElaQVRJT05fU0VSVklDRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBMb2NhbGl6YXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5kaWFsb2cnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZGlhbG9nJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBrZW5kb0RpYWxvZ0xvY2FsaXplZE1lc3NhZ2VzXG4gICAgICAgICAgICBpMThuLWNsb3NlVGl0bGU9XCJrZW5kby5kaWFsb2cuY2xvc2VUaXRsZXxUaGUgdGl0bGUgb2YgdGhlIGNsb3NlIGJ1dHRvblwiXG4gICAgICAgICAgICBjbG9zZVRpdGxlPVwiQ2xvc2VcIlxuICAgICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLW92ZXJsYXlcIiBAb3ZlcmxheUFwcGVhcj48L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiay13aWRnZXQgay13aW5kb3cgay1kaWFsb2dcIiByb2xlPVwiZGlhbG9nXCIgW25nU3R5bGVdPVwic3R5bGVzXCIgQGRpYWxvZ1NsaWRlSW5BcHBlYXI+XG4gICAgICAgICAgICA8a2VuZG8tZGlhbG9nLXRpdGxlYmFyICpuZ0lmPVwidGl0bGVcIiBbY2xvc2VUaXRsZV09XCJjbG9zZVRpdGxlXCIgW2lkXT1cInRpdGxlSWRcIj57eyB0aXRsZSB9fTwva2VuZG8tZGlhbG9nLXRpdGxlYmFyPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwia2VuZG8tZGlhbG9nLXRpdGxlYmFyXCIgKm5nSWY9XCIhdGl0bGVcIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrLWNvbnRlbnQgay13aW5kb3ctY29udGVudCBrLWRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhY29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VGVtcGxhdGVcIiAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwia2VuZG8tZGlhbG9nLWFjdGlvbnNcIiAqbmdJZj1cIiFhY3Rpb25zXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPGtlbmRvLWRpYWxvZy1hY3Rpb25zICpuZ0lmPVwiYWN0aW9uc1wiIFthY3Rpb25zXT1cImFjdGlvbnNcIiBbbGF5b3V0XT1cImFjdGlvbnNMYXlvdXRcIj4gPC9rZW5kby1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EaWFsb2dDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5EaWFsb2dDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgYWN0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aW9uc0xheW91dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXV0b0ZvY3VzZWRFbGVtZW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0aXRsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgd2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbldpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXhXaWR0aDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVpZ2h0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW5IZWlnaHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1heEhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aW9uOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2xvc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBkaXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIHRhYkluZGV4OiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnRhYkluZGV4JyxdIH1dLFxuICAgIHRpdGxlYmFyQ29udGVudDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbRGlhbG9nVGl0bGVCYXJDb21wb25lbnQsXSB9XSxcbiAgICB0aXRsZWJhclZpZXc6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0RpYWxvZ1RpdGxlQmFyQ29tcG9uZW50LF0gfV0sXG4gICAgYWN0aW9uc1ZpZXc6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0RpYWxvZ0FjdGlvbnNDb21wb25lbnQsXSB9XSxcbiAgICBvbkNvbXBvbmVudEtleWRvd246IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydrZXlkb3duJywgWyckZXZlbnQnXSxdIH1dLFxuICAgIHdyYXBwZXJDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kaWFsb2ctd3JhcHBlcicsXSB9XVxufTtcblxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyAgd2hpY2ggd2lsbCBiZSBleHRlbmRlZCBieSBhIGNvbXBvbmVudCB0aGF0IGlzIHByb3ZpZGVkIGFzIGNvbnRlbnQgdGhyb3VnaCBgY29udGVudGBcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgc2VydmljZV9kaWFsb2cgJX0jdG9jLXBhc3NpbmctdGl0bGUtY29udGVudC1hbmQtYWN0aW9ucy1hcy1hLXNpbmdsZS1jb21wb25lbnQpKS5cbiAqL1xuY2xhc3MgRGlhbG9nQ29udGVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRpYWxvZykge1xuICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlhbG9nVGl0bGVCYXIpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gb3BlbmluZyBjb21wb25lbnQgaW5zaWRlIGRpYWxvZyB3aXRoIHNlcnZpY2UgQU5EIHRoZSBjb21wb25lbnQgaGFzIGRlZmluZWQgaXRzIG93biB0aXRsZWJhclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dUaXRsZUJhci5jbG9zZS5waXBlKGZpbHRlcigoZSkgPT4gIWUuaXNEZWZhdWx0UHJldmVudGVkKCkpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaWFsb2dBY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kaWFsb2dBY3Rpb25zLmFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0FjdGlvbnMuYWN0aW9uLnN1YnNjcmliZShhY3Rpb24gPT4gdGhpcy5kaWFsb2cuZGlhbG9nLmluc3RhbmNlLmFjdGlvbi5lbWl0KGFjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuRGlhbG9nQ29udGVudEJhc2UucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZGlhbG9nVGl0bGVCYXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW0RpYWxvZ1RpdGxlQmFyQ29tcG9uZW50LF0gfV0sXG4gICAgZGlhbG9nQWN0aW9uczogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbRGlhbG9nQWN0aW9uc0NvbXBvbmVudCxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGlhbG9nQ29udGFpbmVyU2VydmljZSB7XG4gICAgc2V0IGNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgICAgICAgRGlhbG9nQ29udGFpbmVyU2VydmljZS5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfVxuICAgIGdldCBjb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBEaWFsb2dDb250YWluZXJTZXJ2aWNlLmNvbnRhaW5lcjtcbiAgICB9XG59XG5EaWFsb2dDb250YWluZXJTZXJ2aWNlLmNvbnRhaW5lciA9IG51bGw7XG5EaWFsb2dDb250YWluZXJTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbmNvbnN0IGlzTm90Q29tcG9uZW50ID0gKGNvbXBvbmVudCkgPT4gaXNTdHJpbmcoY29tcG9uZW50KSB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbmNsYXNzIERpYWxvZ0luamVjdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihnZXREaWFsb2dSZWYsIHBhcmVudEluamVjdG9yKSB7XG4gICAgICAgIHRoaXMuZ2V0RGlhbG9nUmVmID0gZ2V0RGlhbG9nUmVmO1xuICAgICAgICB0aGlzLnBhcmVudEluamVjdG9yID0gcGFyZW50SW5qZWN0b3I7XG4gICAgfVxuICAgIGdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICBpZiAodG9rZW4gPT09IERpYWxvZ1JlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlhbG9nUmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50SW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqIEEgc2VydmljZSBmb3Igb3BlbmluZyBEaWFsb2cgd2luZG93cyBkeW5hbWljYWxseVxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzZXJ2aWNlX2RpYWxvZyAlfSkpLlxuICovXG5jbGFzcyBEaWFsb2dTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVzb2x2ZXIsIGNvbnRhaW5lclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UgPSBjb250YWluZXJTZXJ2aWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIERpYWxvZyB3aW5kb3cuIFJlcXVpcmVzIGFuIGVsZW1lbnQgaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGVcbiAgICAgKiBbYGtlbmRvRGlhbG9nQ29udGFpbmVyYF0oeyUgc2x1ZyBhcGlfZGlhbG9nX2RpYWxvZ2NvbnRhaW5lcmRpcmVjdGl2ZSAlfSkgZGlyZWN0aXZlLlxuICAgICAqIENyZWF0ZWQgRGlhbG9ncyB3aWxsIGJlIG1vdW50ZWQgaW4gdGhlIERPTSBkaXJlY3RseSBhZnRlciB0aGF0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RpYWxvZ0FjdGlvbn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRoYXQgZGVmaW5lIHRoZSBEaWFsb2cuXG4gICAgICogQHJldHVybnMge0RpYWxvZ1JlZn0gLSBBIHJlZmVyZW5jZSB0byB0aGUgRGlhbG9nIG9iamVjdCBhbmQgdGhlIGNvbnZlbmllbmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHMtbm8tcnVuXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgPGJ1dHRvbiBrZW5kb0J1dHRvbiAoY2xpY2spPVwib3BlbigpXCI+SGFybWxlc3MgYnV0dG9uPC9idXR0b24+XG4gICAgICogICAgIDxkaXYga2VuZG9EaWFsb2dDb250YWluZXI+PC9kaXY+XG4gICAgICogICBgXG4gICAgICogfSlcbiAgICAgKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgKiAgICAgY29uc3RydWN0b3IoIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSApIHt9XG4gICAgICpcbiAgICAgKiAgICAgcHVibGljIG9wZW4oKSB7XG4gICAgICogICAgICAgICB2YXIgZGlhbG9nID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xuICAgICAqICAgICAgICAgICB0aXRsZTogXCJQbGVhc2UgY29uZmlybVwiLFxuICAgICAqICAgICAgICAgICBjb250ZW50OiBcIkFyZSB5b3Ugc3VyZT9cIixcbiAgICAgKiAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAqICAgICAgICAgICAgIHsgdGV4dDogXCJOb1wiIH0sXG4gICAgICogICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBwcmltYXJ5OiB0cnVlIH1cbiAgICAgKiAgICAgICAgICAgXVxuICAgICAqICAgICAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgICAgIGRpYWxvZy5yZXN1bHQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgKiAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERpYWxvZ0Nsb3NlUmVzdWx0KSB7XG4gICAgICogICAgICAgICAgICAgY29uc29sZS5sb2coXCJjbG9zZVwiKTtcbiAgICAgKiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImFjdGlvblwiLCByZXN1bHQpO1xuICAgICAqICAgICAgICAgICB9XG4gICAgICogICAgICAgICB9KTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqL1xuICAgIG9wZW4ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEaWFsb2dDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBvcHRpb25zLmFwcGVuZFRvIHx8IHRoaXMuY29udGFpbmVyU2VydmljZS5jb250YWluZXI7XG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuQ2Fubm90IGF0dGFjaCBkaWFsb2cgdG8gdGhlIHBhZ2UuXG5BZGQgYW4gZWxlbWVudCB0aGF0IHVzZXMgdGhlIGtlbmRvRGlhbG9nQ29udGFpbmVyIGRpcmVjdGl2ZSwgb3Igc2V0IHRoZSAnYXBwZW5kVG8nIHByb3BlcnR5LlxuU2VlIGh0dHBzOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kaWFsb2dzL2RpYWxvZy9zZXJ2aWNlLy5cbiAgICAgICAgICBgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgRGlhbG9nUmVmIHRvICgxKSBwYXNzIGFzIHJlc3VsdCwgKDIpIHByb3ZpZGUgdGhyb3VnaCBpbmplY3RvclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB7XG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50OiBudWxsLFxuICAgICAgICAgICAgZGlhbG9nOiBudWxsLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVEaWFsb2cob3B0aW9ucy5jb250ZW50LCBmYWN0b3J5LCBjb250YWluZXIsIGRpYWxvZ1JlZiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGluaXRpYWxpemVEaWFsb2coY29tcG9uZW50LCBmYWN0b3J5LCBjb250YWluZXIsIGRpYWxvZ1JlZiwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50RnJvbShjb21wb25lbnQsIGNvbnRhaW5lciwgZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgZGlhbG9nID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGVudC5ub2Rlcyk7XG4gICAgICAgIGRpYWxvZ1JlZi5kaWFsb2cgPSBkaWFsb2c7XG4gICAgICAgIGRpYWxvZy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgLy8gY29weSBASW5wdXQgb3B0aW9ucyB0byBkaWFsb2cgaW5zdGFuY2VcbiAgICAgICAgdGhpcy5hcHBseU9wdGlvbnMoZGlhbG9nLmluc3RhbmNlLCBvcHRpb25zKTtcbiAgICAgICAgLy8gY3JlYXRlIGNsb3NlIGhhbmRsZXIgYW5kIHJlc3VsdCBzdHJlYW1cbiAgICAgICAgY29uc3QgYXBpQ2xvc2UgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICBjb25zdCBjbG9zZSA9IChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFByZXZlbnRhYmxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBlID0gbmV3IERpYWxvZ0Nsb3NlUmVzdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcGlDbG9zZS5uZXh0KGUgfHwgbmV3IERpYWxvZ0Nsb3NlUmVzdWx0KCkpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbWVyZ2UoYXBpQ2xvc2UsIFxuICAgICAgICAvLyB0cmlnZ2VyZWQgd2hlbiB0aGUgdGl0bGViYXIgb3IgYWN0aW9ucyBhcmUgZGVmaW5lZCBpbiBEaWFsb2dTZXR0aW5nc1xuICAgICAgICBtZXJnZShkaWFsb2cuaW5zdGFuY2UuY2xvc2UsIGRpYWxvZy5pbnN0YW5jZS5hY3Rpb24pLnBpcGUobWFwKGUgPT4gKGUgaW5zdGFuY2VvZiBQcmV2ZW50YWJsZUV2ZW50ID8gbmV3IERpYWxvZ0Nsb3NlUmVzdWx0KCkgOiBlKSksIGZpbHRlcihlID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnByZXZlbnRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgZGlhbG9nUmVmIG9ubHkgd2hlbiB1c2luZyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2dSZWZQYXJhbWV0ZXIgPSBpc05vdENvbXBvbmVudChjb21wb25lbnQpID8gdW5kZWZpbmVkIDogZGlhbG9nUmVmO1xuICAgICAgICAgICAgICAgIHJldHVybiAhb3B0aW9ucy5wcmV2ZW50QWN0aW9uKGUsIGRpYWxvZ1JlZlBhcmFtZXRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkpKS5waXBlKHRha2UoMSksIFxuICAgICAgICAvLyBUYWtlcyBjYXJlIGZvciBtdWx0aXBsZSBzdWJzY3JpcHRpb25zOlxuICAgICAgICAvLyBXZSBzdWJzY3JpYmUgaW50ZXJuYWx5IGFuZCB0aGUgdXNlciBtYXkgc3Vic2NyaWJlIHRvIGdldCBhIGNsb3NlIHJlc3VsdCAtIGRpYWxvZy5yZXN1bHQuc3Vic2NyaWJlKCkuXG4gICAgICAgIC8vIFRoaXMgY2F1c2VzIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNhbWUgc291cmNlIGFuZCB0aHVzIG11bHRpcGxlIGVtaXNzaW9ucy4gc2hhcmUoKSBzb2x2ZXMgdGhhdC5cbiAgICAgICAgc2hhcmUoKSk7XG4gICAgICAgIHJlc3VsdC5zdWJzY3JpYmUoY2xvc2UpO1xuICAgICAgICBkaWFsb2dSZWYuY2xvc2UgPSBjbG9zZTtcbiAgICAgICAgZGlhbG9nUmVmLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgY29uc3QgaGFzQ29udGVudFRpdGxlID0gY29udGVudC5ub2Rlc1swXSAmJiBjb250ZW50Lm5vZGVzWzBdLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBjb25zdCBoYXNDb250ZW50QWN0aW9ucyA9IGNvbnRlbnQubm9kZXNbMl0gJiYgY29udGVudC5ub2Rlc1syXS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGVUaXRsZXMgPSBvcHRpb25zLnRpdGxlICYmIGhhc0NvbnRlbnRUaXRsZTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlQWN0aW9ucyA9IG9wdGlvbnMuYWN0aW9ucyAmJiBoYXNDb250ZW50QWN0aW9ucztcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQucHJvdG90eXBlIGluc3RhbmNlb2YgRGlhbG9nQ29udGVudEJhc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50IGNvbXBvbmVudCBleHRlbmRzIERpYWxvZ0NvbnRlbnRCYXNlXG4gICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlVGl0bGVzIHx8IG11bHRpcGxlQWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFxuICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBUaXRsZSBhbmQvb3IgQWN0aW9ucyBjb25maWd1cmF0aW9ucyBkZXRlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyBhIGNvbXBvbmVudCBhcyBjb250ZW50LCBwcm92aWRlIHRoZSB0aXRsZSBhbmQgYWN0aW9ucyBlaXRoZXIgaW4gdGhlIGNvbXBvbmVudCdzIG1hcmt1cFxuICAgICAgICAgICAgICAgICAgICBvciB2aWEgdGhlIHRpdGxlIGFuZCBhY3Rpb25zIHByb3BlcnRpZXMgb2YgdGhlIERpYWxvZ1NldHRpbmdzIG9iamVjdCwgYnV0IG5vdCBib3RoLlxuICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RpYWxvZ3MvZGlhbG9nL3NlcnZpY2UvI3RvYy1wYXNzaW5nLXRpdGxlLWNvbnRlbnQtYW5kLWFjdGlvbnMtYXMtYS1zaW5nbGUtY29tcG9uZW50J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChoYXNDb250ZW50VGl0bGUgfHwgaGFzQ29udGVudEFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBcbiAgICAgICAgICAgICAgICAgICAgV2hlbiBUaXRsZSBhbmQvb3IgQWN0aW9ucyBtYXJrdXAgaXMgcHJvdmlkZWQgaW4gY29udGVudCBjb21wb25lbnQncyB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBuZWVkcyB0byBpbmhlcml0IHRoZSBEaWFsb2dDb250ZW50QmFzZSBjbGFzcyB0byBlbnN1cmUgdGhhdCBjbG9zZSBhbmQgcmVzdWx0IGV2ZW50cyBhcmUgcHJvcGVybHkgaG9va2VkLlxuICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RpYWxvZ3MvZGlhbG9nL3NlcnZpY2UvI3RvYy1wYXNzaW5nLXRpdGxlLWNvbnRlbnQtYW5kLWFjdGlvbnMtYXMtYS1zaW5nbGUtY29tcG9uZW50J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlhbG9nUmVmO1xuICAgIH1cbiAgICBhcHBseU9wdGlvbnMoaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgaW5zdGFuY2UudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xuICAgICAgICBpbnN0YW5jZS5hY3Rpb25zID0gb3B0aW9ucy5hY3Rpb25zO1xuICAgICAgICBpbnN0YW5jZS5hY3Rpb25zTGF5b3V0ID0gb3B0aW9ucy5hY3Rpb25zTGF5b3V0IHx8ICdzdHJldGNoZWQnO1xuICAgICAgICBpbnN0YW5jZS53aWR0aCA9IG9wdGlvbnMud2lkdGg7XG4gICAgICAgIGluc3RhbmNlLm1pbldpZHRoID0gb3B0aW9ucy5taW5XaWR0aDtcbiAgICAgICAgaW5zdGFuY2UubWF4V2lkdGggPSBvcHRpb25zLm1heFdpZHRoO1xuICAgICAgICBpbnN0YW5jZS5oZWlnaHQgPSBvcHRpb25zLmhlaWdodDtcbiAgICAgICAgaW5zdGFuY2UubWluSGVpZ2h0ID0gb3B0aW9ucy5taW5IZWlnaHQ7XG4gICAgICAgIGluc3RhbmNlLm1heEhlaWdodCA9IG9wdGlvbnMubWF4SGVpZ2h0O1xuICAgICAgICBpbnN0YW5jZS5hdXRvRm9jdXNlZEVsZW1lbnQgPSBvcHRpb25zLmF1dG9Gb2N1c2VkRWxlbWVudDtcbiAgICAgICAgaW5zdGFuY2UuY2xvc2VUaXRsZSA9IG9wdGlvbnMuY2xvc2VUaXRsZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb250ZW50VGVtcGxhdGUgPSBvcHRpb25zLmNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udGVudEZyb20oY29udGVudCwgY29udGFpbmVyLCBkaWFsb2dSZWYpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBjb250YWluZXIuaW5qZWN0b3IuZ2V0KFJlbmRlcmVyMik7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBsZXQgdGl0bGVOb2RlcyA9IFtdO1xuICAgICAgICBsZXQgYWN0aW9uTm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG5vZGVzID0gW3JlbmRlcmVyLmNyZWF0ZVRleHQoY29udGVudCldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgJiYgIShjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpKSB7XG4gICAgICAgICAgICAvLyBDb21wb25lbnRcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gbmV3IERpYWxvZ0luamVjdG9yKCgpID0+IGRpYWxvZ1JlZiwgY29udGFpbmVyLmluamVjdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbnRlbnQpO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB1bmRlZmluZWQsIGluamVjdG9yKTtcbiAgICAgICAgICAgIHRpdGxlTm9kZXMgPSBBcnJheS5mcm9tKGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2tlbmRvLWRpYWxvZy10aXRsZWJhcicpKTtcbiAgICAgICAgICAgIG5vZGVzID0gW2NvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50XTtcbiAgICAgICAgICAgIGFjdGlvbk5vZGVzID0gQXJyYXkuZnJvbShjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdrZW5kby1kaWFsb2ctYWN0aW9ucycpKTtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5jb250ZW50ID0gY29tcG9uZW50UmVmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYsXG4gICAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAgICAgIHRpdGxlTm9kZXMsXG4gICAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICAgICAgYWN0aW9uTm9kZXMgLy8gPG5nLWNvbnRlbnQgc2VsZWN0PVwia2VuZG8tZGlhbG9nLWFjdGlvbnNcIj5cbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG59XG5EaWFsb2dTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EaWFsb2dTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sXG4gICAgeyB0eXBlOiBEaWFsb2dDb250YWluZXJTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtEaWFsb2dDb250YWluZXJTZXJ2aWNlLF0gfV0gfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmxldCBuZXdaSW5kZXggPSAxMDAwMjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgIGhlaWdodDogbnVsbCxcbiAgICBsZWZ0OiBudWxsLFxuICAgIG1pbkhlaWdodDogMTAwLFxuICAgIG1pbldpZHRoOiAxMjAsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgcmVzaXphYmxlOiB0cnVlLFxuICAgIHN0YXRlOiAnZGVmYXVsdCcsXG4gICAgdG9wOiBudWxsLFxuICAgIHdpZHRoOiBudWxsXG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNyZWF0ZU1vdmVTdHJlYW0gPSAoZWwsIGV2KSA9PiBtb3VzZURvd24gPT4ge1xuICAgIHJldHVybiBlbC5rZW5kb0RyYWdcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKGVsLmtlbmRvUmVsZWFzZS5waXBlKHRhcCgoKSA9PiB7IGV2LmVtaXQoKTsgfSkpKSwgbWFwKCh7IHBhZ2VYLCBwYWdlWSB9KSA9PiAoe1xuICAgICAgICBvcmlnaW5hbFg6IG1vdXNlRG93bi5wYWdlWCxcbiAgICAgICAgb3JpZ2luYWxZOiBtb3VzZURvd24ucGFnZVksXG4gICAgICAgIHBhZ2VYLFxuICAgICAgICBwYWdlWVxuICAgIH0pKSk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERyYWdSZXNpemVTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihuZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5kcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnJlc2l6ZUVuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TKTtcbiAgICAgICAgdGhpcy5sYXN0QWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICB0aGlzLmRyYWdTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kcmFnU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0KGVsKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlJCQxID0gdGhpcy5vcHRpb25zLnN0YXRlO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdGhpcy53aW5kb3cgPSBlbDtcbiAgICAgICAgaWYgKHN0YXRlJCQxICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUkJDEgPT09ICdtaW5pbWl6ZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlaWdodCA9IDA7XG4gICAgICAgICAgICBvcHRpb25zLm1pbkhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlJCQxID09PSAnbWF4aW1pemVkJykge1xuICAgICAgICAgICAgb3B0aW9ucy5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25EcmFnKGVsKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXJ0UG9zaXRpb247XG4gICAgICAgICAgICBsZXQgZHJhZ1N0YXJ0ZWQ7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdWJzY3JpcHRpb24gPSBlbC5rZW5kb1ByZXNzXG4gICAgICAgICAgICAgICAgLnBpcGUodGFwKChldikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdChldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIGRyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KSwgc3dpdGNoTWFwKGNyZWF0ZU1vdmVTdHJlYW0oZWwsIHRoaXMuZHJhZ0VuZCkpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgcGFnZVgsIHBhZ2VZLCBvcmlnaW5hbFgsIG9yaWdpbmFsWSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkcmFnU3RhcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZVdpZHRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0LmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgZHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURyYWcoe1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFgsIG9yaWdpbmFsWSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVgsIHBhZ2VZLCBzdGFydFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnKHsgb3JpZ2luYWxYLCBvcmlnaW5hbFksIHBhZ2VYLCBwYWdlWSwgc3RhcnRQb3NpdGlvbiB9KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sZWZ0ID0gc3RhcnRQb3NpdGlvbi54ICsgcGFnZVggLSBvcmlnaW5hbFg7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b3AgPSBzdGFydFBvc2l0aW9uLnkgKyBwYWdlWSAtIG9yaWdpbmFsWTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdGF0ZSA9PT0gJ21pbmltaXplZCcgJiYgaXNQcmVzZW50KHRoaXMucmVzdG9yZU9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVPcHRpb25zLmxlZnQgPSB0aGlzLm9wdGlvbnMubGVmdDtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZU9wdGlvbnMudG9wID0gdGhpcy5vcHRpb25zLnRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGxlZnQ6IHN0YXJ0UG9zaXRpb24ueCArIHBhZ2VYIC0gb3JpZ2luYWxYLFxuICAgICAgICAgICAgdG9wOiBzdGFydFBvc2l0aW9uLnkgKyBwYWdlWSAtIG9yaWdpbmFsWVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25SZXNpemUoaGFuZGxlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXRBbmRQb3NpdGlvbjtcbiAgICAgICAgICAgIGxldCByZXNpemVTdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBoYW5kbGUua2VuZG9QcmVzcy5waXBlKHRhcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdChldik7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cy5lbWl0KCk7XG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXRBbmRQb3NpdGlvbiA9IHRoaXMuY3VycmVudE9mZnNldEFuZFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmVzaXplU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSksIHN3aXRjaE1hcChjcmVhdGVNb3ZlU3RyZWFtKGhhbmRsZSwgdGhpcy5yZXNpemVFbmQpKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHBhZ2VYLCBwYWdlWSwgb3JpZ2luYWxYLCBvcmlnaW5hbFkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzaXplU3RhcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVN0YXJ0LmVtaXQoZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkZWx0YVggPSBwYWdlWCAtIG9yaWdpbmFsWDtcbiAgICAgICAgICAgICAgICBsZXQgZGVsdGFZID0gcGFnZVkgLSBvcmlnaW5hbFk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoc3RhcnRPZmZzZXRBbmRQb3NpdGlvbiwgZGlyZWN0aW9uLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBoYW5kbGVSZXNpemUoaW5pdGlhbCwgZGlyLCBkZWx0YVgsIGRlbHRhWSkge1xuICAgICAgICBjb25zdCBvbGQgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGxldCBldiA9IHt9O1xuICAgICAgICBpZiAoZGlyLmluZGV4T2YoJ2UnKSA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aCA9IGluaXRpYWwud2lkdGggKyBkZWx0YVg7XG4gICAgICAgICAgICBpZiAobmV3V2lkdGggIT09IG9sZC53aWR0aCAmJiBuZXdXaWR0aCA+PSBvbGQubWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBldi53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkaXIuaW5kZXhPZignbicpID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IGluaXRpYWwuaGVpZ2h0IC0gZGVsdGFZO1xuICAgICAgICAgICAgY29uc3QgbmV3VG9wID0gaW5pdGlhbC55ICsgZGVsdGFZO1xuICAgICAgICAgICAgaWYgKG5ld0hlaWdodCAhPT0gb2xkLmhlaWdodCAmJiBuZXdIZWlnaHQgPj0gb2xkLm1pbkhlaWdodCAmJiBuZXdUb3AgIT09IG9sZC50b3ApIHtcbiAgICAgICAgICAgICAgICBldi5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgZXYudG9wID0gbmV3VG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkaXIuaW5kZXhPZigncycpID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IGluaXRpYWwuaGVpZ2h0ICsgZGVsdGFZO1xuICAgICAgICAgICAgaWYgKG5ld0hlaWdodCAhPT0gb2xkLmhlaWdodCAmJiBuZXdIZWlnaHQgPj0gb2xkLm1pbkhlaWdodCkge1xuICAgICAgICAgICAgICAgIGV2LmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyLmluZGV4T2YoJ3cnKSA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZWZ0ID0gaW5pdGlhbC54ICsgZGVsdGFYO1xuICAgICAgICAgICAgY29uc3QgbmV3V2lkdGggPSBpbml0aWFsLndpZHRoIC0gZGVsdGFYO1xuICAgICAgICAgICAgaWYgKG5ld1dpZHRoICE9PSBvbGQud2lkdGggJiYgbmV3V2lkdGggPj0gb2xkLm1pbldpZHRoICYmIG5ld0xlZnQgIT09IG9sZC5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgZXYud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICBldi5sZWZ0ID0gbmV3TGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KGV2LndpZHRoKSB8fCBpc1ByZXNlbnQoZXYuaGVpZ2h0KSkge1xuICAgICAgICAgICAgT0ZGU0VUX1NUWUxFUy5mb3JFYWNoKChzdHlsZSQkMSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZXZbc3R5bGUkJDFdKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbc3R5bGUkJDFdID0gZXZbc3R5bGUkJDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChldik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzdG9yZUFjdGlvbigpIHtcbiAgICAgICAgdGhpcy5sYXN0QWN0aW9uID0gJ3Jlc3RvcmUnO1xuICAgICAgICB0aGlzLmRlZmF1bHRTdGF0ZSgpO1xuICAgIH1cbiAgICBkZWZhdWx0U3RhdGUoKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5yZXN0b3JlT3B0aW9ucykpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVzdG9yZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdGF0ZSA9ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KCdkZWZhdWx0Jyk7XG4gICAgfVxuICAgIHN0b3JlT3B0aW9ucygpIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIG1heGltaXplQWN0aW9uKCkge1xuICAgICAgICB0aGlzLmxhc3RBY3Rpb24gPSAnbWF4aW1pemUnO1xuICAgICAgICB0aGlzLm1heGltaXplU3RhdGUoKTtcbiAgICB9XG4gICAgbWF4aW1pemVTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgd25kID0gdGhpcy53aW5kb3dWaWV3UG9ydDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IHduZC5oZWlnaHQsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICBzdGF0ZTogJ21heGltaXplZCcsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICB3aWR0aDogd25kLndpZHRoXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoJ21heGltaXplZCcpO1xuICAgIH1cbiAgICBtaW5pbWl6ZUFjdGlvbigpIHtcbiAgICAgICAgdGhpcy5sYXN0QWN0aW9uID0gJ21pbmltaXplJztcbiAgICAgICAgdGhpcy5taW5pbWl6ZVN0YXRlKCk7XG4gICAgfVxuICAgIG1pbmltaXplU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucywge1xuICAgICAgICAgICAgaGVpZ2h0OiBudWxsLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAwLFxuICAgICAgICAgICAgc3RhdGU6ICdtaW5pbWl6ZWQnXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoJ21pbmltaXplZCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIG1hbnVhbCBjaGFuZ2VzIG9mIHRoZSAnc3RhdGUnIHByb3BlcnR5LlxuICAgICAqIFJlcXVpcmVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBhY3Rpb24gY2xpY2tzLlxuICAgICAqL1xuICAgIGFwcGx5TWFudWFsU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlJCQxID0gdGhpcy5vcHRpb25zLnN0YXRlO1xuICAgICAgICBzd2l0Y2ggKHN0YXRlJCQxKSB7XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21heGltaXplZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWF4aW1pemVTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWluaW1pemVkJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbmltaXplU3RhdGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2VBY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICBlbnN1cmVXaWR0aCgpIHtcbiAgICAgICAgY29uc3Qgd2luZG93T2Zmc2V0ID0gb2Zmc2V0KHRoaXMud2luZG93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLm9wdGlvbnMud2lkdGgpKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMud2lkdGggPSB3aW5kb3dPZmZzZXQud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHsgd2lkdGg6IHdpbmRvd09mZnNldC53aWR0aCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGVhckhlaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWluSGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLm1pbkhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjZW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhdGUgPT09ICdtYXhpbWl6ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbCA9IHNjcm9sbFBvc2l0aW9uKHRoaXMud2luZG93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBsZXQgd25kID0gdGhpcy53aW5kb3dWaWV3UG9ydDtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSBvZmZzZXQodGhpcy53aW5kb3cubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGxldCBldiA9IHt9O1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLm9wdGlvbnMubGVmdCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sZWZ0ID0gc2Nyb2xsLnggKyBNYXRoLm1heCgwLCAod25kLndpZHRoIC0gd3JhcHBlci53aWR0aCkgLyAyKTtcbiAgICAgICAgICAgIGV2LmxlZnQgPSB0aGlzLm9wdGlvbnMubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLm9wdGlvbnMudG9wKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvcCA9IHNjcm9sbC55ICsgTWF0aC5tYXgoMCwgKHduZC5oZWlnaHQgLSB3cmFwcGVyLmhlaWdodCkgLyAyKTtcbiAgICAgICAgICAgIGV2LnRvcCA9IHRoaXMub3B0aW9ucy50b3A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChldik7XG4gICAgfVxuICAgIGN1cnJlbnRPZmZzZXRBbmRQb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3Qgb2ZmID0gb2Zmc2V0KHRoaXMud2luZG93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXJyZW50UG9zaXRpb24oKSwge1xuICAgICAgICAgICAgaGVpZ2h0OiBvLmhlaWdodCA/IG8uaGVpZ2h0IDogb2ZmLmhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBvLndpZHRoID8gby53aWR0aCA6IG9mZi53aWR0aFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3VycmVudFBvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCBvID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoIW8udG9wIHx8ICFvLmxlZnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogdGhpcy5vcHRpb25zLmxlZnQsXG4gICAgICAgICAgICB5OiB0aGlzLm9wdGlvbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldFBvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gcG9zaXRpb25XaXRoU2Nyb2xsKHRoaXMud2luZG93Lm5hdGl2ZUVsZW1lbnQsIGdldERvY3VtZW50RWxlbWVudCh0aGlzLndpbmRvdy5uYXRpdmVFbGVtZW50KSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sZWZ0ID0gd3JhcHBlci5sZWZ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudG9wID0gd3JhcHBlci50b3A7XG4gICAgfVxuICAgIHNldFJlc3RvcmVPcHRpb24oc3R5bGUkJDEsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5yZXN0b3JlT3B0aW9ucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZU9wdGlvbnNbc3R5bGUkJDFdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5leHRQb3NzaWJsZVpJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIG5ld1pJbmRleDtcbiAgICB9XG4gICAgZ2V0IG5leHRaSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiBuZXdaSW5kZXgrKztcbiAgICB9XG4gICAgZ2V0IHdpbmRvd1ZpZXdQb3J0KCkge1xuICAgICAgICByZXR1cm4gZ2V0V2luZG93Vmlld1BvcnQodGhpcy53aW5kb3cubmF0aXZlRWxlbWVudCk7XG4gICAgfVxufVxuRHJhZ1Jlc2l6ZVNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRyYWdSZXNpemVTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBSZXNpemVIYW5kbGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSwgZWwsIHJlbmRlcmVyLCBzZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICBnZXQgaG9zdENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheSgpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2stcmVzaXplLScgKyB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQob2YodGhpcy5kcmFnZ2FibGUpLnN1YnNjcmliZShoYW5kbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm9uUmVzaXplKGhhbmRsZSwgdGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5zZXJ2aWNlLnJlc2l6ZVN0YXJ0LnN1YnNjcmliZSgoZGlyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGlyICE9PSB0aGlzLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheSgnbm9uZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5zZXJ2aWNlLmRyYWdTdGFydC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5KCdub25lJyk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChtZXJnZSh0aGlzLnNlcnZpY2UucmVzaXplRW5kLCB0aGlzLnNlcnZpY2UuZHJhZ0VuZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheSgnYmxvY2snKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuc2VydmljZS5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKHN0YXRlJCQxKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXkoc3RhdGUkJDEgPT09ICdkZWZhdWx0JyA/ICdibG9jaycgOiAnbm9uZScpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgc2V0RGlzcGxheSh2YWx1ZSA9ICdibG9jaycpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgdGhpcy5zZXJ2aWNlLm9wdGlvbnMuc3RhdGUgPT09ICdkZWZhdWx0JyA/IHZhbHVlIDogJ25vbmUnKTtcbiAgICB9XG59XG5SZXNpemVIYW5kbGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb1dpbmRvd1Jlc2l6ZUhhbmRsZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblJlc2l6ZUhhbmRsZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IERyYWdnYWJsZURpcmVjdGl2ZSwgZGVjb3JhdG9yczogW3sgdHlwZTogSG9zdCB9XSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBEcmFnUmVzaXplU2VydmljZSB9XG5dO1xuUmVzaXplSGFuZGxlRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXJlc2l6ZS1oYW5kbGUnLF0gfV1cbn07XG5cbmNsYXNzIFdpbmRvd1RpdGxlQmFyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbCwgc2VydmljZSwgbmdab25lKSB7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmRyYWdEaXJlY3RpdmUgPSBuZXcgRHJhZ2dhYmxlRGlyZWN0aXZlKHRoaXMuZWwsIHRoaXMubmdab25lKTtcbiAgICAgICAgdGhpcy5kcmFnRGlyZWN0aXZlLm5nT25Jbml0KCk7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZURyYWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnNjcmliZVN0YXRlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRyYWdEaXJlY3RpdmUubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZURyYWcoKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVN0YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVEcmFnKCkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRHJhZygpO1xuICAgICAgICB0aGlzLmRyYWdTdWJzY3JpcHRpb24gPSBvZih0aGlzLmRyYWdEaXJlY3RpdmUpLnN1YnNjcmliZSh0aXRsZUJhciA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uub25EcmFnKHRpdGxlQmFyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVTdGF0ZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuc2VydmljZS5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKHN0YXRlJCQxKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMuZHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlJCQxID09PSAnbWF4aW1pemVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRHJhZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVEcmFnKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHVuc3Vic2NyaWJlRHJhZygpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmRyYWdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdW5zdWJzY3JpYmVTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgdG91Y2hBY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGUoZXYpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXYudGFyZ2V0O1xuICAgICAgICBjb25zdCBzdGF0ZSQkMSA9IHRoaXMuc2VydmljZS5vcHRpb25zLnN0YXRlO1xuICAgICAgICBpZiAoIWhhc0NsYXNzZXModGFyZ2V0LCAnay1pY29uJykgJiYgIWlzRm9jdXNhYmxlKHRhcmdldCwgZmFsc2UpICYmIHRoaXMuc2VydmljZS5vcHRpb25zLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlJCQxID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UubWF4aW1pemVBY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlJCQxID09PSAnbWF4aW1pemVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZXN0b3JlQWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzRHJhZ2dhYmxlKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5zZXJ2aWNlLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRyYWdnYWJsZSAmJiBvcHRpb25zLnN0YXRlICE9PSAnbWF4aW1pemVkJztcbiAgICB9XG59XG5XaW5kb3dUaXRsZUJhckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8td2luZG93LXRpdGxlYmFyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiIXRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsnJGltcGxpY2l0Jzogc2VydmljZX1cIiAqbmdJZj1cInRlbXBsYXRlXCI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5XaW5kb3dUaXRsZUJhckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IERyYWdSZXNpemVTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcbldpbmRvd1RpdGxlQmFyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjbGFzc05hbWU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2luZG93LXRpdGxlYmFyJyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kaWFsb2ctdGl0bGViYXInLF0gfV0sXG4gICAgdG91Y2hBY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLnRvdWNoLWFjdGlvbicsXSB9XSxcbiAgICBoYW5kbGU6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydkYmxjbGljaycsIFsnJGV2ZW50J10sXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aW5kb3cpIHtcbiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7XG4gICAgfVxuICAgIHByb2Nlc3MoZXYpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZXYua2V5Q29kZTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5cy51cDpcbiAgICAgICAgICAgIGNhc2UgS2V5cy5kb3duOlxuICAgICAgICAgICAgY2FzZSBLZXlzLmxlZnQ6XG4gICAgICAgICAgICBjYXNlIEtleXMucmlnaHQ6IHtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJyb3coa2V5LCBldik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleXMuZXNjOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXNjYXBlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUFycm93KGtleSwgZXYpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMud2luZG93Lm9wdGlvbnM7XG4gICAgICAgIGlmIChldi5hbHRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RhdGVDaGFuZ2Uoa2V5LCBvcHRpb25zLnN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGV2LmN0cmxLZXkgfHwgZXYubWV0YUtleSkgJiYgb3B0aW9ucy5zdGF0ZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlc2l6ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlRXNjYXBlKCkge1xuICAgICAgICB0aGlzLndpbmRvdy5jbG9zZUFjdGlvbigpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnKGtleSkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMud2luZG93Lm9wdGlvbnM7XG4gICAgICAgIGlmICghb3B0aW9ucy5kcmFnZ2FibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQkJDEgPSB0aGlzLndpbmRvdy5jdXJyZW50T2Zmc2V0QW5kUG9zaXRpb24oKTtcbiAgICAgICAgbGV0IHJlc3RvcmVPcHRpb25zID0gdGhpcy53aW5kb3cucmVzdG9yZU9wdGlvbnM7XG4gICAgICAgIGxldCBldiA9IHt9O1xuICAgICAgICBsZXQgZGVsdGEgPSAxMDtcbiAgICAgICAgaWYgKGtleSA9PT0gS2V5cy5sZWZ0IHx8IGtleSA9PT0gS2V5cy51cCkge1xuICAgICAgICAgICAgZGVsdGEgKj0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5cy5sZWZ0OlxuICAgICAgICAgICAgY2FzZSBLZXlzLnJpZ2h0OiB7XG4gICAgICAgICAgICAgICAgZXYubGVmdCA9IG9mZnNldCQkMS54ICsgZGVsdGE7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sZWZ0ID0gZXYubGVmdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5cy51cDpcbiAgICAgICAgICAgIGNhc2UgS2V5cy5kb3duOiB7XG4gICAgICAgICAgICAgICAgZXYudG9wID0gb2Zmc2V0JCQxLnkgKyBkZWx0YTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRvcCA9IGV2LnRvcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdGUgPT09ICdtaW5pbWl6ZWQnICYmIGlzUHJlc2VudChyZXN0b3JlT3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJlc3RvcmVPcHRpb25zLmxlZnQgPSBvcHRpb25zLmxlZnQ7XG4gICAgICAgICAgICByZXN0b3JlT3B0aW9ucy50b3AgPSBvcHRpb25zLnRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpbmRvdy5jaGFuZ2UuZW1pdChldik7XG4gICAgfVxuICAgIGhhbmRsZVJlc2l6ZShrZXkpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMud2luZG93Lm9wdGlvbnM7XG4gICAgICAgIGlmICghb3B0aW9ucy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQkJDEgPSB0aGlzLndpbmRvdy5jdXJyZW50T2Zmc2V0QW5kUG9zaXRpb24oKTtcbiAgICAgICAgbGV0IG5ld1dpZHRoO1xuICAgICAgICBsZXQgbmV3SGVpZ2h0O1xuICAgICAgICBsZXQgZXYgPSB7fTtcbiAgICAgICAgbGV0IGRlbHRhID0gMTA7XG4gICAgICAgIGlmIChrZXkgPT09IEtleXMubGVmdCB8fCBrZXkgPT09IEtleXMudXApIHtcbiAgICAgICAgICAgIGRlbHRhICo9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlIEtleXMubGVmdDpcbiAgICAgICAgICAgIGNhc2UgS2V5cy5yaWdodDoge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gb2Zmc2V0JCQxLndpZHRoICsgZGVsdGE7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1dpZHRoICE9PSBvcHRpb25zLndpZHRoICYmIG5ld1dpZHRoID49IG9wdGlvbnMubWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXYud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleXMudXA6XG4gICAgICAgICAgICBjYXNlIEtleXMuZG93bjoge1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IG9mZnNldCQkMS5oZWlnaHQgKyBkZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAobmV3SGVpZ2h0ICE9PSBvcHRpb25zLmhlaWdodCAmJiBuZXdIZWlnaHQgPj0gb3B0aW9ucy5taW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXYuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChldi53aWR0aCkgfHwgaXNQcmVzZW50KGV2LmhlaWdodCkpIHtcbiAgICAgICAgICAgIE9GRlNFVF9TVFlMRVMuZm9yRWFjaCgoc3R5bGUkJDEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGV2W3N0eWxlJCQxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3cub3B0aW9uc1tzdHlsZSQkMV0gPSBldltzdHlsZSQkMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5jaGFuZ2UuZW1pdChldik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlU3RhdGVDaGFuZ2Uoa2V5LCBzdGF0ZSQkMSkge1xuICAgICAgICBpZiAoKHN0YXRlJCQxID09PSAnbWluaW1pemVkJyAmJiBrZXkgPT09IEtleXMudXApIHx8XG4gICAgICAgICAgICAoc3RhdGUkJDEgPT09ICdtYXhpbWl6ZWQnICYmIGtleSA9PT0gS2V5cy5kb3duKSkge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVzdG9yZUFjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSQkMSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBLZXlzLnVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5kb3cubWF4aW1pemVBY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gS2V5cy5kb3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5kb3cubWluaW1pemVBY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbk5hdmlnYXRpb25TZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5OYXZpZ2F0aW9uU2VydmljZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IERyYWdSZXNpemVTZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIFdpbmRvdyBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfd2luZG93X2RpYWxvZ3MgJX0pLlxuICovXG5jbGFzcyBXaW5kb3dDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsLCByZW5kZXJlciwgc2VydmljZSwgbmF2aWdhdGlvbiwgbmdab25lLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbiA9IG5hdmlnYXRpb247XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50IGlzIHBlcnNpc3RlZCBpbiB0aGUgRE9NIHdoZW4gbWluaW1pemVkLlxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5rZWVwQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBzdGFydHMgdG8gbW92ZSB0aGUgV2luZG93LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBXaW5kb3cgd2FzIG1vdmVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBzdGFydHMgdG8gcmVzaXplIHRoZSBXaW5kb3cuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgV2luZG93IHdhcyByZXNpemVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNpemVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgV2luZG93LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGB3aWR0aGAgcHJvcGVydHkgb2YgdGhlIGNvbXBvbmVudCB3YXMgdXBkYXRlZC4gVGhlIGV2ZW50IGlzIHRyaWdnZXJlZCBvbmx5IGFmdGVyIHRoZSByZXNpemluZ1xuICAgICAgICAgKiBoYXMgZW5kZWQuIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIHRoZSBuZXcgd2lkdGguIEFsbG93cyBhIHR3by13YXkgYmluZGluZyBvZiB0aGUgYHdpZHRoYCBwcm9wZXJ0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2lkdGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBgaGVpZ2h0YCBwcm9wZXJ0eSBvZiB0aGUgY29tcG9uZW50IHdhcyB1cGRhdGVkLiBUaGUgZXZlbnQgaXMgdHJpZ2dlcmVkIG9ubHkgYWZ0ZXIgdGhlIHJlc2l6aW5nXG4gICAgICAgICAqIGhhcyBlbmRlZC4gVGhlIGV2ZW50IGRhdGEgY29udGFpbnMgdGhlIG5ldyBoZWlnaHQuIEFsbG93cyBhIHR3by13YXkgYmluZGluZyBvZiB0aGUgYGhlaWdodGAgcHJvcGVydHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhlaWdodENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGB0b3BgIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgd2FzIHVwZGF0ZWQuIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgb25seSBhZnRlciB0aGUgZHJhZ2dpbmdcbiAgICAgICAgICogYW5kIHJlc2l6aW5nIGhhdmUgZW5kZWQuIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIHRoZSBuZXcgdG9wIG9mZnNldC4gQWxsb3dzIGEgdHdvLXdheSBiaW5kaW5nIG9mIHRoZSBgdG9wYCBwcm9wZXJ0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9wQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgYGxlZnRgIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgd2FzIHVwZGF0ZWQuIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgb25seSBhZnRlciB0aGUgZHJhZ2dpbmdcbiAgICAgICAgICogYW5kIHJlc2l6aW5nIGhhdmUgZW5kZWQuIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIHRoZSBuZXcgbGVmdCBvZmZzZXQuIEFsbG93cyBhIHR3by13YXkgYmluZGluZyBvZiB0aGUgYGxlZnRgIHByb3BlcnR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sZWZ0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgYHN0YXRlYCBwcm9wZXJ0eSBvZiB0aGUgY29tcG9uZW50IHdhcyB1cGRhdGVkLiBUaGUgZXZlbnQgZGF0YSBjb250YWlucyB0aGUgbmV3IHN0YXRlLiBBbGxvd3MgYVxuICAgICAgICAgKiB0d28td2F5IGJpbmRpbmcgb2YgdGhlIGBzdGF0ZWAgcHJvcGVydHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5kcmFnZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2luZG93U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhbGl6YXRpb24uY2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBydGwgfSkgPT4gdGhpcy5kaXJlY3Rpb24gPSBydGwgPyAncnRsJyA6ICdsdHInKTtcbiAgICAgICAgdGhpcy5yZXNpemVEaXJlY3Rpb25zID0gUkVTSVpFX0RJUkVDVElPTlM7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byBkcmFnIHRoZSBjb21wb25lbnQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHNldCBkcmFnZ2FibGUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZHJhZ2dhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRyYWdnYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHJlc2l6ZSB0aGUgY29tcG9uZW50LlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBzZXQgcmVzaXphYmxlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5yZXNpemFibGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHJlc2l6YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZXNpemFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gYGRlZmF1bHRgLlxuICAgICAqXG4gICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICogKiBgbWluaW1pemVkYFxuICAgICAqICogYG1heGltaXplZGBcbiAgICAgKiAqIGBkZWZhdWx0YFxuICAgICAqL1xuICAgIHNldCBzdGF0ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3RhdGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBUaGUgYG1pbldpZHRoYCBwcm9wZXJ0eSBoYXMgdG8gYmUgc2V0IGluIHBpeGVscy5cbiAgICAgKiBAZGVmYXVsdCAxMjBcbiAgICAgKi9cbiAgICBzZXQgbWluV2lkdGgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb24oJ21pbldpZHRoJywgdmFsdWUpO1xuICAgIH1cbiAgICBnZXQgbWluV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWluV2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBoZWlnaHQgb2YgdGhlIFdpbmRvdy5cbiAgICAgKiBUaGUgYG1pbkhlaWdodGAgcHJvcGVydHkgaGFzIHRvIGJlIHNldCBpbiBwaXhlbHMuXG4gICAgICogQGRlZmF1bHQgMTAwXG4gICAgICovXG4gICAgc2V0IG1pbkhlaWdodCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbignbWluSGVpZ2h0JywgdmFsdWUpO1xuICAgIH1cbiAgICBnZXQgbWluSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1pbkhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgV2luZG93LlxuICAgICAqIFRoZSBgd2lkdGhgIHByb3BlcnR5IGhhcyB0byBiZSBzZXQgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHNldCB3aWR0aCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbignd2lkdGgnLCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIFdpbmRvdy5cbiAgICAgKiBUaGUgYGhlaWdodGAgcHJvcGVydHkgaGFzIHRvIGJlIHNldCBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgc2V0IGhlaWdodCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbignaGVpZ2h0JywgdmFsdWUpO1xuICAgIH1cbiAgICBnZXQgaGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHRvcCBvZmZzZXQgb2YgdGhlIFdpbmRvdy5cbiAgICAgKiBUaGUgYHRvcGAgcHJvcGVydHkgaGFzIHRvIGJlIHNldCBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgc2V0IHRvcCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbigndG9wJywgdmFsdWUpO1xuICAgIH1cbiAgICBnZXQgdG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRvcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBpbml0aWFsIGxlZnQgb2Zmc2V0IG9mIHRoZSBXaW5kb3cuXG4gICAgICogTnVtZXJpYyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIHNldCBsZWZ0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uKCdsZWZ0JywgdmFsdWUpO1xuICAgIH1cbiAgICBnZXQgbGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZWZ0O1xuICAgIH1cbiAgICBnZXQgY2xvc2VCdXR0b25UaXRsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMgJiYgdGhpcy5tZXNzYWdlcy5jbG9zZVRpdGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcy5jbG9zZVRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbi5nZXQoJ2Nsb3NlVGl0bGUnKTtcbiAgICB9XG4gICAgZ2V0IHJlc3RvcmVCdXR0b25UaXRsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMgJiYgdGhpcy5tZXNzYWdlcy5yZXN0b3JlVGl0bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzLnJlc3RvcmVUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdyZXN0b3JlVGl0bGUnKTtcbiAgICB9XG4gICAgZ2V0IG1heGltaXplQnV0dG9uVGl0bGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzICYmIHRoaXMubWVzc2FnZXMubWF4aW1pemVUaXRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXMubWF4aW1pemVUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdtYXhpbWl6ZVRpdGxlJyk7XG4gICAgfVxuICAgIGdldCBtaW5pbWl6ZUJ1dHRvblRpdGxlKCkge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcyAmJiB0aGlzLm1lc3NhZ2VzLm1pbmltaXplVGl0bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzLm1pbmltaXplVGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmdldCgnbWluaW1pemVUaXRsZScpO1xuICAgIH1cbiAgICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZGlyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXROZXh0WkluZGV4KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlSW5pdGlhbEZvY3VzKCk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgpID0+IHRoaXMuc2V0SW5pdGlhbE9mZnNldCgpKSk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0aXRsZScpO1xuICAgICAgICB0aGlzLnNlcnZpY2UuaW5pdCh0aGlzLmVsKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBPRkZTRVRfU1RZTEVTLmZvckVhY2goKHN0eWxlJCQxKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNDaGFuZ2VkKHN0eWxlJCQxLCBjaGFuZ2VzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoc3R5bGUkJDEsIHRoaXMub3B0aW9uc1tzdHlsZSQkMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzQ2hhbmdlZCgnZHJhZ2dhYmxlJywgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlQmFyID0gaXNQcmVzZW50KHRoaXMudGl0bGVCYXJDb250ZW50KSA/IHRoaXMudGl0bGVCYXJDb250ZW50IDogdGhpcy50aXRsZUJhclZpZXc7XG4gICAgICAgICAgICBpZiAoaXNUcnV0aHkoY2hhbmdlcy5kcmFnZ2FibGUuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRpdGxlQmFyLnN1YnNjcmliZURyYWcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlQmFyLnVuc3Vic2NyaWJlRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NoYW5nZWQoJ3N0YXRlJywgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5zZXJ2aWNlLmxhc3RBY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmxhc3RBY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmFwcGx5TWFudWFsU3RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFsbE9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3dTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd3JhcHBlciBvZiB0aGUgV2luZG93IGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh3cmFwcGVyKSkge1xuICAgICAgICAgICAgd3JhcHBlci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJyaW5ncyB0aGUgY3VycmVudCBXaW5kb3cgY29tcG9uZW50IG9uIHRvcCBvZiBvdGhlciBXaW5kb3cgY29tcG9uZW50cyBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBicmluZ1RvRnJvbnQoKSB7XG4gICAgICAgIHRoaXMuc2V0TmV4dFpJbmRleCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSB1cGRhdGVzIHRoZSBgd2lkdGhgIG9yIGBoZWlnaHRgIG9wdGlvbiBvZiB0aGUgV2luZG93LlxuICAgICAqIFRoZSByZXF1aXJlZCBzdHlsZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIFdpbmRvdyB3cmFwcGVyIGVsZW1lbnQgYW5kIHRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgb2YgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB3aWxsIGJlIHVwZGF0ZWQuXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc2l6aW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50cyB1c2luZyB0aGVcbiAgICAgKiBbYFdpbmRvd1NlcnZpY2VgXSh7JSBzbHVnIGFwaV9kaWFsb2dfd2luZG93c2VydmljZSAlfSlcbiAgICAgKiBAcGFyYW0ge1dpbmRvd0RpbWVuc2lvblNldHRpbmd9IGRpbWVuc2lvbiAtIFRoZSBvcHRpb24gdGhhdCB3aWxsIGJlIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgc2V0IGluIHBpeGVsc1xuICAgICAqL1xuICAgIHNldERpbWVuc2lvbihkaW1lbnNpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uKGRpbWVuc2lvbiwgdmFsdWUpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKGRpbWVuc2lvbiwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSB1cGRhdGVzIHRoZSBgdG9wYCBvciBgbGVmdGAgb2Zmc2V0IG9mIHRoZSBXaW5kb3cuXG4gICAgICogVGhlIHJlcXVpcmVkIHN0eWxlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgV2luZG93IHdyYXBwZXIgZWxlbWVudCBhbmQgdGhlXG4gICAgICogY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvZiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHdpbGwgYmUgdXBkYXRlZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBwb3NpdGlvbmluZyBkeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudHMgdXNpbmcgdGhlXG4gICAgICogW2BXaW5kb3dTZXJ2aWNlYF0oeyUgc2x1ZyBhcGlfZGlhbG9nX3dpbmRvd3NlcnZpY2UgJX0pXG4gICAgICogQHBhcmFtIHtXaW5kb3dPZmZzZXRTZXR0aW5nfSBvZmZzZXQgLSBUaGUgb3B0aW9uIHRoYXQgd2lsbCBiZSB1cGRhdGVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHNldCBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBzZXRPZmZzZXQob2Zmc2V0JCQxLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbihvZmZzZXQkJDEsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShvZmZzZXQkJDEsIHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHNob3dEZWZhdWx0VGl0bGVCYXIoKSB7XG4gICAgICAgIHJldHVybiAhaXNQcmVzZW50KHRoaXMudGl0bGVCYXJDb250ZW50KTtcbiAgICB9XG4gICAgZ2V0IHN0eWxlTWluV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbldpZHRoICsgJ3B4JztcbiAgICB9XG4gICAgZ2V0IHN0eWxlTWluSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5IZWlnaHQgKyAncHgnO1xuICAgIH1cbiAgICBnZXQgc3R5bGVQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbjtcbiAgICB9XG4gICAgZ2V0IHdyYXBwZXJNYXhpbWl6ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdtYXhpbWl6ZWQnO1xuICAgIH1cbiAgICBnZXQgd3JhcHBlck1pbmltaXplZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gJ21pbmltaXplZCc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNvbXBvbmVudEtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGhhc0NsYXNzZXMoZXZlbnQudGFyZ2V0LCBXSU5ET1dfQ0xBU1NFUykpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wcm9jZXNzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Db21wb25lbnRGb2N1cygpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgdGhpcy5zZXROZXh0WkluZGV4KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNvbXBvbmVudEJsdXIoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnay1zdGF0ZS1mb2N1c2VkJyk7XG4gICAgfVxuICAgIHN1YnNjcmliZUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpbmRvd1N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLmZvY3VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLndpbmRvd1N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLmRyYWdTdGFydC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcmFnZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydC5lbWl0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLndpbmRvd1N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLmRyYWdFbmQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyYWdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRW5kLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLndpbmRvd1N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLmNsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLndpbmRvd1N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLnJlc2l6ZVN0YXJ0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVN0YXJ0LmVtaXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMud2luZG93U3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNlcnZpY2UucmVzaXplRW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVFbmQuZW1pdCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMud2luZG93U3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNlcnZpY2UuY2hhbmdlLnN1YnNjcmliZSgoZXYpID0+IHtcbiAgICAgICAgICAgIE9GRlNFVF9TVFlMRVMuZm9yRWFjaCgoc3R5bGUkJDEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGV2W3N0eWxlJCQxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZShzdHlsZSQkMSwgZXZbc3R5bGUkJDFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09ICdtYXhpbWl6ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gdGhpc1tzdHlsZSQkMSArICdDaGFuZ2UnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0dGVyLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoZXZbc3R5bGUkJDFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMud2luZG93U3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNlcnZpY2Uuc3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKChzdGF0ZSQkMSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnNlcnZpY2UubGFzdEFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFsbE9mZnNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSQkMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2V0TmV4dFpJbmRleCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFpJbmRleCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZVsnei1pbmRleCddO1xuICAgICAgICBjb25zdCBuZXh0UG9zc2libGVaSW5kZXggPSB0aGlzLnNlcnZpY2UubmV4dFBvc3NpYmxlWkluZGV4O1xuICAgICAgICBpZiAoIWN1cnJlbnRaSW5kZXggfHwgKG5leHRQb3NzaWJsZVpJbmRleCAtIGN1cnJlbnRaSW5kZXggPiAxKSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFwiei1pbmRleFwiLCB0aGlzLnNlcnZpY2UubmV4dFpJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0SW5pdGlhbE9mZnNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09ICdtYXhpbWl6ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFsbE9mZnNldCgpO1xuICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5sZWZ0KSB8fCAhaXNQcmVzZW50KHRoaXMudG9wKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5jZW50ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdQb3J0ID0gdGhpcy5zZXJ2aWNlLndpbmRvd1ZpZXdQb3J0O1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSgnd2lkdGgnLCB2aWV3UG9ydC53aWR0aCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKCdoZWlnaHQnLCB2aWV3UG9ydC5oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSgndG9wJywgMCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKCdsZWZ0JywgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQWxsT2Zmc2V0KCkge1xuICAgICAgICBPRkZTRVRfU1RZTEVTLmZvckVhY2goKHN0eWxlJCQxKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXNbc3R5bGUkJDFdKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoc3R5bGUkJDEsIHRoaXNbc3R5bGUkJDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3R5bGUoc3R5bGUkJDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U3R5bGUoc3R5bGUkJDEsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBzdHlsZSQkMSwgdmFsdWUgKyAncHgnKTtcbiAgICB9XG4gICAgcmVtb3ZlU3R5bGUoc3R5bGUkJDEpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHN0eWxlJCQxKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2Uub3B0aW9ucztcbiAgICB9XG4gICAgc2V0T3B0aW9uKHN0eWxlJCQxLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgPyB2YWx1ZSA6IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIHRoaXMub3B0aW9uc1tzdHlsZSQkMV0gPSBwYXJzZWRWYWx1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnNldFJlc3RvcmVPcHRpb24oc3R5bGUkJDEsIHBhcnNlZFZhbHVlKTtcbiAgICB9XG4gICAgaGFuZGxlSW5pdGlhbEZvY3VzKCkge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxseUZvY3VzZWRFbGVtZW50ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuYXV0b0ZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsbHlGb2N1c2VkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGluaXRpYWxseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5XaW5kb3dDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvV2luZG93JyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgRHJhZ1Jlc2l6ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8ud2luZG93J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXdpbmRvdycsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciBrZW5kb1dpbmRvd0xvY2FsaXplZE1lc3NhZ2VzXG4gICAgICAgICAgICBpMThuLWNsb3NlVGl0bGU9XCJrZW5kby53aW5kb3cuY2xvc2VUaXRsZXxUaGUgdGl0bGUgb2YgdGhlIGNsb3NlIGJ1dHRvblwiXG4gICAgICAgICAgICBjbG9zZVRpdGxlPVwiQ2xvc2VcIlxuXG4gICAgICAgICAgICBpMThuLXJlc3RvcmVUaXRsZT1cImtlbmRvLndpbmRvdy5yZXN0b3JlVGl0bGV8VGhlIHRpdGxlIG9mIHRoZSByZXN0b3JlIGJ1dHRvblwiXG4gICAgICAgICAgICByZXN0b3JlVGl0bGU9XCJSZXN0b3JlXCJcblxuICAgICAgICAgICAgaTE4bi1tYXhpbWl6ZVRpdGxlPVwia2VuZG8ud2luZG93Lm1heGltaXplVGl0bGV8VGhlIHRpdGxlIG9mIHRoZSBtYXhpbWl6ZSBidXR0b25cIlxuICAgICAgICAgICAgbWF4aW1pemVUaXRsZT1cIk1heGltaXplXCJcblxuICAgICAgICAgICAgaTE4bi1taW5pbWl6ZVRpdGxlPVwia2VuZG8ud2luZG93Lm1pbmltaXplVGl0bGV8VGhlIHRpdGxlIG9mIHRoZSBtaW5pbWl6ZSBidXR0b25cIlxuICAgICAgICAgICAgbWluaW1pemVUaXRsZT1cIk1pbmltaXplXCJcbiAgICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyPlxuXG4gICAgICAgIDxrZW5kby13aW5kb3ctdGl0bGViYXIgKm5nSWY9XCJzaG93RGVmYXVsdFRpdGxlQmFyXCIgW3RlbXBsYXRlXT1cInRpdGxlQmFyVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrLXdpbmRvdy10aXRsZVwiPnt7IHRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay13aW5kb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24ga2VuZG9XaW5kb3dNaW5pbWl6ZUFjdGlvbiAgW2F0dHIudGl0bGVdPVwibWluaW1pemVCdXR0b25UaXRsZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwibWluaW1pemVCdXR0b25UaXRsZVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24ga2VuZG9XaW5kb3dNYXhpbWl6ZUFjdGlvbiBbYXR0ci50aXRsZV09XCJtYXhpbWl6ZUJ1dHRvblRpdGxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJtYXhpbWl6ZUJ1dHRvblRpdGxlXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBrZW5kb1dpbmRvd1Jlc3RvcmVBY3Rpb24gW2F0dHIudGl0bGVdPVwicmVzdG9yZUJ1dHRvblRpdGxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXN0b3JlQnV0dG9uVGl0bGVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGtlbmRvV2luZG93Q2xvc2VBY3Rpb24gW2F0dHIudGl0bGVdPVwiY2xvc2VCdXR0b25UaXRsZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xvc2VCdXR0b25UaXRsZVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwva2VuZG8td2luZG93LXRpdGxlYmFyPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJrZW5kby13aW5kb3ctdGl0bGViYXJcIiAqbmdJZj1cIiFzaG93RGVmYXVsdFRpdGxlQmFyXCI+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZSAhPT0gJ21pbmltaXplZCcgfHwga2VlcENvbnRlbnRcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJzdGF0ZSA9PT0gJ21pbmltaXplZCcgJiYga2VlcENvbnRlbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWNvbnRlbnQgay13aW5kb3ctY29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiIWNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VGVtcGxhdGVcIiAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09J3Jlc2l6YWJsZSc+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj0nbGV0IGRpciBvZiByZXNpemVEaXJlY3Rpb25zJ1xuICAgICAgICAgICAgICAgIFtkaXJlY3Rpb25dPVwiZGlyXCJcbiAgICAgICAgICAgICAgICBrZW5kb1dpbmRvd1Jlc2l6ZUhhbmRsZVxuICAgICAgICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5XaW5kb3dDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IERyYWdSZXNpemVTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOYXZpZ2F0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5XaW5kb3dDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgYXV0b0ZvY3VzZWRFbGVtZW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0aXRsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZHJhZ2dhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZXNpemFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGtlZXBDb250ZW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzdGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluV2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbkhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgd2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9wOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsZWZ0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkcmFnU3RhcnQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBkcmFnRW5kOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcmVzaXplU3RhcnQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICByZXNpemVFbmQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHdpZHRoQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgaGVpZ2h0Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdG9wQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgbGVmdENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHN0YXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdGFiSW5kZXg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIudGFiSW5kZXgnLF0gfV0sXG4gICAgaG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay13aW5kb3cnLF0gfV0sXG4gICAgZGlyOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICB0aXRsZUJhclZpZXc6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1dpbmRvd1RpdGxlQmFyQ29tcG9uZW50LF0gfV0sXG4gICAgdGl0bGVCYXJDb250ZW50OiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtXaW5kb3dUaXRsZUJhckNvbXBvbmVudCxdIH1dLFxuICAgIHJlc2l6ZUhhbmRsZXM6IFt7IHR5cGU6IFZpZXdDaGlsZHJlbiwgYXJnczogW1Jlc2l6ZUhhbmRsZURpcmVjdGl2ZSxdIH1dLFxuICAgIHN0eWxlTWluV2lkdGg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLm1pbldpZHRoJyxdIH1dLFxuICAgIHN0eWxlTWluSGVpZ2h0OiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5taW5IZWlnaHQnLF0gfV0sXG4gICAgc3R5bGVQb3NpdGlvbjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUucG9zaXRpb24nLF0gfV0sXG4gICAgd3JhcHBlck1heGltaXplZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpbmRvdy1tYXhpbWl6ZWQnLF0gfV0sXG4gICAgd3JhcHBlck1pbmltaXplZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpbmRvdy1taW5pbWl6ZWQnLF0gfV0sXG4gICAgb25Db21wb25lbnRLZXlkb3duOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5ZG93bicsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBvbkNvbXBvbmVudEZvY3VzOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnZm9jdXMnLF0gfV0sXG4gICAgb25Db21wb25lbnRCbHVyOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnYmx1cicsXSB9XVxufTtcblxuY2xhc3MgV2luZG93TWF4aW1pemVBY3Rpb25EaXJlY3RpdmUgZXh0ZW5kcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGVsLCByZW5kZXJlciwgX3NlcnZpY2UsIGxvY2FsaXphdGlvbiwgbmdab25lKSB7XG4gICAgICAgIHN1cGVyKGVsLCByZW5kZXJlciwgbnVsbCwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpO1xuICAgICAgICB0aGlzLmJ1dHRvblR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgdGhpcy53aW5kb3cgPSBfc2VydmljZTtcbiAgICAgICAgdGhpcy5sb29rID0gJ2JhcmUnO1xuICAgICAgICB0aGlzLmljb24gPSAnd2luZG93LW1heGltaXplJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5tYXhpbWl6ZUFjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB2aXNpYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aW5kb3cub3B0aW9ucy5zdGF0ZSA9PT0gJ2RlZmF1bHQnID8gJ2lubGluZS1mbGV4JyA6ICdub25lJztcbiAgICB9XG59XG5XaW5kb3dNYXhpbWl6ZUFjdGlvbkRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9XaW5kb3dNYXhpbWl6ZUFjdGlvbicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5idXR0b24nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnYnV0dG9uW2tlbmRvV2luZG93TWF4aW1pemVBY3Rpb25dJyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbldpbmRvd01heGltaXplQWN0aW9uRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBEcmFnUmVzaXplU2VydmljZSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuV2luZG93TWF4aW1pemVBY3Rpb25EaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgd2luZG93OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBidXR0b25UeXBlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnR5cGUnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJyxdIH1dLFxuICAgIHZpc2libGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmRpc3BsYXknLF0gfV1cbn07XG5cbmNsYXNzIFdpbmRvd01pbmltaXplQWN0aW9uRGlyZWN0aXZlIGV4dGVuZHMgQnV0dG9uIHtcbiAgICBjb25zdHJ1Y3RvcihlbCwgcmVuZGVyZXIsIF9zZXJ2aWNlLCBsb2NhbGl6YXRpb24sIG5nWm9uZSkge1xuICAgICAgICBzdXBlcihlbCwgcmVuZGVyZXIsIG51bGwsIGxvY2FsaXphdGlvbiwgbmdab25lKTtcbiAgICAgICAgdGhpcy5idXR0b25UeXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMud2luZG93ID0gX3NlcnZpY2U7XG4gICAgICAgIHRoaXMubG9vayA9ICdiYXJlJztcbiAgICAgICAgdGhpcy5pY29uID0gJ3dpbmRvdy1taW5pbWl6ZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cubWluaW1pemVBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2luZG93Lm9wdGlvbnMuc3RhdGUgPT09ICdkZWZhdWx0JyA/ICdpbmxpbmUtZmxleCcgOiAnbm9uZSc7XG4gICAgfVxufVxuV2luZG93TWluaW1pemVBY3Rpb25EaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvV2luZG93TWluaW1pemVBY3Rpb24nLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2J1dHRvbltrZW5kb1dpbmRvd01pbmltaXplQWN0aW9uXScgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5XaW5kb3dNaW5pbWl6ZUFjdGlvbkRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogRHJhZ1Jlc2l6ZVNlcnZpY2UsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcbldpbmRvd01pbmltaXplQWN0aW9uRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHdpbmRvdzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYnV0dG9uVHlwZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50eXBlJyxdIH1dLFxuICAgIG9uQ2xpY2s6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydjbGljaycsXSB9XSxcbiAgICB2aXNpYmxlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5kaXNwbGF5JyxdIH1dXG59O1xuXG5jbGFzcyBXaW5kb3dDbG9zZUFjdGlvbkRpcmVjdGl2ZSBleHRlbmRzIEJ1dHRvbiB7XG4gICAgY29uc3RydWN0b3IoZWwsIHJlbmRlcmVyLCBfc2VydmljZSwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoZWwsIHJlbmRlcmVyLCBudWxsLCBsb2NhbGl6YXRpb24sIG5nWm9uZSk7XG4gICAgICAgIHRoaXMuYnV0dG9uVHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLndpbmRvdyA9IF9zZXJ2aWNlO1xuICAgICAgICB0aGlzLmxvb2sgPSAnYmFyZSc7XG4gICAgICAgIHRoaXMuaWNvbiA9ICdjbG9zZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuY2xvc2VBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbldpbmRvd0Nsb3NlQWN0aW9uRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb1dpbmRvd0Nsb3NlQWN0aW9uJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLmJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdidXR0b25ba2VuZG9XaW5kb3dDbG9zZUFjdGlvbl0nIC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuV2luZG93Q2xvc2VBY3Rpb25EaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IERyYWdSZXNpemVTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5XaW5kb3dDbG9zZUFjdGlvbkRpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB3aW5kb3c6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGJ1dHRvblR5cGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIudHlwZScsXSB9XSxcbiAgICBvbkNsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLF0gfV1cbn07XG5cbmNsYXNzIFdpbmRvd1Jlc3RvcmVBY3Rpb25EaXJlY3RpdmUgZXh0ZW5kcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGVsLCByZW5kZXJlciwgX3NlcnZpY2UsIGxvY2FsaXphdGlvbiwgbmdab25lKSB7XG4gICAgICAgIHN1cGVyKGVsLCByZW5kZXJlciwgbnVsbCwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpO1xuICAgICAgICB0aGlzLmJ1dHRvblR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgdGhpcy53aW5kb3cgPSBfc2VydmljZTtcbiAgICAgICAgdGhpcy5sb29rID0gJ2JhcmUnO1xuICAgICAgICB0aGlzLmljb24gPSAnd2luZG93LXJlc3RvcmUnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DbGljaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlc3RvcmVBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2luZG93Lm9wdGlvbnMuc3RhdGUgPT09ICdkZWZhdWx0JyA/ICdub25lJyA6ICdpbmxpbmUtZmxleCc7XG4gICAgfVxufVxuV2luZG93UmVzdG9yZUFjdGlvbkRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9XaW5kb3dSZXN0b3JlQWN0aW9uJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLmJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdidXR0b25ba2VuZG9XaW5kb3dSZXN0b3JlQWN0aW9uXScgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5XaW5kb3dSZXN0b3JlQWN0aW9uRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBEcmFnUmVzaXplU2VydmljZSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuV2luZG93UmVzdG9yZUFjdGlvbkRpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB3aW5kb3c6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGJ1dHRvblR5cGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIudHlwZScsXSB9XSxcbiAgICBvbkNsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLF0gfV0sXG4gICAgdmlzaWJsZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuZGlzcGxheScsXSB9XVxufTtcblxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgZm9yIHRoZSBXaW5kb3cgYWN0aW9ucyB3aGVuIHRoZSBXaW5kb3cgaXMgb3BlbmVkIHRocm91Z2ggYFdpbmRvd1NlcnZpY2VgXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwaV9kaWFsb2dfd2luZG93c2VydmljZSAlfSN0b2Mtb3BlbikpLlxuICovXG5jbGFzcyBXaW5kb3dTZXR0aW5ncyB7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSAqKkNsb3NlKiogYnV0dG9uIG9mIGEgV2luZG93IHRoYXQgaXMgb3BlbmVkIHRocm91Z2ggYFdpbmRvd1NlcnZpY2VgIGlzIGNsaWNrZWQuXG4gKi9cbmNsYXNzIFdpbmRvd0Nsb3NlUmVzdWx0IHtcbn1cbi8qKlxuICogSG9sZHMgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBXaW5kb3cuXG4gKiBDb250cm9scyB0aGUgV2luZG93cyB0aGF0IHdlcmUgb3BlbmVkIHRocm91Z2ggYFdpbmRvd1NlcnZpY2VgXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwaV9kaWFsb2dfd2luZG93c2VydmljZSAlfSN0b2Mtb3BlbikpLlxuICovXG5jbGFzcyBXaW5kb3dSZWYge1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgV2luZG93Q29udGFpbmVyU2VydmljZSB7XG4gICAgc2V0IGNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgICAgICAgV2luZG93Q29udGFpbmVyU2VydmljZS5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfVxuICAgIGdldCBjb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBXaW5kb3dDb250YWluZXJTZXJ2aWNlLmNvbnRhaW5lcjtcbiAgICB9XG59XG5XaW5kb3dDb250YWluZXJTZXJ2aWNlLmNvbnRhaW5lciA9IG51bGw7XG5XaW5kb3dDb250YWluZXJTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG5jbGFzcyBXaW5kb3dJbmplY3RvciB7XG4gICAgY29uc3RydWN0b3IoZ2V0V2luZG93UmVmLCBwYXJlbnRJbmplY3Rvcikge1xuICAgICAgICB0aGlzLmdldFdpbmRvd1JlZiA9IGdldFdpbmRvd1JlZjtcbiAgICAgICAgdGhpcy5wYXJlbnRJbmplY3RvciA9IHBhcmVudEluamVjdG9yO1xuICAgIH1cbiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgaWYgKHRva2VuID09PSBXaW5kb3dSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFdpbmRvd1JlZigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHNlcnZpY2UgZm9yIG9wZW5pbmcgV2luZG93cyBkeW5hbWljYWxseVxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzZXJ2aWNlX3dpbmRvdyAlfSkpLlxuICovXG5jbGFzcyBXaW5kb3dTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVzb2x2ZXIsIGNvbnRhaW5lclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UgPSBjb250YWluZXJTZXJ2aWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIFdpbmRvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1dpbmRvd1NldHRpbmdzfSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncyB0aGF0IGRlZmluZSB0aGUgV2luZG93LlxuICAgICAqIEByZXR1cm5zIHtXaW5kb3dSZWZ9IC0gQSByZWZlcmVuY2UgdG8gdGhlIFdpbmRvdyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHMtbm8tcnVuXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgPGJ1dHRvbiBrZW5kb0J1dHRvbiAoY2xpY2spPVwib3BlbigpXCI+T3BlbiB3aW5kb3c8L2J1dHRvbj5cbiAgICAgKiAgICAgPGRpdiBrZW5kb1dpbmRvd0NvbnRhaW5lcj48L2Rpdj5cbiAgICAgKiAgIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgICBjb25zdHJ1Y3RvciggcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlICkge31cbiAgICAgKlxuICAgICAqICAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgKiAgICAgICAgIHZhciB3aW5kb3cgPSB0aGlzLndpbmRvd1NlcnZpY2Uub3Blbih7XG4gICAgICogICAgICAgICAgIHRpdGxlOiBcIk15IHdpbmRvd1wiLFxuICAgICAqICAgICAgICAgICBjb250ZW50OiBcIk15IGNvbnRlbnQhXCJcbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqXG4gICAgICogICAgICAgICB3aW5kb3cucmVzdWx0LnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICogICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXaW5kb3dDbG9zZVJlc3VsdCkge1xuICAgICAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV2luZG93IHdhcyBjbG9zZWRcIik7XG4gICAgICogICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICovXG4gICAgb3BlbihzZXR0aW5ncykge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShXaW5kb3dDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBzZXR0aW5ncy5hcHBlbmRUbyB8fCB0aGlzLmNvbnRhaW5lclNlcnZpY2UuY29udGFpbmVyO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXR0YWNoIHdpbmRvdyB0byB0aGUgcGFnZS5cbiAgICAgICAgICAgICAgICBBZGQgYW4gZWxlbWVudCB0aGF0IHVzZXMgdGhlIGtlbmRvV2luZG93Q29udGFpbmVyIGRpcmVjdGl2ZSwgb3Igc2V0IHRoZSAnYXBwZW5kVG8nIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgIFNlZSBodHRwczovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGlhbG9ncy93aW5kb3cvc2VydmljZS9cbiAgICAgICAgICAgIGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpbmRvd1JlZiA9IHtcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICBjb250ZW50OiBudWxsLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgd2luZG93OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnRGcm9tKHNldHRpbmdzLmNvbnRlbnQsIGNvbnRhaW5lciwgd2luZG93UmVmKTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGVudC5ub2Rlcyk7XG4gICAgICAgIHdpbmRvd1JlZi53aW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIHRoaXMuYXBwbHlPcHRpb25zKHdpbmRvdy5pbnN0YW5jZSwgc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBhcGlDbG9zZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgICAgIGFwaUNsb3NlLm5leHQoZSB8fCBuZXcgV2luZG93Q2xvc2VSZXN1bHQoKSk7XG4gICAgICAgICAgICBpZiAoY29udGVudC5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aW5kb3cuZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBtZXJnZShhcGlDbG9zZSwgd2luZG93Lmluc3RhbmNlLmNsb3NlKS5waXBlKHRha2UoMSkpO1xuICAgICAgICByZXN1bHQuc3Vic2NyaWJlKGNsb3NlKTtcbiAgICAgICAgd2luZG93UmVmLmNsb3NlID0gY2xvc2U7XG4gICAgICAgIHdpbmRvd1JlZi5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHdpbmRvdy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuIHdpbmRvd1JlZjtcbiAgICB9XG4gICAgYXBwbHlPcHRpb25zKGluc3RhbmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucy50aXRsZSkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnRpdGxlID0gb3B0aW9ucy50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMua2VlcENvbnRlbnQpKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5rZWVwQ29udGVudCA9IG9wdGlvbnMua2VlcENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChvcHRpb25zLndpZHRoKSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucy5taW5XaWR0aCkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLm1pbldpZHRoID0gb3B0aW9ucy5taW5XaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMuaGVpZ2h0KSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChvcHRpb25zLm1pbkhlaWdodCkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLm1pbkhlaWdodCA9IG9wdGlvbnMubWluSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucy5sZWZ0KSkge1xuICAgICAgICAgICAgaW5zdGFuY2UubGVmdCA9IG9wdGlvbnMubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMudG9wKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UudG9wID0gb3B0aW9ucy50b3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChvcHRpb25zLmRyYWdnYWJsZSkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmRyYWdnYWJsZSA9IG9wdGlvbnMuZHJhZ2dhYmxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucy5yZXNpemFibGUpKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5yZXNpemFibGUgPSBvcHRpb25zLnJlc2l6YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMubWVzc2FnZXMgJiYgb3B0aW9ucy5tZXNzYWdlcy5jbG9zZVRpdGxlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UubWVzc2FnZXMuY2xvc2VUaXRsZSA9IG9wdGlvbnMubWVzc2FnZXMuY2xvc2VUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMubWVzc2FnZXMgJiYgb3B0aW9ucy5tZXNzYWdlcy5yZXN0b3JlVGl0bGUpKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5tZXNzYWdlcy5yZXN0b3JlVGl0bGUgPSBvcHRpb25zLm1lc3NhZ2VzLnJlc3RvcmVUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMubWVzc2FnZXMgJiYgb3B0aW9ucy5tZXNzYWdlcy5tYXhpbWl6ZVRpdGxlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UubWVzc2FnZXMubWF4aW1pemVUaXRsZSA9IG9wdGlvbnMubWVzc2FnZXMubWF4aW1pemVUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMubWVzc2FnZXMgJiYgb3B0aW9ucy5tZXNzYWdlcy5taW5pbWl6ZVRpdGxlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UubWVzc2FnZXMubWluaW1pemVUaXRsZSA9IG9wdGlvbnMubWVzc2FnZXMubWluaW1pemVUaXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMuYXV0b0ZvY3VzZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuYXV0b0ZvY3VzZWRFbGVtZW50ID0gb3B0aW9ucy5hdXRvRm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChvcHRpb25zLnN0YXRlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBvcHRpb25zLnN0YXRlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdGUgPT09ICdtaW5pbWl6ZWQnKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uua2VlcENvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29udGVudFRlbXBsYXRlID0gb3B0aW9ucy5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRpdGxlQmFyQ29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS50aXRsZUJhclRlbXBsYXRlID0gb3B0aW9ucy50aXRsZUJhckNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udGVudEZyb20oY29udGVudCwgY29udGFpbmVyLCB3aW5kb3dSZWYpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBjb250YWluZXIuaW5qZWN0b3IuZ2V0KFJlbmRlcmVyMik7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBsZXQgY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbm9kZXMgPSBbcmVuZGVyZXIuY3JlYXRlVGV4dChjb250ZW50KV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCAmJiAhKGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikpIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gbmV3IFdpbmRvd0luamVjdG9yKCgpID0+IHdpbmRvd1JlZiwgY29udGFpbmVyLmluamVjdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbnRlbnQpO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB1bmRlZmluZWQsIGluamVjdG9yKTtcbiAgICAgICAgICAgIG5vZGVzID0gW2NvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50XTtcbiAgICAgICAgICAgIHdpbmRvd1JlZi5jb250ZW50ID0gY29tcG9uZW50UmVmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYsXG4gICAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgIG5vZGVzIC8vIENvbnRlbnRcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG59XG5XaW5kb3dTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5XaW5kb3dTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sXG4gICAgeyB0eXBlOiBXaW5kb3dDb250YWluZXJTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtXaW5kb3dDb250YWluZXJTZXJ2aWNlLF0gfV0gfVxuXTtcblxuLyoqXG4gKiBQcm92aWRlcyBhbiBpbnNlcnRpb24gcG9pbnQgZm9yIHRoZSBEaWFsb2dzIHdoaWNoIGFyZSBjcmVhdGVkIHRocm91Z2ggdGhlXG4gKiBEaWFsb2cgc2VydmljZSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwaV9kaWFsb2dfZGlhbG9nc2VydmljZSAlfSN0b2Mtb3BlbikpLlxuICogQ3JlYXRlZCBEaWFsb2dzIHdpbGwgYmUgbW91bnRlZCBhZnRlciB0aGF0IGVsZW1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWwtbm8tcnVuXG4gKiA8ZGl2IGtlbmRvRGlhbG9nQ29udGFpbmVyPjwvZGl2PlxuICogYGBgXG4gKi9cbmNsYXNzIERpYWxvZ0NvbnRhaW5lckRpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBzZXJ2aWNlKSB7XG4gICAgICAgIHNlcnZpY2UuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH1cbn1cbkRpYWxvZ0NvbnRhaW5lckRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRGlhbG9nQ29udGFpbmVyXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGlhbG9nQ29udGFpbmVyRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LFxuICAgIHsgdHlwZTogRGlhbG9nQ29udGFpbmVyU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBDb21wb25lbnRNZXNzYWdlcyB7XG59XG5NZXNzYWdlcy5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjbG9zZVRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZXN0b3JlVGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1heGltaXplVGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbmltaXplVGl0bGU6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbn1cbkxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBgXG4gICAgW2tlbmRvRGlhbG9nTG9jYWxpemVkTWVzc2FnZXNdLFxuICAgIFtrZW5kb1dpbmRvd0xvY2FsaXplZE1lc3NhZ2VzXVxuICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIEN1c3RvbSBjb21wb25lbnQgbWVzc2FnZXMgb3ZlcnJpZGUgZGVmYXVsdCBjb21wb25lbnQgbWVzc2FnZXNcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZ2xvYmFsaXphdGlvbl9kaWFsb2dzICV9I3RvYy1sb2NhbGl6YXRpb24pKS5cbiAqL1xuY2xhc3MgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbkN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQpIC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tZm9yd2FyZC1yZWZcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kaWFsb2ctbWVzc2FnZXMsIGtlbmRvLXdpbmRvdy1tZXNzYWdlcycsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgU0hBUkVEX0RJUkVDVElWRVMgPSBbXG4gICAgRGlhbG9nQWN0aW9uc0NvbXBvbmVudCxcbiAgICBDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTaGFyZWRNb2R1bGUge1xufVxuU2hhcmVkTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTSEFSRURfRElSRUNUSVZFU10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1NIQVJFRF9ESVJFQ1RJVkVTLCBDb21tb25Nb2R1bGVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBESUFMT0dfRElSRUNUSVZFUyA9IFtcbiAgICBEaWFsb2dDb21wb25lbnQsXG4gICAgRGlhbG9nVGl0bGVCYXJDb21wb25lbnRcbl07XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBEaWFsb2cgY29tcG9uZW50IHRoYXQgaW5jbHVkZXMgYWxsIERpYWxvZyBjb21wb25lbnRzIGFuZCBkaXJlY3RpdmVzLlxuICogSW1wb3J0cyBgRGlhbG9nTW9kdWxlYCBpbnRvIHRoZSBbcm9vdCBtb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlcyddIH19I2FuZ3VsYXItbW9kdWxhcml0eSlcbiAqIG9mIHlvdXIgYXBwbGljYXRpb24gb3IgaW50byBhbnkgb3RoZXIgc3ViLW1vZHVsZSB0aGF0IHdpbGwgdXNlIHRoZSBEaWFsb2cgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1uby1ydW5cbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG4gKiBpbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2cnO1xuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdLFxuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sXG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgRGlhbG9nTW9kdWxlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIERpYWxvZ01vZHVsZSB7XG59XG5EaWFsb2dNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0RJQUxPR19ESVJFQ1RJVkVTLCBEaWFsb2dDb250YWluZXJEaXJlY3RpdmVdLFxuICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogW0RJQUxPR19ESVJFQ1RJVkVTXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbRElBTE9HX0RJUkVDVElWRVMsIFNIQVJFRF9ESVJFQ1RJVkVTLCBEaWFsb2dDb250YWluZXJEaXJlY3RpdmVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtTaGFyZWRNb2R1bGVdLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW0RpYWxvZ0NvbnRhaW5lclNlcnZpY2UsIERpYWxvZ1NlcnZpY2VdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogUHJvdmlkZXMgYW4gaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgV2luZG93cyB3aGljaCBhcmUgY3JlYXRlZCB0aHJvdWdoIHRoZVxuICogV2luZG93IHNlcnZpY2UgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBhcGlfZGlhbG9nX3dpbmRvd3NlcnZpY2UgJX0jdG9jLW9wZW4pKS5cbiAqIENyZWF0ZWQgV2luZG93cyB3aWxsIGJlIG1vdW50ZWQgYWZ0ZXIgdGhhdCBlbGVtZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sLW5vLXJ1blxuICogPGRpdiBrZW5kb1dpbmRvd0NvbnRhaW5lcj48L2Rpdj5cbiAqIGBgYFxuICovXG5jbGFzcyBXaW5kb3dDb250YWluZXJEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgc2VydmljZSkge1xuICAgICAgICBzZXJ2aWNlLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG59XG5XaW5kb3dDb250YWluZXJEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb1dpbmRvd0NvbnRhaW5lcl0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbldpbmRvd0NvbnRhaW5lckRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSxcbiAgICB7IHR5cGU6IFdpbmRvd0NvbnRhaW5lclNlcnZpY2UgfVxuXTtcblxuY29uc3QgV0lORE9XX0RJUkVDVElWRVMgPSBbXG4gICAgUmVzaXplSGFuZGxlRGlyZWN0aXZlLFxuICAgIFdpbmRvd0NvbXBvbmVudCxcbiAgICBXaW5kb3dUaXRsZUJhckNvbXBvbmVudCxcbiAgICBXaW5kb3dDbG9zZUFjdGlvbkRpcmVjdGl2ZSxcbiAgICBXaW5kb3dNaW5pbWl6ZUFjdGlvbkRpcmVjdGl2ZSxcbiAgICBXaW5kb3dNYXhpbWl6ZUFjdGlvbkRpcmVjdGl2ZSxcbiAgICBXaW5kb3dSZXN0b3JlQWN0aW9uRGlyZWN0aXZlXG5dO1xuY29uc3QgRU5UUllfQ09NUE9ORU5UUyA9IFtcbiAgICBXaW5kb3dDb21wb25lbnQsXG4gICAgV2luZG93VGl0bGVCYXJDb21wb25lbnRcbl07XG5jb25zdCBleHBvcnRlZE1vZHVsZXMgPSBbXG4gICAgV2luZG93Q29tcG9uZW50LFxuICAgIFdpbmRvd0Nsb3NlQWN0aW9uRGlyZWN0aXZlLFxuICAgIFdpbmRvd01pbmltaXplQWN0aW9uRGlyZWN0aXZlLFxuICAgIFdpbmRvd01heGltaXplQWN0aW9uRGlyZWN0aXZlLFxuICAgIFdpbmRvd1Jlc3RvcmVBY3Rpb25EaXJlY3RpdmUsXG4gICAgV2luZG93VGl0bGVCYXJDb21wb25lbnRcbl07XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBXaW5kb3cgY29tcG9uZW50LiBJbXBvcnRzIGBXaW5kb3dNb2R1bGVgIGludG8gdGhlXG4gKiBbcm9vdCBtb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlcyddIH19I2FuZ3VsYXItbW9kdWxhcml0eSlcbiAqIG9mIHlvdXIgYXBwbGljYXRpb24gb3IgaW50byBhbnkgb3RoZXIgc3ViLW1vZHVsZSB0aGF0IHdpbGwgdXNlIHRoZSBXaW5kb3cgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1uby1ydW5cbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG4gKiBpbXBvcnQgeyBXaW5kb3dNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci13aW5kb3cnO1xuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdLFxuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sXG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgV2luZG93TW9kdWxlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFdpbmRvd01vZHVsZSB7XG59XG5XaW5kb3dNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1dJTkRPV19ESVJFQ1RJVkVTLCBXaW5kb3dDb250YWluZXJEaXJlY3RpdmVdLFxuICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogW0VOVFJZX0NPTVBPTkVOVFNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMsIFNIQVJFRF9ESVJFQ1RJVkVTLCBXaW5kb3dDb250YWluZXJEaXJlY3RpdmVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtTaGFyZWRNb2R1bGUsIERyYWdnYWJsZU1vZHVsZV0sXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbV2luZG93Q29udGFpbmVyU2VydmljZSwgV2luZG93U2VydmljZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgRGlhbG9ncyBjb21wb25lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiBpbXBvcnQgeyBEaWFsb2dzTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGlhbG9nJztcbiAqXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLFxuICogICAgIGltcG9ydHM6ICAgICAgW0Jyb3dzZXJNb2R1bGUsIERpYWxvZ3NNb2R1bGVdLFxuICogICAgIGJvb3RzdHJhcDogICAgW0FwcENvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKlxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBEaWFsb2dzTW9kdWxlIHtcbn1cbkRpYWxvZ3NNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtEaWFsb2dNb2R1bGUsIFdpbmRvd01vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgeyBESUFMT0dfRElSRUNUSVZFUywgRGlhbG9nQ29udGFpbmVyRGlyZWN0aXZlLCBEaWFsb2dDb250YWluZXJTZXJ2aWNlLCBDdXN0b21NZXNzYWdlc0NvbXBvbmVudCwgRElBTE9HX0xPQ0FMSVpBVElPTl9TRVJWSUNFLCBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgTWVzc2FnZXMsIFNIQVJFRF9ESVJFQ1RJVkVTLCBTaGFyZWRNb2R1bGUsIERyYWdSZXNpemVTZXJ2aWNlLCBOYXZpZ2F0aW9uU2VydmljZSwgV2luZG93Q29udGFpbmVyRGlyZWN0aXZlLCBXaW5kb3dDb250YWluZXJTZXJ2aWNlLCBSZXNpemVIYW5kbGVEaXJlY3RpdmUsIERpYWxvZ0NvbXBvbmVudCwgRGlhbG9nVGl0bGVCYXJDb21wb25lbnQsIERpYWxvZ0NvbnRlbnRCYXNlLCBEaWFsb2dBY3Rpb25zQ29tcG9uZW50LCBEaWFsb2dTZXJ2aWNlLCBEaWFsb2dDbG9zZVJlc3VsdCwgRGlhbG9nUmVmLCBEaWFsb2dTZXR0aW5ncywgRGlhbG9nQWN0aW9uLCBXaW5kb3dDb21wb25lbnQsIFdpbmRvd1RpdGxlQmFyQ29tcG9uZW50LCBXaW5kb3dNYXhpbWl6ZUFjdGlvbkRpcmVjdGl2ZSwgV2luZG93TWluaW1pemVBY3Rpb25EaXJlY3RpdmUsIFdpbmRvd0Nsb3NlQWN0aW9uRGlyZWN0aXZlLCBXaW5kb3dSZXN0b3JlQWN0aW9uRGlyZWN0aXZlLCBXaW5kb3dTZXR0aW5ncywgV2luZG93UmVmLCBXaW5kb3dDbG9zZVJlc3VsdCwgV2luZG93U2VydmljZSwgRGlhbG9nTW9kdWxlLCBXaW5kb3dNb2R1bGUsIERpYWxvZ3NNb2R1bGUgfTtcbiJdfQ==","\n \n \n \n Search\n \n \n\n\n \n \n \n
Updating Results...
\n
\n
\n
\n
Customers
\n
\n
\n
{{item.name}}
\n {{item.address}}, {{item.city}}\n \n \n
\n
\n
\n
\n
Instruments
\n
\n
\n {{item.productname}}\n
\n
\n
\n
\n
Serial Numbers
\n
\n
\n
{{item.productname}} SN: {{item.sn}}
\n {{item.country}}\n
\n
\n
\n
\n
\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {Router} from '@angular/router';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {FilterChoicesService} from '../filter-choices.service';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\n\n@Component({\n selector: 'app-search-popup',\n templateUrl: './search-popup.component.html',\n styleUrls: ['./search-popup.component.scss']\n})\nexport class SearchPopupComponent implements OnInit, OnDestroy {\n RequestState = RequestState;\n DashboardOptions = DashboardOptions;\n @Input() displayTitles;\n stateOn = false;\n searchValue = '';\n navFilterSelection: NavFilterSelection;\n refreshHandleKey;\n requestHandler;\n apiState;\n apiRoute = '/search';\n apiData;\n selectedType;\n // selectedSnKeys;\n selectedKey;\n searchQuery;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private filterChoices: FilterChoicesService,\n private apiService: ApiService,\n private refreshHandlerService: RefreshHandlerService,\n private selectedTabService: SelectedTabService,\n private personaService: PersonaService,\n private router: Router\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.requestHandler = this.apiService.get(this.apiRoute);\n this.requestHandler.sendRequest(this.apiRoute);\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.apiData = apiData;\n this.resetSelection(true);\n // console.log(this.apiData);\n /**\n * note instrument selections switch to the instruments dashboard\n * customers [\n address: \"325 E 15TH ST BETWEEN 1ST AND 2ND \"\n city: \"NEW YORK\"\n country: \"056\"\n customerid: \"45891\"\n customersrno: \"0050082684\"\n isnew: \"False\"\n name: \"MOUNT SINAI BETH ISRAEL\"\n productlines: []\n state: \"NY\"\n ]\n * productlines [\n alconnectable: null\n alwaysonuptime: null\n country: null\n customers: [\n 0: \"1511 (256580-0)\"\n 1: \"12782 (4051401-0)\"\n 2: \"13080 (2093001-1)\"\n 3: \"13184 (8175001-1)\"\n ]\n productdescription: \"ARCHITECT I2000\"\n productlineid: \"115\"\n productname: \"ARCHITECT I2000\"\n sn: null\n ]\n * snlist [\n alconnectable: null\n alwaysonuptime: null\n country: \"JAPAN\"\n customers: null\n productdescription: null\n productlineid: \"116#ISR00141\"\n productname: \"ARCHITECT i2000SR\"\n sn: \"ISR00141\"\n ]\n */\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.apiRoute);\n }, this.requestHandler.getRelativeParams(this.apiRoute));\n }\n\n ngOnDestroy() {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n }\n\n toggle() {\n this.stateOn = !this.stateOn;\n }\n\n public change(event) {\n this.searchQuery = event.target.value;\n if (event.key === 'Enter') {\n this.search();\n }\n }\n public search() {\n this.filterChoices.setFilter('searchQuery', this.searchQuery);\n }\n\n resetSelection(withSn = false) {\n for (const k in this.apiData.customers) {\n if (this.apiData.customers.hasOwnProperty(k)) {\n this.apiData.customers[k].selected = false;\n }\n }\n for (const k in this.apiData.productlines) {\n if (this.apiData.productlines.hasOwnProperty(k)) {\n this.apiData.productlines[k].selected = false;\n }\n }\n // if (withSn) {\n for (const k in this.apiData.snlist) {\n if (this.apiData.snlist.hasOwnProperty(k)) {\n this.apiData.snlist[k].selected = false;\n }\n }\n // }\n }\n\n getCurrentSelectedItems() {\n if (this.selectedType === 'customer') {\n for (const item of this.apiData.customers) {\n if (item.customerid === this.selectedKey) {\n return item;\n }\n }\n }\n if (this.selectedType === 'pl') {\n for (const item of this.apiData.productlines) {\n if (item.productlineid === this.selectedKey) {\n return item;\n }\n }\n }\n if (this.selectedType === 'sn') {\n // const selectedItems = [];\n for (const item of this.apiData.snlist) {\n if (item.productlineid === this.selectedKey) {\n return item;\n // selectedItems.push(item);\n }\n }\n // return selectedItems;\n }\n return null;\n }\n\n public select(item, type, key) {\n if (!item.selected) {\n if (type === 'sn') {\n this.resetSelection();\n // if (!Array.isArray(this.selectedKey)) {\n // this.selectedSnKeys = [];\n // }\n // this.selectedSnKeys.push(key);\n // this.selectedKey = this.selectedSnKeys;\n this.selectedKey = key;\n } else {\n this.resetSelection(true);\n this.selectedKey = key;\n // this.selectedSnKeys = [];\n }\n }\n // else if (type === 'sn') {\n // const index = this.selectedSnKeys.indexOf(key);\n // if (index > -1) {\n // this.selectedSnKeys.splice(index, 1);\n // }\n // this.selectedKey = this.selectedSnKeys;\n // }\n\n this.selectedType = type;\n item.selected = !item.selected;\n this.submit();\n }\n\n public close() {\n this.stateOn = false;\n }\n\n public open() {\n this.stateOn = true;\n }\n\n public submit() {\n /**\n * set to appropriate dashboard\n * set persona selections\n * trigger refreshes\n * close the window\n */\n const selectedItems = this.getCurrentSelectedItems();\n if (this.selectedType === 'customer') {\n this.selectedTabService.selectTab(DashboardOptions.customer);\n this.personaService.setServiceVsAmbState(true);\n this.personaService.setPersonaOption(PersonaTypes.GEO, 'WorldWide', 'WorldWide');\n this.personaService.setPersonaOption(PersonaTypes.Customer, this.selectedKey, selectedItems.name);\n this.router.navigate(['/customerDashboard']);\n // this.filterChoices.setFilter('searchCustomerId', this.selectedKey);\n // this.filterChoices.setFilter('searchProductLineId', '');\n }\n if (this.selectedType === 'pl') {\n this.selectedTabService.selectTab(DashboardOptions.instruments);\n this.personaService.setServiceVsAmbState(true);\n this.personaService.setPersonaOption(PersonaTypes.GEO, 'WorldWide', 'WorldWide');\n this.personaService.setPersonaOption(PersonaTypes.ProductLine, this.selectedKey, selectedItems.productname);\n this.router.navigate(['/instrumentsDashboard']);\n // this.filterChoices.setFilter('searchProductLineId', this.selectedKey);\n // this.filterChoices.setFilter('searchCustomerId', '');\n }\n if (this.selectedType === 'sn') {\n // selectedItems = selectedItems[0];\n this.selectedTabService.selectTab(DashboardOptions.instruments);\n this.personaService.setServiceVsAmbState(true);\n // persona service needs modification to allow multi select\n this.personaService.setPersonaOption(PersonaTypes.GEO, 'WorldWide', 'WorldWide');\n this.personaService.setPersonaOption(PersonaTypes.SN, this.selectedKey, selectedItems.sn);\n this.router.navigate(['/instrumentsDashboard']);\n // this.filterChoices.setFilter('searchProductLineId', '');\n // this.filterChoices.setFilter('searchCustomerId', '');\n }\n this.close();\n }\n}\n","
\n \n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n \n
\n \n \n
\n
\n
\n
","import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport {\n faBookmark,\n faCog,\n faGlobeAmericas,\n faSearch,\n faUser,\n faUsers,\n faFilter,\n faVial,\n faClinicMedical,\n faGripHorizontal,\n faUserTie,\n faLaptopMedical,\n faMortarPestle,\n faSyringe,\n faHandHoldingMedical,\n faTachometerAlt,\n faMicroscope,\n} from '@fortawesome/free-solid-svg-icons';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../navbar-builder.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-dashboard-navbar',\n templateUrl: './dashboard-navbar.component.html',\n styleUrls: ['./dashboard-navbar.component.scss']\n})\nexport class DashboardNavbarComponent implements OnInit {\n navFilterSelection: NavFilterSelection = null;\n DashboardOptions = DashboardOptions;\n faGlobeAmericas = faGlobeAmericas;\n faSearch = faSearch;\n faBookmark = faBookmark;\n faCog = faCog;\n faUsers = faUsers;\n faUser = faUser;\n faFilter = faFilter;\n faVial = faVial;\n faClinicMedical = faClinicMedical;\n faGripHorizontal = faGripHorizontal;\n faUserTie = faUserTie;\n faLaptopMedical = faLaptopMedical;\n faMortarPestle = faMortarPestle;\n faSyringe = faSyringe;\n faHandHoldingMedical = faHandHoldingMedical;\n status = false;\n isAmbTabVisible = false;\n lastSelectedDashboardTabInfo = null;\n faMicroscope = faMicroscope;\n faTachometerAlt = faTachometerAlt;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private refreshHandlerService: RefreshHandlerService,\n private authService: AuthenticationService,\n private selectedTabService: SelectedTabService,\n private cdRef: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n // @todo: understand the setTimeout hack used here\n // https://indepth.dev/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error/\n // https://blog.angular-university.io/angular-debugging/\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection: NavFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n this.isAmbTabVisible = (userInfo.isAMB || userInfo.isAMBManager || userInfo.isSuperUser);\n });\n this.selectedTabService.onTabChange(() => {\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n this.cdRef.detectChanges();\n });\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n this.cdRef.detectChanges();\n }\n\n getNavigateBackwardsLink() {\n const selectedTab = this.selectedTabService.getLastSelectedTabInfo();\n if (selectedTab === DashboardOptions.dashboard) {\n return '/';\n }\n if (selectedTab === DashboardOptions.customer) {\n return '/customerDashboard';\n }\n if (selectedTab === DashboardOptions.instruments) {\n return '/instrumentsDashboard';\n }\n if (selectedTab === DashboardOptions.ambassador) {\n return '/ambassadorDashboard';\n }\n }\n\n clickEvent() {\n this.status = !this.status;\n }\n closeSidebar() {\n this.status = false;\n }\n dashboardChange(dashboardOption) {\n this.selectedTabService.selectTab(dashboardOption);\n // this.refreshHandlerService.triggerCallbacks();\n }\n}\n","\n \n
{{menuText1}}
\n
{{menuText2}}
\n
\n \n
\n
\n
{{filter.key}}: {{filter.value}}
\n
\n
\n
\n\n","import { Component, OnInit, ElementRef, HostListener, ViewChild, Input } from '@angular/core';\nimport {DetailChoicesService} from '../details/detail-choices.service';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {Personas} from '../../configuration/personas';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {DetailAccountFilterComponent} from '../details/detail-account-filter/detail-account-filter.component';\nimport {DetailCapitalServiceAssaySwitchesFilterComponent} from '../details/detail-capital-service-assay-switches-filter/detail-capital-service-assay-switches-filter.component';\nimport {DetailCustomerFilterComponent} from '../details/detail-customer-filter/detail-customer-filter.component';\nimport {DetailProductLineFilterComponent} from '../details/detail-product-line-filter/detail-product-line-filter.component';\nimport {DetailDiseaseStateFilterComponent} from '../details/detail-disease-state-filter/detail-disease-state-filter.component';\nimport {DetailAssayFilterComponent} from '../details/detail-assay-filter/detail-assay-filter.component';\nimport {DetailCategorySwitchesFilterComponent} from '../details/detail-category-switches-filter/detail-category-switches-filter.component';\n\n@Component({\n selector: 'app-detail-persona-selector',\n templateUrl: './detail-persona-selector.component.html',\n styleUrls: ['./detail-persona-selector.component.scss']\n})\nexport class DetailPersonaSelectorComponent implements OnInit {\n DashboardOptions = DashboardOptions;\n Personas = Personas;\n PersonaTypes = PersonaTypes;\n navFilterSelection: NavFilterSelection;\n menuViable = false;\n filterSelections = [];\n\n selectedType = null;\n selectedValue = null;\n selectedLabel = null;\n menuText1 = '';\n menuText2 = '';\n\n @Input() anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n @Input() popupAlign = { horizontal: 'left', vertical: 'top' };\n\n @ViewChild('anchor') public anchor: ElementRef;\n @ViewChild('popup', { read: ElementRef }) public popup: ElementRef;\n\n constructor(\n private authService: AuthenticationService,\n private navbarBuilderService: NavbarBuilderService,\n private detailChoices: DetailChoicesService\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.authService.onAuth(() => {\n this.updateSelections();\n });\n\n this.detailChoices.onDisplayCallbacks(() => {\n this.updateSelections();\n });\n\n this.updateSelections();\n this.onResize();\n\n // this.detailChoicesService.getFilter('detailCustomerIdFilter');\n }\n\n /**\n * @todo: think about how display will handle toggle switches\n */\n updateSelections() {\n // this.selectedType = level1Choice.type;\n // this.selectedValue = level1Choice.value;\n // this.selectedLabel = level1Choice.label;\n const titles = {\n detailAccountFilter: 'Account',\n detailAssayFilter: 'Assay',\n detailCustomerIdFilter: 'Customer',\n detailDiseaseStateFilter: 'Disease State',\n detailIsCapitalFilter: 'Is Capital',\n detailIsFieldServiceContractFilter: 'Is Field Service Contract',\n detailIsOtherFilter: 'Is Other',\n detailIsReagentFilter: 'Is Reagent',\n detailIsServiceFilter: 'Is Service',\n detailProductLineFilter: 'Product Line'\n };\n this.filterSelections = [];\n const filterSelections = this.detailChoices.getFilterSelections();\n for (const filterKey in filterSelections) {\n if (filterKey in filterSelections) {\n const filter = filterSelections[filterKey];\n this.filterSelections.push({key: titles[filterKey], value: filter});\n }\n }\n this.menuText1 = 'View Selections';\n this.menuText2 = '';\n\n // const filterDescriptions = {\n // DetailCustomerFilterComponent: 'Customer',\n // DetailProductLineFilterComponent: 'Product Line',\n // DetailAccountFilterComponent: 'Account',\n // DetailAssayFilterComponent: 'Assay',\n // DetailDiseaseStateFilterComponent: 'Disease State',\n // DetailCategorySwitchesFilterComponent: 'Categories',\n // DetailCapitalServiceAssaySwitchesFilterComponent: 'Capital/Service/Assay Switches'\n // };\n // // if (this.selectedType === null || this.selectedType === undefined) {\n // const textPieces = [];\n // for (const filterKey of this.navFilterSelection.detailFilters) {\n // textPieces.push(filterDescriptions[filterKey]);\n // }\n //\n // this.menuText1 = this.buildPhrase(textPieces);\n //\n // this.menuText2 = '';\n // } else {\n // this.menuText1 = this.selectedType;\n // this.menuText2 = this.selectedLabel;\n // }\n }\n\n buildPhrase(list) {\n list[list.length - 1] = 'or ' + list[list.length - 1];\n let str = list.join(', ');\n const pos = str.lastIndexOf(',');\n str = str.substring(0, pos) + str.substring(pos + 1);\n return str;\n }\n\n onToggle(): void {\n this.menuViable = !this.menuViable;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if (!this.contains(event.target) && this.menuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (target.classList.contains('list-group-item')) {\n return false;\n }\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n\n applyDetailFilters() {\n this.detailChoices.applyFilters();\n return this;\n }\n\n clearDetailFilters() {\n this.detailChoices.clearFilters();\n return this;\n }\n}\n","
\n \n \n
\n
\n
\n \n \n {{navFilterSelection.navigateBackwardsLabel}}\n \n
\n \n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport {faBookmark, faChevronLeft, faFlag, faList, faStar, faUserTag} from '@fortawesome/free-solid-svg-icons';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../navbar-builder.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-metric-detail-navbar',\n templateUrl: './metric-detail-navbar.component.html',\n styleUrls: ['./metric-detail-navbar.component.scss']\n})\nexport class MetricDetailNavbarComponent implements OnInit {\n navFilterSelection: NavFilterSelection = null;\n faList = faList;\n faStar = faStar;\n faUserTag = faUserTag;\n faFlag = faFlag;\n faBookmark = faBookmark;\n faChevronLeft = faChevronLeft;\n status = false;\n lastSelectedDashboardTabInfo = null;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n // @todo: understand the setTimeout hack used here\n // https://indepth.dev/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error/\n // https://blog.angular-university.io/angular-debugging/\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n if (navFilterSelection.navigateBackwardsLink === '/lastSelectedDashboard') {\n navFilterSelection.navigateBackwardsLink = this.getNavigateBackwardsLink();\n }\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n this.selectedTabService.onTabChange(() => {\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n });\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n }\n\n getNavigateBackwardsLink() {\n const selectedTab = this.selectedTabService.getLastSelectedTabInfo();\n if (selectedTab === DashboardOptions.dashboard) {\n return '/';\n }\n if (selectedTab === DashboardOptions.customer) {\n return '/customerDashboard';\n }\n if (selectedTab === DashboardOptions.instruments) {\n return '/instrumentsDashboard';\n }\n if (selectedTab === DashboardOptions.ambassador) {\n return '/ambassadorDashboard';\n }\n return '/';\n }\n\n clickEvent() {\n this.status = !this.status;\n }\n closeSidebar() {\n this.status = false;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CtServiceService {\n customerScope;\n customerScopeChangeCallbacks = [];\n callbackScopeIndex = 0;\n customerId;\n customerName;\n callbackIndex = 0;\n customerSelectionChangeCallbacks = {};\n hasSetCustomerId = false;\n returnCustomer = null;\n\n constructor() { }\n\n setCustomerScope(scope) {\n this.customerScope = scope;\n this.callCustomerScopeChangeCallbacks();\n return this;\n }\n\n getCustomerScope() {\n return this.customerScope;\n }\n\n onCustomerScopeChange(callback) {\n this.customerScopeChangeCallbacks[++this.callbackScopeIndex] = callback;\n return this.callbackScopeIndex;\n }\n\n callCustomerScopeChangeCallbacks() {\n for (const callbackKey in this.customerScopeChangeCallbacks) {\n if (callbackKey in this.customerScopeChangeCallbacks) {\n const callback = this.customerScopeChangeCallbacks[callbackKey];\n callback();\n }\n }\n return this;\n }\n\n clearCustomerScopeChangeEvent(index) {\n delete this.customerSelectionChangeCallbacks[index];\n }\n\n setCustomerId(customerId, customerName = null) {\n this.customerId = customerId;\n this.customerName = customerName;\n\n this.callCustomerSelectionChangeCallbacks();\n return this;\n }\n\n getCustomerId() {\n return this.customerId;\n }\n\n getCustomerName() {\n return this.customerName;\n }\n\n setReturnCustomer(returnCustomerParam) {\n this.returnCustomer = returnCustomerParam;\n }\n\n isReturnCustomerSet() {\n return (this.returnCustomer !== null);\n }\n\n getReturnCustomer() {\n return this.returnCustomer;\n }\n\n onCustomerSelectionChange(callback) {\n this.customerSelectionChangeCallbacks[++this.callbackIndex] = callback;\n if (this.hasSetCustomerId) {\n callback();\n }\n return this.callbackIndex;\n }\n\n clearCustomerSelectionChangeEvent(index) {\n delete this.customerSelectionChangeCallbacks[index];\n }\n\n getSize(obj) {\n let size = 0;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n size++;\n }\n }\n return size;\n }\n\n callCustomerSelectionChangeCallbacks() {\n this.hasSetCustomerId = true;\n for (const callbackKey in this.customerSelectionChangeCallbacks) {\n if (callbackKey in this.customerSelectionChangeCallbacks) {\n const callback = this.customerSelectionChangeCallbacks[callbackKey];\n callback();\n }\n }\n return this;\n }\n}\n","\r\n \r\n
{{menuText1}}
\r\n
{{menuText2}}
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n","import { Component, OnInit, ElementRef, HostListener, ViewChild, Input } from '@angular/core';\nimport {FilterChoicesService} from '../filter-choices.service';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\n\n@Component({\n selector: 'app-ct-product-set-selector',\n templateUrl: './ct-product-set-selector.component.html',\n styleUrls: ['./ct-product-set-selector.component.scss']\n})\nexport class CtProductSetSelectorComponent implements OnInit {\n public apiUrl = 'cua/product_families';\n apiState = RequestState.Complete;\n menuVisible = false;\n\n data = [];\n selectedItem;\n\n menuText1 = '';\n menuText2 = '';\n\n @Input() anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n @Input() popupAlign = { horizontal: 'left', vertical: 'top' };\n\n @ViewChild('anchor') public anchor: ElementRef;\n @ViewChild('popup', { read: ElementRef }) public popup: ElementRef;\n\n constructor(\n private filterService: FilterChoicesService,\n private apiService: ApiService\n ) { }\n\n ngOnInit(): void {\n const requestHandler = this.apiService.get(this.apiUrl);\n requestHandler.sendRequest(this.apiUrl, [], false);\n\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const data = JSON.parse(response.body);\n this.data = [];\n for (const item of data) {\n this.data.push({\n label: item.prdFamilySetDisplayVal,\n key: item.prdFamilySetId // prdFamilySetKey\n });\n if (item.prdFamilySetDefault) {\n this.setSelectedItem(item.prdFamilySetId);\n }\n }\n // console.log('cuatest', this.data);\n }\n });\n\n this.updateSelections();\n this.onResize();\n }\n\n updateSelections() {\n this.menuText1 = 'Product Families';\n this.menuText2 = this.getLabel(this.selectedItem);\n }\n\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n this.filterService.setFilter('product_set_number', selectedItem);\n this.updateSelections();\n }\n\n onToggle(): void {\n this.menuVisible = !this.menuVisible;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.menuVisible) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if (!this.contains(event.target) && this.menuVisible) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n}\n","
\n \n \n
\n
\n
\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n
\n
\n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport {NavFilterSelection, ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {CtServiceService} from '../../control_tower/ct-service.service';\nimport {NavbarBuilderService} from '../navbar-builder.service';\n\n@Component({\n selector: 'app-ct-navbar',\n templateUrl: './ct-navbar.component.html',\n styleUrls: ['./ct-navbar.component.scss']\n})\nexport class CtNavbarComponent implements OnInit {\n navFilterSelection: NavFilterSelection = null;\n ToolSelectionOptions = ToolSelectionOptions;\n status = false;\n\n constructor(\n private ctService: CtServiceService,\n private navbarBuilderService: NavbarBuilderService\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection: NavFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n }\n\n clickEvent() {\n this.status = !this.status;\n }\n closeSidebar() {\n this.status = false;\n }\n\n customerScopeChange(evt) {\n this.ctService.setCustomerScope(evt);\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-alerts-navbar',\n templateUrl: './alerts-navbar.component.html',\n styleUrls: ['./alerts-navbar.component.scss']\n})\nexport class AlertsNavbarComponent implements OnInit {\n ToolSelectionOptions = ToolSelectionOptions;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","","import { Component, OnInit } from '@angular/core';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-gs-alerts-navbar',\n templateUrl: './gs-alerts-navbar.component.html',\n styleUrls: ['./gs-alerts-navbar.component.scss']\n})\nexport class GsAlertsNavbarComponent implements OnInit {\n\n ToolSelectionOptions = ToolSelectionOptions;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","","
\n \n
","import { Component, OnInit } from '@angular/core';\nimport {faBookmark, faChevronLeft, faFlag, faList, faStar, faUserTag} from '@fortawesome/free-solid-svg-icons';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../navbar-builder.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-metric-detail-no-filter',\n templateUrl: './metric-detail-no-filter.component.html',\n styleUrls: ['./metric-detail-no-filter.component.scss']\n})\nexport class MetricDetailNoFilterComponent implements OnInit {\n navFilterSelection: NavFilterSelection = null;\n faList = faList;\n faStar = faStar;\n faUserTag = faUserTag;\n faFlag = faFlag;\n faBookmark = faBookmark;\n faChevronLeft = faChevronLeft;\n status = false;\n lastSelectedDashboardTabInfo = null;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n // @todo: understand the setTimeout hack used here\n // https://indepth.dev/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error/\n // https://blog.angular-university.io/angular-debugging/\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n if (navFilterSelection.navigateBackwardsLink === '/lastSelectedDashboard') {\n navFilterSelection.navigateBackwardsLink = this.getNavigateBackwardsLink();\n }\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n this.selectedTabService.onTabChange(() => {\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n });\n this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n }\n\n getNavigateBackwardsLink() {\n const selectedTab = this.selectedTabService.getLastSelectedTabInfo();\n if (selectedTab === DashboardOptions.dashboard) {\n return '/';\n }\n if (selectedTab === DashboardOptions.customer) {\n return '/customerDashboard';\n }\n if (selectedTab === DashboardOptions.instruments) {\n return '/instrumentsDashboard';\n }\n if (selectedTab === DashboardOptions.ambassador) {\n return '/ambassadorDashboard';\n }\n return '/';\n }\n\n clickEvent() {\n this.status = !this.status;\n }\n closeSidebar() {\n this.status = false;\n }\n}\n","\n ","import { Component, OnInit } from '@angular/core';\nimport {\n faDesktop,\n faBorderAll\n} from '@fortawesome/free-solid-svg-icons';\nimport {PresentationToggleHandlerService} from '../presentation-toggle-handler.service';\n\n@Component({\n selector: 'app-presentation-toggle-switch',\n templateUrl: './presentation-toggle-switch.component.html',\n styleUrls: ['./presentation-toggle-switch.component.scss']\n})\nexport class PresentationToggleSwitchComponent implements OnInit {\n faDesktop = faDesktop;\n faBorderAll = faBorderAll;\n\n state = 0;\n\n constructor(private presentationToggleHandlerService: PresentationToggleHandlerService) { }\n\n ngOnInit(): void {\n }\n\n changeState() {\n if (this.state === 0) {\n this.state = 1;\n } else {\n this.state = 0;\n }\n this.presentationToggleHandlerService.updateToggleState(this.state);\n }\n}\n","
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n","import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport {DashboardOptions, NavFilterSelection} from '../../configuration/nav-filter-selection';\nimport {\n faDesktop,\n faBorderAll,\n faBookmark,\n faCog,\n faGlobeAmericas,\n faSearch,\n faUser,\n faUsers,\n faFilter,\n faVial,\n faClinicMedical,\n faGripHorizontal,\n faUserTie,\n faLaptopMedical,\n faMortarPestle,\n faSyringe,\n faHandHoldingMedical,\n faTachometerAlt,\n faMicroscope,\n} from '@fortawesome/free-solid-svg-icons';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\n\n@Component({\n selector: 'app-br-navbar',\n templateUrl: './br-navbar.component.html',\n styleUrls: ['./br-navbar.component.scss']\n})\nexport class BrNavbarComponent implements OnInit {\n isVisible = true;\n navFilterSelection: NavFilterSelection = null;\n DashboardOptions = DashboardOptions;\n faDesktop = faDesktop;\n faBorderAll = faBorderAll;\n // faGlobeAmericas = faGlobeAmericas;\n // faSearch = faSearch;\n // faBookmark = faBookmark;\n faCog = faCog;\n // faUsers = faUsers;\n // faUser = faUser;\n // faFilter = faFilter;\n // faVial = faVial;\n // faClinicMedical = faClinicMedical;\n // faGripHorizontal = faGripHorizontal;\n // faUserTie = faUserTie;\n // faLaptopMedical = faLaptopMedical;\n // faMortarPestle = faMortarPestle;\n // faSyringe = faSyringe;\n // faHandHoldingMedical = faHandHoldingMedical;\n status = false;\n // isAmbTabVisible = false;\n // lastSelectedDashboardTabInfo = null;\n // faMicroscope = faMicroscope;\n // faTachometerAlt = faTachometerAlt;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private refreshHandlerService: RefreshHandlerService,\n private authService: AuthenticationService,\n // private selectedTabService: SelectedTabService,\n // private cdRef: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n // @todo: understand the setTimeout hack used here\n // https://indepth.dev/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error/\n // https://blog.angular-university.io/angular-debugging/\n this.navbarBuilderService.getNavFilterSelectionSubject().subscribe(\n (navFilterSelection: NavFilterSelection) => {\n setTimeout(() => {\n this.navFilterSelection = navFilterSelection;\n });\n }\n );\n this.navbarBuilderService.tickNavFilterSelectionSubject();\n\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n\n // this.isAmbTabVisible = (userInfo.isAMB || userInfo.isAMBManager || userInfo.isSuperUser);\n });\n // this.selectedTabService.onTabChange(() => {\n // this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n // this.cdRef.detectChanges();\n // });\n // this.lastSelectedDashboardTabInfo = this.selectedTabService.getLastSelectedTabInfo();\n // this.cdRef.detectChanges();\n this.navbarBuilderService.getNavbarIsVisibleSubject().subscribe(\n (isVisible) => {\n this.isVisible = isVisible;\n }\n );\n }\n\n clickEvent() {\n this.status = !this.status;\n }\n closeSidebar() {\n this.status = false;\n }\n dashboardChange(dashboardOption) {\n // this.selectedTabService.selectTab(dashboardOption);\n // this.refreshHandlerService.triggerCallbacks();\n }\n}\n","
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
Authenticating...
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n Not Authorized!\r\n
","import {Component, OnInit, OnDestroy} from '@angular/core';\nimport {NavbarBuilderService} from './navigation/navbar-builder.service';\nimport {PersonaOptionsService} from './api/persona-options.service';\nimport {PreferenceApiConnectorService} from './preferences/preference-api-connector.service';\nimport {PersonaService} from './api/persona.service';\nimport {DetailChoicesService} from './filter_selection/details/detail-choices.service';\nimport {FilterChoicesService} from './filter_selection/filter-choices.service';\nimport {AuthenticationService} from './authentication/authentication.service';\nimport {PersonaTypes} from './configuration/persona-types';\nimport { SwPush } from '@angular/service-worker';\nimport { PushNotificationService } from './api/push-notification-service';\nimport { BroadcastService, MsalService } from '@azure/msal-angular';\nimport {environment} from '../environments/environment';\nimport {HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse} from '@angular/common/http';\nimport { Logger, CryptoUtils, AuthenticationParameters } from 'msal';\nimport {ApiMapping} from './configuration/api-mapping';\nimport {RequestState} from './api/request-handler';\nimport {RefreshHandlerService} from './api/refresh-handler.service';\nimport {SelectedTabService} from './dashboards/selected-tab.service';\nimport {ComponentLookup, ComponentLookupRegistry} from './decorators/component-lookup';\nimport {StackedBarLineChartComponent} from './tiles/base/stacked-bar-line-chart/stacked-bar-line-chart.component';\nimport {TextIndicatorsComponent} from './tiles/base/text-indicators/text-indicators.component';\nimport {StackedBarChartByProductComponent} from './tiles/base/stacked-bar-chart-by-product/stacked-bar-chart-by-product.component';\nimport {FilterInsertComponent} from './filter_selection/details/filter-insert/filter-insert.component';\nimport {TopStatsListComponent} from './tiles/base/top-stats-list/top-stats-list.component';\nimport {VerticalSplitTextIndicatorsComponent} from './tiles/base/vertical-split-text-indicators/vertical-split-text-indicators.component';\nimport {ShapeIndicatorsComponent} from './tiles/base/shape-indicators/shape-indicators.component';\nimport {PieChartComponent} from './tiles/base/pie-chart/pie-chart.component';\nimport {AreaLineChartComponent} from './tiles/base/area-line-chart/area-line-chart.component';\nimport {MultiLineChartComponent} from './tiles/base/multi-line-chart/multi-line-chart.component';\nimport {ComplianceChartComponent} from './tiles/metrics/compliance-chart/compliance-chart.component';\nimport {NpsComponent} from './tiles/metrics/nps/nps.component';\nimport {UtilizationTpdComponent} from './tiles/metrics/utilization-tpd/utilization-tpd.component';\nimport {PlaceholderComponent} from './tiles/placeholder/placeholder.component';\nimport {DetailAccountFilterComponent} from './filter_selection/details/detail-account-filter/detail-account-filter.component';\nimport {DetailAssayFilterComponent} from './filter_selection/details/detail-assay-filter/detail-assay-filter.component';\nimport {DetailCapitalServiceAssaySwitchesFilterComponent} from './filter_selection/details/detail-capital-service-assay-switches-filter/detail-capital-service-assay-switches-filter.component';\nimport {DetailCategorySwitchesFilterComponent} from './filter_selection/details/detail-category-switches-filter/detail-category-switches-filter.component';\nimport {DetailCustomerFilterComponent} from './filter_selection/details/detail-customer-filter/detail-customer-filter.component';\nimport {DetailDiseaseStateFilterComponent} from './filter_selection/details/detail-disease-state-filter/detail-disease-state-filter.component';\nimport {DetailProductLineFilterComponent} from './filter_selection/details/detail-product-line-filter/detail-product-line-filter.component';\nimport {BrPlaceholderComponent} from './business_review/snapshots/br-placeholder/br-placeholder.component';\nimport {BrStackedBarLineChartComponent} from './business_review/snapshots/br-stacked-bar-line-chart/br-stacked-bar-line-chart.component';\nimport { BrMultiLineChartComponent } from './business_review/snapshots/br-multi-line-chart/br-multi-line-chart.component';\nimport { BrMultiBarChartComponent } from './business_review/snapshots/br-multi-bar-chart/br-multi-bar-chart.component'\nimport { BrLineChartComponent } from './business_review/snapshots/br-line-chart/br-line-chart.component';\nimport { BrPieChartComponent } from './business_review/snapshots/br-pie-chart/br-pie-chart.component';\nimport { BrStackedBarChartByProductComponent } from './business_review/snapshots/br-stacked-bar-chart-by-product/br-stacked-bar-chart-by-product.component';\nimport { BrTextIndicatorComponent } from './business_review/snapshots/br-text-indicator/br-text-indicator.component';\nimport { BrTopItemsComponent } from './business_review/snapshots/br-top-items/br-top-items.component';\nimport { BrExamplePieChartComponent } from './business_review/snapshots/br-example-pie-chart/br-example-pie-chart.component';\nimport { ApiTestComponent } from './business_review/snapshots/api-test/api-test.component';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.scss']\n})\nexport class AppComponent implements OnInit, OnDestroy {\n title = 'oneview-spa';\n navbar;\n isIframe = false;\n loggedIn = false;\n loginSuccessSubscription;\n loginFailureSubscription;\n acquireTokenFailureSubscription;\n acquireTokenSuccessSubscription;\n subscription;\n isAuthenticating = true;\n isAuthorized = true;\n // this.isAuthorized = this.authService.isAuthorizedCheck();\n // console.log('isauth', this.isAuthorized);\n\n readonly VAPID_PUBLIC_KEY = \"BNCy-6pMOFBprNvbFya5TCXTR4-RuTDjq1EA8c4GknLb848K19abxzmVLEzYXXKNWsGkEkS0vMWnkqI9K8fylic\";\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private personaOptionsService: PersonaOptionsService,\n private preferenceApiConnectorService: PreferenceApiConnectorService,\n private detailChoicesService: DetailChoicesService,\n private authService: AuthenticationService,\n protected filterChoices: FilterChoicesService,\n private swPush: SwPush,\n private pushNotificationService: PushNotificationService,\n private broadcastService: BroadcastService,\n private http: HttpClient,\n private msalAuthService: MsalService,\n private refreshHandlerService: RefreshHandlerService,\n private selectedTabService: SelectedTabService\n ) {}\n\n ngOnInit(): void {\n\n //localStorage.clear();\n ComponentLookupRegistry.set('StackedBarLineChartComponent', StackedBarLineChartComponent);\n ComponentLookupRegistry.set('TextIndicatorsComponent', TextIndicatorsComponent);\n ComponentLookupRegistry.set('TopStatsListComponent', TopStatsListComponent);\n ComponentLookupRegistry.set('VerticalSplitTextIndicatorsComponent', VerticalSplitTextIndicatorsComponent);\n ComponentLookupRegistry.set('StackedBarChartByProductComponent', StackedBarChartByProductComponent);\n ComponentLookupRegistry.set('ShapeIndicatorsComponent', ShapeIndicatorsComponent);\n ComponentLookupRegistry.set('PieChartComponent', PieChartComponent);\n ComponentLookupRegistry.set('AreaLineChartComponent', AreaLineChartComponent);\n ComponentLookupRegistry.set('MultiLineChartComponent', MultiLineChartComponent);\n ComponentLookupRegistry.set('ComplianceChartComponent', ComplianceChartComponent);\n ComponentLookupRegistry.set('NpsComponent', NpsComponent);\n ComponentLookupRegistry.set('UtilizationTpdComponent', UtilizationTpdComponent);\n ComponentLookupRegistry.set('PlaceholderComponent', PlaceholderComponent);\n ComponentLookupRegistry.set('DetailAccountFilterComponent', DetailAccountFilterComponent);\n ComponentLookupRegistry.set('DetailAssayFilterComponent', DetailAssayFilterComponent);\n ComponentLookupRegistry.set('DetailCapitalServiceAssaySwitchesFilterComponent', DetailCapitalServiceAssaySwitchesFilterComponent);\n ComponentLookupRegistry.set('DetailCategorySwitchesFilterComponent', DetailCategorySwitchesFilterComponent);\n ComponentLookupRegistry.set('DetailCustomerFilterComponent', DetailCustomerFilterComponent);\n ComponentLookupRegistry.set('DetailDiseaseStateFilterComponent', DetailDiseaseStateFilterComponent);\n ComponentLookupRegistry.set('DetailProductLineFilterComponent', DetailProductLineFilterComponent);\n ComponentLookupRegistry.set('BrPlaceholderComponent', BrPlaceholderComponent);\n ComponentLookupRegistry.set('BrStackedBarLineChartComponent', BrStackedBarLineChartComponent);\n ComponentLookupRegistry.set('BrMultiLineChartComponent', BrMultiLineChartComponent);\n ComponentLookupRegistry.set('BrMultiBarChartComponent', BrMultiBarChartComponent);\n ComponentLookupRegistry.set('BrLineChartComponent', BrLineChartComponent);\n ComponentLookupRegistry.set('BrPieChartComponent', BrPieChartComponent);\n ComponentLookupRegistry.set('BrStackedBarChartByProductComponent', BrStackedBarChartByProductComponent);\n ComponentLookupRegistry.set('BrTextIndicatorComponent', BrTextIndicatorComponent);\n ComponentLookupRegistry.set('BrTopItemsComponent', BrTopItemsComponent);\n ComponentLookupRegistry.set('BrExamplePieChartComponent', BrExamplePieChartComponent);\n ComponentLookupRegistry.set('ApiTestComponent', ApiTestComponent);\n // this.isIframe = window !== window.parent && !window.opener;\n\n // this.checkAccount();\n\n // this.broadcastService.subscribe('msal:loginSuccess', payload => {\n // console.log('loginSuccess', payload);\n // this.checkAccount();\n // });\n // this.loginSuccessSubscription = this.broadcastService.subscribe('msal:loginSuccess', payload => {\n // console.log('loginSuccess', payload);\n // });\n // this.loginFailureSubscription = this.broadcastService.subscribe('msal:loginFailure', payload => {\n // console.log('loginFailure', payload);\n // });\n\n // this.msalAuthService.handleRedirectCallback((authError, response) => {\n // if (authError) {\n // console.error('Redirect Error: ', authError.errorMessage);\n // return;\n // }\n //\n // console.log('Redirect Success: ', response.accessToken);\n // });\n\n // this.msalAuthService.setLogger(new Logger((logLevel, message, piiEnabled) => {\n // console.log('MSAL Logging: ', message);\n // }, {\n // correlationId: CryptoUtils.createNewGuid(),\n // piiLoggingEnabled: false\n // }));\n // this.broadcastService.subscribe(\"msal:ssoSuccess\", payload => {\n // console.log('tokenSuccess', payload);\n // });\n this.acquireTokenSuccessSubscription = this.broadcastService.subscribe('msal:acquireTokenSuccess', payload => {\n if (!this.authService.isAuth()) {\n const formData = new HttpParams({\n fromObject: {\n id_token: payload.idToken.rawIdToken,\n }\n });\n const headers = new HttpHeaders()\n .set('Content-Type', 'application/x-www-form-urlencoded');\n console.log('auth url', environment.proxyServerUrl + '/sso.php', formData);\n this.subscription = this.http.post(environment.proxyServerUrl + '/sso.php', formData, {\n headers: headers,\n responseType: 'text',\n withCredentials: true,\n observe: 'response'\n }).subscribe({\n next: (response) => {\n console.log('Auth: Success!');\n this.isAuthenticating = false;\n const authSubscription = this.authService.pingAuth();\n authSubscription.subscribe(\n response => {\n this.personaService.initialLoad();\n this.authService.onAuth(() => { // this must happen after persona service initialLoad\n this.preferenceApiConnectorService.loadPreferences();\n this.personaService.setServiceVsAmbState(true);\n this.selectedTabService.triggerCallbacks();\n\n // personaOptionsService is intended to pre load persona menus\n this.personaOptionsService.initialLoad();\n\n // kick off all request for dashboard tiles\n this.refreshHandlerService.triggerCallbacks([]);\n }, 'appComponent');\n }\n );\n },\n error: error => console.error('Auth: there was an error!', error)\n });\n }\n });\n\n this.acquireTokenFailureSubscription = this.broadcastService.subscribe('msal:acquireTokenFailure', payload => {\n console.log('acquireTokenFailure', payload);\n const userRequest: AuthenticationParameters = {\n scopes: ['openid']\n };\n this.msalAuthService.acquireTokenRedirect(userRequest);\n // https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-acquire-token?tabs=javascript\n // https://npm.runkit.com/msal-angular-garbledtech\n // https://azuread.github.io/microsoft-authentication-library-for-js/ref/msal-angular/classes/_msal_service_.msalservice.html\n });\n\n this.navbarBuilderService.getNavbarChoiceSubject().subscribe(\n (navbarChoice) => {\n setTimeout(() => {\n this.navbar = navbarChoice;\n });\n }\n );\n this.filterChoices.setFilter('customerToggle', false);\n this.filterChoices.setFilter('flagshipToggle', false);\n this.filterChoices.setFilter('instrumentToggle', false);\n this.filterChoices.setFilter('trackToggle', false);\n\n this.detailChoicesService.setFilter('detailCustomerIdFilter', 'all');\n this.detailChoicesService.setFilter('detailProductLineFilter', 'all');\n this.detailChoicesService.setFilter('detailAccountFilter', 'all');\n this.detailChoicesService.setFilter('detailAssayFilter', '');\n this.detailChoicesService.setFilter('detailDiseaseStateFilter', '');\n this.detailChoicesService.setFilter('detailIsCapitalFilter', 'true');\n this.detailChoicesService.setFilter('detailIsServiceFilter', 'true');\n this.detailChoicesService.setFilter('detailIsReagentFilter', 'true');\n this.detailChoicesService.setFilter('detailIsFieldServiceContractFilter', 'true');\n this.detailChoicesService.setFilter('detailIsOtherFilter', 'true');\n }\n // https://autologon.microsoftazuread-sso.com/abbott.com/winauth/ssoprobe?client-request-id=ab46d319-3e69-4a7a-af86-ddfc4a1901f9&_=1602685842900\n ngOnDestroy() {\n this.broadcastService.getMSALSubject().next(1);\n if (this.loginSuccessSubscription) {\n this.loginSuccessSubscription.unsubscribe();\n }\n if (this.loginFailureSubscription) {\n this.loginFailureSubscription.unsubscribe();\n }\n if (this.acquireTokenFailureSubscription) {\n this.acquireTokenFailureSubscription.unsubscribe();\n }\n if (this.acquireTokenSuccessSubscription) {\n this.acquireTokenSuccessSubscription.unsubscribe();\n }\n }\n\n checkAccount() {\n this.loggedIn = !!this.msalAuthService.getAccount();\n }\n\n login() {\n const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1;\n\n if (isIE) {\n this.msalAuthService.loginRedirect();\n } else {\n this.msalAuthService.loginPopup();\n }\n }\n\n logout() {\n this.msalAuthService.logout();\n }\n\n ngAfterViewInit() {\n //this.subscribeToNotifications();\n }\n\n subscribeToNotifications() {\n this.swPush.requestSubscription({\n serverPublicKey: this.VAPID_PUBLIC_KEY\n })\n .then(sub => this.pushNotificationService.addPushSubscriber(sub).subscribe())\n .catch(err => console.error(\"Could not subscribe to push notifications!!\", err));\n }\n}\n","import {TileReference} from '../dashboards/tile-reference';\r\n\r\nexport const SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT: TileReference[] = [\r\n {\r\n apiSource: '/metrics/hsi',\r\n componentName: 'StackedBarLineChartComponent',\r\n detailLink: '/hsi',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Highly Serviced Instruments'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/hotsheets',\r\n componentName: 'TextIndicatorsComponent',\r\n detailLink: '/hotsheets',\r\n preferences: {\r\n title: 'NPS Open Hotsheets'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/opencalls',\r\n componentName: 'ShapeIndicatorsComponent',\r\n preferences: {\r\n shape: 'circle',\r\n orderByLabel: ['Complaint', 'Service Demand', 'PM', 'TSB'],\r\n title: 'Assigned Open Calls'\r\n },\r\n detailLink: '/opencalls'\r\n },\r\n {\r\n apiSource: '/metrics/cpyr',\r\n componentName: 'MultiLineChartComponent',\r\n detailLink: '/cpyr',\r\n preferences: {\r\n excludeLines: [3],\r\n periodsToShow: 4,\r\n title: 'CPY-R'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/servicecost',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n valueAxis1Label: '#K',\r\n axis2Source: 'yleftmax',\r\n axis2VisibleLabels: false,\r\n periodsToShow: 4,\r\n title: 'Service Cost'\r\n },\r\n detailLink: '/servicecost'\r\n },\r\n {\r\n apiSource: '/metrics/alconnected', // this is actually abbottlink installed but uses alconnected\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: true,\r\n goalPercentageSlideLabel: 'Installed',\r\n title: 'AbbottLink - Installed'\r\n },\r\n detailLink: '/alconnected'\r\n },\r\n {\r\n apiSource: '/metrics/alconnectivity',\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: true,\r\n goalPercentageSlideLabel: 'Connected (%)',\r\n title: 'AbbottLink - Connectivity'\r\n },\r\n detailLink: '/alconnectivity'\r\n },\r\n {\r\n apiSource: '/metrics/hci',\r\n componentName: 'StackedBarLineChartComponent',\r\n detailLink: '/hci',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'High Cost Instruments'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/sdfr',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n periodsToShow: 4,\r\n excludeLines: [3],\r\n tickCount: 5,\r\n title: 'Same Day Fix Rate'\r\n },\r\n detailLink: '/sdfr'\r\n },\r\n {\r\n apiSource: '/metrics/ftfr',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n periodsToShow: 4,\r\n excludeLines: [2, 3],\r\n tickCount: 5,\r\n title: 'First Time Fix Rate'\r\n },\r\n detailLink: '/ftfr'\r\n },\r\n {\r\n apiSource: '/metrics/uptime',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Uptime'\r\n },\r\n detailLink: '/uptime'\r\n },\r\n {\r\n apiSource: '/metrics/assay',\r\n componentName: 'TopStatsListComponent',\r\n detailLink: '/assay',\r\n preferences: {\r\n title: 'Top Assays'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/cpyp',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n tickCount: 3,\r\n periodsToShow: 4,\r\n title: 'CPY-P',\r\n colorsByIndex: [0, 2]\r\n },\r\n detailLink: '/cpyp'\r\n },\r\n {\r\n apiSource: '/metrics/ticketrending',\r\n componentName: 'StackedBarLineChartComponent',\r\n detailLink: '/ticketrending',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Ticket Trending'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/trt',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n periodsToShow: 4,\r\n tickCount: 5,\r\n title: 'Total Resolution Time'\r\n },\r\n detailLink: '/trt'\r\n },\r\n {\r\n apiSource: '/metrics/tsb',\r\n componentName: 'ShapeIndicatorsComponent',\r\n preferences: {\r\n shape: 'diamond',\r\n title: 'TSB\\'s'\r\n },\r\n detailLink: '/tsb'\r\n },\r\n {\r\n apiSource: '/metrics/pm',\r\n componentName: 'ShapeIndicatorsComponent',\r\n preferences: {\r\n shape: 'square',\r\n orderByLabel: ['0-1 Month', '1-2 Months', '2-3 Months', '>3 Months'],\r\n title: 'PM\\'s'\r\n },\r\n detailLink: '/pm'\r\n },\r\n {\r\n apiSource: '/metrics/nps',\r\n componentName: 'VerticalSplitTextIndicatorsComponent', // Customer NPS\r\n apiMappingLinks: ['/metrics/nps'],\r\n preferences: {\r\n detailLinks: ['/customerNps', '/customerNps'],\r\n useDataArray: true,\r\n title: 'Customer NPS'\r\n },\r\n // detailLink: '/customerNps'\r\n },\r\n {\r\n apiSource: '/metrics/servicecosthours',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n tickCount: 7,\r\n periodsToShow: 4,\r\n title: 'Service Hours'\r\n },\r\n detailLink: '/servicecosthours'\r\n },\r\n {\r\n apiSource: '/metrics/utilization',\r\n componentName: 'VerticalSplitTextIndicatorsComponent',\r\n apiMappingLinks: ['/metrics/utilization'],\r\n preferences: {\r\n detailLinks: ['/utilization', '/utilization'],\r\n useDataArray: true,\r\n title: 'Low Utilization',\r\n preSpacing: 2\r\n }\r\n // , detailLink: '/utilization'\r\n },\r\n {\r\n apiSource: '/metrics/servicecontracts', // Service Contracts (excluding RAP)\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n renderForServiceContracts: true,\r\n title: 'Service Contracts'\r\n },\r\n detailLink: '/servicecontracts'\r\n },\r\n {\r\n apiSource: '/metrics/CRLSummary',\r\n componentName: 'TextIndicatorsComponent', // Current Instrument Quantity\r\n preferences: {\r\n calculateTotalFromData: true,\r\n title: 'Current Instrument Quantity'\r\n },\r\n detailLink: '/CRLSummary'\r\n },\r\n {\r\n apiSource: '/metrics/proactive',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n excludeLines: [3],\r\n periodsToShow: 4,\r\n tickCount: 5,\r\n title: 'Proactive Ticket Rate %'\r\n },\r\n detailLink: '/proactive'\r\n },\r\n {\r\n apiSource: '/metrics/orders/thumbnail', // Customer Orders\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n title: 'Customer Orders'\r\n },\r\n detailLink: '/orders'\r\n },\r\n {\r\n apiSource: '/metrics/alwaysonuptime',\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n title: 'ALWAYS ON Uptime'\r\n },\r\n detailLink: '/alwaysonuptime'\r\n },\r\n {\r\n apiSource: '/metrics/fsrutilization',\r\n componentName: 'UtilizationTpdComponent',\r\n apiMappingLinks: ['/metrics/fsrutilization'],\r\n preferences: {\r\n detailLinks: ['/util_workload', '/tickets_per_day'],\r\n useDataArray: true,\r\n showTitle: false,\r\n title: 'Utilization Workload % / Tickets Per Day Per Person'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/servicegrossmargin_customerSGM',\r\n componentName: 'TextIndicatorsComponent',\r\n detailLink: '/servicegrossmargin_customerSGM',\r\n preferences: {\r\n lowerTitleColor: '#000000',\r\n title: 'Service Gross Margin'\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/customerswithoutservicecontracts',\r\n componentName: 'StackedBarLineChartComponent',\r\n detailLink: '/customerswithoutservicecontracts',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Predictive Alerts w/o Service Contracts'\r\n }\r\n }/**/\r\n // ,\r\n // {\r\n // apiSource: 'null',\r\n // componentName: 'PlaceholderComponent', // TextIndicatorsComponent\r\n // preferences: {\r\n // title: 'Service Gross Margin (SGM %)'\r\n // }\r\n // },\r\n];\r\n\r\n// Highly Serviced Instruments\r\n// NPS Open Hotsheets\r\n// Assigned Open Calls\r\n// CPY-R\r\n// Service Cost\r\n// AbbottLink - Installed\r\n//\r\n// AbbottLink - Connectivity\r\n// High Cost Instruments\r\n//\r\n// Same Day Fix Rate\r\n// First Time Fix Rate\r\n// Uptime\r\n// Top Assays\r\n//\r\n// CPY-P\r\n// Ticket Trending\r\n// Total Resolution Time\r\n// TSB's\r\n//\r\n// PM's\r\n// Customer NPS\r\n//\r\n// Service Hours\r\n// Low Utilization\r\n// Service Contracts (Including RAP)\r\n// Current Instrument Quantity\r\n// Proactive Ticket Rate %\r\n// Customer Orders\r\n//\r\n// ALWAYS ON Uptime (12 Months)\r\n// Utilization Workload % (3MA) / Tickets Per Day Per Person (3MA)\r\n// Service Gross Margin (SGM %)\r\n// Customers SGM % (12MA)\r\n// Proactive Alerts w/o Service Contracts\r\n","import {\n AfterViewInit, ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef, Input,\n OnDestroy,\n Type,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport {ComponentLookupRegistry} from '../../decorators/component-lookup';\nimport {TileReference} from '../tile-reference';\n\n@Component({\n selector: 'app-tile-insert',\n templateUrl: './tile-insert.component.html',\n styleUrls: ['./tile-insert.component.scss']\n})\nexport class TileInsertComponent implements AfterViewInit, OnDestroy {\n dynamicComponentRef: ComponentRef;\n\n @Input() tileReference: TileReference;\n\n @ViewChild('dynamic', {read: ViewContainerRef}) viewContainerRef: ViewContainerRef;\n\n constructor(private factoryResolver: ComponentFactoryResolver, private cd: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.loadDynamicComponent();\n });\n this.cd.detectChanges();\n }\n\n loadDynamicComponent() {\n const componentType: Type = ComponentLookupRegistry.get(this.tileReference.componentName);\n if (componentType !== undefined) {\n const componentFactory = this.factoryResolver.resolveComponentFactory(componentType);\n\n this.viewContainerRef.clear();\n this.dynamicComponentRef = this.viewContainerRef.createComponent(componentFactory);\n // add tileReference to component data inputs\n (this.dynamicComponentRef.instance).tileReference = this.tileReference;\n }\n }\n\n ngOnDestroy() {\n if (this.dynamicComponentRef) {\n this.dynamicComponentRef.destroy();\n }\n }\n}\n","","
\n
\n
\n
\n \n \n \n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport {TileReference} from '../tile-reference';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {Personas} from '../../configuration/personas';\nimport {SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT} from '../../configuration/service-metric-tile-reference-default-arrangement';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DashboardOptions} from '../../configuration/nav-filter-selection';\nimport {PersonaService} from '../../api/persona.service';\nimport {ChartArea} from '@progress/kendo-angular-charts';\nimport {SelectedTabService} from '../selected-tab.service';\nimport {PreferenceSelectionService} from '../../preferences/preference-selection.service';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-dashboard',\n templateUrl: './dashboard.component.html',\n styleUrls: ['./dashboard.component.scss']\n})\nexport class DashboardComponent implements OnInit {\n arrangement: TileReference[] = SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT;\n requestHandler;\n prefRequestHandler;\n managerApiData;\n managerDataLoaded = false;\n preferencesLoaded = false;\n\n constructor(\n private authService: AuthenticationService,\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService,\n private apiService: ApiService,\n private preferenceSelectionService: PreferenceSelectionService,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n this.selectedTabService.selectTab(DashboardOptions.dashboard); // this must proceed managerId hack\n // this.arrangement = [this.arrangement[0]];\n // for testing specific metrics\n // Stacked Bar Line Charts\n // this.arrangement = [this.arrangement[0], this.arrangement[4], this.arrangement[7], this.arrangement[13], this.arrangement[27]];\n // Multi Line Charts\n // this.arrangement = [this.arrangement[3], this.arrangement[8], this.arrangement[9], this.arrangement[10], this.arrangement[12], this.arrangement[14], this.arrangement[18], this.arrangement[22]];\n // Text Indicators Chart\n // this.arrangement = [this.arrangement[1], this.arrangement[21], this.arrangement[26]];\n // Shape Indicators\n // this.arrangement = [this.arrangement[2], this.arrangement[15], this.arrangement[16]];\n // Vertical Split Text Charts\n // this.arrangement = [this.arrangement[17], this.arrangement[19], this.arrangement[25]];\n // Pie Charts\n // this.arrangement = [this.arrangement[5], this.arrangement[6], this.arrangement[20], this.arrangement[23], this.arrangement[24]];\n // Top Assays\n // this.arrangement = [this.arrangement[11]];\n\n /**\n * HACK TO FIX ISSUE WHERE MANAGER UPI IS CONFIGURED FOR MYCRL ROUTES AND AOH USES 511\n */\n this.authService.onAuth(() => {\n this.updateManagerIdHackLoadManagerListAndPreferences();\n });\n this.updateManagerIdHackLoadManagerListAndPreferences();\n // HACK END\n\n this.personaService.setServiceVsAmbState(true);\n this.personaService.refreshDetailChoices();\n this.navbarBuilderService.setNavbarChoice('dashboard');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: true,\n personaSelector: true,\n dashboardSelector: true,\n selectedDashboard: DashboardOptions.dashboard,\n search: true,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: false,\n navigateBackwardsLabel: 'Back',\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [Personas.TssAmbassador, Personas.Manager, Personas.GeoLocation]\n });\n }\n\n updateManagerIdHackLoadManagerListAndPreferences() {\n if (!this.preferenceSelectionService.arePreferencesLoaded() && this.authService.isAuth()) {\n this.prefRequestHandler = this.apiService.get('/preference');\n this.prefRequestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n this.preferencesLoaded = true;\n this.updateManagerIdHackFixPersona();\n }\n });\n } else {\n this.preferencesLoaded = true;\n }\n if (this.authService.isAuth()) {\n this.requestHandler = this.apiService.get('cua/manager_list');\n this.requestHandler.sendRequest('cua/manager_list', null, false);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.managerApiData = JSON.parse(response.body);\n this.managerDataLoaded = true;\n this.updateManagerIdHackFixPersona();\n }\n });\n }\n }\n\n updateManagerIdHackFixPersona() {\n let level1PersonaChoice = this.personaService.getLevel1Choice();\n if (\n this.managerDataLoaded\n && this.preferencesLoaded\n && level1PersonaChoice.type === PersonaTypes.CuaManager\n && this.selectedTabService.getLastSelectedTabInfo() !== DashboardOptions.controltower // do not call unless ct dashboard page active\n ) {\n level1PersonaChoice = this.personaService.getLevel1Choice();\n for (const user of this.managerApiData) {\n if (user.mgr511 === level1PersonaChoice.value) {\n this.personaService.setPersonaOption(\n PersonaTypes.Manager,\n user.mgrUpi,\n user.firstName + ' ' + user.lastName\n );\n }\n }\n }\n }\n}\n","import {StackedBarChartByProductComponent} from '../../tiles/base/stacked-bar-chart-by-product/stacked-bar-chart-by-product.component';\r\nimport {DetailAssayFilterComponent} from '../../filter_selection/details/detail-assay-filter/detail-assay-filter.component';\r\n\r\nexport const Style1Pages = {\r\n '/hsi': {\r\n metricId: 1,\r\n serviceVsAmb: true,\r\n pageTitle: 'Highly Serviced Instruments',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/hsi',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/hsi_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'hsi.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'nonHsi',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Non-HSI',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'hsi',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HSI',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'totals',\r\n parser: 'stackTotals',\r\n inject: ['hsi', 'nonHsi'],\r\n attributes: {\r\n label: 'Total',\r\n }\r\n },\r\n {\r\n key: 'percents',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HSI %',\r\n stackGoalsIndex: 0\r\n }\r\n },\r\n {\r\n key: 'percentGoals',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HSI % Goal',\r\n stackGoalsIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['nonHsi', 'hsi', 'totals', 'percents', 'percentGoals'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[1],\r\n apiData.stackcolors[0],\r\n '',\r\n apiData.stackgoalcolors[0],\r\n apiData.stackgoalcolors[1]\r\n ];\r\n }\r\n }\r\n },\r\n '/cpyr': {\r\n metricId: 4,\r\n serviceVsAmb: true,\r\n pageTitle: 'CPY-R',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/cpyr',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n excludeLines: [3]\r\n }\r\n },\r\n apiRequestHandler: '/metrics/cpyr_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'cpyr.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'cpyr-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CPY-R 12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'cpyr-3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CPY-R 3MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'cpyr-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CPY-R Goal',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'census',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Census',\r\n stackIndex: 3\r\n }\r\n },\r\n ],\r\n dataRows: ['cpyr-12ma', 'cpyr-3ma', 'cpyr-goal', 'census'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n ''\r\n ];\r\n }\r\n }\r\n },\r\n '/servicecost': {\r\n metricId: 5,\r\n serviceVsAmb: true,\r\n pageTitle: 'Service Cost',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/servicecost',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n valueAxis1Label: '#K',\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/servicecost_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'servicecost.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'labor',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Labor',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'parts',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Parts',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'labor_and_parts',\r\n parser: 'stackTotals',\r\n inject: ['labor', 'parts'],\r\n attributes: {\r\n label: 'Labor and Parts',\r\n }\r\n },\r\n {\r\n key: 'labor_and_parts_goal',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Labor and Parts Goal',\r\n stackGoalsIndex: 0\r\n }\r\n },\r\n {\r\n key: 'travel',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Travel',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'total_service_cost',\r\n parser: 'stackTotals',\r\n inject: ['labor_and_parts', 'travel'],\r\n attributes: {\r\n label: 'Total Service Cost',\r\n }\r\n }\r\n ],\r\n dataRows: ['labor', 'parts', 'labor_and_parts', 'labor_and_parts_goal', 'travel', 'total_service_cost'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[0],\r\n apiData.stackcolors[1],\r\n '',\r\n apiData.stackgoalcolors[0],\r\n apiData.stackcolors[2],\r\n ''\r\n ];\r\n }\r\n }\r\n },\r\n '/alconnected': {\r\n metricId: 6,\r\n serviceVsAmb: true,\r\n pageTitle: 'AbbottLink - Installed',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/alconnected', // this is actually abbottlink installed but uses alconnected\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: true,\r\n goalPercentageSlideLabel: 'Installed',\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/alconnected_0',\r\n table: {\r\n type: 'set-values',\r\n exportFileName: 'alconnected.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: [\r\n {\r\n ref: 'percentInstalled',\r\n description: '% Installed',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberInstalled',\r\n description: '# Installed',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentNotInstalled',\r\n description: '% Not Installed',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberNotInstalled',\r\n description: '# Not Installed',\r\n width: 80\r\n },\r\n {\r\n ref: 'goalPercent',\r\n description: 'Goal %',\r\n width: 80\r\n }\r\n ],\r\n dataValues: (apiData) => {\r\n return {\r\n percentInstalled: apiData.values[0].percentage,\r\n numberInstalled: apiData.values[0].count,\r\n percentNotInstalled: apiData.values[1].percentage,\r\n numberNotInstalled: apiData.values[1].count,\r\n goalPercent: apiData.values[0].goalpercentage\r\n };\r\n },\r\n valueColors: (apiData) => {\r\n return [\r\n apiData.values[0].color,\r\n '',\r\n apiData.values[1].color,\r\n '',\r\n '',\r\n ];\r\n }\r\n }\r\n },\r\n '/alconnectivity': {\r\n metricId: 7,\r\n serviceVsAmb: true,\r\n pageTitle: 'AbbottLink - Connectivity',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/alconnectivity/intermediate',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/alconnectivity/intermediate_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'alconnectivity.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'online_percentage',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Online Percentage',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'more_than_8_days',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '> 8 days',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: '4_7_days',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '4 - 7 days',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'goal_percent',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal %',\r\n stackGoalsIndex: 0\r\n }\r\n }\r\n ],\r\n dataRows: ['online_percentage', 'more_than_8_days', '4_7_days', 'goal_percent'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[0],\r\n apiData.stackcolors[1],\r\n apiData.stackcolors[2],\r\n apiData.stackgoalcolors[0],\r\n ];\r\n }\r\n }\r\n },\r\n '/hci': {\r\n metricId: 8,\r\n serviceVsAmb: true,\r\n pageTitle: 'High Cost Instruments',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/hci',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/hci_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'hsi.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'nonHci',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Non-HCI',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'hci',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HCI',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'totals',\r\n parser: 'stackTotals',\r\n inject: ['hci', 'nonHci'],\r\n attributes: {\r\n label: 'Total',\r\n }\r\n },\r\n {\r\n key: 'percents',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HCI Percentage',\r\n stackGoalsIndex: 0\r\n }\r\n },\r\n {\r\n key: 'percentGoals',\r\n parser: 'percentGoals',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'HCI % Goal',\r\n stackGoalsIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['nonHci', 'hci', 'totals', 'percents', 'percentGoals'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[1],\r\n apiData.stackcolors[0],\r\n '',\r\n apiData.stackcolors[0],\r\n apiData.stackcolors[1]\r\n ];\r\n }\r\n }\r\n },\r\n '/customerNps': {\r\n metricId: 18,\r\n serviceVsAmb: true,\r\n pageTitle: 'Customer NPS',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/nps/intermediate',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n yaxisleftlabel: 'NPS Score',\r\n min: -105\r\n }\r\n },\r\n apiRequestHandler: '/metrics/nps/intermediate_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'customer-nps.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'overallCustomer',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Overall Customer',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'fieldService',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Field Service',\r\n stackIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['overallCustomer', 'fieldService'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n ];\r\n }\r\n }\r\n },\r\n '/sdfr': {\r\n metricId: 9,\r\n serviceVsAmb: true,\r\n pageTitle: 'Same Day Fix Rate',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/sdfr',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/sdfr_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'sdfr.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'sdfr-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'SDFR 12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'sdfr-1ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'SDFR 1MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'sdfr-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'SDFR Goal',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'ticket_qty',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Ticket Qty',\r\n stackIndex: 3\r\n }\r\n },\r\n ],\r\n dataRows: ['sdfr-12ma', 'sdfr-1ma', 'sdfr-goal', 'ticket_qty'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n ''\r\n ];\r\n }\r\n }\r\n },\r\n '/ftfr': {\r\n metricId: 10,\r\n serviceVsAmb: true,\r\n pageTitle: 'First Time Fix Rate',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/ftfr',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n excludeLines: [2, 3]\r\n // rowColorOverrides: [null, null]// , '#6f42c1', '#dc3545']\r\n }\r\n },\r\n apiRequestHandler: '/metrics/ftfr_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'ftfr.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'ftfr-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'FTFR 12 MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'ftfr-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'ftf',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'First Time Fixes',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'nftf',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Non-First Time Fixes',\r\n stackIndex: 3\r\n }\r\n },\r\n ],\r\n dataRows: ['ftfr-12ma', 'ftfr-goal', 'ftf', 'nftf'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n '#6f42c1',\r\n '#dc3545'\r\n ];\r\n }\r\n }\r\n },\r\n '/uptime': {\r\n metricId: 11,\r\n serviceVsAmb: true,\r\n pageTitle: 'Uptime',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/uptime',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/uptime_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'uptime.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'uptime-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Uptime 12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'uptime-1ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Uptime 1MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'uptime-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Uptime Goal',\r\n stackIndex: 2\r\n }\r\n }\r\n ],\r\n dataRows: ['uptime-12ma', 'uptime-1ma', 'uptime-goal'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2]\r\n ];\r\n }\r\n }\r\n },\r\n '/cpyp': {\r\n metricId: 13,\r\n serviceVsAmb: true,\r\n pageTitle: 'CPY-P',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/cpyp',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n colorsByIndex: [0, 2]\r\n }\r\n },\r\n apiRequestHandler: '/metrics/cpyp_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'cpyp.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'cpyp-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CPY-P 12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'cpyp-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CPY-P Goal',\r\n stackIndex: 1\r\n }\r\n },\r\n ],\r\n dataRows: ['cpyp-12ma', 'cpyp-goal'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1]\r\n ];\r\n }\r\n }\r\n },\r\n '/ticketrending': {\r\n metricId: 14,\r\n serviceVsAmb: true,\r\n pageTitle: 'Ticket Trending',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/ticketrending',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/ticketrending_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'ticketrending.xlsx',\r\n level2DetailLink: 'details',\r\n colorRowDescriptions: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'complaintWFsv',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Complaint w/FSV',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'serviceWFsv',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Service w/FSV',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'proactive',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Proactive',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'fsrHwsPhoneFix',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'FSR/HWS Phone Fix',\r\n stackIndex: 3\r\n }\r\n },\r\n {\r\n key: 'cscPhoneFix',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'CSC Phone Fix',\r\n stackIndex: 4\r\n }\r\n },\r\n {\r\n key: 'pm',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'PM',\r\n stackIndex: 5\r\n }\r\n },\r\n {\r\n key: 'installIntegration',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Install/ Integration',\r\n stackIndex: 6\r\n }\r\n },\r\n {\r\n key: 'tsb',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'TSB',\r\n stackIndex: 7\r\n }\r\n },\r\n {\r\n key: 'inquiry',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Inquiry',\r\n stackIndex: 8\r\n }\r\n },\r\n {\r\n key: 'otherTicket',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Other Ticket',\r\n stackIndex: 9\r\n }\r\n }\r\n ],\r\n dataRows: [\r\n 'complaintWFsv', 'serviceWFsv', 'proactive',\r\n 'fsrHwsPhoneFix', 'cscPhoneFix', 'pm', 'installIntegration',\r\n 'tsb', 'inquiry', 'otherTicket'\r\n ], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[0],\r\n apiData.stackcolors[1],\r\n apiData.stackcolors[2],\r\n apiData.stackcolors[3],\r\n apiData.stackcolors[4],\r\n apiData.stackcolors[5],\r\n apiData.stackcolors[6],\r\n apiData.stackcolors[7],\r\n apiData.stackcolors[8],\r\n apiData.stackcolors[9]\r\n ];\r\n }\r\n }\r\n },\r\n '/trt': {\r\n metricId: 15,\r\n serviceVsAmb: true,\r\n pageTitle: 'Total Resolution Time',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/trt',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/trt_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'trt.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'trt-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'trt-3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '3MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'trt-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal',\r\n stackIndex: 2\r\n }\r\n }\r\n ],\r\n dataRows: ['trt-12ma', 'trt-3ma', 'trt-goal'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n ''\r\n ];\r\n }\r\n }\r\n },\r\n '/servicecosthours': {\r\n metricId: 19,\r\n serviceVsAmb: true,\r\n pageTitle: 'Service Hours',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/servicecosthours',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/servicecosthours_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'servicecosthours.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'total-service-hours',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Total Service Hours',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'labor-hours-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Labor Hours (12MA)',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: '12ma-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal (12 MA)',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'total-service-hours-3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Total Service Hours (3MA)',\r\n stackIndex: 3\r\n }\r\n },\r\n {\r\n key: 'labor-hours-3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Labor Hours (3 MA)',\r\n stackIndex: 4\r\n }\r\n },\r\n ],\r\n dataRows: ['total-service-hours', 'labor-hours-12ma', '12ma-goal', 'total-service-hours-3ma', 'labor-hours-3ma'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n apiData.linecolors[3],\r\n apiData.linecolors[4],\r\n ];\r\n }\r\n }\r\n },\r\n '/utilization': {\r\n metricId: 20,\r\n serviceVsAmb: true,\r\n pageTitle: 'Low Utilization',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n charts: [\r\n {\r\n apiSource: '/metrics/utilization/intermediate',\r\n componentName: 'StackedBarChartByProductComponent',\r\n preferences: {\r\n title: 'Lowest Range',\r\n useDataArray: true,\r\n showTitle: false,\r\n apiObjectKey: 0\r\n }\r\n },\r\n {\r\n apiSource: '/metrics/utilization/intermediate',\r\n componentName: 'StackedBarChartByProductComponent',\r\n preferences: {\r\n title: '2nd Lowest Range',\r\n useDataArray: true,\r\n showTitle: false,\r\n apiObjectKey: 1\r\n }\r\n }\r\n ],\r\n apiRequestHandler: '/metrics/utilization/intermediate_0',\r\n table: {\r\n type: 'custom',\r\n exportFileName: 'low_utilization.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: [\r\n {\r\n ref: 'instrument',\r\n description: 'Instrument',\r\n width: 80\r\n },\r\n {\r\n ref: 'lowRangeNumberOfTests',\r\n description: 'Low Range # Of Tests',\r\n customStyle: { 'text-align': 'right' },\r\n width: 80\r\n },\r\n {\r\n ref: 'lowRangeInstrumentsCount',\r\n description: 'Low Range Instrument Count',\r\n customStyle: { 'text-align': 'right' },\r\n width: 80\r\n },\r\n {\r\n ref: 'secondLowestRange',\r\n description: '2nd Lowest Range',\r\n customStyle: { 'text-align': 'right' },\r\n width: 80\r\n },\r\n {\r\n ref: 'secondLowestInstrumentCount',\r\n description: '2nd Lowest Instrument Count',\r\n customStyle: { 'text-align': 'right' },\r\n width: 80\r\n }\r\n ]\r\n }\r\n },\r\n '/proactive': {\r\n metricId: 24,\r\n serviceVsAmb: true,\r\n pageTitle: 'Proactive Ticket Rate %',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/proactive',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/proactive_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'proactive.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'proactive-12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Proactive % 12MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'proactive-1ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Proactive % 1MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: 'proactive-goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Proactive % Goal',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'overall-ticket-qty',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Overall Ticket Qty',\r\n stackIndex: 3\r\n }\r\n },\r\n ],\r\n dataRows: ['proactive-12ma', 'proactive-1ma', 'proactive-goal', 'overall-ticket-qty'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n apiData.linecolors[3]\r\n ];\r\n }\r\n }\r\n },\r\n '/orders': {\r\n metricId: 25,\r\n serviceVsAmb: true,\r\n pageTitle: 'Customer Orders',\r\n filters: ['DetailCustomerFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/orders/thumbnail',\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/orders/thumbnail_0',\r\n table: {\r\n type: 'set-values',\r\n exportFileName: 'customerorders.xlsx',\r\n level2DetailLink: 'intermediate',\r\n dataCols: [\r\n {\r\n ref: 'percentHold',\r\n description: '% Hold',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberHold',\r\n description: '# Hold',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentOpen',\r\n description: '% Open',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberOpen',\r\n description: '# Open',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentClosed',\r\n description: '% Closed',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberClosed',\r\n description: '# Closed',\r\n width: 80\r\n }\r\n ],\r\n dataValues: (apiData) => {\r\n return {\r\n percentHold: apiData.values[0].percentage,\r\n numberHold: apiData.values[0].quantity,\r\n percentOpen: apiData.values[1].percentage,\r\n numberOpen: apiData.values[1].quantity,\r\n percentClosed: apiData.values[2].percentage,\r\n numberClosed: apiData.values[2].quantity,\r\n };\r\n },\r\n valueColors: (apiData) => {\r\n return [\r\n apiData.values[0].color,\r\n '',\r\n apiData.values[1].color,\r\n '',\r\n apiData.values[2].color,\r\n '',\r\n ];\r\n }\r\n }\r\n },\r\n '/alwaysonuptime': {\r\n metricId: 29,\r\n serviceVsAmb: true,\r\n pageTitle: 'ALWAYS ON Uptime Summary',\r\n filters: ['DetailCustomerFilterComponent', 'DetailProductLineFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/alwaysonuptime',\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/alwaysonuptime_0',\r\n table: {\r\n type: 'set-values',\r\n exportFileName: 'alwaysonuptime.xlsx',\r\n level2DetailLink: 'details',\r\n dataCols: [\r\n {\r\n ref: 'percentGuaranteeAchieved',\r\n description: '% Guarantee Achieved',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberGuaranteeAchieved',\r\n description: '# Guarantee Achieved',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentGuaranteeNotAchieved',\r\n description: '% Guarantee Not Achieved',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberGuaranteeNotAchieved',\r\n description: '# Guarantee Not Achieved',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentNotEligible',\r\n description: '% Not Eligible',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberNotEligible',\r\n description: '# Not Eligible',\r\n width: 80\r\n }\r\n ],\r\n dataValues: (apiData) => {\r\n return {\r\n percentGuaranteeAchieved: apiData.values[0].percentage,\r\n numberGuaranteeAchieved: apiData.values[0].count,\r\n percentGuaranteeNotAchieved: apiData.values[1].percentage,\r\n numberGuaranteeNotAchieved: apiData.values[1].count,\r\n percentNotEligible: apiData.values[2].percentage,\r\n numberNotEligible: apiData.values[2].count,\r\n };\r\n },\r\n valueColors: (apiData) => {\r\n return [\r\n apiData.values[0].color,\r\n '',\r\n apiData.values[1].color,\r\n '',\r\n apiData.values[2].color,\r\n '',\r\n ];\r\n }\r\n }\r\n },\r\n '/util_workload': {\r\n metricId: 30,\r\n serviceVsAmb: true,\r\n pageTitle: 'Utilization',\r\n filters: [],\r\n tileReference: {\r\n apiSource: '/metrics/util_workload',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n excludeLines: [4, 5]\r\n }\r\n },\r\n apiRequestHandler: '/metrics/util_workload_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'utilization.xlsx',\r\n level2DetailLink: 'details',\r\n colorRowDescriptions: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: '1ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '1MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: '3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '3MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: '12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '12MA',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'GOAL',\r\n stackIndex: 3\r\n }\r\n },\r\n {\r\n key: 'travel_labor_hrs',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Travel/ Labor Hrs',\r\n stackIndex: 4\r\n }\r\n },\r\n {\r\n key: 'availible_hrs',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Avail Hours',\r\n stackIndex: 5\r\n }\r\n }\r\n ],\r\n dataRows: ['1ma', '3ma', '12ma', 'goal', 'travel_labor_hrs', 'availible_hrs'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n apiData.linecolors[3],\r\n apiData.linecolors[4],\r\n apiData.linecolors[5],\r\n ];\r\n }\r\n }\r\n },\r\n '/tickets_per_day': {\r\n metricId: 32,\r\n serviceVsAmb: true,\r\n pageTitle: 'Tickets Per Day',\r\n filters: [],\r\n tileReference: {\r\n apiSource: '/metrics/tickets_per_day',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/tickets_per_day_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'tickets_per_day.xlsx',\r\n level2DetailLink: 'details',\r\n colorRowDescriptions: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: '1ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '1MA',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: '3ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '3MA',\r\n stackIndex: 1\r\n }\r\n },\r\n {\r\n key: '12ma',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: '12MA',\r\n stackIndex: 2\r\n }\r\n },\r\n {\r\n key: 'goal',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'GOAL',\r\n stackIndex: 3\r\n }\r\n }\r\n ],\r\n dataRows: ['1ma', '3ma', '12ma', 'goal'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n apiData.linecolors[2],\r\n apiData.linecolors[3],\r\n ];\r\n }\r\n }\r\n },\r\n '/servicegrossmargin_customerSGM': {\r\n metricId: 31,\r\n serviceVsAmb: true,\r\n pageTitle: 'Service Gross Margin (SGM)',\r\n subTitle: '(Country YTD, Customer 12MA)',\r\n filters: ['DetailCustomerFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/servicegrossmargin_customerSGM_details',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/servicegrossmargin_customerSGM_details_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'servicegrossmargin_customerSGM.xlsx',\r\n level2DetailLink: 'details',\r\n colorRowDescriptions: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'sgmPercent',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'SGM %',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'goalPercent',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal %',\r\n stackIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['sgmPercent', 'goalPercent'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n ];\r\n }\r\n }\r\n },\r\n '/customerswithoutservicecontracts': {\r\n metricId: 33,\r\n serviceVsAmb: true,\r\n pageTitle: 'Predictive Alerts w/o Service Contracts',\r\n filters: ['DetailCustomerFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/customerswithoutservicecontracts',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/customerswithoutservicecontracts_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'customerswithoutservicecontracts.xlsx',\r\n level2DetailLink: 'grid',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'alertCount',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Alert Count',\r\n stackIndex: 0\r\n }\r\n }\r\n ],\r\n dataRows: ['alertCount'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[0]\r\n ];\r\n }\r\n }\r\n },\r\n '/rnps': {\r\n metricId: 22,\r\n serviceVsAmb: false,\r\n pageTitle: 'rNPS',\r\n filters: [], // 'DetailCustomerFilterComponent'\r\n tileReference: {\r\n apiSource: '/metrics/rnps/intermediate',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false,\r\n yaxisleftlabel: 'NPS Score',\r\n min: -105\r\n }\r\n },\r\n apiRequestHandler: '/metrics/rnps/intermediate_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'rnps.xlsx',\r\n level2DetailLink: 'detail',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {},\r\n customValueIfBlank: 'N'\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'overallRNps',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Overall rNPS',\r\n stackIndex: 0\r\n }\r\n }\r\n ],\r\n dataRows: ['overallRNps'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0]\r\n ];\r\n }\r\n }\r\n },\r\n '/sales': {\r\n metricId: 26,\r\n serviceVsAmb: false,\r\n pageTitle: 'Sales',\r\n filters: [\r\n 'DetailAccountFilterComponent',\r\n 'DetailCategorySwitchesFilterComponent',\r\n 'DetailDiseaseStateFilterComponent',\r\n 'DetailAssayFilterComponent'\r\n ],\r\n tileReference: {\r\n apiSource: '/metrics/sales',\r\n componentName: 'AreaLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/sales_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'amb_sales.xlsx',\r\n level2DetailLink: 'summary',\r\n currencyStyleForAMB: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'cumulative',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Cumulative',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'monthly',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Monthly',\r\n stackIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['cumulative', 'monthly'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1]\r\n ];\r\n }\r\n }\r\n },\r\n '/rcs': {\r\n metricId: 27,\r\n serviceVsAmb: false,\r\n pageTitle: 'Reagent/Capital/Service',\r\n filters: [\r\n 'DetailAccountFilterComponent',\r\n 'DetailCapitalServiceAssaySwitchesFilterComponent',\r\n 'DetailDiseaseStateFilterComponent',\r\n 'DetailAssayFilterComponent'\r\n ],\r\n tileReference: {\r\n apiSource: '/metrics/rcs', // this is actually abbottlink installed but uses alconnected\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/rcs_0',\r\n table: {\r\n type: 'set-values',\r\n exportFileName: 'rcs.xlsx',\r\n level2DetailLink: 'summary',\r\n currencyStyleForAMB: true,\r\n dataCols: [\r\n {\r\n ref: 'percentReagent',\r\n description: '% Reagent',\r\n width: 80\r\n },\r\n {\r\n ref: 'reagentUSD',\r\n description: 'Reagent (USD)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentCapital',\r\n description: '% Capital',\r\n width: 80\r\n },\r\n {\r\n ref: 'capatalUSD',\r\n description: 'Capital (USD)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentService',\r\n description: '% Service',\r\n width: 80\r\n },\r\n {\r\n ref: 'serviceUSD',\r\n description: 'Service (USD)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentOther',\r\n description: '% Other',\r\n width: 80\r\n },\r\n {\r\n ref: 'otherUSD',\r\n description: 'Other (USD)',\r\n width: 80\r\n }\r\n ],\r\n dataColsLocal: [\r\n {\r\n ref: 'percentReagent',\r\n description: '% Reagent',\r\n width: 80\r\n },\r\n {\r\n ref: 'reagentLocal',\r\n description: 'Reagent (Local)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentCapital',\r\n description: '% Capital',\r\n width: 80\r\n },\r\n {\r\n ref: 'capitalLocal',\r\n description: 'Capital (Local)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentService',\r\n description: '% Service',\r\n width: 80\r\n },\r\n {\r\n ref: 'serviceLocal',\r\n description: 'Service (Local)',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentOther',\r\n description: '% Other',\r\n width: 80\r\n },\r\n {\r\n ref: 'otherLocal',\r\n description: 'Other (Local)',\r\n width: 80\r\n }\r\n ],\r\n dataValues: (apiData) => {\r\n return {\r\n percentReagent: apiData.values[0].percentage + ' %',\r\n reagentUSD: apiData.values[0].amtdollar,\r\n percentCapital: apiData.values[1].percentage + ' %',\r\n capatalUSD: apiData.values[1].amtdollar,\r\n percentService: apiData.values[2].percentage + ' %',\r\n serviceUSD: apiData.values[2].amtdollar,\r\n percentOther: apiData.values[3].percentage + ' %',\r\n otherUSD: apiData.values[3].amtdollar\r\n };\r\n },\r\n dataValuesLocal: (apiData) => {\r\n return {\r\n percentReagent: apiData.values[0].percentage + ' %',\r\n reagentLocal: apiData.values[0].amtlocal,\r\n percentCapital: apiData.values[1].percentage + ' %',\r\n capitalLocal: apiData.values[1].amtlocal,\r\n percentService: apiData.values[2].percentage + ' %',\r\n serviceLocal: apiData.values[2].amtlocal,\r\n percentOther: apiData.values[3].percentage + ' %',\r\n otherLocal: apiData.values[3].amtlocal\r\n };\r\n },\r\n valueColors: (apiData) => {\r\n return [\r\n apiData.values[0].color,\r\n '',\r\n apiData.values[1].color,\r\n '',\r\n apiData.values[2].color,\r\n '',\r\n apiData.values[3].color,\r\n ''\r\n ];\r\n }\r\n }\r\n },\r\n '/compliance': {\r\n metricId: 28,\r\n serviceVsAmb: false,\r\n pageTitle: 'Contract Compliance/Revenue Gain/Loss',\r\n filters: [\r\n 'DetailAccountFilterComponent',\r\n 'DetailDiseaseStateFilterComponent',\r\n 'DetailAssayFilterComponent'\r\n ],\r\n tileReference: {\r\n apiSource: '/metrics/compliance', // this is actually abbottlink installed but uses alconnected\r\n componentName: 'ComplianceChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/compliance_0',\r\n table: {\r\n type: 'custom-compliance',\r\n exportFileName: 'compliance.xlsx',\r\n level2DetailLink: 'details'\r\n }\r\n },\r\n '/amb_orders': {\r\n metricId: 25,\r\n serviceVsAmb: false,\r\n pageTitle: 'Customer Orders',\r\n filters: ['DetailAccountFilterComponent'],\r\n tileReference: {\r\n apiSource: '/amb_orders',\r\n componentName: 'PieChartComponent',\r\n preferences: {\r\n showGoal: false,\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/amb_orders_0',\r\n table: {\r\n type: 'set-values',\r\n exportFileName: 'amb_customer_orders.xlsx',\r\n level2DetailLink: 'intermediate',\r\n dataCols: [\r\n {\r\n ref: 'percentHold',\r\n description: '% Hold',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberHold',\r\n description: '# Hold',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentOpen',\r\n description: '% Open',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberOpen',\r\n description: '# Open',\r\n width: 80\r\n },\r\n {\r\n ref: 'percentClosed',\r\n description: '% Closed',\r\n width: 80\r\n },\r\n {\r\n ref: 'numberClosed',\r\n description: '# Closed',\r\n width: 80\r\n }\r\n ],\r\n dataValues: (apiData) => {\r\n return {\r\n percentHold: apiData.values[0].percentage,\r\n numberHold: apiData.values[0].quantity,\r\n percentOpen: apiData.values[1].percentage,\r\n numberOpen: apiData.values[1].quantity,\r\n percentClosed: apiData.values[2].percentage,\r\n numberClosed: apiData.values[2].quantity,\r\n };\r\n },\r\n valueColors: (apiData) => {\r\n return [\r\n apiData.values[0].color,\r\n '',\r\n apiData.values[1].color,\r\n '',\r\n apiData.values[2].color,\r\n '',\r\n ];\r\n }\r\n }\r\n },\r\n '/amb_servicegrossmargin_customerSGM': {\r\n metricId: 31,\r\n serviceVsAmb: false,\r\n pageTitle: 'Service Gross Margin (SGM)',\r\n subTitle: '(Country YTD, Customer 12MA)',\r\n filters: ['DetailAccountFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/amb_servicegrossmargin_customerSGM_details',\r\n componentName: 'MultiLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/amb_servicegrossmargin_customerSGM_details_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'amb_servicegrossmargin_customerSGM.xlsx',\r\n level2DetailLink: 'details',\r\n colorRowDescriptions: true,\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'sgmPercent',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'SGM %',\r\n stackIndex: 0\r\n }\r\n },\r\n {\r\n key: 'goalPercent',\r\n parser: 'pointValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Goal %',\r\n stackIndex: 1\r\n }\r\n }\r\n ],\r\n dataRows: ['sgmPercent', 'goalPercent'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.linecolors[0],\r\n apiData.linecolors[1],\r\n ];\r\n }\r\n }\r\n },\r\n '/amb_customerswithoutservicecontracts': {\r\n metricId: 33,\r\n serviceVsAmb: false,\r\n pageTitle: 'Predictive Alerts w/o Service Contracts',\r\n filters: ['DetailAccountFilterComponent'],\r\n tileReference: {\r\n apiSource: '/metrics/amb_customerswithoutservicecontracts',\r\n componentName: 'StackedBarLineChartComponent',\r\n preferences: {\r\n showTitle: false\r\n }\r\n },\r\n apiRequestHandler: '/metrics/amb_customerswithoutservicecontracts_0',\r\n table: {\r\n type: 'style1',\r\n exportFileName: 'amb_customerswithoutservicecontracts.xlsx',\r\n level2DetailLink: 'grid',\r\n dataCols: {\r\n parser: 'stackKeys',\r\n inject: 'apiData',\r\n attributes: {}\r\n },\r\n dataParse: [ // build the rows as array data\r\n {\r\n key: 'alertCount',\r\n parser: 'stackValues',\r\n inject: 'apiData',\r\n attributes: {\r\n label: 'Alert Count',\r\n stackIndex: 0\r\n }\r\n }\r\n ],\r\n dataRows: ['alertCount'], // arrange the rows\r\n rowColors: (apiData) => {\r\n return [\r\n apiData.stackcolors[0]\r\n ];\r\n }\r\n }\r\n },\r\n};\r\n","import {CompositeFilterDescriptor, FilterDescriptor, process, SortDescriptor, State} from '@progress/kendo-data-query';\nimport {PageChangeEvent, DataStateChangeEvent} from '@progress/kendo-angular-grid';\nimport * as _ from 'lodash';\nimport {ExcelExportData} from '@progress/kendo-angular-excel-export';\n\nexport class GridComponent {\n dataRows = [];\n dataCols = [];\n filterOnChildProperty = null;\n\n gridState: State = {\n skip: 0,\n take: 100,\n group: [],\n sort: [],\n filter: { logic: 'and', filters: [] }\n };\n gridData: any;\n exportState: State = {};\n\n constructor() {\n this.allData = this.allData.bind(this);\n }\n\n pageChange(gridState: PageChangeEvent): void {\n this.gridState.skip = gridState.skip;\n this.gridState.take = gridState.take;\n this.updateGrid();\n }\n\n sortChange(sort: SortDescriptor[]): void {\n // if sort changes return to first page\n // if (!_.isEqual(this.gridState.sort, sort)) {\n // this.gridState.skip = 0;\n // }\n this.gridState.sort = sort;\n this.updateGrid();\n }\n\n filterChange(filter: CompositeFilterDescriptor): void {\n // if filter change is called return to first page\n // menu filters are automatically updating this.gridState.filter making comparison not feasible\n // to do this without a check is a necessary compromise\n this.gridState.skip = 0;\n this.gridState.filter = filter;\n this.updateGrid();\n }\n\n dataStateChange(state: DataStateChangeEvent): void {\n this.gridState = state;\n this.updateGrid();\n }\n\n updateGrid() {\n /**\n * This was an attempt to make filters work the way existing data was structured\n * but it does not allow the indicator to work showing filters have been selected\n */\n // this.gridState.filter = this.updateFiltersToHandleChildProperty(this.gridState.filter);\n this.gridData = process(this.dataRows, this.gridState);\n }\n\n // use disabled\n updateFiltersToHandleChildProperty(inFilter) {\n if (this.filterOnChildProperty) {\n for (let key = 0; key < inFilter.filters.length; key++) {\n const item = inFilter.filters[key];\n if ((item as FilterDescriptor).field !== undefined\n && ((item as FilterDescriptor).field as string).indexOf(this.filterOnChildProperty) === -1\n ) {\n (inFilter.filters[key] as FilterDescriptor).field += '.' + this.filterOnChildProperty;\n } else if ((item as CompositeFilterDescriptor).filters !== undefined) {\n inFilter.filters[key] = this.updateFiltersToHandleChildProperty(item); // note: recursion\n }\n }\n return inFilter;\n }\n }\n\n public allData(): ExcelExportData {\n const result: ExcelExportData = {\n data: process(this.dataRows, this.exportState).data,\n group: []\n };\n return result;\n }\n\n public forceDataReload() {\n // this.updateGrid();\n this.loadData();\n }\n\n protected loadData() {\n console.log('refresh called!!');\n }\n\n protected detectMob() {\n return /iPad|iPhone|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }\n\n public getHeight() {\n return -1;\n }\n\n public getMaxHeight(): string {\n const userWindowHeight = window.screen.availHeight;\n const userWindowWidth = window.screen.availWidth;\n\n if (userWindowHeight < 300) {\n return 300 + 'px';\n } else if (userWindowWidth <= 768) {\n return (userWindowHeight - 100) + 'px';\n } else if (this.detectMob()) {\n return (userWindowHeight - 150) + 'px';\n }\n return (userWindowHeight - 250) + 'px';\n }\n\n}\n","import {StackKeys} from '../../details/row_parsers/stack-keys';\r\nimport {StackValues} from '../../details/row_parsers/stack-values';\r\nimport {StackTotals} from '../../details/row_parsers/stack-totals';\r\nimport {Percents} from '../../details/row_parsers/percents';\r\nimport {PercentGoals} from '../../details/row_parsers/percent-goals';\r\nimport {PointValues} from '../../details/row_parsers/point-values';\r\n\r\nexport const RowParsers = {\r\n stackKeys: StackKeys,\r\n stackValues: StackValues,\r\n stackTotals: StackTotals,\r\n percents: Percents,\r\n percentGoals: PercentGoals,\r\n pointValues: PointValues\r\n};\r\n","import { RowParserInterface } from '../row-parser-interface';\r\n\r\nexport class StackKeys implements RowParserInterface {\r\n get(sourceData, params) {\r\n const stackKeys = [];\r\n stackKeys.push({\r\n ref: 'description',\r\n description: 'YYYY-MM',\r\n width: '80',\r\n class: null\r\n });\r\n let i = 0;\r\n for (const value of sourceData.values) {\r\n const key = value.xlabel;\r\n stackKeys.push({\r\n ref: key,\r\n description: key,\r\n width: '65',\r\n class: null\r\n });\r\n i++;\r\n }\r\n return stackKeys;\r\n }\r\n}\r\n","import { RowParserInterface } from '../row-parser-interface';\r\n\r\nexport class StackValues implements RowParserInterface {\r\n get(sourceData, params) {\r\n const rowData = {\r\n description: params.label\r\n };\r\n\r\n for (const value of sourceData.values) {\r\n const key = value.xlabel;\r\n rowData[key] = value.stacks[params.stackIndex];\r\n }\r\n return rowData;\r\n }\r\n}\r\n","import { RowParserInterface } from '../row-parser-interface';\r\n\r\nexport class StackTotals implements RowParserInterface {\r\n get(sourceData, params) {\r\n const rowData = {\r\n description: params.label\r\n };\r\n\r\n for (const index of Object.keys(sourceData[0])) {\r\n if (index !== 'description') {\r\n rowData[index] = 0;\r\n for (const sourceItem of sourceData) {\r\n rowData[index] = rowData[index] + parseFloat(sourceItem[index]);\r\n }\r\n }\r\n }\r\n return rowData;\r\n }\r\n}\r\n","import { RowParserInterface } from '../row-parser-interface';\r\nimport * as _ from 'lodash';\r\n\r\nexport class Percents implements RowParserInterface {\r\n get(sourceData, params) {\r\n const rowData = {\r\n description: params.label\r\n };\r\n const totals = sourceData[0];\r\n const devideBy = sourceData[1];\r\n\r\n for (const index of Object.keys(totals)) {\r\n if (index !== 'description') {\r\n rowData[index] = _.round(100 / totals[index] * devideBy[index], 2);\r\n }\r\n }\r\n return rowData;\r\n }\r\n}\r\n","import { RowParserInterface } from '../row-parser-interface';\r\nimport * as _ from 'lodash';\r\n\r\nexport class PercentGoals implements RowParserInterface {\r\n get(sourceData, params) {\r\n const rowData = {\r\n description: params.label\r\n };\r\n\r\n for (const value of sourceData.values) {\r\n const key = value.xlabel;\r\n // rowData[key] = _.round(value.stackgoals[params.stackGoalsIndex], 2);\r\n rowData[key] = value.stackgoals[params.stackGoalsIndex];\r\n }\r\n return rowData;\r\n }\r\n}\r\n\r\n","import { RowParserInterface } from '../row-parser-interface';\r\n\r\nexport class PointValues implements RowParserInterface {\r\n get(sourceData, params) {\r\n const rowData = {\r\n description: params.label\r\n };\r\n\r\n for (const value of sourceData.values) {\r\n const key = value.xlabel;\r\n let pointValue = value.points[params.stackIndex];\r\n rowData[key] = pointValue;\r\n }\r\n return rowData;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport {RowParsers} from '../configuration/details/row-parsers';\nimport {RowParserInterface} from './row-parser-interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RowParserService {\n protected rowParsers = RowParsers;\n protected registry = {};\n\n constructor() { }\n\n public get(key): RowParserInterface {\n if (!(key in this.registry)) {\n this.registry[key] = new this.rowParsers[key]();\n }\n\n return this.registry[key];\n }\n}\n","import { fromArray } from './fromArray';\nimport { isArray } from '../util/isArray';\nimport { Subscriber } from '../Subscriber';\nimport { iterator as Symbol_iterator } from '../../internal/symbol/iterator';\nimport { SimpleOuterSubscriber, SimpleInnerSubscriber, innerSubscribe } from '../innerSubscribe';\nexport function zip(...observables) {\n const resultSelector = observables[observables.length - 1];\n if (typeof resultSelector === 'function') {\n observables.pop();\n }\n return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));\n}\nexport class ZipOperator {\n constructor(resultSelector) {\n this.resultSelector = resultSelector;\n }\n call(subscriber, source) {\n return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));\n }\n}\nexport class ZipSubscriber extends Subscriber {\n constructor(destination, resultSelector, values = Object.create(null)) {\n super(destination);\n this.resultSelector = resultSelector;\n this.iterators = [];\n this.active = 0;\n this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : undefined;\n }\n _next(value) {\n const iterators = this.iterators;\n if (isArray(value)) {\n iterators.push(new StaticArrayIterator(value));\n }\n else if (typeof value[Symbol_iterator] === 'function') {\n iterators.push(new StaticIterator(value[Symbol_iterator]()));\n }\n else {\n iterators.push(new ZipBufferIterator(this.destination, this, value));\n }\n }\n _complete() {\n const iterators = this.iterators;\n const len = iterators.length;\n this.unsubscribe();\n if (len === 0) {\n this.destination.complete();\n return;\n }\n this.active = len;\n for (let i = 0; i < len; i++) {\n let iterator = iterators[i];\n if (iterator.stillUnsubscribed) {\n const destination = this.destination;\n destination.add(iterator.subscribe());\n }\n else {\n this.active--;\n }\n }\n }\n notifyInactive() {\n this.active--;\n if (this.active === 0) {\n this.destination.complete();\n }\n }\n checkIterators() {\n const iterators = this.iterators;\n const len = iterators.length;\n const destination = this.destination;\n for (let i = 0; i < len; i++) {\n let iterator = iterators[i];\n if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n return;\n }\n }\n let shouldComplete = false;\n const args = [];\n for (let i = 0; i < len; i++) {\n let iterator = iterators[i];\n let result = iterator.next();\n if (iterator.hasCompleted()) {\n shouldComplete = true;\n }\n if (result.done) {\n destination.complete();\n return;\n }\n args.push(result.value);\n }\n if (this.resultSelector) {\n this._tryresultSelector(args);\n }\n else {\n destination.next(args);\n }\n if (shouldComplete) {\n destination.complete();\n }\n }\n _tryresultSelector(args) {\n let result;\n try {\n result = this.resultSelector.apply(this, args);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\nclass StaticIterator {\n constructor(iterator) {\n this.iterator = iterator;\n this.nextResult = iterator.next();\n }\n hasValue() {\n return true;\n }\n next() {\n const result = this.nextResult;\n this.nextResult = this.iterator.next();\n return result;\n }\n hasCompleted() {\n const nextResult = this.nextResult;\n return Boolean(nextResult && nextResult.done);\n }\n}\nclass StaticArrayIterator {\n constructor(array) {\n this.array = array;\n this.index = 0;\n this.length = 0;\n this.length = array.length;\n }\n [Symbol_iterator]() {\n return this;\n }\n next(value) {\n const i = this.index++;\n const array = this.array;\n return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n }\n hasValue() {\n return this.array.length > this.index;\n }\n hasCompleted() {\n return this.array.length === this.index;\n }\n}\nclass ZipBufferIterator extends SimpleOuterSubscriber {\n constructor(destination, parent, observable) {\n super(destination);\n this.parent = parent;\n this.observable = observable;\n this.stillUnsubscribed = true;\n this.buffer = [];\n this.isComplete = false;\n }\n [Symbol_iterator]() {\n return this;\n }\n next() {\n const buffer = this.buffer;\n if (buffer.length === 0 && this.isComplete) {\n return { value: null, done: true };\n }\n else {\n return { value: buffer.shift(), done: false };\n }\n }\n hasValue() {\n return this.buffer.length > 0;\n }\n hasCompleted() {\n return this.buffer.length === 0 && this.isComplete;\n }\n notifyComplete() {\n if (this.buffer.length > 0) {\n this.isComplete = true;\n this.parent.notifyInactive();\n }\n else {\n this.destination.complete();\n }\n }\n notifyNext(innerValue) {\n this.buffer.push(innerValue);\n this.parent.checkIterators();\n }\n subscribe() {\n return innerSubscribe(this.observable, new SimpleInnerSubscriber(this));\n }\n}\n//# sourceMappingURL=zip.js.map","import { switchMap } from './switchMap';\nexport function switchMapTo(innerObservable, resultSelector) {\n return resultSelector ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);\n}\n//# sourceMappingURL=switchMapTo.js.map","import { Subscriber } from '../Subscriber';\nexport function distinctUntilChanged(compare, keySelector) {\n return (source) => source.lift(new DistinctUntilChangedOperator(compare, keySelector));\n}\nclass DistinctUntilChangedOperator {\n constructor(compare, keySelector) {\n this.compare = compare;\n this.keySelector = keySelector;\n }\n call(subscriber, source) {\n return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n }\n}\nclass DistinctUntilChangedSubscriber extends Subscriber {\n constructor(destination, compare, keySelector) {\n super(destination);\n this.keySelector = keySelector;\n this.hasKey = false;\n if (typeof compare === 'function') {\n this.compare = compare;\n }\n }\n compare(x, y) {\n return x === y;\n }\n _next(value) {\n let key;\n try {\n const { keySelector } = this;\n key = keySelector ? keySelector(value) : value;\n }\n catch (err) {\n return this.destination.error(err);\n }\n let result = false;\n if (this.hasKey) {\n try {\n const { compare } = this;\n result = compare(this.key, key);\n }\n catch (err) {\n return this.destination.error(err);\n }\n }\n else {\n this.hasKey = true;\n }\n if (!result) {\n this.key = key;\n this.destination.next(value);\n }\n }\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { Subscriber } from '../Subscriber';\nexport function bufferCount(bufferSize, startBufferEvery = null) {\n return function bufferCountOperatorFunction(source) {\n return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n };\n}\nclass BufferCountOperator {\n constructor(bufferSize, startBufferEvery) {\n this.bufferSize = bufferSize;\n this.startBufferEvery = startBufferEvery;\n if (!startBufferEvery || bufferSize === startBufferEvery) {\n this.subscriberClass = BufferCountSubscriber;\n }\n else {\n this.subscriberClass = BufferSkipCountSubscriber;\n }\n }\n call(subscriber, source) {\n return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));\n }\n}\nclass BufferCountSubscriber extends Subscriber {\n constructor(destination, bufferSize) {\n super(destination);\n this.bufferSize = bufferSize;\n this.buffer = [];\n }\n _next(value) {\n const buffer = this.buffer;\n buffer.push(value);\n if (buffer.length == this.bufferSize) {\n this.destination.next(buffer);\n this.buffer = [];\n }\n }\n _complete() {\n const buffer = this.buffer;\n if (buffer.length > 0) {\n this.destination.next(buffer);\n }\n super._complete();\n }\n}\nclass BufferSkipCountSubscriber extends Subscriber {\n constructor(destination, bufferSize, startBufferEvery) {\n super(destination);\n this.bufferSize = bufferSize;\n this.startBufferEvery = startBufferEvery;\n this.buffers = [];\n this.count = 0;\n }\n _next(value) {\n const { bufferSize, startBufferEvery, buffers, count } = this;\n this.count++;\n if (count % startBufferEvery === 0) {\n buffers.push([]);\n }\n for (let i = buffers.length; i--;) {\n const buffer = buffers[i];\n buffer.push(value);\n if (buffer.length === bufferSize) {\n buffers.splice(i, 1);\n this.destination.next(buffer);\n }\n }\n }\n _complete() {\n const { buffers, destination } = this;\n while (buffers.length > 0) {\n let buffer = buffers.shift();\n if (buffer.length > 0) {\n destination.next(buffer);\n }\n }\n super._complete();\n }\n}\n//# sourceMappingURL=bufferCount.js.map","/**\n * A function that clones the passed date. The parameter could be `null`.\n *\n * @param date - The initial date value.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * cloneDate(new Date(2016, 0, 1)); // returns new Date(2016, 0, 1);\n * cloneDate(null); // returns null\n * ```\n */\nexport const cloneDate = (date) => date ? new Date(date.getTime()) : null;\n","import { cloneDate } from './clone-date';\n/**\n * @hidden\n */\nexport const adjustDST = (date, hour) => {\n const newDate = cloneDate(date);\n if (hour === 0 && newDate.getHours() === 23) {\n newDate.setHours(newDate.getHours() + 2);\n }\n return newDate;\n};\n","import { adjustDST } from './adjust-dst';\nimport { cloneDate } from './clone-date';\n/**\n * A function that adds and subtracts days from a `Date` object.\n *\n * @param date - The initial date value.\n * @param offset - The number of days to add and subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addDays(new Date(2016, 0, 1), 5); // 2016-1-6\n * addDays(new Date(2016, 0, 1), -5); // 2015-12-26\n * ```\n */\nexport const addDays = (date, offset) => {\n const newDate = cloneDate(date);\n newDate.setDate(newDate.getDate() + offset);\n return adjustDST(newDate, date.getHours());\n};\n","import { adjustDST } from './adjust-dst';\n/**\n * A function which returns a new `Date` instance.\n *\n * @param year - The year value.\n * @param month - The month value.\n * @param day - The day value.\n * @param hours - The hours value.\n * @param minutes - The minutes value.\n * @param seconds - The seconds value.\n * @param milliseconds - milliseconds value.\n * @returns The date instance.\n *\n * @example\n * ```ts-no-run\n * createDate(2016, 0, 15); // 2016-01-15 00:00:00\n * createDate(2016, 0, 15, 22, 22, 20); // 2016-01-15 22:22:20\n * ```\n */\nexport const createDate = (year, month, day, hours = 0, minutes = 0, seconds = 0, milliseconds = 0) => {\n const date = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n if (year > -1 && year < 100) {\n date.setFullYear(date.getFullYear() - 1900);\n }\n return adjustDST(date, hours);\n};\n","import { createDate } from './create-date';\n/**\n * A function which returns the passed date with a midnight time portion.\n *\n * @param date - The initial date.\n * @returns - The date with a midnight time portion.\n *\n * @example\n * ```ts-no-run\n * getDate(new Date(2016, 0, 15, 14, 30, 30)); // 2016-01-15 00:00:00\n * ```\n */\nexport const getDate = (date) => {\n return createDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n};\n","/**\n * A function that compares two dates. The comparison also includes the time portion.\n *\n * @param candidate - The candidate date.\n * @param expected - The expected date.\n * @returns - A Boolean value indicating whether the values are equal.\n *\n * @example\n * ```ts-no-run\n * isEqual(new Date(2016, 0, 1), new Date(2016, 0, 1)); // true\n * isEqual(new Date(2016, 0, 1), new Date(2016, 0, 2)); // false\n * isEqual(new Date(2016, 0, 1, 10), new Date(2016, 0, 1, 20)); // false\n * ```\n */\nexport const isEqual = (candidate, expected) => {\n if (!candidate && !expected) {\n return true;\n }\n return candidate && expected && candidate.getTime() === expected.getTime();\n};\n","import { addDays } from './add-days';\nimport { createDate } from './create-date';\n/**\n * A function which returns the last date of the month.\n *\n * @param date - The initial date.\n * @returns - The last date of the initial date month.\n *\n * @example\n * ```ts-no-run\n * lastDayOfMonth(new Date(2016, 0, 15)); // 2016-01-31\n * ```\n */\nexport const lastDayOfMonth = (date) => {\n const newDate = createDate(date.getFullYear(), date.getMonth() + 1, 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n return addDays(newDate, -1);\n};\n","import { adjustDST } from './adjust-dst';\nimport { cloneDate } from './clone-date';\nimport { lastDayOfMonth } from './last-day-of-month';\nconst MONTHS_LENGTH = 12;\nconst normalize = (date, expectedMonth) => (date.getMonth() !== expectedMonth ? lastDayOfMonth(addMonths(date, -1)) : date //tslint:disable-line:no-use-before-declare\n);\n/**\n * A function that adds and subtracts months from a `Date` object.\n *\n * @param date - The initial date value.\n * @param offset - The number of months to add or subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addMonths(new Date(2016, 5, 1), 5); // 2016-11-1\n * addMonths(new Date(2016, 5, 1), -5); // 2015-1-1\n * ```\n */\nexport const addMonths = (date, offset) => {\n const newDate = cloneDate(date);\n const diff = (newDate.getMonth() + offset) % MONTHS_LENGTH;\n const expectedMonth = (MONTHS_LENGTH + diff) % MONTHS_LENGTH;\n newDate.setMonth(newDate.getMonth() + offset);\n return normalize(adjustDST(newDate, date.getHours()), expectedMonth);\n};\n","import { addMonths } from './add-months';\nimport { createDate } from './create-date';\nimport { lastDayOfMonth } from './last-day-of-month';\n/**\n * @hidden\n */\nexport const setYear = (value, year) => {\n const month = value.getMonth();\n const candidate = createDate(year, month, value.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\n return candidate.getMonth() === month ? candidate : lastDayOfMonth(addMonths(candidate, -1));\n};\n","import { adjustDST } from './adjust-dst';\nimport { setYear } from './set-year';\n/**\n * A function that adds and subtracts years from a `Date` object.\n *\n * @param date - The initial date value.\n * @param offset - The number of years to add or subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addYears(new Date(2016, 5, 1), 5); // 2011-6-1\n * addYears(new Date(2016, 5, 1), -5); // 2021-6-1\n * ```\n */\nexport const addYears = (value, offset) => {\n return adjustDST(setYear(value, value.getFullYear() + offset), value.getHours());\n};\n","import { addYears } from './add-years';\n/**\n * A function that adds and subtracts decades from a `Date` object.\n *\n * @param date - The initial date value.\n * @param offset - The number of decades to add or subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addDecades(new Date(2016, 5, 1), 5); // 2066-6-1\n * addDecades(new Date(2016, 5, 1), -5); // 1966-6-1\n * ```\n */\nexport const addDecades = (value, offset) => {\n return addYears(value, 10 * offset);\n};\n","import { addYears } from './add-years';\n/**\n * A function that adds and subtracts centuries from a `Date` object.\n *\n * @param date - The initial date value.\n * @param offset - The number of centuries to add or subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addCenturies(new Date(2016, 5, 1), 5); // 2516-6-1\n * addCenturies(new Date(2016, 5, 1), -5); // 1516-6-1\n * ```\n */\nexport const addCenturies = (value, offset) => {\n return addYears(value, 100 * offset);\n};\n","import { setYear } from './set-year';\n/**\n * @hidden\n */\nexport const normalizeYear = (value, year) => (setYear(value, year(value.getFullYear())));\n","import { normalizeYear } from './normalize-year';\n/**\n * A function that returns a `Date` object of the first decade in a century.\n *\n * @param date - The start date value.\n * @returns - The first year in a century.\n *\n * @example\n * ```ts-no-run\n * firstDecadeOfCentury(new Date(2017, 0, 1)); // 2000-1-1\n * firstDecadeOfCentury(new Date(2007, 10, 22)); // 2000-11-22\n * firstDecadeOfCentury(new Date(2126, 0, 1)); // 2100-1-1\n * ```\n */\nexport const firstDecadeOfCentury = (value) => (normalizeYear(value, (y) => y - (y % 100)));\n","import { normalizeYear } from './normalize-year';\n/**\n * A function that returns a `Date` object of the last decade in a century.\n *\n * @param date - The start date value.\n * @returns - The last year in a decade.\n *\n * @example\n * ```ts-no-run\n * lastDecadeOfCentury(new Date(2017, 0, 1)); // 2090-1-1\n * lastDecadeOfCentury(new Date(2007, 10, 22)); // 2090-11-22\n * lastDecadeOfCentury(new Date(2126, 0, 1)); // 2190-1-1\n * ```\n */\nexport const lastDecadeOfCentury = (value) => (normalizeYear(value, (y) => y - (y % 100) + 90));\n","import { normalizeYear } from './normalize-year';\n/**\n * A function that returns a `Date` object of the first year in a decade.\n *\n * @param date - The start date value.\n * @returns - The first year in a decade.\n *\n * @example\n * ```ts-no-run\n * firstYearOfDecade(new Date(2017, 0, 1)); // 2010-1-1\n * firstYearOfDecade(new Date(2007, 10, 22)); // 2000-11-22\n * firstYearOfDecade(new Date(2026, 0, 1)); // 2020-1-1\n * ```\n */\nexport const firstYearOfDecade = (value) => (normalizeYear(value, (y) => y - (y % 10)));\n","import { firstDecadeOfCentury } from './first-decade-of-century';\n/**\n * A function that calculates duration in centuries between two `Date` objects.\n *\n * @param start - The start date value.\n * @param end - The end date value.\n * @returns - The duration in months.\n *\n * @example\n * ```ts-no-run\n * durationInCenturies(new Date(2016, 0, 1), new Date(3216, 0, 1)); // 12\n * durationInCenturies(new Date(2016, 6, 1), new Date(2617, 0, 1)); // 6\n * durationInCenturies(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\n * ```\n */\nexport const durationInCenturies = (start, end) => ((firstDecadeOfCentury(end).getFullYear() - firstDecadeOfCentury(start).getFullYear()) / 100);\n","import { normalizeYear } from './normalize-year';\n/**\n * A function that returns a `Date` object of the last year in a decade.\n *\n * @param date - The start date value.\n * @returns - The last year in a decade.\n *\n * @example\n * ```ts-no-run\n * lastYearOfDecade(new Date(2017, 0, 1)); // 2019-1-1\n * lastYearOfDecade(new Date(2007, 10, 22)); // 2009-11-22\n * lastYearOfDecade(new Date(2026, 0, 1)); // 2029-1-1\n * ```\n */\nexport const lastYearOfDecade = (value) => (normalizeYear(value, (y) => y - (y % 10) + 9));\n","import { firstYearOfDecade } from './first-year-of-decade';\n/**\n * A function that calculates duration in decades between two `Date` objects.\n *\n * @param start - The start date value.\n * @param end - The end date value.\n * @returns - The duration in months.\n *\n * @example\n * ```ts-no-run\n * durationInDecades(new Date(2016, 0, 1), new Date(2136, 0, 1)); // 12\n * durationInDecades(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\n * ```\n */\nexport const durationInDecades = (start, end) => ((firstYearOfDecade(end).getFullYear() - firstYearOfDecade(start).getFullYear()) / 10);\n","import { addDays } from './add-days';\n/**\n * A function that adds and subtracts weeks from a Date object.\n *\n * @param date - The initial date value.\n * @param offset - The number of weeks to add/subtract from the date.\n * @returns - A new `Date` instance.\n *\n * @example\n * ```ts-no-run\n * addWeeks(new Date(2016, 5, 1), 3); // 2016-6-22\n * addWeeks(new Date(2016, 5, 1), -3); // 2015-5-11\n * ```\n */\nexport const addWeeks = (date, offset) => {\n return addDays(date, offset * 7);\n};\n","import { createDate } from './create-date';\n/**\n * A function which returns the first date of the month.\n *\n * @param date - The initial date.\n * @returns - The first date of the initial date month.\n *\n * @example\n * ```ts-no-run\n * firstDayOfMonth(new Date(2016, 0, 15)); // 2016-01-01\n * ```\n */\nexport const firstDayOfMonth = (date) => {\n return createDate(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n};\n","// tslint:disable:max-line-length\n/**\n * An enumeration which represents the horizontal direction. The `Forward` option moves forward. The `Backward` option moves backward.\n */\nexport var Direction;\n(function (Direction) {\n /**\n * The `Forward` value with an underlying `1` number value.\n */\n Direction[Direction[\"Forward\"] = 1] = \"Forward\";\n /**\n * The `Backward` value with an underlying `-1` (minus one) number value.\n */\n Direction[Direction[\"Backward\"] = -1] = \"Backward\";\n})(Direction || (Direction = {}));\n// tslint:enable:max-line-length\n","import { Direction } from \"./direction.enum\";\nimport { adjustDST } from \"./adjust-dst\";\nimport { cloneDate } from './clone-date';\n/**\n * @hidden\n *\n * A function which returns the next or previous date for a specific week day. For example, `Day.Monday`.\n *\n * @param date - The date to calculate from.\n * @param weekDay - The `Day` enum specifying the desired week day.\n * @param direction - The `Direction` enum specifying the calculation direction.\n * @returns - A `Date` instance.\n *\n * @example\n * ```ts-no-run\n * dayOfWeek(new Date(2016, 0, 1), Day.Wednesday, Direction.Forward); // 2016-01-06, Wednesday\n * dayOfWeek(new Date(2016, 0, 1), Day.Wednesday, Direction.Backward); // 2015-12-30, Wednesday\n * ```\n */\nexport const dayOfWeek = (date, weekDay, direction = Direction.Forward) => {\n const newDate = cloneDate(date);\n const newDay = ((weekDay - newDate.getDay()) + (7 * direction)) % 7;\n newDate.setDate(newDate.getDate() + newDay);\n return adjustDST(newDate, date.getHours());\n};\n","/**\n * A function that calculates duration in months between two `Date` objects.\n *\n * @param start - The start date value.\n * @param end - The end date value.\n * @returns - The duration in months.\n *\n * @example\n * ```ts-no-run\n * durationInMonths(new Date(2016, 0, 1), new Date(2017, 0, 1)); // 12\n * durationInMonths(new Date(2016, 6, 1), new Date(2017, 0, 1)); // 6\n * durationInMonths(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\n * ```\n */\nexport const durationInMonths = (start, end) => (((end.getFullYear() - start.getFullYear())) * 12 + (end.getMonth() - start.getMonth()));\n","import { addMonths } from './add-months';\nimport { createDate } from './create-date';\nimport { lastDayOfMonth } from './last-day-of-month';\n/**\n * @hidden\n */\nexport const setMonth = (value, month) => {\n const day = value.getDate();\n const candidate = createDate(value.getFullYear(), month, day, value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\n return candidate.getDate() === day ? candidate : lastDayOfMonth(addMonths(candidate, -1));\n};\n","import { setMonth } from './set-month';\n/**\n * A function that returns a `Date` object of the first month in a year.\n *\n * @param date - The start date value.\n * @returns - The first month in a year.\n *\n * @example\n * ```ts-no-run\n * firstMonthOfYear(new Date(2017, 11, 1)); // 2017-1-1\n * firstMonthOfYear(new Date(2017, 0, 1)); // 2017-1-1\n * ```\n */\nexport const firstMonthOfYear = (value) => setMonth(value, 0);\n","import { setMonth } from './set-month';\n/**\n * A function that returns a `Date` object of the last month in a year.\n *\n * @param date - The start date value.\n * @returns - The last month in a year.\n *\n * @example\n * ```ts-no-run\n * lastMonthOfYear(new Date(2017, 5, 3)); // 2017-12-3\n * lastMonthOfYear(new Date(2017, 11, 3)); // 2017-12-3\n * ```\n */\nexport const lastMonthOfYear = (value) => setMonth(value, 11);\n","/**\n * A function that calculates duration in years between two `Date` objects.\n *\n * @param start - The start date value.\n * @param end - The end date value.\n * @returns - The duration in years.\n *\n * @example\n * ```ts-no-run\n * durationInYears(new Date(2016, 0, 1), new Date(2028, 0, 1)); // 12\n * durationInYears(new Date(2016, 0, 1), new Date(2022, 0, 1)); // 6\n * durationInYears(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\n * ```\n */\nexport const durationInYears = (start, end) => (end.getFullYear() - start.getFullYear());\n","/**\n * Enumeration which represents the week days.\n */\nexport var Day;\n(function (Day) {\n /**\n * The Sunday value with an underlying `0` number value.\n */\n Day[Day[\"Sunday\"] = 0] = \"Sunday\";\n /**\n * The Monday value with an underlying `1` number value.\n */\n Day[Day[\"Monday\"] = 1] = \"Monday\";\n /**\n * The Tuesday value with an underlying `2` number value.\n */\n Day[Day[\"Tuesday\"] = 2] = \"Tuesday\";\n /**\n * The Wednesday value with an underlying `3` number value.\n */\n Day[Day[\"Wednesday\"] = 3] = \"Wednesday\";\n /**\n * The Thursday value with an underlying `4` number value.\n */\n Day[Day[\"Thursday\"] = 4] = \"Thursday\";\n /**\n * The Friday value with an underlying `5` number value.\n */\n Day[Day[\"Friday\"] = 5] = \"Friday\";\n /**\n * The Saturday value with an underlying `6` number value.\n */\n Day[Day[\"Saturday\"] = 6] = \"Saturday\";\n})(Day || (Day = {}));\n","import { Direction } from \"./direction.enum\";\nimport { dayOfWeek } from './day-of-week';\n/**\n * A function which returns a date by a specific week name. For example, `Day.Monday`.\n *\n * @param date - The date to calculate from.\n * @param weekDay - The `Day` enum specifying the desired week day.\n * @returns - A `Date` instance.\n *\n * @example\n * ```ts-no-run\n * prevDayOfWeek(new Date(2016, 0, 1), Day.Wednesday); // 2015-12-30, Wednesday\n * ```\n */\nexport const prevDayOfWeek = (date, weekDay) => {\n return dayOfWeek(date, weekDay, Direction.Backward);\n};\n","import { Day } from './day.enum';\nimport { addDays } from './add-days';\nimport { createDate } from './create-date';\nimport { prevDayOfWeek } from './prev-day-of-week';\nimport { MS_PER_DAY } from './constants';\nimport { getDate } from './get-date';\nconst moveDateToWeekStart = (date, weekStartDay) => {\n if (weekStartDay !== Day.Monday) {\n return addDays(prevDayOfWeek(date, weekStartDay), 4);\n }\n return addDays(date, (4 - (date.getDay() || 7)));\n};\nconst calcWeekInYear = (date, weekStartDay) => {\n const firstWeekInYear = createDate(date.getFullYear(), 0, 1, -6);\n const newDate = moveDateToWeekStart(date, weekStartDay);\n const diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n const days = Math.floor(diffInMS / MS_PER_DAY);\n return 1 + Math.floor(days / 7);\n};\n/**\n * A function that returns the number of the week within a year, which is calculated in relation to the date.\n *\n * For more information, refer to the [**ISO week date**](https://en.wikipedia.org/wiki/ISO_week_date) article.\n *\n * @param date - The date used for the week number calculation.\n * @param weekStartDay - The first day of the week. By default, the first week day is Monday.\n * @returns - The number of the week within the year.\n *\n * @example\n * ```ts-no-run\n * weekInYear(new Date(2016, 0, 1)); // Week 53, 2015\n * weekInYear(new Date(2016, 0, 5)); // Week 1, 2016\n * weekInYear(new Date(2017, 0, 1)); // Week 52, 2016\n * weekInYear(new Date(2017, 0, 2)); // Week 1, 2017\n * ```\n */\nexport const weekInYear = (date, weekStartDay = Day.Monday) => {\n date = getDate(date);\n const prevWeekDate = addDays(date, -7);\n const nextWeekDate = addDays(date, 7);\n const weekNumber = calcWeekInYear(date, weekStartDay);\n if (weekNumber === 0) {\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n }\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n return 1;\n }\n return weekNumber;\n};\n","/**\n * The number of milliseconds in one minute.\n */\nexport const MS_PER_MINUTE = 60000;\n/**\n * The number of milliseconds in one hour.\n */\nexport const MS_PER_HOUR = 3600000;\n/**\n * The number of milliseconds in one standard day.\n */\nexport const MS_PER_DAY = 86400000;\n","import { AsyncAction } from './AsyncAction';\nexport class QueueAction extends AsyncAction {\n constructor(scheduler, work) {\n super(scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n schedule(state, delay = 0) {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n execute(state, delay) {\n return (delay > 0 || this.closed) ?\n super.execute(state, delay) :\n this._execute(state, delay);\n }\n requestAsyncId(scheduler, id, delay = 0) {\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n return scheduler.flush(this);\n }\n}\n//# sourceMappingURL=QueueAction.js.map","import { AsyncScheduler } from './AsyncScheduler';\nexport class QueueScheduler extends AsyncScheduler {\n}\n//# sourceMappingURL=QueueScheduler.js.map","import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\nexport const queueScheduler = new QueueScheduler(QueueAction);\nexport const queue = queueScheduler;\n//# sourceMappingURL=queue.js.map","import { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nexport function observeOn(scheduler, delay = 0) {\n return function observeOnOperatorFunction(source) {\n return source.lift(new ObserveOnOperator(scheduler, delay));\n };\n}\nexport class ObserveOnOperator {\n constructor(scheduler, delay = 0) {\n this.scheduler = scheduler;\n this.delay = delay;\n }\n call(subscriber, source) {\n return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n }\n}\nexport class ObserveOnSubscriber extends Subscriber {\n constructor(destination, scheduler, delay = 0) {\n super(destination);\n this.scheduler = scheduler;\n this.delay = delay;\n }\n static dispatch(arg) {\n const { notification, destination } = arg;\n notification.observe(destination);\n this.unsubscribe();\n }\n scheduleMessage(notification) {\n const destination = this.destination;\n destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n }\n _next(value) {\n this.scheduleMessage(Notification.createNext(value));\n }\n _error(err) {\n this.scheduleMessage(Notification.createError(err));\n this.unsubscribe();\n }\n _complete() {\n this.scheduleMessage(Notification.createComplete());\n this.unsubscribe();\n }\n}\nexport class ObserveOnMessage {\n constructor(notification, destination) {\n this.notification = notification;\n this.destination = destination;\n }\n}\n//# sourceMappingURL=observeOn.js.map","import { Subject } from './Subject';\nimport { queue } from './scheduler/queue';\nimport { Subscription } from './Subscription';\nimport { ObserveOnSubscriber } from './operators/observeOn';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nexport class ReplaySubject extends Subject {\n constructor(bufferSize = Number.POSITIVE_INFINITY, windowTime = Number.POSITIVE_INFINITY, scheduler) {\n super();\n this.scheduler = scheduler;\n this._events = [];\n this._infiniteTimeWindow = false;\n this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n this._windowTime = windowTime < 1 ? 1 : windowTime;\n if (windowTime === Number.POSITIVE_INFINITY) {\n this._infiniteTimeWindow = true;\n this.next = this.nextInfiniteTimeWindow;\n }\n else {\n this.next = this.nextTimeWindow;\n }\n }\n nextInfiniteTimeWindow(value) {\n if (!this.isStopped) {\n const _events = this._events;\n _events.push(value);\n if (_events.length > this._bufferSize) {\n _events.shift();\n }\n }\n super.next(value);\n }\n nextTimeWindow(value) {\n if (!this.isStopped) {\n this._events.push(new ReplayEvent(this._getNow(), value));\n this._trimBufferThenGetEvents();\n }\n super.next(value);\n }\n _subscribe(subscriber) {\n const _infiniteTimeWindow = this._infiniteTimeWindow;\n const _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();\n const scheduler = this.scheduler;\n const len = _events.length;\n let subscription;\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n else if (this.isStopped || this.hasError) {\n subscription = Subscription.EMPTY;\n }\n else {\n this.observers.push(subscriber);\n subscription = new SubjectSubscription(this, subscriber);\n }\n if (scheduler) {\n subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));\n }\n if (_infiniteTimeWindow) {\n for (let i = 0; i < len && !subscriber.closed; i++) {\n subscriber.next(_events[i]);\n }\n }\n else {\n for (let i = 0; i < len && !subscriber.closed; i++) {\n subscriber.next(_events[i].value);\n }\n }\n if (this.hasError) {\n subscriber.error(this.thrownError);\n }\n else if (this.isStopped) {\n subscriber.complete();\n }\n return subscription;\n }\n _getNow() {\n return (this.scheduler || queue).now();\n }\n _trimBufferThenGetEvents() {\n const now = this._getNow();\n const _bufferSize = this._bufferSize;\n const _windowTime = this._windowTime;\n const _events = this._events;\n const eventsCount = _events.length;\n let spliceCount = 0;\n while (spliceCount < eventsCount) {\n if ((now - _events[spliceCount].time) < _windowTime) {\n break;\n }\n spliceCount++;\n }\n if (eventsCount > _bufferSize) {\n spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n }\n if (spliceCount > 0) {\n _events.splice(0, spliceCount);\n }\n return _events;\n }\n}\nclass ReplayEvent {\n constructor(time, value) {\n this.time = time;\n this.value = value;\n }\n}\n//# sourceMappingURL=ReplaySubject.js.map","import { AsyncAction } from './AsyncAction';\nexport class AnimationFrameAction extends AsyncAction {\n constructor(scheduler, work) {\n super(scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n requestAsyncId(scheduler, id, delay = 0) {\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n scheduler.actions.push(this);\n return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(() => scheduler.flush(null)));\n }\n recycleAsyncId(scheduler, id, delay = 0) {\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n if (scheduler.actions.length === 0) {\n cancelAnimationFrame(id);\n scheduler.scheduled = undefined;\n }\n return undefined;\n }\n}\n//# sourceMappingURL=AnimationFrameAction.js.map","import { AsyncScheduler } from './AsyncScheduler';\nexport class AnimationFrameScheduler extends AsyncScheduler {\n flush(action) {\n this.active = true;\n this.scheduled = undefined;\n const { actions } = this;\n let error;\n let index = -1;\n let count = actions.length;\n action = action || actions.shift();\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (++index < count && (action = actions.shift()));\n this.active = false;\n if (error) {\n while (++index < count && (action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n//# sourceMappingURL=AnimationFrameScheduler.js.map","import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\nexport const animationFrame = animationFrameScheduler;\n//# sourceMappingURL=animationFrame.js.map","import { Subscriber } from '../Subscriber';\nexport function takeWhile(predicate, inclusive = false) {\n return (source) => source.lift(new TakeWhileOperator(predicate, inclusive));\n}\nclass TakeWhileOperator {\n constructor(predicate, inclusive) {\n this.predicate = predicate;\n this.inclusive = inclusive;\n }\n call(subscriber, source) {\n return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));\n }\n}\nclass TakeWhileSubscriber extends Subscriber {\n constructor(destination, predicate, inclusive) {\n super(destination);\n this.predicate = predicate;\n this.inclusive = inclusive;\n this.index = 0;\n }\n _next(value) {\n const destination = this.destination;\n let result;\n try {\n result = this.predicate(value, this.index++);\n }\n catch (err) {\n destination.error(err);\n return;\n }\n this.nextOrComplete(value, result);\n }\n nextOrComplete(value, predicateResult) {\n const destination = this.destination;\n if (Boolean(predicateResult)) {\n destination.next(value);\n }\n else {\n if (this.inclusive) {\n destination.next(value);\n }\n destination.complete();\n }\n }\n}\n//# sourceMappingURL=takeWhile.js.map","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { Injectable, EventEmitter, Injector, InjectionToken, Component, Inject, ElementRef, Renderer2, NgZone, Input, Output, HostBinding, ChangeDetectionStrategy, ChangeDetectorRef, ViewChild, Directive, TemplateRef, isDevMode, forwardRef, Optional, ContentChild, ViewContainerRef, HostListener, ViewChildren, ContentChildren, IterableDiffers, NgModule } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgControl } from '@angular/forms';\nimport { LocalizationService, L10N_PREFIX, RTL, ComponentMessages } from '@progress/kendo-angular-l10n';\nimport { getDate, isEqual, cloneDate, addDays, addDecades, addCenturies, firstDecadeOfCentury, lastDecadeOfCentury, firstYearOfDecade, createDate, durationInCenturies, addYears, lastYearOfDecade, durationInDecades, addWeeks, addMonths, firstDayOfMonth, lastDayOfMonth, dayOfWeek, durationInMonths, firstMonthOfYear, lastMonthOfYear, durationInYears, weekInYear } from '@progress/kendo-date-math';\nimport { isDocumentAvailable, KendoInput, guid, hasObservers, Keys, EventsModule, ResizeSensorModule } from '@progress/kendo-angular-common';\nimport { IntlService, IntlModule } from '@progress/kendo-angular-intl';\nimport { ReplaySubject, Observable, Subject, combineLatest, of, interval, animationFrameScheduler, fromEvent, EMPTY, from, Subscription, BehaviorSubject, merge } from 'rxjs';\nimport { map, scan, takeWhile, tap, filter, debounceTime } from 'rxjs/operators';\nimport { PopupService, PopupModule } from '@progress/kendo-angular-popup';\nimport { CommonModule } from '@angular/common';\nimport { touchEnabled } from '@progress/kendo-common';\n\n/**\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-intl';\nimport * as ɵngcc2 from '@angular/common';\nimport * as ɵngcc3 from '@progress/kendo-angular-common';\nimport * as ɵngcc4 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc5 from '@progress/kendo-angular-popup';\n\nconst _c0 = [\"*\"];\nconst _c1 = [\"list\"];\nfunction NavigationComponent_li_4_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const date_r104 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r106 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵtextInterpolate(ctx_r106.service.navigationTitle(date_r104));\n} }\nfunction NavigationComponent_li_4_ng_template_3_Template(rf, ctx) { }\nconst _c2 = function (a0, a1, a2) { return { $implicit: a0, activeView: a1, date: a2 }; };\nfunction NavigationComponent_li_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"li\");\n ɵngcc0.ɵɵelementStart(1, \"span\");\n ɵngcc0.ɵɵtemplate(2, NavigationComponent_li_4_ng_template_2_Template, 1, 1, \"ng-template\", 5);\n ɵngcc0.ɵɵtemplate(3, NavigationComponent_li_4_ng_template_3_Template, 0, 0, \"ng-template\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const date_r104 = ctx.$implicit;\n const index_r105 = ctx.index;\n const ctx_r103 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵattribute(\"data-date-index\", index_r105);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-calendar-navigation-marker\", ctx_r103.service.isRangeStart(date_r104));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r103.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r103.templateRef)(\"ngTemplateOutlet\", ctx_r103.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction3(7, _c2, ctx_r103.service.navigationTitle(date_r104), ctx_r103.activeViewValue, date_r104));\n} }\nconst _c3 = function (a0) { return { click: a0 }; };\nfunction ViewListComponent_table_1_th_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"th\");\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const name_r114 = ctx.$implicit;\n const ctx_r113 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r113.colWidth, \"%\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(name_r114);\n} }\nfunction ViewListComponent_table_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"table\", 6);\n ɵngcc0.ɵɵelementStart(1, \"thead\");\n ɵngcc0.ɵɵelementStart(2, \"tr\");\n ɵngcc0.ɵɵtemplate(3, ViewListComponent_table_1_th_3_Template, 2, 3, \"th\", 7);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r109 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r109.weekNames);\n} }\nfunction ViewListComponent_col_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"col\");\n} }\nfunction ViewListComponent_tbody_7_Template(rf, ctx) { if (rf & 1) {\n const _r118 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"tbody\", 8);\n ɵngcc0.ɵɵlistener(\"change\", function ViewListComponent_tbody_7_Template_tbody_change_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r118); const ctx_r117 = ɵngcc0.ɵɵnextContext(); return ctx_r117.handleDateChange($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const date_r116 = ctx.$implicit;\n const ctx_r112 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"activeView\", ctx_r112.activeView)(\"isActive\", ctx_r112.isActive)(\"min\", ctx_r112.min)(\"max\", ctx_r112.max)(\"cellUID\", ctx_r112.cellUID)(\"focusedDate\", ctx_r112.focusedDate)(\"selectedDate\", ctx_r112.value)(\"weekNumber\", ctx_r112.weekNumber)(\"templateRef\", ctx_r112.cellTemplateRef)(\"weekNumberTemplateRef\", ctx_r112.weekNumberTemplateRef)(\"viewDate\", date_r116);\n} }\nvar I18N_4;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the today button in the calendar header\n * @meaning kendo.calendar.today\n */ \n const MSG_EXTERNAL_826701167553276328$$DIST_FESM2015_INDEX_JS_5 = goog.getMsg(\"TODAY\");\n I18N_4 = MSG_EXTERNAL_826701167553276328$$DIST_FESM2015_INDEX_JS_5;\n}\nelse {\n I18N_4 = $localize `:kendo.calendar.today|The label for the today button in the calendar header␟2df64767cd895a8fabe3e18b94b5b6b6f9e2e3f0␟826701167553276328:TODAY`;\n}\nconst _c6 = [\"today\", I18N_4];\nfunction CalendarComponent_kendo_calendar_navigation_2_Template(rf, ctx) { if (rf & 1) {\n const _r121 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-calendar-navigation\", 4);\n ɵngcc0.ɵɵlistener(\"valueChange\", function CalendarComponent_kendo_calendar_navigation_2_Template_kendo_calendar_navigation_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r121); const ctx_r120 = ɵngcc0.ɵɵnextContext(); return ctx_r120.handleNavigation($event); })(\"pageChange\", function CalendarComponent_kendo_calendar_navigation_2_Template_kendo_calendar_navigation_pageChange_0_listener() { ɵngcc0.ɵɵrestoreView(_r121); const ctx_r122 = ɵngcc0.ɵɵnextContext(); return ctx_r122.onPageChange(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r119 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"activeView\", ctx_r119.activeViewEnum)(\"focusedDate\", ctx_r119.focusedDate)(\"min\", ctx_r119.min)(\"max\", ctx_r119.max)(\"templateRef\", ctx_r119.navigationItemTemplate == null ? null : ctx_r119.navigationItemTemplate.templateRef);\n} }\nconst _c7 = [\"dateInput\"];\nconst _c8 = [\"wrap\"];\nvar I18N_9;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the **Increment** button in the DateInput\n * @meaning kendo.dateinput.increment\n */ \n const MSG_EXTERNAL_589112377451589685$$DIST_FESM2015_INDEX_JS_10 = goog.getMsg(\"Increase value\");\n I18N_9 = MSG_EXTERNAL_589112377451589685$$DIST_FESM2015_INDEX_JS_10;\n}\nelse {\n I18N_9 = $localize `:kendo.dateinput.increment|The label for the **Increment** button in the DateInput␟a55944f9de69e7cc86b91200fe96f980a947d704␟589112377451589685:Increase value`;\n}\nvar I18N_11;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the **Decrement** button in the DateInput\n * @meaning kendo.dateinput.decrement\n */ \n const MSG_EXTERNAL_6980524091606682769$$DIST_FESM2015_INDEX_JS_12 = goog.getMsg(\"Decrease value\");\n I18N_11 = MSG_EXTERNAL_6980524091606682769$$DIST_FESM2015_INDEX_JS_12;\n}\nelse {\n I18N_11 = $localize `:kendo.dateinput.decrement|The label for the **Decrement** button in the DateInput␟0eded761107e6dad120997006a7f915bade9b15c␟6980524091606682769:Decrease value`;\n}\nconst _c13 = [\"increment\", I18N_9, \"decrement\", I18N_11];\nfunction DateInputComponent_span_6_Template(rf, ctx) { if (rf & 1) {\n const _r127 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"span\", 6);\n ɵngcc0.ɵɵlistener(\"mousedown\", function DateInputComponent_span_6_Template_span_mousedown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r127); return $event.preventDefault(); });\n ɵngcc0.ɵɵelementStart(1, \"span\", 7);\n ɵngcc0.ɵɵlistener(\"mousedown\", function DateInputComponent_span_6_Template_span_mousedown_1_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r128 = ɵngcc0.ɵɵnextContext(); return ctx_r128.arrowDirection = ctx_r128.arrow.Up; })(\"mouseleave\", function DateInputComponent_span_6_Template_span_mouseleave_1_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r129 = ɵngcc0.ɵɵnextContext(); return ctx_r129.arrowDirection = ctx_r129.arrow.None; })(\"click\", function DateInputComponent_span_6_Template_span_click_1_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r130 = ɵngcc0.ɵɵnextContext(); return ctx_r130.handleButtonClick(1); });\n ɵngcc0.ɵɵelement(2, \"span\", 8);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(3, \"span\", 9);\n ɵngcc0.ɵɵlistener(\"click\", function DateInputComponent_span_6_Template_span_click_3_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r131 = ɵngcc0.ɵɵnextContext(); return ctx_r131.handleButtonClick(0 - 1); })(\"mousedown\", function DateInputComponent_span_6_Template_span_mousedown_3_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r132 = ɵngcc0.ɵɵnextContext(); return ctx_r132.arrowDirection = ctx_r132.arrow.Down; })(\"mouseleave\", function DateInputComponent_span_6_Template_span_mouseleave_3_listener() { ɵngcc0.ɵɵrestoreView(_r127); const ctx_r133 = ɵngcc0.ɵɵnextContext(); return ctx_r133.arrowDirection = ctx_r133.arrow.None; });\n ɵngcc0.ɵɵelement(4, \"span\", 10);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r125 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx_r125.arrowDirection === ctx_r125.arrow.Up);\n ɵngcc0.ɵɵproperty(\"title\", ctx_r125.localization.get(\"increment\"));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r125.localization.get(\"increment\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx_r125.arrowDirection === ctx_r125.arrow.Down);\n ɵngcc0.ɵɵproperty(\"title\", ctx_r125.localization.get(\"decrement\"));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r125.localization.get(\"decrement\"));\n} }\nconst _c14 = function (a0, a1, a2, a3, a4, a5, a6) { return { click: a0, focus: a1, mousedown: a2, touchstart: a3, dragstart: a4, drop: a5, blur: a6 }; };\nconst _c15 = [\"container\"];\nconst _c16 = [\"popupTemplate\"];\nconst _c17 = [\"wrapper\"];\nvar I18N_18;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the today button in the calendar header\n * @meaning kendo.datepicker.today\n */ \n const MSG_EXTERNAL_1910980355989755624$$DIST_FESM2015_INDEX_JS_19 = goog.getMsg(\"TODAY\");\n I18N_18 = MSG_EXTERNAL_1910980355989755624$$DIST_FESM2015_INDEX_JS_19;\n}\nelse {\n I18N_18 = $localize `:kendo.datepicker.today|The label for the today button in the calendar header␟91a84f2d4871dbe7e90d84865d4a4d83c8ae041e␟1910980355989755624:TODAY`;\n}\nvar I18N_20;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the toggle button in the datepicker component\n * @meaning kendo.datepicker.toggle\n */ \n const MSG_EXTERNAL_4817467473728423164$$DIST_FESM2015_INDEX_JS_21 = goog.getMsg(\"Toggle calendar\");\n I18N_20 = MSG_EXTERNAL_4817467473728423164$$DIST_FESM2015_INDEX_JS_21;\n}\nelse {\n I18N_20 = $localize `:kendo.datepicker.toggle|The label for the toggle button in the datepicker component␟f6c28c2d80dbe993c4b33f4dc4010364f41cc2ae␟4817467473728423164:Toggle calendar`;\n}\nconst _c22 = [\"today\", I18N_18, \"toggle\", I18N_20];\nfunction DatePickerComponent_ng_template_10_ng_template_3_Template(rf, ctx) { }\nconst _c23 = function (a0) { return { keydown: a0 }; };\nfunction DatePickerComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) {\n const _r142 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-calendar\", 9, 10);\n ɵngcc0.ɵɵlistener(\"valueChange\", function DatePickerComponent_ng_template_10_Template_kendo_calendar_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r142); const ctx_r141 = ɵngcc0.ɵɵnextContext(); return ctx_r141.handleChange(ctx_r141.mergeTime($event)); });\n ɵngcc0.ɵɵelement(2, \"kendo-calendar-messages\", 11);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, DatePickerComponent_ng_template_10_ng_template_3_Template, 0, 0, \"ng-template\");\n} if (rf & 2) {\n const ctx_r138 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"min\", ctx_r138.min)(\"max\", ctx_r138.max)(\"navigation\", ctx_r138.navigation)(\"activeView\", ctx_r138.activeView)(\"bottomView\", ctx_r138.bottomView)(\"topView\", ctx_r138.topView)(\"weekNumber\", ctx_r138.weekNumber)(\"cellTemplate\", ctx_r138.cellTemplate)(\"monthCellTemplate\", ctx_r138.monthCellTemplate)(\"yearCellTemplate\", ctx_r138.yearCellTemplate)(\"decadeCellTemplate\", ctx_r138.decadeCellTemplate)(\"centuryCellTemplate\", ctx_r138.centuryCellTemplate)(\"weekNumberTemplate\", ctx_r138.weekNumberTemplate)(\"headerTitleTemplate\", ctx_r138.headerTitleTemplate)(\"navigationItemTemplate\", ctx_r138.navigationItemTemplate)(\"focusedDate\", ctx_r138.focusedDate)(\"value\", ctx_r138.value)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(21, _c23, ctx_r138.handleKeydown))(\"scope\", ctx_r138)(\"disabledDates\", ctx_r138.disabledDates);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"today\", ctx_r138.localization.get(\"today\"));\n} }\nconst _c24 = function (a0, a1) { return { click: a0, mousedown: a1 }; };\nvar I18N_25;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Accept button text in the timepicker component\n * @meaning kendo.timepicker.accept\n */ \n const MSG_EXTERNAL_7519663530416240229$$DIST_FESM2015_INDEX_JS_26 = goog.getMsg(\"Set\");\n I18N_25 = MSG_EXTERNAL_7519663530416240229$$DIST_FESM2015_INDEX_JS_26;\n}\nelse {\n I18N_25 = $localize `:kendo.timepicker.accept|The Accept button text in the timepicker component␟4c3bf42192220c7611c09ece1c5de14855139dd0␟7519663530416240229:Set`;\n}\nvar I18N_27;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Accept button in the timepicker component\n * @meaning kendo.timepicker.acceptLabel\n */ \n const MSG_EXTERNAL_4355879331538595758$$DIST_FESM2015_INDEX_JS_28 = goog.getMsg(\"Set time\");\n I18N_27 = MSG_EXTERNAL_4355879331538595758$$DIST_FESM2015_INDEX_JS_28;\n}\nelse {\n I18N_27 = $localize `:kendo.timepicker.acceptLabel|The label for the Accept button in the timepicker component␟93c2a9c3aa49f56e452c0aecbaabe3bb33fa4222␟4355879331538595758:Set time`;\n}\nvar I18N_29;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Cancel button text in the timepicker component\n * @meaning kendo.timepicker.cancel\n */ \n const MSG_EXTERNAL_1086687567255473060$$DIST_FESM2015_INDEX_JS_30 = goog.getMsg(\"Cancel\");\n I18N_29 = MSG_EXTERNAL_1086687567255473060$$DIST_FESM2015_INDEX_JS_30;\n}\nelse {\n I18N_29 = $localize `:kendo.timepicker.cancel|The Cancel button text in the timepicker component␟132eefca16bd41d489b4647724b91e93793603aa␟1086687567255473060:Cancel`;\n}\nvar I18N_31;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Cancel button in the timepicker component\n * @meaning kendo.timepicker.cancelLabel\n */ \n const MSG_EXTERNAL_83621966901491941$$DIST_FESM2015_INDEX_JS_32 = goog.getMsg(\"Cancel changes\");\n I18N_31 = MSG_EXTERNAL_83621966901491941$$DIST_FESM2015_INDEX_JS_32;\n}\nelse {\n I18N_31 = $localize `:kendo.timepicker.cancelLabel|The label for the Cancel button in the timepicker component␟2cf6f4ca4470810944b4016c9b6f87943d3390ab␟83621966901491941:Cancel changes`;\n}\nvar I18N_33;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Now button text in the timepicker component\n * @meaning kendo.timepicker.now\n */ \n const MSG_EXTERNAL_5912507758515138116$$DIST_FESM2015_INDEX_JS_34 = goog.getMsg(\"Now\");\n I18N_33 = MSG_EXTERNAL_5912507758515138116$$DIST_FESM2015_INDEX_JS_34;\n}\nelse {\n I18N_33 = $localize `:kendo.timepicker.now|The Now button text in the timepicker component␟bbc99bb74ae75a503bd813aad0c7253d3553e923␟5912507758515138116:Now`;\n}\nvar I18N_35;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Now button in the timepicker component\n * @meaning kendo.timepicker.nowLabel\n */ \n const MSG_EXTERNAL_371982627910576599$$DIST_FESM2015_INDEX_JS_36 = goog.getMsg(\"Select now\");\n I18N_35 = MSG_EXTERNAL_371982627910576599$$DIST_FESM2015_INDEX_JS_36;\n}\nelse {\n I18N_35 = $localize `:kendo.timepicker.nowLabel|The label for the Now button in the timepicker component␟df1a696f318275aa934e27850920889d494c2740␟371982627910576599:Select now`;\n}\nvar I18N_37;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the toggle button in the timepicker component\n * @meaning kendo.timepicker.toggle\n */ \n const MSG_EXTERNAL_6938407659294495526$$DIST_FESM2015_INDEX_JS_38 = goog.getMsg(\"Toggle time list\");\n I18N_37 = MSG_EXTERNAL_6938407659294495526$$DIST_FESM2015_INDEX_JS_38;\n}\nelse {\n I18N_37 = $localize `:kendo.timepicker.toggle|The label for the toggle button in the timepicker component␟f2c196786ed2d3ecb2369750c36aac9a4053fb30␟6938407659294495526:Toggle time list`;\n}\nconst _c39 = [\"accept\", I18N_25, \"acceptLabel\", I18N_27, \"cancel\", I18N_29, \"cancelLabel\", I18N_31, \"now\", I18N_33, \"nowLabel\", I18N_35, \"toggle\", I18N_37];\nconst _c40 = function (a0, a1) { return { keydown: a0, mousedown: a1 }; };\nfunction TimePickerComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {\n const _r150 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-timeselector\", 9, 10);\n ɵngcc0.ɵɵlistener(\"valueChange\", function TimePickerComponent_ng_template_8_Template_kendo_timeselector_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r150); const ctx_r149 = ɵngcc0.ɵɵnextContext(); return ctx_r149.handleChange($event); })(\"valueReject\", function TimePickerComponent_ng_template_8_Template_kendo_timeselector_valueReject_0_listener() { ɵngcc0.ɵɵrestoreView(_r150); const ctx_r151 = ɵngcc0.ɵɵnextContext(); return ctx_r151.handleReject(); });\n ɵngcc0.ɵɵelement(2, \"kendo-timeselector-messages\", 11);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r146 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"cancelButton\", ctx_r146.cancelButton)(\"nowButton\", ctx_r146.nowButton)(\"format\", ctx_r146.format)(\"min\", ctx_r146.min)(\"max\", ctx_r146.max)(\"steps\", ctx_r146.steps)(\"value\", ctx_r146.value)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(15, _c40, ctx_r146.handleKeydown, ctx_r146.handleMousedown))(\"scope\", ctx_r146);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"acceptLabel\", ctx_r146.localization.get(\"acceptLabel\"))(\"accept\", ctx_r146.localization.get(\"accept\"))(\"cancelLabel\", ctx_r146.localization.get(\"cancelLabel\"))(\"cancel\", ctx_r146.localization.get(\"cancel\"))(\"nowLabel\", ctx_r146.localization.get(\"nowLabel\"))(\"now\", ctx_r146.localization.get(\"now\"));\n} }\nvar I18N_41;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Date tab text in the datetimepicker popup header\n * @meaning kendo.datetimepicker.dateTab\n */ \n const MSG_EXTERNAL_3360129034450596425$$DIST_FESM2015_INDEX_JS_42 = goog.getMsg(\"Date\");\n I18N_41 = MSG_EXTERNAL_3360129034450596425$$DIST_FESM2015_INDEX_JS_42;\n}\nelse {\n I18N_41 = $localize `:kendo.datetimepicker.dateTab|The Date tab text in the datetimepicker popup header␟5bb17f81ae8dbc109499ce3792afffa6b7cef855␟3360129034450596425:Date`;\n}\nvar I18N_43;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Date tab in the datetimepicker popup header\n * @meaning kendo.datetimepicker.dateTabLabel\n */ \n const MSG_EXTERNAL_1810540079817643910$$DIST_FESM2015_INDEX_JS_44 = goog.getMsg(\"Date tab\");\n I18N_43 = MSG_EXTERNAL_1810540079817643910$$DIST_FESM2015_INDEX_JS_44;\n}\nelse {\n I18N_43 = $localize `:kendo.datetimepicker.dateTabLabel|The label for the Date tab in the datetimepicker popup header␟2a400c9e364a4c6d83ac39b5513c962805db54b2␟1810540079817643910:Date tab`;\n}\nvar I18N_45;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Time tab text in the datetimepicker popup header\n * @meaning kendo.datetimepicker.timeTab\n */ \n const MSG_EXTERNAL_3807284594201983607$$DIST_FESM2015_INDEX_JS_46 = goog.getMsg(\"Time\");\n I18N_45 = MSG_EXTERNAL_3807284594201983607$$DIST_FESM2015_INDEX_JS_46;\n}\nelse {\n I18N_45 = $localize `:kendo.datetimepicker.timeTab|The Time tab text in the datetimepicker popup header␟e9b2b760a6916040e7520a9a2926d65de175944d␟3807284594201983607:Time`;\n}\nvar I18N_47;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Time tab in the datetimepicker popup header\n * @meaning kendo.datetimepicker.timeTabLabel\n */ \n const MSG_EXTERNAL_2577682127494513393$$DIST_FESM2015_INDEX_JS_48 = goog.getMsg(\"Time tab\");\n I18N_47 = MSG_EXTERNAL_2577682127494513393$$DIST_FESM2015_INDEX_JS_48;\n}\nelse {\n I18N_47 = $localize `:kendo.datetimepicker.timeTabLabel|The label for the Time tab in the datetimepicker popup header␟13bf7e3a1036140119732c6d5952f7a20c22999e␟2577682127494513393:Time tab`;\n}\nvar I18N_49;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the toggle button in the datetimepicker component\n * @meaning kendo.datetimepicker.toggle\n */ \n const MSG_EXTERNAL_3159207801887264026$$DIST_FESM2015_INDEX_JS_50 = goog.getMsg(\"Toggle popup\");\n I18N_49 = MSG_EXTERNAL_3159207801887264026$$DIST_FESM2015_INDEX_JS_50;\n}\nelse {\n I18N_49 = $localize `:kendo.datetimepicker.toggle|The label for the toggle button in the datetimepicker component␟60296a83f0d3e3d07aaba87c4f8e91b0aca3c22a␟3159207801887264026:Toggle popup`;\n}\nvar I18N_51;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Accept button text in the datetimepicker component\n * @meaning kendo.datetimepicker.accept\n */ \n const MSG_EXTERNAL_3915774704336012538$$DIST_FESM2015_INDEX_JS_52 = goog.getMsg(\"Set\");\n I18N_51 = MSG_EXTERNAL_3915774704336012538$$DIST_FESM2015_INDEX_JS_52;\n}\nelse {\n I18N_51 = $localize `:kendo.datetimepicker.accept|The Accept button text in the datetimepicker component␟4359b59db7ded88e106ada877e744c71b188f8f9␟3915774704336012538:Set`;\n}\nvar I18N_53;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Accept button in the datetimepicker component\n * @meaning kendo.datetimepicker.acceptLabel\n */ \n const MSG_EXTERNAL_4770689705864890748$$DIST_FESM2015_INDEX_JS_54 = goog.getMsg(\"Set\");\n I18N_53 = MSG_EXTERNAL_4770689705864890748$$DIST_FESM2015_INDEX_JS_54;\n}\nelse {\n I18N_53 = $localize `:kendo.datetimepicker.acceptLabel|The label for the Accept button in the datetimepicker component␟cbea4571cca81ad9767a6b29f0287d1f3f6372dc␟4770689705864890748:Set`;\n}\nvar I18N_55;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Cancel button text in the datetimepicker component\n * @meaning kendo.datetimepicker.cancel\n */ \n const MSG_EXTERNAL_5100781969600382158$$DIST_FESM2015_INDEX_JS_56 = goog.getMsg(\"Cancel\");\n I18N_55 = MSG_EXTERNAL_5100781969600382158$$DIST_FESM2015_INDEX_JS_56;\n}\nelse {\n I18N_55 = $localize `:kendo.datetimepicker.cancel|The Cancel button text in the datetimepicker component␟17ab795d6f7527dd962a309759ca58cb4edd7e52␟5100781969600382158:Cancel`;\n}\nvar I18N_57;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Cancel button in the datetimepicker component\n * @meaning kendo.datetimepicker.cancelLabel\n */ \n const MSG_EXTERNAL_3535986227615756275$$DIST_FESM2015_INDEX_JS_58 = goog.getMsg(\"Cancel\");\n I18N_57 = MSG_EXTERNAL_3535986227615756275$$DIST_FESM2015_INDEX_JS_58;\n}\nelse {\n I18N_57 = $localize `:kendo.datetimepicker.cancelLabel|The label for the Cancel button in the datetimepicker component␟ba26795ab9f4c21d66b17549ba854a96fcdac1f9␟3535986227615756275:Cancel`;\n}\nvar I18N_59;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Now button text in the timepicker component\n * @meaning kendo.datetimepicker.now\n */ \n const MSG_EXTERNAL_5497093725885127701$$DIST_FESM2015_INDEX_JS_60 = goog.getMsg(\"NOW\");\n I18N_59 = MSG_EXTERNAL_5497093725885127701$$DIST_FESM2015_INDEX_JS_60;\n}\nelse {\n I18N_59 = $localize `:kendo.datetimepicker.now|The Now button text in the timepicker component␟7172e7e9a1741f6b63439ec89e498c995cb23b0d␟5497093725885127701:NOW`;\n}\nvar I18N_61;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Now button in the timepicker component\n * @meaning kendo.datetimepicker.nowLabel\n */ \n const MSG_EXTERNAL_5046379108717037514$$DIST_FESM2015_INDEX_JS_62 = goog.getMsg(\"Select now\");\n I18N_61 = MSG_EXTERNAL_5046379108717037514$$DIST_FESM2015_INDEX_JS_62;\n}\nelse {\n I18N_61 = $localize `:kendo.datetimepicker.nowLabel|The label for the Now button in the timepicker component␟52d90641b26b1ce4c011cadf0437ce36c1dac1d5␟5046379108717037514:Select now`;\n}\nvar I18N_63;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the today button in the calendar header\n * @meaning kendo.datetimepicker.today\n */ \n const MSG_EXTERNAL_7904626229769721311$$DIST_FESM2015_INDEX_JS_64 = goog.getMsg(\"TODAY\");\n I18N_63 = MSG_EXTERNAL_7904626229769721311$$DIST_FESM2015_INDEX_JS_64;\n}\nelse {\n I18N_63 = $localize `:kendo.datetimepicker.today|The label for the today button in the calendar header␟7ee30b9ae5918cc544fbd87a4135694397aeefaf␟7904626229769721311:TODAY`;\n}\nconst _c65 = [\"dateTab\", I18N_41, \"dateTabLabel\", I18N_43, \"timeTab\", I18N_45, \"timeTabLabel\", I18N_47, \"toggle\", I18N_49, \"accept\", I18N_51, \"acceptLabel\", I18N_53, \"cancel\", I18N_55, \"cancelLabel\", I18N_57, \"now\", I18N_59, \"nowLabel\", I18N_61, \"today\", I18N_63];\nfunction DateTimePickerComponent_ng_template_10_button_16_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"button\", 25);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r157 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(5, _c3, ctx_r157.handleCancel))(\"scope\", ctx_r157);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r157.localization.get(\"cancelLabel\"))(\"aria-label\", ctx_r157.localization.get(\"cancelLabel\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r157.localization.get(\"cancel\"), \" \");\n} }\nconst _c66 = function (a0, a1) { return { mousedown: a0, keydown: a1 }; };\nconst _c67 = function (a0, a1) { return { focusin: a0, focusout: a1 }; };\nconst _c68 = function (a0, a1) { return { click: a0, keydown: a1 }; };\nconst _c69 = function (a0) { return { transitionend: a0 }; };\nconst _c70 = function (a0, a1, a2) { return { keydown: a0, focusin: a1, focusout: a2 }; };\nfunction DateTimePickerComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) {\n const _r159 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 9);\n ɵngcc0.ɵɵelementStart(1, \"div\", 10);\n ɵngcc0.ɵɵelementStart(2, \"div\", 11);\n ɵngcc0.ɵɵelementStart(3, \"button\", 12);\n ɵngcc0.ɵɵtext(4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(5, \"button\", 13);\n ɵngcc0.ɵɵtext(6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(7, \"div\", 14, 15);\n ɵngcc0.ɵɵelementStart(9, \"div\", 16);\n ɵngcc0.ɵɵelementStart(10, \"kendo-calendar\", 17);\n ɵngcc0.ɵɵlistener(\"valueChange\", function DateTimePickerComponent_ng_template_10_Template_kendo_calendar_valueChange_10_listener($event) { ɵngcc0.ɵɵrestoreView(_r159); const ctx_r158 = ɵngcc0.ɵɵnextContext(); return ctx_r158.calendarValue = $event; })(\"valueChange\", function DateTimePickerComponent_ng_template_10_Template_kendo_calendar_valueChange_10_listener() { ɵngcc0.ɵɵrestoreView(_r159); const ctx_r160 = ɵngcc0.ɵɵnextContext(); return ctx_r160.handleCalendarValueChange(); });\n ɵngcc0.ɵɵelement(11, \"kendo-calendar-messages\", 18);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(12, \"div\", 19);\n ɵngcc0.ɵɵelementStart(13, \"kendo-timeselector\", 20);\n ɵngcc0.ɵɵelement(14, \"kendo-timeselector-messages\", 21);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(15, \"div\", 22);\n ɵngcc0.ɵɵtemplate(16, DateTimePickerComponent_ng_template_10_button_16_Template, 2, 7, \"button\", 23);\n ɵngcc0.ɵɵelementStart(17, \"button\", 24);\n ɵngcc0.ɵɵtext(18);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const _r156 = ɵngcc0.ɵɵreference(8);\n const ctx_r155 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassMapInterpolate1(\"k-datetime-wrap k-\", ctx_r155.activeTab, \"-tab\");\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(58, _c66, ctx_r155.preventMouseDown, ctx_r155.handleKeyDown))(\"scope\", ctx_r155);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(61, _c67, ctx_r155.handleFocus, ctx_r155.handleBlur))(\"scope\", ctx_r155);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx_r155.activeTab === \"date\");\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(64, _c68, ctx_r155.changeActiveTab.bind(ctx_r155, \"date\"), ctx_r155.handleBackTabOut))(\"scope\", ctx_r155);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r155.localization.get(\"dateTabLabel\"))(\"aria-label\", ctx_r155.localization.get(\"dateTabLabel\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r155.localization.get(\"dateTab\"), \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-state-active\", ctx_r155.activeTab === \"time\");\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(67, _c3, ctx_r155.changeActiveTab.bind(ctx_r155, \"time\")));\n ɵngcc0.ɵɵattribute(\"title\", ctx_r155.localization.get(\"timeTabLabel\"))(\"aria-label\", ctx_r155.localization.get(\"timeTabLabel\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r155.localization.get(\"timeTab\"), \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"transition\", ctx_r155.tabSwitchTransition);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(69, _c69, ctx_r155.handleTabChangeTransitionEnd.bind(ctx_r155, _r156)));\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"value\", ctx_r155.calendarValue)(\"min\", ctx_r155.calendarMin)(\"max\", ctx_r155.calendarMax)(\"focusedDate\", ctx_r155.focusedDate)(\"weekNumber\", ctx_r155.weekNumber)(\"navigation\", false)(\"cellTemplate\", ctx_r155.cellTemplate)(\"monthCellTemplate\", ctx_r155.monthCellTemplate)(\"yearCellTemplate\", ctx_r155.yearCellTemplate)(\"decadeCellTemplate\", ctx_r155.decadeCellTemplate)(\"centuryCellTemplate\", ctx_r155.centuryCellTemplate)(\"weekNumberTemplate\", ctx_r155.weekNumberTemplate)(\"headerTitleTemplate\", ctx_r155.headerTitleTemplate)(\"disabled\", ctx_r155.disableCalendar)(\"disabledDates\", ctx_r155.disabledDates);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"today\", ctx_r155.localization.get(\"today\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"value\", ctx_r155.value)(\"format\", ctx_r155.timeSelectorFormat)(\"min\", ctx_r155.timeSelectorMin)(\"max\", ctx_r155.timeSelectorMax)(\"setButton\", false)(\"cancelButton\", false)(\"steps\", ctx_r155.steps)(\"disabled\", ctx_r155.disableTimeSelector);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"now\", ctx_r155.localization.get(\"now\"))(\"nowLabel\", ctx_r155.localization.get(\"nowLabel\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction3(71, _c70, ctx_r155.handleTabOut, ctx_r155.handleFocus, ctx_r155.handleBlur))(\"scope\", ctx_r155);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r155.cancelButton);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"disabled\", !ctx_r155.calendarValue)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(75, _c3, ctx_r155.handleAccept))(\"scope\", ctx_r155);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r155.localization.get(\"acceptLabel\"))(\"aria-label\", ctx_r155.localization.get(\"acceptLabel\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r155.localization.get(\"accept\"), \" \");\n} }\nconst _c71 = function (a0, a1) { return { mousedown: a0, click: a1 }; };\nfunction HorizontalViewListComponent_tbody_2_Template(rf, ctx) { if (rf & 1) {\n const _r164 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"tbody\", 3);\n ɵngcc0.ɵɵlistener(\"change\", function HorizontalViewListComponent_tbody_2_Template_tbody_change_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r164); const ctx_r163 = ɵngcc0.ɵɵnextContext(); return ctx_r163.handleDateChange($event); })(\"cellEnter\", function HorizontalViewListComponent_tbody_2_Template_tbody_cellEnter_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r164); const ctx_r165 = ɵngcc0.ɵɵnextContext(); return ctx_r165.cellEnter.emit($event); })(\"cellLeave\", function HorizontalViewListComponent_tbody_2_Template_tbody_cellLeave_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r164); const ctx_r166 = ɵngcc0.ɵɵnextContext(); return ctx_r166.cellLeave.emit($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const date_r162 = ctx.$implicit;\n const ctx_r161 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"activeView\", ctx_r161.activeView)(\"isActive\", ctx_r161.isActive)(\"min\", ctx_r161.min)(\"max\", ctx_r161.max)(\"cellUID\", ctx_r161.cellUID)(\"focusedDate\", ctx_r161.focusedDate)(\"selectedDate\", ctx_r161.value)(\"selectionRange\", ctx_r161.selectionRange)(\"activeRangeEnd\", ctx_r161.activeRangeEnd)(\"weekNumber\", ctx_r161.weekNumber)(\"templateRef\", ctx_r161.cellTemplateRef)(\"weekNumberTemplateRef\", ctx_r161.weekNumberTemplateRef)(\"viewDate\", date_r162);\n} }\nvar I18N_72;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the today button in the calendar header\n * @meaning kendo.multiviewcalendar.today\n */ \n const MSG_EXTERNAL_3892034896682737327$$DIST_FESM2015_INDEX_JS_73 = goog.getMsg(\"TODAY\");\n I18N_72 = MSG_EXTERNAL_3892034896682737327$$DIST_FESM2015_INDEX_JS_73;\n}\nelse {\n I18N_72 = $localize `:kendo.multiviewcalendar.today|The label for the today button in the calendar header␟063d99483243b27bc8282abfb5f2c76877e1112e␟3892034896682737327:TODAY`;\n}\nvar I18N_74;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the previous button in the Multiview calendar\n * @meaning kendo.multiviewcalendar.prevButtonTitle\n */ \n const MSG_EXTERNAL_9101635325676663492$$DIST_FESM2015_INDEX_JS_75 = goog.getMsg(\"Navigate to previous view\");\n I18N_74 = MSG_EXTERNAL_9101635325676663492$$DIST_FESM2015_INDEX_JS_75;\n}\nelse {\n I18N_74 = $localize `:kendo.multiviewcalendar.prevButtonTitle|The label for the previous button in the Multiview calendar␟e783e2af4828224b846fa92148ea1cc52b21bb13␟9101635325676663492:Navigate to previous view`;\n}\nvar I18N_76;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the next button in the Multiview calendar\n * @meaning kendo.multiviewcalendar.nextButtonTitle\n */ \n const MSG_EXTERNAL_3994336778698343633$$DIST_FESM2015_INDEX_JS_77 = goog.getMsg(\"Navigate to next view\");\n I18N_76 = MSG_EXTERNAL_3994336778698343633$$DIST_FESM2015_INDEX_JS_77;\n}\nelse {\n I18N_76 = $localize `:kendo.multiviewcalendar.nextButtonTitle|The label for the next button in the Multiview calendar␟3e3a529a242f39d22f841c3bd8045ec75b696b7a␟3994336778698343633:Navigate to next view`;\n}\nconst _c78 = [\"today\", I18N_72, \"prevButtonTitle\", I18N_74, \"nextButtonTitle\", I18N_76];\nconst _c79 = [\"defaultTemplate\"];\nfunction DateRangePopupComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-multiviewcalendar\", 2);\n} }\nfunction DateRangeComponent_kendo_daterange_popup_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-daterange-popup\");\n} }\nfunction HeaderComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const ctx_r171 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵtextInterpolate(ctx_r171.title);\n} }\nfunction HeaderComponent_ng_template_2_Template(rf, ctx) { }\nconst _c80 = [\"kendoCalendarView\", \"\"];\nfunction ViewComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 3);\n ɵngcc0.ɵɵtext(1, \"\\u00A0\");\n ɵngcc0.ɵɵelementEnd();\n} }\nfunction ViewComponent_tr_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 4);\n ɵngcc0.ɵɵelementStart(1, \"th\", 5);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r175 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"colSpan\", ctx_r175.colSpan);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r175.title);\n} }\nfunction ViewComponent_tr_3_th_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"th\");\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const name_r179 = ctx.$implicit;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(name_r179);\n} }\nfunction ViewComponent_tr_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 4);\n ɵngcc0.ɵɵtemplate(1, ViewComponent_tr_3_th_1_Template, 2, 1, \"th\", 6);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r176 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r176.weekNames);\n} }\nfunction ViewComponent_tr_4_ng_template_1_td_0_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const row_r180 = ɵngcc0.ɵɵnextContext(3).$implicit;\n const ctx_r185 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r185.getWeekNumber(ctx_r185.firstDate(row_r180)), \" \");\n} }\nfunction ViewComponent_tr_4_ng_template_1_td_0_ng_template_2_Template(rf, ctx) { }\nconst _c81 = function (a0, a1) { return { $implicit: a0, cellContext: a1 }; };\nfunction ViewComponent_tr_4_ng_template_1_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 10);\n ɵngcc0.ɵɵtemplate(1, ViewComponent_tr_4_ng_template_1_td_0_ng_template_1_Template, 1, 1, \"ng-template\", 7);\n ɵngcc0.ɵɵtemplate(2, ViewComponent_tr_4_ng_template_1_td_0_ng_template_2_Template, 0, 0, \"ng-template\", 11);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const row_r180 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r184 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r184.weekNumberTemplateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r184.weekNumberTemplateRef)(\"ngTemplateOutlet\", ctx_r184.weekNumberTemplateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(4, _c81, ctx_r184.firstDate(row_r180), ctx_r184.getWeekNumberContext(row_r180)));\n} }\nfunction ViewComponent_tr_4_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ViewComponent_tr_4_ng_template_1_td_0_Template, 3, 7, \"td\", 9);\n} if (rf & 2) {\n const row_r180 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r182 = ɵngcc0.ɵɵnextContext();\n const _r173 = ɵngcc0.ɵɵreference(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r182.firstDate(row_r180))(\"ngIfElse\", _r173);\n} }\nfunction ViewComponent_tr_4_ng_container_2_td_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const cell_r190 = ɵngcc0.ɵɵnextContext(2).$implicit;\n ɵngcc0.ɵɵtextInterpolate(cell_r190.formattedValue);\n} }\nfunction ViewComponent_tr_4_ng_container_2_td_1_3_ng_template_0_Template(rf, ctx) { }\nfunction ViewComponent_tr_4_ng_container_2_td_1_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ViewComponent_tr_4_ng_container_2_td_1_3_ng_template_0_Template, 0, 0, \"ng-template\", 16);\n} if (rf & 2) {\n const cell_r190 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r194 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r194.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(2, _c81, cell_r190.value, cell_r190));\n} }\nfunction ViewComponent_tr_4_ng_container_2_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 13);\n ɵngcc0.ɵɵelementStart(1, \"span\", 14);\n ɵngcc0.ɵɵtemplate(2, ViewComponent_tr_4_ng_container_2_td_1_ng_template_2_Template, 1, 1, \"ng-template\", 7);\n ɵngcc0.ɵɵtemplate(3, ViewComponent_tr_4_ng_container_2_td_1_3_Template, 1, 5, undefined, 15);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r198 = ɵngcc0.ɵɵnextContext();\n const cell_r190 = ctx_r198.$implicit;\n const cellIndex_r191 = ctx_r198.index;\n const rowIndex_r181 = ɵngcc0.ɵɵnextContext().index;\n const ctx_r192 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r192.getStyles(cell_r190))(\"title\", cell_r190.title);\n ɵngcc0.ɵɵattribute(\"id\", cell_r190.id)(\"data-cell-index\", ctx_r192.tableCellIndex(rowIndex_r181, cellIndex_r191))(\"aria-selected\", cell_r190.isSelected || cell_r190.isRangeStart || cell_r190.isRangeMid || cell_r190.isRangeEnd)(\"aria-disabled\", cell_r190.isDisabled);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r192.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r192.templateRef);\n} }\nfunction ViewComponent_tr_4_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, ViewComponent_tr_4_ng_container_2_td_1_Template, 4, 8, \"td\", 12);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const cell_r190 = ctx.$implicit;\n ɵngcc0.ɵɵnextContext(2);\n const _r173 = ɵngcc0.ɵɵreference(1);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", cell_r190)(\"ngIfElse\", _r173);\n} }\nfunction ViewComponent_tr_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 4);\n ɵngcc0.ɵɵtemplate(1, ViewComponent_tr_4_ng_template_1_Template, 1, 2, \"ng-template\", 7);\n ɵngcc0.ɵɵtemplate(2, ViewComponent_tr_4_ng_container_2_Template, 2, 2, \"ng-container\", 8);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const row_r180 = ctx.$implicit;\n const ctx_r177 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r177.weekNumber);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kForOf\", row_r180);\n} }\nfunction TimeListComponent_li_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"li\", 3);\n ɵngcc0.ɵɵelementStart(1, \"span\");\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const item_r201 = ctx.$implicit;\n const index_r202 = ctx.index;\n ɵngcc0.ɵɵattribute(\"data-timelist-item-index\", index_r202);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(item_r201.text);\n} }\nconst _c82 = [\"accept\"];\nconst _c83 = [\"cancel\"];\nconst _c84 = [\"now\"];\nconst _c85 = [\"listWrapper\"];\nvar I18N_86;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Accept button text in the timeselector component\n * @meaning kendo.timeselector.accept\n */ \n const MSG_EXTERNAL_5362895271044573681$$DIST_FESM2015_INDEX_JS_87 = goog.getMsg(\"Set\");\n I18N_86 = MSG_EXTERNAL_5362895271044573681$$DIST_FESM2015_INDEX_JS_87;\n}\nelse {\n I18N_86 = $localize `:kendo.timeselector.accept|The Accept button text in the timeselector component␟801811aa1609e3f173c86baa82cee037f75a215f␟5362895271044573681:Set`;\n}\nvar I18N_88;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Accept button in the timeselector component\n * @meaning kendo.timeselector.acceptLabel\n */ \n const MSG_EXTERNAL_3417396278000787211$$DIST_FESM2015_INDEX_JS_89 = goog.getMsg(\"Set time\");\n I18N_88 = MSG_EXTERNAL_3417396278000787211$$DIST_FESM2015_INDEX_JS_89;\n}\nelse {\n I18N_88 = $localize `:kendo.timeselector.acceptLabel|The label for the Accept button in the timeselector component␟b4b1e5ac55f0330f6c4e32b866ae4339ad969978␟3417396278000787211:Set time`;\n}\nvar I18N_90;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Cancel button text in the timeselector component\n * @meaning kendo.timeselector.cancel\n */ \n const MSG_EXTERNAL_1890188482755567622$$DIST_FESM2015_INDEX_JS_91 = goog.getMsg(\"Cancel\");\n I18N_90 = MSG_EXTERNAL_1890188482755567622$$DIST_FESM2015_INDEX_JS_91;\n}\nelse {\n I18N_90 = $localize `:kendo.timeselector.cancel|The Cancel button text in the timeselector component␟3004d7704ffa6202a3b3925fcea490e486203a3e␟1890188482755567622:Cancel`;\n}\nvar I18N_92;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Cancel button in the timeselector component\n * @meaning kendo.timeselector.cancelLabel\n */ \n const MSG_EXTERNAL_5738120209397145846$$DIST_FESM2015_INDEX_JS_93 = goog.getMsg(\"Cancel changes\");\n I18N_92 = MSG_EXTERNAL_5738120209397145846$$DIST_FESM2015_INDEX_JS_93;\n}\nelse {\n I18N_92 = $localize `:kendo.timeselector.cancelLabel|The label for the Cancel button in the timeselector component␟08dfbdfffd662371a6ff4c0b6ed82b9faa48143b␟5738120209397145846:Cancel changes`;\n}\nvar I18N_94;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The Now button text in the timeselector component\n * @meaning kendo.timeselector.now\n */ \n const MSG_EXTERNAL_1926162752852226109$$DIST_FESM2015_INDEX_JS_95 = goog.getMsg(\"Now\");\n I18N_94 = MSG_EXTERNAL_1926162752852226109$$DIST_FESM2015_INDEX_JS_95;\n}\nelse {\n I18N_94 = $localize `:kendo.timeselector.now|The Now button text in the timeselector component␟98cba1ae36a7bbe15e1bac1837e07922ec109e7d␟1926162752852226109:Now`;\n}\nvar I18N_96;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the Now button in the timeselector component\n * @meaning kendo.timeselector.nowLabel\n */ \n const MSG_EXTERNAL_7789175884909488647$$DIST_FESM2015_INDEX_JS_97 = goog.getMsg(\"Select now\");\n I18N_96 = MSG_EXTERNAL_7789175884909488647$$DIST_FESM2015_INDEX_JS_97;\n}\nelse {\n I18N_96 = $localize `:kendo.timeselector.nowLabel|The label for the Now button in the timeselector component␟08e6a8a51d970609e138950fdd89c5cf201869f3␟7789175884909488647:Select now`;\n}\nconst _c98 = [\"accept\", I18N_86, \"acceptLabel\", I18N_88, \"cancel\", I18N_90, \"cancelLabel\", I18N_92, \"now\", I18N_94, \"nowLabel\", I18N_96];\nconst _c99 = function (a0, a1, a2) { return { click: a0, focus: a1, blur: a2 }; };\nfunction TimeSelectorComponent_button_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"button\", 8, 9);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r203 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction3(6, _c99, ctx_r203.handleNow, ctx_r203.handleFocus, ctx_r203.handleBlur))(\"scope\", ctx_r203)(\"disabled\", ctx_r203.disabled);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r203.localization.get(\"nowLabel\"))(\"aria-label\", ctx_r203.localization.get(\"nowLabel\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r203.localization.get(\"now\"));\n} }\nconst _c100 = function (a0, a1) { return { focus: a0, blur: a1 }; };\nfunction TimeSelectorComponent_ng_template_8_div_0_Template(rf, ctx) { if (rf & 1) {\n const _r213 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 12, 13);\n ɵngcc0.ɵɵelementStart(2, \"span\", 2);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(4, \"kendo-timelist\", 14);\n ɵngcc0.ɵɵlistener(\"valueChange\", function TimeSelectorComponent_ng_template_8_div_0_Template_kendo_timelist_valueChange_4_listener($event) { ɵngcc0.ɵɵrestoreView(_r213); const ctx_r212 = ɵngcc0.ɵɵnextContext(2); return ctx_r212.current = $event; });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r214 = ɵngcc0.ɵɵnextContext();\n const part_r207 = ctx_r214.$implicit;\n const idx_r208 = ctx_r214.index;\n const ctx_r209 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵtextInterpolate(ctx_r209.intl.dateFieldName(part_r207));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"min\", ctx_r209.min)(\"max\", ctx_r209.max)(\"part\", part_r207)(\"step\", ctx_r209.partStep(part_r207))(\"disabled\", ctx_r209.disabled)(\"value\", ctx_r209.current)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(10, _c100, ctx_r209.handleListFocus, ctx_r209.handleBlur))(\"scope\", ctx_r209);\n ɵngcc0.ɵɵattribute(\"data-timelist-index\", idx_r208);\n} }\nfunction TimeSelectorComponent_ng_template_8_div_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 15);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const part_r207 = ɵngcc0.ɵɵnextContext().$implicit;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", part_r207.pattern, \" \");\n} }\nfunction TimeSelectorComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TimeSelectorComponent_ng_template_8_div_0_Template, 5, 13, \"div\", 10);\n ɵngcc0.ɵɵtemplate(1, TimeSelectorComponent_ng_template_8_div_1_Template, 2, 1, \"div\", 11);\n} if (rf & 2) {\n const part_r207 = ctx.$implicit;\n ɵngcc0.ɵɵproperty(\"ngIf\", part_r207.type !== \"literal\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", part_r207.type === \"literal\");\n} }\nfunction TimeSelectorComponent_div_9_button_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"button\", 19, 20);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r216 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction3(6, _c99, ctx_r216.handleReject, ctx_r216.handleFocus, ctx_r216.handleBlur))(\"scope\", ctx_r216)(\"disabled\", ctx_r216.disabled);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r216.localization.get(\"cancelLabel\"))(\"aria-label\", ctx_r216.localization.get(\"cancelLabel\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r216.localization.get(\"cancel\"));\n} }\nfunction TimeSelectorComponent_div_9_button_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"button\", 21, 22);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r217 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction3(6, _c99, ctx_r217.handleAccept, ctx_r217.handleFocus, ctx_r217.handleBlur))(\"scope\", ctx_r217)(\"disabled\", ctx_r217.disabled);\n ɵngcc0.ɵɵattribute(\"title\", ctx_r217.localization.get(\"acceptLabel\"))(\"aria-label\", ctx_r217.localization.get(\"acceptLabel\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r217.localization.get(\"accept\"));\n} }\nfunction TimeSelectorComponent_div_9_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 16);\n ɵngcc0.ɵɵtemplate(1, TimeSelectorComponent_div_9_button_1_Template, 3, 10, \"button\", 17);\n ɵngcc0.ɵɵtemplate(2, TimeSelectorComponent_div_9_button_2_Template, 3, 10, \"button\", 18);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r205 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r205.cancelButton);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r205.setButton);\n} }\nvar Action;\n(function (Action) {\n Action[Action[\"Left\"] = 0] = \"Left\";\n Action[Action[\"Right\"] = 1] = \"Right\";\n Action[Action[\"Up\"] = 2] = \"Up\";\n Action[Action[\"Down\"] = 3] = \"Down\";\n Action[Action[\"PrevView\"] = 4] = \"PrevView\";\n Action[Action[\"NextView\"] = 5] = \"NextView\";\n Action[Action[\"FirstInView\"] = 6] = \"FirstInView\";\n Action[Action[\"LastInView\"] = 7] = \"LastInView\";\n Action[Action[\"LowerView\"] = 8] = \"LowerView\";\n Action[Action[\"UpperView\"] = 9] = \"UpperView\";\n})(Action || (Action = {}));\n\n/**\n * @hidden\n */\nconst EMPTY_SELECTIONRANGE = { start: null, end: null };\n\n/**\n * @hidden\n */\nconst MIDNIGHT_DATE = new Date(1980, 0, 1);\n/**\n * @hidden\n */\nconst MIN_DATE = new Date(1900, 0, 1);\n/**\n * @hidden\n */\nconst MAX_DATE = new Date(2099, 11, 31);\n/**\n * @hidden\n */\nconst MIN_TIME = new Date(1980, 0, 1);\n/**\n * @hidden\n */\nconst MAX_TIME = new Date(1980, 0, 1, 23, 59, 59);\n\n/* tslint:disable:no-bitwise max-line-length */\nconst isSet = (value) => value !== null && value !== undefined;\nconst setter = (method) => (date, value) => {\n const clone = cloneDate(date);\n clone[method](value);\n return clone;\n};\n/**\n * @hidden\n */\nconst setTime = (origin, candidate) => {\n const date = cloneDate(origin);\n date.setHours(candidate.getHours(), candidate.getMinutes(), candidate.getSeconds(), candidate.getMilliseconds());\n return date;\n};\nconst normalizeTimes = (candidate, min, max) => ({\n candidateValue: setTime(MIDNIGHT_DATE, candidate),\n maxValue: addDays(setTime(MIDNIGHT_DATE, max), min.getHours() < max.getHours() ||\n (min.getHours() === max.getHours() && min.getMinutes() < max.getMinutes()) ? 0 : 1),\n minValue: setTime(MIDNIGHT_DATE, min)\n});\n/**\n * @hidden\n */\nconst setHours = setter('setHours');\n/**\n * @hidden\n */\nconst setMinutes = setter('setMinutes');\n/**\n * @hidden\n */\nconst setSeconds = setter('setSeconds');\n/**\n * @hidden\n */\nconst range = (start, end, step = 1) => {\n const result = [];\n for (let i = start; i < end; i = i + step) {\n result.push(i);\n }\n return result;\n};\n/**\n * @hidden\n */\nconst isInRange = (candidate, min, max) => (!candidate || !((min && min > candidate) || (max && max < candidate)));\n/**\n * @hidden\n */\nconst isInTimeRange = (candidate, min, max) => {\n if (!candidate || !min || !max) {\n return true;\n }\n const { candidateValue, minValue, maxValue } = normalizeTimes(candidate, min, max);\n return minValue <= candidateValue && candidateValue <= maxValue;\n};\n/**\n * @hidden\n */\nconst isValidRange = (min, max) => (!isSet(min) || !isSet(max) || min <= max);\n/**\n * @hidden\n */\nconst dateInRange = (candidate, min, max) => {\n if (!candidate) {\n return candidate;\n }\n if (min && candidate < min) {\n return cloneDate(min);\n }\n if (max && candidate > max) {\n return cloneDate(max);\n }\n return candidate;\n};\n/**\n * @hidden\n */\nconst timeInRange = (candidate, min, max) => {\n if (!candidate || !min || !max) {\n return candidate;\n }\n const { candidateValue, minValue, maxValue } = normalizeTimes(candidate, min, max);\n if (candidateValue < minValue) {\n return setTime(candidate, min);\n }\n if (candidateValue > maxValue) {\n return setTime(candidate, max);\n }\n return candidate;\n};\n/**\n * @hidden\n */\nconst getNow = () => new Date();\n/**\n * @hidden\n */\nconst getToday = () => getDate(new Date());\n/**\n * @hidden\n */\nconst noop = (_) => { }; // tslint:disable-line:no-empty\n/**\n * @hidden\n */\nconst isWindowAvailable = () => {\n return typeof window !== 'undefined';\n};\n/**\n * @hidden\n */\nconst stringifyClassObject = (classes) => {\n const pushToAcc = (acc, cls) => classes[cls] ? acc.concat(cls) : acc;\n return Object.keys(classes).reduce(pushToAcc, []).join(' ');\n};\n/**\n * @hidden\n */\nconst shiftWeekNames = (names, offset) => (names.slice(offset).concat(names.slice(0, offset)));\n/**\n * @hidden\n */\nconst approximateStringMatching = (oldTextOrigin, oldFormat, newTextOrigin, caret) => {\n // Remove the right part of the cursor.\n //oldFormat = oldFormat.substring(0, caret + oldText.length - newText.length);\n const oldIndex = caret + oldTextOrigin.length - newTextOrigin.length;\n const oldTextSeparator = oldTextOrigin[oldIndex];\n const oldText = oldTextOrigin.substring(0, caret + oldTextOrigin.length - newTextOrigin.length);\n const newText = newTextOrigin.substring(0, caret);\n const diff = [];\n // Handle typing a single character over the same selection.\n if (oldText === newText && caret > 0) {\n diff.push([oldFormat[caret - 1], newText[caret - 1]]);\n return diff;\n }\n if (oldText.indexOf(newText) === 0 && (newText.length === 0 || oldFormat[newText.length - 1] !== oldFormat[newText.length])) {\n // Handle Delete/Backspace.\n let deletedSymbol = \"\";\n //XXX:\n // Whole text is replaced with a same char\n // Nasty patch required to keep the selection in the first segment\n if (newText.length === 1) {\n diff.push([oldFormat[0], newText[0]]);\n }\n for (let i = newText.length; i < oldText.length; i++) {\n if (oldFormat[i] !== deletedSymbol && oldFormat[i] !== \"_\") {\n deletedSymbol = oldFormat[i];\n diff.push([deletedSymbol, \"\"]);\n }\n }\n return diff;\n }\n // Handle inserting text (the new text is longer than the previous one).\n // Handle typing over a literal as well.\n if (newText.indexOf(oldText) === 0 || oldFormat[caret - 1] === \"_\") {\n let symbol = oldFormat[0];\n for (let i = Math.max(0, oldText.length - 1); i < oldFormat.length; i++) {\n if (oldFormat[i] !== \"_\") {\n symbol = oldFormat[i];\n break;\n }\n }\n return [[symbol, newText[caret - 1]]];\n }\n // Handle entering a space or a separator, for navigation to the next item.\n if (newText[newText.length - 1] === \" \" || (newText[newText.length - 1] === oldTextSeparator && oldFormat[oldIndex] === '_')) {\n return [[oldFormat[caret - 1], \"_\"]];\n }\n // Handle typing over a correctly selected part.\n return [[oldFormat[caret - 1], newText[caret - 1]]];\n};\n/**\n * @hidden\n */\nconst domContainerFactory = (type) => (children, classes = \"\", styles = {}) => {\n const container = document.createElement(type);\n container.className = classes;\n Object.keys(styles).map(key => container.style[key] = styles[key]);\n if (typeof children === 'string') {\n container.innerHTML = children || '';\n }\n else {\n (children || []).forEach(child => child && container.appendChild(child));\n }\n return container;\n};\n/**\n * @hidden\n */\nconst hasChange = (changes, field) => changes[field] !== undefined;\n/**\n * @hidden\n */\nconst hasExistingValue = (changes, field) => changes[field] && changes[field].currentValue !== undefined && changes[field].currentValue !== null;\n/**\n * @hidden\n */\nconst isInSelectionRange = (value, selectionRange) => {\n const { start, end } = selectionRange || EMPTY_SELECTIONRANGE;\n if (!start || !end) {\n return false;\n }\n return start < value && value < end;\n};\n/**\n * @hidden\n */\nconst either = (value1, value2) => value1 || value2;\n/**\n * @hidden\n */\nconst clampRange = (value) => ({ start: value, end: value });\n/**\n * @hidden\n */\nconst isEqualRange = (initial, updated) => {\n const { start: initialStart, end: initialEnd } = initial || EMPTY_SELECTIONRANGE;\n const { start: updatedStart, end: updatedEnd } = updated || EMPTY_SELECTIONRANGE;\n return isEqual(initialStart, updatedStart) && isEqual(initialEnd, updatedEnd);\n};\n/**\n * @hidden\n *\n * Creates a new date based on the date information from the specified date portion\n * and the time information from the time portion.\n * If a parameter is not provided, returns `null`.\n */\nconst mergeDateAndTime = (date, time) => {\n if (!(date && time)) {\n return null;\n }\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n};\n/**\n * @hidden\n */\nconst lastMillisecondOfDate = (date) => {\n if (!date) {\n return null;\n }\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n};\n/**\n * @hidden\n *\n * Returns an array with dates ranging between and including the specified start and\n * end dates that are evaluated as disabled.\n */\nconst disabledDatesInRange = (start, end, isDateDisabled) => {\n if (!(start && end && isDateDisabled) || (start > end)) {\n return [];\n }\n const dates = [];\n let current = start;\n while (current <= end) {\n if (isDateDisabled(current)) {\n dates.push(current);\n }\n current = addDays(current, 1);\n }\n return dates;\n};\n\n/* tslint:disable:object-literal-sort-keys */\nconst EMPTY_DATA = [[]];\nconst CELLS_LENGTH = 5;\nconst ROWS_LENGTH = 2;\nconst ACTIONS = {\n [Action.Left]: (date) => addDecades(date, -1),\n [Action.Up]: (date) => addDecades(date, -5),\n [Action.Right]: (date) => addDecades(date, 1),\n [Action.Down]: (date) => addDecades(date, 5),\n [Action.PrevView]: (date) => addCenturies(date, -1),\n [Action.NextView]: (date) => addCenturies(date, 1),\n [Action.FirstInView]: (date) => firstDecadeOfCentury(date),\n [Action.LastInView]: (date) => lastDecadeOfCentury(date)\n};\n/**\n * @hidden\n */\nclass CenturyViewService {\n addToDate(min, skip) {\n return addCenturies(min, skip);\n }\n datesList(start, count) {\n return range(0, count).map(i => addCenturies(start, i));\n }\n data(options) {\n const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options;\n if (!viewDate) {\n return EMPTY_DATA;\n }\n const cells = range(0, CELLS_LENGTH);\n const firstDate = firstDecadeOfCentury(viewDate);\n const lastDate = lastDecadeOfCentury(viewDate);\n const isSelectedDateInRange = isInRange(selectedDate, min, max);\n const today = getToday();\n return range(0, ROWS_LENGTH).map(rowOffset => {\n const baseDate = addDecades(firstDate, rowOffset * CELLS_LENGTH);\n return cells.map(cellOffset => {\n const cellDate = this.normalize(addDecades(baseDate, cellOffset), min, max);\n if (!this.isInRange(cellDate, min, max)) {\n return null;\n }\n const isRangeStart = this.isEqual(cellDate, selectionRange.start);\n const isRangeEnd = this.isEqual(cellDate, selectionRange.end);\n const isInMiddle = !isRangeStart && !isRangeEnd;\n const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange);\n return {\n formattedValue: this.value(cellDate),\n id: `${cellUID}${cellDate.getTime()}`,\n isFocused: this.isEqual(cellDate, focusedDate),\n isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate),\n isWeekend: false,\n isRangeStart: isRangeStart,\n isRangeMid: isRangeMid,\n isRangeEnd: isRangeEnd,\n isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate),\n isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate),\n isToday: this.isEqual(cellDate, today),\n title: this.cellTitle(cellDate),\n value: cellDate\n };\n });\n });\n }\n isEqual(candidate, expected) {\n if (!candidate || !expected) {\n return false;\n }\n return firstYearOfDecade(candidate).getFullYear() === firstYearOfDecade(expected).getFullYear();\n }\n isInArray(date, dates) {\n if (!dates.length) {\n return false;\n }\n const year = date.getFullYear();\n return dates[0].getFullYear() <= year && year <= (dates[dates.length - 1].getFullYear() + 99);\n }\n isInRange(candidate, min, max) {\n const year = firstYearOfDecade(candidate).getFullYear();\n const aboveMin = !min || firstYearOfDecade(min).getFullYear() <= year;\n const belowMax = !max || year <= firstYearOfDecade(max).getFullYear();\n return aboveMin && belowMax;\n }\n beginningOfPeriod(date) {\n if (!date) {\n return date;\n }\n const firstYear = firstYearOfDecade(firstDecadeOfCentury(date));\n return createDate(firstYear.getFullYear(), 0, 1);\n }\n isRangeStart(value) {\n return value.getFullYear() % 1000 === 0;\n }\n move(value, action) {\n const modifier = ACTIONS[action];\n if (!modifier) {\n return value;\n }\n return modifier(value);\n }\n cellTitle(value) {\n return firstYearOfDecade(value).getFullYear().toString();\n }\n navigationTitle(value) {\n return value ? firstDecadeOfCentury(value).getFullYear().toString() : '';\n }\n title(value) {\n if (!value) {\n return '';\n }\n return `${firstDecadeOfCentury(value).getFullYear()} - ${lastDecadeOfCentury(value).getFullYear()}`;\n }\n rowLength(_) {\n return CELLS_LENGTH;\n }\n skip(value, min) {\n return durationInCenturies(min, value);\n }\n total(min, max) {\n return durationInCenturies(min, max) + 1;\n }\n value(current) {\n return current ? firstYearOfDecade(current).getFullYear().toString() : '';\n }\n viewDate(date, max, viewsCount = 1) {\n const viewsInRange = this.total(date, max);\n if (viewsInRange < viewsCount) {\n const centuriesToSubtract = viewsCount - viewsInRange;\n return addCenturies(date, -1 * centuriesToSubtract);\n }\n return date;\n }\n normalize(cellDate, min, max) {\n if (cellDate < min && this.isEqual(cellDate, min)) {\n return cloneDate(min);\n }\n if (cellDate > max && this.isEqual(cellDate, max)) {\n return cloneDate(max);\n }\n return cellDate;\n }\n}\nCenturyViewService.ɵfac = function CenturyViewService_Factory(t) { return new (t || CenturyViewService)(); };\nCenturyViewService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: CenturyViewService, factory: CenturyViewService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CenturyViewService, [{\n type: Injectable\n }], null, null); })();\n\n/* tslint:disable:object-literal-sort-keys */\nconst EMPTY_DATA$1 = [[]];\nconst CELLS_LENGTH$1 = 5;\nconst ROWS_LENGTH$1 = 2;\nconst ACTIONS$1 = {\n [Action.Left]: (date) => addYears(date, -1),\n [Action.Up]: (date) => addYears(date, -5),\n [Action.Right]: (date) => addYears(date, 1),\n [Action.Down]: (date) => addYears(date, 5),\n [Action.PrevView]: (date) => addDecades(date, -1),\n [Action.NextView]: (date) => addDecades(date, 1),\n [Action.FirstInView]: (date) => firstYearOfDecade(date),\n [Action.LastInView]: (date) => lastYearOfDecade(date)\n};\n/**\n * @hidden\n */\nclass DecadeViewService {\n addToDate(min, skip) {\n return addDecades(min, skip);\n }\n datesList(start, count) {\n return range(0, count).map(i => addDecades(start, i));\n }\n data(options) {\n const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options;\n if (!viewDate) {\n return EMPTY_DATA$1;\n }\n const cells = range(0, CELLS_LENGTH$1);\n const firstDate = firstYearOfDecade(viewDate);\n const lastDate = lastYearOfDecade(viewDate);\n const isSelectedDateInRange = isInRange(selectedDate, min, max);\n const today = getToday();\n return range(0, ROWS_LENGTH$1).map(rowOffset => {\n const baseDate = addYears(firstDate, rowOffset * CELLS_LENGTH$1);\n return cells.map(cellOffset => {\n const cellDate = this.normalize(addYears(baseDate, cellOffset), min, max);\n if (!this.isInRange(cellDate, min, max)) {\n return null;\n }\n const isRangeStart = this.isEqual(cellDate, selectionRange.start);\n const isRangeEnd = this.isEqual(cellDate, selectionRange.end);\n const isInMiddle = !isRangeStart && !isRangeEnd;\n const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange);\n return {\n formattedValue: this.value(cellDate),\n id: `${cellUID}${cellDate.getTime()}`,\n isFocused: this.isEqual(cellDate, focusedDate),\n isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate),\n isWeekend: false,\n isRangeStart: isRangeStart,\n isRangeMid: isRangeMid,\n isRangeEnd: isRangeEnd,\n isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate),\n isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate),\n isToday: this.isEqual(cellDate, today),\n title: this.cellTitle(cellDate),\n value: cellDate\n };\n });\n });\n }\n isEqual(candidate, expected) {\n if (!candidate || !expected) {\n return false;\n }\n return candidate.getFullYear() === expected.getFullYear();\n }\n isInArray(date, dates) {\n if (!dates.length) {\n return false;\n }\n const year = date.getFullYear();\n return dates[0].getFullYear() <= year && year <= (dates[dates.length - 1].getFullYear() + 9);\n }\n isInRange(candidate, min, max) {\n const year = candidate.getFullYear();\n const aboveMin = !min || min.getFullYear() <= year;\n const belowMax = !max || year <= max.getFullYear();\n return aboveMin && belowMax;\n }\n beginningOfPeriod(date) {\n if (!date) {\n return date;\n }\n const firstYear = firstYearOfDecade(date);\n return createDate(firstYear.getFullYear(), 0, 1);\n }\n isRangeStart(value) {\n return value.getFullYear() % 100 === 0;\n }\n move(value, action) {\n const modifier = ACTIONS$1[action];\n if (!modifier) {\n return value;\n }\n return modifier(value);\n }\n cellTitle(value) {\n return value.getFullYear().toString();\n }\n navigationTitle(value) {\n return value ? firstYearOfDecade(value).getFullYear().toString() : '';\n }\n title(value) {\n if (!value) {\n return '';\n }\n return `${firstYearOfDecade(value).getFullYear()} - ${lastYearOfDecade(value).getFullYear()}`;\n }\n rowLength(_) {\n return CELLS_LENGTH$1;\n }\n skip(value, min) {\n return durationInDecades(min, value);\n }\n total(min, max) {\n return durationInDecades(min, max) + 1;\n }\n value(current) {\n return current ? current.getFullYear().toString() : '';\n }\n viewDate(date, max, viewsCount = 1) {\n const viewsInRange = this.total(date, max);\n if (viewsInRange < viewsCount) {\n const decadesToSubtract = viewsCount - viewsInRange;\n return addDecades(date, -1 * decadesToSubtract);\n }\n return date;\n }\n normalize(cellDate, min, max) {\n if (cellDate < min && this.isEqual(cellDate, min)) {\n return cloneDate(min);\n }\n if (cellDate > max && this.isEqual(cellDate, max)) {\n return cloneDate(max);\n }\n return cellDate;\n }\n}\nDecadeViewService.ɵfac = function DecadeViewService_Factory(t) { return new (t || DecadeViewService)(); };\nDecadeViewService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DecadeViewService, factory: DecadeViewService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DecadeViewService, [{\n type: Injectable\n }], null, null); })();\n\n/* tslint:disable:object-literal-sort-keys */\nconst EMPTY_DATA$2 = [[]];\nconst CELLS_LENGTH$2 = 7;\nconst ROWS_LENGTH$2 = 6;\nconst ACTIONS$2 = {\n [Action.Left]: (date) => addDays(date, -1),\n [Action.Up]: (date) => addWeeks(date, -1),\n [Action.Right]: (date) => addDays(date, 1),\n [Action.Down]: (date) => addWeeks(date, 1),\n [Action.PrevView]: (date) => addMonths(date, -1),\n [Action.NextView]: (date) => addMonths(date, 1),\n [Action.FirstInView]: (date) => firstDayOfMonth(date),\n [Action.LastInView]: (date) => lastDayOfMonth(date)\n};\n/**\n * @hidden\n */\nclass MonthViewService {\n constructor(_intlService) {\n this._intlService = _intlService;\n }\n addToDate(min, skip) {\n return addMonths(min, skip);\n }\n datesList(start, count) {\n return range(0, count).map(i => addMonths(start, i));\n }\n data(options) {\n const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate, isDateDisabled = () => false } = options;\n if (!viewDate) {\n return EMPTY_DATA$2;\n }\n const firstMonthDate = firstDayOfMonth(viewDate);\n const firstMonthDay = getDate(firstMonthDate);\n const lastMonthDate = lastDayOfMonth(viewDate);\n const lastMonthDay = getDate(lastMonthDate);\n const backward = -1;\n const isSelectedDateInRange = isInRange(selectedDate, min, max);\n const date = dayOfWeek(firstMonthDate, this._intlService.firstDay(), backward);\n const cells = range(0, CELLS_LENGTH$2);\n const today = getToday();\n return range(0, ROWS_LENGTH$2).map(rowOffset => {\n const baseDate = addDays(date, rowOffset * CELLS_LENGTH$2);\n return cells.map(cellOffset => {\n const cellDate = this.normalize(addDays(baseDate, cellOffset), min, max);\n const cellDay = getDate(cellDate);\n const otherMonth = cellDay < firstMonthDay || cellDay > lastMonthDay;\n const outOfRange = cellDate < min || cellDate > max;\n if (otherMonth || outOfRange) {\n return null;\n }\n const isRangeStart = this.isEqual(cellDate, selectionRange.start);\n const isRangeEnd = this.isEqual(cellDate, selectionRange.end);\n const isInMiddle = !isRangeStart && !isRangeEnd;\n const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange);\n return {\n formattedValue: this.value(cellDate),\n id: `${cellUID}${cellDate.getTime()}`,\n isFocused: this.isEqual(cellDate, focusedDate),\n isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate),\n isWeekend: this.isWeekend(cellDate),\n isRangeStart: isRangeStart,\n isRangeMid: isRangeMid,\n isRangeEnd: isRangeEnd,\n isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstMonthDate),\n isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastMonthDate),\n isToday: this.isEqual(cellDate, today),\n title: this.cellTitle(cellDate),\n value: cellDate,\n isDisabled: isDateDisabled(cellDate)\n };\n });\n });\n }\n isEqual(candidate, expected) {\n if (!candidate || !expected) {\n return false;\n }\n return getDate(candidate).getTime() === getDate(expected).getTime();\n }\n isInArray(date, dates) {\n if (dates.length === 0) {\n return false;\n }\n const lowerBound = this.beginningOfPeriod(dates[0]);\n const upperBound = this.beginningOfPeriod(addMonths(dates[dates.length - 1], 1));\n return lowerBound <= date && date < upperBound;\n }\n isInRange(candidate, min, max) {\n const value = getDate(candidate);\n const aboveMin = !min || getDate(min) <= value;\n const belowMax = !max || value <= getDate(max);\n return aboveMin && belowMax;\n }\n beginningOfPeriod(date) {\n if (!date) {\n return date;\n }\n return createDate(date.getFullYear(), date.getMonth(), 1);\n }\n isRangeStart(value) {\n return !value.getMonth();\n }\n move(value, action) {\n const modifier = ACTIONS$2[action];\n if (!modifier) {\n return value;\n }\n return modifier(value);\n }\n cellTitle(value) {\n return this._intlService.formatDate(value, 'D');\n }\n navigationTitle(value) {\n if (!value) {\n return '';\n }\n return this.isRangeStart(value) ? value.getFullYear().toString() : this.abbrMonthNames()[value.getMonth()];\n }\n title(current) {\n return `${this.wideMonthNames()[current.getMonth()]} ${current.getFullYear()}`;\n }\n rowLength(prependCell) {\n return CELLS_LENGTH$2 + (prependCell ? 1 : 0);\n }\n skip(value, min) {\n return durationInMonths(min, value);\n }\n total(min, max) {\n return durationInMonths(min, max) + 1;\n }\n value(current) {\n return current ? current.getDate().toString() : \"\";\n }\n viewDate(date, max, viewsCount = 1) {\n const viewsInRange = this.total(date, max);\n if (viewsInRange < viewsCount) {\n const monthsToSubtract = viewsCount - viewsInRange;\n return addMonths(date, -1 * monthsToSubtract);\n }\n return date;\n }\n isWeekend(date) {\n const { start, end } = this._intlService.weekendRange();\n const day = date.getDay();\n if (end < start) {\n return day <= end || start <= day;\n }\n return start <= day && day <= end;\n }\n abbrMonthNames() {\n return this._intlService.dateFormatNames({ nameType: 'abbreviated', type: 'months' });\n }\n normalize(cellDate, min, max) {\n if (cellDate < min && this.isEqual(cellDate, min)) {\n return cloneDate(min);\n }\n if (cellDate > max && this.isEqual(cellDate, max)) {\n return cloneDate(max);\n }\n return cellDate;\n }\n wideMonthNames() {\n return this._intlService.dateFormatNames({ nameType: 'wide', type: 'months' });\n }\n}\nMonthViewService.ɵfac = function MonthViewService_Factory(t) { return new (t || MonthViewService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nMonthViewService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: MonthViewService, factory: MonthViewService.ɵfac });\n/** @nocollapse */\nMonthViewService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MonthViewService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\n/* tslint:disable:object-literal-sort-keys */\nconst EMPTY_DATA$3 = [[]];\nconst CELLS_LENGTH$3 = 5;\nconst ROWS_LENGTH$3 = 3;\nconst upStep = (month) => {\n if (month > 4) {\n return -5;\n }\n if (month < 2) {\n return -2;\n }\n return -7;\n};\nconst downStep = (month) => {\n if (month < 7) {\n return 5;\n }\n if (month < 10) {\n return 7;\n }\n return 2;\n};\nconst ACTIONS$3 = {\n [Action.Left]: (date) => addMonths(date, -1),\n [Action.Up]: (date) => addMonths(date, upStep(date.getMonth())),\n [Action.Right]: (date) => addMonths(date, 1),\n [Action.Down]: (date) => addMonths(date, downStep(date.getMonth())),\n [Action.PrevView]: (date) => addYears(date, -1),\n [Action.NextView]: (date) => addYears(date, 1),\n [Action.FirstInView]: (date) => firstMonthOfYear(date),\n [Action.LastInView]: (date) => lastMonthOfYear(date)\n};\n/**\n * @hidden\n */\nclass YearViewService {\n constructor(_intlService) {\n this._intlService = _intlService;\n }\n addToDate(min, skip) {\n return addYears(min, skip);\n }\n datesList(start, count) {\n return range(0, count).map(i => addYears(start, i));\n }\n data(options) {\n const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options;\n if (!viewDate) {\n return EMPTY_DATA$3;\n }\n const months = this.abbrMonthNames();\n const isSelectedDateInRange = isInRange(selectedDate, min, max);\n const firstDate = firstMonthOfYear(viewDate);\n const lastDate = lastMonthOfYear(viewDate);\n const currentYear = firstDate.getFullYear();\n const cells = range(0, CELLS_LENGTH$3);\n const today = getToday();\n return range(0, ROWS_LENGTH$3).map(rowOffset => {\n const baseDate = addMonths(firstDate, rowOffset * CELLS_LENGTH$3);\n return cells.map(cellOffset => {\n const cellDate = this.normalize(addMonths(baseDate, cellOffset), min, max);\n const changedYear = currentYear < cellDate.getFullYear();\n if (!this.isInRange(cellDate, min, max) || changedYear) {\n return null;\n }\n const isRangeStart = this.isEqual(cellDate, selectionRange.start);\n const isRangeEnd = this.isEqual(cellDate, selectionRange.end);\n const isInMiddle = !isRangeStart && !isRangeEnd;\n const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange);\n return {\n formattedValue: months[cellDate.getMonth()],\n id: `${cellUID}${cellDate.getTime()}`,\n isFocused: this.isEqual(cellDate, focusedDate),\n isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate),\n isWeekend: false,\n isRangeStart: isRangeStart,\n isRangeMid: isRangeMid,\n isRangeEnd: isRangeEnd,\n isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate),\n isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate),\n isToday: this.isEqual(cellDate, today),\n title: this.cellTitle(cellDate),\n value: cellDate\n };\n });\n });\n }\n isEqual(candidate, expected) {\n if (!candidate || !expected) {\n return false;\n }\n return candidate.getFullYear() === expected.getFullYear() &&\n candidate.getMonth() === expected.getMonth();\n }\n isInArray(date, dates) {\n if (!dates.length) {\n return false;\n }\n const year = date.getFullYear();\n return dates[0].getFullYear() <= year && year <= dates[dates.length - 1].getFullYear();\n }\n isInRange(candidate, min, max) {\n const candidateValue = createDate(candidate.getFullYear(), candidate.getMonth(), 1);\n const aboveMin = !min || createDate(min.getFullYear(), min.getMonth(), 1) <= candidateValue;\n const belowMax = !max || candidateValue <= createDate(max.getFullYear(), max.getMonth(), 1);\n return aboveMin && belowMax;\n }\n beginningOfPeriod(date) {\n if (!date) {\n return date;\n }\n return createDate(date.getFullYear(), 0, 1);\n }\n isRangeStart(value) {\n return value.getFullYear() % 10 === 0;\n }\n move(value, action) {\n const modifier = ACTIONS$3[action];\n if (!modifier) {\n return value;\n }\n return modifier(value);\n }\n cellTitle(value) {\n return `${value.getFullYear()} ${this.value(value)}`;\n }\n navigationTitle(value) {\n return this.title(value);\n }\n title(current) {\n return current ? current.getFullYear().toString() : '';\n }\n rowLength(_) {\n return CELLS_LENGTH$3;\n }\n skip(value, min) {\n return durationInYears(min, value);\n }\n total(min, max) {\n return durationInYears(min, max) + 1;\n }\n value(current) {\n return current ? this.abbrMonthNames()[current.getMonth()] : '';\n }\n viewDate(date, max, viewsCount = 1) {\n const viewsInRange = this.total(date, max);\n if (viewsInRange < viewsCount) {\n const yearsToSubtract = viewsCount - viewsInRange;\n return addYears(date, -1 * yearsToSubtract);\n }\n return date;\n }\n abbrMonthNames() {\n return this._intlService.dateFormatNames({ nameType: 'abbreviated', type: 'months' });\n }\n normalize(cellDate, min, max) {\n if (cellDate < min && this.isEqual(cellDate, min)) {\n return cloneDate(min);\n }\n if (cellDate > max && this.isEqual(cellDate, max)) {\n return cloneDate(max);\n }\n return cellDate;\n }\n}\nYearViewService.ɵfac = function YearViewService_Factory(t) { return new (t || YearViewService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nYearViewService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: YearViewService, factory: YearViewService.ɵfac });\n/** @nocollapse */\nYearViewService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(YearViewService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\n/**\n * @hidden\n *\n * The Enum which defines all possible Calendar view types.\n */\nvar CalendarViewEnum;\n(function (CalendarViewEnum) {\n CalendarViewEnum[CalendarViewEnum[\"month\"] = 0] = \"month\";\n CalendarViewEnum[CalendarViewEnum[\"year\"] = 1] = \"year\";\n CalendarViewEnum[CalendarViewEnum[\"decade\"] = 2] = \"decade\";\n CalendarViewEnum[CalendarViewEnum[\"century\"] = 3] = \"century\";\n})(CalendarViewEnum || (CalendarViewEnum = {}));\n\nconst services = {\n [CalendarViewEnum.month]: MonthViewService,\n [CalendarViewEnum.year]: YearViewService,\n [CalendarViewEnum.decade]: DecadeViewService,\n [CalendarViewEnum.century]: CenturyViewService\n};\nconst viewOffset = (view, offset) => {\n const candidate = CalendarViewEnum[CalendarViewEnum[view + offset]];\n return candidate !== undefined ? candidate : view;\n};\n/**\n * @hidden\n */\nclass BusViewService {\n constructor(injector) {\n this.injector = injector;\n this.viewChanged = new EventEmitter();\n this.bottom = CalendarViewEnum.month;\n this.top = CalendarViewEnum.century;\n }\n configure(bottom, top) {\n this.bottom = bottom;\n this.top = top;\n }\n service(view) {\n const serviceType = services[view];\n return serviceType ? this.injector.get(serviceType) : null;\n }\n moveDown(view) {\n this.move(view, -1);\n }\n moveUp(view) {\n this.move(view, 1);\n }\n moveToBottom(activeView) {\n if (activeView === this.bottom) {\n return;\n }\n this.viewChanged.emit({ view: this.bottom });\n }\n canMoveDown(view) {\n return this.bottom < view;\n }\n canMoveUp(view) {\n return view < this.top;\n }\n clamp(view) {\n if (view < this.bottom) {\n return this.bottom;\n }\n if (view > this.top) {\n return this.top;\n }\n return view;\n }\n move(view, offset) {\n const candidate = this.clamp(viewOffset(view, offset));\n if (candidate === view) {\n return;\n }\n this.viewChanged.emit({ view: candidate });\n }\n}\nBusViewService.ɵfac = function BusViewService_Factory(t) { return new (t || BusViewService)(ɵngcc0.ɵɵinject(ɵngcc0.Injector)); };\nBusViewService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: BusViewService, factory: BusViewService.ɵfac });\n/** @nocollapse */\nBusViewService.ctorParameters = () => [\n { type: Injector }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BusViewService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.Injector }]; }, null); })();\n\n/**\n * @hidden\n */\nconst requiresZoneOnBlur = (ngControl) => ngControl &&\n (!ngControl.touched || (ngControl.control && ngControl.control.updateOn === 'blur'));\n/**\n * @hidden\n */\nconst preventDefault = (args) => args.preventDefault();\n/**\n * @hidden\n */\nconst currentFocusTarget = (blurArgs) => blurArgs.relatedTarget || document.activeElement;\n/**\n * @hidden\n */\nconst isPresent = (value) => value !== undefined && value !== null;\n/**\n * @hidden\n *\n * If the provided parameter is an array with at least one item\n * and all items in the array are numbers, returns `true.\n */\nconst isNumberArray = (value) => Array.isArray(value) && value.length > 0 && value.every(item => typeof item === 'number');\n/**\n * @hidden\n *\n * If the provided parameter is an array with at least one item\n * and all items in the array are dates, returns `true`.\n */\nconst isDateArray = (value) => Array.isArray(value) && value.length > 0 && value.every(item => item instanceof Date);\n\nconst div = domContainerFactory('div');\nconst ul = domContainerFactory('ul');\nconst li = domContainerFactory('li');\nconst td = domContainerFactory('td');\nconst th = domContainerFactory('th');\nconst tr = domContainerFactory('tr');\nconst tbody = domContainerFactory('tbody');\nconst thead = domContainerFactory('thead');\nconst table = domContainerFactory('table');\nconst monthHeader = () => (div(`\n March 2017\n TODAY\n `, 'k-calendar-header'));\nconst monthWeekHeader = () => (table([\n thead([\n tr([th('MO')])\n ])\n], 'k-calendar-weekdays'));\nconst repeat = (count, mapper) => new Array(count).fill('1').map(mapper);\nconst content = (rows, cells = 1) => (table([\n tbody([tr([th('1')])].concat(repeat(rows, () => tr(repeat(cells, c => td(`${c}`))))))\n]));\nconst scrollable = (children) => div(children, 'k-content k-scrollable');\nconst view = (contentElement, className, renderWeekHeader) => (div([\n monthHeader(),\n renderWeekHeader ? monthWeekHeader() : null,\n scrollable([contentElement, contentElement])\n], className, { left: '-10000px', position: 'absolute' }));\nconst ɵ6 = () => {\n let navElement;\n return () => {\n if (!isDocumentAvailable) {\n return null;\n }\n if (!navElement) {\n navElement = div([scrollable([ul([li('FEB')])])], 'k-calendar-navigation', { left: '0px', position: 'absolute' });\n }\n return navElement;\n };\n};\nconst navigationList = (ɵ6)();\nconst viewFactory = ({ cells, rows }, className, renderWeekHeader) => {\n let viewElement;\n return () => {\n if (!isDocumentAvailable) {\n return null;\n }\n if (!viewElement) {\n viewElement = view(content(rows, cells), className, renderWeekHeader);\n }\n return viewElement;\n };\n};\nconst getScrollable = (element) => element.querySelector('.k-scrollable');\nconst horizontal = element => {\n const scrollableElement = getScrollable(element);\n scrollableElement.classList.add('k-scrollable-horizontal');\n return element;\n};\nconst monthView = viewFactory({ cells: 7, rows: 6 }, 'k-calendar-view k-calendar-monthview', true);\nconst yearView = viewFactory({ cells: 5, rows: 3 }, 'k-calendar-view k-calendar-yearview', false);\nconst decadeView = viewFactory({ cells: 5, rows: 2 }, 'k-calendar-view k-calendar-decadeview', false);\nconst horzMonthView = () => horizontal(monthView());\nconst horzYearView = () => horizontal(yearView());\nconst horzDecadeView = () => horizontal(decadeView());\nconst height = (element) => (parseFloat(window.getComputedStyle(element).height) || element.offsetHeight);\nconst width = (element) => {\n const styles = window.getComputedStyle(element);\n const computed = parseFloat(styles.width)\n + parseFloat(styles.paddingLeft)\n + parseFloat(styles.paddingRight);\n return computed || element.offsetWidth;\n};\nconst getBody = (element) => element.querySelector('tbody');\n/**\n * @hidden\n */\nclass CalendarDOMService {\n ensureHeights() {\n if (this.calendarHeight !== undefined) {\n return;\n }\n this.calculateHeights();\n }\n calculateHeights(container) {\n if (!isDocumentAvailable()) {\n return;\n }\n this.hostContainer = container;\n this.batch(monthView(), (contentElement) => {\n const viewElement = getBody(contentElement);\n this.calendarHeight = height(contentElement);\n this.monthViewHeight = height(viewElement);\n this.headerHeight = height(viewElement.children[0]);\n this.scrollableContentHeight = height(getScrollable(contentElement));\n });\n this.batch(horzMonthView(), (contentElement) => {\n const viewElement = getBody(contentElement);\n this.calendarWidth = width(contentElement);\n this.monthViewWidth = width(viewElement);\n this.scrollableContentWidth = width(getScrollable(contentElement));\n });\n this.batch(yearView(), (contentElement) => {\n this.yearViewHeight = height(getBody(contentElement));\n this.scrollableYearContentHeight = height(getScrollable(contentElement));\n });\n this.batch(horzYearView(), (contentElement) => {\n this.yearViewWidth = width(getBody(contentElement));\n });\n this.batch(decadeView(), (contentElement) => {\n this.decadeViewHeight = height(getBody(contentElement));\n this.centuryViewHeight = this.decadeViewHeight;\n });\n this.batch(horzDecadeView(), (contentElement) => {\n this.decadeViewWidth = width(getBody(contentElement));\n this.centuryViewWidth = this.decadeViewWidth;\n });\n this.batch(navigationList(), (contentElement) => {\n this.navigationItemHeight = height(contentElement.querySelector('li'));\n });\n }\n viewHeight(viewType) {\n return this.viewDimension(viewType, 'height');\n }\n viewWidth(viewType) {\n return this.viewDimension(viewType, 'width');\n }\n viewDimension(viewType, dimension) {\n const viewProp = dimension === 'height' ? 'ViewHeight' : 'ViewWidth';\n switch (viewType) {\n case CalendarViewEnum.month:\n return this[`month${viewProp}`];\n case CalendarViewEnum.year:\n return this[`year${viewProp}`];\n case CalendarViewEnum.decade:\n return this[`decade${viewProp}`];\n case CalendarViewEnum.century:\n return this[`century${viewProp}`];\n default:\n return 1;\n }\n }\n batch(contentElement, action) {\n if (!isPresent(this.hostContainer)) {\n return;\n }\n const hostClone = this.hostContainer.cloneNode();\n document.body.appendChild(hostClone);\n try {\n const appendedContent = hostClone.appendChild(contentElement);\n action(appendedContent);\n }\n catch (error) {\n throw error;\n }\n finally {\n document.body.removeChild(hostClone);\n }\n }\n}\nCalendarDOMService.ɵfac = function CalendarDOMService_Factory(t) { return new (t || CalendarDOMService)(); };\nCalendarDOMService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: CalendarDOMService, factory: CalendarDOMService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarDOMService, [{\n type: Injectable\n }], null, null); })();\n\n/**\n * @hidden\n */\nconst update = (arr, idx, value) => ([\n ...arr.slice(0, idx + 1),\n ...(arr.slice(idx + 1).map(x => x + value))\n]);\n/**\n * @hidden\n */\nclass RowHeightService {\n constructor(total = 0, rowHeight, detailRowHeight) {\n this.total = total;\n this.rowHeight = rowHeight;\n this.detailRowHeight = detailRowHeight;\n this.offsets = [];\n this.heights = [];\n let agg = 0;\n for (let idx = 0; idx < total; idx++) {\n this.offsets.push(agg);\n agg += rowHeight;\n this.heights.push(rowHeight);\n }\n }\n height(rowIndex) {\n return this.heights[rowIndex];\n }\n expandDetail(rowIndex) {\n if (this.height(rowIndex) === this.rowHeight) {\n this.updateRowHeight(rowIndex, this.detailRowHeight);\n }\n }\n collapseDetail(rowIndex) {\n if (this.height(rowIndex) > this.rowHeight) {\n this.updateRowHeight(rowIndex, this.detailRowHeight * -1);\n }\n }\n index(position) {\n if (position < 0) {\n return undefined;\n }\n const result = this.offsets.reduce((prev, current, idx) => {\n if (prev !== undefined) {\n return prev;\n }\n else if (current === position) {\n return idx;\n }\n else if (current > position) {\n return idx - 1;\n }\n return undefined;\n }, undefined); // tslint:disable-line:align\n return result === undefined ? this.total - 1 : result;\n }\n offset(rowIndex) {\n return this.offsets[rowIndex];\n }\n totalHeight() {\n return this.heights.reduce((prev, curr) => prev + curr, 0);\n }\n updateRowHeight(rowIndex, value) {\n this.heights[rowIndex] += value;\n this.offsets = update(this.offsets, rowIndex, value);\n }\n}\n\nconst normalize = x => Math.max(x, 0);\n/**\n * @hidden\n */\nclass ScrollAction {\n constructor(offset) {\n this.offset = offset;\n }\n}\n/**\n * @hidden\n */\nclass PageAction {\n constructor(skip) {\n this.skip = skip;\n }\n}\n/**\n * @hidden\n */\nclass ScrollerService {\n constructor(scrollObservable) {\n this.scrollObservable = scrollObservable;\n this.firstLoaded = 0;\n this.bottomOffset = 0;\n this.topOffset = 0;\n }\n create(rowHeightService, skip, take, total, topOffset = 0, bottomOffset = 0, direction = 'vertical') {\n this.rowHeightService = rowHeightService;\n this.firstLoaded = skip;\n this.lastLoaded = skip + take;\n this.take = take;\n this.total = total;\n this.lastScroll = 0;\n this.topOffset = topOffset;\n this.bottomOffset = bottomOffset;\n this.direction = direction;\n const subject = new ReplaySubject(2);\n const offsetBufferRows = this.rowsForHeight(topOffset);\n const skipWithOffset = normalize(skip - offsetBufferRows);\n subject.next(new ScrollAction(this.rowOffset(skipWithOffset)));\n if (offsetBufferRows) {\n subject.next(new PageAction(skipWithOffset));\n }\n this.subscription = Observable.create(observer => {\n this.unsubscribe();\n this.scrollSubscription = this.scrollObservable.subscribe(x => this.onScroll(x, observer));\n }).subscribe(x => subject.next(x));\n return subject;\n }\n destroy() {\n this.unsubscribe();\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n onScroll({ scrollLeft, scrollTop, offsetHeight, offsetWidth }, observer) {\n const scrollPosition = this.direction === 'vertical' ? scrollTop : scrollLeft;\n const offsetSize = this.direction === 'vertical' ? offsetHeight : offsetWidth;\n if (this.lastScroll === scrollPosition) {\n return;\n }\n const up = this.lastScroll >= scrollPosition;\n this.lastScroll = scrollPosition;\n const firstItemIndex = this.rowHeightService.index(normalize(scrollPosition - this.topOffset));\n const lastItemIndex = this.rowHeightService.index(normalize(scrollPosition + offsetSize - this.bottomOffset));\n if (!up && lastItemIndex >= this.lastLoaded && this.lastLoaded < this.total) {\n this.firstLoaded = firstItemIndex;\n observer.next(new ScrollAction(this.rowOffset(firstItemIndex)));\n this.lastLoaded = Math.min(this.firstLoaded + this.take, this.total);\n observer.next(new PageAction(this.firstLoaded));\n }\n if (up && firstItemIndex <= this.firstLoaded) {\n const nonVisibleBuffer = Math.floor(this.take * 0.3);\n this.firstLoaded = normalize(firstItemIndex - nonVisibleBuffer);\n observer.next(new ScrollAction(this.rowOffset(this.firstLoaded)));\n this.lastLoaded = Math.min(this.firstLoaded + this.take, this.total);\n observer.next(new PageAction(this.firstLoaded));\n }\n }\n rowOffset(index) {\n return this.rowHeightService.offset(index) + this.topOffset;\n }\n rowsForHeight(height) {\n return Math.ceil(height / this.rowHeightService.height(0));\n }\n unsubscribe() {\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n this.scrollSubscription = null;\n }\n }\n}\n\n/* tslint:disable:component-selector-name component-selector-type */\n/**\n * @hidden\n */\nconst SCROLLER_FACTORY_TOKEN = new InjectionToken('dateinputs-scroll-service-factory');\n/**\n * @hidden\n */\nfunction DEFAULT_SCROLLER_FACTORY(observable) {\n return new ScrollerService(observable);\n}\n/**\n * @hidden\n */\nvar ScrollDirection;\n(function (ScrollDirection) {\n ScrollDirection[ScrollDirection[\"Backward\"] = 0] = \"Backward\";\n ScrollDirection[ScrollDirection[\"Forward\"] = 1] = \"Forward\";\n})(ScrollDirection || (ScrollDirection = {}));\nconst FRAME_DURATION = 17;\nconst scrollModifiers = {\n [ScrollDirection.Forward]: (step) => value => value + step,\n [ScrollDirection.Backward]: (step) => value => value - step\n};\nconst scrollNormalizers = {\n [ScrollDirection.Forward]: (end) => value => Math.min(value, end),\n [ScrollDirection.Backward]: (end) => value => Math.max(value, end)\n};\nconst scrollValidators = {\n [ScrollDirection.Forward]: end => start => start < end,\n [ScrollDirection.Backward]: end => start => start > end\n};\nconst differenceToScroll = (scrollTop, staticOffset, maxScrollDifference) => {\n return Math.min(Math.abs(staticOffset - scrollTop), maxScrollDifference);\n};\n/**\n * @hidden\n */\nclass VirtualizationComponent {\n constructor(scrollerFactory, container, renderer, zone) {\n this.container = container;\n this.renderer = renderer;\n this.zone = zone;\n this.direction = 'vertical';\n this.itemHeight = 1;\n this.itemWidth = 1;\n this.topOffset = 0;\n this.bottomOffset = 0;\n this.maxScrollDifference = 100;\n this.scrollOffsetSize = 0;\n this.scrollDuration = 150;\n this.activeIndexChange = new EventEmitter();\n this.pageChange = new EventEmitter();\n this.scrollChange = new EventEmitter();\n this.resolvedPromise = Promise.resolve(null);\n this.dispatcher = new Subject();\n this.scroller = scrollerFactory(this.dispatcher);\n }\n get totalVertexLength() {\n const value = `${this.totalSize}px`;\n return this.direction === 'vertical' ? { height: value } : { width: value };\n }\n get containerOffsetSize() {\n return this.getContainerProperty(this.direction === 'vertical' ? 'offsetHeight' : 'offsetWidth');\n }\n get containerScrollSize() {\n return this.getContainerProperty(this.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth');\n }\n get containerScrollPosition() {\n return this.getContainerProperty(this.direction === 'vertical' ? 'scrollTop' : 'scrollLeft');\n }\n get wrapperClasses() {\n return true;\n }\n get horizontalClass() {\n return this.direction === 'horizontal';\n }\n ngOnChanges(changes) {\n if (changes.direction || changes.take || changes.total) {\n this.initServices();\n this.totalSize = this.rowHeightService.totalHeight() + this.bottomOffset;\n }\n }\n ngOnInit() {\n if (!this.rowHeightService) {\n this.rowHeightService = this.createRowHeightService();\n }\n }\n ngAfterViewInit() {\n this.zone.runOutsideAngular(() => {\n this.containerScrollSubscription = this.scroll$()\n .pipe(map((event) => event.target))\n .subscribe(t => {\n this.dispatcher.next(t);\n this.emitActiveIndex();\n });\n });\n }\n ngOnDestroy() {\n if (this.containerScrollSubscription) {\n this.containerScrollSubscription.unsubscribe();\n }\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n }\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n }\n }\n getContainerProperty(propertyName) {\n return this.container.nativeElement[propertyName];\n }\n activeIndex() {\n return this.itemIndex(Math.ceil(this.containerScrollPosition)); //handle subpixeling\n }\n itemIndex(offset) {\n return this.rowHeightService.index(offset);\n }\n itemOffset(index) {\n return this.rowHeightService.offset(index);\n }\n isIndexVisible(index) {\n if (!this.rowHeightService) {\n return false;\n }\n const containerTop = this.containerScrollPosition;\n const containerBottom = containerTop + this.containerOffsetSize;\n const top = this.rowHeightService.offset(index);\n const bottom = top + this.rowHeightService.height(index);\n return top >= containerTop && bottom <= containerBottom;\n }\n isListScrolled(index) {\n return this.containerScrollPosition !== this.rowHeightService.offset(index);\n }\n scrollTo(value) {\n const scrollProperty = this.direction === \"vertical\" ? 'scrollTop' : 'scrollLeft';\n this.renderer.setProperty(this.container.nativeElement, scrollProperty, value);\n }\n scrollToIndex(index) {\n //XXX: scrolling with tick is required to prevent list jump in Chrome.\n //Original issue: focus first day in the month and press LEFT arrow.\n //Notice how the view jumps on every day change.\n //\n this.zone.runOutsideAngular(() => {\n this.resolvedPromise.then(() => {\n this.scrollTo(this.rowHeightService.offset(index));\n });\n });\n }\n scrollToBottom() {\n this.scrollTo(this.totalSize);\n }\n animateToIndex(index) {\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n }\n const indexOffset = this.rowHeightService.offset(index);\n const direction = this.getContainerScrollDirection(indexOffset);\n const { start, end } = this.scrollRange(indexOffset, direction);\n if (start === end) {\n return;\n }\n const step = this.scrollStep(start, end);\n const modifyScroll = scrollModifiers[direction](step);\n const normalizeScroll = scrollNormalizers[direction](end);\n const isScrollValid = scrollValidators[direction](modifyScroll(end));\n this.zone.runOutsideAngular(() => {\n this.animationSubscription =\n combineLatest(of(start), interval(0, animationFrameScheduler)).pipe(map(stream => stream[0]), scan(modifyScroll), takeWhile(isScrollValid), map(normalizeScroll)).subscribe((x) => this.scrollTo(x));\n });\n }\n scrollRange(indexOffset, direction) {\n const containerScroll = this.containerScrollPosition;\n if (parseInt(indexOffset, 10) === parseInt(containerScroll, 10)) {\n return { start: indexOffset, end: indexOffset };\n }\n const maxScroll = this.containerMaxScroll();\n const sign = direction === ScrollDirection.Backward ? 1 : -1;\n const difference = differenceToScroll(containerScroll, indexOffset, this.maxScrollDifference);\n const end = Math.min(indexOffset, maxScroll);\n const start = Math.min(Math.max(end + (sign * difference), 0), maxScroll);\n return { start, end };\n }\n scrollStep(start, end) {\n return Math.abs(end - start) / (this.scrollDuration / FRAME_DURATION);\n }\n scroll$() {\n return isDocumentAvailable() ? fromEvent(this.container.nativeElement, 'scroll') : EMPTY;\n }\n initServices() {\n this.rowHeightService = this.createRowHeightService();\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n }\n this.scrollSubscription = this.scroller\n .create(this.rowHeightService, this.skip, this.take, this.total, this.topOffset, this.scrollOffsetSize, this.direction)\n .subscribe((x) => {\n if (x instanceof PageAction) {\n this.pageChange.emit(x);\n }\n else {\n this.scrollChange.emit(x);\n }\n });\n }\n createRowHeightService() {\n const dimension = this.direction === 'vertical' ? this.itemHeight : this.itemWidth;\n return new RowHeightService(this.total, dimension, 0);\n }\n emitActiveIndex() {\n const index = this.rowHeightService.index(this.containerScrollPosition - this.topOffset);\n if (this.lastActiveIndex !== index) {\n this.lastActiveIndex = index;\n this.activeIndexChange.emit(index);\n }\n }\n containerMaxScroll() {\n return this.containerScrollSize - this.containerOffsetSize;\n }\n getContainerScrollDirection(indexOffset) {\n return indexOffset < this.containerScrollPosition ? ScrollDirection.Backward : ScrollDirection.Forward;\n }\n}\nVirtualizationComponent.ɵfac = function VirtualizationComponent_Factory(t) { return new (t || VirtualizationComponent)(ɵngcc0.ɵɵdirectiveInject(SCROLLER_FACTORY_TOKEN), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nVirtualizationComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: VirtualizationComponent, selectors: [[\"kendo-virtualization\"]], hostVars: 6, hostBindings: function VirtualizationComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-content\", ctx.wrapperClasses)(\"k-scrollable\", ctx.wrapperClasses)(\"k-scrollable-horizontal\", ctx.horizontalClass);\n } }, inputs: { direction: \"direction\", itemHeight: \"itemHeight\", itemWidth: \"itemWidth\", topOffset: \"topOffset\", bottomOffset: \"bottomOffset\", maxScrollDifference: \"maxScrollDifference\", scrollOffsetSize: \"scrollOffsetSize\", scrollDuration: \"scrollDuration\", skip: \"skip\", take: \"take\", total: \"total\" }, outputs: { activeIndexChange: \"activeIndexChange\", pageChange: \"pageChange\", scrollChange: \"scrollChange\" }, features: [ɵngcc0.ɵɵProvidersFeature([{\n provide: SCROLLER_FACTORY_TOKEN,\n useValue: DEFAULT_SCROLLER_FACTORY\n }]), ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 2, vars: 3, consts: [[1, \"k-scrollable-placeholder\", 3, \"ngStyle\"]], template: function VirtualizationComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n ɵngcc0.ɵɵelement(1, \"div\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-scrollable-horizontal-placeholder\", ctx.direction === \"horizontal\");\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx.totalVertexLength);\n } }, directives: [ɵngcc2.NgStyle], encapsulation: 2 });\n/** @nocollapse */\nVirtualizationComponent.ctorParameters = () => [\n { type: undefined, decorators: [{ type: Inject, args: [SCROLLER_FACTORY_TOKEN,] }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nVirtualizationComponent.propDecorators = {\n direction: [{ type: Input }],\n itemHeight: [{ type: Input }],\n itemWidth: [{ type: Input }],\n topOffset: [{ type: Input }],\n bottomOffset: [{ type: Input }],\n maxScrollDifference: [{ type: Input }],\n scrollOffsetSize: [{ type: Input }],\n scrollDuration: [{ type: Input }],\n skip: [{ type: Input }],\n take: [{ type: Input }],\n total: [{ type: Input }],\n activeIndexChange: [{ type: Output }],\n pageChange: [{ type: Output }],\n scrollChange: [{ type: Output }],\n wrapperClasses: [{ type: HostBinding, args: ['class.k-content',] }, { type: HostBinding, args: ['class.k-scrollable',] }],\n horizontalClass: [{ type: HostBinding, args: ['class.k-scrollable-horizontal',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(VirtualizationComponent, [{\n type: Component,\n args: [{\n providers: [{\n provide: SCROLLER_FACTORY_TOKEN,\n useValue: DEFAULT_SCROLLER_FACTORY\n }],\n selector: 'kendo-virtualization',\n template: `\n \n \n `\n }]\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [SCROLLER_FACTORY_TOKEN]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { direction: [{\n type: Input\n }], itemHeight: [{\n type: Input\n }], itemWidth: [{\n type: Input\n }], topOffset: [{\n type: Input\n }], bottomOffset: [{\n type: Input\n }], maxScrollDifference: [{\n type: Input\n }], scrollOffsetSize: [{\n type: Input\n }], scrollDuration: [{\n type: Input\n }], activeIndexChange: [{\n type: Output\n }], pageChange: [{\n type: Output\n }], scrollChange: [{\n type: Output\n }], wrapperClasses: [{\n type: HostBinding,\n args: ['class.k-content']\n }, {\n type: HostBinding,\n args: ['class.k-scrollable']\n }], horizontalClass: [{\n type: HostBinding,\n args: ['class.k-scrollable-horizontal']\n }], skip: [{\n type: Input\n }], take: [{\n type: Input\n }], total: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nconst closestInScope = (node, predicate, scope) => {\n while (node && node !== scope && !predicate(node)) {\n node = node.parentNode;\n }\n if (node !== scope) {\n return node;\n }\n};\n/**\n * @hidden\n */\nconst closest = (node, predicate) => {\n while (node && !predicate(node)) {\n node = node.parentNode;\n }\n return node;\n};\n\n/* tslint:disable:component-selector-name component-selector-type */\nconst ITEMS_COUNT = 30;\n/**\n * @hidden\n */\nclass NavigationComponent {\n constructor(bus, dom, intl, cdr, renderer) {\n this.bus = bus;\n this.dom = dom;\n this.intl = intl;\n this.cdr = cdr;\n this.renderer = renderer;\n this.min = new Date(MIN_DATE);\n this.max = new Date(MAX_DATE);\n this.focusedDate = new Date();\n this.valueChange = new EventEmitter();\n this.pageChange = new EventEmitter();\n this.dates = [];\n this.take = ITEMS_COUNT;\n this.indexToScroll = -1;\n }\n get getComponentClass() {\n return true;\n }\n ngOnInit() {\n this.dom.ensureHeights();\n const calendarHeight = this.dom.calendarHeight;\n this.itemHeight = this.dom.navigationItemHeight;\n this.maxViewHeight = this.dom.monthViewHeight;\n this.topOffset = (calendarHeight - this.itemHeight) / 2;\n this.bottomOffset = calendarHeight - this.itemHeight;\n this.intlSubscription = this.intl.changes.subscribe(this.intlChange.bind(this));\n }\n ngOnChanges(changes) {\n this.service = this.bus.service(this.activeView);\n if (!this.service) {\n return;\n }\n this.activeViewValue = CalendarViewEnum[this.activeView];\n const viewDate = dateInRange(this.focusedDate, this.min, this.max);\n const total = this.service.total(this.min, this.max);\n const totalChanged = this.total && this.total !== total;\n this.skip = this.service.skip(viewDate, this.min);\n this.total = total;\n if (totalChanged || !this.service.isInArray(viewDate, this.dates)) {\n this.dates = this.service.datesList(viewDate, this.getTake(this.skip));\n }\n if (!!changes.focusedDate || totalChanged) {\n this.indexToScroll = this.service.skip(this.focusedDate, this.min);\n }\n }\n ngOnDestroy() {\n if (this.intlSubscription) {\n this.intlSubscription.unsubscribe();\n }\n }\n ngAfterViewInit() {\n if (this.indexToScroll === -1) {\n return;\n }\n this.virtualization.scrollToIndex(this.indexToScroll);\n this.indexToScroll = -1;\n }\n ngAfterViewChecked() {\n if (this.indexToScroll === -1) {\n return;\n }\n this.virtualization.scrollToIndex(this.indexToScroll);\n this.indexToScroll = -1;\n }\n onPageChange({ skip }) {\n this.dates = this.service.datesList(this.service.addToDate(this.min, skip), this.getTake(skip));\n this.pageChange.emit();\n }\n scrollChange({ offset }) {\n const el = this.list.nativeElement;\n const translate = `translateY(${offset}px)`;\n this.renderer.setStyle(el, 'transform', translate);\n this.renderer.setStyle(el, '-ms-transform', translate);\n }\n handleDateChange(args) {\n const item = closestInScope(args.target, node => node.hasAttribute('data-date-index'), this.list.nativeElement);\n if (item) {\n const index = parseInt(item.getAttribute('data-date-index'), 10);\n const candidate = this.dates[index];\n this.valueChange.emit(cloneDate(candidate));\n }\n }\n getTake(skip) {\n return Math.min(this.total - skip, this.take);\n }\n intlChange() {\n if (this.activeView === CalendarViewEnum.month) {\n this.cdr.markForCheck();\n }\n }\n}\nNavigationComponent.ɵfac = function NavigationComponent_Factory(t) { return new (t || NavigationComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(CalendarDOMService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nNavigationComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: NavigationComponent, selectors: [[\"kendo-calendar-navigation\"]], viewQuery: function NavigationComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(VirtualizationComponent, true);\n ɵngcc0.ɵɵstaticViewQuery(_c1, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.virtualization = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.list = _t.first);\n } }, hostVars: 2, hostBindings: function NavigationComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-calendar-navigation\", ctx.getComponentClass);\n } }, inputs: { min: \"min\", max: \"max\", focusedDate: \"focusedDate\", activeView: \"activeView\", templateRef: \"templateRef\" }, outputs: { valueChange: \"valueChange\", pageChange: \"pageChange\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 5, vars: 12, consts: [[1, \"k-calendar-navigation-highlight\"], [3, \"skip\", \"take\", \"total\", \"itemHeight\", \"topOffset\", \"bottomOffset\", \"maxScrollDifference\", \"pageChange\", \"scrollChange\"], [1, \"k-reset\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [\"list\", \"\"], [4, \"kFor\", \"kForOf\"], [3, \"ngIf\"], [3, \"ngIf\", \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function NavigationComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-virtualization\", 1);\n ɵngcc0.ɵɵlistener(\"pageChange\", function NavigationComponent_Template_kendo_virtualization_pageChange_1_listener($event) { return ctx.onPageChange($event); })(\"scrollChange\", function NavigationComponent_Template_kendo_virtualization_scrollChange_1_listener($event) { return ctx.scrollChange($event); });\n ɵngcc0.ɵɵelementStart(2, \"ul\", 2, 3);\n ɵngcc0.ɵɵtemplate(4, NavigationComponent_li_4_Template, 4, 11, \"li\", 4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"skip\", ctx.skip)(\"take\", ctx.take)(\"total\", ctx.total)(\"itemHeight\", ctx.itemHeight)(\"topOffset\", ctx.topOffset)(\"bottomOffset\", ctx.bottomOffset)(\"maxScrollDifference\", ctx.maxViewHeight);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(10, _c3, ctx.handleDateChange))(\"scope\", ctx);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"kForOf\", ctx.dates);\n } }, directives: function () { return [VirtualizationComponent, ɵngcc3.EventsOutsideAngularDirective, KForOf, ɵngcc2.NgIf, ɵngcc2.NgTemplateOutlet]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nNavigationComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: CalendarDOMService },\n { type: IntlService },\n { type: ChangeDetectorRef },\n { type: Renderer2 }\n];\nNavigationComponent.propDecorators = {\n activeView: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n focusedDate: [{ type: Input }],\n templateRef: [{ type: Input }],\n valueChange: [{ type: Output }],\n pageChange: [{ type: Output }],\n virtualization: [{ type: ViewChild, args: [VirtualizationComponent,] }],\n list: [{ type: ViewChild, args: ['list', { static: true },] }],\n getComponentClass: [{ type: HostBinding, args: [\"class.k-calendar-navigation\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-calendar-navigation',\n template: `\n \n \n
    \n
  • \n \n {{service.navigationTitle(date)}}\n \n \n
  • \n
\n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: CalendarDOMService }, { type: ɵngcc1.IntlService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.Renderer2 }]; }, { min: [{\n type: Input\n }], max: [{\n type: Input\n }], focusedDate: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], pageChange: [{\n type: Output\n }], getComponentClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-navigation\"]\n }], activeView: [{\n type: Input\n }], templateRef: [{\n type: Input\n }], virtualization: [{\n type: ViewChild,\n args: [VirtualizationComponent]\n }], list: [{\n type: ViewChild,\n args: ['list', { static: true }]\n }] }); })();\n\nconst VIEWS_COUNT = 5;\nconst isEqualMonthYear = (date1, date2) => (date1 && date2 &&\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth());\n/**\n * @hidden\n */\nclass ViewListComponent {\n constructor(bus, cdr, intl, dom, renderer) {\n this.bus = bus;\n this.cdr = cdr;\n this.intl = intl;\n this.dom = dom;\n this.renderer = renderer;\n this.isActive = true;\n this.min = new Date(MIN_DATE);\n this.max = new Date(MAX_DATE);\n this.activeDateChange = new EventEmitter();\n this.valueChange = new EventEmitter();\n this.pageChange = new EventEmitter();\n this.dates = [];\n this.cols = [];\n this.weekNames = [];\n this.take = VIEWS_COUNT;\n this.animateToIndex = true;\n this.indexToScroll = -1;\n this.minViewsToRender = 1;\n }\n get weekNumber() {\n return this.showWeekNumbers && this.isMonthView();\n }\n set weekNumber(showWeekNumbers) {\n this.showWeekNumbers = showWeekNumbers;\n }\n get getComponentClass() {\n return true;\n }\n get getComponentMonthClass() {\n return this.activeView === CalendarViewEnum.month;\n }\n get getComponentYearClass() {\n return this.activeView === CalendarViewEnum.year;\n }\n get getComponentDecadeClass() {\n return this.activeView === CalendarViewEnum.decade;\n }\n get getComponentCenturyClass() {\n return this.activeView === CalendarViewEnum.century;\n }\n ngOnInit() {\n this.weekNames = this.getWeekNames();\n this.bottomOffset = this.getBottomOffset();\n this.viewOffset = -1 * this.dom.headerHeight;\n this.viewHeight = this.dom.viewHeight(this.activeView);\n this.intlSubscription = this.intl.changes.subscribe(this.intlChange.bind(this));\n }\n ngOnChanges(changes) {\n this.service = this.bus.service(this.activeView);\n if (!this.service) {\n return;\n }\n this.cols = new Array(this.service.rowLength(this.weekNumber)).fill('');\n this.colWidth = Math.round(100 / this.cols.length);\n this.weekNames = hasChange(changes, 'weekNumber') && this.weekNumber ? this.getWeekNames() : this.weekNames;\n const activeViewChanged = hasChange(changes, 'activeView');\n const focusedDate = this.focusedDate;\n const viewDate = dateInRange(this.service.viewDate(focusedDate, this.max, this.minViewsToRender), this.min, this.max);\n const total = this.service.total(this.min, this.max);\n const totalChanged = this.total && this.total !== total;\n const generateDates = totalChanged || !this.service.isInArray(focusedDate, this.dates);\n this.skip = this.service.skip(viewDate, this.min);\n this.total = total;\n this.animateToIndex = !activeViewChanged;\n this.bottomOffset = this.getBottomOffset();\n this.viewHeight = this.dom.viewHeight(this.activeView);\n if (generateDates) {\n this.dates = this.service.datesList(viewDate, this.getTake(this.skip));\n }\n if (!isEqualMonthYear(this.activeDate, focusedDate)) {\n this.activeDate = cloneDate(focusedDate);\n }\n const updateIndex = hasChange(changes, 'focusedDate') || activeViewChanged;\n if (generateDates || updateIndex || this.virtualization.isIndexVisible(this.skip)) {\n this.indexToScroll = this.service.skip(focusedDate, this.min);\n }\n }\n ngOnDestroy() {\n if (this.intlSubscription) {\n this.intlSubscription.unsubscribe();\n }\n }\n ngAfterViewInit() {\n if (this.indexToScroll === -1) {\n return;\n }\n this.virtualization.scrollToIndex(this.indexToScroll);\n this.indexToScroll = -1;\n }\n ngAfterViewChecked() {\n if (this.indexToScroll === -1) {\n return;\n }\n this.virtualization[this.animateToIndex ? 'animateToIndex' : 'scrollToIndex'](this.indexToScroll);\n this.animateToIndex = true;\n this.indexToScroll = -1;\n }\n onPageChange({ skip }) {\n this.dates = this.service.datesList(this.service.addToDate(this.min, skip), this.getTake(skip));\n this.pageChange.emit();\n }\n scrollChange({ offset }) {\n const el = this.list.nativeElement;\n const translate = `translateY(${offset}px)`;\n this.renderer.setStyle(el, 'transform', translate);\n this.renderer.setStyle(el, '-ms-transform', translate);\n }\n setActiveDate(index) {\n const candidate = this.service.addToDate(this.min, index);\n if (isEqual(this.activeDate, candidate)) {\n return;\n }\n this.activeDate = candidate;\n this.activeDateChange.emit(candidate);\n this.cdr.detectChanges();\n }\n handleDateChange(candidate) {\n this.valueChange.emit(candidate);\n }\n isMonthView() {\n return this.activeView === CalendarViewEnum.month;\n }\n isScrolled() {\n return this.virtualization.isListScrolled(this.service.skip(this.focusedDate, this.min));\n }\n getBottomOffset() {\n return this.getScrollableHeight() - this.dom.viewHeight(this.activeView);\n }\n getScrollableHeight() {\n return this.activeView === CalendarViewEnum.month ?\n this.dom.scrollableContentHeight :\n this.dom.scrollableYearContentHeight;\n }\n getTake(skip) {\n return Math.min(this.total - skip, this.take);\n }\n getWeekNames() {\n const weekNames = shiftWeekNames(this.intl.dateFormatNames({ nameType: 'short', type: 'days' }), this.intl.firstDay());\n return this.weekNumber ? [''].concat(weekNames) : weekNames;\n }\n intlChange() {\n this.weekNames = this.getWeekNames();\n if (this.isMonthView()) {\n this.cdr.markForCheck();\n }\n }\n}\nViewListComponent.ɵfac = function ViewListComponent_Factory(t) { return new (t || ViewListComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(CalendarDOMService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nViewListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ViewListComponent, selectors: [[\"kendo-calendar-viewlist\"]], viewQuery: function ViewListComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(VirtualizationComponent, true);\n ɵngcc0.ɵɵstaticViewQuery(_c1, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.virtualization = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.list = _t.first);\n } }, hostVars: 10, hostBindings: function ViewListComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-calendar-view\", ctx.getComponentClass)(\"k-calendar-monthview\", ctx.getComponentMonthClass)(\"k-calendar-yearview\", ctx.getComponentYearClass)(\"k-calendar-decadeview\", ctx.getComponentDecadeClass)(\"k-calendar-centuryview\", ctx.getComponentCenturyClass);\n } }, inputs: { isActive: \"isActive\", min: \"min\", max: \"max\", weekNumber: \"weekNumber\", cellTemplateRef: \"cellTemplateRef\", weekNumberTemplateRef: \"weekNumberTemplateRef\", headerTitleTemplateRef: \"headerTitleTemplateRef\", activeView: \"activeView\", cellUID: \"cellUID\", focusedDate: \"focusedDate\", value: \"value\" }, outputs: { activeDateChange: \"activeDateChange\", valueChange: \"valueChange\", pageChange: \"pageChange\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 8, vars: 17, consts: [[3, \"currentDate\", \"min\", \"max\", \"activeView\", \"templateRef\", \"today\"], [\"class\", \"k-calendar-weekdays\", \"style\", \"table-layout: auto;\", 4, \"ngIf\"], [3, \"tabindex\", \"skip\", \"take\", \"total\", \"itemHeight\", \"topOffset\", \"bottomOffset\", \"scrollOffsetSize\", \"maxScrollDifference\", \"pageChange\", \"scrollChange\", \"activeIndexChange\"], [\"list\", \"\"], [4, \"ngFor\", \"ngForOf\"], [\"kendoCalendarView\", \"\", \"role\", \"rowgroup\", 3, \"activeView\", \"isActive\", \"min\", \"max\", \"cellUID\", \"focusedDate\", \"selectedDate\", \"weekNumber\", \"templateRef\", \"weekNumberTemplateRef\", \"viewDate\", \"change\", 4, \"kFor\", \"kForOf\"], [1, \"k-calendar-weekdays\", 2, \"table-layout\", \"auto\"], [3, \"width\", 4, \"ngFor\", \"ngForOf\"], [\"kendoCalendarView\", \"\", \"role\", \"rowgroup\", 3, \"activeView\", \"isActive\", \"min\", \"max\", \"cellUID\", \"focusedDate\", \"selectedDate\", \"weekNumber\", \"templateRef\", \"weekNumberTemplateRef\", \"viewDate\", \"change\"]], template: function ViewListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-calendar-header\", 0);\n ɵngcc0.ɵɵlistener(\"today\", function ViewListComponent_Template_kendo_calendar_header_today_0_listener($event) { return ctx.handleDateChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(1, ViewListComponent_table_1_Template, 4, 1, \"table\", 1);\n ɵngcc0.ɵɵelementStart(2, \"kendo-virtualization\", 2);\n ɵngcc0.ɵɵlistener(\"pageChange\", function ViewListComponent_Template_kendo_virtualization_pageChange_2_listener($event) { return ctx.onPageChange($event); })(\"scrollChange\", function ViewListComponent_Template_kendo_virtualization_scrollChange_2_listener($event) { return ctx.scrollChange($event); })(\"activeIndexChange\", function ViewListComponent_Template_kendo_virtualization_activeIndexChange_2_listener($event) { return ctx.setActiveDate($event); });\n ɵngcc0.ɵɵelementStart(3, \"table\", null, 3);\n ɵngcc0.ɵɵelementStart(5, \"colgroup\");\n ɵngcc0.ɵɵtemplate(6, ViewListComponent_col_6_Template, 1, 0, \"col\", 4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(7, ViewListComponent_tbody_7_Template, 1, 11, \"tbody\", 5);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"currentDate\", ctx.activeDate)(\"min\", ctx.min)(\"max\", ctx.max)(\"activeView\", ctx.activeView)(\"templateRef\", ctx.headerTitleTemplateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isMonthView());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"tabindex\", 0 - 1)(\"skip\", ctx.skip)(\"take\", ctx.take)(\"total\", ctx.total)(\"itemHeight\", ctx.viewHeight)(\"topOffset\", ctx.viewOffset)(\"bottomOffset\", ctx.bottomOffset)(\"scrollOffsetSize\", ctx.viewOffset)(\"maxScrollDifference\", ctx.viewHeight);\n ɵngcc0.ɵɵadvance(4);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.cols);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kForOf\", ctx.dates);\n } }, directives: function () { return [HeaderComponent, ɵngcc2.NgIf, VirtualizationComponent, ɵngcc2.NgForOf, KForOf,\n ViewComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nViewListComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: ChangeDetectorRef },\n { type: IntlService },\n { type: CalendarDOMService },\n { type: Renderer2 }\n];\nViewListComponent.propDecorators = {\n cellTemplateRef: [{ type: Input }],\n weekNumberTemplateRef: [{ type: Input }],\n headerTitleTemplateRef: [{ type: Input }],\n activeView: [{ type: Input }],\n cellUID: [{ type: Input }],\n focusedDate: [{ type: Input }],\n isActive: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n value: [{ type: Input }],\n weekNumber: [{ type: Input }],\n activeDateChange: [{ type: Output }],\n valueChange: [{ type: Output }],\n pageChange: [{ type: Output }],\n virtualization: [{ type: ViewChild, args: [VirtualizationComponent,] }],\n list: [{ type: ViewChild, args: ['list', { static: true },] }],\n getComponentClass: [{ type: HostBinding, args: [\"class.k-calendar-view\",] }],\n getComponentMonthClass: [{ type: HostBinding, args: [\"class.k-calendar-monthview\",] }],\n getComponentYearClass: [{ type: HostBinding, args: [\"class.k-calendar-yearview\",] }],\n getComponentDecadeClass: [{ type: HostBinding, args: [\"class.k-calendar-decadeview\",] }],\n getComponentCenturyClass: [{ type: HostBinding, args: [\"class.k-calendar-centuryview\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ViewListComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-calendar-viewlist',\n template: `\n \n \n \n \n \n \n \n \n
{{name}}
\n \n \n \n\n \n
\n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.IntlService }, { type: CalendarDOMService }, { type: ɵngcc0.Renderer2 }]; }, { isActive: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], activeDateChange: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], pageChange: [{\n type: Output\n }], weekNumber: [{\n type: Input\n }], getComponentClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-view\"]\n }], getComponentMonthClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-monthview\"]\n }], getComponentYearClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-yearview\"]\n }], getComponentDecadeClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-decadeview\"]\n }], getComponentCenturyClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-centuryview\"]\n }], cellTemplateRef: [{\n type: Input\n }], weekNumberTemplateRef: [{\n type: Input\n }], headerTitleTemplateRef: [{\n type: Input\n }], activeView: [{\n type: Input\n }], cellUID: [{\n type: Input\n }], focusedDate: [{\n type: Input\n }], value: [{\n type: Input\n }], virtualization: [{\n type: ViewChild,\n args: [VirtualizationComponent]\n }], list: [{\n type: ViewChild,\n args: ['list', { static: true }]\n }] }); })();\n\nconst KEY_TO_ACTION = {\n '33': Action.PrevView,\n '34': Action.NextView,\n '35': Action.LastInView,\n '36': Action.FirstInView,\n '37': Action.Left,\n '38': Action.Up,\n '39': Action.Right,\n '40': Action.Down,\n 'meta+38': Action.UpperView,\n 'meta+40': Action.LowerView\n};\n/**\n * @hidden\n */\nclass NavigationService {\n constructor(bus) {\n this.bus = bus;\n }\n action(event) {\n const action = `${event.ctrlKey || event.metaKey ? 'meta+' : ''}${event.keyCode}`;\n return KEY_TO_ACTION[action];\n }\n move(value, action, activeView) {\n const service = this.bus.service(activeView);\n if (!service) {\n return value;\n }\n if (action === Action.UpperView && this.bus.canMoveUp(activeView)) {\n this.bus.moveUp(activeView);\n return value;\n }\n if (action === Action.LowerView && this.bus.canMoveDown(activeView)) {\n this.bus.moveDown(activeView);\n return value;\n }\n return service.move(value, action);\n }\n}\nNavigationService.ɵfac = function NavigationService_Factory(t) { return new (t || NavigationService)(ɵngcc0.ɵɵinject(BusViewService)); };\nNavigationService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: NavigationService, factory: NavigationService.ɵfac });\n/** @nocollapse */\nNavigationService.ctorParameters = () => [\n { type: BusViewService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationService, [{\n type: Injectable\n }], function () { return [{ type: BusViewService }]; }, null); })();\n\nconst divideByMagnitude = (magnitude) => x => Math.floor(x / magnitude);\nconst powerByMagnitude = (magnitude) => x => x * magnitude;\n/**\n * @hidden\n */\nclass ScrollSyncService {\n constructor(dom, zone) {\n this.dom = dom;\n this.zone = zone;\n }\n configure(activeView) {\n const magnitude = Math.max(this.dom.viewHeight(activeView) / this.dom.navigationItemHeight, 1);\n this.divideByMagnitude = divideByMagnitude(magnitude);\n this.powerByMagnitude = powerByMagnitude(magnitude);\n }\n sync(navigator, view) {\n this.unsubscribe();\n if (!navigator || !view) {\n return;\n }\n this.navigator = navigator;\n this.view = view;\n this.zone.runOutsideAngular(() => {\n let navScrolled, monthScrolled;\n this.navSubscription = navigator.scroll$()\n .subscribe((e) => {\n if (monthScrolled) {\n monthScrolled = false;\n return;\n }\n navScrolled = true;\n this.scrollSiblingOf(e.target);\n });\n this.viewSubscription = view.scroll$()\n .subscribe((e) => {\n if (navScrolled) {\n navScrolled = false;\n return;\n }\n monthScrolled = true;\n this.scrollSiblingOf(e.target);\n });\n });\n }\n scrollSiblingOf(scrolledElement) {\n const component = this.siblingComponent(scrolledElement);\n const scrollTop = this.calculateScroll(component, scrolledElement.scrollTop);\n component.scrollTo(scrollTop);\n }\n siblingComponent(scrollableElement) {\n return this.navigator.container.nativeElement === scrollableElement ? this.view : this.navigator;\n }\n calculateScroll(component, scrollTop) {\n const modifier = component === this.navigator ? this.divideByMagnitude : this.powerByMagnitude;\n return modifier(scrollTop);\n }\n destroy() {\n this.unsubscribe();\n }\n unsubscribe() {\n if (this.navSubscription) {\n this.navSubscription.unsubscribe();\n }\n if (this.viewSubscription) {\n this.viewSubscription.unsubscribe();\n }\n }\n}\nScrollSyncService.ɵfac = function ScrollSyncService_Factory(t) { return new (t || ScrollSyncService)(ɵngcc0.ɵɵinject(CalendarDOMService), ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nScrollSyncService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ScrollSyncService, factory: ScrollSyncService.ɵfac });\n/** @nocollapse */\nScrollSyncService.ctorParameters = () => [\n { type: CalendarDOMService },\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ScrollSyncService, [{\n type: Injectable\n }], function () { return [{ type: CalendarDOMService }, { type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * Used for rendering the cell content of the Calendar. To define the cell template, nest an `` tag\n * with the `kendoCalendarCellTemplate` directive inside the component tag. The template context is set to the\n * current component. To get a reference to the current date, use the `let-date` directive. To provide more details\n * about the current cell, get a reference to the current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * > `kendoCalendarCellTemplate` is equivalent to\n * > [`kendoCalendarMonthCellTemplate`]({% slug api_dateinputs_monthcelltemplatedirective %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{date.getDate()}}\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass CellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nCellTemplateDirective.ɵfac = function CellTemplateDirective_Factory(t) { return new (t || CellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CellTemplateDirective, selectors: [[\"\", \"kendoCalendarCellTemplate\", \"\"]] });\n/** @nocollapse */\nCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the month cell content of the Calendar. To define the month cell template, nest an `` tag\n * with the `kendoCalendarMonthCellTemplate` directive inside the component tag. The template context is set to the current\n * component. To get a reference to the current date, use the `let-date` directive. To provide more details about the current\n * month cell, get a reference to the current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{context.formattedValue}}\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass MonthCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nMonthCellTemplateDirective.ɵfac = function MonthCellTemplateDirective_Factory(t) { return new (t || MonthCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nMonthCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: MonthCellTemplateDirective, selectors: [[\"\", \"kendoCalendarMonthCellTemplate\", \"\"]] });\n/** @nocollapse */\nMonthCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MonthCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarMonthCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the year cell content of the Calendar. To define the year cell template, nest an\n * `` tag with the `kendoCalendarYearCellTemplate` directive inside the component tag.\n * The template context is set to the current component. To get a reference to the current date, use\n * the `let-date` directive. To provide more details about the current year cell, get a reference to the\n * current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{context.formattedValue}}\n * \n * \n * `\n * })\n * export class AppComponent {\n * public activeView: CalendarView = 'year';\n * }\n * ```\n */\nclass YearCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nYearCellTemplateDirective.ɵfac = function YearCellTemplateDirective_Factory(t) { return new (t || YearCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nYearCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: YearCellTemplateDirective, selectors: [[\"\", \"kendoCalendarYearCellTemplate\", \"\"]] });\n/** @nocollapse */\nYearCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(YearCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarYearCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the decade cell content of the Calendar. To define the decade cell template, nest an ``\n * tag with the `kendoCalendarDecadeCellTemplate` directive inside the component tag. The template context is set to the\n * current component. To get a reference to the current date, use the `let-date` directive. To provide more details about\n * the current decade cell, get a reference to the current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{context.formattedValue}}\n * \n * \n * `\n * })\n * export class AppComponent {\n * public activeView: CalendarView = 'decade';\n * }\n * ```\n */\nclass DecadeCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDecadeCellTemplateDirective.ɵfac = function DecadeCellTemplateDirective_Factory(t) { return new (t || DecadeCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nDecadeCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DecadeCellTemplateDirective, selectors: [[\"\", \"kendoCalendarDecadeCellTemplate\", \"\"]] });\n/** @nocollapse */\nDecadeCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DecadeCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarDecadeCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the century cell content of the Calendar. To define the century cell template, nest an ``\n * tag with the `kendoCalendarCenturyCellTemplate` directive inside the component tag. The template context is set to the\n * current component. To get a reference to the current date, use the `let-date` directive. To provide more details about\n * the current century cell, get a reference to the current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{context.formattedValue}}\n * \n * \n * `\n * })\n * export class AppComponent {\n * public activeView: CalendarView = 'century';\n * }\n * ```\n */\nclass CenturyCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nCenturyCellTemplateDirective.ɵfac = function CenturyCellTemplateDirective_Factory(t) { return new (t || CenturyCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCenturyCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CenturyCellTemplateDirective, selectors: [[\"\", \"kendoCalendarCenturyCellTemplate\", \"\"]] });\n/** @nocollapse */\nCenturyCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CenturyCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarCenturyCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the week number cell content in the month view of the Calendar. To define the month week number cell template,\n * nest an `` tag with the `kendoCalendarWeekNumberCellTemplate` directive inside the component tag. The template\n * context is set to the current component. To get a reference to the current date, use the `let-date` directive. To provide more\n * details about the current week number cell, get a reference to the current `cellContext` by using the `let-cellContext` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{context.formattedValue}}\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass WeekNumberCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nWeekNumberCellTemplateDirective.ɵfac = function WeekNumberCellTemplateDirective_Factory(t) { return new (t || WeekNumberCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nWeekNumberCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: WeekNumberCellTemplateDirective, selectors: [[\"\", \"kendoCalendarWeekNumberCellTemplate\", \"\"]] });\n/** @nocollapse */\nWeekNumberCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WeekNumberCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarWeekNumberCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the header title of the Calendar. To define the header title template, nest an `` tag\n * with the `kendoCalendarHeaderTitleTemplate` directive inside the component tag. The template context is set to the\n * current component. To get a reference to the current title, use the `let-title` directive. To provide more details about\n * the current title, get a reference to the current `date` by using the `let-date` directive or get a reference to the\n * current active view by using the `let-activeView` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{title}}\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass HeaderTitleTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nHeaderTitleTemplateDirective.ɵfac = function HeaderTitleTemplateDirective_Factory(t) { return new (t || HeaderTitleTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nHeaderTitleTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: HeaderTitleTemplateDirective, selectors: [[\"\", \"kendoCalendarHeaderTitleTemplate\", \"\"]] });\n/** @nocollapse */\nHeaderTitleTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HeaderTitleTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarHeaderTitleTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Used for rendering the navigation item of the Calendar. To define the navigation item template, nest an ``\n * tag with the `kendoCalendarNavigationItemTemplate` directive inside the component tag. The template context is set to the\n * current component. To get a reference to the current item value, use the `let-title` directive. To provide more details\n * about the current title, get a reference to the current `date` by using the `let-date='date'` directive or get a reference\n * to the current active view by using the `let-activeView='activeView'` directive.\n *\n * For more examples, refer to the article on [templates]({% slug templates_calendar %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * styles: ['.custom { color: red; }'],\n * template: `\n * \n * \n * {{title}}\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass NavigationItemTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nNavigationItemTemplateDirective.ɵfac = function NavigationItemTemplateDirective_Factory(t) { return new (t || NavigationItemTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nNavigationItemTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: NavigationItemTemplateDirective, selectors: [[\"\", \"kendoCalendarNavigationItemTemplate\", \"\"]] });\n/** @nocollapse */\nNavigationItemTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationItemTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCalendarNavigationItemTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * @hidden\n */\nclass PickerService {\n constructor() {\n this.onFocus = new EventEmitter();\n this.onBlur = new EventEmitter();\n this.sameDateSelected = new EventEmitter();\n this.dateCompletenessChange = new EventEmitter();\n }\n}\nPickerService.ɵfac = function PickerService_Factory(t) { return new (t || PickerService)(); };\nPickerService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: PickerService, factory: PickerService.ɵfac });\n\n\n/**\n * @hidden\n */\nconst minValidator = (minValue) => {\n return (control) => {\n const err = {\n minError: {\n minValue: minValue,\n value: control.value\n }\n };\n if (!minValue || !control.value) {\n return null;\n }\n return control.value < minValue ? err : null;\n };\n};\n\n/**\n * @hidden\n */\nconst maxValidator = (maxValue) => {\n return (control) => {\n const err = {\n maxError: {\n maxValue: maxValue,\n value: control.value\n }\n };\n if (!maxValue || !control.value) {\n return null;\n }\n return control.value > maxValue ? err : null;\n };\n};\n\nconst noop$1 = () => false;\nconst DISABLED_DATES_DOC_LINK = 'https://www.telerik.com/kendo-angular-ui/components/dateinputs/calendar/disabled-dates/';\n/**\n * @hidden\n */\nclass DisabledDatesService {\n constructor() {\n /**\n * Emits every time the `isDateDisabled` method changes.\n */\n this.changes = new Subject();\n /**\n * Based on the user-defined `disabledDates` input evaluates if the date is disabled.\n * If not set, returns `false`.\n */\n this.isDateDisabled = noop$1;\n }\n /**\n * Configures the `isDateDisabled` function.\n *\n * * If a function is provided, uses it as-is and passes each date to it for evaluation.\n * The time part is set to `midnight`.\n * * If a `Date[]` is provided, creates a function that checks the targeted date against\n * the listed dates and, if the targeted date is listed, marks it as disabled.\n * * If a `Day[]` is provided, creates a function that evaluates the provided days of the\n * week as disabled.\n */\n initialize(disabledDates) {\n if (typeof disabledDates === 'function') {\n this.isDateDisabled = (date) => disabledDates(getDate(date));\n }\n else if (isNumberArray(disabledDates)) {\n const disabledWeekDays = new Set(disabledDates);\n this.isDateDisabled = (date) => disabledWeekDays.has(date.getDay());\n }\n else if (isDateArray(disabledDates)) {\n const normalizedDisabledDates = new Set(disabledDates.map(date => getDate(date).getTime()));\n this.isDateDisabled = (date) => normalizedDisabledDates.has(getDate(date).getTime());\n }\n else {\n this.isDateDisabled = noop$1;\n this.notifyInvalidInput(disabledDates);\n }\n this.notifyServiceChange();\n }\n notifyInvalidInput(disabledDates) {\n if (isPresent(disabledDates) && isDevMode()) {\n throw new Error(`The 'disabledDates' value should be a function, a Day array or a Date array. Check ${DISABLED_DATES_DOC_LINK} for more information.`);\n }\n }\n notifyServiceChange() {\n this.changes.next();\n }\n}\nDisabledDatesService.ɵfac = function DisabledDatesService_Factory(t) { return new (t || DisabledDatesService)(); };\nDisabledDatesService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DisabledDatesService, factory: DisabledDatesService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DisabledDatesService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/* tslint:disable:no-forward-ref */\nconst BOTTOM_VIEW_DOC_LINK = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-bottomview';\nconst TOP_VIEW_DOC_LINK = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-topview';\nconst MIN_DOC_LINK = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-min';\nconst MAX_DOC_LINK = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-max';\nconst VALUE_DOC_LINK = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/calendar/#toc-using-with-json';\nconst virtualizationProp = x => x ? x.virtualization : null;\n/**\n * @hidden\n */\nconst CALENDAR_VALUE_ACCESSOR = {\n multi: true,\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CalendarComponent) //tslint:disable-line:no-use-before-declare\n};\n/**\n * @hidden\n */\nconst CALENDAR_RANGE_VALIDATORS = {\n multi: true,\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => CalendarComponent) //tslint:disable-line:no-use-before-declare\n};\n/**\n * @hidden\n */\nconst KENDO_INPUT_PROVIDER = {\n provide: KendoInput,\n useExisting: forwardRef(() => CalendarComponent) //tslint:disable-line:no-use-before-declare\n};\n/**\n * Represents the [Kendo UI Calendar component for Angular]({% slug overview_calendar %}#toc-basic-usage).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass CalendarComponent {\n constructor(bus, dom, element, navigator, renderer, cdr, ngZone, injector, scrollSyncService, disabledDatesService, pickerService) {\n this.bus = bus;\n this.dom = dom;\n this.element = element;\n this.navigator = navigator;\n this.renderer = renderer;\n this.cdr = cdr;\n this.ngZone = ngZone;\n this.injector = injector;\n this.scrollSyncService = scrollSyncService;\n this.disabledDatesService = disabledDatesService;\n this.pickerService = pickerService;\n /**\n * @hidden\n */\n this.id = guid();\n /**\n * Determines whether the built-in min or max validators are enforced when validating a form.\n */\n this.rangeValidation = false;\n /**\n * Sets or gets the `disabled` property of the Calendar and\n * determines whether the component is active\n * ([see example]({% slug disabled_calendar %})).\n */\n this.disabled = false;\n /**\n * Sets or gets the `tabindex` property of the Calendar. Based on the\n * [HTML `tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) behavior,\n * it determines whether the component is focusable.\n */\n this.tabindex = 0;\n /**\n * Sets or gets the `navigation` property of the Calendar\n * and determines whether the navigation side-bar will be displayed\n * ([see example]({% slug sidebar_calendar %})).\n */\n this.navigation = true;\n /**\n * Defines the active view that the Calendar initially renders\n * ([see example]({% slug activeview_calendar %})).\n * By default, the active view is `month`.\n *\n * > You have to set `activeView` within the `topView`-`bottomView` range.\n */\n this.activeView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the bottommost view to which the user can navigate\n * ([see example]({% slug dates_calendar %}#toc-partial-dates)).\n */\n this.bottomView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the topmost view to which the user can navigate\n * ([see example]({% slug sidebar_calendar %}#toc-partial-dates)).\n */\n this.topView = CalendarViewEnum[CalendarViewEnum.century];\n /**\n * Determines whether to display a week number column in the `month` view\n * ([see example]({% slug weeknumcolumn_calendar %})).\n */\n this.weekNumber = false;\n /**\n * Fires when the active view is changed\n * ([more information and example]({% slug overview_calendar %}#toc-events)).\n */\n this.activeViewChange = new EventEmitter();\n /**\n * Fires when the active view date is changed\n * ([more information and example]({% slug overview_calendar %}#toc-events)).\n */\n this.activeViewDateChange = new EventEmitter();\n /**\n * Fires when the value is changed\n * ([more information and example]({% slug overview_calendar %}#toc-events)).\n */\n this.valueChange = new EventEmitter();\n this.isActive = false;\n this.cellUID = guid();\n this._min = new Date(MIN_DATE);\n this._max = new Date(MAX_DATE);\n this._focusedDate = getToday();\n this.onControlChange = noop;\n this.onControlTouched = noop;\n this.onValidatorChange = noop;\n this.minValidateFn = noop;\n this.maxValidateFn = noop;\n this.syncNavigation = true;\n this.domEvents = [];\n this.resolvedPromise = Promise.resolve(null);\n this.destroyed = false;\n this.setClasses(element.nativeElement);\n if (this.pickerService) {\n this.pickerService.calendar = this;\n }\n }\n /**\n * Sets or gets the `focusedDate` property of the Calendar and\n * defines the focused date of the component\n * ([see example]({% slug dates_calendar %}#toc-focused-dates)).\n *\n * > If the Calendar is out of the min or max range, it normalizes the defined `focusedDate`.\n */\n set focusedDate(focusedDate) {\n this._focusedDate = focusedDate || getToday();\n this.setAriaActivedescendant();\n }\n get focusedDate() {\n return this._focusedDate;\n }\n /**\n * Sets or gets the `min` property of the Calendar and\n * defines the minimum allowed date value\n * ([see example]({% slug dateranges_calendar %})).\n * By default, the `min` value is `1900-1-1`.\n */\n set min(min) {\n this._min = min || new Date(MIN_DATE);\n }\n get min() {\n return this._min;\n }\n /**\n * Sets or gets the `max` property of the Calendar and\n * defines the maximum allowed date value\n * ([see example]({% slug dateranges_calendar %})).\n * By default, the `max` value is `2099-12-31`.\n */\n set max(max) {\n this._max = max || new Date(MAX_DATE);\n }\n get max() {\n return this._max;\n }\n /**\n * Sets or gets the `value` property of the Calendar and defines the selected value of the component.\n *\n * > The `value` has to be a valid\n * [JavaScript `Date`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) instance.\n */\n get value() {\n return this._value;\n }\n set value(candidate) {\n this.verifyValue(candidate);\n this._value = cloneDate(candidate);\n }\n /**\n * @hidden\n */\n set tabIndex(tabIndex) {\n this.tabindex = tabIndex;\n }\n get tabIndex() {\n return this.tabindex;\n }\n /**\n * Sets the dates of the Calendar that will be disabled\n * ([see example]({% slug disabled_dates_calendar %})).\n */\n set disabledDates(value) {\n this.disabledDatesService.initialize(value);\n }\n /**\n * @hidden\n */\n set cellTemplateRef(template) {\n this.cellTemplate = template;\n }\n /**\n * @hidden\n */\n set monthCellTemplateRef(template) {\n this.monthCellTemplate = template;\n }\n /**\n * @hidden\n */\n set yearCellTemplateRef(template) {\n this.yearCellTemplate = template;\n }\n /**\n * @hidden\n */\n set decadeCellTemplateRef(template) {\n this.decadeCellTemplate = template;\n }\n /**\n * @hidden\n */\n set centuryCellTemplateRef(template) {\n this.centuryCellTemplate = template;\n }\n /**\n * @hidden\n */\n set weekNumberTemplateRef(template) {\n this.weekNumberTemplate = template;\n }\n /**\n * @hidden\n */\n set headerTitleTemplateRef(template) {\n this.headerTitleTemplate = template;\n }\n /**\n * @hidden\n */\n set navigationItemTemplateRef(template) {\n this.navigationItemTemplate = template;\n }\n get activeViewEnum() {\n const activeView = CalendarViewEnum[this.activeView];\n return activeView < this.bottomViewEnum ? this.bottomViewEnum : activeView;\n }\n get bottomViewEnum() {\n return CalendarViewEnum[this.bottomView];\n }\n get topViewEnum() {\n return CalendarViewEnum[this.topView];\n }\n get widgetId() {\n return this.id;\n }\n get widgetRole() {\n return 'grid';\n }\n get calendarTabIndex() {\n return this.disabled ? undefined : this.tabIndex;\n }\n get ariaDisabled() {\n return this.disabled;\n }\n ngOnInit() {\n this.dom.calculateHeights(this.element.nativeElement);\n this.scrollSyncService.configure(this.activeViewEnum);\n this.viewChangeSubscription = this.bus.viewChanged.subscribe(({ view }) => {\n this.activeView = CalendarViewEnum[view];\n this.emitEvent(this.activeViewChange, this.activeView);\n this.scrollSyncService.configure(view);\n this.detectChanges(); // requires zone if templates\n });\n this.control = this.injector.get(NgControl, null);\n if (this.element) {\n this.ngZone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n ngOnChanges(changes) {\n this.verifyChanges();\n this.bus.configure(this.bottomViewEnum, this.topViewEnum);\n this.scrollSyncService.configure(this.activeViewEnum);\n const useValue = hasExistingValue(changes, 'value') && !hasExistingValue(changes, 'focusedDate');\n const focusedDate = dateInRange(cloneDate(useValue ? this.value : this.focusedDate), this.min, this.max);\n this.focusedDate = !isEqual(this.focusedDate, focusedDate) ? focusedDate : this.focusedDate;\n if (changes.navigation) {\n this.syncNavigation = true;\n }\n if (changes.min || changes.max || changes.rangeValidation) {\n this.minValidateFn = this.rangeValidation ? minValidator(this.min) : noop;\n this.maxValidateFn = this.rangeValidation ? maxValidator(this.max) : noop;\n this.onValidatorChange();\n }\n }\n ngAfterViewInit() {\n this.setAriaActivedescendant();\n }\n ngAfterViewChecked() {\n if (!this.syncNavigation) {\n return;\n }\n this.syncNavigation = false;\n this.scrollSyncService.sync(virtualizationProp(this.navigationView), virtualizationProp(this.monthView));\n }\n ngOnDestroy() {\n this.scrollSyncService.destroy();\n this.viewChangeSubscription.unsubscribe();\n this.domEvents.forEach(unbindCallback => unbindCallback());\n if (this.pickerService) {\n this.pickerService.calendar = null;\n }\n if (this.pageChangeSubscription) {\n this.pageChangeSubscription.unsubscribe();\n }\n this.destroyed = true;\n }\n /**\n * @hidden\n */\n onResize() {\n this.focusedDate = new Date(this.focusedDate);\n this.cdr.detectChanges();\n }\n /**\n * Focuses the host element of the Calendar.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.focus();\n }\n /**\n * Blurs the Calendar component.\n */\n blur() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.blur();\n }\n /**\n * @hidden\n */\n containsElement(element) {\n return Boolean(closest(element, node => node === this.element.nativeElement));\n }\n /**\n * @hidden\n */\n handleNavigation(candidate) {\n if (this.disabled) {\n return;\n }\n const focusTarget = candidate ? new Date(cloneDate(candidate).setDate(1)) : this.focusedDate;\n this.focusedDate = dateInRange(focusTarget, this.min, this.max);\n this.detectChanges();\n }\n /**\n * @hidden\n */\n onPageChange() {\n if (!NgZone.isInAngularZone()) {\n if (this.pageChangeSubscription) {\n this.pageChangeSubscription.unsubscribe();\n }\n this.pageChangeSubscription = from(this.resolvedPromise)\n .subscribe(() => {\n this.detectChanges(); // requires zone if templates\n });\n }\n }\n /**\n * @hidden\n */\n handleDateChange(candidate) {\n const canNavigateDown = this.bus.canMoveDown(this.activeViewEnum);\n const isSameDate = !canNavigateDown && isEqual(candidate, this.value);\n this.focusedDate = cloneDate(candidate) || this.focusedDate;\n if (this.disabled) {\n return;\n }\n if (isSameDate) {\n this.emitSameDate();\n return;\n }\n if (canNavigateDown) {\n this.bus.moveDown(this.activeViewEnum);\n return;\n }\n if (!this.disabledDatesService.isDateDisabled(candidate)) {\n this.ngZone.run(() => {\n this.value = cloneDate(candidate);\n this.onControlChange(cloneDate(candidate));\n this.valueChange.emit(cloneDate(candidate));\n this.cdr.markForCheck();\n });\n }\n }\n /**\n * @hidden\n */\n writeValue(candidate) {\n this.verifyValue(candidate);\n this.focusedDate = dateInRange(cloneDate(candidate) || this.focusedDate, this.min, this.max);\n this.value = cloneDate(candidate);\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * @hidden\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.minValidateFn(control) || this.maxValidateFn(control);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * @hidden\n */\n activeCellTemplate() {\n switch (this.activeViewEnum) {\n case CalendarViewEnum.month:\n return this.monthCellTemplate || this.cellTemplate;\n case CalendarViewEnum.year:\n return this.yearCellTemplate;\n case CalendarViewEnum.decade:\n return this.decadeCellTemplate;\n case CalendarViewEnum.century:\n return this.centuryCellTemplate;\n default:\n return null;\n }\n }\n /**\n * @hidden\n */\n emitEvent(emitter, args) {\n if (hasObservers(emitter)) {\n this.ngZone.run(() => {\n emitter.emit(args);\n });\n }\n }\n setClasses(element) {\n this.renderer.addClass(element, 'k-widget');\n this.renderer.addClass(element, 'k-calendar');\n this.renderer.addClass(element, 'k-calendar-infinite');\n }\n verifyChanges() {\n if (!isDevMode()) {\n return;\n }\n if (this.min > this.max) {\n throw new Error(`The max value should be bigger than the min. See ${MIN_DOC_LINK} and ${MAX_DOC_LINK}.`);\n }\n if (this.bottomViewEnum > this.topViewEnum) {\n throw new Error(`The topView should be greater than bottomView. See ${BOTTOM_VIEW_DOC_LINK} and ${TOP_VIEW_DOC_LINK}.`);\n }\n }\n verifyValue(candidate) {\n if (!isDevMode()) {\n return;\n }\n if (candidate && !(candidate instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK} for possible resolution.`);\n }\n }\n bindEvents() {\n const element = this.element.nativeElement;\n this.domEvents.push(this.renderer.listen(element, 'blur', this.handleBlur.bind(this)), this.renderer.listen(element, 'focus', this.handleFocus.bind(this)), this.renderer.listen(element, 'mousedown', preventDefault), this.renderer.listen(element, 'click', this.handleClick.bind(this)), this.renderer.listen(element, 'keydown', this.handleKeydown.bind(this)));\n }\n emitBlur(args) {\n if (this.pickerService) {\n this.pickerService.onBlur.emit(args);\n }\n }\n emitFocus() {\n if (this.pickerService) {\n this.pickerService.onFocus.emit();\n }\n }\n handleBlur(args) {\n this.isActive = false;\n // the injector can get the NgControl instance of the parent component (for example, the DateTimePicker)\n // and enters the zone for no reason because the parent component is still untouched\n if (!this.pickerService && requiresZoneOnBlur(this.control)) {\n this.ngZone.run(() => {\n this.onControlTouched();\n this.emitBlur(args);\n this.cdr.markForCheck();\n });\n }\n else {\n this.emitBlur(args);\n this.detectChanges();\n }\n }\n handleFocus() {\n this.isActive = true;\n if (!NgZone.isInAngularZone()) {\n this.detectChanges();\n }\n this.emitFocus();\n }\n handleClick() {\n if (!this.isActive) {\n if (this.monthView.isScrolled()) {\n this.focusedDate = cloneDate(this.focusedDate); //XXX: forces change detect\n this.detectChanges();\n }\n this.focus();\n }\n }\n handleKeydown(args) {\n // reserve the alt + arrow key commands for the picker\n const arrowKeyPressed = [Keys.ArrowUp, Keys.ArrowRight, Keys.ArrowDown, Keys.ArrowLeft].indexOf(args.keyCode) !== -1;\n if (isPresent(this.pickerService) && arrowKeyPressed && args.altKey) {\n return;\n }\n const candidate = dateInRange(this.navigator.move(this.focusedDate, this.navigator.action(args), this.activeViewEnum), this.min, this.max);\n if (!isEqual(this.focusedDate, candidate)) {\n this.focusedDate = candidate;\n this.detectChanges();\n args.preventDefault();\n }\n if (args.keyCode === Keys.Enter) {\n this.handleDateChange(this.focusedDate);\n }\n }\n detectChanges() {\n if (!this.destroyed) {\n this.cdr.detectChanges();\n }\n }\n emitSameDate() {\n if (this.pickerService) {\n this.pickerService.sameDateSelected.emit();\n }\n }\n setAriaActivedescendant() {\n if (!isPresent(this.element)) {\n return;\n }\n const focusedCellId = this.cellUID + this.focusedDate.getTime();\n this.renderer.setAttribute(this.element.nativeElement, 'aria-activedescendant', focusedCellId);\n }\n}\nCalendarComponent.ɵfac = function CalendarComponent_Factory(t) { return new (t || CalendarComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(CalendarDOMService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(ScrollSyncService), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService), ɵngcc0.ɵɵdirectiveInject(PickerService, 8)); };\nCalendarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CalendarComponent, selectors: [[\"kendo-calendar\"]], contentQueries: function CalendarComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, CellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, MonthCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, YearCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, DecadeCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, CenturyCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, WeekNumberCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, HeaderTitleTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, NavigationItemTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.cellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.monthCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.yearCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.decadeCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.centuryCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.weekNumberTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTitleTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.navigationItemTemplate = _t.first);\n } }, viewQuery: function CalendarComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(NavigationComponent, true);\n ɵngcc0.ɵɵviewQuery(ViewListComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.navigationView = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.monthView = _t.first);\n } }, hostVars: 8, hostBindings: function CalendarComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"id\", ctx.widgetId)(\"role\", ctx.widgetRole)(\"tabindex\", ctx.calendarTabIndex)(\"aria-disabled\", ctx.ariaDisabled);\n ɵngcc0.ɵɵclassProp(\"k-week-number\", ctx.weekNumber)(\"k-state-disabled\", ctx.ariaDisabled);\n } }, inputs: { id: \"id\", rangeValidation: \"rangeValidation\", disabled: \"disabled\", tabindex: \"tabindex\", navigation: \"navigation\", activeView: \"activeView\", bottomView: \"bottomView\", topView: \"topView\", weekNumber: \"weekNumber\", focusedDate: \"focusedDate\", min: \"min\", max: \"max\", value: \"value\", tabIndex: \"tabIndex\", disabledDates: \"disabledDates\", cellTemplateRef: [\"cellTemplate\", \"cellTemplateRef\"], monthCellTemplateRef: [\"monthCellTemplate\", \"monthCellTemplateRef\"], yearCellTemplateRef: [\"yearCellTemplate\", \"yearCellTemplateRef\"], decadeCellTemplateRef: [\"decadeCellTemplate\", \"decadeCellTemplateRef\"], centuryCellTemplateRef: [\"centuryCellTemplate\", \"centuryCellTemplateRef\"], weekNumberTemplateRef: [\"weekNumberTemplate\", \"weekNumberTemplateRef\"], headerTitleTemplateRef: [\"headerTitleTemplate\", \"headerTitleTemplateRef\"], navigationItemTemplateRef: [\"navigationItemTemplate\", \"navigationItemTemplateRef\"] }, outputs: { activeViewChange: \"activeViewChange\", activeViewDateChange: \"activeViewDateChange\", valueChange: \"valueChange\" }, exportAs: [\"kendo-calendar\"], features: [ɵngcc0.ɵɵProvidersFeature([\n BusViewService,\n CALENDAR_VALUE_ACCESSOR,\n CALENDAR_RANGE_VALIDATORS,\n KENDO_INPUT_PROVIDER,\n LocalizationService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.calendar'\n },\n NavigationService,\n ScrollSyncService\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 5, vars: 12, consts: [[\"kendoCalendarLocalizedMessages\", \"\", 6, \"today\"], [3, \"activeView\", \"focusedDate\", \"min\", \"max\", \"templateRef\", \"valueChange\", \"pageChange\", 4, \"ngIf\"], [3, \"activeView\", \"isActive\", \"cellTemplateRef\", \"headerTitleTemplateRef\", \"weekNumberTemplateRef\", \"cellUID\", \"min\", \"max\", \"focusedDate\", \"weekNumber\", \"value\", \"valueChange\", \"activeDateChange\", \"pageChange\"], [3, \"resize\"], [3, \"activeView\", \"focusedDate\", \"min\", \"max\", \"templateRef\", \"valueChange\", \"pageChange\"]], template: function CalendarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c6);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵtemplate(2, CalendarComponent_kendo_calendar_navigation_2_Template, 1, 5, \"kendo-calendar-navigation\", 1);\n ɵngcc0.ɵɵelementStart(3, \"kendo-calendar-viewlist\", 2);\n ɵngcc0.ɵɵlistener(\"valueChange\", function CalendarComponent_Template_kendo_calendar_viewlist_valueChange_3_listener($event) { return ctx.handleDateChange($event); })(\"activeDateChange\", function CalendarComponent_Template_kendo_calendar_viewlist_activeDateChange_3_listener($event) { return ctx.emitEvent(ctx.activeViewDateChange, $event); })(\"pageChange\", function CalendarComponent_Template_kendo_calendar_viewlist_pageChange_3_listener() { return ctx.onPageChange(); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(4, \"kendo-resize-sensor\", 3);\n ɵngcc0.ɵɵlistener(\"resize\", function CalendarComponent_Template_kendo_resize_sensor_resize_4_listener() { return ctx.onResize(); });\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n var tmp_3_0 = null;\n const currVal_3 = (tmp_3_0 = ctx.activeCellTemplate()) == null ? null : tmp_3_0.templateRef;\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.navigation);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"activeView\", ctx.activeViewEnum)(\"isActive\", ctx.isActive)(\"cellTemplateRef\", currVal_3)(\"headerTitleTemplateRef\", ctx.headerTitleTemplate == null ? null : ctx.headerTitleTemplate.templateRef)(\"weekNumberTemplateRef\", ctx.weekNumberTemplate == null ? null : ctx.weekNumberTemplate.templateRef)(\"cellUID\", ctx.cellUID)(\"min\", ctx.min)(\"max\", ctx.max)(\"focusedDate\", ctx.focusedDate)(\"weekNumber\", ctx.weekNumber)(\"value\", ctx.value);\n } }, directives: function () { return [CalendarLocalizedMessagesDirective, ɵngcc2.NgIf, ViewListComponent, ɵngcc3.ResizeSensorComponent, NavigationComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nCalendarComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: CalendarDOMService },\n { type: ElementRef },\n { type: NavigationService },\n { type: Renderer2 },\n { type: ChangeDetectorRef },\n { type: NgZone },\n { type: Injector },\n { type: ScrollSyncService },\n { type: DisabledDatesService },\n { type: PickerService, decorators: [{ type: Optional }] }\n];\nCalendarComponent.propDecorators = {\n id: [{ type: Input }],\n focusedDate: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n value: [{ type: Input }],\n disabled: [{ type: Input }],\n tabindex: [{ type: Input }],\n tabIndex: [{ type: Input }],\n disabledDates: [{ type: Input }],\n navigation: [{ type: Input }],\n activeView: [{ type: Input }],\n bottomView: [{ type: Input }],\n topView: [{ type: Input }],\n weekNumber: [{ type: Input }, { type: HostBinding, args: ['class.k-week-number',] }],\n activeViewChange: [{ type: Output }],\n activeViewDateChange: [{ type: Output }],\n valueChange: [{ type: Output }],\n cellTemplate: [{ type: ContentChild, args: [CellTemplateDirective, { static: true },] }],\n cellTemplateRef: [{ type: Input, args: ['cellTemplate',] }],\n monthCellTemplate: [{ type: ContentChild, args: [MonthCellTemplateDirective, { static: true },] }],\n monthCellTemplateRef: [{ type: Input, args: ['monthCellTemplate',] }],\n yearCellTemplate: [{ type: ContentChild, args: [YearCellTemplateDirective, { static: true },] }],\n yearCellTemplateRef: [{ type: Input, args: ['yearCellTemplate',] }],\n decadeCellTemplate: [{ type: ContentChild, args: [DecadeCellTemplateDirective, { static: true },] }],\n decadeCellTemplateRef: [{ type: Input, args: ['decadeCellTemplate',] }],\n centuryCellTemplate: [{ type: ContentChild, args: [CenturyCellTemplateDirective, { static: true },] }],\n centuryCellTemplateRef: [{ type: Input, args: ['centuryCellTemplate',] }],\n weekNumberTemplate: [{ type: ContentChild, args: [WeekNumberCellTemplateDirective, { static: true },] }],\n weekNumberTemplateRef: [{ type: Input, args: ['weekNumberTemplate',] }],\n headerTitleTemplate: [{ type: ContentChild, args: [HeaderTitleTemplateDirective, { static: true },] }],\n headerTitleTemplateRef: [{ type: Input, args: ['headerTitleTemplate',] }],\n navigationItemTemplate: [{ type: ContentChild, args: [NavigationItemTemplateDirective, { static: true },] }],\n navigationItemTemplateRef: [{ type: Input, args: ['navigationItemTemplate',] }],\n navigationView: [{ type: ViewChild, args: [NavigationComponent,] }],\n monthView: [{ type: ViewChild, args: [ViewListComponent,] }],\n widgetId: [{ type: HostBinding, args: ['attr.id',] }],\n widgetRole: [{ type: HostBinding, args: ['attr.role',] }],\n calendarTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],\n ariaDisabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.k-state-disabled',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-calendar',\n providers: [\n BusViewService,\n CALENDAR_VALUE_ACCESSOR,\n CALENDAR_RANGE_VALIDATORS,\n KENDO_INPUT_PROVIDER,\n LocalizationService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.calendar'\n },\n NavigationService,\n ScrollSyncService\n ],\n selector: 'kendo-calendar',\n template: `\n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: CalendarDOMService }, { type: ɵngcc0.ElementRef }, { type: NavigationService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Injector }, { type: ScrollSyncService }, { type: DisabledDatesService }, { type: PickerService, decorators: [{\n type: Optional\n }] }]; }, { id: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], disabled: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], navigation: [{\n type: Input\n }], activeView: [{\n type: Input\n }], bottomView: [{\n type: Input\n }], topView: [{\n type: Input\n }], weekNumber: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['class.k-week-number']\n }], activeViewChange: [{\n type: Output\n }], activeViewDateChange: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], focusedDate: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], value: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], disabledDates: [{\n type: Input\n }], cellTemplateRef: [{\n type: Input,\n args: ['cellTemplate']\n }], cellTemplate: [{\n type: ContentChild,\n args: [CellTemplateDirective, { static: true }]\n }], monthCellTemplateRef: [{\n type: Input,\n args: ['monthCellTemplate']\n }], monthCellTemplate: [{\n type: ContentChild,\n args: [MonthCellTemplateDirective, { static: true }]\n }], yearCellTemplateRef: [{\n type: Input,\n args: ['yearCellTemplate']\n }], yearCellTemplate: [{\n type: ContentChild,\n args: [YearCellTemplateDirective, { static: true }]\n }], decadeCellTemplateRef: [{\n type: Input,\n args: ['decadeCellTemplate']\n }], decadeCellTemplate: [{\n type: ContentChild,\n args: [DecadeCellTemplateDirective, { static: true }]\n }], centuryCellTemplateRef: [{\n type: Input,\n args: ['centuryCellTemplate']\n }], centuryCellTemplate: [{\n type: ContentChild,\n args: [CenturyCellTemplateDirective, { static: true }]\n }], weekNumberTemplateRef: [{\n type: Input,\n args: ['weekNumberTemplate']\n }], weekNumberTemplate: [{\n type: ContentChild,\n args: [WeekNumberCellTemplateDirective, { static: true }]\n }], headerTitleTemplateRef: [{\n type: Input,\n args: ['headerTitleTemplate']\n }], headerTitleTemplate: [{\n type: ContentChild,\n args: [HeaderTitleTemplateDirective, { static: true }]\n }], navigationItemTemplateRef: [{\n type: Input,\n args: ['navigationItemTemplate']\n }], navigationItemTemplate: [{\n type: ContentChild,\n args: [NavigationItemTemplateDirective, { static: true }]\n }], widgetId: [{\n type: HostBinding,\n args: ['attr.id']\n }], widgetRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], calendarTabIndex: [{\n type: HostBinding,\n args: ['attr.tabindex']\n }], ariaDisabled: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }, {\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], navigationView: [{\n type: ViewChild,\n args: [NavigationComponent]\n }], monthView: [{\n type: ViewChild,\n args: [ViewListComponent]\n }] }); })();\n\n/**\n * @hidden\n */\nconst incompleteDateValidator = () => {\n return (control, incomplete) => {\n if (!isPresent(control.value) && incomplete) {\n return { incompleteDate: true };\n }\n else {\n return null;\n }\n };\n};\n\n/**\n * @hidden\n */\nvar Arrow;\n(function (Arrow) {\n Arrow[Arrow[\"Up\"] = 0] = \"Up\";\n Arrow[Arrow[\"Down\"] = 1] = \"Down\";\n Arrow[Arrow[\"None\"] = 2] = \"None\";\n})(Arrow || (Arrow = {}));\n\n/* tslint:disable:max-line-length */\nconst MIN_DOC_LINK$1 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/DateInputComponent/#toc-min';\nconst MAX_DOC_LINK$1 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/DateInputComponent/#toc-max';\nconst VALUE_DOC_LINK$1 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/dateinput/#toc-using-with-json';\nconst DATE_PART_REGEXP = /year|month|/;\nconst TIME_PART_REGEXP = /hour|minute|second|millisecond/;\nconst SHORT_PATTERN_LENGTH_REGEXP = /d|M|H|h|m|s/;\nconst padZero = (length) => new Array(Math.max(length, 0)).fill('0').join('');\nconst unpadZero = (value) => value.replace(/^0*/, '');\nclass Mask {\n constructor() {\n this.symbols = \"\";\n }\n}\nclass KendoDate {\n constructor(intl, formatPlaceholder, format, value) {\n this.intl = intl;\n this.formatPlaceholder = formatPlaceholder;\n this.format = format;\n this.year = true;\n this.month = true;\n this.date = true;\n this.hours = true;\n this.minutes = true;\n this.seconds = true;\n this.milliseconds = true;\n this.leadingZero = null;\n this.monthNames = null;\n this.typedMonthPart = \"\";\n this.value = getDate(new Date());\n this.knownParts = \"adHhmMsEy\";\n this.symbols = {\n \"E\": \"E\",\n \"H\": \"H\",\n \"M\": \"M\",\n \"a\": \"a\",\n \"d\": \"d\",\n \"h\": \"h\",\n \"m\": \"m\",\n \"s\": \"s\",\n \"y\": \"y\"\n };\n this.monthNames = this.allFormatedMonths();\n this.dayPeriods = this.allDayPeriods();\n if (!value) {\n this.value = getDate(new Date());\n const sampleFormat = this.dateFormatString(this.value, this.format).symbols;\n for (let i = 0; i < sampleFormat.length; i++) {\n this.setExisting(sampleFormat[i], false);\n }\n }\n else {\n this.value = cloneDate(value);\n }\n }\n hasValue() {\n const pred = (a, p) => a || p.type !== 'literal' && p.type !== 'dayperiod' && this.getExisting(p.pattern[0]);\n return this.intl.splitDateFormat(this.format).reduce(pred, false);\n }\n getDateObject() {\n for (let i = 0; i < this.knownParts.length; i++) {\n if (!this.getExisting(this.knownParts[i])) {\n return null;\n }\n }\n return cloneDate(this.value);\n }\n getTextAndFormat() {\n return this.merge(this.intl.formatDate(this.value, this.format), this.dateFormatString(this.value, this.format));\n }\n getExisting(symbol) {\n switch (symbol) {\n case \"y\": return this.year;\n case \"M\":\n case \"L\": return this.month;\n case \"d\": return this.date;\n case \"E\": return this.date && this.month && this.year;\n case \"h\":\n case \"H\": return this.hours;\n case \"m\": return this.minutes;\n case \"s\": return this.seconds;\n default: return true;\n }\n }\n setExisting(symbol, value) {\n switch (symbol) {\n case \"y\":\n this.year = value;\n if (value === false) {\n this.value.setFullYear(2000);\n }\n break; //allow 2/29 dates\n case \"M\":\n this.month = value;\n if (value === false) {\n this.value.setMonth(0);\n }\n break; //make sure you can type 31 at day part\n case \"d\":\n this.date = value;\n break;\n case \"h\":\n case \"H\":\n this.hours = value;\n break;\n case \"m\":\n this.minutes = value;\n break;\n case \"s\":\n this.seconds = value;\n break;\n default: return;\n }\n }\n modifyPart(symbol, offset) {\n let newValue = cloneDate(this.value);\n switch (symbol) {\n case \"y\":\n newValue.setFullYear(newValue.getFullYear() + offset);\n break;\n case \"M\":\n newValue = addMonths(this.value, offset);\n break;\n case \"d\":\n case \"E\":\n newValue.setDate(newValue.getDate() + offset);\n break;\n case \"h\":\n case \"H\":\n newValue.setHours(newValue.getHours() + offset);\n break;\n case \"m\":\n newValue.setMinutes(newValue.getMinutes() + offset);\n break;\n case \"s\":\n newValue.setSeconds(newValue.getSeconds() + offset);\n break;\n case \"a\":\n newValue.setHours(newValue.getHours() + (12 * offset));\n break;\n default: break;\n }\n if (newValue.getFullYear() > 0) {\n this.setExisting(symbol, true);\n this.value = newValue;\n }\n }\n parsePart(symbol, currentChar, resetSegmentValue) {\n if (!currentChar) {\n this.resetLeadingZero();\n this.setExisting(symbol, false);\n return { value: null, switchToNext: false };\n }\n let baseDate = this.intl.formatDate(this.value, this.format);\n let dateParts = this.dateFormatString(this.value, this.format);\n let baseFormat = dateParts.symbols;\n let replaced = false;\n let prefix = \"\";\n let current = \"\";\n let suffix = \"\";\n for (let i = 0; i < baseDate.length; i++) {\n if (baseFormat[i] === symbol) {\n current += this.getExisting(symbol) ? baseDate[i] : \"0\";\n replaced = true;\n }\n else if (!replaced) {\n prefix += baseDate[i];\n }\n else {\n suffix += baseDate[i];\n }\n }\n let currentMaxLength = current.length - 3;\n let parsedDate = null;\n const month = this.matchMonth(currentChar);\n const dayPeriod = this.matchDayPeriod(currentChar, symbol);\n const isZeroCurrentChar = currentChar === '0';\n const leadingZero = (this.leadingZero || {})[symbol] || 0;\n if (isZeroCurrentChar) {\n let valueNumber = parseInt(resetSegmentValue ? currentChar : current + currentChar, 10);\n if (valueNumber === 0 && !this.isAbbrMonth(dateParts.partMap, symbol)) {\n this.incrementLeadingZero(symbol);\n }\n }\n else {\n this.resetLeadingZero();\n }\n for (let i = Math.max(0, currentMaxLength); i <= current.length; i++) {\n let middle = resetSegmentValue ? currentChar : (current.substring(i) + currentChar);\n let middleNumber = parseInt(middle, 10);\n parsedDate = this.intl.parseDate(prefix + middle + suffix, this.format);\n if (!parsedDate && !isNaN(middleNumber) && !isNaN(parseInt(currentChar, 10))) {\n if (symbol === 'M' && !month) {\n const monthNumber = middleNumber - 1;\n if (monthNumber > -1 && monthNumber < 12) {\n parsedDate = cloneDate(this.value);\n parsedDate.setMonth(monthNumber);\n if (parsedDate.getMonth() !== monthNumber) {\n parsedDate = lastDayOfMonth(addMonths(parsedDate, -1));\n }\n }\n }\n if (symbol === 'y') {\n parsedDate = createDate(parseInt(middle, 10), this.month ? this.value.getMonth() : 0, this.date ? this.value.getDate() : 1, this.hours ? this.value.getHours() : 0, this.minutes ? this.value.getMinutes() : 0, this.seconds ? this.value.getSeconds() : 0, this.milliseconds ? this.value.getMilliseconds() : 0);\n if (this.date && parsedDate.getDate() !== this.value.getDate()) {\n parsedDate = lastDayOfMonth(addMonths(parsedDate, -1));\n }\n }\n }\n if (parsedDate) {\n //move to next segment if the part will overflow with next char\n //when start from empty date (01, then 010), padded zeros should be trimmed\n const patternValue = this.partPattern(dateParts.partMap, symbol).pattern;\n const peekDate = this.intl.parseDate(`${prefix}${this.peek(middle, patternValue)}${suffix}`, this.format);\n const patternLength = this.patternLength(patternValue) || patternValue.length;\n const patternSatisfied = (leadingZero + (unpadZero(middle) || currentChar).length) >= patternLength;\n const switchToNext = peekDate === null || patternSatisfied;\n this.value = parsedDate;\n this.setExisting(symbol, true);\n return { value: this.value, switchToNext: switchToNext };\n }\n }\n if (month) {\n parsedDate = this.intl.parseDate(prefix + month + suffix, this.format);\n if (parsedDate) {\n this.value = parsedDate;\n this.setExisting(symbol, true);\n return { value: this.value, switchToNext: false };\n }\n }\n if (dayPeriod) {\n parsedDate = this.intl.parseDate(prefix + dayPeriod + suffix, this.format);\n if (parsedDate) {\n this.value = parsedDate;\n return { value: this.value, switchToNext: true };\n }\n }\n if (isZeroCurrentChar) {\n this.setExisting(symbol, false);\n }\n return { value: null, switchToNext: false };\n }\n resetLeadingZero() {\n const hasLeadingZero = this.leadingZero !== null;\n this.setLeadingZero(null);\n return hasLeadingZero;\n }\n setLeadingZero(leadingZero) {\n this.leadingZero = leadingZero;\n }\n incrementLeadingZero(symbol) {\n const leadingZero = this.leadingZero || {};\n leadingZero[symbol] = (leadingZero[symbol] || 0) + 1;\n this.leadingZero = leadingZero;\n }\n isAbbrMonth(parts, symbol) {\n const pattern = this.partPattern(parts, symbol);\n return pattern.type === 'month' && pattern.names;\n }\n partPattern(parts, symbol) {\n return parts.filter((part) => part.pattern.indexOf(symbol) !== -1)[0];\n }\n peek(value, pattern) {\n const peekValue = unpadZero(value) + '0';\n return padZero(pattern.length - peekValue.length) + peekValue;\n }\n matchMonth(typedChar) {\n this.typedMonthPart += typedChar.toLowerCase();\n if (!this.monthNames) {\n return \"\";\n }\n while (this.typedMonthPart.length > 0) {\n for (let i = 0; i < this.monthNames.length; i++) {\n if (this.monthNames[i].toLowerCase().indexOf(this.typedMonthPart) === 0) {\n return this.monthNames[i];\n }\n }\n const monthAsNum = parseInt(this.typedMonthPart, 10);\n if (monthAsNum >= 1 && monthAsNum <= 12 && monthAsNum.toString() === this.typedMonthPart /*ensure they exact match*/) {\n return this.monthNames[monthAsNum - 1];\n }\n this.typedMonthPart = this.typedMonthPart.substring(1, this.typedMonthPart.length);\n }\n return \"\";\n }\n matchDayPeriod(typedChar, symbol) {\n const lowerChart = String(typedChar).toLowerCase();\n if (symbol === 'a' && this.dayPeriods) {\n if (this.dayPeriods.am.toLowerCase().startsWith(lowerChart)) {\n return this.dayPeriods.am;\n }\n else if (this.dayPeriods.pm.toLowerCase().startsWith(lowerChart)) {\n return this.dayPeriods.pm;\n }\n }\n return '';\n }\n allFormatedMonths() {\n const dateFormatParts = this.intl.splitDateFormat(this.format);\n for (let i = 0; i < dateFormatParts.length; i++) {\n if (dateFormatParts[i].type === \"month\" && dateFormatParts[i].names) {\n return this.intl.dateFormatNames(dateFormatParts[i].names);\n }\n }\n return null;\n }\n allDayPeriods() {\n const dateFormatParts = this.intl.splitDateFormat(this.format);\n for (let i = 0; i < dateFormatParts.length; i++) {\n if (dateFormatParts[i].type === \"dayperiod\" && dateFormatParts[i].names) {\n return this.intl.dateFormatNames(dateFormatParts[i].names);\n }\n }\n return null;\n }\n patternLength(pattern) {\n if (pattern[0] === 'y') {\n return 4;\n }\n if (SHORT_PATTERN_LENGTH_REGEXP.test(pattern)) {\n return 2;\n }\n return 0;\n }\n //TODO: REMOVE!\n dateFormatString(date, format) {\n const dateFormatParts = this.intl.splitDateFormat(format);\n const parts = [];\n const partMap = [];\n for (let i = 0; i < dateFormatParts.length; i++) {\n let partLength = this.intl.formatDate(date, { pattern: dateFormatParts[i].pattern }).length;\n while (partLength > 0) {\n parts.push(this.symbols[dateFormatParts[i].pattern[0]] || \"_\");\n partMap.push(dateFormatParts[i]);\n partLength--;\n }\n }\n const returnValue = new Mask();\n returnValue.symbols = parts.join(\"\");\n returnValue.partMap = partMap;\n return returnValue;\n }\n merge(text, mask) {\n // Important: right to left.\n let resultText = \"\";\n let resultFormat = \"\";\n let format = mask.symbols;\n for (let r = format.length - 1; r >= 0; r--) {\n if (this.knownParts.indexOf(format[r]) === -1 || this.getExisting(format[r])) {\n resultText = text[r] + resultText;\n resultFormat = format[r] + resultFormat;\n }\n else {\n const currentSymbol = format[r];\n while (r >= 0 && currentSymbol === format[r]) {\n r--;\n }\n r++;\n if (this.leadingZero && this.leadingZero[currentSymbol]) {\n resultText = '0' + resultText;\n }\n else {\n resultText = this.dateFieldName(mask.partMap[r]) + resultText;\n }\n while (resultFormat.length < resultText.length) {\n resultFormat = format[r] + resultFormat;\n }\n }\n }\n return [resultText, resultFormat];\n }\n dateFieldName(part) {\n const formatPlaceholder = this.formatPlaceholder || 'wide';\n if (formatPlaceholder[part.type]) {\n return formatPlaceholder[part.type];\n }\n if (formatPlaceholder === 'formatPattern') {\n return part.pattern;\n }\n return this.intl.dateFieldName(Object.assign(part, { nameType: formatPlaceholder }));\n }\n}\n/**\n * Represents the [Kendo UI DateInput component for Angular]({% slug overview_dateinput %}#toc-basic-usage).\n */\nclass DateInputComponent {\n constructor(cdr, intl, renderer, element, ngZone, injector, localization, pickerService) {\n this.cdr = cdr;\n this.intl = intl;\n this.renderer = renderer;\n this.element = element;\n this.ngZone = ngZone;\n this.injector = injector;\n this.localization = localization;\n this.pickerService = pickerService;\n /**\n * @hidden\n */\n this.focusableId = `k-${guid()}`;\n /**\n * Sets or gets the `disabled` property of the DateInput and\n * determines whether the component is active\n * ([see example]({% slug disabled_dateinput %})).\n */\n this.disabled = false;\n /**\n * Sets or gets the read-only state of the DateInput\n * ([see example]({% slug readonly_dateinput %})).\n */\n this.readonly = false;\n /**\n * Sets the title of the input element of the DateInput.\n */\n this.title = \"\";\n /**\n * Sets or gets the `tabIndex` property of the DateInput.\n * .\n */\n this.tabindex = 0;\n /**\n * @hidden\n */\n this.role = 'spinbutton';\n /**\n * @hidden\n */\n this.ariaReadOnly = false;\n /**\n * Specifies the date format that is used to display the input value\n * ([see example]({% slug formats_dateinput %})).\n */\n this.format = \"d\";\n /**\n * Specifies the hint the DateInput displays when its value is `null`.\n * For more information, refer to the article on\n * [placeholders]({% slug placeholders_dateinput %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n this.placeholder = null;\n /**\n * Determines whether the built-in min or max validators are to be enforced when a form is being validated.\n */\n this.rangeValidation = true;\n /**\n * @hidden\n * Based on the min and max values, specifies whether the value will be auto-corrected while typing.\n */\n this.autoCorrect = false;\n /**\n * Determines whether the built-in validation for incomplete dates is to be enforced when a form is being validated.\n */\n this.incompleteDateValidation = false;\n /**\n * Specifies whether the **Up** and **Down** spin buttons will be rendered.\n * For more information, refer to the article on\n * [spinner buttons]({% slug spinbuttons_dateinput %}).\n */\n this.spinners = false;\n /**\n * @hidden\n */\n this.isPopupOpen = false;\n /**\n * @hidden\n */\n this.hasPopup = false;\n /**\n * Fires each time the user selects a new value.\n * For more information, refer to the section on\n * [events]({% slug overview_dateinput %}#toc-events).\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires each time the user selects a new value.\n * For more information, refer to the section on\n * [events]({% slug overview_dateinput %}#toc-events).\n */\n this.valueUpdate = new EventEmitter();\n /**\n * Fires each time the user focuses the input element.\n * For more information, refer to the section on\n * [events]({% slug overview_dateinput %}#toc-events).\n *\n * > To wire the event programmatically, use the `onFocus` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleFocus(): void {\n * console.log(\"Component is focused\");\n * }\n * }\n * ```\n *\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the input element gets blurred.\n * For more information, refer to the section on\n * [events]({% slug overview_dateinput %}#toc-events).\n *\n * > To wire the event programmatically, use the `onBlur` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleBlur(): void {\n * console.log(\"Component is blurred\");\n * }\n * }\n * ```\n *\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n this.arrow = Arrow;\n this.arrowDirection = Arrow.None;\n this.formatSections = { date: false, time: false };\n this.hasMousedown = false;\n this.focusedPriorToMousedown = false;\n /**\n * @hidden\n */\n this.isDateIncomplete = false;\n this.currentValue = \"\";\n this.currentFormat = \"\";\n this.backspace = false;\n this.resetSegmentValue = true;\n this.minValidator = noop;\n this.maxValidator = noop;\n this.incompleteValidator = noop;\n this._value = null;\n this._active = false;\n this.kendoDate = null;\n this.paste = false;\n this.domEvents = [];\n this.onControlChange = noop;\n this.onControlTouched = noop;\n this.onValidatorChange = noop;\n this.symbolsMap = this.dateSymbolMap();\n this.updateFormatSections();\n if (this.pickerService) {\n this.pickerService.input = this;\n }\n }\n /**\n * @hidden\n */\n set tabIndex(tabIndex) {\n this.tabindex = tabIndex;\n }\n get tabIndex() {\n return this.tabindex;\n }\n /**\n * Specifies the value of the DateInput component.\n *\n * > The `value` has to be a valid [JavaScript `Date`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) instance.\n */\n set value(value) {\n this.verifyValue(value);\n if (this.autoCorrect && !isInRange(value, this.min, this.max)) {\n return;\n }\n this._value = cloneDate(value);\n this.valueUpdate.emit(cloneDate(value));\n }\n get value() {\n return this._value;\n }\n get wrapperClass() {\n return true;\n }\n get disabledClass() {\n return this.disabled;\n }\n get inputElement() {\n return this.dateInput ? this.dateInput.nativeElement : null;\n }\n get inputValue() {\n return (this.inputElement || {}).value || '';\n }\n get isActive() {\n return this._active;\n }\n set isActive(value) {\n this._active = value;\n if (!this.wrap) {\n return;\n }\n if (!isPresent(this.pickerService)) {\n const element = this.wrap.nativeElement;\n if (value) {\n this.renderer.addClass(element, 'k-state-focused');\n }\n else {\n this.renderer.removeClass(element, 'k-state-focused');\n }\n }\n }\n /**\n * @hidden\n * Used by the TextBoxContainer to determine if the component is empty\n */\n isEmpty() {\n return !this.currentValue || !String(this.currentValue).trim();\n }\n /**\n * @hidden\n */\n containsElement(element) {\n return Boolean(closest(element, node => node === this.element.nativeElement));\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n this.verifyRange();\n if (changes.min || changes.max || changes.rangeValidation || changes.incompleteDateValidation) {\n this.minValidator = this.rangeValidation ? minValidator(this.min) : noop;\n this.maxValidator = this.rangeValidation ? maxValidator(this.max) : noop;\n this.incompleteValidator = this.incompleteDateValidation ? incompleteDateValidator() : noop;\n this.onValidatorChange();\n }\n if (changes.format) {\n this.symbolsMap = this.dateSymbolMap();\n this.updateFormatSections();\n }\n const isEqualToKendoDate = this.kendoDate && isEqual(this.value, this.kendoDate.getDateObject());\n if (changes.format || !isEqualToKendoDate || changes.placeholder) {\n this.kendoDate = this.getKendoDate(this.value);\n this.updateElementValue(this.isActive);\n }\n }\n ngOnDestroy() {\n if (this.intlSubscription) {\n this.intlSubscription.unsubscribe();\n }\n if (this.pickerService) {\n this.pickerService.input = null;\n }\n this.domEvents.forEach(unbindCallback => unbindCallback());\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.minValidator(control) || this.maxValidator(control) || this.incompleteValidator(control, this.isDateIncomplete);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.kendoDate = this.getKendoDate(this.value);\n this.updateElementValue();\n this.intlSubscription = this.intl.changes.subscribe(this.intlChange.bind(this));\n this.ngControl = this.injector.get(NgControl, null);\n if (this.element) {\n this.renderer.removeAttribute(this.element.nativeElement, 'tabindex');\n this.ngZone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n /**\n * @hidden\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n //ngModel binding\n /**\n * @hidden\n */\n writeValue(value) {\n this.verifyValue(value);\n this.kendoDate = this.getKendoDate(value);\n this.value = cloneDate(value);\n this.updateElementValue(this.isActive);\n }\n /**\n * @hidden\n */\n triggerChange() {\n const value = this.kendoDate.getDateObject();\n if (+value !== +this.value) {\n this.value = cloneDate(value);\n this.notify();\n }\n }\n /**\n * @hidden\n */\n notify() {\n this.ngZone.run(() => {\n this.onControlChange(cloneDate(this.value));\n this.valueChange.emit(cloneDate(this.value));\n });\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * Focuses the DateInput component.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n const input = this.inputElement;\n if (input) {\n input.focus();\n this.selectDateSegment(this.currentFormat[0]);\n }\n }\n /**\n * Blurs the DateInput component.\n */\n blur() {\n const input = this.inputElement;\n if (input) {\n input.blur();\n }\n }\n /**\n * @hidden\n */\n handleButtonClick(offset) {\n this.arrowDirection = Arrow.None;\n this.modifyDateSegmentValue(offset);\n }\n /**\n * @hidden\n */\n modifyDateSegmentValue(offset) {\n const caret = this.caret();\n const symbol = this.currentFormat[caret[0]];\n const step = (this.steps || {})[this.symbolsMap[symbol]] || 1;\n this.kendoDate.modifyPart(symbol, offset * step);\n this.putDateInRange();\n this.updateElementValue(this.isActive);\n this.triggerChange();\n this.selectDateSegment(symbol);\n this.updateIncompleteValidationStatus();\n }\n /**\n * @hidden\n */\n switchDateSegment(offset) {\n const caret = this.caret();\n if (this.kendoDate.resetLeadingZero()) {\n this.updateElementValue(this.isActive);\n }\n if (caret[0] < caret[1] && this.currentFormat[caret[0]] !== this.currentFormat[caret[1] - 1]) {\n this.selectNearestSegment(offset > 0 ? caret[0] : caret[1] - 1);\n this.resetSegmentValue = true;\n return true;\n }\n const previousFormatSymbol = this.currentFormat[caret[0]];\n let a = caret[0] + offset;\n while (a > 0 && a < this.currentFormat.length) {\n if (this.currentFormat[a] !== previousFormatSymbol &&\n this.currentFormat[a] !== \"_\") {\n break;\n }\n a += offset;\n }\n if (this.currentFormat[a] === \"_\") {\n //there is not known symbol found\n return false;\n }\n let b = a;\n while (b >= 0 && b < this.currentFormat.length) {\n if (this.currentFormat[b] !== this.currentFormat[a]) {\n break;\n }\n b += offset;\n }\n if (a > b && (b + 1 !== caret[0] || a + 1 !== caret[1])) {\n this.caret(b + 1, a + 1);\n this.resetSegmentValue = true;\n return true;\n }\n else if (a < b && (a !== caret[0] || b !== caret[1])) {\n this.caret(a, b);\n this.resetSegmentValue = true;\n return true;\n }\n return false;\n }\n /**\n * @hidden\n */\n selectDateSegment(symbol) {\n let begin = -1;\n let end = 0;\n for (let i = 0; i < this.currentFormat.length; i++) {\n if (this.currentFormat[i] === symbol) {\n end = i + 1;\n if (begin === -1) {\n begin = i;\n }\n }\n }\n if (begin < 0) {\n begin = 0;\n }\n this.caret(0, 0);\n this.caret(begin, end);\n }\n /**\n * @hidden\n */\n handleClick() {\n this.hasMousedown = false;\n if (this.isActive) {\n const selectionPresent = this.inputElement.selectionStart !== this.inputElement.selectionEnd;\n const placeholderToggled = isPresent(this.placeholder) && !this.kendoDate.hasValue() && !this.focusedPriorToMousedown;\n // focus first segment if the user hasn't selected something during mousedown and if the placeholder was just toggled\n const selectFirstSegment = !selectionPresent && placeholderToggled;\n const index = selectFirstSegment ? 0 : this.caret()[0];\n this.selectNearestSegment(index);\n }\n }\n /**\n * @hidden\n */\n handleDragAndDrop(args) {\n args.preventDefault();\n }\n /**\n * @hidden\n */\n handleMousedown() {\n this.hasMousedown = true;\n this.focusedPriorToMousedown = this.isActive;\n }\n /**\n * @hidden\n */\n handleFocus(args) {\n this.isActive = true;\n this.updateElementValue();\n if (!this.hasMousedown) {\n this.caret(0, this.inputValue.length);\n }\n this.hasMousedown = false;\n if (hasObservers(this.onFocus)) {\n this.ngZone.run(() => {\n this.emitFocus(args);\n });\n }\n else {\n this.emitFocus(args);\n }\n }\n /**\n * @hidden\n */\n handleBlur(args) {\n this.isActive = false;\n this.resetSegmentValue = true;\n this.kendoDate.resetLeadingZero();\n this.updateElementValue();\n if (hasObservers(this.onBlur) || requiresZoneOnBlur(this.ngControl)) {\n this.ngZone.run(() => {\n this.onControlTouched();\n this.emitBlur(args);\n this.cdr.markForCheck();\n });\n }\n else {\n this.emitBlur(args);\n }\n }\n getKendoDate(value) {\n const { leadingZero } = (this.kendoDate || {}) || null;\n const kendoDate = new KendoDate(this.intl, this.formatPlaceholder, this.format, value);\n kendoDate.setLeadingZero(this.isActive ? leadingZero : null);\n return kendoDate;\n }\n dateSymbolMap() {\n const reducer = (map$$1, part) => {\n map$$1[part.pattern[0]] = part.type;\n return map$$1;\n };\n return this.intl.splitDateFormat(this.format).reduce(reducer, {});\n }\n updateElementValue(isActive) {\n const start = this.caret()[0]; //XXX: get caret position before input is updated\n const texts = this.kendoDate.getTextAndFormat();\n const showPlaceholder = !this.isActive && isPresent(this.placeholder) && !this.kendoDate.hasValue();\n const input = this.inputElement;\n this.currentFormat = texts[1];\n this.currentValue = !showPlaceholder ? texts[0] : '';\n this.renderer.setProperty(input, \"value\", this.currentValue);\n if (input.placeholder !== this.placeholder) {\n this.renderer.setProperty(input, \"placeholder\", this.placeholder);\n }\n if (isActive) {\n this.selectNearestSegment(start);\n }\n }\n caret(start, end = start) {\n const isPosition = start !== undefined;\n let returnValue = [start, start];\n const element = this.inputElement;\n if (isPosition && (this.disabled || this.readonly)) {\n return undefined;\n }\n try {\n if (element.selectionStart !== undefined) {\n if (isPosition) {\n if (isDocumentAvailable() && document.activeElement !== element) {\n element.focus();\n }\n element.setSelectionRange(start, end);\n }\n returnValue = [element.selectionStart, element.selectionEnd];\n }\n }\n catch (e) {\n returnValue = [];\n }\n return returnValue;\n }\n selectNearestSegment(index) {\n // Finds the nearest (in both directions) known part.\n for (let i = index, j = index - 1; i < this.currentFormat.length || j >= 0; i++, j--) {\n if (i < this.currentFormat.length && this.currentFormat[i] !== \"_\") {\n this.selectDateSegment(this.currentFormat[i]);\n return;\n }\n if (j >= 0 && this.currentFormat[j] !== \"_\") {\n this.selectDateSegment(this.currentFormat[j]);\n return;\n }\n }\n }\n verifyRange() {\n if (!isDevMode()) {\n return;\n }\n if (!isValidRange(this.min, this.max)) {\n throw new Error(`The max value should be bigger than the min. See ${MIN_DOC_LINK$1} and ${MAX_DOC_LINK$1}.`);\n }\n }\n verifyValue(value) {\n if (!isDevMode()) {\n return;\n }\n if (value && !(value instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK$1} for possible resolution.`);\n }\n }\n putDateInRange() {\n const currentDate = this.kendoDate.getDateObject();\n const candidate = dateInRange(currentDate, this.min, this.max);\n if (this.autoCorrect && !isEqual(currentDate, candidate)) {\n this.kendoDate = this.getKendoDate(candidate);\n }\n }\n updateFormatSections() {\n this.formatSections = this.intl.splitDateFormat(this.format)\n .reduce(({ date, time }, p) => {\n return {\n date: date || DATE_PART_REGEXP.test(p.type),\n time: time || TIME_PART_REGEXP.test(p.type)\n };\n }, { date: false, time: false });\n }\n intlChange() {\n this.updateFormatSections();\n this.kendoDate = this.getKendoDate(this.value);\n this.updateElementValue(this.isActive);\n }\n updateOnPaste() {\n const value = this.intl.parseDate(this.inputValue, this.format) || this.value;\n const notify = +value !== +this.value;\n this.writeValue(value);\n if (notify) {\n this.notify();\n }\n }\n bindEvents() {\n const element = this.element.nativeElement;\n const mousewheelHandler = this.handleMouseWheel.bind(this);\n this.domEvents.push(this.renderer.listen(element, 'DOMMouseScroll', mousewheelHandler), this.renderer.listen(element, 'mousewheel', mousewheelHandler), this.renderer.listen(element, 'keydown', this.handleKeydown.bind(this)), this.renderer.listen(element, 'paste', this.handlePaste.bind(this)), this.renderer.listen(element, 'input', this.handleInput.bind(this)));\n }\n handleMouseWheel(event) {\n if (this.disabled || this.readonly || !this.isActive) {\n return;\n }\n event = window.event || event;\n if (event.shiftKey) {\n this.switchDateSegment((event.wheelDelta || -event.detail) > 0 ? -1 : 1);\n }\n else {\n this.modifyDateSegmentValue((event.wheelDelta || -event.detail) > 0 ? 1 : -1);\n }\n event.returnValue = false;\n if (event.preventDefault) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n }\n handlePaste() {\n this.paste = true;\n }\n handleKeydown(event) {\n if (this.disabled || this.readonly || event.altKey || event.ctrlKey || event.metaKey) {\n return;\n }\n if (event.keyCode === Keys.Tab) {\n const moved = this.switchDateSegment(event.shiftKey ? -1 : 1);\n if (moved) {\n event.preventDefault();\n }\n return;\n }\n if (event.keyCode === Keys.Backspace) {\n this.backspace = true;\n return;\n }\n switch (event.keyCode) {\n case Keys.ArrowDown:\n this.modifyDateSegmentValue(-1);\n break;\n case Keys.ArrowUp:\n this.modifyDateSegmentValue(1);\n break;\n case Keys.ArrowRight:\n this.switchDateSegment(1);\n break;\n case Keys.ArrowLeft:\n this.switchDateSegment(-1);\n break;\n case Keys.Home:\n this.selectNearestSegment(0);\n break;\n case Keys.End:\n this.selectNearestSegment(this.inputValue.length);\n break;\n default:\n return; //skip the preventDefault if we didn't handled the keyCode\n }\n event.preventDefault();\n }\n handleInput() {\n if (this.disabled || this.readonly) {\n return;\n }\n if (this.paste) {\n this.updateOnPaste();\n this.paste = false;\n return;\n }\n const diff = approximateStringMatching(this.currentValue, this.currentFormat, this.inputValue, this.caret()[0]);\n const navigationOnly = (diff.length === 1 && diff[0][1] === \"_\");\n let switchPart = false;\n if (!navigationOnly) {\n let parsedPart;\n for (let i = 0; i < diff.length; i++) {\n parsedPart = this.kendoDate.parsePart(diff[i][0], diff[i][1], this.resetSegmentValue);\n switchPart = parsedPart.switchToNext;\n }\n const candidate = this.kendoDate.getDateObject();\n if (this.value && candidate && !this.formatSections.date) {\n this.kendoDate = this.getKendoDate(setTime(this.value, candidate));\n }\n }\n this.resetSegmentValue = false;\n this.putDateInRange();\n this.updateElementValue(this.isActive);\n this.triggerChange();\n this.updateIncompleteValidationStatus();\n if (diff.length && diff[0][0] !== \"_\") {\n this.selectDateSegment(diff[0][0]);\n }\n if (switchPart || navigationOnly) {\n this.switchDateSegment(1);\n }\n if (this.backspace) {\n this.switchDateSegment(-1);\n }\n this.backspace = false;\n }\n emitFocus(args) {\n this.onFocus.emit();\n if (this.pickerService) {\n this.pickerService.onFocus.emit(args);\n }\n }\n emitBlur(args) {\n this.onBlur.emit();\n if (this.pickerService) {\n this.pickerService.onBlur.emit(args);\n }\n }\n updateIncompleteValidationStatus() {\n const previousValue = this.isDateIncomplete;\n this.isDateIncomplete = this.kendoDate.hasValue() && this.value === null;\n if (previousValue === this.isDateIncomplete || !this.incompleteDateValidation) {\n return;\n }\n if (isPresent(this.ngControl) && !isPresent(this.pickerService)) {\n this.cdr.markForCheck();\n this.ngZone.run(() => this.onValidatorChange());\n }\n else if (isPresent(this.pickerService)) {\n this.pickerService.dateCompletenessChange.emit();\n }\n }\n}\nDateInputComponent.ɵfac = function DateInputComponent_Factory(t) { return new (t || DateInputComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(PickerService, 8)); };\nDateInputComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateInputComponent, selectors: [[\"kendo-dateinput\"]], viewQuery: function DateInputComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(_c7, true);\n ɵngcc0.ɵɵviewQuery(_c8, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dateInput = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.wrap = _t.first);\n } }, hostVars: 6, hostBindings: function DateInputComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.wrapperClass)(\"k-dateinput\", ctx.wrapperClass)(\"k-state-disabled\", ctx.disabledClass);\n } }, inputs: { focusableId: \"focusableId\", disabled: \"disabled\", readonly: \"readonly\", title: \"title\", tabindex: \"tabindex\", role: \"role\", ariaReadOnly: \"ariaReadOnly\", format: \"format\", placeholder: \"placeholder\", rangeValidation: \"rangeValidation\", autoCorrect: \"autoCorrect\", incompleteDateValidation: \"incompleteDateValidation\", spinners: \"spinners\", isPopupOpen: \"isPopupOpen\", hasPopup: \"hasPopup\", tabIndex: \"tabIndex\", value: \"value\", formatPlaceholder: \"formatPlaceholder\", steps: \"steps\", max: \"max\", min: \"min\" }, outputs: { valueChange: \"valueChange\", valueUpdate: \"valueUpdate\", onFocus: \"focus\", onBlur: \"blur\" }, exportAs: [\"kendo-dateinput\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateInputComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DateInputComponent), multi: true },\n { provide: L10N_PREFIX, useValue: 'kendo.dateinput' },\n { provide: KendoInput, useExisting: forwardRef(() => DateInputComponent) },\n LocalizationService\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 7, vars: 21, consts: [[\"kendoDateInputLocalizedMessages\", \"\", 6, \"increment\", \"decrement\"], [1, \"k-dateinput-wrap\"], [\"wrap\", \"\"], [\"autocomplete\", \"off\", \"autocorrect\", \"off\", \"autocapitalize\", \"off\", \"spellcheck\", \"false\", 1, \"k-input\", 3, \"id\", \"title\", \"tabindex\", \"disabled\", \"readonly\", \"placeholder\", \"kendoEventsOutsideAngular\", \"scope\"], [\"dateInput\", \"\"], [\"class\", \"k-select\", 3, \"mousedown\", 4, \"ngIf\"], [1, \"k-select\", 3, \"mousedown\"], [1, \"k-link\", \"k-link-increase\", 3, \"title\", \"mousedown\", \"mouseleave\", \"click\"], [1, \"k-icon\", \"k-i-arrow-n\"], [1, \"k-link\", \"k-link-decrease\", 3, \"title\", \"click\", \"mousedown\", \"mouseleave\"], [1, \"k-icon\", \"k-i-arrow-s\"]], template: function DateInputComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c13);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"span\", 1, 2);\n ɵngcc0.ɵɵelement(4, \"input\", 3, 4);\n ɵngcc0.ɵɵtemplate(6, DateInputComponent_span_6_Template, 5, 8, \"span\", 5);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(4);\n ɵngcc0.ɵɵproperty(\"id\", ctx.focusableId)(\"title\", ctx.title)(\"tabindex\", ctx.tabindex)(\"disabled\", ctx.disabled)(\"readonly\", ctx.readonly)(\"placeholder\", ctx.placeholder)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction7(13, _c14, ctx.handleClick, ctx.handleFocus, ctx.handleMousedown, ctx.handleMousedown, ctx.handleDragAndDrop, ctx.handleDragAndDrop, ctx.handleBlur))(\"scope\", ctx);\n ɵngcc0.ɵɵattribute(\"role\", ctx.role)(\"aria-readonly\", ctx.ariaReadOnly)(\"aria-expanded\", ctx.isPopupOpen)(\"aria-haspopup\", ctx.hasPopup);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.spinners);\n } }, directives: function () { return [DateInputLocalizedMessagesDirective, ɵngcc3.EventsOutsideAngularDirective, ɵngcc2.NgIf]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nDateInputComponent.ctorParameters = () => [\n { type: ChangeDetectorRef },\n { type: IntlService },\n { type: Renderer2 },\n { type: ElementRef },\n { type: NgZone },\n { type: Injector },\n { type: LocalizationService },\n { type: PickerService, decorators: [{ type: Optional }] }\n];\nDateInputComponent.propDecorators = {\n focusableId: [{ type: Input }],\n disabled: [{ type: Input }],\n readonly: [{ type: Input }],\n title: [{ type: Input }],\n tabindex: [{ type: Input }],\n role: [{ type: Input }],\n ariaReadOnly: [{ type: Input }],\n tabIndex: [{ type: Input }],\n format: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n steps: [{ type: Input }],\n max: [{ type: Input }],\n min: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n autoCorrect: [{ type: Input }],\n incompleteDateValidation: [{ type: Input }],\n value: [{ type: Input }],\n spinners: [{ type: Input }],\n isPopupOpen: [{ type: Input }],\n hasPopup: [{ type: Input }],\n valueChange: [{ type: Output }],\n valueUpdate: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n dateInput: [{ type: ViewChild, args: ['dateInput', { static: true },] }],\n wrap: [{ type: ViewChild, args: ['wrap',] }],\n wrapperClass: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-dateinput',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateInputComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-dateinput',\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateInputComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DateInputComponent), multi: true },\n { provide: L10N_PREFIX, useValue: 'kendo.dateinput' },\n { provide: KendoInput, useExisting: forwardRef(() => DateInputComponent) },\n LocalizationService\n ],\n selector: 'kendo-dateinput',\n template: `\n \n \n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.IntlService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Injector }, { type: ɵngcc4.LocalizationService }, { type: PickerService, decorators: [{\n type: Optional\n }] }]; }, { focusableId: [{\n type: Input\n }], disabled: [{\n type: Input\n }], readonly: [{\n type: Input\n }], title: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], role: [{\n type: Input\n }], ariaReadOnly: [{\n type: Input\n }], format: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], autoCorrect: [{\n type: Input\n }], incompleteDateValidation: [{\n type: Input\n }], spinners: [{\n type: Input\n }], isPopupOpen: [{\n type: Input\n }], hasPopup: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], valueUpdate: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], tabIndex: [{\n type: Input\n }], value: [{\n type: Input\n }], wrapperClass: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-dateinput']\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], formatPlaceholder: [{\n type: Input\n }], steps: [{\n type: Input\n }], max: [{\n type: Input\n }], min: [{\n type: Input\n }], dateInput: [{\n type: ViewChild,\n args: ['dateInput', { static: true }]\n }], wrap: [{\n type: ViewChild,\n args: ['wrap']\n }] }); })();\n\n/**\n * A preventable event instance which is triggered by the `open` and `close` events.\n */\nclass PreventableEvent {\n constructor() {\n this.prevented = false;\n }\n /**\n * Prevents the default action for a specified event.\n * In this way, the source component suppresses the built-in behavior that follows the event.\n */\n preventDefault() {\n this.prevented = true;\n }\n /**\n * If the event is prevented by any of its subscribers, returns `true`.\n *\n * @returns `true` if the default action was prevented. Otherwise, returns `false`.\n */\n isDefaultPrevented() {\n return this.prevented;\n }\n}\n\n/**\n * @hidden\n */\nconst TOUCH_ENABLED = new InjectionToken('dateinputs-touch-enabled');\n\n/**\n * @hidden\n */\nconst disabledDatesValidator = (isDateDisabled) => {\n return (control) => {\n if (!isDateDisabled || !control.value) {\n return null;\n }\n const error = {\n disabledDate: true\n };\n return isDateDisabled(control.value) ? error : null;\n };\n};\n\n/* tslint:disable:max-line-length */\nconst MIN_DOC_LINK$2 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/DatePickerComponent/#toc-min';\nconst MAX_DOC_LINK$2 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/DatePickerComponent/#toc-max';\nconst VALUE_DOC_LINK$2 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/datepicker/#toc-using-with-json';\n/**\n * Represents the [Kendo UI DatePicker component for Angular]({% slug overview_datepicker %}#toc-basic-usage).\n */\nclass DatePickerComponent {\n constructor(zone, localization, cdr, popupService, element, renderer, injector, pickerService, disabledDatesService, touchEnabled$$1) {\n this.zone = zone;\n this.localization = localization;\n this.cdr = cdr;\n this.popupService = popupService;\n this.element = element;\n this.renderer = renderer;\n this.injector = injector;\n this.pickerService = pickerService;\n this.disabledDatesService = disabledDatesService;\n this.touchEnabled = touchEnabled$$1;\n /**\n * @hidden\n */\n this.focusableId = `k-${guid()}`;\n /**\n * Defines the active view that the Calendar initially renders\n * ([see example]({% slug activeview_datepicker %})).\n * By default, the active view is `month`.\n *\n * > You have to set `activeView` within the `topView`-`bottomView` range.\n */\n this.activeView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the bottommost Calendar view to which the user can navigate\n * ([see example]({% slug dates_datepicker %}#toc-partial-dates)).\n */\n this.bottomView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the topmost Calendar view to which the user can navigate\n * ([see example]({% slug dates_datepicker %}#toc-partial-dates)).\n */\n this.topView = CalendarViewEnum[CalendarViewEnum.century];\n /**\n * Sets or gets the `disabled` property of the DatePicker and determines whether the component is active\n * ([see example]({% slug disabled_datepicker %})).\n */\n this.disabled = false;\n /**\n * Sets the read-only state of the DatePicker\n * ([see example]({% slug readonly_datepicker %}#toc-read-only-datepicker)).\n */\n this.readonly = false;\n /**\n * Sets the read-only state of the DatePicker input field\n * ([see example]({% slug readonly_datepicker %}#toc-read-only-input)).\n *\n * > Note that if you set the [`readonly`]({% slug api_dateinputs_datepickercomponent %}#toc-readonly) property value to `true`,\n * the input will be rendered in a read-only state regardless of the `readOnlyInput` value.\n */\n this.readOnlyInput = false;\n /**\n * Sets or gets the `navigation` property of the Calendar\n * and determines whether the navigation side-bar is displayed.\n * ([see example]({% slug sidebar_datepicker %})).\n */\n this.navigation = true;\n /**\n * Specifies the smallest valid date\n * ([see example]({% slug dateranges_datepicker %})).\n */\n this.min = cloneDate(MIN_DATE);\n /**\n * Specifies the biggest valid date\n * ([see example]({% slug dateranges_datepicker %})).\n */\n this.max = cloneDate(MAX_DATE);\n /**\n * Determines whether the built-in validation for incomplete dates is to be enforced when a form is being validated.\n */\n this.incompleteDateValidation = false;\n /**\n * Specifies the focused date of the Calendar component\n * ([see example]({% slug dates_datepicker %})).\n */\n this.focusedDate = null;\n /**\n * Specifies the date format that is used to display the input value\n * ([see example]({% slug formats_datepicker %})).\n */\n this.format = \"d\";\n /**\n * Specifies the hint the DatePicker displays when its value is `null`.\n * ([more information and exaples]({% slug placeholders_datepicker %})).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n this.placeholder = null;\n /**\n * Sets or gets the `tabindex` property of the DatePicker.\n */\n this.tabindex = 0;\n /**\n * Sets the title of the input element of the DatePicker.\n */\n this.title = \"\";\n /**\n * Determines whether the built-in min or max validators are enforced when validating a form.\n */\n this.rangeValidation = true;\n /**\n * Determines whether the built-in validator for disabled\n * date ranges is enforced when validating a form\n * ([see example]({% slug disabled_dates_datepicker %}#toc-validation)).\n */\n this.disabledDatesValidation = true;\n /**\n * Determines whether to display a week number column in the `month` view of the Calendar\n * ([see example]({% slug weeknumcolumn_datepicker %})).\n */\n this.weekNumber = false;\n /**\n * Fires each time the user selects a new value\n * ([more information and example]({% slug overview_datepicker %}#toc-events)).\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires each time the user focuses the input element\n * ([more information and example]({% slug overview_datepicker %}#toc-events)).\n *\n * > To wire the event programmatically, use the `onFocus` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleFocus(): void {\n * console.log(\"Component is focused\");\n * }\n * }\n * ```\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the input element gets blurred\n * ([more information and example]({% slug overview_datepicker %}#toc-events)).\n *\n * > To wire the event programmatically, use the `onBlur` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleBlur(): void {\n * console.log(\"Component is blurred\");\n * }\n * }\n * ```\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event, the popup will remain closed\n * ([more information and example]({% slug overview_datepicker %}#toc-events)).\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event, the popup will remain open\n * ([more information and example]({% slug overview_datepicker %}#toc-events)).\n */\n this.close = new EventEmitter();\n /**\n * @hidden\n */\n this.wrapperClasses = true;\n this.popupUID = guid();\n this._popupSettings = { animate: true };\n this._show = false;\n this._value = null;\n this._active = false;\n this.onControlChange = noop;\n this.onControlTouched = noop;\n this.onValidatorChange = noop;\n this.minValidateFn = noop;\n this.maxValidateFn = noop;\n this.disabledDatesValidateFn = noop;\n this.incompleteValidator = noop;\n this.resolvedPromise = Promise.resolve(null);\n this.domEvents = [];\n this.pickerSubscriptions = this.pickerService.onFocus.subscribe(this.handleFocus.bind(this));\n this.pickerSubscriptions.add(this.pickerService.onBlur.subscribe(this.handleBlur.bind(this)));\n this.pickerSubscriptions.add(this.pickerService.sameDateSelected.subscribe(this.handleSameSelection.bind(this)));\n this.pickerSubscriptions.add(this.pickerService.dateCompletenessChange.subscribe(this.handleDateCompletenessChange.bind(this)));\n }\n /**\n * @hidden\n */\n set cellTemplateRef(template) {\n this.cellTemplate = template;\n }\n /**\n * @hidden\n */\n set monthCellTemplateRef(template) {\n this.monthCellTemplate = template;\n }\n /**\n * @hidden\n */\n set yearCellTemplateRef(template) {\n this.yearCellTemplate = template;\n }\n /**\n * @hidden\n */\n set decadeCellTemplateRef(template) {\n this.decadeCellTemplate = template;\n }\n /**\n * @hidden\n */\n set centuryCellTemplateRef(template) {\n this.centuryCellTemplate = template;\n }\n /**\n * @hidden\n */\n set weekNumberTemplateRef(template) {\n this.weekNumberTemplate = template;\n }\n /**\n * @hidden\n */\n set headerTitleTemplateRef(template) {\n this.headerTitleTemplate = template;\n }\n /**\n * @hidden\n */\n set navigationItemTemplateRef(template) {\n this.navigationItemTemplate = template;\n }\n /**\n * Configures the popup options of the DatePicker.\n *\n * The available options are:\n * - `animate: Boolean`—Controls the popup animation. By default, the open and close animations are enabled.\n * - `appendTo: 'root' | 'component' | ViewContainerRef`—Controls the popup container. By default, the popup will be appended to the root component.\n * - `popupClass: String`—Specifies a list of CSS classes that are used to style the popup.\n */\n set popupSettings(settings) {\n this._popupSettings = Object.assign({}, { animate: true }, settings);\n }\n get popupSettings() {\n return this._popupSettings;\n }\n /**\n * Specifies the value of the DatePicker component.\n *\n * > The `value` has to be a valid\n * [JavaScript `Date`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) instance.\n */\n set value(value) {\n this.verifyValue(value);\n this._value = cloneDate(value);\n }\n get value() {\n return this._value;\n }\n /**\n * @hidden\n */\n set tabIndex(tabIndex) {\n this.tabindex = tabIndex;\n }\n get tabIndex() {\n return this.tabindex;\n }\n /**\n * Sets the dates of the DatePicker that will be disabled\n * ([see example]({% slug disabled_dates_datepicker %})).\n */\n set disabledDates(value) {\n this._disabledDates = value;\n this.disabledDatesService.initialize(value);\n }\n get disabledDates() {\n return this._disabledDates;\n }\n /**\n * @hidden\n */\n get disabledClass() {\n return this.disabled;\n }\n /**\n * @hidden\n */\n get inputRole() {\n return this.readOnlyInput ? 'listbox' : 'spinbutton';\n }\n get isActive() {\n return this._active;\n }\n set isActive(value) {\n this._active = value;\n if (!this.wrapper) {\n return;\n }\n const element = this.wrapper.nativeElement;\n if (value) {\n this.renderer.addClass(element, 'k-state-focused');\n }\n else {\n this.renderer.removeClass(element, 'k-state-focused');\n }\n }\n get show() {\n return this._show;\n }\n set show(show) {\n if (show && (this.disabled || this.readonly)) {\n return;\n }\n const skipZone = !show && (!this._show || !hasObservers(this.close));\n if (!skipZone) {\n this.zone.run(() => {\n this.togglePopup(show);\n });\n }\n else {\n this.togglePopup(show);\n }\n }\n /**\n * @hidden\n * Used by the TextBoxContainer to determine if the component is empty.\n */\n isEmpty() {\n return !this.value && this.input.isEmpty();\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.localizationChangeSubscription = this.localization\n .changes\n .subscribe(() => this.cdr.markForCheck());\n this.control = this.injector.get(NgControl, null);\n if (this.element) {\n this.renderer.removeAttribute(this.element.nativeElement, 'tabindex');\n this.zone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n this.verifySettings();\n if (changes.min || changes.max || changes.rangeValidation || changes.disabledDatesValidation || changes.disabledDates || changes.incompleteDateValidation) {\n this.minValidateFn = this.rangeValidation ? minValidator(this.min) : noop;\n this.maxValidateFn = this.rangeValidation ? maxValidator(this.max) : noop;\n this.disabledDatesValidateFn = this.disabledDatesValidation ? disabledDatesValidator(this.disabledDatesService.isDateDisabled) : noop;\n this.incompleteValidator = this.incompleteDateValidation ? incompleteDateValidator() : noop;\n this.onValidatorChange();\n }\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n this.isActive = false;\n this.show = false;\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n if (this.windowBlurSubscription) {\n this.windowBlurSubscription.unsubscribe();\n }\n this.domEvents.forEach(unbindCallback => unbindCallback());\n this.pickerSubscriptions.unsubscribe();\n }\n /**\n * Returns the current open state of the popup.\n */\n get isOpen() {\n return this.show;\n }\n /**\n * @hidden\n */\n writeValue(value) {\n this.verifyValue(value);\n this.value = cloneDate(value);\n this.cdr.markForCheck();\n if (!value && this.input) {\n this.input.placeholder = this.placeholder;\n this.input.writeValue(value);\n }\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * @hidden\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.minValidateFn(control) || this.maxValidateFn(control) || this.disabledDatesValidateFn(control) || this.incompleteValidator(control, this.input && this.input.isDateIncomplete);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * Focuses the DatePicker component.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n this.input.focus();\n }\n /**\n * Blurs the DatePicker component.\n */\n blur() {\n (this.calendar || this.input)['blur'](); //tslint:disable-line:no-string-literal\n }\n /**\n * Toggles the visibility of the popup. If you use the `toggle` method to show or hide the popup,\n * the `open` and `close` events do not fire.\n *\n * @param show - The state of the popup.\n */\n toggle(show) {\n if (this.disabled || this.readonly) {\n return;\n }\n this.resolvedPromise.then(() => {\n this._toggle((show === undefined) ? !this.show : show);\n });\n }\n /**\n * @hidden\n */\n handleIconClick(event) {\n if (this.disabled || this.readonly) {\n return;\n }\n event.preventDefault();\n this.focusInput();\n //XXX: explicitly call the handleFocus handler here\n //due to async IE focus event\n this.handleFocus();\n this.show = !this.show;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n handleMousedown(args) {\n args.preventDefault();\n }\n /**\n * @hidden\n */\n handleChange(value) {\n this.cdr.markForCheck();\n this.focusInput();\n this.value = value;\n this.show = false;\n this.onControlChange(cloneDate(value));\n this.valueChange.emit(cloneDate(value));\n }\n /**\n * @hidden\n */\n handleInputChange(value) {\n this.handleChange(this.input.formatSections.time ? value : this.mergeTime(value));\n }\n /**\n * @hidden\n */\n get popupClasses() {\n return [\n 'k-calendar-container',\n 'k-group',\n 'k-reset'\n ].concat(this.popupSettings.popupClass || []);\n }\n /**\n * @hidden\n */\n get appendTo() {\n const { appendTo } = this.popupSettings;\n if (!appendTo || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.container : appendTo;\n }\n get input() {\n return this.pickerService.input;\n }\n get calendar() {\n return this.pickerService.calendar;\n }\n /**\n * @hidden\n */\n mergeTime(value) {\n return this.value && value ? setTime(value, this.value) : value;\n }\n /**\n * @hidden\n */\n handleKeydown(e) {\n const { altKey, keyCode } = e;\n if (keyCode === Keys.Escape) {\n this.show = false;\n }\n if (altKey) {\n if (keyCode === Keys.ArrowDown && !this.show) {\n this.show = true;\n }\n if (keyCode === Keys.ArrowUp) {\n this.show = false;\n }\n }\n if (keyCode === Keys.Tab && this.show && this.calendar.isActive) {\n this.input.focus();\n this.show = false;\n }\n }\n togglePopup(show) {\n const event = new PreventableEvent();\n if (!this._show && show) {\n this.open.emit(event);\n }\n else if (this._show && !show) {\n this.close.emit(event);\n }\n if (event.isDefaultPrevented()) {\n return;\n }\n this._toggle(show);\n this.toggleFocus();\n }\n _toggle(show) {\n if (show === this._show) {\n return;\n }\n this._show = show;\n if (show) {\n const direction = this.localization.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchor: this.wrapper,\n anchorAlign: { vertical: 'bottom', horizontal: direction },\n animate: this.popupSettings.animate,\n appendTo: this.appendTo,\n content: this.popupTemplate,\n popupAlign: { vertical: 'top', horizontal: direction },\n popupClass: this.popupClasses,\n positionMode: 'absolute'\n });\n this.popupRef.popupElement.setAttribute('id', this.popupUID);\n this.subscription = this.popupRef.popupAnchorViewportLeave.subscribe(() => this.show = false);\n }\n else {\n this.popupRef.close();\n this.popupRef = null;\n this.subscription.unsubscribe();\n }\n }\n focusInput() {\n if (this.touchEnabled) {\n return;\n }\n this.input.focus();\n }\n toggleFocus() {\n if (!this.isActive) {\n return;\n }\n if (this.show) {\n if (!this.calendar) {\n this.cdr.detectChanges();\n }\n if (this.calendar) {\n this.calendar.focus();\n }\n }\n else if (!this.touchEnabled) {\n this.input.focus();\n }\n else if (!this.input.isActive) {\n this.handleBlur();\n }\n }\n verifySettings() {\n if (!isDevMode()) {\n return;\n }\n if (!isValidRange(this.min, this.max)) {\n throw new Error(`The max value should be bigger than the min. See ${MIN_DOC_LINK$2} and ${MAX_DOC_LINK$2}.`);\n }\n }\n verifyValue(value) {\n if (!isDevMode()) {\n return;\n }\n if (value && !(value instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK$2} for possible resolution.`);\n }\n }\n bindEvents() {\n const element = this.element.nativeElement;\n this.domEvents.push(this.renderer.listen(element, 'keydown', this.handleKeydown.bind(this)));\n if (isWindowAvailable()) {\n this.windowBlurSubscription = fromEvent(window, 'blur').subscribe(this.handleWindowBlur.bind(this));\n }\n }\n handleFocus() {\n if (this.isActive) {\n return;\n }\n this.isActive = true;\n if (hasObservers(this.onFocus)) {\n this.zone.run(() => {\n this.onFocus.emit();\n });\n }\n }\n handleWindowBlur() {\n if (!this.isOpen) {\n return;\n }\n this.show = false;\n }\n handleBlur(args) {\n const currentTarget = args && currentFocusTarget(args);\n if (currentTarget && (this.input.containsElement(currentTarget) ||\n (this.calendar && this.calendar.containsElement(currentTarget)))) {\n return;\n }\n if (hasObservers(this.onBlur) || (this.show && hasObservers(this.close)) || requiresZoneOnBlur(this.control)) {\n this.zone.run(() => {\n this.blurComponent();\n this.cdr.markForCheck();\n });\n }\n else {\n this.blurComponent();\n }\n }\n blurComponent() {\n this.isActive = false; // order is important ¯\\_(ツ)_/¯\n this.show = false;\n this.cdr.detectChanges();\n this.onControlTouched();\n this.onBlur.emit();\n }\n handleSameSelection() {\n if (this.show) {\n this.focusInput();\n this.show = false;\n }\n }\n handleDateCompletenessChange() {\n this.cdr.markForCheck();\n this.zone.run(() => this.onValidatorChange());\n }\n}\nDatePickerComponent.ɵfac = function DatePickerComponent_Factory(t) { return new (t || DatePickerComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc5.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(PickerService), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService), ɵngcc0.ɵɵdirectiveInject(TOUCH_ENABLED, 8)); };\nDatePickerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DatePickerComponent, selectors: [[\"kendo-datepicker\"]], contentQueries: function DatePickerComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MonthCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, YearCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DecadeCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, CenturyCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, WeekNumberCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, HeaderTitleTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, NavigationItemTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.cellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.monthCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.yearCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.decadeCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.centuryCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.weekNumberTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTitleTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.navigationItemTemplate = _t.first);\n } }, viewQuery: function DatePickerComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c15, true, ViewContainerRef);\n ɵngcc0.ɵɵviewQuery(_c16, true);\n ɵngcc0.ɵɵviewQuery(_c17, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.popupTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.wrapper = _t.first);\n } }, hostVars: 6, hostBindings: function DatePickerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.wrapperClasses)(\"k-datepicker\", ctx.wrapperClasses)(\"k-state-disabled\", ctx.disabledClass);\n } }, inputs: { focusableId: \"focusableId\", activeView: \"activeView\", bottomView: \"bottomView\", topView: \"topView\", disabled: \"disabled\", readonly: \"readonly\", readOnlyInput: \"readOnlyInput\", navigation: \"navigation\", min: \"min\", max: \"max\", incompleteDateValidation: \"incompleteDateValidation\", focusedDate: \"focusedDate\", format: \"format\", placeholder: \"placeholder\", tabindex: \"tabindex\", title: \"title\", rangeValidation: \"rangeValidation\", disabledDatesValidation: \"disabledDatesValidation\", weekNumber: \"weekNumber\", cellTemplateRef: [\"cellTemplate\", \"cellTemplateRef\"], monthCellTemplateRef: [\"monthCellTemplate\", \"monthCellTemplateRef\"], yearCellTemplateRef: [\"yearCellTemplate\", \"yearCellTemplateRef\"], decadeCellTemplateRef: [\"decadeCellTemplate\", \"decadeCellTemplateRef\"], centuryCellTemplateRef: [\"centuryCellTemplate\", \"centuryCellTemplateRef\"], weekNumberTemplateRef: [\"weekNumberTemplate\", \"weekNumberTemplateRef\"], headerTitleTemplateRef: [\"headerTitleTemplate\", \"headerTitleTemplateRef\"], navigationItemTemplateRef: [\"navigationItemTemplate\", \"navigationItemTemplateRef\"], popupSettings: \"popupSettings\", value: \"value\", tabIndex: \"tabIndex\", disabledDates: \"disabledDates\", formatPlaceholder: \"formatPlaceholder\" }, outputs: { valueChange: \"valueChange\", onFocus: \"focus\", onBlur: \"blur\", open: \"open\", close: \"close\" }, exportAs: [\"kendo-datepicker\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DatePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DatePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => DatePickerComponent) },\n LocalizationService,\n PickerService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.datepicker'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 12, vars: 25, consts: [[\"kendoDatePickerLocalizedMessages\", \"\", 6, \"today\", \"toggle\"], [1, \"k-picker-wrap\"], [\"wrapper\", \"\"], [3, \"role\", \"focusableId\", \"hasPopup\", \"isPopupOpen\", \"disabled\", \"readonly\", \"ariaReadOnly\", \"tabindex\", \"title\", \"format\", \"formatPlaceholder\", \"placeholder\", \"min\", \"max\", \"incompleteDateValidation\", \"value\", \"valueChange\"], [\"input\", \"\"], [\"role\", \"button\", 1, \"k-select\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [1, \"k-icon\", \"k-i-calendar\"], [\"container\", \"\"], [\"popupTemplate\", \"\"], [3, \"min\", \"max\", \"navigation\", \"activeView\", \"bottomView\", \"topView\", \"weekNumber\", \"cellTemplate\", \"monthCellTemplate\", \"yearCellTemplate\", \"decadeCellTemplate\", \"centuryCellTemplate\", \"weekNumberTemplate\", \"headerTitleTemplate\", \"navigationItemTemplate\", \"focusedDate\", \"value\", \"kendoEventsOutsideAngular\", \"scope\", \"disabledDates\", \"valueChange\"], [\"calendar\", \"\"], [3, \"today\"]], template: function DatePickerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c22);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"span\", 1, 2);\n ɵngcc0.ɵɵelementStart(4, \"kendo-dateinput\", 3, 4);\n ɵngcc0.ɵɵlistener(\"valueChange\", function DatePickerComponent_Template_kendo_dateinput_valueChange_4_listener($event) { return ctx.handleInputChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(6, \"span\", 5);\n ɵngcc0.ɵɵelement(7, \"span\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainer(8, null, 7);\n ɵngcc0.ɵɵtemplate(10, DatePickerComponent_ng_template_10_Template, 4, 23, \"ng-template\", null, 8, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", ctx.disabled);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"role\", ctx.inputRole)(\"focusableId\", ctx.focusableId)(\"hasPopup\", true)(\"isPopupOpen\", ctx.show)(\"disabled\", ctx.disabled)(\"readonly\", ctx.readonly || ctx.readOnlyInput)(\"ariaReadOnly\", ctx.readonly)(\"tabindex\", ctx.tabindex)(\"title\", ctx.title)(\"format\", ctx.format)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"placeholder\", ctx.placeholder)(\"min\", ctx.min)(\"max\", ctx.max)(\"incompleteDateValidation\", ctx.incompleteDateValidation)(\"value\", ctx.value);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(22, _c24, ctx.handleIconClick, ctx.handleMousedown))(\"scope\", ctx);\n ɵngcc0.ɵɵattribute(\"title\", ctx.localization.get(\"toggle\"))(\"aria-label\", ctx.localization.get(\"toggle\"));\n } }, directives: function () { return [DatePickerLocalizedMessagesDirective,\n DateInputComponent, ɵngcc3.EventsOutsideAngularDirective, CalendarComponent,\n CalendarCustomMessagesComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nDatePickerComponent.ctorParameters = () => [\n { type: NgZone },\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: PopupService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: Injector },\n { type: PickerService },\n { type: DisabledDatesService },\n { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [TOUCH_ENABLED,] }] }\n];\nDatePickerComponent.propDecorators = {\n container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef },] }],\n popupTemplate: [{ type: ViewChild, args: ['popupTemplate',] }],\n wrapper: [{ type: ViewChild, args: ['wrapper',] }],\n cellTemplate: [{ type: ContentChild, args: [CellTemplateDirective,] }],\n cellTemplateRef: [{ type: Input, args: ['cellTemplate',] }],\n monthCellTemplate: [{ type: ContentChild, args: [MonthCellTemplateDirective,] }],\n monthCellTemplateRef: [{ type: Input, args: ['monthCellTemplate',] }],\n yearCellTemplate: [{ type: ContentChild, args: [YearCellTemplateDirective,] }],\n yearCellTemplateRef: [{ type: Input, args: ['yearCellTemplate',] }],\n decadeCellTemplate: [{ type: ContentChild, args: [DecadeCellTemplateDirective,] }],\n decadeCellTemplateRef: [{ type: Input, args: ['decadeCellTemplate',] }],\n centuryCellTemplate: [{ type: ContentChild, args: [CenturyCellTemplateDirective,] }],\n centuryCellTemplateRef: [{ type: Input, args: ['centuryCellTemplate',] }],\n weekNumberTemplate: [{ type: ContentChild, args: [WeekNumberCellTemplateDirective,] }],\n weekNumberTemplateRef: [{ type: Input, args: ['weekNumberTemplate',] }],\n headerTitleTemplate: [{ type: ContentChild, args: [HeaderTitleTemplateDirective,] }],\n headerTitleTemplateRef: [{ type: Input, args: ['headerTitleTemplate',] }],\n navigationItemTemplate: [{ type: ContentChild, args: [NavigationItemTemplateDirective,] }],\n navigationItemTemplateRef: [{ type: Input, args: ['navigationItemTemplate',] }],\n focusableId: [{ type: Input }],\n activeView: [{ type: Input }],\n bottomView: [{ type: Input }],\n topView: [{ type: Input }],\n disabled: [{ type: Input }],\n readonly: [{ type: Input }],\n readOnlyInput: [{ type: Input }],\n popupSettings: [{ type: Input }],\n navigation: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n incompleteDateValidation: [{ type: Input }],\n focusedDate: [{ type: Input }],\n value: [{ type: Input }],\n format: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n tabindex: [{ type: Input }],\n tabIndex: [{ type: Input }],\n disabledDates: [{ type: Input }],\n title: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n disabledDatesValidation: [{ type: Input }],\n weekNumber: [{ type: Input }],\n valueChange: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n wrapperClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-datepicker',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DatePickerComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-datepicker',\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DatePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DatePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => DatePickerComponent) },\n LocalizationService,\n PickerService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.datepicker'\n }\n ],\n selector: 'kendo-datepicker',\n template: `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.NgZone }, { type: ɵngcc4.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc5.PopupService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.Injector }, { type: PickerService }, { type: DisabledDatesService }, { type: Boolean, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [TOUCH_ENABLED]\n }] }]; }, { focusableId: [{\n type: Input\n }], activeView: [{\n type: Input\n }], bottomView: [{\n type: Input\n }], topView: [{\n type: Input\n }], disabled: [{\n type: Input\n }], readonly: [{\n type: Input\n }], readOnlyInput: [{\n type: Input\n }], navigation: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], incompleteDateValidation: [{\n type: Input\n }], focusedDate: [{\n type: Input\n }], format: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], title: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], disabledDatesValidation: [{\n type: Input\n }], weekNumber: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], wrapperClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-datepicker']\n }], cellTemplateRef: [{\n type: Input,\n args: ['cellTemplate']\n }], cellTemplate: [{\n type: ContentChild,\n args: [CellTemplateDirective]\n }], monthCellTemplateRef: [{\n type: Input,\n args: ['monthCellTemplate']\n }], monthCellTemplate: [{\n type: ContentChild,\n args: [MonthCellTemplateDirective]\n }], yearCellTemplateRef: [{\n type: Input,\n args: ['yearCellTemplate']\n }], yearCellTemplate: [{\n type: ContentChild,\n args: [YearCellTemplateDirective]\n }], decadeCellTemplateRef: [{\n type: Input,\n args: ['decadeCellTemplate']\n }], decadeCellTemplate: [{\n type: ContentChild,\n args: [DecadeCellTemplateDirective]\n }], centuryCellTemplateRef: [{\n type: Input,\n args: ['centuryCellTemplate']\n }], centuryCellTemplate: [{\n type: ContentChild,\n args: [CenturyCellTemplateDirective]\n }], weekNumberTemplateRef: [{\n type: Input,\n args: ['weekNumberTemplate']\n }], weekNumberTemplate: [{\n type: ContentChild,\n args: [WeekNumberCellTemplateDirective]\n }], headerTitleTemplateRef: [{\n type: Input,\n args: ['headerTitleTemplate']\n }], headerTitleTemplate: [{\n type: ContentChild,\n args: [HeaderTitleTemplateDirective]\n }], navigationItemTemplateRef: [{\n type: Input,\n args: ['navigationItemTemplate']\n }], navigationItemTemplate: [{\n type: ContentChild,\n args: [NavigationItemTemplateDirective]\n }], popupSettings: [{\n type: Input\n }], value: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], disabledDates: [{\n type: Input\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], container: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef }]\n }], popupTemplate: [{\n type: ViewChild,\n args: ['popupTemplate']\n }], wrapper: [{\n type: ViewChild,\n args: ['wrapper']\n }], formatPlaceholder: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nconst TIME_PART = {\n dayperiod: 'dayperiod',\n hour: 'hour',\n millisecond: 'millisecond',\n minute: 'minute',\n second: 'second'\n};\n\n/**\n * @hidden\n */\nconst timeRangeValidator = (min, max) => {\n return (control) => {\n if (!min || !max || !control.value) {\n return null;\n }\n const err = {\n timeRangeError: {\n maxValue: max,\n minValue: min,\n value: control.value\n }\n };\n return isInTimeRange(control.value, min, max) ? null : err;\n };\n};\n\nconst VALUE_DOC_LINK$3 = 'https://www.telerik.com/kendo-angular-ui/components/dateinputs/timepicker/#toc-integration-with-json';\nconst INTL_DATE_FORMAT = 'https://github.com/telerik/kendo-intl/blob/master/docs/date-formatting/index.md';\nconst formatRegExp = new RegExp(`${TIME_PART.hour}|${TIME_PART.minute}|${TIME_PART.second}|${TIME_PART.dayperiod}|literal`);\n/**\n * Represents the [Kendo UI TimePicker component for Angular]({% slug overview_timepicker %}#toc-basic-usage).\n */\nclass TimePickerComponent {\n constructor(zone, localization, cdr, popupService, element, renderer, injector, pickerService, intl, touchEnabled$$1) {\n this.zone = zone;\n this.localization = localization;\n this.cdr = cdr;\n this.popupService = popupService;\n this.element = element;\n this.renderer = renderer;\n this.injector = injector;\n this.pickerService = pickerService;\n this.intl = intl;\n this.touchEnabled = touchEnabled$$1;\n /**\n * @hidden\n */\n this.focusableId = `k-${guid()}`;\n /**\n * Sets or gets the `disabled` property of the TimePicker and\n * determines whether the component is active\n * ([see example]({% slug disabled_timepicker %})).\n */\n this.disabled = false;\n /**\n * Sets the read-only state of the TimePicker\n * ([see example]({% slug readonly_timepicker %}#toc-read-only-timepicker)).\n */\n this.readonly = false;\n /**\n * Sets the read-only state of the TimePicker input field\n * ([see example]({% slug readonly_timepicker %}#toc-read-only-input)).\n *\n * > Note that if you set the [`readonly`]({% slug api_dateinputs_timepickercomponent %}#toc-readonly) property value to `true`,\n * the input will be rendered in a read-only state regardless of the `readOnlyInput` value.\n */\n this.readOnlyInput = false;\n /**\n * Specifies the time format that is used to display the input value\n * ([see example]({% slug formats_timepicker %})).\n */\n this.format = 't';\n /**\n * Specifies the hint the TimePicker displays when its value is `null`.\n * For more information, refer to the article on\n * [placeholders]({% slug placeholders_timepicker %}).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n this.placeholder = null;\n /**\n * Determines whether the built-in validation for incomplete dates is to be enforced when a form is being validated.\n */\n this.incompleteDateValidation = false;\n /**\n * Determines whether to display the **Cancel** button in the popup.\n */\n this.cancelButton = true;\n /**\n * Determines whether to display the **Now** button in the popup.\n *\n * > If the current time is out of range or the incremental step is greater than `1`, the **Now** button will be hidden.\n */\n this.nowButton = true;\n /**\n * Sets or gets the `tabindex` property of the TimePicker.\n */\n this.tabindex = 0;\n /**\n * Sets the title of the input element of the TimePicker.\n */\n this.title = \"\";\n /**\n * Determines whether the built-in min or max validators are enforced when a form is being validated.\n */\n this.rangeValidation = true;\n /**\n * Fires each time the user selects a new value.\n * For more information, refer to the section on\n * [events]({% slug overview_timepicker %}#toc-events).\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires each time the user focuses the input element.\n * For more information, refer to the section on\n * [events]({% slug overview_timepicker %}#toc-events).\n *\n * > To wire the event programmatically, use the `onFocus` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleFocus(): void {\n * console.log(\"Component is focused\");\n * }\n * }\n * ```\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the input element gets blurred.\n * For more information, refer to the section on\n * [events]({% slug overview_timepicker %}#toc-events).\n *\n * > To wire the event programmatically, use the `onBlur` property.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public handleBlur(): void {\n * console.log(\"Component is blurred\");\n * }\n * }\n * ```\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event, the popup will remain closed.\n * For more information, refer to the section on\n * [events]({% slug overview_timepicker %}#toc-events).\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event, the popup will remain open.\n * For more information, refer to the section on\n * [events]({% slug overview_timepicker %}#toc-events).\n */\n this.close = new EventEmitter();\n /**\n * @hidden\n */\n this.wrapperClasses = true;\n this.popupUID = guid();\n this.onControlChange = noop;\n this.onControlTouched = noop;\n this.onValidatorChange = noop;\n this.resolvedPromise = Promise.resolve(null);\n this.timeRangeValidateFn = noop;\n this.incompleteValidator = noop;\n this._min = cloneDate(MIN_TIME);\n this._max = cloneDate(MAX_TIME);\n this._popupSettings = { animate: true };\n this._show = false;\n this._steps = {};\n this._value = null;\n this._active = false;\n this.domEvents = [];\n this.pickerSubscriptions = this.pickerService.onFocus.subscribe(this.handleFocus.bind(this));\n this.pickerSubscriptions.add(this.pickerService.onBlur.subscribe(this.handleBlur.bind(this)));\n this.pickerSubscriptions.add(this.pickerService.dateCompletenessChange.subscribe(this.handleDateCompletenessChange.bind(this)));\n }\n /**\n * Specifies the smallest valid time value\n * ([see example]({% slug timeranges_timepicker %})).\n */\n set min(min) {\n this._min = cloneDate(min || MIN_TIME);\n }\n get min() {\n return this._min;\n }\n /**\n * Specifies the biggest valid time value\n * ([see example]({% slug timeranges_timepicker %})).\n */\n set max(max) {\n this._max = cloneDate(max || MAX_TIME);\n }\n get max() {\n return this._max;\n }\n /**\n * Configures the incremental steps of the TimePicker.\n * For more information, refer to the article on\n * [incremental steps]({% slug incrementalsteps_timepicker %}).\n *\n * > If the incremental step is greater than `1`, the **Now** button will be hidden.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public steps = { hour: 2, minute: 15, second: 15 };\n * }\n * ```\n *\n */\n set steps(steps) {\n this._steps = steps || {};\n }\n get steps() {\n return this._steps;\n }\n /**\n * Configures the popup of the TimePicker.\n *\n * The available options are:\n * - `animate: Boolean`—Controls the popup animation. By default, the open and close animations are enabled.\n * - `appendTo: 'root' | 'component' | ViewContainerRef`—Controls the popup container. By default, the popup will be appended to the root component.\n * - `popupClass: String`—Specifies a list of CSS classes that are used to style the popup.\n */\n set popupSettings(settings) {\n this._popupSettings = Object.assign({}, { animate: true }, settings);\n }\n get popupSettings() {\n return this._popupSettings;\n }\n /**\n * @hidden\n */\n set tabIndex(tabIndex) {\n this.tabindex = tabIndex;\n }\n get tabIndex() {\n return this.tabindex;\n }\n /**\n * Specifies the value of the TimePicker component.\n */\n set value(value) {\n this.verifyValue(value);\n this._value = cloneDate(value);\n }\n get value() {\n return this._value;\n }\n /**\n * @hidden\n */\n get disabledClass() {\n return this.disabled;\n }\n /**\n * @hidden\n */\n get inputRole() {\n return this.readOnlyInput ? 'listbox' : 'spinbutton';\n }\n get isActive() {\n return this._active;\n }\n set isActive(value) {\n this._active = value;\n if (!this.wrapper) {\n return;\n }\n const element = this.wrapper.nativeElement;\n if (value) {\n this.renderer.addClass(element, 'k-state-focused');\n }\n else {\n this.renderer.removeClass(element, 'k-state-focused');\n }\n }\n get show() {\n return this._show;\n }\n set show(show) {\n if (show && (this.disabled || this.readonly)) {\n return;\n }\n const skipZone = !show && (!this._show || !hasObservers(this.close));\n if (!skipZone) {\n this.zone.run(() => {\n this.togglePopup(show);\n });\n }\n else {\n this.togglePopup(show);\n }\n }\n get input() {\n return this.pickerService.input;\n }\n get timeSelector() {\n return this.pickerService.timeSelector;\n }\n /**\n * @hidden\n * Used by the TextBoxContainer to determine if the component is empty\n */\n isEmpty() {\n return !this.value && this.input.isEmpty();\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.localizationChangeSubscription = this.localization\n .changes.subscribe(() => this.cdr.markForCheck());\n this.control = this.injector.get(NgControl, null);\n if (this.element) {\n this.renderer.removeAttribute(this.element.nativeElement, 'tabindex');\n this.zone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n if (changes.min || changes.max || changes.rangeValidation || changes.incompleteDateValidation) {\n this.timeRangeValidateFn = this.rangeValidation ? timeRangeValidator(this.min, this.max) : noop;\n this.incompleteValidator = this.incompleteDateValidation ? incompleteDateValidator() : noop;\n this.onValidatorChange();\n }\n if (changes.format) {\n this.verifyFormat();\n }\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n this.isActive = false;\n this.show = false;\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n if (this.windowBlurSubscription) {\n this.windowBlurSubscription.unsubscribe();\n }\n this.domEvents.forEach(unbindCallback => unbindCallback());\n this.pickerSubscriptions.unsubscribe();\n }\n /**\n * @hidden\n */\n handleKeydown(event) {\n const { altKey, keyCode } = event;\n if (keyCode === Keys.Escape) {\n this.show = false;\n return;\n }\n if (altKey) {\n if (keyCode === Keys.ArrowUp) {\n this.show = false;\n }\n if (keyCode === Keys.ArrowDown && !this.show) {\n this.show = true;\n }\n }\n }\n /**\n * @hidden\n */\n writeValue(value) {\n this.verifyValue(value);\n this.value = cloneDate(value);\n this.cdr.markForCheck();\n if (!value && this.input) {\n this.input.placeholder = this.placeholder;\n this.input.writeValue(value);\n }\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * @hidden\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.timeRangeValidateFn(control) || this.incompleteValidator(control, this.input && this.input.isDateIncomplete);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * Focuses the TimePicker component.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n this.input.focus();\n }\n /**\n * Blurs the TimePicker component.\n */\n blur() {\n (this.timeSelector || this.input)['blur'](); //tslint:disable-line:no-string-literal\n }\n /**\n * Toggles the visibility of the popup. If you use the `toggle` method to show or hide the popup,\n * the `open` and `close` events do not fire.\n *\n * @param show - The state of the popup.\n */\n toggle(show) {\n if (this.disabled || this.readonly) {\n return;\n }\n this.resolvedPromise.then(() => {\n this._toggle((show === undefined) ? !this.show : show);\n });\n }\n /**\n * Returns the current open state of the popup.\n */\n get isOpen() {\n return this.show;\n }\n /**\n * @hidden\n */\n get appendTo() {\n const { appendTo } = this.popupSettings;\n if (!appendTo || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.container : appendTo;\n }\n /**\n * @hidden\n */\n handleChange(value) {\n if (isEqual(this.value, value)) {\n this.focusInput();\n this.show = false;\n return;\n }\n this.value = cloneDate(value);\n this.zone.run(() => {\n this.focusInput();\n this.show = false;\n this.onControlChange(cloneDate(value));\n this.valueChange.emit(cloneDate(value));\n });\n }\n /**\n * @hidden\n */\n handleReject() {\n this.show = false;\n }\n /**\n * @hidden\n */\n handleInputChange(value) {\n const val = this.input.formatSections.date ? value : this.mergeTime(value);\n this.handleChange(val);\n }\n /**\n * @hidden\n */\n handleMousedown(args) {\n args.preventDefault();\n }\n /**\n * @hidden\n */\n handleIconClick(event) {\n if (this.disabled || this.readonly) {\n return;\n }\n event.preventDefault();\n this.focusInput();\n //XXX: explicit call handleFocus handler here\n //due to async IE focus event\n this.handleFocus();\n this.show = !this.show;\n }\n /**\n * @hidden\n */\n get popupClasses() {\n return [\n 'k-group',\n 'k-reset'\n ].concat(this.popupSettings.popupClass || []);\n }\n /**\n * @hidden\n */\n normalizeTime(date) {\n return setTime(MIDNIGHT_DATE, date);\n }\n /**\n * @hidden\n */\n mergeTime(value) {\n return this.value && value ? setTime(this.value, value) : value;\n }\n togglePopup(show) {\n const event = new PreventableEvent();\n if (!this._show && show) {\n this.open.emit(event);\n }\n else if (this._show && !show) {\n this.close.emit(event);\n }\n if (event.isDefaultPrevented()) {\n return;\n }\n this._toggle(show);\n this.toggleFocus();\n }\n _toggle(show) {\n if (show === this.isOpen) {\n return;\n }\n this._show = show;\n this.cdr.markForCheck();\n if (show) {\n const direction = this.localization.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchor: this.wrapper,\n anchorAlign: { vertical: 'bottom', horizontal: direction },\n animate: this.popupSettings.animate,\n appendTo: this.appendTo,\n content: this.popupTemplate,\n popupAlign: { vertical: 'top', horizontal: direction },\n popupClass: this.popupClasses,\n positionMode: 'absolute'\n });\n this.popupRef.popupElement.setAttribute('id', this.popupUID);\n this.popupRef.popupAnchorViewportLeave.subscribe(() => this.show = false);\n }\n else {\n this.popupRef.close();\n this.popupRef = null;\n }\n }\n focusInput() {\n if (this.touchEnabled) {\n return;\n }\n this.input.focus();\n }\n toggleFocus() {\n if (!this.isActive) {\n return;\n }\n if (this.show) {\n if (!this.timeSelector) {\n this.cdr.detectChanges();\n }\n if (this.isActive) {\n this.timeSelector.focus();\n }\n }\n else if (!this.touchEnabled) {\n this.input.focus();\n }\n else if (!this.input.isActive) {\n this.handleBlur();\n }\n }\n verifyValue(value) {\n if (!isDevMode()) {\n return;\n }\n if (value && !(value instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK$3} for possible resolution.`);\n }\n }\n verifyFormat() {\n if (!isDevMode()) {\n return;\n }\n const formatContainsDateParts = this.intl.splitDateFormat(this.format).some(part => !formatRegExp.test(part.type));\n if (formatContainsDateParts) {\n throw new Error(`Provided format is not supported. Supported specifiers are T|t|H|h|m|s|a. See ${INTL_DATE_FORMAT}`);\n }\n }\n bindEvents() {\n const element = this.element.nativeElement;\n this.domEvents.push(this.renderer.listen(element, 'keydown', this.handleKeydown.bind(this)));\n if (isWindowAvailable()) {\n this.windowBlurSubscription = fromEvent(window, 'blur').subscribe(this.handleWindowBlur.bind(this));\n }\n }\n handleWindowBlur() {\n if (!this.isOpen) {\n return;\n }\n this.show = false;\n }\n handleFocus() {\n if (this.isActive) {\n return;\n }\n this.isActive = true;\n if (hasObservers(this.onFocus)) {\n this.zone.run(() => {\n this.onFocus.emit();\n });\n }\n }\n handleBlur(args) {\n const currentTarget = args && currentFocusTarget(args);\n if (currentTarget && (this.input.containsElement(currentTarget) ||\n (this.timeSelector && this.timeSelector.containsElement(currentTarget)))) {\n return;\n }\n if (hasObservers(this.onBlur) || (this.show && hasObservers(this.close)) || requiresZoneOnBlur(this.control)) {\n this.zone.run(() => {\n this.blurComponent();\n this.cdr.markForCheck();\n });\n }\n else {\n this.blurComponent();\n }\n }\n blurComponent() {\n this.isActive = false; // order is important ¯\\_(ツ)_/¯\n this.show = false;\n this.onControlTouched();\n this.onBlur.emit();\n }\n handleDateCompletenessChange() {\n this.cdr.markForCheck();\n this.zone.run(() => this.onValidatorChange());\n }\n}\nTimePickerComponent.ɵfac = function TimePickerComponent_Factory(t) { return new (t || TimePickerComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc5.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(PickerService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(TOUCH_ENABLED, 8)); };\nTimePickerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TimePickerComponent, selectors: [[\"kendo-timepicker\"]], viewQuery: function TimePickerComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c15, true, ViewContainerRef);\n ɵngcc0.ɵɵviewQuery(_c16, true);\n ɵngcc0.ɵɵviewQuery(_c17, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.popupTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.wrapper = _t.first);\n } }, hostVars: 6, hostBindings: function TimePickerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.wrapperClasses)(\"k-timepicker\", ctx.wrapperClasses)(\"k-state-disabled\", ctx.disabledClass);\n } }, inputs: { focusableId: \"focusableId\", disabled: \"disabled\", readonly: \"readonly\", readOnlyInput: \"readOnlyInput\", format: \"format\", placeholder: \"placeholder\", incompleteDateValidation: \"incompleteDateValidation\", cancelButton: \"cancelButton\", nowButton: \"nowButton\", tabindex: \"tabindex\", title: \"title\", rangeValidation: \"rangeValidation\", min: \"min\", max: \"max\", steps: \"steps\", popupSettings: \"popupSettings\", tabIndex: \"tabIndex\", value: \"value\", formatPlaceholder: \"formatPlaceholder\" }, outputs: { valueChange: \"valueChange\", onFocus: \"focus\", onBlur: \"blur\", open: \"open\", close: \"close\" }, exportAs: [\"kendo-timepicker\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => TimePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => TimePickerComponent) },\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.timepicker'\n },\n PickerService\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 12, vars: 26, consts: [[\"kendoTimePickerLocalizedMessages\", \"\", 6, \"accept\", \"acceptLabel\", \"cancel\", \"cancelLabel\", \"now\", \"nowLabel\", \"toggle\"], [1, \"k-picker-wrap\"], [\"wrapper\", \"\"], [3, \"focusableId\", \"hasPopup\", \"isPopupOpen\", \"disabled\", \"readonly\", \"role\", \"ariaReadOnly\", \"format\", \"formatPlaceholder\", \"placeholder\", \"min\", \"max\", \"incompleteDateValidation\", \"steps\", \"tabindex\", \"title\", \"value\", \"valueChange\"], [\"input\", \"\"], [\"role\", \"button\", 1, \"k-select\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [1, \"k-icon\", \"k-i-clock\"], [\"popupTemplate\", \"\"], [\"container\", \"\"], [3, \"cancelButton\", \"nowButton\", \"format\", \"min\", \"max\", \"steps\", \"value\", \"kendoEventsOutsideAngular\", \"scope\", \"valueChange\", \"valueReject\"], [\"timeSelector\", \"\"], [3, \"acceptLabel\", \"accept\", \"cancelLabel\", \"cancel\", \"nowLabel\", \"now\"]], template: function TimePickerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c39);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"span\", 1, 2);\n ɵngcc0.ɵɵelementStart(4, \"kendo-dateinput\", 3, 4);\n ɵngcc0.ɵɵlistener(\"valueChange\", function TimePickerComponent_Template_kendo_dateinput_valueChange_4_listener($event) { return ctx.handleInputChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(6, \"span\", 5);\n ɵngcc0.ɵɵelement(7, \"span\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(8, TimePickerComponent_ng_template_8_Template, 3, 18, \"ng-template\", null, 7, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainer(10, null, 8);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", ctx.disabled);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"focusableId\", ctx.focusableId)(\"hasPopup\", true)(\"isPopupOpen\", ctx.show)(\"disabled\", ctx.disabled)(\"readonly\", ctx.readonly || ctx.readOnlyInput)(\"role\", ctx.inputRole)(\"ariaReadOnly\", ctx.readonly)(\"format\", ctx.format)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"placeholder\", ctx.placeholder)(\"min\", ctx.normalizeTime(ctx.min))(\"max\", ctx.normalizeTime(ctx.max))(\"incompleteDateValidation\", ctx.incompleteDateValidation)(\"steps\", ctx.steps)(\"tabindex\", !ctx.show ? ctx.tabindex : 0 - 1)(\"title\", ctx.title)(\"value\", ctx.value);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(23, _c24, ctx.handleIconClick, ctx.handleMousedown))(\"scope\", ctx);\n ɵngcc0.ɵɵattribute(\"title\", ctx.localization.get(\"toggle\"))(\"aria-label\", ctx.localization.get(\"toggle\"));\n } }, directives: function () { return [TimePickerLocalizedMessagesDirective,\n DateInputComponent, ɵngcc3.EventsOutsideAngularDirective, TimeSelectorComponent,\n TimeSelectorCustomMessagesComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nTimePickerComponent.ctorParameters = () => [\n { type: NgZone },\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: PopupService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: Injector },\n { type: PickerService },\n { type: IntlService },\n { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [TOUCH_ENABLED,] }] }\n];\nTimePickerComponent.propDecorators = {\n container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef },] }],\n popupTemplate: [{ type: ViewChild, args: ['popupTemplate',] }],\n wrapper: [{ type: ViewChild, args: ['wrapper',] }],\n focusableId: [{ type: Input }],\n disabled: [{ type: Input }],\n readonly: [{ type: Input }],\n readOnlyInput: [{ type: Input }],\n format: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n incompleteDateValidation: [{ type: Input }],\n cancelButton: [{ type: Input }],\n nowButton: [{ type: Input }],\n steps: [{ type: Input }],\n popupSettings: [{ type: Input }],\n tabindex: [{ type: Input }],\n tabIndex: [{ type: Input }],\n title: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n value: [{ type: Input }],\n valueChange: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n wrapperClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-timepicker',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimePickerComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-timepicker',\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => TimePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => TimePickerComponent) },\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.timepicker'\n },\n PickerService\n ],\n selector: 'kendo-timepicker',\n template: `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.NgZone }, { type: ɵngcc4.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc5.PopupService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.Injector }, { type: PickerService }, { type: ɵngcc1.IntlService }, { type: Boolean, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [TOUCH_ENABLED]\n }] }]; }, { focusableId: [{\n type: Input\n }], disabled: [{\n type: Input\n }], readonly: [{\n type: Input\n }], readOnlyInput: [{\n type: Input\n }], format: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], incompleteDateValidation: [{\n type: Input\n }], cancelButton: [{\n type: Input\n }], nowButton: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], title: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], wrapperClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-timepicker']\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], steps: [{\n type: Input\n }], popupSettings: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], value: [{\n type: Input\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], container: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef }]\n }], popupTemplate: [{\n type: ViewChild,\n args: ['popupTemplate']\n }], wrapper: [{\n type: ViewChild,\n args: ['wrapper']\n }], formatPlaceholder: [{\n type: Input\n }] }); })();\n\nconst timeFormatRegExp = new RegExp(`${TIME_PART.hour}|${TIME_PART.minute}|${TIME_PART.second}|${TIME_PART.dayperiod}|literal`);\nconst VALUE_DOC_LINK$4 = 'https://www.telerik.com/kendo-angular-ui/components/dateinputs/datetimepicker/integration-with-json/';\nconst MIN_MAX_DOC_LINK = 'https://www.telerik.com/kendo-angular-ui/components/dateinputs/datetimepicker/date-time-limits/';\nconst DEFAULT_ACTIVE_TAB = 'date';\nconst DEFAULT_DATEINPUT_FORMAT = 'g';\nconst DEFAULT_TIMESELECTOR_FORMAT = 't';\n/**\n * Represents the [Kendo UI DateTimePicker component for Angular]({% slug overview_datetimepicker %}).\n */\nclass DateTimePickerComponent {\n constructor(popupService, intl, cdr, pickerService, ngZone, host, touchEnabled$$1, localization, disabledDatesService, renderer) {\n this.popupService = popupService;\n this.intl = intl;\n this.cdr = cdr;\n this.pickerService = pickerService;\n this.ngZone = ngZone;\n this.host = host;\n this.touchEnabled = touchEnabled$$1;\n this.localization = localization;\n this.disabledDatesService = disabledDatesService;\n this.renderer = renderer;\n /**\n * @hidden\n */\n this.hostClasses = true;\n /**\n * @hidden\n */\n this.focusableId = `k-${guid()}`;\n /**\n * Sets the title of the input element of the DateTimePicker.\n */\n this.title = '';\n /**\n * Sets or gets the `disabled` property of the DateTimePicker and determines whether the component is active\n * ([see example]({% slug disabled_datetimepicker %})).\n */\n this.disabled = false;\n /**\n * Sets the read-only state of the DateTimePicker\n * ([see example]({% slug readonly_datetimepicker %}#toc-read-only-datetimepicker)).\n */\n this.readonly = false;\n /**\n * Sets the read-only state of the DateTimePicker input field\n * ([see example]({% slug readonly_datetimepicker %}#toc-read-only-input)).\n *\n * > Note that if you set the [`readonly`]({% slug api_dateinputs_datetimepickercomponent %}#toc-readonly) property value to `true`,\n * the input will be rendered in a read-only state regardless of the `readOnlyInput` value.\n */\n this.readOnlyInput = false;\n /**\n * Determines whether to display the **Cancel** button in the popup\n * ([see example]({% slug datetimepicker_popup_options %}#toc-toggling-the-cancel-button)).\n */\n this.cancelButton = true;\n /**\n * Determines whether to display a week number column in the `month` view of the popup Calendar\n * ([see example]({% slug datetimepicker_calendar_options %}#toc-week-number-column)).\n */\n this.weekNumber = false;\n /**\n * Determines whether the built-in min or max validators are enforced when validating a form\n * ([see example]({% slug dateranges_datetimepicker %}#toc-prevent-invalid-input)).\n */\n this.rangeValidation = true;\n /**\n * Determines whether the built-in validator for disabled\n * date ranges is enforced when validating a form\n * ([see example]({% slug disabled_dates_datetimepicker %}#toc-validation)).\n */\n this.disabledDatesValidation = true;\n /**\n * Determines whether the built-in validation for incomplete dates is to be enforced when a form is being validated.\n */\n this.incompleteDateValidation = false;\n /**\n * Fires each time the user selects a new value.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event by setting `event.preventDefault()`, the popup will remain closed.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event by setting `event.preventDefault()`, the popup will remain open.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n */\n this.close = new EventEmitter();\n /**\n * Fires each time the user focuses the component.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n */\n this.onFocus = new EventEmitter();\n /**\n * Fires each time the user blurs the component.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n */\n this.onBlur = new EventEmitter();\n /**\n * @hidden\n *\n * Controls whether the Calendar or the TimeSelector will be displayed.\n */\n this.activeTab = DEFAULT_ACTIVE_TAB;\n /**\n * @hidden\n *\n * Specifies the stripped time-related format that is used in the TimeSelector.\n * Updates each time the `format` property value changes.\n */\n this.timeSelectorFormat = DEFAULT_TIMESELECTOR_FORMAT;\n /**\n * @hidden\n */\n this.timeSelectorMin = cloneDate(MIN_TIME);\n /**\n * @hidden\n */\n this.timeSelectorMax = cloneDate(MAX_TIME);\n /**\n * @hidden\n */\n this.calendarValue = null;\n /**\n * @hidden\n */\n this.calendarMin = cloneDate(MIN_DATE);\n /**\n * @hidden\n */\n this.calendarMax = lastMillisecondOfDate(MAX_DATE);\n this._popupSettings = { animate: true };\n this._value = null;\n this._format = DEFAULT_DATEINPUT_FORMAT;\n this._tabindex = 0;\n this._defaultTab = DEFAULT_ACTIVE_TAB;\n this._min = mergeDateAndTime(MIN_DATE, MIN_TIME);\n this._max = mergeDateAndTime(MAX_DATE, MAX_TIME);\n this._isActive = false;\n this.onControlTouched = noop;\n this.onControlChange = noop;\n this.onValidatorChange = noop;\n this.minValidateFn = noop;\n this.maxValidateFn = noop;\n this.disabledDatesValidateFn = noop;\n this.incompleteValidator = noop;\n this.subscriptions = new Subscription();\n }\n /**\n * @hidden\n */\n get input() {\n return this.pickerService.input;\n }\n /**\n * @hidden\n */\n get calendar() {\n return this.pickerService.calendar;\n }\n /**\n * @hidden\n */\n get timeSelector() {\n return this.pickerService.timeSelector;\n }\n /**\n * Specifies the value of the DateTimePicker component.\n *\n * > The `value` has to be a valid [JavaScript `Date`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) instance.\n */\n set value(value) {\n this.verifyValue(value);\n this._value = cloneDate(value);\n this.setCalendarValue(value);\n this.cdr.markForCheck();\n }\n get value() {\n return this._value;\n }\n /**\n * Specifies the date format for displaying the input value\n * ([see example]({% slug formats_datetimepicker %})).\n */\n set format(value) {\n this._format = value;\n this.timeSelectorFormat = this.getTimeSelectorFormat(value);\n }\n get format() {\n return this._format;\n }\n /**\n * Specifies the [`tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of the DateTimePicker.\n */\n set tabindex(value) {\n const tabindex = Number(value);\n const defaultValue = 0;\n this._tabindex = !isNaN(tabindex) ? tabindex : defaultValue;\n }\n get tabindex() {\n return this.disabled ? -1 : this._tabindex;\n }\n /**\n * Sets the dates of the DateTimePicker that will be disabled\n * ([see example]({% slug disabled_dates_datetimepicker %})).\n */\n set disabledDates(value) {\n this._disabledDates = value;\n this.disabledDatesService.initialize(value);\n }\n get disabledDates() {\n return this._disabledDates;\n }\n /**\n * Configures the popup settings of the DateTimePicker\n * ([see example]({% slug datetimepicker_popup_options %}#toc-customizing-the-popup)).\n *\n * The available options are:\n * - `animate: Boolean`—Controls the popup animation. By default, the open and close animations are enabled.\n * - `appendTo: 'root' | 'component' | ViewContainerRef`—Controls the popup container. By default, the popup will be appended to the root component.\n * - `popupClass: String`—Specifies a list of CSS classes that are used to style the popup.\n */\n set popupSettings(settings) {\n this._popupSettings = Object.assign({}, { animate: true }, settings);\n }\n get popupSettings() {\n return this._popupSettings;\n }\n /**\n * Specifies the smallest valid date.\n * The Calendar will not display dates before this value.\n * If the `min` value of the Calendar is selected, the TimePicker will not display\n * time entries before the specified time portion of this value\n * ([see example]({% slug dateranges_datetimepicker %})).\n */\n set min(value) {\n if (!isPresent(value)) {\n return;\n }\n this._min = cloneDate(value);\n this.calendarMin = getDate(value);\n }\n get min() {\n return this._min;\n }\n /**\n * Specifies the biggest valid date.\n * The Calendar will not display dates after this value.\n * If the `max` value of the Calendar is selected, the TimePicker will not display\n * time entries after the specified time portion of this value\n * ([see example]({% slug dateranges_datetimepicker %})).\n */\n set max(value) {\n if (!isPresent(value)) {\n return;\n }\n this._max = cloneDate(value);\n this.calendarMax = lastMillisecondOfDate(value);\n }\n get max() {\n return this._max;\n }\n /**\n * Indicates whether the component is currently open.\n */\n get isOpen() {\n return isPresent(this.popupRef);\n }\n /**\n * Indicates whether the component or its popup content is focused.\n */\n get isActive() {\n return this._isActive;\n }\n set isActive(value) {\n if (value) {\n this.renderer.addClass(this.wrapper.nativeElement, 'k-state-focused');\n }\n else {\n this.renderer.removeClass(this.wrapper.nativeElement, 'k-state-focused');\n }\n this._isActive = value;\n }\n /**\n * Sets the active tab on opening the popup\n * ([see example]({% slug datetimepicker_popup_options %}#toc-setting-the-default-tab)).\n */\n set defaultTab(tab) {\n this._defaultTab = tab || DEFAULT_ACTIVE_TAB;\n this.activeTab = this.defaultTab;\n }\n get defaultTab() {\n return this._defaultTab;\n }\n /**\n * @hidden\n */\n get tabSwitchTransition() {\n /*\n When the popup is opening, disables the set transition in the themes. When `defaultTab` is set to `time`,\n the popup opens with an active **Time** tab and the animation of the initial transition is undesired.\n Setting the inline transition style to `none` overrides the set animation in the themes.\n Setting the inline transition style to `null` does not apply any inline styles or override the themes CSS.\n */\n return this.isOpen ? null : 'none';\n }\n /**\n * @hidden\n *\n * Indicates whether the Calendar will be disabled.\n * The inactive tab component gets disabled and becomes inaccessible on tab click.\n */\n get disableCalendar() {\n return this.activeTab !== 'date' && !this.calendar.isActive;\n }\n /**\n * @hidden\n */\n get inputRole() {\n return this.readOnlyInput ? 'listbox' : 'spinbutton';\n }\n /**\n * @hidden\n *\n * Indicates whether the TimeSelector will be disabled.\n * The inactive tab component gets disabled and becomes inaccessible on tab click.\n */\n get disableTimeSelector() {\n return this.activeTab !== 'time' && !this.timeSelector.isActive;\n }\n get activeTabComponent() {\n if (!this.isOpen) {\n return;\n }\n if (!(isPresent(this.calendar) || isPresent(this.timeSelector))) {\n this.cdr.detectChanges();\n }\n return this.activeTab === 'date' ? this.calendar : this.timeSelector;\n }\n get appendTo() {\n const { appendTo } = this.popupSettings;\n if (!isPresent(appendTo) || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.container : appendTo;\n }\n ngOnInit() {\n this.subscriptions.add(this.pickerService.onFocus\n // detect popup changes to disable the inactive view mark-up when the popup is open\n .pipe(tap(this.detectPopupChanges.bind(this)))\n .subscribe(this.handleFocus.bind(this)));\n this.subscriptions.add(this.pickerService.onBlur.subscribe(this.handleBlur.bind(this)));\n this.subscriptions.add(this.pickerService.sameDateSelected.subscribe(this.handleCalendarValueChange.bind(this)));\n this.subscriptions.add(this.localization.changes.subscribe(() => this.cdr.markForCheck()));\n this.subscriptions.add(this.pickerService.dateCompletenessChange.subscribe(this.handleDateCompletenessChange.bind(this)));\n if (isWindowAvailable()) {\n this.subscriptions.add(this.ngZone.runOutsideAngular(() => fromEvent(window, 'blur').subscribe(this.handleCancel.bind(this))));\n }\n }\n ngOnChanges(changes) {\n if (isPresent(changes.min) || isPresent(changes.max)) {\n this.verifyMinMaxRange();\n }\n if (changes.min || changes.max || changes.rangeValidation || changes.disabledDatesValidation || changes.disabledDates || changes.incompleteDateValidation) {\n this.minValidateFn = this.rangeValidation ? minValidator(this.min) : noop;\n this.maxValidateFn = this.rangeValidation ? maxValidator(this.max) : noop;\n this.disabledDatesValidateFn = this.disabledDatesValidation ? disabledDatesValidator(this.disabledDatesService.isDateDisabled) : noop;\n this.incompleteValidator = this.incompleteDateValidation ? incompleteDateValidator() : noop;\n this.onValidatorChange();\n }\n }\n ngOnDestroy() {\n if (this.isOpen) {\n this.closePopup();\n }\n this.subscriptions.unsubscribe();\n }\n /**\n * * If the popup is closed, focuses the DateTimePicker input.\n * * If the popup is open, the focus is moved to its content.\n */\n focus() {\n if (this.disabled) {\n return;\n }\n if (this.isOpen) {\n this.activeTabComponent.focus();\n }\n else {\n this.input.focus();\n }\n }\n /**\n * Blurs the DateTimePicker.\n */\n blur() {\n if (this.isOpen && this.activeTabComponent.isActive) {\n this.activeTabComponent.blur();\n }\n else {\n this.input.blur();\n }\n }\n /**\n * Toggles the visibility of the popup. If you use the `toggle` method to show or hide the popup,\n * the `open` and `close` events do not fire.\n * ([more information and example]({% slug overview_datetimepicker %}#toc-methods-and-events)).\n *\n * @param show - The state of the popup.\n */\n toggle(show) {\n if (this.disabled || this.readonly || show === this.isOpen) {\n return;\n }\n const shouldOpen = isPresent(show) ? show : !this.isOpen;\n if (shouldOpen) {\n this.openPopup();\n }\n else {\n this.closePopup();\n // Changes the tab and the calendar or clock icon to the designated default.\n if (this.activeTab !== this.defaultTab) {\n this.activeTab = this.defaultTab;\n this.cdr.detectChanges();\n }\n }\n }\n /**\n * @hidden\n */\n writeValue(value) {\n this.value = value;\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * @hidden\n */\n setDisabledState(disabled) {\n this.disabled = disabled;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.minValidateFn(control) || this.maxValidateFn(control) || this.disabledDatesValidateFn(control) || this.incompleteValidator(control, this.input && this.input.isDateIncomplete);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * @hidden\n *\n * Used by the TextBoxContainer to determine if the floating label will render in the input.\n */\n isEmpty() {\n return !isPresent(this.value) && this.input.isEmpty();\n }\n /**\n * @hidden\n */\n handleIconClick(event) {\n if (this.disabled || this.readonly) {\n return;\n }\n // prevents the event default to evade focusing the DateInput input when placed inside a label (FF/IE/Edge)\n event.preventDefault();\n const runInZone = !this.isOpen || hasObservers(this.close);\n this.run(runInZone, () => {\n const shouldOpen = !this.isOpen;\n // handle focus first to maintain correct event order `focus` => `open`\n this.handleFocus();\n this.togglePopup(shouldOpen);\n this.switchFocus();\n });\n }\n /**\n * @hidden\n */\n handleFocus() {\n if (this.isActive) {\n return;\n }\n this.isActive = true;\n if (hasObservers(this.onFocus)) {\n this.ngZone.run(() => this.onFocus.emit());\n }\n }\n /**\n * @hidden\n */\n handleBlur(event) {\n if (!this.isActive || this.focusTargetInComponent(event)) {\n return;\n }\n this.isActive = false;\n const isNgControlUntouched = this.host.nativeElement.classList.contains('ng-untouched');\n const runInZone = isNgControlUntouched || hasObservers(this.onBlur) || (this.isOpen && hasObservers(this.close));\n this.run(runInZone, () => {\n this.onBlur.emit();\n this.onControlTouched();\n this.togglePopup(false);\n this.cdr.markForCheck();\n });\n }\n /**\n * @hidden\n */\n changeActiveTab(tab) {\n if (!this.isOpen || this.activeTab === tab) {\n return;\n }\n // persists the Tcurrent value of the TimeSelector when switching between tabs\n if (!isEqual(this.timeSelector.value, this.timeSelector.current)) {\n this.timeSelector.handleAccept();\n }\n this.activeTab = tab;\n this.cdr.detectChanges();\n this.detectPopupChanges();\n }\n /**\n * @hidden\n */\n handleTabChangeTransitionEnd(dateTimeSelector, event) {\n // handle only the .k-datetime-selector element transition, ignore any child element transitions\n if (event.target !== dateTimeSelector) {\n return;\n }\n this.activeTabComponent.focus();\n }\n /**\n * @hidden\n */\n handleAccept() {\n if (!this.isOpen) {\n return;\n }\n const candidate = mergeDateAndTime(this.calendar.value, this.timeSelector.current);\n const valueChangePresent = !isEqual(this.value, candidate);\n const runInZone = valueChangePresent || hasObservers(this.close);\n this.run(runInZone, () => {\n this.handleValueChange(candidate);\n this.togglePopup(false);\n });\n }\n /**\n * @hidden\n */\n handleCancel() {\n if (!this.isOpen) {\n return;\n }\n const runInZone = hasObservers(this.close);\n this.run(runInZone, () => this.togglePopup(false));\n }\n /**\n * @hidden\n */\n handleInputValueChange(value) {\n this.handleValueChange(value);\n if (this.isOpen) {\n this.togglePopup(false);\n }\n }\n /**\n * @hidden\n */\n handleCalendarValueChange() {\n this.setTimeSelectorMinMax(this.calendar.value);\n this.changeActiveTab('time');\n }\n /**\n * @hidden\n */\n handleKeyDown(event) {\n if (this.disabled || this.readonly) {\n return;\n }\n const { keyCode, altKey } = event;\n switch (keyCode) {\n case altKey && Keys.ArrowUp:\n case Keys.Escape:\n this.handleCancel();\n break;\n case !this.isOpen && altKey && Keys.ArrowDown:\n this.ngZone.run(() => this.togglePopup(true));\n break;\n case altKey && Keys.ArrowRight:\n this.changeActiveTab('time');\n break;\n case altKey && Keys.ArrowLeft:\n this.changeActiveTab('date');\n break;\n case this.isOpen && this.timeSelector.isActive && isPresent(this.calendarValue) && Keys.Enter:\n this.handleAccept();\n break;\n default: return;\n }\n event.preventDefault();\n }\n /**\n * @hidden\n */\n handleTabOut(event) {\n const { keyCode, shiftKey, target } = event;\n // if no focusable next sibling elements exist in the controls sections, the user is tabbing out of the popup\n const focusableSiblingAvailable = isPresent(target.nextElementSibling) && !target.nextElementSibling.disabled;\n if (keyCode === Keys.Tab && !shiftKey && !focusableSiblingAvailable) {\n this.input.focus();\n this.handleCancel();\n }\n }\n /**\n * @hidden\n */\n handleBackTabOut(event) {\n const { keyCode, shiftKey } = event;\n if (keyCode === Keys.Tab && shiftKey) {\n this.input.focus();\n }\n }\n /**\n * @hidden\n *\n * Prevents the diversion of the focus from the currently active element in the component.\n */\n preventMouseDown(event) {\n event.preventDefault();\n }\n verifyValue(value) {\n if (!isDevMode()) {\n return;\n }\n if (isPresent(value) && !(value instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK$4} for possible resolution.`);\n }\n }\n verifyMinMaxRange() {\n if (!isDevMode()) {\n return;\n }\n if (!isValidRange(this.min, this.max)) {\n throw new Error(`The max value should be bigger than the min. See ${MIN_MAX_DOC_LINK}.`);\n }\n }\n /**\n * Extracts the time slots and the literals that are not preceded by date parts\n * and concatenates the resulting parts into a string.\n * If the provided format value does not contain any time parts,\n * returns the designated format of the default popup component of the TimePicker.\n */\n getTimeSelectorFormat(format) {\n const timeSelectorFormat = this.intl\n .splitDateFormat(format)\n .filter(this.timeFormatPartFilter)\n .reduce((format, part) => format += part.pattern, '');\n return timeSelectorFormat || DEFAULT_TIMESELECTOR_FORMAT;\n }\n /**\n * The filter expression that filters out all format parts\n * except for `hour`, `minute`, `second`, `dayperiod`, and specific literals.\n * Literals will be left only if they are not preceded by date parts.\n */\n timeFormatPartFilter(part, index, parts) {\n const previousPart = index >= 1 && parts[index - 1];\n if (previousPart && part.type === 'literal') {\n return timeFormatRegExp.test(previousPart.type);\n }\n return timeFormatRegExp.test(part.type);\n }\n togglePopup(open) {\n if (open === this.isOpen) {\n return;\n }\n const event = new PreventableEvent();\n open ? this.open.emit(event) : this.close.emit(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n this.toggle(open);\n this.switchFocus();\n }\n switchFocus() {\n if (!this.isActive) {\n return;\n }\n if (this.isOpen) {\n this.activeTabComponent.focus();\n }\n else if (!this.touchEnabled) {\n this.input.focus();\n }\n else if (!this.input.isActive) {\n this.handleBlur();\n }\n }\n openPopup() {\n this.setCalendarValue(this.value);\n this.setTimeSelectorMinMax(this.value);\n const direction = this.localization.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchor: this.wrapper,\n content: this.popupTemplate,\n positionMode: 'absolute',\n animate: this.popupSettings.animate,\n appendTo: this.appendTo,\n popupClass: `k-datetime-container ${this.popupSettings.popupClass || ''}`,\n anchorAlign: { vertical: 'bottom', horizontal: direction },\n popupAlign: { vertical: 'top', horizontal: direction }\n });\n this.popupRef.popupAnchorViewportLeave.subscribe(() => this.handleCancel());\n }\n closePopup() {\n if (!this.isOpen) {\n return;\n }\n this.popupRef.close();\n this.popupRef = null;\n }\n handleValueChange(value) {\n if (isEqual(this.value, value)) {\n return;\n }\n this.value = cloneDate(value);\n this.onControlChange(cloneDate(value));\n this.valueChange.emit(cloneDate(value));\n }\n /**\n * Indicates whether the focus target is part of this component,\n * that is, whether the focus target is inside the component wrapper or in the popup.\n */\n focusTargetInComponent(event) {\n if (!isPresent(event)) {\n return false;\n }\n const relatedTarget = event.relatedTarget || document.activeElement;\n const focusInPopup = isPresent(this.popupRef) && this.popupRef.popupElement.contains(relatedTarget);\n const focusInWrapper = this.wrapper.nativeElement.contains(relatedTarget);\n return focusInPopup || focusInWrapper;\n }\n setTimeSelectorMinMax(selectedDate) {\n const minDateSelected = isPresent(selectedDate) && isEqual(getDate(selectedDate), getDate(this.min));\n this.timeSelectorMin = cloneDate(minDateSelected ? this.min : MIN_TIME);\n const maxDateSelected = isPresent(selectedDate) && isEqual(getDate(selectedDate), getDate(this.max));\n this.timeSelectorMax = cloneDate(maxDateSelected ? this.max : MAX_TIME);\n }\n setCalendarValue(value) {\n const isInCalendarRange = isPresent(value) && isInRange(value, this.calendarMin, this.calendarMax);\n this.calendarValue = isInCalendarRange ? getDate(value) : null;\n }\n /**\n * If the popup is available, runs a popup change detection.\n */\n detectPopupChanges() {\n if (!this.isOpen) {\n return;\n }\n this.popupRef.popup.changeDetectorRef.detectChanges();\n }\n /**\n * Depending on the predicate `runInZone` value that is passed,\n * runs the provided function either in the Angular or in the current zone.\n */\n run(runInZone, fn) {\n if (runInZone) {\n this.ngZone.run(() => fn());\n }\n else {\n fn();\n }\n }\n handleDateCompletenessChange() {\n this.cdr.markForCheck();\n this.ngZone.run(() => this.onValidatorChange());\n }\n}\nDateTimePickerComponent.ɵfac = function DateTimePickerComponent_Factory(t) { return new (t || DateTimePickerComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc5.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(PickerService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(TOUCH_ENABLED), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nDateTimePickerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateTimePickerComponent, selectors: [[\"kendo-datetimepicker\"]], contentQueries: function DateTimePickerComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MonthCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, YearCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DecadeCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, CenturyCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, WeekNumberCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, HeaderTitleTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.cellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.monthCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.yearCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.decadeCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.centuryCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.weekNumberTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTitleTemplate = _t.first);\n } }, viewQuery: function DateTimePickerComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c17, true);\n ɵngcc0.ɵɵviewQuery(_c15, true, ViewContainerRef);\n ɵngcc0.ɵɵviewQuery(_c16, true, TemplateRef);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.wrapper = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.popupTemplate = _t.first);\n } }, hostVars: 4, hostBindings: function DateTimePickerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-datetimepicker\", ctx.hostClasses);\n } }, inputs: { focusableId: \"focusableId\", title: \"title\", disabled: \"disabled\", readonly: \"readonly\", readOnlyInput: \"readOnlyInput\", cancelButton: \"cancelButton\", weekNumber: \"weekNumber\", rangeValidation: \"rangeValidation\", disabledDatesValidation: \"disabledDatesValidation\", incompleteDateValidation: \"incompleteDateValidation\", value: \"value\", format: \"format\", tabindex: \"tabindex\", disabledDates: \"disabledDates\", popupSettings: \"popupSettings\", min: \"min\", max: \"max\", defaultTab: \"defaultTab\", formatPlaceholder: \"formatPlaceholder\", placeholder: \"placeholder\", steps: \"steps\", focusedDate: \"focusedDate\" }, outputs: { valueChange: \"valueChange\", open: \"open\", close: \"close\", onFocus: \"focus\", onBlur: \"blur\" }, exportAs: [\"kendo-datetimepicker\"], features: [ɵngcc0.ɵɵProvidersFeature([\n PickerService,\n LocalizationService,\n DisabledDatesService,\n { provide: L10N_PREFIX, useValue: 'kendo.datetimepicker' },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DateTimePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => DateTimePickerComponent) }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 12, vars: 34, consts: [[\"kendoDateTimePickerLocalizedMessages\", \"\", 6, \"dateTab\", \"dateTabLabel\", \"timeTab\", \"timeTabLabel\", \"toggle\", \"accept\", \"acceptLabel\", \"cancel\", \"cancelLabel\", \"now\", \"nowLabel\", \"today\"], [1, \"k-picker-wrap\"], [\"wrapper\", \"\"], [3, \"value\", \"format\", \"min\", \"max\", \"incompleteDateValidation\", \"formatPlaceholder\", \"placeholder\", \"disabled\", \"readonly\", \"role\", \"ariaReadOnly\", \"steps\", \"tabindex\", \"title\", \"focusableId\", \"hasPopup\", \"isPopupOpen\", \"kendoEventsOutsideAngular\", \"scope\", \"valueChange\"], [1, \"k-select\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [1, \"k-link\", \"k-link-date\"], [1, \"k-icon\"], [\"container\", \"\"], [\"popupTemplate\", \"\"], [3, \"kendoEventsOutsideAngular\", \"scope\"], [1, \"k-datetime-buttongroup\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [1, \"k-button-group\", \"k-button-group-stretched\"], [\"type\", \"button\", 1, \"k-button\", \"k-date-tab\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [\"type\", \"button\", 1, \"k-button\", \"k-time-tab\", 3, \"kendoEventsOutsideAngular\"], [1, \"k-datetime-selector\", 3, \"kendoEventsOutsideAngular\"], [\"dateTimeSelector\", \"\"], [1, \"k-datetime-calendar-wrap\"], [3, \"value\", \"min\", \"max\", \"focusedDate\", \"weekNumber\", \"navigation\", \"cellTemplate\", \"monthCellTemplate\", \"yearCellTemplate\", \"decadeCellTemplate\", \"centuryCellTemplate\", \"weekNumberTemplate\", \"headerTitleTemplate\", \"disabled\", \"disabledDates\", \"valueChange\"], [3, \"today\"], [1, \"k-datetime-time-wrap\"], [3, \"value\", \"format\", \"min\", \"max\", \"setButton\", \"cancelButton\", \"steps\", \"disabled\"], [3, \"now\", \"nowLabel\"], [1, \"k-datetime-footer\", \"k-action-buttons\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [\"type\", \"button\", \"class\", \"k-button k-time-cancel\", 3, \"kendoEventsOutsideAngular\", \"scope\", 4, \"ngIf\"], [\"type\", \"button\", 1, \"k-time-accept\", \"k-button\", \"k-primary\", 3, \"disabled\", \"kendoEventsOutsideAngular\", \"scope\"], [\"type\", \"button\", 1, \"k-button\", \"k-time-cancel\", 3, \"kendoEventsOutsideAngular\", \"scope\"]], template: function DateTimePickerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c65);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"span\", 1, 2);\n ɵngcc0.ɵɵelementStart(4, \"kendo-dateinput\", 3);\n ɵngcc0.ɵɵlistener(\"valueChange\", function DateTimePickerComponent_Template_kendo_dateinput_valueChange_4_listener($event) { return ctx.handleInputValueChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(5, \"span\", 4);\n ɵngcc0.ɵɵelementStart(6, \"span\", 5);\n ɵngcc0.ɵɵelement(7, \"span\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainer(8, null, 7);\n ɵngcc0.ɵɵtemplate(10, DateTimePickerComponent_ng_template_10_Template, 19, 77, \"ng-template\", null, 8, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", ctx.disabled);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"value\", ctx.value)(\"format\", ctx.format)(\"min\", ctx.min)(\"max\", ctx.max)(\"incompleteDateValidation\", ctx.incompleteDateValidation)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"placeholder\", ctx.placeholder)(\"disabled\", ctx.disabled)(\"readonly\", ctx.readonly || ctx.readOnlyInput)(\"role\", ctx.inputRole)(\"ariaReadOnly\", ctx.readonly)(\"steps\", ctx.steps)(\"tabindex\", ctx.tabindex)(\"title\", ctx.title)(\"focusableId\", ctx.focusableId)(\"hasPopup\", true)(\"isPopupOpen\", ctx.isOpen)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(29, _c23, ctx.handleKeyDown))(\"scope\", ctx);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(31, _c71, ctx.preventMouseDown, ctx.handleIconClick))(\"scope\", ctx);\n ɵngcc0.ɵɵattribute(\"title\", ctx.localization.get(\"toggle\"))(\"aria-label\", ctx.localization.get(\"toggle\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-i-calendar\", ctx.activeTab === \"date\")(\"k-i-clock\", ctx.activeTab === \"time\");\n } }, directives: function () { return [LocalizedMessagesDirective,\n DateInputComponent, ɵngcc3.EventsOutsideAngularDirective, CalendarComponent,\n CalendarCustomMessagesComponent,\n TimeSelectorComponent,\n TimeSelectorCustomMessagesComponent, ɵngcc2.NgIf]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nDateTimePickerComponent.ctorParameters = () => [\n { type: PopupService },\n { type: IntlService },\n { type: ChangeDetectorRef },\n { type: PickerService },\n { type: NgZone },\n { type: ElementRef },\n { type: Boolean, decorators: [{ type: Inject, args: [TOUCH_ENABLED,] }] },\n { type: LocalizationService },\n { type: DisabledDatesService },\n { type: Renderer2 }\n];\nDateTimePickerComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-datetimepicker',] }],\n wrapper: [{ type: ViewChild, args: ['wrapper',] }],\n value: [{ type: Input }],\n format: [{ type: Input }],\n tabindex: [{ type: Input }],\n disabledDates: [{ type: Input }],\n popupSettings: [{ type: Input }],\n focusableId: [{ type: Input }],\n title: [{ type: Input }],\n disabled: [{ type: Input }],\n readonly: [{ type: Input }],\n readOnlyInput: [{ type: Input }],\n cancelButton: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n steps: [{ type: Input }],\n focusedDate: [{ type: Input }],\n weekNumber: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n disabledDatesValidation: [{ type: Input }],\n incompleteDateValidation: [{ type: Input }],\n valueChange: [{ type: Output }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n onFocus: [{ type: Output, args: ['focus',] }],\n onBlur: [{ type: Output, args: ['blur',] }],\n defaultTab: [{ type: Input }],\n cellTemplate: [{ type: ContentChild, args: [CellTemplateDirective,] }],\n monthCellTemplate: [{ type: ContentChild, args: [MonthCellTemplateDirective,] }],\n yearCellTemplate: [{ type: ContentChild, args: [YearCellTemplateDirective,] }],\n decadeCellTemplate: [{ type: ContentChild, args: [DecadeCellTemplateDirective,] }],\n centuryCellTemplate: [{ type: ContentChild, args: [CenturyCellTemplateDirective,] }],\n weekNumberTemplate: [{ type: ContentChild, args: [WeekNumberCellTemplateDirective,] }],\n headerTitleTemplate: [{ type: ContentChild, args: [HeaderTitleTemplateDirective,] }],\n container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef },] }],\n popupTemplate: [{ type: ViewChild, args: ['popupTemplate', { read: TemplateRef },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateTimePickerComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-datetimepicker',\n exportAs: 'kendo-datetimepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n PickerService,\n LocalizationService,\n DisabledDatesService,\n { provide: L10N_PREFIX, useValue: 'kendo.datetimepicker' },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimePickerComponent), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => DateTimePickerComponent), multi: true },\n { provide: KendoInput, useExisting: forwardRef(() => DateTimePickerComponent) }\n ],\n template: `\n \n
\n\n \n \n \n \n \n \n \n \n \n \n\n \n\n \n \n
\n
\n \n {{localization.get('dateTab')}}\n \n \n {{localization.get('timeTab')}}\n \n
\n
\n \n
\n \n \n \n \n
\n
\n \n \n \n \n
\n \n \n \n {{localization.get('cancel')}}\n \n \n {{localization.get('accept')}}\n \n \n \n
\n `\n }]\n }], function () { return [{ type: ɵngcc5.PopupService }, { type: ɵngcc1.IntlService }, { type: ɵngcc0.ChangeDetectorRef }, { type: PickerService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ElementRef }, { type: Boolean, decorators: [{\n type: Inject,\n args: [TOUCH_ENABLED]\n }] }, { type: ɵngcc4.LocalizationService }, { type: DisabledDatesService }, { type: ɵngcc0.Renderer2 }]; }, { hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-datetimepicker']\n }], focusableId: [{\n type: Input\n }], title: [{\n type: Input\n }], disabled: [{\n type: Input\n }], readonly: [{\n type: Input\n }], readOnlyInput: [{\n type: Input\n }], cancelButton: [{\n type: Input\n }], weekNumber: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], disabledDatesValidation: [{\n type: Input\n }], incompleteDateValidation: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], value: [{\n type: Input\n }], format: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], disabledDates: [{\n type: Input\n }], popupSettings: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], defaultTab: [{\n type: Input\n }], wrapper: [{\n type: ViewChild,\n args: ['wrapper']\n }], formatPlaceholder: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], steps: [{\n type: Input\n }], focusedDate: [{\n type: Input\n }], cellTemplate: [{\n type: ContentChild,\n args: [CellTemplateDirective]\n }], monthCellTemplate: [{\n type: ContentChild,\n args: [MonthCellTemplateDirective]\n }], yearCellTemplate: [{\n type: ContentChild,\n args: [YearCellTemplateDirective]\n }], decadeCellTemplate: [{\n type: ContentChild,\n args: [DecadeCellTemplateDirective]\n }], centuryCellTemplate: [{\n type: ContentChild,\n args: [CenturyCellTemplateDirective]\n }], weekNumberTemplate: [{\n type: ContentChild,\n args: [WeekNumberCellTemplateDirective]\n }], headerTitleTemplate: [{\n type: ContentChild,\n args: [HeaderTitleTemplateDirective]\n }], container: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef }]\n }], popupTemplate: [{\n type: ViewChild,\n args: ['popupTemplate', { read: TemplateRef }]\n }] }); })();\n\n/* tslint:disable:component-selector-name component-selector-type */\nconst DEFAULT_VIEWS_LENGTH = 2;\n/**\n * @hidden\n */\nclass HorizontalViewListComponent {\n constructor(bus, cdr) {\n this.bus = bus;\n this.cdr = cdr;\n this.activeView = CalendarViewEnum.month;\n this.isActive = true;\n this.min = new Date(MIN_DATE);\n this.max = new Date(MAX_DATE);\n this.views = DEFAULT_VIEWS_LENGTH;\n this.valueChange = new EventEmitter();\n this.cellEnter = new EventEmitter();\n this.cellLeave = new EventEmitter();\n this.dates = [];\n }\n get weekNumber() {\n return this.showWeekNumbers && this.isMonthView();\n }\n set weekNumber(showWeekNumbers) {\n this.showWeekNumbers = showWeekNumbers;\n }\n get getComponentClass() {\n return true;\n }\n get getComponentMonthClass() {\n return this.activeView === CalendarViewEnum.month;\n }\n get getComponentYearClass() {\n return this.activeView === CalendarViewEnum.year;\n }\n get getComponentDecadeClass() {\n return this.activeView === CalendarViewEnum.decade;\n }\n get getComponentCenturyClass() {\n return this.activeView === CalendarViewEnum.century;\n }\n ngOnChanges(changes) {\n this.initService();\n if (!this.service) {\n return;\n }\n this.views = this.views || DEFAULT_VIEWS_LENGTH;\n const focusedDate = this.focusedDate;\n const viewDate = this.clampDate(this.service.viewDate(focusedDate, this.max, this.views));\n this.skip = this.service.skip(viewDate, this.min);\n this.total = this.service.total(this.min, this.max);\n const activeViewChanged = hasChange(changes, 'activeView');\n const viewsHasChanged = this.views > 0 && hasChange(changes, 'views');\n if (activeViewChanged || !this.isInDates(focusedDate) || viewsHasChanged || !this.activeDate) {\n this.dates = this.service.datesList(viewDate, this.getTake(this.skip));\n this.activeDate = cloneDate(this.dates[0]);\n }\n }\n initService() {\n this.service = this.bus.service(this.activeView);\n }\n handleDateChange(candidate) {\n this.valueChange.emit(candidate);\n }\n isMonthView() {\n return this.activeView === CalendarViewEnum.month;\n }\n navigate(action) {\n const candidate = this.move(action);\n const list = this.service.datesList(candidate, this.getTake(this.skip));\n if (this.isListInRange(list)) {\n this.dates = list;\n }\n this.activeDate = cloneDate(this.dates[0]);\n this.focusedDate = cloneDate(candidate);\n this.cdr.markForCheck();\n return cloneDate(candidate);\n }\n canNavigate(action) {\n if (!this.service) {\n return false;\n }\n return this.isListInRange(this.service.datesList(this.move(action), this.getTake(this.skip)));\n }\n clampDate(value) {\n return dateInRange(value, this.min, this.max);\n }\n move(action) {\n return this.service.move(this.dates[0] || this.focusedDate, action);\n }\n isListInRange(list) {\n const lowerBound = this.service.beginningOfPeriod(this.min);\n const upperBound = this.service.beginningOfPeriod(this.service.addToDate(this.max, 1));\n return lowerBound <= list[0] && list[list.length - 1] < upperBound;\n }\n isInDates(value) {\n return this.service.isInArray(value, this.dates);\n }\n getTake(skip) {\n return Math.min(this.total - skip, this.views);\n }\n}\nHorizontalViewListComponent.ɵfac = function HorizontalViewListComponent_Factory(t) { return new (t || HorizontalViewListComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nHorizontalViewListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: HorizontalViewListComponent, selectors: [[\"kendo-calendar-horizontal\"]], hostVars: 10, hostBindings: function HorizontalViewListComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-calendar-view\", ctx.getComponentClass)(\"k-calendar-monthview\", ctx.getComponentMonthClass)(\"k-calendar-yearview\", ctx.getComponentYearClass)(\"k-calendar-decadeview\", ctx.getComponentDecadeClass)(\"k-calendar-centuryview\", ctx.getComponentCenturyClass);\n } }, inputs: { activeView: \"activeView\", isActive: \"isActive\", min: \"min\", max: \"max\", views: \"views\", weekNumber: \"weekNumber\", focusedDate: \"focusedDate\", cellTemplateRef: \"cellTemplateRef\", weekNumberTemplateRef: \"weekNumberTemplateRef\", headerTitleTemplateRef: \"headerTitleTemplateRef\", activeRangeEnd: \"activeRangeEnd\", cellUID: \"cellUID\", selectionRange: \"selectionRange\", value: \"value\" }, outputs: { valueChange: \"valueChange\", cellEnter: \"cellEnter\", cellLeave: \"cellLeave\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 3, vars: 7, consts: [[3, \"activeView\", \"currentDate\", \"min\", \"max\", \"rangeLength\", \"templateRef\", \"today\"], [1, \"k-content\"], [\"kendoCalendarView\", \"\", \"role\", \"rowgroup\", \"direction\", \"horizontal\", 3, \"activeView\", \"isActive\", \"min\", \"max\", \"cellUID\", \"focusedDate\", \"selectedDate\", \"selectionRange\", \"activeRangeEnd\", \"weekNumber\", \"templateRef\", \"weekNumberTemplateRef\", \"viewDate\", \"change\", \"cellEnter\", \"cellLeave\", 4, \"kFor\", \"kForOf\"], [\"kendoCalendarView\", \"\", \"role\", \"rowgroup\", \"direction\", \"horizontal\", 3, \"activeView\", \"isActive\", \"min\", \"max\", \"cellUID\", \"focusedDate\", \"selectedDate\", \"selectionRange\", \"activeRangeEnd\", \"weekNumber\", \"templateRef\", \"weekNumberTemplateRef\", \"viewDate\", \"change\", \"cellEnter\", \"cellLeave\"]], template: function HorizontalViewListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-calendar-header\", 0);\n ɵngcc0.ɵɵlistener(\"today\", function HorizontalViewListComponent_Template_kendo_calendar_header_today_0_listener($event) { return ctx.handleDateChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(1, \"table\", 1);\n ɵngcc0.ɵɵtemplate(2, HorizontalViewListComponent_tbody_2_Template, 1, 13, \"tbody\", 2);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"activeView\", ctx.activeView)(\"currentDate\", ctx.activeDate)(\"min\", ctx.min)(\"max\", ctx.max)(\"rangeLength\", ctx.views)(\"templateRef\", ctx.headerTitleTemplateRef);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"kForOf\", ctx.dates);\n } }, directives: function () { return [HeaderComponent,\n KForOf,\n ViewComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nHorizontalViewListComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: ChangeDetectorRef }\n];\nHorizontalViewListComponent.propDecorators = {\n cellTemplateRef: [{ type: Input }],\n weekNumberTemplateRef: [{ type: Input }],\n headerTitleTemplateRef: [{ type: Input }],\n activeRangeEnd: [{ type: Input }],\n activeView: [{ type: Input }],\n cellUID: [{ type: Input }],\n focusedDate: [{ type: Input }],\n isActive: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n selectionRange: [{ type: Input }],\n value: [{ type: Input }],\n views: [{ type: Input }],\n weekNumber: [{ type: Input }],\n valueChange: [{ type: Output }],\n cellEnter: [{ type: Output }],\n cellLeave: [{ type: Output }],\n getComponentClass: [{ type: HostBinding, args: [\"class.k-calendar-view\",] }],\n getComponentMonthClass: [{ type: HostBinding, args: [\"class.k-calendar-monthview\",] }],\n getComponentYearClass: [{ type: HostBinding, args: [\"class.k-calendar-yearview\",] }],\n getComponentDecadeClass: [{ type: HostBinding, args: [\"class.k-calendar-decadeview\",] }],\n getComponentCenturyClass: [{ type: HostBinding, args: [\"class.k-calendar-centuryview\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HorizontalViewListComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-calendar-horizontal',\n template: `\n \n \n \n \n
\n `\n }]\n }], function () { return [{ type: BusViewService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { activeView: [{\n type: Input\n }], isActive: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], views: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], cellEnter: [{\n type: Output\n }], cellLeave: [{\n type: Output\n }], weekNumber: [{\n type: Input\n }], getComponentClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-view\"]\n }], getComponentMonthClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-monthview\"]\n }], getComponentYearClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-yearview\"]\n }], getComponentDecadeClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-decadeview\"]\n }], getComponentCenturyClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-centuryview\"]\n }], focusedDate: [{\n type: Input\n }], cellTemplateRef: [{\n type: Input\n }], weekNumberTemplateRef: [{\n type: Input\n }], headerTitleTemplateRef: [{\n type: Input\n }], activeRangeEnd: [{\n type: Input\n }], cellUID: [{\n type: Input\n }], selectionRange: [{\n type: Input\n }], value: [{\n type: Input\n }] }); })();\n\nconst noop$2 = () => null;\n/**\n * @hidden\n */\nconst disabledDatesRangeValidator = (isDateDisabled) => {\n if (!isPresent(isDateDisabled)) {\n return noop$2;\n }\n return (selectedRange) => {\n const isRangeComplete = isPresent(selectedRange) && isPresent(selectedRange.start) && isPresent(selectedRange.end);\n if (!isRangeComplete || selectedRange.start > selectedRange.end) {\n return null;\n }\n const disabledDates = disabledDatesInRange(selectedRange.start, selectedRange.end, isDateDisabled);\n const error = {\n disabledDatesInRange: disabledDates\n };\n return disabledDates.length ? error : null;\n };\n};\n\n/* tslint:disable:no-forward-ref */\nconst BOTTOM_VIEW_DOC_LINK$1 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-bottomview';\nconst TOP_VIEW_DOC_LINK$1 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-topview';\nconst MIN_DOC_LINK$3 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-min';\nconst MAX_DOC_LINK$3 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/api/CalendarComponent/#toc-max';\nconst VALUE_DOC_LINK$5 = 'http://www.telerik.com/kendo-angular-ui/components/dateinputs/calendar/#toc-using-with-json';\n/**\n * @hidden\n */\nconst RANGE_CALENDAR_VALUE_ACCESSOR = {\n multi: true,\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiViewCalendarComponent) //tslint:disable-line:no-use-before-declare\n};\n/**\n * @hidden\n */\nconst RANGE_CALENDAR_RANGE_VALIDATORS = {\n multi: true,\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MultiViewCalendarComponent) //tslint:disable-line:no-use-before-declare\n};\n/**\n * Represents the Kendo UI MultiViewCalendar component for Angular.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\nclass MultiViewCalendarComponent {\n constructor(bus, element, localization, navigator, renderer, cdr, zone, disabledDatesService) {\n this.bus = bus;\n this.element = element;\n this.localization = localization;\n this.navigator = navigator;\n this.renderer = renderer;\n this.cdr = cdr;\n this.zone = zone;\n this.disabledDatesService = disabledDatesService;\n /**\n * @hidden\n */\n this.id = guid();\n /**\n * Determines whether the built-in min or max validators are enforced when validating a form.\n */\n this.rangeValidation = false;\n /**\n * Determines whether the built-in validator for disabled\n * date ranges is enforced when validating a form\n * ([see example]({% slug disabled_dates_multiviewcalendar %}#toc-validation)).\n */\n this.disabledDatesRangeValidation = false;\n /**\n * Sets or gets the `disabled` property of the Calendar and\n * determines whether the component is active\n * ([see example]({% slug disabled_multiviewcalendar %})).\n */\n this.disabled = false;\n /**\n * Sets or gets the `tabindex` property of the Calendar. Based on the\n * [HTML `tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) behavior,\n * it determines whether the component is focusable.\n */\n this.tabindex = 0;\n /**\n * Defines the active view that the Calendar initially renders\n * ([see example]({% slug activeview_multiviewcalendar %})).\n * By default, the active view is `month`.\n *\n * > You have to set `activeView` within the `topView`-`bottomView` range.\n */\n this.activeView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the bottommost view, to which the user can navigate\n * ([see example]({% slug dates_multiviewcalendar %}#toc-partial-dates)).\n */\n this.bottomView = CalendarViewEnum[CalendarViewEnum.month];\n /**\n * Defines the topmost view, to which the user can navigate.\n */\n this.topView = CalendarViewEnum[CalendarViewEnum.century];\n /**\n * Determines whether to display a week number column in the `month` view\n * ([see example]({% slug weeknumcolumn_multiviewcalendar %})).\n */\n this.weekNumber = false;\n /**\n * Sets or gets the `views` property of the Calendar and\n * defines the number of rendered months.\n */\n this.views = 2;\n /**\n * Fires when the active view is changed\n * ([more information and example]({% slug overview_multiviewcalendar %}#toc-events)).\n */\n this.activeViewChange = new EventEmitter();\n /**\n * Fires when a view cell is entered\n * ([more information and example]({% slug overview_multiviewcalendar %}#toc-events)).\n */\n this.cellEnter = new EventEmitter();\n /**\n * Fires when a view cell is leaved\n * ([more information and example]({% slug overview_multiviewcalendar %}#toc-events)).\n */\n this.cellLeave = new EventEmitter();\n /**\n * Fires when the value is changed\n * ([more information and example]({% slug overview_multiviewcalendar %}#toc-events)).\n */\n this.valueChange = new EventEmitter();\n this.cellUID = guid();\n this.isActive = false;\n this.isHovered = false;\n this.isPrevDisabled = true;\n this.isNextDisabled = true;\n this.prevView = Action.PrevView;\n this.nextView = Action.NextView;\n this._min = new Date(MIN_DATE);\n this._max = new Date(MAX_DATE);\n this._focusedDate = getToday();\n this.resolvedPromise = Promise.resolve();\n this.onControlChange = noop;\n this.onControlTouched = noop;\n this.onValidatorChange = noop;\n this.minValidateFn = noop;\n this.maxValidateFn = noop;\n this.disabledDatesRangeValidateFn = noop;\n this.subscriptions = new Subscription(() => { });\n this.setClasses(element.nativeElement);\n }\n /**\n * Sets or gets the `focusedDate` property of the Calendar and\n * defines the focused date of the component\n * ([see example]({% slug dates_multiviewcalendar %}#toc-focused-dates)).\n *\n * > If the Calendar is out of the min or max range, it normalizes the defined `focusedDate`.\n */\n set focusedDate(focusedDate) {\n this._focusedDate = focusedDate || getToday();\n }\n get focusedDate() {\n return this._focusedDate;\n }\n /**\n * Sets or gets the `min` property of the Calendar and\n * defines the minimum allowed date value.\n * By default, the `min` value is `1900-1-1`.\n */\n set min(min) {\n this._min = min || new Date(MIN_DATE);\n }\n get min() {\n return this._min;\n }\n /**\n * Sets or gets the `max` property of the Calendar and\n * defines the maximum allowed date value.\n * By default, the `max` value is `2099-12-31`.\n */\n set max(max) {\n this._max = max || new Date(MAX_DATE);\n }\n get max() {\n return this._max;\n }\n /**\n * Sets or gets the `value` property of the Calendar and defines the selected value of the component.\n *\n * > The `value` has to be a valid\n * [JavaScript `Date`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) instance.\n */\n get value() {\n return this._value;\n }\n set value(candidate) {\n this.verifyValue(candidate);\n this._value = cloneDate(candidate);\n }\n /**\n * @hidden\n */\n set tabIndex(tabIndex) {\n this.tabindex = tabIndex;\n }\n get tabIndex() {\n return this.tabindex;\n }\n /**\n * Sets the dates of the MultiViewCalendar that will be disabled\n * ([see example]({% slug disabled_dates_multiviewcalendar %})).\n */\n set disabledDates(value) {\n this.disabledDatesService.initialize(value);\n }\n /**\n * Sets or gets the `selectionRange` property of the Calendar and\n * defines the selection range of the component\n * ([see example]({% slug dates_multiviewcalendar %}#toc-selection-range)).\n */\n set selectionRange(range$$1) {\n this._selectionRange = range$$1;\n if (this.disabledDatesRangeValidation) {\n this.onValidatorChange();\n }\n }\n get selectionRange() {\n return this._selectionRange;\n }\n /**\n * @hidden\n */\n set cellTemplateRef(template) {\n this.cellTemplate = template;\n }\n /**\n * @hidden\n */\n set monthCellTemplateRef(template) {\n this.monthCellTemplate = template;\n }\n /**\n * @hidden\n */\n set yearCellTemplateRef(template) {\n this.yearCellTemplate = template;\n }\n /**\n * @hidden\n */\n set decadeCellTemplateRef(template) {\n this.decadeCellTemplate = template;\n }\n /**\n * @hidden\n */\n set centuryCellTemplateRef(template) {\n this.centuryCellTemplate = template;\n }\n /**\n * @hidden\n */\n set weekNumberTemplateRef(template) {\n this.weekNumberTemplate = template;\n }\n /**\n * @hidden\n */\n set headerTitleTemplateRef(template) {\n this.headerTitleTemplate = template;\n }\n get activeViewEnum() {\n const activeView = CalendarViewEnum[this.activeView];\n return activeView < this.bottomViewEnum ? this.bottomViewEnum : activeView;\n }\n get bottomViewEnum() {\n return CalendarViewEnum[this.bottomView];\n }\n get topViewEnum() {\n return CalendarViewEnum[this.topView];\n }\n get widgetId() {\n return this.id;\n }\n get widgetRole() {\n return 'grid';\n }\n get calendarTabIndex() {\n return this.disabled ? undefined : this.tabIndex;\n }\n get ariaDisabled() {\n return this.disabled;\n }\n get ariaActivedescendant() {\n return this.cellUID + this.focusedDate.getTime();\n }\n /**\n * @hidden\n */\n handleBlur() {\n this.onControlTouched();\n this.isActive = false;\n this.isHovered = false; //ensure that hovered is also not active\n }\n /**\n * @hidden\n */\n handleFocus() {\n this.isActive = true;\n }\n /**\n * @hidden\n */\n handleMouseEnter() {\n this.isHovered = true;\n }\n /**\n * @hidden\n */\n handleMouseLeave() {\n this.isHovered = false;\n }\n /**\n * @hidden\n */\n handleMousedown(event) {\n event.preventDefault();\n }\n /**\n * @hidden\n */\n handleClick() {\n if (this.isActive) {\n return;\n }\n this.focus();\n }\n /**\n * @hidden\n */\n keydown(event) {\n const candidate = dateInRange(this.navigator.move(this.focusedDate, this.navigator.action(event), this.activeViewEnum), this.min, this.max);\n if (isEqual(this.focusedDate, candidate)) {\n return;\n }\n this.focusedDate = candidate;\n event.preventDefault();\n }\n /**\n * @hidden\n */\n enter() {\n this.handleDateChange(this.focusedDate);\n }\n ngOnInit() {\n this.setMessages();\n this.subscriptions.add(this.localization.changes.subscribe(() => this.setMessages()));\n this.subscriptions.add(this.bus.viewChanged.subscribe(({ view }) => {\n this.activeView = CalendarViewEnum[view];\n this.activeViewChange.emit(this.activeView);\n this.cdr.detectChanges();\n this.updateButtonState();\n }));\n }\n ngOnChanges(changes) {\n this.verifyChanges();\n this.bus.configure(this.bottomViewEnum, this.topViewEnum);\n const useValue = hasExistingValue(changes, 'value') && !hasExistingValue(changes, 'focusedDate');\n const focusedDate = dateInRange(cloneDate(useValue ? this.value : this.focusedDate), this.min, this.max);\n this.focusedDate = !isEqual(this.focusedDate, focusedDate) ? focusedDate : this.focusedDate;\n if (changes.min || changes.max || changes.rangeValidation || changes.disabledDates || changes.disabledDatesRangeValidation) {\n this.minValidateFn = this.rangeValidation ? minValidator(this.min) : noop;\n this.maxValidateFn = this.rangeValidation ? maxValidator(this.max) : noop;\n this.disabledDatesRangeValidateFn = this.disabledDatesRangeValidation ? disabledDatesRangeValidator(this.disabledDatesService.isDateDisabled) : noop;\n this.onValidatorChange();\n }\n if (changes.min || changes.max || changes.focusedDate || changes.activeView) {\n this.updateButtonState();\n }\n }\n ngOnDestroy() {\n clearTimeout(this.messagesTimeout);\n this.subscriptions.unsubscribe();\n }\n ngAfterViewInit() {\n this.updateButtonState();\n }\n /**\n * Focuses the host element of the Calendar.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.focus();\n }\n /**\n * Blurs the Calendar component.\n */\n blur() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.blur();\n }\n /**\n * @hidden\n */\n handleDateChange(candidate) {\n const canNavigateDown = this.bus.canMoveDown(this.activeViewEnum);\n const isSameDate = !canNavigateDown && isEqual(candidate, this.value);\n this.focusedDate = cloneDate(candidate) || this.focusedDate;\n if (this.disabled || isSameDate) {\n return;\n }\n if (canNavigateDown) {\n this.bus.moveDown(this.activeViewEnum);\n return;\n }\n if (!this.disabledDatesService.isDateDisabled(candidate)) {\n this.value = cloneDate(candidate);\n this.onControlChange(cloneDate(candidate));\n this.valueChange.emit(cloneDate(candidate));\n }\n }\n /**\n * @hidden\n */\n writeValue(candidate) {\n this.verifyValue(candidate);\n this.focusedDate = dateInRange(cloneDate(candidate) || this.focusedDate, this.min, this.max);\n this.value = cloneDate(candidate);\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n registerOnChange(fn) {\n this.onControlChange = fn;\n }\n /**\n * @hidden\n */\n registerOnTouched(fn) {\n this.onControlTouched = fn;\n }\n /**\n * @hidden\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n validate(control) {\n return this.minValidateFn(control) || this.maxValidateFn(control) || this.disabledDatesRangeValidateFn(this.selectionRange);\n }\n /**\n * @hidden\n */\n registerOnValidatorChange(fn) {\n this.onValidatorChange = fn;\n }\n /**\n * @hidden\n */\n activeCellTemplate() {\n switch (this.activeViewEnum) {\n case CalendarViewEnum.month:\n return this.monthCellTemplate || this.cellTemplate;\n case CalendarViewEnum.year:\n return this.yearCellTemplate;\n case CalendarViewEnum.decade:\n return this.decadeCellTemplate;\n case CalendarViewEnum.century:\n return this.centuryCellTemplate;\n default:\n return null;\n }\n }\n /**\n * @hidden\n */\n navigate(action) {\n this.focusedDate = this.viewList.navigate(action);\n this.updateButtonState();\n }\n /**\n * @hidden\n */\n emitCellEvent(emitter, args) {\n if (hasObservers(emitter)) {\n this.zone.run(() => {\n emitter.emit(args);\n });\n }\n }\n setClasses(element) {\n this.renderer.addClass(element, 'k-widget');\n this.renderer.addClass(element, 'k-calendar');\n this.renderer.addClass(element, 'k-calendar-infinite');\n this.renderer.addClass(element, 'k-calendar-range');\n }\n setMessages() {\n this.zone.runOutsideAngular(() => {\n clearTimeout(this.messagesTimeout);\n this.messagesTimeout = setTimeout(() => {\n this.prevButtonTitle = this.localization.get('prevButtonTitle');\n this.nextButtonTitle = this.localization.get('nextButtonTitle');\n this.cdr.detectChanges();\n });\n });\n }\n verifyChanges() {\n if (!isDevMode()) {\n return;\n }\n if (this.min > this.max) {\n throw new Error(`The max value should be bigger than the min. See ${MIN_DOC_LINK$3} and ${MAX_DOC_LINK$3}.`);\n }\n if (this.bottomViewEnum > this.topViewEnum) {\n throw new Error(`The topView should be greater than bottomView. See ${BOTTOM_VIEW_DOC_LINK$1} and ${TOP_VIEW_DOC_LINK$1}.`);\n }\n }\n verifyValue(candidate) {\n if (!isDevMode()) {\n return;\n }\n if (candidate && !(candidate instanceof Date)) {\n throw new Error(`The 'value' should be a valid JavaScript Date instance. Check ${VALUE_DOC_LINK$5} for possible resolution.`);\n }\n }\n updateButtonState() {\n this.resolvedPromise.then(() => {\n this.isPrevDisabled = !this.viewList.canNavigate(this.prevView);\n this.isNextDisabled = !this.viewList.canNavigate(this.nextView);\n this.cdr.markForCheck();\n });\n }\n}\nMultiViewCalendarComponent.ɵfac = function MultiViewCalendarComponent_Factory(t) { return new (t || MultiViewCalendarComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService)); };\nMultiViewCalendarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: MultiViewCalendarComponent, selectors: [[\"kendo-multiviewcalendar\"]], contentQueries: function MultiViewCalendarComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, CellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, MonthCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, YearCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, DecadeCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, CenturyCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, WeekNumberCellTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, HeaderTitleTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.cellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.monthCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.yearCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.decadeCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.centuryCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.weekNumberTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTitleTemplate = _t.first);\n } }, viewQuery: function MultiViewCalendarComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(HorizontalViewListComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.viewList = _t.first);\n } }, hostVars: 7, hostBindings: function MultiViewCalendarComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"blur\", function MultiViewCalendarComponent_blur_HostBindingHandler() { return ctx.handleBlur(); })(\"focus\", function MultiViewCalendarComponent_focus_HostBindingHandler() { return ctx.handleFocus(); })(\"mouseenter\", function MultiViewCalendarComponent_mouseenter_HostBindingHandler() { return ctx.handleMouseEnter(); })(\"mouseleave\", function MultiViewCalendarComponent_mouseleave_HostBindingHandler() { return ctx.handleMouseLeave(); })(\"mousedown\", function MultiViewCalendarComponent_mousedown_HostBindingHandler($event) { return ctx.handleMousedown($event); })(\"click\", function MultiViewCalendarComponent_click_HostBindingHandler() { return ctx.handleClick(); })(\"keydown\", function MultiViewCalendarComponent_keydown_HostBindingHandler($event) { return ctx.keydown($event); })(\"keydown.enter\", function MultiViewCalendarComponent_keydown_enter_HostBindingHandler() { return ctx.enter(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"id\", ctx.widgetId)(\"role\", ctx.widgetRole)(\"tabindex\", ctx.calendarTabIndex)(\"aria-disabled\", ctx.ariaDisabled)(\"aria-activedescendant\", ctx.ariaActivedescendant);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", ctx.ariaDisabled);\n } }, inputs: { id: \"id\", rangeValidation: \"rangeValidation\", disabledDatesRangeValidation: \"disabledDatesRangeValidation\", disabled: \"disabled\", tabindex: \"tabindex\", activeView: \"activeView\", bottomView: \"bottomView\", topView: \"topView\", weekNumber: \"weekNumber\", views: \"views\", focusedDate: \"focusedDate\", min: \"min\", max: \"max\", value: \"value\", tabIndex: \"tabIndex\", disabledDates: \"disabledDates\", selectionRange: \"selectionRange\", cellTemplateRef: [\"cellTemplate\", \"cellTemplateRef\"], monthCellTemplateRef: [\"monthCellTemplate\", \"monthCellTemplateRef\"], yearCellTemplateRef: [\"yearCellTemplate\", \"yearCellTemplateRef\"], decadeCellTemplateRef: [\"decadeCellTemplate\", \"decadeCellTemplateRef\"], centuryCellTemplateRef: [\"centuryCellTemplate\", \"centuryCellTemplateRef\"], weekNumberTemplateRef: [\"weekNumberTemplate\", \"weekNumberTemplateRef\"], headerTitleTemplateRef: [\"headerTitleTemplate\", \"headerTitleTemplateRef\"], activeRangeEnd: \"activeRangeEnd\" }, outputs: { activeViewChange: \"activeViewChange\", cellEnter: \"cellEnter\", cellLeave: \"cellLeave\", valueChange: \"valueChange\" }, exportAs: [\"kendo-multiviewcalendar\"], features: [ɵngcc0.ɵɵProvidersFeature([\n BusViewService,\n RANGE_CALENDAR_VALUE_ACCESSOR,\n RANGE_CALENDAR_RANGE_VALIDATORS,\n LocalizationService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.multiviewcalendar'\n },\n NavigationService\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 7, vars: 20, consts: [[\"kendoMultiViewCalendarLocalizedMessages\", \"\", 6, \"today\", \"prevButtonTitle\", \"nextButtonTitle\"], [\"type\", \"button\", 1, \"k-button\", \"k-prev-view\", 3, \"disabled\", \"title\", \"click\"], [1, \"k-icon\", \"k-i-arrow-chevron-left\"], [3, \"activeView\", \"isActive\", \"cellTemplateRef\", \"headerTitleTemplateRef\", \"weekNumberTemplateRef\", \"cellUID\", \"views\", \"min\", \"max\", \"focusedDate\", \"weekNumber\", \"activeRangeEnd\", \"selectionRange\", \"value\", \"valueChange\", \"cellEnter\", \"cellLeave\"], [\"type\", \"button\", 1, \"k-button\", \"k-next-view\", 3, \"disabled\", \"title\", \"click\"], [1, \"k-icon\", \"k-i-arrow-chevron-right\"]], template: function MultiViewCalendarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c78);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"button\", 1);\n ɵngcc0.ɵɵlistener(\"click\", function MultiViewCalendarComponent_Template_button_click_2_listener() { return ctx.navigate(ctx.prevView); });\n ɵngcc0.ɵɵelement(3, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(4, \"kendo-calendar-horizontal\", 3);\n ɵngcc0.ɵɵlistener(\"valueChange\", function MultiViewCalendarComponent_Template_kendo_calendar_horizontal_valueChange_4_listener($event) { return ctx.handleDateChange($event); })(\"cellEnter\", function MultiViewCalendarComponent_Template_kendo_calendar_horizontal_cellEnter_4_listener($event) { return ctx.emitCellEvent(ctx.cellEnter, $event); })(\"cellLeave\", function MultiViewCalendarComponent_Template_kendo_calendar_horizontal_cellLeave_4_listener($event) { return ctx.emitCellEvent(ctx.cellLeave, $event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(5, \"button\", 4);\n ɵngcc0.ɵɵlistener(\"click\", function MultiViewCalendarComponent_Template_button_click_5_listener() { return ctx.navigate(ctx.nextView); });\n ɵngcc0.ɵɵelement(6, \"span\", 5);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n var tmp_5_0 = null;\n const currVal_5 = (tmp_5_0 = ctx.activeCellTemplate()) == null ? null : tmp_5_0.templateRef;\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"disabled\", ctx.isPrevDisabled)(\"title\", ctx.prevButtonTitle);\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.isPrevDisabled);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"activeView\", ctx.activeViewEnum)(\"isActive\", ctx.isActive || ctx.isHovered)(\"cellTemplateRef\", currVal_5)(\"headerTitleTemplateRef\", ctx.headerTitleTemplate == null ? null : ctx.headerTitleTemplate.templateRef)(\"weekNumberTemplateRef\", ctx.weekNumberTemplate == null ? null : ctx.weekNumberTemplate.templateRef)(\"cellUID\", ctx.cellUID)(\"views\", ctx.views)(\"min\", ctx.min)(\"max\", ctx.max)(\"focusedDate\", ctx.focusedDate)(\"weekNumber\", ctx.weekNumber)(\"activeRangeEnd\", ctx.activeRangeEnd)(\"selectionRange\", ctx.selectionRange)(\"value\", ctx.value);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"disabled\", ctx.isNextDisabled)(\"title\", ctx.nextButtonTitle);\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.isNextDisabled);\n } }, directives: function () { return [MultiViewCalendarLocalizedMessagesDirective,\n HorizontalViewListComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nMultiViewCalendarComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: ElementRef },\n { type: LocalizationService },\n { type: NavigationService },\n { type: Renderer2 },\n { type: ChangeDetectorRef },\n { type: NgZone },\n { type: DisabledDatesService }\n];\nMultiViewCalendarComponent.propDecorators = {\n id: [{ type: Input }],\n focusedDate: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n rangeValidation: [{ type: Input }],\n disabledDatesRangeValidation: [{ type: Input }],\n value: [{ type: Input }],\n disabled: [{ type: Input }],\n tabindex: [{ type: Input }],\n tabIndex: [{ type: Input }],\n disabledDates: [{ type: Input }],\n activeView: [{ type: Input }],\n bottomView: [{ type: Input }],\n topView: [{ type: Input }],\n weekNumber: [{ type: Input }],\n activeRangeEnd: [{ type: Input }],\n selectionRange: [{ type: Input }],\n views: [{ type: Input }],\n activeViewChange: [{ type: Output }],\n cellEnter: [{ type: Output }],\n cellLeave: [{ type: Output }],\n valueChange: [{ type: Output }],\n cellTemplate: [{ type: ContentChild, args: [CellTemplateDirective, { static: true },] }],\n cellTemplateRef: [{ type: Input, args: ['cellTemplate',] }],\n monthCellTemplate: [{ type: ContentChild, args: [MonthCellTemplateDirective, { static: true },] }],\n monthCellTemplateRef: [{ type: Input, args: ['monthCellTemplate',] }],\n yearCellTemplate: [{ type: ContentChild, args: [YearCellTemplateDirective, { static: true },] }],\n yearCellTemplateRef: [{ type: Input, args: ['yearCellTemplate',] }],\n decadeCellTemplate: [{ type: ContentChild, args: [DecadeCellTemplateDirective, { static: true },] }],\n decadeCellTemplateRef: [{ type: Input, args: ['decadeCellTemplate',] }],\n centuryCellTemplate: [{ type: ContentChild, args: [CenturyCellTemplateDirective, { static: true },] }],\n centuryCellTemplateRef: [{ type: Input, args: ['centuryCellTemplate',] }],\n weekNumberTemplate: [{ type: ContentChild, args: [WeekNumberCellTemplateDirective, { static: true },] }],\n weekNumberTemplateRef: [{ type: Input, args: ['weekNumberTemplate',] }],\n headerTitleTemplate: [{ type: ContentChild, args: [HeaderTitleTemplateDirective, { static: true },] }],\n headerTitleTemplateRef: [{ type: Input, args: ['headerTitleTemplate',] }],\n viewList: [{ type: ViewChild, args: [HorizontalViewListComponent,] }],\n widgetId: [{ type: HostBinding, args: ['attr.id',] }],\n widgetRole: [{ type: HostBinding, args: ['attr.role',] }],\n calendarTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],\n ariaDisabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.k-state-disabled',] }],\n ariaActivedescendant: [{ type: HostBinding, args: ['attr.aria-activedescendant',] }],\n handleBlur: [{ type: HostListener, args: [\"blur\",] }],\n handleFocus: [{ type: HostListener, args: [\"focus\",] }],\n handleMouseEnter: [{ type: HostListener, args: [\"mouseenter\",] }],\n handleMouseLeave: [{ type: HostListener, args: [\"mouseleave\",] }],\n handleMousedown: [{ type: HostListener, args: [\"mousedown\", ['$event'],] }],\n handleClick: [{ type: HostListener, args: [\"click\",] }],\n keydown: [{ type: HostListener, args: [\"keydown\", [\"$event\"],] }],\n enter: [{ type: HostListener, args: [\"keydown.enter\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MultiViewCalendarComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-multiviewcalendar',\n providers: [\n BusViewService,\n RANGE_CALENDAR_VALUE_ACCESSOR,\n RANGE_CALENDAR_RANGE_VALIDATORS,\n LocalizationService,\n DisabledDatesService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.multiviewcalendar'\n },\n NavigationService\n ],\n selector: 'kendo-multiviewcalendar',\n template: `\n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc4.LocalizationService }, { type: NavigationService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.NgZone }, { type: DisabledDatesService }]; }, { id: [{\n type: Input\n }], rangeValidation: [{\n type: Input\n }], disabledDatesRangeValidation: [{\n type: Input\n }], disabled: [{\n type: Input\n }], tabindex: [{\n type: Input\n }], activeView: [{\n type: Input\n }], bottomView: [{\n type: Input\n }], topView: [{\n type: Input\n }], weekNumber: [{\n type: Input\n }], views: [{\n type: Input\n }], activeViewChange: [{\n type: Output\n }], cellEnter: [{\n type: Output\n }], cellLeave: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], focusedDate: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], value: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], disabledDates: [{\n type: Input\n }], selectionRange: [{\n type: Input\n }], cellTemplateRef: [{\n type: Input,\n args: ['cellTemplate']\n }], cellTemplate: [{\n type: ContentChild,\n args: [CellTemplateDirective, { static: true }]\n }], monthCellTemplateRef: [{\n type: Input,\n args: ['monthCellTemplate']\n }], monthCellTemplate: [{\n type: ContentChild,\n args: [MonthCellTemplateDirective, { static: true }]\n }], yearCellTemplateRef: [{\n type: Input,\n args: ['yearCellTemplate']\n }], yearCellTemplate: [{\n type: ContentChild,\n args: [YearCellTemplateDirective, { static: true }]\n }], decadeCellTemplateRef: [{\n type: Input,\n args: ['decadeCellTemplate']\n }], decadeCellTemplate: [{\n type: ContentChild,\n args: [DecadeCellTemplateDirective, { static: true }]\n }], centuryCellTemplateRef: [{\n type: Input,\n args: ['centuryCellTemplate']\n }], centuryCellTemplate: [{\n type: ContentChild,\n args: [CenturyCellTemplateDirective, { static: true }]\n }], weekNumberTemplateRef: [{\n type: Input,\n args: ['weekNumberTemplate']\n }], weekNumberTemplate: [{\n type: ContentChild,\n args: [WeekNumberCellTemplateDirective, { static: true }]\n }], headerTitleTemplateRef: [{\n type: Input,\n args: ['headerTitleTemplate']\n }], headerTitleTemplate: [{\n type: ContentChild,\n args: [HeaderTitleTemplateDirective, { static: true }]\n }], widgetId: [{\n type: HostBinding,\n args: ['attr.id']\n }], widgetRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], calendarTabIndex: [{\n type: HostBinding,\n args: ['attr.tabindex']\n }], ariaDisabled: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }, {\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], ariaActivedescendant: [{\n type: HostBinding,\n args: ['attr.aria-activedescendant']\n }], handleBlur: [{\n type: HostListener,\n args: [\"blur\"]\n }], handleFocus: [{\n type: HostListener,\n args: [\"focus\"]\n }], handleMouseEnter: [{\n type: HostListener,\n args: [\"mouseenter\"]\n }], handleMouseLeave: [{\n type: HostListener,\n args: [\"mouseleave\"]\n }], handleMousedown: [{\n type: HostListener,\n args: [\"mousedown\", ['$event']]\n }], handleClick: [{\n type: HostListener,\n args: [\"click\"]\n }], keydown: [{\n type: HostListener,\n args: [\"keydown\", [\"$event\"]]\n }], enter: [{\n type: HostListener,\n args: [\"keydown.enter\"]\n }], activeRangeEnd: [{\n type: Input\n }], viewList: [{\n type: ViewChild,\n args: [HorizontalViewListComponent]\n }] }); })();\n\n/**\n * A directive which renders the content of the DateRange Popup. To define the cell template, nest an\n * `` tag with the `kendoRangePopupTemplate` directive inside the component tag.\n */\nclass DateRangePopupTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDateRangePopupTemplateDirective.ɵfac = function DateRangePopupTemplateDirective_Factory(t) { return new (t || DateRangePopupTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nDateRangePopupTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateRangePopupTemplateDirective, selectors: [[\"\", \"kendoDateRangePopupTemplate\", \"\"]] });\n/** @nocollapse */\nDateRangePopupTemplateDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangePopupTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDateRangePopupTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\nconst isActive = (cmp) => (cmp && cmp.isActive) || false;\nconst hasActiveContent = (popup) => popup && popup.hasActiveContent();\n/**\n * A service that handles the communication between the components that are placed inside the DateRangeComponent.\n * For example, the start and end `DateInput` and `DateRangePopup` components.\n */\nclass DateRangeService {\n constructor() {\n /**\n * An Observable instance that notifies when the `activeRangeEnd` state is changed.\n */\n this.activeRangeEnd$ = new BehaviorSubject(null);\n /**\n * An Observable instance that notifies when the `focusedDate` is changed.\n */\n this.focusedDate$ = new BehaviorSubject(null);\n /**\n * An Observable instance that notifies when the end `DateInput` component is changed.\n * For example, when a new end `DateInput` is attached or when the old one is detached.\n */\n this.endInput$ = new BehaviorSubject(null);\n /**\n * An Observable instance that notifies when the start `DateInput` component is changed.\n * For example, when a new start `DateInput` is attached or the old one is detached.\n */\n this.startInput$ = new BehaviorSubject(null);\n /**\n * An Observable instance that notifies when the `DateRangePopup` component is changed.\n */\n this.dateRangePopup$ = new BehaviorSubject(null);\n /**\n * An Observable instance that notifies when the state of the selection range is changed.\n */\n this.range$ = new BehaviorSubject(EMPTY_SELECTIONRANGE);\n }\n /**\n * Gets the current `activeRangeEnd` value.\n */\n get activeRangeEnd() {\n return this.activeRangeEnd$.value;\n }\n /**\n * Gets the current `focusedDate` value.\n */\n get focusedDate() {\n return this.focusedDate$.value;\n }\n /**\n * Gets the `min` range value.\n * The `min` value is extracted from the `start` DateInput value or the `min` value of the Calendar.\n */\n get min() {\n return (this.startInput$.value || {}).min || null;\n }\n /**\n * Gets the `max` range value.\n * The `max` value is extracted from the `end` DateInput value or the `max` value of the Calendar.\n */\n get max() {\n return (this.endInput$.value || {}).max || null;\n }\n /**\n * Gets the current `selectionRange` value.\n */\n get selectionRange() {\n return this.range$.value;\n }\n /**\n * Activates the registered `DateRangePopup` component.\n * The method opens the popup and focuses the calendar.\n */\n activatePopup() {\n const dateRangePopup = this.dateRangePopup$.value;\n if (!dateRangePopup) {\n return;\n }\n dateRangePopup.activate();\n }\n /**\n * Deactivates the registered `DateRangePopup` component.\n * The method closes the popup.\n */\n deactivatePopup() {\n const dateRangePopup = this.dateRangePopup$.value;\n if (!(dateRangePopup && dateRangePopup.show)) {\n return;\n }\n dateRangePopup.show = false;\n }\n /**\n * @hidden\n *\n * Deactivates the registered `DateRangePopup` component and fires the `cancel` event.\n * The method closes the popup.\n */\n cancelPopup() {\n const dateRangePopup = this.dateRangePopup$.value;\n if (!(dateRangePopup && dateRangePopup.show)) {\n return;\n }\n dateRangePopup.cancelPopup();\n }\n /**\n * Completes all observables to mitigate possible memory leaks.\n * Calls the method when a component that uses it is destroyed.\n */\n destroy() {\n this.activeRangeEnd$.complete();\n this.dateRangePopup$.complete();\n this.focusedDate$.complete();\n this.endInput$.complete();\n this.startInput$.complete();\n this.range$.complete();\n }\n /**\n * Returns `true` when an active component that is placed inside the `DateRangeComponent` is detected.\n * For example, the opened popup or the focused DateInput.\n *\n * @returns `true` if an active component is present.\n */\n hasActiveComponent() {\n const popup = this.dateRangePopup$.value;\n const isPopup = isActive(popup);\n const isStart = isActive(this.startInput$.value);\n const isEnd = isActive(this.endInput$.value);\n return isPopup || isStart || isEnd || hasActiveContent(popup) || false;\n }\n /**\n * Registers a new start `DateInput` component. Notifies all `startInput$` listeners.\n */\n registerStartInput(startInput) {\n this.startInput$.next(startInput);\n }\n /**\n * Registers a new end `DateInput` component. Notifies all `endInput$` listeners.\n */\n registerEndInput(endInput) {\n this.endInput$.next(endInput);\n }\n /**\n * Registers a new `DateRangePopup` component. Notifies all `dateRangePopup$` listeners.\n */\n registerPopup(dateRangePopup) {\n this.dateRangePopup$.next(dateRangePopup);\n }\n /**\n * Updates the `activeRangeEnd` value. Notifies all `activeRangeEnd$` listeners.\n */\n setActiveRangeEnd(activeRange) {\n if (!activeRange || this.activeRangeEnd === activeRange) {\n return;\n }\n this.activeRangeEnd$.next(activeRange);\n }\n /**\n * Updates the focused date. Notifies all `focusedDate$` listeners.\n */\n setFocusedDate(value) {\n if (isEqual(this.focusedDate$.value, value)) {\n return;\n }\n this.focusedDate$.next(value);\n }\n /**\n * Updates the selection range. Notifies all `range$` listeners.\n */\n setRange(range = EMPTY_SELECTIONRANGE) {\n this.range$.next(range);\n }\n}\nDateRangeService.ɵfac = function DateRangeService_Factory(t) { return new (t || DateRangeService)(); };\nDateRangeService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DateRangeService, factory: DateRangeService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * Represents the Kendo UI DateRangePopup component for Angular.\n *\n * @example\n * ```ts\n * import { DateInputsModule, DateRangeService } from '@progress/kendo-angular-dateinputs';\n *\n * _@Component({\n * providers: [DateRangeService],\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent {\n * }\n * ```\n */\nclass DateRangePopupComponent {\n constructor(popupService, dateRangeService, zone, rtl) {\n this.popupService = popupService;\n this.dateRangeService = dateRangeService;\n this.zone = zone;\n this.rtl = rtl;\n /**\n * Controls the popup animation.\n * By default, the opening and closing animations are enabled.\n * For more information about controlling the popup animations,\n * refer to the article on [animations]({% slug animations_popup %}).\n */\n this.animate = true;\n /**\n * Configures the collision behavior of the popup.\n * For more information, refer to the article on\n * [viewport boundary detection]({% slug viewportboundarydetection_popup %}).\n */\n this.collision = { horizontal: 'fit', vertical: 'flip' };\n /**\n * Fires each time the popup is about to open.\n * This event is preventable. If you cancel the event, the popup will remain closed.\n * For more information, refer to the section on\n * [events]({% slug overview_datepicker %}#toc-events).\n */\n this.open = new EventEmitter();\n /**\n * Fires each time the popup is about to close.\n * This event is preventable. If you cancel the event, the popup will remain open.\n * For more information, refer to the section on\n * [events]({% slug overview_datepicker %}#toc-events).\n */\n this.close = new EventEmitter();\n /**\n * Fires each time the calendar element is blurred.\n */\n this.onBlur = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the calendar element is focused.\n */\n this.onFocus = new EventEmitter(); //tslint:disable-line:no-output-rename\n /**\n * Fires each time the popup is closed either on `ESC` keypress or on leaving the viewport.\n */\n this.cancel = new EventEmitter();\n /**\n * @hidden\n */\n this.popupUID = guid();\n this.calendarSubscriptions = new Subscription(() => { });\n this.popupSubscriptions = new Subscription(() => { });\n this.resolvedPromise = Promise.resolve();\n }\n /**\n * The active calendar that is visible in the popup.\n *\n * > When the popup is closed, the property returns `null`.\n */\n get calendar() {\n return this._calendar;\n }\n set calendar(calendar) {\n this._calendar = calendar;\n this.subscribeFocusBlur(calendar);\n }\n /**\n * Gets the active state of the component.\n * When the opened calendar is active, returns `true`.\n */\n get isActive() {\n return this.calendar && this.calendar.isActive;\n }\n /**\n * Gets or sets the visibility state of the component.\n */\n set show(show) {\n if (this._show === show) {\n return;\n }\n const event = new PreventableEvent();\n if (show) {\n this.open.emit(event);\n }\n else {\n this.close.emit(event);\n }\n if (event.isDefaultPrevented()) {\n return;\n }\n this._toggle(show);\n }\n get show() {\n return this._show;\n }\n ngOnInit() {\n this.dateRangeService.registerPopup(this);\n }\n ngAfterViewInit() {\n this.calendarSubscriptions.add(this.contentCalendar.changes.subscribe((changes) => this.calendar = changes.first));\n this.calendarSubscriptions.add(this.viewCalendar.changes.subscribe((changes) => this.calendar = changes.first));\n if (isWindowAvailable()) {\n this.zone.runOutsideAngular(() => this.windowBlurSubscription = fromEvent(window, 'blur').subscribe(this.handleWindowBlur.bind(this)));\n }\n }\n ngOnDestroy() {\n this.destroyPopup();\n this.calendarSubscriptions.unsubscribe();\n if (this.activateSubscription) {\n this.activateSubscription.unsubscribe();\n }\n if (this.blurSubscription) {\n this.blurSubscription.unsubscribe();\n this.focusSubscription.unsubscribe();\n }\n if (this.windowBlurSubscription) {\n this.windowBlurSubscription.unsubscribe();\n }\n }\n /**\n * Opens the popup component and focuses the calendar.\n */\n activate() {\n if (this.show === true) {\n return;\n }\n if (this.activateSubscription) {\n this.activateSubscription.unsubscribe();\n }\n this.show = true;\n this.zone.runOutsideAngular(() => {\n this.activateSubscription = merge(this.contentCalendar.changes, this.viewCalendar.changes)\n .pipe(filter(changes => changes && changes.first), map(changes => changes.first))\n .subscribe((calendar) => setTimeout(() => calendar.focus()));\n });\n }\n /**\n * Focuses the calendar (if available).\n */\n focus() {\n if (this.calendar) {\n this.calendar.focus();\n }\n }\n /**\n * Checks if a focused element ids placed inside the popup.\n *\n * @return boolean;\n */\n hasActiveContent() {\n if (!isDocumentAvailable() || !this.popupRef) {\n return false;\n }\n return this.popupRef.popupElement.contains(document.activeElement);\n }\n /**\n * Toggles the visibility of the popup.\n * If you use the `toggle` method to show or hide the popup,\n * the `open` and `close` events do not fire.\n *\n * @param show The state of the popup.\n */\n toggle(show) {\n this.resolvedPromise.then(() => {\n this._toggle((show === undefined) ? !this.show : show);\n });\n }\n /**\n * @hidden\n *\n * Closes the popup and triggers the `cancel` event.\n */\n cancelPopup() {\n this.show = false;\n this.cancel.emit();\n }\n handleWindowBlur() {\n if (!this.show) {\n return;\n }\n if (hasObservers(this.close)) {\n this.zone.run(() => this.show = false);\n }\n else {\n this.show = false;\n }\n }\n handleMouseLeave() {\n this.dateRangeService.setRange(this.dateRangeService.selectionRange);\n }\n handleKeydown(event) {\n const { altKey, keyCode } = event;\n if (keyCode === Keys.Escape || (altKey && keyCode === Keys.ArrowUp)) {\n this.zone.run(() => this.cancelPopup());\n }\n }\n subscribeFocusBlur(calendar) {\n if (this.blurSubscription) {\n this.blurSubscription.unsubscribe();\n this.focusSubscription.unsubscribe();\n }\n if (!calendar) {\n return;\n }\n const nativeElement = calendar.element.nativeElement;\n this.blurSubscription = fromEvent(nativeElement, 'blur').subscribe(() => this.onBlur.emit());\n this.focusSubscription = fromEvent(nativeElement, 'focus').subscribe(() => this.onFocus.emit());\n }\n addPopupSubscriptions(...subscriptions) {\n if (!isPresent(this.popupSubscriptions)) {\n this.popupSubscriptions = new Subscription();\n }\n subscriptions.map(s => this.popupSubscriptions.add(s));\n }\n get _appendTo() {\n const appendTo = this.appendTo;\n if (!appendTo || appendTo === 'root') {\n return undefined;\n }\n return appendTo === 'component' ? this.container : appendTo;\n }\n _toggle(show) {\n this._show = show;\n if (this.popupRef) {\n this.destroyPopup();\n }\n if (this._show) {\n const direction = this.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchor: this.anchor,\n anchorAlign: this.anchorAlign || { vertical: 'bottom', horizontal: direction },\n animate: this.animate,\n appendTo: this._appendTo,\n collision: this.collision,\n content: (this.contentTemplate || {}).templateRef || this.defaultTemplate,\n margin: this.margin,\n popupAlign: this.popupAlign || { vertical: 'top', horizontal: direction },\n positionMode: 'absolute'\n });\n const { popupElement, popupAnchorViewportLeave } = this.popupRef;\n popupElement.setAttribute('id', this.popupUID);\n this.addPopupSubscriptions(this.zone.runOutsideAngular(() => fromEvent(popupElement, 'keydown').subscribe(this.handleKeydown.bind(this))), fromEvent(popupElement, 'mouseleave').subscribe(this.handleMouseLeave.bind(this)), popupAnchorViewportLeave.subscribe(() => this.cancelPopup()));\n }\n }\n destroyPopup() {\n if (isPresent(this.popupRef)) {\n this.popupRef.close();\n this.popupRef = null;\n }\n if (isPresent(this.popupSubscriptions)) {\n this.popupSubscriptions.unsubscribe();\n }\n }\n}\nDateRangePopupComponent.ɵfac = function DateRangePopupComponent_Factory(t) { return new (t || DateRangePopupComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc5.PopupService), ɵngcc0.ɵɵdirectiveInject(DateRangeService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(RTL, 8)); };\nDateRangePopupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateRangePopupComponent, selectors: [[\"kendo-daterange-popup\"]], contentQueries: function DateRangePopupComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, DateRangePopupTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MultiViewCalendarComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentCalendar = _t);\n } }, viewQuery: function DateRangePopupComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c15, true, ViewContainerRef);\n ɵngcc0.ɵɵviewQuery(_c79, true);\n ɵngcc0.ɵɵviewQuery(MultiViewCalendarComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.defaultTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.viewCalendar = _t);\n } }, inputs: { animate: \"animate\", collision: \"collision\", anchor: \"anchor\", anchorAlign: \"anchorAlign\", appendTo: \"appendTo\", popupAlign: \"popupAlign\", margin: \"margin\" }, outputs: { open: \"open\", close: \"close\", onBlur: \"blur\", onFocus: \"focus\", cancel: \"cancel\" }, exportAs: [\"kendo-daterange-popup\"], decls: 4, vars: 0, consts: [[\"container\", \"\"], [\"defaultTemplate\", \"\"], [\"kendoDateRangeSelection\", \"\"]], template: function DateRangePopupComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, null, 0);\n ɵngcc0.ɵɵtemplate(2, DateRangePopupComponent_ng_template_2_Template, 1, 0, \"ng-template\", null, 1, ɵngcc0.ɵɵtemplateRefExtractor);\n } }, directives: function () { return [MultiViewCalendarComponent,\n DateRangeSelectionDirective]; }, encapsulation: 2 });\n/** @nocollapse */\nDateRangePopupComponent.ctorParameters = () => [\n { type: PopupService },\n { type: DateRangeService },\n { type: NgZone },\n { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [RTL,] }] }\n];\nDateRangePopupComponent.propDecorators = {\n container: [{ type: ViewChild, args: ['container', { read: ViewContainerRef },] }],\n defaultTemplate: [{ type: ViewChild, args: ['defaultTemplate',] }],\n contentTemplate: [{ type: ContentChild, args: [DateRangePopupTemplateDirective,] }],\n viewCalendar: [{ type: ViewChildren, args: [MultiViewCalendarComponent,] }],\n contentCalendar: [{ type: ContentChildren, args: [MultiViewCalendarComponent,] }],\n animate: [{ type: Input }],\n anchor: [{ type: Input }],\n anchorAlign: [{ type: Input }],\n appendTo: [{ type: Input }],\n collision: [{ type: Input }],\n popupAlign: [{ type: Input }],\n margin: [{ type: Input }],\n open: [{ type: Output }],\n close: [{ type: Output }],\n onBlur: [{ type: Output, args: ['blur',] }],\n onFocus: [{ type: Output, args: ['focus',] }],\n cancel: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangePopupComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendo-daterange-popup',\n selector: 'kendo-daterange-popup',\n template: `\n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc5.PopupService }, { type: DateRangeService }, { type: ɵngcc0.NgZone }, { type: Boolean, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [RTL]\n }] }]; }, { animate: [{\n type: Input\n }], collision: [{\n type: Input\n }], open: [{\n type: Output\n }], close: [{\n type: Output\n }], onBlur: [{\n type: Output,\n args: ['blur']\n }], onFocus: [{\n type: Output,\n args: ['focus']\n }], cancel: [{\n type: Output\n }], container: [{\n type: ViewChild,\n args: ['container', { read: ViewContainerRef }]\n }], defaultTemplate: [{\n type: ViewChild,\n args: ['defaultTemplate']\n }], contentTemplate: [{\n type: ContentChild,\n args: [DateRangePopupTemplateDirective]\n }], viewCalendar: [{\n type: ViewChildren,\n args: [MultiViewCalendarComponent]\n }], contentCalendar: [{\n type: ContentChildren,\n args: [MultiViewCalendarComponent]\n }], anchor: [{\n type: Input\n }], anchorAlign: [{\n type: Input\n }], appendTo: [{\n type: Input\n }], popupAlign: [{\n type: Input\n }], margin: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the Kendo UI DateRange component for Angular.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * `\n * })\n * export class AppComponent {\n * public dateRange: any = { start: null, end: null };\n * }\n * ```\n */\nclass DateRangeComponent {\n constructor() {\n /**\n * @hidden\n */\n this.showDefault = false;\n }\n get hasContentPopup() {\n return this.contentPopup.length > 0;\n }\n ngAfterContentInit() {\n this.showDefault = !this.hasContentPopup;\n this.subscription = this.contentPopup.changes.subscribe(() => {\n this.showDefault = !this.hasContentPopup;\n });\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\nDateRangeComponent.ɵfac = function DateRangeComponent_Factory(t) { return new (t || DateRangeComponent)(); };\nDateRangeComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateRangeComponent, selectors: [[\"kendo-daterange\"]], contentQueries: function DateRangeComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, DateRangePopupComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentPopup = _t);\n } }, features: [ɵngcc0.ɵɵProvidersFeature([DateRangeService])], ngContentSelectors: _c0, decls: 2, vars: 1, consts: [[4, \"ngIf\"]], template: function DateRangeComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n ɵngcc0.ɵɵtemplate(1, DateRangeComponent_kendo_daterange_popup_1_Template, 1, 0, \"kendo-daterange-popup\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showDefault);\n } }, directives: [ɵngcc2.NgIf, DateRangePopupComponent], encapsulation: 2 });\nDateRangeComponent.propDecorators = {\n contentPopup: [{ type: ContentChildren, args: [DateRangePopupComponent,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeComponent, [{\n type: Component,\n args: [{\n providers: [DateRangeService],\n selector: 'kendo-daterange',\n template: `\n \n \n `\n }]\n }], function () { return []; }, { contentPopup: [{\n type: ContentChildren,\n args: [DateRangePopupComponent]\n }] }); })();\n\n/**\n * @hidden\n */\nclass DateRangeInput {\n constructor(activeRangeEnd, dateRangeService, input, element, renderer, zone) {\n this.activeRangeEnd = activeRangeEnd;\n this.dateRangeService = dateRangeService;\n this.input = input;\n this.element = element;\n this.renderer = renderer;\n this.zone = zone;\n this.navigateCalendarOnFocus = false;\n this.popupSubscriptions = new Subscription(() => { });\n this.subscriptions = new Subscription(() => { });\n }\n get isActiveEnd() {\n return this.dateRangeService.activeRangeEnd === this.activeRangeEnd;\n }\n get popupCalendarActivated() {\n const popup = this.dateRangeService.dateRangePopup$.value;\n return isPresent(popup) && isPresent(popup.calendar);\n }\n init() {\n if (this.input.value) {\n this.dateRangeService.setRange(this.getRange(this.input.value));\n }\n [\n this.input.onBlur.subscribe(() => this.deactivate()),\n this.input.onFocus.pipe(filter(() => !this.popupCalendarActivated)).subscribe(() => this.activate()),\n this.input.valueUpdate.subscribe(value => this.updateRange(value, 'change')),\n this.dateRangeService.activeRangeEnd$.subscribe(() => {\n if (this.navigateCalendarOnFocus) {\n this.focusActiveDate();\n }\n this.toggleActiveClass(this.isActiveEnd);\n }),\n this.dateRangeService.dateRangePopup$.subscribe(popup => this.initPopup(popup)),\n this.dateRangeService.range$.subscribe(range => this.updateInputValue(range)),\n fromEvent(this.element.nativeElement, 'click').subscribe(() => this.activate()),\n fromEvent(this.element.nativeElement, 'keydown').subscribe((event) => this.togglePopup(event || {}))\n ].map(s => this.subscriptions.add(s));\n }\n destroy() {\n this.subscriptions.unsubscribe();\n this.unsubscribePopup();\n }\n initPopup(popup) {\n if (!popup) {\n this.unsubscribePopup();\n return;\n }\n if (!popup.anchor) {\n popup.anchor = this.element.nativeElement;\n }\n [\n popup.cancel.subscribe(() => this.isActiveEnd && this.input.focus()),\n popup.onFocus.subscribe(() => this.toggleActiveClass(this.isActiveEnd)),\n popup.onBlur.subscribe(() => this.deactivate())\n ].map(s => this.popupSubscriptions.add(s));\n }\n unsubscribePopup() {\n this.popupSubscriptions.unsubscribe();\n this.popupSubscriptions = new Subscription(() => { });\n }\n activate() {\n this.dateRangeService.setActiveRangeEnd(this.activeRangeEnd);\n this.dateRangeService.activatePopup();\n }\n deactivate() {\n this.zone.runOutsideAngular(() => {\n setTimeout(() => {\n this.updateRange(this.input.value, 'blur');\n if (this.dateRangeService.hasActiveComponent()) {\n return;\n }\n this.toggleActiveClass(false);\n this.zone.run(() => this.dateRangeService.deactivatePopup());\n });\n });\n }\n updateRange(value, correctOn) {\n const range = this.getRange(value, correctOn);\n if (range) {\n this.focusActiveDate();\n this.dateRangeService.setRange(range);\n }\n }\n togglePopup({ altKey, keyCode }) {\n if (keyCode === Keys.Escape) {\n this.dateRangeService.cancelPopup();\n }\n else if (altKey && keyCode === Keys.ArrowDown) {\n this.dateRangeService.activatePopup();\n }\n }\n focusActiveDate() {\n if (this.input.value && this.isActiveEnd) {\n this.dateRangeService.setFocusedDate(cloneDate(this.input.value));\n }\n }\n toggleActiveClass(show) {\n const action = show ? 'addClass' : 'removeClass';\n const nativeElement = this.element.nativeElement;\n if (nativeElement && nativeElement.querySelector) {\n this.renderer[action](nativeElement.querySelector('.k-dateinput-wrap'), 'k-state-focused');\n }\n }\n}\n\n/**\n * A directive which manages the end range selection.\n *\n * > You can use the DateRangeEndInputDirective only with a DateInput component.\n */\nclass DateRangeEndInputDirective extends DateRangeInput {\n constructor(rangeService, dateInput, element, renderer, zone) {\n super('end', rangeService, dateInput, element, renderer, zone);\n this.rangeService = rangeService;\n this.dateInput = dateInput;\n /**\n * Specifies the navigation behavior of the calendar when the active end is changed on input focus. When enabled,\n * the calendar navigates to the value of the focused input. Otherwise, the calendar displays the last picked date.\n *\n * By default, the automatic navigation behavior on input focus is disabled.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n *
Toggle input focus to see the calendar navigating between range ends.
\n * \n * \n * \n * \n * `\n * })\n * export class AppComponent {\n * public start: Date = new Date(2018, 3, 10);\n * public end: Date = new Date(2018, 10, 20);\n * }\n * ```\n */\n this.navigateCalendarOnFocus = false;\n }\n ngOnInit() {\n this.rangeService.registerEndInput(this.dateInput);\n super.init();\n }\n ngOnDestroy() {\n super.destroy();\n }\n getRange(value, correctOn) {\n const { min, max } = this.dateInput;\n if (!isInRange(value, min, max)) {\n return null;\n }\n const { start } = this.rangeService.selectionRange || EMPTY_SELECTIONRANGE;\n const shouldClamp = this.autoCorrectOn === correctOn && isPresent(value) && value < start;\n return shouldClamp ? clampRange(value) : { start, end: cloneDate(value) };\n }\n updateInputValue(range$$1) {\n const { end } = range$$1 || EMPTY_SELECTIONRANGE;\n const { min, max } = this.dateInput;\n if (isEqual(this.dateInput.value, end) || !isInRange(end, min, max)) {\n return;\n }\n this.dateInput.writeValue(cloneDate(end));\n this.dateInput.notify();\n }\n}\nDateRangeEndInputDirective.ɵfac = function DateRangeEndInputDirective_Factory(t) { return new (t || DateRangeEndInputDirective)(ɵngcc0.ɵɵdirectiveInject(DateRangeService), ɵngcc0.ɵɵdirectiveInject(DateInputComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nDateRangeEndInputDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateRangeEndInputDirective, selectors: [[\"\", \"kendoDateRangeEndInput\", \"\"]], inputs: { navigateCalendarOnFocus: \"navigateCalendarOnFocus\", autoCorrectOn: \"autoCorrectOn\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nDateRangeEndInputDirective.ctorParameters = () => [\n { type: DateRangeService },\n { type: DateInputComponent },\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nDateRangeEndInputDirective.propDecorators = {\n autoCorrectOn: [{ type: Input }],\n navigateCalendarOnFocus: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeEndInputDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDateRangeEndInput]'\n }]\n }], function () { return [{ type: DateRangeService }, { type: DateInputComponent }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { navigateCalendarOnFocus: [{\n type: Input\n }], autoCorrectOn: [{\n type: Input\n }] }); })();\n\n/**\n * A directive which manages the start selection range.\n *\n * > You can use the DateRangeStartInputDirective only with a DateInput component.\n */\nclass DateRangeStartInputDirective extends DateRangeInput {\n constructor(rangeService, dateInput, element, renderer, zone) {\n super('start', rangeService, dateInput, element, renderer, zone);\n this.rangeService = rangeService;\n this.dateInput = dateInput;\n /**\n * Specifies the navigation behavior of the calendar when the active end is changed on input focus.\n * When enabled, the calendar navigates to the value of the focused input. Otherwise, the calendar\n * displays the last picked date.\n *\n * By default, the automatic navigation behavior on input focus is disabled.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n *
Toggle input focus to see the calendar navigating between range ends.
\n * \n * \n * \n * \n * `\n * })\n * export class AppComponent {\n * public start: Date = new Date(2018, 3, 10);\n * public end: Date = new Date(2018, 10, 20);\n * }\n * ```\n */\n this.navigateCalendarOnFocus = false;\n }\n ngOnInit() {\n this.rangeService.registerStartInput(this.dateInput);\n super.init();\n }\n ngOnDestroy() {\n super.destroy();\n }\n getRange(value, correctOn) {\n const { min, max } = this.dateInput;\n if (!isInRange(value, min, max)) {\n return null;\n }\n const { end } = this.rangeService.selectionRange || EMPTY_SELECTIONRANGE;\n const shouldClamp = this.autoCorrectOn === correctOn && end && value > end;\n return shouldClamp ? clampRange(value) : { start: cloneDate(value), end };\n }\n updateInputValue(range$$1) {\n const { start } = range$$1 || EMPTY_SELECTIONRANGE;\n const { min, max } = this.dateInput;\n if (isEqual(this.dateInput.value, start) || !isInRange(start, min, max)) {\n return;\n }\n this.dateInput.writeValue(cloneDate(start));\n this.dateInput.notify();\n }\n}\nDateRangeStartInputDirective.ɵfac = function DateRangeStartInputDirective_Factory(t) { return new (t || DateRangeStartInputDirective)(ɵngcc0.ɵɵdirectiveInject(DateRangeService), ɵngcc0.ɵɵdirectiveInject(DateInputComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nDateRangeStartInputDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateRangeStartInputDirective, selectors: [[\"\", \"kendoDateRangeStartInput\", \"\"]], inputs: { navigateCalendarOnFocus: \"navigateCalendarOnFocus\", autoCorrectOn: \"autoCorrectOn\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nDateRangeStartInputDirective.ctorParameters = () => [\n { type: DateRangeService },\n { type: DateInputComponent },\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nDateRangeStartInputDirective.propDecorators = {\n autoCorrectOn: [{ type: Input }],\n navigateCalendarOnFocus: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeStartInputDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDateRangeStartInput]'\n }]\n }], function () { return [{ type: DateRangeService }, { type: DateInputComponent }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { navigateCalendarOnFocus: [{\n type: Input\n }], autoCorrectOn: [{\n type: Input\n }] }); })();\n\n/**\n * A directive which manages the MultiViewCalendar range selection.\n */\nclass DateRangeSelectionDirective {\n constructor(calendar, cdr, element, renderer, dateRangeService) {\n this.calendar = calendar;\n this.cdr = cdr;\n this.element = element;\n this.dateRangeService = dateRangeService;\n /**\n * Specifies the auto-correction behavior. If the start date is greater than the end date,\n * the directive fixes the date range to a single date either on input change or on blur\n * ([see example]({% slug autocorrect_daterange %}#toc-configuring-the-calendar-selection-directive)).\n *\n * By default, the auto-correction is triggered on change.\n * To disable this behavior, set the `autoCorrectOn` property to `none`.\n */\n this.autoCorrectOn = 'change';\n /**\n * Fires when the active range end is changed. For more information, refer to\n * the section on [events]({% slug overview_multiviewcalendar %}#toc-events).\n */\n this.activeRangeEndChange = new EventEmitter();\n /**\n * Fires when the selection range is changed. For more information, refer to\n * the section on [events]({% slug overview_multiviewcalendar %}#toc-events).\n */\n this.selectionRangeChange = new EventEmitter();\n this.calendarSubscriptions = new Subscription(() => { });\n this.dateRangeService = this.dateRangeService || new DateRangeService();\n renderer.setAttribute(element.nativeElement, 'aria-multiselectable', 'true');\n }\n /**\n * Gets or sets the selection range of the calendar. When a new range is set,\n * the connected DateRangeService notifies all related parties.\n */\n get selectionRange() {\n return this.calendar ? this.calendar.selectionRange : null;\n }\n set selectionRange(range$$1) {\n if (!this.isEqualCalendarRange(range$$1)) {\n this.setSelectionRange(range$$1);\n }\n if (!isEqualRange(this.dateRangeService.selectionRange, range$$1)) {\n this.dateRangeService.setRange(range$$1);\n }\n this.updateFocusedDate(range$$1);\n }\n /**\n * Gets or sets the active end of the selection range. This option determines which range end will be updated on\n * user interaction. When a new active end is set, the connected DateRangeService notifies all related parties.\n */\n /**\n * Specifies which end of the selection range will be marked as active. The active end gets modified upon user\n * interaction. When a new active end is set, the wired DateRangeService notifies all related components. For\n * example, the start and end DateInput components.\n *\n * > If the selection range is undefined, the value is ignored.\n */\n get activeRangeEnd() {\n return this.calendar.activeRangeEnd;\n }\n set activeRangeEnd(activeRange) {\n if (this.dateRangeService.activeRangeEnd === activeRange) {\n return;\n }\n this.calendar.activeRangeEnd = activeRange;\n this.dateRangeService.setActiveRangeEnd(activeRange);\n }\n get calendarRange() {\n return this.selectionRange || EMPTY_SELECTIONRANGE;\n }\n ngOnInit() {\n const calendar = this.calendar;\n const dateRangeService = this.dateRangeService;\n calendar.min = either(dateRangeService.min, calendar.min);\n calendar.max = either(dateRangeService.max, calendar.max);\n this.addSubscriptions(calendar.cellEnter.subscribe((value) => this.handleHover(value)), calendar.valueChange.subscribe((value) => this.handleChange(value)), dateRangeService.focusedDate$.subscribe(focusedDate => {\n if (!isEqual(calendar.focusedDate, focusedDate)) {\n calendar.focusedDate = focusedDate;\n }\n }), dateRangeService.activeRangeEnd$.subscribe(rangeEnd => {\n if (calendar.activeRangeEnd === rangeEnd) {\n return;\n }\n calendar.activeRangeEnd = rangeEnd;\n this.activeRangeEndChange.emit(rangeEnd);\n this.cdr.markForCheck();\n }), dateRangeService.range$.subscribe(range$$1 => {\n if (!this.isEqualCalendarRange(range$$1)) {\n this.acceptAndEmit(range$$1);\n }\n this.updateFocusedDate(range$$1);\n }), fromEvent(this.element.nativeElement, 'blur').subscribe(() => this.handleBlur()));\n }\n ngOnDestroy() {\n this.calendarSubscriptions.unsubscribe();\n }\n addSubscriptions(...subscriptions) {\n subscriptions.map(s => this.calendarSubscriptions.add(s));\n }\n isEqualCalendarRange(range$$1) {\n return isEqualRange(this.calendar.selectionRange, range$$1);\n }\n handleBlur() {\n const { start, end } = this.calendarRange;\n const autoCorrect = this.autoCorrectOn === 'blur' && start !== null && end !== null && end < start;\n if (autoCorrect) {\n this.dateRangeService.setRange(clampRange(start));\n }\n }\n handleChange(value) {\n const service = this.dateRangeService;\n const autoCorrect = this.autoCorrectOn === 'change' && this.shouldAutoCorrect(value);\n const activeEnd = this.calendar.activeRangeEnd !== 'end' ? 'end' : (autoCorrect ? 'end' : 'start');\n const range$$1 = autoCorrect ? clampRange(value) : this.updateRange(value);\n if (!isEqualRange(service.selectionRange, range$$1)) {\n this.acceptAndEmit(range$$1);\n service.setActiveRangeEnd(activeEnd);\n service.setRange(range$$1);\n }\n }\n handleHover(value) {\n if (this.hasCompleteRange()) {\n return;\n }\n const { start, end } = this.calendarRange;\n const activeRangeEnd = this.calendar.activeRangeEnd;\n const updateRange = (start && activeRangeEnd === 'end') || (end && activeRangeEnd === 'start');\n if (updateRange) {\n this.setSelectionRange(this.updateRange(value));\n }\n }\n hasCompleteRange() {\n const { start, end } = this.dateRangeService.selectionRange || EMPTY_SELECTIONRANGE;\n return Boolean(start) && Boolean(end);\n }\n shouldAutoCorrect(value) {\n const { end, start } = this.calendarRange;\n if (this.calendar.activeRangeEnd !== 'end') {\n return end !== null && value > end;\n }\n else {\n return start !== null && value < start;\n }\n }\n updateFocusedDate(range$$1) {\n if (!range$$1 || this.dateRangeService.focusedDate) {\n return;\n }\n this.dateRangeService.setFocusedDate(range$$1.start || range$$1.end);\n }\n updateRange(value) {\n const { end, start } = this.calendarRange;\n return this.calendar.activeRangeEnd !== 'end' ? ({ start: value, end }) : ({ start, end: value });\n }\n setSelectionRange(range$$1) {\n this.calendar.selectionRange = range$$1;\n this.calendar.writeValue(null);\n }\n acceptAndEmit(range$$1) {\n this.setSelectionRange(range$$1);\n this.selectionRangeChange.emit(range$$1);\n }\n}\nDateRangeSelectionDirective.ɵfac = function DateRangeSelectionDirective_Factory(t) { return new (t || DateRangeSelectionDirective)(ɵngcc0.ɵɵdirectiveInject(MultiViewCalendarComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DateRangeService, 8)); };\nDateRangeSelectionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateRangeSelectionDirective, selectors: [[\"\", \"kendoDateRangeSelection\", \"\"]], inputs: { autoCorrectOn: \"autoCorrectOn\", selectionRange: \"selectionRange\", activeRangeEnd: \"activeRangeEnd\" }, outputs: { activeRangeEndChange: \"activeRangeEndChange\", selectionRangeChange: \"selectionRangeChange\" } });\n/** @nocollapse */\nDateRangeSelectionDirective.ctorParameters = () => [\n { type: MultiViewCalendarComponent },\n { type: ChangeDetectorRef },\n { type: ElementRef },\n { type: Renderer2 },\n { type: DateRangeService, decorators: [{ type: Optional }] }\n];\nDateRangeSelectionDirective.propDecorators = {\n autoCorrectOn: [{ type: Input }],\n selectionRange: [{ type: Input }],\n activeRangeEnd: [{ type: Input }],\n activeRangeEndChange: [{ type: Output }],\n selectionRangeChange: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeSelectionDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDateRangeSelection]'\n }]\n }], function () { return [{ type: MultiViewCalendarComponent }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: DateRangeService, decorators: [{\n type: Optional\n }] }]; }, { autoCorrectOn: [{\n type: Input\n }], activeRangeEndChange: [{\n type: Output\n }], selectionRangeChange: [{\n type: Output\n }], selectionRange: [{\n type: Input\n }], activeRangeEnd: [{\n type: Input\n }] }); })();\n\n/* tslint:disable:directive-class-suffix directive-selector */\n/**\n * @hidden\n */\nclass KForOfContext {\n constructor($implicit, kForOf, index, count) {\n this.$implicit = $implicit;\n this.kForOf = kForOf;\n this.index = index;\n this.count = count;\n }\n get first() { return this.index === 0; }\n get last() { return this.index === this.count - 1; }\n get even() { return this.index % 2 === 0; }\n get odd() { return !this.even; }\n}\n/**\n * @hidden\n */\nclass KForOf {\n constructor(_viewContainer, _template, _differs) {\n this._viewContainer = _viewContainer;\n this._template = _template;\n this._differs = _differs;\n this._differ = null;\n }\n set kForTemplate(value) {\n if (value) {\n this._template = value;\n }\n }\n ngOnChanges(changes) {\n if ('kForOf' in changes) {\n const value = changes.kForOf.currentValue;\n if (this._differ || !value) {\n return;\n }\n try {\n this._differ = this._differs.find(value).create(this.kForTrackBy);\n }\n catch (e) {\n throw new Error(`Cannot find a differ supporting object '${value}' of type '${getTypeNameForDebugging(value)}'.`);\n }\n }\n }\n ngDoCheck() {\n if (this._differ) {\n const changes = this._differ.diff(this.kForOf);\n if (changes) {\n this._applyChanges(changes);\n }\n }\n }\n _applyChanges(changes) {\n if (!isDocumentAvailable()) {\n return;\n }\n const viewContainerLength = this._viewContainer.length;\n const dataLength = this.kForOf.length;\n const tuples = {};\n changes.forEachOperation((record, _, currentIndex) => {\n if (currentIndex !== null) {\n tuples[currentIndex] = record.item;\n }\n });\n for (let i = viewContainerLength; i < dataLength; i++) {\n this._viewContainer.createEmbeddedView(this._template, new KForOfContext(null, this.kForOf, -1, -1), i);\n }\n for (let i = this._viewContainer.length; i > dataLength; i--) {\n this._viewContainer.remove(i - 1);\n }\n for (let i = 0; i < this._viewContainer.length; i++) {\n const view = this._viewContainer.get(i);\n view.context.index = i;\n view.context.count = length;\n view.context.$implicit = tuples[i] || null;\n }\n }\n}\nKForOf.ɵfac = function KForOf_Factory(t) { return new (t || KForOf)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers)); };\nKForOf.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: KForOf, selectors: [[\"\", \"kFor\", \"\", \"kForOf\", \"\"]], inputs: { kForTemplate: \"kForTemplate\", kForOf: \"kForOf\", kForTrackBy: \"kForTrackBy\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nKForOf.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: TemplateRef },\n { type: IterableDiffers }\n];\nKForOf.propDecorators = {\n kForOf: [{ type: Input }],\n kForTrackBy: [{ type: Input }],\n kForTemplate: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(KForOf, [{\n type: Directive,\n args: [{ selector: '[kFor][kForOf]' }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: ɵngcc0.TemplateRef }, { type: ɵngcc0.IterableDiffers }]; }, { kForTemplate: [{\n type: Input\n }], kForOf: [{\n type: Input\n }], kForTrackBy: [{\n type: Input\n }] }); })();\n/**\n * @hidden\n */\nfunction getTypeNameForDebugging(type) {\n return type.name || typeof type;\n}\n\n/**\n * @hidden\n */\nclass HeaderComponent {\n constructor(bus, cdr, localization, intl, disabledDatesService) {\n this.bus = bus;\n this.cdr = cdr;\n this.localization = localization;\n this.intl = intl;\n this.disabledDatesService = disabledDatesService;\n this.navigate = true;\n this.todayAvailable = true;\n this.min = new Date(MIN_DATE);\n this.max = new Date(MAX_DATE);\n this.rangeLength = 1;\n this.today = new EventEmitter();\n this.subscriptions = new Subscription();\n }\n get getComponentClass() {\n return true;\n }\n ngOnInit() {\n this.subscriptions\n .add(this.intl.changes.subscribe(this.intlChange.bind(this)))\n .add(this.localization.changes.subscribe(this.l10nChange.bind(this)))\n .add(this.disabledDatesService.changes.subscribe(this.setTodayAvailability.bind(this)));\n }\n ngOnChanges(_) {\n const service = this.bus.service(this.activeView);\n if (!service) {\n return;\n }\n this.activeViewValue = CalendarViewEnum[this.activeView];\n this.todayMessage = this.localization.get('today');\n this.setTodayAvailability();\n this.navigate = this.bus.canMoveUp(this.activeView);\n this.title = this.getTitle();\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n handleTodayClick() {\n if (!this.todayAvailable) {\n return;\n }\n this.bus.moveToBottom(this.activeView);\n this.today.emit(dateInRange(getToday(), this.min, this.max));\n }\n handleNavigation() {\n if (!this.navigate) {\n return;\n }\n this.bus.moveUp(this.activeView);\n }\n intlChange() {\n if (this.currentDate && this.bus.service(this.activeView)) {\n this.title = this.getTitle();\n this.cdr.markForCheck();\n }\n }\n l10nChange() {\n this.todayMessage = this.localization.get('today');\n this.cdr.markForCheck();\n }\n getTitle() {\n if (!this.currentDate) {\n return '';\n }\n const service = this.bus.service(this.activeView);\n const take = this.rangeLength - 1;\n const title = service.title(this.currentDate);\n const nextDate = service.addToDate(this.currentDate, take);\n if (take < 1 || !service.isInRange(nextDate, this.min, this.max)) {\n return title;\n }\n return `${title} - ${service.title(nextDate)}`;\n }\n setTodayAvailability() {\n const today = getToday();\n const isTodayInRange = isInRange(today, getDate(this.min), getDate(this.max));\n const isDisabled = this.disabledDatesService.isDateDisabled(today);\n this.todayAvailable = isTodayInRange && !isDisabled;\n this.cdr.markForCheck();\n }\n}\nHeaderComponent.ɵfac = function HeaderComponent_Factory(t) { return new (t || HeaderComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService)); };\nHeaderComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: HeaderComponent, selectors: [[\"kendo-calendar-header\"]], hostVars: 2, hostBindings: function HeaderComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-calendar-header\", ctx.getComponentClass);\n } }, inputs: { min: \"min\", max: \"max\", rangeLength: \"rangeLength\", activeView: \"activeView\", currentDate: \"currentDate\", templateRef: \"templateRef\" }, outputs: { today: \"today\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 5, vars: 21, consts: [[1, \"k-button\", \"k-bare\", \"k-title\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [3, \"ngIf\"], [3, \"ngIf\", \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [1, \"k-today\", 3, \"kendoEventsOutsideAngular\", \"scope\"]], template: function HeaderComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 0);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_1_Template, 1, 1, \"ng-template\", 1);\n ɵngcc0.ɵɵtemplate(2, HeaderComponent_ng_template_2_Template, 0, 0, \"ng-template\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(3, \"span\", 3);\n ɵngcc0.ɵɵtext(4);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", !ctx.navigate);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(13, _c3, ctx.handleNavigation))(\"scope\", ctx);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.templateRef)(\"ngTemplateOutlet\", ctx.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction3(15, _c2, ctx.title, ctx.activeViewValue, ctx.currentDate));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", !ctx.todayAvailable);\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(19, _c3, ctx.handleTodayClick))(\"scope\", ctx);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.todayMessage, \" \");\n } }, directives: [ɵngcc3.EventsOutsideAngularDirective, ɵngcc2.NgIf, ɵngcc2.NgTemplateOutlet], encapsulation: 2 });\n/** @nocollapse */\nHeaderComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: ChangeDetectorRef },\n { type: LocalizationService },\n { type: IntlService },\n { type: DisabledDatesService }\n];\nHeaderComponent.propDecorators = {\n activeView: [{ type: Input }],\n currentDate: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n rangeLength: [{ type: Input }],\n templateRef: [{ type: Input }],\n today: [{ type: Output }],\n getComponentClass: [{ type: HostBinding, args: [\"class.k-calendar-header\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HeaderComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-calendar-header',\n template: `\n \n {{title}}\n
\n \n \n {{todayMessage}}\n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc4.LocalizationService }, { type: ɵngcc1.IntlService }, { type: DisabledDatesService }]; }, { min: [{\n type: Input\n }], max: [{\n type: Input\n }], rangeLength: [{\n type: Input\n }], today: [{\n type: Output\n }], getComponentClass: [{\n type: HostBinding,\n args: [\"class.k-calendar-header\"]\n }], activeView: [{\n type: Input\n }], currentDate: [{\n type: Input\n }], templateRef: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass WeekNamesService {\n constructor(intl) {\n this.intl = intl;\n }\n getWeekNames(includeWeekNumber = false) {\n const weekNames = shiftWeekNames(this.intl.dateFormatNames({ nameType: 'short', type: 'days' }), this.intl.firstDay());\n return includeWeekNumber ? [''].concat(weekNames) : weekNames;\n }\n}\nWeekNamesService.ɵfac = function WeekNamesService_Factory(t) { return new (t || WeekNamesService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nWeekNamesService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: WeekNamesService, factory: WeekNamesService.ɵfac });\n/** @nocollapse */\nWeekNamesService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(WeekNamesService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass ViewComponent {\n constructor(bus, intl, cdr, weekService, element, zone, renderer, disabledDatesService) {\n this.bus = bus;\n this.intl = intl;\n this.cdr = cdr;\n this.weekService = weekService;\n this.element = element;\n this.zone = zone;\n this.renderer = renderer;\n this.disabledDatesService = disabledDatesService;\n this.direction = 'vertical';\n this.isActive = true;\n this.change = new EventEmitter();\n this.cellEnter = new EventEmitter();\n this.cellLeave = new EventEmitter();\n this.weekNames = [];\n this.colSpan = 0;\n this.subscriptions = new Subscription();\n this.domEvents = [];\n this.subscriptions\n .add(this.intl.changes.subscribe(this.intlChange.bind(this)))\n .add(this.disabledDatesService.changes.subscribe(this.disabledDatesChange.bind(this)));\n }\n get weekNumber() {\n return this.showWeekNumbers && this.activeView === CalendarViewEnum.month;\n }\n set weekNumber(showWeekNumbers) {\n this.showWeekNumbers = showWeekNumbers;\n }\n ngOnInit() {\n if (this.element) {\n this.zone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n ngOnChanges(changes) {\n this.service = this.bus.service(this.activeView);\n if (!this.service) {\n return;\n }\n const generateWeekNames = this.isHorizontal() && this.weekNames.length === 0;\n if (generateWeekNames && (changes.weekNumber || changes.direction)) {\n this.weekNames = this.weekService.getWeekNames(this.weekNumber);\n }\n this.colSpan = this.service.rowLength(this.weekNumber);\n this.title = this.service.title(this.viewDate);\n this.updateData();\n if (changes.activeView) {\n this.currentCellIndex = null;\n }\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n this.domEvents.forEach(unsubscribeCallback => unsubscribeCallback());\n }\n isHorizontal() {\n return this.direction === 'horizontal';\n }\n isMonthView() {\n return this.activeView === CalendarViewEnum.month;\n }\n firstDate(rowCtx) {\n const ctx = this.firstWeekDateContext(rowCtx);\n return ctx ? ctx.value : null;\n }\n getWeekNumber(date) {\n if (!this.weekNumber) {\n return null;\n }\n return weekInYear(date, this.intl.firstDay());\n }\n getWeekNumberContext(rowCtx) {\n const ctx = this.firstWeekDateContext(rowCtx);\n if (!this.weekNumber || !ctx) {\n return null;\n }\n const weekNumber = weekInYear(ctx.value, this.intl.firstDay()).toString();\n return {\n formattedValue: weekNumber,\n id: null,\n isFocused: false,\n isSelected: false,\n isWeekend: false,\n title: weekNumber,\n value: cloneDate(ctx.value)\n };\n }\n getStyles(context) {\n const { isRangeEnd, isRangeStart } = context;\n const isEndActive = this.activeRangeEnd === 'end' && isRangeEnd;\n const isStartActive = this.activeRangeEnd === 'start' && isRangeStart;\n return stringifyClassObject({\n 'k-range-end': isRangeEnd,\n 'k-range-mid': context.isRangeMid,\n 'k-range-split-end': context.isRangeSplitEnd,\n 'k-range-split-start': context.isRangeSplitStart,\n 'k-range-start': isRangeStart,\n 'k-state-active': isStartActive || isEndActive,\n 'k-state-focused': this.isActive && context.isFocused,\n 'k-state-selected': context.isSelected || isRangeStart || isRangeEnd,\n 'k-today': context.isToday,\n 'k-weekend': context.isWeekend,\n 'k-state-disabled': context.isDisabled\n });\n }\n tableCellIndex(rowIndex, cellIndex) {\n return `${rowIndex}:${cellIndex}`;\n }\n firstWeekDateContext(rowCtx) {\n if (!this.weekNumber) {\n return null;\n }\n let idx = 0;\n let ctx = rowCtx[idx];\n while (!ctx && idx < rowCtx.length) {\n ctx = rowCtx[++idx];\n }\n return ctx;\n }\n updateData() {\n const time = this.selectedDate || getToday();\n const viewDate = setTime(this.viewDate, time);\n this.data = this.service.data({\n cellUID: this.cellUID,\n focusedDate: this.focusedDate,\n isActiveView: !this.bus.canMoveDown(this.activeView),\n max: this.max,\n min: this.min,\n selectedDate: this.selectedDate,\n selectionRange: this.selectionRange,\n viewDate: viewDate,\n isDateDisabled: this.disabledDatesService.isDateDisabled\n });\n }\n intlChange() {\n this.updateData();\n if (this.isHorizontal()) {\n this.weekNames = this.weekService.getWeekNames(this.weekNumber);\n }\n this.cdr.markForCheck();\n }\n disabledDatesChange() {\n this.updateData();\n this.cdr.markForCheck();\n }\n bindEvents() {\n const element = this.element.nativeElement;\n this.domEvents.push(this.renderer.listen(element, 'mouseover', this.cellMouseoverHandler.bind(this)), this.renderer.listen(element, 'mouseleave', this.mouseLeaveHandler.bind(this)), this.renderer.listen(element, 'click', this.clickHandler.bind(this)));\n }\n clickHandler(args) {\n const cell = this.closestCell(args);\n if (cell) {\n const index = cell.getAttribute('data-cell-index');\n const cellContext = this.cellByIndex(index);\n if (!cellContext.isDisabled) {\n this.change.emit(cellContext.value);\n }\n }\n }\n mouseLeaveHandler() {\n if (this.currentCellIndex) {\n this.emitCellLeave();\n }\n }\n cellMouseoverHandler(args) {\n const cell = this.closestCell(args);\n if (cell) {\n const index = cell.getAttribute('data-cell-index');\n if (this.currentCellIndex && this.currentCellIndex !== index) {\n this.emitCellLeave();\n }\n const value = this.cellByIndex(index).value;\n this.cellEnter.emit(value);\n this.currentCellIndex = index;\n }\n else if (this.currentCellIndex) {\n this.emitCellLeave();\n }\n }\n closestCell(eventArgs) {\n return closestInScope(eventArgs.target, node => node.hasAttribute('data-cell-index'), this.element.nativeElement);\n }\n emitCellLeave() {\n const item = this.cellByIndex(this.currentCellIndex);\n if (item) {\n this.cellLeave.emit(item.value);\n }\n this.currentCellIndex = null;\n }\n cellByIndex(index) {\n const [rowIndex, cellIndex] = index.split(':');\n return this.data[rowIndex][cellIndex];\n }\n}\nViewComponent.ɵfac = function ViewComponent_Factory(t) { return new (t || ViewComponent)(ɵngcc0.ɵɵdirectiveInject(BusViewService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(WeekNamesService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(DisabledDatesService)); };\nViewComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ViewComponent, selectors: [[\"\", \"kendoCalendarView\", \"\"]], inputs: { direction: \"direction\", isActive: \"isActive\", weekNumber: \"weekNumber\", activeView: \"activeView\", cellUID: \"cellUID\", focusedDate: \"focusedDate\", selectedDate: \"selectedDate\", viewDate: \"viewDate\", activeRangeEnd: \"activeRangeEnd\", selectionRange: \"selectionRange\", min: \"min\", max: \"max\", viewIndex: \"viewIndex\", templateRef: \"templateRef\", weekNumberTemplateRef: \"weekNumberTemplateRef\" }, outputs: { change: \"change\", cellEnter: \"cellEnter\", cellLeave: \"cellLeave\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c80, decls: 5, vars: 3, consts: [[\"emptyCell\", \"\"], [\"role\", \"row\", 4, \"ngIf\"], [\"role\", \"row\", 4, \"kFor\", \"kForOf\"], [1, \"k-empty\"], [\"role\", \"row\"], [\"scope\", \"col\", 3, \"colSpan\"], [4, \"ngFor\", \"ngForOf\"], [3, \"ngIf\"], [4, \"kFor\", \"kForOf\"], [\"class\", \"k-alt\", 4, \"ngIf\", \"ngIfElse\"], [1, \"k-alt\"], [3, \"ngIf\", \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [\"role\", \"gridcell\", 3, \"ngClass\", \"title\", 4, \"ngIf\", \"ngIfElse\"], [\"role\", \"gridcell\", 3, \"ngClass\", \"title\"], [1, \"k-link\"], [4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function ViewComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ViewComponent_ng_template_0_Template, 2, 0, \"ng-template\", null, 0, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵtemplate(2, ViewComponent_tr_2_Template, 3, 2, \"tr\", 1);\n ɵngcc0.ɵɵtemplate(3, ViewComponent_tr_3_Template, 2, 1, \"tr\", 1);\n ɵngcc0.ɵɵtemplate(4, ViewComponent_tr_4_Template, 3, 2, \"tr\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.isHorizontal());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isMonthView() && ctx.isHorizontal());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kForOf\", ctx.data);\n } }, directives: [ɵngcc2.NgIf, KForOf, ɵngcc2.NgForOf, ɵngcc2.NgTemplateOutlet, ɵngcc2.NgClass], encapsulation: 2 });\n/** @nocollapse */\nViewComponent.ctorParameters = () => [\n { type: BusViewService },\n { type: IntlService },\n { type: ChangeDetectorRef },\n { type: WeekNamesService },\n { type: ElementRef },\n { type: NgZone },\n { type: Renderer2 },\n { type: DisabledDatesService }\n];\nViewComponent.propDecorators = {\n direction: [{ type: Input }],\n isActive: [{ type: Input }],\n activeView: [{ type: Input }],\n cellUID: [{ type: Input }],\n focusedDate: [{ type: Input }],\n selectedDate: [{ type: Input }],\n viewDate: [{ type: Input }],\n activeRangeEnd: [{ type: Input }],\n selectionRange: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n weekNumber: [{ type: Input }],\n viewIndex: [{ type: Input }],\n templateRef: [{ type: Input }],\n weekNumberTemplateRef: [{ type: Input }],\n change: [{ type: Output }],\n cellEnter: [{ type: Output }],\n cellLeave: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ViewComponent, [{\n type: Component,\n args: [{\n selector: '[kendoCalendarView]',\n template: `\n  \n {{title}}\n \n {{name}}\n \n \n \n \n \n {{getWeekNumber(firstDate(row))}}\n \n \n \n \n \n \n \n {{cell.formattedValue}}\n \n \n \n \n \n `\n }]\n }], function () { return [{ type: BusViewService }, { type: ɵngcc1.IntlService }, { type: ɵngcc0.ChangeDetectorRef }, { type: WeekNamesService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: DisabledDatesService }]; }, { direction: [{\n type: Input\n }], isActive: [{\n type: Input\n }], change: [{\n type: Output\n }], cellEnter: [{\n type: Output\n }], cellLeave: [{\n type: Output\n }], weekNumber: [{\n type: Input\n }], activeView: [{\n type: Input\n }], cellUID: [{\n type: Input\n }], focusedDate: [{\n type: Input\n }], selectedDate: [{\n type: Input\n }], viewDate: [{\n type: Input\n }], activeRangeEnd: [{\n type: Input\n }], selectionRange: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], viewIndex: [{\n type: Input\n }], templateRef: [{\n type: Input\n }], weekNumberTemplateRef: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n *\n * The exported package module.\n *\n * The package exports:\n * - `HeaderComponent`—The component that renders the UI for vertical navigation.\n * - `ViewComponent`—The component that renders the active Calendar view.\n */\nclass CalendarCommonModule {\n}\nCalendarCommonModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: CalendarCommonModule });\nCalendarCommonModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function CalendarCommonModule_Factory(t) { return new (t || CalendarCommonModule)(); }, imports: [[CommonModule, EventsModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CalendarCommonModule, { declarations: function () { return [KForOf,\n HeaderComponent,\n ViewComponent]; }, imports: function () { return [CommonModule, EventsModule]; }, exports: function () { return [KForOf,\n HeaderComponent,\n ViewComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarCommonModule, [{\n type: NgModule,\n args: [{\n declarations: [\n KForOf,\n HeaderComponent,\n ViewComponent\n ],\n exports: [\n KForOf,\n HeaderComponent,\n ViewComponent\n ],\n imports: [CommonModule, EventsModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n *\n * The exported package module.\n *\n * The package exports:\n * - `CellTemplateDirective`—The month cell template directive.\n * - `MonthCellTemplateDirective`—The month cell template directive.\n * - `YearCellTemplateDirective`—The year cell template directive.\n * - `DecadeCellTemplateDirective`—The decade cell template directive.\n * - `CenturyCellTemplateDirective`—The century cell template directive.\n * - `WeekNumberCellTemplateDirective`—The month week number cell template directive.\n * - `HeaderTitleTemplateDirective`—The header title template directive.\n * - `NavigationItemTemplateDirective`—The navigation item template directive.\n */\nclass TemplatesModule {\n}\nTemplatesModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: TemplatesModule });\nTemplatesModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function TemplatesModule_Factory(t) { return new (t || TemplatesModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(TemplatesModule, { declarations: [CellTemplateDirective,\n MonthCellTemplateDirective,\n YearCellTemplateDirective,\n DecadeCellTemplateDirective,\n CenturyCellTemplateDirective,\n WeekNumberCellTemplateDirective,\n HeaderTitleTemplateDirective,\n NavigationItemTemplateDirective], exports: [CellTemplateDirective,\n MonthCellTemplateDirective,\n YearCellTemplateDirective,\n DecadeCellTemplateDirective,\n CenturyCellTemplateDirective,\n WeekNumberCellTemplateDirective,\n HeaderTitleTemplateDirective,\n NavigationItemTemplateDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TemplatesModule, [{\n type: NgModule,\n args: [{\n declarations: [\n CellTemplateDirective,\n MonthCellTemplateDirective,\n YearCellTemplateDirective,\n DecadeCellTemplateDirective,\n CenturyCellTemplateDirective,\n WeekNumberCellTemplateDirective,\n HeaderTitleTemplateDirective,\n NavigationItemTemplateDirective\n ],\n exports: [\n CellTemplateDirective,\n MonthCellTemplateDirective,\n YearCellTemplateDirective,\n DecadeCellTemplateDirective,\n CenturyCellTemplateDirective,\n WeekNumberCellTemplateDirective,\n HeaderTitleTemplateDirective,\n NavigationItemTemplateDirective\n ]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass CalendarMessages extends ComponentMessages {\n}\nCalendarMessages.ɵfac = function CalendarMessages_Factory(t) { return ɵCalendarMessages_BaseFactory(t || CalendarMessages); };\nCalendarMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CalendarMessages, inputs: { today: \"today\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nCalendarMessages.propDecorators = {\n today: [{ type: Input }]\n};\nconst ɵCalendarMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(CalendarMessages);\n\n/**\n * @hidden\n */\nclass CalendarLocalizedMessagesDirective extends CalendarMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nCalendarLocalizedMessagesDirective.ɵfac = function CalendarLocalizedMessagesDirective_Factory(t) { return new (t || CalendarLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nCalendarLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CalendarLocalizedMessagesDirective, selectors: [[\"\", \"kendoCalendarLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: CalendarMessages,\n useExisting: forwardRef(() => CalendarLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nCalendarLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: CalendarMessages,\n useExisting: forwardRef(() => CalendarLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoCalendarLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass CalendarCustomMessagesComponent extends CalendarMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nCalendarCustomMessagesComponent.ɵfac = function CalendarCustomMessagesComponent_Factory(t) { return new (t || CalendarCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nCalendarCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CalendarCustomMessagesComponent, selectors: [[\"kendo-calendar-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: CalendarMessages,\n useExisting: forwardRef(() => CalendarCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CalendarCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCalendarCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: CalendarMessages,\n useExisting: forwardRef(() => CalendarCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-calendar-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\nconst COMPONENT_DIRECTIVES = [\n VirtualizationComponent\n];\n/**\n * @hidden\n *\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Virtualization component.\n */\nclass VirtualizationModule {\n}\nVirtualizationModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: VirtualizationModule });\nVirtualizationModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function VirtualizationModule_Factory(t) { return new (t || VirtualizationModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(VirtualizationModule, { declarations: function () { return [VirtualizationComponent]; }, imports: function () { return [CommonModule]; }, exports: function () { return [VirtualizationComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(VirtualizationModule, [{\n type: NgModule,\n args: [{\n declarations: [COMPONENT_DIRECTIVES],\n exports: [COMPONENT_DIRECTIVES],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * The exported package module.\n *\n * The package exports:\n * - `CellTemplateDirective`—The month cell template directive.\n * - `MonthCellTemplateDirective`—The month cell template directive.\n * - `YearCellTemplateDirective`—The year cell template directive.\n * - `DecadeCellTemplateDirective`—The decade cell template directive.\n * - `CenturyCellTemplateDirective`—The century cell template directive.\n * - `WeekNumberCellTemplateDirective`—The month week number cell template directive.\n * - `HeaderTitleTemplateDirective`—The header title template directive.\n * - `NavigationItemTemplateDirective`—The navigation item template directive.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Calendar module\n * import { CalendarModule } from '@progress/kendo-angular-dateinputs';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, CalendarModule], // import Calendar module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass CalendarModule {\n}\nCalendarModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: CalendarModule });\nCalendarModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function CalendarModule_Factory(t) { return new (t || CalendarModule)(); }, providers: [\n CalendarDOMService,\n CenturyViewService,\n DecadeViewService,\n MonthViewService,\n YearViewService,\n WeekNamesService\n ], imports: [[\n CommonModule,\n CalendarCommonModule,\n IntlModule,\n TemplatesModule,\n VirtualizationModule,\n EventsModule,\n ResizeSensorModule\n ],\n CalendarCommonModule,\n TemplatesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CalendarModule, { declarations: function () { return [CalendarComponent,\n NavigationComponent,\n CalendarCustomMessagesComponent,\n CalendarLocalizedMessagesDirective,\n ViewListComponent]; }, imports: function () { return [CommonModule,\n CalendarCommonModule,\n IntlModule,\n TemplatesModule,\n VirtualizationModule,\n EventsModule,\n ResizeSensorModule]; }, exports: function () { return [CalendarComponent,\n NavigationComponent,\n CalendarCustomMessagesComponent,\n CalendarLocalizedMessagesDirective,\n ViewListComponent,\n CalendarCommonModule,\n TemplatesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarModule, [{\n type: NgModule,\n args: [{\n declarations: [\n CalendarComponent,\n NavigationComponent,\n CalendarCustomMessagesComponent,\n CalendarLocalizedMessagesDirective,\n ViewListComponent\n ],\n exports: [\n CalendarComponent,\n NavigationComponent,\n CalendarCustomMessagesComponent,\n CalendarLocalizedMessagesDirective,\n ViewListComponent,\n CalendarCommonModule,\n TemplatesModule\n ],\n imports: [\n CommonModule,\n CalendarCommonModule,\n IntlModule,\n TemplatesModule,\n VirtualizationModule,\n EventsModule,\n ResizeSensorModule\n ],\n providers: [\n CalendarDOMService,\n CenturyViewService,\n DecadeViewService,\n MonthViewService,\n YearViewService,\n WeekNamesService\n ]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass Messages extends ComponentMessages {\n}\nMessages.ɵfac = function Messages_Factory(t) { return ɵMessages_BaseFactory(t || Messages); };\nMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages, inputs: { today: \"today\", prevButtonTitle: \"prevButtonTitle\", nextButtonTitle: \"nextButtonTitle\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages.propDecorators = {\n today: [{ type: Input }],\n prevButtonTitle: [{ type: Input }],\n nextButtonTitle: [{ type: Input }]\n};\nconst ɵMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages);\n\n/**\n * @hidden\n */\nclass MultiViewCalendarLocalizedMessagesDirective extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nMultiViewCalendarLocalizedMessagesDirective.ɵfac = function MultiViewCalendarLocalizedMessagesDirective_Factory(t) { return new (t || MultiViewCalendarLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nMultiViewCalendarLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: MultiViewCalendarLocalizedMessagesDirective, selectors: [[\"\", \"kendoMultiViewCalendarLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => MultiViewCalendarLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nMultiViewCalendarLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MultiViewCalendarLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => MultiViewCalendarLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoMultiViewCalendarLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass MultiViewCalendarCustomMessagesComponent extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nMultiViewCalendarCustomMessagesComponent.ɵfac = function MultiViewCalendarCustomMessagesComponent_Factory(t) { return new (t || MultiViewCalendarCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nMultiViewCalendarCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: MultiViewCalendarCustomMessagesComponent, selectors: [[\"kendo-multiviewcalendar-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => MultiViewCalendarCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function MultiViewCalendarCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nMultiViewCalendarCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MultiViewCalendarCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => MultiViewCalendarCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-multiviewcalendar-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * The package exports:\n * - `CellTemplateDirective`—The month cell template directive.\n * - `MonthCellTemplateDirective`—The month cell template directive.\n * - `YearCellTemplateDirective`—The year cell template directive.\n * - `DecadeCellTemplateDirective`—The decade cell template directive.\n * - `CenturyCellTemplateDirective`—The century cell template directive.\n * - `WeekNumberCellTemplateDirective`—The month week number cell template directive.\n * - `HeaderTitleTemplateDirective`—The header title template directive.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the MultiViewCalendar module\n * import { MultiViewCalendarModule } from '@progress/kendo-angular-dateinputs';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, MultiViewCalendarModule], // import MultiViewCalendar module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n */\nclass MultiViewCalendarModule {\n}\nMultiViewCalendarModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: MultiViewCalendarModule });\nMultiViewCalendarModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function MultiViewCalendarModule_Factory(t) { return new (t || MultiViewCalendarModule)(); }, providers: [\n NavigationService,\n CenturyViewService,\n DecadeViewService,\n MonthViewService,\n YearViewService,\n WeekNamesService\n ], imports: [[CommonModule, CalendarCommonModule, IntlModule, TemplatesModule, PopupModule],\n CalendarCommonModule,\n TemplatesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MultiViewCalendarModule, { declarations: function () { return [HorizontalViewListComponent,\n MultiViewCalendarLocalizedMessagesDirective,\n MultiViewCalendarCustomMessagesComponent,\n MultiViewCalendarComponent]; }, imports: function () { return [CommonModule,\n CalendarCommonModule,\n IntlModule,\n TemplatesModule,\n PopupModule]; }, exports: function () { return [HorizontalViewListComponent,\n MultiViewCalendarLocalizedMessagesDirective,\n MultiViewCalendarCustomMessagesComponent,\n MultiViewCalendarComponent,\n CalendarCommonModule,\n TemplatesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MultiViewCalendarModule, [{\n type: NgModule,\n args: [{\n declarations: [\n HorizontalViewListComponent,\n MultiViewCalendarLocalizedMessagesDirective,\n MultiViewCalendarCustomMessagesComponent,\n MultiViewCalendarComponent\n ],\n exports: [\n HorizontalViewListComponent,\n MultiViewCalendarLocalizedMessagesDirective,\n MultiViewCalendarCustomMessagesComponent,\n MultiViewCalendarComponent,\n CalendarCommonModule,\n TemplatesModule\n ],\n imports: [CommonModule, CalendarCommonModule, IntlModule, TemplatesModule, PopupModule],\n providers: [\n NavigationService,\n CenturyViewService,\n DecadeViewService,\n MonthViewService,\n YearViewService,\n WeekNamesService\n ]\n }]\n }], null, null); })();\n\n/**\n * The exported package module.\n *\n * The package exports:\n * - `CalendarModule`—The calendar module.\n * - `MultiViewCalendarModule`—The multi-view calendar module.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Calendars module\n * import { CalendarsModule } from '@progress/kendo-angular-dateinputs';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, CalendarsModule], // import the Calendars module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass CalendarsModule {\n}\nCalendarsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: CalendarsModule });\nCalendarsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function CalendarsModule_Factory(t) { return new (t || CalendarsModule)(); }, imports: [[\n CalendarModule,\n MultiViewCalendarModule\n ],\n CalendarModule,\n MultiViewCalendarModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CalendarsModule, { imports: [CalendarModule,\n MultiViewCalendarModule], exports: [CalendarModule,\n MultiViewCalendarModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CalendarsModule, [{\n type: NgModule,\n args: [{\n exports: [\n CalendarModule,\n MultiViewCalendarModule\n ],\n imports: [\n CalendarModule,\n MultiViewCalendarModule\n ]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass DateInputMessages extends ComponentMessages {\n}\nDateInputMessages.ɵfac = function DateInputMessages_Factory(t) { return ɵDateInputMessages_BaseFactory(t || DateInputMessages); };\nDateInputMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateInputMessages, inputs: { decrement: \"decrement\", increment: \"increment\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nDateInputMessages.propDecorators = {\n decrement: [{ type: Input }],\n increment: [{ type: Input }]\n};\nconst ɵDateInputMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(DateInputMessages);\n\n/**\n * @hidden\n */\nclass DateInputLocalizedMessagesDirective extends DateInputMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nDateInputLocalizedMessagesDirective.ɵfac = function DateInputLocalizedMessagesDirective_Factory(t) { return new (t || DateInputLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nDateInputLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateInputLocalizedMessagesDirective, selectors: [[\"\", \"kendoDateInputLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: DateInputMessages,\n useExisting: forwardRef(() => DateInputLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nDateInputLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateInputLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: DateInputMessages,\n useExisting: forwardRef(() => DateInputLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoDateInputLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass DateInputCustomMessagesComponent extends DateInputMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nDateInputCustomMessagesComponent.ɵfac = function DateInputCustomMessagesComponent_Factory(t) { return new (t || DateInputCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nDateInputCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateInputCustomMessagesComponent, selectors: [[\"kendo-dateinput-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: DateInputMessages,\n useExisting: forwardRef(() => DateInputCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DateInputCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nDateInputCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateInputCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: DateInputMessages,\n useExisting: forwardRef(() => DateInputCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-dateinput-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the DateInput component.\n */\nclass DateInputModule {\n}\nDateInputModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DateInputModule });\nDateInputModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DateInputModule_Factory(t) { return new (t || DateInputModule)(); }, imports: [[CommonModule, IntlModule, EventsModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DateInputModule, { declarations: function () { return [DateInputComponent,\n DateInputCustomMessagesComponent,\n DateInputLocalizedMessagesDirective]; }, imports: function () { return [CommonModule, IntlModule, EventsModule]; }, exports: function () { return [DateInputComponent,\n DateInputCustomMessagesComponent,\n DateInputLocalizedMessagesDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateInputModule, [{\n type: NgModule,\n args: [{\n declarations: [\n DateInputComponent,\n DateInputCustomMessagesComponent,\n DateInputLocalizedMessagesDirective\n ],\n exports: [\n DateInputComponent,\n DateInputCustomMessagesComponent,\n DateInputLocalizedMessagesDirective\n ],\n imports: [CommonModule, IntlModule, EventsModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass DatePickerMessages extends ComponentMessages {\n}\nDatePickerMessages.ɵfac = function DatePickerMessages_Factory(t) { return ɵDatePickerMessages_BaseFactory(t || DatePickerMessages); };\nDatePickerMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DatePickerMessages, inputs: { today: \"today\", toggle: \"toggle\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nDatePickerMessages.propDecorators = {\n today: [{ type: Input }],\n toggle: [{ type: Input }]\n};\nconst ɵDatePickerMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(DatePickerMessages);\n\n/**\n * @hidden\n */\nclass DatePickerLocalizedMessagesDirective extends DatePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nDatePickerLocalizedMessagesDirective.ɵfac = function DatePickerLocalizedMessagesDirective_Factory(t) { return new (t || DatePickerLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nDatePickerLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DatePickerLocalizedMessagesDirective, selectors: [[\"\", \"kendoDatePickerLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: DatePickerMessages,\n useExisting: forwardRef(() => DatePickerLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nDatePickerLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DatePickerLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: DatePickerMessages,\n useExisting: forwardRef(() => DatePickerLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoDatePickerLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass DatePickerCustomMessagesComponent extends DatePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nDatePickerCustomMessagesComponent.ɵfac = function DatePickerCustomMessagesComponent_Factory(t) { return new (t || DatePickerCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nDatePickerCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DatePickerCustomMessagesComponent, selectors: [[\"kendo-datepicker-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: DatePickerMessages,\n useExisting: forwardRef(() => DatePickerCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DatePickerCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nDatePickerCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DatePickerCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: DatePickerMessages,\n useExisting: forwardRef(() => DatePickerCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-datepicker-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\nconst ɵ0$e = touchEnabled;\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the DatePicker component.\n */\nclass DatePickerModule {\n}\nDatePickerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DatePickerModule });\nDatePickerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DatePickerModule_Factory(t) { return new (t || DatePickerModule)(); }, providers: [{ provide: TOUCH_ENABLED, useValue: ɵ0$e }], imports: [[\n CommonModule,\n DateInputModule,\n CalendarModule,\n IntlModule,\n PopupModule,\n TemplatesModule,\n EventsModule\n ],\n TemplatesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DatePickerModule, { declarations: function () { return [DatePickerComponent,\n DatePickerCustomMessagesComponent,\n DatePickerLocalizedMessagesDirective]; }, imports: function () { return [CommonModule,\n DateInputModule,\n CalendarModule,\n IntlModule,\n PopupModule,\n TemplatesModule,\n EventsModule]; }, exports: function () { return [DatePickerComponent,\n DatePickerCustomMessagesComponent,\n DatePickerLocalizedMessagesDirective,\n TemplatesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DatePickerModule, [{\n type: NgModule,\n args: [{\n declarations: [\n DatePickerComponent,\n DatePickerCustomMessagesComponent,\n DatePickerLocalizedMessagesDirective\n ],\n exports: [\n DatePickerComponent,\n DatePickerCustomMessagesComponent,\n DatePickerLocalizedMessagesDirective,\n TemplatesModule\n ],\n imports: [\n CommonModule,\n DateInputModule,\n CalendarModule,\n IntlModule,\n PopupModule,\n TemplatesModule,\n EventsModule\n ],\n providers: [{ provide: TOUCH_ENABLED, useValue: ɵ0$e }]\n }]\n }], null, null); })();\n\nconst COMPONENT_DIRECTIVES$1 = [\n DateRangeComponent,\n DateRangePopupComponent,\n DateRangePopupTemplateDirective,\n DateRangeSelectionDirective,\n DateRangeStartInputDirective,\n DateRangeEndInputDirective\n];\nconst COMPONENT_MODULES = [\n MultiViewCalendarModule,\n DateInputModule,\n PopupModule,\n EventsModule\n];\n/**\n * The exported package module.\n *\n * The package exports:\n * - `DateRangeComponent`—The DateRange component class.\n * - `DateRangePopupComponent`—The DateRangePopup component class.\n * - `DateRangeSelectionDirective`—The MultiviewCalendar date range selection directive.\n * - `DateRangeEndInputDirective`—The end DateInput date range selection directive.\n * - `DateRangeStartInputDirective`—The start DateInput date range selection directive.\n * - `DateRangePopupTemplateDirective`—The DateRangePopup content template directive.\n * - `MultiViewCalendarModule`—The MultiViewCalendar module.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the DateRange module\n * import { DateRangeModule } from '@progress/kendo-angular-dateinputs';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, DateRangeModule], // import DateRange module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass DateRangeModule {\n}\nDateRangeModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DateRangeModule });\nDateRangeModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DateRangeModule_Factory(t) { return new (t || DateRangeModule)(); }, imports: [[CommonModule, COMPONENT_MODULES]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DateRangeModule, { declarations: function () { return [DateRangeComponent,\n DateRangePopupComponent,\n DateRangePopupTemplateDirective,\n DateRangeSelectionDirective,\n DateRangeStartInputDirective,\n DateRangeEndInputDirective]; }, imports: function () { return [CommonModule,\n MultiViewCalendarModule,\n DateInputModule,\n PopupModule,\n EventsModule]; }, exports: function () { return [DateRangeComponent,\n DateRangePopupComponent,\n DateRangePopupTemplateDirective,\n DateRangeSelectionDirective,\n DateRangeStartInputDirective,\n DateRangeEndInputDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateRangeModule, [{\n type: NgModule,\n args: [{\n declarations: [COMPONENT_DIRECTIVES$1],\n exports: [COMPONENT_DIRECTIVES$1],\n imports: [CommonModule, COMPONENT_MODULES]\n }]\n }], null, null); })();\n\nconst div$1 = domContainerFactory('div');\nconst ul$1 = domContainerFactory('ul');\nconst li$1 = domContainerFactory('li');\nconst listItem = () => li$1('02', 'k-item');\nconst list = () => ul$1([listItem()], 'k-reset');\nconst scrollable$1 = () => (div$1([list()], 'k-time-container k-content k-scrollable'));\nconst timeListWrapper = () => {\n if (!isDocumentAvailable()) {\n return null;\n }\n return div$1([div$1([scrollable$1()], 'k-time-list')], 'k-time-list-wrapper', { left: '-10000px', position: 'absolute' });\n};\nconst TIMELIST_WRAPPER = timeListWrapper();\n/**\n * @hidden\n */\nclass TimePickerDOMService {\n ensureHeights() {\n if (this.timeListHeight !== undefined) {\n return;\n }\n this.calculateHeights();\n }\n calculateHeights(container) {\n if (!isDocumentAvailable()) {\n return;\n }\n const listContainer = container && container.querySelector('.k-time-list-container');\n const hostContainer = listContainer || document.body;\n const wrapper = hostContainer.appendChild(TIMELIST_WRAPPER);\n this.timeListHeight = wrapper.querySelector('.k-scrollable').getBoundingClientRect().height;\n this.itemHeight = wrapper.querySelector('li').getBoundingClientRect().height;\n hostContainer.removeChild(wrapper);\n }\n isActive(element) {\n if (!isDocumentAvailable() || !element) {\n return false;\n }\n return (element.nativeElement || element) === document.activeElement;\n }\n}\nTimePickerDOMService.ɵfac = function TimePickerDOMService_Factory(t) { return new (t || TimePickerDOMService)(); };\nTimePickerDOMService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: TimePickerDOMService, factory: TimePickerDOMService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimePickerDOMService, [{\n type: Injectable\n }], null, null); })();\n\nconst HOURS_IN_DAY = 24;\nconst clampToRange = (rangeValue) => (value) => value % rangeValue;\nconst clamp = clampToRange(HOURS_IN_DAY);\nconst stepper = (start, step) => (idx) => clamp(start + (idx * step));\nconst distanceFromMin = (value, min) => clamp(HOURS_IN_DAY + value - min);\nconst limit = (borderValue) => (barrier, value) => {\n const useBarrier = !value || getDate(barrier).getTime() === getDate(value).getTime();\n return useBarrier ? barrier : setHours(barrier, borderValue);\n};\nconst limitDown = limit(0);\nconst limitUp = limit(HOURS_IN_DAY - 1);\n/**\n * @hidden\n */\nclass HoursService {\n constructor(intl) {\n this.intl = intl;\n this.boundRange = false;\n this.insertUndividedMax = false;\n }\n apply(value, candidate) {\n return setHours(value, candidate.getHours());\n }\n configure(settings) {\n const { boundRange = this.boundRange, insertUndividedMax = this.insertUndividedMax, min = this.min, max = this.max, part, step = this.step } = settings;\n this.boundRange = boundRange;\n this.insertUndividedMax = insertUndividedMax;\n this.toListItem = (hour) => {\n const date = setHours(MIDNIGHT_DATE, hour);\n return {\n text: this.intl.formatDate(date, part.pattern),\n value: date\n };\n };\n this.min = min;\n this.max = max;\n this.step = step;\n }\n data(selectedValue) {\n const [min] = this.range(selectedValue);\n const getHour = stepper(min, this.step);\n const convertToItem = (idx) => (this.toListItem(getHour(idx)));\n const data = range(0, this.countFromMin(selectedValue)).map(convertToItem);\n this.addLast(data);\n this.addMissing(data, selectedValue);\n return data;\n }\n isRangeChanged(min, max) {\n return !isEqual(this.min, min) || !isEqual(this.max, max);\n }\n limitRange(min, max, value) {\n return this.boundRange ? [limitDown(min, value), limitUp(max, value)] : [min, max];\n }\n total(value) {\n const last$$1 = this.insertUndividedMax && this.isLastMissing(value) ? 1 : 0;\n const missing = this.isMissing(value) ? 1 : 0;\n return this.countFromMin(value) + missing + last$$1;\n }\n selectedIndex(value) {\n return Math.ceil(this.divideByStep(value));\n }\n valueInList(value) {\n if (!value) {\n return true;\n }\n const matchMax = this.insertUndividedMax && this.lastHour(value) === value.getHours();\n return matchMax || !this.isMissing(value);\n }\n addLast(data, value) {\n if (this.insertUndividedMax && this.isLastMissing(value)) {\n data.push(this.toListItem(this.lastHour(value)));\n }\n return data;\n }\n addMissing(data, value) {\n if (this.valueInList(value)) {\n return data;\n }\n const missingItem = this.toListItem(value.getHours());\n data.splice(this.selectedIndex(value), 0, missingItem);\n return data;\n }\n countFromMin(value) {\n const [min, max] = this.range(value);\n return Math.floor(distanceFromMin(max, min) / this.step) + 1; /* include min */\n }\n isMissing(value) {\n if (!value) {\n return false;\n }\n return this.selectedIndex(value) !== this.divideByStep(value);\n }\n isLastMissing(value) {\n return this.isMissing(setHours(this.max, this.lastHour(value)));\n }\n divideByStep(value) {\n return distanceFromMin(value.getHours(), this.min.getHours()) / this.step;\n }\n lastHour(value) {\n return this.range(value)[1];\n }\n range(value) {\n const [min, max] = this.limitRange(this.min, this.max, value);\n return [min.getHours(), max.getHours()];\n }\n}\nHoursService.ɵfac = function HoursService_Factory(t) { return new (t || HoursService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nHoursService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: HoursService, factory: HoursService.ɵfac });\n/** @nocollapse */\nHoursService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HoursService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\nconst MINUTES_IN_HOUR = 60;\nconst clampToRange$1 = (rangeValue) => (value) => value % rangeValue;\nconst clamp$1 = clampToRange$1(MINUTES_IN_HOUR);\nconst stepper$1 = (start, step) => (idx) => clamp$1(start + (idx * step));\nconst distanceFromMin$1 = (value, min) => clamp$1(MINUTES_IN_HOUR + value - min);\nconst limit$1 = (borderValue) => (barrier, value) => {\n const useBarrier = !value || barrier.getHours() === value.getHours();\n return useBarrier ? barrier : setMinutes(barrier, borderValue);\n};\nconst limitDown$1 = limit$1(0);\nconst limitUp$1 = limit$1(MINUTES_IN_HOUR - 1);\n/**\n * @hidden\n */\nclass MinutesService {\n constructor(intl) {\n this.intl = intl;\n this.insertUndividedMax = false;\n }\n apply(value, candidate) {\n return setMinutes(value, candidate.getMinutes());\n }\n configure(settings) {\n const { insertUndividedMax = this.insertUndividedMax, min = this.min, max = this.max, part, step = this.step } = settings;\n this.insertUndividedMax = insertUndividedMax;\n this.toListItem = (minute) => {\n const date = setMinutes(MIDNIGHT_DATE, minute);\n return {\n text: this.intl.formatDate(date, part.pattern),\n value: date\n };\n };\n this.min = min;\n this.max = max;\n this.step = step;\n }\n data(selectedValue) {\n const [min] = this.range(selectedValue);\n const getMinute = stepper$1(min, this.step);\n const convertToItem = (idx) => (this.toListItem(getMinute(idx)));\n const data = range(0, this.countFromMin(selectedValue)).map(convertToItem);\n this.addLast(data);\n this.addMissing(data, selectedValue);\n return data;\n }\n isRangeChanged(min, max) {\n return !isEqual(this.min, min) || !isEqual(this.max, max);\n }\n limitRange(min, max, value) {\n return [limitDown$1(min, value), limitUp$1(max, value)];\n }\n total(value) {\n const last$$1 = this.insertUndividedMax && this.isLastMissing(value) ? 1 : 0;\n const missing = this.isMissing(value) ? 1 : 0;\n return this.countFromMin(value) + missing + last$$1;\n }\n selectedIndex(value) {\n return Math.ceil(this.divideByStep(value));\n }\n valueInList(value) {\n if (!value) {\n return true;\n }\n const matchMax = this.insertUndividedMax && this.lastMinute(value) === value.getMinutes();\n return matchMax || !this.isMissing(value);\n }\n addLast(data, value) {\n if (this.insertUndividedMax && this.isLastMissing(value)) {\n data.push(this.toListItem(this.lastMinute(value)));\n }\n return data;\n }\n addMissing(data, value) {\n if (this.valueInList(value)) {\n return data;\n }\n const missingItem = this.toListItem(value.getMinutes());\n data.splice(this.selectedIndex(value), 0, missingItem);\n return data;\n }\n countFromMin(value) {\n const [min, max] = this.range(value);\n return Math.floor(distanceFromMin$1(max, min) / this.step) + 1; /* include min */\n }\n isMissing(value) {\n if (!value) {\n return false;\n }\n return this.selectedIndex(value) !== this.divideByStep(value);\n }\n isLastMissing(value) {\n return this.isMissing(setMinutes(this.max, this.lastMinute(value)));\n }\n divideByStep(value) {\n return distanceFromMin$1(value.getMinutes(), this.min.getMinutes()) / this.step;\n }\n lastMinute(value) {\n return this.range(value)[1];\n }\n range(value) {\n const [min, max] = this.limitRange(this.min, this.max, value);\n return [min.getMinutes(), max.getMinutes()];\n }\n}\nMinutesService.ɵfac = function MinutesService_Factory(t) { return new (t || MinutesService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nMinutesService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: MinutesService, factory: MinutesService.ɵfac });\n/** @nocollapse */\nMinutesService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MinutesService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\nconst SECONDS_IN_HOUR = 60;\nconst clampToRange$2 = (rangeValue) => (value) => value % rangeValue;\nconst clamp$2 = clampToRange$2(SECONDS_IN_HOUR);\nconst stepper$2 = (start, step) => (idx) => clamp$2(start + (idx * step));\nconst distanceFromMin$2 = (value, min) => clamp$2(SECONDS_IN_HOUR + value - min);\nconst limit$2 = (borderValue) => (barrier, value) => {\n const useBarrier = !value || barrier.getHours() === value.getHours() && barrier.getMinutes() === value.getMinutes();\n return useBarrier ? barrier : setSeconds(barrier, borderValue);\n};\nconst limitDown$2 = limit$2(0);\nconst limitUp$2 = limit$2(SECONDS_IN_HOUR - 1);\n/**\n * @hidden\n */\nclass SecondsService {\n constructor(intl) {\n this.intl = intl;\n this.insertUndividedMax = false;\n }\n apply(value, candidate) {\n return setSeconds(value, candidate.getSeconds());\n }\n configure(settings) {\n const { insertUndividedMax = this.insertUndividedMax, min = this.min, max = this.max, part, step = this.step } = settings;\n this.insertUndividedMax = insertUndividedMax;\n this.toListItem = (minute) => {\n const date = setSeconds(MIDNIGHT_DATE, minute);\n return {\n text: this.intl.formatDate(date, part.pattern),\n value: date\n };\n };\n this.min = min;\n this.max = max;\n this.step = step;\n }\n data(selectedValue) {\n const [min] = this.range(selectedValue);\n const getSecond = stepper$2(min, this.step);\n const convertToItem = (idx) => (this.toListItem(getSecond(idx)));\n const data = range(0, this.countFromMin(selectedValue)).map(convertToItem);\n this.addLast(data);\n this.addMissing(data, selectedValue);\n return data;\n }\n isRangeChanged(min, max) {\n return !isEqual(this.min, min) || !isEqual(this.max, max);\n }\n limitRange(min, max, value) {\n return [limitDown$2(min, value), limitUp$2(max, value)];\n }\n total(value) {\n const last$$1 = this.insertUndividedMax && this.isLastMissing(value) ? 1 : 0;\n const missing = this.isMissing(value) ? 1 : 0;\n return this.countFromMin(value) + missing + last$$1;\n }\n selectedIndex(value) {\n return Math.ceil(this.divideByStep(value));\n }\n valueInList(value) {\n if (!value) {\n return true;\n }\n const matchMax = this.insertUndividedMax && this.lastSecond(value) === value.getSeconds();\n return matchMax || !this.isMissing(value);\n }\n divideByStep(value) {\n return distanceFromMin$2(value.getSeconds(), this.min.getSeconds()) / this.step;\n }\n addLast(data, value) {\n if (this.insertUndividedMax && this.isLastMissing(value)) {\n data.push(this.toListItem(this.lastSecond(value)));\n }\n return data;\n }\n addMissing(data, value) {\n if (this.valueInList(value)) {\n return data;\n }\n const missingItem = this.toListItem(value.getSeconds());\n data.splice(this.selectedIndex(value), 0, missingItem);\n return data;\n }\n countFromMin(value) {\n const [min, max] = this.range(value);\n return Math.floor(distanceFromMin$2(max, min) / this.step) + 1; /* include min */\n }\n isMissing(value) {\n if (!value) {\n return false;\n }\n return this.selectedIndex(value) !== this.divideByStep(value);\n }\n isLastMissing(value) {\n return this.isMissing(setSeconds(this.max, this.lastSecond(value)));\n }\n lastSecond(value) {\n return this.range(value)[1];\n }\n range(value) {\n const [min, max] = this.limitRange(this.min, this.max, value);\n return [min.getSeconds(), max.getSeconds()];\n }\n}\nSecondsService.ɵfac = function SecondsService_Factory(t) { return new (t || SecondsService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nSecondsService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SecondsService, factory: SecondsService.ɵfac });\n/** @nocollapse */\nSecondsService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SecondsService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\nconst setHours$1 = (date, hours) => {\n const clone = cloneDate(date);\n clone.setHours(hours);\n return clone;\n};\nconst isAM = (value) => value !== null && value < 12;\nconst isPM = (value) => value !== null && (!value || value > 11);\nconst inRange = (value, min, max) => ((!min && !max) || (value >= min && value <= max));\nconst inReverseRange = (value, min, max) => ((!min && !max) || value >= min || value <= max);\n/**\n * @hidden\n */\nclass DayPeriodService {\n constructor(intl) {\n this.intl = intl;\n }\n /**\n * @hidden\n */\n apply(value, candidate) {\n const hour = value.getHours();\n const hourAM = isAM(hour);\n const candidateAM = isAM(candidate.getHours());\n if ((hourAM && candidateAM) || (!hourAM && !candidateAM)) {\n return value;\n }\n const [min, max = 24] = this.normalizedRange();\n const result = hour + (candidateAM ? -12 : 12);\n return setHours$1(value, Math.min(Math.max(min, result), (max || 24)));\n }\n /**\n * @hidden\n */\n configure(settings) {\n const { min = this.min, max = this.max, part = this.part } = settings;\n this.min = min;\n this.max = max;\n this.part = part;\n }\n /**\n * @hidden\n */\n data(_) {\n const names = this.part.names;\n if (!names) {\n return [];\n }\n const data = [];\n const [min, max] = this.normalizedRange();\n const dayPeriod = this.intl.dateFormatNames(names);\n if (isAM(min)) {\n data.push({ text: dayPeriod.am, value: setHours$1(this.min, min) });\n }\n if (isPM(max)) {\n data.push({ text: dayPeriod.pm, value: setHours$1(this.min, Math.max(12, max)) });\n }\n return this.min.getHours() !== min ? data.reverse() : data;\n }\n /**\n * @hidden\n */\n isRangeChanged(_, __) {\n return false;\n }\n /**\n * @hidden\n */\n limitRange(min, max, _) {\n return [min, max];\n }\n /**\n * @hidden\n */\n total() {\n const [min, max] = this.normalizedRange();\n if (!min && !max) {\n return 2;\n }\n if (min > 11 || max < 12) {\n return 1;\n }\n return 2;\n }\n /**\n * @hidden\n */\n selectedIndex(value) {\n if (!this.valueInList(value)) {\n return -1;\n }\n const index = Math.floor(value.getHours() / 12);\n return this.min.getHours() === this.normalizedRange()[0] ? index : (index === 0 ? 1 : 0);\n }\n /**\n * @hidden\n */\n valueInList(value) {\n const reverse = this.min.getHours() !== this.normalizedRange()[0];\n const isInRange = reverse ? inReverseRange : inRange;\n return isInRange(value.getHours(), this.min.getHours(), this.max.getHours());\n }\n normalizedRange() {\n const minHour = this.min.getHours();\n const maxHour = this.max.getHours();\n return [\n Math.min(minHour, maxHour),\n Math.max(minHour, maxHour)\n ];\n }\n}\nDayPeriodService.ɵfac = function DayPeriodService_Factory(t) { return new (t || DayPeriodService)(ɵngcc0.ɵɵinject(ɵngcc1.IntlService)); };\nDayPeriodService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DayPeriodService, factory: DayPeriodService.ɵfac });\n/** @nocollapse */\nDayPeriodService.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DayPeriodService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc1.IntlService }]; }, null); })();\n\n/* tslint:disable:component-selector-name component-selector-type */\nconst SNAP_THRESHOLD = 0.05; //% of the item height\nconst SCROLL_THRESHOLD = 2; //< 2px threshold\nconst nil = () => (null);\nconst getters = {\n 35: (data, _) => data[data.length - 1],\n 36: (data, _) => data[0],\n 38: (data, index) => data[index - 1],\n 40: (data, index) => data[index + 1]\n};\nconst services$1 = {\n [TIME_PART.dayperiod]: DayPeriodService,\n [TIME_PART.hour]: HoursService,\n [TIME_PART.minute]: MinutesService,\n [TIME_PART.second]: SecondsService\n};\n/**\n * @hidden\n */\nclass TimeListComponent {\n constructor(element, injector, dom, renderer, zone) {\n this.element = element;\n this.injector = injector;\n this.dom = dom;\n this.renderer = renderer;\n this.zone = zone;\n this.min = cloneDate(MIDNIGHT_DATE);\n this.max = cloneDate(MAX_TIME);\n this.step = 1;\n this.disabled = false;\n this.valueChange = new EventEmitter();\n this.componentClass = true;\n this.animateToIndex = true;\n this.isActive = false;\n this.skip = 0;\n this.total = 60;\n this.data = [];\n this.indexToScroll = -1;\n this.domEvents = [];\n }\n get tabIndex() {\n return this.disabled ? undefined : 0;\n }\n ngOnChanges(changes) {\n if (changes.part) {\n this.service = this.injector.get(services$1[this.part.type]);\n this.service.configure(this.serviceSettings());\n }\n const value = this.value;\n const valueChanges = changes.value || {};\n const [min, max] = this.service.limitRange(this.min, this.max, value);\n if (this.service.isRangeChanged(min, max) || changes.min || changes.max || changes.step) {\n this.data = [];\n this.service.configure(this.serviceSettings({ min, max }));\n }\n // Skip the rendering of the list whenever possible\n if (!this.data.length || this.hasMissingValue(valueChanges)) {\n this.animateToIndex = false;\n this.data = this.service.data(value);\n }\n this.animateToIndex = this.animateToIndex && this.textHasChanged(valueChanges);\n this.total = this.service.total(value);\n this.indexToScroll = this.selectedIndex(value);\n }\n ngOnInit() {\n this.animateToIndex = true;\n this.dom.ensureHeights();\n this.itemHeight = this.dom.itemHeight;\n this.listHeight = this.dom.timeListHeight;\n this.topOffset = (this.listHeight - this.itemHeight) / 2;\n this.bottomOffset = this.listHeight - this.itemHeight;\n this.topThreshold = this.itemHeight * SNAP_THRESHOLD;\n this.bottomThreshold = this.itemHeight * (1 - SNAP_THRESHOLD);\n const translate = `translateY(${this.topOffset}px)`;\n this.style = { transform: translate, '-ms-transform': translate };\n if (this.element) {\n this.zone.runOutsideAngular(() => {\n this.bindEvents();\n });\n }\n }\n ngOnDestroy() {\n this.scrollSubscription.unsubscribe();\n this.domEvents.forEach(unbindCallback => unbindCallback());\n }\n ngAfterViewInit() {\n this.scrollOnce((index) => this.virtualization.scrollToIndex(index));\n }\n ngAfterViewChecked() {\n this.scrollOnce((index) => {\n const action = this.animateToIndex ? 'animateToIndex' : 'scrollToIndex';\n this.virtualization[action](index);\n this.animateToIndex = true;\n });\n }\n handleChange(dataItem) {\n const candidate = this.service.apply(this.value, dataItem.value);\n if (this.value.getTime() === candidate.getTime()) {\n return;\n }\n this.indexToScroll = this.data.indexOf(dataItem);\n this.value = candidate;\n this.valueChange.emit(candidate);\n }\n handleItemClick(args) {\n const item = closestInScope(args.target, node => node.hasAttribute('data-timelist-item-index'), this.element.nativeElement);\n if (item) {\n const index = item.getAttribute('data-timelist-item-index');\n this.handleChange(this.data[index]);\n }\n }\n /**\n * Focuses the host element of the TimeList.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.focus();\n }\n /**\n * Blurs the TimeList component.\n */\n blur() {\n if (!this.element) {\n return;\n }\n this.element.nativeElement.blur();\n }\n itemOffset(scrollTop) {\n const valueIndex = this.selectedIndex(this.value);\n const activeIndex = this.virtualization.activeIndex();\n const offset = this.virtualization.itemOffset(activeIndex);\n const distance = Math.abs(Math.ceil(scrollTop) - offset);\n if (valueIndex === activeIndex && distance < SCROLL_THRESHOLD) {\n return offset;\n }\n const scrollUp = valueIndex > activeIndex;\n const moveToNext = scrollUp && distance >= this.bottomThreshold || !scrollUp && distance > this.topThreshold;\n return moveToNext ? this.virtualization.itemOffset(activeIndex + 1) : offset;\n }\n hasMissingValue({ previousValue, currentValue }) {\n const isPreviousMissing = previousValue && !this.service.valueInList(previousValue);\n const isCurrentMissing = currentValue && !this.service.valueInList(currentValue);\n return isPreviousMissing || isCurrentMissing;\n }\n scrollOnce(action) {\n if (this.indexToScroll !== -1) {\n action(this.indexToScroll);\n this.indexToScroll = -1;\n }\n }\n serviceSettings(settings) {\n const defaults = {\n boundRange: false,\n insertUndividedMax: false,\n max: this.max,\n min: this.min,\n part: this.part,\n step: this.step\n };\n const result = Object.assign({}, defaults, settings);\n result.boundRange = result.part.type !== 'hour';\n return result;\n }\n selectedIndex(value) {\n if (!value) {\n return -1;\n }\n return this.service.selectedIndex(value);\n }\n textHasChanged({ previousValue, currentValue }) {\n if (!previousValue || !currentValue) {\n return false;\n }\n const oldData = this.data[this.selectedIndex(previousValue)];\n const newData = this.data[this.selectedIndex(currentValue)];\n return oldData && newData && oldData.text !== newData.text;\n }\n handleKeyDown(e) {\n const getter = getters[e.keyCode] || nil;\n const dataItem = getter(this.data, this.service.selectedIndex(this.value));\n if (dataItem) {\n this.handleChange(dataItem);\n e.preventDefault();\n }\n }\n bindEvents() {\n this.scrollSubscription = this.virtualization\n .scroll$()\n .pipe(debounceTime(100), map((e) => e.target.scrollTop), map((top) => this.itemOffset(top)), map((itemOffset) => this.virtualization.itemIndex(itemOffset)))\n .subscribe(index => {\n this.virtualization.scrollToIndex(index);\n this.handleChange(this.data[index]);\n });\n const element = this.element.nativeElement;\n this.domEvents.push(this.renderer.listen(element, 'mouseover', () => !this.isActive && this.focus()), this.renderer.listen(element, 'click', () => this.focus()), this.renderer.listen(element, 'blur', () => this.isActive = false), this.renderer.listen(element, 'focus', () => this.isActive = true), this.renderer.listen(element, 'keydown', this.handleKeyDown.bind(this)));\n }\n}\nTimeListComponent.ɵfac = function TimeListComponent_Factory(t) { return new (t || TimeListComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(TimePickerDOMService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nTimeListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TimeListComponent, selectors: [[\"kendo-timelist\"]], viewQuery: function TimeListComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(VirtualizationComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.virtualization = _t.first);\n } }, hostVars: 3, hostBindings: function TimeListComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.tabIndex);\n ɵngcc0.ɵɵclassProp(\"k-time-list\", ctx.componentClass);\n } }, inputs: { min: \"min\", max: \"max\", step: \"step\", disabled: \"disabled\", value: \"value\", part: \"part\" }, outputs: { valueChange: \"valueChange\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 3, vars: 13, consts: [[\"role\", \"presentation\", \"tabindex\", \"-1\", 1, \"k-time-container\", 3, \"skip\", \"take\", \"total\", \"itemHeight\", \"maxScrollDifference\", \"topOffset\", \"bottomOffset\"], [1, \"k-reset\", 3, \"ngStyle\", \"kendoEventsOutsideAngular\", \"scope\"], [\"class\", \"k-item\", 4, \"ngFor\", \"ngForOf\"], [1, \"k-item\"]], template: function TimeListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-virtualization\", 0);\n ɵngcc0.ɵɵelementStart(1, \"ul\", 1);\n ɵngcc0.ɵɵtemplate(2, TimeListComponent_li_2_Template, 3, 2, \"li\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"skip\", ctx.skip)(\"take\", ctx.total)(\"total\", ctx.total)(\"itemHeight\", ctx.itemHeight)(\"maxScrollDifference\", ctx.listHeight)(\"topOffset\", ctx.topOffset)(\"bottomOffset\", ctx.bottomOffset);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx.style)(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction1(11, _c3, ctx.handleItemClick))(\"scope\", ctx);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.data);\n } }, directives: [VirtualizationComponent, ɵngcc2.NgStyle, ɵngcc3.EventsOutsideAngularDirective, ɵngcc2.NgForOf], encapsulation: 2 });\n/** @nocollapse */\nTimeListComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Injector },\n { type: TimePickerDOMService },\n { type: Renderer2 },\n { type: NgZone }\n];\nTimeListComponent.propDecorators = {\n min: [{ type: Input }],\n max: [{ type: Input }],\n part: [{ type: Input }],\n step: [{ type: Input }],\n disabled: [{ type: Input }],\n value: [{ type: Input }],\n valueChange: [{ type: Output }],\n virtualization: [{ type: ViewChild, args: [VirtualizationComponent, { static: true },] }],\n tabIndex: [{ type: HostBinding, args: [\"attr.tabindex\",] }],\n componentClass: [{ type: HostBinding, args: [\"class.k-time-list\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimeListComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-timelist',\n template: `\n \n
    \n
  • \n {{item.text}}\n
  • \n
\n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Injector }, { type: TimePickerDOMService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { min: [{\n type: Input\n }], max: [{\n type: Input\n }], step: [{\n type: Input\n }], disabled: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], componentClass: [{\n type: HostBinding,\n args: [\"class.k-time-list\"]\n }], tabIndex: [{\n type: HostBinding,\n args: [\"attr.tabindex\"]\n }], value: [{\n type: Input\n }], part: [{\n type: Input\n }], virtualization: [{\n type: ViewChild,\n args: [VirtualizationComponent, { static: true }]\n }] }); })();\n\nconst isEqualTillMinute = (value, min) => value.getHours() === min.getHours() && value.getMinutes() === min.getMinutes();\nconst isEqualTillSecond = (value, min) => isEqualTillMinute(value, min) && value.getSeconds() === min.getSeconds();\nconst isEqualTillMillisecond = (value, min) => isEqualTillSecond(value, min) && value.getMilliseconds() === min.getMilliseconds();\nconst ɵ3$6 = (value) => value.getHours(), ɵ4$2 = (_, min) => min.getHours(), ɵ5$1 = (value) => value.getMinutes(), ɵ6$1 = (value, min) => isEqualTillMinute(value, min) ? min.getMinutes() : 0, ɵ7$1 = (value) => value.getSeconds(), ɵ8$1 = (value, min) => isEqualTillSecond(value, min) ? min.getSeconds() : 0, ɵ9$1 = (value) => value.getMilliseconds(), ɵ10$1 = (value, min) => isEqualTillMillisecond(value, min) ? min.getMilliseconds() : 0;\nconst defaultGetters = [\n {\n type: TIME_PART.hour,\n getter: ɵ3$6,\n minGetter: ɵ4$2\n }, {\n type: TIME_PART.minute,\n getter: ɵ5$1,\n minGetter: ɵ6$1\n }, {\n type: TIME_PART.second,\n getter: ɵ7$1,\n minGetter: ɵ8$1\n }, {\n type: TIME_PART.millisecond,\n getter: ɵ9$1,\n minGetter: ɵ10$1\n }\n];\nconst left = getter => (origin, _) => getter(origin);\nconst right = getter => (_, candidate) => getter(candidate);\nconst convertToObject = (parts) => parts.reduce((obj, p) => { obj[p.type] = p.type; return obj; }, {});\nconst getterByPart = parts => g => parts[g.type] ? right(g.getter) : left(g.getter);\nconst gettersFactory = getters => parts => (getters.map(getterByPart(convertToObject(parts))));\nconst snapValue = (getter, minGetter, step) => (date, min) => {\n const value = getter(date);\n const minValue = minGetter(date, min);\n const rest = value - minValue;\n if (rest < 0) {\n return minValue;\n }\n const mod = rest % step;\n return value - mod + (mod > step / 2 ? step : 0);\n};\nconst snappersFactory = (getters) => steps => (getters.map(g => {\n const step = steps[g.type];\n return step ? snapValue(g.getter, g.minGetter, step) : g.getter;\n}));\n/**\n * @hidden\n */\nconst generateGetters = gettersFactory(defaultGetters);\n/**\n * @hidden\n */\nconst generateSnappers = snappersFactory(defaultGetters);\n/**\n * @hidden\n */\nconst valueMerger = getters => (origin, candidate) => {\n origin.setHours(...getters.map(g => g(origin, candidate)));\n return origin;\n};\n/**\n * @hidden\n */\nconst snapTime = snappers => (candidate, min) => {\n const date = cloneDate(candidate);\n date.setHours(...snappers.map(s => s(date, min)));\n return date;\n};\n\nconst listReducer = (state, list, idx, all) => {\n if (state.length || !list.isActive) {\n return state;\n }\n return [{\n next: all[idx + 1] || list,\n prev: all[idx - 1] || list\n }];\n};\nvar Direction;\n(function (Direction) {\n Direction[Direction[\"Left\"] = 0] = \"Left\";\n Direction[Direction[\"Right\"] = 1] = \"Right\";\n})(Direction || (Direction = {}));\n/**\n * @hidden\n *\n * Represents the Kendo UI TimeSelector component for Angular.\n */\nclass TimeSelectorComponent {\n constructor(localization, cdr, element, intl, dom, zone, renderer, pickerService) {\n this.localization = localization;\n this.cdr = cdr;\n this.element = element;\n this.intl = intl;\n this.dom = dom;\n this.zone = zone;\n this.renderer = renderer;\n this.pickerService = pickerService;\n /**\n * @hidden\n */\n this.componentClass = true;\n /**\n * Specifies the time format used to display the time list columns.\n */\n this.format = 't';\n /**\n * Specifies the smallest valid time value.\n */\n this.min = cloneDate(MIN_TIME);\n /**\n * Specifies the biggest valid time value.\n */\n this.max = cloneDate(MAX_TIME);\n /**\n * Determines whether to display the **Cancel** button in the popup.\n */\n this.cancelButton = true;\n /**\n * Determines whether to display the **Set** button in the popup.\n */\n this.setButton = true;\n /**\n * Determines whether to display the **Now** button in the popup.\n *\n * > If the current time is out of range or the incremental step is greater than `1`, the **Now** button will be hidden.\n */\n this.nowButton = true;\n /**\n * Sets or gets the `disabled` property of the TimeSelector and determines whether the component is active.\n */\n this.disabled = false;\n /**\n * Specifies the value of the TimeSelector component.\n */\n this.value = null;\n /**\n * Fires each time the user selects a new value.\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires each time the user cancels the selected value.\n */\n this.valueReject = new EventEmitter();\n this.isActive = false;\n this.showNowButton = true;\n this._activeListIndex = -1;\n this._steps = {};\n this.domEvents = [];\n if (this.pickerService) {\n this.pickerService.timeSelector = this;\n }\n }\n /**\n * @hidden\n */\n get disabledClass() {\n return this.disabled;\n }\n /**\n * Configures the incremental steps of the TimeSelector.\n *\n * The available options are:\n * - `hour: Number`—Controls the incremental step of the hour value.\n * - `minute: Number`—Controls the incremental step of the minute value.\n * - `second: Number`—Controls the incremental step of the second value.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * `\n * })\n * export class AppComponent {\n * public steps = { hour: 2, minute: 15, second: 15 };\n * }\n * ```\n *\n * > If the incremental step is greater than `1`, the **Now** button will be hidden.\n */\n set steps(steps) {\n this._steps = steps || {};\n }\n get steps() {\n return this._steps;\n }\n set current(value) {\n this._current = timeInRange(this.snapTime(cloneDate(value || MIDNIGHT_DATE), this.min), this.min, this.max);\n if (!NgZone.isInAngularZone()) {\n this.cdr.detectChanges();\n }\n }\n get current() {\n return this._current;\n }\n get activeListIndex() {\n return this._activeListIndex;\n }\n set activeListIndex(value) {\n this._activeListIndex = value;\n if (!this.timeListWrappers || !this.timeListWrappers.length) {\n return;\n }\n this.timeListWrappers.forEach(listWrapper => {\n this.renderer.removeClass(listWrapper.nativeElement, 'k-state-focused');\n });\n if (value >= 0) {\n const listIndex = this.listIndex(value);\n const focusedWrapper = this.timeListWrappers.toArray()[listIndex];\n if (focusedWrapper) {\n this.renderer.addClass(focusedWrapper.nativeElement, 'k-state-focused');\n }\n }\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.subscriptions = this.intl.changes.subscribe(this.intlChange.bind(this));\n if (this.localization) {\n this.subscriptions.add(this.localization\n .changes\n .subscribe(() => this.cdr.markForCheck()));\n }\n this.dom.calculateHeights(this.element.nativeElement);\n this.init();\n this.bindEvents();\n }\n /**\n * @hidden\n */\n ngOnChanges(_) {\n this.init();\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n if (this.pickerService) {\n this.pickerService.timeSelector = null;\n }\n this.domEvents.forEach(unbindCallback => unbindCallback());\n }\n /**\n * Focuses the TimeSelector component.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * export class AppComponent { }\n * ```\n */\n focus() {\n const list = this.timeLists.first;\n if (!list) {\n return;\n }\n list.focus();\n }\n /**\n * Blurs the TimeSelector component.\n */\n blur() {\n const list = this.timeLists.first;\n if (!list) {\n return;\n }\n list.blur();\n }\n /**\n * @hidden\n */\n handleAccept() {\n this.handleChange(this.mergeValue(cloneDate(this.value || getDate(getNow())), this.current));\n }\n /**\n * @hidden\n */\n handleNow() {\n this.current = getNow();\n this.handleChange(this.current);\n this.cdr.markForCheck();\n }\n /**\n * @hidden\n */\n handleReject() {\n this.current = this.value;\n this.valueReject.emit();\n }\n /**\n * @hidden\n */\n handleFocus(args) {\n if (this.isActive) {\n return;\n }\n this.isActive = true;\n this.emitFocus(args);\n }\n /**\n * @hidden\n */\n handleListFocus(args) {\n const index = parseInt(args.target.getAttribute('data-timelist-index'), 10);\n this.activeListIndex = index;\n this.handleFocus(args);\n }\n /**\n * @hidden\n */\n handleBlur(args) {\n const currentTarget = currentFocusTarget(args);\n if (currentTarget && this.containsElement(currentTarget)) {\n return;\n }\n this.activeListIndex = -1;\n this.isActive = false;\n this.emitBlur(args);\n }\n /**\n * @hidden\n */\n containsElement(element) {\n return Boolean(closest(element, node => node === this.element.nativeElement));\n }\n partStep(part) {\n return this.steps[part.type] || 1;\n }\n init(changes) {\n if (!changes || hasChange(changes, 'format')) {\n this.dateFormatParts = this.intl.splitDateFormat(this.format);\n this.mergeValue = valueMerger(generateGetters(this.dateFormatParts));\n }\n if (!changes || hasChange(changes, 'steps')) {\n this.snapTime = snapTime(generateSnappers(this.steps));\n }\n if (!changes || hasChange(changes, 'value')) {\n this.current = this.value;\n }\n this.showNowButton = !this.hasSteps() && this.nowButton && isInTimeRange(getNow(), this.min, this.max);\n }\n focusList(dir) {\n if (!this.timeLists.length) {\n return;\n }\n this.timeLists.reduce(listReducer, [])\n .map(state => dir === Direction.Right ? state.next : state.prev)\n .map(list => list && list.focus());\n }\n handleChange(value) {\n this.value = value;\n this.valueChange.emit(cloneDate(value));\n }\n hasActiveButton() {\n if (!this.accept) {\n return false;\n }\n return [this.accept, this.cancel, this.now].reduce((isActive, el) => isActive || this.dom.isActive(el), false);\n }\n hasSteps() {\n const keys = Object.keys(this.steps);\n return keys.length !== keys.reduce((acc, k) => acc + this.steps[k], 0);\n }\n intlChange() {\n this.dateFormatParts = this.intl.splitDateFormat(this.format);\n this.mergeValue = valueMerger(generateGetters(this.dateFormatParts));\n this.cdr.markForCheck();\n }\n bindEvents() {\n if (this.element) {\n this.zone.runOutsideAngular(() => {\n this.domEvents.push(this.renderer.listen(this.element.nativeElement, 'keydown', this.handleKeydown.bind(this)));\n });\n }\n }\n handleKeydown(args) {\n const { keyCode, altKey } = args;\n // reserve the alt + arrow key commands for the picker\n const arrowKeyPressed = [Keys.ArrowLeft, Keys.ArrowRight].indexOf(keyCode) !== -1;\n if (isPresent(this.pickerService) && arrowKeyPressed && altKey) {\n return;\n }\n if (keyCode === Keys.Enter && !this.hasActiveButton()) {\n this.handleAccept();\n }\n else if (keyCode === Keys.ArrowLeft || keyCode === Keys.ArrowRight) {\n this.focusList(keyCode === Keys.ArrowLeft ? Direction.Left : Direction.Right);\n }\n }\n emitBlur(args) {\n if (this.pickerService) {\n this.pickerService.onBlur.emit(args);\n }\n }\n emitFocus(args) {\n if (this.pickerService) {\n this.pickerService.onFocus.emit(args);\n }\n }\n listIndex(partIndex) {\n let listIdx = 0;\n let partIdx = 0;\n while (partIdx < partIndex) {\n if (this.dateFormatParts[partIdx].type !== 'literal') {\n listIdx++;\n }\n partIdx++;\n }\n return listIdx;\n }\n}\nTimeSelectorComponent.ɵfac = function TimeSelectorComponent_Factory(t) { return new (t || TimeSelectorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.IntlService), ɵngcc0.ɵɵdirectiveInject(TimePickerDOMService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(PickerService, 8)); };\nTimeSelectorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TimeSelectorComponent, selectors: [[\"kendo-timeselector\"]], viewQuery: function TimeSelectorComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c82, true);\n ɵngcc0.ɵɵviewQuery(_c83, true);\n ɵngcc0.ɵɵviewQuery(_c84, true);\n ɵngcc0.ɵɵviewQuery(TimeListComponent, true);\n ɵngcc0.ɵɵviewQuery(_c85, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.accept = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.cancel = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.now = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.timeLists = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.timeListWrappers = _t);\n } }, hostVars: 4, hostBindings: function TimeSelectorComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-timeselector\", ctx.componentClass)(\"k-state-disabled\", ctx.disabledClass);\n } }, inputs: { format: \"format\", min: \"min\", max: \"max\", cancelButton: \"cancelButton\", setButton: \"setButton\", nowButton: \"nowButton\", disabled: \"disabled\", value: \"value\", steps: \"steps\" }, outputs: { valueChange: \"valueChange\", valueReject: \"valueReject\" }, exportAs: [\"kendo-timeselector\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.timeselector'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 10, vars: 4, consts: [[\"kendoTimeSelectorLocalizedMessages\", \"\", 6, \"accept\", \"acceptLabel\", \"cancel\", \"cancelLabel\", \"now\", \"nowLabel\"], [1, \"k-time-header\"], [1, \"k-title\"], [\"class\", \"k-button k-bare k-time-now\", \"type\", \"button\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\", 4, \"ngIf\"], [1, \"k-time-list-container\"], [1, \"k-time-highlight\"], [\"ngFor\", \"\", 3, \"ngForOf\"], [\"class\", \"k-time-footer k-action-buttons\", 4, \"ngIf\"], [\"type\", \"button\", 1, \"k-button\", \"k-bare\", \"k-time-now\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\"], [\"now\", \"\"], [\"class\", \"k-time-list-wrapper\", \"role\", \"presentation\", \"tabindex\", \"-1\", 4, \"ngIf\"], [\"class\", \"k-time-separator\", 4, \"ngIf\"], [\"role\", \"presentation\", \"tabindex\", \"-1\", 1, \"k-time-list-wrapper\"], [\"listWrapper\", \"\"], [3, \"min\", \"max\", \"part\", \"step\", \"disabled\", \"value\", \"kendoEventsOutsideAngular\", \"scope\", \"valueChange\"], [1, \"k-time-separator\"], [1, \"k-time-footer\", \"k-action-buttons\"], [\"class\", \"k-button k-time-cancel\", \"type\", \"button\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\", 4, \"ngIf\"], [\"type\", \"button\", \"class\", \"k-time-accept k-button k-primary\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\", 4, \"ngIf\"], [\"type\", \"button\", 1, \"k-button\", \"k-time-cancel\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\"], [\"cancel\", \"\"], [\"type\", \"button\", 1, \"k-time-accept\", \"k-button\", \"k-primary\", 3, \"kendoEventsOutsideAngular\", \"scope\", \"disabled\"], [\"accept\", \"\"]], template: function TimeSelectorComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c98);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(2, \"div\", 1);\n ɵngcc0.ɵɵelementStart(3, \"span\", 2);\n ɵngcc0.ɵɵtext(4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(5, TimeSelectorComponent_button_5_Template, 3, 10, \"button\", 3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(6, \"div\", 4);\n ɵngcc0.ɵɵelement(7, \"span\", 5);\n ɵngcc0.ɵɵtemplate(8, TimeSelectorComponent_ng_template_8_Template, 2, 2, \"ng-template\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(9, TimeSelectorComponent_div_9_Template, 3, 2, \"div\", 7);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(4);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.intl.formatDate(ctx.current, ctx.format), \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showNowButton);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.dateFormatParts);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.setButton || ctx.cancelButton);\n } }, directives: function () { return [TimeSelectorLocalizedMessagesDirective, ɵngcc2.NgIf, ɵngcc2.NgForOf, ɵngcc3.EventsOutsideAngularDirective, TimeListComponent]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nTimeSelectorComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: ElementRef },\n { type: IntlService },\n { type: TimePickerDOMService },\n { type: NgZone },\n { type: Renderer2 },\n { type: PickerService, decorators: [{ type: Optional }] }\n];\nTimeSelectorComponent.propDecorators = {\n accept: [{ type: ViewChild, args: ['accept',] }],\n cancel: [{ type: ViewChild, args: ['cancel',] }],\n now: [{ type: ViewChild, args: ['now',] }],\n timeLists: [{ type: ViewChildren, args: [TimeListComponent,] }],\n timeListWrappers: [{ type: ViewChildren, args: ['listWrapper',] }],\n componentClass: [{ type: HostBinding, args: ['class.k-timeselector',] }],\n disabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }],\n format: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n cancelButton: [{ type: Input }],\n setButton: [{ type: Input }],\n nowButton: [{ type: Input }],\n disabled: [{ type: Input }],\n steps: [{ type: Input }],\n value: [{ type: Input }],\n valueChange: [{ type: Output }],\n valueReject: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimeSelectorComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'kendo-timeselector',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.timeselector'\n }\n ],\n selector: 'kendo-timeselector',\n template: `\n \n \n
\n \n {{ intl.formatDate(current, format) }}\n \n {{localization.get('now')}}\n
\n
\n \n \n \n {{intl.dateFieldName(part)}}\n \n
\n
\n {{part.pattern}}\n
\n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.IntlService }, { type: TimePickerDOMService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: PickerService, decorators: [{\n type: Optional\n }] }]; }, { componentClass: [{\n type: HostBinding,\n args: ['class.k-timeselector']\n }], format: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], cancelButton: [{\n type: Input\n }], setButton: [{\n type: Input\n }], nowButton: [{\n type: Input\n }], disabled: [{\n type: Input\n }], value: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], valueReject: [{\n type: Output\n }], disabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], steps: [{\n type: Input\n }], accept: [{\n type: ViewChild,\n args: ['accept']\n }], cancel: [{\n type: ViewChild,\n args: ['cancel']\n }], now: [{\n type: ViewChild,\n args: ['now']\n }], timeLists: [{\n type: ViewChildren,\n args: [TimeListComponent]\n }], timeListWrappers: [{\n type: ViewChildren,\n args: ['listWrapper']\n }] }); })();\n\n/**\n * @hidden\n */\nclass TimePickerMessages extends ComponentMessages {\n}\nTimePickerMessages.ɵfac = function TimePickerMessages_Factory(t) { return ɵTimePickerMessages_BaseFactory(t || TimePickerMessages); };\nTimePickerMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TimePickerMessages, inputs: { accept: \"accept\", acceptLabel: \"acceptLabel\", cancel: \"cancel\", cancelLabel: \"cancelLabel\", now: \"now\", nowLabel: \"nowLabel\", toggle: \"toggle\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nTimePickerMessages.propDecorators = {\n accept: [{ type: Input }],\n acceptLabel: [{ type: Input }],\n cancel: [{ type: Input }],\n cancelLabel: [{ type: Input }],\n now: [{ type: Input }],\n nowLabel: [{ type: Input }],\n toggle: [{ type: Input }]\n};\nconst ɵTimePickerMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(TimePickerMessages);\n\n/**\n * @hidden\n */\nclass TimePickerLocalizedMessagesDirective extends TimePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nTimePickerLocalizedMessagesDirective.ɵfac = function TimePickerLocalizedMessagesDirective_Factory(t) { return new (t || TimePickerLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nTimePickerLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TimePickerLocalizedMessagesDirective, selectors: [[\"\", \"kendoTimePickerLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimePickerLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nTimePickerLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimePickerLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimePickerLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoTimePickerLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass TimePickerCustomMessagesComponent extends TimePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nTimePickerCustomMessagesComponent.ɵfac = function TimePickerCustomMessagesComponent_Factory(t) { return new (t || TimePickerCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nTimePickerCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TimePickerCustomMessagesComponent, selectors: [[\"kendo-timepicker-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimePickerCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function TimePickerCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nTimePickerCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimePickerCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimePickerCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-timepicker-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass TimeSelectorLocalizedMessagesDirective extends TimePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nTimeSelectorLocalizedMessagesDirective.ɵfac = function TimeSelectorLocalizedMessagesDirective_Factory(t) { return new (t || TimeSelectorLocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nTimeSelectorLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TimeSelectorLocalizedMessagesDirective, selectors: [[\"\", \"kendoTimeSelectorLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimeSelectorLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nTimeSelectorLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimeSelectorLocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimeSelectorLocalizedMessagesDirective) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: '[kendoTimeSelectorLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * @hidden\n *\n * Custom component messages override default component messages.\n */\nclass TimeSelectorCustomMessagesComponent extends TimePickerMessages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nTimeSelectorCustomMessagesComponent.ɵfac = function TimeSelectorCustomMessagesComponent_Factory(t) { return new (t || TimeSelectorCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nTimeSelectorCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TimeSelectorCustomMessagesComponent, selectors: [[\"kendo-timeselector-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimeSelectorCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function TimeSelectorCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nTimeSelectorCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimeSelectorCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: TimePickerMessages,\n useExisting: forwardRef(() => TimeSelectorCustomMessagesComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-timeselector-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\nconst COMPONENT_DIRECTIVES$2 = [\n TimePickerLocalizedMessagesDirective,\n TimeListComponent,\n TimePickerCustomMessagesComponent,\n TimePickerComponent,\n TimeSelectorLocalizedMessagesDirective,\n TimeSelectorCustomMessagesComponent,\n TimeSelectorComponent\n];\nconst COMPONENT_MODULES$1 = [\n DateInputModule,\n IntlModule,\n PopupModule,\n VirtualizationModule,\n EventsModule\n];\nconst ɵ0$n = touchEnabled;\nconst providers = [\n TimePickerDOMService,\n HoursService,\n MinutesService,\n SecondsService,\n DayPeriodService,\n {\n provide: TOUCH_ENABLED,\n useValue: ɵ0$n\n }\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the TimePicker component.\n */\nclass TimePickerModule {\n}\nTimePickerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: TimePickerModule });\nTimePickerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function TimePickerModule_Factory(t) { return new (t || TimePickerModule)(); }, providers: providers, imports: [[CommonModule, ...COMPONENT_MODULES$1]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(TimePickerModule, { declarations: function () { return [TimePickerLocalizedMessagesDirective,\n TimeListComponent,\n TimePickerCustomMessagesComponent,\n TimePickerComponent,\n TimeSelectorLocalizedMessagesDirective,\n TimeSelectorCustomMessagesComponent,\n TimeSelectorComponent]; }, imports: function () { return [CommonModule,\n DateInputModule,\n IntlModule,\n PopupModule,\n VirtualizationModule,\n EventsModule]; }, exports: function () { return [TimePickerLocalizedMessagesDirective,\n TimeListComponent,\n TimePickerCustomMessagesComponent,\n TimePickerComponent,\n TimeSelectorLocalizedMessagesDirective,\n TimeSelectorCustomMessagesComponent,\n TimeSelectorComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TimePickerModule, [{\n type: NgModule,\n args: [{\n declarations: [COMPONENT_DIRECTIVES$2],\n exports: [COMPONENT_DIRECTIVES$2],\n imports: [CommonModule, ...COMPONENT_MODULES$1],\n providers: providers\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass Messages$1 extends ComponentMessages {\n}\nMessages$1.ɵfac = function Messages$1_Factory(t) { return ɵMessages$1_BaseFactory(t || Messages$1); };\nMessages$1.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages$1, inputs: { toggle: \"toggle\", dateTab: \"dateTab\", dateTabLabel: \"dateTabLabel\", timeTab: \"timeTab\", timeTabLabel: \"timeTabLabel\", accept: \"accept\", acceptLabel: \"acceptLabel\", cancel: \"cancel\", cancelLabel: \"cancelLabel\", today: \"today\", now: \"now\", nowLabel: \"nowLabel\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages$1.propDecorators = {\n toggle: [{ type: Input }],\n dateTab: [{ type: Input }],\n dateTabLabel: [{ type: Input }],\n timeTab: [{ type: Input }],\n timeTabLabel: [{ type: Input }],\n accept: [{ type: Input }],\n acceptLabel: [{ type: Input }],\n cancel: [{ type: Input }],\n cancelLabel: [{ type: Input }],\n today: [{ type: Input }],\n now: [{ type: Input }],\n nowLabel: [{ type: Input }]\n};\nconst ɵMessages$1_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages$1);\n\n/**\n * Custom component messages override default component messages ([see example]({% slug globalization_dateinputs %}#toc-custom-messages)).\n */\nclass DateTimePickerCustomMessagesComponent extends Messages$1 {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nDateTimePickerCustomMessagesComponent.ɵfac = function DateTimePickerCustomMessagesComponent_Factory(t) { return new (t || DateTimePickerCustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nDateTimePickerCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateTimePickerCustomMessagesComponent, selectors: [[\"kendo-datetimepicker-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages$1,\n useExisting: forwardRef(() => DateTimePickerCustomMessagesComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DateTimePickerCustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nDateTimePickerCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateTimePickerCustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages$1,\n useExisting: forwardRef(() => DateTimePickerCustomMessagesComponent)\n }\n ],\n selector: 'kendo-datetimepicker-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends Messages$1 {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoDateTimePickerLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages$1,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages$1,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: '[kendoDateTimePickerLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc4.LocalizationService }]; }, null); })();\n\nconst COMPONENT_DIRECTIVES$3 = [\n DateTimePickerComponent,\n DateTimePickerCustomMessagesComponent,\n LocalizedMessagesDirective\n];\nconst ɵ0$o = touchEnabled;\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the DateTimePicker component.\n */\nclass DateTimePickerModule {\n}\nDateTimePickerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DateTimePickerModule });\nDateTimePickerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DateTimePickerModule_Factory(t) { return new (t || DateTimePickerModule)(); }, providers: [\n { provide: TOUCH_ENABLED, useValue: ɵ0$o }\n ], imports: [[\n CommonModule,\n IntlModule,\n DateInputModule,\n CalendarModule,\n TimePickerModule,\n PopupModule,\n EventsModule,\n TemplatesModule\n ],\n TemplatesModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DateTimePickerModule, { declarations: function () { return [DateTimePickerComponent,\n DateTimePickerCustomMessagesComponent,\n LocalizedMessagesDirective]; }, imports: function () { return [CommonModule,\n IntlModule,\n DateInputModule,\n CalendarModule,\n TimePickerModule,\n PopupModule,\n EventsModule,\n TemplatesModule]; }, exports: function () { return [DateTimePickerComponent,\n DateTimePickerCustomMessagesComponent,\n LocalizedMessagesDirective,\n TemplatesModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateTimePickerModule, [{\n type: NgModule,\n args: [{\n declarations: [\n ...COMPONENT_DIRECTIVES$3\n ],\n exports: [\n ...COMPONENT_DIRECTIVES$3,\n TemplatesModule\n ],\n imports: [\n CommonModule,\n IntlModule,\n DateInputModule,\n CalendarModule,\n TimePickerModule,\n PopupModule,\n EventsModule,\n TemplatesModule\n ],\n providers: [\n { provide: TOUCH_ENABLED, useValue: ɵ0$o }\n ]\n }]\n }], null, null); })();\n\nconst COMPONENT_MODULES$2 = [\n CalendarsModule,\n DateInputModule,\n DatePickerModule,\n TimePickerModule,\n DateRangeModule,\n DateTimePickerModule\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Date Inputs components.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Date Inputs module\n * import { DateInputsModule } from '@progress/kendo-angular-dateinputs';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare the app component\n * imports: [BrowserModule, DateInputsModule], // import the Date Inputs module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass DateInputsModule {\n}\nDateInputsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DateInputsModule });\nDateInputsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DateInputsModule_Factory(t) { return new (t || DateInputsModule)(); }, imports: [COMPONENT_MODULES$2,\n CalendarsModule,\n DateInputModule,\n DatePickerModule,\n TimePickerModule,\n DateRangeModule,\n DateTimePickerModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DateInputsModule, { imports: [CalendarsModule,\n DateInputModule,\n DatePickerModule,\n TimePickerModule,\n DateRangeModule,\n DateTimePickerModule], exports: [CalendarsModule,\n DateInputModule,\n DatePickerModule,\n TimePickerModule,\n DateRangeModule,\n DateTimePickerModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateInputsModule, [{\n type: NgModule,\n args: [{\n exports: COMPONENT_MODULES$2,\n imports: COMPONENT_MODULES$2\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CalendarCommonModule, CALENDAR_RANGE_VALIDATORS, CALENDAR_VALUE_ACCESSOR, KENDO_INPUT_PROVIDER, KForOf, KForOfContext, HeaderComponent, HorizontalViewListComponent, CalendarMessages, MultiViewCalendarCustomMessagesComponent, Messages, RANGE_CALENDAR_RANGE_VALIDATORS, RANGE_CALENDAR_VALUE_ACCESSOR, NavigationComponent, BusViewService, CenturyViewService, DecadeViewService, DisabledDatesService, CalendarDOMService, MonthViewService, NavigationService, ScrollSyncService, WeekNamesService, YearViewService, TemplatesModule, CellTemplateDirective, CenturyCellTemplateDirective, DecadeCellTemplateDirective, HeaderTitleTemplateDirective, MonthCellTemplateDirective, NavigationItemTemplateDirective, WeekNumberCellTemplateDirective, YearCellTemplateDirective, ViewListComponent, ViewComponent, PickerService, DateInputMessages, DatePickerMessages, DateRangeInput, DateRangePopupTemplateDirective, DateTimePickerCustomMessagesComponent, LocalizedMessagesDirective, Messages$1, TimePickerMessages, TimePickerCustomMessagesComponent, TimeSelectorCustomMessagesComponent, DayPeriodService, TimePickerDOMService, HoursService, MinutesService, SecondsService, TimeListComponent, TimeSelectorComponent, TOUCH_ENABLED, ScrollerService, DEFAULT_SCROLLER_FACTORY, SCROLLER_FACTORY_TOKEN, VirtualizationComponent, VirtualizationModule, CalendarComponent, DateInputComponent, DatePickerComponent, TimePickerComponent, DateTimePickerComponent, MultiViewCalendarComponent, DateRangeComponent, DateRangePopupComponent, DateRangeEndInputDirective, DateRangeStartInputDirective, DateRangeSelectionDirective, CalendarModule, CalendarsModule, DateInputModule, DatePickerModule, DateInputsModule, TimePickerModule, DateTimePickerModule, MultiViewCalendarModule, DateRangeModule, DateRangeService, CalendarCustomMessagesComponent, DateInputCustomMessagesComponent, DatePickerCustomMessagesComponent, PreventableEvent, CalendarLocalizedMessagesDirective, MultiViewCalendarLocalizedMessagesDirective, DateInputLocalizedMessagesDirective, DatePickerLocalizedMessagesDirective, TimePickerLocalizedMessagesDirective, TimeSelectorLocalizedMessagesDirective };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztnSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NkdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7MEdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O3lFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzBCQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OzsyREFpQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29NQWlDRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7bUVBMERFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzttSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7d0VBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O21IQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O3FHQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzsySUFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzBKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUpBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NkpBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Z0tBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt5S0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Z0tBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3lLQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OE1BeURFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrS0E0RUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxRkFrR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUZBK0dFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0dBc1BFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OzttRUF3Q0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUZBc0VFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O2lLQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkRBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7aUZBVUU7QUFDRjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O2lTQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VTQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzhXQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt1T0FHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUhBMEJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztnSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7eUhBa0RFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBZUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkF3QkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3dKQUFDO0FBQ0Q7QUFDQTtBQUNBO3FGQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7aUtBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBcUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztnTkFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7cUVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztrREFXRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzswS0FZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkEyQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzBMQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7dUZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztrREFXRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztrS0FZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQWVFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs4S0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO3lGQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7bUtBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBeUJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztvR0FHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzBHQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7MEdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztnSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7NEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBJQStCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cU5Bb0hFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NFJBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7eUZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztrREFXRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzttS0FZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O3FLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFRRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Z1lBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO3lFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7dUtBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2tEQVdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQXdCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb3B5cmlnaHQgwqkgMjAyMCBQcm9ncmVzcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgY29tbWVyY2lhbCBsaWNlbnNlLiBTZWUgTElDRU5TRS5tZCBpbiB0aGUgcHJvamVjdCByb290IGZvciBtb3JlIGluZm9ybWF0aW9uXG4qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbmplY3Rpb25Ub2tlbiwgQ29tcG9uZW50LCBJbmplY3QsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgTmdab25lLCBJbnB1dCwgT3V0cHV0LCBIb3N0QmluZGluZywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGQsIERpcmVjdGl2ZSwgVGVtcGxhdGVSZWYsIGlzRGV2TW9kZSwgZm9yd2FyZFJlZiwgT3B0aW9uYWwsIENvbnRlbnRDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGRyZW4sIENvbnRlbnRDaGlsZHJlbiwgSXRlcmFibGVEaWZmZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIE5HX1ZBTElEQVRPUlMsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UsIEwxME5fUFJFRklYLCBSVEwsIENvbXBvbmVudE1lc3NhZ2VzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5pbXBvcnQgeyBnZXREYXRlLCBpc0VxdWFsLCBjbG9uZURhdGUsIGFkZERheXMsIGFkZERlY2FkZXMsIGFkZENlbnR1cmllcywgZmlyc3REZWNhZGVPZkNlbnR1cnksIGxhc3REZWNhZGVPZkNlbnR1cnksIGZpcnN0WWVhck9mRGVjYWRlLCBjcmVhdGVEYXRlLCBkdXJhdGlvbkluQ2VudHVyaWVzLCBhZGRZZWFycywgbGFzdFllYXJPZkRlY2FkZSwgZHVyYXRpb25JbkRlY2FkZXMsIGFkZFdlZWtzLCBhZGRNb250aHMsIGZpcnN0RGF5T2ZNb250aCwgbGFzdERheU9mTW9udGgsIGRheU9mV2VlaywgZHVyYXRpb25Jbk1vbnRocywgZmlyc3RNb250aE9mWWVhciwgbGFzdE1vbnRoT2ZZZWFyLCBkdXJhdGlvbkluWWVhcnMsIHdlZWtJblllYXIgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0ZS1tYXRoJztcbmltcG9ydCB7IGlzRG9jdW1lbnRBdmFpbGFibGUsIEtlbmRvSW5wdXQsIGd1aWQsIGhhc09ic2VydmVycywgS2V5cywgRXZlbnRzTW9kdWxlLCBSZXNpemVTZW5zb3JNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgSW50bFNlcnZpY2UsIEludGxNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1pbnRsJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG9mLCBpbnRlcnZhbCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGZyb21FdmVudCwgRU1QVFksIGZyb20sIFN1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzY2FuLCB0YWtlV2hpbGUsIHRhcCwgZmlsdGVyLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQb3B1cFNlcnZpY2UsIFBvcHVwTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItcG9wdXAnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvdWNoRW5hYmxlZCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1jb21tb24nO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xudmFyIEFjdGlvbjtcbihmdW5jdGlvbiAoQWN0aW9uKSB7XG4gICAgQWN0aW9uW0FjdGlvbltcIkxlZnRcIl0gPSAwXSA9IFwiTGVmdFwiO1xuICAgIEFjdGlvbltBY3Rpb25bXCJSaWdodFwiXSA9IDFdID0gXCJSaWdodFwiO1xuICAgIEFjdGlvbltBY3Rpb25bXCJVcFwiXSA9IDJdID0gXCJVcFwiO1xuICAgIEFjdGlvbltBY3Rpb25bXCJEb3duXCJdID0gM10gPSBcIkRvd25cIjtcbiAgICBBY3Rpb25bQWN0aW9uW1wiUHJldlZpZXdcIl0gPSA0XSA9IFwiUHJldlZpZXdcIjtcbiAgICBBY3Rpb25bQWN0aW9uW1wiTmV4dFZpZXdcIl0gPSA1XSA9IFwiTmV4dFZpZXdcIjtcbiAgICBBY3Rpb25bQWN0aW9uW1wiRmlyc3RJblZpZXdcIl0gPSA2XSA9IFwiRmlyc3RJblZpZXdcIjtcbiAgICBBY3Rpb25bQWN0aW9uW1wiTGFzdEluVmlld1wiXSA9IDddID0gXCJMYXN0SW5WaWV3XCI7XG4gICAgQWN0aW9uW0FjdGlvbltcIkxvd2VyVmlld1wiXSA9IDhdID0gXCJMb3dlclZpZXdcIjtcbiAgICBBY3Rpb25bQWN0aW9uW1wiVXBwZXJWaWV3XCJdID0gOV0gPSBcIlVwcGVyVmlld1wiO1xufSkoQWN0aW9uIHx8IChBY3Rpb24gPSB7fSkpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgRU1QVFlfU0VMRUNUSU9OUkFOR0UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IE1JRE5JR0hUX0RBVEUgPSBuZXcgRGF0ZSgxOTgwLCAwLCAxKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBNSU5fREFURSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IE1BWF9EQVRFID0gbmV3IERhdGUoMjA5OSwgMTEsIDMxKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBNSU5fVElNRSA9IG5ldyBEYXRlKDE5ODAsIDAsIDEpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IE1BWF9USU1FID0gbmV3IERhdGUoMTk4MCwgMCwgMSwgMjMsIDU5LCA1OSk7XG5cbi8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgbWF4LWxpbmUtbGVuZ3RoICovXG5jb25zdCBpc1NldCA9ICh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbmNvbnN0IHNldHRlciA9IChtZXRob2QpID0+IChkYXRlLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGNsb25lID0gY2xvbmVEYXRlKGRhdGUpO1xuICAgIGNsb25lW21ldGhvZF0odmFsdWUpO1xuICAgIHJldHVybiBjbG9uZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgc2V0VGltZSA9IChvcmlnaW4sIGNhbmRpZGF0ZSkgPT4ge1xuICAgIGNvbnN0IGRhdGUgPSBjbG9uZURhdGUob3JpZ2luKTtcbiAgICBkYXRlLnNldEhvdXJzKGNhbmRpZGF0ZS5nZXRIb3VycygpLCBjYW5kaWRhdGUuZ2V0TWludXRlcygpLCBjYW5kaWRhdGUuZ2V0U2Vjb25kcygpLCBjYW5kaWRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgIHJldHVybiBkYXRlO1xufTtcbmNvbnN0IG5vcm1hbGl6ZVRpbWVzID0gKGNhbmRpZGF0ZSwgbWluLCBtYXgpID0+ICh7XG4gICAgY2FuZGlkYXRlVmFsdWU6IHNldFRpbWUoTUlETklHSFRfREFURSwgY2FuZGlkYXRlKSxcbiAgICBtYXhWYWx1ZTogYWRkRGF5cyhzZXRUaW1lKE1JRE5JR0hUX0RBVEUsIG1heCksIG1pbi5nZXRIb3VycygpIDwgbWF4LmdldEhvdXJzKCkgfHxcbiAgICAgICAgKG1pbi5nZXRIb3VycygpID09PSBtYXguZ2V0SG91cnMoKSAmJiBtaW4uZ2V0TWludXRlcygpIDwgbWF4LmdldE1pbnV0ZXMoKSkgPyAwIDogMSksXG4gICAgbWluVmFsdWU6IHNldFRpbWUoTUlETklHSFRfREFURSwgbWluKVxufSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgc2V0SG91cnMgPSBzZXR0ZXIoJ3NldEhvdXJzJyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgc2V0TWludXRlcyA9IHNldHRlcignc2V0TWludXRlcycpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHNldFNlY29uZHMgPSBzZXR0ZXIoJ3NldFNlY29uZHMnKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCByYW5nZSA9IChzdGFydCwgZW5kLCBzdGVwID0gMSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IGkgKyBzdGVwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0luUmFuZ2UgPSAoY2FuZGlkYXRlLCBtaW4sIG1heCkgPT4gKCFjYW5kaWRhdGUgfHwgISgobWluICYmIG1pbiA+IGNhbmRpZGF0ZSkgfHwgKG1heCAmJiBtYXggPCBjYW5kaWRhdGUpKSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNJblRpbWVSYW5nZSA9IChjYW5kaWRhdGUsIG1pbiwgbWF4KSA9PiB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgIW1pbiB8fCAhbWF4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7IGNhbmRpZGF0ZVZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUgfSA9IG5vcm1hbGl6ZVRpbWVzKGNhbmRpZGF0ZSwgbWluLCBtYXgpO1xuICAgIHJldHVybiBtaW5WYWx1ZSA8PSBjYW5kaWRhdGVWYWx1ZSAmJiBjYW5kaWRhdGVWYWx1ZSA8PSBtYXhWYWx1ZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNWYWxpZFJhbmdlID0gKG1pbiwgbWF4KSA9PiAoIWlzU2V0KG1pbikgfHwgIWlzU2V0KG1heCkgfHwgbWluIDw9IG1heCk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZGF0ZUluUmFuZ2UgPSAoY2FuZGlkYXRlLCBtaW4sIG1heCkgPT4ge1xuICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgfVxuICAgIGlmIChtaW4gJiYgY2FuZGlkYXRlIDwgbWluKSB7XG4gICAgICAgIHJldHVybiBjbG9uZURhdGUobWluKTtcbiAgICB9XG4gICAgaWYgKG1heCAmJiBjYW5kaWRhdGUgPiBtYXgpIHtcbiAgICAgICAgcmV0dXJuIGNsb25lRGF0ZShtYXgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCB0aW1lSW5SYW5nZSA9IChjYW5kaWRhdGUsIG1pbiwgbWF4KSA9PiB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgIW1pbiB8fCAhbWF4KSB7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgfVxuICAgIGNvbnN0IHsgY2FuZGlkYXRlVmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSB9ID0gbm9ybWFsaXplVGltZXMoY2FuZGlkYXRlLCBtaW4sIG1heCk7XG4gICAgaWYgKGNhbmRpZGF0ZVZhbHVlIDwgbWluVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWUoY2FuZGlkYXRlLCBtaW4pO1xuICAgIH1cbiAgICBpZiAoY2FuZGlkYXRlVmFsdWUgPiBtYXhWYWx1ZSkge1xuICAgICAgICByZXR1cm4gc2V0VGltZShjYW5kaWRhdGUsIG1heCk7XG4gICAgfVxuICAgIHJldHVybiBjYW5kaWRhdGU7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGdldE5vdyA9ICgpID0+IG5ldyBEYXRlKCk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZ2V0VG9kYXkgPSAoKSA9PiBnZXREYXRlKG5ldyBEYXRlKCkpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IG5vb3AgPSAoXykgPT4geyB9OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWVtcHR5XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNXaW5kb3dBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBzdHJpbmdpZnlDbGFzc09iamVjdCA9IChjbGFzc2VzKSA9PiB7XG4gICAgY29uc3QgcHVzaFRvQWNjID0gKGFjYywgY2xzKSA9PiBjbGFzc2VzW2Nsc10gPyBhY2MuY29uY2F0KGNscykgOiBhY2M7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNsYXNzZXMpLnJlZHVjZShwdXNoVG9BY2MsIFtdKS5qb2luKCcgJyk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHNoaWZ0V2Vla05hbWVzID0gKG5hbWVzLCBvZmZzZXQpID0+IChuYW1lcy5zbGljZShvZmZzZXQpLmNvbmNhdChuYW1lcy5zbGljZSgwLCBvZmZzZXQpKSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgYXBwcm94aW1hdGVTdHJpbmdNYXRjaGluZyA9IChvbGRUZXh0T3JpZ2luLCBvbGRGb3JtYXQsIG5ld1RleHRPcmlnaW4sIGNhcmV0KSA9PiB7XG4gICAgLy8gUmVtb3ZlIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBjdXJzb3IuXG4gICAgLy9vbGRGb3JtYXQgPSBvbGRGb3JtYXQuc3Vic3RyaW5nKDAsIGNhcmV0ICsgb2xkVGV4dC5sZW5ndGggLSBuZXdUZXh0Lmxlbmd0aCk7XG4gICAgY29uc3Qgb2xkSW5kZXggPSBjYXJldCArIG9sZFRleHRPcmlnaW4ubGVuZ3RoIC0gbmV3VGV4dE9yaWdpbi5sZW5ndGg7XG4gICAgY29uc3Qgb2xkVGV4dFNlcGFyYXRvciA9IG9sZFRleHRPcmlnaW5bb2xkSW5kZXhdO1xuICAgIGNvbnN0IG9sZFRleHQgPSBvbGRUZXh0T3JpZ2luLnN1YnN0cmluZygwLCBjYXJldCArIG9sZFRleHRPcmlnaW4ubGVuZ3RoIC0gbmV3VGV4dE9yaWdpbi5sZW5ndGgpO1xuICAgIGNvbnN0IG5ld1RleHQgPSBuZXdUZXh0T3JpZ2luLnN1YnN0cmluZygwLCBjYXJldCk7XG4gICAgY29uc3QgZGlmZiA9IFtdO1xuICAgIC8vIEhhbmRsZSB0eXBpbmcgYSBzaW5nbGUgY2hhcmFjdGVyIG92ZXIgdGhlIHNhbWUgc2VsZWN0aW9uLlxuICAgIGlmIChvbGRUZXh0ID09PSBuZXdUZXh0ICYmIGNhcmV0ID4gMCkge1xuICAgICAgICBkaWZmLnB1c2goW29sZEZvcm1hdFtjYXJldCAtIDFdLCBuZXdUZXh0W2NhcmV0IC0gMV1dKTtcbiAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfVxuICAgIGlmIChvbGRUZXh0LmluZGV4T2YobmV3VGV4dCkgPT09IDAgJiYgKG5ld1RleHQubGVuZ3RoID09PSAwIHx8IG9sZEZvcm1hdFtuZXdUZXh0Lmxlbmd0aCAtIDFdICE9PSBvbGRGb3JtYXRbbmV3VGV4dC5sZW5ndGhdKSkge1xuICAgICAgICAvLyBIYW5kbGUgRGVsZXRlL0JhY2tzcGFjZS5cbiAgICAgICAgbGV0IGRlbGV0ZWRTeW1ib2wgPSBcIlwiO1xuICAgICAgICAvL1hYWDpcbiAgICAgICAgLy8gV2hvbGUgdGV4dCBpcyByZXBsYWNlZCB3aXRoIGEgc2FtZSBjaGFyXG4gICAgICAgIC8vIE5hc3R5IHBhdGNoIHJlcXVpcmVkIHRvIGtlZXAgdGhlIHNlbGVjdGlvbiBpbiB0aGUgZmlyc3Qgc2VnbWVudFxuICAgICAgICBpZiAobmV3VGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGRpZmYucHVzaChbb2xkRm9ybWF0WzBdLCBuZXdUZXh0WzBdXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IG5ld1RleHQubGVuZ3RoOyBpIDwgb2xkVGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG9sZEZvcm1hdFtpXSAhPT0gZGVsZXRlZFN5bWJvbCAmJiBvbGRGb3JtYXRbaV0gIT09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZFN5bWJvbCA9IG9sZEZvcm1hdFtpXTtcbiAgICAgICAgICAgICAgICBkaWZmLnB1c2goW2RlbGV0ZWRTeW1ib2wsIFwiXCJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gICAgLy8gSGFuZGxlIGluc2VydGluZyB0ZXh0ICh0aGUgbmV3IHRleHQgaXMgbG9uZ2VyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSkuXG4gICAgLy8gSGFuZGxlIHR5cGluZyBvdmVyIGEgbGl0ZXJhbCBhcyB3ZWxsLlxuICAgIGlmIChuZXdUZXh0LmluZGV4T2Yob2xkVGV4dCkgPT09IDAgfHwgb2xkRm9ybWF0W2NhcmV0IC0gMV0gPT09IFwiX1wiKSB7XG4gICAgICAgIGxldCBzeW1ib2wgPSBvbGRGb3JtYXRbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1heCgwLCBvbGRUZXh0Lmxlbmd0aCAtIDEpOyBpIDwgb2xkRm9ybWF0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAob2xkRm9ybWF0W2ldICE9PSBcIl9cIikge1xuICAgICAgICAgICAgICAgIHN5bWJvbCA9IG9sZEZvcm1hdFtpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1tzeW1ib2wsIG5ld1RleHRbY2FyZXQgLSAxXV1dO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgZW50ZXJpbmcgYSBzcGFjZSBvciBhIHNlcGFyYXRvciwgZm9yIG5hdmlnYXRpb24gdG8gdGhlIG5leHQgaXRlbS5cbiAgICBpZiAobmV3VGV4dFtuZXdUZXh0Lmxlbmd0aCAtIDFdID09PSBcIiBcIiB8fCAobmV3VGV4dFtuZXdUZXh0Lmxlbmd0aCAtIDFdID09PSBvbGRUZXh0U2VwYXJhdG9yICYmIG9sZEZvcm1hdFtvbGRJbmRleF0gPT09ICdfJykpIHtcbiAgICAgICAgcmV0dXJuIFtbb2xkRm9ybWF0W2NhcmV0IC0gMV0sIFwiX1wiXV07XG4gICAgfVxuICAgIC8vIEhhbmRsZSB0eXBpbmcgb3ZlciBhIGNvcnJlY3RseSBzZWxlY3RlZCBwYXJ0LlxuICAgIHJldHVybiBbW29sZEZvcm1hdFtjYXJldCAtIDFdLCBuZXdUZXh0W2NhcmV0IC0gMV1dXTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZG9tQ29udGFpbmVyRmFjdG9yeSA9ICh0eXBlKSA9PiAoY2hpbGRyZW4sIGNsYXNzZXMgPSBcIlwiLCBzdHlsZXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IGNsYXNzZXM7XG4gICAgT2JqZWN0LmtleXMoc3R5bGVzKS5tYXAoa2V5ID0+IGNvbnRhaW5lci5zdHlsZVtrZXldID0gc3R5bGVzW2tleV0pO1xuICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBjaGlsZHJlbiB8fCAnJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIChjaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChjaGlsZCA9PiBjaGlsZCAmJiBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hpbGQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzQ2hhbmdlID0gKGNoYW5nZXMsIGZpZWxkKSA9PiBjaGFuZ2VzW2ZpZWxkXSAhPT0gdW5kZWZpbmVkO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGhhc0V4aXN0aW5nVmFsdWUgPSAoY2hhbmdlcywgZmllbGQpID0+IGNoYW5nZXNbZmllbGRdICYmIGNoYW5nZXNbZmllbGRdLmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbZmllbGRdLmN1cnJlbnRWYWx1ZSAhPT0gbnVsbDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0luU2VsZWN0aW9uUmFuZ2UgPSAodmFsdWUsIHNlbGVjdGlvblJhbmdlKSA9PiB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBzZWxlY3Rpb25SYW5nZSB8fCBFTVBUWV9TRUxFQ1RJT05SQU5HRTtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnQgPCB2YWx1ZSAmJiB2YWx1ZSA8IGVuZDtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZWl0aGVyID0gKHZhbHVlMSwgdmFsdWUyKSA9PiB2YWx1ZTEgfHwgdmFsdWUyO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNsYW1wUmFuZ2UgPSAodmFsdWUpID0+ICh7IHN0YXJ0OiB2YWx1ZSwgZW5kOiB2YWx1ZSB9KTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0VxdWFsUmFuZ2UgPSAoaW5pdGlhbCwgdXBkYXRlZCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhcnQ6IGluaXRpYWxTdGFydCwgZW5kOiBpbml0aWFsRW5kIH0gPSBpbml0aWFsIHx8IEVNUFRZX1NFTEVDVElPTlJBTkdFO1xuICAgIGNvbnN0IHsgc3RhcnQ6IHVwZGF0ZWRTdGFydCwgZW5kOiB1cGRhdGVkRW5kIH0gPSB1cGRhdGVkIHx8IEVNUFRZX1NFTEVDVElPTlJBTkdFO1xuICAgIHJldHVybiBpc0VxdWFsKGluaXRpYWxTdGFydCwgdXBkYXRlZFN0YXJ0KSAmJiBpc0VxdWFsKGluaXRpYWxFbmQsIHVwZGF0ZWRFbmQpO1xufTtcbi8qKlxuICogQGhpZGRlblxuICpcbiAqIENyZWF0ZXMgYSBuZXcgZGF0ZSBiYXNlZCBvbiB0aGUgZGF0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0ZSBwb3J0aW9uXG4gKiBhbmQgdGhlIHRpbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGltZSBwb3J0aW9uLlxuICogSWYgYSBwYXJhbWV0ZXIgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIGBudWxsYC5cbiAqL1xuY29uc3QgbWVyZ2VEYXRlQW5kVGltZSA9IChkYXRlLCB0aW1lKSA9PiB7XG4gICAgaWYgKCEoZGF0ZSAmJiB0aW1lKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBsYXN0TWlsbGlzZWNvbmRPZkRhdGUgPSAoZGF0ZSkgPT4ge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgMjMsIDU5LCA1OSwgOTk5KTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggZGF0ZXMgcmFuZ2luZyBiZXR3ZWVuIGFuZCBpbmNsdWRpbmcgdGhlIHNwZWNpZmllZCBzdGFydCBhbmRcbiAqIGVuZCBkYXRlcyB0aGF0IGFyZSBldmFsdWF0ZWQgYXMgZGlzYWJsZWQuXG4gKi9cbmNvbnN0IGRpc2FibGVkRGF0ZXNJblJhbmdlID0gKHN0YXJ0LCBlbmQsIGlzRGF0ZURpc2FibGVkKSA9PiB7XG4gICAgaWYgKCEoc3RhcnQgJiYgZW5kICYmIGlzRGF0ZURpc2FibGVkKSB8fCAoc3RhcnQgPiBlbmQpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgZGF0ZXMgPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHN0YXJ0O1xuICAgIHdoaWxlIChjdXJyZW50IDw9IGVuZCkge1xuICAgICAgICBpZiAoaXNEYXRlRGlzYWJsZWQoY3VycmVudCkpIHtcbiAgICAgICAgICAgIGRhdGVzLnB1c2goY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGFkZERheXMoY3VycmVudCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlcztcbn07XG5cbi8qIHRzbGludDpkaXNhYmxlOm9iamVjdC1saXRlcmFsLXNvcnQta2V5cyAqL1xuY29uc3QgRU1QVFlfREFUQSA9IFtbXV07XG5jb25zdCBDRUxMU19MRU5HVEggPSA1O1xuY29uc3QgUk9XU19MRU5HVEggPSAyO1xuY29uc3QgQUNUSU9OUyA9IHtcbiAgICBbQWN0aW9uLkxlZnRdOiAoZGF0ZSkgPT4gYWRkRGVjYWRlcyhkYXRlLCAtMSksXG4gICAgW0FjdGlvbi5VcF06IChkYXRlKSA9PiBhZGREZWNhZGVzKGRhdGUsIC01KSxcbiAgICBbQWN0aW9uLlJpZ2h0XTogKGRhdGUpID0+IGFkZERlY2FkZXMoZGF0ZSwgMSksXG4gICAgW0FjdGlvbi5Eb3duXTogKGRhdGUpID0+IGFkZERlY2FkZXMoZGF0ZSwgNSksXG4gICAgW0FjdGlvbi5QcmV2Vmlld106IChkYXRlKSA9PiBhZGRDZW50dXJpZXMoZGF0ZSwgLTEpLFxuICAgIFtBY3Rpb24uTmV4dFZpZXddOiAoZGF0ZSkgPT4gYWRkQ2VudHVyaWVzKGRhdGUsIDEpLFxuICAgIFtBY3Rpb24uRmlyc3RJblZpZXddOiAoZGF0ZSkgPT4gZmlyc3REZWNhZGVPZkNlbnR1cnkoZGF0ZSksXG4gICAgW0FjdGlvbi5MYXN0SW5WaWV3XTogKGRhdGUpID0+IGxhc3REZWNhZGVPZkNlbnR1cnkoZGF0ZSlcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ2VudHVyeVZpZXdTZXJ2aWNlIHtcbiAgICBhZGRUb0RhdGUobWluLCBza2lwKSB7XG4gICAgICAgIHJldHVybiBhZGRDZW50dXJpZXMobWluLCBza2lwKTtcbiAgICB9XG4gICAgZGF0ZXNMaXN0KHN0YXJ0LCBjb3VudCkge1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgY291bnQpLm1hcChpID0+IGFkZENlbnR1cmllcyhzdGFydCwgaSkpO1xuICAgIH1cbiAgICBkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBjZWxsVUlELCBmb2N1c2VkRGF0ZSwgaXNBY3RpdmVWaWV3LCBtYXgsIG1pbiwgc2VsZWN0ZWREYXRlLCBzZWxlY3Rpb25SYW5nZSA9IEVNUFRZX1NFTEVDVElPTlJBTkdFLCB2aWV3RGF0ZSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCF2aWV3RGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0RBVEE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbHMgPSByYW5nZSgwLCBDRUxMU19MRU5HVEgpO1xuICAgICAgICBjb25zdCBmaXJzdERhdGUgPSBmaXJzdERlY2FkZU9mQ2VudHVyeSh2aWV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IGxhc3REYXRlID0gbGFzdERlY2FkZU9mQ2VudHVyeSh2aWV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWREYXRlSW5SYW5nZSA9IGlzSW5SYW5nZShzZWxlY3RlZERhdGUsIG1pbiwgbWF4KTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBnZXRUb2RheSgpO1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgUk9XU19MRU5HVEgpLm1hcChyb3dPZmZzZXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFzZURhdGUgPSBhZGREZWNhZGVzKGZpcnN0RGF0ZSwgcm93T2Zmc2V0ICogQ0VMTFNfTEVOR1RIKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxscy5tYXAoY2VsbE9mZnNldCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbERhdGUgPSB0aGlzLm5vcm1hbGl6ZShhZGREZWNhZGVzKGJhc2VEYXRlLCBjZWxsT2Zmc2V0KSwgbWluLCBtYXgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0luUmFuZ2UoY2VsbERhdGUsIG1pbiwgbWF4KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3Rpb25SYW5nZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYW5nZUVuZCA9IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgc2VsZWN0aW9uUmFuZ2UuZW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0luTWlkZGxlID0gIWlzUmFuZ2VTdGFydCAmJiAhaXNSYW5nZUVuZDtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1JhbmdlTWlkID0gaXNJbk1pZGRsZSAmJiBpc0luU2VsZWN0aW9uUmFuZ2UoY2VsbERhdGUsIHNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdGhpcy52YWx1ZShjZWxsRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtjZWxsVUlEfSR7Y2VsbERhdGUuZ2V0VGltZSgpfWAsXG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNlZDogdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBmb2N1c2VkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGlzQWN0aXZlVmlldyAmJiBpc1NlbGVjdGVkRGF0ZUluUmFuZ2UgJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3RlZERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1dlZWtlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGlzUmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZU1pZDogaXNSYW5nZU1pZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZVNwbGl0RW5kOiBpc1JhbmdlTWlkICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbGFzdERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3BsaXRTdGFydDogaXNSYW5nZU1pZCAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIGZpcnN0RGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgdG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jZWxsVGl0bGUoY2VsbERhdGUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2VsbERhdGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc0VxdWFsKGNhbmRpZGF0ZSwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKCFjYW5kaWRhdGUgfHwgIWV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlKGNhbmRpZGF0ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZmlyc3RZZWFyT2ZEZWNhZGUoZXhwZWN0ZWQpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuICAgIGlzSW5BcnJheShkYXRlLCBkYXRlcykge1xuICAgICAgICBpZiAoIWRhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHJldHVybiBkYXRlc1swXS5nZXRGdWxsWWVhcigpIDw9IHllYXIgJiYgeWVhciA8PSAoZGF0ZXNbZGF0ZXMubGVuZ3RoIC0gMV0uZ2V0RnVsbFllYXIoKSArIDk5KTtcbiAgICB9XG4gICAgaXNJblJhbmdlKGNhbmRpZGF0ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgY29uc3QgeWVhciA9IGZpcnN0WWVhck9mRGVjYWRlKGNhbmRpZGF0ZSkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgYWJvdmVNaW4gPSAhbWluIHx8IGZpcnN0WWVhck9mRGVjYWRlKG1pbikuZ2V0RnVsbFllYXIoKSA8PSB5ZWFyO1xuICAgICAgICBjb25zdCBiZWxvd01heCA9ICFtYXggfHwgeWVhciA8PSBmaXJzdFllYXJPZkRlY2FkZShtYXgpLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHJldHVybiBhYm92ZU1pbiAmJiBiZWxvd01heDtcbiAgICB9XG4gICAgYmVnaW5uaW5nT2ZQZXJpb2QoZGF0ZSkge1xuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0WWVhciA9IGZpcnN0WWVhck9mRGVjYWRlKGZpcnN0RGVjYWRlT2ZDZW50dXJ5KGRhdGUpKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZURhdGUoZmlyc3RZZWFyLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICAgIH1cbiAgICBpc1JhbmdlU3RhcnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmdldEZ1bGxZZWFyKCkgJSAxMDAwID09PSAwO1xuICAgIH1cbiAgICBtb3ZlKHZhbHVlLCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZXIgPSBBQ1RJT05TW2FjdGlvbl07XG4gICAgICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kaWZpZXIodmFsdWUpO1xuICAgIH1cbiAgICBjZWxsVGl0bGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlKHZhbHVlKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIG5hdmlnYXRpb25UaXRsZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPyBmaXJzdERlY2FkZU9mQ2VudHVyeSh2YWx1ZSkuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpIDogJyc7XG4gICAgfVxuICAgIHRpdGxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Zmlyc3REZWNhZGVPZkNlbnR1cnkodmFsdWUpLmdldEZ1bGxZZWFyKCl9IC0gJHtsYXN0RGVjYWRlT2ZDZW50dXJ5KHZhbHVlKS5nZXRGdWxsWWVhcigpfWA7XG4gICAgfVxuICAgIHJvd0xlbmd0aChfKSB7XG4gICAgICAgIHJldHVybiBDRUxMU19MRU5HVEg7XG4gICAgfVxuICAgIHNraXAodmFsdWUsIG1pbikge1xuICAgICAgICByZXR1cm4gZHVyYXRpb25JbkNlbnR1cmllcyhtaW4sIHZhbHVlKTtcbiAgICB9XG4gICAgdG90YWwobWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uSW5DZW50dXJpZXMobWluLCBtYXgpICsgMTtcbiAgICB9XG4gICAgdmFsdWUoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IGZpcnN0WWVhck9mRGVjYWRlKGN1cnJlbnQpLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSA6ICcnO1xuICAgIH1cbiAgICB2aWV3RGF0ZShkYXRlLCBtYXgsIHZpZXdzQ291bnQgPSAxKSB7XG4gICAgICAgIGNvbnN0IHZpZXdzSW5SYW5nZSA9IHRoaXMudG90YWwoZGF0ZSwgbWF4KTtcbiAgICAgICAgaWYgKHZpZXdzSW5SYW5nZSA8IHZpZXdzQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnR1cmllc1RvU3VidHJhY3QgPSB2aWV3c0NvdW50IC0gdmlld3NJblJhbmdlO1xuICAgICAgICAgICAgcmV0dXJuIGFkZENlbnR1cmllcyhkYXRlLCAtMSAqIGNlbnR1cmllc1RvU3VidHJhY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgICBub3JtYWxpemUoY2VsbERhdGUsIG1pbiwgbWF4KSB7XG4gICAgICAgIGlmIChjZWxsRGF0ZSA8IG1pbiAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIG1pbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZURhdGUobWluKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbERhdGUgPiBtYXggJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVEYXRlKG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlbGxEYXRlO1xuICAgIH1cbn1cbkNlbnR1cnlWaWV3U2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyogdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzICovXG5jb25zdCBFTVBUWV9EQVRBJDEgPSBbW11dO1xuY29uc3QgQ0VMTFNfTEVOR1RIJDEgPSA1O1xuY29uc3QgUk9XU19MRU5HVEgkMSA9IDI7XG5jb25zdCBBQ1RJT05TJDEgPSB7XG4gICAgW0FjdGlvbi5MZWZ0XTogKGRhdGUpID0+IGFkZFllYXJzKGRhdGUsIC0xKSxcbiAgICBbQWN0aW9uLlVwXTogKGRhdGUpID0+IGFkZFllYXJzKGRhdGUsIC01KSxcbiAgICBbQWN0aW9uLlJpZ2h0XTogKGRhdGUpID0+IGFkZFllYXJzKGRhdGUsIDEpLFxuICAgIFtBY3Rpb24uRG93bl06IChkYXRlKSA9PiBhZGRZZWFycyhkYXRlLCA1KSxcbiAgICBbQWN0aW9uLlByZXZWaWV3XTogKGRhdGUpID0+IGFkZERlY2FkZXMoZGF0ZSwgLTEpLFxuICAgIFtBY3Rpb24uTmV4dFZpZXddOiAoZGF0ZSkgPT4gYWRkRGVjYWRlcyhkYXRlLCAxKSxcbiAgICBbQWN0aW9uLkZpcnN0SW5WaWV3XTogKGRhdGUpID0+IGZpcnN0WWVhck9mRGVjYWRlKGRhdGUpLFxuICAgIFtBY3Rpb24uTGFzdEluVmlld106IChkYXRlKSA9PiBsYXN0WWVhck9mRGVjYWRlKGRhdGUpXG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERlY2FkZVZpZXdTZXJ2aWNlIHtcbiAgICBhZGRUb0RhdGUobWluLCBza2lwKSB7XG4gICAgICAgIHJldHVybiBhZGREZWNhZGVzKG1pbiwgc2tpcCk7XG4gICAgfVxuICAgIGRhdGVzTGlzdChzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlKDAsIGNvdW50KS5tYXAoaSA9PiBhZGREZWNhZGVzKHN0YXJ0LCBpKSk7XG4gICAgfVxuICAgIGRhdGEob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNlbGxVSUQsIGZvY3VzZWREYXRlLCBpc0FjdGl2ZVZpZXcsIG1heCwgbWluLCBzZWxlY3RlZERhdGUsIHNlbGVjdGlvblJhbmdlID0gRU1QVFlfU0VMRUNUSU9OUkFOR0UsIHZpZXdEYXRlIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoIXZpZXdEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfREFUQSQxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxzID0gcmFuZ2UoMCwgQ0VMTFNfTEVOR1RIJDEpO1xuICAgICAgICBjb25zdCBmaXJzdERhdGUgPSBmaXJzdFllYXJPZkRlY2FkZSh2aWV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IGxhc3REYXRlID0gbGFzdFllYXJPZkRlY2FkZSh2aWV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWREYXRlSW5SYW5nZSA9IGlzSW5SYW5nZShzZWxlY3RlZERhdGUsIG1pbiwgbWF4KTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBnZXRUb2RheSgpO1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgUk9XU19MRU5HVEgkMSkubWFwKHJvd09mZnNldCA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXNlRGF0ZSA9IGFkZFllYXJzKGZpcnN0RGF0ZSwgcm93T2Zmc2V0ICogQ0VMTFNfTEVOR1RIJDEpO1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxzLm1hcChjZWxsT2Zmc2V0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRGF0ZSA9IHRoaXMubm9ybWFsaXplKGFkZFllYXJzKGJhc2VEYXRlLCBjZWxsT2Zmc2V0KSwgbWluLCBtYXgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0luUmFuZ2UoY2VsbERhdGUsIG1pbiwgbWF4KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3Rpb25SYW5nZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYW5nZUVuZCA9IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgc2VsZWN0aW9uUmFuZ2UuZW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0luTWlkZGxlID0gIWlzUmFuZ2VTdGFydCAmJiAhaXNSYW5nZUVuZDtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1JhbmdlTWlkID0gaXNJbk1pZGRsZSAmJiBpc0luU2VsZWN0aW9uUmFuZ2UoY2VsbERhdGUsIHNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdGhpcy52YWx1ZShjZWxsRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtjZWxsVUlEfSR7Y2VsbERhdGUuZ2V0VGltZSgpfWAsXG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNlZDogdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBmb2N1c2VkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGlzQWN0aXZlVmlldyAmJiBpc1NlbGVjdGVkRGF0ZUluUmFuZ2UgJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3RlZERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1dlZWtlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGlzUmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZU1pZDogaXNSYW5nZU1pZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZVNwbGl0RW5kOiBpc1JhbmdlTWlkICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbGFzdERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3BsaXRTdGFydDogaXNSYW5nZU1pZCAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIGZpcnN0RGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgdG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jZWxsVGl0bGUoY2VsbERhdGUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2VsbERhdGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc0VxdWFsKGNhbmRpZGF0ZSwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKCFjYW5kaWRhdGUgfHwgIWV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS5nZXRGdWxsWWVhcigpID09PSBleHBlY3RlZC5nZXRGdWxsWWVhcigpO1xuICAgIH1cbiAgICBpc0luQXJyYXkoZGF0ZSwgZGF0ZXMpIHtcbiAgICAgICAgaWYgKCFkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICByZXR1cm4gZGF0ZXNbMF0uZ2V0RnVsbFllYXIoKSA8PSB5ZWFyICYmIHllYXIgPD0gKGRhdGVzW2RhdGVzLmxlbmd0aCAtIDFdLmdldEZ1bGxZZWFyKCkgKyA5KTtcbiAgICB9XG4gICAgaXNJblJhbmdlKGNhbmRpZGF0ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgY29uc3QgeWVhciA9IGNhbmRpZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBjb25zdCBhYm92ZU1pbiA9ICFtaW4gfHwgbWluLmdldEZ1bGxZZWFyKCkgPD0geWVhcjtcbiAgICAgICAgY29uc3QgYmVsb3dNYXggPSAhbWF4IHx8IHllYXIgPD0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHJldHVybiBhYm92ZU1pbiAmJiBiZWxvd01heDtcbiAgICB9XG4gICAgYmVnaW5uaW5nT2ZQZXJpb2QoZGF0ZSkge1xuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0WWVhciA9IGZpcnN0WWVhck9mRGVjYWRlKGRhdGUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlRGF0ZShmaXJzdFllYXIuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgfVxuICAgIGlzUmFuZ2VTdGFydCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuZ2V0RnVsbFllYXIoKSAlIDEwMCA9PT0gMDtcbiAgICB9XG4gICAgbW92ZSh2YWx1ZSwgYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gQUNUSU9OUyQxW2FjdGlvbl07XG4gICAgICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kaWZpZXIodmFsdWUpO1xuICAgIH1cbiAgICBjZWxsVGl0bGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgbmF2aWdhdGlvblRpdGxlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IGZpcnN0WWVhck9mRGVjYWRlKHZhbHVlKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgOiAnJztcbiAgICB9XG4gICAgdGl0bGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtmaXJzdFllYXJPZkRlY2FkZSh2YWx1ZSkuZ2V0RnVsbFllYXIoKX0gLSAke2xhc3RZZWFyT2ZEZWNhZGUodmFsdWUpLmdldEZ1bGxZZWFyKCl9YDtcbiAgICB9XG4gICAgcm93TGVuZ3RoKF8pIHtcbiAgICAgICAgcmV0dXJuIENFTExTX0xFTkdUSCQxO1xuICAgIH1cbiAgICBza2lwKHZhbHVlLCBtaW4pIHtcbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uSW5EZWNhZGVzKG1pbiwgdmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbChtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gZHVyYXRpb25JbkRlY2FkZXMobWluLCBtYXgpICsgMTtcbiAgICB9XG4gICAgdmFsdWUoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IGN1cnJlbnQuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpIDogJyc7XG4gICAgfVxuICAgIHZpZXdEYXRlKGRhdGUsIG1heCwgdmlld3NDb3VudCA9IDEpIHtcbiAgICAgICAgY29uc3Qgdmlld3NJblJhbmdlID0gdGhpcy50b3RhbChkYXRlLCBtYXgpO1xuICAgICAgICBpZiAodmlld3NJblJhbmdlIDwgdmlld3NDb3VudCkge1xuICAgICAgICAgICAgY29uc3QgZGVjYWRlc1RvU3VidHJhY3QgPSB2aWV3c0NvdW50IC0gdmlld3NJblJhbmdlO1xuICAgICAgICAgICAgcmV0dXJuIGFkZERlY2FkZXMoZGF0ZSwgLTEgKiBkZWNhZGVzVG9TdWJ0cmFjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIG5vcm1hbGl6ZShjZWxsRGF0ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgaWYgKGNlbGxEYXRlIDwgbWluICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb25lRGF0ZShtaW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsRGF0ZSA+IG1heCAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIG1heCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZURhdGUobWF4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbERhdGU7XG4gICAgfVxufVxuRGVjYWRlVmlld1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOm9iamVjdC1saXRlcmFsLXNvcnQta2V5cyAqL1xuY29uc3QgRU1QVFlfREFUQSQyID0gW1tdXTtcbmNvbnN0IENFTExTX0xFTkdUSCQyID0gNztcbmNvbnN0IFJPV1NfTEVOR1RIJDIgPSA2O1xuY29uc3QgQUNUSU9OUyQyID0ge1xuICAgIFtBY3Rpb24uTGVmdF06IChkYXRlKSA9PiBhZGREYXlzKGRhdGUsIC0xKSxcbiAgICBbQWN0aW9uLlVwXTogKGRhdGUpID0+IGFkZFdlZWtzKGRhdGUsIC0xKSxcbiAgICBbQWN0aW9uLlJpZ2h0XTogKGRhdGUpID0+IGFkZERheXMoZGF0ZSwgMSksXG4gICAgW0FjdGlvbi5Eb3duXTogKGRhdGUpID0+IGFkZFdlZWtzKGRhdGUsIDEpLFxuICAgIFtBY3Rpb24uUHJldlZpZXddOiAoZGF0ZSkgPT4gYWRkTW9udGhzKGRhdGUsIC0xKSxcbiAgICBbQWN0aW9uLk5leHRWaWV3XTogKGRhdGUpID0+IGFkZE1vbnRocyhkYXRlLCAxKSxcbiAgICBbQWN0aW9uLkZpcnN0SW5WaWV3XTogKGRhdGUpID0+IGZpcnN0RGF5T2ZNb250aChkYXRlKSxcbiAgICBbQWN0aW9uLkxhc3RJblZpZXddOiAoZGF0ZSkgPT4gbGFzdERheU9mTW9udGgoZGF0ZSlcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTW9udGhWaWV3U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoX2ludGxTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2ludGxTZXJ2aWNlID0gX2ludGxTZXJ2aWNlO1xuICAgIH1cbiAgICBhZGRUb0RhdGUobWluLCBza2lwKSB7XG4gICAgICAgIHJldHVybiBhZGRNb250aHMobWluLCBza2lwKTtcbiAgICB9XG4gICAgZGF0ZXNMaXN0KHN0YXJ0LCBjb3VudCkge1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgY291bnQpLm1hcChpID0+IGFkZE1vbnRocyhzdGFydCwgaSkpO1xuICAgIH1cbiAgICBkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBjZWxsVUlELCBmb2N1c2VkRGF0ZSwgaXNBY3RpdmVWaWV3LCBtYXgsIG1pbiwgc2VsZWN0ZWREYXRlLCBzZWxlY3Rpb25SYW5nZSA9IEVNUFRZX1NFTEVDVElPTlJBTkdFLCB2aWV3RGF0ZSwgaXNEYXRlRGlzYWJsZWQgPSAoKSA9PiBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCF2aWV3RGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0RBVEEkMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdE1vbnRoRGF0ZSA9IGZpcnN0RGF5T2ZNb250aCh2aWV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0TW9udGhEYXkgPSBnZXREYXRlKGZpcnN0TW9udGhEYXRlKTtcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoRGF0ZSA9IGxhc3REYXlPZk1vbnRoKHZpZXdEYXRlKTtcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoRGF5ID0gZ2V0RGF0ZShsYXN0TW9udGhEYXRlKTtcbiAgICAgICAgY29uc3QgYmFja3dhcmQgPSAtMTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZERhdGVJblJhbmdlID0gaXNJblJhbmdlKHNlbGVjdGVkRGF0ZSwgbWluLCBtYXgpO1xuICAgICAgICBjb25zdCBkYXRlID0gZGF5T2ZXZWVrKGZpcnN0TW9udGhEYXRlLCB0aGlzLl9pbnRsU2VydmljZS5maXJzdERheSgpLCBiYWNrd2FyZCk7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gcmFuZ2UoMCwgQ0VMTFNfTEVOR1RIJDIpO1xuICAgICAgICBjb25zdCB0b2RheSA9IGdldFRvZGF5KCk7XG4gICAgICAgIHJldHVybiByYW5nZSgwLCBST1dTX0xFTkdUSCQyKS5tYXAocm93T2Zmc2V0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VEYXRlID0gYWRkRGF5cyhkYXRlLCByb3dPZmZzZXQgKiBDRUxMU19MRU5HVEgkMik7XG4gICAgICAgICAgICByZXR1cm4gY2VsbHMubWFwKGNlbGxPZmZzZXQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxEYXRlID0gdGhpcy5ub3JtYWxpemUoYWRkRGF5cyhiYXNlRGF0ZSwgY2VsbE9mZnNldCksIG1pbiwgbWF4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRGF5ID0gZ2V0RGF0ZShjZWxsRGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJNb250aCA9IGNlbGxEYXkgPCBmaXJzdE1vbnRoRGF5IHx8IGNlbGxEYXkgPiBsYXN0TW9udGhEYXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0T2ZSYW5nZSA9IGNlbGxEYXRlIDwgbWluIHx8IGNlbGxEYXRlID4gbWF4O1xuICAgICAgICAgICAgICAgIGlmIChvdGhlck1vbnRoIHx8IG91dE9mUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmFuZ2VTdGFydCA9IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgc2VsZWN0aW9uUmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIHNlbGVjdGlvblJhbmdlLmVuZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNJbk1pZGRsZSA9ICFpc1JhbmdlU3RhcnQgJiYgIWlzUmFuZ2VFbmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYW5nZU1pZCA9IGlzSW5NaWRkbGUgJiYgaXNJblNlbGVjdGlvblJhbmdlKGNlbGxEYXRlLCBzZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IHRoaXMudmFsdWUoY2VsbERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7Y2VsbFVJRH0ke2NlbGxEYXRlLmdldFRpbWUoKX1gLFxuICAgICAgICAgICAgICAgICAgICBpc0ZvY3VzZWQ6IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgZm9jdXNlZERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBpc0FjdGl2ZVZpZXcgJiYgaXNTZWxlY3RlZERhdGVJblJhbmdlICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgc2VsZWN0ZWREYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgaXNXZWVrZW5kOiB0aGlzLmlzV2Vla2VuZChjZWxsRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzUmFuZ2VTdGFydDogaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlTWlkOiBpc1JhbmdlTWlkLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlRW5kOiBpc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3BsaXRTdGFydDogaXNSYW5nZU1pZCAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIGZpcnN0TW9udGhEYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZVNwbGl0RW5kOiBpc1JhbmdlTWlkICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbGFzdE1vbnRoRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgdG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jZWxsVGl0bGUoY2VsbERhdGUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2VsbERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGlzRGF0ZURpc2FibGVkKGNlbGxEYXRlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzRXF1YWwoY2FuZGlkYXRlLCBleHBlY3RlZCkge1xuICAgICAgICBpZiAoIWNhbmRpZGF0ZSB8fCAhZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0RGF0ZShjYW5kaWRhdGUpLmdldFRpbWUoKSA9PT0gZ2V0RGF0ZShleHBlY3RlZCkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBpc0luQXJyYXkoZGF0ZSwgZGF0ZXMpIHtcbiAgICAgICAgaWYgKGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvd2VyQm91bmQgPSB0aGlzLmJlZ2lubmluZ09mUGVyaW9kKGRhdGVzWzBdKTtcbiAgICAgICAgY29uc3QgdXBwZXJCb3VuZCA9IHRoaXMuYmVnaW5uaW5nT2ZQZXJpb2QoYWRkTW9udGhzKGRhdGVzW2RhdGVzLmxlbmd0aCAtIDFdLCAxKSk7XG4gICAgICAgIHJldHVybiBsb3dlckJvdW5kIDw9IGRhdGUgJiYgZGF0ZSA8IHVwcGVyQm91bmQ7XG4gICAgfVxuICAgIGlzSW5SYW5nZShjYW5kaWRhdGUsIG1pbiwgbWF4KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICBjb25zdCBhYm92ZU1pbiA9ICFtaW4gfHwgZ2V0RGF0ZShtaW4pIDw9IHZhbHVlO1xuICAgICAgICBjb25zdCBiZWxvd01heCA9ICFtYXggfHwgdmFsdWUgPD0gZ2V0RGF0ZShtYXgpO1xuICAgICAgICByZXR1cm4gYWJvdmVNaW4gJiYgYmVsb3dNYXg7XG4gICAgfVxuICAgIGJlZ2lubmluZ09mUGVyaW9kKGRhdGUpIHtcbiAgICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgfVxuICAgIGlzUmFuZ2VTdGFydCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmdldE1vbnRoKCk7XG4gICAgfVxuICAgIG1vdmUodmFsdWUsIGFjdGlvbikge1xuICAgICAgICBjb25zdCBtb2RpZmllciA9IEFDVElPTlMkMlthY3Rpb25dO1xuICAgICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZGlmaWVyKHZhbHVlKTtcbiAgICB9XG4gICAgY2VsbFRpdGxlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRsU2VydmljZS5mb3JtYXREYXRlKHZhbHVlLCAnRCcpO1xuICAgIH1cbiAgICBuYXZpZ2F0aW9uVGl0bGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmFuZ2VTdGFydCh2YWx1ZSkgPyB2YWx1ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgOiB0aGlzLmFiYnJNb250aE5hbWVzKClbdmFsdWUuZ2V0TW9udGgoKV07XG4gICAgfVxuICAgIHRpdGxlKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMud2lkZU1vbnRoTmFtZXMoKVtjdXJyZW50LmdldE1vbnRoKCldfSAke2N1cnJlbnQuZ2V0RnVsbFllYXIoKX1gO1xuICAgIH1cbiAgICByb3dMZW5ndGgocHJlcGVuZENlbGwpIHtcbiAgICAgICAgcmV0dXJuIENFTExTX0xFTkdUSCQyICsgKHByZXBlbmRDZWxsID8gMSA6IDApO1xuICAgIH1cbiAgICBza2lwKHZhbHVlLCBtaW4pIHtcbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uSW5Nb250aHMobWluLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiBkdXJhdGlvbkluTW9udGhzKG1pbiwgbWF4KSArIDE7XG4gICAgfVxuICAgIHZhbHVlKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPyBjdXJyZW50LmdldERhdGUoKS50b1N0cmluZygpIDogXCJcIjtcbiAgICB9XG4gICAgdmlld0RhdGUoZGF0ZSwgbWF4LCB2aWV3c0NvdW50ID0gMSkge1xuICAgICAgICBjb25zdCB2aWV3c0luUmFuZ2UgPSB0aGlzLnRvdGFsKGRhdGUsIG1heCk7XG4gICAgICAgIGlmICh2aWV3c0luUmFuZ2UgPCB2aWV3c0NvdW50KSB7XG4gICAgICAgICAgICBjb25zdCBtb250aHNUb1N1YnRyYWN0ID0gdmlld3NDb3VudCAtIHZpZXdzSW5SYW5nZTtcbiAgICAgICAgICAgIHJldHVybiBhZGRNb250aHMoZGF0ZSwgLTEgKiBtb250aHNUb1N1YnRyYWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG4gICAgaXNXZWVrZW5kKGRhdGUpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLl9pbnRsU2VydmljZS53ZWVrZW5kUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXkoKTtcbiAgICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5IDw9IGVuZCB8fCBzdGFydCA8PSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0IDw9IGRheSAmJiBkYXkgPD0gZW5kO1xuICAgIH1cbiAgICBhYmJyTW9udGhOYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGxTZXJ2aWNlLmRhdGVGb3JtYXROYW1lcyh7IG5hbWVUeXBlOiAnYWJicmV2aWF0ZWQnLCB0eXBlOiAnbW9udGhzJyB9KTtcbiAgICB9XG4gICAgbm9ybWFsaXplKGNlbGxEYXRlLCBtaW4sIG1heCkge1xuICAgICAgICBpZiAoY2VsbERhdGUgPCBtaW4gJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBtaW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVEYXRlKG1pbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNlbGxEYXRlID4gbWF4ICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb25lRGF0ZShtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxsRGF0ZTtcbiAgICB9XG4gICAgd2lkZU1vbnRoTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRsU2VydmljZS5kYXRlRm9ybWF0TmFtZXMoeyBuYW1lVHlwZTogJ3dpZGUnLCB0eXBlOiAnbW9udGhzJyB9KTtcbiAgICB9XG59XG5Nb250aFZpZXdTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Nb250aFZpZXdTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogSW50bFNlcnZpY2UgfVxuXTtcblxuLyogdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzICovXG5jb25zdCBFTVBUWV9EQVRBJDMgPSBbW11dO1xuY29uc3QgQ0VMTFNfTEVOR1RIJDMgPSA1O1xuY29uc3QgUk9XU19MRU5HVEgkMyA9IDM7XG5jb25zdCB1cFN0ZXAgPSAobW9udGgpID0+IHtcbiAgICBpZiAobW9udGggPiA0KSB7XG4gICAgICAgIHJldHVybiAtNTtcbiAgICB9XG4gICAgaWYgKG1vbnRoIDwgMikge1xuICAgICAgICByZXR1cm4gLTI7XG4gICAgfVxuICAgIHJldHVybiAtNztcbn07XG5jb25zdCBkb3duU3RlcCA9IChtb250aCkgPT4ge1xuICAgIGlmIChtb250aCA8IDcpIHtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICAgIGlmIChtb250aCA8IDEwKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgIH1cbiAgICByZXR1cm4gMjtcbn07XG5jb25zdCBBQ1RJT05TJDMgPSB7XG4gICAgW0FjdGlvbi5MZWZ0XTogKGRhdGUpID0+IGFkZE1vbnRocyhkYXRlLCAtMSksXG4gICAgW0FjdGlvbi5VcF06IChkYXRlKSA9PiBhZGRNb250aHMoZGF0ZSwgdXBTdGVwKGRhdGUuZ2V0TW9udGgoKSkpLFxuICAgIFtBY3Rpb24uUmlnaHRdOiAoZGF0ZSkgPT4gYWRkTW9udGhzKGRhdGUsIDEpLFxuICAgIFtBY3Rpb24uRG93bl06IChkYXRlKSA9PiBhZGRNb250aHMoZGF0ZSwgZG93blN0ZXAoZGF0ZS5nZXRNb250aCgpKSksXG4gICAgW0FjdGlvbi5QcmV2Vmlld106IChkYXRlKSA9PiBhZGRZZWFycyhkYXRlLCAtMSksXG4gICAgW0FjdGlvbi5OZXh0Vmlld106IChkYXRlKSA9PiBhZGRZZWFycyhkYXRlLCAxKSxcbiAgICBbQWN0aW9uLkZpcnN0SW5WaWV3XTogKGRhdGUpID0+IGZpcnN0TW9udGhPZlllYXIoZGF0ZSksXG4gICAgW0FjdGlvbi5MYXN0SW5WaWV3XTogKGRhdGUpID0+IGxhc3RNb250aE9mWWVhcihkYXRlKVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBZZWFyVmlld1NlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKF9pbnRsU2VydmljZSkge1xuICAgICAgICB0aGlzLl9pbnRsU2VydmljZSA9IF9pbnRsU2VydmljZTtcbiAgICB9XG4gICAgYWRkVG9EYXRlKG1pbiwgc2tpcCkge1xuICAgICAgICByZXR1cm4gYWRkWWVhcnMobWluLCBza2lwKTtcbiAgICB9XG4gICAgZGF0ZXNMaXN0KHN0YXJ0LCBjb3VudCkge1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgY291bnQpLm1hcChpID0+IGFkZFllYXJzKHN0YXJ0LCBpKSk7XG4gICAgfVxuICAgIGRhdGEob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNlbGxVSUQsIGZvY3VzZWREYXRlLCBpc0FjdGl2ZVZpZXcsIG1heCwgbWluLCBzZWxlY3RlZERhdGUsIHNlbGVjdGlvblJhbmdlID0gRU1QVFlfU0VMRUNUSU9OUkFOR0UsIHZpZXdEYXRlIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoIXZpZXdEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfREFUQSQzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuYWJick1vbnRoTmFtZXMoKTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZERhdGVJblJhbmdlID0gaXNJblJhbmdlKHNlbGVjdGVkRGF0ZSwgbWluLCBtYXgpO1xuICAgICAgICBjb25zdCBmaXJzdERhdGUgPSBmaXJzdE1vbnRoT2ZZZWFyKHZpZXdEYXRlKTtcbiAgICAgICAgY29uc3QgbGFzdERhdGUgPSBsYXN0TW9udGhPZlllYXIodmlld0RhdGUpO1xuICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGZpcnN0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBjb25zdCBjZWxscyA9IHJhbmdlKDAsIENFTExTX0xFTkdUSCQzKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBnZXRUb2RheSgpO1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgUk9XU19MRU5HVEgkMykubWFwKHJvd09mZnNldCA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXNlRGF0ZSA9IGFkZE1vbnRocyhmaXJzdERhdGUsIHJvd09mZnNldCAqIENFTExTX0xFTkdUSCQzKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxscy5tYXAoY2VsbE9mZnNldCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbERhdGUgPSB0aGlzLm5vcm1hbGl6ZShhZGRNb250aHMoYmFzZURhdGUsIGNlbGxPZmZzZXQpLCBtaW4sIG1heCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZFllYXIgPSBjdXJyZW50WWVhciA8IGNlbGxEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5SYW5nZShjZWxsRGF0ZSwgbWluLCBtYXgpIHx8IGNoYW5nZWRZZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc1JhbmdlU3RhcnQgPSB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIHNlbGVjdGlvblJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1JhbmdlRW5kID0gdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3Rpb25SYW5nZS5lbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5NaWRkbGUgPSAhaXNSYW5nZVN0YXJ0ICYmICFpc1JhbmdlRW5kO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmFuZ2VNaWQgPSBpc0luTWlkZGxlICYmIGlzSW5TZWxlY3Rpb25SYW5nZShjZWxsRGF0ZSwgc2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBtb250aHNbY2VsbERhdGUuZ2V0TW9udGgoKV0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtjZWxsVUlEfSR7Y2VsbERhdGUuZ2V0VGltZSgpfWAsXG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNlZDogdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBmb2N1c2VkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGlzQWN0aXZlVmlldyAmJiBpc1NlbGVjdGVkRGF0ZUluUmFuZ2UgJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBzZWxlY3RlZERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1dlZWtlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGlzUmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZU1pZDogaXNSYW5nZU1pZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgaXNSYW5nZVNwbGl0RW5kOiBpc1JhbmdlTWlkICYmIHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgbGFzdERhdGUpLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3BsaXRTdGFydDogaXNSYW5nZU1pZCAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIGZpcnN0RGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRoaXMuaXNFcXVhbChjZWxsRGF0ZSwgdG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jZWxsVGl0bGUoY2VsbERhdGUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2VsbERhdGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc0VxdWFsKGNhbmRpZGF0ZSwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKCFjYW5kaWRhdGUgfHwgIWV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS5nZXRGdWxsWWVhcigpID09PSBleHBlY3RlZC5nZXRGdWxsWWVhcigpICYmXG4gICAgICAgICAgICBjYW5kaWRhdGUuZ2V0TW9udGgoKSA9PT0gZXhwZWN0ZWQuZ2V0TW9udGgoKTtcbiAgICB9XG4gICAgaXNJbkFycmF5KGRhdGUsIGRhdGVzKSB7XG4gICAgICAgIGlmICghZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgcmV0dXJuIGRhdGVzWzBdLmdldEZ1bGxZZWFyKCkgPD0geWVhciAmJiB5ZWFyIDw9IGRhdGVzW2RhdGVzLmxlbmd0aCAtIDFdLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuICAgIGlzSW5SYW5nZShjYW5kaWRhdGUsIG1pbiwgbWF4KSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVZhbHVlID0gY3JlYXRlRGF0ZShjYW5kaWRhdGUuZ2V0RnVsbFllYXIoKSwgY2FuZGlkYXRlLmdldE1vbnRoKCksIDEpO1xuICAgICAgICBjb25zdCBhYm92ZU1pbiA9ICFtaW4gfHwgY3JlYXRlRGF0ZShtaW4uZ2V0RnVsbFllYXIoKSwgbWluLmdldE1vbnRoKCksIDEpIDw9IGNhbmRpZGF0ZVZhbHVlO1xuICAgICAgICBjb25zdCBiZWxvd01heCA9ICFtYXggfHwgY2FuZGlkYXRlVmFsdWUgPD0gY3JlYXRlRGF0ZShtYXguZ2V0RnVsbFllYXIoKSwgbWF4LmdldE1vbnRoKCksIDEpO1xuICAgICAgICByZXR1cm4gYWJvdmVNaW4gJiYgYmVsb3dNYXg7XG4gICAgfVxuICAgIGJlZ2lubmluZ09mUGVyaW9kKGRhdGUpIHtcbiAgICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICAgIH1cbiAgICBpc1JhbmdlU3RhcnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmdldEZ1bGxZZWFyKCkgJSAxMCA9PT0gMDtcbiAgICB9XG4gICAgbW92ZSh2YWx1ZSwgYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gQUNUSU9OUyQzW2FjdGlvbl07XG4gICAgICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kaWZpZXIodmFsdWUpO1xuICAgIH1cbiAgICBjZWxsVGl0bGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlLmdldEZ1bGxZZWFyKCl9ICR7dGhpcy52YWx1ZSh2YWx1ZSl9YDtcbiAgICB9XG4gICAgbmF2aWdhdGlvblRpdGxlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpdGxlKHZhbHVlKTtcbiAgICB9XG4gICAgdGl0bGUoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IGN1cnJlbnQuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpIDogJyc7XG4gICAgfVxuICAgIHJvd0xlbmd0aChfKSB7XG4gICAgICAgIHJldHVybiBDRUxMU19MRU5HVEgkMztcbiAgICB9XG4gICAgc2tpcCh2YWx1ZSwgbWluKSB7XG4gICAgICAgIHJldHVybiBkdXJhdGlvbkluWWVhcnMobWluLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiBkdXJhdGlvbkluWWVhcnMobWluLCBtYXgpICsgMTtcbiAgICB9XG4gICAgdmFsdWUoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IHRoaXMuYWJick1vbnRoTmFtZXMoKVtjdXJyZW50LmdldE1vbnRoKCldIDogJyc7XG4gICAgfVxuICAgIHZpZXdEYXRlKGRhdGUsIG1heCwgdmlld3NDb3VudCA9IDEpIHtcbiAgICAgICAgY29uc3Qgdmlld3NJblJhbmdlID0gdGhpcy50b3RhbChkYXRlLCBtYXgpO1xuICAgICAgICBpZiAodmlld3NJblJhbmdlIDwgdmlld3NDb3VudCkge1xuICAgICAgICAgICAgY29uc3QgeWVhcnNUb1N1YnRyYWN0ID0gdmlld3NDb3VudCAtIHZpZXdzSW5SYW5nZTtcbiAgICAgICAgICAgIHJldHVybiBhZGRZZWFycyhkYXRlLCAtMSAqIHllYXJzVG9TdWJ0cmFjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGFiYnJNb250aE5hbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50bFNlcnZpY2UuZGF0ZUZvcm1hdE5hbWVzKHsgbmFtZVR5cGU6ICdhYmJyZXZpYXRlZCcsIHR5cGU6ICdtb250aHMnIH0pO1xuICAgIH1cbiAgICBub3JtYWxpemUoY2VsbERhdGUsIG1pbiwgbWF4KSB7XG4gICAgICAgIGlmIChjZWxsRGF0ZSA8IG1pbiAmJiB0aGlzLmlzRXF1YWwoY2VsbERhdGUsIG1pbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZURhdGUobWluKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbERhdGUgPiBtYXggJiYgdGhpcy5pc0VxdWFsKGNlbGxEYXRlLCBtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVEYXRlKG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlbGxEYXRlO1xuICAgIH1cbn1cblllYXJWaWV3U2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuWWVhclZpZXdTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogSW50bFNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKlxuICogVGhlIEVudW0gd2hpY2ggZGVmaW5lcyBhbGwgcG9zc2libGUgQ2FsZW5kYXIgdmlldyB0eXBlcy5cbiAqL1xudmFyIENhbGVuZGFyVmlld0VudW07XG4oZnVuY3Rpb24gKENhbGVuZGFyVmlld0VudW0pIHtcbiAgICBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW1bXCJtb250aFwiXSA9IDBdID0gXCJtb250aFwiO1xuICAgIENhbGVuZGFyVmlld0VudW1bQ2FsZW5kYXJWaWV3RW51bVtcInllYXJcIl0gPSAxXSA9IFwieWVhclwiO1xuICAgIENhbGVuZGFyVmlld0VudW1bQ2FsZW5kYXJWaWV3RW51bVtcImRlY2FkZVwiXSA9IDJdID0gXCJkZWNhZGVcIjtcbiAgICBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW1bXCJjZW50dXJ5XCJdID0gM10gPSBcImNlbnR1cnlcIjtcbn0pKENhbGVuZGFyVmlld0VudW0gfHwgKENhbGVuZGFyVmlld0VudW0gPSB7fSkpO1xuXG5jb25zdCBzZXJ2aWNlcyA9IHtcbiAgICBbQ2FsZW5kYXJWaWV3RW51bS5tb250aF06IE1vbnRoVmlld1NlcnZpY2UsXG4gICAgW0NhbGVuZGFyVmlld0VudW0ueWVhcl06IFllYXJWaWV3U2VydmljZSxcbiAgICBbQ2FsZW5kYXJWaWV3RW51bS5kZWNhZGVdOiBEZWNhZGVWaWV3U2VydmljZSxcbiAgICBbQ2FsZW5kYXJWaWV3RW51bS5jZW50dXJ5XTogQ2VudHVyeVZpZXdTZXJ2aWNlXG59O1xuY29uc3Qgdmlld09mZnNldCA9ICh2aWV3LCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW1bdmlldyArIG9mZnNldF1dO1xuICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCA/IGNhbmRpZGF0ZSA6IHZpZXc7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEJ1c1ZpZXdTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihpbmplY3Rvcikge1xuICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgIHRoaXMudmlld0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYm90dG9tID0gQ2FsZW5kYXJWaWV3RW51bS5tb250aDtcbiAgICAgICAgdGhpcy50b3AgPSBDYWxlbmRhclZpZXdFbnVtLmNlbnR1cnk7XG4gICAgfVxuICAgIGNvbmZpZ3VyZShib3R0b20sIHRvcCkge1xuICAgICAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgfVxuICAgIHNlcnZpY2Uodmlldykge1xuICAgICAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IHNlcnZpY2VzW3ZpZXddO1xuICAgICAgICByZXR1cm4gc2VydmljZVR5cGUgPyB0aGlzLmluamVjdG9yLmdldChzZXJ2aWNlVHlwZSkgOiBudWxsO1xuICAgIH1cbiAgICBtb3ZlRG93bih2aWV3KSB7XG4gICAgICAgIHRoaXMubW92ZSh2aWV3LCAtMSk7XG4gICAgfVxuICAgIG1vdmVVcCh2aWV3KSB7XG4gICAgICAgIHRoaXMubW92ZSh2aWV3LCAxKTtcbiAgICB9XG4gICAgbW92ZVRvQm90dG9tKGFjdGl2ZVZpZXcpIHtcbiAgICAgICAgaWYgKGFjdGl2ZVZpZXcgPT09IHRoaXMuYm90dG9tKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlZC5lbWl0KHsgdmlldzogdGhpcy5ib3R0b20gfSk7XG4gICAgfVxuICAgIGNhbk1vdmVEb3duKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tIDwgdmlldztcbiAgICB9XG4gICAgY2FuTW92ZVVwKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHZpZXcgPCB0aGlzLnRvcDtcbiAgICB9XG4gICAgY2xhbXAodmlldykge1xuICAgICAgICBpZiAodmlldyA8IHRoaXMuYm90dG9tKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ib3R0b207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpZXcgPiB0aGlzLnRvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cbiAgICBtb3ZlKHZpZXcsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmNsYW1wKHZpZXdPZmZzZXQodmlldywgb2Zmc2V0KSk7XG4gICAgICAgIGlmIChjYW5kaWRhdGUgPT09IHZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VkLmVtaXQoeyB2aWV3OiBjYW5kaWRhdGUgfSk7XG4gICAgfVxufVxuQnVzVmlld1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJ1c1ZpZXdTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogSW5qZWN0b3IgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHJlcXVpcmVzWm9uZU9uQmx1ciA9IChuZ0NvbnRyb2wpID0+IG5nQ29udHJvbCAmJlxuICAgICghbmdDb250cm9sLnRvdWNoZWQgfHwgKG5nQ29udHJvbC5jb250cm9sICYmIG5nQ29udHJvbC5jb250cm9sLnVwZGF0ZU9uID09PSAnYmx1cicpKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBwcmV2ZW50RGVmYXVsdCA9IChhcmdzKSA9PiBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY3VycmVudEZvY3VzVGFyZ2V0ID0gKGJsdXJBcmdzKSA9PiBibHVyQXJncy5yZWxhdGVkVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNQcmVzZW50ID0gKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xuLyoqXG4gKiBAaGlkZGVuXG4gKlxuICogSWYgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBpdGVtXG4gKiBhbmQgYWxsIGl0ZW1zIGluIHRoZSBhcnJheSBhcmUgbnVtYmVycywgcmV0dXJucyBgdHJ1ZS5cbiAqL1xuY29uc3QgaXNOdW1iZXJBcnJheSA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5ldmVyeShpdGVtID0+IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBJZiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGFuIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGl0ZW1cbiAqIGFuZCBhbGwgaXRlbXMgaW4gdGhlIGFycmF5IGFyZSBkYXRlcywgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmNvbnN0IGlzRGF0ZUFycmF5ID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHZhbHVlLmV2ZXJ5KGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIERhdGUpO1xuXG5jb25zdCBkaXYgPSBkb21Db250YWluZXJGYWN0b3J5KCdkaXYnKTtcbmNvbnN0IHVsID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndWwnKTtcbmNvbnN0IGxpID0gZG9tQ29udGFpbmVyRmFjdG9yeSgnbGknKTtcbmNvbnN0IHRkID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndGQnKTtcbmNvbnN0IHRoID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndGgnKTtcbmNvbnN0IHRyID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndHInKTtcbmNvbnN0IHRib2R5ID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndGJvZHknKTtcbmNvbnN0IHRoZWFkID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndGhlYWQnKTtcbmNvbnN0IHRhYmxlID0gZG9tQ29udGFpbmVyRmFjdG9yeSgndGFibGUnKTtcbmNvbnN0IG1vbnRoSGVhZGVyID0gKCkgPT4gKGRpdihgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstYnV0dG9uIGstYmFyZSBrLXRpdGxlXCI+TWFyY2ggMjAxNzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay10b2RheVwiPlRPREFZPC9zcGFuPlxuICAgICAgICBgLCAnay1jYWxlbmRhci1oZWFkZXInKSk7XG5jb25zdCBtb250aFdlZWtIZWFkZXIgPSAoKSA9PiAodGFibGUoW1xuICAgIHRoZWFkKFtcbiAgICAgICAgdHIoW3RoKCdNTycpXSlcbiAgICBdKVxuXSwgJ2stY2FsZW5kYXItd2Vla2RheXMnKSk7XG5jb25zdCByZXBlYXQgPSAoY291bnQsIG1hcHBlcikgPT4gbmV3IEFycmF5KGNvdW50KS5maWxsKCcxJykubWFwKG1hcHBlcik7XG5jb25zdCBjb250ZW50ID0gKHJvd3MsIGNlbGxzID0gMSkgPT4gKHRhYmxlKFtcbiAgICB0Ym9keShbdHIoW3RoKCcxJyldKV0uY29uY2F0KHJlcGVhdChyb3dzLCAoKSA9PiB0cihyZXBlYXQoY2VsbHMsIGMgPT4gdGQoYDxzcGFuIGNsYXNzPVwiay1saW5rXCI+JHtjfTwvc3Bhbj5gKSkpKSkpXG5dKSk7XG5jb25zdCBzY3JvbGxhYmxlID0gKGNoaWxkcmVuKSA9PiBkaXYoY2hpbGRyZW4sICdrLWNvbnRlbnQgay1zY3JvbGxhYmxlJyk7XG5jb25zdCB2aWV3ID0gKGNvbnRlbnRFbGVtZW50LCBjbGFzc05hbWUsIHJlbmRlcldlZWtIZWFkZXIpID0+IChkaXYoW1xuICAgIG1vbnRoSGVhZGVyKCksXG4gICAgcmVuZGVyV2Vla0hlYWRlciA/IG1vbnRoV2Vla0hlYWRlcigpIDogbnVsbCxcbiAgICBzY3JvbGxhYmxlKFtjb250ZW50RWxlbWVudCwgY29udGVudEVsZW1lbnRdKVxuXSwgY2xhc3NOYW1lLCB7IGxlZnQ6ICctMTAwMDBweCcsIHBvc2l0aW9uOiAnYWJzb2x1dGUnIH0pKTtcbmNvbnN0IMm1NiA9ICgpID0+IHtcbiAgICBsZXQgbmF2RWxlbWVudDtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmF2RWxlbWVudCkge1xuICAgICAgICAgICAgbmF2RWxlbWVudCA9IGRpdihbc2Nyb2xsYWJsZShbdWwoW2xpKCc8c3Bhbj5GRUI8L3NwYW4+JyldKV0pXSwgJ2stY2FsZW5kYXItbmF2aWdhdGlvbicsIHsgbGVmdDogJzBweCcsIHBvc2l0aW9uOiAnYWJzb2x1dGUnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYXZFbGVtZW50O1xuICAgIH07XG59O1xuY29uc3QgbmF2aWdhdGlvbkxpc3QgPSAoybU2KSgpO1xuY29uc3Qgdmlld0ZhY3RvcnkgPSAoeyBjZWxscywgcm93cyB9LCBjbGFzc05hbWUsIHJlbmRlcldlZWtIZWFkZXIpID0+IHtcbiAgICBsZXQgdmlld0VsZW1lbnQ7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZpZXdFbGVtZW50KSB7XG4gICAgICAgICAgICB2aWV3RWxlbWVudCA9IHZpZXcoY29udGVudChyb3dzLCBjZWxscyksIGNsYXNzTmFtZSwgcmVuZGVyV2Vla0hlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdFbGVtZW50O1xuICAgIH07XG59O1xuY29uc3QgZ2V0U2Nyb2xsYWJsZSA9IChlbGVtZW50KSA9PiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rLXNjcm9sbGFibGUnKTtcbmNvbnN0IGhvcml6b250YWwgPSBlbGVtZW50ID0+IHtcbiAgICBjb25zdCBzY3JvbGxhYmxlRWxlbWVudCA9IGdldFNjcm9sbGFibGUoZWxlbWVudCk7XG4gICAgc2Nyb2xsYWJsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnay1zY3JvbGxhYmxlLWhvcml6b250YWwnKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbn07XG5jb25zdCBtb250aFZpZXcgPSB2aWV3RmFjdG9yeSh7IGNlbGxzOiA3LCByb3dzOiA2IH0sICdrLWNhbGVuZGFyLXZpZXcgay1jYWxlbmRhci1tb250aHZpZXcnLCB0cnVlKTtcbmNvbnN0IHllYXJWaWV3ID0gdmlld0ZhY3RvcnkoeyBjZWxsczogNSwgcm93czogMyB9LCAnay1jYWxlbmRhci12aWV3IGstY2FsZW5kYXIteWVhcnZpZXcnLCBmYWxzZSk7XG5jb25zdCBkZWNhZGVWaWV3ID0gdmlld0ZhY3RvcnkoeyBjZWxsczogNSwgcm93czogMiB9LCAnay1jYWxlbmRhci12aWV3IGstY2FsZW5kYXItZGVjYWRldmlldycsIGZhbHNlKTtcbmNvbnN0IGhvcnpNb250aFZpZXcgPSAoKSA9PiBob3Jpem9udGFsKG1vbnRoVmlldygpKTtcbmNvbnN0IGhvcnpZZWFyVmlldyA9ICgpID0+IGhvcml6b250YWwoeWVhclZpZXcoKSk7XG5jb25zdCBob3J6RGVjYWRlVmlldyA9ICgpID0+IGhvcml6b250YWwoZGVjYWRlVmlldygpKTtcbmNvbnN0IGhlaWdodCA9IChlbGVtZW50KSA9PiAocGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpIHx8IGVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbmNvbnN0IHdpZHRoID0gKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBjb21wdXRlZCA9IHBhcnNlRmxvYXQoc3R5bGVzLndpZHRoKVxuICAgICAgICArIHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdMZWZ0KVxuICAgICAgICArIHBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdSaWdodCk7XG4gICAgcmV0dXJuIGNvbXB1dGVkIHx8IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG59O1xuY29uc3QgZ2V0Qm9keSA9IChlbGVtZW50KSA9PiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ2FsZW5kYXJET01TZXJ2aWNlIHtcbiAgICBlbnN1cmVIZWlnaHRzKCkge1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhckhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVIZWlnaHRzKCk7XG4gICAgfVxuICAgIGNhbGN1bGF0ZUhlaWdodHMoY29udGFpbmVyKSB7XG4gICAgICAgIGlmICghaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ob3N0Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmJhdGNoKG1vbnRoVmlldygpLCAoY29udGVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdFbGVtZW50ID0gZ2V0Qm9keShjb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFySGVpZ2h0ID0gaGVpZ2h0KGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMubW9udGhWaWV3SGVpZ2h0ID0gaGVpZ2h0KHZpZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVySGVpZ2h0ID0gaGVpZ2h0KHZpZXdFbGVtZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsYWJsZUNvbnRlbnRIZWlnaHQgPSBoZWlnaHQoZ2V0U2Nyb2xsYWJsZShjb250ZW50RWxlbWVudCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iYXRjaChob3J6TW9udGhWaWV3KCksIChjb250ZW50RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdmlld0VsZW1lbnQgPSBnZXRCb2R5KGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJXaWR0aCA9IHdpZHRoKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMubW9udGhWaWV3V2lkdGggPSB3aWR0aCh2aWV3RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGFibGVDb250ZW50V2lkdGggPSB3aWR0aChnZXRTY3JvbGxhYmxlKGNvbnRlbnRFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhdGNoKHllYXJWaWV3KCksIChjb250ZW50RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy55ZWFyVmlld0hlaWdodCA9IGhlaWdodChnZXRCb2R5KGNvbnRlbnRFbGVtZW50KSk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGFibGVZZWFyQ29udGVudEhlaWdodCA9IGhlaWdodChnZXRTY3JvbGxhYmxlKGNvbnRlbnRFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhdGNoKGhvcnpZZWFyVmlldygpLCAoY29udGVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMueWVhclZpZXdXaWR0aCA9IHdpZHRoKGdldEJvZHkoY29udGVudEVsZW1lbnQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYmF0Y2goZGVjYWRlVmlldygpLCAoY29udGVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjYWRlVmlld0hlaWdodCA9IGhlaWdodChnZXRCb2R5KGNvbnRlbnRFbGVtZW50KSk7XG4gICAgICAgICAgICB0aGlzLmNlbnR1cnlWaWV3SGVpZ2h0ID0gdGhpcy5kZWNhZGVWaWV3SGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iYXRjaChob3J6RGVjYWRlVmlldygpLCAoY29udGVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjYWRlVmlld1dpZHRoID0gd2lkdGgoZ2V0Qm9keShjb250ZW50RWxlbWVudCkpO1xuICAgICAgICAgICAgdGhpcy5jZW50dXJ5Vmlld1dpZHRoID0gdGhpcy5kZWNhZGVWaWV3V2lkdGg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhdGNoKG5hdmlnYXRpb25MaXN0KCksIChjb250ZW50RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSXRlbUhlaWdodCA9IGhlaWdodChjb250ZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdsaScpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZpZXdIZWlnaHQodmlld1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RpbWVuc2lvbih2aWV3VHlwZSwgJ2hlaWdodCcpO1xuICAgIH1cbiAgICB2aWV3V2lkdGgodmlld1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RpbWVuc2lvbih2aWV3VHlwZSwgJ3dpZHRoJyk7XG4gICAgfVxuICAgIHZpZXdEaW1lbnNpb24odmlld1R5cGUsIGRpbWVuc2lvbikge1xuICAgICAgICBjb25zdCB2aWV3UHJvcCA9IGRpbWVuc2lvbiA9PT0gJ2hlaWdodCcgPyAnVmlld0hlaWdodCcgOiAnVmlld1dpZHRoJztcbiAgICAgICAgc3dpdGNoICh2aWV3VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLm1vbnRoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2Btb250aCR7dmlld1Byb3B9YF07XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0ueWVhcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tgeWVhciR7dmlld1Byb3B9YF07XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0uZGVjYWRlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2BkZWNhZGUke3ZpZXdQcm9wfWBdO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLmNlbnR1cnk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbYGNlbnR1cnkke3ZpZXdQcm9wfWBdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiYXRjaChjb250ZW50RWxlbWVudCwgYWN0aW9uKSB7XG4gICAgICAgIGlmICghaXNQcmVzZW50KHRoaXMuaG9zdENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBob3N0Q2xvbmUgPSB0aGlzLmhvc3RDb250YWluZXIuY2xvbmVOb2RlKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdENsb25lKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZGVkQ29udGVudCA9IGhvc3RDbG9uZS5hcHBlbmRDaGlsZChjb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICBhY3Rpb24oYXBwZW5kZWRDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChob3N0Q2xvbmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuQ2FsZW5kYXJET01TZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdXBkYXRlID0gKGFyciwgaWR4LCB2YWx1ZSkgPT4gKFtcbiAgICAuLi5hcnIuc2xpY2UoMCwgaWR4ICsgMSksXG4gICAgLi4uKGFyci5zbGljZShpZHggKyAxKS5tYXAoeCA9PiB4ICsgdmFsdWUpKVxuXSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUm93SGVpZ2h0U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IodG90YWwgPSAwLCByb3dIZWlnaHQsIGRldGFpbFJvd0hlaWdodCkge1xuICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gcm93SGVpZ2h0O1xuICAgICAgICB0aGlzLmRldGFpbFJvd0hlaWdodCA9IGRldGFpbFJvd0hlaWdodDtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0cyA9IFtdO1xuICAgICAgICBsZXQgYWdnID0gMDtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdG90YWw7IGlkeCsrKSB7XG4gICAgICAgICAgICB0aGlzLm9mZnNldHMucHVzaChhZ2cpO1xuICAgICAgICAgICAgYWdnICs9IHJvd0hlaWdodDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0cy5wdXNoKHJvd0hlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVpZ2h0KHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlaWdodHNbcm93SW5kZXhdO1xuICAgIH1cbiAgICBleHBhbmREZXRhaWwocm93SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KHJvd0luZGV4KSA9PT0gdGhpcy5yb3dIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUm93SGVpZ2h0KHJvd0luZGV4LCB0aGlzLmRldGFpbFJvd0hlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29sbGFwc2VEZXRhaWwocm93SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KHJvd0luZGV4KSA+IHRoaXMucm93SGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJvd0hlaWdodChyb3dJbmRleCwgdGhpcy5kZXRhaWxSb3dIZWlnaHQgKiAtMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5kZXgocG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9mZnNldHMucmVkdWNlKChwcmV2LCBjdXJyZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmV2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPiBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZHggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgdW5kZWZpbmVkKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTphbGlnblxuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyB0aGlzLnRvdGFsIC0gMSA6IHJlc3VsdDtcbiAgICB9XG4gICAgb2Zmc2V0KHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldHNbcm93SW5kZXhdO1xuICAgIH1cbiAgICB0b3RhbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKTtcbiAgICB9XG4gICAgdXBkYXRlUm93SGVpZ2h0KHJvd0luZGV4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmhlaWdodHNbcm93SW5kZXhdICs9IHZhbHVlO1xuICAgICAgICB0aGlzLm9mZnNldHMgPSB1cGRhdGUodGhpcy5vZmZzZXRzLCByb3dJbmRleCwgdmFsdWUpO1xuICAgIH1cbn1cblxuY29uc3Qgbm9ybWFsaXplID0geCA9PiBNYXRoLm1heCh4LCAwKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTY3JvbGxBY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUGFnZUFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2tpcCkge1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgIH1cbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTY3JvbGxlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNjcm9sbE9ic2VydmFibGUpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxPYnNlcnZhYmxlID0gc2Nyb2xsT2JzZXJ2YWJsZTtcbiAgICAgICAgdGhpcy5maXJzdExvYWRlZCA9IDA7XG4gICAgICAgIHRoaXMuYm90dG9tT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy50b3BPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBjcmVhdGUocm93SGVpZ2h0U2VydmljZSwgc2tpcCwgdGFrZSwgdG90YWwsIHRvcE9mZnNldCA9IDAsIGJvdHRvbU9mZnNldCA9IDAsIGRpcmVjdGlvbiA9ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHRTZXJ2aWNlID0gcm93SGVpZ2h0U2VydmljZTtcbiAgICAgICAgdGhpcy5maXJzdExvYWRlZCA9IHNraXA7XG4gICAgICAgIHRoaXMubGFzdExvYWRlZCA9IHNraXAgKyB0YWtlO1xuICAgICAgICB0aGlzLnRha2UgPSB0YWtlO1xuICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbCA9IDA7XG4gICAgICAgIHRoaXMudG9wT2Zmc2V0ID0gdG9wT2Zmc2V0O1xuICAgICAgICB0aGlzLmJvdHRvbU9mZnNldCA9IGJvdHRvbU9mZnNldDtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdCgyKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QnVmZmVyUm93cyA9IHRoaXMucm93c0ZvckhlaWdodCh0b3BPZmZzZXQpO1xuICAgICAgICBjb25zdCBza2lwV2l0aE9mZnNldCA9IG5vcm1hbGl6ZShza2lwIC0gb2Zmc2V0QnVmZmVyUm93cyk7XG4gICAgICAgIHN1YmplY3QubmV4dChuZXcgU2Nyb2xsQWN0aW9uKHRoaXMucm93T2Zmc2V0KHNraXBXaXRoT2Zmc2V0KSkpO1xuICAgICAgICBpZiAob2Zmc2V0QnVmZmVyUm93cykge1xuICAgICAgICAgICAgc3ViamVjdC5uZXh0KG5ldyBQYWdlQWN0aW9uKHNraXBXaXRoT2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBPYnNlcnZhYmxlLmNyZWF0ZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbiA9IHRoaXMuc2Nyb2xsT2JzZXJ2YWJsZS5zdWJzY3JpYmUoeCA9PiB0aGlzLm9uU2Nyb2xsKHgsIG9ic2VydmVyKSk7XG4gICAgICAgIH0pLnN1YnNjcmliZSh4ID0+IHN1YmplY3QubmV4dCh4KSk7XG4gICAgICAgIHJldHVybiBzdWJqZWN0O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNjcm9sbCh7IHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgb2Zmc2V0SGVpZ2h0LCBvZmZzZXRXaWR0aCB9LCBvYnNlcnZlcikge1xuICAgICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnID8gc2Nyb2xsVG9wIDogc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnID8gb2Zmc2V0SGVpZ2h0IDogb2Zmc2V0V2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmxhc3RTY3JvbGwgPT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXAgPSB0aGlzLmxhc3RTY3JvbGwgPj0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbCA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBjb25zdCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5pbmRleChub3JtYWxpemUoc2Nyb2xsUG9zaXRpb24gLSB0aGlzLnRvcE9mZnNldCkpO1xuICAgICAgICBjb25zdCBsYXN0SXRlbUluZGV4ID0gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLmluZGV4KG5vcm1hbGl6ZShzY3JvbGxQb3NpdGlvbiArIG9mZnNldFNpemUgLSB0aGlzLmJvdHRvbU9mZnNldCkpO1xuICAgICAgICBpZiAoIXVwICYmIGxhc3RJdGVtSW5kZXggPj0gdGhpcy5sYXN0TG9hZGVkICYmIHRoaXMubGFzdExvYWRlZCA8IHRoaXMudG90YWwpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RMb2FkZWQgPSBmaXJzdEl0ZW1JbmRleDtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQobmV3IFNjcm9sbEFjdGlvbih0aGlzLnJvd09mZnNldChmaXJzdEl0ZW1JbmRleCkpKTtcbiAgICAgICAgICAgIHRoaXMubGFzdExvYWRlZCA9IE1hdGgubWluKHRoaXMuZmlyc3RMb2FkZWQgKyB0aGlzLnRha2UsIHRoaXMudG90YWwpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgUGFnZUFjdGlvbih0aGlzLmZpcnN0TG9hZGVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwICYmIGZpcnN0SXRlbUluZGV4IDw9IHRoaXMuZmlyc3RMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblZpc2libGVCdWZmZXIgPSBNYXRoLmZsb29yKHRoaXMudGFrZSAqIDAuMyk7XG4gICAgICAgICAgICB0aGlzLmZpcnN0TG9hZGVkID0gbm9ybWFsaXplKGZpcnN0SXRlbUluZGV4IC0gbm9uVmlzaWJsZUJ1ZmZlcik7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KG5ldyBTY3JvbGxBY3Rpb24odGhpcy5yb3dPZmZzZXQodGhpcy5maXJzdExvYWRlZCkpKTtcbiAgICAgICAgICAgIHRoaXMubGFzdExvYWRlZCA9IE1hdGgubWluKHRoaXMuZmlyc3RMb2FkZWQgKyB0aGlzLnRha2UsIHRoaXMudG90YWwpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgUGFnZUFjdGlvbih0aGlzLmZpcnN0TG9hZGVkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcm93T2Zmc2V0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KGluZGV4KSArIHRoaXMudG9wT2Zmc2V0O1xuICAgIH1cbiAgICByb3dzRm9ySGVpZ2h0KGhlaWdodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKGhlaWdodCAvIHRoaXMucm93SGVpZ2h0U2VydmljZS5oZWlnaHQoMCkpO1xuICAgIH1cbiAgICB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSAgY29tcG9uZW50LXNlbGVjdG9yLXR5cGUgKi9cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBTQ1JPTExFUl9GQUNUT1JZX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdkYXRlaW5wdXRzLXNjcm9sbC1zZXJ2aWNlLWZhY3RvcnknKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBERUZBVUxUX1NDUk9MTEVSX0ZBQ1RPUlkob2JzZXJ2YWJsZSkge1xuICAgIHJldHVybiBuZXcgU2Nyb2xsZXJTZXJ2aWNlKG9ic2VydmFibGUpO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbnZhciBTY3JvbGxEaXJlY3Rpb247XG4oZnVuY3Rpb24gKFNjcm9sbERpcmVjdGlvbikge1xuICAgIFNjcm9sbERpcmVjdGlvbltTY3JvbGxEaXJlY3Rpb25bXCJCYWNrd2FyZFwiXSA9IDBdID0gXCJCYWNrd2FyZFwiO1xuICAgIFNjcm9sbERpcmVjdGlvbltTY3JvbGxEaXJlY3Rpb25bXCJGb3J3YXJkXCJdID0gMV0gPSBcIkZvcndhcmRcIjtcbn0pKFNjcm9sbERpcmVjdGlvbiB8fCAoU2Nyb2xsRGlyZWN0aW9uID0ge30pKTtcbmNvbnN0IEZSQU1FX0RVUkFUSU9OID0gMTc7XG5jb25zdCBzY3JvbGxNb2RpZmllcnMgPSB7XG4gICAgW1Njcm9sbERpcmVjdGlvbi5Gb3J3YXJkXTogKHN0ZXApID0+IHZhbHVlID0+IHZhbHVlICsgc3RlcCxcbiAgICBbU2Nyb2xsRGlyZWN0aW9uLkJhY2t3YXJkXTogKHN0ZXApID0+IHZhbHVlID0+IHZhbHVlIC0gc3RlcFxufTtcbmNvbnN0IHNjcm9sbE5vcm1hbGl6ZXJzID0ge1xuICAgIFtTY3JvbGxEaXJlY3Rpb24uRm9yd2FyZF06IChlbmQpID0+IHZhbHVlID0+IE1hdGgubWluKHZhbHVlLCBlbmQpLFxuICAgIFtTY3JvbGxEaXJlY3Rpb24uQmFja3dhcmRdOiAoZW5kKSA9PiB2YWx1ZSA9PiBNYXRoLm1heCh2YWx1ZSwgZW5kKVxufTtcbmNvbnN0IHNjcm9sbFZhbGlkYXRvcnMgPSB7XG4gICAgW1Njcm9sbERpcmVjdGlvbi5Gb3J3YXJkXTogZW5kID0+IHN0YXJ0ID0+IHN0YXJ0IDwgZW5kLFxuICAgIFtTY3JvbGxEaXJlY3Rpb24uQmFja3dhcmRdOiBlbmQgPT4gc3RhcnQgPT4gc3RhcnQgPiBlbmRcbn07XG5jb25zdCBkaWZmZXJlbmNlVG9TY3JvbGwgPSAoc2Nyb2xsVG9wLCBzdGF0aWNPZmZzZXQsIG1heFNjcm9sbERpZmZlcmVuY2UpID0+IHtcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5hYnMoc3RhdGljT2Zmc2V0IC0gc2Nyb2xsVG9wKSwgbWF4U2Nyb2xsRGlmZmVyZW5jZSk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFZpcnR1YWxpemF0aW9uQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzY3JvbGxlckZhY3RvcnksIGNvbnRhaW5lciwgcmVuZGVyZXIsIHpvbmUpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSAndmVydGljYWwnO1xuICAgICAgICB0aGlzLml0ZW1IZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLml0ZW1XaWR0aCA9IDE7XG4gICAgICAgIHRoaXMudG9wT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5ib3R0b21PZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLm1heFNjcm9sbERpZmZlcmVuY2UgPSAxMDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsT2Zmc2V0U2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsRHVyYXRpb24gPSAxNTA7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLnNjcm9sbGVyID0gc2Nyb2xsZXJGYWN0b3J5KHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgfVxuICAgIGdldCB0b3RhbFZlcnRleExlbmd0aCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt0aGlzLnRvdGFsU2l6ZX1weGA7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHsgaGVpZ2h0OiB2YWx1ZSB9IDogeyB3aWR0aDogdmFsdWUgfTtcbiAgICB9XG4gICAgZ2V0IGNvbnRhaW5lck9mZnNldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnRhaW5lclByb3BlcnR5KHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnID8gJ29mZnNldEhlaWdodCcgOiAnb2Zmc2V0V2lkdGgnKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRhaW5lclNjcm9sbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnRhaW5lclByb3BlcnR5KHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnID8gJ3Njcm9sbEhlaWdodCcgOiAnc2Nyb2xsV2lkdGgnKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRhaW5lclNjcm9sbFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250YWluZXJQcm9wZXJ0eSh0aGlzLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnKTtcbiAgICB9XG4gICAgZ2V0IHdyYXBwZXJDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGhvcml6b250YWxDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uIHx8IGNoYW5nZXMudGFrZSB8fCBjaGFuZ2VzLnRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRTZXJ2aWNlcygpO1xuICAgICAgICAgICAgdGhpcy50b3RhbFNpemUgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2UudG90YWxIZWlnaHQoKSArIHRoaXMuYm90dG9tT2Zmc2V0O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMucm93SGVpZ2h0U2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHRTZXJ2aWNlID0gdGhpcy5jcmVhdGVSb3dIZWlnaHRTZXJ2aWNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbCQoKVxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXZlbnQpID0+IGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIubmV4dCh0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRBY3RpdmVJbmRleCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lclNjcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q29udGFpbmVyUHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50W3Byb3BlcnR5TmFtZV07XG4gICAgfVxuICAgIGFjdGl2ZUluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtSW5kZXgoTWF0aC5jZWlsKHRoaXMuY29udGFpbmVyU2Nyb2xsUG9zaXRpb24pKTsgLy9oYW5kbGUgc3VicGl4ZWxpbmdcbiAgICB9XG4gICAgaXRlbUluZGV4KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLmluZGV4KG9mZnNldCk7XG4gICAgfVxuICAgIGl0ZW1PZmZzZXQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93SGVpZ2h0U2VydmljZS5vZmZzZXQoaW5kZXgpO1xuICAgIH1cbiAgICBpc0luZGV4VmlzaWJsZShpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMucm93SGVpZ2h0U2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclRvcCA9IHRoaXMuY29udGFpbmVyU2Nyb2xsUG9zaXRpb247XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckJvdHRvbSA9IGNvbnRhaW5lclRvcCArIHRoaXMuY29udGFpbmVyT2Zmc2V0U2l6ZTtcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLm9mZnNldChpbmRleCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIHRoaXMucm93SGVpZ2h0U2VydmljZS5oZWlnaHQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gdG9wID49IGNvbnRhaW5lclRvcCAmJiBib3R0b20gPD0gY29udGFpbmVyQm90dG9tO1xuICAgIH1cbiAgICBpc0xpc3RTY3JvbGxlZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJTY3JvbGxQb3NpdGlvbiAhPT0gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLm9mZnNldChpbmRleCk7XG4gICAgfVxuICAgIHNjcm9sbFRvKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbFByb3BlcnR5ID0gdGhpcy5kaXJlY3Rpb24gPT09IFwidmVydGljYWxcIiA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHNjcm9sbFByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgLy9YWFg6IHNjcm9sbGluZyB3aXRoIHRpY2sgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsaXN0IGp1bXAgaW4gQ2hyb21lLlxuICAgICAgICAvL09yaWdpbmFsIGlzc3VlOiBmb2N1cyBmaXJzdCBkYXkgaW4gdGhlIG1vbnRoIGFuZCBwcmVzcyBMRUZUIGFycm93LlxuICAgICAgICAvL05vdGljZSBob3cgdGhlIHZpZXcganVtcHMgb24gZXZlcnkgZGF5IGNoYW5nZS5cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5yb3dIZWlnaHRTZXJ2aWNlLm9mZnNldChpbmRleCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzY3JvbGxUb0JvdHRvbSgpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUbyh0aGlzLnRvdGFsU2l6ZSk7XG4gICAgfVxuICAgIGFuaW1hdGVUb0luZGV4KGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleE9mZnNldCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5vZmZzZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmdldENvbnRhaW5lclNjcm9sbERpcmVjdGlvbihpbmRleE9mZnNldCk7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5zY3JvbGxSYW5nZShpbmRleE9mZnNldCwgZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5zY3JvbGxTdGVwKHN0YXJ0LCBlbmQpO1xuICAgICAgICBjb25zdCBtb2RpZnlTY3JvbGwgPSBzY3JvbGxNb2RpZmllcnNbZGlyZWN0aW9uXShzdGVwKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplU2Nyb2xsID0gc2Nyb2xsTm9ybWFsaXplcnNbZGlyZWN0aW9uXShlbmQpO1xuICAgICAgICBjb25zdCBpc1Njcm9sbFZhbGlkID0gc2Nyb2xsVmFsaWRhdG9yc1tkaXJlY3Rpb25dKG1vZGlmeVNjcm9sbChlbmQpKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uU3Vic2NyaXB0aW9uID1cbiAgICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KG9mKHN0YXJ0KSwgaW50ZXJ2YWwoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIpKS5waXBlKG1hcChzdHJlYW0gPT4gc3RyZWFtWzBdKSwgc2Nhbihtb2RpZnlTY3JvbGwpLCB0YWtlV2hpbGUoaXNTY3JvbGxWYWxpZCksIG1hcChub3JtYWxpemVTY3JvbGwpKS5zdWJzY3JpYmUoKHgpID0+IHRoaXMuc2Nyb2xsVG8oeCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2Nyb2xsUmFuZ2UoaW5kZXhPZmZzZXQsIGRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBjb250YWluZXJTY3JvbGwgPSB0aGlzLmNvbnRhaW5lclNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZiAocGFyc2VJbnQoaW5kZXhPZmZzZXQsIDEwKSA9PT0gcGFyc2VJbnQoY29udGFpbmVyU2Nyb2xsLCAxMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBpbmRleE9mZnNldCwgZW5kOiBpbmRleE9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHRoaXMuY29udGFpbmVyTWF4U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHNpZ24gPSBkaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5CYWNrd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2VUb1Njcm9sbChjb250YWluZXJTY3JvbGwsIGluZGV4T2Zmc2V0LCB0aGlzLm1heFNjcm9sbERpZmZlcmVuY2UpO1xuICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihpbmRleE9mZnNldCwgbWF4U2Nyb2xsKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChlbmQgKyAoc2lnbiAqIGRpZmZlcmVuY2UpLCAwKSwgbWF4U2Nyb2xsKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH1cbiAgICBzY3JvbGxTdGVwKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAvICh0aGlzLnNjcm9sbER1cmF0aW9uIC8gRlJBTUVfRFVSQVRJT04pO1xuICAgIH1cbiAgICBzY3JvbGwkKCkge1xuICAgICAgICByZXR1cm4gaXNEb2N1bWVudEF2YWlsYWJsZSgpID8gZnJvbUV2ZW50KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKSA6IEVNUFRZO1xuICAgIH1cbiAgICBpbml0U2VydmljZXMoKSB7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0U2VydmljZSA9IHRoaXMuY3JlYXRlUm93SGVpZ2h0U2VydmljZSgpO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbGVyXG4gICAgICAgICAgICAuY3JlYXRlKHRoaXMucm93SGVpZ2h0U2VydmljZSwgdGhpcy5za2lwLCB0aGlzLnRha2UsIHRoaXMudG90YWwsIHRoaXMudG9wT2Zmc2V0LCB0aGlzLnNjcm9sbE9mZnNldFNpemUsIHRoaXMuZGlyZWN0aW9uKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBQYWdlQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoYW5nZS5lbWl0KHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlUm93SGVpZ2h0U2VydmljZSgpIHtcbiAgICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcgPyB0aGlzLml0ZW1IZWlnaHQgOiB0aGlzLml0ZW1XaWR0aDtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3dIZWlnaHRTZXJ2aWNlKHRoaXMudG90YWwsIGRpbWVuc2lvbiwgMCk7XG4gICAgfVxuICAgIGVtaXRBY3RpdmVJbmRleCgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJvd0hlaWdodFNlcnZpY2UuaW5kZXgodGhpcy5jb250YWluZXJTY3JvbGxQb3NpdGlvbiAtIHRoaXMudG9wT2Zmc2V0KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdEFjdGl2ZUluZGV4ICE9PSBpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXhDaGFuZ2UuZW1pdChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udGFpbmVyTWF4U2Nyb2xsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJTY3JvbGxTaXplIC0gdGhpcy5jb250YWluZXJPZmZzZXRTaXplO1xuICAgIH1cbiAgICBnZXRDb250YWluZXJTY3JvbGxEaXJlY3Rpb24oaW5kZXhPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4T2Zmc2V0IDwgdGhpcy5jb250YWluZXJTY3JvbGxQb3NpdGlvbiA/IFNjcm9sbERpcmVjdGlvbi5CYWNrd2FyZCA6IFNjcm9sbERpcmVjdGlvbi5Gb3J3YXJkO1xuICAgIH1cbn1cblZpcnR1YWxpemF0aW9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogU0NST0xMRVJfRkFDVE9SWV9UT0tFTixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBERUZBVUxUX1NDUk9MTEVSX0ZBQ1RPUllcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby12aXJ0dWFsaXphdGlvbicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImstc2Nyb2xsYWJsZS1wbGFjZWhvbGRlclwiXG4gICAgICAgIFtjbGFzcy5rLXNjcm9sbGFibGUtaG9yaXpvbnRhbC1wbGFjZWhvbGRlcl09XCJkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInRvdGFsVmVydGV4TGVuZ3RoXCJcbiAgICA+PC9kaXY+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVmlydHVhbGl6YXRpb25Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW1NDUk9MTEVSX0ZBQ1RPUllfVE9LRU4sXSB9XSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcblZpcnR1YWxpemF0aW9uQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbUhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbVdpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3BPZmZzZXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGJvdHRvbU9mZnNldDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4U2Nyb2xsRGlmZmVyZW5jZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2Nyb2xsT2Zmc2V0U2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2Nyb2xsRHVyYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNraXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRha2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRvdGFsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVJbmRleENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHBhZ2VDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBzY3JvbGxDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICB3cmFwcGVyQ2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jb250ZW50JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zY3JvbGxhYmxlJyxdIH1dLFxuICAgIGhvcml6b250YWxDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zY3JvbGxhYmxlLWhvcml6b250YWwnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjbG9zZXN0SW5TY29wZSA9IChub2RlLCBwcmVkaWNhdGUsIHNjb3BlKSA9PiB7XG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gc2NvcGUgJiYgIXByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICBpZiAobm9kZSAhPT0gc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjbG9zZXN0ID0gKG5vZGUsIHByZWRpY2F0ZSkgPT4ge1xuICAgIHdoaWxlIChub2RlICYmICFwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSAgY29tcG9uZW50LXNlbGVjdG9yLXR5cGUgKi9cbmNvbnN0IElURU1TX0NPVU5UID0gMzA7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTmF2aWdhdGlvbkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoYnVzLCBkb20sIGludGwsIGNkciwgcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm1pbiA9IG5ldyBEYXRlKE1JTl9EQVRFKTtcbiAgICAgICAgdGhpcy5tYXggPSBuZXcgRGF0ZShNQVhfREFURSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy50YWtlID0gSVRFTVNfQ09VTlQ7XG4gICAgICAgIHRoaXMuaW5kZXhUb1Njcm9sbCA9IC0xO1xuICAgIH1cbiAgICBnZXQgZ2V0Q29tcG9uZW50Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kb20uZW5zdXJlSGVpZ2h0cygpO1xuICAgICAgICBjb25zdCBjYWxlbmRhckhlaWdodCA9IHRoaXMuZG9tLmNhbGVuZGFySGVpZ2h0O1xuICAgICAgICB0aGlzLml0ZW1IZWlnaHQgPSB0aGlzLmRvbS5uYXZpZ2F0aW9uSXRlbUhlaWdodDtcbiAgICAgICAgdGhpcy5tYXhWaWV3SGVpZ2h0ID0gdGhpcy5kb20ubW9udGhWaWV3SGVpZ2h0O1xuICAgICAgICB0aGlzLnRvcE9mZnNldCA9IChjYWxlbmRhckhlaWdodCAtIHRoaXMuaXRlbUhlaWdodCkgLyAyO1xuICAgICAgICB0aGlzLmJvdHRvbU9mZnNldCA9IGNhbGVuZGFySGVpZ2h0IC0gdGhpcy5pdGVtSGVpZ2h0O1xuICAgICAgICB0aGlzLmludGxTdWJzY3JpcHRpb24gPSB0aGlzLmludGwuY2hhbmdlcy5zdWJzY3JpYmUodGhpcy5pbnRsQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHRoaXMuYnVzLnNlcnZpY2UodGhpcy5hY3RpdmVWaWV3KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZVZpZXdWYWx1ZSA9IENhbGVuZGFyVmlld0VudW1bdGhpcy5hY3RpdmVWaWV3XTtcbiAgICAgICAgY29uc3Qgdmlld0RhdGUgPSBkYXRlSW5SYW5nZSh0aGlzLmZvY3VzZWREYXRlLCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuc2VydmljZS50b3RhbCh0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICBjb25zdCB0b3RhbENoYW5nZWQgPSB0aGlzLnRvdGFsICYmIHRoaXMudG90YWwgIT09IHRvdGFsO1xuICAgICAgICB0aGlzLnNraXAgPSB0aGlzLnNlcnZpY2Uuc2tpcCh2aWV3RGF0ZSwgdGhpcy5taW4pO1xuICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XG4gICAgICAgIGlmICh0b3RhbENoYW5nZWQgfHwgIXRoaXMuc2VydmljZS5pc0luQXJyYXkodmlld0RhdGUsIHRoaXMuZGF0ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVzID0gdGhpcy5zZXJ2aWNlLmRhdGVzTGlzdCh2aWV3RGF0ZSwgdGhpcy5nZXRUYWtlKHRoaXMuc2tpcCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIWNoYW5nZXMuZm9jdXNlZERhdGUgfHwgdG90YWxDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4VG9TY3JvbGwgPSB0aGlzLnNlcnZpY2Uuc2tpcCh0aGlzLmZvY3VzZWREYXRlLCB0aGlzLm1pbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmludGxTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaW50bFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhUb1Njcm9sbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpcnR1YWxpemF0aW9uLnNjcm9sbFRvSW5kZXgodGhpcy5pbmRleFRvU2Nyb2xsKTtcbiAgICAgICAgdGhpcy5pbmRleFRvU2Nyb2xsID0gLTE7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhUb1Njcm9sbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpcnR1YWxpemF0aW9uLnNjcm9sbFRvSW5kZXgodGhpcy5pbmRleFRvU2Nyb2xsKTtcbiAgICAgICAgdGhpcy5pbmRleFRvU2Nyb2xsID0gLTE7XG4gICAgfVxuICAgIG9uUGFnZUNoYW5nZSh7IHNraXAgfSkge1xuICAgICAgICB0aGlzLmRhdGVzID0gdGhpcy5zZXJ2aWNlLmRhdGVzTGlzdCh0aGlzLnNlcnZpY2UuYWRkVG9EYXRlKHRoaXMubWluLCBza2lwKSwgdGhpcy5nZXRUYWtlKHNraXApKTtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gICAgc2Nyb2xsQ2hhbmdlKHsgb2Zmc2V0IH0pIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmxpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlID0gYHRyYW5zbGF0ZVkoJHtvZmZzZXR9cHgpYDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWwsICctbXMtdHJhbnNmb3JtJywgdHJhbnNsYXRlKTtcbiAgICB9XG4gICAgaGFuZGxlRGF0ZUNoYW5nZShhcmdzKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbG9zZXN0SW5TY29wZShhcmdzLnRhcmdldCwgbm9kZSA9PiBub2RlLmhhc0F0dHJpYnV0ZSgnZGF0YS1kYXRlLWluZGV4JyksIHRoaXMubGlzdC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZS1pbmRleCcpLCAxMCk7XG4gICAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmRhdGVzW2luZGV4XTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjbG9uZURhdGUoY2FuZGlkYXRlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0VGFrZShza2lwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsIC0gc2tpcCwgdGhpcy50YWtlKTtcbiAgICB9XG4gICAgaW50bENoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVmlldyA9PT0gQ2FsZW5kYXJWaWV3RW51bS5tb250aCkge1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5OYXZpZ2F0aW9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jYWxlbmRhci1uYXZpZ2F0aW9uJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgIDxzcGFuIGNsYXNzPVwiay1jYWxlbmRhci1uYXZpZ2F0aW9uLWhpZ2hsaWdodFwiPjwvc3Bhbj5cbiAgICA8a2VuZG8tdmlydHVhbGl6YXRpb25cbiAgICAgICAgW3NraXBdPVwic2tpcFwiXG4gICAgICAgIFt0YWtlXT1cInRha2VcIlxuICAgICAgICBbdG90YWxdPVwidG90YWxcIlxuICAgICAgICBbaXRlbUhlaWdodF09XCJpdGVtSGVpZ2h0XCJcbiAgICAgICAgW3RvcE9mZnNldF09XCJ0b3BPZmZzZXRcIlxuICAgICAgICBbYm90dG9tT2Zmc2V0XT1cImJvdHRvbU9mZnNldFwiXG4gICAgICAgIFttYXhTY3JvbGxEaWZmZXJlbmNlXT1cIm1heFZpZXdIZWlnaHRcIlxuICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzY3JvbGxDaGFuZ2UpPVwic2Nyb2xsQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICAgICAgPHVsICNsaXN0IGNsYXNzPVwiay1yZXNldFwiIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cInsgY2xpY2s6IGhhbmRsZURhdGVDaGFuZ2UgfVwiIFtzY29wZV09XCJ0aGlzXCI+XG4gICAgICAgICAgICA8bGkgKmtGb3I9XCJsZXQgZGF0ZSBvZiBkYXRlczsgbGV0IGluZGV4PWluZGV4XCIgW2F0dHIuZGF0YS1kYXRlLWluZGV4XT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzLmstY2FsZW5kYXItbmF2aWdhdGlvbi1tYXJrZXJdPVwic2VydmljZS5pc1JhbmdlU3RhcnQoZGF0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiF0ZW1wbGF0ZVJlZlwiPnt7c2VydmljZS5uYXZpZ2F0aW9uVGl0bGUoZGF0ZSl9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nSWZdPVwidGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBzZXJ2aWNlLm5hdmlnYXRpb25UaXRsZShkYXRlKSwgYWN0aXZlVmlldzogYWN0aXZlVmlld1ZhbHVlLCBkYXRlOiBkYXRlIH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgIDwva2VuZG8tdmlydHVhbGl6YXRpb24+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTmF2aWdhdGlvbkNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEJ1c1ZpZXdTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDYWxlbmRhckRPTVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEludGxTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH1cbl07XG5OYXZpZ2F0aW9uQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGFjdGl2ZVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb2N1c2VkRGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcGFnZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHZpcnR1YWxpemF0aW9uOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtWaXJ0dWFsaXphdGlvbkNvbXBvbmVudCxdIH1dLFxuICAgIGxpc3Q6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydsaXN0JywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGdldENvbXBvbmVudENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci1uYXZpZ2F0aW9uXCIsXSB9XVxufTtcblxuY29uc3QgVklFV1NfQ09VTlQgPSA1O1xuY29uc3QgaXNFcXVhbE1vbnRoWWVhciA9IChkYXRlMSwgZGF0ZTIpID0+IChkYXRlMSAmJiBkYXRlMiAmJlxuICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcbiAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBWaWV3TGlzdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoYnVzLCBjZHIsIGludGwsIGRvbSwgcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5taW4gPSBuZXcgRGF0ZShNSU5fREFURSk7XG4gICAgICAgIHRoaXMubWF4ID0gbmV3IERhdGUoTUFYX0RBVEUpO1xuICAgICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5kYXRlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbHMgPSBbXTtcbiAgICAgICAgdGhpcy53ZWVrTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy50YWtlID0gVklFV1NfQ09VTlQ7XG4gICAgICAgIHRoaXMuYW5pbWF0ZVRvSW5kZXggPSB0cnVlO1xuICAgICAgICB0aGlzLmluZGV4VG9TY3JvbGwgPSAtMTtcbiAgICAgICAgdGhpcy5taW5WaWV3c1RvUmVuZGVyID0gMTtcbiAgICB9XG4gICAgZ2V0IHdlZWtOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dXZWVrTnVtYmVycyAmJiB0aGlzLmlzTW9udGhWaWV3KCk7XG4gICAgfVxuICAgIHNldCB3ZWVrTnVtYmVyKHNob3dXZWVrTnVtYmVycykge1xuICAgICAgICB0aGlzLnNob3dXZWVrTnVtYmVycyA9IHNob3dXZWVrTnVtYmVycztcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudE1vbnRoQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXcgPT09IENhbGVuZGFyVmlld0VudW0ubW9udGg7XG4gICAgfVxuICAgIGdldCBnZXRDb21wb25lbnRZZWFyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXcgPT09IENhbGVuZGFyVmlld0VudW0ueWVhcjtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudERlY2FkZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVWaWV3ID09PSBDYWxlbmRhclZpZXdFbnVtLmRlY2FkZTtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudENlbnR1cnlDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlldyA9PT0gQ2FsZW5kYXJWaWV3RW51bS5jZW50dXJ5O1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy53ZWVrTmFtZXMgPSB0aGlzLmdldFdlZWtOYW1lcygpO1xuICAgICAgICB0aGlzLmJvdHRvbU9mZnNldCA9IHRoaXMuZ2V0Qm90dG9tT2Zmc2V0KCk7XG4gICAgICAgIHRoaXMudmlld09mZnNldCA9IC0xICogdGhpcy5kb20uaGVhZGVySGVpZ2h0O1xuICAgICAgICB0aGlzLnZpZXdIZWlnaHQgPSB0aGlzLmRvbS52aWV3SGVpZ2h0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIHRoaXMuaW50bFN1YnNjcmlwdGlvbiA9IHRoaXMuaW50bC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmludGxDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gdGhpcy5idXMuc2VydmljZSh0aGlzLmFjdGl2ZVZpZXcpO1xuICAgICAgICBpZiAoIXRoaXMuc2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29scyA9IG5ldyBBcnJheSh0aGlzLnNlcnZpY2Uucm93TGVuZ3RoKHRoaXMud2Vla051bWJlcikpLmZpbGwoJycpO1xuICAgICAgICB0aGlzLmNvbFdpZHRoID0gTWF0aC5yb3VuZCgxMDAgLyB0aGlzLmNvbHMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy53ZWVrTmFtZXMgPSBoYXNDaGFuZ2UoY2hhbmdlcywgJ3dlZWtOdW1iZXInKSAmJiB0aGlzLndlZWtOdW1iZXIgPyB0aGlzLmdldFdlZWtOYW1lcygpIDogdGhpcy53ZWVrTmFtZXM7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVZpZXdDaGFuZ2VkID0gaGFzQ2hhbmdlKGNoYW5nZXMsICdhY3RpdmVWaWV3Jyk7XG4gICAgICAgIGNvbnN0IGZvY3VzZWREYXRlID0gdGhpcy5mb2N1c2VkRGF0ZTtcbiAgICAgICAgY29uc3Qgdmlld0RhdGUgPSBkYXRlSW5SYW5nZSh0aGlzLnNlcnZpY2Uudmlld0RhdGUoZm9jdXNlZERhdGUsIHRoaXMubWF4LCB0aGlzLm1pblZpZXdzVG9SZW5kZXIpLCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuc2VydmljZS50b3RhbCh0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICBjb25zdCB0b3RhbENoYW5nZWQgPSB0aGlzLnRvdGFsICYmIHRoaXMudG90YWwgIT09IHRvdGFsO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZURhdGVzID0gdG90YWxDaGFuZ2VkIHx8ICF0aGlzLnNlcnZpY2UuaXNJbkFycmF5KGZvY3VzZWREYXRlLCB0aGlzLmRhdGVzKTtcbiAgICAgICAgdGhpcy5za2lwID0gdGhpcy5zZXJ2aWNlLnNraXAodmlld0RhdGUsIHRoaXMubWluKTtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLmFuaW1hdGVUb0luZGV4ID0gIWFjdGl2ZVZpZXdDaGFuZ2VkO1xuICAgICAgICB0aGlzLmJvdHRvbU9mZnNldCA9IHRoaXMuZ2V0Qm90dG9tT2Zmc2V0KCk7XG4gICAgICAgIHRoaXMudmlld0hlaWdodCA9IHRoaXMuZG9tLnZpZXdIZWlnaHQodGhpcy5hY3RpdmVWaWV3KTtcbiAgICAgICAgaWYgKGdlbmVyYXRlRGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZXMgPSB0aGlzLnNlcnZpY2UuZGF0ZXNMaXN0KHZpZXdEYXRlLCB0aGlzLmdldFRha2UodGhpcy5za2lwKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsTW9udGhZZWFyKHRoaXMuYWN0aXZlRGF0ZSwgZm9jdXNlZERhdGUpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBjbG9uZURhdGUoZm9jdXNlZERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZUluZGV4ID0gaGFzQ2hhbmdlKGNoYW5nZXMsICdmb2N1c2VkRGF0ZScpIHx8IGFjdGl2ZVZpZXdDaGFuZ2VkO1xuICAgICAgICBpZiAoZ2VuZXJhdGVEYXRlcyB8fCB1cGRhdGVJbmRleCB8fCB0aGlzLnZpcnR1YWxpemF0aW9uLmlzSW5kZXhWaXNpYmxlKHRoaXMuc2tpcCkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhUb1Njcm9sbCA9IHRoaXMuc2VydmljZS5za2lwKGZvY3VzZWREYXRlLCB0aGlzLm1pbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmludGxTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaW50bFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhUb1Njcm9sbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpcnR1YWxpemF0aW9uLnNjcm9sbFRvSW5kZXgodGhpcy5pbmRleFRvU2Nyb2xsKTtcbiAgICAgICAgdGhpcy5pbmRleFRvU2Nyb2xsID0gLTE7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhUb1Njcm9sbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpcnR1YWxpemF0aW9uW3RoaXMuYW5pbWF0ZVRvSW5kZXggPyAnYW5pbWF0ZVRvSW5kZXgnIDogJ3Njcm9sbFRvSW5kZXgnXSh0aGlzLmluZGV4VG9TY3JvbGwpO1xuICAgICAgICB0aGlzLmFuaW1hdGVUb0luZGV4ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbmRleFRvU2Nyb2xsID0gLTE7XG4gICAgfVxuICAgIG9uUGFnZUNoYW5nZSh7IHNraXAgfSkge1xuICAgICAgICB0aGlzLmRhdGVzID0gdGhpcy5zZXJ2aWNlLmRhdGVzTGlzdCh0aGlzLnNlcnZpY2UuYWRkVG9EYXRlKHRoaXMubWluLCBza2lwKSwgdGhpcy5nZXRUYWtlKHNraXApKTtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gICAgc2Nyb2xsQ2hhbmdlKHsgb2Zmc2V0IH0pIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmxpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlID0gYHRyYW5zbGF0ZVkoJHtvZmZzZXR9cHgpYDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWwsICctbXMtdHJhbnNmb3JtJywgdHJhbnNsYXRlKTtcbiAgICB9XG4gICAgc2V0QWN0aXZlRGF0ZShpbmRleCkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLnNlcnZpY2UuYWRkVG9EYXRlKHRoaXMubWluLCBpbmRleCk7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMuYWN0aXZlRGF0ZSwgY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGNhbmRpZGF0ZTtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlQ2hhbmdlLmVtaXQoY2FuZGlkYXRlKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICBoYW5kbGVEYXRlQ2hhbmdlKGNhbmRpZGF0ZSkge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgaXNNb250aFZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXcgPT09IENhbGVuZGFyVmlld0VudW0ubW9udGg7XG4gICAgfVxuICAgIGlzU2Nyb2xsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxpemF0aW9uLmlzTGlzdFNjcm9sbGVkKHRoaXMuc2VydmljZS5za2lwKHRoaXMuZm9jdXNlZERhdGUsIHRoaXMubWluKSk7XG4gICAgfVxuICAgIGdldEJvdHRvbU9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsYWJsZUhlaWdodCgpIC0gdGhpcy5kb20udmlld0hlaWdodCh0aGlzLmFjdGl2ZVZpZXcpO1xuICAgIH1cbiAgICBnZXRTY3JvbGxhYmxlSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVWaWV3ID09PSBDYWxlbmRhclZpZXdFbnVtLm1vbnRoID9cbiAgICAgICAgICAgIHRoaXMuZG9tLnNjcm9sbGFibGVDb250ZW50SGVpZ2h0IDpcbiAgICAgICAgICAgIHRoaXMuZG9tLnNjcm9sbGFibGVZZWFyQ29udGVudEhlaWdodDtcbiAgICB9XG4gICAgZ2V0VGFrZShza2lwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsIC0gc2tpcCwgdGhpcy50YWtlKTtcbiAgICB9XG4gICAgZ2V0V2Vla05hbWVzKCkge1xuICAgICAgICBjb25zdCB3ZWVrTmFtZXMgPSBzaGlmdFdlZWtOYW1lcyh0aGlzLmludGwuZGF0ZUZvcm1hdE5hbWVzKHsgbmFtZVR5cGU6ICdzaG9ydCcsIHR5cGU6ICdkYXlzJyB9KSwgdGhpcy5pbnRsLmZpcnN0RGF5KCkpO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrTnVtYmVyID8gWycnXS5jb25jYXQod2Vla05hbWVzKSA6IHdlZWtOYW1lcztcbiAgICB9XG4gICAgaW50bENoYW5nZSgpIHtcbiAgICAgICAgdGhpcy53ZWVrTmFtZXMgPSB0aGlzLmdldFdlZWtOYW1lcygpO1xuICAgICAgICBpZiAodGhpcy5pc01vbnRoVmlldygpKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblZpZXdMaXN0Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jYWxlbmRhci12aWV3bGlzdCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8a2VuZG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgIFtjdXJyZW50RGF0ZV09XCJhY3RpdmVEYXRlXCJcbiAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIlxuICAgICAgICBbdGVtcGxhdGVSZWZdPVwiaGVhZGVyVGl0bGVUZW1wbGF0ZVJlZlwiXG4gICAgICAgICh0b2RheSk9XCJoYW5kbGVEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8L2tlbmRvLWNhbGVuZGFyLWhlYWRlcj5cbiAgICA8dGFibGUgY2xhc3M9XCJrLWNhbGVuZGFyLXdlZWtkYXlzXCIgc3R5bGU9XCJ0YWJsZS1sYXlvdXQ6IGF1dG87XCIgKm5nSWY9XCJpc01vbnRoVmlldygpXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IG5hbWUgb2Ygd2Vla05hbWVzXCIgW3N0eWxlLndpZHRoLiVdPVwiY29sV2lkdGhcIj57e25hbWV9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgIDwvdGFibGU+XG4gICAgPGtlbmRvLXZpcnR1YWxpemF0aW9uXG4gICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgIFtza2lwXT1cInNraXBcIlxuICAgICAgICBbdGFrZV09XCJ0YWtlXCJcbiAgICAgICAgW3RvdGFsXT1cInRvdGFsXCJcbiAgICAgICAgW2l0ZW1IZWlnaHRdPVwidmlld0hlaWdodFwiXG4gICAgICAgIFt0b3BPZmZzZXRdPVwidmlld09mZnNldFwiXG4gICAgICAgIFtib3R0b21PZmZzZXRdPVwiYm90dG9tT2Zmc2V0XCJcbiAgICAgICAgW3Njcm9sbE9mZnNldFNpemVdPVwidmlld09mZnNldFwiXG4gICAgICAgIFttYXhTY3JvbGxEaWZmZXJlbmNlXT1cInZpZXdIZWlnaHRcIlxuICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzY3JvbGxDaGFuZ2UpPVwic2Nyb2xsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoYWN0aXZlSW5kZXhDaGFuZ2UpPVwic2V0QWN0aXZlRGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8dGFibGUgI2xpc3Q+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+PGNvbCAqbmdGb3I9XCJsZXQgXyBvZiBjb2xzXCIgLz48L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGJvZHkgKmtGb3I9XCJsZXQgZGF0ZSBvZiBkYXRlc1wiXG4gICAgICAgICAgICAgICAgICAga2VuZG9DYWxlbmRhclZpZXdcbiAgICAgICAgICAgICAgICAgICByb2xlPVwicm93Z3JvdXBcIlxuICAgICAgICAgICAgICAgICAgIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIlxuICAgICAgICAgICAgICAgICAgIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIiBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICAgICAgICAgW2NlbGxVSURdPVwiY2VsbFVJRFwiXG4gICAgICAgICAgICAgICAgICAgW2ZvY3VzZWREYXRlXT1cImZvY3VzZWREYXRlXCJcbiAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICBbd2Vla051bWJlcl09XCJ3ZWVrTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVSZWZdPVwiY2VsbFRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICBbd2Vla051bWJlclRlbXBsYXRlUmVmXT1cIndlZWtOdW1iZXJUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgW3ZpZXdEYXRlXT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwva2VuZG8tdmlydHVhbGl6YXRpb24+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVmlld0xpc3RDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBCdXNWaWV3U2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IEludGxTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDYWxlbmRhckRPTVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9XG5dO1xuVmlld0xpc3RDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyVGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhlYWRlclRpdGxlVGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGl2ZVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNlbGxVSUQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvY3VzZWREYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpc0FjdGl2ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVEYXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBwYWdlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdmlydHVhbGl6YXRpb246IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1ZpcnR1YWxpemF0aW9uQ29tcG9uZW50LF0gfV0sXG4gICAgbGlzdDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2xpc3QnLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAgZ2V0Q29tcG9uZW50Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWNhbGVuZGFyLXZpZXdcIixdIH1dLFxuICAgIGdldENvbXBvbmVudE1vbnRoQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWNhbGVuZGFyLW1vbnRodmlld1wiLF0gfV0sXG4gICAgZ2V0Q29tcG9uZW50WWVhckNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci15ZWFydmlld1wiLF0gfV0sXG4gICAgZ2V0Q29tcG9uZW50RGVjYWRlQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWNhbGVuZGFyLWRlY2FkZXZpZXdcIixdIH1dLFxuICAgIGdldENvbXBvbmVudENlbnR1cnlDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFtcImNsYXNzLmstY2FsZW5kYXItY2VudHVyeXZpZXdcIixdIH1dXG59O1xuXG5jb25zdCBLRVlfVE9fQUNUSU9OID0ge1xuICAgICczMyc6IEFjdGlvbi5QcmV2VmlldyxcbiAgICAnMzQnOiBBY3Rpb24uTmV4dFZpZXcsXG4gICAgJzM1JzogQWN0aW9uLkxhc3RJblZpZXcsXG4gICAgJzM2JzogQWN0aW9uLkZpcnN0SW5WaWV3LFxuICAgICczNyc6IEFjdGlvbi5MZWZ0LFxuICAgICczOCc6IEFjdGlvbi5VcCxcbiAgICAnMzknOiBBY3Rpb24uUmlnaHQsXG4gICAgJzQwJzogQWN0aW9uLkRvd24sXG4gICAgJ21ldGErMzgnOiBBY3Rpb24uVXBwZXJWaWV3LFxuICAgICdtZXRhKzQwJzogQWN0aW9uLkxvd2VyVmlld1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBOYXZpZ2F0aW9uU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoYnVzKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgIH1cbiAgICBhY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gYCR7ZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5ID8gJ21ldGErJyA6ICcnfSR7ZXZlbnQua2V5Q29kZX1gO1xuICAgICAgICByZXR1cm4gS0VZX1RPX0FDVElPTlthY3Rpb25dO1xuICAgIH1cbiAgICBtb3ZlKHZhbHVlLCBhY3Rpb24sIGFjdGl2ZVZpZXcpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuYnVzLnNlcnZpY2UoYWN0aXZlVmlldyk7XG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb24gPT09IEFjdGlvbi5VcHBlclZpZXcgJiYgdGhpcy5idXMuY2FuTW92ZVVwKGFjdGl2ZVZpZXcpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1cy5tb3ZlVXAoYWN0aXZlVmlldyk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gQWN0aW9uLkxvd2VyVmlldyAmJiB0aGlzLmJ1cy5jYW5Nb3ZlRG93bihhY3RpdmVWaWV3KSkge1xuICAgICAgICAgICAgdGhpcy5idXMubW92ZURvd24oYWN0aXZlVmlldyk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcnZpY2UubW92ZSh2YWx1ZSwgYWN0aW9uKTtcbiAgICB9XG59XG5OYXZpZ2F0aW9uU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTmF2aWdhdGlvblNlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBCdXNWaWV3U2VydmljZSB9XG5dO1xuXG5jb25zdCBkaXZpZGVCeU1hZ25pdHVkZSA9IChtYWduaXR1ZGUpID0+IHggPT4gTWF0aC5mbG9vcih4IC8gbWFnbml0dWRlKTtcbmNvbnN0IHBvd2VyQnlNYWduaXR1ZGUgPSAobWFnbml0dWRlKSA9PiB4ID0+IHggKiBtYWduaXR1ZGU7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2Nyb2xsU3luY1NlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGRvbSwgem9uZSkge1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICB9XG4gICAgY29uZmlndXJlKGFjdGl2ZVZpZXcpIHtcbiAgICAgICAgY29uc3QgbWFnbml0dWRlID0gTWF0aC5tYXgodGhpcy5kb20udmlld0hlaWdodChhY3RpdmVWaWV3KSAvIHRoaXMuZG9tLm5hdmlnYXRpb25JdGVtSGVpZ2h0LCAxKTtcbiAgICAgICAgdGhpcy5kaXZpZGVCeU1hZ25pdHVkZSA9IGRpdmlkZUJ5TWFnbml0dWRlKG1hZ25pdHVkZSk7XG4gICAgICAgIHRoaXMucG93ZXJCeU1hZ25pdHVkZSA9IHBvd2VyQnlNYWduaXR1ZGUobWFnbml0dWRlKTtcbiAgICB9XG4gICAgc3luYyhuYXZpZ2F0b3IsIHZpZXcpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoIW5hdmlnYXRvciB8fCAhdmlldykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmF2aWdhdG9yID0gbmF2aWdhdG9yO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hdlNjcm9sbGVkLCBtb250aFNjcm9sbGVkO1xuICAgICAgICAgICAgdGhpcy5uYXZTdWJzY3JpcHRpb24gPSBuYXZpZ2F0b3Iuc2Nyb2xsJCgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb250aFNjcm9sbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoU2Nyb2xsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuYXZTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTaWJsaW5nT2YoZS50YXJnZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdWJzY3JpcHRpb24gPSB2aWV3LnNjcm9sbCQoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmF2U2Nyb2xsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2U2Nyb2xsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb250aFNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNpYmxpbmdPZihlLnRhcmdldCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNjcm9sbFNpYmxpbmdPZihzY3JvbGxlZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5zaWJsaW5nQ29tcG9uZW50KHNjcm9sbGVkRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuY2FsY3VsYXRlU2Nyb2xsKGNvbXBvbmVudCwgc2Nyb2xsZWRFbGVtZW50LnNjcm9sbFRvcCk7XG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxUbyhzY3JvbGxUb3ApO1xuICAgIH1cbiAgICBzaWJsaW5nQ29tcG9uZW50KHNjcm9sbGFibGVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRvci5jb250YWluZXIubmF0aXZlRWxlbWVudCA9PT0gc2Nyb2xsYWJsZUVsZW1lbnQgPyB0aGlzLnZpZXcgOiB0aGlzLm5hdmlnYXRvcjtcbiAgICB9XG4gICAgY2FsY3VsYXRlU2Nyb2xsKGNvbXBvbmVudCwgc2Nyb2xsVG9wKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gY29tcG9uZW50ID09PSB0aGlzLm5hdmlnYXRvciA/IHRoaXMuZGl2aWRlQnlNYWduaXR1ZGUgOiB0aGlzLnBvd2VyQnlNYWduaXR1ZGU7XG4gICAgICAgIHJldHVybiBtb2RpZmllcihzY3JvbGxUb3ApO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAodGhpcy5uYXZTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlld1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy52aWV3U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5TY3JvbGxTeW5jU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU2Nyb2xsU3luY1NlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBDYWxlbmRhckRPTVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuXG4vKipcbiAqIFVzZWQgZm9yIHJlbmRlcmluZyB0aGUgY2VsbCBjb250ZW50IG9mIHRoZSBDYWxlbmRhci4gVG8gZGVmaW5lIHRoZSBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWdcbiAqIHdpdGggdGhlIGBrZW5kb0NhbGVuZGFyQ2VsbFRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBjb21wb25lbnQgdGFnLiBUaGUgdGVtcGxhdGUgY29udGV4dCBpcyBzZXQgdG8gdGhlXG4gKiBjdXJyZW50IGNvbXBvbmVudC4gVG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGRhdGUsIHVzZSB0aGUgYGxldC1kYXRlYCBkaXJlY3RpdmUuIFRvIHByb3ZpZGUgbW9yZSBkZXRhaWxzXG4gKiBhYm91dCB0aGUgY3VycmVudCBjZWxsLCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYGNlbGxDb250ZXh0YCBieSB1c2luZyB0aGUgYGxldC1jZWxsQ29udGV4dGAgZGlyZWN0aXZlLlxuICpcbiAqIEZvciBtb3JlIGV4YW1wbGVzLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiBbdGVtcGxhdGVzXSh7JSBzbHVnIHRlbXBsYXRlc19jYWxlbmRhciAlfSkuXG4gKlxuICogPiBga2VuZG9DYWxlbmRhckNlbGxUZW1wbGF0ZWAgaXMgZXF1aXZhbGVudCB0b1xuICogPiBbYGtlbmRvQ2FsZW5kYXJNb250aENlbGxUZW1wbGF0ZWBdKHslIHNsdWcgYXBpX2RhdGVpbnB1dHNfbW9udGhjZWxsdGVtcGxhdGVkaXJlY3RpdmUgJX0pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogc3R5bGVzOiBbJy5jdXN0b20geyBjb2xvcjogcmVkOyB9J10sXG4gKiB0ZW1wbGF0ZTogYFxuICogIDxrZW5kby1jYWxlbmRhcj5cbiAqICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyQ2VsbFRlbXBsYXRlIGxldC1kYXRlPlxuICogICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbVwiPnt7ZGF0ZS5nZXREYXRlKCl9fTwvc3Bhbj5cbiAqICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgPC9rZW5kby1jYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICogYGBgXG4gKi9cbmNsYXNzIENlbGxUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FsZW5kYXJDZWxsVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DZWxsVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9XG5dO1xuXG4vKipcbiAqIFVzZWQgZm9yIHJlbmRlcmluZyB0aGUgbW9udGggY2VsbCBjb250ZW50IG9mIHRoZSBDYWxlbmRhci4gVG8gZGVmaW5lIHRoZSBtb250aCBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWdcbiAqIHdpdGggdGhlIGBrZW5kb0NhbGVuZGFyTW9udGhDZWxsVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGNvbXBvbmVudCB0YWcuIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGUgY3VycmVudFxuICogY29tcG9uZW50LiBUbyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgdXNlIHRoZSBgbGV0LWRhdGVgIGRpcmVjdGl2ZS4gVG8gcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnRcbiAqIG1vbnRoIGNlbGwsIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBgY2VsbENvbnRleHRgIGJ5IHVzaW5nIHRoZSBgbGV0LWNlbGxDb250ZXh0YCBkaXJlY3RpdmUuXG4gKlxuICogRm9yIG1vcmUgZXhhbXBsZXMsIHJlZmVyIHRvIHRoZSBhcnRpY2xlIG9uIFt0ZW1wbGF0ZXNdKHslIHNsdWcgdGVtcGxhdGVzX2NhbGVuZGFyICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIF9AQ29tcG9uZW50KHtcbiAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqIHN0eWxlczogWycuY3VzdG9tIHsgY29sb3I6IHJlZDsgfSddLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tY2FsZW5kYXI+XG4gKiAgICA8bmctdGVtcGxhdGUga2VuZG9DYWxlbmRhck1vbnRoQ2VsbFRlbXBsYXRlIGxldC1jb250ZXh0PVwiY2VsbENvbnRleHRcIj5cbiAqICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b21cIj57e2NvbnRleHQuZm9ybWF0dGVkVmFsdWV9fTwvc3Bhbj5cbiAqICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgPC9rZW5kby1jYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICogYGBgXG4gKi9cbmNsYXNzIE1vbnRoQ2VsbFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuTW9udGhDZWxsVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0NhbGVuZGFyTW9udGhDZWxsVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Nb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogVXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB5ZWFyIGNlbGwgY29udGVudCBvZiB0aGUgQ2FsZW5kYXIuIFRvIGRlZmluZSB0aGUgeWVhciBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuXG4gKiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb0NhbGVuZGFyWWVhckNlbGxUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSB0aGUgY29tcG9uZW50IHRhZy5cbiAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGUgY3VycmVudCBjb21wb25lbnQuIFRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBkYXRlLCB1c2VcbiAqIHRoZSBgbGV0LWRhdGVgIGRpcmVjdGl2ZS4gVG8gcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnQgeWVhciBjZWxsLCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlXG4gKiBjdXJyZW50IGBjZWxsQ29udGV4dGAgYnkgdXNpbmcgdGhlIGBsZXQtY2VsbENvbnRleHRgIGRpcmVjdGl2ZS5cbiAqXG4gKiBGb3IgbW9yZSBleGFtcGxlcywgcmVmZXIgdG8gdGhlIGFydGljbGUgb24gW3RlbXBsYXRlc10oeyUgc2x1ZyB0ZW1wbGF0ZXNfY2FsZW5kYXIgJX0pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogc3R5bGVzOiBbJy5jdXN0b20geyBjb2xvcjogcmVkOyB9J10sXG4gKiB0ZW1wbGF0ZTogYFxuICogIDxrZW5kby1jYWxlbmRhciBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCI+XG4gKiAgICA8bmctdGVtcGxhdGUga2VuZG9DYWxlbmRhclllYXJDZWxsVGVtcGxhdGUgbGV0LWNvbnRleHQ9XCJjZWxsQ29udGV4dFwiPlxuICogICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbVwiPnt7Y29udGV4dC5mb3JtYXR0ZWRWYWx1ZX19PC9zcGFuPlxuICogICAgPC9uZy10ZW1wbGF0ZT5cbiAqICA8L2tlbmRvLWNhbGVuZGFyPlxuICogYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICogIHB1YmxpYyBhY3RpdmVWaWV3OiBDYWxlbmRhclZpZXcgPSAneWVhcic7XG4gKiB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgWWVhckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cblllYXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0NhbGVuZGFyWWVhckNlbGxUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblllYXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9XG5dO1xuXG4vKipcbiAqIFVzZWQgZm9yIHJlbmRlcmluZyB0aGUgZGVjYWRlIGNlbGwgY29udGVudCBvZiB0aGUgQ2FsZW5kYXIuIFRvIGRlZmluZSB0aGUgZGVjYWRlIGNlbGwgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gXG4gKiB0YWcgd2l0aCB0aGUgYGtlbmRvQ2FsZW5kYXJEZWNhZGVDZWxsVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGNvbXBvbmVudCB0YWcuIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGVcbiAqIGN1cnJlbnQgY29tcG9uZW50LiBUbyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgdXNlIHRoZSBgbGV0LWRhdGVgIGRpcmVjdGl2ZS4gVG8gcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXRcbiAqIHRoZSBjdXJyZW50IGRlY2FkZSBjZWxsLCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYGNlbGxDb250ZXh0YCBieSB1c2luZyB0aGUgYGxldC1jZWxsQ29udGV4dGAgZGlyZWN0aXZlLlxuICpcbiAqIEZvciBtb3JlIGV4YW1wbGVzLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiBbdGVtcGxhdGVzXSh7JSBzbHVnIHRlbXBsYXRlc19jYWxlbmRhciAlfSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBfQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiBzdHlsZXM6IFsnLmN1c3RvbSB7IGNvbG9yOiByZWQ7IH0nXSxcbiAqIHRlbXBsYXRlOiBgXG4gKiAgPGtlbmRvLWNhbGVuZGFyIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIj5cbiAqICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyRGVjYWRlQ2VsbFRlbXBsYXRlIGxldC1jb250ZXh0PVwiY2VsbENvbnRleHRcIj5cbiAqICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b21cIj57e2NvbnRleHQuZm9ybWF0dGVkVmFsdWV9fTwvc3Bhbj5cbiAqICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgPC9rZW5kby1jYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICBwdWJsaWMgYWN0aXZlVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RlY2FkZSc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgRGVjYWRlQ2VsbFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuRGVjYWRlQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9DYWxlbmRhckRlY2FkZUNlbGxUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogVXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBjZW50dXJ5IGNlbGwgY29udGVudCBvZiB0aGUgQ2FsZW5kYXIuIFRvIGRlZmluZSB0aGUgY2VudHVyeSBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YFxuICogdGFnIHdpdGggdGhlIGBrZW5kb0NhbGVuZGFyQ2VudHVyeUNlbGxUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSB0aGUgY29tcG9uZW50IHRhZy4gVGhlIHRlbXBsYXRlIGNvbnRleHQgaXMgc2V0IHRvIHRoZVxuICogY3VycmVudCBjb21wb25lbnQuIFRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBkYXRlLCB1c2UgdGhlIGBsZXQtZGF0ZWAgZGlyZWN0aXZlLiBUbyBwcm92aWRlIG1vcmUgZGV0YWlscyBhYm91dFxuICogdGhlIGN1cnJlbnQgY2VudHVyeSBjZWxsLCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYGNlbGxDb250ZXh0YCBieSB1c2luZyB0aGUgYGxldC1jZWxsQ29udGV4dGAgZGlyZWN0aXZlLlxuICpcbiAqIEZvciBtb3JlIGV4YW1wbGVzLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiBbdGVtcGxhdGVzXSh7JSBzbHVnIHRlbXBsYXRlc19jYWxlbmRhciAlfSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBfQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiBzdHlsZXM6IFsnLmN1c3RvbSB7IGNvbG9yOiByZWQ7IH0nXSxcbiAqIHRlbXBsYXRlOiBgXG4gKiAgPGtlbmRvLWNhbGVuZGFyIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIj5cbiAqICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyQ2VudHVyeUNlbGxUZW1wbGF0ZSBsZXQtY29udGV4dD1cImNlbGxDb250ZXh0XCI+XG4gKiAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tXCI+e3tjb250ZXh0LmZvcm1hdHRlZFZhbHVlfX08L3NwYW4+XG4gKiAgICA8L25nLXRlbXBsYXRlPlxuICogIDwva2VuZG8tY2FsZW5kYXI+XG4gKiBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgcHVibGljIGFjdGl2ZVZpZXc6IENhbGVuZGFyVmlldyA9ICdjZW50dXJ5JztcbiAqIH1cbiAqIGBgYFxuICovXG5jbGFzcyBDZW50dXJ5Q2VsbFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuQ2VudHVyeUNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FsZW5kYXJDZW50dXJ5Q2VsbFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ2VudHVyeUNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogVXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB3ZWVrIG51bWJlciBjZWxsIGNvbnRlbnQgaW4gdGhlIG1vbnRoIHZpZXcgb2YgdGhlIENhbGVuZGFyLiBUbyBkZWZpbmUgdGhlIG1vbnRoIHdlZWsgbnVtYmVyIGNlbGwgdGVtcGxhdGUsXG4gKiBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWcgd2l0aCB0aGUgYGtlbmRvQ2FsZW5kYXJXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBjb21wb25lbnQgdGFnLiBUaGUgdGVtcGxhdGVcbiAqIGNvbnRleHQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudC4gVG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGRhdGUsIHVzZSB0aGUgYGxldC1kYXRlYCBkaXJlY3RpdmUuIFRvIHByb3ZpZGUgbW9yZVxuICogZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCB3ZWVrIG51bWJlciBjZWxsLCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYGNlbGxDb250ZXh0YCBieSB1c2luZyB0aGUgYGxldC1jZWxsQ29udGV4dGAgZGlyZWN0aXZlLlxuICpcbiAqIEZvciBtb3JlIGV4YW1wbGVzLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiBbdGVtcGxhdGVzXSh7JSBzbHVnIHRlbXBsYXRlc19jYWxlbmRhciAlfSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBfQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiBzdHlsZXM6IFsnLmN1c3RvbSB7IGNvbG9yOiByZWQ7IH0nXSxcbiAqIHRlbXBsYXRlOiBgXG4gKiAgPGtlbmRvLWNhbGVuZGFyIFt3ZWVrTnVtYmVyXT1cInRydWVcIj5cbiAqICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyV2Vla051bWJlckNlbGxUZW1wbGF0ZSBsZXQtY29udGV4dD1cImNlbGxDb250ZXh0XCI+XG4gKiAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tXCI+e3tjb250ZXh0LmZvcm1hdHRlZFZhbHVlfX08L3NwYW4+XG4gKiAgICA8L25nLXRlbXBsYXRlPlxuICogIDwva2VuZG8tY2FsZW5kYXI+XG4gKiBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAqIGBgYFxuICovXG5jbGFzcyBXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FsZW5kYXJXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogVXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBoZWFkZXIgdGl0bGUgb2YgdGhlIENhbGVuZGFyLiBUbyBkZWZpbmUgdGhlIGhlYWRlciB0aXRsZSB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnXG4gKiB3aXRoIHRoZSBga2VuZG9DYWxlbmRhckhlYWRlclRpdGxlVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGNvbXBvbmVudCB0YWcuIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGVcbiAqIGN1cnJlbnQgY29tcG9uZW50LiBUbyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgdGl0bGUsIHVzZSB0aGUgYGxldC10aXRsZWAgZGlyZWN0aXZlLiBUbyBwcm92aWRlIG1vcmUgZGV0YWlscyBhYm91dFxuICogdGhlIGN1cnJlbnQgdGl0bGUsIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBgZGF0ZWAgYnkgdXNpbmcgdGhlIGBsZXQtZGF0ZWAgZGlyZWN0aXZlIG9yIGdldCBhIHJlZmVyZW5jZSB0byB0aGVcbiAqIGN1cnJlbnQgYWN0aXZlIHZpZXcgIGJ5IHVzaW5nIHRoZSBgbGV0LWFjdGl2ZVZpZXdgIGRpcmVjdGl2ZS5cbiAqXG4gKiBGb3IgbW9yZSBleGFtcGxlcywgcmVmZXIgdG8gdGhlIGFydGljbGUgb24gW3RlbXBsYXRlc10oeyUgc2x1ZyB0ZW1wbGF0ZXNfY2FsZW5kYXIgJX0pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogc3R5bGVzOiBbJy5jdXN0b20geyBjb2xvcjogcmVkOyB9J10sXG4gKiB0ZW1wbGF0ZTogYFxuICogIDxrZW5kby1jYWxlbmRhcj5cbiAqICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFySGVhZGVyVGl0bGVUZW1wbGF0ZSBsZXQtdGl0bGU+XG4gKiAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tXCI+e3t0aXRsZX19PC9zcGFuPlxuICogICAgPC9uZy10ZW1wbGF0ZT5cbiAqICA8L2tlbmRvLWNhbGVuZGFyPlxuICogYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgSGVhZGVyVGl0bGVUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkhlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0NhbGVuZGFySGVhZGVyVGl0bGVUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkhlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9XG5dO1xuXG4vKipcbiAqIFVzZWQgZm9yIHJlbmRlcmluZyB0aGUgbmF2aWdhdGlvbiBpdGVtIG9mIHRoZSBDYWxlbmRhci4gVG8gZGVmaW5lIHRoZSBuYXZpZ2F0aW9uIGl0ZW0gdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gXG4gKiB0YWcgd2l0aCB0aGUgYGtlbmRvQ2FsZW5kYXJOYXZpZ2F0aW9uSXRlbVRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBjb21wb25lbnQgdGFnLiBUaGUgdGVtcGxhdGUgY29udGV4dCBpcyBzZXQgdG8gdGhlXG4gKiBjdXJyZW50IGNvbXBvbmVudC4gVG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUsIHVzZSB0aGUgYGxldC10aXRsZWAgZGlyZWN0aXZlLiBUbyBwcm92aWRlIG1vcmUgZGV0YWlsc1xuICogYWJvdXQgdGhlIGN1cnJlbnQgdGl0bGUsIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBgZGF0ZWAgYnkgdXNpbmcgdGhlIGBsZXQtZGF0ZT0nZGF0ZSdgIGRpcmVjdGl2ZSBvciBnZXQgYSByZWZlcmVuY2VcbiAqIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSB2aWV3IGJ5IHVzaW5nIHRoZSBgbGV0LWFjdGl2ZVZpZXc9J2FjdGl2ZVZpZXcnYCBkaXJlY3RpdmUuXG4gKlxuICogRm9yIG1vcmUgZXhhbXBsZXMsIHJlZmVyIHRvIHRoZSBhcnRpY2xlIG9uIFt0ZW1wbGF0ZXNdKHslIHNsdWcgdGVtcGxhdGVzX2NhbGVuZGFyICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIF9AQ29tcG9uZW50KHtcbiAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqIHN0eWxlczogWycuY3VzdG9tIHsgY29sb3I6IHJlZDsgfSddLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tY2FsZW5kYXI+XG4gKiAgICA8bmctdGVtcGxhdGUga2VuZG9DYWxlbmRhck5hdmlnYXRpb25JdGVtVGVtcGxhdGUgbGV0LXRpdGxlPlxuICogICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbVwiPnt7dGl0bGV9fTwvc3Bhbj5cbiAqICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgPC9rZW5kby1jYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICogYGBgXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25JdGVtVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5OYXZpZ2F0aW9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9DYWxlbmRhck5hdmlnYXRpb25JdGVtVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5OYXZpZ2F0aW9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFBpY2tlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMub25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnNhbWVEYXRlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZGF0ZUNvbXBsZXRlbmVzc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBtaW5WYWxpZGF0b3IgPSAobWluVmFsdWUpID0+IHtcbiAgICByZXR1cm4gKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29uc3QgZXJyID0ge1xuICAgICAgICAgICAgbWluRXJyb3I6IHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFtaW5WYWx1ZSB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWUgPCBtaW5WYWx1ZSA/IGVyciA6IG51bGw7XG4gICAgfTtcbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBtYXhWYWxpZGF0b3IgPSAobWF4VmFsdWUpID0+IHtcbiAgICByZXR1cm4gKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29uc3QgZXJyID0ge1xuICAgICAgICAgICAgbWF4RXJyb3I6IHtcbiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFtYXhWYWx1ZSB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWUgPiBtYXhWYWx1ZSA/IGVyciA6IG51bGw7XG4gICAgfTtcbn07XG5cbmNvbnN0IG5vb3AkMSA9ICgpID0+IGZhbHNlO1xuY29uc3QgRElTQUJMRURfREFURVNfRE9DX0xJTksgPSAnaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvY2FsZW5kYXIvZGlzYWJsZWQtZGF0ZXMvJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEaXNhYmxlZERhdGVzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbWl0cyBldmVyeSB0aW1lIHRoZSBgaXNEYXRlRGlzYWJsZWRgIG1ldGhvZCBjaGFuZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhc2VkIG9uIHRoZSB1c2VyLWRlZmluZWQgYGRpc2FibGVkRGF0ZXNgIGlucHV0IGV2YWx1YXRlcyBpZiB0aGUgZGF0ZSBpcyBkaXNhYmxlZC5cbiAgICAgICAgICogSWYgbm90IHNldCwgcmV0dXJucyBgZmFsc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0RhdGVEaXNhYmxlZCA9IG5vb3AkMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgYGlzRGF0ZURpc2FibGVkYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICogSWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlcyBpdCBhcy1pcyBhbmQgcGFzc2VzIGVhY2ggZGF0ZSB0byBpdCBmb3IgZXZhbHVhdGlvbi5cbiAgICAgKiBUaGUgdGltZSBwYXJ0IGlzIHNldCB0byBgbWlkbmlnaHRgLlxuICAgICAqICogSWYgYSBgRGF0ZVtdYCBpcyBwcm92aWRlZCwgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoZSB0YXJnZXRlZCBkYXRlIGFnYWluc3RcbiAgICAgKiB0aGUgbGlzdGVkIGRhdGVzIGFuZCwgaWYgdGhlIHRhcmdldGVkIGRhdGUgaXMgbGlzdGVkLCBtYXJrcyBpdCBhcyBkaXNhYmxlZC5cbiAgICAgKiAqIElmIGEgYERheVtdYCBpcyBwcm92aWRlZCwgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIHRoZSBwcm92aWRlZCBkYXlzIG9mIHRoZVxuICAgICAqIHdlZWsgYXMgZGlzYWJsZWQuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZShkaXNhYmxlZERhdGVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzYWJsZWREYXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5pc0RhdGVEaXNhYmxlZCA9IChkYXRlKSA9PiBkaXNhYmxlZERhdGVzKGdldERhdGUoZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyQXJyYXkoZGlzYWJsZWREYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2FibGVkV2Vla0RheXMgPSBuZXcgU2V0KGRpc2FibGVkRGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pc0RhdGVEaXNhYmxlZCA9IChkYXRlKSA9PiBkaXNhYmxlZFdlZWtEYXlzLmhhcyhkYXRlLmdldERheSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RhdGVBcnJheShkaXNhYmxlZERhdGVzKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZERpc2FibGVkRGF0ZXMgPSBuZXcgU2V0KGRpc2FibGVkRGF0ZXMubWFwKGRhdGUgPT4gZ2V0RGF0ZShkYXRlKS5nZXRUaW1lKCkpKTtcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlRGlzYWJsZWQgPSAoZGF0ZSkgPT4gbm9ybWFsaXplZERpc2FibGVkRGF0ZXMuaGFzKGdldERhdGUoZGF0ZSkuZ2V0VGltZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlRGlzYWJsZWQgPSBub29wJDE7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUludmFsaWRJbnB1dChkaXNhYmxlZERhdGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2VDaGFuZ2UoKTtcbiAgICB9XG4gICAgbm90aWZ5SW52YWxpZElucHV0KGRpc2FibGVkRGF0ZXMpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChkaXNhYmxlZERhdGVzKSAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2Rpc2FibGVkRGF0ZXMnIHZhbHVlIHNob3VsZCBiZSBhIGZ1bmN0aW9uLCBhIERheSBhcnJheSBvciBhIERhdGUgYXJyYXkuIENoZWNrICR7RElTQUJMRURfREFURVNfRE9DX0xJTkt9IGZvciBtb3JlIGluZm9ybWF0aW9uLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vdGlmeVNlcnZpY2VDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5uZXh0KCk7XG4gICAgfVxufVxuRGlzYWJsZWREYXRlc1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmICovXG5jb25zdCBCT1RUT01fVklFV19ET0NfTElOSyA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9DYWxlbmRhckNvbXBvbmVudC8jdG9jLWJvdHRvbXZpZXcnO1xuY29uc3QgVE9QX1ZJRVdfRE9DX0xJTksgPSAnaHR0cDovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9hcGkvQ2FsZW5kYXJDb21wb25lbnQvI3RvYy10b3B2aWV3JztcbmNvbnN0IE1JTl9ET0NfTElOSyA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9DYWxlbmRhckNvbXBvbmVudC8jdG9jLW1pbic7XG5jb25zdCBNQVhfRE9DX0xJTksgPSAnaHR0cDovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9hcGkvQ2FsZW5kYXJDb21wb25lbnQvI3RvYy1tYXgnO1xuY29uc3QgVkFMVUVfRE9DX0xJTksgPSAnaHR0cDovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9jYWxlbmRhci8jdG9jLXVzaW5nLXdpdGgtanNvbic7XG5jb25zdCB2aXJ0dWFsaXphdGlvblByb3AgPSB4ID0+IHggPyB4LnZpcnR1YWxpemF0aW9uIDogbnVsbDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBDQUxFTkRBUl9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBtdWx0aTogdHJ1ZSxcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckNvbXBvbmVudCkgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBDQUxFTkRBUl9SQU5HRV9WQUxJREFUT1JTID0ge1xuICAgIG11bHRpOiB0cnVlLFxuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2FsZW5kYXJDb21wb25lbnQpIC8vdHNsaW50OmRpc2FibGUtbGluZTpuby11c2UtYmVmb3JlLWRlY2xhcmVcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgS0VORE9fSU5QVVRfUFJPVklERVIgPSB7XG4gICAgcHJvdmlkZTogS2VuZG9JbnB1dCxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckNvbXBvbmVudCkgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxufTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIENhbGVuZGFyIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19jYWxlbmRhciAlfSN0b2MtYmFzaWMtdXNhZ2UpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tY2FsZW5kYXI+PC9rZW5kby1jYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICogYGBgXG4gKi9cbmNsYXNzIENhbGVuZGFyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihidXMsIGRvbSwgZWxlbWVudCwgbmF2aWdhdG9yLCByZW5kZXJlciwgY2RyLCBuZ1pvbmUsIGluamVjdG9yLCBzY3JvbGxTeW5jU2VydmljZSwgZGlzYWJsZWREYXRlc1NlcnZpY2UsIHBpY2tlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLm5hdmlnYXRvciA9IG5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjtcbiAgICAgICAgdGhpcy5zY3JvbGxTeW5jU2VydmljZSA9IHNjcm9sbFN5bmNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlID0gZGlzYWJsZWREYXRlc1NlcnZpY2U7XG4gICAgICAgIHRoaXMucGlja2VyU2VydmljZSA9IHBpY2tlclNlcnZpY2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZ3VpZCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBidWlsdC1pbiBtaW4gb3IgbWF4IHZhbGlkYXRvcnMgYXJlIGVuZm9yY2VkIHdoZW4gdmFsaWRhdGluZyBhIGZvcm0uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhbmdlVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyBvciBnZXRzIHRoZSBgZGlzYWJsZWRgIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhciBhbmRcbiAgICAgICAgICogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgYWN0aXZlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfY2FsZW5kYXIgJX0pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYHRhYmluZGV4YCBwcm9wZXJ0eSBvZiB0aGUgQ2FsZW5kYXIuIEJhc2VkIG9uIHRoZVxuICAgICAgICAgKiBbSFRNTCBgdGFiaW5kZXhgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL3RhYmluZGV4KSBiZWhhdmlvcixcbiAgICAgICAgICogaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZm9jdXNhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWJpbmRleCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBuYXZpZ2F0aW9uYCBwcm9wZXJ0eSBvZiB0aGUgQ2FsZW5kYXJcbiAgICAgICAgICogYW5kIGRldGVybWluZXMgd2hldGhlciB0aGUgbmF2aWdhdGlvbiBzaWRlLWJhciB3aWxsIGJlIGRpc3BsYXllZFxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHNpZGViYXJfY2FsZW5kYXIgJX0pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBhY3RpdmUgdmlldyB0aGF0IHRoZSBDYWxlbmRhciBpbml0aWFsbHkgcmVuZGVyc1xuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFjdGl2ZXZpZXdfY2FsZW5kYXIgJX0pKS5cbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGFjdGl2ZSB2aWV3IGlzIGBtb250aGAuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gWW91IGhhdmUgdG8gc2V0IGBhY3RpdmVWaWV3YCB3aXRoaW4gdGhlIGB0b3BWaWV3YC1gYm90dG9tVmlld2AgcmFuZ2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW0ubW9udGhdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgYm90dG9tbW9zdCB2aWV3IHRvIHdoaWNoIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZVxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGVzX2NhbGVuZGFyICV9I3RvYy1wYXJ0aWFsLWRhdGVzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJvdHRvbVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW0ubW9udGhdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgdG9wbW9zdCB2aWV3IHRvIHdoaWNoIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZVxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHNpZGViYXJfY2FsZW5kYXIgJX0jdG9jLXBhcnRpYWwtZGF0ZXMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9wVmlldyA9IENhbGVuZGFyVmlld0VudW1bQ2FsZW5kYXJWaWV3RW51bS5jZW50dXJ5XTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IGEgd2VlayBudW1iZXIgY29sdW1uIGluIHRoZSBgbW9udGhgIHZpZXdcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyB3ZWVrbnVtY29sdW1uX2NhbGVuZGFyICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndlZWtOdW1iZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGFjdGl2ZSB2aWV3IGlzIGNoYW5nZWRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2NhbGVuZGFyICV9I3RvYy1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlVmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGFjdGl2ZSB2aWV3IGRhdGUgaXMgY2hhbmdlZFxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfY2FsZW5kYXIgJX0jdG9jLWV2ZW50cykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3RGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHZhbHVlIGlzIGNoYW5nZWRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2NhbGVuZGFyICV9I3RvYy1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZWxsVUlEID0gZ3VpZCgpO1xuICAgICAgICB0aGlzLl9taW4gPSBuZXcgRGF0ZShNSU5fREFURSk7XG4gICAgICAgIHRoaXMuX21heCA9IG5ldyBEYXRlKE1BWF9EQVRFKTtcbiAgICAgICAgdGhpcy5fZm9jdXNlZERhdGUgPSBnZXRUb2RheSgpO1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IG5vb3A7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IG5vb3A7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLm1pblZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLm1heFZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLnN5bmNOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0Q2xhc3NlcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UuY2FsZW5kYXIgPSB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYGZvY3VzZWREYXRlYCBwcm9wZXJ0eSBvZiB0aGUgQ2FsZW5kYXIgYW5kXG4gICAgICogZGVmaW5lcyB0aGUgZm9jdXNlZCBkYXRlIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGVzX2NhbGVuZGFyICV9I3RvYy1mb2N1c2VkLWRhdGVzKSkuXG4gICAgICpcbiAgICAgKiA+IElmIHRoZSBDYWxlbmRhciBpcyBvdXQgb2YgdGhlIG1pbiBvciBtYXggcmFuZ2UsIGl0IG5vcm1hbGl6ZXMgdGhlIGRlZmluZWQgYGZvY3VzZWREYXRlYC5cbiAgICAgKi9cbiAgICBzZXQgZm9jdXNlZERhdGUoZm9jdXNlZERhdGUpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZERhdGUgPSBmb2N1c2VkRGF0ZSB8fCBnZXRUb2RheSgpO1xuICAgICAgICB0aGlzLnNldEFyaWFBY3RpdmVkZXNjZW5kYW50KCk7XG4gICAgfVxuICAgIGdldCBmb2N1c2VkRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWREYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBtaW5gIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhciBhbmRcbiAgICAgKiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZSB2YWx1ZVxuICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0ZXJhbmdlc19jYWxlbmRhciAlfSkpLlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgbWluYCB2YWx1ZSBpcyBgMTkwMC0xLTFgLlxuICAgICAqL1xuICAgIHNldCBtaW4obWluKSB7XG4gICAgICAgIHRoaXMuX21pbiA9IG1pbiB8fCBuZXcgRGF0ZShNSU5fREFURSk7XG4gICAgfVxuICAgIGdldCBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYG1heGAgcHJvcGVydHkgb2YgdGhlIENhbGVuZGFyIGFuZFxuICAgICAqIGRlZmluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlIHZhbHVlXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlcmFuZ2VzX2NhbGVuZGFyICV9KSkuXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBtYXhgIHZhbHVlIGlzIGAyMDk5LTEyLTMxYC5cbiAgICAgKi9cbiAgICBzZXQgbWF4KG1heCkge1xuICAgICAgICB0aGlzLl9tYXggPSBtYXggfHwgbmV3IERhdGUoTUFYX0RBVEUpO1xuICAgIH1cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2YgdGhlIENhbGVuZGFyIGFuZCBkZWZpbmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogPiBUaGUgYHZhbHVlYCBoYXMgdG8gYmUgYSB2YWxpZFxuICAgICAqIFtKYXZhU2NyaXB0IGBEYXRlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZSkgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZShjYW5kaWRhdGUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZShjYW5kaWRhdGUpO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IHRhYkluZGV4KHRhYkluZGV4KSB7XG4gICAgICAgIHRoaXMudGFiaW5kZXggPSB0YWJJbmRleDtcbiAgICB9XG4gICAgZ2V0IHRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJpbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGF0ZXMgb2YgdGhlIENhbGVuZGFyIHRoYXQgd2lsbCBiZSBkaXNhYmxlZFxuICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfZGF0ZXNfY2FsZW5kYXIgJX0pKS5cbiAgICAgKi9cbiAgICBzZXQgZGlzYWJsZWREYXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmluaXRpYWxpemUodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGNlbGxUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IG1vbnRoQ2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMubW9udGhDZWxsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCB5ZWFyQ2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMueWVhckNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGRlY2FkZUNlbGxUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmRlY2FkZUNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGNlbnR1cnlDZWxsVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5jZW50dXJ5Q2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgd2Vla051bWJlclRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMud2Vla051bWJlclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgaGVhZGVyVGl0bGVUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmhlYWRlclRpdGxlVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCBuYXZpZ2F0aW9uSXRlbVRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICBnZXQgYWN0aXZlVmlld0VudW0oKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW3RoaXMuYWN0aXZlVmlld107XG4gICAgICAgIHJldHVybiBhY3RpdmVWaWV3IDwgdGhpcy5ib3R0b21WaWV3RW51bSA/IHRoaXMuYm90dG9tVmlld0VudW0gOiBhY3RpdmVWaWV3O1xuICAgIH1cbiAgICBnZXQgYm90dG9tVmlld0VudW0oKSB7XG4gICAgICAgIHJldHVybiBDYWxlbmRhclZpZXdFbnVtW3RoaXMuYm90dG9tVmlld107XG4gICAgfVxuICAgIGdldCB0b3BWaWV3RW51bSgpIHtcbiAgICAgICAgcmV0dXJuIENhbGVuZGFyVmlld0VudW1bdGhpcy50b3BWaWV3XTtcbiAgICB9XG4gICAgZ2V0IHdpZGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG4gICAgZ2V0IHdpZGdldFJvbGUoKSB7XG4gICAgICAgIHJldHVybiAnZ3JpZCc7XG4gICAgfVxuICAgIGdldCBjYWxlbmRhclRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IHVuZGVmaW5lZCA6IHRoaXMudGFiSW5kZXg7XG4gICAgfVxuICAgIGdldCBhcmlhRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kb20uY2FsY3VsYXRlSGVpZ2h0cyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3luY1NlcnZpY2UuY29uZmlndXJlKHRoaXMuYWN0aXZlVmlld0VudW0pO1xuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmJ1cy52aWV3Q2hhbmdlZC5zdWJzY3JpYmUoKHsgdmlldyB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW3ZpZXddO1xuICAgICAgICAgICAgdGhpcy5lbWl0RXZlbnQodGhpcy5hY3RpdmVWaWV3Q2hhbmdlLCB0aGlzLmFjdGl2ZVZpZXcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTeW5jU2VydmljZS5jb25maWd1cmUodmlldyk7XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTsgLy8gcmVxdWlyZXMgem9uZSBpZiB0ZW1wbGF0ZXNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCk7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuYnVzLmNvbmZpZ3VyZSh0aGlzLmJvdHRvbVZpZXdFbnVtLCB0aGlzLnRvcFZpZXdFbnVtKTtcbiAgICAgICAgdGhpcy5zY3JvbGxTeW5jU2VydmljZS5jb25maWd1cmUodGhpcy5hY3RpdmVWaWV3RW51bSk7XG4gICAgICAgIGNvbnN0IHVzZVZhbHVlID0gaGFzRXhpc3RpbmdWYWx1ZShjaGFuZ2VzLCAndmFsdWUnKSAmJiAhaGFzRXhpc3RpbmdWYWx1ZShjaGFuZ2VzLCAnZm9jdXNlZERhdGUnKTtcbiAgICAgICAgY29uc3QgZm9jdXNlZERhdGUgPSBkYXRlSW5SYW5nZShjbG9uZURhdGUodXNlVmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5mb2N1c2VkRGF0ZSksIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZERhdGUgPSAhaXNFcXVhbCh0aGlzLmZvY3VzZWREYXRlLCBmb2N1c2VkRGF0ZSkgPyBmb2N1c2VkRGF0ZSA6IHRoaXMuZm9jdXNlZERhdGU7XG4gICAgICAgIGlmIChjaGFuZ2VzLm5hdmlnYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3luY05hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0ZUZuID0gdGhpcy5yYW5nZVZhbGlkYXRpb24gPyBtaW5WYWxpZGF0b3IodGhpcy5taW4pIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdGVGbiA9IHRoaXMucmFuZ2VWYWxpZGF0aW9uID8gbWF4VmFsaWRhdG9yKHRoaXMubWF4KSA6IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnNldEFyaWFBY3RpdmVkZXNjZW5kYW50KCk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN5bmNOYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jTmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcm9sbFN5bmNTZXJ2aWNlLnN5bmModmlydHVhbGl6YXRpb25Qcm9wKHRoaXMubmF2aWdhdGlvblZpZXcpLCB2aXJ0dWFsaXphdGlvblByb3AodGhpcy5tb250aFZpZXcpKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3luY1NlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMuZm9yRWFjaCh1bmJpbmRDYWxsYmFjayA9PiB1bmJpbmRDYWxsYmFjaygpKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLmNhbGVuZGFyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYWdlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvblJlc2l6ZSgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZm9jdXNlZERhdGUpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgQ2FsZW5kYXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAqICA8YnV0dG9uIChjbGljayk9XCJjYWxlbmRhci5mb2N1cygpXCI+Rm9jdXMgY2FsZW5kYXI8L2J1dHRvbj5cbiAgICAgKiAgPGtlbmRvLWNhbGVuZGFyICNjYWxlbmRhcj48L2tlbmRvLWNhbGVuZGFyPlxuICAgICAqIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmx1cnMgdGhlIENhbGVuZGFyIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnRhaW5zRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGNsb3Nlc3QoZWxlbWVudCwgbm9kZSA9PiBub2RlID09PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlTmF2aWdhdGlvbihjYW5kaWRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb2N1c1RhcmdldCA9IGNhbmRpZGF0ZSA/IG5ldyBEYXRlKGNsb25lRGF0ZShjYW5kaWRhdGUpLnNldERhdGUoMSkpIDogdGhpcy5mb2N1c2VkRGF0ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IGRhdGVJblJhbmdlKGZvY3VzVGFyZ2V0LCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uUGFnZUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFnZUNoYW5nZVN1YnNjcmlwdGlvbiA9IGZyb20odGhpcy5yZXNvbHZlZFByb21pc2UpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7IC8vIHJlcXVpcmVzIHpvbmUgaWYgdGVtcGxhdGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlRGF0ZUNoYW5nZShjYW5kaWRhdGUpIHtcbiAgICAgICAgY29uc3QgY2FuTmF2aWdhdGVEb3duID0gdGhpcy5idXMuY2FuTW92ZURvd24odGhpcy5hY3RpdmVWaWV3RW51bSk7XG4gICAgICAgIGNvbnN0IGlzU2FtZURhdGUgPSAhY2FuTmF2aWdhdGVEb3duICYmIGlzRXF1YWwoY2FuZGlkYXRlLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpIHx8IHRoaXMuZm9jdXNlZERhdGU7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2FtZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFNhbWVEYXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbk5hdmlnYXRlRG93bikge1xuICAgICAgICAgICAgdGhpcy5idXMubW92ZURvd24odGhpcy5hY3RpdmVWaWV3RW51bSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmlzRGF0ZURpc2FibGVkKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Db250cm9sQ2hhbmdlKGNsb25lRGF0ZShjYW5kaWRhdGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xvbmVEYXRlKGNhbmRpZGF0ZSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHdyaXRlVmFsdWUoY2FuZGlkYXRlKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5VmFsdWUoY2FuZGlkYXRlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IGRhdGVJblJhbmdlKGNsb25lRGF0ZShjYW5kaWRhdGUpIHx8IHRoaXMuZm9jdXNlZERhdGUsIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBjbG9uZURhdGUoY2FuZGlkYXRlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgICAgIHRoaXMub25Db250cm9sQ2hhbmdlID0gZm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikge1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZShjb250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pblZhbGlkYXRlRm4oY29udHJvbCkgfHwgdGhpcy5tYXhWYWxpZGF0ZUZuKGNvbnRyb2wpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbikge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBhY3RpdmVDZWxsVGVtcGxhdGUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3RW51bSkge1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLm1vbnRoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoQ2VsbFRlbXBsYXRlIHx8IHRoaXMuY2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLnllYXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhckNlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3RW51bS5kZWNhZGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjYWRlQ2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLmNlbnR1cnk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2VudHVyeUNlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGVtaXRFdmVudChlbWl0dGVyLCBhcmdzKSB7XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMoZW1pdHRlcikpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0Q2xhc3NlcyhlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2std2lkZ2V0Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2stY2FsZW5kYXInKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnay1jYWxlbmRhci1pbmZpbml0ZScpO1xuICAgIH1cbiAgICB2ZXJpZnlDaGFuZ2VzKCkge1xuICAgICAgICBpZiAoIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1heCB2YWx1ZSBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gdGhlIG1pbi4gU2VlICR7TUlOX0RPQ19MSU5LfSBhbmQgJHtNQVhfRE9DX0xJTkt9LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJvdHRvbVZpZXdFbnVtID4gdGhpcy50b3BWaWV3RW51bSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdG9wVmlldyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGJvdHRvbVZpZXcuIFNlZSAke0JPVFRPTV9WSUVXX0RPQ19MSU5LfSBhbmQgJHtUT1BfVklFV19ET0NfTElOS30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmVyaWZ5VmFsdWUoY2FuZGlkYXRlKSB7XG4gICAgICAgIGlmICghaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuZGlkYXRlICYmICEoY2FuZGlkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICd2YWx1ZScgc2hvdWxkIGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBEYXRlIGluc3RhbmNlLiBDaGVjayAke1ZBTFVFX0RPQ19MSU5LfSBmb3IgcG9zc2libGUgcmVzb2x1dGlvbi5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLnB1c2godGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIuYmluZCh0aGlzKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMuYmluZCh0aGlzKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdtb3VzZWRvd24nLCBwcmV2ZW50RGVmYXVsdCksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2suYmluZCh0aGlzKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgZW1pdEJsdXIoYXJncykge1xuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2Uub25CbHVyLmVtaXQoYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2Uub25Gb2N1cy5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlQmx1cihhcmdzKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgLy8gdGhlIGluamVjdG9yIGNhbiBnZXQgdGhlIE5nQ29udHJvbCBpbnN0YW5jZSBvZiB0aGUgcGFyZW50IGNvbXBvbmVudCAoZm9yIGV4YW1wbGUsIHRoZSBEYXRlVGltZVBpY2tlcilcbiAgICAgICAgLy8gYW5kIGVudGVycyB0aGUgem9uZSBmb3Igbm8gcmVhc29uIGJlY2F1c2UgdGhlIHBhcmVudCBjb21wb25lbnQgaXMgc3RpbGwgdW50b3VjaGVkXG4gICAgICAgIGlmICghdGhpcy5waWNrZXJTZXJ2aWNlICYmIHJlcXVpcmVzWm9uZU9uQmx1cih0aGlzLmNvbnRyb2wpKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEJsdXIoYXJncyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdEJsdXIoYXJncyk7XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVGb2N1cygpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRGb2N1cygpO1xuICAgIH1cbiAgICBoYW5kbGVDbGljaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb250aFZpZXcuaXNTY3JvbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IGNsb25lRGF0ZSh0aGlzLmZvY3VzZWREYXRlKTsgLy9YWFg6IGZvcmNlcyBjaGFuZ2UgZGV0ZWN0XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlS2V5ZG93bihhcmdzKSB7XG4gICAgICAgIC8vIHJlc2VydmUgdGhlIGFsdCArIGFycm93IGtleSBjb21tYW5kcyBmb3IgdGhlIHBpY2tlclxuICAgICAgICBjb25zdCBhcnJvd0tleVByZXNzZWQgPSBbS2V5cy5BcnJvd1VwLCBLZXlzLkFycm93UmlnaHQsIEtleXMuQXJyb3dEb3duLCBLZXlzLkFycm93TGVmdF0uaW5kZXhPZihhcmdzLmtleUNvZGUpICE9PSAtMTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnBpY2tlclNlcnZpY2UpICYmIGFycm93S2V5UHJlc3NlZCAmJiBhcmdzLmFsdEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGRhdGVJblJhbmdlKHRoaXMubmF2aWdhdG9yLm1vdmUodGhpcy5mb2N1c2VkRGF0ZSwgdGhpcy5uYXZpZ2F0b3IuYWN0aW9uKGFyZ3MpLCB0aGlzLmFjdGl2ZVZpZXdFbnVtKSwgdGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICAgICAgaWYgKCFpc0VxdWFsKHRoaXMuZm9jdXNlZERhdGUsIGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERhdGUgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5rZXlDb2RlID09PSBLZXlzLkVudGVyKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURhdGVDaGFuZ2UodGhpcy5mb2N1c2VkRGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGV0ZWN0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRTYW1lRGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLnNhbWVEYXRlU2VsZWN0ZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEFyaWFBY3RpdmVkZXNjZW5kYW50KCkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9jdXNlZENlbGxJZCA9IHRoaXMuY2VsbFVJRCArIHRoaXMuZm9jdXNlZERhdGUuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIGZvY3VzZWRDZWxsSWQpO1xuICAgIH1cbn1cbkNhbGVuZGFyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kby1jYWxlbmRhcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIEJ1c1ZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBDQUxFTkRBUl9WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgICAgICAgICAgQ0FMRU5EQVJfUkFOR0VfVkFMSURBVE9SUyxcbiAgICAgICAgICAgICAgICAgICAgS0VORE9fSU5QVVRfUFJPVklERVIsXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERpc2FibGVkRGF0ZXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uY2FsZW5kYXInXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBTY3JvbGxTeW5jU2VydmljZVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jYWxlbmRhcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyIGtlbmRvQ2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc1xuICAgICAgICBpMThuLXRvZGF5PVwia2VuZG8uY2FsZW5kYXIudG9kYXl8VGhlIGxhYmVsIGZvciB0aGUgdG9kYXkgYnV0dG9uIGluIHRoZSBjYWxlbmRhciBoZWFkZXJcIlxuICAgICAgICB0b2RheT1cIlRPREFZXCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGtlbmRvLWNhbGVuZGFyLW5hdmlnYXRpb25cbiAgICAgICAgKm5nSWY9XCJuYXZpZ2F0aW9uXCJcbiAgICAgICAgW2FjdGl2ZVZpZXddPVwiYWN0aXZlVmlld0VudW1cIlxuICAgICAgICBbZm9jdXNlZERhdGVdPVwiZm9jdXNlZERhdGVcIlxuICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cIm5hdmlnYXRpb25JdGVtVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgpXCJcbiAgICA+XG4gICAgPC9rZW5kby1jYWxlbmRhci1uYXZpZ2F0aW9uPlxuICAgIDxrZW5kby1jYWxlbmRhci12aWV3bGlzdFxuICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3RW51bVwiXG4gICAgICAgIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiXG4gICAgICAgIFtjZWxsVGVtcGxhdGVSZWZdPVwiYWN0aXZlQ2VsbFRlbXBsYXRlKCk/LnRlbXBsYXRlUmVmXCJcbiAgICAgICAgW2hlYWRlclRpdGxlVGVtcGxhdGVSZWZdPVwiaGVhZGVyVGl0bGVUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICBbd2Vla051bWJlclRlbXBsYXRlUmVmXT1cIndlZWtOdW1iZXJUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICBbY2VsbFVJRF09XCJjZWxsVUlEXCJcbiAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgIFtmb2N1c2VkRGF0ZV09XCJmb2N1c2VkRGF0ZVwiXG4gICAgICAgIFt3ZWVrTnVtYmVyXT1cIndlZWtOdW1iZXJcIlxuICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGFjdGl2ZURhdGVDaGFuZ2UpPVwiZW1pdEV2ZW50KGFjdGl2ZVZpZXdEYXRlQ2hhbmdlLCAkZXZlbnQpXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKClcIlxuICAgID5cbiAgICA8L2tlbmRvLWNhbGVuZGFyLXZpZXdsaXN0PlxuICAgIDxrZW5kby1yZXNpemUtc2Vuc29yIChyZXNpemUpPVwib25SZXNpemUoKVwiPjwva2VuZG8tcmVzaXplLXNlbnNvcj5cbiAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DYWxlbmRhckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEJ1c1ZpZXdTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDYWxlbmRhckRPTVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IEluamVjdG9yIH0sXG4gICAgeyB0eXBlOiBTY3JvbGxTeW5jU2VydmljZSB9LFxuICAgIHsgdHlwZTogRGlzYWJsZWREYXRlc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFBpY2tlclNlcnZpY2UsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5DYWxlbmRhckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9jdXNlZERhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByYW5nZVZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGFiaW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZERhdGVzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBuYXZpZ2F0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBib3R0b21WaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3BWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2Vlay1udW1iZXInLF0gfV0sXG4gICAgYWN0aXZlVmlld0NoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGFjdGl2ZVZpZXdEYXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtb250aENlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICB5ZWFyQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAgeWVhckNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsneWVhckNlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICBkZWNhZGVDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGRlY2FkZUNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGVjYWRlQ2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIGNlbnR1cnlDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBjZW50dXJ5Q2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZW50dXJ5Q2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnd2Vla051bWJlclRlbXBsYXRlJyxdIH1dLFxuICAgIGhlYWRlclRpdGxlVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0hlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBoZWFkZXJUaXRsZVRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydoZWFkZXJUaXRsZVRlbXBsYXRlJyxdIH1dLFxuICAgIG5hdmlnYXRpb25JdGVtVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW05hdmlnYXRpb25JdGVtVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBuYXZpZ2F0aW9uSXRlbVRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduYXZpZ2F0aW9uSXRlbVRlbXBsYXRlJyxdIH1dLFxuICAgIG5hdmlnYXRpb25WaWV3OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtOYXZpZ2F0aW9uQ29tcG9uZW50LF0gfV0sXG4gICAgbW9udGhWaWV3OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtWaWV3TGlzdENvbXBvbmVudCxdIH1dLFxuICAgIHdpZGdldElkOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmlkJyxdIH1dLFxuICAgIHdpZGdldFJvbGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIucm9sZScsXSB9XSxcbiAgICBjYWxlbmRhclRhYkluZGV4OiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnRhYmluZGV4JyxdIH1dLFxuICAgIGFyaWFEaXNhYmxlZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLWRpc2FibGVkJyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1kaXNhYmxlZCcsXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGluY29tcGxldGVEYXRlVmFsaWRhdG9yID0gKCkgPT4ge1xuICAgIHJldHVybiAoY29udHJvbCwgaW5jb21wbGV0ZSkgPT4ge1xuICAgICAgICBpZiAoIWlzUHJlc2VudChjb250cm9sLnZhbHVlKSAmJiBpbmNvbXBsZXRlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpbmNvbXBsZXRlRGF0ZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbnZhciBBcnJvdztcbihmdW5jdGlvbiAoQXJyb3cpIHtcbiAgICBBcnJvd1tBcnJvd1tcIlVwXCJdID0gMF0gPSBcIlVwXCI7XG4gICAgQXJyb3dbQXJyb3dbXCJEb3duXCJdID0gMV0gPSBcIkRvd25cIjtcbiAgICBBcnJvd1tBcnJvd1tcIk5vbmVcIl0gPSAyXSA9IFwiTm9uZVwiO1xufSkoQXJyb3cgfHwgKEFycm93ID0ge30pKTtcblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG5jb25zdCBNSU5fRE9DX0xJTkskMSA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9EYXRlSW5wdXRDb21wb25lbnQvI3RvYy1taW4nO1xuY29uc3QgTUFYX0RPQ19MSU5LJDEgPSAnaHR0cDovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9hcGkvRGF0ZUlucHV0Q29tcG9uZW50LyN0b2MtbWF4JztcbmNvbnN0IFZBTFVFX0RPQ19MSU5LJDEgPSAnaHR0cDovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9kYXRlaW5wdXQvI3RvYy11c2luZy13aXRoLWpzb24nO1xuY29uc3QgREFURV9QQVJUX1JFR0VYUCA9IC95ZWFyfG1vbnRofDxkYXk+LztcbmNvbnN0IFRJTUVfUEFSVF9SRUdFWFAgPSAvaG91cnxtaW51dGV8c2Vjb25kfG1pbGxpc2Vjb25kLztcbmNvbnN0IFNIT1JUX1BBVFRFUk5fTEVOR1RIX1JFR0VYUCA9IC9kfE18SHxofG18cy87XG5jb25zdCBwYWRaZXJvID0gKGxlbmd0aCkgPT4gbmV3IEFycmF5KE1hdGgubWF4KGxlbmd0aCwgMCkpLmZpbGwoJzAnKS5qb2luKCcnKTtcbmNvbnN0IHVucGFkWmVybyA9ICh2YWx1ZSkgPT4gdmFsdWUucmVwbGFjZSgvXjAqLywgJycpO1xuY2xhc3MgTWFzayB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3ltYm9scyA9IFwiXCI7XG4gICAgfVxufVxuY2xhc3MgS2VuZG9EYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihpbnRsLCBmb3JtYXRQbGFjZWhvbGRlciwgZm9ybWF0LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmZvcm1hdFBsYWNlaG9sZGVyID0gZm9ybWF0UGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICB0aGlzLnllYXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm1vbnRoID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ob3VycyA9IHRydWU7XG4gICAgICAgIHRoaXMubWludXRlcyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2Vjb25kcyA9IHRydWU7XG4gICAgICAgIHRoaXMubWlsbGlzZWNvbmRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZWFkaW5nWmVybyA9IG51bGw7XG4gICAgICAgIHRoaXMubW9udGhOYW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMudHlwZWRNb250aFBhcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnZhbHVlID0gZ2V0RGF0ZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy5rbm93blBhcnRzID0gXCJhZEhobU1zRXlcIjtcbiAgICAgICAgdGhpcy5zeW1ib2xzID0ge1xuICAgICAgICAgICAgXCJFXCI6IFwiRVwiLFxuICAgICAgICAgICAgXCJIXCI6IFwiSFwiLFxuICAgICAgICAgICAgXCJNXCI6IFwiTVwiLFxuICAgICAgICAgICAgXCJhXCI6IFwiYVwiLFxuICAgICAgICAgICAgXCJkXCI6IFwiZFwiLFxuICAgICAgICAgICAgXCJoXCI6IFwiaFwiLFxuICAgICAgICAgICAgXCJtXCI6IFwibVwiLFxuICAgICAgICAgICAgXCJzXCI6IFwic1wiLFxuICAgICAgICAgICAgXCJ5XCI6IFwieVwiXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubW9udGhOYW1lcyA9IHRoaXMuYWxsRm9ybWF0ZWRNb250aHMoKTtcbiAgICAgICAgdGhpcy5kYXlQZXJpb2RzID0gdGhpcy5hbGxEYXlQZXJpb2RzKCk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBnZXREYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgY29uc3Qgc2FtcGxlRm9ybWF0ID0gdGhpcy5kYXRlRm9ybWF0U3RyaW5nKHRoaXMudmFsdWUsIHRoaXMuZm9ybWF0KS5zeW1ib2xzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVGb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEV4aXN0aW5nKHNhbXBsZUZvcm1hdFtpXSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IHByZWQgPSAoYSwgcCkgPT4gYSB8fCBwLnR5cGUgIT09ICdsaXRlcmFsJyAmJiBwLnR5cGUgIT09ICdkYXlwZXJpb2QnICYmIHRoaXMuZ2V0RXhpc3RpbmcocC5wYXR0ZXJuWzBdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50bC5zcGxpdERhdGVGb3JtYXQodGhpcy5mb3JtYXQpLnJlZHVjZShwcmVkLCBmYWxzZSk7XG4gICAgfVxuICAgIGdldERhdGVPYmplY3QoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5rbm93blBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0RXhpc3RpbmcodGhpcy5rbm93blBhcnRzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZURhdGUodGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIGdldFRleHRBbmRGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlKHRoaXMuaW50bC5mb3JtYXREYXRlKHRoaXMudmFsdWUsIHRoaXMuZm9ybWF0KSwgdGhpcy5kYXRlRm9ybWF0U3RyaW5nKHRoaXMudmFsdWUsIHRoaXMuZm9ybWF0KSk7XG4gICAgfVxuICAgIGdldEV4aXN0aW5nKHN5bWJvbCkge1xuICAgICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAgICAgY2FzZSBcInlcIjogcmV0dXJuIHRoaXMueWVhcjtcbiAgICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICBjYXNlIFwiTFwiOiByZXR1cm4gdGhpcy5tb250aDtcbiAgICAgICAgICAgIGNhc2UgXCJkXCI6IHJldHVybiB0aGlzLmRhdGU7XG4gICAgICAgICAgICBjYXNlIFwiRVwiOiByZXR1cm4gdGhpcy5kYXRlICYmIHRoaXMubW9udGggJiYgdGhpcy55ZWFyO1xuICAgICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJIXCI6IHJldHVybiB0aGlzLmhvdXJzO1xuICAgICAgICAgICAgY2FzZSBcIm1cIjogcmV0dXJuIHRoaXMubWludXRlcztcbiAgICAgICAgICAgIGNhc2UgXCJzXCI6IHJldHVybiB0aGlzLnNlY29uZHM7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRFeGlzdGluZyhzeW1ib2wsIHZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAoc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgICAgIHRoaXMueWVhciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXRGdWxsWWVhcigyMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vYWxsb3cgMi8yOSBkYXRlc1xuICAgICAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1vbnRoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhazsgLy9tYWtlIHN1cmUgeW91IGNhbiB0eXBlIDMxIGF0IGRheSBwYXJ0XG4gICAgICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmRzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW9kaWZ5UGFydChzeW1ib2wsIG9mZnNldCkge1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSBjbG9uZURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIHN3aXRjaCAoc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnNldEZ1bGxZZWFyKG5ld1ZhbHVlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGFkZE1vbnRocyh0aGlzLnZhbHVlLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUuc2V0RGF0ZShuZXdWYWx1ZS5nZXREYXRlKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUuc2V0SG91cnMobmV3VmFsdWUuZ2V0SG91cnMoKSArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnNldE1pbnV0ZXMobmV3VmFsdWUuZ2V0TWludXRlcygpICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUuc2V0U2Vjb25kcyhuZXdWYWx1ZS5nZXRTZWNvbmRzKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZS5zZXRIb3VycyhuZXdWYWx1ZS5nZXRIb3VycygpICsgKDEyICogb2Zmc2V0KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3VmFsdWUuZ2V0RnVsbFllYXIoKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RXhpc3Rpbmcoc3ltYm9sLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJzZVBhcnQoc3ltYm9sLCBjdXJyZW50Q2hhciwgcmVzZXRTZWdtZW50VmFsdWUpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50Q2hhcikge1xuICAgICAgICAgICAgdGhpcy5yZXNldExlYWRpbmdaZXJvKCk7XG4gICAgICAgICAgICB0aGlzLnNldEV4aXN0aW5nKHN5bWJvbCwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIHN3aXRjaFRvTmV4dDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmFzZURhdGUgPSB0aGlzLmludGwuZm9ybWF0RGF0ZSh0aGlzLnZhbHVlLCB0aGlzLmZvcm1hdCk7XG4gICAgICAgIGxldCBkYXRlUGFydHMgPSB0aGlzLmRhdGVGb3JtYXRTdHJpbmcodGhpcy52YWx1ZSwgdGhpcy5mb3JtYXQpO1xuICAgICAgICBsZXQgYmFzZUZvcm1hdCA9IGRhdGVQYXJ0cy5zeW1ib2xzO1xuICAgICAgICBsZXQgcmVwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHByZWZpeCA9IFwiXCI7XG4gICAgICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICAgICAgbGV0IHN1ZmZpeCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZURhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChiYXNlRm9ybWF0W2ldID09PSBzeW1ib2wpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ICs9IHRoaXMuZ2V0RXhpc3Rpbmcoc3ltYm9sKSA/IGJhc2VEYXRlW2ldIDogXCIwXCI7XG4gICAgICAgICAgICAgICAgcmVwbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXJlcGxhY2VkKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ICs9IGJhc2VEYXRlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ICs9IGJhc2VEYXRlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50TWF4TGVuZ3RoID0gY3VycmVudC5sZW5ndGggLSAzO1xuICAgICAgICBsZXQgcGFyc2VkRGF0ZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5tYXRjaE1vbnRoKGN1cnJlbnRDaGFyKTtcbiAgICAgICAgY29uc3QgZGF5UGVyaW9kID0gdGhpcy5tYXRjaERheVBlcmlvZChjdXJyZW50Q2hhciwgc3ltYm9sKTtcbiAgICAgICAgY29uc3QgaXNaZXJvQ3VycmVudENoYXIgPSBjdXJyZW50Q2hhciA9PT0gJzAnO1xuICAgICAgICBjb25zdCBsZWFkaW5nWmVybyA9ICh0aGlzLmxlYWRpbmdaZXJvIHx8IHt9KVtzeW1ib2xdIHx8IDA7XG4gICAgICAgIGlmIChpc1plcm9DdXJyZW50Q2hhcikge1xuICAgICAgICAgICAgbGV0IHZhbHVlTnVtYmVyID0gcGFyc2VJbnQocmVzZXRTZWdtZW50VmFsdWUgPyBjdXJyZW50Q2hhciA6IGN1cnJlbnQgKyBjdXJyZW50Q2hhciwgMTApO1xuICAgICAgICAgICAgaWYgKHZhbHVlTnVtYmVyID09PSAwICYmICF0aGlzLmlzQWJick1vbnRoKGRhdGVQYXJ0cy5wYXJ0TWFwLCBzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRMZWFkaW5nWmVybyhzeW1ib2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldExlYWRpbmdaZXJvKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGN1cnJlbnRNYXhMZW5ndGgpOyBpIDw9IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtaWRkbGUgPSByZXNldFNlZ21lbnRWYWx1ZSA/IGN1cnJlbnRDaGFyIDogKGN1cnJlbnQuc3Vic3RyaW5nKGkpICsgY3VycmVudENoYXIpO1xuICAgICAgICAgICAgbGV0IG1pZGRsZU51bWJlciA9IHBhcnNlSW50KG1pZGRsZSwgMTApO1xuICAgICAgICAgICAgcGFyc2VkRGF0ZSA9IHRoaXMuaW50bC5wYXJzZURhdGUocHJlZml4ICsgbWlkZGxlICsgc3VmZml4LCB0aGlzLmZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZERhdGUgJiYgIWlzTmFOKG1pZGRsZU51bWJlcikgJiYgIWlzTmFOKHBhcnNlSW50KGN1cnJlbnRDaGFyLCAxMCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbCA9PT0gJ00nICYmICFtb250aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb250aE51bWJlciA9IG1pZGRsZU51bWJlciAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb250aE51bWJlciA+IC0xICYmIG1vbnRoTnVtYmVyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGUgPSBjbG9uZURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRlLnNldE1vbnRoKG1vbnRoTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWREYXRlLmdldE1vbnRoKCkgIT09IG1vbnRoTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZSA9IGxhc3REYXlPZk1vbnRoKGFkZE1vbnRocyhwYXJzZWREYXRlLCAtMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09ICd5Jykge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRlID0gY3JlYXRlRGF0ZShwYXJzZUludChtaWRkbGUsIDEwKSwgdGhpcy5tb250aCA/IHRoaXMudmFsdWUuZ2V0TW9udGgoKSA6IDAsIHRoaXMuZGF0ZSA/IHRoaXMudmFsdWUuZ2V0RGF0ZSgpIDogMSwgdGhpcy5ob3VycyA/IHRoaXMudmFsdWUuZ2V0SG91cnMoKSA6IDAsIHRoaXMubWludXRlcyA/IHRoaXMudmFsdWUuZ2V0TWludXRlcygpIDogMCwgdGhpcy5zZWNvbmRzID8gdGhpcy52YWx1ZS5nZXRTZWNvbmRzKCkgOiAwLCB0aGlzLm1pbGxpc2Vjb25kcyA/IHRoaXMudmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCkgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZSAmJiBwYXJzZWREYXRlLmdldERhdGUoKSAhPT0gdGhpcy52YWx1ZS5nZXREYXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGUgPSBsYXN0RGF5T2ZNb250aChhZGRNb250aHMocGFyc2VkRGF0ZSwgLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgLy9tb3ZlIHRvIG5leHQgc2VnbWVudCBpZiB0aGUgcGFydCB3aWxsIG92ZXJmbG93IHdpdGggbmV4dCBjaGFyXG4gICAgICAgICAgICAgICAgLy93aGVuIHN0YXJ0IGZyb20gZW1wdHkgZGF0ZSAoMDEsIHRoZW4gMDEwKSwgcGFkZGVkIHplcm9zIHNob3VsZCBiZSB0cmltbWVkXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblZhbHVlID0gdGhpcy5wYXJ0UGF0dGVybihkYXRlUGFydHMucGFydE1hcCwgc3ltYm9sKS5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlZWtEYXRlID0gdGhpcy5pbnRsLnBhcnNlRGF0ZShgJHtwcmVmaXh9JHt0aGlzLnBlZWsobWlkZGxlLCBwYXR0ZXJuVmFsdWUpfSR7c3VmZml4fWAsIHRoaXMuZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gdGhpcy5wYXR0ZXJuTGVuZ3RoKHBhdHRlcm5WYWx1ZSkgfHwgcGF0dGVyblZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuU2F0aXNmaWVkID0gKGxlYWRpbmdaZXJvICsgKHVucGFkWmVybyhtaWRkbGUpIHx8IGN1cnJlbnRDaGFyKS5sZW5ndGgpID49IHBhdHRlcm5MZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3dpdGNoVG9OZXh0ID0gcGVla0RhdGUgPT09IG51bGwgfHwgcGF0dGVyblNhdGlzZmllZDtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEV4aXN0aW5nKHN5bWJvbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMudmFsdWUsIHN3aXRjaFRvTmV4dDogc3dpdGNoVG9OZXh0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbnRoKSB7XG4gICAgICAgICAgICBwYXJzZWREYXRlID0gdGhpcy5pbnRsLnBhcnNlRGF0ZShwcmVmaXggKyBtb250aCArIHN1ZmZpeCwgdGhpcy5mb3JtYXQpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEV4aXN0aW5nKHN5bWJvbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMudmFsdWUsIHN3aXRjaFRvTmV4dDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5UGVyaW9kKSB7XG4gICAgICAgICAgICBwYXJzZWREYXRlID0gdGhpcy5pbnRsLnBhcnNlRGF0ZShwcmVmaXggKyBkYXlQZXJpb2QgKyBzdWZmaXgsIHRoaXMuZm9ybWF0KTtcbiAgICAgICAgICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcnNlZERhdGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMudmFsdWUsIHN3aXRjaFRvTmV4dDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1plcm9DdXJyZW50Q2hhcikge1xuICAgICAgICAgICAgdGhpcy5zZXRFeGlzdGluZyhzeW1ib2wsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogbnVsbCwgc3dpdGNoVG9OZXh0OiBmYWxzZSB9O1xuICAgIH1cbiAgICByZXNldExlYWRpbmdaZXJvKCkge1xuICAgICAgICBjb25zdCBoYXNMZWFkaW5nWmVybyA9IHRoaXMubGVhZGluZ1plcm8gIT09IG51bGw7XG4gICAgICAgIHRoaXMuc2V0TGVhZGluZ1plcm8obnVsbCk7XG4gICAgICAgIHJldHVybiBoYXNMZWFkaW5nWmVybztcbiAgICB9XG4gICAgc2V0TGVhZGluZ1plcm8obGVhZGluZ1plcm8pIHtcbiAgICAgICAgdGhpcy5sZWFkaW5nWmVybyA9IGxlYWRpbmdaZXJvO1xuICAgIH1cbiAgICBpbmNyZW1lbnRMZWFkaW5nWmVybyhzeW1ib2wpIHtcbiAgICAgICAgY29uc3QgbGVhZGluZ1plcm8gPSB0aGlzLmxlYWRpbmdaZXJvIHx8IHt9O1xuICAgICAgICBsZWFkaW5nWmVyb1tzeW1ib2xdID0gKGxlYWRpbmdaZXJvW3N5bWJvbF0gfHwgMCkgKyAxO1xuICAgICAgICB0aGlzLmxlYWRpbmdaZXJvID0gbGVhZGluZ1plcm87XG4gICAgfVxuICAgIGlzQWJick1vbnRoKHBhcnRzLCBzeW1ib2wpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGFydFBhdHRlcm4ocGFydHMsIHN5bWJvbCk7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnR5cGUgPT09ICdtb250aCcgJiYgcGF0dGVybi5uYW1lcztcbiAgICB9XG4gICAgcGFydFBhdHRlcm4ocGFydHMsIHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcGFydHMuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnBhdHRlcm4uaW5kZXhPZihzeW1ib2wpICE9PSAtMSlbMF07XG4gICAgfVxuICAgIHBlZWsodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcGVla1ZhbHVlID0gdW5wYWRaZXJvKHZhbHVlKSArICcwJztcbiAgICAgICAgcmV0dXJuIHBhZFplcm8ocGF0dGVybi5sZW5ndGggLSBwZWVrVmFsdWUubGVuZ3RoKSArIHBlZWtWYWx1ZTtcbiAgICB9XG4gICAgbWF0Y2hNb250aCh0eXBlZENoYXIpIHtcbiAgICAgICAgdGhpcy50eXBlZE1vbnRoUGFydCArPSB0eXBlZENoYXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1vbnRoTmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnR5cGVkTW9udGhQYXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb250aE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9udGhOYW1lc1tpXS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy50eXBlZE1vbnRoUGFydCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9udGhOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb250aEFzTnVtID0gcGFyc2VJbnQodGhpcy50eXBlZE1vbnRoUGFydCwgMTApO1xuICAgICAgICAgICAgaWYgKG1vbnRoQXNOdW0gPj0gMSAmJiBtb250aEFzTnVtIDw9IDEyICYmIG1vbnRoQXNOdW0udG9TdHJpbmcoKSA9PT0gdGhpcy50eXBlZE1vbnRoUGFydCAvKmVuc3VyZSB0aGV5IGV4YWN0IG1hdGNoKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb250aE5hbWVzW21vbnRoQXNOdW0gLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHlwZWRNb250aFBhcnQgPSB0aGlzLnR5cGVkTW9udGhQYXJ0LnN1YnN0cmluZygxLCB0aGlzLnR5cGVkTW9udGhQYXJ0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIG1hdGNoRGF5UGVyaW9kKHR5cGVkQ2hhciwgc3ltYm9sKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyQ2hhcnQgPSBTdHJpbmcodHlwZWRDaGFyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoc3ltYm9sID09PSAnYScgJiYgdGhpcy5kYXlQZXJpb2RzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXlQZXJpb2RzLmFtLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsb3dlckNoYXJ0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheVBlcmlvZHMuYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRheVBlcmlvZHMucG0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGxvd2VyQ2hhcnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5UGVyaW9kcy5wbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGFsbEZvcm1hdGVkTW9udGhzKCkge1xuICAgICAgICBjb25zdCBkYXRlRm9ybWF0UGFydHMgPSB0aGlzLmludGwuc3BsaXREYXRlRm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlRm9ybWF0UGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0UGFydHNbaV0udHlwZSA9PT0gXCJtb250aFwiICYmIGRhdGVGb3JtYXRQYXJ0c1tpXS5uYW1lcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGwuZGF0ZUZvcm1hdE5hbWVzKGRhdGVGb3JtYXRQYXJ0c1tpXS5uYW1lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFsbERheVBlcmlvZHMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGVGb3JtYXRQYXJ0cyA9IHRoaXMuaW50bC5zcGxpdERhdGVGb3JtYXQodGhpcy5mb3JtYXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGVGb3JtYXRQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXRQYXJ0c1tpXS50eXBlID09PSBcImRheXBlcmlvZFwiICYmIGRhdGVGb3JtYXRQYXJ0c1tpXS5uYW1lcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGwuZGF0ZUZvcm1hdE5hbWVzKGRhdGVGb3JtYXRQYXJ0c1tpXS5uYW1lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBhdHRlcm5MZW5ndGgocGF0dGVybikge1xuICAgICAgICBpZiAocGF0dGVyblswXSA9PT0gJ3knKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoU0hPUlRfUEFUVEVSTl9MRU5HVEhfUkVHRVhQLnRlc3QocGF0dGVybikpIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1RPRE86IFJFTU9WRSFcbiAgICBkYXRlRm9ybWF0U3RyaW5nKGRhdGUsIGZvcm1hdCkge1xuICAgICAgICBjb25zdCBkYXRlRm9ybWF0UGFydHMgPSB0aGlzLmludGwuc3BsaXREYXRlRm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgIGNvbnN0IHBhcnRNYXAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlRm9ybWF0UGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXJ0TGVuZ3RoID0gdGhpcy5pbnRsLmZvcm1hdERhdGUoZGF0ZSwgeyBwYXR0ZXJuOiBkYXRlRm9ybWF0UGFydHNbaV0ucGF0dGVybiB9KS5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAocGFydExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuc3ltYm9sc1tkYXRlRm9ybWF0UGFydHNbaV0ucGF0dGVyblswXV0gfHwgXCJfXCIpO1xuICAgICAgICAgICAgICAgIHBhcnRNYXAucHVzaChkYXRlRm9ybWF0UGFydHNbaV0pO1xuICAgICAgICAgICAgICAgIHBhcnRMZW5ndGgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG5ldyBNYXNrKCk7XG4gICAgICAgIHJldHVyblZhbHVlLnN5bWJvbHMgPSBwYXJ0cy5qb2luKFwiXCIpO1xuICAgICAgICByZXR1cm5WYWx1ZS5wYXJ0TWFwID0gcGFydE1hcDtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICBtZXJnZSh0ZXh0LCBtYXNrKSB7XG4gICAgICAgIC8vIEltcG9ydGFudDogcmlnaHQgdG8gbGVmdC5cbiAgICAgICAgbGV0IHJlc3VsdFRleHQgPSBcIlwiO1xuICAgICAgICBsZXQgcmVzdWx0Rm9ybWF0ID0gXCJcIjtcbiAgICAgICAgbGV0IGZvcm1hdCA9IG1hc2suc3ltYm9scztcbiAgICAgICAgZm9yIChsZXQgciA9IGZvcm1hdC5sZW5ndGggLSAxOyByID49IDA7IHItLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMua25vd25QYXJ0cy5pbmRleE9mKGZvcm1hdFtyXSkgPT09IC0xIHx8IHRoaXMuZ2V0RXhpc3RpbmcoZm9ybWF0W3JdKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFRleHQgPSB0ZXh0W3JdICsgcmVzdWx0VGV4dDtcbiAgICAgICAgICAgICAgICByZXN1bHRGb3JtYXQgPSBmb3JtYXRbcl0gKyByZXN1bHRGb3JtYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ltYm9sID0gZm9ybWF0W3JdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChyID49IDAgJiYgY3VycmVudFN5bWJvbCA9PT0gZm9ybWF0W3JdKSB7XG4gICAgICAgICAgICAgICAgICAgIHItLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcisrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRpbmdaZXJvICYmIHRoaXMubGVhZGluZ1plcm9bY3VycmVudFN5bWJvbF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0VGV4dCA9ICcwJyArIHJlc3VsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRUZXh0ID0gdGhpcy5kYXRlRmllbGROYW1lKG1hc2sucGFydE1hcFtyXSkgKyByZXN1bHRUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAocmVzdWx0Rm9ybWF0Lmxlbmd0aCA8IHJlc3VsdFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEZvcm1hdCA9IGZvcm1hdFtyXSArIHJlc3VsdEZvcm1hdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHRUZXh0LCByZXN1bHRGb3JtYXRdO1xuICAgIH1cbiAgICBkYXRlRmllbGROYW1lKHBhcnQpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0UGxhY2Vob2xkZXIgPSB0aGlzLmZvcm1hdFBsYWNlaG9sZGVyIHx8ICd3aWRlJztcbiAgICAgICAgaWYgKGZvcm1hdFBsYWNlaG9sZGVyW3BhcnQudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRQbGFjZWhvbGRlcltwYXJ0LnR5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXRQbGFjZWhvbGRlciA9PT0gJ2Zvcm1hdFBhdHRlcm4nKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydC5wYXR0ZXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmludGwuZGF0ZUZpZWxkTmFtZShPYmplY3QuYXNzaWduKHBhcnQsIHsgbmFtZVR5cGU6IGZvcm1hdFBsYWNlaG9sZGVyIH0pKTtcbiAgICB9XG59XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBEYXRlSW5wdXQgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGVpbnB1dCAlfSN0b2MtYmFzaWMtdXNhZ2UpLlxuICovXG5jbGFzcyBEYXRlSW5wdXRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGNkciwgaW50bCwgcmVuZGVyZXIsIGVsZW1lbnQsIG5nWm9uZSwgaW5qZWN0b3IsIGxvY2FsaXphdGlvbiwgcGlja2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5pbnRsID0gaW50bDtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlID0gcGlja2VyU2VydmljZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNhYmxlSWQgPSBgay0ke2d1aWQoKX1gO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyBvciBnZXRzIHRoZSBgZGlzYWJsZWRgIHByb3BlcnR5IG9mIHRoZSBEYXRlSW5wdXQgYW5kXG4gICAgICAgICAqIGRldGVybWluZXMgd2hldGhlciB0aGUgY29tcG9uZW50IGlzIGFjdGl2ZVxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRpc2FibGVkX2RhdGVpbnB1dCAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyBvciBnZXRzIHRoZSByZWFkLW9ubHkgc3RhdGUgb2YgdGhlIERhdGVJbnB1dFxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJlYWRvbmx5X2RhdGVpbnB1dCAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWFkb25seSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIERhdGVJbnB1dC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGUgPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyBvciBnZXRzIHRoZSBgdGFiSW5kZXhgIHByb3BlcnR5IG9mIHRoZSBEYXRlSW5wdXQuXG4gICAgICAgICAqIC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFiaW5kZXggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yb2xlID0gJ3NwaW5idXR0b24nO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hcmlhUmVhZE9ubHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgZGF0ZSBmb3JtYXQgdGhhdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZm9ybWF0c19kYXRlaW5wdXQgJX0pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gXCJkXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIGhpbnQgdGhlIERhdGVJbnB1dCBkaXNwbGF5cyB3aGVuIGl0cyB2YWx1ZSBpcyBgbnVsbGAuXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvblxuICAgICAgICAgKiBbcGxhY2Vob2xkZXJzXSh7JSBzbHVnIHBsYWNlaG9sZGVyc19kYXRlaW5wdXQgJX0pLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgICAgICogdGVtcGxhdGU6IGBcbiAgICAgICAgICogIDxrZW5kby1kYXRlaW5wdXQgcGxhY2Vob2xkZXI9XCJFbnRlciBiaXJ0aCBkYXRlLi4uXCI+PC9rZW5kby1kYXRlaW5wdXQ+XG4gICAgICAgICAqIGBcbiAgICAgICAgICogfSlcbiAgICAgICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgYnVpbHQtaW4gbWluIG9yIG1heCB2YWxpZGF0b3JzIGFyZSB0byBiZSBlbmZvcmNlZCB3aGVuIGEgZm9ybSBpcyBiZWluZyB2YWxpZGF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhbmdlVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqIEJhc2VkIG9uIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG8tY29ycmVjdGVkIHdoaWxlIHR5cGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0b0NvcnJlY3QgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgYnVpbHQtaW4gdmFsaWRhdGlvbiBmb3IgaW5jb21wbGV0ZSBkYXRlcyBpcyB0byBiZSBlbmZvcmNlZCB3aGVuIGEgZm9ybSBpcyBiZWluZyB2YWxpZGF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlICoqVXAqKiBhbmQgKipEb3duKiogc3BpbiBidXR0b25zIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvblxuICAgICAgICAgKiBbc3Bpbm5lciBidXR0b25zXSh7JSBzbHVnIHNwaW5idXR0b25zX2RhdGVpbnB1dCAlfSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNwaW5uZXJzID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUG9wdXBPcGVuID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhc1BvcHVwID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyB2YWx1ZS5cbiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBzZWN0aW9uIG9uXG4gICAgICAgICAqIFtldmVudHNdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZWlucHV0ICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgdXNlciBzZWxlY3RzIGEgbmV3IHZhbHVlLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld19kYXRlaW5wdXQgJX0jdG9jLWV2ZW50cykuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZhbHVlVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIGZvY3VzZXMgdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgc2VjdGlvbiBvblxuICAgICAgICAgKiBbZXZlbnRzXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGVpbnB1dCAlfSN0b2MtZXZlbnRzKS5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBUbyB3aXJlIHRoZSBldmVudCBwcm9ncmFtbWF0aWNhbGx5LCB1c2UgdGhlIGBvbkZvY3VzYCBwcm9wZXJ0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogX0BDb21wb25lbnQoe1xuICAgICAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAqICA8a2VuZG8tZGF0ZWlucHV0IChmb2N1cyk9XCJoYW5kbGVGb2N1cygpXCI+PC9rZW5kby1kYXRlaW5wdXQ+XG4gICAgICAgICAqIGBcbiAgICAgICAgICogfSlcbiAgICAgICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XG4gICAgICAgICAqICAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgICAgICAgKiAgICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50IGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBpbnB1dCBlbGVtZW50IGdldHMgYmx1cnJlZC5cbiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBzZWN0aW9uIG9uXG4gICAgICAgICAqIFtldmVudHNdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZWlucHV0ICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IFRvIHdpcmUgdGhlIGV2ZW50IHByb2dyYW1tYXRpY2FsbHksIHVzZSB0aGUgYG9uQmx1cmAgcHJvcGVydHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgPGtlbmRvLWRhdGVpbnB1dCAoYmx1cik9XCJoYW5kbGVCbHVyKClcIj48L2tlbmRvLWRhdGVpbnB1dD5cbiAgICAgICAgICogYFxuICAgICAgICAgKiB9KVxuICAgICAgICAgKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgICAgICogICBwdWJsaWMgaGFuZGxlQmx1cigpOiB2b2lkIHtcbiAgICAgICAgICogICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudCBpcyBibHVycmVkXCIpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgICAgICB0aGlzLmFycm93ID0gQXJyb3c7XG4gICAgICAgIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSBBcnJvdy5Ob25lO1xuICAgICAgICB0aGlzLmZvcm1hdFNlY3Rpb25zID0geyBkYXRlOiBmYWxzZSwgdGltZTogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5oYXNNb3VzZWRvd24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkUHJpb3JUb01vdXNlZG93biA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0RhdGVJbmNvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybWF0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5iYWNrc3BhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFNlZ21lbnRWYWx1ZSA9IHRydWU7XG4gICAgICAgIHRoaXMubWluVmFsaWRhdG9yID0gbm9vcDtcbiAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IgPSBub29wO1xuICAgICAgICB0aGlzLmluY29tcGxldGVWYWxpZGF0b3IgPSBub29wO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmtlbmRvRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGFzdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQgPSBub29wO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gbm9vcDtcbiAgICAgICAgdGhpcy5zeW1ib2xzTWFwID0gdGhpcy5kYXRlU3ltYm9sTWFwKCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybWF0U2VjdGlvbnMoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLmlucHV0ID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IHRhYkluZGV4KHRhYkluZGV4KSB7XG4gICAgICAgIHRoaXMudGFiaW5kZXggPSB0YWJJbmRleDtcbiAgICB9XG4gICAgZ2V0IHRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJpbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgRGF0ZUlucHV0IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqID4gVGhlIGB2YWx1ZWAgaGFzIHRvIGJlIGEgdmFsaWQgW0phdmFTY3JpcHQgYERhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlKSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9Db3JyZWN0ICYmICFpc0luUmFuZ2UodmFsdWUsIHRoaXMubWluLCB0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVVcGRhdGUuZW1pdChjbG9uZURhdGUodmFsdWUpKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIGdldCB3cmFwcGVyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZGlzYWJsZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuICAgIGdldCBpbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVJbnB1dCA/IHRoaXMuZGF0ZUlucHV0Lm5hdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgaW5wdXRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlucHV0RWxlbWVudCB8fCB7fSkudmFsdWUgfHwgJyc7XG4gICAgfVxuICAgIGdldCBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgc2V0IGlzQWN0aXZlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNQcmVzZW50KHRoaXMucGlja2VyU2VydmljZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2stc3RhdGUtZm9jdXNlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnay1zdGF0ZS1mb2N1c2VkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFVzZWQgYnkgdGhlIFRleHRCb3hDb250YWluZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb21wb25lbnQgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY3VycmVudFZhbHVlIHx8ICFTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUpLnRyaW0oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnRhaW5zRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGNsb3Nlc3QoZWxlbWVudCwgbm9kZSA9PiBub2RlID09PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICB0aGlzLnZlcmlmeVJhbmdlKCk7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbiB8fCBjaGFuZ2VzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IgPSB0aGlzLnJhbmdlVmFsaWRhdGlvbiA/IG1pblZhbGlkYXRvcih0aGlzLm1pbikgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IgPSB0aGlzLnJhbmdlVmFsaWRhdGlvbiA/IG1heFZhbGlkYXRvcih0aGlzLm1heCkgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gdGhpcy5pbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb24gPyBpbmNvbXBsZXRlRGF0ZVZhbGlkYXRvcigpIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5mb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMuc3ltYm9sc01hcCA9IHRoaXMuZGF0ZVN5bWJvbE1hcCgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtYXRTZWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXF1YWxUb0tlbmRvRGF0ZSA9IHRoaXMua2VuZG9EYXRlICYmIGlzRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5rZW5kb0RhdGUuZ2V0RGF0ZU9iamVjdCgpKTtcbiAgICAgICAgaWYgKGNoYW5nZXMuZm9ybWF0IHx8ICFpc0VxdWFsVG9LZW5kb0RhdGUgfHwgY2hhbmdlcy5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5rZW5kb0RhdGUgPSB0aGlzLmdldEtlbmRvRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFZhbHVlKHRoaXMuaXNBY3RpdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5pbnRsU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmludGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UuaW5wdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLmZvckVhY2godW5iaW5kQ2FsbGJhY2sgPT4gdW5iaW5kQ2FsbGJhY2soKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZShjb250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pblZhbGlkYXRvcihjb250cm9sKSB8fCB0aGlzLm1heFZhbGlkYXRvcihjb250cm9sKSB8fCB0aGlzLmluY29tcGxldGVWYWxpZGF0b3IoY29udHJvbCwgdGhpcy5pc0RhdGVJbmNvbXBsZXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm4pIHtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMua2VuZG9EYXRlID0gdGhpcy5nZXRLZW5kb0RhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFZhbHVlKCk7XG4gICAgICAgIHRoaXMuaW50bFN1YnNjcmlwdGlvbiA9IHRoaXMuaW50bC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmludGxDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0YWJpbmRleCcpO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vbmdNb2RlbCBiaW5kaW5nXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHdyaXRlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMua2VuZG9EYXRlID0gdGhpcy5nZXRLZW5kb0RhdGUodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gY2xvbmVEYXRlKHZhbHVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50VmFsdWUodGhpcy5pc0FjdGl2ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0cmlnZ2VyQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMua2VuZG9EYXRlLmdldERhdGVPYmplY3QoKTtcbiAgICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjbG9uZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbm90aWZ5KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UoY2xvbmVEYXRlKHRoaXMudmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjbG9uZURhdGUodGhpcy52YWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBEYXRlSW5wdXQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICogdGVtcGxhdGU6IGBcbiAgICAgKiAgPGJ1dHRvbiAoY2xpY2spPVwiZGF0ZWlucHV0LmZvY3VzKClcIj5Gb2N1cyBkYXRlIGlucHV0PC9idXR0b24+XG4gICAgICogIDxrZW5kby1kYXRlaW5wdXQgI2RhdGVpbnB1dD48L2tlbmRvLWRhdGVpbnB1dD5cbiAgICAgKiBgXG4gICAgICogfSlcbiAgICAgKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGVTZWdtZW50KHRoaXMuY3VycmVudEZvcm1hdFswXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQmx1cnMgdGhlIERhdGVJbnB1dCBjb21wb25lbnQuXG4gICAgICovXG4gICAgYmx1cigpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0RWxlbWVudDtcbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICBpbnB1dC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUJ1dHRvbkNsaWNrKG9mZnNldCkge1xuICAgICAgICB0aGlzLmFycm93RGlyZWN0aW9uID0gQXJyb3cuTm9uZTtcbiAgICAgICAgdGhpcy5tb2RpZnlEYXRlU2VnbWVudFZhbHVlKG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBtb2RpZnlEYXRlU2VnbWVudFZhbHVlKG9mZnNldCkge1xuICAgICAgICBjb25zdCBjYXJldCA9IHRoaXMuY2FyZXQoKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jdXJyZW50Rm9ybWF0W2NhcmV0WzBdXTtcbiAgICAgICAgY29uc3Qgc3RlcCA9ICh0aGlzLnN0ZXBzIHx8IHt9KVt0aGlzLnN5bWJvbHNNYXBbc3ltYm9sXV0gfHwgMTtcbiAgICAgICAgdGhpcy5rZW5kb0RhdGUubW9kaWZ5UGFydChzeW1ib2wsIG9mZnNldCAqIHN0ZXApO1xuICAgICAgICB0aGlzLnB1dERhdGVJblJhbmdlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFZhbHVlKHRoaXMuaXNBY3RpdmUpO1xuICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5zZWxlY3REYXRlU2VnbWVudChzeW1ib2wpO1xuICAgICAgICB0aGlzLnVwZGF0ZUluY29tcGxldGVWYWxpZGF0aW9uU3RhdHVzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzd2l0Y2hEYXRlU2VnbWVudChvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgY2FyZXQgPSB0aGlzLmNhcmV0KCk7XG4gICAgICAgIGlmICh0aGlzLmtlbmRvRGF0ZS5yZXNldExlYWRpbmdaZXJvKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFZhbHVlKHRoaXMuaXNBY3RpdmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJldFswXSA8IGNhcmV0WzFdICYmIHRoaXMuY3VycmVudEZvcm1hdFtjYXJldFswXV0gIT09IHRoaXMuY3VycmVudEZvcm1hdFtjYXJldFsxXSAtIDFdKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5lYXJlc3RTZWdtZW50KG9mZnNldCA+IDAgPyBjYXJldFswXSA6IGNhcmV0WzFdIC0gMSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VnbWVudFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRm9ybWF0U3ltYm9sID0gdGhpcy5jdXJyZW50Rm9ybWF0W2NhcmV0WzBdXTtcbiAgICAgICAgbGV0IGEgPSBjYXJldFswXSArIG9mZnNldDtcbiAgICAgICAgd2hpbGUgKGEgPiAwICYmIGEgPCB0aGlzLmN1cnJlbnRGb3JtYXQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9ybWF0W2FdICE9PSBwcmV2aW91c0Zvcm1hdFN5bWJvbCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1hdFthXSAhPT0gXCJfXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGEgKz0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb3JtYXRbYV0gPT09IFwiX1wiKSB7XG4gICAgICAgICAgICAvL3RoZXJlIGlzIG5vdCBrbm93biBzeW1ib2wgZm91bmRcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYiA9IGE7XG4gICAgICAgIHdoaWxlIChiID49IDAgJiYgYiA8IHRoaXMuY3VycmVudEZvcm1hdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb3JtYXRbYl0gIT09IHRoaXMuY3VycmVudEZvcm1hdFthXSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiArPSBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPiBiICYmIChiICsgMSAhPT0gY2FyZXRbMF0gfHwgYSArIDEgIT09IGNhcmV0WzFdKSkge1xuICAgICAgICAgICAgdGhpcy5jYXJldChiICsgMSwgYSArIDEpO1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlZ21lbnRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhIDwgYiAmJiAoYSAhPT0gY2FyZXRbMF0gfHwgYiAhPT0gY2FyZXRbMV0pKSB7XG4gICAgICAgICAgICB0aGlzLmNhcmV0KGEsIGIpO1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlZ21lbnRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZWxlY3REYXRlU2VnbWVudChzeW1ib2wpIHtcbiAgICAgICAgbGV0IGJlZ2luID0gLTE7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY3VycmVudEZvcm1hdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvcm1hdFtpXSA9PT0gc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZWdpbiA8IDApIHtcbiAgICAgICAgICAgIGJlZ2luID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcmV0KDAsIDApO1xuICAgICAgICB0aGlzLmNhcmV0KGJlZ2luLCBlbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuaGFzTW91c2Vkb3duID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25QcmVzZW50ID0gdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVG9nZ2xlZCA9IGlzUHJlc2VudCh0aGlzLnBsYWNlaG9sZGVyKSAmJiAhdGhpcy5rZW5kb0RhdGUuaGFzVmFsdWUoKSAmJiAhdGhpcy5mb2N1c2VkUHJpb3JUb01vdXNlZG93bjtcbiAgICAgICAgICAgIC8vIGZvY3VzIGZpcnN0IHNlZ21lbnQgaWYgdGhlIHVzZXIgaGFzbid0IHNlbGVjdGVkIHNvbWV0aGluZyBkdXJpbmcgbW91c2Vkb3duIGFuZCBpZiB0aGUgcGxhY2Vob2xkZXIgd2FzIGp1c3QgdG9nZ2xlZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0Rmlyc3RTZWdtZW50ID0gIXNlbGVjdGlvblByZXNlbnQgJiYgcGxhY2Vob2xkZXJUb2dnbGVkO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3RGaXJzdFNlZ21lbnQgPyAwIDogdGhpcy5jYXJldCgpWzBdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3ROZWFyZXN0U2VnbWVudChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZURyYWdBbmREcm9wKGFyZ3MpIHtcbiAgICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlTW91c2Vkb3duKCkge1xuICAgICAgICB0aGlzLmhhc01vdXNlZG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9jdXNlZFByaW9yVG9Nb3VzZWRvd24gPSB0aGlzLmlzQWN0aXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlRm9jdXMoYXJncykge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50VmFsdWUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01vdXNlZG93bikge1xuICAgICAgICAgICAgdGhpcy5jYXJldCgwLCB0aGlzLmlucHV0VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc01vdXNlZG93biA9IGZhbHNlO1xuICAgICAgICBpZiAoaGFzT2JzZXJ2ZXJzKHRoaXMub25Gb2N1cykpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Rm9jdXMoYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdEZvY3VzKGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVCbHVyKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0U2VnbWVudFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5rZW5kb0RhdGUucmVzZXRMZWFkaW5nWmVybygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRWYWx1ZSgpO1xuICAgICAgICBpZiAoaGFzT2JzZXJ2ZXJzKHRoaXMub25CbHVyKSB8fCByZXF1aXJlc1pvbmVPbkJsdXIodGhpcy5uZ0NvbnRyb2wpKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEJsdXIoYXJncyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdEJsdXIoYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0S2VuZG9EYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgbGVhZGluZ1plcm8gfSA9ICh0aGlzLmtlbmRvRGF0ZSB8fCB7fSkgfHwgbnVsbDtcbiAgICAgICAgY29uc3Qga2VuZG9EYXRlID0gbmV3IEtlbmRvRGF0ZSh0aGlzLmludGwsIHRoaXMuZm9ybWF0UGxhY2Vob2xkZXIsIHRoaXMuZm9ybWF0LCB2YWx1ZSk7XG4gICAgICAgIGtlbmRvRGF0ZS5zZXRMZWFkaW5nWmVybyh0aGlzLmlzQWN0aXZlID8gbGVhZGluZ1plcm8gOiBudWxsKTtcbiAgICAgICAgcmV0dXJuIGtlbmRvRGF0ZTtcbiAgICB9XG4gICAgZGF0ZVN5bWJvbE1hcCgpIHtcbiAgICAgICAgY29uc3QgcmVkdWNlciA9IChtYXAkJDEsIHBhcnQpID0+IHtcbiAgICAgICAgICAgIG1hcCQkMVtwYXJ0LnBhdHRlcm5bMF1dID0gcGFydC50eXBlO1xuICAgICAgICAgICAgcmV0dXJuIG1hcCQkMTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50bC5zcGxpdERhdGVGb3JtYXQodGhpcy5mb3JtYXQpLnJlZHVjZShyZWR1Y2VyLCB7fSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRWYWx1ZShpc0FjdGl2ZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY2FyZXQoKVswXTsgLy9YWFg6IGdldCBjYXJldCBwb3NpdGlvbiBiZWZvcmUgaW5wdXQgaXMgdXBkYXRlZFxuICAgICAgICBjb25zdCB0ZXh0cyA9IHRoaXMua2VuZG9EYXRlLmdldFRleHRBbmRGb3JtYXQoKTtcbiAgICAgICAgY29uc3Qgc2hvd1BsYWNlaG9sZGVyID0gIXRoaXMuaXNBY3RpdmUgJiYgaXNQcmVzZW50KHRoaXMucGxhY2Vob2xkZXIpICYmICF0aGlzLmtlbmRvRGF0ZS5oYXNWYWx1ZSgpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLmN1cnJlbnRGb3JtYXQgPSB0ZXh0c1sxXTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSAhc2hvd1BsYWNlaG9sZGVyID8gdGV4dHNbMF0gOiAnJztcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgXCJ2YWx1ZVwiLCB0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmIChpbnB1dC5wbGFjZWhvbGRlciAhPT0gdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgXCJwbGFjZWhvbGRlclwiLCB0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TmVhcmVzdFNlZ21lbnQoc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhcmV0KHN0YXJ0LCBlbmQgPSBzdGFydCkge1xuICAgICAgICBjb25zdCBpc1Bvc2l0aW9uID0gc3RhcnQgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gW3N0YXJ0LCBzdGFydF07XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmlucHV0RWxlbWVudDtcbiAgICAgICAgaWYgKGlzUG9zaXRpb24gJiYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGlvblN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudEF2YWlsYWJsZSgpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IFtlbGVtZW50LnNlbGVjdGlvblN0YXJ0LCBlbGVtZW50LnNlbGVjdGlvbkVuZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICBzZWxlY3ROZWFyZXN0U2VnbWVudChpbmRleCkge1xuICAgICAgICAvLyBGaW5kcyB0aGUgbmVhcmVzdCAoaW4gYm90aCBkaXJlY3Rpb25zKSBrbm93biBwYXJ0LlxuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXgsIGogPSBpbmRleCAtIDE7IGkgPCB0aGlzLmN1cnJlbnRGb3JtYXQubGVuZ3RoIHx8IGogPj0gMDsgaSsrLCBqLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgdGhpcy5jdXJyZW50Rm9ybWF0Lmxlbmd0aCAmJiB0aGlzLmN1cnJlbnRGb3JtYXRbaV0gIT09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlU2VnbWVudCh0aGlzLmN1cnJlbnRGb3JtYXRbaV0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID49IDAgJiYgdGhpcy5jdXJyZW50Rm9ybWF0W2pdICE9PSBcIl9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZVNlZ21lbnQodGhpcy5jdXJyZW50Rm9ybWF0W2pdKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmVyaWZ5UmFuZ2UoKSB7XG4gICAgICAgIGlmICghaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVmFsaWRSYW5nZSh0aGlzLm1pbiwgdGhpcy5tYXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtYXggdmFsdWUgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIHRoZSBtaW4uIFNlZSAke01JTl9ET0NfTElOSyQxfSBhbmQgJHtNQVhfRE9DX0xJTkskMX0uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmVyaWZ5VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICd2YWx1ZScgc2hvdWxkIGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBEYXRlIGluc3RhbmNlLiBDaGVjayAke1ZBTFVFX0RPQ19MSU5LJDF9IGZvciBwb3NzaWJsZSByZXNvbHV0aW9uLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1dERhdGVJblJhbmdlKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMua2VuZG9EYXRlLmdldERhdGVPYmplY3QoKTtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gZGF0ZUluUmFuZ2UoY3VycmVudERhdGUsIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9Db3JyZWN0ICYmICFpc0VxdWFsKGN1cnJlbnREYXRlLCBjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICB0aGlzLmtlbmRvRGF0ZSA9IHRoaXMuZ2V0S2VuZG9EYXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlRm9ybWF0U2VjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuZm9ybWF0U2VjdGlvbnMgPSB0aGlzLmludGwuc3BsaXREYXRlRm9ybWF0KHRoaXMuZm9ybWF0KVxuICAgICAgICAgICAgLnJlZHVjZSgoeyBkYXRlLCB0aW1lIH0sIHApID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0ZTogZGF0ZSB8fCBEQVRFX1BBUlRfUkVHRVhQLnRlc3QocC50eXBlKSxcbiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lIHx8IFRJTUVfUEFSVF9SRUdFWFAudGVzdChwLnR5cGUpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7IGRhdGU6IGZhbHNlLCB0aW1lOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgaW50bENoYW5nZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtYXRTZWN0aW9ucygpO1xuICAgICAgICB0aGlzLmtlbmRvRGF0ZSA9IHRoaXMuZ2V0S2VuZG9EYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRWYWx1ZSh0aGlzLmlzQWN0aXZlKTtcbiAgICB9XG4gICAgdXBkYXRlT25QYXN0ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmludGwucGFyc2VEYXRlKHRoaXMuaW5wdXRWYWx1ZSwgdGhpcy5mb3JtYXQpIHx8IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IG5vdGlmeSA9ICt2YWx1ZSAhPT0gK3RoaXMudmFsdWU7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmluZEV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBtb3VzZXdoZWVsSGFuZGxlciA9IHRoaXMuaGFuZGxlTW91c2VXaGVlbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbUV2ZW50cy5wdXNoKHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdET01Nb3VzZVNjcm9sbCcsIG1vdXNld2hlZWxIYW5kbGVyKSwgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ21vdXNld2hlZWwnLCBtb3VzZXdoZWVsSGFuZGxlciksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duLmJpbmQodGhpcykpLCB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAncGFzdGUnLCB0aGlzLmhhbmRsZVBhc3RlLmJpbmQodGhpcykpLCB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnaW5wdXQnLCB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgaGFuZGxlTW91c2VXaGVlbChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5IHx8ICF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQgfHwgZXZlbnQ7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hEYXRlU2VnbWVudCgoZXZlbnQud2hlZWxEZWx0YSB8fCAtZXZlbnQuZGV0YWlsKSA+IDAgPyAtMSA6IDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RpZnlEYXRlU2VnbWVudFZhbHVlKChldmVudC53aGVlbERlbHRhIHx8IC1ldmVudC5kZXRhaWwpID4gMCA/IDEgOiAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVBhc3RlKCkge1xuICAgICAgICB0aGlzLnBhc3RlID0gdHJ1ZTtcbiAgICB9XG4gICAgaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5UYWIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vdmVkID0gdGhpcy5zd2l0Y2hEYXRlU2VnbWVudChldmVudC5zaGlmdEtleSA/IC0xIDogMSk7XG4gICAgICAgICAgICBpZiAobW92ZWQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlzLkJhY2tzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5iYWNrc3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSBLZXlzLkFycm93RG93bjpcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeURhdGVTZWdtZW50VmFsdWUoLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlzLkFycm93VXA6XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlEYXRlU2VnbWVudFZhbHVlKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlzLkFycm93UmlnaHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hEYXRlU2VnbWVudCgxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5cy5BcnJvd0xlZnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hEYXRlU2VnbWVudCgtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtleXMuSG9tZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE5lYXJlc3RTZWdtZW50KDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlzLkVuZDpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE5lYXJlc3RTZWdtZW50KHRoaXMuaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vc2tpcCB0aGUgcHJldmVudERlZmF1bHQgaWYgd2UgZGlkbid0IGhhbmRsZWQgdGhlIGtleUNvZGVcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBoYW5kbGVJbnB1dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhc3RlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU9uUGFzdGUoKTtcbiAgICAgICAgICAgIHRoaXMucGFzdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWZmID0gYXBwcm94aW1hdGVTdHJpbmdNYXRjaGluZyh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5jdXJyZW50Rm9ybWF0LCB0aGlzLmlucHV0VmFsdWUsIHRoaXMuY2FyZXQoKVswXSk7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25Pbmx5ID0gKGRpZmYubGVuZ3RoID09PSAxICYmIGRpZmZbMF1bMV0gPT09IFwiX1wiKTtcbiAgICAgICAgbGV0IHN3aXRjaFBhcnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFuYXZpZ2F0aW9uT25seSkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZFBhcnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRQYXJ0ID0gdGhpcy5rZW5kb0RhdGUucGFyc2VQYXJ0KGRpZmZbaV1bMF0sIGRpZmZbaV1bMV0sIHRoaXMucmVzZXRTZWdtZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIHN3aXRjaFBhcnQgPSBwYXJzZWRQYXJ0LnN3aXRjaFRvTmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRoaXMua2VuZG9EYXRlLmdldERhdGVPYmplY3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIGNhbmRpZGF0ZSAmJiAhdGhpcy5mb3JtYXRTZWN0aW9ucy5kYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZW5kb0RhdGUgPSB0aGlzLmdldEtlbmRvRGF0ZShzZXRUaW1lKHRoaXMudmFsdWUsIGNhbmRpZGF0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRTZWdtZW50VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wdXREYXRlSW5SYW5nZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRWYWx1ZSh0aGlzLmlzQWN0aXZlKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5jb21wbGV0ZVZhbGlkYXRpb25TdGF0dXMoKTtcbiAgICAgICAgaWYgKGRpZmYubGVuZ3RoICYmIGRpZmZbMF1bMF0gIT09IFwiX1wiKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGVTZWdtZW50KGRpZmZbMF1bMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzd2l0Y2hQYXJ0IHx8IG5hdmlnYXRpb25Pbmx5KSB7XG4gICAgICAgICAgICB0aGlzLnN3aXRjaERhdGVTZWdtZW50KDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhY2tzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hEYXRlU2VnbWVudCgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrc3BhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgZW1pdEZvY3VzKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5vbkZvY3VzLmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLm9uRm9jdXMuZW1pdChhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbWl0Qmx1cihhcmdzKSB7XG4gICAgICAgIHRoaXMub25CbHVyLmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLm9uQmx1ci5lbWl0KGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUluY29tcGxldGVWYWxpZGF0aW9uU3RhdHVzKCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5pc0RhdGVJbmNvbXBsZXRlO1xuICAgICAgICB0aGlzLmlzRGF0ZUluY29tcGxldGUgPSB0aGlzLmtlbmRvRGF0ZS5oYXNWYWx1ZSgpICYmIHRoaXMudmFsdWUgPT09IG51bGw7XG4gICAgICAgIGlmIChwcmV2aW91c1ZhbHVlID09PSB0aGlzLmlzRGF0ZUluY29tcGxldGUgfHwgIXRoaXMuaW5jb21wbGV0ZURhdGVWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLm5nQ29udHJvbCkgJiYgIWlzUHJlc2VudCh0aGlzLnBpY2tlclNlcnZpY2UpKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUHJlc2VudCh0aGlzLnBpY2tlclNlcnZpY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UuZGF0ZUNvbXBsZXRlbmVzc0NoYW5nZS5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5EYXRlSW5wdXRDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvLWRhdGVpbnB1dCcsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVJbnB1dENvbXBvbmVudCksIG11bHRpOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZUlucHV0Q29tcG9uZW50KSwgbXVsdGk6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBMMTBOX1BSRUZJWCwgdXNlVmFsdWU6ICdrZW5kby5kYXRlaW5wdXQnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogS2VuZG9JbnB1dCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZUlucHV0Q29tcG9uZW50KSB9LFxuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWRhdGVpbnB1dCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyIGtlbmRvRGF0ZUlucHV0TG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgaTE4bi1pbmNyZW1lbnQ9XCJrZW5kby5kYXRlaW5wdXQuaW5jcmVtZW50fFRoZSBsYWJlbCBmb3IgdGhlICoqSW5jcmVtZW50KiogYnV0dG9uIGluIHRoZSBEYXRlSW5wdXRcIlxuICAgICAgICBpbmNyZW1lbnQ9XCJJbmNyZWFzZSB2YWx1ZVwiXG5cbiAgICAgICAgaTE4bi1kZWNyZW1lbnQ9XCJrZW5kby5kYXRlaW5wdXQuZGVjcmVtZW50fFRoZSBsYWJlbCBmb3IgdGhlICoqRGVjcmVtZW50KiogYnV0dG9uIGluIHRoZSBEYXRlSW5wdXRcIlxuICAgICAgICBkZWNyZW1lbnQ9XCJEZWNyZWFzZSB2YWx1ZVwiXG4gICAgPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxzcGFuIGNsYXNzPVwiay1kYXRlaW5wdXQtd3JhcFwiICN3cmFwPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNkYXRlSW5wdXRcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBhdXRvY29ycmVjdD1cIm9mZlwiXG4gICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWlucHV0XCJcbiAgICAgICAgICAgIFthdHRyLnJvbGVdPVwicm9sZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cImFyaWFSZWFkT25seVwiXG4gICAgICAgICAgICBbaWRdPVwiZm9jdXNhYmxlSWRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzUG9wdXBPcGVuXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiaGFzUG9wdXBcIlxuICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAgICAgICAgICAgICBmb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVNb3VzZWRvd24sXG4gICAgICAgICAgICAgICAgdG91Y2hzdGFydDogaGFuZGxlTW91c2Vkb3duLFxuICAgICAgICAgICAgICAgIGRyYWdzdGFydDogaGFuZGxlRHJhZ0FuZERyb3AsXG4gICAgICAgICAgICAgICAgZHJvcDogaGFuZGxlRHJhZ0FuZERyb3AsXG4gICAgICAgICAgICAgICAgYmx1cjogaGFuZGxlQmx1clxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNwaW5uZXJzXCIgY2xhc3M9XCJrLXNlbGVjdFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWxpbmsgay1saW5rLWluY3JlYXNlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1hY3RpdmVdPVwiYXJyb3dEaXJlY3Rpb24gPT09IGFycm93LlVwXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImFycm93RGlyZWN0aW9uID0gYXJyb3cuVXBcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImFycm93RGlyZWN0aW9uID0gYXJyb3cuTm9uZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUJ1dHRvbkNsaWNrKDEpXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxpemF0aW9uLmdldCgnaW5jcmVtZW50JylcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnaW5jcmVtZW50JylcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktYXJyb3ctblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWxpbmsgay1saW5rLWRlY3JlYXNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQnV0dG9uQ2xpY2soLTEpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1hY3RpdmVdPVwiYXJyb3dEaXJlY3Rpb24gPT09IGFycm93LkRvd25cIlxuICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiYXJyb3dEaXJlY3Rpb24gPSBhcnJvdy5Eb3duXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJhcnJvd0RpcmVjdGlvbiA9IGFycm93Lk5vbmVcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsb2NhbGl6YXRpb24uZ2V0KCdkZWNyZW1lbnQnKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb2NhbGl6YXRpb24uZ2V0KCdkZWNyZW1lbnQnKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1hcnJvdy1zXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVJbnB1dENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IEluamVjdG9yIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBQaWNrZXJTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuRGF0ZUlucHV0Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGZvY3VzYWJsZUlkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVhZG9ubHk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJpbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcm9sZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXJpYVJlYWRPbmx5OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9ybWF0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXRQbGFjZWhvbGRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmFuZ2VWYWxpZGF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhdXRvQ29ycmVjdDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW5jb21wbGV0ZURhdGVWYWxpZGF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3Bpbm5lcnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGlzUG9wdXBPcGVuOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBoYXNQb3B1cDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICB2YWx1ZVVwZGF0ZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIG9uRm9jdXM6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydmb2N1cycsXSB9XSxcbiAgICBvbkJsdXI6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydibHVyJyxdIH1dLFxuICAgIGRhdGVJbnB1dDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2RhdGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICB3cmFwOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnd3JhcCcsXSB9XSxcbiAgICB3cmFwcGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kYXRlaW5wdXQnLF0gfV0sXG4gICAgZGlzYWJsZWRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1kaXNhYmxlZCcsXSB9XVxufTtcblxuLyoqXG4gKiBBIHByZXZlbnRhYmxlIGV2ZW50IGluc3RhbmNlIHdoaWNoIGlzIHRyaWdnZXJlZCBieSB0aGUgYG9wZW5gIGFuZCBgY2xvc2VgIGV2ZW50cy5cbiAqL1xuY2xhc3MgUHJldmVudGFibGVFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYSBzcGVjaWZpZWQgZXZlbnQuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBzb3VyY2UgY29tcG9uZW50IHN1cHByZXNzZXMgdGhlIGJ1aWx0LWluIGJlaGF2aW9yIHRoYXQgZm9sbG93cyB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMucHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzIHByZXZlbnRlZCBieSBhbnkgb2YgaXRzIHN1YnNjcmliZXJzLCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVmYXVsdCBhY3Rpb24gd2FzIHByZXZlbnRlZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgaXNEZWZhdWx0UHJldmVudGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2ZW50ZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgVE9VQ0hfRU5BQkxFRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignZGF0ZWlucHV0cy10b3VjaC1lbmFibGVkJyk7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBkaXNhYmxlZERhdGVzVmFsaWRhdG9yID0gKGlzRGF0ZURpc2FibGVkKSA9PiB7XG4gICAgcmV0dXJuIChjb250cm9sKSA9PiB7XG4gICAgICAgIGlmICghaXNEYXRlRGlzYWJsZWQgfHwgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgZGlzYWJsZWREYXRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChjb250cm9sLnZhbHVlKSA/IGVycm9yIDogbnVsbDtcbiAgICB9O1xufTtcblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG5jb25zdCBNSU5fRE9DX0xJTkskMiA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9EYXRlUGlja2VyQ29tcG9uZW50LyN0b2MtbWluJztcbmNvbnN0IE1BWF9ET0NfTElOSyQyID0gJ2h0dHA6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvYXBpL0RhdGVQaWNrZXJDb21wb25lbnQvI3RvYy1tYXgnO1xuY29uc3QgVkFMVUVfRE9DX0xJTkskMiA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2RhdGVwaWNrZXIvI3RvYy11c2luZy13aXRoLWpzb24nO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgRGF0ZVBpY2tlciBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXBpY2tlciAlfSN0b2MtYmFzaWMtdXNhZ2UpLlxuICovXG5jbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih6b25lLCBsb2NhbGl6YXRpb24sIGNkciwgcG9wdXBTZXJ2aWNlLCBlbGVtZW50LCByZW5kZXJlciwgaW5qZWN0b3IsIHBpY2tlclNlcnZpY2UsIGRpc2FibGVkRGF0ZXNTZXJ2aWNlLCB0b3VjaEVuYWJsZWQkJDEpIHtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgIHRoaXMucGlja2VyU2VydmljZSA9IHBpY2tlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1NlcnZpY2UgPSBkaXNhYmxlZERhdGVzU2VydmljZTtcbiAgICAgICAgdGhpcy50b3VjaEVuYWJsZWQgPSB0b3VjaEVuYWJsZWQkJDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvY3VzYWJsZUlkID0gYGstJHtndWlkKCl9YDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGFjdGl2ZSB2aWV3IHRoYXQgdGhlIENhbGVuZGFyIGluaXRpYWxseSByZW5kZXJzXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgYWN0aXZldmlld19kYXRlcGlja2VyICV9KSkuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBhY3RpdmUgdmlldyBpcyBgbW9udGhgLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IFlvdSBoYXZlIHRvIHNldCBgYWN0aXZlVmlld2Agd2l0aGluIHRoZSBgdG9wVmlld2AtYGJvdHRvbVZpZXdgIHJhbmdlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3RW51bVtDYWxlbmRhclZpZXdFbnVtLm1vbnRoXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGJvdHRvbW1vc3QgQ2FsZW5kYXIgdmlldyB0byB3aGljaCB0aGUgdXNlciBjYW4gbmF2aWdhdGVcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlc19kYXRlcGlja2VyICV9I3RvYy1wYXJ0aWFsLWRhdGVzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJvdHRvbVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW0ubW9udGhdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgdG9wbW9zdCBDYWxlbmRhciB2aWV3IHRvIHdoaWNoIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZVxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGVzX2RhdGVwaWNrZXIgJX0jdG9jLXBhcnRpYWwtZGF0ZXMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9wVmlldyA9IENhbGVuZGFyVmlld0VudW1bQ2FsZW5kYXJWaWV3RW51bS5jZW50dXJ5XTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYGRpc2FibGVkYCBwcm9wZXJ0eSBvZiB0aGUgRGF0ZVBpY2tlciBhbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgYWN0aXZlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfZGF0ZXBpY2tlciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBEYXRlUGlja2VyXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcmVhZG9ubHlfZGF0ZXBpY2tlciAlfSN0b2MtcmVhZC1vbmx5LWRhdGVwaWNrZXIpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgRGF0ZVBpY2tlciBpbnB1dCBmaWVsZFxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJlYWRvbmx5X2RhdGVwaWNrZXIgJX0jdG9jLXJlYWQtb25seS1pbnB1dCkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IE5vdGUgdGhhdCBpZiB5b3Ugc2V0IHRoZSBbYHJlYWRvbmx5YF0oeyUgc2x1ZyBhcGlfZGF0ZWlucHV0c19kYXRlcGlja2VyY29tcG9uZW50ICV9I3RvYy1yZWFkb25seSkgcHJvcGVydHkgdmFsdWUgdG8gYHRydWVgLFxuICAgICAgICAgKiB0aGUgaW5wdXQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIHJlYWQtb25seSBzdGF0ZSByZWdhcmRsZXNzIG9mIHRoZSBgcmVhZE9ubHlJbnB1dGAgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlYWRPbmx5SW5wdXQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYG5hdmlnYXRpb25gIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhclxuICAgICAgICAgKiBhbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBuYXZpZ2F0aW9uIHNpZGUtYmFyIGlzIGRpc3BsYXllZC5cbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzaWRlYmFyX2RhdGVwaWNrZXIgJX0pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHNtYWxsZXN0IHZhbGlkIGRhdGVcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlcmFuZ2VzX2RhdGVwaWNrZXIgJX0pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWluID0gY2xvbmVEYXRlKE1JTl9EQVRFKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgYmlnZ2VzdCB2YWxpZCBkYXRlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0ZXJhbmdlc19kYXRlcGlja2VyICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1heCA9IGNsb25lRGF0ZShNQVhfREFURSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJ1aWx0LWluIHZhbGlkYXRpb24gZm9yIGluY29tcGxldGUgZGF0ZXMgaXMgdG8gYmUgZW5mb3JjZWQgd2hlbiBhIGZvcm0gaXMgYmVpbmcgdmFsaWRhdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgZm9jdXNlZCBkYXRlIG9mIHRoZSBDYWxlbmRhciBjb21wb25lbnRcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlc19kYXRlcGlja2VyICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvY3VzZWREYXRlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgZGF0ZSBmb3JtYXQgdGhhdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZm9ybWF0c19kYXRlcGlja2VyICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvcm1hdCA9IFwiZFwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBoaW50IHRoZSBEYXRlUGlja2VyIGRpc3BsYXlzIHdoZW4gaXRzIHZhbHVlIGlzIGBudWxsYC5cbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFwbGVzXSh7JSBzbHVnIHBsYWNlaG9sZGVyc19kYXRlcGlja2VyICV9KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgPGtlbmRvLWRhdGVwaWNrZXIgcGxhY2Vob2xkZXI9XCJFbnRlciBiaXJ0aCBkYXRlLi4uXCI+PC9rZW5kby1kYXRlcGlja2VyPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGB0YWJpbmRleGAgcHJvcGVydHkgb2YgdGhlIERhdGVQaWNrZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSBpbnB1dCBlbGVtZW50IG9mIHRoZSBEYXRlUGlja2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJ1aWx0LWluIG1pbiBvciBtYXggdmFsaWRhdG9ycyBhcmUgZW5mb3JjZWQgd2hlbiB2YWxpZGF0aW5nIGEgZm9ybS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFuZ2VWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgYnVpbHQtaW4gdmFsaWRhdG9yIGZvciBkaXNhYmxlZFxuICAgICAgICAgKiBkYXRlIHJhbmdlcyBpcyBlbmZvcmNlZCB3aGVuIHZhbGlkYXRpbmcgYSBmb3JtXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfZGF0ZXNfZGF0ZXBpY2tlciAlfSN0b2MtdmFsaWRhdGlvbikpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIHdlZWsgbnVtYmVyIGNvbHVtbiBpbiB0aGUgYG1vbnRoYCB2aWV3IG9mIHRoZSBDYWxlbmRhclxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHdlZWtudW1jb2x1bW5fZGF0ZXBpY2tlciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53ZWVrTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyB2YWx1ZVxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXBpY2tlciAlfSN0b2MtZXZlbnRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIGZvY3VzZXMgdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGVwaWNrZXIgJX0jdG9jLWV2ZW50cykpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IFRvIHdpcmUgdGhlIGV2ZW50IHByb2dyYW1tYXRpY2FsbHksIHVzZSB0aGUgYG9uRm9jdXNgIHByb3BlcnR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgICAgICogdGVtcGxhdGU6IGBcbiAgICAgICAgICogIDxrZW5kby1kYXRlcGlja2VyIChmb2N1cyk9XCJoYW5kbGVGb2N1cygpXCI+PC9rZW5kby1kYXRlcGlja2VyPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgIHB1YmxpYyBoYW5kbGVGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgICogICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25Gb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgaW5wdXQgZWxlbWVudCBnZXRzIGJsdXJyZWRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGVwaWNrZXIgJX0jdG9jLWV2ZW50cykpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IFRvIHdpcmUgdGhlIGV2ZW50IHByb2dyYW1tYXRpY2FsbHksIHVzZSB0aGUgYG9uQmx1cmAgcHJvcGVydHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgPGtlbmRvLWRhdGVwaWNrZXIgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCI+PC9rZW5kby1kYXRlcGlja2VyPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgICAgICAgKiAgICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50IGlzIGJsdXJyZWRcIik7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vdHNsaW50OmRpc2FibGUtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIG9wZW4uXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50LCB0aGUgcG9wdXAgd2lsbCByZW1haW4gY2xvc2VkXG4gICAgICAgICAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyBvdmVydmlld19kYXRlcGlja2VyICV9I3RvYy1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3BlbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgcG9wdXAgaXMgYWJvdXQgdG8gY2xvc2UuXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50LCB0aGUgcG9wdXAgd2lsbCByZW1haW4gb3BlblxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXBpY2tlciAlfSN0b2MtZXZlbnRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwcGVyQ2xhc3NlcyA9IHRydWU7XG4gICAgICAgIHRoaXMucG9wdXBVSUQgPSBndWlkKCk7XG4gICAgICAgIHRoaXMuX3BvcHVwU2V0dGluZ3MgPSB7IGFuaW1hdGU6IHRydWUgfTtcbiAgICAgICAgdGhpcy5fc2hvdyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IG5vb3A7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IG5vb3A7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLm1pblZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLm1heFZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gbm9vcDtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzID0gW107XG4gICAgICAgIHRoaXMucGlja2VyU3Vic2NyaXB0aW9ucyA9IHRoaXMucGlja2VyU2VydmljZS5vbkZvY3VzLnN1YnNjcmliZSh0aGlzLmhhbmRsZUZvY3VzLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnBpY2tlclN1YnNjcmlwdGlvbnMuYWRkKHRoaXMucGlja2VyU2VydmljZS5vbkJsdXIuc3Vic2NyaWJlKHRoaXMuaGFuZGxlQmx1ci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMucGlja2VyU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5waWNrZXJTZXJ2aWNlLnNhbWVEYXRlU2VsZWN0ZWQuc3Vic2NyaWJlKHRoaXMuaGFuZGxlU2FtZVNlbGVjdGlvbi5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMucGlja2VyU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5waWNrZXJTZXJ2aWNlLmRhdGVDb21wbGV0ZW5lc3NDaGFuZ2Uuc3Vic2NyaWJlKHRoaXMuaGFuZGxlRGF0ZUNvbXBsZXRlbmVzc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgY2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuY2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgbW9udGhDZWxsVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5tb250aENlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IHllYXJDZWxsVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy55ZWFyQ2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgZGVjYWRlQ2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuZGVjYWRlQ2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgY2VudHVyeUNlbGxUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmNlbnR1cnlDZWxsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCB3ZWVrTnVtYmVyVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy53ZWVrTnVtYmVyVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCBoZWFkZXJUaXRsZVRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyVGl0bGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IG5hdmlnYXRpb25JdGVtVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSXRlbVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIHBvcHVwIG9wdGlvbnMgb2YgdGhlIERhdGVQaWNrZXIuXG4gICAgICpcbiAgICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICAgICAqIC0gYGFuaW1hdGU6IEJvb2xlYW5gJm1kYXNoO0NvbnRyb2xzIHRoZSBwb3B1cCBhbmltYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBvcGVuIGFuZCBjbG9zZSBhbmltYXRpb25zIGFyZSBlbmFibGVkLlxuICAgICAqIC0gYGFwcGVuZFRvOiAncm9vdCcgfCAnY29tcG9uZW50JyB8IFZpZXdDb250YWluZXJSZWZgJm1kYXNoO0NvbnRyb2xzIHRoZSBwb3B1cCBjb250YWluZXIuIEJ5IGRlZmF1bHQsIHRoZSBwb3B1cCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByb290IGNvbXBvbmVudC5cbiAgICAgKiAtIGBwb3B1cENsYXNzOiBTdHJpbmdgJm1kYXNoO1NwZWNpZmllcyBhIGxpc3Qgb2YgQ1NTIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuXG4gICAgICovXG4gICAgc2V0IHBvcHVwU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcG9wdXBTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHsgYW5pbWF0ZTogdHJ1ZSB9LCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldCBwb3B1cFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBTZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgRGF0ZVBpY2tlciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiA+IFRoZSBgdmFsdWVgIGhhcyB0byBiZSBhIHZhbGlkXG4gICAgICogW0phdmFTY3JpcHQgYERhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlKSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gY2xvbmVEYXRlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgdGFiSW5kZXgodGFiSW5kZXgpIHtcbiAgICAgICAgdGhpcy50YWJpbmRleCA9IHRhYkluZGV4O1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlcyBvZiB0aGUgRGF0ZVBpY2tlciB0aGF0IHdpbGwgYmUgZGlzYWJsZWRcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRpc2FibGVkX2RhdGVzX2RhdGVwaWNrZXIgJX0pKS5cbiAgICAgKi9cbiAgICBzZXQgZGlzYWJsZWREYXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZERhdGVzID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1NlcnZpY2UuaW5pdGlhbGl6ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZERhdGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBkaXNhYmxlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpbnB1dFJvbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRPbmx5SW5wdXQgPyAnbGlzdGJveCcgOiAnc3BpbmJ1dHRvbic7XG4gICAgfVxuICAgIGdldCBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgc2V0IGlzQWN0aXZlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMud3JhcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWxlbWVudCwgJ2stc3RhdGUtZm9jdXNlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvdztcbiAgICB9XG4gICAgc2V0IHNob3coc2hvdykge1xuICAgICAgICBpZiAoc2hvdyAmJiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNraXBab25lID0gIXNob3cgJiYgKCF0aGlzLl9zaG93IHx8ICFoYXNPYnNlcnZlcnModGhpcy5jbG9zZSkpO1xuICAgICAgICBpZiAoIXNraXBab25lKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwKHNob3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwKHNob3cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBVc2VkIGJ5IHRoZSBUZXh0Qm94Q29udGFpbmVyIHRvIGRldGVybWluZSBpZiB0aGUgY29tcG9uZW50IGlzIGVtcHR5LlxuICAgICAqL1xuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy52YWx1ZSAmJiB0aGlzLmlucHV0LmlzRW1wdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuY2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCk7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndGFiaW5kZXgnKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICB0aGlzLnZlcmlmeVNldHRpbmdzKCk7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbiB8fCBjaGFuZ2VzLmRpc2FibGVkRGF0ZXNWYWxpZGF0aW9uIHx8IGNoYW5nZXMuZGlzYWJsZWREYXRlcyB8fCBjaGFuZ2VzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0ZUZuID0gdGhpcy5yYW5nZVZhbGlkYXRpb24gPyBtaW5WYWxpZGF0b3IodGhpcy5taW4pIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdGVGbiA9IHRoaXMucmFuZ2VWYWxpZGF0aW9uID8gbWF4VmFsaWRhdG9yKHRoaXMubWF4KSA6IG5vb3A7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuID0gdGhpcy5kaXNhYmxlZERhdGVzVmFsaWRhdGlvbiA/IGRpc2FibGVkRGF0ZXNWYWxpZGF0b3IodGhpcy5kaXNhYmxlZERhdGVzU2VydmljZS5pc0RhdGVEaXNhYmxlZCkgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gdGhpcy5pbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb24gPyBpbmNvbXBsZXRlRGF0ZVZhbGlkYXRvcigpIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53aW5kb3dCbHVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvd0JsdXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbUV2ZW50cy5mb3JFYWNoKHVuYmluZENhbGxiYWNrID0+IHVuYmluZENhbGxiYWNrKCkpO1xuICAgICAgICB0aGlzLnBpY2tlclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBvcGVuIHN0YXRlIG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBnZXQgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZlcmlmeVZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgdGhpcy5pbnB1dC53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xUb3VjaGVkID0gZm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdmFsaWRhdGUoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWxpZGF0ZUZuKGNvbnRyb2wpIHx8IHRoaXMubWF4VmFsaWRhdGVGbihjb250cm9sKSB8fCB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuKGNvbnRyb2wpIHx8IHRoaXMuaW5jb21wbGV0ZVZhbGlkYXRvcihjb250cm9sLCB0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuaXNEYXRlSW5jb21wbGV0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgRGF0ZVBpY2tlciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAqICA8YnV0dG9uIChjbGljayk9XCJkYXRlcGlja2VyLmZvY3VzKClcIj5Gb2N1cyBkYXRlIHBpY2tlcjwvYnV0dG9uPlxuICAgICAqICA8a2VuZG8tZGF0ZXBpY2tlciAjZGF0ZXBpY2tlcj48L2tlbmRvLWRhdGVwaWNrZXI+XG4gICAgICogYFxuICAgICAqIH0pXG4gICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgRGF0ZVBpY2tlciBjb21wb25lbnQuXG4gICAgICovXG4gICAgYmx1cigpIHtcbiAgICAgICAgKHRoaXMuY2FsZW5kYXIgfHwgdGhpcy5pbnB1dClbJ2JsdXInXSgpOyAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAuIElmIHlvdSB1c2UgdGhlIGB0b2dnbGVgIG1ldGhvZCB0byBzaG93IG9yIGhpZGUgdGhlIHBvcHVwLFxuICAgICAqIHRoZSBgb3BlbmAgYW5kIGBjbG9zZWAgZXZlbnRzIGRvIG5vdCBmaXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNob3cgLSBUaGUgc3RhdGUgb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIHRvZ2dsZShzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc29sdmVkUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZSgoc2hvdyA9PT0gdW5kZWZpbmVkKSA/ICF0aGlzLnNob3cgOiBzaG93KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgICAgICAvL1hYWDogZXhwbGljaXRseSBjYWxsIHRoZSBoYW5kbGVGb2N1cyBoYW5kbGVyIGhlcmVcbiAgICAgICAgLy9kdWUgdG8gYXN5bmMgSUUgZm9jdXMgZXZlbnRcbiAgICAgICAgdGhpcy5oYW5kbGVGb2N1cygpO1xuICAgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZU1vdXNlZG93bihhcmdzKSB7XG4gICAgICAgIGFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUNoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25Db250cm9sQ2hhbmdlKGNsb25lRGF0ZSh2YWx1ZSkpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xvbmVEYXRlKHZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVJbnB1dENoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSh0aGlzLmlucHV0LmZvcm1hdFNlY3Rpb25zLnRpbWUgPyB2YWx1ZSA6IHRoaXMubWVyZ2VUaW1lKHZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgcG9wdXBDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2stY2FsZW5kYXItY29udGFpbmVyJyxcbiAgICAgICAgICAgICdrLWdyb3VwJyxcbiAgICAgICAgICAgICdrLXJlc2V0J1xuICAgICAgICBdLmNvbmNhdCh0aGlzLnBvcHVwU2V0dGluZ3MucG9wdXBDbGFzcyB8fCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYXBwZW5kVG8oKSB7XG4gICAgICAgIGNvbnN0IHsgYXBwZW5kVG8gfSA9IHRoaXMucG9wdXBTZXR0aW5ncztcbiAgICAgICAgaWYgKCFhcHBlbmRUbyB8fCBhcHBlbmRUbyA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBlbmRUbyA9PT0gJ2NvbXBvbmVudCcgPyB0aGlzLmNvbnRhaW5lciA6IGFwcGVuZFRvO1xuICAgIH1cbiAgICBnZXQgaW5wdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlclNlcnZpY2UuaW5wdXQ7XG4gICAgfVxuICAgIGdldCBjYWxlbmRhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyU2VydmljZS5jYWxlbmRhcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG1lcmdlVGltZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAmJiB2YWx1ZSA/IHNldFRpbWUodmFsdWUsIHRoaXMudmFsdWUpIDogdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVLZXlkb3duKGUpIHtcbiAgICAgICAgY29uc3QgeyBhbHRLZXksIGtleUNvZGUgfSA9IGU7XG4gICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlzLkVzY2FwZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsdEtleSkge1xuICAgICAgICAgICAgaWYgKGtleUNvZGUgPT09IEtleXMuQXJyb3dEb3duICYmICF0aGlzLnNob3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleUNvZGUgPT09IEtleXMuQXJyb3dVcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlzLlRhYiAmJiB0aGlzLnNob3cgJiYgdGhpcy5jYWxlbmRhci5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9nZ2xlUG9wdXAoc2hvdykge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQcmV2ZW50YWJsZUV2ZW50KCk7XG4gICAgICAgIGlmICghdGhpcy5fc2hvdyAmJiBzaG93KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4uZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fc2hvdyAmJiAhc2hvdykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90b2dnbGUoc2hvdyk7XG4gICAgICAgIHRoaXMudG9nZ2xlRm9jdXMoKTtcbiAgICB9XG4gICAgX3RvZ2dsZShzaG93KSB7XG4gICAgICAgIGlmIChzaG93ID09PSB0aGlzLl9zaG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvdyA9IHNob3c7XG4gICAgICAgIGlmIChzaG93KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgICAgICAgICAgIGFuY2hvcjogdGhpcy53cmFwcGVyLFxuICAgICAgICAgICAgICAgIGFuY2hvckFsaWduOiB7IHZlcnRpY2FsOiAnYm90dG9tJywgaG9yaXpvbnRhbDogZGlyZWN0aW9uIH0sXG4gICAgICAgICAgICAgICAgYW5pbWF0ZTogdGhpcy5wb3B1cFNldHRpbmdzLmFuaW1hdGUsXG4gICAgICAgICAgICAgICAgYXBwZW5kVG86IHRoaXMuYXBwZW5kVG8sXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5wb3B1cFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHBvcHVwQWxpZ246IHsgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfSxcbiAgICAgICAgICAgICAgICBwb3B1cENsYXNzOiB0aGlzLnBvcHVwQ2xhc3NlcyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGU6ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIHRoaXMucG9wdXBVSUQpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnBvcHVwUmVmLnBvcHVwQW5jaG9yVmlld3BvcnRMZWF2ZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93ID0gZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvY3VzSW5wdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICB9XG4gICAgdG9nZ2xlRm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3cpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYWxlbmRhcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGVuZGFyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLnRvdWNoRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmlucHV0LmlzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJsdXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2ZXJpZnlTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNWYWxpZFJhbmdlKHRoaXMubWluLCB0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1heCB2YWx1ZSBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gdGhlIG1pbi4gU2VlICR7TUlOX0RPQ19MSU5LJDJ9IGFuZCAke01BWF9ET0NfTElOSyQyfS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2ZXJpZnlWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ3ZhbHVlJyBzaG91bGQgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IERhdGUgaW5zdGFuY2UuIENoZWNrICR7VkFMVUVfRE9DX0xJTkskMn0gZm9yIHBvc3NpYmxlIHJlc29sdXRpb24uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmluZEV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmRvbUV2ZW50cy5wdXNoKHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duLmJpbmQodGhpcykpKTtcbiAgICAgICAgaWYgKGlzV2luZG93QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93Qmx1clN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh3aW5kb3csICdibHVyJykuc3Vic2NyaWJlKHRoaXMuaGFuZGxlV2luZG93Qmx1ci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVGb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGhhc09ic2VydmVycyh0aGlzLm9uRm9jdXMpKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9jdXMuZW1pdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlV2luZG93Qmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgIH1cbiAgICBoYW5kbGVCbHVyKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IGFyZ3MgJiYgY3VycmVudEZvY3VzVGFyZ2V0KGFyZ3MpO1xuICAgICAgICBpZiAoY3VycmVudFRhcmdldCAmJiAodGhpcy5pbnB1dC5jb250YWluc0VsZW1lbnQoY3VycmVudFRhcmdldCkgfHxcbiAgICAgICAgICAgICh0aGlzLmNhbGVuZGFyICYmIHRoaXMuY2FsZW5kYXIuY29udGFpbnNFbGVtZW50KGN1cnJlbnRUYXJnZXQpKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT2JzZXJ2ZXJzKHRoaXMub25CbHVyKSB8fCAodGhpcy5zaG93ICYmIGhhc09ic2VydmVycyh0aGlzLmNsb3NlKSkgfHwgcmVxdWlyZXNab25lT25CbHVyKHRoaXMuY29udHJvbCkpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmx1ckNvbXBvbmVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJDb21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBibHVyQ29tcG9uZW50KCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7IC8vIG9yZGVyIGlzIGltcG9ydGFudCDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5vbkJsdXIuZW1pdCgpO1xuICAgIH1cbiAgICBoYW5kbGVTYW1lU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zaG93KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZURhdGVDb21wbGV0ZW5lc3NDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKSk7XG4gICAgfVxufVxuRGF0ZVBpY2tlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG8tZGF0ZXBpY2tlcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEtlbmRvSW5wdXQsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpIH0sXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFBpY2tlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERpc2FibGVkRGF0ZXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uZGF0ZXBpY2tlcidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kYXRlcGlja2VyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyIGtlbmRvRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzXG4gICAgICAgICAgICBpMThuLXRvZGF5PVwia2VuZG8uZGF0ZXBpY2tlci50b2RheXxUaGUgbGFiZWwgZm9yIHRoZSB0b2RheSBidXR0b24gaW4gdGhlIGNhbGVuZGFyIGhlYWRlclwiXG4gICAgICAgICAgICB0b2RheT1cIlRPREFZXCJcblxuICAgICAgICAgICAgaTE4bi10b2dnbGU9XCJrZW5kby5kYXRlcGlja2VyLnRvZ2dsZXxUaGUgbGFiZWwgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIGluIHRoZSBkYXRlcGlja2VyIGNvbXBvbmVudFwiXG4gICAgICAgICAgICB0b2dnbGU9XCJUb2dnbGUgY2FsZW5kYXJcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3BhbiAjd3JhcHBlclxuICAgICAgICAgICAgY2xhc3M9XCJrLXBpY2tlci13cmFwXCJcbiAgICAgICAgICAgIFtjbGFzcy5rLXN0YXRlLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGtlbmRvLWRhdGVpbnB1dFxuICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAgIFtyb2xlXT1cImlucHV0Um9sZVwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzYWJsZUlkXT1cImZvY3VzYWJsZUlkXCJcbiAgICAgICAgICAgICAgICBbaGFzUG9wdXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2lzUG9wdXBPcGVuXT1cInNob3dcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IHJlYWRPbmx5SW5wdXRcIlxuICAgICAgICAgICAgICAgIFthcmlhUmVhZE9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0XT1cImZvcm1hdFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdFBsYWNlaG9sZGVyXT1cImZvcm1hdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwibWluXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICAgICAgW2luY29tcGxldGVEYXRlVmFsaWRhdGlvbl09XCJpbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb25cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva2VuZG8tZGF0ZWlucHV0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibG9jYWxpemF0aW9uLmdldCgndG9nZ2xlJylcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgndG9nZ2xlJylcIlxuICAgICAgICAgICAgICAgIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cIntcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGhhbmRsZUljb25DbGljayxcbiAgICAgICAgICAgICAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVNb3VzZWRvd25cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWNhbGVuZGFyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwb3B1cFRlbXBsYXRlPlxuICAgICAgICAgICAgPGtlbmRvLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgI2NhbGVuZGFyXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICBbbmF2aWdhdGlvbl09XCJuYXZpZ2F0aW9uXCJcbiAgICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgICAgICAgICBbYm90dG9tVmlld109XCJib3R0b21WaWV3XCJcbiAgICAgICAgICAgICAgICBbdG9wVmlld109XCJ0b3BWaWV3XCJcbiAgICAgICAgICAgICAgICBbd2Vla051bWJlcl09XCJ3ZWVrTnVtYmVyXCJcbiAgICAgICAgICAgICAgICBbY2VsbFRlbXBsYXRlXT1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW21vbnRoQ2VsbFRlbXBsYXRlXT1cIm1vbnRoQ2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbeWVhckNlbGxUZW1wbGF0ZV09XCJ5ZWFyQ2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbZGVjYWRlQ2VsbFRlbXBsYXRlXT1cImRlY2FkZUNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2NlbnR1cnlDZWxsVGVtcGxhdGVdPVwiY2VudHVyeUNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3dlZWtOdW1iZXJUZW1wbGF0ZV09XCJ3ZWVrTnVtYmVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtoZWFkZXJUaXRsZVRlbXBsYXRlXT1cImhlYWRlclRpdGxlVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuYXZpZ2F0aW9uSXRlbVRlbXBsYXRlXT1cIm5hdmlnYXRpb25JdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtmb2N1c2VkRGF0ZV09XCJmb2N1c2VkRGF0ZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlQ2hhbmdlKG1lcmdlVGltZSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBrZXlkb3duOiBoYW5kbGVLZXlkb3duXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImRpc2FibGVkRGF0ZXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxrZW5kby1jYWxlbmRhci1tZXNzYWdlcyBbdG9kYXldPVwibG9jYWxpemF0aW9uLmdldCgndG9kYXknKVwiPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tY2FsZW5kYXItbWVzc2FnZXM+XG4gICAgICAgICAgICA8L2tlbmRvLWNhbGVuZGFyPlxuICAgICAgICA8bmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EYXRlUGlja2VyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IEluamVjdG9yIH0sXG4gICAgeyB0eXBlOiBQaWNrZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEaXNhYmxlZERhdGVzU2VydmljZSB9LFxuICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtUT1VDSF9FTkFCTEVELF0gfV0gfVxuXTtcbkRhdGVQaWNrZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0sXSB9XSxcbiAgICBwb3B1cFRlbXBsYXRlOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsncG9wdXBUZW1wbGF0ZScsXSB9XSxcbiAgICB3cmFwcGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnd3JhcHBlcicsXSB9XSxcbiAgICBjZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtb250aENlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICB5ZWFyQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgeWVhckNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsneWVhckNlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICBkZWNhZGVDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGRlY2FkZUNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGVjYWRlQ2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIGNlbnR1cnlDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBjZW50dXJ5Q2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZW50dXJ5Q2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnd2Vla051bWJlclRlbXBsYXRlJyxdIH1dLFxuICAgIGhlYWRlclRpdGxlVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0hlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBoZWFkZXJUaXRsZVRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydoZWFkZXJUaXRsZVRlbXBsYXRlJyxdIH1dLFxuICAgIG5hdmlnYXRpb25JdGVtVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW05hdmlnYXRpb25JdGVtVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBuYXZpZ2F0aW9uSXRlbVRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduYXZpZ2F0aW9uSXRlbVRlbXBsYXRlJyxdIH1dLFxuICAgIGZvY3VzYWJsZUlkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBib3R0b21WaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3BWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVhZG9ubHk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJlYWRPbmx5SW5wdXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBvcHVwU2V0dGluZ3M6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5hdmlnYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvY3VzZWREYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9ybWF0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXRQbGFjZWhvbGRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYmluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGlzYWJsZWREYXRlczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJhbmdlVmFsaWRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGlzYWJsZWREYXRlc1ZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHdlZWtOdW1iZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgb25Gb2N1czogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2ZvY3VzJyxdIH1dLFxuICAgIG9uQmx1cjogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2JsdXInLF0gfV0sXG4gICAgb3BlbjogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNsb3NlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgd3JhcHBlckNsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kYXRlcGlja2VyJyxdIH1dLFxuICAgIGRpc2FibGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBUSU1FX1BBUlQgPSB7XG4gICAgZGF5cGVyaW9kOiAnZGF5cGVyaW9kJyxcbiAgICBob3VyOiAnaG91cicsXG4gICAgbWlsbGlzZWNvbmQ6ICdtaWxsaXNlY29uZCcsXG4gICAgbWludXRlOiAnbWludXRlJyxcbiAgICBzZWNvbmQ6ICdzZWNvbmQnXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdGltZVJhbmdlVmFsaWRhdG9yID0gKG1pbiwgbWF4KSA9PiB7XG4gICAgcmV0dXJuIChjb250cm9sKSA9PiB7XG4gICAgICAgIGlmICghbWluIHx8ICFtYXggfHwgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVyciA9IHtcbiAgICAgICAgICAgIHRpbWVSYW5nZUVycm9yOiB7XG4gICAgICAgICAgICAgICAgbWF4VmFsdWU6IG1heCxcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbWluLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0luVGltZVJhbmdlKGNvbnRyb2wudmFsdWUsIG1pbiwgbWF4KSA/IG51bGwgOiBlcnI7XG4gICAgfTtcbn07XG5cbmNvbnN0IFZBTFVFX0RPQ19MSU5LJDMgPSAnaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvdGltZXBpY2tlci8jdG9jLWludGVncmF0aW9uLXdpdGgtanNvbic7XG5jb25zdCBJTlRMX0RBVEVfRk9STUFUID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS90ZWxlcmlrL2tlbmRvLWludGwvYmxvYi9tYXN0ZXIvZG9jcy9kYXRlLWZvcm1hdHRpbmcvaW5kZXgubWQnO1xuY29uc3QgZm9ybWF0UmVnRXhwID0gbmV3IFJlZ0V4cChgJHtUSU1FX1BBUlQuaG91cn18JHtUSU1FX1BBUlQubWludXRlfXwke1RJTUVfUEFSVC5zZWNvbmR9fCR7VElNRV9QQVJULmRheXBlcmlvZH18bGl0ZXJhbGApO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgVGltZVBpY2tlciBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfdGltZXBpY2tlciAlfSN0b2MtYmFzaWMtdXNhZ2UpLlxuICovXG5jbGFzcyBUaW1lUGlja2VyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih6b25lLCBsb2NhbGl6YXRpb24sIGNkciwgcG9wdXBTZXJ2aWNlLCBlbGVtZW50LCByZW5kZXJlciwgaW5qZWN0b3IsIHBpY2tlclNlcnZpY2UsIGludGwsIHRvdWNoRW5hYmxlZCQkMSkge1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5jZHIgPSBjZHI7XG4gICAgICAgIHRoaXMucG9wdXBTZXJ2aWNlID0gcG9wdXBTZXJ2aWNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjtcbiAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlID0gcGlja2VyU2VydmljZTtcbiAgICAgICAgdGhpcy5pbnRsID0gaW50bDtcbiAgICAgICAgdGhpcy50b3VjaEVuYWJsZWQgPSB0b3VjaEVuYWJsZWQkJDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvY3VzYWJsZUlkID0gYGstJHtndWlkKCl9YDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYGRpc2FibGVkYCBwcm9wZXJ0eSBvZiB0aGUgVGltZVBpY2tlciBhbmRcbiAgICAgICAgICogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgYWN0aXZlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfdGltZXBpY2tlciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBUaW1lUGlja2VyXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcmVhZG9ubHlfdGltZXBpY2tlciAlfSN0b2MtcmVhZC1vbmx5LXRpbWVwaWNrZXIpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgVGltZVBpY2tlciBpbnB1dCBmaWVsZFxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJlYWRvbmx5X3RpbWVwaWNrZXIgJX0jdG9jLXJlYWQtb25seS1pbnB1dCkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IE5vdGUgdGhhdCBpZiB5b3Ugc2V0IHRoZSBbYHJlYWRvbmx5YF0oeyUgc2x1ZyBhcGlfZGF0ZWlucHV0c190aW1lcGlja2VyY29tcG9uZW50ICV9I3RvYy1yZWFkb25seSkgcHJvcGVydHkgdmFsdWUgdG8gYHRydWVgLFxuICAgICAgICAgKiB0aGUgaW5wdXQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIHJlYWQtb25seSBzdGF0ZSByZWdhcmRsZXNzIG9mIHRoZSBgcmVhZE9ubHlJbnB1dGAgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlYWRPbmx5SW5wdXQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgdGltZSBmb3JtYXQgdGhhdCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZm9ybWF0c190aW1lcGlja2VyICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvcm1hdCA9ICd0JztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgaGludCB0aGUgVGltZVBpY2tlciBkaXNwbGF5cyB3aGVuIGl0cyB2YWx1ZSBpcyBgbnVsbGAuXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvblxuICAgICAgICAgKiBbcGxhY2Vob2xkZXJzXSh7JSBzbHVnIHBsYWNlaG9sZGVyc190aW1lcGlja2VyICV9KS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogX0BDb21wb25lbnQoe1xuICAgICAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAqICA8a2VuZG8tdGltZXBpY2tlciBwbGFjZWhvbGRlcj1cIkVudGVyIHN0YXJ0Li4uXCI+PC9rZW5kby10aW1lcGlja2VyPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJ1aWx0LWluIHZhbGlkYXRpb24gZm9yIGluY29tcGxldGUgZGF0ZXMgaXMgdG8gYmUgZW5mb3JjZWQgd2hlbiBhIGZvcm0gaXMgYmVpbmcgdmFsaWRhdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IHRoZSAqKkNhbmNlbCoqIGJ1dHRvbiBpbiB0aGUgcG9wdXAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgKipOb3cqKiBidXR0b24gaW4gdGhlIHBvcHVwLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IElmIHRoZSBjdXJyZW50IHRpbWUgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBpbmNyZW1lbnRhbCBzdGVwIGlzIGdyZWF0ZXIgdGhhbiBgMWAsIHRoZSAqKk5vdyoqIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm93QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYHRhYmluZGV4YCBwcm9wZXJ0eSBvZiB0aGUgVGltZVBpY2tlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFiaW5kZXggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIFRpbWVQaWNrZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgYnVpbHQtaW4gbWluIG9yIG1heCB2YWxpZGF0b3JzIGFyZSBlbmZvcmNlZCB3aGVuIGEgZm9ybSBpcyBiZWluZyB2YWxpZGF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhbmdlVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyB2YWx1ZS5cbiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBzZWN0aW9uIG9uXG4gICAgICAgICAqIFtldmVudHNdKHslIHNsdWcgb3ZlcnZpZXdfdGltZXBpY2tlciAlfSN0b2MtZXZlbnRzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgZm9jdXNlcyB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBzZWN0aW9uIG9uXG4gICAgICAgICAqIFtldmVudHNdKHslIHNsdWcgb3ZlcnZpZXdfdGltZXBpY2tlciAlfSN0b2MtZXZlbnRzKS5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBUbyB3aXJlIHRoZSBldmVudCBwcm9ncmFtbWF0aWNhbGx5LCB1c2UgdGhlIGBvbkZvY3VzYCBwcm9wZXJ0eS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogX0BDb21wb25lbnQoe1xuICAgICAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAqICA8a2VuZG8tdGltZXBpY2tlciAoZm9jdXMpPVwiaGFuZGxlRm9jdXMoKVwiPjwva2VuZG8tdGltZXBpY2tlcj5cbiAgICAgICAgICogYFxuICAgICAgICAgKiB9KVxuICAgICAgICAgKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgICAgICogICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgICAgICAqICAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnQgaXMgZm9jdXNlZFwiKTtcbiAgICAgICAgICogICB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vdHNsaW50OmRpc2FibGUtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIGlucHV0IGVsZW1lbnQgZ2V0cyBibHVycmVkLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld190aW1lcGlja2VyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IFRvIHdpcmUgdGhlIGV2ZW50IHByb2dyYW1tYXRpY2FsbHksIHVzZSB0aGUgYG9uQmx1cmAgcHJvcGVydHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgPGtlbmRvLXRpbWVwaWNrZXIgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCI+PC9rZW5kby10aW1lcGlja2VyPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgICAgICAgKiAgICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50IGlzIGJsdXJyZWRcIik7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vdHNsaW50OmRpc2FibGUtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIG9wZW4uXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50LCB0aGUgcG9wdXAgd2lsbCByZW1haW4gY2xvc2VkLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld190aW1lcGlja2VyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVuID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBwb3B1cCBpcyBhYm91dCB0byBjbG9zZS5cbiAgICAgICAgICogVGhpcyBldmVudCBpcyBwcmV2ZW50YWJsZS4gSWYgeW91IGNhbmNlbCB0aGUgZXZlbnQsIHRoZSBwb3B1cCB3aWxsIHJlbWFpbiBvcGVuLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld190aW1lcGlja2VyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JhcHBlckNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBvcHVwVUlEID0gZ3VpZCgpO1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IG5vb3A7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IG5vb3A7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLnJlc29sdmVkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VWYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gbm9vcDtcbiAgICAgICAgdGhpcy5fbWluID0gY2xvbmVEYXRlKE1JTl9USU1FKTtcbiAgICAgICAgdGhpcy5fbWF4ID0gY2xvbmVEYXRlKE1BWF9USU1FKTtcbiAgICAgICAgdGhpcy5fcG9wdXBTZXR0aW5ncyA9IHsgYW5pbWF0ZTogdHJ1ZSB9O1xuICAgICAgICB0aGlzLl9zaG93ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0ge307XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzID0gW107XG4gICAgICAgIHRoaXMucGlja2VyU3Vic2NyaXB0aW9ucyA9IHRoaXMucGlja2VyU2VydmljZS5vbkZvY3VzLnN1YnNjcmliZSh0aGlzLmhhbmRsZUZvY3VzLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnBpY2tlclN1YnNjcmlwdGlvbnMuYWRkKHRoaXMucGlja2VyU2VydmljZS5vbkJsdXIuc3Vic2NyaWJlKHRoaXMuaGFuZGxlQmx1ci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMucGlja2VyU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5waWNrZXJTZXJ2aWNlLmRhdGVDb21wbGV0ZW5lc3NDaGFuZ2Uuc3Vic2NyaWJlKHRoaXMuaGFuZGxlRGF0ZUNvbXBsZXRlbmVzc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgc21hbGxlc3QgdmFsaWQgdGltZSB2YWx1ZVxuICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgdGltZXJhbmdlc190aW1lcGlja2VyICV9KSkuXG4gICAgICovXG4gICAgc2V0IG1pbihtaW4pIHtcbiAgICAgICAgdGhpcy5fbWluID0gY2xvbmVEYXRlKG1pbiB8fCBNSU5fVElNRSk7XG4gICAgfVxuICAgIGdldCBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgYmlnZ2VzdCB2YWxpZCB0aW1lIHZhbHVlXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyB0aW1lcmFuZ2VzX3RpbWVwaWNrZXIgJX0pKS5cbiAgICAgKi9cbiAgICBzZXQgbWF4KG1heCkge1xuICAgICAgICB0aGlzLl9tYXggPSBjbG9uZURhdGUobWF4IHx8IE1BWF9USU1FKTtcbiAgICB9XG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgaW5jcmVtZW50YWwgc3RlcHMgb2YgdGhlIFRpbWVQaWNrZXIuXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBhcnRpY2xlIG9uXG4gICAgICogW2luY3JlbWVudGFsIHN0ZXBzXSh7JSBzbHVnIGluY3JlbWVudGFsc3RlcHNfdGltZXBpY2tlciAlfSkuXG4gICAgICpcbiAgICAgKiA+IElmIHRoZSBpbmNyZW1lbnRhbCBzdGVwIGlzIGdyZWF0ZXIgdGhhbiBgMWAsIHRoZSAqKk5vdyoqIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICogIDxrZW5kby10aW1lcGlja2VyIGZvcm1hdD1cIkhIOm1tOnNzXCIgW3N0ZXBzXT1cInN0ZXBzXCI+PC9rZW5kby10aW1lcGlja2VyPlxuICAgICAqIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgcHVibGljIHN0ZXBzID0geyBob3VyOiAyLCBtaW51dGU6IDE1LCBzZWNvbmQ6IDE1IH07XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICovXG4gICAgc2V0IHN0ZXBzKHN0ZXBzKSB7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0gc3RlcHMgfHwge307XG4gICAgfVxuICAgIGdldCBzdGVwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0ZXBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBwb3B1cCBvZiB0aGUgVGltZVBpY2tlci5cbiAgICAgKlxuICAgICAqIFRoZSBhdmFpbGFibGUgb3B0aW9ucyBhcmU6XG4gICAgICogLSBgYW5pbWF0ZTogQm9vbGVhbmAmbWRhc2g7Q29udHJvbHMgdGhlIHBvcHVwIGFuaW1hdGlvbi4gQnkgZGVmYXVsdCwgdGhlIG9wZW4gYW5kIGNsb3NlIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQuXG4gICAgICogLSBgYXBwZW5kVG86ICdyb290JyB8ICdjb21wb25lbnQnIHwgVmlld0NvbnRhaW5lclJlZmAmbWRhc2g7Q29udHJvbHMgdGhlIHBvcHVwIGNvbnRhaW5lci4gQnkgZGVmYXVsdCwgdGhlIHBvcHVwIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJvb3QgY29tcG9uZW50LlxuICAgICAqIC0gYHBvcHVwQ2xhc3M6IFN0cmluZ2AmbWRhc2g7U3BlY2lmaWVzIGEgbGlzdCBvZiBDU1MgY2xhc3NlcyB0aGF0IGFyZSB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBzZXQgcG9wdXBTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9wb3B1cFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgeyBhbmltYXRlOiB0cnVlIH0sIHNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0IHBvcHVwU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IHRhYkluZGV4KHRhYkluZGV4KSB7XG4gICAgICAgIHRoaXMudGFiaW5kZXggPSB0YWJJbmRleDtcbiAgICB9XG4gICAgZ2V0IHRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJpbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgVGltZVBpY2tlciBjb21wb25lbnQuXG4gICAgICovXG4gICAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGRpc2FibGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGlucHV0Um9sZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE9ubHlJbnB1dCA/ICdsaXN0Ym94JyA6ICdzcGluYnV0dG9uJztcbiAgICB9XG4gICAgZ2V0IGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbiAgICBzZXQgaXNBY3RpdmUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy53cmFwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2stc3RhdGUtZm9jdXNlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnay1zdGF0ZS1mb2N1c2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNob3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93O1xuICAgIH1cbiAgICBzZXQgc2hvdyhzaG93KSB7XG4gICAgICAgIGlmIChzaG93ICYmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2tpcFpvbmUgPSAhc2hvdyAmJiAoIXRoaXMuX3Nob3cgfHwgIWhhc09ic2VydmVycyh0aGlzLmNsb3NlKSk7XG4gICAgICAgIGlmICghc2tpcFpvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXAoc2hvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXAoc2hvdyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTZXJ2aWNlLmlucHV0O1xuICAgIH1cbiAgICBnZXQgdGltZVNlbGVjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTZXJ2aWNlLnRpbWVTZWxlY3RvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFVzZWQgYnkgdGhlIFRleHRCb3hDb250YWluZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb21wb25lbnQgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudmFsdWUgJiYgdGhpcy5pbnB1dC5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgICAgICAgdGhpcy5jb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0YWJpbmRleCcpO1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbiB8fCBjaGFuZ2VzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy50aW1lUmFuZ2VWYWxpZGF0ZUZuID0gdGhpcy5yYW5nZVZhbGlkYXRpb24gPyB0aW1lUmFuZ2VWYWxpZGF0b3IodGhpcy5taW4sIHRoaXMubWF4KSA6IG5vb3A7XG4gICAgICAgICAgICB0aGlzLmluY29tcGxldGVWYWxpZGF0b3IgPSB0aGlzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbiA/IGluY29tcGxldGVEYXRlVmFsaWRhdG9yKCkgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLmZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy52ZXJpZnlGb3JtYXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53aW5kb3dCbHVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvd0JsdXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbUV2ZW50cy5mb3JFYWNoKHVuYmluZENhbGxiYWNrID0+IHVuYmluZENhbGxiYWNrKCkpO1xuICAgICAgICB0aGlzLnBpY2tlclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBhbHRLZXksIGtleUNvZGUgfSA9IGV2ZW50O1xuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gS2V5cy5Fc2NhcGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbHRLZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlzLkFycm93VXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlzLkFycm93RG93biAmJiAhdGhpcy5zaG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZlcmlmeVZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgdGhpcy5pbnB1dC53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xUb3VjaGVkID0gZm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdmFsaWRhdGUoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUmFuZ2VWYWxpZGF0ZUZuKGNvbnRyb2wpIHx8IHRoaXMuaW5jb21wbGV0ZVZhbGlkYXRvcihjb250cm9sLCB0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuaXNEYXRlSW5jb21wbGV0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgVGltZVBpY2tlciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAqICA8YnV0dG9uIChjbGljayk9XCJ0aW1lcGlja2VyLmZvY3VzKClcIj5Gb2N1cyB0aW1lIHBpY2tlcjwvYnV0dG9uPlxuICAgICAqICA8a2VuZG8tdGltZXBpY2tlciAjdGltZXBpY2tlcj48L2tlbmRvLXRpbWVwaWNrZXI+XG4gICAgICogYFxuICAgICAqIH0pXG4gICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgVGltZVBpY2tlciBjb21wb25lbnQuXG4gICAgICovXG4gICAgYmx1cigpIHtcbiAgICAgICAgKHRoaXMudGltZVNlbGVjdG9yIHx8IHRoaXMuaW5wdXQpWydibHVyJ10oKTsgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHBvcHVwLiBJZiB5b3UgdXNlIHRoZSBgdG9nZ2xlYCBtZXRob2QgdG8gc2hvdyBvciBoaWRlIHRoZSBwb3B1cCxcbiAgICAgKiB0aGUgYG9wZW5gIGFuZCBgY2xvc2VgIGV2ZW50cyBkbyBub3QgZmlyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaG93IC0gVGhlIHN0YXRlIG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICB0b2dnbGUoc2hvdykge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNvbHZlZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGUoKHNob3cgPT09IHVuZGVmaW5lZCkgPyAhdGhpcy5zaG93IDogc2hvdyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG9wZW4gc3RhdGUgb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIGdldCBpc09wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYXBwZW5kVG8oKSB7XG4gICAgICAgIGNvbnN0IHsgYXBwZW5kVG8gfSA9IHRoaXMucG9wdXBTZXR0aW5ncztcbiAgICAgICAgaWYgKCFhcHBlbmRUbyB8fCBhcHBlbmRUbyA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBlbmRUbyA9PT0gJ2NvbXBvbmVudCcgPyB0aGlzLmNvbnRhaW5lciA6IGFwcGVuZFRvO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gY2xvbmVEYXRlKHZhbHVlKTtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UoY2xvbmVEYXRlKHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xvbmVEYXRlKHZhbHVlKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlUmVqZWN0KCkge1xuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUlucHV0Q2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuaW5wdXQuZm9ybWF0U2VjdGlvbnMuZGF0ZSA/IHZhbHVlIDogdGhpcy5tZXJnZVRpbWUodmFsdWUpO1xuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSh2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlTW91c2Vkb3duKGFyZ3MpIHtcbiAgICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlSWNvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICAgICAgLy9YWFg6IGV4cGxpY2l0IGNhbGwgaGFuZGxlRm9jdXMgaGFuZGxlciBoZXJlXG4gICAgICAgIC8vZHVlIHRvIGFzeW5jIElFIGZvY3VzIGV2ZW50XG4gICAgICAgIHRoaXMuaGFuZGxlRm9jdXMoKTtcbiAgICAgICAgdGhpcy5zaG93ID0gIXRoaXMuc2hvdztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBwb3B1cENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnay1ncm91cCcsXG4gICAgICAgICAgICAnay1yZXNldCdcbiAgICAgICAgXS5jb25jYXQodGhpcy5wb3B1cFNldHRpbmdzLnBvcHVwQ2xhc3MgfHwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbm9ybWFsaXplVGltZShkYXRlKSB7XG4gICAgICAgIHJldHVybiBzZXRUaW1lKE1JRE5JR0hUX0RBVEUsIGRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbWVyZ2VUaW1lKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICYmIHZhbHVlID8gc2V0VGltZSh0aGlzLnZhbHVlLCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG4gICAgdG9nZ2xlUG9wdXAoc2hvdykge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQcmV2ZW50YWJsZUV2ZW50KCk7XG4gICAgICAgIGlmICghdGhpcy5fc2hvdyAmJiBzaG93KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4uZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fc2hvdyAmJiAhc2hvdykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90b2dnbGUoc2hvdyk7XG4gICAgICAgIHRoaXMudG9nZ2xlRm9jdXMoKTtcbiAgICB9XG4gICAgX3RvZ2dsZShzaG93KSB7XG4gICAgICAgIGlmIChzaG93ID09PSB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Nob3cgPSBzaG93O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmID0gdGhpcy5wb3B1cFNlcnZpY2Uub3Blbih7XG4gICAgICAgICAgICAgICAgYW5jaG9yOiB0aGlzLndyYXBwZXIsXG4gICAgICAgICAgICAgICAgYW5jaG9yQWxpZ246IHsgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfSxcbiAgICAgICAgICAgICAgICBhbmltYXRlOiB0aGlzLnBvcHVwU2V0dGluZ3MuYW5pbWF0ZSxcbiAgICAgICAgICAgICAgICBhcHBlbmRUbzogdGhpcy5hcHBlbmRUbyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnBvcHVwVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcG9wdXBBbGlnbjogeyB2ZXJ0aWNhbDogJ3RvcCcsIGhvcml6b250YWw6IGRpcmVjdGlvbiB9LFxuICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M6IHRoaXMucG9wdXBDbGFzc2VzLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZTogJ2Fic29sdXRlJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmLnBvcHVwRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5wb3B1cFVJRCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmLnBvcHVwQW5jaG9yVmlld3BvcnRMZWF2ZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93ID0gZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9jdXNJbnB1dCgpIHtcbiAgICAgICAgaWYgKHRoaXMudG91Y2hFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgICB0b2dnbGVGb2N1cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvdykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lU2VsZWN0b3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy50b3VjaEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5pbnB1dC5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVCbHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmVyaWZ5VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICd2YWx1ZScgc2hvdWxkIGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBEYXRlIGluc3RhbmNlLiBDaGVjayAke1ZBTFVFX0RPQ19MSU5LJDN9IGZvciBwb3NzaWJsZSByZXNvbHV0aW9uLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZlcmlmeUZvcm1hdCgpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdENvbnRhaW5zRGF0ZVBhcnRzID0gdGhpcy5pbnRsLnNwbGl0RGF0ZUZvcm1hdCh0aGlzLmZvcm1hdCkuc29tZShwYXJ0ID0+ICFmb3JtYXRSZWdFeHAudGVzdChwYXJ0LnR5cGUpKTtcbiAgICAgICAgaWYgKGZvcm1hdENvbnRhaW5zRGF0ZVBhcnRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVkIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiBTdXBwb3J0ZWQgc3BlY2lmaWVycyBhcmUgVHx0fEh8aHxtfHN8YS4gU2VlICR7SU5UTF9EQVRFX0ZPUk1BVH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLnB1c2godGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd24uYmluZCh0aGlzKSkpO1xuICAgICAgICBpZiAoaXNXaW5kb3dBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy53aW5kb3dCbHVyU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHdpbmRvdywgJ2JsdXInKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVXaW5kb3dCbHVyLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVdpbmRvd0JsdXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnModGhpcy5vbkZvY3VzKSkge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvY3VzLmVtaXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUJsdXIoYXJncykge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gYXJncyAmJiBjdXJyZW50Rm9jdXNUYXJnZXQoYXJncyk7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmICh0aGlzLmlucHV0LmNvbnRhaW5zRWxlbWVudChjdXJyZW50VGFyZ2V0KSB8fFxuICAgICAgICAgICAgKHRoaXMudGltZVNlbGVjdG9yICYmIHRoaXMudGltZVNlbGVjdG9yLmNvbnRhaW5zRWxlbWVudChjdXJyZW50VGFyZ2V0KSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc09ic2VydmVycyh0aGlzLm9uQmx1cikgfHwgKHRoaXMuc2hvdyAmJiBoYXNPYnNlcnZlcnModGhpcy5jbG9zZSkpIHx8IHJlcXVpcmVzWm9uZU9uQmx1cih0aGlzLmNvbnRyb2wpKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJsdXJDb21wb25lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ibHVyQ29tcG9uZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmx1ckNvbXBvbmVudCgpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlOyAvLyBvcmRlciBpcyBpbXBvcnRhbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLm9uQmx1ci5lbWl0KCk7XG4gICAgfVxuICAgIGhhbmRsZURhdGVDb21wbGV0ZW5lc3NDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKSk7XG4gICAgfVxufVxuVGltZVBpY2tlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG8tdGltZXBpY2tlcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVQaWNrZXJDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVQaWNrZXJDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEtlbmRvSW5wdXQsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVQaWNrZXJDb21wb25lbnQpIH0sXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby50aW1lcGlja2VyJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBQaWNrZXJTZXJ2aWNlXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRpbWVwaWNrZXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIga2VuZG9UaW1lUGlja2VyTG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgICAgIGkxOG4tYWNjZXB0PVwia2VuZG8udGltZXBpY2tlci5hY2NlcHR8VGhlIEFjY2VwdCBidXR0b24gdGV4dCBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgYWNjZXB0PVwiU2V0XCJcblxuICAgICAgICAgICAgaTE4bi1hY2NlcHRMYWJlbD1cImtlbmRvLnRpbWVwaWNrZXIuYWNjZXB0TGFiZWx8VGhlIGxhYmVsIGZvciB0aGUgQWNjZXB0IGJ1dHRvbiBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgYWNjZXB0TGFiZWw9XCJTZXQgdGltZVwiXG5cbiAgICAgICAgICAgIGkxOG4tY2FuY2VsPVwia2VuZG8udGltZXBpY2tlci5jYW5jZWx8VGhlIENhbmNlbCBidXR0b24gdGV4dCBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgY2FuY2VsPVwiQ2FuY2VsXCJcblxuICAgICAgICAgICAgaTE4bi1jYW5jZWxMYWJlbD1cImtlbmRvLnRpbWVwaWNrZXIuY2FuY2VsTGFiZWx8VGhlIGxhYmVsIGZvciB0aGUgQ2FuY2VsIGJ1dHRvbiBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgY2FuY2VsTGFiZWw9XCJDYW5jZWwgY2hhbmdlc1wiXG5cbiAgICAgICAgICAgIGkxOG4tbm93PVwia2VuZG8udGltZXBpY2tlci5ub3d8VGhlIE5vdyBidXR0b24gdGV4dCBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgbm93PVwiTm93XCJcblxuICAgICAgICAgICAgaTE4bi1ub3dMYWJlbD1cImtlbmRvLnRpbWVwaWNrZXIubm93TGFiZWx8VGhlIGxhYmVsIGZvciB0aGUgTm93IGJ1dHRvbiBpbiB0aGUgdGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgbm93TGFiZWw9XCJTZWxlY3Qgbm93XCJcblxuICAgICAgICAgICAgaTE4bi10b2dnbGU9XCJrZW5kby50aW1lcGlja2VyLnRvZ2dsZXxUaGUgbGFiZWwgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIGluIHRoZSB0aW1lcGlja2VyIGNvbXBvbmVudFwiXG4gICAgICAgICAgICB0b2dnbGU9XCJUb2dnbGUgdGltZSBsaXN0XCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHNwYW4gI3dyYXBwZXJcbiAgICAgICAgICAgIGNsYXNzPVwiay1waWNrZXItd3JhcFwiXG4gICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxrZW5kby1kYXRlaW5wdXRcbiAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgICBbZm9jdXNhYmxlSWRdPVwiZm9jdXNhYmxlSWRcIlxuICAgICAgICAgICAgICAgIFtoYXNQb3B1cF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaXNQb3B1cE9wZW5dPVwic2hvd1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgcmVhZE9ubHlJbnB1dFwiXG4gICAgICAgICAgICAgICAgW3JvbGVdPVwiaW5wdXRSb2xlXCJcbiAgICAgICAgICAgICAgICBbYXJpYVJlYWRPbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0XT1cImZvcm1hdFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdFBsYWNlaG9sZGVyXT1cImZvcm1hdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwibm9ybWFsaXplVGltZShtaW4pXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIm5vcm1hbGl6ZVRpbWUobWF4KVwiXG4gICAgICAgICAgICAgICAgW2luY29tcGxldGVEYXRlVmFsaWRhdGlvbl09XCJpbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb25cIlxuICAgICAgICAgICAgICAgIFtzdGVwc109XCJzdGVwc1wiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIiFzaG93ID8gdGFiaW5kZXggOiAtMVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2tlbmRvLWRhdGVpbnB1dD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvY2FsaXphdGlvbi5nZXQoJ3RvZ2dsZScpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsaXphdGlvbi5nZXQoJ3RvZ2dsZScpXCJcbiAgICAgICAgICAgICAgICBba2VuZG9FdmVudHNPdXRzaWRlQW5ndWxhcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVJY29uQ2xpY2ssXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bjogaGFuZGxlTW91c2Vkb3duXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1jbG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcG9wdXBUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8a2VuZG8tdGltZXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICN0aW1lU2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgW2NhbmNlbEJ1dHRvbl09XCJjYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbm93QnV0dG9uXT1cIm5vd0J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdGVwc109XCJzdGVwc1wiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleWRvd246IGhhbmRsZUtleWRvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd246IGhhbmRsZU1vdXNlZG93blxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVSZWplY3QpPVwiaGFuZGxlUmVqZWN0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRpbWVzZWxlY3Rvci1tZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdExhYmVsXT1cImxvY2FsaXphdGlvbi5nZXQoJ2FjY2VwdExhYmVsJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdF09XCJsb2NhbGl6YXRpb24uZ2V0KCdhY2NlcHQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuY2VsTGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnY2FuY2VsTGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuY2VsXT1cImxvY2FsaXphdGlvbi5nZXQoJ2NhbmNlbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub3dMYWJlbF09XCJsb2NhbGl6YXRpb24uZ2V0KCdub3dMYWJlbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub3ddPVwibG9jYWxpemF0aW9uLmdldCgnbm93JylcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwva2VuZG8tdGltZXNlbGVjdG9yLW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tdGltZXNlbGVjdG9yPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UaW1lUGlja2VyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IEluamVjdG9yIH0sXG4gICAgeyB0eXBlOiBQaWNrZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9LFxuICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtUT1VDSF9FTkFCTEVELF0gfV0gfVxuXTtcblRpbWVQaWNrZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0sXSB9XSxcbiAgICBwb3B1cFRlbXBsYXRlOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsncG9wdXBUZW1wbGF0ZScsXSB9XSxcbiAgICB3cmFwcGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnd3JhcHBlcicsXSB9XSxcbiAgICBmb2N1c2FibGVJZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJlYWRvbmx5OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZWFkT25seUlucHV0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcm1hdFBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwbGFjZWhvbGRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGluY29tcGxldGVEYXRlVmFsaWRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY2FuY2VsQnV0dG9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBub3dCdXR0b246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3B1cFNldHRpbmdzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJpbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGFiSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByYW5nZVZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIG9uRm9jdXM6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydmb2N1cycsXSB9XSxcbiAgICBvbkJsdXI6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydibHVyJyxdIH1dLFxuICAgIG9wZW46IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHdyYXBwZXJDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpZGdldCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstdGltZXBpY2tlcicsXSB9XSxcbiAgICBkaXNhYmxlZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0YXRlLWRpc2FibGVkJyxdIH1dXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0UmVnRXhwID0gbmV3IFJlZ0V4cChgJHtUSU1FX1BBUlQuaG91cn18JHtUSU1FX1BBUlQubWludXRlfXwke1RJTUVfUEFSVC5zZWNvbmR9fCR7VElNRV9QQVJULmRheXBlcmlvZH18bGl0ZXJhbGApO1xuY29uc3QgVkFMVUVfRE9DX0xJTkskNCA9ICdodHRwczovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvZGF0ZWlucHV0cy9kYXRldGltZXBpY2tlci9pbnRlZ3JhdGlvbi13aXRoLWpzb24vJztcbmNvbnN0IE1JTl9NQVhfRE9DX0xJTksgPSAnaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvZGF0ZXRpbWVwaWNrZXIvZGF0ZS10aW1lLWxpbWl0cy8nO1xuY29uc3QgREVGQVVMVF9BQ1RJVkVfVEFCID0gJ2RhdGUnO1xuY29uc3QgREVGQVVMVF9EQVRFSU5QVVRfRk9STUFUID0gJ2cnO1xuY29uc3QgREVGQVVMVF9USU1FU0VMRUNUT1JfRk9STUFUID0gJ3QnO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgRGF0ZVRpbWVQaWNrZXIgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGV0aW1lcGlja2VyICV9KS5cbiAqL1xuY2xhc3MgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBvcHVwU2VydmljZSwgaW50bCwgY2RyLCBwaWNrZXJTZXJ2aWNlLCBuZ1pvbmUsIGhvc3QsIHRvdWNoRW5hYmxlZCQkMSwgbG9jYWxpemF0aW9uLCBkaXNhYmxlZERhdGVzU2VydmljZSwgcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2UgPSBwb3B1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMuaW50bCA9IGludGw7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UgPSBwaWNrZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICAgICAgdGhpcy50b3VjaEVuYWJsZWQgPSB0b3VjaEVuYWJsZWQkJDE7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlID0gZGlzYWJsZWREYXRlc1NlcnZpY2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaG9zdENsYXNzZXMgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb2N1c2FibGVJZCA9IGBrLSR7Z3VpZCgpfWA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGUgaW5wdXQgZWxlbWVudCBvZiB0aGUgRGF0ZVRpbWVQaWNrZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpdGxlID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHkgb2YgdGhlIERhdGVUaW1lUGlja2VyIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBhY3RpdmVcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkaXNhYmxlZF9kYXRldGltZXBpY2tlciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBEYXRlVGltZVBpY2tlclxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJlYWRvbmx5X2RhdGV0aW1lcGlja2VyICV9I3RvYy1yZWFkLW9ubHktZGF0ZXRpbWVwaWNrZXIpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgRGF0ZVRpbWVQaWNrZXIgaW5wdXQgZmllbGRcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyByZWFkb25seV9kYXRldGltZXBpY2tlciAlfSN0b2MtcmVhZC1vbmx5LWlucHV0KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gTm90ZSB0aGF0IGlmIHlvdSBzZXQgdGhlIFtgcmVhZG9ubHlgXSh7JSBzbHVnIGFwaV9kYXRlaW5wdXRzX2RhdGV0aW1lcGlja2VyY29tcG9uZW50ICV9I3RvYy1yZWFkb25seSkgcHJvcGVydHkgdmFsdWUgdG8gYHRydWVgLFxuICAgICAgICAgKiB0aGUgaW5wdXQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIHJlYWQtb25seSBzdGF0ZSByZWdhcmRsZXNzIG9mIHRoZSBgcmVhZE9ubHlJbnB1dGAgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlYWRPbmx5SW5wdXQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IHRoZSAqKkNhbmNlbCoqIGJ1dHRvbiBpbiB0aGUgcG9wdXBcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRldGltZXBpY2tlcl9wb3B1cF9vcHRpb25zICV9I3RvYy10b2dnbGluZy10aGUtY2FuY2VsLWJ1dHRvbikpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24gPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGRpc3BsYXkgYSB3ZWVrIG51bWJlciBjb2x1bW4gaW4gdGhlIGBtb250aGAgdmlldyBvZiB0aGUgcG9wdXAgQ2FsZW5kYXJcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRldGltZXBpY2tlcl9jYWxlbmRhcl9vcHRpb25zICV9I3RvYy13ZWVrLW51bWJlci1jb2x1bW4pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2Vla051bWJlciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBidWlsdC1pbiBtaW4gb3IgbWF4IHZhbGlkYXRvcnMgYXJlIGVuZm9yY2VkIHdoZW4gdmFsaWRhdGluZyBhIGZvcm1cbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlcmFuZ2VzX2RhdGV0aW1lcGlja2VyICV9I3RvYy1wcmV2ZW50LWludmFsaWQtaW5wdXQpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmFuZ2VWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgYnVpbHQtaW4gdmFsaWRhdG9yIGZvciBkaXNhYmxlZFxuICAgICAgICAgKiBkYXRlIHJhbmdlcyBpcyBlbmZvcmNlZCB3aGVuIHZhbGlkYXRpbmcgYSBmb3JtXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGlzYWJsZWRfZGF0ZXNfZGF0ZXRpbWVwaWNrZXIgJX0jdG9jLXZhbGlkYXRpb24pKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1ZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBidWlsdC1pbiB2YWxpZGF0aW9uIGZvciBpbmNvbXBsZXRlIGRhdGVzIGlzIHRvIGJlIGVuZm9yY2VkIHdoZW4gYSBmb3JtIGlzIGJlaW5nIHZhbGlkYXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5jb21wbGV0ZURhdGVWYWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyB2YWx1ZS5cbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGV0aW1lcGlja2VyICV9I3RvYy1tZXRob2RzLWFuZC1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIG9wZW4uXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50IGJ5IHNldHRpbmcgYGV2ZW50LnByZXZlbnREZWZhdWx0KClgLCB0aGUgcG9wdXAgd2lsbCByZW1haW4gY2xvc2VkLlxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXRpbWVwaWNrZXIgJX0jdG9jLW1ldGhvZHMtYW5kLWV2ZW50cykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVuID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBwb3B1cCBpcyBhYm91dCB0byBjbG9zZS5cbiAgICAgICAgICogVGhpcyBldmVudCBpcyBwcmV2ZW50YWJsZS4gSWYgeW91IGNhbmNlbCB0aGUgZXZlbnQgYnkgc2V0dGluZyBgZXZlbnQucHJldmVudERlZmF1bHQoKWAsIHRoZSBwb3B1cCB3aWxsIHJlbWFpbiBvcGVuLlxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXRpbWVwaWNrZXIgJX0jdG9jLW1ldGhvZHMtYW5kLWV2ZW50cykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgdXNlciBmb2N1c2VzIHRoZSBjb21wb25lbnQuXG4gICAgICAgICAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyBvdmVydmlld19kYXRldGltZXBpY2tlciAlfSN0b2MtbWV0aG9kcy1hbmQtZXZlbnRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgYmx1cnMgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X2RhdGV0aW1lcGlja2VyICV9I3RvYy1tZXRob2RzLWFuZC1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKlxuICAgICAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBDYWxlbmRhciBvciB0aGUgVGltZVNlbGVjdG9yIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBERUZBVUxUX0FDVElWRV9UQUI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgc3RyaXBwZWQgdGltZS1yZWxhdGVkIGZvcm1hdCB0aGF0IGlzIHVzZWQgaW4gdGhlIFRpbWVTZWxlY3Rvci5cbiAgICAgICAgICogVXBkYXRlcyBlYWNoIHRpbWUgdGhlIGBmb3JtYXRgIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpbWVTZWxlY3RvckZvcm1hdCA9IERFRkFVTFRfVElNRVNFTEVDVE9SX0ZPUk1BVDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGltZVNlbGVjdG9yTWluID0gY2xvbmVEYXRlKE1JTl9USU1FKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGltZVNlbGVjdG9yTWF4ID0gY2xvbmVEYXRlKE1BWF9USU1FKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FsZW5kYXJWYWx1ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhbGVuZGFyTWluID0gY2xvbmVEYXRlKE1JTl9EQVRFKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FsZW5kYXJNYXggPSBsYXN0TWlsbGlzZWNvbmRPZkRhdGUoTUFYX0RBVEUpO1xuICAgICAgICB0aGlzLl9wb3B1cFNldHRpbmdzID0geyBhbmltYXRlOiB0cnVlIH07XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gREVGQVVMVF9EQVRFSU5QVVRfRk9STUFUO1xuICAgICAgICB0aGlzLl90YWJpbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRUYWIgPSBERUZBVUxUX0FDVElWRV9UQUI7XG4gICAgICAgIHRoaXMuX21pbiA9IG1lcmdlRGF0ZUFuZFRpbWUoTUlOX0RBVEUsIE1JTl9USU1FKTtcbiAgICAgICAgdGhpcy5fbWF4ID0gbWVyZ2VEYXRlQW5kVGltZShNQVhfREFURSwgTUFYX1RJTUUpO1xuICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQgPSBub29wO1xuICAgICAgICB0aGlzLm9uQ29udHJvbENoYW5nZSA9IG5vb3A7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLm1pblZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLm1heFZhbGlkYXRlRm4gPSBub29wO1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gbm9vcDtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGlucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTZXJ2aWNlLmlucHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGNhbGVuZGFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTZXJ2aWNlLmNhbGVuZGFyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHRpbWVTZWxlY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyU2VydmljZS50aW1lU2VsZWN0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhlIERhdGVUaW1lUGlja2VyIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqID4gVGhlIGB2YWx1ZWAgaGFzIHRvIGJlIGEgdmFsaWQgW0phdmFTY3JpcHQgYERhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlKSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gY2xvbmVEYXRlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGRhdGUgZm9ybWF0IGZvciBkaXNwbGF5aW5nIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZm9ybWF0c19kYXRldGltZXBpY2tlciAlfSkpLlxuICAgICAqL1xuICAgIHNldCBmb3JtYXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMudGltZVNlbGVjdG9yRm9ybWF0ID0gdGhpcy5nZXRUaW1lU2VsZWN0b3JGb3JtYXQodmFsdWUpO1xuICAgIH1cbiAgICBnZXQgZm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIFtgdGFiaW5kZXhgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL3RhYmluZGV4KSBvZiB0aGUgRGF0ZVRpbWVQaWNrZXIuXG4gICAgICovXG4gICAgc2V0IHRhYmluZGV4KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRhYmluZGV4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5fdGFiaW5kZXggPSAhaXNOYU4odGFiaW5kZXgpID8gdGFiaW5kZXggOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGdldCB0YWJpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYmluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlcyBvZiB0aGUgRGF0ZVRpbWVQaWNrZXIgdGhhdCB3aWxsIGJlIGRpc2FibGVkXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkaXNhYmxlZF9kYXRlc19kYXRldGltZXBpY2tlciAlfSkpLlxuICAgICAqL1xuICAgIHNldCBkaXNhYmxlZERhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkRGF0ZXMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzU2VydmljZS5pbml0aWFsaXplKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGRpc2FibGVkRGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZERhdGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBwb3B1cCBzZXR0aW5ncyBvZiB0aGUgRGF0ZVRpbWVQaWNrZXJcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGV0aW1lcGlja2VyX3BvcHVwX29wdGlvbnMgJX0jdG9jLWN1c3RvbWl6aW5nLXRoZS1wb3B1cCkpLlxuICAgICAqXG4gICAgICogVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgICAgKiAtIGBhbmltYXRlOiBCb29sZWFuYCZtZGFzaDtDb250cm9scyB0aGUgcG9wdXAgYW5pbWF0aW9uLiBCeSBkZWZhdWx0LCB0aGUgb3BlbiBhbmQgY2xvc2UgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZC5cbiAgICAgKiAtIGBhcHBlbmRUbzogJ3Jvb3QnIHwgJ2NvbXBvbmVudCcgfCBWaWV3Q29udGFpbmVyUmVmYCZtZGFzaDtDb250cm9scyB0aGUgcG9wdXAgY29udGFpbmVyLiBCeSBkZWZhdWx0LCB0aGUgcG9wdXAgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcm9vdCBjb21wb25lbnQuXG4gICAgICogLSBgcG9wdXBDbGFzczogU3RyaW5nYCZtZGFzaDtTcGVjaWZpZXMgYSBsaXN0IG9mIENTUyBjbGFzc2VzIHRoYXQgYXJlIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIHNldCBwb3B1cFNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3BvcHVwU2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB7IGFuaW1hdGU6IHRydWUgfSwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBnZXQgcG9wdXBTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwU2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgc21hbGxlc3QgdmFsaWQgZGF0ZS5cbiAgICAgKiBUaGUgQ2FsZW5kYXIgd2lsbCBub3QgZGlzcGxheSBkYXRlcyBiZWZvcmUgdGhpcyB2YWx1ZS5cbiAgICAgKiBJZiB0aGUgYG1pbmAgdmFsdWUgb2YgdGhlIENhbGVuZGFyIGlzIHNlbGVjdGVkLCB0aGUgVGltZVBpY2tlciB3aWxsIG5vdCBkaXNwbGF5XG4gICAgICogdGltZSBlbnRyaWVzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIHRpbWUgcG9ydGlvbiBvZiB0aGlzIHZhbHVlXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlcmFuZ2VzX2RhdGV0aW1lcGlja2VyICV9KSkuXG4gICAgICovXG4gICAgc2V0IG1pbih2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9taW4gPSBjbG9uZURhdGUodmFsdWUpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyTWluID0gZ2V0RGF0ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgYmlnZ2VzdCB2YWxpZCBkYXRlLlxuICAgICAqIFRoZSBDYWxlbmRhciB3aWxsIG5vdCBkaXNwbGF5IGRhdGVzIGFmdGVyIHRoaXMgdmFsdWUuXG4gICAgICogSWYgdGhlIGBtYXhgIHZhbHVlIG9mIHRoZSBDYWxlbmRhciBpcyBzZWxlY3RlZCwgdGhlIFRpbWVQaWNrZXIgd2lsbCBub3QgZGlzcGxheVxuICAgICAqIHRpbWUgZW50cmllcyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgcG9ydGlvbiBvZiB0aGlzIHZhbHVlXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRlcmFuZ2VzX2RhdGV0aW1lcGlja2VyICV9KSkuXG4gICAgICovXG4gICAgc2V0IG1heCh2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXggPSBjbG9uZURhdGUodmFsdWUpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyTWF4ID0gbGFzdE1pbGxpc2Vjb25kT2ZEYXRlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgb3Blbi5cbiAgICAgKi9cbiAgICBnZXQgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMucG9wdXBSZWYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcG9uZW50IG9yIGl0cyBwb3B1cCBjb250ZW50IGlzIGZvY3VzZWQuXG4gICAgICovXG4gICAgZ2V0IGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gICAgfVxuICAgIHNldCBpc0FjdGl2ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgdGFiIG9uIG9wZW5pbmcgdGhlIHBvcHVwXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkYXRldGltZXBpY2tlcl9wb3B1cF9vcHRpb25zICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LXRhYikpLlxuICAgICAqL1xuICAgIHNldCBkZWZhdWx0VGFiKHRhYikge1xuICAgICAgICB0aGlzLl9kZWZhdWx0VGFiID0gdGFiIHx8IERFRkFVTFRfQUNUSVZFX1RBQjtcbiAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0aGlzLmRlZmF1bHRUYWI7XG4gICAgfVxuICAgIGdldCBkZWZhdWx0VGFiKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCB0YWJTd2l0Y2hUcmFuc2l0aW9uKCkge1xuICAgICAgICAvKlxuICAgICAgICAgV2hlbiB0aGUgcG9wdXAgaXMgb3BlbmluZywgZGlzYWJsZXMgdGhlIHNldCB0cmFuc2l0aW9uIGluIHRoZSB0aGVtZXMuIFdoZW4gYGRlZmF1bHRUYWJgIGlzIHNldCB0byBgdGltZWAsXG4gICAgICAgICB0aGUgcG9wdXAgb3BlbnMgd2l0aCBhbiBhY3RpdmUgKipUaW1lKiogdGFiIGFuZCB0aGUgYW5pbWF0aW9uIG9mIHRoZSBpbml0aWFsIHRyYW5zaXRpb24gaXMgdW5kZXNpcmVkLlxuICAgICAgICAgU2V0dGluZyB0aGUgaW5saW5lIHRyYW5zaXRpb24gc3R5bGUgdG8gYG5vbmVgIG92ZXJyaWRlcyB0aGUgc2V0IGFuaW1hdGlvbiBpbiB0aGUgdGhlbWVzLlxuICAgICAgICAgU2V0dGluZyB0aGUgaW5saW5lIHRyYW5zaXRpb24gc3R5bGUgdG8gYG51bGxgIGRvZXMgbm90IGFwcGx5IGFueSBpbmxpbmUgc3R5bGVzIG9yIG92ZXJyaWRlIHRoZSB0aGVtZXMgQ1NTLlxuICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdGhpcy5pc09wZW4gPyBudWxsIDogJ25vbmUnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQ2FsZW5kYXIgd2lsbCBiZSBkaXNhYmxlZC5cbiAgICAgKiBUaGUgaW5hY3RpdmUgdGFiIGNvbXBvbmVudCBnZXRzIGRpc2FibGVkIGFuZCBiZWNvbWVzIGluYWNjZXNzaWJsZSBvbiB0YWIgY2xpY2suXG4gICAgICovXG4gICAgZ2V0IGRpc2FibGVDYWxlbmRhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiICE9PSAnZGF0ZScgJiYgIXRoaXMuY2FsZW5kYXIuaXNBY3RpdmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaW5wdXRSb2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkT25seUlucHV0ID8gJ2xpc3Rib3gnIDogJ3NwaW5idXR0b24nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVGltZVNlbGVjdG9yIHdpbGwgYmUgZGlzYWJsZWQuXG4gICAgICogVGhlIGluYWN0aXZlIHRhYiBjb21wb25lbnQgZ2V0cyBkaXNhYmxlZCBhbmQgYmVjb21lcyBpbmFjY2Vzc2libGUgb24gdGFiIGNsaWNrLlxuICAgICAqL1xuICAgIGdldCBkaXNhYmxlVGltZVNlbGVjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgIT09ICd0aW1lJyAmJiAhdGhpcy50aW1lU2VsZWN0b3IuaXNBY3RpdmU7XG4gICAgfVxuICAgIGdldCBhY3RpdmVUYWJDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShpc1ByZXNlbnQodGhpcy5jYWxlbmRhcikgfHwgaXNQcmVzZW50KHRoaXMudGltZVNlbGVjdG9yKSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdkYXRlJyA/IHRoaXMuY2FsZW5kYXIgOiB0aGlzLnRpbWVTZWxlY3RvcjtcbiAgICB9XG4gICAgZ2V0IGFwcGVuZFRvKCkge1xuICAgICAgICBjb25zdCB7IGFwcGVuZFRvIH0gPSB0aGlzLnBvcHVwU2V0dGluZ3M7XG4gICAgICAgIGlmICghaXNQcmVzZW50KGFwcGVuZFRvKSB8fCBhcHBlbmRUbyA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBlbmRUbyA9PT0gJ2NvbXBvbmVudCcgPyB0aGlzLmNvbnRhaW5lciA6IGFwcGVuZFRvO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnBpY2tlclNlcnZpY2Uub25Gb2N1c1xuICAgICAgICAgICAgLy8gZGV0ZWN0IHBvcHVwIGNoYW5nZXMgdG8gZGlzYWJsZSB0aGUgaW5hY3RpdmUgdmlldyBtYXJrLXVwIHdoZW4gdGhlIHBvcHVwIGlzIG9wZW5cbiAgICAgICAgICAgIC5waXBlKHRhcCh0aGlzLmRldGVjdFBvcHVwQ2hhbmdlcy5iaW5kKHRoaXMpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5oYW5kbGVGb2N1cy5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5waWNrZXJTZXJ2aWNlLm9uQmx1ci5zdWJzY3JpYmUodGhpcy5oYW5kbGVCbHVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnBpY2tlclNlcnZpY2Uuc2FtZURhdGVTZWxlY3RlZC5zdWJzY3JpYmUodGhpcy5oYW5kbGVDYWxlbmRhclZhbHVlQ2hhbmdlLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMucGlja2VyU2VydmljZS5kYXRlQ29tcGxldGVuZXNzQ2hhbmdlLnN1YnNjcmliZSh0aGlzLmhhbmRsZURhdGVDb21wbGV0ZW5lc3NDaGFuZ2UuYmluZCh0aGlzKSkpO1xuICAgICAgICBpZiAoaXNXaW5kb3dBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBmcm9tRXZlbnQod2luZG93LCAnYmx1cicpLnN1YnNjcmliZSh0aGlzLmhhbmRsZUNhbmNlbC5iaW5kKHRoaXMpKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChjaGFuZ2VzLm1pbikgfHwgaXNQcmVzZW50KGNoYW5nZXMubWF4KSkge1xuICAgICAgICAgICAgdGhpcy52ZXJpZnlNaW5NYXhSYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbiB8fCBjaGFuZ2VzLmRpc2FibGVkRGF0ZXNWYWxpZGF0aW9uIHx8IGNoYW5nZXMuZGlzYWJsZWREYXRlcyB8fCBjaGFuZ2VzLmluY29tcGxldGVEYXRlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0ZUZuID0gdGhpcy5yYW5nZVZhbGlkYXRpb24gPyBtaW5WYWxpZGF0b3IodGhpcy5taW4pIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdGVGbiA9IHRoaXMucmFuZ2VWYWxpZGF0aW9uID8gbWF4VmFsaWRhdG9yKHRoaXMubWF4KSA6IG5vb3A7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuID0gdGhpcy5kaXNhYmxlZERhdGVzVmFsaWRhdGlvbiA/IGRpc2FibGVkRGF0ZXNWYWxpZGF0b3IodGhpcy5kaXNhYmxlZERhdGVzU2VydmljZS5pc0RhdGVEaXNhYmxlZCkgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5pbmNvbXBsZXRlVmFsaWRhdG9yID0gdGhpcy5pbmNvbXBsZXRlRGF0ZVZhbGlkYXRpb24gPyBpbmNvbXBsZXRlRGF0ZVZhbGlkYXRvcigpIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogKiBJZiB0aGUgcG9wdXAgaXMgY2xvc2VkLCBmb2N1c2VzIHRoZSBEYXRlVGltZVBpY2tlciBpbnB1dC5cbiAgICAgKiAqIElmIHRoZSBwb3B1cCBpcyBvcGVuLCB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gaXRzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYkNvbXBvbmVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJsdXJzIHRoZSBEYXRlVGltZVBpY2tlci5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgdGhpcy5hY3RpdmVUYWJDb21wb25lbnQuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiQ29tcG9uZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHBvcHVwLiBJZiB5b3UgdXNlIHRoZSBgdG9nZ2xlYCBtZXRob2QgdG8gc2hvdyBvciBoaWRlIHRoZSBwb3B1cCxcbiAgICAgKiB0aGUgYG9wZW5gIGFuZCBgY2xvc2VgIGV2ZW50cyBkbyBub3QgZmlyZS5cbiAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfZGF0ZXRpbWVwaWNrZXIgJX0jdG9jLW1ldGhvZHMtYW5kLWV2ZW50cykpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNob3cgLSBUaGUgc3RhdGUgb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIHRvZ2dsZShzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkgfHwgc2hvdyA9PT0gdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gaXNQcmVzZW50KHNob3cpID8gc2hvdyA6ICF0aGlzLmlzT3BlbjtcbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBvcHVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICAgICAgICAgIC8vIENoYW5nZXMgdGhlIHRhYiBhbmQgdGhlIGNhbGVuZGFyIG9yIGNsb2NrIGljb24gdG8gdGhlIGRlc2lnbmF0ZWQgZGVmYXVsdC5cbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiAhPT0gdGhpcy5kZWZhdWx0VGFiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0aGlzLmRlZmF1bHRUYWI7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdmFsaWRhdGUoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5WYWxpZGF0ZUZuKGNvbnRyb2wpIHx8IHRoaXMubWF4VmFsaWRhdGVGbihjb250cm9sKSB8fCB0aGlzLmRpc2FibGVkRGF0ZXNWYWxpZGF0ZUZuKGNvbnRyb2wpIHx8IHRoaXMuaW5jb21wbGV0ZVZhbGlkYXRvcihjb250cm9sLCB0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuaXNEYXRlSW5jb21wbGV0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogVXNlZCBieSB0aGUgVGV4dEJveENvbnRhaW5lciB0byBkZXRlcm1pbmUgaWYgdGhlIGZsb2F0aW5nIGxhYmVsIHdpbGwgcmVuZGVyIGluIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gIWlzUHJlc2VudCh0aGlzLnZhbHVlKSAmJiB0aGlzLmlucHV0LmlzRW1wdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUljb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJldmVudHMgdGhlIGV2ZW50IGRlZmF1bHQgdG8gZXZhZGUgZm9jdXNpbmcgdGhlIERhdGVJbnB1dCBpbnB1dCB3aGVuIHBsYWNlZCBpbnNpZGUgYSBsYWJlbCAoRkYvSUUvRWRnZSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcnVuSW5ab25lID0gIXRoaXMuaXNPcGVuIHx8IGhhc09ic2VydmVycyh0aGlzLmNsb3NlKTtcbiAgICAgICAgdGhpcy5ydW4ocnVuSW5ab25lLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgICAgICAgICAgLy8gaGFuZGxlIGZvY3VzIGZpcnN0IHRvIG1haW50YWluIGNvcnJlY3QgZXZlbnQgb3JkZXIgYGZvY3VzYCA9PiBgb3BlbmBcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXAoc2hvdWxkT3Blbik7XG4gICAgICAgICAgICB0aGlzLnN3aXRjaEZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnModGhpcy5vbkZvY3VzKSkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25Gb2N1cy5lbWl0KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSB8fCB0aGlzLmZvY3VzVGFyZ2V0SW5Db21wb25lbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc05nQ29udHJvbFVudG91Y2hlZCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbmctdW50b3VjaGVkJyk7XG4gICAgICAgIGNvbnN0IHJ1bkluWm9uZSA9IGlzTmdDb250cm9sVW50b3VjaGVkIHx8IGhhc09ic2VydmVycyh0aGlzLm9uQmx1cikgfHwgKHRoaXMuaXNPcGVuICYmIGhhc09ic2VydmVycyh0aGlzLmNsb3NlKSk7XG4gICAgICAgIHRoaXMucnVuKHJ1bkluWm9uZSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkJsdXIuZW1pdCgpO1xuICAgICAgICAgICAgdGhpcy5vbkNvbnRyb2xUb3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNoYW5nZUFjdGl2ZVRhYih0YWIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiB8fCB0aGlzLmFjdGl2ZVRhYiA9PT0gdGFiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGVyc2lzdHMgdGhlIFRjdXJyZW50IHZhbHVlIG9mIHRoZSBUaW1lU2VsZWN0b3Igd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0YWJzXG4gICAgICAgIGlmICghaXNFcXVhbCh0aGlzLnRpbWVTZWxlY3Rvci52YWx1ZSwgdGhpcy50aW1lU2VsZWN0b3IuY3VycmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVNlbGVjdG9yLmhhbmRsZUFjY2VwdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZGV0ZWN0UG9wdXBDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVUYWJDaGFuZ2VUcmFuc2l0aW9uRW5kKGRhdGVUaW1lU2VsZWN0b3IsIGV2ZW50KSB7XG4gICAgICAgIC8vIGhhbmRsZSBvbmx5IHRoZSAuay1kYXRldGltZS1zZWxlY3RvciBlbGVtZW50IHRyYW5zaXRpb24sIGlnbm9yZSBhbnkgY2hpbGQgZWxlbWVudCB0cmFuc2l0aW9uc1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBkYXRlVGltZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVUYWJDb21wb25lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUFjY2VwdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lcmdlRGF0ZUFuZFRpbWUodGhpcy5jYWxlbmRhci52YWx1ZSwgdGhpcy50aW1lU2VsZWN0b3IuY3VycmVudCk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlUHJlc2VudCA9ICFpc0VxdWFsKHRoaXMudmFsdWUsIGNhbmRpZGF0ZSk7XG4gICAgICAgIGNvbnN0IHJ1bkluWm9uZSA9IHZhbHVlQ2hhbmdlUHJlc2VudCB8fCBoYXNPYnNlcnZlcnModGhpcy5jbG9zZSk7XG4gICAgICAgIHRoaXMucnVuKHJ1bkluWm9uZSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVWYWx1ZUNoYW5nZShjYW5kaWRhdGUpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlQ2FuY2VsKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVuSW5ab25lID0gaGFzT2JzZXJ2ZXJzKHRoaXMuY2xvc2UpO1xuICAgICAgICB0aGlzLnJ1bihydW5JblpvbmUsICgpID0+IHRoaXMudG9nZ2xlUG9wdXAoZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUlucHV0VmFsdWVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUNhbGVuZGFyVmFsdWVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZVNlbGVjdG9yTWluTWF4KHRoaXMuY2FsZW5kYXIudmFsdWUpO1xuICAgICAgICB0aGlzLmNoYW5nZUFjdGl2ZVRhYigndGltZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBrZXlDb2RlLCBhbHRLZXkgfSA9IGV2ZW50O1xuICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgYWx0S2V5ICYmIEtleXMuQXJyb3dVcDpcbiAgICAgICAgICAgIGNhc2UgS2V5cy5Fc2NhcGU6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIXRoaXMuaXNPcGVuICYmIGFsdEtleSAmJiBLZXlzLkFycm93RG93bjpcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVQb3B1cCh0cnVlKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGFsdEtleSAmJiBLZXlzLkFycm93UmlnaHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VBY3RpdmVUYWIoJ3RpbWUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYWx0S2V5ICYmIEtleXMuQXJyb3dMZWZ0OlxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlVGFiKCdkYXRlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMuaXNPcGVuICYmIHRoaXMudGltZVNlbGVjdG9yLmlzQWN0aXZlICYmIGlzUHJlc2VudCh0aGlzLmNhbGVuZGFyVmFsdWUpICYmIEtleXMuRW50ZXI6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NlcHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlVGFiT3V0KGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHsga2V5Q29kZSwgc2hpZnRLZXksIHRhcmdldCB9ID0gZXZlbnQ7XG4gICAgICAgIC8vIGlmIG5vIGZvY3VzYWJsZSBuZXh0IHNpYmxpbmcgZWxlbWVudHMgZXhpc3QgaW4gdGhlIGNvbnRyb2xzIHNlY3Rpb25zLCB0aGUgdXNlciBpcyB0YWJiaW5nIG91dCBvZiB0aGUgcG9wdXBcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlU2libGluZ0F2YWlsYWJsZSA9IGlzUHJlc2VudCh0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nKSAmJiAhdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5kaXNhYmxlZDtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtleXMuVGFiICYmICFzaGlmdEtleSAmJiAhZm9jdXNhYmxlU2libGluZ0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlQmFja1RhYk91dChldmVudCkge1xuICAgICAgICBjb25zdCB7IGtleUNvZGUsIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtleXMuVGFiICYmIHNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogUHJldmVudHMgdGhlIGRpdmVyc2lvbiBvZiB0aGUgZm9jdXMgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IGluIHRoZSBjb21wb25lbnQuXG4gICAgICovXG4gICAgcHJldmVudE1vdXNlRG93bihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB2ZXJpZnlWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudCh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAndmFsdWUnIHNob3VsZCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgRGF0ZSBpbnN0YW5jZS4gQ2hlY2sgJHtWQUxVRV9ET0NfTElOSyQ0fSBmb3IgcG9zc2libGUgcmVzb2x1dGlvbi5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2ZXJpZnlNaW5NYXhSYW5nZSgpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNWYWxpZFJhbmdlKHRoaXMubWluLCB0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1heCB2YWx1ZSBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gdGhlIG1pbi4gU2VlICR7TUlOX01BWF9ET0NfTElOS30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIHRpbWUgc2xvdHMgYW5kIHRoZSBsaXRlcmFscyB0aGF0IGFyZSBub3QgcHJlY2VkZWQgYnkgZGF0ZSBwYXJ0c1xuICAgICAqIGFuZCBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdGluZyBwYXJ0cyBpbnRvIGEgc3RyaW5nLlxuICAgICAqIElmIHRoZSBwcm92aWRlZCBmb3JtYXQgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhbnkgdGltZSBwYXJ0cyxcbiAgICAgKiByZXR1cm5zIHRoZSBkZXNpZ25hdGVkIGZvcm1hdCBvZiB0aGUgZGVmYXVsdCBwb3B1cCBjb21wb25lbnQgb2YgdGhlIFRpbWVQaWNrZXIuXG4gICAgICovXG4gICAgZ2V0VGltZVNlbGVjdG9yRm9ybWF0KGZvcm1hdCkge1xuICAgICAgICBjb25zdCB0aW1lU2VsZWN0b3JGb3JtYXQgPSB0aGlzLmludGxcbiAgICAgICAgICAgIC5zcGxpdERhdGVGb3JtYXQoZm9ybWF0KVxuICAgICAgICAgICAgLmZpbHRlcih0aGlzLnRpbWVGb3JtYXRQYXJ0RmlsdGVyKVxuICAgICAgICAgICAgLnJlZHVjZSgoZm9ybWF0LCBwYXJ0KSA9PiBmb3JtYXQgKz0gcGFydC5wYXR0ZXJuLCAnJyk7XG4gICAgICAgIHJldHVybiB0aW1lU2VsZWN0b3JGb3JtYXQgfHwgREVGQVVMVF9USU1FU0VMRUNUT1JfRk9STUFUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlsdGVyIGV4cHJlc3Npb24gdGhhdCBmaWx0ZXJzIG91dCBhbGwgZm9ybWF0IHBhcnRzXG4gICAgICogZXhjZXB0IGZvciBgaG91cmAsIGBtaW51dGVgLCBgc2Vjb25kYCwgYGRheXBlcmlvZGAsIGFuZCBzcGVjaWZpYyBsaXRlcmFscy5cbiAgICAgKiBMaXRlcmFscyB3aWxsIGJlIGxlZnQgb25seSBpZiB0aGV5IGFyZSBub3QgcHJlY2VkZWQgYnkgZGF0ZSBwYXJ0cy5cbiAgICAgKi9cbiAgICB0aW1lRm9ybWF0UGFydEZpbHRlcihwYXJ0LCBpbmRleCwgcGFydHMpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNQYXJ0ID0gaW5kZXggPj0gMSAmJiBwYXJ0c1tpbmRleCAtIDFdO1xuICAgICAgICBpZiAocHJldmlvdXNQYXJ0ICYmIHBhcnQudHlwZSA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZUZvcm1hdFJlZ0V4cC50ZXN0KHByZXZpb3VzUGFydC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZUZvcm1hdFJlZ0V4cC50ZXN0KHBhcnQudHlwZSk7XG4gICAgfVxuICAgIHRvZ2dsZVBvcHVwKG9wZW4pIHtcbiAgICAgICAgaWYgKG9wZW4gPT09IHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUHJldmVudGFibGVFdmVudCgpO1xuICAgICAgICBvcGVuID8gdGhpcy5vcGVuLmVtaXQoZXZlbnQpIDogdGhpcy5jbG9zZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2dnbGUob3Blbik7XG4gICAgICAgIHRoaXMuc3dpdGNoRm9jdXMoKTtcbiAgICB9XG4gICAgc3dpdGNoRm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWJDb21wb25lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy50b3VjaEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5pbnB1dC5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVCbHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3BlblBvcHVwKCkge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VGltZVNlbGVjdG9yTWluTWF4KHRoaXMudmFsdWUpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICB0aGlzLnBvcHVwUmVmID0gdGhpcy5wb3B1cFNlcnZpY2Uub3Blbih7XG4gICAgICAgICAgICBhbmNob3I6IHRoaXMud3JhcHBlcixcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMucG9wdXBUZW1wbGF0ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uTW9kZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGFuaW1hdGU6IHRoaXMucG9wdXBTZXR0aW5ncy5hbmltYXRlLFxuICAgICAgICAgICAgYXBwZW5kVG86IHRoaXMuYXBwZW5kVG8sXG4gICAgICAgICAgICBwb3B1cENsYXNzOiBgay1kYXRldGltZS1jb250YWluZXIgJHt0aGlzLnBvcHVwU2V0dGluZ3MucG9wdXBDbGFzcyB8fCAnJ31gLFxuICAgICAgICAgICAgYW5jaG9yQWxpZ246IHsgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfSxcbiAgICAgICAgICAgIHBvcHVwQWxpZ246IHsgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cEFuY2hvclZpZXdwb3J0TGVhdmUuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGFuZGxlQ2FuY2VsKCkpO1xuICAgIH1cbiAgICBjbG9zZVBvcHVwKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLnBvcHVwUmVmID0gbnVsbDtcbiAgICB9XG4gICAgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRXF1YWwodGhpcy52YWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25Db250cm9sQ2hhbmdlKGNsb25lRGF0ZSh2YWx1ZSkpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xvbmVEYXRlKHZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmb2N1cyB0YXJnZXQgaXMgcGFydCBvZiB0aGlzIGNvbXBvbmVudCxcbiAgICAgKiB0aGF0IGlzLCB3aGV0aGVyIHRoZSBmb2N1cyB0YXJnZXQgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgd3JhcHBlciBvciBpbiB0aGUgcG9wdXAuXG4gICAgICovXG4gICAgZm9jdXNUYXJnZXRJbkNvbXBvbmVudChldmVudCkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudChldmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBmb2N1c0luUG9wdXAgPSBpc1ByZXNlbnQodGhpcy5wb3B1cFJlZikgJiYgdGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGZvY3VzSW5XcmFwcGVyID0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIHJldHVybiBmb2N1c0luUG9wdXAgfHwgZm9jdXNJbldyYXBwZXI7XG4gICAgfVxuICAgIHNldFRpbWVTZWxlY3Rvck1pbk1heChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgY29uc3QgbWluRGF0ZVNlbGVjdGVkID0gaXNQcmVzZW50KHNlbGVjdGVkRGF0ZSkgJiYgaXNFcXVhbChnZXREYXRlKHNlbGVjdGVkRGF0ZSksIGdldERhdGUodGhpcy5taW4pKTtcbiAgICAgICAgdGhpcy50aW1lU2VsZWN0b3JNaW4gPSBjbG9uZURhdGUobWluRGF0ZVNlbGVjdGVkID8gdGhpcy5taW4gOiBNSU5fVElNRSk7XG4gICAgICAgIGNvbnN0IG1heERhdGVTZWxlY3RlZCA9IGlzUHJlc2VudChzZWxlY3RlZERhdGUpICYmIGlzRXF1YWwoZ2V0RGF0ZShzZWxlY3RlZERhdGUpLCBnZXREYXRlKHRoaXMubWF4KSk7XG4gICAgICAgIHRoaXMudGltZVNlbGVjdG9yTWF4ID0gY2xvbmVEYXRlKG1heERhdGVTZWxlY3RlZCA/IHRoaXMubWF4IDogTUFYX1RJTUUpO1xuICAgIH1cbiAgICBzZXRDYWxlbmRhclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5DYWxlbmRhclJhbmdlID0gaXNQcmVzZW50KHZhbHVlKSAmJiBpc0luUmFuZ2UodmFsdWUsIHRoaXMuY2FsZW5kYXJNaW4sIHRoaXMuY2FsZW5kYXJNYXgpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyVmFsdWUgPSBpc0luQ2FsZW5kYXJSYW5nZSA/IGdldERhdGUodmFsdWUpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBvcHVwIGlzIGF2YWlsYWJsZSwgcnVucyBhIHBvcHVwIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICovXG4gICAgZGV0ZWN0UG9wdXBDaGFuZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cFJlZi5wb3B1cC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgcHJlZGljYXRlIGBydW5JblpvbmVgIHZhbHVlIHRoYXQgaXMgcGFzc2VkLFxuICAgICAqIHJ1bnMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGVpdGhlciBpbiB0aGUgQW5ndWxhciBvciBpbiB0aGUgY3VycmVudCB6b25lLlxuICAgICAqL1xuICAgIHJ1bihydW5JblpvbmUsIGZuKSB7XG4gICAgICAgIGlmIChydW5JblpvbmUpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBmbigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlRGF0ZUNvbXBsZXRlbmVzc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCkpO1xuICAgIH1cbn1cbkRhdGVUaW1lUGlja2VyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kYXRldGltZXBpY2tlcicsXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kby1kYXRldGltZXBpY2tlcicsXG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIFBpY2tlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERpc2FibGVkRGF0ZXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEwxME5fUFJFRklYLCB1c2VWYWx1ZTogJ2tlbmRvLmRhdGV0aW1lcGlja2VyJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlVGltZVBpY2tlckNvbXBvbmVudCksIG11bHRpOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEtlbmRvSW5wdXQsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVUaW1lUGlja2VyQ29tcG9uZW50KSB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBrZW5kb0RhdGVUaW1lUGlja2VyTG9jYWxpemVkTWVzc2FnZXNcblxuICAgICAgICAgICAgaTE4bi1kYXRlVGFiPVwia2VuZG8uZGF0ZXRpbWVwaWNrZXIuZGF0ZVRhYnxUaGUgRGF0ZSB0YWIgdGV4dCBpbiB0aGUgZGF0ZXRpbWVwaWNrZXIgcG9wdXAgaGVhZGVyXCJcbiAgICAgICAgICAgIGRhdGVUYWI9XCJEYXRlXCJcblxuICAgICAgICAgICAgaTE4bi1kYXRlVGFiTGFiZWw9XCJrZW5kby5kYXRldGltZXBpY2tlci5kYXRlVGFiTGFiZWx8VGhlIGxhYmVsIGZvciB0aGUgRGF0ZSB0YWIgaW4gdGhlIGRhdGV0aW1lcGlja2VyIHBvcHVwIGhlYWRlclwiXG4gICAgICAgICAgICBkYXRlVGFiTGFiZWw9XCJEYXRlIHRhYlwiXG5cbiAgICAgICAgICAgIGkxOG4tdGltZVRhYj1cImtlbmRvLmRhdGV0aW1lcGlja2VyLnRpbWVUYWJ8VGhlIFRpbWUgdGFiIHRleHQgaW4gdGhlIGRhdGV0aW1lcGlja2VyIHBvcHVwIGhlYWRlclwiXG4gICAgICAgICAgICB0aW1lVGFiPVwiVGltZVwiXG5cbiAgICAgICAgICAgIGkxOG4tdGltZVRhYkxhYmVsPVwia2VuZG8uZGF0ZXRpbWVwaWNrZXIudGltZVRhYkxhYmVsfFRoZSBsYWJlbCBmb3IgdGhlIFRpbWUgdGFiIGluIHRoZSBkYXRldGltZXBpY2tlciBwb3B1cCBoZWFkZXJcIlxuICAgICAgICAgICAgdGltZVRhYkxhYmVsPVwiVGltZSB0YWJcIlxuXG4gICAgICAgICAgICBpMThuLXRvZ2dsZT1cImtlbmRvLmRhdGV0aW1lcGlja2VyLnRvZ2dsZXxUaGUgbGFiZWwgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIGluIHRoZSBkYXRldGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgdG9nZ2xlPVwiVG9nZ2xlIHBvcHVwXCJcblxuICAgICAgICAgICAgaTE4bi1hY2NlcHQ9XCJrZW5kby5kYXRldGltZXBpY2tlci5hY2NlcHR8VGhlIEFjY2VwdCBidXR0b24gdGV4dCBpbiB0aGUgZGF0ZXRpbWVwaWNrZXIgY29tcG9uZW50XCJcbiAgICAgICAgICAgIGFjY2VwdD1cIlNldFwiXG5cbiAgICAgICAgICAgIGkxOG4tYWNjZXB0TGFiZWw9XCJrZW5kby5kYXRldGltZXBpY2tlci5hY2NlcHRMYWJlbHxUaGUgbGFiZWwgZm9yIHRoZSBBY2NlcHQgYnV0dG9uIGluIHRoZSBkYXRldGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgYWNjZXB0TGFiZWw9XCJTZXRcIlxuXG4gICAgICAgICAgICBpMThuLWNhbmNlbD1cImtlbmRvLmRhdGV0aW1lcGlja2VyLmNhbmNlbHxUaGUgQ2FuY2VsIGJ1dHRvbiB0ZXh0IGluIHRoZSBkYXRldGltZXBpY2tlciBjb21wb25lbnRcIlxuICAgICAgICAgICAgY2FuY2VsPVwiQ2FuY2VsXCJcblxuICAgICAgICAgICAgaTE4bi1jYW5jZWxMYWJlbD1cImtlbmRvLmRhdGV0aW1lcGlja2VyLmNhbmNlbExhYmVsfFRoZSBsYWJlbCBmb3IgdGhlIENhbmNlbCBidXR0b24gaW4gdGhlIGRhdGV0aW1lcGlja2VyIGNvbXBvbmVudFwiXG4gICAgICAgICAgICBjYW5jZWxMYWJlbD1cIkNhbmNlbFwiXG5cbiAgICAgICAgICAgIGkxOG4tbm93PVwia2VuZG8uZGF0ZXRpbWVwaWNrZXIubm93fFRoZSBOb3cgYnV0dG9uIHRleHQgaW4gdGhlIHRpbWVwaWNrZXIgY29tcG9uZW50XCJcbiAgICAgICAgICAgIG5vdz1cIk5PV1wiXG5cbiAgICAgICAgICAgIGkxOG4tbm93TGFiZWw9XCJrZW5kby5kYXRldGltZXBpY2tlci5ub3dMYWJlbHxUaGUgbGFiZWwgZm9yIHRoZSBOb3cgYnV0dG9uIGluIHRoZSB0aW1lcGlja2VyIGNvbXBvbmVudFwiXG4gICAgICAgICAgICBub3dMYWJlbD1cIlNlbGVjdCBub3dcIlxuXG4gICAgICAgICAgICBpMThuLXRvZGF5PVwia2VuZG8uZGF0ZXRpbWVwaWNrZXIudG9kYXl8VGhlIGxhYmVsIGZvciB0aGUgdG9kYXkgYnV0dG9uIGluIHRoZSBjYWxlbmRhciBoZWFkZXJcIlxuICAgICAgICAgICAgdG9kYXk9XCJUT0RBWVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICN3cmFwcGVyXG4gICAgICAgICAgICBjbGFzcz1cImstcGlja2VyLXdyYXBcIlxuICAgICAgICAgICAgW2NsYXNzLmstc3RhdGUtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8a2VuZG8tZGF0ZWlucHV0XG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0XT1cImZvcm1hdFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICBbaW5jb21wbGV0ZURhdGVWYWxpZGF0aW9uXT1cImluY29tcGxldGVEYXRlVmFsaWRhdGlvblwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdFBsYWNlaG9sZGVyXT1cImZvcm1hdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IHJlYWRPbmx5SW5wdXRcIlxuICAgICAgICAgICAgICAgIFtyb2xlXT1cImlucHV0Um9sZVwiXG4gICAgICAgICAgICAgICAgW2FyaWFSZWFkT25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3N0ZXBzXT1cInN0ZXBzXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzYWJsZUlkXT1cImZvY3VzYWJsZUlkXCJcbiAgICAgICAgICAgICAgICBbaGFzUG9wdXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2lzUG9wdXBPcGVuXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZUlucHV0VmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBrZXlkb3duOiBoYW5kbGVLZXlEb3duXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9rZW5kby1kYXRlaW5wdXQ+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstc2VsZWN0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJsb2NhbGl6YXRpb24uZ2V0KCd0b2dnbGUnKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb2NhbGl6YXRpb24uZ2V0KCd0b2dnbGUnKVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd246IHByZXZlbnRNb3VzZURvd24sXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVJY29uQ2xpY2tcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWxpbmsgay1saW5rLWRhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLWktY2FsZW5kYXJdPVwiYWN0aXZlVGFiID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmstaS1jbG9ja109XCJhY3RpdmVUYWIgPT09ICd0aW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3BvcHVwVGVtcGxhdGU+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWRhdGV0aW1lLXdyYXAgay17e2FjdGl2ZVRhYn19LXRhYlwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd246IHByZXZlbnRNb3VzZURvd24sXG4gICAgICAgICAgICAgICAgICAgIGtleWRvd246IGhhbmRsZUtleURvd25cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImstZGF0ZXRpbWUtYnV0dG9uZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBba2VuZG9FdmVudHNPdXRzaWRlQW5ndWxhcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2luOiBoYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3Vzb3V0OiBoYW5kbGVCbHVyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1idXR0b24tZ3JvdXAgay1idXR0b24tZ3JvdXAtc3RyZXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWJ1dHRvbiBrLWRhdGUtdGFiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvY2FsaXphdGlvbi5nZXQoJ2RhdGVUYWJMYWJlbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsaXphdGlvbi5nZXQoJ2RhdGVUYWJMYWJlbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2VuZG9FdmVudHNPdXRzaWRlQW5ndWxhcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBjaGFuZ2VBY3RpdmVUYWIuYmluZCh0aGlzLCAnZGF0ZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlkb3duOiBoYW5kbGVCYWNrVGFiT3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG9jYWxpemF0aW9uLmdldCgnZGF0ZVRhYicpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1idXR0b24gay10aW1lLXRhYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmstc3RhdGUtYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJ3RpbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJsb2NhbGl6YXRpb24uZ2V0KCd0aW1lVGFiTGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb2NhbGl6YXRpb24uZ2V0KCd0aW1lVGFiTGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogY2hhbmdlQWN0aXZlVGFiLmJpbmQodGhpcywgJ3RpbWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG9jYWxpemF0aW9uLmdldCgndGltZVRhYicpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICNkYXRlVGltZVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1kYXRldGltZS1zZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cInRhYlN3aXRjaFRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBba2VuZG9FdmVudHNPdXRzaWRlQW5ndWxhcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uZW5kOiBoYW5kbGVUYWJDaGFuZ2VUcmFuc2l0aW9uRW5kLmJpbmQodGhpcywgZGF0ZVRpbWVTZWxlY3RvcilcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1kYXRldGltZS1jYWxlbmRhci13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8a2VuZG8tY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJjYWxlbmRhclZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImNhbGVuZGFyTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNhbGVuZGFyTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9jdXNlZERhdGVdPVwiZm9jdXNlZERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWVrTnVtYmVyXT1cIndlZWtOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYXZpZ2F0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFRlbXBsYXRlXT1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vbnRoQ2VsbFRlbXBsYXRlXT1cIm1vbnRoQ2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeWVhckNlbGxUZW1wbGF0ZV09XCJ5ZWFyQ2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVjYWRlQ2VsbFRlbXBsYXRlXT1cImRlY2FkZUNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbnR1cnlDZWxsVGVtcGxhdGVdPVwiY2VudHVyeUNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dlZWtOdW1iZXJUZW1wbGF0ZV09XCJ3ZWVrTnVtYmVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJUaXRsZVRlbXBsYXRlXT1cImhlYWRlclRpdGxlVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQ2FsZW5kYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImRpc2FibGVkRGF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVDYWxlbmRhclZhbHVlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxrZW5kby1jYWxlbmRhci1tZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9kYXldPVwibG9jYWxpemF0aW9uLmdldCgndG9kYXknKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwva2VuZG8tY2FsZW5kYXItbWVzc2FnZXM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2tlbmRvLWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImstZGF0ZXRpbWUtdGltZS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdGltZXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cInRpbWVTZWxlY3RvckZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJ0aW1lU2VsZWN0b3JNaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwidGltZVNlbGVjdG9yTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V0QnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuY2VsQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcHNdPVwic3RlcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlVGltZVNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdGltZXNlbGVjdG9yLW1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub3ddPVwibG9jYWxpemF0aW9uLmdldCgnbm93JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbm93TGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnbm93TGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwva2VuZG8tdGltZXNlbGVjdG9yLW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9rZW5kby10aW1lc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWRhdGV0aW1lLWZvb3RlciBrLWFjdGlvbi1idXR0b25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogaGFuZGxlVGFiT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNpbjogaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c291dDogaGFuZGxlQmx1clxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstYnV0dG9uIGstdGltZS1jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibG9jYWxpemF0aW9uLmdldCgnY2FuY2VsTGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsaXphdGlvbi5nZXQoJ2NhbmNlbExhYmVsJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xvY2FsaXphdGlvbi5nZXQoJ2NhbmNlbCcpfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLXRpbWUtYWNjZXB0IGstYnV0dG9uIGstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJsb2NhbGl6YXRpb24uZ2V0KCdhY2NlcHRMYWJlbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnYWNjZXB0TGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbGVuZGFyVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVBY2NlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xvY2FsaXphdGlvbi5nZXQoJ2FjY2VwdCcpfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVUaW1lUGlja2VyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IFBpY2tlclNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbVE9VQ0hfRU5BQkxFRCxdIH1dIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEaXNhYmxlZERhdGVzU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH1cbl07XG5EYXRlVGltZVBpY2tlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay13aWRnZXQnLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRhdGV0aW1lcGlja2VyJyxdIH1dLFxuICAgIHdyYXBwZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd3cmFwcGVyJyxdIH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYmluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZERhdGVzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3B1cFNldHRpbmdzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb2N1c2FibGVJZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZWFkb25seTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVhZE9ubHlJbnB1dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY2FuY2VsQnV0dG9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXRQbGFjZWhvbGRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb2N1c2VkRGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgd2Vla051bWJlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJhbmdlVmFsaWRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGlzYWJsZWREYXRlc1ZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGluY29tcGxldGVEYXRlVmFsaWRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBvcGVuOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2xvc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBvbkZvY3VzOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnZm9jdXMnLF0gfV0sXG4gICAgb25CbHVyOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnYmx1cicsXSB9XSxcbiAgICBkZWZhdWx0VGFiOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIHllYXJDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW1llYXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBkZWNhZGVDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGNlbnR1cnlDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICB3ZWVrTnVtYmVyVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW1dlZWtOdW1iZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBoZWFkZXJUaXRsZVRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtIZWFkZXJUaXRsZVRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgY29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0sXSB9XSxcbiAgICBwb3B1cFRlbXBsYXRlOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsncG9wdXBUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSxdIH1dXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSAgY29tcG9uZW50LXNlbGVjdG9yLXR5cGUgKi9cbmNvbnN0IERFRkFVTFRfVklFV1NfTEVOR1RIID0gMjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBIb3Jpem9udGFsVmlld0xpc3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGJ1cywgY2RyKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3RW51bS5tb250aDtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMubWluID0gbmV3IERhdGUoTUlOX0RBVEUpO1xuICAgICAgICB0aGlzLm1heCA9IG5ldyBEYXRlKE1BWF9EQVRFKTtcbiAgICAgICAgdGhpcy52aWV3cyA9IERFRkFVTFRfVklFV1NfTEVOR1RIO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNlbGxFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZGF0ZXMgPSBbXTtcbiAgICB9XG4gICAgZ2V0IHdlZWtOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dXZWVrTnVtYmVycyAmJiB0aGlzLmlzTW9udGhWaWV3KCk7XG4gICAgfVxuICAgIHNldCB3ZWVrTnVtYmVyKHNob3dXZWVrTnVtYmVycykge1xuICAgICAgICB0aGlzLnNob3dXZWVrTnVtYmVycyA9IHNob3dXZWVrTnVtYmVycztcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudE1vbnRoQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXcgPT09IENhbGVuZGFyVmlld0VudW0ubW9udGg7XG4gICAgfVxuICAgIGdldCBnZXRDb21wb25lbnRZZWFyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXcgPT09IENhbGVuZGFyVmlld0VudW0ueWVhcjtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudERlY2FkZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVWaWV3ID09PSBDYWxlbmRhclZpZXdFbnVtLmRlY2FkZTtcbiAgICB9XG4gICAgZ2V0IGdldENvbXBvbmVudENlbnR1cnlDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlldyA9PT0gQ2FsZW5kYXJWaWV3RW51bS5jZW50dXJ5O1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuaW5pdFNlcnZpY2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdzID0gdGhpcy52aWV3cyB8fCBERUZBVUxUX1ZJRVdTX0xFTkdUSDtcbiAgICAgICAgY29uc3QgZm9jdXNlZERhdGUgPSB0aGlzLmZvY3VzZWREYXRlO1xuICAgICAgICBjb25zdCB2aWV3RGF0ZSA9IHRoaXMuY2xhbXBEYXRlKHRoaXMuc2VydmljZS52aWV3RGF0ZShmb2N1c2VkRGF0ZSwgdGhpcy5tYXgsIHRoaXMudmlld3MpKTtcbiAgICAgICAgdGhpcy5za2lwID0gdGhpcy5zZXJ2aWNlLnNraXAodmlld0RhdGUsIHRoaXMubWluKTtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRoaXMuc2VydmljZS50b3RhbCh0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgICBjb25zdCBhY3RpdmVWaWV3Q2hhbmdlZCA9IGhhc0NoYW5nZShjaGFuZ2VzLCAnYWN0aXZlVmlldycpO1xuICAgICAgICBjb25zdCB2aWV3c0hhc0NoYW5nZWQgPSB0aGlzLnZpZXdzID4gMCAmJiBoYXNDaGFuZ2UoY2hhbmdlcywgJ3ZpZXdzJyk7XG4gICAgICAgIGlmIChhY3RpdmVWaWV3Q2hhbmdlZCB8fCAhdGhpcy5pc0luRGF0ZXMoZm9jdXNlZERhdGUpIHx8IHZpZXdzSGFzQ2hhbmdlZCB8fCAhdGhpcy5hY3RpdmVEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVzID0gdGhpcy5zZXJ2aWNlLmRhdGVzTGlzdCh2aWV3RGF0ZSwgdGhpcy5nZXRUYWtlKHRoaXMuc2tpcCkpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gY2xvbmVEYXRlKHRoaXMuZGF0ZXNbMF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRTZXJ2aWNlKCkge1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSB0aGlzLmJ1cy5zZXJ2aWNlKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgfVxuICAgIGhhbmRsZURhdGVDaGFuZ2UoY2FuZGlkYXRlKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBpc01vbnRoVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlldyA9PT0gQ2FsZW5kYXJWaWV3RW51bS5tb250aDtcbiAgICB9XG4gICAgbmF2aWdhdGUoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRoaXMubW92ZShhY3Rpb24pO1xuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5zZXJ2aWNlLmRhdGVzTGlzdChjYW5kaWRhdGUsIHRoaXMuZ2V0VGFrZSh0aGlzLnNraXApKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMaXN0SW5SYW5nZShsaXN0KSkge1xuICAgICAgICAgICAgdGhpcy5kYXRlcyA9IGxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gY2xvbmVEYXRlKHRoaXMuZGF0ZXNbMF0pO1xuICAgICAgICB0aGlzLmZvY3VzZWREYXRlID0gY2xvbmVEYXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm4gY2xvbmVEYXRlKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIGNhbk5hdmlnYXRlKGFjdGlvbikge1xuICAgICAgICBpZiAoIXRoaXMuc2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdEluUmFuZ2UodGhpcy5zZXJ2aWNlLmRhdGVzTGlzdCh0aGlzLm1vdmUoYWN0aW9uKSwgdGhpcy5nZXRUYWtlKHRoaXMuc2tpcCkpKTtcbiAgICB9XG4gICAgY2xhbXBEYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkYXRlSW5SYW5nZSh2YWx1ZSwgdGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICB9XG4gICAgbW92ZShhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5tb3ZlKHRoaXMuZGF0ZXNbMF0gfHwgdGhpcy5mb2N1c2VkRGF0ZSwgYWN0aW9uKTtcbiAgICB9XG4gICAgaXNMaXN0SW5SYW5nZShsaXN0KSB7XG4gICAgICAgIGNvbnN0IGxvd2VyQm91bmQgPSB0aGlzLnNlcnZpY2UuYmVnaW5uaW5nT2ZQZXJpb2QodGhpcy5taW4pO1xuICAgICAgICBjb25zdCB1cHBlckJvdW5kID0gdGhpcy5zZXJ2aWNlLmJlZ2lubmluZ09mUGVyaW9kKHRoaXMuc2VydmljZS5hZGRUb0RhdGUodGhpcy5tYXgsIDEpKTtcbiAgICAgICAgcmV0dXJuIGxvd2VyQm91bmQgPD0gbGlzdFswXSAmJiBsaXN0W2xpc3QubGVuZ3RoIC0gMV0gPCB1cHBlckJvdW5kO1xuICAgIH1cbiAgICBpc0luRGF0ZXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5pc0luQXJyYXkodmFsdWUsIHRoaXMuZGF0ZXMpO1xuICAgIH1cbiAgICBnZXRUYWtlKHNraXApIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMudG90YWwgLSBza2lwLCB0aGlzLnZpZXdzKTtcbiAgICB9XG59XG5Ib3Jpem9udGFsVmlld0xpc3RDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNhbGVuZGFyLWhvcml6b250YWwnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgPGtlbmRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgW2N1cnJlbnREYXRlXT1cImFjdGl2ZURhdGVcIlxuICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgW3JhbmdlTGVuZ3RoXT1cInZpZXdzXCJcbiAgICAgICAgW3RlbXBsYXRlUmVmXT1cImhlYWRlclRpdGxlVGVtcGxhdGVSZWZcIlxuICAgICAgICAodG9kYXkpPVwiaGFuZGxlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9rZW5kby1jYWxlbmRhci1oZWFkZXI+XG4gICAgPHRhYmxlIGNsYXNzPVwiay1jb250ZW50XCI+XG4gICAgICAgIDx0Ym9keSAqa0Zvcj1cImxldCBkYXRlIG9mIGRhdGVzXCJcbiAgICAgICAgICAgICAgIGtlbmRvQ2FsZW5kYXJWaWV3XG4gICAgICAgICAgICAgICByb2xlPVwicm93Z3JvdXBcIlxuICAgICAgICAgICAgICAgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgICAgICAgIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiXG4gICAgICAgICAgICAgICBbbWluXT1cIm1pblwiIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgIFtjZWxsVUlEXT1cImNlbGxVSURcIlxuICAgICAgICAgICAgICAgW2ZvY3VzZWREYXRlXT1cImZvY3VzZWREYXRlXCJcbiAgICAgICAgICAgICAgIFtzZWxlY3RlZERhdGVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgW3NlbGVjdGlvblJhbmdlXT1cInNlbGVjdGlvblJhbmdlXCJcbiAgICAgICAgICAgICAgIFthY3RpdmVSYW5nZUVuZF09XCJhY3RpdmVSYW5nZUVuZFwiXG4gICAgICAgICAgICAgICBbd2Vla051bWJlcl09XCJ3ZWVrTnVtYmVyXCJcbiAgICAgICAgICAgICAgIFt0ZW1wbGF0ZVJlZl09XCJjZWxsVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgW3dlZWtOdW1iZXJUZW1wbGF0ZVJlZl09XCJ3ZWVrTnVtYmVyVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgW3ZpZXdEYXRlXT1cImRhdGVcIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGNlbGxFbnRlcik9XCJjZWxsRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChjZWxsTGVhdmUpPVwiY2VsbExlYXZlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgID48L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSG9yaXpvbnRhbFZpZXdMaXN0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQnVzVmlld1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5Ib3Jpem9udGFsVmlld0xpc3RDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyVGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhlYWRlclRpdGxlVGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGl2ZVJhbmdlRW5kOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjZWxsVUlEOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb2N1c2VkRGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXNBY3RpdmU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3Rpb25SYW5nZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZpZXdzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNlbGxFbnRlcjogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNlbGxMZWF2ZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGdldENvbXBvbmVudENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci12aWV3XCIsXSB9XSxcbiAgICBnZXRDb21wb25lbnRNb250aENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci1tb250aHZpZXdcIixdIH1dLFxuICAgIGdldENvbXBvbmVudFllYXJDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFtcImNsYXNzLmstY2FsZW5kYXIteWVhcnZpZXdcIixdIH1dLFxuICAgIGdldENvbXBvbmVudERlY2FkZUNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci1kZWNhZGV2aWV3XCIsXSB9XSxcbiAgICBnZXRDb21wb25lbnRDZW50dXJ5Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWNhbGVuZGFyLWNlbnR1cnl2aWV3XCIsXSB9XVxufTtcblxuY29uc3Qgbm9vcCQyID0gKCkgPT4gbnVsbDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBkaXNhYmxlZERhdGVzUmFuZ2VWYWxpZGF0b3IgPSAoaXNEYXRlRGlzYWJsZWQpID0+IHtcbiAgICBpZiAoIWlzUHJlc2VudChpc0RhdGVEaXNhYmxlZCkpIHtcbiAgICAgICAgcmV0dXJuIG5vb3AkMjtcbiAgICB9XG4gICAgcmV0dXJuIChzZWxlY3RlZFJhbmdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VDb21wbGV0ZSA9IGlzUHJlc2VudChzZWxlY3RlZFJhbmdlKSAmJiBpc1ByZXNlbnQoc2VsZWN0ZWRSYW5nZS5zdGFydCkgJiYgaXNQcmVzZW50KHNlbGVjdGVkUmFuZ2UuZW5kKTtcbiAgICAgICAgaWYgKCFpc1JhbmdlQ29tcGxldGUgfHwgc2VsZWN0ZWRSYW5nZS5zdGFydCA+IHNlbGVjdGVkUmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gZGlzYWJsZWREYXRlc0luUmFuZ2Uoc2VsZWN0ZWRSYW5nZS5zdGFydCwgc2VsZWN0ZWRSYW5nZS5lbmQsIGlzRGF0ZURpc2FibGVkKTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICBkaXNhYmxlZERhdGVzSW5SYW5nZTogZGlzYWJsZWREYXRlc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGlzYWJsZWREYXRlcy5sZW5ndGggPyBlcnJvciA6IG51bGw7XG4gICAgfTtcbn07XG5cbi8qIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmICovXG5jb25zdCBCT1RUT01fVklFV19ET0NfTElOSyQxID0gJ2h0dHA6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvYXBpL0NhbGVuZGFyQ29tcG9uZW50LyN0b2MtYm90dG9tdmlldyc7XG5jb25zdCBUT1BfVklFV19ET0NfTElOSyQxID0gJ2h0dHA6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvYXBpL0NhbGVuZGFyQ29tcG9uZW50LyN0b2MtdG9wdmlldyc7XG5jb25zdCBNSU5fRE9DX0xJTkskMyA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9DYWxlbmRhckNvbXBvbmVudC8jdG9jLW1pbic7XG5jb25zdCBNQVhfRE9DX0xJTkskMyA9ICdodHRwOi8vd3d3LnRlbGVyaWsuY29tL2tlbmRvLWFuZ3VsYXItdWkvY29tcG9uZW50cy9kYXRlaW5wdXRzL2FwaS9DYWxlbmRhckNvbXBvbmVudC8jdG9jLW1heCc7XG5jb25zdCBWQUxVRV9ET0NfTElOSyQ1ID0gJ2h0dHA6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9jb21wb25lbnRzL2RhdGVpbnB1dHMvY2FsZW5kYXIvI3RvYy11c2luZy13aXRoLWpzb24nO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IFJBTkdFX0NBTEVOREFSX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIG11bHRpOiB0cnVlLFxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50KSAvL3RzbGludDpkaXNhYmxlLWxpbmU6bm8tdXNlLWJlZm9yZS1kZWNsYXJlXG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IFJBTkdFX0NBTEVOREFSX1JBTkdFX1ZBTElEQVRPUlMgPSB7XG4gICAgbXVsdGk6IHRydWUsXG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVZpZXdDYWxlbmRhckNvbXBvbmVudCkgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxufTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgS2VuZG8gVUkgTXVsdGlWaWV3Q2FsZW5kYXIgY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogX0BDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogdGVtcGxhdGU6IGBcbiAqICA8a2VuZG8tbXVsdGl2aWV3Y2FsZW5kYXI+PC9rZW5kby1tdWx0aXZpZXdjYWxlbmRhcj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHsgfVxuICogYGBgXG4gKi9cbmNsYXNzIE11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihidXMsIGVsZW1lbnQsIGxvY2FsaXphdGlvbiwgbmF2aWdhdG9yLCByZW5kZXJlciwgY2RyLCB6b25lLCBkaXNhYmxlZERhdGVzU2VydmljZSkge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMubmF2aWdhdG9yID0gbmF2aWdhdG9yO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlID0gZGlzYWJsZWREYXRlc1NlcnZpY2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZ3VpZCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBidWlsdC1pbiBtaW4gb3IgbWF4IHZhbGlkYXRvcnMgYXJlIGVuZm9yY2VkIHdoZW4gdmFsaWRhdGluZyBhIGZvcm0uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhbmdlVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBidWlsdC1pbiB2YWxpZGF0b3IgZm9yIGRpc2FibGVkXG4gICAgICAgICAqIGRhdGUgcmFuZ2VzIGlzIGVuZm9yY2VkIHdoZW4gdmFsaWRhdGluZyBhIGZvcm1cbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkaXNhYmxlZF9kYXRlc19tdWx0aXZpZXdjYWxlbmRhciAlfSN0b2MtdmFsaWRhdGlvbikpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzUmFuZ2VWYWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHkgb2YgdGhlIENhbGVuZGFyIGFuZFxuICAgICAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBhY3RpdmVcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkaXNhYmxlZF9tdWx0aXZpZXdjYWxlbmRhciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyBvciBnZXRzIHRoZSBgdGFiaW5kZXhgIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhci4gQmFzZWQgb24gdGhlXG4gICAgICAgICAqIFtIVE1MIGB0YWJpbmRleGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvR2xvYmFsX2F0dHJpYnV0ZXMvdGFiaW5kZXgpIGJlaGF2aW9yLFxuICAgICAgICAgKiBpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBmb2N1c2FibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGFjdGl2ZSB2aWV3IHRoYXQgdGhlIENhbGVuZGFyIGluaXRpYWxseSByZW5kZXJzXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgYWN0aXZldmlld19tdWx0aXZpZXdjYWxlbmRhciAlfSkpLlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYWN0aXZlIHZpZXcgaXMgYG1vbnRoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBZb3UgaGF2ZSB0byBzZXQgYGFjdGl2ZVZpZXdgIHdpdGhpbiB0aGUgYHRvcFZpZXdgLWBib3R0b21WaWV3YCByYW5nZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlVmlldyA9IENhbGVuZGFyVmlld0VudW1bQ2FsZW5kYXJWaWV3RW51bS5tb250aF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBib3R0b21tb3N0IHZpZXcsIHRvIHdoaWNoIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZVxuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGVzX211bHRpdmlld2NhbGVuZGFyICV9I3RvYy1wYXJ0aWFsLWRhdGVzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJvdHRvbVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW0ubW9udGhdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgdG9wbW9zdCB2aWV3LCB0byB3aGljaCB0aGUgdXNlciBjYW4gbmF2aWdhdGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRvcFZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW0NhbGVuZGFyVmlld0VudW0uY2VudHVyeV07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIHdlZWsgbnVtYmVyIGNvbHVtbiBpbiB0aGUgYG1vbnRoYCB2aWV3XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgd2Vla251bWNvbHVtbl9tdWx0aXZpZXdjYWxlbmRhciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53ZWVrTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGB2aWV3c2AgcHJvcGVydHkgb2YgdGhlIENhbGVuZGFyIGFuZFxuICAgICAgICAgKiBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcmVuZGVyZWQgbW9udGhzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52aWV3cyA9IDI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgdmlldyBpcyBjaGFuZ2VkXG4gICAgICAgICAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyBvdmVydmlld19tdWx0aXZpZXdjYWxlbmRhciAlfSN0b2MtZXZlbnRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIGEgdmlldyBjZWxsIGlzIGVudGVyZWRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X211bHRpdmlld2NhbGVuZGFyICV9I3RvYy1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2VsbEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiBhIHZpZXcgY2VsbCBpcyBsZWF2ZWRcbiAgICAgICAgICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIG92ZXJ2aWV3X211bHRpdmlld2NhbGVuZGFyICV9I3RvYy1ldmVudHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2VsbExlYXZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdmFsdWUgaXMgY2hhbmdlZFxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgb3ZlcnZpZXdfbXVsdGl2aWV3Y2FsZW5kYXIgJX0jdG9jLWV2ZW50cykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jZWxsVUlEID0gZ3VpZCgpO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQcmV2RGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzTmV4dERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmV2VmlldyA9IEFjdGlvbi5QcmV2VmlldztcbiAgICAgICAgdGhpcy5uZXh0VmlldyA9IEFjdGlvbi5OZXh0VmlldztcbiAgICAgICAgdGhpcy5fbWluID0gbmV3IERhdGUoTUlOX0RBVEUpO1xuICAgICAgICB0aGlzLl9tYXggPSBuZXcgRGF0ZShNQVhfREFURSk7XG4gICAgICAgIHRoaXMuX2ZvY3VzZWREYXRlID0gZ2V0VG9kYXkoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UgPSBub29wO1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQgPSBub29wO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gbm9vcDtcbiAgICAgICAgdGhpcy5taW5WYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5tYXhWYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzUmFuZ2VWYWxpZGF0ZUZuID0gbm9vcDtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnNldENsYXNzZXMoZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBgZm9jdXNlZERhdGVgIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhciBhbmRcbiAgICAgKiBkZWZpbmVzIHRoZSBmb2N1c2VkIGRhdGUgb2YgdGhlIGNvbXBvbmVudFxuICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0ZXNfbXVsdGl2aWV3Y2FsZW5kYXIgJX0jdG9jLWZvY3VzZWQtZGF0ZXMpKS5cbiAgICAgKlxuICAgICAqID4gSWYgdGhlIENhbGVuZGFyIGlzIG91dCBvZiB0aGUgbWluIG9yIG1heCByYW5nZSwgaXQgbm9ybWFsaXplcyB0aGUgZGVmaW5lZCBgZm9jdXNlZERhdGVgLlxuICAgICAqL1xuICAgIHNldCBmb2N1c2VkRGF0ZShmb2N1c2VkRGF0ZSkge1xuICAgICAgICB0aGlzLl9mb2N1c2VkRGF0ZSA9IGZvY3VzZWREYXRlIHx8IGdldFRvZGF5KCk7XG4gICAgfVxuICAgIGdldCBmb2N1c2VkRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWREYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBtaW5gIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhciBhbmRcbiAgICAgKiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZSB2YWx1ZS5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYG1pbmAgdmFsdWUgaXMgYDE5MDAtMS0xYC5cbiAgICAgKi9cbiAgICBzZXQgbWluKG1pbikge1xuICAgICAgICB0aGlzLl9taW4gPSBtaW4gfHwgbmV3IERhdGUoTUlOX0RBVEUpO1xuICAgIH1cbiAgICBnZXQgbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGBtYXhgIHByb3BlcnR5IG9mIHRoZSBDYWxlbmRhciBhbmRcbiAgICAgKiBkZWZpbmVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZSB2YWx1ZS5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYG1heGAgdmFsdWUgaXMgYDIwOTktMTItMzFgLlxuICAgICAqL1xuICAgIHNldCBtYXgobWF4KSB7XG4gICAgICAgIHRoaXMuX21heCA9IG1heCB8fCBuZXcgRGF0ZShNQVhfREFURSk7XG4gICAgfVxuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBvZiB0aGUgQ2FsZW5kYXIgYW5kIGRlZmluZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiA+IFRoZSBgdmFsdWVgIGhhcyB0byBiZSBhIHZhbGlkXG4gICAgICogW0phdmFTY3JpcHQgYERhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlKSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgc2V0IHZhbHVlKGNhbmRpZGF0ZSkge1xuICAgICAgICB0aGlzLnZlcmlmeVZhbHVlKGNhbmRpZGF0ZSk7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gY2xvbmVEYXRlKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgdGFiSW5kZXgodGFiSW5kZXgpIHtcbiAgICAgICAgdGhpcy50YWJpbmRleCA9IHRhYkluZGV4O1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlcyBvZiB0aGUgTXVsdGlWaWV3Q2FsZW5kYXIgdGhhdCB3aWxsIGJlIGRpc2FibGVkXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBkaXNhYmxlZF9kYXRlc19tdWx0aXZpZXdjYWxlbmRhciAlfSkpLlxuICAgICAqL1xuICAgIHNldCBkaXNhYmxlZERhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1NlcnZpY2UuaW5pdGlhbGl6ZSh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYHNlbGVjdGlvblJhbmdlYCBwcm9wZXJ0eSBvZiB0aGUgQ2FsZW5kYXIgYW5kXG4gICAgICogZGVmaW5lcyB0aGUgc2VsZWN0aW9uIHJhbmdlIG9mIHRoZSBjb21wb25lbnRcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGRhdGVzX211bHRpdmlld2NhbGVuZGFyICV9I3RvYy1zZWxlY3Rpb24tcmFuZ2UpKS5cbiAgICAgKi9cbiAgICBzZXQgc2VsZWN0aW9uUmFuZ2UocmFuZ2UkJDEpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uUmFuZ2UgPSByYW5nZSQkMTtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXRlc1JhbmdlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvblJhbmdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGNlbGxUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IG1vbnRoQ2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMubW9udGhDZWxsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCB5ZWFyQ2VsbFRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMueWVhckNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGRlY2FkZUNlbGxUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmRlY2FkZUNlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGNlbnR1cnlDZWxsVGVtcGxhdGVSZWYodGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5jZW50dXJ5Q2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgd2Vla051bWJlclRlbXBsYXRlUmVmKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMud2Vla051bWJlclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgaGVhZGVyVGl0bGVUZW1wbGF0ZVJlZih0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLmhlYWRlclRpdGxlVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZVZpZXdFbnVtKCkge1xuICAgICAgICBjb25zdCBhY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3RW51bVt0aGlzLmFjdGl2ZVZpZXddO1xuICAgICAgICByZXR1cm4gYWN0aXZlVmlldyA8IHRoaXMuYm90dG9tVmlld0VudW0gPyB0aGlzLmJvdHRvbVZpZXdFbnVtIDogYWN0aXZlVmlldztcbiAgICB9XG4gICAgZ2V0IGJvdHRvbVZpZXdFbnVtKCkge1xuICAgICAgICByZXR1cm4gQ2FsZW5kYXJWaWV3RW51bVt0aGlzLmJvdHRvbVZpZXddO1xuICAgIH1cbiAgICBnZXQgdG9wVmlld0VudW0oKSB7XG4gICAgICAgIHJldHVybiBDYWxlbmRhclZpZXdFbnVtW3RoaXMudG9wVmlld107XG4gICAgfVxuICAgIGdldCB3aWRnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuICAgIGdldCB3aWRnZXRSb2xlKCkge1xuICAgICAgICByZXR1cm4gJ2dyaWQnO1xuICAgIH1cbiAgICBnZXQgY2FsZW5kYXJUYWJJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiB0aGlzLnRhYkluZGV4O1xuICAgIH1cbiAgICBnZXQgYXJpYURpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IGFyaWFBY3RpdmVkZXNjZW5kYW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsVUlEICsgdGhpcy5mb2N1c2VkRGF0ZS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVCbHVyKCkge1xuICAgICAgICB0aGlzLm9uQ29udHJvbFRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlOyAvL2Vuc3VyZSB0aGF0IGhvdmVyZWQgaXMgYWxzbyBub3QgYWN0aXZlXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVGb2N1cygpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVNb3VzZUVudGVyKCkge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVNb3VzZUxlYXZlKCkge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVDbGljaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBrZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGRhdGVJblJhbmdlKHRoaXMubmF2aWdhdG9yLm1vdmUodGhpcy5mb2N1c2VkRGF0ZSwgdGhpcy5uYXZpZ2F0b3IuYWN0aW9uKGV2ZW50KSwgdGhpcy5hY3RpdmVWaWV3RW51bSksIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMuZm9jdXNlZERhdGUsIGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzZWREYXRlID0gY2FuZGlkYXRlO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZW50ZXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRGF0ZUNoYW5nZSh0aGlzLmZvY3VzZWREYXRlKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0TWVzc2FnZXMoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNldE1lc3NhZ2VzKCkpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmJ1cy52aWV3Q2hhbmdlZC5zdWJzY3JpYmUoKHsgdmlldyB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXdFbnVtW3ZpZXddO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVWaWV3Q2hhbmdlLmVtaXQodGhpcy5hY3RpdmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQnV0dG9uU3RhdGUoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmJ1cy5jb25maWd1cmUodGhpcy5ib3R0b21WaWV3RW51bSwgdGhpcy50b3BWaWV3RW51bSk7XG4gICAgICAgIGNvbnN0IHVzZVZhbHVlID0gaGFzRXhpc3RpbmdWYWx1ZShjaGFuZ2VzLCAndmFsdWUnKSAmJiAhaGFzRXhpc3RpbmdWYWx1ZShjaGFuZ2VzLCAnZm9jdXNlZERhdGUnKTtcbiAgICAgICAgY29uc3QgZm9jdXNlZERhdGUgPSBkYXRlSW5SYW5nZShjbG9uZURhdGUodXNlVmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5mb2N1c2VkRGF0ZSksIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZERhdGUgPSAhaXNFcXVhbCh0aGlzLmZvY3VzZWREYXRlLCBmb2N1c2VkRGF0ZSkgPyBmb2N1c2VkRGF0ZSA6IHRoaXMuZm9jdXNlZERhdGU7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCB8fCBjaGFuZ2VzLnJhbmdlVmFsaWRhdGlvbiB8fCBjaGFuZ2VzLmRpc2FibGVkRGF0ZXMgfHwgY2hhbmdlcy5kaXNhYmxlZERhdGVzUmFuZ2VWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1pblZhbGlkYXRlRm4gPSB0aGlzLnJhbmdlVmFsaWRhdGlvbiA/IG1pblZhbGlkYXRvcih0aGlzLm1pbikgOiBub29wO1xuICAgICAgICAgICAgdGhpcy5tYXhWYWxpZGF0ZUZuID0gdGhpcy5yYW5nZVZhbGlkYXRpb24gPyBtYXhWYWxpZGF0b3IodGhpcy5tYXgpIDogbm9vcDtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1JhbmdlVmFsaWRhdGVGbiA9IHRoaXMuZGlzYWJsZWREYXRlc1JhbmdlVmFsaWRhdGlvbiA/IGRpc2FibGVkRGF0ZXNSYW5nZVZhbGlkYXRvcih0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmlzRGF0ZURpc2FibGVkKSA6IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMubWluIHx8IGNoYW5nZXMubWF4IHx8IGNoYW5nZXMuZm9jdXNlZERhdGUgfHwgY2hhbmdlcy5hY3RpdmVWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRvblN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1lc3NhZ2VzVGltZW91dCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQnV0dG9uU3RhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgaG9zdCBlbGVtZW50IG9mIHRoZSBDYWxlbmRhci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICogIDxidXR0b24gKGNsaWNrKT1cIm11bHRpdmlld2NhbGVuZGFyLmZvY3VzKClcIj5Gb2N1cyBjYWxlbmRhcjwvYnV0dG9uPlxuICAgICAqICA8a2VuZG8tbXVsdGl2aWV3Y2FsZW5kYXIgI211bHRpdmlld2NhbGVuZGFyPjwva2VuZG8tbXVsdGl2aWV3Y2FsZW5kYXI+XG4gICAgICogYFxuICAgICAqIH0pXG4gICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7IH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgQ2FsZW5kYXIgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGJsdXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlRGF0ZUNoYW5nZShjYW5kaWRhdGUpIHtcbiAgICAgICAgY29uc3QgY2FuTmF2aWdhdGVEb3duID0gdGhpcy5idXMuY2FuTW92ZURvd24odGhpcy5hY3RpdmVWaWV3RW51bSk7XG4gICAgICAgIGNvbnN0IGlzU2FtZURhdGUgPSAhY2FuTmF2aWdhdGVEb3duICYmIGlzRXF1YWwoY2FuZGlkYXRlLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpIHx8IHRoaXMuZm9jdXNlZERhdGU7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IGlzU2FtZURhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuTmF2aWdhdGVEb3duKSB7XG4gICAgICAgICAgICB0aGlzLmJ1cy5tb3ZlRG93bih0aGlzLmFjdGl2ZVZpZXdFbnVtKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWREYXRlc1NlcnZpY2UuaXNEYXRlRGlzYWJsZWQoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UoY2xvbmVEYXRlKGNhbmRpZGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGNsb25lRGF0ZShjYW5kaWRhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZShjYW5kaWRhdGUpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlWYWx1ZShjYW5kaWRhdGUpO1xuICAgICAgICB0aGlzLmZvY3VzZWREYXRlID0gZGF0ZUluUmFuZ2UoY2xvbmVEYXRlKGNhbmRpZGF0ZSkgfHwgdGhpcy5mb2N1c2VkRGF0ZSwgdGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xDaGFuZ2UgPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7XG4gICAgICAgIHRoaXMub25Db250cm9sVG91Y2hlZCA9IGZuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHZhbGlkYXRlKGNvbnRyb2wpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluVmFsaWRhdGVGbihjb250cm9sKSB8fCB0aGlzLm1heFZhbGlkYXRlRm4oY29udHJvbCkgfHwgdGhpcy5kaXNhYmxlZERhdGVzUmFuZ2VWYWxpZGF0ZUZuKHRoaXMuc2VsZWN0aW9uUmFuZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbikge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBhY3RpdmVDZWxsVGVtcGxhdGUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3RW51bSkge1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLm1vbnRoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoQ2VsbFRlbXBsYXRlIHx8IHRoaXMuY2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLnllYXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhckNlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3RW51bS5kZWNhZGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjYWRlQ2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLmNlbnR1cnk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2VudHVyeUNlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5hdmlnYXRlKGFjdGlvbikge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXRlID0gdGhpcy52aWV3TGlzdC5uYXZpZ2F0ZShhY3Rpb24pO1xuICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRvblN0YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBlbWl0Q2VsbEV2ZW50KGVtaXR0ZXIsIGFyZ3MpIHtcbiAgICAgICAgaWYgKGhhc09ic2VydmVycyhlbWl0dGVyKSkge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0Q2xhc3NlcyhlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2std2lkZ2V0Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2stY2FsZW5kYXInKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnay1jYWxlbmRhci1pbmZpbml0ZScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdrLWNhbGVuZGFyLXJhbmdlJyk7XG4gICAgfVxuICAgIHNldE1lc3NhZ2VzKCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubWVzc2FnZXNUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QnV0dG9uVGl0bGUgPSB0aGlzLmxvY2FsaXphdGlvbi5nZXQoJ3ByZXZCdXR0b25UaXRsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dEJ1dHRvblRpdGxlID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCduZXh0QnV0dG9uVGl0bGUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZlcmlmeUNoYW5nZXMoKSB7XG4gICAgICAgIGlmICghaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW4gPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbWF4IHZhbHVlIHNob3VsZCBiZSBiaWdnZXIgdGhhbiB0aGUgbWluLiBTZWUgJHtNSU5fRE9DX0xJTkskM30gYW5kICR7TUFYX0RPQ19MSU5LJDN9LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJvdHRvbVZpZXdFbnVtID4gdGhpcy50b3BWaWV3RW51bSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdG9wVmlldyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGJvdHRvbVZpZXcuIFNlZSAke0JPVFRPTV9WSUVXX0RPQ19MSU5LJDF9IGFuZCAke1RPUF9WSUVXX0RPQ19MSU5LJDF9LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZlcmlmeVZhbHVlKGNhbmRpZGF0ZSkge1xuICAgICAgICBpZiAoIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbmRpZGF0ZSAmJiAhKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAndmFsdWUnIHNob3VsZCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgRGF0ZSBpbnN0YW5jZS4gQ2hlY2sgJHtWQUxVRV9ET0NfTElOSyQ1fSBmb3IgcG9zc2libGUgcmVzb2x1dGlvbi5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVCdXR0b25TdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUHJldkRpc2FibGVkID0gIXRoaXMudmlld0xpc3QuY2FuTmF2aWdhdGUodGhpcy5wcmV2Vmlldyk7XG4gICAgICAgICAgICB0aGlzLmlzTmV4dERpc2FibGVkID0gIXRoaXMudmlld0xpc3QuY2FuTmF2aWdhdGUodGhpcy5uZXh0Vmlldyk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuTXVsdGlWaWV3Q2FsZW5kYXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvLW11bHRpdmlld2NhbGVuZGFyJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgQnVzVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFJBTkdFX0NBTEVOREFSX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgICAgICAgICBSQU5HRV9DQUxFTkRBUl9SQU5HRV9WQUxJREFUT1JTLFxuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZERhdGVzU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLm11bHRpdmlld2NhbGVuZGFyJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1tdWx0aXZpZXdjYWxlbmRhcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyIGtlbmRvTXVsdGlWaWV3Q2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc1xuICAgICAgICBpMThuLXRvZGF5PVwia2VuZG8ubXVsdGl2aWV3Y2FsZW5kYXIudG9kYXl8VGhlIGxhYmVsIGZvciB0aGUgdG9kYXkgYnV0dG9uIGluIHRoZSBjYWxlbmRhciBoZWFkZXJcIlxuICAgICAgICB0b2RheT1cIlRPREFZXCJcblxuICAgICAgICBpMThuLXByZXZCdXR0b25UaXRsZT1cImtlbmRvLm11bHRpdmlld2NhbGVuZGFyLnByZXZCdXR0b25UaXRsZXxUaGUgbGFiZWwgZm9yIHRoZSBwcmV2aW91cyBidXR0b24gaW4gdGhlIE11bHRpdmlldyBjYWxlbmRhclwiXG4gICAgICAgIHByZXZCdXR0b25UaXRsZT1cIk5hdmlnYXRlIHRvIHByZXZpb3VzIHZpZXdcIlxuXG4gICAgICAgIGkxOG4tbmV4dEJ1dHRvblRpdGxlPVwia2VuZG8ubXVsdGl2aWV3Y2FsZW5kYXIubmV4dEJ1dHRvblRpdGxlfFRoZSBsYWJlbCBmb3IgdGhlIG5leHQgYnV0dG9uIGluIHRoZSBNdWx0aXZpZXcgY2FsZW5kYXJcIlxuICAgICAgICBuZXh0QnV0dG9uVGl0bGU9XCJOYXZpZ2F0ZSB0byBuZXh0IHZpZXdcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiay1idXR0b24gay1wcmV2LXZpZXdcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc1ByZXZEaXNhYmxlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1ByZXZEaXNhYmxlZFwiXG4gICAgICAgIFt0aXRsZV09XCJwcmV2QnV0dG9uVGl0bGVcIlxuICAgICAgICAoY2xpY2spPVwibmF2aWdhdGUocHJldlZpZXcpXCJcbiAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1hcnJvdy1jaGV2cm9uLWxlZnRcIj48L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGtlbmRvLWNhbGVuZGFyLWhvcml6b250YWxcbiAgICAgICAgW2FjdGl2ZVZpZXddPVwiYWN0aXZlVmlld0VudW1cIlxuICAgICAgICBbaXNBY3RpdmVdPVwiaXNBY3RpdmUgfHwgaXNIb3ZlcmVkXCJcbiAgICAgICAgW2NlbGxUZW1wbGF0ZVJlZl09XCJhY3RpdmVDZWxsVGVtcGxhdGUoKT8udGVtcGxhdGVSZWZcIlxuICAgICAgICBbaGVhZGVyVGl0bGVUZW1wbGF0ZVJlZl09XCJoZWFkZXJUaXRsZVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgIFt3ZWVrTnVtYmVyVGVtcGxhdGVSZWZdPVwid2Vla051bWJlclRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgIFtjZWxsVUlEXT1cImNlbGxVSURcIlxuICAgICAgICBbdmlld3NdPVwidmlld3NcIlxuICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgW2ZvY3VzZWREYXRlXT1cImZvY3VzZWREYXRlXCJcbiAgICAgICAgW3dlZWtOdW1iZXJdPVwid2Vla051bWJlclwiXG4gICAgICAgIFthY3RpdmVSYW5nZUVuZF09XCJhY3RpdmVSYW5nZUVuZFwiXG4gICAgICAgIFtzZWxlY3Rpb25SYW5nZV09XCJzZWxlY3Rpb25SYW5nZVwiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoY2VsbEVudGVyKT1cImVtaXRDZWxsRXZlbnQoY2VsbEVudGVyLCAkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxMZWF2ZSk9XCJlbWl0Q2VsbEV2ZW50KGNlbGxMZWF2ZSwgJGV2ZW50KVwiXG4gICAgPlxuICAgIDwva2VuZG8tY2FsZW5kYXItaG9yaXpvbnRhbD5cbiAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiay1idXR0b24gay1uZXh0LXZpZXdcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc05leHREaXNhYmxlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc05leHREaXNhYmxlZFwiXG4gICAgICAgIFt0aXRsZV09XCJuZXh0QnV0dG9uVGl0bGVcIlxuICAgICAgICAoY2xpY2spPVwibmF2aWdhdGUobmV4dFZpZXcpXCJcbiAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1hcnJvdy1jaGV2cm9uLXJpZ2h0XCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQnVzVmlld1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IERpc2FibGVkRGF0ZXNTZXJ2aWNlIH1cbl07XG5NdWx0aVZpZXdDYWxlbmRhckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9jdXNlZERhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByYW5nZVZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkRGF0ZXNSYW5nZVZhbGlkYXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGFiaW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZERhdGVzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBib3R0b21WaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3BWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVSYW5nZUVuZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZpZXdzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2VsbEVudGVyOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2VsbExlYXZlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIG1vbnRoQ2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtb250aENlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICB5ZWFyQ2VsbFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAgeWVhckNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsneWVhckNlbGxUZW1wbGF0ZScsXSB9XSxcbiAgICBkZWNhZGVDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGRlY2FkZUNlbGxUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGVjYWRlQ2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIGNlbnR1cnlDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBjZW50dXJ5Q2VsbFRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZW50dXJ5Q2VsbFRlbXBsYXRlJyxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIHdlZWtOdW1iZXJUZW1wbGF0ZVJlZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnd2Vla051bWJlclRlbXBsYXRlJyxdIH1dLFxuICAgIGhlYWRlclRpdGxlVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0hlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBoZWFkZXJUaXRsZVRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydoZWFkZXJUaXRsZVRlbXBsYXRlJyxdIH1dLFxuICAgIHZpZXdMaXN0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtIb3Jpem9udGFsVmlld0xpc3RDb21wb25lbnQsXSB9XSxcbiAgICB3aWRnZXRJZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5pZCcsXSB9XSxcbiAgICB3aWRnZXRSb2xlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnJvbGUnLF0gfV0sXG4gICAgY2FsZW5kYXJUYWJJbmRleDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50YWJpbmRleCcsXSB9XSxcbiAgICBhcmlhRGlzYWJsZWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1kaXNhYmxlZCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnLF0gfV0sXG4gICAgYXJpYUFjdGl2ZWRlc2NlbmRhbnQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50JyxdIH1dLFxuICAgIGhhbmRsZUJsdXI6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogW1wiYmx1clwiLF0gfV0sXG4gICAgaGFuZGxlRm9jdXM6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogW1wiZm9jdXNcIixdIH1dLFxuICAgIGhhbmRsZU1vdXNlRW50ZXI6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogW1wibW91c2VlbnRlclwiLF0gfV0sXG4gICAgaGFuZGxlTW91c2VMZWF2ZTogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbXCJtb3VzZWxlYXZlXCIsXSB9XSxcbiAgICBoYW5kbGVNb3VzZWRvd246IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogW1wibW91c2Vkb3duXCIsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBoYW5kbGVDbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbXCJjbGlja1wiLF0gfV0sXG4gICAga2V5ZG93bjogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbXCJrZXlkb3duXCIsIFtcIiRldmVudFwiXSxdIH1dLFxuICAgIGVudGVyOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFtcImtleWRvd24uZW50ZXJcIixdIH1dXG59O1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIHJlbmRlcnMgdGhlIGNvbnRlbnQgb2YgdGhlIERhdGVSYW5nZSBQb3B1cC4gVG8gZGVmaW5lIHRoZSBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuXG4gKiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb1JhbmdlUG9wdXBUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSB0aGUgY29tcG9uZW50IHRhZy5cbiAqL1xuY2xhc3MgRGF0ZVJhbmdlUG9wdXBUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkRhdGVSYW5nZVBvcHVwVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVSYW5nZVBvcHVwVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EYXRlUmFuZ2VQb3B1cFRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfVxuXTtcblxuY29uc3QgaXNBY3RpdmUgPSAoY21wKSA9PiAoY21wICYmIGNtcC5pc0FjdGl2ZSkgfHwgZmFsc2U7XG5jb25zdCBoYXNBY3RpdmVDb250ZW50ID0gKHBvcHVwKSA9PiBwb3B1cCAmJiBwb3B1cC5oYXNBY3RpdmVDb250ZW50KCk7XG4vKipcbiAqIEEgc2VydmljZSB0aGF0IGhhbmRsZXMgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgY29tcG9uZW50cyB0aGF0IGFyZSBwbGFjZWQgaW5zaWRlIHRoZSBEYXRlUmFuZ2VDb21wb25lbnQuXG4gKiBGb3IgZXhhbXBsZSwgdGhlIHN0YXJ0IGFuZCBlbmQgYERhdGVJbnB1dGAgYW5kIGBEYXRlUmFuZ2VQb3B1cGAgY29tcG9uZW50cy5cbiAqL1xuY2xhc3MgRGF0ZVJhbmdlU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBPYnNlcnZhYmxlIGluc3RhbmNlIHRoYXQgbm90aWZpZXMgd2hlbiB0aGUgYGFjdGl2ZVJhbmdlRW5kYCBzdGF0ZSBpcyBjaGFuZ2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVSYW5nZUVuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gT2JzZXJ2YWJsZSBpbnN0YW5jZSB0aGF0IG5vdGlmaWVzIHdoZW4gdGhlIGBmb2N1c2VkRGF0ZWAgaXMgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNlZERhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIE9ic2VydmFibGUgaW5zdGFuY2UgdGhhdCBub3RpZmllcyB3aGVuIHRoZSBlbmQgYERhdGVJbnB1dGAgY29tcG9uZW50IGlzIGNoYW5nZWQuXG4gICAgICAgICAqIEZvciBleGFtcGxlLCB3aGVuIGEgbmV3IGVuZCBgRGF0ZUlucHV0YCBpcyBhdHRhY2hlZCBvciB3aGVuIHRoZSBvbGQgb25lIGlzIGRldGFjaGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmRJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gT2JzZXJ2YWJsZSBpbnN0YW5jZSB0aGF0IG5vdGlmaWVzIHdoZW4gdGhlIHN0YXJ0IGBEYXRlSW5wdXRgIGNvbXBvbmVudCBpcyBjaGFuZ2VkLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBhIG5ldyBzdGFydCBgRGF0ZUlucHV0YCBpcyBhdHRhY2hlZCBvciB0aGUgb2xkIG9uZSBpcyBkZXRhY2hlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnRJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gT2JzZXJ2YWJsZSBpbnN0YW5jZSB0aGF0IG5vdGlmaWVzIHdoZW4gdGhlIGBEYXRlUmFuZ2VQb3B1cGAgY29tcG9uZW50IGlzIGNoYW5nZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVBvcHVwJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBPYnNlcnZhYmxlIGluc3RhbmNlIHRoYXQgbm90aWZpZXMgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBjaGFuZ2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYW5nZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KEVNUFRZX1NFTEVDVElPTlJBTkdFKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBgYWN0aXZlUmFuZ2VFbmRgIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCBhY3RpdmVSYW5nZUVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlUmFuZ2VFbmQkLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGBmb2N1c2VkRGF0ZWAgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IGZvY3VzZWREYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkRGF0ZSQudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBtaW5gIHJhbmdlIHZhbHVlLlxuICAgICAqIFRoZSBgbWluYCB2YWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgYHN0YXJ0YCBEYXRlSW5wdXQgdmFsdWUgb3IgdGhlIGBtaW5gIHZhbHVlIG9mIHRoZSBDYWxlbmRhci5cbiAgICAgKi9cbiAgICBnZXQgbWluKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnRJbnB1dCQudmFsdWUgfHwge30pLm1pbiB8fCBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbWF4YCByYW5nZSB2YWx1ZS5cbiAgICAgKiBUaGUgYG1heGAgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGBlbmRgIERhdGVJbnB1dCB2YWx1ZSBvciB0aGUgYG1heGAgdmFsdWUgb2YgdGhlIENhbGVuZGFyLlxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5lbmRJbnB1dCQudmFsdWUgfHwge30pLm1heCB8fCBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGBzZWxlY3Rpb25SYW5nZWAgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGlvblJhbmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZSQudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgcmVnaXN0ZXJlZCBgRGF0ZVJhbmdlUG9wdXBgIGNvbXBvbmVudC5cbiAgICAgKiBUaGUgbWV0aG9kIG9wZW5zIHRoZSBwb3B1cCBhbmQgZm9jdXNlcyB0aGUgY2FsZW5kYXIuXG4gICAgICovXG4gICAgYWN0aXZhdGVQb3B1cCgpIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlUG9wdXAgPSB0aGlzLmRhdGVSYW5nZVBvcHVwJC52YWx1ZTtcbiAgICAgICAgaWYgKCFkYXRlUmFuZ2VQb3B1cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRhdGVSYW5nZVBvcHVwLmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlYWN0aXZhdGVzIHRoZSByZWdpc3RlcmVkIGBEYXRlUmFuZ2VQb3B1cGAgY29tcG9uZW50LlxuICAgICAqIFRoZSBtZXRob2QgY2xvc2VzIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBkZWFjdGl2YXRlUG9wdXAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZVBvcHVwID0gdGhpcy5kYXRlUmFuZ2VQb3B1cCQudmFsdWU7XG4gICAgICAgIGlmICghKGRhdGVSYW5nZVBvcHVwICYmIGRhdGVSYW5nZVBvcHVwLnNob3cpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGF0ZVJhbmdlUG9wdXAuc2hvdyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBEZWFjdGl2YXRlcyB0aGUgcmVnaXN0ZXJlZCBgRGF0ZVJhbmdlUG9wdXBgIGNvbXBvbmVudCBhbmQgZmlyZXMgdGhlIGBjYW5jZWxgIGV2ZW50LlxuICAgICAqIFRoZSBtZXRob2QgY2xvc2VzIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBjYW5jZWxQb3B1cCgpIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlUG9wdXAgPSB0aGlzLmRhdGVSYW5nZVBvcHVwJC52YWx1ZTtcbiAgICAgICAgaWYgKCEoZGF0ZVJhbmdlUG9wdXAgJiYgZGF0ZVJhbmdlUG9wdXAuc2hvdykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkYXRlUmFuZ2VQb3B1cC5jYW5jZWxQb3B1cCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wbGV0ZXMgYWxsIG9ic2VydmFibGVzIHRvIG1pdGlnYXRlIHBvc3NpYmxlIG1lbW9yeSBsZWFrcy5cbiAgICAgKiBDYWxscyB0aGUgbWV0aG9kIHdoZW4gYSBjb21wb25lbnQgdGhhdCB1c2VzIGl0IGlzIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVJhbmdlRW5kJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVBvcHVwJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmZvY3VzZWREYXRlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmVuZElucHV0JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN0YXJ0SW5wdXQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMucmFuZ2UkLmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIHdoZW4gYW4gYWN0aXZlIGNvbXBvbmVudCB0aGF0IGlzIHBsYWNlZCBpbnNpZGUgdGhlIGBEYXRlUmFuZ2VDb21wb25lbnRgIGlzIGRldGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgb3BlbmVkIHBvcHVwIG9yIHRoZSBmb2N1c2VkIERhdGVJbnB1dC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhbiBhY3RpdmUgY29tcG9uZW50IGlzIHByZXNlbnQuXG4gICAgICovXG4gICAgaGFzQWN0aXZlQ29tcG9uZW50KCkge1xuICAgICAgICBjb25zdCBwb3B1cCA9IHRoaXMuZGF0ZVJhbmdlUG9wdXAkLnZhbHVlO1xuICAgICAgICBjb25zdCBpc1BvcHVwID0gaXNBY3RpdmUocG9wdXApO1xuICAgICAgICBjb25zdCBpc1N0YXJ0ID0gaXNBY3RpdmUodGhpcy5zdGFydElucHV0JC52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzRW5kID0gaXNBY3RpdmUodGhpcy5lbmRJbnB1dCQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNQb3B1cCB8fCBpc1N0YXJ0IHx8IGlzRW5kIHx8IGhhc0FjdGl2ZUNvbnRlbnQocG9wdXApIHx8IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBuZXcgc3RhcnQgYERhdGVJbnB1dGAgY29tcG9uZW50LiBOb3RpZmllcyBhbGwgYHN0YXJ0SW5wdXQkYCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJTdGFydElucHV0KHN0YXJ0SW5wdXQpIHtcbiAgICAgICAgdGhpcy5zdGFydElucHV0JC5uZXh0KHN0YXJ0SW5wdXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBuZXcgZW5kIGBEYXRlSW5wdXRgIGNvbXBvbmVudC4gTm90aWZpZXMgYWxsIGBlbmRJbnB1dCRgIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICByZWdpc3RlckVuZElucHV0KGVuZElucHV0KSB7XG4gICAgICAgIHRoaXMuZW5kSW5wdXQkLm5leHQoZW5kSW5wdXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBuZXcgYERhdGVSYW5nZVBvcHVwYCBjb21wb25lbnQuIE5vdGlmaWVzIGFsbCBgZGF0ZVJhbmdlUG9wdXAkYCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJQb3B1cChkYXRlUmFuZ2VQb3B1cCkge1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVBvcHVwJC5uZXh0KGRhdGVSYW5nZVBvcHVwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYGFjdGl2ZVJhbmdlRW5kYCB2YWx1ZS4gTm90aWZpZXMgYWxsIGBhY3RpdmVSYW5nZUVuZCRgIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBzZXRBY3RpdmVSYW5nZUVuZChhY3RpdmVSYW5nZSkge1xuICAgICAgICBpZiAoIWFjdGl2ZVJhbmdlIHx8IHRoaXMuYWN0aXZlUmFuZ2VFbmQgPT09IGFjdGl2ZVJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVSYW5nZUVuZCQubmV4dChhY3RpdmVSYW5nZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGZvY3VzZWQgZGF0ZS4gTm90aWZpZXMgYWxsIGBmb2N1c2VkRGF0ZSRgIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBzZXRGb2N1c2VkRGF0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNFcXVhbCh0aGlzLmZvY3VzZWREYXRlJC52YWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c2VkRGF0ZSQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiByYW5nZS4gTm90aWZpZXMgYWxsIGByYW5nZSRgIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBzZXRSYW5nZShyYW5nZSA9IEVNUFRZX1NFTEVDVElPTlJBTkdFKSB7XG4gICAgICAgIHRoaXMucmFuZ2UkLm5leHQocmFuZ2UpO1xuICAgIH1cbn1cbkRhdGVSYW5nZVNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgS2VuZG8gVUkgRGF0ZVJhbmdlUG9wdXAgY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRGF0ZUlucHV0c01vZHVsZSwgRGF0ZVJhbmdlU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqIHByb3ZpZGVyczogW0RhdGVSYW5nZVNlcnZpY2VdLFxuICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICogdGVtcGxhdGU6IGBcbiAqICA8YnV0dG9uICNhbmNob3IgKGNsaWNrKT1cInBvcHVwLnRvZ2dsZSgpXCI+VG9nZ2xlPC9idXR0b24+XG4gKiAgPGtlbmRvLWRhdGVyYW5nZS1wb3B1cCBbYW5jaG9yXT1cImFuY2hvclwiICNwb3B1cD48L2tlbmRvLWRhdGVyYW5nZS1wb3B1cD5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqIH1cbiAqIGBgYFxuICovXG5jbGFzcyBEYXRlUmFuZ2VQb3B1cENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocG9wdXBTZXJ2aWNlLCBkYXRlUmFuZ2VTZXJ2aWNlLCB6b25lLCBydGwpIHtcbiAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2UgPSBwb3B1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZSA9IGRhdGVSYW5nZVNlcnZpY2U7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMucnRsID0gcnRsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29udHJvbHMgdGhlIHBvcHVwIGFuaW1hdGlvbi5cbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZC5cbiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udHJvbGxpbmcgdGhlIHBvcHVwIGFuaW1hdGlvbnMsXG4gICAgICAgICAqIHJlZmVyIHRvIHRoZSBhcnRpY2xlIG9uIFthbmltYXRpb25zXSh7JSBzbHVnIGFuaW1hdGlvbnNfcG9wdXAgJX0pLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgdGhlIGNvbGxpc2lvbiBiZWhhdmlvciBvZiB0aGUgcG9wdXAuXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgYXJ0aWNsZSBvblxuICAgICAgICAgKiBbdmlld3BvcnQgYm91bmRhcnkgZGV0ZWN0aW9uXSh7JSBzbHVnIHZpZXdwb3J0Ym91bmRhcnlkZXRlY3Rpb25fcG9wdXAgJX0pLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2xsaXNpb24gPSB7IGhvcml6b250YWw6ICdmaXQnLCB2ZXJ0aWNhbDogJ2ZsaXAnIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHBvcHVwIGlzIGFib3V0IHRvIG9wZW4uXG4gICAgICAgICAqIFRoaXMgZXZlbnQgaXMgcHJldmVudGFibGUuIElmIHlvdSBjYW5jZWwgdGhlIGV2ZW50LCB0aGUgcG9wdXAgd2lsbCByZW1haW4gY2xvc2VkLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld19kYXRlcGlja2VyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVuID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSBwb3B1cCBpcyBhYm91dCB0byBjbG9zZS5cbiAgICAgICAgICogVGhpcyBldmVudCBpcyBwcmV2ZW50YWJsZS4gSWYgeW91IGNhbmNlbCB0aGUgZXZlbnQsIHRoZSBwb3B1cCB3aWxsIHJlbWFpbiBvcGVuLlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHNlY3Rpb24gb25cbiAgICAgICAgICogW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld19kYXRlcGlja2VyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgY2FsZW5kYXIgZWxlbWVudCBpcyBibHVycmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vdHNsaW50OmRpc2FibGUtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIGNhbGVuZGFyIGVsZW1lbnQgaXMgZm9jdXNlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25Gb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy90c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgcG9wdXAgaXMgY2xvc2VkIGVpdGhlciBvbiBgRVNDYCBrZXlwcmVzcyBvciBvbiBsZWF2aW5nIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb3B1cFVJRCA9IGd1aWQoKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHsgfSk7XG4gICAgICAgIHRoaXMucG9wdXBTdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnJlc29sdmVkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYWN0aXZlIGNhbGVuZGFyIHRoYXQgaXMgdmlzaWJsZSBpbiB0aGUgcG9wdXAuXG4gICAgICpcbiAgICAgKiA+IFdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCwgdGhlIHByb3BlcnR5IHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBjYWxlbmRhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyO1xuICAgIH1cbiAgICBzZXQgY2FsZW5kYXIoY2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVGb2N1c0JsdXIoY2FsZW5kYXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBXaGVuIHRoZSBvcGVuZWQgY2FsZW5kYXIgaXMgYWN0aXZlLCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKi9cbiAgICBnZXQgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyICYmIHRoaXMuY2FsZW5kYXIuaXNBY3RpdmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHNldCBzaG93KHNob3cpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3cgPT09IHNob3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQcmV2ZW50YWJsZUV2ZW50KCk7XG4gICAgICAgIGlmIChzaG93KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4uZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RvZ2dsZShzaG93KTtcbiAgICB9XG4gICAgZ2V0IHNob3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93O1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnJlZ2lzdGVyUG9wdXAodGhpcyk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY29udGVudENhbGVuZGFyLmNoYW5nZXMuc3Vic2NyaWJlKChjaGFuZ2VzKSA9PiB0aGlzLmNhbGVuZGFyID0gY2hhbmdlcy5maXJzdCkpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyU3Vic2NyaXB0aW9ucy5hZGQodGhpcy52aWV3Q2FsZW5kYXIuY2hhbmdlcy5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHRoaXMuY2FsZW5kYXIgPSBjaGFuZ2VzLmZpcnN0KSk7XG4gICAgICAgIGlmIChpc1dpbmRvd0F2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy53aW5kb3dCbHVyU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHdpbmRvdywgJ2JsdXInKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVXaW5kb3dCbHVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95UG9wdXAoKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ibHVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53aW5kb3dCbHVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvd0JsdXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgT3BlbnMgdGhlIHBvcHVwIGNvbXBvbmVudCBhbmQgZm9jdXNlcyB0aGUgY2FsZW5kYXIuXG4gICAgICovXG4gICAgYWN0aXZhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3cgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlU3Vic2NyaXB0aW9uID0gbWVyZ2UodGhpcy5jb250ZW50Q2FsZW5kYXIuY2hhbmdlcywgdGhpcy52aWV3Q2FsZW5kYXIuY2hhbmdlcylcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoY2hhbmdlcyA9PiBjaGFuZ2VzICYmIGNoYW5nZXMuZmlyc3QpLCBtYXAoY2hhbmdlcyA9PiBjaGFuZ2VzLmZpcnN0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChjYWxlbmRhcikgPT4gc2V0VGltZW91dCgoKSA9PiBjYWxlbmRhci5mb2N1cygpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRm9jdXNlcyB0aGUgY2FsZW5kYXIgKGlmIGF2YWlsYWJsZSkuXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZm9jdXNlZCBlbGVtZW50IGlkcyBwbGFjZWQgaW5zaWRlIHRoZSBwb3B1cC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYm9vbGVhbjtcbiAgICAgKi9cbiAgICBoYXNBY3RpdmVDb250ZW50KCkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSB8fCAhdGhpcy5wb3B1cFJlZikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvcHVwUmVmLnBvcHVwRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAuXG4gICAgICogSWYgeW91IHVzZSB0aGUgYHRvZ2dsZWAgbWV0aG9kIHRvIHNob3cgb3IgaGlkZSB0aGUgcG9wdXAsXG4gICAgICogdGhlIGBvcGVuYCBhbmQgYGNsb3NlYCBldmVudHMgZG8gbm90IGZpcmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2hvdyBUaGUgc3RhdGUgb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIHRvZ2dsZShzaG93KSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlKChzaG93ID09PSB1bmRlZmluZWQpID8gIXRoaXMuc2hvdyA6IHNob3cpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogQ2xvc2VzIHRoZSBwb3B1cCBhbmQgdHJpZ2dlcnMgdGhlIGBjYW5jZWxgIGV2ZW50LlxuICAgICAqL1xuICAgIGNhbmNlbFBvcHVwKCkge1xuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIH1cbiAgICBoYW5kbGVXaW5kb3dCbHVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnModGhpcy5jbG9zZSkpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5zaG93ID0gZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlTW91c2VMZWF2ZSgpIHtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnNldFJhbmdlKHRoaXMuZGF0ZVJhbmdlU2VydmljZS5zZWxlY3Rpb25SYW5nZSk7XG4gICAgfVxuICAgIGhhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBhbHRLZXksIGtleUNvZGUgfSA9IGV2ZW50O1xuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gS2V5cy5Fc2NhcGUgfHwgKGFsdEtleSAmJiBrZXlDb2RlID09PSBLZXlzLkFycm93VXApKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuY2FuY2VsUG9wdXAoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Vic2NyaWJlRm9jdXNCbHVyKGNhbGVuZGFyKSB7XG4gICAgICAgIGlmICh0aGlzLmJsdXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gY2FsZW5kYXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmJsdXJTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ2JsdXInKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkJsdXIuZW1pdCgpKTtcbiAgICAgICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudChuYXRpdmVFbGVtZW50LCAnZm9jdXMnKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvY3VzLmVtaXQoKSk7XG4gICAgfVxuICAgIGFkZFBvcHVwU3Vic2NyaXB0aW9ucyguLi5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIGlmICghaXNQcmVzZW50KHRoaXMucG9wdXBTdWJzY3JpcHRpb25zKSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaXB0aW9ucy5tYXAocyA9PiB0aGlzLnBvcHVwU3Vic2NyaXB0aW9ucy5hZGQocykpO1xuICAgIH1cbiAgICBnZXQgX2FwcGVuZFRvKCkge1xuICAgICAgICBjb25zdCBhcHBlbmRUbyA9IHRoaXMuYXBwZW5kVG87XG4gICAgICAgIGlmICghYXBwZW5kVG8gfHwgYXBwZW5kVG8gPT09ICdyb290Jykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwZW5kVG8gPT09ICdjb21wb25lbnQnID8gdGhpcy5jb250YWluZXIgOiBhcHBlbmRUbztcbiAgICB9XG4gICAgX3RvZ2dsZShzaG93KSB7XG4gICAgICAgIHRoaXMuX3Nob3cgPSBzaG93O1xuICAgICAgICBpZiAodGhpcy5wb3B1cFJlZikge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UG9wdXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2hvdykge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5ydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgICAgICAgICAgIGFuY2hvcjogdGhpcy5hbmNob3IsXG4gICAgICAgICAgICAgICAgYW5jaG9yQWxpZ246IHRoaXMuYW5jaG9yQWxpZ24gfHwgeyB2ZXJ0aWNhbDogJ2JvdHRvbScsIGhvcml6b250YWw6IGRpcmVjdGlvbiB9LFxuICAgICAgICAgICAgICAgIGFuaW1hdGU6IHRoaXMuYW5pbWF0ZSxcbiAgICAgICAgICAgICAgICBhcHBlbmRUbzogdGhpcy5fYXBwZW5kVG8sXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uOiB0aGlzLmNvbGxpc2lvbixcbiAgICAgICAgICAgICAgICBjb250ZW50OiAodGhpcy5jb250ZW50VGVtcGxhdGUgfHwge30pLnRlbXBsYXRlUmVmIHx8IHRoaXMuZGVmYXVsdFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogdGhpcy5tYXJnaW4sXG4gICAgICAgICAgICAgICAgcG9wdXBBbGlnbjogdGhpcy5wb3B1cEFsaWduIHx8IHsgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGU6ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwQW5jaG9yVmlld3BvcnRMZWF2ZSB9ID0gdGhpcy5wb3B1cFJlZjtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5wb3B1cFVJRCk7XG4gICAgICAgICAgICB0aGlzLmFkZFBvcHVwU3Vic2NyaXB0aW9ucyh0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gZnJvbUV2ZW50KHBvcHVwRWxlbWVudCwgJ2tleWRvd24nKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVLZXlkb3duLmJpbmQodGhpcykpKSwgZnJvbUV2ZW50KHBvcHVwRWxlbWVudCwgJ21vdXNlbGVhdmUnKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVNb3VzZUxlYXZlLmJpbmQodGhpcykpLCBwb3B1cEFuY2hvclZpZXdwb3J0TGVhdmUuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2FuY2VsUG9wdXAoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3lQb3B1cCgpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnBvcHVwUmVmKSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnBvcHVwU3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXBTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5EYXRlUmFuZ2VQb3B1cENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG8tZGF0ZXJhbmdlLXBvcHVwJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWRhdGVyYW5nZS1wb3B1cCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxrZW5kby1tdWx0aXZpZXdjYWxlbmRhciBrZW5kb0RhdGVSYW5nZVNlbGVjdGlvbj48L2tlbmRvLW11bHRpdmlld2NhbGVuZGFyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGF0ZVJhbmdlUG9wdXBDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBQb3B1cFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IERhdGVSYW5nZVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtSVEwsXSB9XSB9XG5dO1xuRGF0ZVJhbmdlUG9wdXBDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0sXSB9XSxcbiAgICBkZWZhdWx0VGVtcGxhdGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydkZWZhdWx0VGVtcGxhdGUnLF0gfV0sXG4gICAgY29udGVudFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtEYXRlUmFuZ2VQb3B1cFRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgdmlld0NhbGVuZGFyOiBbeyB0eXBlOiBWaWV3Q2hpbGRyZW4sIGFyZ3M6IFtNdWx0aVZpZXdDYWxlbmRhckNvbXBvbmVudCxdIH1dLFxuICAgIGNvbnRlbnRDYWxlbmRhcjogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTXVsdGlWaWV3Q2FsZW5kYXJDb21wb25lbnQsXSB9XSxcbiAgICBhbmltYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhbmNob3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFuY2hvckFsaWduOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhcHBlbmRUbzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sbGlzaW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3B1cEFsaWduOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXJnaW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9wZW46IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjbG9zZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIG9uQmx1cjogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2JsdXInLF0gfV0sXG4gICAgb25Gb2N1czogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2ZvY3VzJyxdIH1dLFxuICAgIGNhbmNlbDogW3sgdHlwZTogT3V0cHV0IH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIEtlbmRvIFVJIERhdGVSYW5nZSBjb21wb25lbnQgZm9yIEFuZ3VsYXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBfQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiB0ZW1wbGF0ZTogYFxuICogIDxrZW5kby1kYXRlcmFuZ2U+XG4gKiAgICAgIDxrZW5kby1kYXRlaW5wdXQga2VuZG9EYXRlUmFuZ2VTdGFydElucHV0IFsodmFsdWUpXT1cImRhdGVSYW5nZS5zdGFydFwiPjwva2VuZG8tZGF0ZWlucHV0PlxuICogICAgICA8a2VuZG8tZGF0ZWlucHV0IGtlbmRvRGF0ZVJhbmdlRW5kSW5wdXQgWyh2YWx1ZSldPVwiZGF0ZVJhbmdlLmVuZFwiPjwva2VuZG8tZGF0ZWlucHV0PlxuICogIDwva2VuZG8tZGF0ZXJhbmdlPlxuICogYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0ZVJhbmdlOiBhbnkgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5jbGFzcyBEYXRlUmFuZ2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaG93RGVmYXVsdCA9IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgaGFzQ29udGVudFBvcHVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UG9wdXAubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnNob3dEZWZhdWx0ID0gIXRoaXMuaGFzQ29udGVudFBvcHVwO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY29udGVudFBvcHVwLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RlZmF1bHQgPSAhdGhpcy5oYXNDb250ZW50UG9wdXA7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuRGF0ZVJhbmdlQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbRGF0ZVJhbmdlU2VydmljZV0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kYXRlcmFuZ2UnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPGtlbmRvLWRhdGVyYW5nZS1wb3B1cCAqbmdJZj1cInNob3dEZWZhdWx0XCI+PC9rZW5kby1kYXRlcmFuZ2UtcG9wdXA+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuRGF0ZVJhbmdlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNvbnRlbnRQb3B1cDogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbRGF0ZVJhbmdlUG9wdXBDb21wb25lbnQsXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERhdGVSYW5nZUlucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihhY3RpdmVSYW5nZUVuZCwgZGF0ZVJhbmdlU2VydmljZSwgaW5wdXQsIGVsZW1lbnQsIHJlbmRlcmVyLCB6b25lKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUmFuZ2VFbmQgPSBhY3RpdmVSYW5nZUVuZDtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlID0gZGF0ZVJhbmdlU2VydmljZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMubmF2aWdhdGVDYWxlbmRhck9uRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHsgfSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKCkgPT4geyB9KTtcbiAgICB9XG4gICAgZ2V0IGlzQWN0aXZlRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLmFjdGl2ZVJhbmdlRW5kID09PSB0aGlzLmFjdGl2ZVJhbmdlRW5kO1xuICAgIH1cbiAgICBnZXQgcG9wdXBDYWxlbmRhckFjdGl2YXRlZCgpIHtcbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLmRhdGVSYW5nZVNlcnZpY2UuZGF0ZVJhbmdlUG9wdXAkLnZhbHVlO1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHBvcHVwKSAmJiBpc1ByZXNlbnQocG9wdXAuY2FsZW5kYXIpO1xuICAgIH1cbiAgICBpbml0KCkge1xuICAgICAgICBpZiAodGhpcy5pbnB1dC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnNldFJhbmdlKHRoaXMuZ2V0UmFuZ2UodGhpcy5pbnB1dC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIFtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQub25CbHVyLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRlYWN0aXZhdGUoKSksXG4gICAgICAgICAgICB0aGlzLmlucHV0Lm9uRm9jdXMucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMucG9wdXBDYWxlbmRhckFjdGl2YXRlZCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFjdGl2YXRlKCkpLFxuICAgICAgICAgICAgdGhpcy5pbnB1dC52YWx1ZVVwZGF0ZS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy51cGRhdGVSYW5nZSh2YWx1ZSwgJ2NoYW5nZScpKSxcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZS5hY3RpdmVSYW5nZUVuZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0ZUNhbGVuZGFyT25Gb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQWN0aXZlRGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUFjdGl2ZUNsYXNzKHRoaXMuaXNBY3RpdmVFbmQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZVNlcnZpY2UuZGF0ZVJhbmdlUG9wdXAkLnN1YnNjcmliZShwb3B1cCA9PiB0aGlzLmluaXRQb3B1cChwb3B1cCkpLFxuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnJhbmdlJC5zdWJzY3JpYmUocmFuZ2UgPT4gdGhpcy51cGRhdGVJbnB1dFZhbHVlKHJhbmdlKSksXG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjbGljaycpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFjdGl2YXRlKCkpLFxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicpLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMudG9nZ2xlUG9wdXAoZXZlbnQgfHwge30pKVxuICAgICAgICBdLm1hcChzID0+IHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQocykpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVBvcHVwKCk7XG4gICAgfVxuICAgIGluaXRQb3B1cChwb3B1cCkge1xuICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlUG9wdXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBvcHVwLmFuY2hvcikge1xuICAgICAgICAgICAgcG9wdXAuYW5jaG9yID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgW1xuICAgICAgICAgICAgcG9wdXAuY2FuY2VsLnN1YnNjcmliZSgoKSA9PiB0aGlzLmlzQWN0aXZlRW5kICYmIHRoaXMuaW5wdXQuZm9jdXMoKSksXG4gICAgICAgICAgICBwb3B1cC5vbkZvY3VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZUFjdGl2ZUNsYXNzKHRoaXMuaXNBY3RpdmVFbmQpKSxcbiAgICAgICAgICAgIHBvcHVwLm9uQmx1ci5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kZWFjdGl2YXRlKCkpXG4gICAgICAgIF0ubWFwKHMgPT4gdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMuYWRkKHMpKTtcbiAgICB9XG4gICAgdW5zdWJzY3JpYmVQb3B1cCgpIHtcbiAgICAgICAgdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHsgfSk7XG4gICAgfVxuICAgIGFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVNlcnZpY2Uuc2V0QWN0aXZlUmFuZ2VFbmQodGhpcy5hY3RpdmVSYW5nZUVuZCk7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZS5hY3RpdmF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlKHRoaXMuaW5wdXQudmFsdWUsICdibHVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlU2VydmljZS5oYXNBY3RpdmVDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQWN0aXZlQ2xhc3MoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLmRlYWN0aXZhdGVQb3B1cCgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlUmFuZ2UodmFsdWUsIGNvcnJlY3RPbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UodmFsdWUsIGNvcnJlY3RPbik7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZURhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZS5zZXRSYW5nZShyYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9nZ2xlUG9wdXAoeyBhbHRLZXksIGtleUNvZGUgfSkge1xuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gS2V5cy5Fc2NhcGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZS5jYW5jZWxQb3B1cCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsdEtleSAmJiBrZXlDb2RlID09PSBLZXlzLkFycm93RG93bikge1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLmFjdGl2YXRlUG9wdXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb2N1c0FjdGl2ZURhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0LnZhbHVlICYmIHRoaXMuaXNBY3RpdmVFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlU2VydmljZS5zZXRGb2N1c2VkRGF0ZShjbG9uZURhdGUodGhpcy5pbnB1dC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvZ2dsZUFjdGl2ZUNsYXNzKHNob3cpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gc2hvdyA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnO1xuICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChuYXRpdmVFbGVtZW50ICYmIG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlclthY3Rpb25dKG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmstZGF0ZWlucHV0LXdyYXAnKSwgJ2stc3RhdGUtZm9jdXNlZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIG1hbmFnZXMgdGhlIGVuZCByYW5nZSBzZWxlY3Rpb24uXG4gKlxuICogPiBZb3UgY2FuIHVzZSB0aGUgRGF0ZVJhbmdlRW5kSW5wdXREaXJlY3RpdmUgb25seSB3aXRoIGEgRGF0ZUlucHV0IGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgRGF0ZVJhbmdlRW5kSW5wdXREaXJlY3RpdmUgZXh0ZW5kcyBEYXRlUmFuZ2VJbnB1dCB7XG4gICAgY29uc3RydWN0b3IocmFuZ2VTZXJ2aWNlLCBkYXRlSW5wdXQsIGVsZW1lbnQsIHJlbmRlcmVyLCB6b25lKSB7XG4gICAgICAgIHN1cGVyKCdlbmQnLCByYW5nZVNlcnZpY2UsIGRhdGVJbnB1dCwgZWxlbWVudCwgcmVuZGVyZXIsIHpvbmUpO1xuICAgICAgICB0aGlzLnJhbmdlU2VydmljZSA9IHJhbmdlU2VydmljZTtcbiAgICAgICAgdGhpcy5kYXRlSW5wdXQgPSBkYXRlSW5wdXQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYmVoYXZpb3Igb2YgdGhlIGNhbGVuZGFyIHdoZW4gdGhlIGFjdGl2ZSBlbmQgaXMgY2hhbmdlZCBvbiBpbnB1dCBmb2N1cy4gV2hlbiBlbmFibGVkLFxuICAgICAgICAgKiB0aGUgY2FsZW5kYXIgbmF2aWdhdGVzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXNlZCBpbnB1dC4gT3RoZXJ3aXNlLCB0aGUgY2FsZW5kYXIgZGlzcGxheXMgdGhlIGxhc3QgcGlja2VkIGRhdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBhdXRvbWF0aWMgbmF2aWdhdGlvbiBiZWhhdmlvciBvbiBpbnB1dCBmb2N1cyBpcyBkaXNhYmxlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogX0BDb21wb25lbnQoe1xuICAgICAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAqICA8aDU+VG9nZ2xlIGlucHV0IGZvY3VzIHRvIHNlZSB0aGUgY2FsZW5kYXIgbmF2aWdhdGluZyBiZXR3ZWVuIHJhbmdlIGVuZHMuPC9oNT5cbiAgICAgICAgICogIDxrZW5kby1kYXRlcmFuZ2U+XG4gICAgICAgICAqICAgICAgPGtlbmRvLWRhdGVpbnB1dCBrZW5kb0RhdGVSYW5nZVN0YXJ0SW5wdXQgW25hdmlnYXRlQ2FsZW5kYXJPbkZvY3VzXT1cInRydWVcIiBbKHZhbHVlKV09XCJzdGFydFwiPjwva2VuZG8tZGF0ZWlucHV0PlxuICAgICAgICAgKiAgICAgIDxrZW5kby1kYXRlaW5wdXQga2VuZG9EYXRlUmFuZ2VFbmRJbnB1dCBbbmF2aWdhdGVDYWxlbmRhck9uRm9jdXNdPVwidHJ1ZVwiIFsodmFsdWUpXT1cImVuZFwiPjwva2VuZG8tZGF0ZWlucHV0PlxuICAgICAgICAgKiAgPC9rZW5kby1kYXRlcmFuZ2U+XG4gICAgICAgICAqIGBcbiAgICAgICAgICogfSlcbiAgICAgICAgICogZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XG4gICAgICAgICAqICAgcHVibGljIHN0YXJ0OiBEYXRlID0gbmV3IERhdGUoMjAxOCwgMywgMTApO1xuICAgICAgICAgKiAgIHB1YmxpYyBlbmQ6IERhdGUgPSBuZXcgRGF0ZSgyMDE4LCAxMCwgMjApO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUNhbGVuZGFyT25Gb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yYW5nZVNlcnZpY2UucmVnaXN0ZXJFbmRJbnB1dCh0aGlzLmRhdGVJbnB1dCk7XG4gICAgICAgIHN1cGVyLmluaXQoKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZ2V0UmFuZ2UodmFsdWUsIGNvcnJlY3RPbikge1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmRhdGVJbnB1dDtcbiAgICAgICAgaWYgKCFpc0luUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzdGFydCB9ID0gdGhpcy5yYW5nZVNlcnZpY2Uuc2VsZWN0aW9uUmFuZ2UgfHwgRU1QVFlfU0VMRUNUSU9OUkFOR0U7XG4gICAgICAgIGNvbnN0IHNob3VsZENsYW1wID0gdGhpcy5hdXRvQ29ycmVjdE9uID09PSBjb3JyZWN0T24gJiYgaXNQcmVzZW50KHZhbHVlKSAmJiB2YWx1ZSA8IHN0YXJ0O1xuICAgICAgICByZXR1cm4gc2hvdWxkQ2xhbXAgPyBjbGFtcFJhbmdlKHZhbHVlKSA6IHsgc3RhcnQsIGVuZDogY2xvbmVEYXRlKHZhbHVlKSB9O1xuICAgIH1cbiAgICB1cGRhdGVJbnB1dFZhbHVlKHJhbmdlJCQxKSB7XG4gICAgICAgIGNvbnN0IHsgZW5kIH0gPSByYW5nZSQkMSB8fCBFTVBUWV9TRUxFQ1RJT05SQU5HRTtcbiAgICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpcy5kYXRlSW5wdXQ7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMuZGF0ZUlucHV0LnZhbHVlLCBlbmQpIHx8ICFpc0luUmFuZ2UoZW5kLCBtaW4sIG1heCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVJbnB1dC53cml0ZVZhbHVlKGNsb25lRGF0ZShlbmQpKTtcbiAgICAgICAgdGhpcy5kYXRlSW5wdXQubm90aWZ5KCk7XG4gICAgfVxufVxuRGF0ZVJhbmdlRW5kSW5wdXREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVSYW5nZUVuZElucHV0XSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGF0ZVJhbmdlRW5kSW5wdXREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEYXRlUmFuZ2VTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEYXRlSW5wdXRDb21wb25lbnQgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5EYXRlUmFuZ2VFbmRJbnB1dERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBhdXRvQ29ycmVjdE9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBuYXZpZ2F0ZUNhbGVuZGFyT25Gb2N1czogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgd2hpY2ggbWFuYWdlcyB0aGUgc3RhcnQgc2VsZWN0aW9uIHJhbmdlLlxuICpcbiAqID4gWW91IGNhbiB1c2UgdGhlIERhdGVSYW5nZVN0YXJ0SW5wdXREaXJlY3RpdmUgb25seSB3aXRoIGEgRGF0ZUlucHV0IGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgRGF0ZVJhbmdlU3RhcnRJbnB1dERpcmVjdGl2ZSBleHRlbmRzIERhdGVSYW5nZUlucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihyYW5nZVNlcnZpY2UsIGRhdGVJbnB1dCwgZWxlbWVudCwgcmVuZGVyZXIsIHpvbmUpIHtcbiAgICAgICAgc3VwZXIoJ3N0YXJ0JywgcmFuZ2VTZXJ2aWNlLCBkYXRlSW5wdXQsIGVsZW1lbnQsIHJlbmRlcmVyLCB6b25lKTtcbiAgICAgICAgdGhpcy5yYW5nZVNlcnZpY2UgPSByYW5nZVNlcnZpY2U7XG4gICAgICAgIHRoaXMuZGF0ZUlucHV0ID0gZGF0ZUlucHV0O1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGJlaGF2aW9yIG9mIHRoZSBjYWxlbmRhciB3aGVuIHRoZSBhY3RpdmUgZW5kIGlzIGNoYW5nZWQgb24gaW5wdXQgZm9jdXMuXG4gICAgICAgICAqIFdoZW4gZW5hYmxlZCwgdGhlIGNhbGVuZGFyIG5hdmlnYXRlcyB0byB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzZWQgaW5wdXQuIE90aGVyd2lzZSwgdGhlIGNhbGVuZGFyXG4gICAgICAgICAqIGRpc3BsYXlzIHRoZSBsYXN0IHBpY2tlZCBkYXRlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYXV0b21hdGljIG5hdmlnYXRpb24gYmVoYXZpb3Igb24gaW5wdXQgZm9jdXMgaXMgZGlzYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgPGg1PlRvZ2dsZSBpbnB1dCBmb2N1cyB0byBzZWUgdGhlIGNhbGVuZGFyIG5hdmlnYXRpbmcgYmV0d2VlbiByYW5nZSBlbmRzLjwvaDU+XG4gICAgICAgICAqICA8a2VuZG8tZGF0ZXJhbmdlPlxuICAgICAgICAgKiAgICAgIDxrZW5kby1kYXRlaW5wdXQga2VuZG9EYXRlUmFuZ2VTdGFydElucHV0IFtuYXZpZ2F0ZUNhbGVuZGFyT25Gb2N1c109XCJ0cnVlXCIgWyh2YWx1ZSldPVwic3RhcnRcIj48L2tlbmRvLWRhdGVpbnB1dD5cbiAgICAgICAgICogICAgICA8a2VuZG8tZGF0ZWlucHV0IGtlbmRvRGF0ZVJhbmdlRW5kSW5wdXQgW25hdmlnYXRlQ2FsZW5kYXJPbkZvY3VzXT1cInRydWVcIiBbKHZhbHVlKV09XCJlbmRcIj48L2tlbmRvLWRhdGVpbnB1dD5cbiAgICAgICAgICogIDwva2VuZG8tZGF0ZXJhbmdlPlxuICAgICAgICAgKiBgXG4gICAgICAgICAqIH0pXG4gICAgICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgIHB1YmxpYyBzdGFydDogRGF0ZSA9IG5ldyBEYXRlKDIwMTgsIDMsIDEwKTtcbiAgICAgICAgICogICBwdWJsaWMgZW5kOiBEYXRlID0gbmV3IERhdGUoMjAxOCwgMTAsIDIwKTtcbiAgICAgICAgICogfVxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF2aWdhdGVDYWxlbmRhck9uRm9jdXMgPSBmYWxzZTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucmFuZ2VTZXJ2aWNlLnJlZ2lzdGVyU3RhcnRJbnB1dCh0aGlzLmRhdGVJbnB1dCk7XG4gICAgICAgIHN1cGVyLmluaXQoKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZ2V0UmFuZ2UodmFsdWUsIGNvcnJlY3RPbikge1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmRhdGVJbnB1dDtcbiAgICAgICAgaWYgKCFpc0luUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBlbmQgfSA9IHRoaXMucmFuZ2VTZXJ2aWNlLnNlbGVjdGlvblJhbmdlIHx8IEVNUFRZX1NFTEVDVElPTlJBTkdFO1xuICAgICAgICBjb25zdCBzaG91bGRDbGFtcCA9IHRoaXMuYXV0b0NvcnJlY3RPbiA9PT0gY29ycmVjdE9uICYmIGVuZCAmJiB2YWx1ZSA+IGVuZDtcbiAgICAgICAgcmV0dXJuIHNob3VsZENsYW1wID8gY2xhbXBSYW5nZSh2YWx1ZSkgOiB7IHN0YXJ0OiBjbG9uZURhdGUodmFsdWUpLCBlbmQgfTtcbiAgICB9XG4gICAgdXBkYXRlSW5wdXRWYWx1ZShyYW5nZSQkMSkge1xuICAgICAgICBjb25zdCB7IHN0YXJ0IH0gPSByYW5nZSQkMSB8fCBFTVBUWV9TRUxFQ1RJT05SQU5HRTtcbiAgICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpcy5kYXRlSW5wdXQ7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMuZGF0ZUlucHV0LnZhbHVlLCBzdGFydCkgfHwgIWlzSW5SYW5nZShzdGFydCwgbWluLCBtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlSW5wdXQud3JpdGVWYWx1ZShjbG9uZURhdGUoc3RhcnQpKTtcbiAgICAgICAgdGhpcy5kYXRlSW5wdXQubm90aWZ5KCk7XG4gICAgfVxufVxuRGF0ZVJhbmdlU3RhcnRJbnB1dERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRGF0ZVJhbmdlU3RhcnRJbnB1dF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVSYW5nZVN0YXJ0SW5wdXREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEYXRlUmFuZ2VTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEYXRlSW5wdXRDb21wb25lbnQgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5EYXRlUmFuZ2VTdGFydElucHV0RGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGF1dG9Db3JyZWN0T246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5hdmlnYXRlQ2FsZW5kYXJPbkZvY3VzOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB3aGljaCBtYW5hZ2VzIHRoZSBNdWx0aVZpZXdDYWxlbmRhciByYW5nZSBzZWxlY3Rpb24uXG4gKi9cbmNsYXNzIERhdGVSYW5nZVNlbGVjdGlvbkRpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoY2FsZW5kYXIsIGNkciwgZWxlbWVudCwgcmVuZGVyZXIsIGRhdGVSYW5nZVNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlID0gZGF0ZVJhbmdlU2VydmljZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgYXV0by1jb3JyZWN0aW9uIGJlaGF2aW9yLiBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGVuZCBkYXRlLFxuICAgICAgICAgKiB0aGUgZGlyZWN0aXZlIGZpeGVzIHRoZSBkYXRlIHJhbmdlIHRvIGEgc2luZ2xlIGRhdGUgZWl0aGVyIG9uIGlucHV0IGNoYW5nZSBvciBvbiBibHVyXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgYXV0b2NvcnJlY3RfZGF0ZXJhbmdlICV9I3RvYy1jb25maWd1cmluZy10aGUtY2FsZW5kYXItc2VsZWN0aW9uLWRpcmVjdGl2ZSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYXV0by1jb3JyZWN0aW9uIGlzIHRyaWdnZXJlZCBvbiBjaGFuZ2UuXG4gICAgICAgICAqIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciwgc2V0IHRoZSBgYXV0b0NvcnJlY3RPbmAgcHJvcGVydHkgdG8gYG5vbmVgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRvQ29ycmVjdE9uID0gJ2NoYW5nZSc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgcmFuZ2UgZW5kIGlzIGNoYW5nZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0b1xuICAgICAgICAgKiB0aGUgc2VjdGlvbiBvbiBbZXZlbnRzXSh7JSBzbHVnIG92ZXJ2aWV3X211bHRpdmlld2NhbGVuZGFyICV9I3RvYy1ldmVudHMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVSYW5nZUVuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBjaGFuZ2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG9cbiAgICAgICAgICogdGhlIHNlY3Rpb24gb24gW2V2ZW50c10oeyUgc2x1ZyBvdmVydmlld19tdWx0aXZpZXdjYWxlbmRhciAlfSN0b2MtZXZlbnRzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVNlcnZpY2UgPSB0aGlzLmRhdGVSYW5nZVNlcnZpY2UgfHwgbmV3IERhdGVSYW5nZVNlcnZpY2UoKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJywgJ3RydWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugb2YgdGhlIGNhbGVuZGFyLiBXaGVuIGEgbmV3IHJhbmdlIGlzIHNldCxcbiAgICAgKiB0aGUgY29ubmVjdGVkIERhdGVSYW5nZVNlcnZpY2Ugbm90aWZpZXMgYWxsIHJlbGF0ZWQgcGFydGllcy5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyID8gdGhpcy5jYWxlbmRhci5zZWxlY3Rpb25SYW5nZSA6IG51bGw7XG4gICAgfVxuICAgIHNldCBzZWxlY3Rpb25SYW5nZShyYW5nZSQkMSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFcXVhbENhbGVuZGFyUmFuZ2UocmFuZ2UkJDEpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlJCQxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWxSYW5nZSh0aGlzLmRhdGVSYW5nZVNlcnZpY2Uuc2VsZWN0aW9uUmFuZ2UsIHJhbmdlJCQxKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnNldFJhbmdlKHJhbmdlJCQxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWREYXRlKHJhbmdlJCQxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBhY3RpdmUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gcmFuZ2UuIFRoaXMgb3B0aW9uIGRldGVybWluZXMgd2hpY2ggcmFuZ2UgZW5kIHdpbGwgYmUgdXBkYXRlZCBvblxuICAgICAqIHVzZXIgaW50ZXJhY3Rpb24uIFdoZW4gYSBuZXcgYWN0aXZlIGVuZCBpcyBzZXQsIHRoZSBjb25uZWN0ZWQgRGF0ZVJhbmdlU2VydmljZSBub3RpZmllcyBhbGwgcmVsYXRlZCBwYXJ0aWVzLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCBlbmQgb2YgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsIGJlIG1hcmtlZCBhcyBhY3RpdmUuIFRoZSBhY3RpdmUgZW5kIGdldHMgbW9kaWZpZWQgdXBvbiB1c2VyXG4gICAgICogaW50ZXJhY3Rpb24uIFdoZW4gYSBuZXcgYWN0aXZlIGVuZCBpcyBzZXQsIHRoZSB3aXJlZCBEYXRlUmFuZ2VTZXJ2aWNlIG5vdGlmaWVzIGFsbCByZWxhdGVkIGNvbXBvbmVudHMuIEZvclxuICAgICAqIGV4YW1wbGUsIHRoZSBzdGFydCBhbmQgZW5kIERhdGVJbnB1dCBjb21wb25lbnRzLlxuICAgICAqXG4gICAgICogPiBJZiB0aGUgc2VsZWN0aW9uIHJhbmdlIGlzIHVuZGVmaW5lZCwgdGhlIHZhbHVlIGlzIGlnbm9yZWQuXG4gICAgICovXG4gICAgZ2V0IGFjdGl2ZVJhbmdlRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhci5hY3RpdmVSYW5nZUVuZDtcbiAgICB9XG4gICAgc2V0IGFjdGl2ZVJhbmdlRW5kKGFjdGl2ZVJhbmdlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGVSYW5nZVNlcnZpY2UuYWN0aXZlUmFuZ2VFbmQgPT09IGFjdGl2ZVJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxlbmRhci5hY3RpdmVSYW5nZUVuZCA9IGFjdGl2ZVJhbmdlO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVNlcnZpY2Uuc2V0QWN0aXZlUmFuZ2VFbmQoYWN0aXZlUmFuZ2UpO1xuICAgIH1cbiAgICBnZXQgY2FsZW5kYXJSYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmFuZ2UgfHwgRU1QVFlfU0VMRUNUSU9OUkFOR0U7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBjb25zdCBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZVNlcnZpY2UgPSB0aGlzLmRhdGVSYW5nZVNlcnZpY2U7XG4gICAgICAgIGNhbGVuZGFyLm1pbiA9IGVpdGhlcihkYXRlUmFuZ2VTZXJ2aWNlLm1pbiwgY2FsZW5kYXIubWluKTtcbiAgICAgICAgY2FsZW5kYXIubWF4ID0gZWl0aGVyKGRhdGVSYW5nZVNlcnZpY2UubWF4LCBjYWxlbmRhci5tYXgpO1xuICAgICAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbnMoY2FsZW5kYXIuY2VsbEVudGVyLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMuaGFuZGxlSG92ZXIodmFsdWUpKSwgY2FsZW5kYXIudmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5oYW5kbGVDaGFuZ2UodmFsdWUpKSwgZGF0ZVJhbmdlU2VydmljZS5mb2N1c2VkRGF0ZSQuc3Vic2NyaWJlKGZvY3VzZWREYXRlID0+IHtcbiAgICAgICAgICAgIGlmICghaXNFcXVhbChjYWxlbmRhci5mb2N1c2VkRGF0ZSwgZm9jdXNlZERhdGUpKSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXIuZm9jdXNlZERhdGUgPSBmb2N1c2VkRGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIGRhdGVSYW5nZVNlcnZpY2UuYWN0aXZlUmFuZ2VFbmQkLnN1YnNjcmliZShyYW5nZUVuZCA9PiB7XG4gICAgICAgICAgICBpZiAoY2FsZW5kYXIuYWN0aXZlUmFuZ2VFbmQgPT09IHJhbmdlRW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsZW5kYXIuYWN0aXZlUmFuZ2VFbmQgPSByYW5nZUVuZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUmFuZ2VFbmRDaGFuZ2UuZW1pdChyYW5nZUVuZCk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSksIGRhdGVSYW5nZVNlcnZpY2UucmFuZ2UkLnN1YnNjcmliZShyYW5nZSQkMSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNFcXVhbENhbGVuZGFyUmFuZ2UocmFuZ2UkJDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2NlcHRBbmRFbWl0KHJhbmdlJCQxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9jdXNlZERhdGUocmFuZ2UkJDEpO1xuICAgICAgICB9KSwgZnJvbUV2ZW50KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnYmx1cicpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZUJsdXIoKSkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgYWRkU3Vic2NyaXB0aW9ucyguLi5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMubWFwKHMgPT4gdGhpcy5jYWxlbmRhclN1YnNjcmlwdGlvbnMuYWRkKHMpKTtcbiAgICB9XG4gICAgaXNFcXVhbENhbGVuZGFyUmFuZ2UocmFuZ2UkJDEpIHtcbiAgICAgICAgcmV0dXJuIGlzRXF1YWxSYW5nZSh0aGlzLmNhbGVuZGFyLnNlbGVjdGlvblJhbmdlLCByYW5nZSQkMSk7XG4gICAgfVxuICAgIGhhbmRsZUJsdXIoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5jYWxlbmRhclJhbmdlO1xuICAgICAgICBjb25zdCBhdXRvQ29ycmVjdCA9IHRoaXMuYXV0b0NvcnJlY3RPbiA9PT0gJ2JsdXInICYmIHN0YXJ0ICE9PSBudWxsICYmIGVuZCAhPT0gbnVsbCAmJiBlbmQgPCBzdGFydDtcbiAgICAgICAgaWYgKGF1dG9Db3JyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZVNlcnZpY2Uuc2V0UmFuZ2UoY2xhbXBSYW5nZShzdGFydCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUNoYW5nZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlO1xuICAgICAgICBjb25zdCBhdXRvQ29ycmVjdCA9IHRoaXMuYXV0b0NvcnJlY3RPbiA9PT0gJ2NoYW5nZScgJiYgdGhpcy5zaG91bGRBdXRvQ29ycmVjdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVuZCA9IHRoaXMuY2FsZW5kYXIuYWN0aXZlUmFuZ2VFbmQgIT09ICdlbmQnID8gJ2VuZCcgOiAoYXV0b0NvcnJlY3QgPyAnZW5kJyA6ICdzdGFydCcpO1xuICAgICAgICBjb25zdCByYW5nZSQkMSA9IGF1dG9Db3JyZWN0ID8gY2xhbXBSYW5nZSh2YWx1ZSkgOiB0aGlzLnVwZGF0ZVJhbmdlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc0VxdWFsUmFuZ2Uoc2VydmljZS5zZWxlY3Rpb25SYW5nZSwgcmFuZ2UkJDEpKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2VwdEFuZEVtaXQocmFuZ2UkJDEpO1xuICAgICAgICAgICAgc2VydmljZS5zZXRBY3RpdmVSYW5nZUVuZChhY3RpdmVFbmQpO1xuICAgICAgICAgICAgc2VydmljZS5zZXRSYW5nZShyYW5nZSQkMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlSG92ZXIodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcGxldGVSYW5nZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmNhbGVuZGFyUmFuZ2U7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJhbmdlRW5kID0gdGhpcy5jYWxlbmRhci5hY3RpdmVSYW5nZUVuZDtcbiAgICAgICAgY29uc3QgdXBkYXRlUmFuZ2UgPSAoc3RhcnQgJiYgYWN0aXZlUmFuZ2VFbmQgPT09ICdlbmQnKSB8fCAoZW5kICYmIGFjdGl2ZVJhbmdlRW5kID09PSAnc3RhcnQnKTtcbiAgICAgICAgaWYgKHVwZGF0ZVJhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlKHRoaXMudXBkYXRlUmFuZ2UodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNDb21wbGV0ZVJhbmdlKCkge1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMuZGF0ZVJhbmdlU2VydmljZS5zZWxlY3Rpb25SYW5nZSB8fCBFTVBUWV9TRUxFQ1RJT05SQU5HRTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3RhcnQpICYmIEJvb2xlYW4oZW5kKTtcbiAgICB9XG4gICAgc2hvdWxkQXV0b0NvcnJlY3QodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBlbmQsIHN0YXJ0IH0gPSB0aGlzLmNhbGVuZGFyUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyLmFjdGl2ZVJhbmdlRW5kICE9PSAnZW5kJykge1xuICAgICAgICAgICAgcmV0dXJuIGVuZCAhPT0gbnVsbCAmJiB2YWx1ZSA+IGVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydCAhPT0gbnVsbCAmJiB2YWx1ZSA8IHN0YXJ0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUZvY3VzZWREYXRlKHJhbmdlJCQxKSB7XG4gICAgICAgIGlmICghcmFuZ2UkJDEgfHwgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLmZvY3VzZWREYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTZXJ2aWNlLnNldEZvY3VzZWREYXRlKHJhbmdlJCQxLnN0YXJ0IHx8IHJhbmdlJCQxLmVuZCk7XG4gICAgfVxuICAgIHVwZGF0ZVJhbmdlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgZW5kLCBzdGFydCB9ID0gdGhpcy5jYWxlbmRhclJhbmdlO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhci5hY3RpdmVSYW5nZUVuZCAhPT0gJ2VuZCcgPyAoeyBzdGFydDogdmFsdWUsIGVuZCB9KSA6ICh7IHN0YXJ0LCBlbmQ6IHZhbHVlIH0pO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb25SYW5nZShyYW5nZSQkMSkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyLnNlbGVjdGlvblJhbmdlID0gcmFuZ2UkJDE7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIud3JpdGVWYWx1ZShudWxsKTtcbiAgICB9XG4gICAgYWNjZXB0QW5kRW1pdChyYW5nZSQkMSkge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlJCQxKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZUNoYW5nZS5lbWl0KHJhbmdlJCQxKTtcbiAgICB9XG59XG5EYXRlUmFuZ2VTZWxlY3Rpb25EaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVSYW5nZVNlbGVjdGlvbl0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVSYW5nZVNlbGVjdGlvbkRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IE11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50IH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBEYXRlUmFuZ2VTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuRGF0ZVJhbmdlU2VsZWN0aW9uRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGF1dG9Db3JyZWN0T246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNlbGVjdGlvblJhbmdlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVSYW5nZUVuZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aXZlUmFuZ2VFbmRDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBzZWxlY3Rpb25SYW5nZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4IGRpcmVjdGl2ZS1zZWxlY3RvciAqL1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEtGb3JPZkNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKCRpbXBsaWNpdCwga0Zvck9mLCBpbmRleCwgY291bnQpIHtcbiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAkaW1wbGljaXQ7XG4gICAgICAgIHRoaXMua0Zvck9mID0ga0Zvck9mO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICB9XG4gICAgZ2V0IGZpcnN0KCkgeyByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDsgfVxuICAgIGdldCBsYXN0KCkgeyByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5jb3VudCAtIDE7IH1cbiAgICBnZXQgZXZlbigpIHsgcmV0dXJuIHRoaXMuaW5kZXggJSAyID09PSAwOyB9XG4gICAgZ2V0IG9kZCgpIHsgcmV0dXJuICF0aGlzLmV2ZW47IH1cbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBLRm9yT2Yge1xuICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyLCBfdGVtcGxhdGUsIF9kaWZmZXJzKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIgPSBfdmlld0NvbnRhaW5lcjtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSBfdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVycztcbiAgICAgICAgdGhpcy5fZGlmZmVyID0gbnVsbDtcbiAgICB9XG4gICAgc2V0IGtGb3JUZW1wbGF0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoJ2tGb3JPZicgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzLmtGb3JPZi5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlmZmVyIHx8ICF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5rRm9yVHJhY2tCeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7dmFsdWV9JyBvZiB0eXBlICcke2dldFR5cGVOYW1lRm9yRGVidWdnaW5nKHZhbHVlKX0nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpZmZlcikge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMua0Zvck9mKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF9hcHBseUNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXdDb250YWluZXJMZW5ndGggPSB0aGlzLl92aWV3Q29udGFpbmVyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMua0Zvck9mLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdHVwbGVzID0ge307XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaE9wZXJhdGlvbigocmVjb3JkLCBfLCBjdXJyZW50SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0dXBsZXNbY3VycmVudEluZGV4XSA9IHJlY29yZC5pdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHZpZXdDb250YWluZXJMZW5ndGg7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlLCBuZXcgS0Zvck9mQ29udGV4dChudWxsLCB0aGlzLmtGb3JPZiwgLTEsIC0xKSwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpID4gZGF0YUxlbmd0aDsgaS0tKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLnJlbW92ZShpIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92aWV3Q29udGFpbmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5fdmlld0NvbnRhaW5lci5nZXQoaSk7XG4gICAgICAgICAgICB2aWV3LmNvbnRleHQuaW5kZXggPSBpO1xuICAgICAgICAgICAgdmlldy5jb250ZXh0LmNvdW50ID0gbGVuZ3RoO1xuICAgICAgICAgICAgdmlldy5jb250ZXh0LiRpbXBsaWNpdCA9IHR1cGxlc1tpXSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuS0Zvck9mLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW2tGb3JdW2tGb3JPZl0nIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuS0Zvck9mLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LFxuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSxcbiAgICB7IHR5cGU6IEl0ZXJhYmxlRGlmZmVycyB9XG5dO1xuS0Zvck9mLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGtGb3JPZjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAga0ZvclRyYWNrQnk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGtGb3JUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV1cbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcodHlwZSkge1xuICAgIHJldHVybiB0eXBlLm5hbWUgfHwgdHlwZW9mIHR5cGU7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBIZWFkZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGJ1cywgY2RyLCBsb2NhbGl6YXRpb24sIGludGwsIGRpc2FibGVkRGF0ZXNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICB0aGlzLmNkciA9IGNkcjtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuaW50bCA9IGludGw7XG4gICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1NlcnZpY2UgPSBkaXNhYmxlZERhdGVzU2VydmljZTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMudG9kYXlBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm1pbiA9IG5ldyBEYXRlKE1JTl9EQVRFKTtcbiAgICAgICAgdGhpcy5tYXggPSBuZXcgRGF0ZShNQVhfREFURSk7XG4gICAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSAxO1xuICAgICAgICB0aGlzLnRvZGF5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIGdldCBnZXRDb21wb25lbnRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgIC5hZGQodGhpcy5pbnRsLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMuaW50bENoYW5nZS5iaW5kKHRoaXMpKSlcbiAgICAgICAgICAgIC5hZGQodGhpcy5sb2NhbGl6YXRpb24uY2hhbmdlcy5zdWJzY3JpYmUodGhpcy5sMTBuQ2hhbmdlLmJpbmQodGhpcykpKVxuICAgICAgICAgICAgLmFkZCh0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMuc2V0VG9kYXlBdmFpbGFiaWxpdHkuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhfKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmJ1cy5zZXJ2aWNlKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlVmlld1ZhbHVlID0gQ2FsZW5kYXJWaWV3RW51bVt0aGlzLmFjdGl2ZVZpZXddO1xuICAgICAgICB0aGlzLnRvZGF5TWVzc2FnZSA9IHRoaXMubG9jYWxpemF0aW9uLmdldCgndG9kYXknKTtcbiAgICAgICAgdGhpcy5zZXRUb2RheUF2YWlsYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLm5hdmlnYXRlID0gdGhpcy5idXMuY2FuTW92ZVVwKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmdldFRpdGxlKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaGFuZGxlVG9kYXlDbGljaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRvZGF5QXZhaWxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idXMubW92ZVRvQm90dG9tKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIHRoaXMudG9kYXkuZW1pdChkYXRlSW5SYW5nZShnZXRUb2RheSgpLCB0aGlzLm1pbiwgdGhpcy5tYXgpKTtcbiAgICB9XG4gICAgaGFuZGxlTmF2aWdhdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idXMubW92ZVVwKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgfVxuICAgIGludGxDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnREYXRlICYmIHRoaXMuYnVzLnNlcnZpY2UodGhpcy5hY3RpdmVWaWV3KSkge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGwxMG5DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudG9kYXlNZXNzYWdlID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCd0b2RheScpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgZ2V0VGl0bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50RGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmJ1cy5zZXJ2aWNlKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGNvbnN0IHRha2UgPSB0aGlzLnJhbmdlTGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBzZXJ2aWNlLnRpdGxlKHRoaXMuY3VycmVudERhdGUpO1xuICAgICAgICBjb25zdCBuZXh0RGF0ZSA9IHNlcnZpY2UuYWRkVG9EYXRlKHRoaXMuY3VycmVudERhdGUsIHRha2UpO1xuICAgICAgICBpZiAodGFrZSA8IDEgfHwgIXNlcnZpY2UuaXNJblJhbmdlKG5leHREYXRlLCB0aGlzLm1pbiwgdGhpcy5tYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RpdGxlfSAtICR7c2VydmljZS50aXRsZShuZXh0RGF0ZSl9YDtcbiAgICB9XG4gICAgc2V0VG9kYXlBdmFpbGFiaWxpdHkoKSB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gZ2V0VG9kYXkoKTtcbiAgICAgICAgY29uc3QgaXNUb2RheUluUmFuZ2UgPSBpc0luUmFuZ2UodG9kYXksIGdldERhdGUodGhpcy5taW4pLCBnZXREYXRlKHRoaXMubWF4KSk7XG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmlzRGF0ZURpc2FibGVkKHRvZGF5KTtcbiAgICAgICAgdGhpcy50b2RheUF2YWlsYWJsZSA9IGlzVG9kYXlJblJhbmdlICYmICFpc0Rpc2FibGVkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG59XG5IZWFkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNhbGVuZGFyLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBjbGFzcz1cImstYnV0dG9uIGstYmFyZSBrLXRpdGxlXCIgW2NsYXNzLmstc3RhdGUtZGlzYWJsZWRdPVwiIW5hdmlnYXRlXCJcbiAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgY2xpY2s6IGhhbmRsZU5hdmlnYXRpb25cbiAgICAgICAgfVwiXG4gICAgICAgIFtzY29wZV09XCJ0aGlzXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhdGVtcGxhdGVSZWZcIj57e3RpdGxlfX08L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIFtuZ0lmXT1cInRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogdGl0bGUsIGFjdGl2ZVZpZXc6IGFjdGl2ZVZpZXdWYWx1ZSwgZGF0ZTogY3VycmVudERhdGUgfVwiXG4gICAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImstdG9kYXlcIiBbY2xhc3Muay1zdGF0ZS1kaXNhYmxlZF09XCIhdG9kYXlBdmFpbGFibGVcIlxuICAgICAgICBba2VuZG9FdmVudHNPdXRzaWRlQW5ndWxhcl09XCJ7XG4gICAgICAgICAgICBjbGljazogaGFuZGxlVG9kYXlDbGlja1xuICAgICAgICB9XCJcbiAgICAgICAgW3Njb3BlXT1cInRoaXNcIj5cbiAgICAgICAge3t0b2RheU1lc3NhZ2V9fVxuICAgIDwvc3Bhbj5cbiAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5IZWFkZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBCdXNWaWV3U2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEludGxTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEaXNhYmxlZERhdGVzU2VydmljZSB9XG5dO1xuSGVhZGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGFjdGl2ZVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGN1cnJlbnREYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1heDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmFuZ2VMZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b2RheTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGdldENvbXBvbmVudENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jYWxlbmRhci1oZWFkZXJcIixdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgV2Vla05hbWVzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoaW50bCkge1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgIH1cbiAgICBnZXRXZWVrTmFtZXMoaW5jbHVkZVdlZWtOdW1iZXIgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB3ZWVrTmFtZXMgPSBzaGlmdFdlZWtOYW1lcyh0aGlzLmludGwuZGF0ZUZvcm1hdE5hbWVzKHsgbmFtZVR5cGU6ICdzaG9ydCcsIHR5cGU6ICdkYXlzJyB9KSwgdGhpcy5pbnRsLmZpcnN0RGF5KCkpO1xuICAgICAgICByZXR1cm4gaW5jbHVkZVdlZWtOdW1iZXIgPyBbJyddLmNvbmNhdCh3ZWVrTmFtZXMpIDogd2Vla05hbWVzO1xuICAgIH1cbn1cbldlZWtOYW1lc1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbldlZWtOYW1lc1NlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgVmlld0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoYnVzLCBpbnRsLCBjZHIsIHdlZWtTZXJ2aWNlLCBlbGVtZW50LCB6b25lLCByZW5kZXJlciwgZGlzYWJsZWREYXRlc1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgICAgIHRoaXMuaW50bCA9IGludGw7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLndlZWtTZXJ2aWNlID0gd2Vla1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzU2VydmljZSA9IGRpc2FibGVkRGF0ZXNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9ICd2ZXJ0aWNhbCc7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jZWxsRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2VsbExlYXZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLndlZWtOYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbFNwYW4gPSAwO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzID0gW107XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgLmFkZCh0aGlzLmludGwuY2hhbmdlcy5zdWJzY3JpYmUodGhpcy5pbnRsQ2hhbmdlLmJpbmQodGhpcykpKVxuICAgICAgICAgICAgLmFkZCh0aGlzLmRpc2FibGVkRGF0ZXNTZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMuZGlzYWJsZWREYXRlc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIGdldCB3ZWVrTnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93V2Vla051bWJlcnMgJiYgdGhpcy5hY3RpdmVWaWV3ID09PSBDYWxlbmRhclZpZXdFbnVtLm1vbnRoO1xuICAgIH1cbiAgICBzZXQgd2Vla051bWJlcihzaG93V2Vla051bWJlcnMpIHtcbiAgICAgICAgdGhpcy5zaG93V2Vla051bWJlcnMgPSBzaG93V2Vla051bWJlcnM7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSB0aGlzLmJ1cy5zZXJ2aWNlKHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVXZWVrTmFtZXMgPSB0aGlzLmlzSG9yaXpvbnRhbCgpICYmIHRoaXMud2Vla05hbWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKGdlbmVyYXRlV2Vla05hbWVzICYmIChjaGFuZ2VzLndlZWtOdW1iZXIgfHwgY2hhbmdlcy5kaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtOYW1lcyA9IHRoaXMud2Vla1NlcnZpY2UuZ2V0V2Vla05hbWVzKHRoaXMud2Vla051bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xTcGFuID0gdGhpcy5zZXJ2aWNlLnJvd0xlbmd0aCh0aGlzLndlZWtOdW1iZXIpO1xuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5zZXJ2aWNlLnRpdGxlKHRoaXMudmlld0RhdGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcbiAgICAgICAgaWYgKGNoYW5nZXMuYWN0aXZlVmlldykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2VsbEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLmZvckVhY2godW5zdWJzY3JpYmVDYWxsYmFjayA9PiB1bnN1YnNjcmliZUNhbGxiYWNrKCkpO1xuICAgIH1cbiAgICBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpc01vbnRoVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlldyA9PT0gQ2FsZW5kYXJWaWV3RW51bS5tb250aDtcbiAgICB9XG4gICAgZmlyc3REYXRlKHJvd0N0eCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmZpcnN0V2Vla0RhdGVDb250ZXh0KHJvd0N0eCk7XG4gICAgICAgIHJldHVybiBjdHggPyBjdHgudmFsdWUgOiBudWxsO1xuICAgIH1cbiAgICBnZXRXZWVrTnVtYmVyKGRhdGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLndlZWtOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrSW5ZZWFyKGRhdGUsIHRoaXMuaW50bC5maXJzdERheSgpKTtcbiAgICB9XG4gICAgZ2V0V2Vla051bWJlckNvbnRleHQocm93Q3R4KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuZmlyc3RXZWVrRGF0ZUNvbnRleHQocm93Q3R4KTtcbiAgICAgICAgaWYgKCF0aGlzLndlZWtOdW1iZXIgfHwgIWN0eCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2Vla051bWJlciA9IHdlZWtJblllYXIoY3R4LnZhbHVlLCB0aGlzLmludGwuZmlyc3REYXkoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiB3ZWVrTnVtYmVyLFxuICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICBpc1dlZWtlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHdlZWtOdW1iZXIsXG4gICAgICAgICAgICB2YWx1ZTogY2xvbmVEYXRlKGN0eC52YWx1ZSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0U3R5bGVzKGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgeyBpc1JhbmdlRW5kLCBpc1JhbmdlU3RhcnQgfSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGlzRW5kQWN0aXZlID0gdGhpcy5hY3RpdmVSYW5nZUVuZCA9PT0gJ2VuZCcgJiYgaXNSYW5nZUVuZDtcbiAgICAgICAgY29uc3QgaXNTdGFydEFjdGl2ZSA9IHRoaXMuYWN0aXZlUmFuZ2VFbmQgPT09ICdzdGFydCcgJiYgaXNSYW5nZVN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q2xhc3NPYmplY3Qoe1xuICAgICAgICAgICAgJ2stcmFuZ2UtZW5kJzogaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICdrLXJhbmdlLW1pZCc6IGNvbnRleHQuaXNSYW5nZU1pZCxcbiAgICAgICAgICAgICdrLXJhbmdlLXNwbGl0LWVuZCc6IGNvbnRleHQuaXNSYW5nZVNwbGl0RW5kLFxuICAgICAgICAgICAgJ2stcmFuZ2Utc3BsaXQtc3RhcnQnOiBjb250ZXh0LmlzUmFuZ2VTcGxpdFN0YXJ0LFxuICAgICAgICAgICAgJ2stcmFuZ2Utc3RhcnQnOiBpc1JhbmdlU3RhcnQsXG4gICAgICAgICAgICAnay1zdGF0ZS1hY3RpdmUnOiBpc1N0YXJ0QWN0aXZlIHx8IGlzRW5kQWN0aXZlLFxuICAgICAgICAgICAgJ2stc3RhdGUtZm9jdXNlZCc6IHRoaXMuaXNBY3RpdmUgJiYgY29udGV4dC5pc0ZvY3VzZWQsXG4gICAgICAgICAgICAnay1zdGF0ZS1zZWxlY3RlZCc6IGNvbnRleHQuaXNTZWxlY3RlZCB8fCBpc1JhbmdlU3RhcnQgfHwgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICdrLXRvZGF5JzogY29udGV4dC5pc1RvZGF5LFxuICAgICAgICAgICAgJ2std2Vla2VuZCc6IGNvbnRleHQuaXNXZWVrZW5kLFxuICAgICAgICAgICAgJ2stc3RhdGUtZGlzYWJsZWQnOiBjb250ZXh0LmlzRGlzYWJsZWRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRhYmxlQ2VsbEluZGV4KHJvd0luZGV4LCBjZWxsSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGAke3Jvd0luZGV4fToke2NlbGxJbmRleH1gO1xuICAgIH1cbiAgICBmaXJzdFdlZWtEYXRlQ29udGV4dChyb3dDdHgpIHtcbiAgICAgICAgaWYgKCF0aGlzLndlZWtOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBsZXQgY3R4ID0gcm93Q3R4W2lkeF07XG4gICAgICAgIHdoaWxlICghY3R4ICYmIGlkeCA8IHJvd0N0eC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGN0eCA9IHJvd0N0eFsrK2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gICAgdXBkYXRlRGF0YSgpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRoaXMuc2VsZWN0ZWREYXRlIHx8IGdldFRvZGF5KCk7XG4gICAgICAgIGNvbnN0IHZpZXdEYXRlID0gc2V0VGltZSh0aGlzLnZpZXdEYXRlLCB0aW1lKTtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zZXJ2aWNlLmRhdGEoe1xuICAgICAgICAgICAgY2VsbFVJRDogdGhpcy5jZWxsVUlELFxuICAgICAgICAgICAgZm9jdXNlZERhdGU6IHRoaXMuZm9jdXNlZERhdGUsXG4gICAgICAgICAgICBpc0FjdGl2ZVZpZXc6ICF0aGlzLmJ1cy5jYW5Nb3ZlRG93bih0aGlzLmFjdGl2ZVZpZXcpLFxuICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgIG1pbjogdGhpcy5taW4sXG4gICAgICAgICAgICBzZWxlY3RlZERhdGU6IHRoaXMuc2VsZWN0ZWREYXRlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IHRoaXMuc2VsZWN0aW9uUmFuZ2UsXG4gICAgICAgICAgICB2aWV3RGF0ZTogdmlld0RhdGUsXG4gICAgICAgICAgICBpc0RhdGVEaXNhYmxlZDogdGhpcy5kaXNhYmxlZERhdGVzU2VydmljZS5pc0RhdGVEaXNhYmxlZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50bENoYW5nZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtOYW1lcyA9IHRoaXMud2Vla1NlcnZpY2UuZ2V0V2Vla05hbWVzKHRoaXMud2Vla051bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGRpc2FibGVkRGF0ZXNDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgYmluZEV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmRvbUV2ZW50cy5wdXNoKHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdtb3VzZW92ZXInLCB0aGlzLmNlbGxNb3VzZW92ZXJIYW5kbGVyLmJpbmQodGhpcykpLCB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnbW91c2VsZWF2ZScsIHRoaXMubW91c2VMZWF2ZUhhbmRsZXIuYmluZCh0aGlzKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsIHRoaXMuY2xpY2tIYW5kbGVyLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgY2xpY2tIYW5kbGVyKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY2xvc2VzdENlbGwoYXJncyk7XG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdkYXRhLWNlbGwtaW5kZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxDb250ZXh0ID0gdGhpcy5jZWxsQnlJbmRleChpbmRleCk7XG4gICAgICAgICAgICBpZiAoIWNlbGxDb250ZXh0LmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNlbGxDb250ZXh0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3VzZUxlYXZlSGFuZGxlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENlbGxJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0Q2VsbExlYXZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2VsbE1vdXNlb3ZlckhhbmRsZXIoYXJncykge1xuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5jbG9zZXN0Q2VsbChhcmdzKTtcbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2VsbC1pbmRleCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENlbGxJbmRleCAmJiB0aGlzLmN1cnJlbnRDZWxsSW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q2VsbExlYXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY2VsbEJ5SW5kZXgoaW5kZXgpLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jZWxsRW50ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDZWxsSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRDZWxsSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdENlbGxMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3Nlc3RDZWxsKGV2ZW50QXJncykge1xuICAgICAgICByZXR1cm4gY2xvc2VzdEluU2NvcGUoZXZlbnRBcmdzLnRhcmdldCwgbm9kZSA9PiBub2RlLmhhc0F0dHJpYnV0ZSgnZGF0YS1jZWxsLWluZGV4JyksIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgZW1pdENlbGxMZWF2ZSgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2VsbEJ5SW5kZXgodGhpcy5jdXJyZW50Q2VsbEluZGV4KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuY2VsbExlYXZlLmVtaXQoaXRlbS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50Q2VsbEluZGV4ID0gbnVsbDtcbiAgICB9XG4gICAgY2VsbEJ5SW5kZXgoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgW3Jvd0luZGV4LCBjZWxsSW5kZXhdID0gaW5kZXguc3BsaXQoJzonKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtyb3dJbmRleF1bY2VsbEluZGV4XTtcbiAgICB9XG59XG5WaWV3Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9DYWxlbmRhclZpZXddJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlDZWxsPjx0ZCBjbGFzcz1cImstZW1wdHlcIj4mbmJzcDs8L3RkPjwvbmctdGVtcGxhdGU+XG4gICAgPHRyICpuZ0lmPVwiIWlzSG9yaXpvbnRhbCgpXCIgcm9sZT1cInJvd1wiPjx0aCBzY29wZT1cImNvbFwiIFtjb2xTcGFuXT1cImNvbFNwYW5cIj57e3RpdGxlfX08L3RoPjwvdHI+XG4gICAgPHRyIHJvbGU9XCJyb3dcIiAqbmdJZj1cImlzTW9udGhWaWV3KCkgJiYgaXNIb3Jpem9udGFsKClcIj5cbiAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBuYW1lIG9mIHdlZWtOYW1lc1wiPnt7bmFtZX19PC90aD5cbiAgICA8L3RyPlxuICAgIDx0ciAqa0Zvcj1cImxldCByb3cgb2YgZGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIiByb2xlPVwicm93XCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ3ZWVrTnVtYmVyXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJrLWFsdFwiICpuZ0lmPVwiZmlyc3REYXRlKHJvdyk7IGVsc2UgZW1wdHlDZWxsXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiF3ZWVrTnVtYmVyVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICAgICAgICAgICAge3tnZXRXZWVrTnVtYmVyKGZpcnN0RGF0ZShyb3cpKX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nSWZdPVwid2Vla051bWJlclRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwid2Vla051bWJlclRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZmlyc3REYXRlKHJvdyksXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ29udGV4dDogZ2V0V2Vla051bWJlckNvbnRleHQocm93KVxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKmtGb3I9XCJsZXQgY2VsbCBvZiByb3c7IGxldCBjZWxsSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjZWxsOyBlbHNlIGVtcHR5Q2VsbFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNlbGwtaW5kZXhdPVwidGFibGVDZWxsSW5kZXgocm93SW5kZXgsIGNlbGxJbmRleClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiY2VsbC5pc1NlbGVjdGVkIHx8IGNlbGwuaXNSYW5nZVN0YXJ0IHx8IGNlbGwuaXNSYW5nZU1pZCB8fCBjZWxsLmlzUmFuZ2VFbmRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRTdHlsZXMoY2VsbClcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjZWxsLnRpdGxlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstbGlua1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXRlbXBsYXRlUmVmXCI+e3tjZWxsLmZvcm1hdHRlZFZhbHVlfX08L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjZWxsLnZhbHVlLCBjZWxsQ29udGV4dDogY2VsbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90cj5cbiAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5WaWV3Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQnVzVmlld1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEludGxTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogV2Vla05hbWVzU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IERpc2FibGVkRGF0ZXNTZXJ2aWNlIH1cbl07XG5WaWV3Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXNBY3RpdmU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGl2ZVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNlbGxVSUQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvY3VzZWREYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RlZERhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZpZXdEYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVSYW5nZUVuZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2aWV3SW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRlbXBsYXRlUmVmOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyVGVtcGxhdGVSZWY6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNlbGxFbnRlcjogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNlbGxMZWF2ZTogW3sgdHlwZTogT3V0cHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBUaGUgZXhwb3J0ZWQgcGFja2FnZSBtb2R1bGUuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYEhlYWRlckNvbXBvbmVudGAmbWRhc2g7VGhlIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIFVJIGZvciB2ZXJ0aWNhbCBuYXZpZ2F0aW9uLlxuICogLSBgVmlld0NvbXBvbmVudGAmbWRhc2g7VGhlIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGFjdGl2ZSBDYWxlbmRhciB2aWV3LlxuICovXG5jbGFzcyBDYWxlbmRhckNvbW1vbk1vZHVsZSB7XG59XG5DYWxlbmRhckNvbW1vbk1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIEtGb3JPZixcbiAgICAgICAgICAgICAgICAgICAgSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBWaWV3Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbXG4gICAgICAgICAgICAgICAgICAgIEtGb3JPZixcbiAgICAgICAgICAgICAgICAgICAgSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBWaWV3Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBFdmVudHNNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICpcbiAqIFRoZSBleHBvcnRlZCBwYWNrYWdlIG1vZHVsZS5cbiAqXG4gKiBUaGUgcGFja2FnZSBleHBvcnRzOlxuICogLSBgQ2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgbW9udGggY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIG1vbnRoIGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgWWVhckNlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIHllYXIgY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBEZWNhZGVDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBkZWNhZGUgY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBDZW50dXJ5Q2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgY2VudHVyeSBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYFdlZWtOdW1iZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBtb250aCB3ZWVrIG51bWJlciBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYEhlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBoZWFkZXIgdGl0bGUgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgTmF2aWdhdGlvbkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIG5hdmlnYXRpb24gaXRlbSB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKi9cbmNsYXNzIFRlbXBsYXRlc01vZHVsZSB7XG59XG5UZW1wbGF0ZXNNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIE1vbnRoQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBEZWNhZGVDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIENlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIFdlZWtOdW1iZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIEhlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25JdGVtVGVtcGxhdGVEaXJlY3RpdmVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBNb250aENlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgWWVhckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgRGVjYWRlQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBDZW50dXJ5Q2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBIZWFkZXJUaXRsZVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ2FsZW5kYXJNZXNzYWdlcyBleHRlbmRzIENvbXBvbmVudE1lc3NhZ2VzIHtcbn1cbkNhbGVuZGFyTWVzc2FnZXMucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdG9kYXk6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIENhbGVuZGFyTWVzc2FnZXMge1xuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICB9XG59XG5DYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IENhbGVuZGFyTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlKSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNhbGVuZGFyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQ3VzdG9tIGNvbXBvbmVudCBtZXNzYWdlcyBvdmVycmlkZSBkZWZhdWx0IGNvbXBvbmVudCBtZXNzYWdlcyAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGdsb2JhbGl6YXRpb25fZGF0ZWlucHV0cyAlfSN0b2MtY3VzdG9tLW1lc3NhZ2VzKSkuXG4gKi9cbmNsYXNzIENhbGVuZGFyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBDYWxlbmRhck1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxuICAgIGdldCBvdmVycmlkZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuQ2FsZW5kYXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDYWxlbmRhck1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2FsZW5kYXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNhbGVuZGFyLW1lc3NhZ2VzJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ2FsZW5kYXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuY29uc3QgQ09NUE9ORU5UX0RJUkVDVElWRVMgPSBbXG4gICAgVmlydHVhbGl6YXRpb25Db21wb25lbnRcbl07XG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgVmlydHVhbGl6YXRpb24gY29tcG9uZW50LlxuICovXG5jbGFzcyBWaXJ0dWFsaXphdGlvbk1vZHVsZSB7XG59XG5WaXJ0dWFsaXphdGlvbk1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbQ09NUE9ORU5UX0RJUkVDVElWRVNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtDT01QT05FTlRfRElSRUNUSVZFU10sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0ZWQgcGFja2FnZSBtb2R1bGUuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYENlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIG1vbnRoIGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgTW9udGhDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBtb250aCBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYFllYXJDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSB5ZWFyIGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgRGVjYWRlQ2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgZGVjYWRlIGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgQ2VudHVyeUNlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIGNlbnR1cnkgY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgbW9udGggd2VlayBudW1iZXIgY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBIZWFkZXJUaXRsZVRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgaGVhZGVyIHRpdGxlIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYE5hdmlnYXRpb25JdGVtVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBuYXZpZ2F0aW9uIGl0ZW0gdGVtcGxhdGUgZGlyZWN0aXZlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiAvLyBJbXBvcnQgdGhlIENhbGVuZGFyIG1vZHVsZVxuICogaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kYXRlaW5wdXRzJztcbiAqXG4gKiAvLyBUaGUgYnJvd3NlciBwbGF0Zm9ybSB3aXRoIGEgY29tcGlsZXJcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICpcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogLy8gSW1wb3J0IHRoZSBhcHAgY29tcG9uZW50XG4gKiBpbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2FwcC5jb21wb25lbnQnO1xuICpcbiAqIC8vIERlZmluZSB0aGUgYXBwIG1vZHVsZVxuICogX0BOZ01vZHVsZSh7XG4gKiAgICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSwgLy8gZGVjbGFyZSBhcHAgY29tcG9uZW50XG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgQ2FsZW5kYXJNb2R1bGVdLCAvLyBpbXBvcnQgQ2FsZW5kYXIgbW9kdWxlXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDYWxlbmRhck1vZHVsZSB7XG59XG5DYWxlbmRhck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBWaWV3TGlzdENvbXBvbmVudFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGlvbkNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgVmlld0xpc3RDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyQ29tbW9uTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZXNNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckNvbW1vbk1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgSW50bE1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVzTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsaXphdGlvbk1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRzTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBSZXNpemVTZW5zb3JNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckRPTVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIENlbnR1cnlWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRGVjYWRlVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIE1vbnRoVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFllYXJWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgV2Vla05hbWVzU2VydmljZVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgQ29tcG9uZW50TWVzc2FnZXMge1xufVxuTWVzc2FnZXMucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdG9kYXk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHByZXZCdXR0b25UaXRsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbmV4dEJ1dHRvblRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE11bHRpVmlld0NhbGVuZGFyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbn1cbk11bHRpVmlld0NhbGVuZGFyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVZpZXdDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlKSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvTXVsdGlWaWV3Q2FsZW5kYXJMb2NhbGl6ZWRNZXNzYWdlc10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk11bHRpVmlld0NhbGVuZGFyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQ3VzdG9tIGNvbXBvbmVudCBtZXNzYWdlcyBvdmVycmlkZSBkZWZhdWx0IGNvbXBvbmVudCBtZXNzYWdlcyAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGdsb2JhbGl6YXRpb25fZGF0ZWlucHV0cyAlfSN0b2MtY3VzdG9tLW1lc3NhZ2VzKSkuXG4gKi9cbmNsYXNzIE11bHRpVmlld0NhbGVuZGFyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbk11bHRpVmlld0NhbGVuZGFyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVZpZXdDYWxlbmRhckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50KSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tbXVsdGl2aWV3Y2FsZW5kYXItbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5NdWx0aVZpZXdDYWxlbmRhckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIFRoZSBwYWNrYWdlIGV4cG9ydHM6XG4gKiAtIGBDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBtb250aCBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYE1vbnRoQ2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgbW9udGggY2VsbCB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKiAtIGBZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlYCZtZGFzaDtUaGUgeWVhciBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYERlY2FkZUNlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIGRlY2FkZSBjZWxsIHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYENlbnR1cnlDZWxsVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBjZW50dXJ5IGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgV2Vla051bWJlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIG1vbnRoIHdlZWsgbnVtYmVyIGNlbGwgdGVtcGxhdGUgZGlyZWN0aXZlLlxuICogLSBgSGVhZGVyVGl0bGVUZW1wbGF0ZURpcmVjdGl2ZWAmbWRhc2g7VGhlIGhlYWRlciB0aXRsZSB0ZW1wbGF0ZSBkaXJlY3RpdmUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgTXVsdGlWaWV3Q2FsZW5kYXIgbW9kdWxlXG4gKiBpbXBvcnQgeyBNdWx0aVZpZXdDYWxlbmRhck1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBNdWx0aVZpZXdDYWxlbmRhck1vZHVsZV0sIC8vIGltcG9ydCBNdWx0aVZpZXdDYWxlbmRhciBtb2R1bGVcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICpcbiAqIC8vIENvbXBpbGUgYW5kIGxhdW5jaCB0aGUgbW9kdWxlXG4gKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gKi9cbmNsYXNzIE11bHRpVmlld0NhbGVuZGFyTW9kdWxlIHtcbn1cbk11bHRpVmlld0NhbGVuZGFyTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbFZpZXdMaXN0Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBNdWx0aVZpZXdDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBNdWx0aVZpZXdDYWxlbmRhckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBNdWx0aVZpZXdDYWxlbmRhckNvbXBvbmVudFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsVmlld0xpc3RDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIE11bHRpVmlld0NhbGVuZGFyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIE11bHRpVmlld0NhbGVuZGFyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIE11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckNvbW1vbk1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVzTW9kdWxlXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDYWxlbmRhckNvbW1vbk1vZHVsZSwgSW50bE1vZHVsZSwgVGVtcGxhdGVzTW9kdWxlLCBQb3B1cE1vZHVsZV0sXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBDZW50dXJ5Vmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERlY2FkZVZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBNb250aFZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBZZWFyVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFdlZWtOYW1lc1NlcnZpY2VcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogVGhlIGV4cG9ydGVkIHBhY2thZ2UgbW9kdWxlLlxuICpcbiAqIFRoZSBwYWNrYWdlIGV4cG9ydHM6XG4gKiAtIGBDYWxlbmRhck1vZHVsZWAmbWRhc2g7VGhlIGNhbGVuZGFyIG1vZHVsZS5cbiAqIC0gYE11bHRpVmlld0NhbGVuZGFyTW9kdWxlYCZtZGFzaDtUaGUgbXVsdGktdmlldyBjYWxlbmRhciBtb2R1bGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgQ2FsZW5kYXJzIG1vZHVsZVxuICogaW1wb3J0IHsgQ2FsZW5kYXJzTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGF0ZWlucHV0cyc7XG4gKlxuICogLy8gVGhlIGJyb3dzZXIgcGxhdGZvcm0gd2l0aCBhIGNvbXBpbGVyXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIC8vIEltcG9ydCB0aGUgYXBwIGNvbXBvbmVudFxuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiAvLyBEZWZpbmUgdGhlIGFwcCBtb2R1bGVcbiAqIF9ATmdNb2R1bGUoe1xuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sIC8vIGRlY2xhcmUgYXBwIGNvbXBvbmVudFxuICogICAgIGltcG9ydHM6ICAgICAgW0Jyb3dzZXJNb2R1bGUsIENhbGVuZGFyc01vZHVsZV0sIC8vIGltcG9ydCB0aGUgQ2FsZW5kYXJzIG1vZHVsZVxuICogICAgIGJvb3RzdHJhcDogICAgW0FwcENvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKlxuICogLy8gQ29tcGlsZSBhbmQgbGF1bmNoIHRoZSBtb2R1bGVcbiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ2FsZW5kYXJzTW9kdWxlIHtcbn1cbkNhbGVuZGFyc01vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBDYWxlbmRhck1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgTXVsdGlWaWV3Q2FsZW5kYXJNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIE11bHRpVmlld0NhbGVuZGFyTW9kdWxlXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGF0ZUlucHV0TWVzc2FnZXMgZXh0ZW5kcyBDb21wb25lbnRNZXNzYWdlcyB7XG59XG5EYXRlSW5wdXRNZXNzYWdlcy5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBkZWNyZW1lbnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGluY3JlbWVudDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEYXRlSW5wdXRMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIERhdGVJbnB1dE1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuRGF0ZUlucHV0TG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRGF0ZUlucHV0TWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlSW5wdXRMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVJbnB1dExvY2FsaXplZE1lc3NhZ2VzXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGF0ZUlucHV0TG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQ3VzdG9tIGNvbXBvbmVudCBtZXNzYWdlcyBvdmVycmlkZSBkZWZhdWx0IGNvbXBvbmVudCBtZXNzYWdlcyAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGdsb2JhbGl6YXRpb25fZGF0ZWlucHV0cyAlfSN0b2MtY3VzdG9tLW1lc3NhZ2VzKSkuXG4gKi9cbmNsYXNzIERhdGVJbnB1dEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgRGF0ZUlucHV0TWVzc2FnZXMge1xuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5EYXRlSW5wdXRDdXN0b21NZXNzYWdlc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBEYXRlSW5wdXRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVJbnB1dEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50KSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZGF0ZWlucHV0LW1lc3NhZ2VzJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGF0ZUlucHV0Q3VzdG9tTWVzc2FnZXNDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIERhdGVJbnB1dCBjb21wb25lbnQuXG4gKi9cbmNsYXNzIERhdGVJbnB1dE1vZHVsZSB7XG59XG5EYXRlSW5wdXRNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIERhdGVJbnB1dEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIERhdGVJbnB1dEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW50bE1vZHVsZSwgRXZlbnRzTW9kdWxlXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGF0ZVBpY2tlck1lc3NhZ2VzIGV4dGVuZHMgQ29tcG9uZW50TWVzc2FnZXMge1xufVxuRGF0ZVBpY2tlck1lc3NhZ2VzLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRvZGF5OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b2dnbGU6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlIGV4dGVuZHMgRGF0ZVBpY2tlck1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERhdGVQaWNrZXJNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBDdXN0b20gY29tcG9uZW50IG1lc3NhZ2VzIG92ZXJyaWRlIGRlZmF1bHQgY29tcG9uZW50IG1lc3NhZ2VzIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZ2xvYmFsaXphdGlvbl9kYXRlaW5wdXRzICV9I3RvYy1jdXN0b20tbWVzc2FnZXMpKS5cbiAqL1xuY2xhc3MgRGF0ZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgRGF0ZVBpY2tlck1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxuICAgIGdldCBvdmVycmlkZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuRGF0ZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERhdGVQaWNrZXJNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWRhdGVwaWNrZXItbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EYXRlUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbmNvbnN0IMm1MCRlID0gdG91Y2hFbmFibGVkO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgRGF0ZVBpY2tlciBjb21wb25lbnQuXG4gKi9cbmNsYXNzIERhdGVQaWNrZXJNb2R1bGUge1xufVxuRGF0ZVBpY2tlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIERhdGVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIERhdGVQaWNrZXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbXG4gICAgICAgICAgICAgICAgICAgIERhdGVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIERhdGVQaWNrZXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZXNNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBJbnRsTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBQb3B1cE1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVzTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBFdmVudHNNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVE9VQ0hfRU5BQkxFRCwgdXNlVmFsdWU6IMm1MCRlIH1dXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbmNvbnN0IENPTVBPTkVOVF9ESVJFQ1RJVkVTJDEgPSBbXG4gICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIERhdGVSYW5nZVBvcHVwQ29tcG9uZW50LFxuICAgIERhdGVSYW5nZVBvcHVwVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgRGF0ZVJhbmdlU2VsZWN0aW9uRGlyZWN0aXZlLFxuICAgIERhdGVSYW5nZVN0YXJ0SW5wdXREaXJlY3RpdmUsXG4gICAgRGF0ZVJhbmdlRW5kSW5wdXREaXJlY3RpdmVcbl07XG5jb25zdCBDT01QT05FTlRfTU9EVUxFUyA9IFtcbiAgICBNdWx0aVZpZXdDYWxlbmRhck1vZHVsZSxcbiAgICBEYXRlSW5wdXRNb2R1bGUsXG4gICAgUG9wdXBNb2R1bGUsXG4gICAgRXZlbnRzTW9kdWxlXG5dO1xuLyoqXG4gKiBUaGUgZXhwb3J0ZWQgcGFja2FnZSBtb2R1bGUuXG4gKlxuICogVGhlIHBhY2thZ2UgZXhwb3J0czpcbiAqIC0gYERhdGVSYW5nZUNvbXBvbmVudGAmbWRhc2g7VGhlIERhdGVSYW5nZSBjb21wb25lbnQgY2xhc3MuXG4gKiAtIGBEYXRlUmFuZ2VQb3B1cENvbXBvbmVudGAmbWRhc2g7VGhlIERhdGVSYW5nZVBvcHVwIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYERhdGVSYW5nZVNlbGVjdGlvbkRpcmVjdGl2ZWAmbWRhc2g7VGhlIE11bHRpdmlld0NhbGVuZGFyIGRhdGUgcmFuZ2Ugc2VsZWN0aW9uIGRpcmVjdGl2ZS5cbiAqIC0gYERhdGVSYW5nZUVuZElucHV0RGlyZWN0aXZlYCZtZGFzaDtUaGUgZW5kIERhdGVJbnB1dCBkYXRlIHJhbmdlIHNlbGVjdGlvbiBkaXJlY3RpdmUuXG4gKiAtIGBEYXRlUmFuZ2VTdGFydElucHV0RGlyZWN0aXZlYCZtZGFzaDtUaGUgc3RhcnQgRGF0ZUlucHV0IGRhdGUgcmFuZ2Ugc2VsZWN0aW9uIGRpcmVjdGl2ZS5cbiAqIC0gYERhdGVSYW5nZVBvcHVwVGVtcGxhdGVEaXJlY3RpdmVgJm1kYXNoO1RoZSBEYXRlUmFuZ2VQb3B1cCBjb250ZW50IHRlbXBsYXRlIGRpcmVjdGl2ZS5cbiAqIC0gYE11bHRpVmlld0NhbGVuZGFyTW9kdWxlYCZtZGFzaDtUaGUgTXVsdGlWaWV3Q2FsZW5kYXIgbW9kdWxlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiAvLyBJbXBvcnQgdGhlIERhdGVSYW5nZSBtb2R1bGVcbiAqIGltcG9ydCB7IERhdGVSYW5nZU1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBEYXRlUmFuZ2VNb2R1bGVdLCAvLyBpbXBvcnQgRGF0ZVJhbmdlIG1vZHVsZVxuICogICAgIGJvb3RzdHJhcDogICAgW0FwcENvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKlxuICogLy8gQ29tcGlsZSBhbmQgbGF1bmNoIHRoZSBtb2R1bGVcbiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgRGF0ZVJhbmdlTW9kdWxlIHtcbn1cbkRhdGVSYW5nZU1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbQ09NUE9ORU5UX0RJUkVDVElWRVMkMV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW0NPTVBPTkVOVF9ESVJFQ1RJVkVTJDFdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENPTVBPTkVOVF9NT0RVTEVTXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG5jb25zdCBkaXYkMSA9IGRvbUNvbnRhaW5lckZhY3RvcnkoJ2RpdicpO1xuY29uc3QgdWwkMSA9IGRvbUNvbnRhaW5lckZhY3RvcnkoJ3VsJyk7XG5jb25zdCBsaSQxID0gZG9tQ29udGFpbmVyRmFjdG9yeSgnbGknKTtcbmNvbnN0IGxpc3RJdGVtID0gKCkgPT4gbGkkMSgnPHNwYW4+MDI8L3NwYW4+JywgJ2staXRlbScpO1xuY29uc3QgbGlzdCA9ICgpID0+IHVsJDEoW2xpc3RJdGVtKCldLCAnay1yZXNldCcpO1xuY29uc3Qgc2Nyb2xsYWJsZSQxID0gKCkgPT4gKGRpdiQxKFtsaXN0KCldLCAnay10aW1lLWNvbnRhaW5lciBrLWNvbnRlbnQgay1zY3JvbGxhYmxlJykpO1xuY29uc3QgdGltZUxpc3RXcmFwcGVyID0gKCkgPT4ge1xuICAgIGlmICghaXNEb2N1bWVudEF2YWlsYWJsZSgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGl2JDEoW2RpdiQxKFtzY3JvbGxhYmxlJDEoKV0sICdrLXRpbWUtbGlzdCcpXSwgJ2stdGltZS1saXN0LXdyYXBwZXInLCB7IGxlZnQ6ICctMTAwMDBweCcsIHBvc2l0aW9uOiAnYWJzb2x1dGUnIH0pO1xufTtcbmNvbnN0IFRJTUVMSVNUX1dSQVBQRVIgPSB0aW1lTGlzdFdyYXBwZXIoKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBUaW1lUGlja2VyRE9NU2VydmljZSB7XG4gICAgZW5zdXJlSGVpZ2h0cygpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZUxpc3RIZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSGVpZ2h0cygpO1xuICAgIH1cbiAgICBjYWxjdWxhdGVIZWlnaHRzKGNvbnRhaW5lcikge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBjb250YWluZXIgJiYgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5rLXRpbWUtbGlzdC1jb250YWluZXInKTtcbiAgICAgICAgY29uc3QgaG9zdENvbnRhaW5lciA9IGxpc3RDb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGhvc3RDb250YWluZXIuYXBwZW5kQ2hpbGQoVElNRUxJU1RfV1JBUFBFUik7XG4gICAgICAgIHRoaXMudGltZUxpc3RIZWlnaHQgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5rLXNjcm9sbGFibGUnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuaXRlbUhlaWdodCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignbGknKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIGhvc3RDb250YWluZXIucmVtb3ZlQ2hpbGQod3JhcHBlcik7XG4gICAgfVxuICAgIGlzQWN0aXZlKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGVsZW1lbnQubmF0aXZlRWxlbWVudCB8fCBlbGVtZW50KSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG59XG5UaW1lUGlja2VyRE9NU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuY29uc3QgSE9VUlNfSU5fREFZID0gMjQ7XG5jb25zdCBjbGFtcFRvUmFuZ2UgPSAocmFuZ2VWYWx1ZSkgPT4gKHZhbHVlKSA9PiB2YWx1ZSAlIHJhbmdlVmFsdWU7XG5jb25zdCBjbGFtcCA9IGNsYW1wVG9SYW5nZShIT1VSU19JTl9EQVkpO1xuY29uc3Qgc3RlcHBlciA9IChzdGFydCwgc3RlcCkgPT4gKGlkeCkgPT4gY2xhbXAoc3RhcnQgKyAoaWR4ICogc3RlcCkpO1xuY29uc3QgZGlzdGFuY2VGcm9tTWluID0gKHZhbHVlLCBtaW4pID0+IGNsYW1wKEhPVVJTX0lOX0RBWSArIHZhbHVlIC0gbWluKTtcbmNvbnN0IGxpbWl0ID0gKGJvcmRlclZhbHVlKSA9PiAoYmFycmllciwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB1c2VCYXJyaWVyID0gIXZhbHVlIHx8IGdldERhdGUoYmFycmllcikuZ2V0VGltZSgpID09PSBnZXREYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIHVzZUJhcnJpZXIgPyBiYXJyaWVyIDogc2V0SG91cnMoYmFycmllciwgYm9yZGVyVmFsdWUpO1xufTtcbmNvbnN0IGxpbWl0RG93biA9IGxpbWl0KDApO1xuY29uc3QgbGltaXRVcCA9IGxpbWl0KEhPVVJTX0lOX0RBWSAtIDEpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEhvdXJzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoaW50bCkge1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmJvdW5kUmFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXggPSBmYWxzZTtcbiAgICB9XG4gICAgYXBwbHkodmFsdWUsIGNhbmRpZGF0ZSkge1xuICAgICAgICByZXR1cm4gc2V0SG91cnModmFsdWUsIGNhbmRpZGF0ZS5nZXRIb3VycygpKTtcbiAgICB9XG4gICAgY29uZmlndXJlKHNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IHsgYm91bmRSYW5nZSA9IHRoaXMuYm91bmRSYW5nZSwgaW5zZXJ0VW5kaXZpZGVkTWF4ID0gdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXgsIG1pbiA9IHRoaXMubWluLCBtYXggPSB0aGlzLm1heCwgcGFydCwgc3RlcCA9IHRoaXMuc3RlcCB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYm91bmRSYW5nZSA9IGJvdW5kUmFuZ2U7XG4gICAgICAgIHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ID0gaW5zZXJ0VW5kaXZpZGVkTWF4O1xuICAgICAgICB0aGlzLnRvTGlzdEl0ZW0gPSAoaG91cikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHNldEhvdXJzKE1JRE5JR0hUX0RBVEUsIGhvdXIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmludGwuZm9ybWF0RGF0ZShkYXRlLCBwYXJ0LnBhdHRlcm4pLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMuc3RlcCA9IHN0ZXA7XG4gICAgfVxuICAgIGRhdGEoc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBjb25zdCBbbWluXSA9IHRoaXMucmFuZ2Uoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGdldEhvdXIgPSBzdGVwcGVyKG1pbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgY29uc3QgY29udmVydFRvSXRlbSA9IChpZHgpID0+ICh0aGlzLnRvTGlzdEl0ZW0oZ2V0SG91cihpZHgpKSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByYW5nZSgwLCB0aGlzLmNvdW50RnJvbU1pbihzZWxlY3RlZFZhbHVlKSkubWFwKGNvbnZlcnRUb0l0ZW0pO1xuICAgICAgICB0aGlzLmFkZExhc3QoZGF0YSk7XG4gICAgICAgIHRoaXMuYWRkTWlzc2luZyhkYXRhLCBzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlzUmFuZ2VDaGFuZ2VkKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiAhaXNFcXVhbCh0aGlzLm1pbiwgbWluKSB8fCAhaXNFcXVhbCh0aGlzLm1heCwgbWF4KTtcbiAgICB9XG4gICAgbGltaXRSYW5nZShtaW4sIG1heCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRSYW5nZSA/IFtsaW1pdERvd24obWluLCB2YWx1ZSksIGxpbWl0VXAobWF4LCB2YWx1ZSldIDogW21pbiwgbWF4XTtcbiAgICB9XG4gICAgdG90YWwodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbGFzdCQkMSA9IHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMuaXNMYXN0TWlzc2luZyh2YWx1ZSkgPyAxIDogMDtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHRoaXMuaXNNaXNzaW5nKHZhbHVlKSA/IDEgOiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5jb3VudEZyb21NaW4odmFsdWUpICsgbWlzc2luZyArIGxhc3QkJDE7XG4gICAgfVxuICAgIHNlbGVjdGVkSW5kZXgodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmRpdmlkZUJ5U3RlcCh2YWx1ZSkpO1xuICAgIH1cbiAgICB2YWx1ZUluTGlzdCh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaE1heCA9IHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMubGFzdEhvdXIodmFsdWUpID09PSB2YWx1ZS5nZXRIb3VycygpO1xuICAgICAgICByZXR1cm4gbWF0Y2hNYXggfHwgIXRoaXMuaXNNaXNzaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgYWRkTGFzdChkYXRhLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5pbnNlcnRVbmRpdmlkZWRNYXggJiYgdGhpcy5pc0xhc3RNaXNzaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgZGF0YS5wdXNoKHRoaXMudG9MaXN0SXRlbSh0aGlzLmxhc3RIb3VyKHZhbHVlKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBhZGRNaXNzaW5nKGRhdGEsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlSW5MaXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlzc2luZ0l0ZW0gPSB0aGlzLnRvTGlzdEl0ZW0odmFsdWUuZ2V0SG91cnMoKSk7XG4gICAgICAgIGRhdGEuc3BsaWNlKHRoaXMuc2VsZWN0ZWRJbmRleCh2YWx1ZSksIDAsIG1pc3NpbmdJdGVtKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvdW50RnJvbU1pbih2YWx1ZSkge1xuICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gdGhpcy5yYW5nZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGRpc3RhbmNlRnJvbU1pbihtYXgsIG1pbikgLyB0aGlzLnN0ZXApICsgMTsgLyogaW5jbHVkZSBtaW4gKi9cbiAgICB9XG4gICAgaXNNaXNzaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGV4KHZhbHVlKSAhPT0gdGhpcy5kaXZpZGVCeVN0ZXAodmFsdWUpO1xuICAgIH1cbiAgICBpc0xhc3RNaXNzaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTWlzc2luZyhzZXRIb3Vycyh0aGlzLm1heCwgdGhpcy5sYXN0SG91cih2YWx1ZSkpKTtcbiAgICB9XG4gICAgZGl2aWRlQnlTdGVwKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZUZyb21NaW4odmFsdWUuZ2V0SG91cnMoKSwgdGhpcy5taW4uZ2V0SG91cnMoKSkgLyB0aGlzLnN0ZXA7XG4gICAgfVxuICAgIGxhc3RIb3VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlKHZhbHVlKVsxXTtcbiAgICB9XG4gICAgcmFuZ2UodmFsdWUpIHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMubGltaXRSYW5nZSh0aGlzLm1pbiwgdGhpcy5tYXgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIFttaW4uZ2V0SG91cnMoKSwgbWF4LmdldEhvdXJzKCldO1xuICAgIH1cbn1cbkhvdXJzU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSG91cnNTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogSW50bFNlcnZpY2UgfVxuXTtcblxuY29uc3QgTUlOVVRFU19JTl9IT1VSID0gNjA7XG5jb25zdCBjbGFtcFRvUmFuZ2UkMSA9IChyYW5nZVZhbHVlKSA9PiAodmFsdWUpID0+IHZhbHVlICUgcmFuZ2VWYWx1ZTtcbmNvbnN0IGNsYW1wJDEgPSBjbGFtcFRvUmFuZ2UkMShNSU5VVEVTX0lOX0hPVVIpO1xuY29uc3Qgc3RlcHBlciQxID0gKHN0YXJ0LCBzdGVwKSA9PiAoaWR4KSA9PiBjbGFtcCQxKHN0YXJ0ICsgKGlkeCAqIHN0ZXApKTtcbmNvbnN0IGRpc3RhbmNlRnJvbU1pbiQxID0gKHZhbHVlLCBtaW4pID0+IGNsYW1wJDEoTUlOVVRFU19JTl9IT1VSICsgdmFsdWUgLSBtaW4pO1xuY29uc3QgbGltaXQkMSA9IChib3JkZXJWYWx1ZSkgPT4gKGJhcnJpZXIsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdXNlQmFycmllciA9ICF2YWx1ZSB8fCBiYXJyaWVyLmdldEhvdXJzKCkgPT09IHZhbHVlLmdldEhvdXJzKCk7XG4gICAgcmV0dXJuIHVzZUJhcnJpZXIgPyBiYXJyaWVyIDogc2V0TWludXRlcyhiYXJyaWVyLCBib3JkZXJWYWx1ZSk7XG59O1xuY29uc3QgbGltaXREb3duJDEgPSBsaW1pdCQxKDApO1xuY29uc3QgbGltaXRVcCQxID0gbGltaXQkMShNSU5VVEVTX0lOX0hPVVIgLSAxKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBNaW51dGVzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoaW50bCkge1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmluc2VydFVuZGl2aWRlZE1heCA9IGZhbHNlO1xuICAgIH1cbiAgICBhcHBseSh2YWx1ZSwgY2FuZGlkYXRlKSB7XG4gICAgICAgIHJldHVybiBzZXRNaW51dGVzKHZhbHVlLCBjYW5kaWRhdGUuZ2V0TWludXRlcygpKTtcbiAgICB9XG4gICAgY29uZmlndXJlKHNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IHsgaW5zZXJ0VW5kaXZpZGVkTWF4ID0gdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXgsIG1pbiA9IHRoaXMubWluLCBtYXggPSB0aGlzLm1heCwgcGFydCwgc3RlcCA9IHRoaXMuc3RlcCB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ID0gaW5zZXJ0VW5kaXZpZGVkTWF4O1xuICAgICAgICB0aGlzLnRvTGlzdEl0ZW0gPSAobWludXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gc2V0TWludXRlcyhNSUROSUdIVF9EQVRFLCBtaW51dGUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmludGwuZm9ybWF0RGF0ZShkYXRlLCBwYXJ0LnBhdHRlcm4pLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMuc3RlcCA9IHN0ZXA7XG4gICAgfVxuICAgIGRhdGEoc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBjb25zdCBbbWluXSA9IHRoaXMucmFuZ2Uoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGdldE1pbnV0ZSA9IHN0ZXBwZXIkMShtaW4sIHRoaXMuc3RlcCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRUb0l0ZW0gPSAoaWR4KSA9PiAodGhpcy50b0xpc3RJdGVtKGdldE1pbnV0ZShpZHgpKSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByYW5nZSgwLCB0aGlzLmNvdW50RnJvbU1pbihzZWxlY3RlZFZhbHVlKSkubWFwKGNvbnZlcnRUb0l0ZW0pO1xuICAgICAgICB0aGlzLmFkZExhc3QoZGF0YSk7XG4gICAgICAgIHRoaXMuYWRkTWlzc2luZyhkYXRhLCBzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlzUmFuZ2VDaGFuZ2VkKG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiAhaXNFcXVhbCh0aGlzLm1pbiwgbWluKSB8fCAhaXNFcXVhbCh0aGlzLm1heCwgbWF4KTtcbiAgICB9XG4gICAgbGltaXRSYW5nZShtaW4sIG1heCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtsaW1pdERvd24kMShtaW4sIHZhbHVlKSwgbGltaXRVcCQxKG1heCwgdmFsdWUpXTtcbiAgICB9XG4gICAgdG90YWwodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbGFzdCQkMSA9IHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMuaXNMYXN0TWlzc2luZyh2YWx1ZSkgPyAxIDogMDtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHRoaXMuaXNNaXNzaW5nKHZhbHVlKSA/IDEgOiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5jb3VudEZyb21NaW4odmFsdWUpICsgbWlzc2luZyArIGxhc3QkJDE7XG4gICAgfVxuICAgIHNlbGVjdGVkSW5kZXgodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmRpdmlkZUJ5U3RlcCh2YWx1ZSkpO1xuICAgIH1cbiAgICB2YWx1ZUluTGlzdCh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaE1heCA9IHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMubGFzdE1pbnV0ZSh2YWx1ZSkgPT09IHZhbHVlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoTWF4IHx8ICF0aGlzLmlzTWlzc2luZyh2YWx1ZSk7XG4gICAgfVxuICAgIGFkZExhc3QoZGF0YSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMuaXNMYXN0TWlzc2luZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnRvTGlzdEl0ZW0odGhpcy5sYXN0TWludXRlKHZhbHVlKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBhZGRNaXNzaW5nKGRhdGEsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlSW5MaXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlzc2luZ0l0ZW0gPSB0aGlzLnRvTGlzdEl0ZW0odmFsdWUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgZGF0YS5zcGxpY2UodGhpcy5zZWxlY3RlZEluZGV4KHZhbHVlKSwgMCwgbWlzc2luZ0l0ZW0pO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY291bnRGcm9tTWluKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLnJhbmdlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZGlzdGFuY2VGcm9tTWluJDEobWF4LCBtaW4pIC8gdGhpcy5zdGVwKSArIDE7IC8qIGluY2x1ZGUgbWluICovXG4gICAgfVxuICAgIGlzTWlzc2luZyh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleCh2YWx1ZSkgIT09IHRoaXMuZGl2aWRlQnlTdGVwKHZhbHVlKTtcbiAgICB9XG4gICAgaXNMYXN0TWlzc2luZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01pc3Npbmcoc2V0TWludXRlcyh0aGlzLm1heCwgdGhpcy5sYXN0TWludXRlKHZhbHVlKSkpO1xuICAgIH1cbiAgICBkaXZpZGVCeVN0ZXAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlRnJvbU1pbiQxKHZhbHVlLmdldE1pbnV0ZXMoKSwgdGhpcy5taW4uZ2V0TWludXRlcygpKSAvIHRoaXMuc3RlcDtcbiAgICB9XG4gICAgbGFzdE1pbnV0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZSh2YWx1ZSlbMV07XG4gICAgfVxuICAgIHJhbmdlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLmxpbWl0UmFuZ2UodGhpcy5taW4sIHRoaXMubWF4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBbbWluLmdldE1pbnV0ZXMoKSwgbWF4LmdldE1pbnV0ZXMoKV07XG4gICAgfVxufVxuTWludXRlc1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk1pbnV0ZXNTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogSW50bFNlcnZpY2UgfVxuXTtcblxuY29uc3QgU0VDT05EU19JTl9IT1VSID0gNjA7XG5jb25zdCBjbGFtcFRvUmFuZ2UkMiA9IChyYW5nZVZhbHVlKSA9PiAodmFsdWUpID0+IHZhbHVlICUgcmFuZ2VWYWx1ZTtcbmNvbnN0IGNsYW1wJDIgPSBjbGFtcFRvUmFuZ2UkMihTRUNPTkRTX0lOX0hPVVIpO1xuY29uc3Qgc3RlcHBlciQyID0gKHN0YXJ0LCBzdGVwKSA9PiAoaWR4KSA9PiBjbGFtcCQyKHN0YXJ0ICsgKGlkeCAqIHN0ZXApKTtcbmNvbnN0IGRpc3RhbmNlRnJvbU1pbiQyID0gKHZhbHVlLCBtaW4pID0+IGNsYW1wJDIoU0VDT05EU19JTl9IT1VSICsgdmFsdWUgLSBtaW4pO1xuY29uc3QgbGltaXQkMiA9IChib3JkZXJWYWx1ZSkgPT4gKGJhcnJpZXIsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdXNlQmFycmllciA9ICF2YWx1ZSB8fCBiYXJyaWVyLmdldEhvdXJzKCkgPT09IHZhbHVlLmdldEhvdXJzKCkgJiYgYmFycmllci5nZXRNaW51dGVzKCkgPT09IHZhbHVlLmdldE1pbnV0ZXMoKTtcbiAgICByZXR1cm4gdXNlQmFycmllciA/IGJhcnJpZXIgOiBzZXRTZWNvbmRzKGJhcnJpZXIsIGJvcmRlclZhbHVlKTtcbn07XG5jb25zdCBsaW1pdERvd24kMiA9IGxpbWl0JDIoMCk7XG5jb25zdCBsaW1pdFVwJDIgPSBsaW1pdCQyKFNFQ09ORFNfSU5fSE9VUiAtIDEpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFNlY29uZHNTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihpbnRsKSB7XG4gICAgICAgIHRoaXMuaW50bCA9IGludGw7XG4gICAgICAgIHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ID0gZmFsc2U7XG4gICAgfVxuICAgIGFwcGx5KHZhbHVlLCBjYW5kaWRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHNldFNlY29uZHModmFsdWUsIGNhbmRpZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgIH1cbiAgICBjb25maWd1cmUoc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgeyBpbnNlcnRVbmRpdmlkZWRNYXggPSB0aGlzLmluc2VydFVuZGl2aWRlZE1heCwgbWluID0gdGhpcy5taW4sIG1heCA9IHRoaXMubWF4LCBwYXJ0LCBzdGVwID0gdGhpcy5zdGVwIH0gPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXggPSBpbnNlcnRVbmRpdmlkZWRNYXg7XG4gICAgICAgIHRoaXMudG9MaXN0SXRlbSA9IChtaW51dGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBzZXRTZWNvbmRzKE1JRE5JR0hUX0RBVEUsIG1pbnV0ZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuaW50bC5mb3JtYXREYXRlKGRhdGUsIHBhcnQucGF0dGVybiksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRhdGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgICAgdGhpcy5zdGVwID0gc3RlcDtcbiAgICB9XG4gICAgZGF0YShzZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFttaW5dID0gdGhpcy5yYW5nZShzZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgY29uc3QgZ2V0U2Vjb25kID0gc3RlcHBlciQyKG1pbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgY29uc3QgY29udmVydFRvSXRlbSA9IChpZHgpID0+ICh0aGlzLnRvTGlzdEl0ZW0oZ2V0U2Vjb25kKGlkeCkpKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJhbmdlKDAsIHRoaXMuY291bnRGcm9tTWluKHNlbGVjdGVkVmFsdWUpKS5tYXAoY29udmVydFRvSXRlbSk7XG4gICAgICAgIHRoaXMuYWRkTGFzdChkYXRhKTtcbiAgICAgICAgdGhpcy5hZGRNaXNzaW5nKGRhdGEsIHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaXNSYW5nZUNoYW5nZWQobWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuICFpc0VxdWFsKHRoaXMubWluLCBtaW4pIHx8ICFpc0VxdWFsKHRoaXMubWF4LCBtYXgpO1xuICAgIH1cbiAgICBsaW1pdFJhbmdlKG1pbiwgbWF4LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW2xpbWl0RG93biQyKG1pbiwgdmFsdWUpLCBsaW1pdFVwJDIobWF4LCB2YWx1ZSldO1xuICAgIH1cbiAgICB0b3RhbCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsYXN0JCQxID0gdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXggJiYgdGhpcy5pc0xhc3RNaXNzaW5nKHZhbHVlKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gdGhpcy5pc01pc3NpbmcodmFsdWUpID8gMSA6IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50RnJvbU1pbih2YWx1ZSkgKyBtaXNzaW5nICsgbGFzdCQkMTtcbiAgICB9XG4gICAgc2VsZWN0ZWRJbmRleCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZGl2aWRlQnlTdGVwKHZhbHVlKSk7XG4gICAgfVxuICAgIHZhbHVlSW5MaXN0KHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoTWF4ID0gdGhpcy5pbnNlcnRVbmRpdmlkZWRNYXggJiYgdGhpcy5sYXN0U2Vjb25kKHZhbHVlKSA9PT0gdmFsdWUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4gbWF0Y2hNYXggfHwgIXRoaXMuaXNNaXNzaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgZGl2aWRlQnlTdGVwKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZUZyb21NaW4kMih2YWx1ZS5nZXRTZWNvbmRzKCksIHRoaXMubWluLmdldFNlY29uZHMoKSkgLyB0aGlzLnN0ZXA7XG4gICAgfVxuICAgIGFkZExhc3QoZGF0YSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zZXJ0VW5kaXZpZGVkTWF4ICYmIHRoaXMuaXNMYXN0TWlzc2luZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnRvTGlzdEl0ZW0odGhpcy5sYXN0U2Vjb25kKHZhbHVlKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBhZGRNaXNzaW5nKGRhdGEsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlSW5MaXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlzc2luZ0l0ZW0gPSB0aGlzLnRvTGlzdEl0ZW0odmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgZGF0YS5zcGxpY2UodGhpcy5zZWxlY3RlZEluZGV4KHZhbHVlKSwgMCwgbWlzc2luZ0l0ZW0pO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY291bnRGcm9tTWluKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLnJhbmdlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZGlzdGFuY2VGcm9tTWluJDIobWF4LCBtaW4pIC8gdGhpcy5zdGVwKSArIDE7IC8qIGluY2x1ZGUgbWluICovXG4gICAgfVxuICAgIGlzTWlzc2luZyh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleCh2YWx1ZSkgIT09IHRoaXMuZGl2aWRlQnlTdGVwKHZhbHVlKTtcbiAgICB9XG4gICAgaXNMYXN0TWlzc2luZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01pc3Npbmcoc2V0U2Vjb25kcyh0aGlzLm1heCwgdGhpcy5sYXN0U2Vjb25kKHZhbHVlKSkpO1xuICAgIH1cbiAgICBsYXN0U2Vjb25kKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlKHZhbHVlKVsxXTtcbiAgICB9XG4gICAgcmFuZ2UodmFsdWUpIHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMubGltaXRSYW5nZSh0aGlzLm1pbiwgdGhpcy5tYXgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIFttaW4uZ2V0U2Vjb25kcygpLCBtYXguZ2V0U2Vjb25kcygpXTtcbiAgICB9XG59XG5TZWNvbmRzU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU2Vjb25kc1NlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9XG5dO1xuXG5jb25zdCBzZXRIb3VycyQxID0gKGRhdGUsIGhvdXJzKSA9PiB7XG4gICAgY29uc3QgY2xvbmUgPSBjbG9uZURhdGUoZGF0ZSk7XG4gICAgY2xvbmUuc2V0SG91cnMoaG91cnMpO1xuICAgIHJldHVybiBjbG9uZTtcbn07XG5jb25zdCBpc0FNID0gKHZhbHVlKSA9PiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSA8IDEyO1xuY29uc3QgaXNQTSA9ICh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgKCF2YWx1ZSB8fCB2YWx1ZSA+IDExKTtcbmNvbnN0IGluUmFuZ2UgPSAodmFsdWUsIG1pbiwgbWF4KSA9PiAoKCFtaW4gJiYgIW1heCkgfHwgKHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXgpKTtcbmNvbnN0IGluUmV2ZXJzZVJhbmdlID0gKHZhbHVlLCBtaW4sIG1heCkgPT4gKCghbWluICYmICFtYXgpIHx8IHZhbHVlID49IG1pbiB8fCB2YWx1ZSA8PSBtYXgpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERheVBlcmlvZFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGludGwpIHtcbiAgICAgICAgdGhpcy5pbnRsID0gaW50bDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGFwcGx5KHZhbHVlLCBjYW5kaWRhdGUpIHtcbiAgICAgICAgY29uc3QgaG91ciA9IHZhbHVlLmdldEhvdXJzKCk7XG4gICAgICAgIGNvbnN0IGhvdXJBTSA9IGlzQU0oaG91cik7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZUFNID0gaXNBTShjYW5kaWRhdGUuZ2V0SG91cnMoKSk7XG4gICAgICAgIGlmICgoaG91ckFNICYmIGNhbmRpZGF0ZUFNKSB8fCAoIWhvdXJBTSAmJiAhY2FuZGlkYXRlQU0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW21pbiwgbWF4ID0gMjRdID0gdGhpcy5ub3JtYWxpemVkUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaG91ciArIChjYW5kaWRhdGVBTSA/IC0xMiA6IDEyKTtcbiAgICAgICAgcmV0dXJuIHNldEhvdXJzJDEodmFsdWUsIE1hdGgubWluKE1hdGgubWF4KG1pbiwgcmVzdWx0KSwgKG1heCB8fCAyNCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbmZpZ3VyZShzZXR0aW5ncykge1xuICAgICAgICBjb25zdCB7IG1pbiA9IHRoaXMubWluLCBtYXggPSB0aGlzLm1heCwgcGFydCA9IHRoaXMucGFydCB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgICAgdGhpcy5wYXJ0ID0gcGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGRhdGEoXykge1xuICAgICAgICBjb25zdCBuYW1lcyA9IHRoaXMucGFydC5uYW1lcztcbiAgICAgICAgaWYgKCFuYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMubm9ybWFsaXplZFJhbmdlKCk7XG4gICAgICAgIGNvbnN0IGRheVBlcmlvZCA9IHRoaXMuaW50bC5kYXRlRm9ybWF0TmFtZXMobmFtZXMpO1xuICAgICAgICBpZiAoaXNBTShtaW4pKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goeyB0ZXh0OiBkYXlQZXJpb2QuYW0sIHZhbHVlOiBzZXRIb3VycyQxKHRoaXMubWluLCBtaW4pIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BNKG1heCkpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh7IHRleHQ6IGRheVBlcmlvZC5wbSwgdmFsdWU6IHNldEhvdXJzJDEodGhpcy5taW4sIE1hdGgubWF4KDEyLCBtYXgpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5taW4uZ2V0SG91cnMoKSAhPT0gbWluID8gZGF0YS5yZXZlcnNlKCkgOiBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaXNSYW5nZUNoYW5nZWQoXywgX18pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbGltaXRSYW5nZShtaW4sIG1heCwgXykge1xuICAgICAgICByZXR1cm4gW21pbiwgbWF4XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRvdGFsKCkge1xuICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gdGhpcy5ub3JtYWxpemVkUmFuZ2UoKTtcbiAgICAgICAgaWYgKCFtaW4gJiYgIW1heCkge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbiA+IDExIHx8IG1heCA8IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNlbGVjdGVkSW5kZXgodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlSW5MaXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcih2YWx1ZS5nZXRIb3VycygpIC8gMTIpO1xuICAgICAgICByZXR1cm4gdGhpcy5taW4uZ2V0SG91cnMoKSA9PT0gdGhpcy5ub3JtYWxpemVkUmFuZ2UoKVswXSA/IGluZGV4IDogKGluZGV4ID09PSAwID8gMSA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdmFsdWVJbkxpc3QodmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IHRoaXMubWluLmdldEhvdXJzKCkgIT09IHRoaXMubm9ybWFsaXplZFJhbmdlKClbMF07XG4gICAgICAgIGNvbnN0IGlzSW5SYW5nZSA9IHJldmVyc2UgPyBpblJldmVyc2VSYW5nZSA6IGluUmFuZ2U7XG4gICAgICAgIHJldHVybiBpc0luUmFuZ2UodmFsdWUuZ2V0SG91cnMoKSwgdGhpcy5taW4uZ2V0SG91cnMoKSwgdGhpcy5tYXguZ2V0SG91cnMoKSk7XG4gICAgfVxuICAgIG5vcm1hbGl6ZWRSYW5nZSgpIHtcbiAgICAgICAgY29uc3QgbWluSG91ciA9IHRoaXMubWluLmdldEhvdXJzKCk7XG4gICAgICAgIGNvbnN0IG1heEhvdXIgPSB0aGlzLm1heC5nZXRIb3VycygpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgTWF0aC5taW4obWluSG91ciwgbWF4SG91ciksXG4gICAgICAgICAgICBNYXRoLm1heChtaW5Ib3VyLCBtYXhIb3VyKVxuICAgICAgICBdO1xuICAgIH1cbn1cbkRheVBlcmlvZFNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRheVBlcmlvZFNlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBJbnRsU2VydmljZSB9XG5dO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSAgY29tcG9uZW50LXNlbGVjdG9yLXR5cGUgKi9cbmNvbnN0IFNOQVBfVEhSRVNIT0xEID0gMC4wNTsgLy8lIG9mIHRoZSBpdGVtIGhlaWdodFxuY29uc3QgU0NST0xMX1RIUkVTSE9MRCA9IDI7IC8vPCAycHggdGhyZXNob2xkXG5jb25zdCBuaWwgPSAoKSA9PiAobnVsbCk7XG5jb25zdCBnZXR0ZXJzID0ge1xuICAgIDM1OiAoZGF0YSwgXykgPT4gZGF0YVtkYXRhLmxlbmd0aCAtIDFdLFxuICAgIDM2OiAoZGF0YSwgXykgPT4gZGF0YVswXSxcbiAgICAzODogKGRhdGEsIGluZGV4KSA9PiBkYXRhW2luZGV4IC0gMV0sXG4gICAgNDA6IChkYXRhLCBpbmRleCkgPT4gZGF0YVtpbmRleCArIDFdXG59O1xuY29uc3Qgc2VydmljZXMkMSA9IHtcbiAgICBbVElNRV9QQVJULmRheXBlcmlvZF06IERheVBlcmlvZFNlcnZpY2UsXG4gICAgW1RJTUVfUEFSVC5ob3VyXTogSG91cnNTZXJ2aWNlLFxuICAgIFtUSU1FX1BBUlQubWludXRlXTogTWludXRlc1NlcnZpY2UsXG4gICAgW1RJTUVfUEFSVC5zZWNvbmRdOiBTZWNvbmRzU2VydmljZVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBUaW1lTGlzdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgaW5qZWN0b3IsIGRvbSwgcmVuZGVyZXIsIHpvbmUpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLm1pbiA9IGNsb25lRGF0ZShNSUROSUdIVF9EQVRFKTtcbiAgICAgICAgdGhpcy5tYXggPSBjbG9uZURhdGUoTUFYX1RJTUUpO1xuICAgICAgICB0aGlzLnN0ZXAgPSAxO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q2xhc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmFuaW1hdGVUb0luZGV4ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNraXAgPSAwO1xuICAgICAgICB0aGlzLnRvdGFsID0gNjA7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmluZGV4VG9TY3JvbGwgPSAtMTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMgPSBbXTtcbiAgICB9XG4gICAgZ2V0IHRhYkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IHVuZGVmaW5lZCA6IDA7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMucGFydCkge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoc2VydmljZXMkMVt0aGlzLnBhcnQudHlwZV0pO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmNvbmZpZ3VyZSh0aGlzLnNlcnZpY2VTZXR0aW5ncygpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyA9IGNoYW5nZXMudmFsdWUgfHwge307XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLnNlcnZpY2UubGltaXRSYW5nZSh0aGlzLm1pbiwgdGhpcy5tYXgsIHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZS5pc1JhbmdlQ2hhbmdlZChtaW4sIG1heCkgfHwgY2hhbmdlcy5taW4gfHwgY2hhbmdlcy5tYXggfHwgY2hhbmdlcy5zdGVwKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5jb25maWd1cmUodGhpcy5zZXJ2aWNlU2V0dGluZ3MoeyBtaW4sIG1heCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCB0aGUgcmVuZGVyaW5nIG9mIHRoZSBsaXN0IHdoZW5ldmVyIHBvc3NpYmxlXG4gICAgICAgIGlmICghdGhpcy5kYXRhLmxlbmd0aCB8fCB0aGlzLmhhc01pc3NpbmdWYWx1ZSh2YWx1ZUNoYW5nZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGVUb0luZGV4ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnNlcnZpY2UuZGF0YSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbmltYXRlVG9JbmRleCA9IHRoaXMuYW5pbWF0ZVRvSW5kZXggJiYgdGhpcy50ZXh0SGFzQ2hhbmdlZCh2YWx1ZUNoYW5nZXMpO1xuICAgICAgICB0aGlzLnRvdGFsID0gdGhpcy5zZXJ2aWNlLnRvdGFsKHZhbHVlKTtcbiAgICAgICAgdGhpcy5pbmRleFRvU2Nyb2xsID0gdGhpcy5zZWxlY3RlZEluZGV4KHZhbHVlKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZVRvSW5kZXggPSB0cnVlO1xuICAgICAgICB0aGlzLmRvbS5lbnN1cmVIZWlnaHRzKCk7XG4gICAgICAgIHRoaXMuaXRlbUhlaWdodCA9IHRoaXMuZG9tLml0ZW1IZWlnaHQ7XG4gICAgICAgIHRoaXMubGlzdEhlaWdodCA9IHRoaXMuZG9tLnRpbWVMaXN0SGVpZ2h0O1xuICAgICAgICB0aGlzLnRvcE9mZnNldCA9ICh0aGlzLmxpc3RIZWlnaHQgLSB0aGlzLml0ZW1IZWlnaHQpIC8gMjtcbiAgICAgICAgdGhpcy5ib3R0b21PZmZzZXQgPSB0aGlzLmxpc3RIZWlnaHQgLSB0aGlzLml0ZW1IZWlnaHQ7XG4gICAgICAgIHRoaXMudG9wVGhyZXNob2xkID0gdGhpcy5pdGVtSGVpZ2h0ICogU05BUF9USFJFU0hPTEQ7XG4gICAgICAgIHRoaXMuYm90dG9tVGhyZXNob2xkID0gdGhpcy5pdGVtSGVpZ2h0ICogKDEgLSBTTkFQX1RIUkVTSE9MRCk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZSA9IGB0cmFuc2xhdGVZKCR7dGhpcy50b3BPZmZzZXR9cHgpYDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUsICctbXMtdHJhbnNmb3JtJzogdHJhbnNsYXRlIH07XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5kb21FdmVudHMuZm9yRWFjaCh1bmJpbmRDYWxsYmFjayA9PiB1bmJpbmRDYWxsYmFjaygpKTtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnNjcm9sbE9uY2UoKGluZGV4KSA9PiB0aGlzLnZpcnR1YWxpemF0aW9uLnNjcm9sbFRvSW5kZXgoaW5kZXgpKTtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICB0aGlzLnNjcm9sbE9uY2UoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFuaW1hdGVUb0luZGV4ID8gJ2FuaW1hdGVUb0luZGV4JyA6ICdzY3JvbGxUb0luZGV4JztcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6YXRpb25bYWN0aW9uXShpbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGVUb0luZGV4ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZUNoYW5nZShkYXRhSXRlbSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLnNlcnZpY2UuYXBwbHkodGhpcy52YWx1ZSwgZGF0YUl0ZW0udmFsdWUpO1xuICAgICAgICBpZiAodGhpcy52YWx1ZS5nZXRUaW1lKCkgPT09IGNhbmRpZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4VG9TY3JvbGwgPSB0aGlzLmRhdGEuaW5kZXhPZihkYXRhSXRlbSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBjYW5kaWRhdGU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBoYW5kbGVJdGVtQ2xpY2soYXJncykge1xuICAgICAgICBjb25zdCBpdGVtID0gY2xvc2VzdEluU2NvcGUoYXJncy50YXJnZXQsIG5vZGUgPT4gbm9kZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtdGltZWxpc3QtaXRlbS1pbmRleCcpLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXRpbWVsaXN0LWl0ZW0taW5kZXgnKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHRoaXMuZGF0YVtpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgVGltZUxpc3QuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAqICA8YnV0dG9uIChjbGljayk9XCJ0aW1lbGlzdC5mb2N1cygpXCI+Rm9jdXMgVGltZUxpc3Q8L2J1dHRvbj5cbiAgICAgKiAgPGtlbmRvLXRpbWVsaXN0ICN0aW1lbGlzdD48L2tlbmRvLXRpbWVsaXN0PlxuICAgICAqIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmx1cnMgdGhlIFRpbWVMaXN0IGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gICAgaXRlbU9mZnNldChzY3JvbGxUb3ApIHtcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleCh0aGlzLnZhbHVlKTtcbiAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLnZpcnR1YWxpemF0aW9uLmFjdGl2ZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMudmlydHVhbGl6YXRpb24uaXRlbU9mZnNldChhY3RpdmVJbmRleCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoTWF0aC5jZWlsKHNjcm9sbFRvcCkgLSBvZmZzZXQpO1xuICAgICAgICBpZiAodmFsdWVJbmRleCA9PT0gYWN0aXZlSW5kZXggJiYgZGlzdGFuY2UgPCBTQ1JPTExfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcm9sbFVwID0gdmFsdWVJbmRleCA+IGFjdGl2ZUluZGV4O1xuICAgICAgICBjb25zdCBtb3ZlVG9OZXh0ID0gc2Nyb2xsVXAgJiYgZGlzdGFuY2UgPj0gdGhpcy5ib3R0b21UaHJlc2hvbGQgfHwgIXNjcm9sbFVwICYmIGRpc3RhbmNlID4gdGhpcy50b3BUaHJlc2hvbGQ7XG4gICAgICAgIHJldHVybiBtb3ZlVG9OZXh0ID8gdGhpcy52aXJ0dWFsaXphdGlvbi5pdGVtT2Zmc2V0KGFjdGl2ZUluZGV4ICsgMSkgOiBvZmZzZXQ7XG4gICAgfVxuICAgIGhhc01pc3NpbmdWYWx1ZSh7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9KSB7XG4gICAgICAgIGNvbnN0IGlzUHJldmlvdXNNaXNzaW5nID0gcHJldmlvdXNWYWx1ZSAmJiAhdGhpcy5zZXJ2aWNlLnZhbHVlSW5MaXN0KHByZXZpb3VzVmFsdWUpO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRNaXNzaW5nID0gY3VycmVudFZhbHVlICYmICF0aGlzLnNlcnZpY2UudmFsdWVJbkxpc3QoY3VycmVudFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzUHJldmlvdXNNaXNzaW5nIHx8IGlzQ3VycmVudE1pc3Npbmc7XG4gICAgfVxuICAgIHNjcm9sbE9uY2UoYWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4VG9TY3JvbGwgIT09IC0xKSB7XG4gICAgICAgICAgICBhY3Rpb24odGhpcy5pbmRleFRvU2Nyb2xsKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhUb1Njcm9sbCA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlcnZpY2VTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGJvdW5kUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgaW5zZXJ0VW5kaXZpZGVkTWF4OiBmYWxzZSxcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgcGFydDogdGhpcy5wYXJ0LFxuICAgICAgICAgICAgc3RlcDogdGhpcy5zdGVwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBzZXR0aW5ncyk7XG4gICAgICAgIHJlc3VsdC5ib3VuZFJhbmdlID0gcmVzdWx0LnBhcnQudHlwZSAhPT0gJ2hvdXInO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzZWxlY3RlZEluZGV4KHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnNlbGVjdGVkSW5kZXgodmFsdWUpO1xuICAgIH1cbiAgICB0ZXh0SGFzQ2hhbmdlZCh7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9KSB7XG4gICAgICAgIGlmICghcHJldmlvdXNWYWx1ZSB8fCAhY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkRGF0YSA9IHRoaXMuZGF0YVt0aGlzLnNlbGVjdGVkSW5kZXgocHJldmlvdXNWYWx1ZSldO1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5kYXRhW3RoaXMuc2VsZWN0ZWRJbmRleChjdXJyZW50VmFsdWUpXTtcbiAgICAgICAgcmV0dXJuIG9sZERhdGEgJiYgbmV3RGF0YSAmJiBvbGREYXRhLnRleHQgIT09IG5ld0RhdGEudGV4dDtcbiAgICB9XG4gICAgaGFuZGxlS2V5RG93bihlKSB7XG4gICAgICAgIGNvbnN0IGdldHRlciA9IGdldHRlcnNbZS5rZXlDb2RlXSB8fCBuaWw7XG4gICAgICAgIGNvbnN0IGRhdGFJdGVtID0gZ2V0dGVyKHRoaXMuZGF0YSwgdGhpcy5zZXJ2aWNlLnNlbGVjdGVkSW5kZXgodGhpcy52YWx1ZSkpO1xuICAgICAgICBpZiAoZGF0YUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKGRhdGFJdGVtKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbiA9IHRoaXMudmlydHVhbGl6YXRpb25cbiAgICAgICAgICAgIC5zY3JvbGwkKClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApLCBtYXAoKGUpID0+IGUudGFyZ2V0LnNjcm9sbFRvcCksIG1hcCgodG9wKSA9PiB0aGlzLml0ZW1PZmZzZXQodG9wKSksIG1hcCgoaXRlbU9mZnNldCkgPT4gdGhpcy52aXJ0dWFsaXphdGlvbi5pdGVtSW5kZXgoaXRlbU9mZnNldCkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxpemF0aW9uLnNjcm9sbFRvSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2UodGhpcy5kYXRhW2luZGV4XSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLnB1c2godGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ21vdXNlb3ZlcicsICgpID0+ICF0aGlzLmlzQWN0aXZlICYmIHRoaXMuZm9jdXMoKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsICgpID0+IHRoaXMuZm9jdXMoKSksIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdibHVyJywgKCkgPT4gdGhpcy5pc0FjdGl2ZSA9IGZhbHNlKSwgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2ZvY3VzJywgKCkgPT4gdGhpcy5pc0FjdGl2ZSA9IHRydWUpLCB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKSk7XG4gICAgfVxufVxuVGltZUxpc3RDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRpbWVsaXN0JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgIDxrZW5kby12aXJ0dWFsaXphdGlvblxuICAgICAgICBbc2tpcF09XCJza2lwXCJcbiAgICAgICAgW3Rha2VdPVwidG90YWxcIlxuICAgICAgICBbdG90YWxdPVwidG90YWxcIlxuICAgICAgICBbaXRlbUhlaWdodF09XCJpdGVtSGVpZ2h0XCJcbiAgICAgICAgW21heFNjcm9sbERpZmZlcmVuY2VdPVwibGlzdEhlaWdodFwiXG4gICAgICAgIFt0b3BPZmZzZXRdPVwidG9wT2Zmc2V0XCJcbiAgICAgICAgW2JvdHRvbU9mZnNldF09XCJib3R0b21PZmZzZXRcIlxuICAgICAgICBjbGFzcz1cImstdGltZS1jb250YWluZXJcIlxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgPlxuICAgICAgICA8dWwgW25nU3R5bGVdPVwic3R5bGVcIiBjbGFzcz1cImstcmVzZXRcIlxuICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgIGNsaWNrOiBoYW5kbGVJdGVtQ2xpY2tcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YTsgbGV0IGluZGV4ID0gaW5kZXg7XCIgY2xhc3M9XCJrLWl0ZW1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGltZWxpc3QtaXRlbS1pbmRleF09XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7aXRlbS50ZXh0fX08L3NwYW4+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgIDwva2VuZG8tdmlydHVhbGl6YXRpb24+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVGltZUxpc3RDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBJbmplY3RvciB9LFxuICAgIHsgdHlwZTogVGltZVBpY2tlckRPTVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5UaW1lTGlzdENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBtaW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1heDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGFydDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3RlcDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHZpcnR1YWxpemF0aW9uOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtWaXJ0dWFsaXphdGlvbkNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIHRhYkluZGV4OiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiYXR0ci50YWJpbmRleFwiLF0gfV0sXG4gICAgY29tcG9uZW50Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLXRpbWUtbGlzdFwiLF0gfV1cbn07XG5cbmNvbnN0IGlzRXF1YWxUaWxsTWludXRlID0gKHZhbHVlLCBtaW4pID0+IHZhbHVlLmdldEhvdXJzKCkgPT09IG1pbi5nZXRIb3VycygpICYmIHZhbHVlLmdldE1pbnV0ZXMoKSA9PT0gbWluLmdldE1pbnV0ZXMoKTtcbmNvbnN0IGlzRXF1YWxUaWxsU2Vjb25kID0gKHZhbHVlLCBtaW4pID0+IGlzRXF1YWxUaWxsTWludXRlKHZhbHVlLCBtaW4pICYmIHZhbHVlLmdldFNlY29uZHMoKSA9PT0gbWluLmdldFNlY29uZHMoKTtcbmNvbnN0IGlzRXF1YWxUaWxsTWlsbGlzZWNvbmQgPSAodmFsdWUsIG1pbikgPT4gaXNFcXVhbFRpbGxTZWNvbmQodmFsdWUsIG1pbikgJiYgdmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCkgPT09IG1pbi5nZXRNaWxsaXNlY29uZHMoKTtcbmNvbnN0IMm1MyQ2ID0gKHZhbHVlKSA9PiB2YWx1ZS5nZXRIb3VycygpLCDJtTQkMiA9IChfLCBtaW4pID0+IG1pbi5nZXRIb3VycygpLCDJtTUkMSA9ICh2YWx1ZSkgPT4gdmFsdWUuZ2V0TWludXRlcygpLCDJtTYkMSA9ICh2YWx1ZSwgbWluKSA9PiBpc0VxdWFsVGlsbE1pbnV0ZSh2YWx1ZSwgbWluKSA/IG1pbi5nZXRNaW51dGVzKCkgOiAwLCDJtTckMSA9ICh2YWx1ZSkgPT4gdmFsdWUuZ2V0U2Vjb25kcygpLCDJtTgkMSA9ICh2YWx1ZSwgbWluKSA9PiBpc0VxdWFsVGlsbFNlY29uZCh2YWx1ZSwgbWluKSA/IG1pbi5nZXRTZWNvbmRzKCkgOiAwLCDJtTkkMSA9ICh2YWx1ZSkgPT4gdmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCksIMm1MTAkMSA9ICh2YWx1ZSwgbWluKSA9PiBpc0VxdWFsVGlsbE1pbGxpc2Vjb25kKHZhbHVlLCBtaW4pID8gbWluLmdldE1pbGxpc2Vjb25kcygpIDogMDtcbmNvbnN0IGRlZmF1bHRHZXR0ZXJzID0gW1xuICAgIHtcbiAgICAgICAgdHlwZTogVElNRV9QQVJULmhvdXIsXG4gICAgICAgIGdldHRlcjogybUzJDYsXG4gICAgICAgIG1pbkdldHRlcjogybU0JDJcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6IFRJTUVfUEFSVC5taW51dGUsXG4gICAgICAgIGdldHRlcjogybU1JDEsXG4gICAgICAgIG1pbkdldHRlcjogybU2JDFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6IFRJTUVfUEFSVC5zZWNvbmQsXG4gICAgICAgIGdldHRlcjogybU3JDEsXG4gICAgICAgIG1pbkdldHRlcjogybU4JDFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6IFRJTUVfUEFSVC5taWxsaXNlY29uZCxcbiAgICAgICAgZ2V0dGVyOiDJtTkkMSxcbiAgICAgICAgbWluR2V0dGVyOiDJtTEwJDFcbiAgICB9XG5dO1xuY29uc3QgbGVmdCA9IGdldHRlciA9PiAob3JpZ2luLCBfKSA9PiBnZXR0ZXIob3JpZ2luKTtcbmNvbnN0IHJpZ2h0ID0gZ2V0dGVyID0+IChfLCBjYW5kaWRhdGUpID0+IGdldHRlcihjYW5kaWRhdGUpO1xuY29uc3QgY29udmVydFRvT2JqZWN0ID0gKHBhcnRzKSA9PiBwYXJ0cy5yZWR1Y2UoKG9iaiwgcCkgPT4geyBvYmpbcC50eXBlXSA9IHAudHlwZTsgcmV0dXJuIG9iajsgfSwge30pO1xuY29uc3QgZ2V0dGVyQnlQYXJ0ID0gcGFydHMgPT4gZyA9PiBwYXJ0c1tnLnR5cGVdID8gcmlnaHQoZy5nZXR0ZXIpIDogbGVmdChnLmdldHRlcik7XG5jb25zdCBnZXR0ZXJzRmFjdG9yeSA9IGdldHRlcnMgPT4gcGFydHMgPT4gKGdldHRlcnMubWFwKGdldHRlckJ5UGFydChjb252ZXJ0VG9PYmplY3QocGFydHMpKSkpO1xuY29uc3Qgc25hcFZhbHVlID0gKGdldHRlciwgbWluR2V0dGVyLCBzdGVwKSA9PiAoZGF0ZSwgbWluKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXR0ZXIoZGF0ZSk7XG4gICAgY29uc3QgbWluVmFsdWUgPSBtaW5HZXR0ZXIoZGF0ZSwgbWluKTtcbiAgICBjb25zdCByZXN0ID0gdmFsdWUgLSBtaW5WYWx1ZTtcbiAgICBpZiAocmVzdCA8IDApIHtcbiAgICAgICAgcmV0dXJuIG1pblZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSByZXN0ICUgc3RlcDtcbiAgICByZXR1cm4gdmFsdWUgLSBtb2QgKyAobW9kID4gc3RlcCAvIDIgPyBzdGVwIDogMCk7XG59O1xuY29uc3Qgc25hcHBlcnNGYWN0b3J5ID0gKGdldHRlcnMpID0+IHN0ZXBzID0+IChnZXR0ZXJzLm1hcChnID0+IHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbZy50eXBlXTtcbiAgICByZXR1cm4gc3RlcCA/IHNuYXBWYWx1ZShnLmdldHRlciwgZy5taW5HZXR0ZXIsIHN0ZXApIDogZy5nZXR0ZXI7XG59KSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZ2VuZXJhdGVHZXR0ZXJzID0gZ2V0dGVyc0ZhY3RvcnkoZGVmYXVsdEdldHRlcnMpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGdlbmVyYXRlU25hcHBlcnMgPSBzbmFwcGVyc0ZhY3RvcnkoZGVmYXVsdEdldHRlcnMpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHZhbHVlTWVyZ2VyID0gZ2V0dGVycyA9PiAob3JpZ2luLCBjYW5kaWRhdGUpID0+IHtcbiAgICBvcmlnaW4uc2V0SG91cnMoLi4uZ2V0dGVycy5tYXAoZyA9PiBnKG9yaWdpbiwgY2FuZGlkYXRlKSkpO1xuICAgIHJldHVybiBvcmlnaW47XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHNuYXBUaW1lID0gc25hcHBlcnMgPT4gKGNhbmRpZGF0ZSwgbWluKSA9PiB7XG4gICAgY29uc3QgZGF0ZSA9IGNsb25lRGF0ZShjYW5kaWRhdGUpO1xuICAgIGRhdGUuc2V0SG91cnMoLi4uc25hcHBlcnMubWFwKHMgPT4gcyhkYXRlLCBtaW4pKSk7XG4gICAgcmV0dXJuIGRhdGU7XG59O1xuXG5jb25zdCBsaXN0UmVkdWNlciA9IChzdGF0ZSwgbGlzdCwgaWR4LCBhbGwpID0+IHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoIHx8ICFsaXN0LmlzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIFt7XG4gICAgICAgICAgICBuZXh0OiBhbGxbaWR4ICsgMV0gfHwgbGlzdCxcbiAgICAgICAgICAgIHByZXY6IGFsbFtpZHggLSAxXSB8fCBsaXN0XG4gICAgICAgIH1dO1xufTtcbnZhciBEaXJlY3Rpb247XG4oZnVuY3Rpb24gKERpcmVjdGlvbikge1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJMZWZ0XCJdID0gMF0gPSBcIkxlZnRcIjtcbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiUmlnaHRcIl0gPSAxXSA9IFwiUmlnaHRcIjtcbn0pKERpcmVjdGlvbiB8fCAoRGlyZWN0aW9uID0ge30pKTtcbi8qKlxuICogQGhpZGRlblxuICpcbiAqIFJlcHJlc2VudHMgdGhlIEtlbmRvIFVJIFRpbWVTZWxlY3RvciBjb21wb25lbnQgZm9yIEFuZ3VsYXIuXG4gKi9cbmNsYXNzIFRpbWVTZWxlY3RvckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBjZHIsIGVsZW1lbnQsIGludGwsIGRvbSwgem9uZSwgcmVuZGVyZXIsIHBpY2tlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmludGwgPSBpbnRsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UgPSBwaWNrZXJTZXJ2aWNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21wb25lbnRDbGFzcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHRpbWUgZm9ybWF0IHVzZWQgdG8gZGlzcGxheSB0aGUgdGltZSBsaXN0IGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvcm1hdCA9ICd0JztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgc21hbGxlc3QgdmFsaWQgdGltZSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWluID0gY2xvbmVEYXRlKE1JTl9USU1FKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgYmlnZ2VzdCB2YWxpZCB0aW1lIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXggPSBjbG9uZURhdGUoTUFYX1RJTUUpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlICoqQ2FuY2VsKiogYnV0dG9uIGluIHRoZSBwb3B1cC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IHRoZSAqKlNldCoqIGJ1dHRvbiBpbiB0aGUgcG9wdXAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldEJ1dHRvbiA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgKipOb3cqKiBidXR0b24gaW4gdGhlIHBvcHVwLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IElmIHRoZSBjdXJyZW50IHRpbWUgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBpbmNyZW1lbnRhbCBzdGVwIGlzIGdyZWF0ZXIgdGhhbiBgMWAsIHRoZSAqKk5vdyoqIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm93QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgYGRpc2FibGVkYCBwcm9wZXJ0eSBvZiB0aGUgVGltZVNlbGVjdG9yIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBhY3RpdmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBUaW1lU2VsZWN0b3IgY29tcG9uZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgY2FuY2VscyB0aGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZhbHVlUmVqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd05vd0J1dHRvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUxpc3RJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLl9zdGVwcyA9IHt9O1xuICAgICAgICB0aGlzLmRvbUV2ZW50cyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2UudGltZVNlbGVjdG9yID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGRpc2FibGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBpbmNyZW1lbnRhbCBzdGVwcyBvZiB0aGUgVGltZVNlbGVjdG9yLlxuICAgICAqXG4gICAgICogVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgICAgKiAtIGBob3VyOiBOdW1iZXJgJm1kYXNoO0NvbnRyb2xzIHRoZSBpbmNyZW1lbnRhbCBzdGVwIG9mIHRoZSBob3VyIHZhbHVlLlxuICAgICAqIC0gYG1pbnV0ZTogTnVtYmVyYCZtZGFzaDtDb250cm9scyB0aGUgaW5jcmVtZW50YWwgc3RlcCBvZiB0aGUgbWludXRlIHZhbHVlLlxuICAgICAqIC0gYHNlY29uZDogTnVtYmVyYCZtZGFzaDtDb250cm9scyB0aGUgaW5jcmVtZW50YWwgc3RlcCBvZiB0aGUgc2Vjb25kIHZhbHVlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgKiBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICogdGVtcGxhdGU6IGBcbiAgICAgKiAgPGtlbmRvLXRpbWVzZWxlY3RvciBmb3JtYXQ9XCJISDptbTpzc1wiIFtzdGVwc109XCJzdGVwc1wiPjwva2VuZG8tdGltZXNlbGVjdG9yPlxuICAgICAqIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgcHVibGljIHN0ZXBzID0geyBob3VyOiAyLCBtaW51dGU6IDE1LCBzZWNvbmQ6IDE1IH07XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBJZiB0aGUgaW5jcmVtZW50YWwgc3RlcCBpcyBncmVhdGVyIHRoYW4gYDFgLCB0aGUgKipOb3cqKiBidXR0b24gd2lsbCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgc2V0IHN0ZXBzKHN0ZXBzKSB7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0gc3RlcHMgfHwge307XG4gICAgfVxuICAgIGdldCBzdGVwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0ZXBzO1xuICAgIH1cbiAgICBzZXQgY3VycmVudCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50ID0gdGltZUluUmFuZ2UodGhpcy5zbmFwVGltZShjbG9uZURhdGUodmFsdWUgfHwgTUlETklHSFRfREFURSksIHRoaXMubWluKSwgdGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICAgICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gICAgfVxuICAgIGdldCBhY3RpdmVMaXN0SW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVMaXN0SW5kZXg7XG4gICAgfVxuICAgIHNldCBhY3RpdmVMaXN0SW5kZXgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlTGlzdEluZGV4ID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy50aW1lTGlzdFdyYXBwZXJzIHx8ICF0aGlzLnRpbWVMaXN0V3JhcHBlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lTGlzdFdyYXBwZXJzLmZvckVhY2gobGlzdFdyYXBwZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhsaXN0V3JhcHBlci5uYXRpdmVFbGVtZW50LCAnay1zdGF0ZS1mb2N1c2VkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdEluZGV4ID0gdGhpcy5saXN0SW5kZXgodmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFdyYXBwZXIgPSB0aGlzLnRpbWVMaXN0V3JhcHBlcnMudG9BcnJheSgpW2xpc3RJbmRleF07XG4gICAgICAgICAgICBpZiAoZm9jdXNlZFdyYXBwZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGZvY3VzZWRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHRoaXMuaW50bC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmludGxDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgICAgIC5jaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9tLmNhbGN1bGF0ZUhlaWdodHModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhfKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLnRpbWVTZWxlY3RvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb21FdmVudHMuZm9yRWFjaCh1bmJpbmRDYWxsYmFjayA9PiB1bmJpbmRDYWxsYmFjaygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgVGltZVNlbGVjdG9yIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICogc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICogIDxidXR0b24gKGNsaWNrKT1cInRpbWVzZWxlY3Rvci5mb2N1cygpXCI+Rm9jdXMgdGltZSBwaWNrZXI8L2J1dHRvbj5cbiAgICAgKiAgPGtlbmRvLXRpbWVzZWxlY3RvciAjdGltZXNlbGVjdG9yPjwva2VuZG8tdGltZXNlbGVjdG9yPlxuICAgICAqIGBcbiAgICAgKiB9KVxuICAgICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgeyB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLnRpbWVMaXN0cy5maXJzdDtcbiAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCbHVycyB0aGUgVGltZVNlbGVjdG9yIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBibHVyKCkge1xuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy50aW1lTGlzdHMuZmlyc3Q7XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QuYmx1cigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlQWNjZXB0KCkge1xuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSh0aGlzLm1lcmdlVmFsdWUoY2xvbmVEYXRlKHRoaXMudmFsdWUgfHwgZ2V0RGF0ZShnZXROb3coKSkpLCB0aGlzLmN1cnJlbnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZU5vdygpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZ2V0Tm93KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHRoaXMuY3VycmVudCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFuZGxlUmVqZWN0KCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlUmVqZWN0LmVtaXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhhbmRsZUZvY3VzKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0Rm9jdXMoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVMaXN0Rm9jdXMoYXJncykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFyZ3MudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS10aW1lbGlzdC1pbmRleCcpLCAxMCk7XG4gICAgICAgIHRoaXMuYWN0aXZlTGlzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaGFuZGxlRm9jdXMoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBoYW5kbGVCbHVyKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IGN1cnJlbnRGb2N1c1RhcmdldChhcmdzKTtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgJiYgdGhpcy5jb250YWluc0VsZW1lbnQoY3VycmVudFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUxpc3RJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdEJsdXIoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb250YWluc0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihjbG9zZXN0KGVsZW1lbnQsIG5vZGUgPT4gbm9kZSA9PT0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKTtcbiAgICB9XG4gICAgcGFydFN0ZXAocGFydCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwc1twYXJ0LnR5cGVdIHx8IDE7XG4gICAgfVxuICAgIGluaXQoY2hhbmdlcykge1xuICAgICAgICBpZiAoIWNoYW5nZXMgfHwgaGFzQ2hhbmdlKGNoYW5nZXMsICdmb3JtYXQnKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRlRm9ybWF0UGFydHMgPSB0aGlzLmludGwuc3BsaXREYXRlRm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICAgICAgICAgIHRoaXMubWVyZ2VWYWx1ZSA9IHZhbHVlTWVyZ2VyKGdlbmVyYXRlR2V0dGVycyh0aGlzLmRhdGVGb3JtYXRQYXJ0cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hhbmdlcyB8fCBoYXNDaGFuZ2UoY2hhbmdlcywgJ3N0ZXBzJykpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcFRpbWUgPSBzbmFwVGltZShnZW5lcmF0ZVNuYXBwZXJzKHRoaXMuc3RlcHMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoYW5nZXMgfHwgaGFzQ2hhbmdlKGNoYW5nZXMsICd2YWx1ZScpKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd05vd0J1dHRvbiA9ICF0aGlzLmhhc1N0ZXBzKCkgJiYgdGhpcy5ub3dCdXR0b24gJiYgaXNJblRpbWVSYW5nZShnZXROb3coKSwgdGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICB9XG4gICAgZm9jdXNMaXN0KGRpcikge1xuICAgICAgICBpZiAoIXRoaXMudGltZUxpc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZUxpc3RzLnJlZHVjZShsaXN0UmVkdWNlciwgW10pXG4gICAgICAgICAgICAubWFwKHN0YXRlID0+IGRpciA9PT0gRGlyZWN0aW9uLlJpZ2h0ID8gc3RhdGUubmV4dCA6IHN0YXRlLnByZXYpXG4gICAgICAgICAgICAubWFwKGxpc3QgPT4gbGlzdCAmJiBsaXN0LmZvY3VzKCkpO1xuICAgIH1cbiAgICBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xvbmVEYXRlKHZhbHVlKSk7XG4gICAgfVxuICAgIGhhc0FjdGl2ZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2VwdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5hY2NlcHQsIHRoaXMuY2FuY2VsLCB0aGlzLm5vd10ucmVkdWNlKChpc0FjdGl2ZSwgZWwpID0+IGlzQWN0aXZlIHx8IHRoaXMuZG9tLmlzQWN0aXZlKGVsKSwgZmFsc2UpO1xuICAgIH1cbiAgICBoYXNTdGVwcygpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc3RlcHMpO1xuICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGggIT09IGtleXMucmVkdWNlKChhY2MsIGspID0+IGFjYyArIHRoaXMuc3RlcHNba10sIDApO1xuICAgIH1cbiAgICBpbnRsQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmRhdGVGb3JtYXRQYXJ0cyA9IHRoaXMuaW50bC5zcGxpdERhdGVGb3JtYXQodGhpcy5mb3JtYXQpO1xuICAgICAgICB0aGlzLm1lcmdlVmFsdWUgPSB2YWx1ZU1lcmdlcihnZW5lcmF0ZUdldHRlcnModGhpcy5kYXRlRm9ybWF0UGFydHMpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGJpbmRFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb21FdmVudHMucHVzaCh0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd24uYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlS2V5ZG93bihhcmdzKSB7XG4gICAgICAgIGNvbnN0IHsga2V5Q29kZSwgYWx0S2V5IH0gPSBhcmdzO1xuICAgICAgICAvLyByZXNlcnZlIHRoZSBhbHQgKyBhcnJvdyBrZXkgY29tbWFuZHMgZm9yIHRoZSBwaWNrZXJcbiAgICAgICAgY29uc3QgYXJyb3dLZXlQcmVzc2VkID0gW0tleXMuQXJyb3dMZWZ0LCBLZXlzLkFycm93UmlnaHRdLmluZGV4T2Yoa2V5Q29kZSkgIT09IC0xO1xuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMucGlja2VyU2VydmljZSkgJiYgYXJyb3dLZXlQcmVzc2VkICYmIGFsdEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlzLkVudGVyICYmICF0aGlzLmhhc0FjdGl2ZUJ1dHRvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT09IEtleXMuQXJyb3dMZWZ0IHx8IGtleUNvZGUgPT09IEtleXMuQXJyb3dSaWdodCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0xpc3Qoa2V5Q29kZSA9PT0gS2V5cy5BcnJvd0xlZnQgPyBEaXJlY3Rpb24uTGVmdCA6IERpcmVjdGlvbi5SaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEJsdXIoYXJncykge1xuICAgICAgICBpZiAodGhpcy5waWNrZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclNlcnZpY2Uub25CbHVyLmVtaXQoYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEZvY3VzKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJTZXJ2aWNlLm9uRm9jdXMuZW1pdChhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaXN0SW5kZXgocGFydEluZGV4KSB7XG4gICAgICAgIGxldCBsaXN0SWR4ID0gMDtcbiAgICAgICAgbGV0IHBhcnRJZHggPSAwO1xuICAgICAgICB3aGlsZSAocGFydElkeCA8IHBhcnRJbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZUZvcm1hdFBhcnRzW3BhcnRJZHhdLnR5cGUgIT09ICdsaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIGxpc3RJZHgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRJZHgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdElkeDtcbiAgICB9XG59XG5UaW1lU2VsZWN0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvLXRpbWVzZWxlY3RvcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby50aW1lc2VsZWN0b3InXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tdGltZXNlbGVjdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyIGtlbmRvVGltZVNlbGVjdG9yTG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgICAgIGkxOG4tYWNjZXB0PVwia2VuZG8udGltZXNlbGVjdG9yLmFjY2VwdHxUaGUgQWNjZXB0IGJ1dHRvbiB0ZXh0IGluIHRoZSB0aW1lc2VsZWN0b3IgY29tcG9uZW50XCJcbiAgICAgICAgICAgIGFjY2VwdD1cIlNldFwiXG5cbiAgICAgICAgICAgIGkxOG4tYWNjZXB0TGFiZWw9XCJrZW5kby50aW1lc2VsZWN0b3IuYWNjZXB0TGFiZWx8VGhlIGxhYmVsIGZvciB0aGUgQWNjZXB0IGJ1dHRvbiBpbiB0aGUgdGltZXNlbGVjdG9yIGNvbXBvbmVudFwiXG4gICAgICAgICAgICBhY2NlcHRMYWJlbD1cIlNldCB0aW1lXCJcblxuICAgICAgICAgICAgaTE4bi1jYW5jZWw9XCJrZW5kby50aW1lc2VsZWN0b3IuY2FuY2VsfFRoZSBDYW5jZWwgYnV0dG9uIHRleHQgaW4gdGhlIHRpbWVzZWxlY3RvciBjb21wb25lbnRcIlxuICAgICAgICAgICAgY2FuY2VsPVwiQ2FuY2VsXCJcblxuICAgICAgICAgICAgaTE4bi1jYW5jZWxMYWJlbD1cImtlbmRvLnRpbWVzZWxlY3Rvci5jYW5jZWxMYWJlbHxUaGUgbGFiZWwgZm9yIHRoZSBDYW5jZWwgYnV0dG9uIGluIHRoZSB0aW1lc2VsZWN0b3IgY29tcG9uZW50XCJcbiAgICAgICAgICAgIGNhbmNlbExhYmVsPVwiQ2FuY2VsIGNoYW5nZXNcIlxuXG4gICAgICAgICAgICBpMThuLW5vdz1cImtlbmRvLnRpbWVzZWxlY3Rvci5ub3d8VGhlIE5vdyBidXR0b24gdGV4dCBpbiB0aGUgdGltZXNlbGVjdG9yIGNvbXBvbmVudFwiXG4gICAgICAgICAgICBub3c9XCJOb3dcIlxuXG4gICAgICAgICAgICBpMThuLW5vd0xhYmVsPVwia2VuZG8udGltZXNlbGVjdG9yLm5vd0xhYmVsfFRoZSBsYWJlbCBmb3IgdGhlIE5vdyBidXR0b24gaW4gdGhlIHRpbWVzZWxlY3RvciBjb21wb25lbnRcIlxuICAgICAgICAgICAgbm93TGFiZWw9XCJTZWxlY3Qgbm93XCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImstdGltZS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay10aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IGludGwuZm9ybWF0RGF0ZShjdXJyZW50LCBmb3JtYXQpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgI25vd1xuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd05vd0J1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWJ1dHRvbiBrLWJhcmUgay10aW1lLW5vd1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvY2FsaXphdGlvbi5nZXQoJ25vd0xhYmVsJylcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnbm93TGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBjbGljazogaGFuZGxlTm93LFxuICAgICAgICAgICAgICAgICAgICBmb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIGJsdXI6IGhhbmRsZUJsdXJcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID57e2xvY2FsaXphdGlvbi5nZXQoJ25vdycpfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLXRpbWUtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay10aW1lLWhpZ2hsaWdodFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBbbmdGb3JPZl09XCJkYXRlRm9ybWF0UGFydHNcIiBsZXQtcGFydCBsZXQtaWR4PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICNsaXN0V3JhcHBlclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstdGltZS1saXN0LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCIgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFydC50eXBlICE9PSAnbGl0ZXJhbCdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLXRpdGxlXCI+e3tpbnRsLmRhdGVGaWVsZE5hbWUocGFydCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRpbWVsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFydF09XCJwYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cInBhcnRTdGVwKHBhcnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJjdXJyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1czogaGFuZGxlTGlzdEZvY3VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXI6IGhhbmRsZUJsdXJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aW1lbGlzdC1pbmRleF09XCJpZHhcIlxuICAgICAgICAgICAgICAgICAgICA+PC9rZW5kby10aW1lbGlzdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay10aW1lLXNlcGFyYXRvclwiICpuZ0lmPVwicGFydC50eXBlID09PSAnbGl0ZXJhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3twYXJ0LnBhdHRlcm59fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLXRpbWUtZm9vdGVyIGstYWN0aW9uLWJ1dHRvbnNcIiAqbmdJZj1cInNldEJ1dHRvbiB8fCBjYW5jZWxCdXR0b25cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjY2FuY2VsXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1idXR0b24gay10aW1lLWNhbmNlbFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvY2FsaXphdGlvbi5nZXQoJ2NhbmNlbExhYmVsJylcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnY2FuY2VsTGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBjbGljazogaGFuZGxlUmVqZWN0LFxuICAgICAgICAgICAgICAgICAgICBmb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIGJsdXI6IGhhbmRsZUJsdXJcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID57e2xvY2FsaXphdGlvbi5nZXQoJ2NhbmNlbCcpfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjYWNjZXB0XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZXRCdXR0b25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay10aW1lLWFjY2VwdCBrLWJ1dHRvbiBrLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvY2FsaXphdGlvbi5nZXQoJ2FjY2VwdExhYmVsJylcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxpemF0aW9uLmdldCgnYWNjZXB0TGFiZWwnKVwiXG4gICAgICAgICAgICAgICAgW2tlbmRvRXZlbnRzT3V0c2lkZUFuZ3VsYXJdPVwie1xuICAgICAgICAgICAgICAgICAgICBjbGljazogaGFuZGxlQWNjZXB0LFxuICAgICAgICAgICAgICAgICAgICBmb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIGJsdXI6IGhhbmRsZUJsdXJcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2NvcGVdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID57e2xvY2FsaXphdGlvbi5nZXQoJ2FjY2VwdCcpfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UaW1lU2VsZWN0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogSW50bFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFRpbWVQaWNrZXJET01TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogUGlja2VyU2VydmljZSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblRpbWVTZWxlY3RvckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBhY2NlcHQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydhY2NlcHQnLF0gfV0sXG4gICAgY2FuY2VsOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY2FuY2VsJyxdIH1dLFxuICAgIG5vdzogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ25vdycsXSB9XSxcbiAgICB0aW1lTGlzdHM6IFt7IHR5cGU6IFZpZXdDaGlsZHJlbiwgYXJnczogW1RpbWVMaXN0Q29tcG9uZW50LF0gfV0sXG4gICAgdGltZUxpc3RXcmFwcGVyczogW3sgdHlwZTogVmlld0NoaWxkcmVuLCBhcmdzOiBbJ2xpc3RXcmFwcGVyJyxdIH1dLFxuICAgIGNvbXBvbmVudENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXRpbWVzZWxlY3RvcicsXSB9XSxcbiAgICBkaXNhYmxlZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0YXRlLWRpc2FibGVkJyxdIH1dLFxuICAgIGZvcm1hdDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNhbmNlbEJ1dHRvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2V0QnV0dG9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBub3dCdXR0b246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzdGVwczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdmFsdWVSZWplY3Q6IFt7IHR5cGU6IE91dHB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFRpbWVQaWNrZXJNZXNzYWdlcyBleHRlbmRzIENvbXBvbmVudE1lc3NhZ2VzIHtcbn1cblRpbWVQaWNrZXJNZXNzYWdlcy5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBhY2NlcHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjY2VwdExhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjYW5jZWw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNhbmNlbExhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBub3c6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5vd0xhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b2dnbGU6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgVGltZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlIGV4dGVuZHMgVGltZVBpY2tlck1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuVGltZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRpbWVQaWNrZXJNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb1RpbWVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRpbWVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBDdXN0b20gY29tcG9uZW50IG1lc3NhZ2VzIG92ZXJyaWRlIGRlZmF1bHQgY29tcG9uZW50IG1lc3NhZ2VzIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZ2xvYmFsaXphdGlvbl9kYXRlaW5wdXRzICV9I3RvYy1jdXN0b20tbWVzc2FnZXMpKS5cbiAqL1xuY2xhc3MgVGltZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgVGltZVBpY2tlck1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxuICAgIGdldCBvdmVycmlkZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuVGltZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRpbWVQaWNrZXJNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVQaWNrZXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRpbWVwaWNrZXItbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UaW1lUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBUaW1lU2VsZWN0b3JMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIFRpbWVQaWNrZXJNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbn1cblRpbWVTZWxlY3RvckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRpbWVQaWNrZXJNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVTZWxlY3RvckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlKSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvVGltZVNlbGVjdG9yTG9jYWxpemVkTWVzc2FnZXNdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UaW1lU2VsZWN0b3JMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKlxuICogQ3VzdG9tIGNvbXBvbmVudCBtZXNzYWdlcyBvdmVycmlkZSBkZWZhdWx0IGNvbXBvbmVudCBtZXNzYWdlcy5cbiAqL1xuY2xhc3MgVGltZVNlbGVjdG9yQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBUaW1lUGlja2VyTWVzc2FnZXMge1xuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5UaW1lU2VsZWN0b3JDdXN0b21NZXNzYWdlc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBUaW1lUGlja2VyTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lU2VsZWN0b3JDdXN0b21NZXNzYWdlc0NvbXBvbmVudCkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRpbWVzZWxlY3Rvci1tZXNzYWdlcycsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRpbWVTZWxlY3RvckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG5jb25zdCBDT01QT05FTlRfRElSRUNUSVZFUyQyID0gW1xuICAgIFRpbWVQaWNrZXJMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSxcbiAgICBUaW1lTGlzdENvbXBvbmVudCxcbiAgICBUaW1lUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsXG4gICAgVGltZVBpY2tlckNvbXBvbmVudCxcbiAgICBUaW1lU2VsZWN0b3JMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSxcbiAgICBUaW1lU2VsZWN0b3JDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICBUaW1lU2VsZWN0b3JDb21wb25lbnRcbl07XG5jb25zdCBDT01QT05FTlRfTU9EVUxFUyQxID0gW1xuICAgIERhdGVJbnB1dE1vZHVsZSxcbiAgICBJbnRsTW9kdWxlLFxuICAgIFBvcHVwTW9kdWxlLFxuICAgIFZpcnR1YWxpemF0aW9uTW9kdWxlLFxuICAgIEV2ZW50c01vZHVsZVxuXTtcbmNvbnN0IMm1MCRuID0gdG91Y2hFbmFibGVkO1xuY29uc3QgcHJvdmlkZXJzID0gW1xuICAgIFRpbWVQaWNrZXJET01TZXJ2aWNlLFxuICAgIEhvdXJzU2VydmljZSxcbiAgICBNaW51dGVzU2VydmljZSxcbiAgICBTZWNvbmRzU2VydmljZSxcbiAgICBEYXlQZXJpb2RTZXJ2aWNlLFxuICAgIHtcbiAgICAgICAgcHJvdmlkZTogVE9VQ0hfRU5BQkxFRCxcbiAgICAgICAgdXNlVmFsdWU6IMm1MCRuXG4gICAgfVxuXTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIFRpbWVQaWNrZXIgY29tcG9uZW50LlxuICovXG5jbGFzcyBUaW1lUGlja2VyTW9kdWxlIHtcbn1cblRpbWVQaWNrZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0NPTVBPTkVOVF9ESVJFQ1RJVkVTJDJdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtDT01QT05FTlRfRElSRUNUSVZFUyQyXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCAuLi5DT01QT05FTlRfTU9EVUxFUyQxXSxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVyc1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWVzc2FnZXMkMSBleHRlbmRzIENvbXBvbmVudE1lc3NhZ2VzIHtcbn1cbk1lc3NhZ2VzJDEucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdG9nZ2xlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRlVGFiOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRlVGFiTGFiZWw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRpbWVUYWI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRpbWVUYWJMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWNjZXB0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY2NlcHRMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY2FuY2VsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjYW5jZWxMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG9kYXk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5vdzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbm93TGFiZWw6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEN1c3RvbSBjb21wb25lbnQgbWVzc2FnZXMgb3ZlcnJpZGUgZGVmYXVsdCBjb21wb25lbnQgbWVzc2FnZXMgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBnbG9iYWxpemF0aW9uX2RhdGVpbnB1dHMgJX0jdG9jLWN1c3RvbS1tZXNzYWdlcykpLlxuICovXG5jbGFzcyBEYXRlVGltZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgTWVzc2FnZXMkMSB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbkRhdGVUaW1lUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMkMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVUaW1lUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZGF0ZXRpbWVwaWNrZXItbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EYXRlVGltZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUgZXh0ZW5kcyBNZXNzYWdlcyQxIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMkMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IExvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RhdGVUaW1lUGlja2VyTG9jYWxpemVkTWVzc2FnZXNdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Mb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuY29uc3QgQ09NUE9ORU5UX0RJUkVDVElWRVMkMyA9IFtcbiAgICBEYXRlVGltZVBpY2tlckNvbXBvbmVudCxcbiAgICBEYXRlVGltZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgIExvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlXG5dO1xuY29uc3QgybUwJG8gPSB0b3VjaEVuYWJsZWQ7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBEYXRlVGltZVBpY2tlciBjb21wb25lbnQuXG4gKi9cbmNsYXNzIERhdGVUaW1lUGlja2VyTW9kdWxlIHtcbn1cbkRhdGVUaW1lUGlja2VyTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4uQ09NUE9ORU5UX0RJUkVDVElWRVMkM1xuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICAuLi5DT01QT05FTlRfRElSRUNUSVZFUyQzLFxuICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZXNNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBJbnRsTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBEYXRlSW5wdXRNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBUaW1lUGlja2VyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBQb3B1cE1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRzTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZXNNb2R1bGVcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IFRPVUNIX0VOQUJMRUQsIHVzZVZhbHVlOiDJtTAkbyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG5jb25zdCBDT01QT05FTlRfTU9EVUxFUyQyID0gW1xuICAgIENhbGVuZGFyc01vZHVsZSxcbiAgICBEYXRlSW5wdXRNb2R1bGUsXG4gICAgRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBUaW1lUGlja2VyTW9kdWxlLFxuICAgIERhdGVSYW5nZU1vZHVsZSxcbiAgICBEYXRlVGltZVBpY2tlck1vZHVsZVxuXTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIERhdGUgSW5wdXRzIGNvbXBvbmVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgRGF0ZSBJbnB1dHMgbW9kdWxlXG4gKiBpbXBvcnQgeyBEYXRlSW5wdXRzTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGF0ZWlucHV0cyc7XG4gKlxuICogLy8gVGhlIGJyb3dzZXIgcGxhdGZvcm0gd2l0aCBhIGNvbXBpbGVyXG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIC8vIEltcG9ydCB0aGUgYXBwIGNvbXBvbmVudFxuICogaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbiAqXG4gKiAvLyBEZWZpbmUgdGhlIGFwcCBtb2R1bGVcbiAqIF9ATmdNb2R1bGUoe1xuICogICAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sIC8vIGRlY2xhcmUgdGhlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBEYXRlSW5wdXRzTW9kdWxlXSwgLy8gaW1wb3J0IHRoZSBEYXRlIElucHV0cyBtb2R1bGVcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICpcbiAqIC8vIENvbXBpbGUgYW5kIGxhdW5jaCB0aGUgbW9kdWxlXG4gKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIERhdGVJbnB1dHNNb2R1bGUge1xufVxuRGF0ZUlucHV0c01vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0czogQ09NUE9ORU5UX01PRFVMRVMkMixcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBDT01QT05FTlRfTU9EVUxFUyQyXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0IHsgQ2FsZW5kYXJDb21tb25Nb2R1bGUsIENBTEVOREFSX1JBTkdFX1ZBTElEQVRPUlMsIENBTEVOREFSX1ZBTFVFX0FDQ0VTU09SLCBLRU5ET19JTlBVVF9QUk9WSURFUiwgS0Zvck9mLCBLRm9yT2ZDb250ZXh0LCBIZWFkZXJDb21wb25lbnQsIEhvcml6b250YWxWaWV3TGlzdENvbXBvbmVudCwgQ2FsZW5kYXJNZXNzYWdlcywgTXVsdGlWaWV3Q2FsZW5kYXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCwgTWVzc2FnZXMsIFJBTkdFX0NBTEVOREFSX1JBTkdFX1ZBTElEQVRPUlMsIFJBTkdFX0NBTEVOREFSX1ZBTFVFX0FDQ0VTU09SLCBOYXZpZ2F0aW9uQ29tcG9uZW50LCBCdXNWaWV3U2VydmljZSwgQ2VudHVyeVZpZXdTZXJ2aWNlLCBEZWNhZGVWaWV3U2VydmljZSwgRGlzYWJsZWREYXRlc1NlcnZpY2UsIENhbGVuZGFyRE9NU2VydmljZSwgTW9udGhWaWV3U2VydmljZSwgTmF2aWdhdGlvblNlcnZpY2UsIFNjcm9sbFN5bmNTZXJ2aWNlLCBXZWVrTmFtZXNTZXJ2aWNlLCBZZWFyVmlld1NlcnZpY2UsIFRlbXBsYXRlc01vZHVsZSwgQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBDZW50dXJ5Q2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBEZWNhZGVDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIEhlYWRlclRpdGxlVGVtcGxhdGVEaXJlY3RpdmUsIE1vbnRoQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBOYXZpZ2F0aW9uSXRlbVRlbXBsYXRlRGlyZWN0aXZlLCBXZWVrTnVtYmVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBZZWFyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBWaWV3TGlzdENvbXBvbmVudCwgVmlld0NvbXBvbmVudCwgUGlja2VyU2VydmljZSwgRGF0ZUlucHV0TWVzc2FnZXMsIERhdGVQaWNrZXJNZXNzYWdlcywgRGF0ZVJhbmdlSW5wdXQsIERhdGVSYW5nZVBvcHVwVGVtcGxhdGVEaXJlY3RpdmUsIERhdGVUaW1lUGlja2VyQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsIExvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLCBNZXNzYWdlcyQxLCBUaW1lUGlja2VyTWVzc2FnZXMsIFRpbWVQaWNrZXJDdXN0b21NZXNzYWdlc0NvbXBvbmVudCwgVGltZVNlbGVjdG9yQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsIERheVBlcmlvZFNlcnZpY2UsIFRpbWVQaWNrZXJET01TZXJ2aWNlLCBIb3Vyc1NlcnZpY2UsIE1pbnV0ZXNTZXJ2aWNlLCBTZWNvbmRzU2VydmljZSwgVGltZUxpc3RDb21wb25lbnQsIFRpbWVTZWxlY3RvckNvbXBvbmVudCwgVE9VQ0hfRU5BQkxFRCwgU2Nyb2xsZXJTZXJ2aWNlLCBERUZBVUxUX1NDUk9MTEVSX0ZBQ1RPUlksIFNDUk9MTEVSX0ZBQ1RPUllfVE9LRU4sIFZpcnR1YWxpemF0aW9uQ29tcG9uZW50LCBWaXJ0dWFsaXphdGlvbk1vZHVsZSwgQ2FsZW5kYXJDb21wb25lbnQsIERhdGVJbnB1dENvbXBvbmVudCwgRGF0ZVBpY2tlckNvbXBvbmVudCwgVGltZVBpY2tlckNvbXBvbmVudCwgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQsIE11bHRpVmlld0NhbGVuZGFyQ29tcG9uZW50LCBEYXRlUmFuZ2VDb21wb25lbnQsIERhdGVSYW5nZVBvcHVwQ29tcG9uZW50LCBEYXRlUmFuZ2VFbmRJbnB1dERpcmVjdGl2ZSwgRGF0ZVJhbmdlU3RhcnRJbnB1dERpcmVjdGl2ZSwgRGF0ZVJhbmdlU2VsZWN0aW9uRGlyZWN0aXZlLCBDYWxlbmRhck1vZHVsZSwgQ2FsZW5kYXJzTW9kdWxlLCBEYXRlSW5wdXRNb2R1bGUsIERhdGVQaWNrZXJNb2R1bGUsIERhdGVJbnB1dHNNb2R1bGUsIFRpbWVQaWNrZXJNb2R1bGUsIERhdGVUaW1lUGlja2VyTW9kdWxlLCBNdWx0aVZpZXdDYWxlbmRhck1vZHVsZSwgRGF0ZVJhbmdlTW9kdWxlLCBEYXRlUmFuZ2VTZXJ2aWNlLCBDYWxlbmRhckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LCBEYXRlSW5wdXRDdXN0b21NZXNzYWdlc0NvbXBvbmVudCwgRGF0ZVBpY2tlckN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LCBQcmV2ZW50YWJsZUV2ZW50LCBDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLCBNdWx0aVZpZXdDYWxlbmRhckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLCBEYXRlSW5wdXRMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgRGF0ZVBpY2tlckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLCBUaW1lUGlja2VyTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUsIFRpbWVTZWxlY3RvckxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlIH07XG4iXX0=","export function saveAs(data, fileName, options = {}) {\n let save = postToProxy;\n\n if (options.forceProxy && !options.proxyURL) {\n throw new Error('No proxyURL is set, but forceProxy is true');\n }\n\n if (!options.forceProxy) {\n if (canDownload()) {\n save = saveAsDataURI;\n }\n\n if (navigator.msSaveBlob) {\n save = saveAsBlob;\n }\n }\n\n save(data, fileName, options);\n}\n\nconst anchor = () => document.createElement('a');\nconst canDownload = () => 'download' in anchor();\n\nfunction saveAsBlob(data, fileName) {\n let blob = data; // could be a Blob object\n\n if (typeof data === 'string') {\n const parts = data.split(';base64,');\n const contentType = parts[0];\n const base64 = atob(parts[1]);\n const array = new Uint8Array(base64.length);\n\n for (let idx = 0; idx < base64.length; idx++) {\n array[idx] = base64.charCodeAt(idx);\n }\n\n blob = new Blob([ array.buffer ], { type: contentType });\n }\n\n navigator.msSaveBlob(blob, fileName);\n}\n\nfunction saveAsDataURI(data, fileName) {\n let dataURI = data;\n if (window.Blob && data instanceof Blob) {\n dataURI = URL.createObjectURL(data);\n }\n\n const fileSaver = anchor();\n fileSaver.download = fileName;\n fileSaver.href = dataURI;\n\n const e = document.createEvent('MouseEvents');\n e.initMouseEvent('click', true, false, window,\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n fileSaver.dispatchEvent(e);\n setTimeout(() => URL.revokeObjectURL(dataURI));\n}\n\nfunction postToProxy(dataURI, fileName, options) {\n if (!options.proxyURL) {\n return;\n }\n\n const form = document.createElement('form');\n form.setAttribute('action', options.proxyURL);\n form.setAttribute('method', 'POST');\n form.setAttribute('target', options.proxyTarget || '_self');\n\n const formData = options.proxyData || {};\n formData.fileName = fileName;\n\n const parts = dataURI.split(\";base64,\");\n formData.contentType = parts[0].replace(\"data:\", \"\");\n formData.base64 = parts[1];\n\n for (let name in formData) {\n if (formData.hasOwnProperty(name)) {\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', name);\n input.setAttribute('value', formData[name]);\n\n form.appendChild(input);\n }\n }\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n\n","let current = {\n toString: (value) => value\n};\n\nclass IntlService {\n static register(userImplementation) {\n current = userImplementation;\n }\n\n static toString(value, format) {\n return current.toString(value, format);\n }\n}\n\nexport default IntlService;","let current = {\n compile: function(template) {\n return template;\n }\n};\n\nclass TemplateService {\n static register(userImplementation) {\n current = userImplementation;\n }\n\n static compile(template) {\n return current.compile(template);\n }\n}\n\nexport default TemplateService;","const FIELD_REGEX = /\\[(?:(\\d+)|['\"](.*?)['\"])\\]|((?:(?!\\[.*?\\]|\\.).)+)/g;\nconst getterCache = {};\nconst UNDEFINED = 'undefined';\n\ngetterCache[UNDEFINED] = function(obj) {\n return obj;\n};\n\nexport default function getter(field) {\n if (getterCache[field]) {\n return getterCache[field];\n }\n\n const fields = [];\n field.replace(FIELD_REGEX, function(match, index, indexAccessor, field) {\n fields.push(typeof index !== UNDEFINED ? index : (indexAccessor || field));\n });\n\n getterCache[field] = function(obj) {\n let result = obj;\n for (let idx = 0; idx < fields.length && result; idx++) {\n result = result[fields[idx]];\n }\n\n return result;\n };\n\n return getterCache[field];\n}","export default function map(array, func) {\n return array.reduce((result, el, i) => {\n const val = func(el, i);\n if (val != null) {\n result.push(val);\n }\n return result;\n }, []);\n}","import TemplateService from './services/template-service';\nimport getter from './utils/getter';\nimport map from './utils/map';\n\nfunction defaultGroupHeaderTemplate(data) {\n return `${ data.title }: ${ data.value }`;\n}\n\nfunction createArray(length, callback) {\n const result = [];\n\n for (let idx = 0; idx < length; idx++) {\n result.push(callback(idx));\n }\n\n return result;\n}\n\nfunction defaultItemId(item) {\n return item.id;\n}\n\nclass ExcelExporter {\n constructor(options) {\n options.columns = this._trimColumns(options.columns || []);\n\n this.allColumns = map(this._leafColumns(options.columns || []), this._prepareColumn);\n\n this.columns = this._visibleColumns(this.allColumns);\n\n this.options = options;\n this.data = options.data || [];\n this.aggregates = options.aggregates || {};\n this.groups = [].concat(options.groups || []);\n this.hasGroups = this.groups.length > 0;\n this.hierarchy = options.hierarchy;\n this.hasGroupHeaderColumn = this.columns.some(column => column.groupHeaderColumnTemplate);\n this.collapsible = this.options.collapsible;\n }\n\n workbook() {\n const workbook = {\n sheets: [ {\n columns: this._columns(),\n rows: this.hierarchy ? this._hierarchyRows() : this._rows(),\n freezePane: this._freezePane(),\n filter: this._filter()\n } ]\n };\n\n return workbook;\n }\n\n _trimColumns(columns) {\n return columns.filter((column) => {\n let result = Boolean(column.field);\n\n if (!result && column.columns) {\n result = this._trimColumns(column.columns).length > 0;\n }\n\n return result;\n });\n }\n\n _leafColumns(columns) {\n let result = [];\n\n for (let idx = 0; idx < columns.length; idx++) {\n if (!columns[idx].columns) {\n result.push(columns[idx]);\n } else {\n result = result.concat(this._leafColumns(columns[idx].columns));\n }\n }\n\n return result;\n }\n\n _prepareColumn(column) {\n if (!column.field) {\n return null;\n }\n\n let value = function(dataItem) {\n return getter(column.field, true)(dataItem);\n };\n\n let values = null;\n\n if (column.values) {\n values = {};\n\n column.values.forEach(function(item) {\n values[item.value] = item.text;\n });\n\n value = function(dataItem) {\n return values[getter(column.field, true)(dataItem)];\n };\n }\n\n return Object.assign({}, column, {\n value: value,\n values: values,\n groupHeaderTemplate: column.groupHeaderTemplate ? TemplateService.compile(column.groupHeaderTemplate) : defaultGroupHeaderTemplate,\n groupHeaderColumnTemplate: column.groupHeaderColumnTemplate ? TemplateService.compile(column.groupHeaderColumnTemplate) : null,\n groupFooterTemplate: column.groupFooterTemplate ? TemplateService.compile(column.groupFooterTemplate) : null,\n footerTemplate: column.footerTemplate ? TemplateService.compile(column.footerTemplate) : null\n });\n }\n\n _filter() {\n if (!this.options.filterable) {\n return null;\n }\n\n const depth = this._depth();\n\n return {\n from: depth,\n to: depth + this.columns.length - 1\n };\n }\n\n _createPaddingCells(length) {\n return createArray(length, () => Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\"\n }, this.options.paddingCellOptions));\n }\n\n _dataRow(dataItem, level, depth) {\n let cells = this._createPaddingCells(level);\n\n // grouped\n if (this.hasGroups && depth && dataItem.items) {\n cells = cells.concat(this._groupHeaderCells(dataItem, level, depth));\n const rows = this._dataRows(dataItem.items, level + 1);\n\n rows.unshift({\n type: \"group-header\",\n cells: cells,\n level: this.collapsible ? level : null\n });\n\n return rows.concat(this._footer(dataItem, level));\n }\n\n const dataCells = [];\n\n for (let cellIdx = 0; cellIdx < this.columns.length; cellIdx++) {\n dataCells[cellIdx] = this._cell(dataItem, this.columns[cellIdx]);\n }\n\n if (this.hierarchy) {\n dataCells[0].colSpan = depth - level + 1;\n }\n\n return [ {\n type: \"data\",\n cells: cells.concat(dataCells),\n level: this.collapsible ? level : null\n } ];\n }\n\n _groupHeaderCells(dataItem, level, depth) {\n const cells = [];\n\n const column = this.allColumns.filter(function(column) {\n return column.field === dataItem.field;\n })[0] || {};\n\n const title = column && column.title ? column.title : dataItem.field;\n const template = column ? column.groupHeaderTemplate || column.groupHeaderColumnTemplate : null;\n const group = Object.assign({\n title: title,\n field: dataItem.field,\n value: column && column.values ? column.values[dataItem.value] : dataItem.value,\n aggregates: dataItem.aggregates,\n items: dataItem.items\n }, dataItem.aggregates[dataItem.field]);\n\n const value = template ? template(group) : `${ title }: ${ dataItem.value }`;\n\n cells.push(Object.assign({\n value: value,\n background: \"#dfdfdf\",\n color: \"#333\",\n colSpan: (this.hasGroupHeaderColumn ? 1 : this.columns.length) + depth - level\n }, column.groupHeaderCellOptions));\n\n if (this.hasGroupHeaderColumn) {\n this.columns.forEach(function(column, index) {\n if (index > 0) {\n cells.push(Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\",\n value: column.groupHeaderColumnTemplate ?\n column.groupHeaderColumnTemplate(Object.assign({ group: group }, group, dataItem.aggregates[column.field])) :\n undefined\n }, column.groupHeaderCellOptions));\n }\n });\n }\n\n return cells;\n }\n\n _dataRows(dataItems, level) {\n const depth = this._depth();\n const rows = [];\n\n for (let idx = 0; idx < dataItems.length; idx++) {\n rows.push.apply(rows, this._dataRow(dataItems[idx], level, depth));\n }\n\n return rows;\n }\n\n _hierarchyRows() {\n const depth = this._depth();\n const data = this.data;\n const itemLevel = this.hierarchy.itemLevel;\n const itemId = this.hierarchy.itemId || defaultItemId;\n const hasFooter = this._hasFooterTemplate();\n const rows = [];\n const parents = [];\n let previousLevel = 0;\n let previousItemId;\n\n if (!hasFooter) {\n this.collapsible = false;\n }\n\n for (let idx = 0; idx < data.length; idx++) {\n const item = data[idx];\n const level = itemLevel(item, idx);\n\n if (hasFooter) {\n if (level > previousLevel) {\n parents.push({ id: previousItemId, level: previousLevel });\n } else if (level < previousLevel) {\n rows.push.apply(rows, this._hierarchyFooterRows(parents, level, depth));\n }\n\n previousLevel = level;\n previousItemId = itemId(item, idx);\n }\n\n rows.push.apply(rows, this._dataRow(item, level + 1, depth));\n }\n\n if (hasFooter) {\n rows.push.apply(rows, this._hierarchyFooterRows(parents, 0, depth));\n\n const rootAggregate = data.length ? this.aggregates[data[0].parentId] : {};\n rows.push(this._hierarchyFooter(rootAggregate, 0, depth));\n }\n\n this._prependHeaderRows(rows);\n\n return rows;\n }\n\n _hierarchyFooterRows(parents, currentLevel, depth) {\n const rows = [];\n while (parents.length && parents[parents.length - 1].level >= currentLevel) {\n const parent = parents.pop();\n rows.push(this._hierarchyFooter(this.aggregates[parent.id], parent.level + 1, depth));\n }\n\n return rows;\n }\n\n _hasFooterTemplate() {\n const columns = this.columns;\n for (let idx = 0; idx < columns.length; idx++) {\n if (columns[idx].footerTemplate) {\n return true;\n }\n }\n }\n\n _hierarchyFooter(aggregates, level, depth) {\n const cells = this.columns.map(function(column, index) {\n const colSpan = index ? 1 : depth - level + 1;\n if (column.footerTemplate) {\n const fieldAggregates = (aggregates || {})[column.field];\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\",\n colSpan: colSpan,\n value: column.footerTemplate(Object.assign({ aggregates: aggregates }, fieldAggregates))\n }, column.footerCellOptions);\n }\n\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\",\n colSpan: colSpan\n }, column.footerCellOptions);\n });\n\n return {\n type: \"footer\",\n cells: this._createPaddingCells(level).concat(cells),\n level: this.collapsible ? level : null\n };\n }\n\n _footer(dataItem, level) {\n const rows = [];\n const footer = this.columns.some(column => column.groupFooterTemplate);\n\n let templateData, group;\n if (footer) {\n group = {\n group: { items: dataItem.items,\n field: dataItem.field,\n value: dataItem.value }\n };\n templateData = {};\n Object.keys(dataItem.aggregates).forEach(key => {\n templateData[key] = Object.assign({}, dataItem.aggregates[key], group);\n });\n }\n\n const cells = this.columns.map((column) => {\n if (column.groupFooterTemplate) {\n let data = Object.assign({}, templateData, dataItem.aggregates[column.field], group);\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\",\n value: column.groupFooterTemplate(data)\n }, column.groupFooterCellOptions);\n }\n\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\"\n }, column.groupFooterCellOptions);\n });\n\n if (footer) {\n rows.push({\n type: \"group-footer\",\n cells: this._createPaddingCells(this.groups.length).concat(cells),\n level: this.collapsible ? level : null\n });\n }\n\n return rows;\n }\n\n _isColumnVisible(column) {\n return this._visibleColumns([ column ]).length > 0 && (column.field || column.columns);\n }\n\n _visibleColumns(columns) {\n return columns.filter((column) => {\n let exportable = column.exportable;\n if (typeof exportable === 'object') {\n exportable = column.exportable.excel;\n }\n\n const visibleInExport = !column.hidden && exportable !== false;\n const visibleInExportOnly = column.hidden && exportable === true;\n let visible = visibleInExport || visibleInExportOnly;\n if (visible && column.columns) {\n visible = this._visibleColumns(column.columns).length > 0;\n }\n return visible;\n });\n }\n\n _headerRow(row, groups) {\n const headers = row.cells.map(function(cell) {\n return Object.assign(cell, {\n colSpan: cell.colSpan > 1 ? cell.colSpan : 1,\n rowSpan: row.rowSpan > 1 && !cell.colSpan ? row.rowSpan : 1\n });\n });\n\n if (this.hierarchy && headers[0].firstCell) {\n headers[0].colSpan += this._depth();\n }\n\n return {\n type: \"header\",\n cells: createArray(groups.length, () => Object.assign({\n background: \"#7a7a7a\",\n color: \"#fff\"\n }, this.options.headerPaddingCellOptions)).concat(headers)\n };\n }\n\n _prependHeaderRows(rows) {\n const groups = this.groups;\n\n const headerRows = [ { rowSpan: 1, cells: [], index: 0 } ];\n\n this._prepareHeaderRows(headerRows, this.options.columns);\n\n for (let idx = headerRows.length - 1; idx >= 0; idx--) {\n rows.unshift(this._headerRow(headerRows[idx], groups));\n }\n }\n\n _prepareHeaderRows(rows, columns, parentCell, parentRow) {\n const row = parentRow || rows[rows.length - 1];\n let childRow = rows[row.index + 1];\n let totalColSpan = 0;\n\n for (let idx = 0; idx < columns.length; idx++) {\n const column = columns[idx];\n if (this._isColumnVisible(column)) {\n\n const cell = Object.assign({\n background: \"#7a7a7a\",\n color: \"#fff\",\n value: column.title || column.field,\n colSpan: 0,\n firstCell: idx === 0 && (!parentCell || parentCell.firstCell)\n }, column.headerCellOptions);\n row.cells.push(cell);\n\n if (column.columns && column.columns.length) {\n if (!childRow) {\n childRow = { rowSpan: 0, cells: [], index: rows.length };\n rows.push(childRow);\n }\n cell.colSpan = this._trimColumns(this._visibleColumns(column.columns)).length;\n this._prepareHeaderRows(rows, column.columns, cell, childRow);\n totalColSpan += cell.colSpan - 1;\n row.rowSpan = rows.length - row.index;\n }\n }\n }\n\n if (parentCell) {\n parentCell.colSpan += totalColSpan;\n }\n }\n\n _rows() {\n const rows = this._dataRows(this.data, 0);\n\n if (this.columns.length) {\n this._prependHeaderRows(rows);\n let footer = false;\n\n const cells = this.columns.map((column) => {\n if (column.footerTemplate) {\n footer = true;\n\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\",\n value: column.footerTemplate(Object.assign({}, this.aggregates, this.aggregates[column.field]))\n }, column.footerCellOptions);\n }\n\n return Object.assign({\n background: \"#dfdfdf\",\n color: \"#333\"\n }, column.footerCellOptions);\n });\n\n if (footer) {\n rows.push({\n type: \"footer\",\n cells: this._createPaddingCells(this.groups.length).concat(cells)\n });\n }\n }\n\n return rows;\n }\n\n _headerDepth(columns) {\n const result = 1;\n let max = 0;\n\n for (let idx = 0; idx < columns.length; idx++) {\n if (columns[idx].columns) {\n const temp = this._headerDepth(columns[idx].columns);\n if (temp > max) {\n max = temp;\n }\n }\n }\n return result + max;\n }\n\n _freezePane() {\n const columns = this._visibleColumns(this.options.columns || []);\n\n const colSplit = this._visibleColumns(this._trimColumns(this._leafColumns(columns.filter(function(column) {\n return column.locked;\n })))).length;\n\n return {\n rowSplit: this._headerDepth(columns),\n colSplit: colSplit ? colSplit + this.groups.length : 0\n };\n }\n\n _cell(dataItem, column) {\n return Object.assign({\n value: column.value(dataItem)\n }, column.cellOptions);\n }\n\n _depth() {\n let depth = 0;\n\n if (this.hierarchy) {\n depth = this.hierarchy.depth;\n } else {\n depth = this.groups.length;\n }\n\n return depth;\n }\n\n _columns() {\n const depth = this._depth();\n const columns = createArray(depth, () => ({ width: 20 }));\n\n return columns.concat(this.columns.map(function(column) {\n return {\n width: parseInt(column.width, 10),\n autoWidth: column.width ? false : true\n };\n }));\n }\n}\n\nexport default ExcelExporter;\n","import { Deflate, Inflate } from '@progress/pako-esm';\n\n/**\n * Let the user use/change some implementations.\n */\nvar external = {\n Promise: Promise\n};\n\nconst support = {\n base64: true,\n array: true,\n string: true,\n nodebuffer: false,\n nodestream: false,\n\n get arraybuffer() {\n return typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n },\n\n // Returns true if JSZip can read/generate Uint8Array, false otherwise.\n get uint8array() {\n return typeof Uint8Array !== \"undefined\";\n },\n\n get blob() {\n return blob();\n }\n};\n\nlet blob = function() {\n let supported;\n\n if (typeof ArrayBuffer === \"undefined\") {\n supported = false;\n } else {\n const buffer = new ArrayBuffer(0);\n try {\n supported = new Blob([ buffer ], {\n type: \"application/zip\"\n }).size === 0;\n } catch (e) {\n supported = false;\n }\n }\n\n blob = () => supported;\n return supported;\n};\n\n/* eslint-disable */\n\n// private property\nconst _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n// public method for encoding\nconst encode = function(input) {\n let output = [];\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n let i = 0, len = input.length, remainingBytes = len;\n\n let isArray = typeof input !== \"string\";\n while (i < input.length) {\n remainingBytes = len - i;\n\n if (!isArray) {\n chr1 = input.charCodeAt(i++);\n chr2 = i < len ? input.charCodeAt(i++) : 0;\n chr3 = i < len ? input.charCodeAt(i++) : 0;\n } else {\n chr1 = input[i++];\n chr2 = i < len ? input[i++] : 0;\n chr3 = i < len ? input[i++] : 0;\n }\n\n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = remainingBytes > 1 ? (((chr2 & 15) << 2) | (chr3 >> 6)) : 64;\n enc4 = remainingBytes > 2 ? (chr3 & 63) : 64;\n\n output.push(_keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4));\n\n }\n\n return output.join(\"\");\n};\n\n// public method for decoding\nconst decode = function(input) {\n let chr1, chr2, chr3;\n let enc1, enc2, enc3, enc4;\n let i = 0, resultIndex = 0;\n\n let dataUrlPrefix = \"data:\";\n\n if (input.substr(0, dataUrlPrefix.length) === dataUrlPrefix) {\n // This is a common error: people give a data url\n // (data:image/png;base64,iVBOR...) with a {base64: true} and\n // wonders why things don't work.\n // We can detect that the string input looks like a data url but we\n // *can't* be sure it is one: removing everything up to the comma would\n // be too dangerous.\n throw new Error(\"Invalid base64 input, it looks like a data url.\");\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n let totalLength = input.length * 3 / 4;\n if(input.charAt(input.length - 1) === _keyStr.charAt(64)) {\n totalLength--;\n }\n if(input.charAt(input.length - 2) === _keyStr.charAt(64)) {\n totalLength--;\n }\n if (totalLength % 1 !== 0) {\n // totalLength is not an integer, the length does not match a valid\n // base64 content. That can happen if:\n // - the input is not a base64 content\n // - the input is *almost* a base64 content, with a extra chars at the\n // beginning or at the end\n // - the input uses a base64 letiant (base64url for example)\n throw new Error(\"Invalid base64 input, bad content length.\");\n }\n let output;\n if (support.uint8array) {\n output = new Uint8Array(totalLength|0);\n } else {\n output = new Array(totalLength|0);\n }\n\n while (i < input.length) {\n\n enc1 = _keyStr.indexOf(input.charAt(i++));\n enc2 = _keyStr.indexOf(input.charAt(i++));\n enc3 = _keyStr.indexOf(input.charAt(i++));\n enc4 = _keyStr.indexOf(input.charAt(i++));\n\n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n\n output[resultIndex++] = chr1;\n\n if (enc3 !== 64) {\n output[resultIndex++] = chr2;\n }\n if (enc4 !== 64) {\n output[resultIndex++] = chr3;\n }\n\n }\n\n return output;\n};\n\n/* eslint-disable */\n\n/**\n * Convert a string that pass as a \"binary string\": it should represent a byte\n * array but may have > 255 char codes. Be sure to take only the first byte\n * and returns the byte array.\n * @param {String} str the string to transform.\n * @return {Array|Uint8Array} the string in a binary format.\n */\nfunction string2binary(str) {\n var result = null;\n if (support.uint8array) {\n result = new Uint8Array(str.length);\n } else {\n result = new Array(str.length);\n }\n return stringToArrayLike(str, result);\n}\n\n/**\n * Create a new blob with the given content and the given type.\n * @param {String|ArrayBuffer} part the content to put in the blob. DO NOT use\n * an Uint8Array because the stock browser of android 4 won't accept it (it\n * will be silently converted to a string, \"[object Uint8Array]\").\n *\n * Use only ONE part to build the blob to avoid a memory leak in IE11 / Edge:\n * when a large amount of Array is used to create the Blob, the amount of\n * memory consumed is nearly 100 times the original data amount.\n *\n * @param {String} type the mime type of the blob.\n * @return {Blob} the created blob.\n */\nconst newBlob = function(part, type) {\n checkSupport(\"blob\");\n\n // Blob constructor\n return new Blob([part], {\n type: type\n });\n};\n\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n for (var i = 0; i < str.length; ++i) {\n array[i] = str.charCodeAt(i) & 0xFF;\n }\n return array;\n}\n\n/**\n * Transform an array of int into a string, chunk by chunk.\n * See the performances notes on arrayLikeToString.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @param {String} type the type of the array.\n * @param {Integer} chunk the chunk size.\n * @return {String} the resulting string.\n * @throws Error if the chunk is too big for the stack.\n */\nfunction stringifyByChunk(array, type, chunk) {\n var result = [], k = 0, len = array.length;\n // shortcut\n if (len <= chunk) {\n return String.fromCharCode.apply(null, array);\n }\n while (k < len) {\n if (type === \"array\") {\n result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n }\n else {\n result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n }\n k += chunk;\n }\n return result.join(\"\");\n}\n\n/**\n * Call String.fromCharCode on every item in the array.\n * This is the naive implementation, which generate A LOT of intermediate string.\n * This should be used when everything else fail.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction stringifyByChar(array) {\n var resultStr = \"\";\n for(var i = 0; i < array.length; i++) {\n resultStr += String.fromCharCode(array[i]);\n }\n return resultStr;\n}\n\n/**\n * true if the browser accepts to use String.fromCharCode on Uint8Array\n */\nlet fromCharCodeSupportsTypedArrays = () => {\n let supported;\n try {\n supported = support.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n } catch (e) {\n supported = false;\n }\n\n fromCharCodeSupportsTypedArrays = () => supported;\n return supported;\n};\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n // Performances notes :\n // --------------------\n // String.fromCharCode.apply(null, array) is the fastest, see\n // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n // but the stack is limited (and we can get huge arrays !).\n //\n // result += String.fromCharCode(array[i]); generate too many strings !\n //\n // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n // TODO : we now have workers that split the work. Do we still need that ?\n var chunk = 65536,\n type = getTypeOf(array),\n canUseApply = true;\n if (type === \"uint8array\") {\n canUseApply = fromCharCodeSupportsTypedArrays();\n }\n\n if (canUseApply) {\n while (chunk > 1) {\n try {\n return stringifyByChunk(array, type, chunk);\n } catch (e) {\n chunk = Math.floor(chunk / 2);\n }\n }\n }\n\n // no apply or chunk error : slow and painful algorithm\n // default browser on android 4.*\n return stringifyByChar(array);\n}\n\nconst applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n for (var i = 0; i < arrayFrom.length; i++) {\n arrayTo[i] = arrayFrom[i];\n }\n return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {\n // string to ?\n \"string\": {\n \"string\": identity,\n \"array\": function(input) {\n return stringToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return transform[\"string\"][\"uint8array\"](input).buffer;\n },\n \"uint8array\": function(input) {\n return stringToArrayLike(input, new Uint8Array(input.length));\n }\n },\n\n // array to ?\n \"array\": {\n \"string\": arrayLikeToString,\n \"array\": identity,\n \"arraybuffer\": function(input) {\n return (new Uint8Array(input)).buffer;\n },\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n }\n },\n\n // arraybuffer to ?\n \"arraybuffer\": {\n \"string\": function(input) {\n return arrayLikeToString(new Uint8Array(input));\n },\n \"array\": function(input) {\n return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n },\n \"arraybuffer\": identity,\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n }\n },\n\n // uint8array to ?\n \"uint8array\": {\n \"string\": arrayLikeToString,\n \"array\": function(input) {\n return arrayLikeToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return input.buffer;\n },\n \"uint8array\": identity\n }\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nconst transformTo = function(outputType, input) {\n if (!input) {\n // undefined, null, etc\n // an empty string won't harm.\n input = \"\";\n }\n if (!outputType) {\n return input;\n }\n checkSupport(outputType);\n var inputType = getTypeOf(input);\n var result = transform[inputType][outputType](input);\n return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nconst getTypeOf = function(input) {\n if (typeof input === \"string\") {\n return \"string\";\n }\n if (Object.prototype.toString.call(input) === \"[object Array]\") {\n return \"array\";\n }\n if (support.uint8array && input instanceof Uint8Array) {\n return \"uint8array\";\n }\n if (support.arraybuffer && input instanceof ArrayBuffer) {\n return \"arraybuffer\";\n }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nconst checkSupport = function(type) {\n var supported = support[type.toLowerCase()];\n if (!supported) {\n throw new Error(type + \" is not supported by this platform\");\n }\n};\n\nconst MAX_VALUE_16BITS = 65535;\nconst MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nconst pretty = function(str) {\n var res = '',\n code, i;\n for (i = 0; i < (str || \"\").length; i++) {\n code = str.charCodeAt(i);\n res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n }\n return res;\n};\n\n/**\n * Defer the call of a function.\n * @param {Function} callback the function to call asynchronously.\n * @param {Array} args the arguments to give to the callback.\n */\nconst delay = function(callback, args, self) {\n setTimeout(function() {\n callback.apply(self || null, args || []);\n }, 0);\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nconst extend = function() {\n var result = {}, i, attr;\n for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n for (attr in arguments[i]) {\n if (Object.hasOwnProperty.call(arguments[i], attr) && typeof result[attr] === \"undefined\") {\n result[attr] = arguments[i][attr];\n }\n }\n }\n return result;\n};\n\n/**\n * Transform arbitrary content into a Promise.\n * @param {String} name a name for the content being processed.\n * @param {Object} inputData the content to process.\n * @param {Boolean} isBinary true if the content is not an unicode string\n * @param {Boolean} isOptimizedBinaryString true if the string content only has one byte per character.\n * @param {Boolean} isBase64 true if the string content is encoded with base64.\n * @return {Promise} a promise in a format usable by JSZip.\n */\nconst prepareContent = function(name, inputData, isBinary, isOptimizedBinaryString, isBase64) {\n\n // if inputData is already a promise, this flatten it.\n var promise = external.Promise.resolve(inputData).then(function(data) {\n\n\n var isBlob = support.blob && (data instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(data)) !== -1);\n\n if (isBlob && typeof FileReader !== \"undefined\") {\n return new external.Promise(function (resolve, reject) {\n var reader = new FileReader();\n\n reader.onload = function(e) {\n resolve(e.target.result);\n };\n reader.onerror = function(e) {\n reject(e.target.error);\n };\n reader.readAsArrayBuffer(data);\n });\n } else {\n return data;\n }\n });\n\n return promise.then(function(data) {\n var dataType = getTypeOf(data);\n\n if (!dataType) {\n return external.Promise.reject(\n new Error(\"Can't read the data of '\" + name + \"'. Is it \" +\n \"in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\")\n );\n }\n // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n if (dataType === \"arraybuffer\") {\n data = transformTo(\"uint8array\", data);\n } else if (dataType === \"string\") {\n if (isBase64) {\n data = decode(data);\n }\n else if (isBinary) {\n // optimizedBinaryString === true means that the file has already been filtered with a 0xFF mask\n if (isOptimizedBinaryString !== true) {\n // this is a string, not in a base64 format.\n // Be sure that this is a correct \"binary string\"\n data = string2binary(data);\n }\n }\n }\n return data;\n });\n};\n\n/* eslint-disable */\n\n/**\n * A worker that does nothing but passing chunks to the next one. This is like\n * a nodejs stream but with some differences. On the good side :\n * - it works on IE 6-9 without any issue / polyfill\n * - it weights less than the full dependencies bundled with browserify\n * - it forwards errors (no need to declare an error handler EVERYWHERE)\n *\n * A chunk is an object with 2 attributes : `meta` and `data`. The former is an\n * object containing anything (`percent` for example), see each worker for more\n * details. The latter is the real data (String, Uint8Array, etc).\n *\n * @constructor\n * @param {String} name the name of the stream (mainly used for debugging purposes)\n */\nclass GenericWorker {\n constructor(name) {\n // the name of the worker\n this.name = name || \"default\";\n // an object containing metadata about the workers chain\n this.streamInfo = {};\n // an error which happened when the worker was paused\n this.generatedError = null;\n // an object containing metadata to be merged by this worker into the general metadata\n this.extraStreamInfo = {};\n // true if the stream is paused (and should not do anything), false otherwise\n this.isPaused = true;\n // true if the stream is finished (and should not do anything), false otherwise\n this.isFinished = false;\n // true if the stream is locked to prevent further structure updates (pipe), false otherwise\n this.isLocked = false;\n // the event listeners\n this._listeners = {\n 'data':[],\n 'end':[],\n 'error':[]\n };\n // the previous worker, if any\n this.previous = null;\n }\n\n /**\n * Push a chunk to the next workers.\n * @param {Object} chunk the chunk to push\n */\n push(chunk) {\n this.emit(\"data\", chunk);\n }\n\n /**\n * End the stream.\n * @return {Boolean} true if this call ended the worker, false otherwise.\n */\n end() {\n if (this.isFinished) {\n return false;\n }\n\n this.flush();\n try {\n this.emit(\"end\");\n this.cleanUp();\n this.isFinished = true;\n } catch (e) {\n this.emit(\"error\", e);\n }\n return true;\n }\n\n /**\n * End the stream with an error.\n * @param {Error} e the error which caused the premature end.\n * @return {Boolean} true if this call ended the worker with an error, false otherwise.\n */\n error(e) {\n if (this.isFinished) {\n return false;\n }\n\n if(this.isPaused) {\n this.generatedError = e;\n } else {\n this.isFinished = true;\n\n this.emit(\"error\", e);\n\n // in the workers chain exploded in the middle of the chain,\n // the error event will go downward but we also need to notify\n // workers upward that there has been an error.\n if(this.previous) {\n this.previous.error(e);\n }\n\n this.cleanUp();\n }\n return true;\n }\n\n /**\n * Add a callback on an event.\n * @param {String} name the name of the event (data, end, error)\n * @param {Function} listener the function to call when the event is triggered\n * @return {GenericWorker} the current object for chainability\n */\n on(name, listener) {\n this._listeners[name].push(listener);\n return this;\n }\n\n /**\n * Clean any references when a worker is ending.\n */\n cleanUp() {\n this.streamInfo = this.generatedError = this.extraStreamInfo = null;\n this._listeners = [];\n }\n\n /**\n * Trigger an event. This will call registered callback with the provided arg.\n * @param {String} name the name of the event (data, end, error)\n * @param {Object} arg the argument to call the callback with.\n */\n emit(name, arg) {\n if (this._listeners[name]) {\n for(var i = 0; i < this._listeners[name].length; i++) {\n this._listeners[name][i].call(this, arg);\n }\n }\n }\n\n /**\n * Chain a worker with an other.\n * @param {Worker} next the worker receiving events from the current one.\n * @return {worker} the next worker for chainability\n */\n pipe(next) {\n return next.registerPrevious(this);\n }\n\n /**\n * Same as `pipe` in the other direction.\n * Using an API with `pipe(next)` is very easy.\n * Implementing the API with the point of view of the next one registering\n * a source is easier, see the ZipFileWorker.\n * @param {Worker} previous the previous worker, sending events to this one\n * @return {Worker} the current worker for chainability\n */\n registerPrevious(previous) {\n if (this.isLocked) {\n throw new Error(\"The stream '\" + this + \"' has already been used.\");\n }\n\n // sharing the streamInfo...\n this.streamInfo = previous.streamInfo;\n // ... and adding our own bits\n this.mergeStreamInfo();\n this.previous = previous;\n var self = this;\n previous.on('data', function (chunk) {\n self.processChunk(chunk);\n });\n previous.on('end', function () {\n self.end();\n });\n previous.on('error', function (e) {\n self.error(e);\n });\n return this;\n }\n\n /**\n * Pause the stream so it doesn't send events anymore.\n * @return {Boolean} true if this call paused the worker, false otherwise.\n */\n pause() {\n if(this.isPaused || this.isFinished) {\n return false;\n }\n this.isPaused = true;\n\n if(this.previous) {\n this.previous.pause();\n }\n return true;\n }\n\n /**\n * Resume a paused stream.\n * @return {Boolean} true if this call resumed the worker, false otherwise.\n */\n resume() {\n if(!this.isPaused || this.isFinished) {\n return false;\n }\n this.isPaused = false;\n\n // if true, the worker tried to resume but failed\n var withError = false;\n if(this.generatedError) {\n this.error(this.generatedError);\n withError = true;\n }\n if(this.previous) {\n this.previous.resume();\n }\n\n return !withError;\n }\n\n /**\n * Flush any remaining bytes as the stream is ending.\n */\n flush() {}\n\n /**\n * Process a chunk. This is usually the method overridden.\n * @param {Object} chunk the chunk to process.\n */\n processChunk(chunk) {\n this.push(chunk);\n }\n\n /**\n * Add a key/value to be added in the workers chain streamInfo once activated.\n * @param {String} key the key to use\n * @param {Object} value the associated value\n * @return {Worker} the current worker for chainability\n */\n withStreamInfo(key, value) {\n this.extraStreamInfo[key] = value;\n this.mergeStreamInfo();\n return this;\n }\n\n /**\n * Merge this worker's streamInfo into the chain's streamInfo.\n */\n mergeStreamInfo() {\n for(var key in this.extraStreamInfo) {\n if (!this.extraStreamInfo.hasOwnProperty(key)) {\n continue;\n }\n this.streamInfo[key] = this.extraStreamInfo[key];\n }\n }\n\n /**\n * Lock the stream to prevent further updates on the workers chain.\n * After calling this method, all calls to pipe will fail.\n */\n lock() {\n if (this.isLocked) {\n throw new Error(\"The stream '\" + this + \"' has already been used.\");\n }\n this.isLocked = true;\n if (this.previous) {\n this.previous.lock();\n }\n }\n\n /**\n *\n * Pretty print the workers chain.\n */\n toString() {\n var me = \"Worker \" + this.name;\n if (this.previous) {\n return this.previous + \" -> \" + me;\n } else {\n return me;\n }\n }\n}\n\n/* eslint-disable */\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Returns the utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nlet utf8len = function(c) {\n const _utf8len = new Array(256);\n for (let i = 0; i < 256; i++) {\n _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n }\n _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n // Memoize table after first call\n utf8len = function(c) {\n return _utf8len[c];\n };\n\n return _utf8len[c];\n};\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n if (support.uint8array) {\n buf = new Uint8Array(buf_len);\n } else {\n buf = new Array(buf_len);\n }\n\n // convert\n for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = function(buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max-1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Fuckup - very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means vuffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + utf8len(buf[pos]) > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n var i, out, c, c_len;\n var len = buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len*2);\n\n for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n // shrinkBuf(utf16buf, out)\n if (utf16buf.length !== out) {\n if(utf16buf.subarray) {\n utf16buf = utf16buf.subarray(0, out);\n } else {\n utf16buf.length = out;\n }\n }\n\n // return String.fromCharCode.apply(null, utf16buf);\n return applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nconst utf8encode = function utf8encode(str) {\n return string2buf(str);\n};\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nconst utf8decode = function utf8decode(buf) {\n buf = transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n return buf2string(buf);\n};\n\n/**\n * A worker to decode utf8 encoded binary chunks into string chunks.\n * @constructor\n */\nclass Utf8DecodeWorker extends GenericWorker {\n constructor() {\n super(\"utf-8 decode\");\n\n // the last bytes if a chunk didn't end with a complete codepoint.\n this.leftOver = null;\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk (chunk) {\n var data = transformTo(support.uint8array ? \"uint8array\" : \"array\", chunk.data);\n\n // 1st step, re-use what's left of the previous chunk\n if (this.leftOver && this.leftOver.length) {\n if(support.uint8array) {\n var previousData = data;\n data = new Uint8Array(previousData.length + this.leftOver.length);\n data.set(this.leftOver, 0);\n data.set(previousData, this.leftOver.length);\n } else {\n data = this.leftOver.concat(data);\n }\n this.leftOver = null;\n }\n\n var nextBoundary = utf8border(data);\n var usableData = data;\n if (nextBoundary !== data.length) {\n if (support.uint8array) {\n usableData = data.subarray(0, nextBoundary);\n this.leftOver = data.subarray(nextBoundary, data.length);\n } else {\n usableData = data.slice(0, nextBoundary);\n this.leftOver = data.slice(nextBoundary, data.length);\n }\n }\n\n this.push({\n data : utf8decode(usableData),\n meta : chunk.meta\n });\n }\n\n /**\n * @see GenericWorker.flush\n */\n flush() {\n if (this.leftOver && this.leftOver.length) {\n this.push({\n data : utf8decode(this.leftOver),\n meta : {}\n });\n this.leftOver = null;\n }\n }\n}\n\n/**\n * A worker to endcode string chunks into utf8 encoded binary chunks.\n * @constructor\n */\nclass Utf8EncodeWorker extends GenericWorker {\n constructor() {\n super(\"utf-8 encode\");\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk(chunk) {\n this.push({\n data: utf8encode(chunk.data),\n meta: chunk.meta\n });\n }\n}\n\n/**\n * A worker which convert chunks to a specified type.\n * @constructor\n * @param {String} destType the destination type.\n */\nclass ConvertWorker extends GenericWorker {\n constructor(destType) {\n super(\"ConvertWorker to \" + destType);\n this.destType = destType;\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk(chunk) {\n this.push({\n data: transformTo(this.destType, chunk.data),\n meta: chunk.meta\n });\n }\n}\n\n/* eslint-disable */\n\n/**\n * Apply the final transformation of the data. If the user wants a Blob for\n * example, it's easier to work with an U8intArray and finally do the\n * ArrayBuffer/Blob conversion.\n * @param {String} type the name of the final type\n * @param {String|Uint8Array|Buffer} content the content to transform\n * @param {String} mimeType the mime type of the content, if applicable.\n * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the content in the right format.\n */\nfunction transformZipOutput(type, content, mimeType) {\n switch(type) {\n case \"blob\" :\n return newBlob(transformTo(\"arraybuffer\", content), mimeType);\n case \"base64\" :\n return encode(content);\n default :\n return transformTo(type, content);\n }\n}\n\n/**\n * Concatenate an array of data of the given type.\n * @param {String} type the type of the data in the given array.\n * @param {Array} dataArray the array containing the data chunks to concatenate\n * @return {String|Uint8Array|Buffer} the concatenated data\n * @throws Error if the asked type is unsupported\n */\nfunction concat (type, dataArray) {\n var i, index = 0, res = null, totalLength = 0;\n for(i = 0; i < dataArray.length; i++) {\n totalLength += dataArray[i].length;\n }\n switch(type) {\n case \"string\":\n return dataArray.join(\"\");\n case \"array\":\n return Array.prototype.concat.apply([], dataArray);\n case \"uint8array\":\n res = new Uint8Array(totalLength);\n for(i = 0; i < dataArray.length; i++) {\n res.set(dataArray[i], index);\n index += dataArray[i].length;\n }\n return res;\n default:\n throw new Error(\"concat : unsupported type '\" + type + \"'\");\n }\n}\n\n/**\n * Listen a StreamHelper, accumulate its content and concatenate it into a\n * complete block.\n * @param {StreamHelper} helper the helper to use.\n * @param {Function} updateCallback a callback called on each update. Called\n * with one arg :\n * - the metadata linked to the update received.\n * @return Promise the promise for the accumulation.\n */\nfunction accumulate(helper, updateCallback) {\n return new external.Promise(function (resolve, reject){\n var dataArray = [];\n var chunkType = helper._internalType,\n resultType = helper._outputType,\n mimeType = helper._mimeType;\n helper\n .on('data', function (data, meta) {\n dataArray.push(data);\n if(updateCallback) {\n updateCallback(meta);\n }\n })\n .on('error', function(err) {\n dataArray = [];\n reject(err);\n })\n .on('end', function (){\n try {\n var result = transformZipOutput(resultType, concat(chunkType, dataArray), mimeType);\n resolve(result);\n } catch (e) {\n reject(e);\n }\n dataArray = [];\n })\n .resume();\n });\n}\n\n/**\n * An helper to easily use workers outside of JSZip.\n * @constructor\n * @param {Worker} worker the worker to wrap\n * @param {String} outputType the type of data expected by the use\n * @param {String} mimeType the mime type of the content, if applicable.\n */\nclass StreamHelper {\n constructor (worker, outputType, mimeType) {\n var internalType = outputType;\n switch(outputType) {\n case \"blob\":\n case \"arraybuffer\":\n internalType = \"uint8array\";\n break;\n case \"base64\":\n internalType = \"string\";\n break;\n }\n\n try {\n // the type used internally\n this._internalType = internalType;\n // the type used to output results\n this._outputType = outputType;\n // the mime type\n this._mimeType = mimeType;\n checkSupport(internalType);\n this._worker = worker.pipe(new ConvertWorker(internalType));\n // the last workers can be rewired without issues but we need to\n // prevent any updates on previous workers.\n worker.lock();\n } catch(e) {\n this._worker = new GenericWorker(\"error\");\n this._worker.error(e);\n }\n }\n\n /**\n * Listen a StreamHelper, accumulate its content and concatenate it into a\n * complete block.\n * @param {Function} updateCb the update callback.\n * @return Promise the promise for the accumulation.\n */\n accumulate(updateCb) {\n return accumulate(this, updateCb);\n }\n\n /**\n * Add a listener on an event triggered on a stream.\n * @param {String} evt the name of the event\n * @param {Function} fn the listener\n * @return {StreamHelper} the current helper.\n */\n on(evt, fn) {\n var self = this;\n\n if(evt === \"data\") {\n this._worker.on(evt, function (chunk) {\n fn.call(self, chunk.data, chunk.meta);\n });\n } else {\n this._worker.on(evt, function () {\n delay(fn, arguments, self);\n });\n }\n return this;\n }\n\n /**\n * Resume the flow of chunks.\n * @return {StreamHelper} the current helper.\n */\n resume() {\n delay(this._worker.resume, [], this._worker);\n return this;\n }\n\n /**\n * Pause the flow of chunks.\n * @return {StreamHelper} the current helper.\n */\n pause() {\n this._worker.pause();\n return this;\n }\n}\n\nconst base64 = false;\nconst binary = false;\nconst dir = false;\nconst createFolders = true;\nconst date = null;\nconst compression = null;\nconst compressionOptions = null;\nconst comment = null;\nconst unixPermissions = null;\nconst dosPermissions = null;\n\nvar defaults = /*#__PURE__*/Object.freeze({\n __proto__: null,\n base64: base64,\n binary: binary,\n dir: dir,\n createFolders: createFolders,\n date: date,\n compression: compression,\n compressionOptions: compressionOptions,\n comment: comment,\n unixPermissions: unixPermissions,\n dosPermissions: dosPermissions\n});\n\n/* eslint-disable */\n\n// the size of the generated chunks\n// TODO expose this as a public variable\nconst DEFAULT_BLOCK_SIZE = 16 * 1024;\n\n/**\n * A worker that reads a content and emits chunks.\n * @constructor\n * @param {Promise} dataP the promise of the data to split\n */\nclass DataWorker extends GenericWorker {\n constructor(dataP) {\n super(\"DataWorker\");\n var self = this;\n this.dataIsReady = false;\n this.index = 0;\n this.max = 0;\n this.data = null;\n this.type = \"\";\n\n this._tickScheduled = false;\n\n dataP.then(function (data) {\n self.dataIsReady = true;\n self.data = data;\n self.max = data && data.length || 0;\n self.type = getTypeOf(data);\n if(!self.isPaused) {\n self._tickAndRepeat();\n }\n }, function (e) {\n self.error(e);\n });\n }\n\n /**\n * @see GenericWorker.cleanUp\n */\n cleanUp() {\n super.cleanUp();\n this.data = null;\n }\n\n /**\n * @see GenericWorker.resume\n */\n resume() {\n if(!super.resume()) {\n return false;\n }\n\n if (!this._tickScheduled && this.dataIsReady) {\n this._tickScheduled = true;\n delay(this._tickAndRepeat, [], this);\n }\n return true;\n }\n\n /**\n * Trigger a tick a schedule an other call to this function.\n */\n _tickAndRepeat() {\n this._tickScheduled = false;\n if(this.isPaused || this.isFinished) {\n return;\n }\n this._tick();\n if(!this.isFinished) {\n delay(this._tickAndRepeat, [], this);\n this._tickScheduled = true;\n }\n };\n\n /**\n * Read and push a chunk.\n */\n _tick() {\n\n if(this.isPaused || this.isFinished) {\n return false;\n }\n\n var size = DEFAULT_BLOCK_SIZE;\n var data = null, nextIndex = Math.min(this.max, this.index + size);\n if (this.index >= this.max) {\n // EOF\n return this.end();\n } else {\n switch(this.type) {\n case \"string\":\n data = this.data.substring(this.index, nextIndex);\n break;\n case \"uint8array\":\n data = this.data.subarray(this.index, nextIndex);\n break;\n case \"array\":\n data = this.data.slice(this.index, nextIndex);\n break;\n }\n this.index = nextIndex;\n return this.push({\n data : data,\n meta : {\n percent : this.max ? this.index / this.max * 100 : 0\n }\n });\n }\n }\n}\n\n/**\n * A worker which calculate the total length of the data flowing through.\n * @constructor\n * @param {String} propName the name used to expose the length\n */\nclass DataLengthProbe extends GenericWorker {\n constructor(propName) {\n super(\"DataLengthProbe for \" + propName);\n this.propName = propName;\n this.withStreamInfo(propName, 0);\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk(chunk) {\n if (chunk) {\n const length = this.streamInfo[this.propName] || 0;\n this.streamInfo[this.propName] = length + chunk.data.length;\n }\n super.processChunk(chunk);\n }\n}\n\n/* eslint-disable */\n\n/**\n * The following functions come from pako, from pako/lib/zlib/crc32.js\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\nlet makeTable = function() {\n // Use ordinary array, since untyped makes no boost here\n const table = [];\n\n for (let n =0; n < 256; n++){\n let c = n;\n for(let k =0; k < 8; k++){\n c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n // Memoize table on first call.\n makeTable = function() {\n return table;\n };\n\n return table;\n};\n\nfunction crc32(crc, buf, len, pos) {\n const t = makeTable();\n let end = pos + len;\n\n crc = crc ^ (-1);\n\n for (let i = pos; i < end; i++ ) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n// That's all for the pako functions.\n\n/**\n * Compute the crc32 of a string.\n * This is almost the same as the function crc32, but for strings. Using the\n * same function for the two use cases leads to horrible performances.\n * @param {Number} crc the starting value of the crc.\n * @param {String} str the string to use.\n * @param {Number} len the length of the string.\n * @param {Number} pos the starting position for the crc32 computation.\n * @return {Number} the computed crc32.\n */\nfunction crc32str(crc, str, len, pos) {\n const t = makeTable();\n let end = pos + len;\n\n crc = crc ^ (-1);\n\n for (let i = pos; i < end; i++ ) {\n crc = (crc >>> 8) ^ t[(crc ^ str.charCodeAt(i)) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\nfunction crc32wrapper(input, crc) {\n if (typeof input === \"undefined\" || !input.length) {\n return 0;\n }\n\n const isArray = getTypeOf(input) !== \"string\";\n\n if (isArray) {\n return crc32(crc | 0, input, input.length, 0);\n } else {\n return crc32str(crc | 0, input, input.length, 0);\n }\n}\n\n/**\n * A worker which calculate the crc32 of the data flowing through.\n * @constructor\n */\nclass Crc32Probe extends GenericWorker {\n constructor() {\n super(\"Crc32Probe\");\n this.withStreamInfo(\"crc32\", 0);\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk(chunk) {\n this.streamInfo.crc32 = crc32wrapper(chunk.data, this.streamInfo.crc32 || 0);\n this.push(chunk);\n }\n}\n\n/* eslint-disable */\n\n/**\n * Represent a compressed object, with everything needed to decompress it.\n * @constructor\n * @param {number} compressedSize the size of the data compressed.\n * @param {number} uncompressedSize the size of the data after decompression.\n * @param {number} crc32 the crc32 of the decompressed file.\n * @param {object} compression the type of compression, see lib/compressions.js.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data.\n */\nclass CompressedObject {\n constructor(compressedSize, uncompressedSize, crc32, compression, data) {\n this.compressedSize = compressedSize;\n this.uncompressedSize = uncompressedSize;\n this.crc32 = crc32;\n this.compression = compression;\n this.compressedContent = data;\n }\n\n /**\n * Create a worker to get the uncompressed content.\n * @return {GenericWorker} the worker.\n */\n getContentWorker() {\n var worker = new DataWorker(external.Promise.resolve(this.compressedContent))\n .pipe(this.compression.uncompressWorker())\n .pipe(new DataLengthProbe(\"data_length\"));\n\n var that = this;\n worker.on(\"end\", function () {\n if(this.streamInfo['data_length'] !== that.uncompressedSize) {\n throw new Error(\"Bug : uncompressed data size mismatch\");\n }\n });\n return worker;\n }\n\n /**\n * Create a worker to get the compressed content.\n * @return {GenericWorker} the worker.\n */\n getCompressedWorker() {\n return new DataWorker(external.Promise.resolve(this.compressedContent))\n .withStreamInfo(\"compressedSize\", this.compressedSize)\n .withStreamInfo(\"uncompressedSize\", this.uncompressedSize)\n .withStreamInfo(\"crc32\", this.crc32)\n .withStreamInfo(\"compression\", this.compression)\n ;\n }\n\n /**\n * Chain the given worker with other workers to compress the content with the\n * given compression.\n * @param {GenericWorker} uncompressedWorker the worker to pipe.\n * @param {Object} compression the compression object.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return {GenericWorker} the new worker compressing the content.\n */\n static createWorkerFrom(uncompressedWorker, compression, compressionOptions) {\n return uncompressedWorker\n .pipe(new Crc32Probe())\n .pipe(new DataLengthProbe(\"uncompressedSize\"))\n .pipe(compression.compressWorker(compressionOptions))\n .pipe(new DataLengthProbe(\"compressedSize\"))\n .withStreamInfo(\"compression\", compression);\n }\n}\n\n/* eslint-disable */\n\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nclass ZipObject {\n constructor(name, data, options) {\n this.name = name;\n this.dir = options.dir;\n this.date = options.date;\n this.comment = options.comment;\n this.unixPermissions = options.unixPermissions;\n this.dosPermissions = options.dosPermissions;\n\n this._data = data;\n this._dataBinary = options.binary;\n // keep only the compression\n this.options = {\n compression : options.compression,\n compressionOptions : options.compressionOptions\n };\n }\n\n /**\n * Create an internal stream for the content of this object.\n * @param {String} type the type of each chunk.\n * @return StreamHelper the stream.\n */\n internalStream(type) {\n var result = null, outputType = \"string\";\n try {\n if (!type) {\n throw new Error(\"No output type specified.\");\n }\n outputType = type.toLowerCase();\n var askUnicodeString = outputType === \"string\" || outputType === \"text\";\n if (outputType === \"binarystring\" || outputType === \"text\") {\n outputType = \"string\";\n }\n result = this._decompressWorker();\n\n var isUnicodeString = !this._dataBinary;\n\n if (isUnicodeString && !askUnicodeString) {\n result = result.pipe(new Utf8EncodeWorker());\n }\n if (!isUnicodeString && askUnicodeString) {\n result = result.pipe(new Utf8DecodeWorker());\n }\n } catch (e) {\n result = new GenericWorker(\"error\");\n result.error(e);\n }\n\n return new StreamHelper(result, outputType, \"\");\n }\n\n /**\n * Prepare the content in the asked type.\n * @param {String} type the type of the result.\n * @param {Function} onUpdate a function to call on each internal update.\n * @return Promise the promise of the result.\n */\n async(type, onUpdate) {\n return this.internalStream(type).accumulate(onUpdate);\n }\n\n /**\n * Return a worker for the compressed content.\n * @private\n * @param {Object} compression the compression object to use.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return Worker the worker.\n */\n _compressWorker(compression, compressionOptions) {\n if (\n this._data instanceof CompressedObject &&\n this._data.compression.magic === compression.magic\n ) {\n return this._data.getCompressedWorker();\n } else {\n var result = this._decompressWorker();\n if(!this._dataBinary) {\n result = result.pipe(new Utf8EncodeWorker());\n }\n return CompressedObject.createWorkerFrom(result, compression, compressionOptions);\n }\n }\n\n /**\n * Return a worker for the decompressed content.\n * @private\n * @return Worker the worker.\n */\n _decompressWorker() {\n if (this._data instanceof CompressedObject) {\n return this._data.getContentWorker();\n } else if (this._data instanceof GenericWorker) {\n return this._data;\n } else {\n return new DataWorker(this._data);\n }\n }\n}\n\nlet arrayType = function() {\n const useTypedArray = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n const resolved = useTypedArray ? \"uint8array\" : \"array\";\n\n arrayType = function() {\n return resolved;\n };\n};\n\n/**\n * Create a worker that uses pako to inflate/deflate.\n * @constructor\n * @param {String} action the name of the pako function to call : either \"Deflate\" or \"Inflate\".\n * @param {Object} options the options to use when (de)compressing.\n */\nclass FlateWorker extends GenericWorker {\n constructor(action, options) {\n super(\"FlateWorker/\" + action);\n\n this._pako = null;\n this._pakoAction = action;\n this._pakoOptions = options;\n // the `meta` object from the last chunk received\n // this allow this worker to pass around metadata\n this.meta = {};\n }\n\n /**\n * @see GenericWorker.processChunk\n */\n processChunk(chunk) {\n this.meta = chunk.meta;\n if (this._pako === null) {\n this._createPako();\n }\n this._pako.push(transformTo(arrayType(), chunk.data), false);\n }\n\n /**\n * @see GenericWorker.flush\n */\n flush() {\n super.flush();\n if (this._pako === null) {\n this._createPako();\n }\n this._pako.push([], true);\n }\n /**\n * @see GenericWorker.cleanUp\n */\n cleanUp() {\n super.cleanUp();\n this._pako = null;\n }\n\n /**\n * Create the _pako object.\n * TODO: lazy-loading this object isn't the best solution but it's the\n * quickest. The best solution is to lazy-load the worker list. See also the\n * issue #446.\n */\n _createPako() {\n const params = {\n raw: true,\n level: this._pakoOptions.level || -1 // default compression\n };\n this._pako = this._pakoAction === 'Deflate' ? new Deflate(params) : new Inflate(params);\n this._pako.onData = (data) => {\n this.push({\n data: data,\n meta: this.meta\n });\n };\n }\n}\n\nvar DEFLATE = {\n magic: \"\\x08\\x00\",\n compressWorker: function(compressionOptions) {\n return new FlateWorker(\"Deflate\", compressionOptions);\n },\n\n uncompressWorker: function() {\n return new FlateWorker(\"Inflate\", {});\n }\n};\n\nconst STORE = {\n magic: \"\\x00\\x00\",\n compressWorker: function() {\n return new GenericWorker(\"STORE compression\");\n },\n uncompressWorker: function() {\n return new GenericWorker(\"STORE decompression\");\n }\n};\n\nvar compressions = {\n STORE,\n DEFLATE\n};\n\nconst LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nconst CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nconst CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nconst ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nconst ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nconst DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n/* eslint-disable */\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n var hex = \"\", i;\n for (i = 0; i < bytes; i++) {\n hex += String.fromCharCode(dec & 0xff);\n dec = dec >>> 8;\n }\n return hex;\n};\n\n/**\n * Generate the UNIX part of the external file attributes.\n * @param {Object} unixPermissions the unix permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :\n *\n * TTTTsstrwxrwxrwx0000000000ADVSHR\n * ^^^^____________________________ file type, see zipinfo.c (UNX_*)\n * ^^^_________________________ setuid, setgid, sticky\n * ^^^^^^^^^________________ permissions\n * ^^^^^^^^^^______ not used ?\n * ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only\n */\nvar generateUnixExternalFileAttr = function (unixPermissions, isDir) {\n\n var result = unixPermissions;\n if (!unixPermissions) {\n // I can't use octal values in strict mode, hence the hexa.\n // 040775 => 0x41fd\n // 0100664 => 0x81b4\n result = isDir ? 0x41fd : 0x81b4;\n }\n return (result & 0xFFFF) << 16;\n};\n\n/**\n * Generate the DOS part of the external file attributes.\n * @param {Object} dosPermissions the dos permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * Bit 0 Read-Only\n * Bit 1 Hidden\n * Bit 2 System\n * Bit 3 Volume Label\n * Bit 4 Directory\n * Bit 5 Archive\n */\nvar generateDosExternalFileAttr = function (dosPermissions, isDir) {\n\n // the dir flag is already set for compatibility\n return (dosPermissions || 0) & 0x3F;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {Object} streamInfo the hash with information about the compressed file.\n * @param {Boolean} streamedContent is the content streamed ?\n * @param {Boolean} streamingEnded is the stream finished ?\n * @param {number} offset the current offset from the start of the zip file.\n * @param {String} platform let's pretend we are this platform (change platform dependents fields)\n * @param {Function} encodeFileName the function to encode the file name / comment.\n * @return {Object} the zip parts.\n */\nvar generateZipParts = function(streamInfo, streamedContent, streamingEnded, offset, platform, encodeFileName) {\n var file = streamInfo['file'],\n compression = streamInfo['compression'],\n useCustomEncoding = encodeFileName !== utf8encode,\n encodedFileName = transformTo(\"string\", encodeFileName(file.name)),\n utfEncodedFileName = transformTo(\"string\", utf8encode(file.name)),\n comment = file.comment,\n encodedComment = transformTo(\"string\", encodeFileName(comment)),\n utfEncodedComment = transformTo(\"string\", utf8encode(comment)),\n useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n useUTF8ForComment = utfEncodedComment.length !== comment.length,\n dosTime,\n dosDate,\n extraFields = \"\",\n unicodePathExtraField = \"\",\n unicodeCommentExtraField = \"\",\n dir = file.dir,\n date = file.date;\n\n\n var dataInfo = {\n crc32 : 0,\n compressedSize : 0,\n uncompressedSize : 0\n };\n\n // if the content is streamed, the sizes/crc32 are only available AFTER\n // the end of the stream.\n if (!streamedContent || streamingEnded) {\n dataInfo.crc32 = streamInfo['crc32'];\n dataInfo.compressedSize = streamInfo['compressedSize'];\n dataInfo.uncompressedSize = streamInfo['uncompressedSize'];\n }\n\n var bitflag = 0;\n if (streamedContent) {\n // Bit 3: the sizes/crc32 are set to zero in the local header.\n // The correct values are put in the data descriptor immediately\n // following the compressed data.\n bitflag |= 0x0008;\n }\n if (!useCustomEncoding && (useUTF8ForFileName || useUTF8ForComment)) {\n // Bit 11: Language encoding flag (EFS).\n bitflag |= 0x0800;\n }\n\n\n var extFileAttr = 0;\n var versionMadeBy = 0;\n if (dir) {\n // dos or unix, we set the dos dir flag\n extFileAttr |= 0x00010;\n }\n if(platform === \"UNIX\") {\n versionMadeBy = 0x031E; // UNIX, version 3.0\n extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);\n } else { // DOS or other, fallback to DOS\n versionMadeBy = 0x0014; // DOS, version 2.0\n extFileAttr |= generateDosExternalFileAttr(file.dosPermissions);\n }\n\n // date\n // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n dosTime = date.getUTCHours();\n dosTime = dosTime << 6;\n dosTime = dosTime | date.getUTCMinutes();\n dosTime = dosTime << 5;\n dosTime = dosTime | date.getUTCSeconds() / 2;\n\n dosDate = date.getUTCFullYear() - 1980;\n dosDate = dosDate << 4;\n dosDate = dosDate | (date.getUTCMonth() + 1);\n dosDate = dosDate << 5;\n dosDate = dosDate | date.getUTCDate();\n\n if (useUTF8ForFileName) {\n // set the unicode path extra field. unzip needs at least one extra\n // field to correctly handle unicode path, so using the path is as good\n // as any other information. This could improve the situation with\n // other archive managers too.\n // This field is usually used without the utf8 flag, with a non\n // unicode path in the header (winrar, winzip). This helps (a bit)\n // with the messy Windows' default compressed folders feature but\n // breaks on p7zip which doesn't seek the unicode path extra field.\n // So for now, UTF-8 everywhere !\n unicodePathExtraField =\n // Version\n decToHex(1, 1) +\n // NameCRC32\n decToHex(crc32wrapper(encodedFileName), 4) +\n // UnicodeName\n utfEncodedFileName;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x70\" +\n // size\n decToHex(unicodePathExtraField.length, 2) +\n // content\n unicodePathExtraField;\n }\n\n if(useUTF8ForComment) {\n\n unicodeCommentExtraField =\n // Version\n decToHex(1, 1) +\n // CommentCRC32\n decToHex(crc32wrapper(encodedComment), 4) +\n // UnicodeName\n utfEncodedComment;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x63\" +\n // size\n decToHex(unicodeCommentExtraField.length, 2) +\n // content\n unicodeCommentExtraField;\n }\n\n var header = \"\";\n\n // version needed to extract\n header += \"\\x0A\\x00\";\n // general purpose bit flag\n header += decToHex(bitflag, 2);\n // compression method\n header += compression.magic;\n // last mod file time\n header += decToHex(dosTime, 2);\n // last mod file date\n header += decToHex(dosDate, 2);\n // crc-32\n header += decToHex(dataInfo.crc32, 4);\n // compressed size\n header += decToHex(dataInfo.compressedSize, 4);\n // uncompressed size\n header += decToHex(dataInfo.uncompressedSize, 4);\n // file name length\n header += decToHex(encodedFileName.length, 2);\n // extra field length\n header += decToHex(extraFields.length, 2);\n\n\n var fileRecord = LOCAL_FILE_HEADER + header + encodedFileName + extraFields;\n\n var dirRecord = CENTRAL_FILE_HEADER +\n // version made by (00: DOS)\n decToHex(versionMadeBy, 2) +\n // file header (common to file and central directory)\n header +\n // file comment length\n decToHex(encodedComment.length, 2) +\n // disk number start\n \"\\x00\\x00\" +\n // internal file attributes TODO\n \"\\x00\\x00\" +\n // external file attributes\n decToHex(extFileAttr, 4) +\n // relative offset of local header\n decToHex(offset, 4) +\n // file name\n encodedFileName +\n // extra field\n extraFields +\n // file comment\n encodedComment;\n\n return {\n fileRecord: fileRecord,\n dirRecord: dirRecord\n };\n};\n\n/**\n * Generate the EOCD record.\n * @param {Number} entriesCount the number of entries in the zip file.\n * @param {Number} centralDirLength the length (in bytes) of the central dir.\n * @param {Number} localDirLength the length (in bytes) of the local dir.\n * @param {String} comment the zip file comment as a binary string.\n * @param {Function} encodeFileName the function to encode the comment.\n * @return {String} the EOCD record.\n */\nvar generateCentralDirectoryEnd = function (entriesCount, centralDirLength, localDirLength, comment, encodeFileName) {\n var dirEnd = \"\";\n var encodedComment = transformTo(\"string\", encodeFileName(comment));\n\n // end of central dir signature\n dirEnd = CENTRAL_DIRECTORY_END +\n // number of this disk\n \"\\x00\\x00\" +\n // number of the disk with the start of the central directory\n \"\\x00\\x00\" +\n // total number of entries in the central directory on this disk\n decToHex(entriesCount, 2) +\n // total number of entries in the central directory\n decToHex(entriesCount, 2) +\n // size of the central directory 4 bytes\n decToHex(centralDirLength, 4) +\n // offset of start of central directory with respect to the starting disk number\n decToHex(localDirLength, 4) +\n // .ZIP file comment length\n decToHex(encodedComment.length, 2) +\n // .ZIP file comment\n encodedComment;\n\n return dirEnd;\n};\n\n/**\n * Generate data descriptors for a file entry.\n * @param {Object} streamInfo the hash generated by a worker, containing information\n * on the file entry.\n * @return {String} the data descriptors.\n */\nvar generateDataDescriptors = function (streamInfo) {\n var descriptor = \"\";\n descriptor = DATA_DESCRIPTOR +\n // crc-32 4 bytes\n decToHex(streamInfo['crc32'], 4) +\n // compressed size 4 bytes\n decToHex(streamInfo['compressedSize'], 4) +\n // uncompressed size 4 bytes\n decToHex(streamInfo['uncompressedSize'], 4);\n\n return descriptor;\n};\n\n\n/**\n * A worker to concatenate other workers to create a zip file.\n * @param {Boolean} streamFiles `true` to stream the content of the files,\n * `false` to accumulate it.\n * @param {String} comment the comment to use.\n * @param {String} platform the platform to use, \"UNIX\" or \"DOS\".\n * @param {Function} encodeFileName the function to encode file names and comments.\n */\nclass ZipFileWorker extends GenericWorker {\n constructor(streamFiles, comment, platform, encodeFileName) {\n super(\"ZipFileWorker\");\n // The number of bytes written so far. This doesn't count accumulated chunks.\n this.bytesWritten = 0;\n // The comment of the zip file\n this.zipComment = comment;\n // The platform \"generating\" the zip file.\n this.zipPlatform = platform;\n // the function to encode file names and comments.\n this.encodeFileName = encodeFileName;\n // Should we stream the content of the files ?\n this.streamFiles = streamFiles;\n // If `streamFiles` is false, we will need to accumulate the content of the\n // files to calculate sizes / crc32 (and write them *before* the content).\n // This boolean indicates if we are accumulating chunks (it will change a lot\n // during the lifetime of this worker).\n this.accumulate = false;\n // The buffer receiving chunks when accumulating content.\n this.contentBuffer = [];\n // The list of generated directory records.\n this.dirRecords = [];\n // The offset (in bytes) from the beginning of the zip file for the current source.\n this.currentSourceOffset = 0;\n // The total number of entries in this zip file.\n this.entriesCount = 0;\n // the name of the file currently being added, null when handling the end of the zip file.\n // Used for the emitted metadata.\n this.currentFile = null;\n\n this._sources = [];\n }\n\n /**\n * @see GenericWorker.push\n */\n push(chunk) {\n\n var currentFilePercent = chunk.meta.percent || 0;\n var entriesCount = this.entriesCount;\n var remainingFiles = this._sources.length;\n\n if(this.accumulate) {\n this.contentBuffer.push(chunk);\n } else {\n this.bytesWritten += chunk.data.length;\n\n super.push({\n data : chunk.data,\n meta : {\n currentFile : this.currentFile,\n percent : entriesCount ? (currentFilePercent + 100 * (entriesCount - remainingFiles - 1)) / entriesCount : 100\n }\n });\n }\n }\n\n /**\n * The worker started a new source (an other worker).\n * @param {Object} streamInfo the streamInfo object from the new source.\n */\n openedSource(streamInfo) {\n this.currentSourceOffset = this.bytesWritten;\n this.currentFile = streamInfo['file'].name;\n\n var streamedContent = this.streamFiles && !streamInfo['file'].dir;\n\n // don't stream folders (because they don't have any content)\n if(streamedContent) {\n var record = generateZipParts(streamInfo, streamedContent, false, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n this.push({\n data : record.fileRecord,\n meta : {percent:0}\n });\n } else {\n // we need to wait for the whole file before pushing anything\n this.accumulate = true;\n }\n }\n\n /**\n * The worker finished a source (an other worker).\n * @param {Object} streamInfo the streamInfo object from the finished source.\n */\n closedSource(streamInfo) {\n this.accumulate = false;\n var streamedContent = this.streamFiles && !streamInfo['file'].dir;\n var record = generateZipParts(streamInfo, streamedContent, true, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n\n this.dirRecords.push(record.dirRecord);\n if(streamedContent) {\n // after the streamed file, we put data descriptors\n this.push({\n data : generateDataDescriptors(streamInfo),\n meta : {percent:100}\n });\n } else {\n // the content wasn't streamed, we need to push everything now\n // first the file record, then the content\n this.push({\n data : record.fileRecord,\n meta : {percent:0}\n });\n while(this.contentBuffer.length) {\n this.push(this.contentBuffer.shift());\n }\n }\n this.currentFile = null;\n }\n\n /**\n * @see GenericWorker.flush\n */\n flush() {\n\n var localDirLength = this.bytesWritten;\n for(var i = 0; i < this.dirRecords.length; i++) {\n this.push({\n data : this.dirRecords[i],\n meta : {percent:100}\n });\n }\n var centralDirLength = this.bytesWritten - localDirLength;\n\n var dirEnd = generateCentralDirectoryEnd(this.dirRecords.length, centralDirLength, localDirLength, this.zipComment, this.encodeFileName);\n\n this.push({\n data : dirEnd,\n meta : {percent:100}\n });\n }\n\n /**\n * Prepare the next source to be read.\n */\n prepareNextSource() {\n this.previous = this._sources.shift();\n this.openedSource(this.previous.streamInfo);\n if (this.isPaused) {\n this.previous.pause();\n } else {\n this.previous.resume();\n }\n }\n\n /**\n * @see GenericWorker.registerPrevious\n */\n registerPrevious(previous) {\n this._sources.push(previous);\n var self = this;\n\n previous.on('data', function (chunk) {\n self.processChunk(chunk);\n });\n previous.on('end', function () {\n self.closedSource(self.previous.streamInfo);\n if(self._sources.length) {\n self.prepareNextSource();\n } else {\n self.end();\n }\n });\n previous.on('error', function (e) {\n self.error(e);\n });\n return this;\n }\n\n /**\n * @see GenericWorker.resume\n */\n resume() {\n if(!super.resume()) {\n return false;\n }\n\n if (!this.previous && this._sources.length) {\n this.prepareNextSource();\n return true;\n }\n if (!this.previous && !this._sources.length && !this.generatedError) {\n this.end();\n return true;\n }\n }\n\n /**\n * @see GenericWorker.error\n */\n error(e) {\n var sources = this._sources;\n if(!super.error(e)) {\n return false;\n }\n for(var i = 0; i < sources.length; i++) {\n try {\n sources[i].error(e);\n } catch(e) {\n // the `error` exploded, nothing to do\n }\n }\n return true;\n }\n\n /**\n * @see GenericWorker.lock\n */\n lock() {\n super.lock();\n var sources = this._sources;\n for(var i = 0; i < sources.length; i++) {\n sources[i].lock();\n }\n }\n}\n\n/* eslint-disable */\n\n/**\n * Find the compression to use.\n * @param {String} fileCompression the compression defined at the file level, if any.\n * @param {String} zipCompression the compression defined at the load() level.\n * @return {Object} the compression object to use.\n */\nvar getCompression = function (fileCompression, zipCompression) {\n\n var compressionName = fileCompression || zipCompression;\n var compression = compressions[compressionName];\n if (!compression) {\n throw new Error(compressionName + \" is not a valid compression method !\");\n }\n return compression;\n};\n\n/**\n * Create a worker to generate a zip file.\n * @param {JSZip} zip the JSZip instance at the right root level.\n * @param {Object} options to generate the zip file.\n * @param {String} comment the comment to use.\n */\nconst generateWorker = function (zip, options, comment) {\n\n var zipFileWorker = new ZipFileWorker(options.streamFiles, comment, options.platform, options.encodeFileName);\n var entriesCount = 0;\n try {\n\n zip.forEach(function (relativePath, file) {\n entriesCount++;\n var compression = getCompression(file.options.compression, options.compression);\n var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};\n var dir = file.dir, date = file.date;\n\n file._compressWorker(compression, compressionOptions)\n .withStreamInfo(\"file\", {\n name : relativePath,\n dir : dir,\n date : date,\n comment : file.comment || \"\",\n unixPermissions : file.unixPermissions,\n dosPermissions : file.dosPermissions\n })\n .pipe(zipFileWorker);\n });\n zipFileWorker.entriesCount = entriesCount;\n } catch (e) {\n zipFileWorker.error(e);\n }\n\n return zipFileWorker;\n};\n\n/* eslint-disable */\n\nclass DataReader {\n constructor(data) {\n this.data = data; // type : see implementation\n this.length = data.length;\n this.index = 0;\n this.zero = 0;\n }\n\n /**\n * Check that the offset will not go too far.\n * @param {string} offset the additional offset to check.\n * @throws {Error} an Error if the offset is out of bounds.\n */\n checkOffset(offset) {\n this.checkIndex(this.index + offset);\n }\n\n /**\n * Check that the specified index will not be too far.\n * @param {string} newIndex the index to check.\n * @throws {Error} an Error if the index is out of bounds.\n */\n checkIndex(newIndex) {\n if (this.length < this.zero + newIndex || newIndex < 0) {\n throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n }\n }\n\n /**\n * Change the index.\n * @param {number} newIndex The new index.\n * @throws {Error} if the new index is out of the data.\n */\n setIndex(newIndex) {\n this.checkIndex(newIndex);\n this.index = newIndex;\n }\n\n /**\n * Skip the next n bytes.\n * @param {number} n the number of bytes to skip.\n * @throws {Error} if the new index is out of the data.\n */\n skip(n) {\n this.setIndex(this.index + n);\n }\n\n /**\n * Get the byte at the specified index.\n * @param {number} i the index to use.\n * @return {number} a byte.\n */\n byteAt(i) {\n // see implementations\n }\n\n /**\n * Get the next number with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {number} the corresponding number.\n */\n readInt(size) {\n var result = 0,\n i;\n this.checkOffset(size);\n for (i = this.index + size - 1; i >= this.index; i--) {\n result = (result << 8) + this.byteAt(i);\n }\n this.index += size;\n return result;\n }\n\n /**\n * Get the next string with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {string} the corresponding string.\n */\n readString(size) {\n return transformTo(\"string\", this.readData(size));\n }\n\n /**\n * Get raw data without conversion, bytes.\n * @param {number} size the number of bytes to read.\n * @return {Object} the raw data, implementation specific.\n */\n readData(size) {\n // see implementations\n }\n\n /**\n * Find the last occurrence of a zip signature (4 bytes).\n * @param {string} sig the signature to find.\n * @return {number} the index of the last occurrence, -1 if not found.\n */\n lastIndexOfSignature(sig) {\n // see implementations\n }\n\n /**\n * Read the signature (4 bytes) at the current position and compare it with sig.\n * @param {string} sig the expected signature\n * @return {boolean} true if the signature matches, false otherwise.\n */\n readAndCheckSignature(sig) {\n // see implementations\n }\n\n /**\n * Get the next date.\n * @return {Date} the date.\n */\n readDate() {\n var dostime = this.readInt(4);\n return new Date(Date.UTC(\n ((dostime >> 25) & 0x7f) + 1980, // year\n ((dostime >> 21) & 0x0f) - 1, // month\n (dostime >> 16) & 0x1f, // day\n (dostime >> 11) & 0x1f, // hour\n (dostime >> 5) & 0x3f, // minute\n (dostime & 0x1f) << 1)); // second\n }\n}\n\n/* eslint-disable */\n\nclass ArrayReader extends DataReader {\n constructor(data) {\n super(data);\n for(var i = 0; i < this.data.length; i++) {\n data[i] = data[i] & 0xFF;\n }\n }\n\n /**\n * @see DataReader.byteAt\n */\n byteAt(i) {\n return this.data[this.zero + i];\n }\n\n /**\n * @see DataReader.lastIndexOfSignature\n */\n lastIndexOfSignature(sig) {\n var sig0 = sig.charCodeAt(0),\n sig1 = sig.charCodeAt(1),\n sig2 = sig.charCodeAt(2),\n sig3 = sig.charCodeAt(3);\n for (var i = this.length - 4; i >= 0; --i) {\n if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n return i - this.zero;\n }\n }\n\n return -1;\n }\n\n /**\n * @see DataReader.readAndCheckSignature\n */\n readAndCheckSignature(sig) {\n var sig0 = sig.charCodeAt(0),\n sig1 = sig.charCodeAt(1),\n sig2 = sig.charCodeAt(2),\n sig3 = sig.charCodeAt(3),\n data = this.readData(4);\n return sig0 === data[0] && sig1 === data[1] && sig2 === data[2] && sig3 === data[3];\n }\n\n /**\n * @see DataReader.readData\n */\n readData(size) {\n this.checkOffset(size);\n if(size === 0) {\n return [];\n }\n var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);\n this.index += size;\n return result;\n }\n}\n\nclass StringReader extends DataReader {\n constructor(data) {\n super(data);\n }\n\n /**\n * @see DataReader.byteAt\n */\n byteAt(i) {\n return this.data.charCodeAt(this.zero + i);\n }\n\n /**\n * @see DataReader.lastIndexOfSignature\n */\n lastIndexOfSignature(sig) {\n return this.data.lastIndexOf(sig) - this.zero;\n }\n\n /**\n * @see DataReader.readAndCheckSignature\n */\n readAndCheckSignature(sig) {\n const data = this.readData(4);\n return sig === data;\n }\n\n /**\n * @see DataReader.readData\n */\n readData(size) {\n this.checkOffset(size);\n // this will work because the constructor applied the \"& 0xff\" mask.\n const result = this.data.slice(this.zero + this.index, this.zero + this.index + size);\n this.index += size;\n return result;\n }\n}\n\n/* eslint-disable */\n\nclass Uint8ArrayReader extends ArrayReader {\n constructor(data) {\n super(data);\n }\n\n /**\n * @see DataReader.readData\n */\n readData(size) {\n this.checkOffset(size);\n if(size === 0) {\n // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n return new Uint8Array(0);\n }\n var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size);\n this.index += size;\n return result;\n }\n}\n\n/**\n * Create a reader adapted to the data.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data to read.\n * @return {DataReader} the data reader.\n */\nfunction readerFor(data) {\n const type = getTypeOf(data);\n checkSupport(type);\n if (type === \"string\" && !support.uint8array) {\n return new StringReader(data);\n }\n if (support.uint8array) {\n return new Uint8ArrayReader(transformTo(\"uint8array\", data));\n }\n return new ArrayReader(transformTo(\"array\", data));\n}\n\n/* eslint-disable */\n\nvar MADE_BY_DOS = 0x00;\nvar MADE_BY_UNIX = 0x03;\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nvar findCompression = function(compressionMethod) {\n for (var method in compressions) {\n if (!compressions.hasOwnProperty(method)) {\n continue;\n }\n if (compressions[method].magic === compressionMethod) {\n return compressions[method];\n }\n }\n return null;\n};\n\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nclass ZipEntry {\n constructor(options, loadOptions) {\n this.options = options;\n this.loadOptions = loadOptions;\n }\n\n /**\n * say if the file is encrypted.\n * @return {boolean} true if the file is encrypted, false otherwise.\n */\n isEncrypted() {\n // bit 1 is set\n return (this.bitFlag & 0x0001) === 0x0001;\n }\n\n /**\n * say if the file has utf-8 filename/comment.\n * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n */\n useUTF8() {\n // bit 11 is set\n return (this.bitFlag & 0x0800) === 0x0800;\n }\n\n /**\n * Read the local part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readLocalPart(reader) {\n var compression, localExtraFieldsLength;\n\n // we already know everything from the central dir !\n // If the central dir data are false, we are doomed.\n // On the bright side, the local part is scary : zip64, data descriptors, both, etc.\n // The less data we get here, the more reliable this should be.\n // Let's skip the whole header and dash to the data !\n reader.skip(22);\n // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n // Strangely, the filename here is OK.\n // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n // the internet.\n //\n // I think I see the logic here : the central directory is used to display\n // content and the local directory is used to extract the files. Mixing / and \\\n // may be used to display \\ to windows users and use / when extracting the files.\n // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n this.fileNameLength = reader.readInt(2);\n localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n // the fileName is stored as binary data, the handleUTF8 method will take care of the encoding.\n this.fileName = reader.readData(this.fileNameLength);\n reader.skip(localExtraFieldsLength);\n\n if (this.compressedSize === -1 || this.uncompressedSize === -1) {\n throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory \" + \"(compressedSize === -1 || uncompressedSize === -1)\");\n }\n\n compression = findCompression(this.compressionMethod);\n if (compression === null) { // no compression found\n throw new Error(\"Corrupted zip : compression \" + pretty(this.compressionMethod) + \" unknown (inner file : \" + transformTo(\"string\", this.fileName) + \")\");\n }\n this.decompressed = new CompressedObject(this.compressedSize, this.uncompressedSize, this.crc32, compression, reader.readData(this.compressedSize));\n }\n\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readCentralPart(reader) {\n this.versionMadeBy = reader.readInt(2);\n reader.skip(2);\n // this.versionNeeded = reader.readInt(2);\n this.bitFlag = reader.readInt(2);\n this.compressionMethod = reader.readString(2);\n this.date = reader.readDate();\n this.crc32 = reader.readInt(4);\n this.compressedSize = reader.readInt(4);\n this.uncompressedSize = reader.readInt(4);\n var fileNameLength = reader.readInt(2);\n this.extraFieldsLength = reader.readInt(2);\n this.fileCommentLength = reader.readInt(2);\n this.diskNumberStart = reader.readInt(2);\n this.internalFileAttributes = reader.readInt(2);\n this.externalFileAttributes = reader.readInt(4);\n this.localHeaderOffset = reader.readInt(4);\n\n if (this.isEncrypted()) {\n throw new Error(\"Encrypted zip are not supported\");\n }\n\n // will be read in the local part, see the comments there\n reader.skip(fileNameLength);\n this.readExtraFields(reader);\n this.parseZIP64ExtraField(reader);\n this.fileComment = reader.readData(this.fileCommentLength);\n }\n\n /**\n * Parse the external file attributes and get the unix/dos permissions.\n */\n processAttributes() {\n this.unixPermissions = null;\n this.dosPermissions = null;\n var madeBy = this.versionMadeBy >> 8;\n\n // Check if we have the DOS directory flag set.\n // We look for it in the DOS and UNIX permissions\n // but some unknown platform could set it as a compatibility flag.\n this.dir = this.externalFileAttributes & 0x0010 ? true : false;\n\n if(madeBy === MADE_BY_DOS) {\n // first 6 bits (0 to 5)\n this.dosPermissions = this.externalFileAttributes & 0x3F;\n }\n\n if(madeBy === MADE_BY_UNIX) {\n this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;\n // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);\n }\n\n // fail safe : if the name ends with a / it probably means a folder\n if (!this.dir && this.fileNameStr.slice(-1) === '/') {\n this.dir = true;\n }\n }\n\n /**\n * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n * @param {DataReader} reader the reader to use.\n */\n parseZIP64ExtraField(reader) {\n\n if (!this.extraFields[0x0001]) {\n return;\n }\n\n // should be something, preparing the extra reader\n var extraReader = readerFor(this.extraFields[0x0001].value);\n\n // I really hope that these 64bits integer can fit in 32 bits integer, because js\n // won't let us have more.\n if (this.uncompressedSize === MAX_VALUE_32BITS) {\n this.uncompressedSize = extraReader.readInt(8);\n }\n if (this.compressedSize === MAX_VALUE_32BITS) {\n this.compressedSize = extraReader.readInt(8);\n }\n if (this.localHeaderOffset === MAX_VALUE_32BITS) {\n this.localHeaderOffset = extraReader.readInt(8);\n }\n if (this.diskNumberStart === MAX_VALUE_32BITS) {\n this.diskNumberStart = extraReader.readInt(4);\n }\n }\n\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readExtraFields(reader) {\n var end = reader.index + this.extraFieldsLength,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n\n if (!this.extraFields) {\n this.extraFields = {};\n }\n\n while (reader.index < end) {\n extraFieldId = reader.readInt(2);\n extraFieldLength = reader.readInt(2);\n extraFieldValue = reader.readData(extraFieldLength);\n\n this.extraFields[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n }\n\n /**\n * Apply an UTF8 transformation if needed.\n */\n handleUTF8() {\n var decodeParamType = support.uint8array ? \"uint8array\" : \"array\";\n if (this.useUTF8()) {\n this.fileNameStr = utf8decode(this.fileName);\n this.fileCommentStr = utf8decode(this.fileComment);\n } else {\n var upath = this.findExtraFieldUnicodePath();\n if (upath !== null) {\n this.fileNameStr = upath;\n } else {\n // ASCII text or unsupported code page\n var fileNameByteArray = transformTo(decodeParamType, this.fileName);\n this.fileNameStr = this.loadOptions.decodeFileName(fileNameByteArray);\n }\n\n var ucomment = this.findExtraFieldUnicodeComment();\n if (ucomment !== null) {\n this.fileCommentStr = ucomment;\n } else {\n // ASCII text or unsupported code page\n var commentByteArray = transformTo(decodeParamType, this.fileComment);\n this.fileCommentStr = this.loadOptions.decodeFileName(commentByteArray);\n }\n }\n }\n\n /**\n * Find the unicode path declared in the extra field, if any.\n * @return {String} the unicode path, null otherwise.\n */\n findExtraFieldUnicodePath() {\n var upathField = this.extraFields[0x7075];\n if (upathField) {\n var extraReader = readerFor(upathField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the filename changed, this field is out of date.\n if (crc32wrapper(this.fileName) !== extraReader.readInt(4)) {\n return null;\n }\n\n return utf8decode(extraReader.readData(upathField.length - 5));\n }\n return null;\n }\n\n /**\n * Find the unicode comment declared in the extra field, if any.\n * @return {String} the unicode comment, null otherwise.\n */\n findExtraFieldUnicodeComment() {\n var ucommentField = this.extraFields[0x6375];\n if (ucommentField) {\n var extraReader = readerFor(ucommentField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the comment changed, this field is out of date.\n if (crc32wrapper(this.fileComment) !== extraReader.readInt(4)) {\n return null;\n }\n\n return utf8decode(extraReader.readData(ucommentField.length - 5));\n }\n return null;\n }\n}\n\n/* eslint-disable */\n\n// class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {Object} loadOptions Options for loading the stream.\n */\nclass ZipEntries {\n constructor(loadOptions) {\n this.files = [];\n this.loadOptions = loadOptions;\n }\n\n /**\n * Check that the reader is on the specified signature.\n * @param {string} expectedSignature the expected signature.\n * @throws {Error} if it is an other signature.\n */\n checkSignature(expectedSignature) {\n if (!this.reader.readAndCheckSignature(expectedSignature)) {\n this.reader.index -= 4;\n var signature = this.reader.readString(4);\n throw new Error(\"Corrupted zip or bug: unexpected signature \" + \"(\" + pretty(signature) + \", expected \" + pretty(expectedSignature) + \")\");\n }\n }\n\n /**\n * Check if the given signature is at the given index.\n * @param {number} askedIndex the index to check.\n * @param {string} expectedSignature the signature to expect.\n * @return {boolean} true if the signature is here, false otherwise.\n */\n isSignature(askedIndex, expectedSignature) {\n var currentIndex = this.reader.index;\n this.reader.setIndex(askedIndex);\n var signature = this.reader.readString(4);\n var result = signature === expectedSignature;\n this.reader.setIndex(currentIndex);\n return result;\n }\n\n /**\n * Read the end of the central directory.\n */\n readBlockEndOfCentral() {\n this.diskNumber = this.reader.readInt(2);\n this.diskWithCentralDirStart = this.reader.readInt(2);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n this.centralDirRecords = this.reader.readInt(2);\n this.centralDirSize = this.reader.readInt(4);\n this.centralDirOffset = this.reader.readInt(4);\n\n this.zipCommentLength = this.reader.readInt(2);\n // warning : the encoding depends of the system locale\n // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n // On a windows machine, this field is encoded with the localized windows code page.\n var zipComment = this.reader.readData(this.zipCommentLength);\n var decodeParamType = support.uint8array ? \"uint8array\" : \"array\";\n // To get consistent behavior with the generation part, we will assume that\n // this is utf8 encoded unless specified otherwise.\n var decodeContent = transformTo(decodeParamType, zipComment);\n this.zipComment = this.loadOptions.decodeFileName(decodeContent);\n }\n\n /**\n * Read the end of the Zip 64 central directory.\n * Not merged with the method readEndOfCentral :\n * The end of central can coexist with its Zip64 brother,\n * I don't want to read the wrong number of bytes !\n */\n readBlockZip64EndOfCentral() {\n this.zip64EndOfCentralSize = this.reader.readInt(8);\n this.reader.skip(4);\n // this.versionMadeBy = this.reader.readString(2);\n // this.versionNeeded = this.reader.readInt(2);\n this.diskNumber = this.reader.readInt(4);\n this.diskWithCentralDirStart = this.reader.readInt(4);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n this.centralDirRecords = this.reader.readInt(8);\n this.centralDirSize = this.reader.readInt(8);\n this.centralDirOffset = this.reader.readInt(8);\n\n this.zip64ExtensibleData = {};\n var extraDataSize = this.zip64EndOfCentralSize - 44,\n index = 0,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n while (index < extraDataSize) {\n extraFieldId = this.reader.readInt(2);\n extraFieldLength = this.reader.readInt(4);\n extraFieldValue = this.reader.readData(extraFieldLength);\n this.zip64ExtensibleData[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n }\n\n /**\n * Read the end of the Zip 64 central directory locator.\n */\n readBlockZip64EndOfCentralLocator() {\n this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n this.disksCount = this.reader.readInt(4);\n if (this.disksCount > 1) {\n throw new Error(\"Multi-volumes zip are not supported\");\n }\n }\n\n /**\n * Read the local files, based on the offset read in the central part.\n */\n readLocalFiles() {\n var i, file;\n for (i = 0; i < this.files.length; i++) {\n file = this.files[i];\n this.reader.setIndex(file.localHeaderOffset);\n this.checkSignature(LOCAL_FILE_HEADER);\n file.readLocalPart(this.reader);\n file.handleUTF8();\n file.processAttributes();\n }\n }\n\n /**\n * Read the central directory.\n */\n readCentralDir() {\n var file;\n\n this.reader.setIndex(this.centralDirOffset);\n while (this.reader.readAndCheckSignature(CENTRAL_FILE_HEADER)) {\n file = new ZipEntry({\n zip64: this.zip64\n }, this.loadOptions);\n file.readCentralPart(this.reader);\n this.files.push(file);\n }\n\n if (this.centralDirRecords !== this.files.length) {\n if (this.centralDirRecords !== 0 && this.files.length === 0) {\n // We expected some records but couldn't find ANY.\n // This is really suspicious, as if something went wrong.\n throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n }\n }\n }\n\n /**\n * Read the end of central directory.\n */\n readEndOfCentral() {\n var offset = this.reader.lastIndexOfSignature(CENTRAL_DIRECTORY_END);\n if (offset < 0) {\n // Check if the content is a truncated zip or complete garbage.\n // A \"LOCAL_FILE_HEADER\" is not required at the beginning (auto\n // extractible zip for example) but it can give a good hint.\n // If an ajax request was used without responseType, we will also\n // get unreadable data.\n var isGarbage = !this.isSignature(0, LOCAL_FILE_HEADER);\n\n if (isGarbage) {\n throw new Error(\"Can't find end of central directory : is this a zip file ? \" +\n \"If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n } else {\n throw new Error(\"Corrupted zip: can't find end of central directory\");\n }\n\n }\n this.reader.setIndex(offset);\n var endOfCentralDirOffset = offset;\n this.checkSignature(CENTRAL_DIRECTORY_END);\n this.readBlockEndOfCentral();\n\n\n /* extract from the zip spec :\n 4) If one of the fields in the end of central directory\n record is too small to hold required data, the field\n should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n ZIP64 format record should be created.\n 5) The end of central directory record and the\n Zip64 end of central directory locator record must\n reside on the same disk when splitting or spanning\n an archive.\n */\n if (this.diskNumber === MAX_VALUE_16BITS || this.diskWithCentralDirStart === MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === MAX_VALUE_16BITS || this.centralDirRecords === MAX_VALUE_16BITS || this.centralDirSize === MAX_VALUE_32BITS || this.centralDirOffset === MAX_VALUE_32BITS) {\n this.zip64 = true;\n\n /*\n Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n the zip file can fit into a 32bits integer. This cannot be solved : JavaScript represents\n all numbers as 64-bit double precision IEEE 754 floating point numbers.\n So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n */\n\n // should look for a zip64 EOCD locator\n offset = this.reader.lastIndexOfSignature(ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n if (offset < 0) {\n throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n }\n this.reader.setIndex(offset);\n this.checkSignature(ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n this.readBlockZip64EndOfCentralLocator();\n\n // now the zip64 EOCD record\n if (!this.isSignature(this.relativeOffsetEndOfZip64CentralDir, ZIP64_CENTRAL_DIRECTORY_END)) {\n // console.warn(\"ZIP64 end of central directory not where expected.\");\n this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(ZIP64_CENTRAL_DIRECTORY_END);\n if (this.relativeOffsetEndOfZip64CentralDir < 0) {\n throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n }\n }\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n this.checkSignature(ZIP64_CENTRAL_DIRECTORY_END);\n this.readBlockZip64EndOfCentral();\n }\n\n var expectedEndOfCentralDirOffset = this.centralDirOffset + this.centralDirSize;\n if (this.zip64) {\n expectedEndOfCentralDirOffset += 20; // end of central dir 64 locator\n expectedEndOfCentralDirOffset += 12 /* should not include the leading 12 bytes */ + this.zip64EndOfCentralSize;\n }\n\n var extraBytes = endOfCentralDirOffset - expectedEndOfCentralDirOffset;\n\n if (extraBytes > 0) {\n // console.warn(extraBytes, \"extra bytes at beginning or within zipfile\");\n if (this.isSignature(endOfCentralDirOffset, CENTRAL_FILE_HEADER)) ; else {\n // the offset is wrong, update the \"zero\" of the reader\n // this happens if data has been prepended (crx files for example)\n this.reader.zero = extraBytes;\n }\n } else if (extraBytes < 0) {\n throw new Error(\"Corrupted zip: missing \" + Math.abs(extraBytes) + \" bytes.\");\n }\n }\n\n prepareReader(data) {\n this.reader = readerFor(data);\n }\n\n /**\n * Read a zip file and create ZipEntries.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n */\n load(data) {\n this.prepareReader(data);\n this.readEndOfCentral();\n this.readCentralDir();\n this.readLocalFiles();\n }\n}\n\nvar nodejsUtils = {\n isNode: false\n};\n\n/* eslint-disable */\n\n/**\n * Check the CRC32 of an entry.\n * @param {ZipEntry} zipEntry the zip entry to check.\n * @return {Promise} the result.\n */\nfunction checkEntryCRC32(zipEntry) {\n return new external.Promise(function (resolve, reject) {\n var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe());\n worker.on(\"error\", function (e) {\n reject(e);\n })\n .on(\"end\", function () {\n if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) {\n reject(new Error(\"Corrupted zip : CRC32 mismatch\"));\n } else {\n resolve();\n }\n })\n .resume();\n });\n}\n\nfunction load(data, options) {\n var zip = this;\n options = extend(options || {}, {\n base64: false,\n checkCRC32: false,\n optimizedBinaryString: false,\n createFolders: false,\n decodeFileName: utf8decode\n });\n\n if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {\n return external.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\"));\n }\n\n return prepareContent(\"the loaded zip file\", data, true, options.optimizedBinaryString, options.base64)\n .then(function(data) {\n var zipEntries = new ZipEntries(options);\n zipEntries.load(data);\n return zipEntries;\n }).then(function checkCRC32(zipEntries) {\n var promises = [external.Promise.resolve(zipEntries)];\n var files = zipEntries.files;\n if (options.checkCRC32) {\n for (var i = 0; i < files.length; i++) {\n promises.push(checkEntryCRC32(files[i]));\n }\n }\n return external.Promise.all(promises);\n }).then(function addFiles(results) {\n var zipEntries = results.shift();\n var files = zipEntries.files;\n for (var i = 0; i < files.length; i++) {\n var input = files[i];\n zip.file(input.fileNameStr, input.decompressed, {\n binary: true,\n optimizedBinaryString: true,\n date: input.date,\n dir: input.dir,\n comment : input.fileCommentStr.length ? input.fileCommentStr : null,\n unixPermissions : input.unixPermissions,\n dosPermissions : input.dosPermissions,\n createFolders: options.createFolders\n });\n }\n if (zipEntries.zipComment.length) {\n zip.comment = zipEntries.zipComment;\n }\n\n return zip;\n });\n}\n\n/* eslint-disable */\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} originalOptions the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, originalOptions) {\n // be sure sub folders exist\n var dataType = getTypeOf(data),\n parent;\n\n\n /*\n * Correct options.\n */\n\n var o = extend(originalOptions || {}, defaults);\n o.date = o.date || new Date();\n if (o.compression !== null) {\n o.compression = o.compression.toUpperCase();\n }\n\n if (typeof o.unixPermissions === \"string\") {\n o.unixPermissions = parseInt(o.unixPermissions, 8);\n }\n\n // UNX_IFDIR 0040000 see zipinfo.c\n if (o.unixPermissions && (o.unixPermissions & 0x4000)) {\n o.dir = true;\n }\n // Bit 4 Directory\n if (o.dosPermissions && (o.dosPermissions & 0x0010)) {\n o.dir = true;\n }\n\n if (o.dir) {\n name = forceTrailingSlash(name);\n }\n if (o.createFolders && (parent = parentFolder(name))) {\n folderAdd.call(this, parent, true);\n }\n\n var isUnicodeString = dataType === \"string\" && o.binary === false && o.base64 === false;\n if (!originalOptions || typeof originalOptions.binary === \"undefined\") {\n o.binary = !isUnicodeString;\n }\n\n\n var isCompressedEmpty = (data instanceof CompressedObject) && data.uncompressedSize === 0;\n\n if (isCompressedEmpty || o.dir || !data || data.length === 0) {\n o.base64 = false;\n o.binary = true;\n data = \"\";\n o.compression = \"STORE\";\n dataType = \"string\";\n }\n\n /*\n * Convert content to fit.\n */\n\n var zipObjectContent = null;\n if (data instanceof CompressedObject || data instanceof GenericWorker) {\n zipObjectContent = data;\n } else {\n zipObjectContent = prepareContent(name, data, o.binary, o.optimizedBinaryString, o.base64);\n }\n\n var object = new ZipObject(name, zipObjectContent, o);\n this.files[name] = object;\n /*\n TODO: we can't throw an exception because we have async promises\n (we can have a promise of a Date() for example) but returning a\n promise is useless because file(name, data) returns the JSZip\n object for chaining. Should we break that to allow the user\n to catch the error ?\n\n return external.Promise.resolve(zipObjectContent)\n .then(function () {\n return object;\n });\n */\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n if (path.slice(-1) === '/') {\n path = path.substring(0, path.length - 1);\n }\n var lastSlash = path.lastIndexOf('/');\n return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n/**\n * Returns the path with a slash at the end.\n * @private\n * @param {String} path the path to check.\n * @return {String} the path with a trailing slash.\n */\nvar forceTrailingSlash = function(path) {\n // Check the name ends with a /\n if (path.slice(-1) !== \"/\") {\n path += \"/\"; // IE doesn't like substr(-1)\n }\n return path;\n};\n\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n * folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders$1) {\n createFolders$1 = (typeof createFolders$1 !== 'undefined') ? createFolders$1 : createFolders;\n\n name = forceTrailingSlash(name);\n\n // Does this folder already exist?\n if (!this.files[name]) {\n fileAdd.call(this, name, null, {\n dir: true,\n createFolders: createFolders$1\n });\n }\n return this.files[name];\n};\n\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param {Object} object Anything\n* @return {Boolean} true if the object is a regular expression,\n* false otherwise\n*/\nfunction isRegExp(object) {\n return Object.prototype.toString.call(object) === \"[object RegExp]\";\n}\n\n/**\n * Representation a of zip file in js\n * @constructor\n */\nclass JSZip {\n constructor() {\n if (arguments.length) {\n throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n }\n\n // object containing the files :\n // {\n // \"folder/\" : {...},\n // \"folder/data.txt\" : {...}\n // }\n this.files = {};\n\n this.comment = null;\n\n // Where we are in the hierarchy\n this.root = \"\";\n this.clone = function() {\n const newObj = new JSZip();\n for (const i in this) {\n if (typeof this[i] !== \"function\") {\n newObj[i] = this[i];\n }\n }\n return newObj;\n };\n }\n\n /**\n * @see loadAsync\n */\n load() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }\n\n /**\n * Call a callback function for each entry at this folder level.\n * @param {Function} cb the callback function:\n * function (relativePath, file) {...}\n * It takes 2 arguments : the relative path and the file.\n */\n forEach(cb) {\n var filename, relativePath, file;\n for (filename in this.files) {\n if (!this.files.hasOwnProperty(filename)) {\n continue;\n }\n file = this.files[filename];\n relativePath = filename.slice(this.root.length, filename.length);\n if (relativePath && filename.slice(0, this.root.length) === this.root) { // the file is in the current root\n cb(relativePath, file); // TODO reverse the parameters ? need to be clean AND consistent with the filter search fn...\n }\n }\n }\n\n /**\n * Filter nested files/folders with the specified function.\n * @param {Function} search the predicate to use :\n * function (relativePath, file) {...}\n * It takes 2 arguments : the relative path and the file.\n * @return {Array} An array of matching elements.\n */\n filter(search) {\n var result = [];\n this.forEach(function (relativePath, entry) {\n if (search(relativePath, entry)) { // the file matches the function\n result.push(entry);\n }\n\n });\n return result;\n }\n\n /**\n * Add a file to the zip file, or search a file.\n * @param {string|RegExp} name The name of the file to add (if data is defined),\n * the name of the file to find (if no data) or a regex to match files.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded\n * @param {Object} o File options\n * @return {JSZip|Object|Array} this JSZip object (when adding a file),\n * a file (when searching by string) or an array of files (when searching by regex).\n */\n file(name, data, o) {\n if (arguments.length === 1) {\n if (isRegExp(name)) {\n var regexp = name;\n return this.filter(function(relativePath, file) {\n return !file.dir && regexp.test(relativePath);\n });\n }\n else { // text\n var obj = this.files[this.root + name];\n if (obj && !obj.dir) {\n return obj;\n } else {\n return null;\n }\n }\n }\n else { // more than one argument : we have data !\n name = this.root + name;\n fileAdd.call(this, name, data, o);\n }\n return this;\n }\n\n /**\n * Add a directory to the zip file, or search.\n * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.\n */\n folder(arg) {\n if (!arg) {\n return this;\n }\n\n if (isRegExp(arg)) {\n return this.filter(function(relativePath, file) {\n return file.dir && arg.test(relativePath);\n });\n }\n\n // else, name is a new folder\n var name = this.root + arg;\n var newFolder = folderAdd.call(this, name);\n\n // Allow chaining by returning a new object with this folder as the root\n var ret = this.clone();\n ret.root = newFolder.name;\n return ret;\n }\n\n /**\n * Delete a file, or a directory and all sub-files, from the zip\n * @param {string} name the name of the file to delete\n * @return {JSZip} this JSZip object\n */\n remove(name) {\n name = this.root + name;\n var file = this.files[name];\n if (!file) {\n // Look for any folders\n if (name.slice(-1) !== \"/\") {\n name += \"/\";\n }\n file = this.files[name];\n }\n\n if (file && !file.dir) {\n // file\n delete this.files[name];\n } else {\n // maybe a folder, delete recursively\n var kids = this.filter(function(relativePath, file) {\n return file.name.slice(0, name.length) === name;\n });\n for (var i = 0; i < kids.length; i++) {\n delete this.files[kids[i].name];\n }\n }\n\n return this;\n }\n\n /**\n * Generate the complete zip file\n * @param {Object} options the options to generate the zip file :\n * - compression, \"STORE\" by default.\n * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n */\n generate(options) {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }\n\n /**\n * Generate the complete zip file as an internal stream.\n * @param {Object} options the options to generate the zip file :\n * - compression, \"STORE\" by default.\n * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n * @return {StreamHelper} the streamed zip file.\n */\n generateInternalStream(options) {\n var worker, opts = {};\n try {\n opts = extend(options || {}, {\n streamFiles: false,\n compression: \"STORE\",\n compressionOptions : null,\n type: \"\",\n platform: \"DOS\",\n comment: null,\n mimeType: 'application/zip',\n encodeFileName: utf8encode\n });\n\n opts.type = opts.type.toLowerCase();\n opts.compression = opts.compression.toUpperCase();\n\n // \"binarystring\" is preferred but the internals use \"string\".\n if(opts.type === \"binarystring\") {\n opts.type = \"string\";\n }\n\n if (!opts.type) {\n throw new Error(\"No output type specified.\");\n }\n\n checkSupport(opts.type);\n\n // accept nodejs `process.platform`\n if(\n opts.platform === 'darwin' ||\n opts.platform === 'freebsd' ||\n opts.platform === 'linux' ||\n opts.platform === 'sunos'\n ) {\n opts.platform = \"UNIX\";\n }\n if (opts.platform === 'win32') {\n opts.platform = \"DOS\";\n }\n\n var comment = opts.comment || this.comment || \"\";\n worker = generateWorker(this, opts, comment);\n } catch (e) {\n worker = new GenericWorker(\"error\");\n worker.error(e);\n }\n return new StreamHelper(worker, opts.type || \"string\", opts.mimeType);\n }\n\n /**\n * Generate the complete zip file asynchronously.\n * @see generateInternalStream\n */\n generateAsync(options, onUpdate) {\n return this.generateInternalStream(options).accumulate(onUpdate);\n }\n\n loadAsync(data, options) {\n return load.apply(this, [data, options]);\n }\n\n static loadAsync(content, options) {\n return new JSZip().loadAsync(content, options);\n }\n \n static get support() {\n return support;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static get version() {\n return \"3.2.2-esm\";\n }\n\n static get external() {\n return external;\n }\n}\n\nexport default JSZip;\n","// date packing utilities from Kendo Spreadsheet\n\n// Julian days algorithms from http://www.hermetic.ch/cal_stud/jdn.htm#comp\nfunction dateToJulianDays(y, m, d) {\n return ((1461 * (y + 4800 + ((m - 13) / 12 | 0))) / 4 | 0) +\n ((367 * (m - 1 - 12 * ((m - 13) / 12 | 0))) / 12 | 0) -\n ((3 * (((y + 4900 + ((m - 13) / 12 | 0)) / 100 | 0))) / 4 | 0) +\n d - 32075;\n}\n\n// This uses the Google Spreadsheet approach: treat 1899-12-31 as day 1, allowing to avoid\n// implementing the \"Leap Year Bug\" yet still be Excel compatible for dates starting 1900-03-01.\nconst BASE_DATE = dateToJulianDays(1900, 0, -1);\n\nfunction packDate(year, month, date) {\n return dateToJulianDays(year, month, date) - BASE_DATE;\n}\n\nfunction packTime(hh, mm, ss, ms) {\n return (hh + (mm + (ss + ms / 1000) / 60) / 60) / 24;\n}\n\nexport default function dateToSerial(date) {\n const time = packTime(date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds());\n const serial = packDate(date.getFullYear(),\n date.getMonth(),\n date.getDate());\n return serial < 0 ? serial - 1 + time : serial + time;\n}\n","import map from './utils/map';\nimport createZip from './utils/create-zip';\nimport IntlService from './services/intl-service';\nimport dateToSerial from './utils/time';\n\nconst MIME_TYPE = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\nconst DATA_URL_PREFIX = `data:${MIME_TYPE};base64,`;\nconst DATA_URL_OPTIONS = { compression: \"DEFLATE\", type: \"base64\" };\nconst BLOB_OPTIONS = { compression: \"DEFLATE\", type: \"blob\" };\nconst ARRAYBUFFER_OPTIONS = { compression: \"DEFLATE\", type: \"arraybuffer\" };\n\n/* eslint-disable key-spacing, no-arrow-condition, indent, no-nested-ternary, consistent-return */\n\nfunction toDataURI(content) {\n return DATA_URL_PREFIX + content;\n}\n\nfunction indexOf(thing, array) {\n return array.indexOf(thing);\n}\n\nconst parseJSON = JSON.parse.bind(JSON);\n\nfunction ESC(val) {\n return String(val)\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/\\'/g, \"'\");\n}\n\nfunction repeat(count, func) {\n let str = \"\";\n for (let i = 0; i < count; ++i) {\n str += func(i);\n }\n return str;\n}\n\nfunction foreach(arr, func) {\n let str = \"\";\n if (arr != null) {\n if (Array.isArray(arr)) {\n for (let i = 0; i < arr.length; ++i) {\n str += func(arr[i], i);\n }\n } else if (typeof arr == \"object\") {\n Object.keys(arr).forEach((key, i) => {\n str += func(arr[key], key, i);\n });\n }\n }\n return str;\n}\n\nconst XMLHEAD = '\\r';\n\nconst RELS = `${XMLHEAD}\n \n \n \n \n `;\n\nconst CORE = ({ creator, lastModifiedBy, created, modified }) => `${XMLHEAD}\n \n ${ESC(creator)}\n ${ESC(lastModifiedBy)}\n ${ESC(created)}\n ${ESC(modified)}\n`;\n\nconst APP = ({ sheets }) => `${XMLHEAD}\n\n Microsoft Excel\n 0\n false\n \n \n \n Worksheets\n \n \n ${sheets.length}\n \n \n \n \n ${\n foreach(sheets, (sheet, i) =>\n sheet.options.title\n ? `${ESC(sheet.options.title)}`\n : `Sheet${i + 1}`\n )\n }\n \n false\n false\n false\n 14.0300\n`;\n\nconst CONTENT_TYPES = ({ sheetCount, commentFiles, drawingFiles }) => `${XMLHEAD}\n\n \n \n \n \n \n \n \n \n \n ${repeat(sheetCount, idx =>\n ``)}\n ${foreach(commentFiles, filename =>\n ``)}\n ${foreach(drawingFiles, filename =>\n ``)}\n \n \n`;\n\nconst WORKBOOK = ({ sheets, filterNames, userNames }) => `${XMLHEAD}\n\n \n \n \n \n \n \n ${foreach(sheets, ({ options }, i) => {\n const name = options.name || options.title || `Sheet${i + 1}`;\n return ``;\n })}\n \n ${filterNames.length || userNames.length ? `\n \n ${foreach(filterNames, (f) => `\n `)}\n ${foreach(userNames, (f) => `\n `)}\n ` : ''}\n \n`;\n\nconst WORKSHEET = ({\n frozenColumns,\n frozenRows,\n columns,\n defaults,\n data,\n index,\n mergeCells,\n autoFilter,\n filter,\n showGridLines,\n hyperlinks,\n validations,\n defaultCellStyleId,\n rtl,\n legacyDrawing,\n drawing,\n lastRow,\n lastCol\n}) => `${XMLHEAD}\n\n ${lastRow && lastCol ? `` : \"\"}\n\n \n \n ${frozenRows || frozenColumns ? `\n ` : ''}\n \n \n\n \n\n ${defaultCellStyleId != null || (columns && columns.length > 0) ? `\n \n ${!columns || !columns.length ? `\n ` : ''}\n ${foreach(columns, (column, ci) => {\n const columnIndex = typeof column.index === \"number\" ? column.index + 1 : (ci + 1);\n if (column.width === 0) {\n return ``;\n }\n return ``;\n })}\n ` : ''}\n\n \n ${foreach(data, (row, ri) => {\n const rowIndex = typeof row.index === \"number\" ? row.index + 1 : (ri + 1);\n return `\n \n ${foreach(row.data, (cell) => `\n \n ${cell.formula != null ? writeFormula(cell.formula) : ''}\n ${cell.value != null ? `${ESC(cell.value)}` : ''}\n `)}\n \n `;})}\n \n\n ${autoFilter ? ``\n : filter ? spreadsheetFilters(filter) : ''}\n\n ${mergeCells.length ? `\n \n ${foreach(mergeCells, (ref) => ``)}\n ` : ''}\n\n ${validations.length ? `\n \n ${foreach(validations, (val) => `\n \n ${val.formula1 ? `${ESC(val.formula1)}` : ''}\n ${val.formula2 ? `${ESC(val.formula2)}` : ''}\n `)}\n ` : ''}\n\n ${hyperlinks.length ? `\n \n ${foreach(hyperlinks, (link) => `\n `)}\n ` : ''}\n\n \n ${drawing ? `` : ''}\n ${legacyDrawing ? `` : ''}\n`;\n\nconst WORKBOOK_RELS = ({ count }) => `${XMLHEAD}\n\n ${repeat(count, (idx) => `\n `)}\n \n \n`;\n\nconst WORKSHEET_RELS = ({ hyperlinks, comments, sheetIndex, drawings }) => `${XMLHEAD}\n\n ${foreach(hyperlinks, (link) => `\n `)}\n ${!comments.length ? '' : `\n \n `}\n ${!drawings.length ? '' : `\n `}\n`;\n\nconst COMMENTS_XML = ({ comments }) => `${XMLHEAD}\n\n \n \n \n \n ${foreach(comments, comment => `\n \n \n \n \n \n \n \n \n \n ${ESC(comment.text)}\n \n \n `)}\n \n`;\n\nconst LEGACY_DRAWING = ({ comments }) => `\\\n\n \n \n \n \n ${foreach(comments, comment => `\n \n \n \n \n \n ${comment.anchor}\n False\n ${comment.row}\n ${comment.col}\n \n `)}\n`;\n\nconst DRAWINGS_XML = (drawings) => `${XMLHEAD}\n\n ${foreach(drawings, (drawing, index) => `\n \n \n ${drawing.col}\n ${drawing.colOffset}\n ${drawing.row}\n ${drawing.rowOffset}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `)}\n`;\n\nconst DRAWINGS_RELS_XML = (rels) => `${XMLHEAD}\n\n ${foreach(rels, rel => `\n `)}\n`;\n\nconst SHARED_STRINGS = ({ count, uniqueCount, indexes }) => `${XMLHEAD}\n\n ${foreach(Object.keys(indexes), (index) => `\n ${ESC(index.substring(1))}`)}\n`;\n\nconst STYLES = ({\n formats,\n fonts,\n fills,\n borders,\n styles\n}) => `${XMLHEAD}\n\n \n ${foreach(formats, (format, fi) => `\n `)}\n \n \n \n \n \n \n \n \n \n ${foreach(fonts, (font) => `\n \n ${font.bold ? '' : ''}\n ${font.italic ? '' : ''}\n ${font.underline ? '' : ''}\n \n ${font.color ? `` : ''}\n ${font.fontFamily ? `\n \n \n ` : `\n \n \n \n `}\n `)}\n \n \n \n \n ${foreach(fills, (fill) => `\n ${fill.background ? `\n \n \n \n \n \n ` : ''}`)}\n \n \n \n ${foreach(borders, borderTemplate)}\n \n \n \n \n \n \n ${foreach(styles, (style) => `\n \n ${style.textAlign || style.verticalAlign || style.wrap ? `\n \n ` : ''}\n \n `)}\n \n \n \n \n \n \n`;\n\nfunction writeFormula(formula) {\n if (typeof formula == \"string\") {\n return `${ESC(formula)}`;\n }\n // array formulas\n return `${ESC(formula.src)}`;\n}\n\nfunction numChar(colIndex) {\n const letter = Math.floor(colIndex / 26) - 1;\n\n return (letter >= 0 ? numChar(letter) : \"\") + String.fromCharCode(65 + (colIndex % 26));\n}\n\nfunction ref(rowIndex, colIndex) {\n return numChar(colIndex) + (rowIndex + 1);\n}\n\nfunction $ref(rowIndex, colIndex) {\n return \"$\" + numChar(colIndex) + \"$\" + (rowIndex + 1);\n}\n\nfunction filterRowIndex(options) {\n const frozenRows = options.frozenRows || (options.freezePane || {}).rowSplit || 1;\n return frozenRows - 1;\n}\n\nfunction toWidth(px) {\n const maximumDigitWidth = 7;\n return (px / maximumDigitWidth) - (Math.floor(128 / maximumDigitWidth) / 256);\n}\n\nfunction toHeight(px) {\n return px * 0.75;\n}\n\nfunction stripFunnyChars(value) {\n return String(value)\n .replace(/[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F]/g, \"\") // leave CRLF in\n .replace(/\\r?\\n/g, \"\\r\\n\"); // make sure LF is preceded by CR\n}\n\nclass Worksheet {\n\n constructor(options, sharedStrings, styles, borders) {\n this.options = options;\n this._strings = sharedStrings;\n this._styles = styles;\n this._borders = borders;\n this._validations = {};\n this._comments = [];\n this._drawings = options.drawings || [];\n this._hyperlinks = (this.options.hyperlinks || []).map(\n (link, i) => Object.assign({}, link, { rId: `link${i}` }));\n }\n\n relsToXML() {\n const hyperlinks = this._hyperlinks;\n const comments = this._comments;\n const drawings = this._drawings;\n\n if (hyperlinks.length || comments.length || drawings.length) {\n return WORKSHEET_RELS({\n hyperlinks : hyperlinks,\n comments : comments,\n sheetIndex : this.options.sheetIndex,\n drawings : drawings\n });\n }\n }\n\n toXML(index) {\n const mergeCells = this.options.mergedCells || [];\n const rows = this.options.rows || [];\n const data = inflate(rows, mergeCells);\n\n this._readCells(data);\n\n let autoFilter = this.options.filter;\n let filter;\n if (autoFilter && (typeof autoFilter.from === \"number\") && (typeof autoFilter.to === \"number\")) {\n // Grid enables auto filter\n autoFilter = {\n from: ref(filterRowIndex(this.options), autoFilter.from),\n to: ref(filterRowIndex(this.options), autoFilter.to)\n };\n } else if (autoFilter && autoFilter.ref && autoFilter.columns) {\n // this is probably from the Spreadsheet\n filter = autoFilter;\n autoFilter = null;\n }\n\n const validations = [];\n for (let i in this._validations) {\n if (Object.prototype.hasOwnProperty.call(this._validations, i)) {\n validations.push(this._validations[i]);\n }\n }\n\n let defaultCellStyleId = null;\n if (this.options.defaultCellStyle) {\n defaultCellStyleId = this._lookupStyle(this.options.defaultCellStyle);\n }\n\n const freezePane = this.options.freezePane || {};\n const defaults = this.options.defaults || {};\n const lastRow = this.options.rows ? this._getLastRow() : 1;\n const lastCol = this.options.rows ? this._getLastCol() : 1;\n\n return WORKSHEET({\n frozenColumns: this.options.frozenColumns || freezePane.colSplit,\n frozenRows: this.options.frozenRows || freezePane.rowSplit,\n columns: this.options.columns,\n defaults: defaults,\n data: data,\n index: index,\n mergeCells: mergeCells,\n autoFilter: autoFilter,\n filter: filter,\n showGridLines: this.options.showGridLines,\n hyperlinks: this._hyperlinks,\n validations: validations,\n defaultCellStyleId: defaultCellStyleId,\n rtl: this.options.rtl !== undefined ? this.options.rtl : defaults.rtl,\n legacyDrawing: this._comments.length ? `vml${this.options.sheetIndex}` : null,\n drawing: this._drawings.length ? `drw${this.options.sheetIndex}` : null,\n lastRow: lastRow,\n lastCol: lastCol\n });\n }\n\n commentsXML() {\n if (this._comments.length) {\n return COMMENTS_XML({ comments: this._comments });\n }\n }\n\n drawingsXML(images) {\n if (this._drawings.length) {\n let rels = {};\n let main = this._drawings.map(drw => {\n let ref = parseRef(drw.topLeftCell);\n let img = rels[drw.image];\n if (!img) {\n img = rels[drw.image] = {\n rId: `img${drw.image}`,\n target: images[drw.image].target\n };\n }\n return {\n col : ref.col,\n colOffset : pixelsToExcel(drw.offsetX),\n row : ref.row,\n rowOffset : pixelsToExcel(drw.offsetY),\n width : pixelsToExcel(drw.width),\n height : pixelsToExcel(drw.height),\n imageId : img.rId\n };\n });\n return {\n main: DRAWINGS_XML(main),\n rels: DRAWINGS_RELS_XML(rels)\n };\n }\n }\n\n legacyDrawing() {\n if (this._comments.length) {\n return LEGACY_DRAWING({ comments: this._comments });\n }\n }\n\n _lookupString(value) {\n const key = \"$\" + value;\n const index = this._strings.indexes[key];\n let result;\n\n if (index !== undefined) {\n result = index;\n } else {\n result = this._strings.indexes[key] = this._strings.uniqueCount;\n this._strings.uniqueCount ++;\n }\n\n this._strings.count ++;\n\n return result;\n }\n\n _lookupStyle(style) {\n const json = JSON.stringify(style);\n\n if (json === \"{}\") {\n return 0;\n }\n\n let index = indexOf(json, this._styles);\n\n if (index < 0) {\n index = this._styles.push(json) - 1;\n }\n\n // There is one default style\n return index + 1;\n }\n\n _lookupBorder(border) {\n const json = JSON.stringify(border);\n if (json === \"{}\") {\n return;\n }\n\n let index = indexOf(json, this._borders);\n if (index < 0) {\n index = this._borders.push(json) - 1;\n }\n\n // There is one default border\n return index + 1;\n }\n\n _readCells(rowData) {\n for (let i = 0; i < rowData.length; i++) {\n const row = rowData[i];\n const cells = row.cells;\n\n row.data = [];\n\n for (let j = 0; j < cells.length; j++) {\n const cellData = this._cell(cells[j], row.index, j);\n if (cellData) {\n row.data.push(cellData);\n }\n }\n }\n }\n\n _cell(data, rowIndex, cellIndex) {\n if (!data || data === EMPTY_CELL) {\n return null;\n }\n\n let value = data.value;\n\n let border = {};\n\n if (data.borderLeft) {\n border.left = data.borderLeft;\n }\n\n if (data.borderRight) {\n border.right = data.borderRight;\n }\n\n if (data.borderTop) {\n border.top = data.borderTop;\n }\n\n if (data.borderBottom) {\n border.bottom = data.borderBottom;\n }\n\n border = this._lookupBorder(border);\n\n const defStyle = this.options.defaultCellStyle || {};\n let style = { borderId: border };\n\n (function(add) {\n add(\"color\");\n add(\"background\");\n add(\"bold\");\n add(\"italic\");\n add(\"underline\");\n if (!add(\"fontFamily\")) { add(\"fontName\", \"fontFamily\"); }\n add(\"fontSize\");\n add(\"format\");\n if (!add(\"textAlign\")) { add(\"hAlign\", \"textAlign\"); }\n if (!add(\"verticalAlign\")) { add(\"vAlign\", \"verticalAlign\"); }\n add(\"wrap\");\n add(\"indent\");\n })(\n function(prop, target) {\n let val = data[prop];\n if (val === undefined) {\n val = defStyle[prop];\n }\n if (val !== undefined) {\n style[target || prop] = val;\n return true;\n }\n }\n );\n\n const columns = this.options.columns || [];\n\n const column = columns[cellIndex];\n let type = typeof value;\n\n if (column && column.autoWidth && (!data.colSpan || data.colSpan === 1)) {\n let displayValue = value;\n\n // XXX: let's not bring kendo.toString in only for this.\n // better wait until the spreadsheet engine is available as a separate\n // component, then we can use a real Excel-like formatter.\n //\n if (type === \"number\") {\n // kendo.toString will not behave exactly like the Excel format\n // Still, it's the best we have available for estimating the character count.\n displayValue = IntlService.toString(value, data.format);\n }\n\n column.width = Math.max(column.width || 0, String(displayValue).length);\n }\n\n if (type === \"string\") {\n value = stripFunnyChars(value);\n value = this._lookupString(value);\n type = \"s\";\n } else if (type === \"number\") {\n type = \"n\";\n } else if (type === \"boolean\") {\n type = \"b\";\n value = Number(value);\n } else if (value && value.getTime) {\n type = null;\n value = dateToSerial(value);\n if (!style.format) {\n style.format = \"mm-dd-yy\";\n }\n } else {\n type = null;\n value = null;\n }\n\n style = this._lookupStyle(style);\n\n const cellName = ref(rowIndex, cellIndex);\n\n if (data.validation) {\n this._addValidation(data.validation, cellName);\n }\n\n if (data.comment) {\n let anchor = [\n cellIndex + 1, // start column\n 15, // start column offset\n rowIndex, // start row\n 10, // start row offset\n cellIndex + 3, // end column\n 15, // end column offset\n rowIndex + 3, // end row\n 4 // end row offset\n ];\n this._comments.push({\n ref : cellName,\n text : data.comment,\n row : rowIndex,\n col : cellIndex,\n anchor : anchor.join(\", \")\n });\n }\n\n return {\n value: value,\n formula: data.formula,\n type: type,\n style: style,\n ref: cellName\n };\n }\n\n _addValidation(v, ref) {\n const tmp = {\n showErrorMessage : v.type === \"reject\" ? 1 : 0,\n formula1 : v.from,\n formula2 : v.to,\n type : MAP_EXCEL_TYPE[v.dataType] || v.dataType,\n operator : MAP_EXCEL_OPERATOR[v.comparerType] || v.comparerType,\n allowBlank : v.allowNulls ? 1 : 0,\n showDropDown : v.showButton ? 0 : 1, // LOL, Excel!\n error : v.messageTemplate,\n errorTitle : v.titleTemplate\n };\n const json = JSON.stringify(tmp);\n if (!this._validations[json]) {\n this._validations[json] = tmp;\n tmp.sqref = [];\n }\n this._validations[json].sqref.push(ref);\n }\n\n _getLastRow() {\n return countData(this.options.rows);\n }\n\n _getLastCol() {\n let last = 0;\n this.options.rows.forEach(function(row) {\n if (row.cells) {\n last = Math.max(last, countData(row.cells));\n }\n });\n return last;\n }\n}\n\nfunction countData(data) {\n let last = data.length;\n data.forEach(function(el) {\n if (el.index && el.index >= last) {\n last = el.index + 1;\n }\n });\n return last;\n}\n\nconst MAP_EXCEL_OPERATOR = {\n // includes only what differs; key is our operator, value is Excel\n // operator.\n greaterThanOrEqualTo : \"greaterThanOrEqual\",\n lessThanOrEqualTo : \"lessThanOrEqual\"\n};\n\nconst MAP_EXCEL_TYPE = {\n number: \"decimal\"\n};\n\nconst defaultFormats = {\n \"General\": 0,\n \"0\": 1,\n \"0.00\": 2,\n \"#,##0\": 3,\n \"#,##0.00\": 4,\n \"0%\": 9,\n \"0.00%\": 10,\n \"0.00E+00\": 11,\n \"# ?/?\": 12,\n \"# ??/??\": 13,\n \"mm-dd-yy\": 14,\n \"d-mmm-yy\": 15,\n \"d-mmm\": 16,\n \"mmm-yy\": 17,\n \"h:mm AM/PM\": 18,\n \"h:mm:ss AM/PM\": 19,\n \"h:mm\": 20,\n \"h:mm:ss\": 21,\n \"m/d/yy h:mm\": 22,\n \"#,##0 ;(#,##0)\": 37,\n \"#,##0 ;[Red](#,##0)\": 38,\n \"#,##0.00;(#,##0.00)\": 39,\n \"#,##0.00;[Red](#,##0.00)\": 40,\n \"mm:ss\": 45,\n \"[h]:mm:ss\": 46,\n \"mmss.0\": 47,\n \"##0.0E+0\": 48,\n \"@\": 49,\n \"[$-404]e/m/d\": 27,\n \"m/d/yy\": 30,\n \"t0\": 59,\n \"t0.00\": 60,\n \"t#,##0\": 61,\n \"t#,##0.00\": 62,\n \"t0%\": 67,\n \"t0.00%\": 68,\n \"t# ?/?\": 69,\n \"t# ??/??\": 70\n};\n\nfunction convertColor(value) {\n let color = value;\n if (color.length < 6) {\n color = color.replace(/(\\w)/g, function($0, $1) {\n return $1 + $1;\n });\n }\n\n color = color.substring(1).toUpperCase();\n\n if (color.length < 8) {\n color = \"FF\" + color;\n }\n\n return color;\n}\n\nclass Workbook {\n\n constructor(options) {\n this.options = options || {};\n this._strings = {\n indexes: {},\n count: 0,\n uniqueCount: 0\n };\n this._styles = [];\n this._borders = [];\n this._images = this.options.images;\n this._imgId = 0;\n\n this._sheets = map(this.options.sheets || [], (options, i) => {\n options.defaults = this.options;\n options.sheetIndex = i + 1;\n return new Worksheet(options, this._strings, this._styles, this._borders);\n });\n }\n\n imageFilename(mimeType) {\n const id = ++this._imgId;\n switch (mimeType) {\n case \"image/jpg\":\n case \"image/jpeg\":\n return `image${id}.jpg`;\n case \"image/png\":\n return `image${id}.png`;\n case \"image/gif\":\n return `image${id}.gif`;\n default:\n return `image${id}.bin`; // XXX: anything better to do here?\n }\n }\n\n toZIP() {\n const zip = createZip();\n\n const docProps = zip.folder(\"docProps\");\n\n docProps.file(\"core.xml\", CORE({\n creator: this.options.creator || \"Kendo UI\",\n lastModifiedBy: this.options.creator || \"Kendo UI\",\n created: this.options.date || new Date().toJSON(),\n modified: this.options.date || new Date().toJSON()\n }));\n\n const sheetCount = this._sheets.length;\n\n docProps.file(\"app.xml\", APP({ sheets: this._sheets }));\n\n const rels = zip.folder(\"_rels\");\n rels.file(\".rels\", RELS);\n\n const xl = zip.folder(\"xl\");\n\n const xlRels = xl.folder(\"_rels\");\n xlRels.file(\"workbook.xml.rels\", WORKBOOK_RELS({ count: sheetCount }));\n\n if (this._images) {\n const media = xl.folder(\"media\");\n Object.keys(this._images).forEach(id => {\n const img = this._images[id];\n const filename = this.imageFilename(img.type);\n media.file(filename, img.data);\n img.target = `../media/${filename}`;\n });\n }\n\n const sheetIds = {};\n xl.file(\"workbook.xml\", WORKBOOK({\n sheets: this._sheets,\n filterNames: map(this._sheets, function(sheet, index) {\n const options = sheet.options;\n const sheetName = (options.name || options.title || \"Sheet\" + (index + 1));\n sheetIds[sheetName.toLowerCase()] = index;\n const filter = options.filter;\n if (filter) {\n if (filter.ref) {\n // spreadsheet provides `ref`\n let a = filter.ref.split(\":\");\n let from = parseRef(a[0]);\n let to = parseRef(a[1]);\n return {\n localSheetId: index,\n name: sheetName,\n from: $ref(from.row, from.col),\n to: $ref(to.row, to.col)\n };\n } else if (typeof filter.from !== \"undefined\" && typeof filter.to !== \"undefined\") {\n // grid does this\n return {\n localSheetId: index,\n name: sheetName,\n from: $ref(filterRowIndex(options), filter.from),\n to: $ref(filterRowIndex(options), filter.to)\n };\n }\n }\n }),\n userNames: map(this.options.names || [], function(def) {\n return {\n name: def.localName,\n localSheetId: def.sheet ? sheetIds[def.sheet.toLowerCase()] : null,\n value: def.value,\n hidden: def.hidden\n };\n })\n }));\n\n const worksheets = xl.folder(\"worksheets\");\n const drawings = xl.folder(\"drawings\");\n const drawingsRels = drawings.folder(\"_rels\");\n const sheetRels = worksheets.folder(\"_rels\");\n const commentFiles = [];\n const drawingFiles = [];\n\n for (let idx = 0; idx < sheetCount; idx++) {\n const sheet = this._sheets[idx];\n const sheetName = `sheet${idx + 1}.xml`;\n const sheetXML = sheet.toXML(idx); // must be called before relsToXML\n const relsXML = sheet.relsToXML();\n const commentsXML = sheet.commentsXML();\n const legacyDrawing = sheet.legacyDrawing();\n const drawingsXML = sheet.drawingsXML(this._images);\n\n if (relsXML) {\n sheetRels.file(sheetName + \".rels\", relsXML);\n }\n if (commentsXML) {\n let name = `comments${sheet.options.sheetIndex}.xml`;\n xl.file(name, commentsXML);\n commentFiles.push(name);\n }\n if (legacyDrawing) {\n drawings.file(`vmlDrawing${sheet.options.sheetIndex}.vml`, legacyDrawing);\n }\n if (drawingsXML) {\n let name = `drawing${sheet.options.sheetIndex}.xml`;\n drawings.file(name, drawingsXML.main);\n drawingsRels.file(`${name}.rels`, drawingsXML.rels);\n drawingFiles.push(name);\n }\n\n worksheets.file(sheetName, sheetXML);\n }\n\n const borders = map(this._borders, parseJSON);\n\n const styles = map(this._styles, parseJSON);\n\n const hasFont = function(style) {\n return style.underline || style.bold || style.italic || style.color || style.fontFamily || style.fontSize;\n };\n\n const convertFontSize = function(value) {\n let fontInPx = Number(value);\n let fontInPt;\n\n if (fontInPx) {\n fontInPt = fontInPx * 3 / 4;\n }\n\n return fontInPt;\n };\n\n const fonts = map(styles, function(style) {\n if (style.fontSize) {\n style.fontSize = convertFontSize(style.fontSize);\n }\n\n if (style.color) {\n style.color = convertColor(style.color);\n }\n\n if (hasFont(style)) {\n return style;\n }\n });\n\n const formats = map(styles, function(style) {\n if (style.format && defaultFormats[style.format] === undefined) {\n return style;\n }\n });\n\n const fills = map(styles, function(style) {\n if (style.background) {\n style.background = convertColor(style.background);\n return style;\n }\n });\n\n xl.file(\"styles.xml\", STYLES({\n fonts: fonts,\n fills: fills,\n formats: formats,\n borders: borders,\n styles: map(styles, function(style) {\n const result = {};\n\n if (hasFont(style)) {\n result.fontId = indexOf(style, fonts) + 1;\n }\n\n if (style.background) {\n result.fillId = indexOf(style, fills) + 2;\n }\n\n result.textAlign = style.textAlign;\n result.indent = style.indent;\n result.verticalAlign = style.verticalAlign;\n result.wrap = style.wrap;\n result.borderId = style.borderId;\n\n if (style.format) {\n if (defaultFormats[style.format] !== undefined) {\n result.numFmtId = defaultFormats[style.format];\n } else {\n result.numFmtId = 165 + indexOf(style, formats);\n }\n }\n\n return result;\n })\n }));\n\n xl.file(\"sharedStrings.xml\", SHARED_STRINGS(this._strings));\n\n zip.file(\"[Content_Types].xml\", CONTENT_TYPES({\n sheetCount: sheetCount,\n commentFiles: commentFiles,\n drawingFiles: drawingFiles\n }));\n\n return zip;\n }\n\n toDataURL() {\n const zip = this.toZIP();\n\n return zip.generateAsync ? zip.generateAsync(DATA_URL_OPTIONS).then(toDataURI) : toDataURI(zip.generate(DATA_URL_OPTIONS));\n }\n\n toBlob() {\n const zip = this.toZIP();\n if (zip.generateAsync) {\n return zip.generateAsync(BLOB_OPTIONS);\n }\n return new Blob([ zip.generate(ARRAYBUFFER_OPTIONS) ], { type: MIME_TYPE });\n }\n}\n\nfunction borderStyle(width) {\n let alias = \"thin\";\n\n if (width === 2) {\n alias = \"medium\";\n } else if (width === 3) {\n alias = \"thick\";\n }\n\n return alias;\n}\n\nfunction borderSideTemplate(name, style) {\n let result = \"\";\n\n if (style) {\n result += \"<\" + name + \" style=\\\"\" + borderStyle(style.size) + \"\\\">\";\n if (style.color) {\n result += \"\";\n }\n result += \"\";\n }\n\n return result;\n}\n\nfunction borderTemplate(border) {\n return \"\" +\n borderSideTemplate(\"left\", border.left) +\n borderSideTemplate(\"right\", border.right) +\n borderSideTemplate(\"top\", border.top) +\n borderSideTemplate(\"bottom\", border.bottom) +\n \"\";\n}\n\nconst EMPTY_CELL = {};\nfunction inflate(rows, mergedCells) {\n const rowData = [];\n const rowsByIndex = [];\n\n indexRows(rows, function(row, index) {\n const data = {\n _source: row,\n index: index,\n height: row.height,\n level: row.level,\n cells: []\n };\n\n rowData.push(data);\n rowsByIndex[index] = data;\n });\n\n const sorted = sortByIndex(rowData).slice(0);\n const ctx = {\n rowData: rowData,\n rowsByIndex: rowsByIndex,\n mergedCells: mergedCells\n };\n\n for (let i = 0; i < sorted.length; i++) {\n fillCells(sorted[i], ctx);\n delete sorted[i]._source;\n }\n\n return sortByIndex(rowData);\n}\n\nfunction indexRows(rows, callback) {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) {\n continue;\n }\n\n let index = row.index;\n if (typeof index !== \"number\") {\n index = i;\n }\n\n callback(row, index);\n }\n}\n\nfunction sortByIndex(items) {\n return items.sort(function(a, b) {\n return a.index - b.index;\n });\n}\n\nfunction pushUnique(array, el) {\n if (array.indexOf(el) < 0) {\n array.push(el);\n }\n}\n\nfunction getSpan(mergedCells, ref) {\n for (let i = 0; i < mergedCells.length; ++i) {\n const range = mergedCells[i];\n const a = range.split(\":\");\n let topLeft = a[0];\n if (topLeft === ref) {\n let bottomRight = a[1];\n topLeft = parseRef(topLeft);\n bottomRight = parseRef(bottomRight);\n return {\n rowSpan: bottomRight.row - topLeft.row + 1,\n colSpan: bottomRight.col - topLeft.col + 1\n };\n }\n }\n}\n\nfunction parseRef(ref) {\n function getcol(str) {\n let upperStr = str.toUpperCase();\n let col = 0;\n for (let i = 0; i < upperStr.length; ++i) {\n col = col * 26 + upperStr.charCodeAt(i) - 64;\n }\n return col - 1;\n }\n\n function getrow(str) {\n return parseInt(str, 10) - 1;\n }\n\n const m = /^([a-z]+)(\\d+)$/i.exec(ref);\n return {\n row: getrow(m[2]),\n col: getcol(m[1])\n };\n}\n\nfunction pixelsToExcel(px) {\n return Math.round(px * 9525);\n}\n\nfunction fillCells(data, ctx) {\n const row = data._source;\n const rowIndex = data.index;\n const cells = row.cells;\n const cellData = data.cells;\n\n if (!cells) {\n return;\n }\n\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i] || EMPTY_CELL;\n\n let rowSpan = cell.rowSpan || 1;\n let colSpan = cell.colSpan || 1;\n\n const cellIndex = insertCell(cellData, cell);\n const topLeftRef = ref(rowIndex, cellIndex);\n\n if (rowSpan === 1 && colSpan === 1) {\n // could still be merged: the spreadsheet does not send\n // rowSpan/colSpan, but mergedCells is already populated.\n // https://github.com/telerik/kendo-ui-core/issues/2401\n const tmp = getSpan(ctx.mergedCells, topLeftRef);\n if (tmp) {\n colSpan = tmp.colSpan;\n rowSpan = tmp.rowSpan;\n }\n }\n\n spanCell(cell, cellData, cellIndex, colSpan);\n\n if (rowSpan > 1 || colSpan > 1) {\n pushUnique(ctx.mergedCells,\n topLeftRef + \":\" + ref(rowIndex + rowSpan - 1,\n cellIndex + colSpan - 1));\n }\n\n if (rowSpan > 1) {\n for (let ri = rowIndex + 1; ri < rowIndex + rowSpan; ri++) {\n let nextRow = ctx.rowsByIndex[ri];\n if (!nextRow) {\n nextRow = ctx.rowsByIndex[ri] = { index: ri, cells: [] };\n ctx.rowData.push(nextRow);\n }\n\n spanCell(cell, nextRow.cells, cellIndex - 1, colSpan + 1);\n }\n }\n }\n}\n\nfunction insertCell(data, cell) {\n let index;\n\n if (typeof cell.index === \"number\") {\n index = cell.index;\n insertCellAt(data, cell, cell.index);\n } else {\n index = appendCell(data, cell);\n }\n\n return index;\n}\n\nfunction insertCellAt(data, cell, index) {\n data[index] = cell;\n}\n\nfunction appendCell(data, cell) {\n let index = data.length;\n\n for (let i = 0; i < data.length + 1; i++) {\n if (!data[i]) {\n data[i] = cell;\n index = i;\n break;\n }\n }\n\n return index;\n}\n\nfunction spanCell(cell, row, startIndex, colSpan) {\n for (let i = 1; i < colSpan; i++) {\n const tmp = {\n borderTop : cell.borderTop,\n borderRight : cell.borderRight,\n borderBottom : cell.borderBottom,\n borderLeft : cell.borderLeft\n };\n insertCellAt(row, tmp, startIndex + i);\n }\n}\n\nconst SPREADSHEET_FILTERS = ({ ref, columns, generators }) => `\n\n ${foreach(columns, (col) => `\n \n ${generators[col.filter](col)}\n \n `)}\n`;\n\nconst SPREADSHEET_CUSTOM_FILTER = ({ logic, criteria }) => `\n\n${foreach(criteria, (f) => {\n let op = spreadsheetFilters.customOperator(f);\n let val = spreadsheetFilters.customValue(f);\n return ``;\n})}\n`;\n\nconst SPREADSHEET_DYNAMIC_FILTER = ({ type }) =>\n``;\n\nconst SPREADSHEET_TOP_FILTER = ({ type, value }) =>\n``;\n\nconst SPREADSHEET_VALUE_FILTER = ({ blanks, values }) =>\n `\n ${foreach(values, (value) => `\n `)}\n `;\n\nfunction spreadsheetFilters(filter) {\n return SPREADSHEET_FILTERS({\n ref: filter.ref,\n columns: filter.columns,\n generators: {\n custom : SPREADSHEET_CUSTOM_FILTER,\n dynamic : SPREADSHEET_DYNAMIC_FILTER,\n top : SPREADSHEET_TOP_FILTER,\n value : SPREADSHEET_VALUE_FILTER\n }\n });\n}\n\nspreadsheetFilters.customOperator = function(f) {\n return {\n eq : \"equal\",\n gt : \"greaterThan\",\n gte : \"greaterThanOrEqual\",\n lt : \"lessThan\",\n lte : \"lessThanOrEqual\",\n ne : \"notEqual\",\n\n // These are not in the spec, but seems to be how Excel does\n // it (see customValue below). For the non-negated versions,\n // the operator attribute is missing completely.\n doesnotstartwith: \"notEqual\",\n doesnotendwith: \"notEqual\",\n doesnotcontain: \"notEqual\",\n doesnotmatch: \"notEqual\"\n }[f.operator.toLowerCase()];\n};\n\nfunction quoteSheet(name) {\n if (/^\\'/.test(name)) { // assume already quoted, the Spreadsheet does it.\n return name;\n }\n if (/^[a-z_][a-z0-9_]*$/i.test(name)) {\n return name; // no need to quote it\n }\n return \"'\" + name.replace(/\\x27/g, \"\\\\'\") + \"'\";\n}\n\nspreadsheetFilters.customValue = function(f) {\n function esc(str) {\n return str.replace(/([*?])/g, \"~$1\");\n }\n\n switch (f.operator.toLowerCase()) {\n case \"startswith\":\n case \"doesnotstartwith\":\n return esc(f.value) + \"*\";\n\n case \"endswith\":\n case \"doesnotendwith\":\n return \"*\" + esc(f.value);\n\n case \"contains\":\n case \"doesnotcontain\":\n return \"*\" + esc(f.value) + \"*\";\n\n default:\n return f.value;\n }\n};\n\nspreadsheetFilters.dynamicFilterType = function(type) {\n return {\n quarter1 : \"Q1\",\n quarter2 : \"Q2\",\n quarter3 : \"Q3\",\n quarter4 : \"Q4\",\n january : \"M1\",\n february : \"M2\",\n march : \"M3\",\n april : \"M4\",\n may : \"M5\",\n june : \"M6\",\n july : \"M7\",\n august : \"M8\",\n september : \"M9\",\n october : \"M10\",\n november : \"M11\",\n december : \"M12\"\n }[type.toLowerCase()] || type;\n};\n\nexport {\n Workbook,\n Worksheet\n};\n","import JSZip from '@progress/jszip-esm';\n\nexport default function createZip() {\n return new JSZip();\n}\n","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { Input, ContentChildren, QueryList, Component, NgZone, Directive, TemplateRef, Optional, forwardRef, SkipSelf, Host, ContentChild, NgModule } from '@angular/core';\nimport { saveAs } from '@progress/kendo-file-saver';\nimport { IntlService, ExcelExporter, Workbook } from '@progress/kendo-ooxml';\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nexport * from '@progress/kendo-ooxml';\nimport { toString } from '@telerik/kendo-intl';\nimport { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';\n\n/* tslint:disable align */\n/* tslint:disable:no-use-before-declare */\nconst compileTemplate = (templateRef, context, updateContext) => {\n let embeddedView = templateRef.createEmbeddedView(context);\n const result = (data) => {\n updateContext(context, data);\n embeddedView.detectChanges();\n return embeddedView.rootNodes.reduce((content, rootNode) => {\n return content + rootNode.textContent;\n }, '').trim();\n };\n result.destroy = () => {\n embeddedView.destroy();\n embeddedView = null;\n };\n return result;\n};\nconst updateGroupHeaderContext = (context, data) => {\n context.$implicit = context.group = data;\n context.field = data.field;\n context.value = data.value;\n context.aggregates = data.aggregates;\n};\nconst updateGroupFooterContext = (context, data) => {\n context.group = data.group;\n context.$implicit = context.aggregates = data;\n};\nconst updateFooterContext = (context, data) => {\n context.aggregates = data.aggregates;\n};\n/**\n * @hidden\n */\nconst toExporterColumns = (sourceColumns) => {\n const exporterColumns = [];\n let columnIndex = 0;\n const addColumns = (columns, result, level) => {\n columns.forEach((column) => {\n if (column.level === level) {\n const exporterColumn = new ExporterColumn(column, columnIndex);\n result.push(exporterColumn);\n if (column.children && column.children.some(c => c !== column)) {\n const children = exporterColumn.columns = [];\n addColumns(column.children, children, level + 1);\n }\n else {\n columnIndex++;\n }\n }\n });\n };\n addColumns(sourceColumns, exporterColumns, 0);\n return exporterColumns;\n};\n/**\n * @hidden\n */\nconst destroyColumns = (columns) => {\n if (columns) {\n columns.forEach(column => {\n column.destroy();\n });\n }\n};\n/**\n * @hidden\n */\nclass ExporterColumn {\n constructor(column, columnIndex) {\n this.title = column.title;\n this.field = column.field;\n this.hidden = column.hidden;\n this.locked = column.locked;\n this.width = column.width;\n this.headerCellOptions = column.headerCellOptions;\n this.cellOptions = column.cellOptions;\n this.groupHeaderCellOptions = column.groupHeaderCellOptions;\n this.groupFooterCellOptions = column.groupFooterCellOptions;\n this.footerCellOptions = column.footerCellOptions;\n if (column.footerTemplate) {\n this.footerTemplate = compileTemplate(column.footerTemplate.templateRef, {\n $implicit: column,\n column: column,\n columnIndex: columnIndex\n }, updateFooterContext);\n }\n if (column.groupFooterTemplate) {\n this.groupFooterTemplate = compileTemplate(column.groupFooterTemplate.templateRef, {\n column: column,\n field: column.field\n }, updateGroupFooterContext);\n }\n if (column.groupHeaderTemplate) {\n this.groupHeaderTemplate = compileTemplate(column.groupHeaderTemplate.templateRef, {}, updateGroupHeaderContext);\n }\n if (column.groupHeaderColumnTemplate) {\n this.groupHeaderColumnTemplate = compileTemplate(column.groupHeaderColumnTemplate.templateRef, {}, updateGroupHeaderContext);\n }\n }\n destroy() {\n if (this.footerTemplate) {\n this.footerTemplate.destroy();\n }\n if (this.groupFooterTemplate) {\n this.groupFooterTemplate.destroy();\n }\n if (this.groupHeaderTemplate) {\n this.groupHeaderTemplate.destroy();\n }\n if (this.groupHeaderColumnTemplate) {\n this.groupHeaderColumnTemplate.destroy();\n }\n destroyColumns(this.columns);\n }\n}\n\nIntlService.register({ toString });\n/**\n *\n * @hidden\n */\nconst workbookOptions = (options) => {\n const columns = toExporterColumns(options.columns);\n const exporter = new ExcelExporter({\n columns: columns,\n data: options.data,\n filterable: options.filterable,\n groups: options.group,\n paddingCellOptions: options.paddingCellOptions,\n headerPaddingCellOptions: options.headerPaddingCellOptions,\n collapsible: options.collapsible,\n hierarchy: options.hierarchy,\n aggregates: options.aggregates\n });\n const result = exporter.workbook();\n result.creator = options.creator;\n result.date = options.date;\n result.rtl = options.rtl;\n destroyColumns(columns);\n return result;\n};\n/**\n * @hidden\n */\nconst toDataURL = (options) => {\n const workbook = new Workbook(options);\n return workbook.toDataURL();\n};\n/**\n * @hidden\n */\nconst isWorkbookOptions = (value) => {\n return value && value.sheets;\n};\n\n/**\n * @hidden\n */\nclass ColumnBase {\n constructor(parent) {\n this.parent = parent;\n }\n /**\n * @hidden\n */\n get level() {\n return this.parent ? this.parent.level + 1 : 0;\n }\n}\nColumnBase.ɵfac = function ColumnBase_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nColumnBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnBase, contentQueries: function ColumnBase_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.children = _t);\n } }, inputs: { title: \"title\", width: \"width\", locked: \"locked\", hidden: \"hidden\", headerCellOptions: \"headerCellOptions\" } });\nColumnBase.propDecorators = {\n title: [{ type: Input }],\n width: [{ type: Input }],\n locked: [{ type: Input }],\n hidden: [{ type: Input }],\n headerCellOptions: [{ type: Input }],\n children: [{ type: ContentChildren, args: [ColumnBase,] }]\n};\n\n\n// tslint:disable:max-line-length\n/**\n * Represents the [Kendo UI Excel Export component for Angular]({% slug overview_excelexport %}).\n * Configures the settings for the Excel export of the Kendo UI Grid.\n */\nclass ExcelExportComponent {\n constructor(localization, zone) {\n this.localization = localization;\n this.zone = zone;\n /**\n * Specifies the name of the file that is exported to Excel.\n * @default \"Export.xlsx\"\n */\n this.fileName = 'Export.xlsx';\n /**\n * @hidden\n */\n this.columns = new QueryList();\n this.saveFile = this.saveFile.bind(this);\n }\n /**\n * Saves the data to Excel.\n *\n * @param exportData - An optional parameter. Can be the data that will be exported or [`WorkbookOptions`]({% slug api_excel-export_workbookoptions %}).\n */\n save(exportData) {\n this.toDataURL(exportData).then(this.saveFile);\n }\n /**\n * Based on the specified columns and data, returns\n * [`WorkbookOptions`]({% slug api_excel-export_workbookoptions %})\n * ([see example]({% slug customrowsandcells_excelexport %})).\n *\n * @param exportData - The optional data to be exported.\n * @returns {WorkbookOptions} - The workbook options.\n */\n workbookOptions(exportData) {\n const currentData = this.getExportData(exportData);\n const options = workbookOptions({\n columns: this.columns,\n data: currentData.data,\n group: currentData.group,\n filterable: this.filterable,\n creator: this.creator,\n date: this.date,\n rtl: this.localization.rtl,\n paddingCellOptions: this.paddingCellOptions,\n headerPaddingCellOptions: this.headerPaddingCellOptions,\n collapsible: this.collapsible\n });\n return options;\n }\n /**\n * Returns a promise which will be resolved with the file data URI\n * ([see example]({% slug filesaving_excelexport %})).\n *\n * @param exportData - The optional data or [`WorkbookOptions`]({% slug api_excel-export_workbookoptions %}) that will be used to generate the data URI.\n * @returns {Promise} - The promise that will be resolved by the file data URI.\n */\n toDataURL(exportData) {\n const options = isWorkbookOptions(exportData) ?\n exportData :\n this.workbookOptions(exportData);\n return this.zone.runOutsideAngular(() => toDataURL(options));\n }\n getExportData(exportData) {\n let result;\n if (exportData) {\n if (Array.isArray(exportData)) {\n result = {\n data: exportData\n };\n }\n else {\n result = exportData;\n }\n }\n else {\n result = {\n data: this.data,\n group: this.group\n };\n }\n return result;\n }\n saveFile(dataURL) {\n saveAs(dataURL, this.fileName, {\n forceProxy: this.forceProxy,\n proxyURL: this.proxyURL\n });\n }\n}\nExcelExportComponent.ɵfac = function ExcelExportComponent_Factory(t) { return new (t || ExcelExportComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nExcelExportComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ExcelExportComponent, selectors: [[\"kendo-excelexport\"]], contentQueries: function ExcelExportComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columns = _t);\n } }, inputs: { fileName: \"fileName\", filterable: \"filterable\", collapsible: \"collapsible\", creator: \"creator\", date: \"date\", forceProxy: \"forceProxy\", proxyURL: \"proxyURL\", data: \"data\", group: \"group\", paddingCellOptions: \"paddingCellOptions\", headerPaddingCellOptions: \"headerPaddingCellOptions\" }, exportAs: [\"kendoExcelExport\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.excelexport'\n }\n ])], decls: 0, vars: 0, template: function ExcelExportComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nExcelExportComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: NgZone }\n];\nExcelExportComponent.propDecorators = {\n fileName: [{ type: Input }],\n filterable: [{ type: Input }],\n collapsible: [{ type: Input }],\n creator: [{ type: Input }],\n date: [{ type: Input }],\n forceProxy: [{ type: Input }],\n proxyURL: [{ type: Input }],\n data: [{ type: Input }],\n group: [{ type: Input }],\n paddingCellOptions: [{ type: Input }],\n headerPaddingCellOptions: [{ type: Input }],\n columns: [{ type: ContentChildren, args: [ColumnBase, { descendants: true },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelExportComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoExcelExport',\n selector: 'kendo-excelexport',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.excelexport'\n }\n ],\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { fileName: [{\n type: Input\n }], columns: [{\n type: ContentChildren,\n args: [ColumnBase, { descendants: true }]\n }], filterable: [{\n type: Input\n }], collapsible: [{\n type: Input\n }], creator: [{\n type: Input\n }], date: [{\n type: Input\n }], forceProxy: [{\n type: Input\n }], proxyURL: [{\n type: Input\n }], data: [{\n type: Input\n }], group: [{\n type: Input\n }], paddingCellOptions: [{\n type: Input\n }], headerPaddingCellOptions: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the group header cell template of the Excel Export column component\n * ([see example]({% slug columns_excel-export %}#toc-group-header-template)).\n * Enables you to customize the content of the group header item.\n */\nclass GroupHeaderTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupHeaderTemplateDirective.ɵfac = function GroupHeaderTemplateDirective_Factory(t) { return new (t || GroupHeaderTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupHeaderTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupHeaderTemplateDirective, selectors: [[\"\", \"kendoExcelExportGroupHeaderTemplate\", \"\"]] });\n/** @nocollapse */\nGroupHeaderTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupHeaderTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoExcelExportGroupHeaderTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the group header column template of the Excel Export column component\n * ([see example]({% slug columns_excel-export %}#toc-group-header-column-template)).\n */\nclass GroupHeaderColumnTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupHeaderColumnTemplateDirective.ɵfac = function GroupHeaderColumnTemplateDirective_Factory(t) { return new (t || GroupHeaderColumnTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupHeaderColumnTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupHeaderColumnTemplateDirective, selectors: [[\"\", \"kendoExcelExportGroupHeaderColumnTemplate\", \"\"]] });\n/** @nocollapse */\nGroupHeaderColumnTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupHeaderColumnTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoExcelExportGroupHeaderColumnTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the group footer cell template of the Excel Export column component\n * ([see example]({% slug columns_excel-export %}#toc-group-footer-template)).\n * Enables you to customize the group footer cell of the column.\n */\nclass GroupFooterTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupFooterTemplateDirective.ɵfac = function GroupFooterTemplateDirective_Factory(t) { return new (t || GroupFooterTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupFooterTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupFooterTemplateDirective, selectors: [[\"\", \"kendoExcelExportGroupFooterTemplate\", \"\"]] });\n/** @nocollapse */\nGroupFooterTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupFooterTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoExcelExportGroupFooterTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the footer cell template of the Excel Export column component\n * ([see example]({% slug columns_excel-export %}#toc-footer-template)).\n * Enables you to customize the footer cell of the column.\n */\nclass FooterTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nFooterTemplateDirective.ɵfac = function FooterTemplateDirective_Factory(t) { return new (t || FooterTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nFooterTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FooterTemplateDirective, selectors: [[\"\", \"kendoExcelExportFooterTemplate\", \"\"]] });\n/** @nocollapse */\nFooterTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FooterTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoExcelExportFooterTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the columns of the Kendo UI Excel Export component for Angular.\n */\nclass ColumnComponent extends ColumnBase {\n constructor(parent) {\n super(parent);\n }\n}\nColumnComponent.ɵfac = function ColumnComponent_Factory(t) { return new (t || ColumnComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase, 13)); };\nColumnComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnComponent, selectors: [[\"kendo-excelexport-column\"]], contentQueries: function ColumnComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupHeaderTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupHeaderColumnTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupFooterTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, FooterTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupHeaderTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupHeaderColumnTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupFooterTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.footerTemplate = _t.first);\n } }, inputs: { field: \"field\", cellOptions: \"cellOptions\", groupHeaderCellOptions: \"groupHeaderCellOptions\", groupFooterCellOptions: \"groupFooterCellOptions\", footerCellOptions: \"footerCellOptions\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase,\n useExisting: forwardRef(() => ColumnComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function ColumnComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nColumnComponent.ctorParameters = () => [\n { type: ColumnBase, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nColumnComponent.propDecorators = {\n field: [{ type: Input }],\n cellOptions: [{ type: Input }],\n groupHeaderCellOptions: [{ type: Input }],\n groupFooterCellOptions: [{ type: Input }],\n footerCellOptions: [{ type: Input }],\n groupHeaderTemplate: [{ type: ContentChild, args: [GroupHeaderTemplateDirective,] }],\n groupHeaderColumnTemplate: [{ type: ContentChild, args: [GroupHeaderColumnTemplateDirective,] }],\n groupFooterTemplate: [{ type: ContentChild, args: [GroupFooterTemplateDirective,] }],\n footerTemplate: [{ type: ContentChild, args: [FooterTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase,\n useExisting: forwardRef(() => ColumnComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-excelexport-column',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { field: [{\n type: Input\n }], cellOptions: [{\n type: Input\n }], groupHeaderCellOptions: [{\n type: Input\n }], groupFooterCellOptions: [{\n type: Input\n }], footerCellOptions: [{\n type: Input\n }], groupHeaderTemplate: [{\n type: ContentChild,\n args: [GroupHeaderTemplateDirective]\n }], groupHeaderColumnTemplate: [{\n type: ContentChild,\n args: [GroupHeaderColumnTemplateDirective]\n }], groupFooterTemplate: [{\n type: ContentChild,\n args: [GroupFooterTemplateDirective]\n }], footerTemplate: [{\n type: ContentChild,\n args: [FooterTemplateDirective]\n }] }); })();\n\n/**\n * Represents the column group component of the Kendo UI Excel Export component.\n */\nclass ColumnGroupComponent extends ColumnBase {\n constructor(parent) {\n super(parent);\n this.parent = parent;\n }\n}\nColumnGroupComponent.ɵfac = function ColumnGroupComponent_Factory(t) { return new (t || ColumnGroupComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase, 13)); };\nColumnGroupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnGroupComponent, selectors: [[\"kendo-excelexport-column-group\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase,\n useExisting: forwardRef(() => ColumnGroupComponent) // tslint:disable-line:no-forward-ref\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function ColumnGroupComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nColumnGroupComponent.ctorParameters = () => [\n { type: ColumnBase, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnGroupComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase,\n useExisting: forwardRef(() => ColumnGroupComponent) // tslint:disable-line:no-forward-ref\n }\n ],\n selector: 'kendo-excelexport-column-group',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, null); })();\n\nconst declarations = [\n ExcelExportComponent,\n ColumnComponent,\n ColumnGroupComponent,\n FooterTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Excel Export component.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the ExcelExportModule module\n * import { ExcelExportModule } from '@progress/kendo-angular-excel-export';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, ExcelExportModule], // import ExcelExportModule module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass ExcelExportModule {\n}\nExcelExportModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ExcelExportModule });\nExcelExportModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ExcelExportModule_Factory(t) { return new (t || ExcelExportModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ExcelExportModule, { declarations: [ExcelExportComponent,\n ColumnComponent,\n ColumnGroupComponent,\n FooterTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective], exports: [ExcelExportComponent,\n ColumnComponent,\n ColumnGroupComponent,\n FooterTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelExportModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations],\n exports: [declarations]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { GroupHeaderColumnTemplateDirective, ExcelExportComponent, ExcelExportModule, ColumnBase, ColumnComponent, ColumnGroupComponent, FooterTemplateDirective, GroupFooterTemplateDirective, GroupHeaderTemplateDirective, workbookOptions, toDataURL, isWorkbookOptions };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O21JQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O21IQWNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzttS0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztxTEFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O21LQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7b0pBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztpSkFZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztzSkFZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb3B5cmlnaHQgwqkgMjAyMCBQcm9ncmVzcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgY29tbWVyY2lhbCBsaWNlbnNlLiBTZWUgTElDRU5TRS5tZCBpbiB0aGUgcHJvamVjdCByb290IGZvciBtb3JlIGluZm9ybWF0aW9uXG4qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBJbnB1dCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudCwgTmdab25lLCBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmLCBPcHRpb25hbCwgZm9yd2FyZFJlZiwgU2tpcFNlbGYsIEhvc3QsIENvbnRlbnRDaGlsZCwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1maWxlLXNhdmVyJztcbmltcG9ydCB7IEludGxTZXJ2aWNlLCBFeGNlbEV4cG9ydGVyLCBXb3JrYm9vayB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1vb3htbCc7XG5leHBvcnQgKiBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tb294bWwnO1xuaW1wb3J0IHsgdG9TdHJpbmcgfSBmcm9tICdAdGVsZXJpay9rZW5kby1pbnRsJztcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UsIEwxME5fUFJFRklYIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5cbi8qIHRzbGludDpkaXNhYmxlIGFsaWduICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11c2UtYmVmb3JlLWRlY2xhcmUgKi9cbmNvbnN0IGNvbXBpbGVUZW1wbGF0ZSA9ICh0ZW1wbGF0ZVJlZiwgY29udGV4dCwgdXBkYXRlQ29udGV4dCkgPT4ge1xuICAgIGxldCBlbWJlZGRlZFZpZXcgPSB0ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCk7XG4gICAgY29uc3QgcmVzdWx0ID0gKGRhdGEpID0+IHtcbiAgICAgICAgdXBkYXRlQ29udGV4dChjb250ZXh0LCBkYXRhKTtcbiAgICAgICAgZW1iZWRkZWRWaWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgcmV0dXJuIGVtYmVkZGVkVmlldy5yb290Tm9kZXMucmVkdWNlKChjb250ZW50LCByb290Tm9kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQgKyByb290Tm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgfSwgJycpLnRyaW0oKTtcbiAgICB9O1xuICAgIHJlc3VsdC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICBlbWJlZGRlZFZpZXcuZGVzdHJveSgpO1xuICAgICAgICBlbWJlZGRlZFZpZXcgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCB1cGRhdGVHcm91cEhlYWRlckNvbnRleHQgPSAoY29udGV4dCwgZGF0YSkgPT4ge1xuICAgIGNvbnRleHQuJGltcGxpY2l0ID0gY29udGV4dC5ncm91cCA9IGRhdGE7XG4gICAgY29udGV4dC5maWVsZCA9IGRhdGEuZmllbGQ7XG4gICAgY29udGV4dC52YWx1ZSA9IGRhdGEudmFsdWU7XG4gICAgY29udGV4dC5hZ2dyZWdhdGVzID0gZGF0YS5hZ2dyZWdhdGVzO1xufTtcbmNvbnN0IHVwZGF0ZUdyb3VwRm9vdGVyQ29udGV4dCA9IChjb250ZXh0LCBkYXRhKSA9PiB7XG4gICAgY29udGV4dC5ncm91cCA9IGRhdGEuZ3JvdXA7XG4gICAgY29udGV4dC4kaW1wbGljaXQgPSBjb250ZXh0LmFnZ3JlZ2F0ZXMgPSBkYXRhO1xufTtcbmNvbnN0IHVwZGF0ZUZvb3RlckNvbnRleHQgPSAoY29udGV4dCwgZGF0YSkgPT4ge1xuICAgIGNvbnRleHQuYWdncmVnYXRlcyA9IGRhdGEuYWdncmVnYXRlcztcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdG9FeHBvcnRlckNvbHVtbnMgPSAoc291cmNlQ29sdW1ucykgPT4ge1xuICAgIGNvbnN0IGV4cG9ydGVyQ29sdW1ucyA9IFtdO1xuICAgIGxldCBjb2x1bW5JbmRleCA9IDA7XG4gICAgY29uc3QgYWRkQ29sdW1ucyA9IChjb2x1bW5zLCByZXN1bHQsIGxldmVsKSA9PiB7XG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmxldmVsID09PSBsZXZlbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVyQ29sdW1uID0gbmV3IEV4cG9ydGVyQ29sdW1uKGNvbHVtbiwgY29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGV4cG9ydGVyQ29sdW1uKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmNoaWxkcmVuICYmIGNvbHVtbi5jaGlsZHJlbi5zb21lKGMgPT4gYyAhPT0gY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGV4cG9ydGVyQ29sdW1uLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ29sdW1ucyhjb2x1bW4uY2hpbGRyZW4sIGNoaWxkcmVuLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgYWRkQ29sdW1ucyhzb3VyY2VDb2x1bW5zLCBleHBvcnRlckNvbHVtbnMsIDApO1xuICAgIHJldHVybiBleHBvcnRlckNvbHVtbnM7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGRlc3Ryb3lDb2x1bW5zID0gKGNvbHVtbnMpID0+IHtcbiAgICBpZiAoY29sdW1ucykge1xuICAgICAgICBjb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgICAgIGNvbHVtbi5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRXhwb3J0ZXJDb2x1bW4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGNvbHVtbi50aXRsZTtcbiAgICAgICAgdGhpcy5maWVsZCA9IGNvbHVtbi5maWVsZDtcbiAgICAgICAgdGhpcy5oaWRkZW4gPSBjb2x1bW4uaGlkZGVuO1xuICAgICAgICB0aGlzLmxvY2tlZCA9IGNvbHVtbi5sb2NrZWQ7XG4gICAgICAgIHRoaXMud2lkdGggPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgIHRoaXMuaGVhZGVyQ2VsbE9wdGlvbnMgPSBjb2x1bW4uaGVhZGVyQ2VsbE9wdGlvbnM7XG4gICAgICAgIHRoaXMuY2VsbE9wdGlvbnMgPSBjb2x1bW4uY2VsbE9wdGlvbnM7XG4gICAgICAgIHRoaXMuZ3JvdXBIZWFkZXJDZWxsT3B0aW9ucyA9IGNvbHVtbi5ncm91cEhlYWRlckNlbGxPcHRpb25zO1xuICAgICAgICB0aGlzLmdyb3VwRm9vdGVyQ2VsbE9wdGlvbnMgPSBjb2x1bW4uZ3JvdXBGb290ZXJDZWxsT3B0aW9ucztcbiAgICAgICAgdGhpcy5mb290ZXJDZWxsT3B0aW9ucyA9IGNvbHVtbi5mb290ZXJDZWxsT3B0aW9ucztcbiAgICAgICAgaWYgKGNvbHVtbi5mb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IGNvbXBpbGVUZW1wbGF0ZShjb2x1bW4uZm9vdGVyVGVtcGxhdGUudGVtcGxhdGVSZWYsIHtcbiAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtbixcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogY29sdW1uSW5kZXhcbiAgICAgICAgICAgIH0sIHVwZGF0ZUZvb3RlckNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW4uZ3JvdXBGb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cEZvb3RlclRlbXBsYXRlID0gY29tcGlsZVRlbXBsYXRlKGNvbHVtbi5ncm91cEZvb3RlclRlbXBsYXRlLnRlbXBsYXRlUmVmLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5maWVsZFxuICAgICAgICAgICAgfSwgdXBkYXRlR3JvdXBGb290ZXJDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmdyb3VwSGVhZGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZSA9IGNvbXBpbGVUZW1wbGF0ZShjb2x1bW4uZ3JvdXBIZWFkZXJUZW1wbGF0ZS50ZW1wbGF0ZVJlZiwge30sIHVwZGF0ZUdyb3VwSGVhZGVyQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbi5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGUgPSBjb21waWxlVGVtcGxhdGUoY29sdW1uLmdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGUudGVtcGxhdGVSZWYsIHt9LCB1cGRhdGVHcm91cEhlYWRlckNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmZvb3RlclRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZvb3RlclRlbXBsYXRlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cEZvb3RlclRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwRm9vdGVyVGVtcGxhdGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95Q29sdW1ucyh0aGlzLmNvbHVtbnMpO1xuICAgIH1cbn1cblxuSW50bFNlcnZpY2UucmVnaXN0ZXIoeyB0b1N0cmluZyB9KTtcbi8qKlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgd29ya2Jvb2tPcHRpb25zID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb2x1bW5zID0gdG9FeHBvcnRlckNvbHVtbnMob3B0aW9ucy5jb2x1bW5zKTtcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBFeGNlbEV4cG9ydGVyKHtcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgZGF0YTogb3B0aW9ucy5kYXRhLFxuICAgICAgICBmaWx0ZXJhYmxlOiBvcHRpb25zLmZpbHRlcmFibGUsXG4gICAgICAgIGdyb3Vwczogb3B0aW9ucy5ncm91cCxcbiAgICAgICAgcGFkZGluZ0NlbGxPcHRpb25zOiBvcHRpb25zLnBhZGRpbmdDZWxsT3B0aW9ucyxcbiAgICAgICAgaGVhZGVyUGFkZGluZ0NlbGxPcHRpb25zOiBvcHRpb25zLmhlYWRlclBhZGRpbmdDZWxsT3B0aW9ucyxcbiAgICAgICAgY29sbGFwc2libGU6IG9wdGlvbnMuY29sbGFwc2libGUsXG4gICAgICAgIGhpZXJhcmNoeTogb3B0aW9ucy5oaWVyYXJjaHksXG4gICAgICAgIGFnZ3JlZ2F0ZXM6IG9wdGlvbnMuYWdncmVnYXRlc1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9ydGVyLndvcmtib29rKCk7XG4gICAgcmVzdWx0LmNyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3I7XG4gICAgcmVzdWx0LmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgcmVzdWx0LnJ0bCA9IG9wdGlvbnMucnRsO1xuICAgIGRlc3Ryb3lDb2x1bW5zKGNvbHVtbnMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHRvRGF0YVVSTCA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sob3B0aW9ucyk7XG4gICAgcmV0dXJuIHdvcmtib29rLnRvRGF0YVVSTCgpO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1dvcmtib29rT3B0aW9ucyA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5zaGVldHM7XG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ29sdW1uQmFzZSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5sZXZlbCArIDEgOiAwO1xuICAgIH1cbn1cbkNvbHVtbkJhc2UucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHdpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb2NrZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhpZGRlbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVhZGVyQ2VsbE9wdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNoaWxkcmVuOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtDb2x1bW5CYXNlLF0gfV1cbn07XG5cbi8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgRXhjZWwgRXhwb3J0IGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19leGNlbGV4cG9ydCAlfSkuXG4gKiBDb25maWd1cmVzIHRoZSBzZXR0aW5ncyBmb3IgdGhlIEV4Y2VsIGV4cG9ydCBvZiB0aGUgS2VuZG8gVUkgR3JpZC5cbiAqL1xuY2xhc3MgRXhjZWxFeHBvcnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbiwgem9uZSkge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlzIGV4cG9ydGVkIHRvIEV4Y2VsLlxuICAgICAgICAgKiBAZGVmYXVsdCBcIkV4cG9ydC54bHN4XCJcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAnRXhwb3J0Lnhsc3gnO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLnNhdmVGaWxlID0gdGhpcy5zYXZlRmlsZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYXZlcyB0aGUgZGF0YSB0byBFeGNlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleHBvcnREYXRhIC0gQW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBDYW4gYmUgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGV4cG9ydGVkIG9yIFtgV29ya2Jvb2tPcHRpb25zYF0oeyUgc2x1ZyBhcGlfZXhjZWwtZXhwb3J0X3dvcmtib29rb3B0aW9ucyAlfSkuXG4gICAgICovXG4gICAgc2F2ZShleHBvcnREYXRhKSB7XG4gICAgICAgIHRoaXMudG9EYXRhVVJMKGV4cG9ydERhdGEpLnRoZW4odGhpcy5zYXZlRmlsZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgY29sdW1ucyBhbmQgZGF0YSwgcmV0dXJuc1xuICAgICAqIFtgV29ya2Jvb2tPcHRpb25zYF0oeyUgc2x1ZyBhcGlfZXhjZWwtZXhwb3J0X3dvcmtib29rb3B0aW9ucyAlfSlcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGN1c3RvbXJvd3NhbmRjZWxsc19leGNlbGV4cG9ydCAlfSkpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV4cG9ydERhdGEgLSBUaGUgb3B0aW9uYWwgZGF0YSB0byBiZSBleHBvcnRlZC5cbiAgICAgKiBAcmV0dXJucyB7V29ya2Jvb2tPcHRpb25zfSAtIFRoZSB3b3JrYm9vayBvcHRpb25zLlxuICAgICAqL1xuICAgIHdvcmtib29rT3B0aW9ucyhleHBvcnREYXRhKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gdGhpcy5nZXRFeHBvcnREYXRhKGV4cG9ydERhdGEpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gd29ya2Jvb2tPcHRpb25zKHtcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgIGRhdGE6IGN1cnJlbnREYXRhLmRhdGEsXG4gICAgICAgICAgICBncm91cDogY3VycmVudERhdGEuZ3JvdXAsXG4gICAgICAgICAgICBmaWx0ZXJhYmxlOiB0aGlzLmZpbHRlcmFibGUsXG4gICAgICAgICAgICBjcmVhdG9yOiB0aGlzLmNyZWF0b3IsXG4gICAgICAgICAgICBkYXRlOiB0aGlzLmRhdGUsXG4gICAgICAgICAgICBydGw6IHRoaXMubG9jYWxpemF0aW9uLnJ0bCxcbiAgICAgICAgICAgIHBhZGRpbmdDZWxsT3B0aW9uczogdGhpcy5wYWRkaW5nQ2VsbE9wdGlvbnMsXG4gICAgICAgICAgICBoZWFkZXJQYWRkaW5nQ2VsbE9wdGlvbnM6IHRoaXMuaGVhZGVyUGFkZGluZ0NlbGxPcHRpb25zLFxuICAgICAgICAgICAgY29sbGFwc2libGU6IHRoaXMuY29sbGFwc2libGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIGZpbGUgZGF0YSBVUklcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGZpbGVzYXZpbmdfZXhjZWxleHBvcnQgJX0pKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleHBvcnREYXRhIC0gVGhlIG9wdGlvbmFsIGRhdGEgb3IgW2BXb3JrYm9va09wdGlvbnNgXSh7JSBzbHVnIGFwaV9leGNlbC1leHBvcnRfd29ya2Jvb2tvcHRpb25zICV9KSB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZGF0YSBVUkkuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYnkgdGhlIGZpbGUgZGF0YSBVUkkuXG4gICAgICovXG4gICAgdG9EYXRhVVJMKGV4cG9ydERhdGEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGlzV29ya2Jvb2tPcHRpb25zKGV4cG9ydERhdGEpID9cbiAgICAgICAgICAgIGV4cG9ydERhdGEgOlxuICAgICAgICAgICAgdGhpcy53b3JrYm9va09wdGlvbnMoZXhwb3J0RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdG9EYXRhVVJMKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgZ2V0RXhwb3J0RGF0YShleHBvcnREYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGlmIChleHBvcnREYXRhKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBvcnREYXRhKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZXhwb3J0RGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBleHBvcnREYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICBncm91cDogdGhpcy5ncm91cFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzYXZlRmlsZShkYXRhVVJMKSB7XG4gICAgICAgIHNhdmVBcyhkYXRhVVJMLCB0aGlzLmZpbGVOYW1lLCB7XG4gICAgICAgICAgICBmb3JjZVByb3h5OiB0aGlzLmZvcmNlUHJveHksXG4gICAgICAgICAgICBwcm94eVVSTDogdGhpcy5wcm94eVVSTFxuICAgICAgICB9KTtcbiAgICB9XG59XG5FeGNlbEV4cG9ydENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9FeGNlbEV4cG9ydCcsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1leGNlbGV4cG9ydCcsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5leGNlbGV4cG9ydCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkV4Y2VsRXhwb3J0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5FeGNlbEV4cG9ydENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBmaWxlTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sbGFwc2libGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNyZWF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcmNlUHJveHk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHByb3h5VVJMOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGFkZGluZ0NlbGxPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBoZWFkZXJQYWRkaW5nQ2VsbE9wdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbHVtbnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NvbHVtbkJhc2UsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdyb3VwIGhlYWRlciBjZWxsIHRlbXBsYXRlIG9mIHRoZSBFeGNlbCBFeHBvcnQgY29sdW1uIGNvbXBvbmVudFxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBjb2x1bW5zX2V4Y2VsLWV4cG9ydCAlfSN0b2MtZ3JvdXAtaGVhZGVyLXRlbXBsYXRlKSkuXG4gKiBFbmFibGVzIHlvdSB0byBjdXN0b21pemUgdGhlIGNvbnRlbnQgb2YgdGhlIGdyb3VwIGhlYWRlciBpdGVtLlxuICovXG5jbGFzcyBHcm91cEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRXhjZWxFeHBvcnRHcm91cEhlYWRlclRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdyb3VwIGhlYWRlciBjb2x1bW4gdGVtcGxhdGUgb2YgdGhlIEV4Y2VsIEV4cG9ydCBjb2x1bW4gY29tcG9uZW50XG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGNvbHVtbnNfZXhjZWwtZXhwb3J0ICV9I3RvYy1ncm91cC1oZWFkZXItY29sdW1uLXRlbXBsYXRlKSkuXG4gKi9cbmNsYXNzIEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5Hcm91cEhlYWRlckNvbHVtblRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9FeGNlbEV4cG9ydEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Hcm91cEhlYWRlckNvbHVtblRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ3JvdXAgZm9vdGVyIGNlbGwgdGVtcGxhdGUgb2YgdGhlIEV4Y2VsIEV4cG9ydCBjb2x1bW4gY29tcG9uZW50XG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGNvbHVtbnNfZXhjZWwtZXhwb3J0ICV9I3RvYy1ncm91cC1mb290ZXItdGVtcGxhdGUpKS5cbiAqIEVuYWJsZXMgeW91IHRvIGN1c3RvbWl6ZSB0aGUgZ3JvdXAgZm9vdGVyIGNlbGwgb2YgdGhlIGNvbHVtbi5cbiAqL1xuY2xhc3MgR3JvdXBGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0V4Y2VsRXhwb3J0R3JvdXBGb290ZXJUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBmb290ZXIgY2VsbCB0ZW1wbGF0ZSBvZiB0aGUgRXhjZWwgRXhwb3J0IGNvbHVtbiBjb21wb25lbnRcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgY29sdW1uc19leGNlbC1leHBvcnQgJX0jdG9jLWZvb3Rlci10ZW1wbGF0ZSkpLlxuICogRW5hYmxlcyB5b3UgdG8gY3VzdG9taXplIHRoZSBmb290ZXIgY2VsbCBvZiB0aGUgY29sdW1uLlxuICovXG5jbGFzcyBGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9FeGNlbEV4cG9ydEZvb3RlclRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb2x1bW5zIG9mIHRoZSBLZW5kbyBVSSBFeGNlbCBFeHBvcnQgY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICovXG5jbGFzcyBDb2x1bW5Db21wb25lbnQgZXh0ZW5kcyBDb2x1bW5CYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICB9XG59XG5Db2x1bW5Db21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ29sdW1uQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbHVtbkNvbXBvbmVudCkgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWV4Y2VsZXhwb3J0LWNvbHVtbicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNvbHVtbkNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IENvbHVtbkJhc2UsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNraXBTZWxmIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5Db2x1bW5Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmllbGQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNlbGxPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cEhlYWRlckNlbGxPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cEZvb3RlckNlbGxPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb290ZXJDZWxsT3B0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBIZWFkZXJUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0dyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBncm91cEZvb3RlclRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtHcm91cEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgZm9vdGVyVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0Zvb3RlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29sdW1uIGdyb3VwIGNvbXBvbmVudCBvZiB0aGUgS2VuZG8gVUkgRXhjZWwgRXhwb3J0IGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgQ29sdW1uR3JvdXBDb21wb25lbnQgZXh0ZW5kcyBDb2x1bW5CYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxufVxuQ29sdW1uR3JvdXBDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ29sdW1uQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbHVtbkdyb3VwQ29tcG9uZW50KSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZXhjZWxleHBvcnQtY29sdW1uLWdyb3VwJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ29sdW1uR3JvdXBDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBDb2x1bW5CYXNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG5jb25zdCBkZWNsYXJhdGlvbnMgPSBbXG4gICAgRXhjZWxFeHBvcnRDb21wb25lbnQsXG4gICAgQ29sdW1uQ29tcG9uZW50LFxuICAgIENvbHVtbkdyb3VwQ29tcG9uZW50LFxuICAgIEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBHcm91cEhlYWRlckNvbHVtblRlbXBsYXRlRGlyZWN0aXZlXG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgRXhjZWwgRXhwb3J0IGNvbXBvbmVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzLW5vLXJ1blxuICogLy8gSW1wb3J0IHRoZSBFeGNlbEV4cG9ydE1vZHVsZSBtb2R1bGVcbiAqIGltcG9ydCB7IEV4Y2VsRXhwb3J0TW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZXhjZWwtZXhwb3J0JztcbiAqXG4gKiAvLyBUaGUgYnJvd3NlciBwbGF0Zm9ybSB3aXRoIGEgY29tcGlsZXJcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICpcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogLy8gSW1wb3J0IHRoZSBhcHAgY29tcG9uZW50XG4gKiBpbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2FwcC5jb21wb25lbnQnO1xuICpcbiAqIC8vIERlZmluZSB0aGUgYXBwIG1vZHVsZVxuICogX0BOZ01vZHVsZSh7XG4gKiAgICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSwgLy8gZGVjbGFyZSBhcHAgY29tcG9uZW50XG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgRXhjZWxFeHBvcnRNb2R1bGVdLCAvLyBpbXBvcnQgRXhjZWxFeHBvcnRNb2R1bGUgbW9kdWxlXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBFeGNlbEV4cG9ydE1vZHVsZSB7XG59XG5FeGNlbEV4cG9ydE1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZGVjbGFyYXRpb25zXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbZGVjbGFyYXRpb25zXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCB7IEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUsIEV4Y2VsRXhwb3J0Q29tcG9uZW50LCBFeGNlbEV4cG9ydE1vZHVsZSwgQ29sdW1uQmFzZSwgQ29sdW1uQ29tcG9uZW50LCBDb2x1bW5Hcm91cENvbXBvbmVudCwgRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsIEdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsIEdyb3VwSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHdvcmtib29rT3B0aW9ucywgdG9EYXRhVVJMLCBpc1dvcmtib29rT3B0aW9ucyB9O1xuIl19","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { EventEmitter, Injectable, InjectionToken, Directive, Optional, Inject, SkipSelf, ElementRef, Renderer2, NgZone, ChangeDetectorRef, HostBinding, TemplateRef, QueryList, Input, ContentChildren, ContentChild, Component, forwardRef, Host, Output, isDevMode, SecurityContext, ViewEncapsulation, ViewChild, ViewChildren, Self, ViewContainerRef, Pipe, NgModule, ComponentFactoryResolver, ChangeDetectionStrategy, HostListener } from '@angular/core';\nimport { isDocumentAvailable, Keys, DraggableDirective, isChanged, anyChanged, hasObservers, ResizeSensorComponent, DraggableModule, EventsModule, guid, ResizeSensorModule } from '@progress/kendo-angular-common';\nimport { merge, of, Subject, Subscription, from, interval, fromEvent, zip, BehaviorSubject, Observable } from 'rxjs';\nimport { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';\nimport { switchMap, take, filter, takeUntil, map, switchMapTo, delay, auditTime, distinctUntilChanged, tap, throttleTime, debounceTime, bufferCount } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { orderBy, process, isCompositeFilterDescriptor, filterBy } from '@progress/kendo-data-query';\nimport { PopupService, PopupModule } from '@progress/kendo-angular-popup';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { getter } from '@progress/kendo-common';\nimport { DropDownListModule, AutoCompleteModule } from '@progress/kendo-angular-dropdowns';\nimport { InputsModule, NumericTextBoxComponent, NumericTextBoxModule } from '@progress/kendo-angular-inputs';\nimport { DatePickerModule } from '@progress/kendo-angular-dateinputs';\nimport { IntlService } from '@progress/kendo-angular-intl';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { Button } from '@progress/kendo-angular-buttons';\nimport { PDFMarginComponent, PDFTemplateDirective, PDFExportComponent } from '@progress/kendo-angular-pdf-export';\nimport { saveAs } from '@progress/kendo-file-saver';\nimport { workbookOptions, toDataURL, ColumnBase, ExcelExportModule } from '@progress/kendo-angular-excel-export';\n\n/**\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc2 from '@progress/kendo-angular-common';\nimport * as ɵngcc3 from '@progress/kendo-angular-popup';\nimport * as ɵngcc4 from '@angular/platform-browser';\nimport * as ɵngcc5 from '@angular/common';\nimport * as ɵngcc6 from '@progress/kendo-angular-inputs';\nimport * as ɵngcc7 from '@angular/forms';\nimport * as ɵngcc8 from '@progress/kendo-angular-dropdowns';\nimport * as ɵngcc9 from '@progress/kendo-angular-dateinputs';\nimport * as ɵngcc10 from '@progress/kendo-angular-intl';\n\nconst _c0 = [\"lockedHeader\"];\nconst _c1 = [\"header\"];\nconst _c2 = [\"ariaRoot\"];\nconst _c3 = [\"footer\"];\nvar I18N_4;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label visible in the Grid group panel when it is empty\n * @meaning kendo.grid.groupPanelEmpty\n */ \n const MSG_EXTERNAL_1430663748859427158$$DIST_FESM2015_INDEX_JS_5 = goog.getMsg(\"Drag a column header and drop it here to group by that column\");\n I18N_4 = MSG_EXTERNAL_1430663748859427158$$DIST_FESM2015_INDEX_JS_5;\n}\nelse {\n I18N_4 = $localize `:kendo.grid.groupPanelEmpty|The label visible in the Grid group panel when it is empty␟30bcb3a2fbc22fcab6ca805e74b90adb8ba1ae96␟1430663748859427158:Drag a column header and drop it here to group by that column`;\n}\nvar I18N_6;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label visible in the Grid when there are no records\n * @meaning kendo.grid.noRecords\n */ \n const MSG_EXTERNAL_1243399825085142134$$DIST_FESM2015_INDEX_JS_7 = goog.getMsg(\"No records available.\");\n I18N_6 = MSG_EXTERNAL_1243399825085142134$$DIST_FESM2015_INDEX_JS_7;\n}\nelse {\n I18N_6 = $localize `:kendo.grid.noRecords|The label visible in the Grid when there are no records␟ff9cfd4bf3e40305db251f2b6961796c0550b4b0␟1243399825085142134:No records available.`;\n}\nvar I18N_8;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the first page button in Grid pager\n * @meaning kendo.grid.pagerFirstPage\n */ \n const MSG_EXTERNAL_5647145449685906398$$DIST_FESM2015_INDEX_JS_9 = goog.getMsg(\"Go to the first page\");\n I18N_8 = MSG_EXTERNAL_5647145449685906398$$DIST_FESM2015_INDEX_JS_9;\n}\nelse {\n I18N_8 = $localize `:kendo.grid.pagerFirstPage|The label for the first page button in Grid pager␟b405dfc5ee42415daa08d54847d3010de1821111␟5647145449685906398:Go to the first page`;\n}\nvar I18N_10;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the previous page button in Grid pager\n * @meaning kendo.grid.pagerPreviousPage\n */ \n const MSG_EXTERNAL_6745088753482690847$$DIST_FESM2015_INDEX_JS_11 = goog.getMsg(\"Go to the previous page\");\n I18N_10 = MSG_EXTERNAL_6745088753482690847$$DIST_FESM2015_INDEX_JS_11;\n}\nelse {\n I18N_10 = $localize `:kendo.grid.pagerPreviousPage|The label for the previous page button in Grid pager␟47aa4fe05f5a2577d3336971d7c44ce48802b860␟6745088753482690847:Go to the previous page`;\n}\nvar I18N_12;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the next page button in Grid pager\n * @meaning kendo.grid.pagerNextPage\n */ \n const MSG_EXTERNAL_5510985262435270859$$DIST_FESM2015_INDEX_JS_13 = goog.getMsg(\"Go to the next page\");\n I18N_12 = MSG_EXTERNAL_5510985262435270859$$DIST_FESM2015_INDEX_JS_13;\n}\nelse {\n I18N_12 = $localize `:kendo.grid.pagerNextPage|The label for the next page button in Grid pager␟90031133fca899b4e491d9fc51128c1a184afb30␟5510985262435270859:Go to the next page`;\n}\nvar I18N_14;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the last page button in Grid pager\n * @meaning kendo.grid.pagerLastPage\n */ \n const MSG_EXTERNAL_4539768510520419313$$DIST_FESM2015_INDEX_JS_15 = goog.getMsg(\"Go to the last page\");\n I18N_14 = MSG_EXTERNAL_4539768510520419313$$DIST_FESM2015_INDEX_JS_15;\n}\nelse {\n I18N_14 = $localize `:kendo.grid.pagerLastPage|The label for the last page button in Grid pager␟fe84f2ea868286ce03e50b6e55558c16d675c753␟4539768510520419313:Go to the last page`;\n}\nvar I18N_16;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label before the current page number in the Grid pager\n * @meaning kendo.grid.pagerPage\n */ \n const MSG_EXTERNAL_5228228287003939680$$DIST_FESM2015_INDEX_JS_17 = goog.getMsg(\"Page\");\n I18N_16 = MSG_EXTERNAL_5228228287003939680$$DIST_FESM2015_INDEX_JS_17;\n}\nelse {\n I18N_16 = $localize `:kendo.grid.pagerPage|The label before the current page number in the Grid pager␟89c1f616c25bb610824cd8a26473a03921df48bd␟5228228287003939680:Page`;\n}\nvar I18N_18;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label before the total pages number in the Grid pager\n * @meaning kendo.grid.pagerOf\n */ \n const MSG_EXTERNAL_7004642096327889102$$DIST_FESM2015_INDEX_JS_19 = goog.getMsg(\"of\");\n I18N_18 = MSG_EXTERNAL_7004642096327889102$$DIST_FESM2015_INDEX_JS_19;\n}\nelse {\n I18N_18 = $localize `:kendo.grid.pagerOf|The label before the total pages number in the Grid pager␟0c9abe48f5d4bd2cb51846712e41864fc64aad6a␟7004642096327889102:of`;\n}\nvar I18N_20;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label after the total pages number in the Grid pager\n * @meaning kendo.grid.pagerItems\n */ \n const MSG_EXTERNAL_700193548223931835$$DIST_FESM2015_INDEX_JS_21 = goog.getMsg(\"items\");\n I18N_20 = MSG_EXTERNAL_700193548223931835$$DIST_FESM2015_INDEX_JS_21;\n}\nelse {\n I18N_20 = $localize `:kendo.grid.pagerItems|The label after the total pages number in the Grid pager␟7c1704d11bfb77340485acd891439c2b6c6616ca␟700193548223931835:items`;\n}\nvar I18N_22;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the pager input in the Grid pager\n * @meaning kendo.grid.pagerPageNumberInputTitle\n */ \n const MSG_EXTERNAL_2090461908134774363$$DIST_FESM2015_INDEX_JS_23 = goog.getMsg(\"Page Number\");\n I18N_22 = MSG_EXTERNAL_2090461908134774363$$DIST_FESM2015_INDEX_JS_23;\n}\nelse {\n I18N_22 = $localize `:kendo.grid.pagerPageNumberInputTitle|The label for the pager input in the Grid pager␟f8bad8f2c7345e4fe531480e3034f7d3e954d383␟2090461908134774363:Page Number`;\n}\nvar I18N_24;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label for the page size chooser in the Grid pager\n * @meaning kendo.grid.pagerItemsPerPage\n */ \n const MSG_EXTERNAL_8838594644885628398$$DIST_FESM2015_INDEX_JS_25 = goog.getMsg(\"items per page\");\n I18N_24 = MSG_EXTERNAL_8838594644885628398$$DIST_FESM2015_INDEX_JS_25;\n}\nelse {\n I18N_24 = $localize `:kendo.grid.pagerItemsPerPage|The label for the page size chooser in the Grid pager␟3331fe7ec45f299afaa4c1e08ea25c493eda9144␟8838594644885628398:items per page`;\n}\nvar I18N_26;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label of the filter cell or icon\n * @meaning kendo.grid.filter\n */ \n const MSG_EXTERNAL_7977992299945497789$$DIST_FESM2015_INDEX_JS_27 = goog.getMsg(\"Filter\");\n I18N_26 = MSG_EXTERNAL_7977992299945497789$$DIST_FESM2015_INDEX_JS_27;\n}\nelse {\n I18N_26 = $localize `:kendo.grid.filter|The label of the filter cell or icon␟21a04b7b090dac60e0449cb6e435b7e879173c75␟7977992299945497789:Filter`;\n}\nvar I18N_28;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the equal filter operator\n * @meaning kendo.grid.filterEqOperator\n */ \n const MSG_EXTERNAL_4328959145426393682$$DIST_FESM2015_INDEX_JS_29 = goog.getMsg(\"Is equal to\");\n I18N_28 = MSG_EXTERNAL_4328959145426393682$$DIST_FESM2015_INDEX_JS_29;\n}\nelse {\n I18N_28 = $localize `:kendo.grid.filterEqOperator|The text of the equal filter operator␟8b31e1604d10a2f8709dcb1ed5c237e33cffc135␟4328959145426393682:Is equal to`;\n}\nvar I18N_30;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the not equal filter operator\n * @meaning kendo.grid.filterNotEqOperator\n */ \n const MSG_EXTERNAL_8497658332767349737$$DIST_FESM2015_INDEX_JS_31 = goog.getMsg(\"Is not equal to\");\n I18N_30 = MSG_EXTERNAL_8497658332767349737$$DIST_FESM2015_INDEX_JS_31;\n}\nelse {\n I18N_30 = $localize `:kendo.grid.filterNotEqOperator|The text of the not equal filter operator␟d46e14d35d89d2fadf5c852abf5557643510a013␟8497658332767349737:Is not equal to`;\n}\nvar I18N_32;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the is null filter operator\n * @meaning kendo.grid.filterIsNullOperator\n */ \n const MSG_EXTERNAL_1298299704757177797$$DIST_FESM2015_INDEX_JS_33 = goog.getMsg(\"Is null\");\n I18N_32 = MSG_EXTERNAL_1298299704757177797$$DIST_FESM2015_INDEX_JS_33;\n}\nelse {\n I18N_32 = $localize `:kendo.grid.filterIsNullOperator|The text of the is null filter operator␟078c50eb1fe8b2b43fcc40c5e7f4493152310c2f␟1298299704757177797:Is null`;\n}\nvar I18N_34;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the is not null filter operator\n * @meaning kendo.grid.filterIsNotNullOperator\n */ \n const MSG_EXTERNAL_8362279767336741540$$DIST_FESM2015_INDEX_JS_35 = goog.getMsg(\"Is not null\");\n I18N_34 = MSG_EXTERNAL_8362279767336741540$$DIST_FESM2015_INDEX_JS_35;\n}\nelse {\n I18N_34 = $localize `:kendo.grid.filterIsNotNullOperator|The text of the is not null filter operator␟70b39eeaf2674907b2e59b414baf17e032b464dc␟8362279767336741540:Is not null`;\n}\nvar I18N_36;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the is empty filter operator\n * @meaning kendo.grid.filterIsEmptyOperator\n */ \n const MSG_EXTERNAL_4762263229995523226$$DIST_FESM2015_INDEX_JS_37 = goog.getMsg(\"Is empty\");\n I18N_36 = MSG_EXTERNAL_4762263229995523226$$DIST_FESM2015_INDEX_JS_37;\n}\nelse {\n I18N_36 = $localize `:kendo.grid.filterIsEmptyOperator|The text of the is empty filter operator␟a4e77e444b4e9b63851ac818e20136212b06c750␟4762263229995523226:Is empty`;\n}\nvar I18N_38;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the is not empty filter operator\n * @meaning kendo.grid.filterIsNotEmptyOperator\n */ \n const MSG_EXTERNAL_8245213618709258015$$DIST_FESM2015_INDEX_JS_39 = goog.getMsg(\"Is not empty\");\n I18N_38 = MSG_EXTERNAL_8245213618709258015$$DIST_FESM2015_INDEX_JS_39;\n}\nelse {\n I18N_38 = $localize `:kendo.grid.filterIsNotEmptyOperator|The text of the is not empty filter operator␟dee7553c341248e90aef4a8e7438c52e667e68be␟8245213618709258015:Is not empty`;\n}\nvar I18N_40;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the starts with filter operator\n * @meaning kendo.grid.filterStartsWithOperator\n */ \n const MSG_EXTERNAL_6087783423599420507$$DIST_FESM2015_INDEX_JS_41 = goog.getMsg(\"Starts with\");\n I18N_40 = MSG_EXTERNAL_6087783423599420507$$DIST_FESM2015_INDEX_JS_41;\n}\nelse {\n I18N_40 = $localize `:kendo.grid.filterStartsWithOperator|The text of the starts with filter operator␟da43b363b636156e3ccdbb64a0788bdeab51e992␟6087783423599420507:Starts with`;\n}\nvar I18N_42;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the contains filter operator\n * @meaning kendo.grid.filterContainsOperator\n */ \n const MSG_EXTERNAL_3831180413287131758$$DIST_FESM2015_INDEX_JS_43 = goog.getMsg(\"Contains\");\n I18N_42 = MSG_EXTERNAL_3831180413287131758$$DIST_FESM2015_INDEX_JS_43;\n}\nelse {\n I18N_42 = $localize `:kendo.grid.filterContainsOperator|The text of the contains filter operator␟5b568a46d2e34ebde7dd53a7e599cbbb7dc6bae1␟3831180413287131758:Contains`;\n}\nvar I18N_44;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the does not contain filter operator\n * @meaning kendo.grid.filterNotContainsOperator\n */ \n const MSG_EXTERNAL_7331253838216904826$$DIST_FESM2015_INDEX_JS_45 = goog.getMsg(\"Does not contain\");\n I18N_44 = MSG_EXTERNAL_7331253838216904826$$DIST_FESM2015_INDEX_JS_45;\n}\nelse {\n I18N_44 = $localize `:kendo.grid.filterNotContainsOperator|The text of the does not contain filter operator␟be06aa4fde7fa722c9de5a45f241ff595071d718␟7331253838216904826:Does not contain`;\n}\nvar I18N_46;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the ends with filter operator\n * @meaning kendo.grid.filterEndsWithOperator\n */ \n const MSG_EXTERNAL_3662435311670509156$$DIST_FESM2015_INDEX_JS_47 = goog.getMsg(\"Ends with\");\n I18N_46 = MSG_EXTERNAL_3662435311670509156$$DIST_FESM2015_INDEX_JS_47;\n}\nelse {\n I18N_46 = $localize `:kendo.grid.filterEndsWithOperator|The text of the ends with filter operator␟a54b2ecffb41f0603ceedc7ea5a40b7d130e2fa1␟3662435311670509156:Ends with`;\n}\nvar I18N_48;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the greater than or equal filter operator\n * @meaning kendo.grid.filterGteOperator\n */ \n const MSG_EXTERNAL_4542824413455511831$$DIST_FESM2015_INDEX_JS_49 = goog.getMsg(\"Is greater than or equal to\");\n I18N_48 = MSG_EXTERNAL_4542824413455511831$$DIST_FESM2015_INDEX_JS_49;\n}\nelse {\n I18N_48 = $localize `:kendo.grid.filterGteOperator|The text of the greater than or equal filter operator␟68471603db771d0304d02fe086da9701c16911c3␟4542824413455511831:Is greater than or equal to`;\n}\nvar I18N_50;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the greater than filter operator\n * @meaning kendo.grid.filterGtOperator\n */ \n const MSG_EXTERNAL_1527483349261806183$$DIST_FESM2015_INDEX_JS_51 = goog.getMsg(\"Is greater than\");\n I18N_50 = MSG_EXTERNAL_1527483349261806183$$DIST_FESM2015_INDEX_JS_51;\n}\nelse {\n I18N_50 = $localize `:kendo.grid.filterGtOperator|The text of the greater than filter operator␟ae68acc0e18252a348bdfb32112996d81e5305de␟1527483349261806183:Is greater than`;\n}\nvar I18N_52;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the less than or equal filter operator\n * @meaning kendo.grid.filterLteOperator\n */ \n const MSG_EXTERNAL_4840714404733417604$$DIST_FESM2015_INDEX_JS_53 = goog.getMsg(\"Is less than or equal to\");\n I18N_52 = MSG_EXTERNAL_4840714404733417604$$DIST_FESM2015_INDEX_JS_53;\n}\nelse {\n I18N_52 = $localize `:kendo.grid.filterLteOperator|The text of the less than or equal filter operator␟e48d50a6422c616a00b95025adc5283aff4fa8cb␟4840714404733417604:Is less than or equal to`;\n}\nvar I18N_54;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the less than filter operator\n * @meaning kendo.grid.filterLtOperator\n */ \n const MSG_EXTERNAL_498627126459578706$$DIST_FESM2015_INDEX_JS_55 = goog.getMsg(\"Is less than\");\n I18N_54 = MSG_EXTERNAL_498627126459578706$$DIST_FESM2015_INDEX_JS_55;\n}\nelse {\n I18N_54 = $localize `:kendo.grid.filterLtOperator|The text of the less than filter operator␟c4d58f0e509cb7e37014715dd91546a724210d70␟498627126459578706:Is less than`;\n}\nvar I18N_56;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the IsTrue boolean filter option\n * @meaning kendo.grid.filterIsTrue\n */ \n const MSG_EXTERNAL_2361673238316312251$$DIST_FESM2015_INDEX_JS_57 = goog.getMsg(\"Is True\");\n I18N_56 = MSG_EXTERNAL_2361673238316312251$$DIST_FESM2015_INDEX_JS_57;\n}\nelse {\n I18N_56 = $localize `:kendo.grid.filterIsTrue|The text of the IsTrue boolean filter option␟d5f1e9028bc60c30e8f8e0f9cfeb872512446cea␟2361673238316312251:Is True`;\n}\nvar I18N_58;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the IsFalse boolean filter option\n * @meaning kendo.grid.filterIsFalse\n */ \n const MSG_EXTERNAL_7759366406135608407$$DIST_FESM2015_INDEX_JS_59 = goog.getMsg(\"Is False\");\n I18N_58 = MSG_EXTERNAL_7759366406135608407$$DIST_FESM2015_INDEX_JS_59;\n}\nelse {\n I18N_58 = $localize `:kendo.grid.filterIsFalse|The text of the IsFalse boolean filter option␟6d34731320e2536fd78f4a9e08f0b8dcd01edf3d␟7759366406135608407:Is False`;\n}\nvar I18N_60;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the (All) boolean filter option\n * @meaning kendo.grid.filterBooleanAll\n */ \n const MSG_EXTERNAL_9215343856736761875$$DIST_FESM2015_INDEX_JS_61 = goog.getMsg(\"(All)\");\n I18N_60 = MSG_EXTERNAL_9215343856736761875$$DIST_FESM2015_INDEX_JS_61;\n}\nelse {\n I18N_60 = $localize `:kendo.grid.filterBooleanAll|The text of the (All) boolean filter option␟4da1456a62bafe2614ed2bc05a2c790a64a4dd0b␟9215343856736761875:(All)`;\n}\nvar I18N_62;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the after or equal date filter operator\n * @meaning kendo.grid.filterAfterOrEqualOperator\n */ \n const MSG_EXTERNAL_1964413288176201979$$DIST_FESM2015_INDEX_JS_63 = goog.getMsg(\"Is after or equal to\");\n I18N_62 = MSG_EXTERNAL_1964413288176201979$$DIST_FESM2015_INDEX_JS_63;\n}\nelse {\n I18N_62 = $localize `:kendo.grid.filterAfterOrEqualOperator|The text of the after or equal date filter operator␟d7dac1bbc2372d578a9d2bca099de766043aed7e␟1964413288176201979:Is after or equal to`;\n}\nvar I18N_64;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the after date filter operator\n * @meaning kendo.grid.filterAfterOperator\n */ \n const MSG_EXTERNAL_3078502182807244703$$DIST_FESM2015_INDEX_JS_65 = goog.getMsg(\"Is after\");\n I18N_64 = MSG_EXTERNAL_3078502182807244703$$DIST_FESM2015_INDEX_JS_65;\n}\nelse {\n I18N_64 = $localize `:kendo.grid.filterAfterOperator|The text of the after date filter operator␟bff777df0d0831cc02679227422fab4ef2763fa9␟3078502182807244703:Is after`;\n}\nvar I18N_66;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the before date filter operator\n * @meaning kendo.grid.filterBeforeOperator\n */ \n const MSG_EXTERNAL_3348865631071358219$$DIST_FESM2015_INDEX_JS_67 = goog.getMsg(\"Is before\");\n I18N_66 = MSG_EXTERNAL_3348865631071358219$$DIST_FESM2015_INDEX_JS_67;\n}\nelse {\n I18N_66 = $localize `:kendo.grid.filterBeforeOperator|The text of the before date filter operator␟35ef5cf367670f15432c9f8761bc85fbdb2b1830␟3348865631071358219:Is before`;\n}\nvar I18N_68;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the before or equal date filter operator\n * @meaning kendo.grid.filterBeforeOrEqualOperator\n */ \n const MSG_EXTERNAL_6582064037090631388$$DIST_FESM2015_INDEX_JS_69 = goog.getMsg(\"Is before or equal to\");\n I18N_68 = MSG_EXTERNAL_6582064037090631388$$DIST_FESM2015_INDEX_JS_69;\n}\nelse {\n I18N_68 = $localize `:kendo.grid.filterBeforeOrEqualOperator|The text of the before or equal date filter operator␟27a6b29ffbc1eb498de8d7af20051461a2e842ec␟6582064037090631388:Is before or equal to`;\n}\nvar I18N_70;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the filter button\n * @meaning kendo.grid.filterFilterButton\n */ \n const MSG_EXTERNAL_5185263258022896121$$DIST_FESM2015_INDEX_JS_71 = goog.getMsg(\"Filter\");\n I18N_70 = MSG_EXTERNAL_5185263258022896121$$DIST_FESM2015_INDEX_JS_71;\n}\nelse {\n I18N_70 = $localize `:kendo.grid.filterFilterButton|The text of the filter button␟4f1c08d0b056646cdb668da669e2e15825adfe4d␟5185263258022896121:Filter`;\n}\nvar I18N_72;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the clear filter button\n * @meaning kendo.grid.filterClearButton\n */ \n const MSG_EXTERNAL_3031209415830321799$$DIST_FESM2015_INDEX_JS_73 = goog.getMsg(\"Clear\");\n I18N_72 = MSG_EXTERNAL_3031209415830321799$$DIST_FESM2015_INDEX_JS_73;\n}\nelse {\n I18N_72 = $localize `:kendo.grid.filterClearButton|The text of the clear filter button␟06e4e4dadede6f91f261cdbb7fb174246a135238␟3031209415830321799:Clear`;\n}\nvar I18N_74;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the And filter logic\n * @meaning kendo.grid.filterAndLogic\n */ \n const MSG_EXTERNAL_512662285155477884$$DIST_FESM2015_INDEX_JS_75 = goog.getMsg(\"And\");\n I18N_74 = MSG_EXTERNAL_512662285155477884$$DIST_FESM2015_INDEX_JS_75;\n}\nelse {\n I18N_74 = $localize `:kendo.grid.filterAndLogic|The text of the And filter logic␟f73fbcc2f813d469e4a34491950ca01ea1ac8f60␟512662285155477884:And`;\n}\nvar I18N_76;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the Or filter logic\n * @meaning kendo.grid.filterOrLogic\n */ \n const MSG_EXTERNAL_1964926727342405367$$DIST_FESM2015_INDEX_JS_77 = goog.getMsg(\"Or\");\n I18N_76 = MSG_EXTERNAL_1964926727342405367$$DIST_FESM2015_INDEX_JS_77;\n}\nelse {\n I18N_76 = $localize `:kendo.grid.filterOrLogic|The text of the Or filter logic␟04e64780de0fc1c3a9986997e0808ec53a5f2a63␟1964926727342405367:Or`;\n}\nvar I18N_78;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The loading text\n * @meaning kendo.grid.loading\n */ \n const MSG_EXTERNAL_5425510787229531767$$DIST_FESM2015_INDEX_JS_79 = goog.getMsg(\"Loading\");\n I18N_78 = MSG_EXTERNAL_5425510787229531767$$DIST_FESM2015_INDEX_JS_79;\n}\nelse {\n I18N_78 = $localize `:kendo.grid.loading|The loading text␟781c049cc69efc30bc8053af9ace3cb4b04bd438␟5425510787229531767:Loading`;\n}\nvar I18N_80;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the column menu icon\n * @meaning kendo.grid.columnMenu\n */ \n const MSG_EXTERNAL_2820335494528144626$$DIST_FESM2015_INDEX_JS_81 = goog.getMsg(\"Column Menu\");\n I18N_80 = MSG_EXTERNAL_2820335494528144626$$DIST_FESM2015_INDEX_JS_81;\n}\nelse {\n I18N_80 = $localize `:kendo.grid.columnMenu|The title of the column menu icon␟3596c6b21d39223adc5c352daec9938474a8cc0d␟2820335494528144626:Column Menu`;\n}\nvar I18N_82;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu for the columns item\n * @meaning kendo.grid.columns\n */ \n const MSG_EXTERNAL_5332162737795508854$$DIST_FESM2015_INDEX_JS_83 = goog.getMsg(\"Columns\");\n I18N_82 = MSG_EXTERNAL_5332162737795508854$$DIST_FESM2015_INDEX_JS_83;\n}\nelse {\n I18N_82 = $localize `:kendo.grid.columns|The text shown in the column menu for the columns item␟9b841399fbb3d81f2401f98b4f4763834b72a1e5␟5332162737795508854:Columns`;\n}\nvar I18N_84;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu for the lock item\n * @meaning kendo.grid.lock\n */ \n const MSG_EXTERNAL_5849203148124173556$$DIST_FESM2015_INDEX_JS_85 = goog.getMsg(\"Lock\");\n I18N_84 = MSG_EXTERNAL_5849203148124173556$$DIST_FESM2015_INDEX_JS_85;\n}\nelse {\n I18N_84 = $localize `:kendo.grid.lock|The text shown in the column menu for the lock item␟f356cae509dec3dc1b7156326b9a0328a79c62a8␟5849203148124173556:Lock`;\n}\nvar I18N_86;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu for the unlock item\n * @meaning kendo.grid.unlock\n */ \n const MSG_EXTERNAL_6968586378603932789$$DIST_FESM2015_INDEX_JS_87 = goog.getMsg(\"Unlock\");\n I18N_86 = MSG_EXTERNAL_6968586378603932789$$DIST_FESM2015_INDEX_JS_87;\n}\nelse {\n I18N_86 = $localize `:kendo.grid.unlock|The text shown in the column menu for the unlock item␟f33355540003068372e39ba7f3def794869ea9f8␟6968586378603932789:Unlock`;\n}\nvar I18N_88;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The label of the sort icon\n * @meaning kendo.grid.sortable\n */ \n const MSG_EXTERNAL_3824304972336788145$$DIST_FESM2015_INDEX_JS_89 = goog.getMsg(\"Sortable\");\n I18N_88 = MSG_EXTERNAL_3824304972336788145$$DIST_FESM2015_INDEX_JS_89;\n}\nelse {\n I18N_88 = $localize `:kendo.grid.sortable|The label of the sort icon␟a692ba271be066ce379f942ff67094e1ea989f4c␟3824304972336788145:Sortable`;\n}\nvar I18N_90;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu for the sort ascending item\n * @meaning kendo.grid.sortAscending\n */ \n const MSG_EXTERNAL_6297762560864270240$$DIST_FESM2015_INDEX_JS_91 = goog.getMsg(\"Sort Ascending\");\n I18N_90 = MSG_EXTERNAL_6297762560864270240$$DIST_FESM2015_INDEX_JS_91;\n}\nelse {\n I18N_90 = $localize `:kendo.grid.sortAscending|The text shown in the column menu for the sort ascending item␟96beffd8446c5455f3bbdc313c946db32df7dcc2␟6297762560864270240:Sort Ascending`;\n}\nvar I18N_92;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu for the sort descending item\n * @meaning kendo.grid.sortDescending\n */ \n const MSG_EXTERNAL_5605073536641230977$$DIST_FESM2015_INDEX_JS_93 = goog.getMsg(\"Sort Descending\");\n I18N_92 = MSG_EXTERNAL_5605073536641230977$$DIST_FESM2015_INDEX_JS_93;\n}\nelse {\n I18N_92 = $localize `:kendo.grid.sortDescending|The text shown in the column menu for the sort descending item␟208d0538d4c2537a1cbf456941e34a2884053d52␟5605073536641230977:Sort Descending`;\n}\nvar I18N_94;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The status announcement when a column is sorted ascending\n * @meaning kendo.grid.sortedAscending\n */ \n const MSG_EXTERNAL_6275944032047713540$$DIST_FESM2015_INDEX_JS_95 = goog.getMsg(\"Sorted Ascending\");\n I18N_94 = MSG_EXTERNAL_6275944032047713540$$DIST_FESM2015_INDEX_JS_95;\n}\nelse {\n I18N_94 = $localize `:kendo.grid.sortedAscending|The status announcement when a column is sorted ascending␟947c64329461efd9f8a9aa2c51acbbd099170aa5␟6275944032047713540:Sorted Ascending`;\n}\nvar I18N_96;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The status announcement when a column is sorted descending\n * @meaning kendo.grid.sortedDescending\n */ \n const MSG_EXTERNAL_8155280769473236383$$DIST_FESM2015_INDEX_JS_97 = goog.getMsg(\"Sorted Descending\");\n I18N_96 = MSG_EXTERNAL_8155280769473236383$$DIST_FESM2015_INDEX_JS_97;\n}\nelse {\n I18N_96 = $localize `:kendo.grid.sortedDescending|The status announcement when a column is sorted descending␟092a688d1b2b6d873bdc29beaaf43c3f45336581␟8155280769473236383:Sorted Descending`;\n}\nvar I18N_98;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The status announcement when a column is no longer sorted\n * @meaning kendo.grid.sortedDefault\n */ \n const MSG_EXTERNAL_5229177293891232538$$DIST_FESM2015_INDEX_JS_99 = goog.getMsg(\"Not Sorted\");\n I18N_98 = MSG_EXTERNAL_5229177293891232538$$DIST_FESM2015_INDEX_JS_99;\n}\nelse {\n I18N_98 = $localize `:kendo.grid.sortedDefault|The status announcement when a column is no longer sorted␟66e99ea340974022c07c52a6f668f5573e7edab0␟5229177293891232538:Not Sorted`;\n}\nvar I18N_100;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu or column chooser for the columns apply button\n * @meaning kendo.grid.columnsApply\n */ \n const MSG_EXTERNAL_34213208292862969$$DIST_FESM2015_INDEX_JS_101 = goog.getMsg(\"Apply\");\n I18N_100 = MSG_EXTERNAL_34213208292862969$$DIST_FESM2015_INDEX_JS_101;\n}\nelse {\n I18N_100 = $localize `:kendo.grid.columnsApply|The text shown in the column menu or column chooser for the columns apply button␟04600bd6e362cf9da9f7f9c4666eab2c88eb6a90␟34213208292862969:Apply`;\n}\nvar I18N_102;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text shown in the column menu or column chooser for the columns reset button\n * @meaning kendo.grid.columnsReset\n */ \n const MSG_EXTERNAL_4465838259914958827$$DIST_FESM2015_INDEX_JS_103 = goog.getMsg(\"Reset\");\n I18N_102 = MSG_EXTERNAL_4465838259914958827$$DIST_FESM2015_INDEX_JS_103;\n}\nelse {\n I18N_102 = $localize `:kendo.grid.columnsReset|The text shown in the column menu or column chooser for the columns reset button␟94d3b472d99994a5cca9930afd4cf0ac2774c382␟4465838259914958827:Reset`;\n}\nvar I18N_104;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the expand icon of detail rows.\n * @meaning kendo.grid.detailExpand\n */ \n const MSG_EXTERNAL_6952757249912226136$$DIST_FESM2015_INDEX_JS_105 = goog.getMsg(\"Expand Details\");\n I18N_104 = MSG_EXTERNAL_6952757249912226136$$DIST_FESM2015_INDEX_JS_105;\n}\nelse {\n I18N_104 = $localize `:kendo.grid.detailExpand|The title of the expand icon of detail rows.␟ad6629bb6e79235623cfce486ef48087dbe96fb5␟6952757249912226136:Expand Details`;\n}\nvar I18N_106;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the collapse icon of detail rows.\n * @meaning kendo.grid.detailCollapse\n */ \n const MSG_EXTERNAL_6065477639036399169$$DIST_FESM2015_INDEX_JS_107 = goog.getMsg(\"Collapse Details\");\n I18N_106 = MSG_EXTERNAL_6065477639036399169$$DIST_FESM2015_INDEX_JS_107;\n}\nelse {\n I18N_106 = $localize `:kendo.grid.detailCollapse|The title of the collapse icon of detail rows.␟ace0c0a58fbb211e8678efb3bd6ac9bb587144c3␟6065477639036399169:Collapse Details`;\n}\nvar I18N_108;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text of the Today button of the Date filter.\n * @meaning kendo.grid.filterDateToday\n */ \n const MSG_EXTERNAL_1656723147090613075$$DIST_FESM2015_INDEX_JS_109 = goog.getMsg(\"TODAY\");\n I18N_108 = MSG_EXTERNAL_1656723147090613075$$DIST_FESM2015_INDEX_JS_109;\n}\nelse {\n I18N_108 = $localize `:kendo.grid.filterDateToday|The text of the Today button of the Date filter.␟745058f85d92ee5228977277195262978828c4c8␟1656723147090613075:TODAY`;\n}\nvar I18N_110;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the Toggle button of the Date filter.\n * @meaning kendo.grid.filterDateToggle\n */ \n const MSG_EXTERNAL_15438307630389352$$DIST_FESM2015_INDEX_JS_111 = goog.getMsg(\"Toggle Calendar\");\n I18N_110 = MSG_EXTERNAL_15438307630389352$$DIST_FESM2015_INDEX_JS_111;\n}\nelse {\n I18N_110 = $localize `:kendo.grid.filterDateToggle|The title of the Toggle button of the Date filter.␟2c916ea2cbd37665e512219650c37dc17b9ef0c0␟15438307630389352:Toggle Calendar`;\n}\nvar I18N_112;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the Decrement button of the Numeric filter.\n * @meaning kendo.grid.filterNumericDecrement\n */ \n const MSG_EXTERNAL_534533728304192410$$DIST_FESM2015_INDEX_JS_113 = goog.getMsg(\"Decrement\");\n I18N_112 = MSG_EXTERNAL_534533728304192410$$DIST_FESM2015_INDEX_JS_113;\n}\nelse {\n I18N_112 = $localize `:kendo.grid.filterNumericDecrement|The title of the Decrement button of the Numeric filter.␟7f991d698abebb2e50570f9aef14126ae931c513␟534533728304192410:Decrement`;\n}\nvar I18N_114;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The title of the Increment button of the Numeric filter.\n * @meaning kendo.grid.filterNumericIncrement\n */ \n const MSG_EXTERNAL_5462143714591662391$$DIST_FESM2015_INDEX_JS_115 = goog.getMsg(\"Increment\");\n I18N_114 = MSG_EXTERNAL_5462143714591662391$$DIST_FESM2015_INDEX_JS_115;\n}\nelse {\n I18N_114 = $localize `:kendo.grid.filterNumericIncrement|The title of the Increment button of the Numeric filter.␟25bc8b86968819d3f687aa6dde652800bd4b6b2a␟5462143714591662391:Increment`;\n}\nconst _c116 = [\"groupPanelEmpty\", I18N_4, \"noRecords\", I18N_6, \"pagerFirstPage\", I18N_8, \"pagerPreviousPage\", I18N_10, \"pagerNextPage\", I18N_12, \"pagerLastPage\", I18N_14, \"pagerPage\", I18N_16, \"pagerOf\", I18N_18, \"pagerItems\", I18N_20, \"pagerPageNumberInputTitle\", I18N_22, \"pagerItemsPerPage\", I18N_24, \"filter\", I18N_26, \"filterEqOperator\", I18N_28, \"filterNotEqOperator\", I18N_30, \"filterIsNullOperator\", I18N_32, \"filterIsNotNullOperator\", I18N_34, \"filterIsEmptyOperator\", I18N_36, \"filterIsNotEmptyOperator\", I18N_38, \"filterStartsWithOperator\", I18N_40, \"filterContainsOperator\", I18N_42, \"filterNotContainsOperator\", I18N_44, \"filterEndsWithOperator\", I18N_46, \"filterGteOperator\", I18N_48, \"filterGtOperator\", I18N_50, \"filterLteOperator\", I18N_52, \"filterLtOperator\", I18N_54, \"filterIsTrue\", I18N_56, \"filterIsFalse\", I18N_58, \"filterBooleanAll\", I18N_60, \"filterAfterOrEqualOperator\", I18N_62, \"filterAfterOperator\", I18N_64, \"filterBeforeOperator\", I18N_66, \"filterBeforeOrEqualOperator\", I18N_68, \"filterFilterButton\", I18N_70, \"filterClearButton\", I18N_72, \"filterAndLogic\", I18N_74, \"filterOrLogic\", I18N_76, \"loading\", I18N_78, \"columnMenu\", I18N_80, \"columns\", I18N_82, \"lock\", I18N_84, \"unlock\", I18N_86, \"sortable\", I18N_88, \"sortAscending\", I18N_90, \"sortDescending\", I18N_92, \"sortedAscending\", I18N_94, \"sortedDescending\", I18N_96, \"sortedDefault\", I18N_98, \"columnsApply\", I18N_100, \"columnsReset\", I18N_102, \"detailExpand\", I18N_104, \"detailCollapse\", I18N_106, \"filterDateToday\", I18N_108, \"filterDateToggle\", I18N_110, \"filterNumericDecrement\", I18N_112, \"filterNumericIncrement\", I18N_114];\nfunction GridComponent_kendo_grid_toolbar_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-toolbar\", 8);\n} }\nfunction GridComponent_kendo_grid_group_panel_3_Template(rf, ctx) { if (rf & 1) {\n const _r151 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-group-panel\", 9);\n ɵngcc0.ɵɵlistener(\"change\", function GridComponent_kendo_grid_group_panel_3_Template_kendo_grid_group_panel_change_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r151); const ctx_r150 = ɵngcc0.ɵɵnextContext(); return ctx_r150.groupChange.emit($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r144 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"text\", ctx_r144.groupableEmptyText)(\"groups\", ctx_r144.group);\n} }\nfunction GridComponent_ng_template_6_div_0_div_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 21, 22);\n ɵngcc0.ɵɵelementStart(2, \"table\", 23);\n ɵngcc0.ɵɵelement(3, \"colgroup\", 18);\n ɵngcc0.ɵɵelement(4, \"thead\", 24);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r154 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r154.lockedWidth, \"px\");\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r154.lockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"locked\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r154.lockedLeafColumns)(\"groups\", ctx_r154.group)(\"detailTemplate\", ctx_r154.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"resizable\", ctx_r154.resizable)(\"scrollable\", true)(\"columns\", ctx_r154.lockedColumns)(\"totalColumnLevels\", ctx_r154.totalColumnLevels)(\"sort\", ctx_r154.sort)(\"groups\", ctx_r154.group)(\"filter\", ctx_r154.filter)(\"filterable\", ctx_r154.filterable)(\"groupable\", ctx_r154.showGroupPanel)(\"reorderable\", ctx_r154.reorderable)(\"sortable\", ctx_r154.sortable)(\"columnMenu\", ctx_r154.columnMenuOptions)(\"columnMenuTemplate\", ctx_r154.columnMenuTemplate)(\"totalColumnsCount\", ctx_r154.leafColumns.length)(\"detailTemplate\", ctx_r154.detailTemplate);\n} }\nfunction GridComponent_ng_template_6_div_0_div_7_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 25);\n ɵngcc0.ɵɵelement(1, \"div\");\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r156 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r156.columnsContainer.unlockedWidth, \"px\");\n} }\nconst _c117 = function () { return []; };\nfunction GridComponent_ng_template_6_div_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 13);\n ɵngcc0.ɵɵtemplate(1, GridComponent_ng_template_6_div_0_div_1_Template, 5, 23, \"div\", 14);\n ɵngcc0.ɵɵelementStart(2, \"div\", 15, 16);\n ɵngcc0.ɵɵelementStart(4, \"table\", 17);\n ɵngcc0.ɵɵelement(5, \"colgroup\", 18);\n ɵngcc0.ɵɵelement(6, \"thead\", 19);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(7, GridComponent_ng_template_6_div_0_div_7_Template, 2, 2, \"div\", 20);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r152 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"padding\", ctx_r152.headerPadding);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r152.isLocked);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoGridResizableContainer\", ctx_r152.lockedLeafColumns.length)(\"lockedWidth\", ctx_r152.lockedWidth + ctx_r152.scrollbarWidth + 2);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r152.nonLockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"virtualColumns\", ctx_r152.virtualColumns);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r152.headerLeafColumns)(\"groups\", ctx_r152.isLocked ? ɵngcc0.ɵɵpureFunction0(28, _c117) : ctx_r152.group)(\"detailTemplate\", ctx_r152.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"resizable\", ctx_r152.resizable)(\"scrollable\", true)(\"columns\", ctx_r152.headerColumns)(\"totalColumnLevels\", ctx_r152.totalColumnLevels)(\"sort\", ctx_r152.sort)(\"filter\", ctx_r152.filter)(\"filterable\", ctx_r152.filterable)(\"groupable\", ctx_r152.showGroupPanel)(\"reorderable\", ctx_r152.reorderable)(\"groups\", ctx_r152.isLocked ? ɵngcc0.ɵɵpureFunction0(29, _c117) : ctx_r152.group)(\"sortable\", ctx_r152.sortable)(\"columnMenu\", ctx_r152.columnMenuOptions)(\"columnMenuTemplate\", ctx_r152.columnMenuTemplate)(\"lockedColumnsCount\", ctx_r152.lockedLeafColumns.length)(\"totalColumnsCount\", ctx_r152.leafColumns.length)(\"detailTemplate\", ctx_r152.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r152.virtualColumns);\n} }\nfunction GridComponent_ng_template_6_div_2_div_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 33);\n ɵngcc0.ɵɵelementStart(1, \"table\", 23);\n ɵngcc0.ɵɵelement(2, \"colgroup\", 31);\n ɵngcc0.ɵɵelement(3, \"tfoot\", 34);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r158 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r158.lockedWidth, \"px\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r158.lockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"locked\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r158.lockedLeafColumns)(\"groups\", ctx_r158.group)(\"detailTemplate\", ctx_r158.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"scrollable\", true)(\"groups\", ctx_r158.group)(\"columns\", ctx_r158.lockedLeafColumns)(\"detailTemplate\", ctx_r158.detailTemplate)(\"logicalRowIndex\", ctx_r158.ariaRowCount);\n} }\nfunction GridComponent_ng_template_6_div_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 26);\n ɵngcc0.ɵɵtemplate(1, GridComponent_ng_template_6_div_2_div_1_Template, 4, 13, \"div\", 27);\n ɵngcc0.ɵɵelementStart(2, \"div\", 28, 29);\n ɵngcc0.ɵɵelementStart(4, \"table\", 30);\n ɵngcc0.ɵɵelement(5, \"colgroup\", 31);\n ɵngcc0.ɵɵelement(6, \"tfoot\", 32);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r153 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"padding\", ctx_r153.headerPadding);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r153.lockedLeafColumns.length);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoGridResizableContainer\", ctx_r153.lockedLeafColumns.length)(\"lockedWidth\", ctx_r153.lockedWidth + ctx_r153.scrollbarWidth + 3);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r153.nonLockedWidth, \"px\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r153.nonLockedLeafColumns)(\"groups\", ctx_r153.isLocked ? ɵngcc0.ɵɵpureFunction0(16, _c117) : ctx_r153.group)(\"detailTemplate\", ctx_r153.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r153.ariaRowCount)(\"scrollable\", true)(\"groups\", ctx_r153.isLocked ? ɵngcc0.ɵɵpureFunction0(17, _c117) : ctx_r153.group)(\"columns\", ctx_r153.nonLockedLeafColumns)(\"lockedColumnsCount\", ctx_r153.lockedLeafColumns.length)(\"detailTemplate\", ctx_r153.detailTemplate);\n} }\nfunction GridComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {\n const _r161 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵtemplate(0, GridComponent_ng_template_6_div_0_Template, 8, 30, \"div\", 10);\n ɵngcc0.ɵɵelementStart(1, \"kendo-grid-list\", 11);\n ɵngcc0.ɵɵlistener(\"pageChange\", function GridComponent_ng_template_6_Template_kendo_grid_list_pageChange_1_listener($event) { ɵngcc0.ɵɵrestoreView(_r161); const ctx_r160 = ɵngcc0.ɵɵnextContext(); return ctx_r160.notifyPageChange(\"list\", $event); })(\"scrollBottom\", function GridComponent_ng_template_6_Template_kendo_grid_list_scrollBottom_1_listener() { ɵngcc0.ɵɵrestoreView(_r161); const ctx_r162 = ɵngcc0.ɵɵnextContext(); return ctx_r162.notifyScrollBottom(); })(\"contentScroll\", function GridComponent_ng_template_6_Template_kendo_grid_list_contentScroll_1_listener($event) { ɵngcc0.ɵɵrestoreView(_r161); const ctx_r163 = ɵngcc0.ɵɵnextContext(); return ctx_r163.contentScroll.emit($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(2, GridComponent_ng_template_6_div_2_Template, 7, 18, \"div\", 12);\n} if (rf & 2) {\n const ctx_r146 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r146.hideHeader);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"data\", ctx_r146.view)(\"rowHeight\", ctx_r146.rowHeight)(\"detailRowHeight\", ctx_r146.detailRowHeight)(\"total\", ctx_r146.totalCount)(\"take\", ctx_r146.pageSize)(\"groups\", ctx_r146.group)(\"groupable\", ctx_r146.groupable)(\"skip\", ctx_r146.skip)(\"trackBy\", ctx_r146.trackBy)(\"columns\", ctx_r146.columnsContainer)(\"selectable\", ctx_r146.selectable)(\"filterable\", ctx_r146.filterable)(\"detailTemplate\", ctx_r146.detailTemplate)(\"noRecordsTemplate\", ctx_r146.noRecordsTemplate)(\"rowClass\", ctx_r146.rowClass)(\"loading\", ctx_r146.loading)(\"isVirtual\", ctx_r146.isVirtual)(\"virtualColumns\", ctx_r146.virtualColumns)(\"enableDrag\", ctx_r146.marqueeSelection);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r146.showFooter);\n} }\nfunction GridComponent_ng_template_7_thead_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"thead\", 39);\n} if (rf & 2) {\n const ctx_r164 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"resizable\", ctx_r164.resizable)(\"scrollable\", false)(\"columns\", ctx_r164.visibleColumns)(\"totalColumnLevels\", ctx_r164.totalColumnLevels)(\"groups\", ctx_r164.group)(\"groupable\", ctx_r164.showGroupPanel)(\"reorderable\", ctx_r164.reorderable)(\"sort\", ctx_r164.sort)(\"sortable\", ctx_r164.sortable)(\"filter\", ctx_r164.filter)(\"filterable\", ctx_r164.filterable)(\"columnMenu\", ctx_r164.columnMenuOptions)(\"columnMenuTemplate\", ctx_r164.columnMenuTemplate)(\"detailTemplate\", ctx_r164.detailTemplate);\n} }\nfunction GridComponent_ng_template_7_tfoot_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"tfoot\", 40);\n} if (rf & 2) {\n const ctx_r165 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"scrollable\", false)(\"logicalRowIndex\", ctx_r165.ariaRowCount)(\"groups\", ctx_r165.group)(\"columns\", ctx_r165.leafColumns)(\"detailTemplate\", ctx_r165.detailTemplate);\n} }\nfunction GridComponent_ng_template_7_div_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"div\", 41);\n} }\nfunction GridComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"table\");\n ɵngcc0.ɵɵelement(1, \"colgroup\", 31);\n ɵngcc0.ɵɵtemplate(2, GridComponent_ng_template_7_thead_2_Template, 1, 14, \"thead\", 35);\n ɵngcc0.ɵɵelement(3, \"tbody\", 36);\n ɵngcc0.ɵɵtemplate(4, GridComponent_ng_template_7_tfoot_4_Template, 1, 5, \"tfoot\", 37);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(5, GridComponent_ng_template_7_div_5_Template, 1, 0, \"div\", 38);\n} if (rf & 2) {\n const ctx_r147 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"table-layout\", ctx_r147.resizable ? \"fixed\" : null);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r147.leafColumns)(\"groups\", ctx_r147.group)(\"detailTemplate\", ctx_r147.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r147.hideHeader);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"groups\", ctx_r147.group)(\"data\", ctx_r147.view)(\"skip\", ctx_r147.skip)(\"columns\", ctx_r147.leafColumns)(\"selectable\", ctx_r147.selectable)(\"filterable\", ctx_r147.filterable)(\"noRecordsTemplate\", ctx_r147.noRecordsTemplate)(\"detailTemplate\", ctx_r147.detailTemplate)(\"showGroupFooters\", ctx_r147.showGroupFooters)(\"trackBy\", ctx_r147.trackBy)(\"rowClass\", ctx_r147.rowClass)(\"enableDrag\", ctx_r147.marqueeSelection);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r147.showFooter);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r147.loading);\n} }\nfunction GridComponent_kendo_pager_8_Template(rf, ctx) { if (rf & 1) {\n const _r168 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-pager\", 42);\n ɵngcc0.ɵɵlistener(\"pageChange\", function GridComponent_kendo_pager_8_Template_kendo_pager_pageChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r168); const ctx_r167 = ɵngcc0.ɵɵnextContext(); return ctx_r167.notifyPageChange(\"pager\", $event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r148 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"template\", ctx_r148.pagerTemplate)(\"pageSize\", ctx_r148.pageSize)(\"total\", ctx_r148.view.total)(\"skip\", ctx_r148.skip)(\"options\", ctx_r148.pageable);\n} }\nfunction GridComponent_kendo_grid_toolbar_9_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-toolbar\", 43);\n} }\nconst _c118 = [\"container\"];\nconst _c119 = [\"lockedContainer\"];\nconst _c120 = [\"lockedTable\"];\nconst _c121 = [\"table\"];\nconst _c122 = function (a0, a1, a2, a3) { return { keydown: a0, scroll: a1, mousewheel: a2, DOMMouseScroll: a3 }; };\nfunction ListComponent_div_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 12, 13);\n ɵngcc0.ɵɵelementStart(2, \"div\", 3);\n ɵngcc0.ɵɵelementStart(3, \"table\", 14, 15);\n ɵngcc0.ɵɵelement(5, \"colgroup\", 6);\n ɵngcc0.ɵɵelement(6, \"tbody\", 16);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelement(7, \"kendo-resize-sensor\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(8, \"div\", 9);\n ɵngcc0.ɵɵelement(9, \"div\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r169 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r169.lockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction4(25, _c122, ctx_r169.lockedKeydown, ctx_r169.lockedScroll, ctx_r169.lockedMousewheel, ctx_r169.lockedMousewheel))(\"scope\", ctx_r169);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r169.lockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"locked\", true);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"groups\", ctx_r169.groups)(\"columns\", ctx_r169.lockedLeafColumns)(\"detailTemplate\", ctx_r169.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"groups\", ctx_r169.groups)(\"isLocked\", true)(\"data\", ctx_r169.data)(\"noRecordsText\", \"\")(\"columns\", ctx_r169.lockedLeafColumns)(\"totalColumnsCount\", ctx_r169.leafColumns.length)(\"detailTemplate\", ctx_r169.detailTemplate)(\"showGroupFooters\", ctx_r169.showFooter)(\"skip\", ctx_r169.skip)(\"selectable\", ctx_r169.selectable)(\"trackBy\", ctx_r169.trackBy)(\"filterable\", ctx_r169.filterable)(\"rowClass\", ctx_r169.rowClass);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵstyleProp(\"height\", ctx_r169.totalHeight, \"px\");\n} }\nfunction ListComponent_kendo_resize_sensor_8_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-resize-sensor\");\n} }\nfunction ListComponent_kendo_resize_sensor_9_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-resize-sensor\");\n} }\nfunction ListComponent_div_12_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 17);\n ɵngcc0.ɵɵelement(1, \"div\");\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r174 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r174.totalWidth, \"px\");\n} }\nfunction ListComponent_div_13_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"div\", 18);\n} }\nconst _c123 = [\"kendoGridFilterRow\", \"\"];\nfunction FilterRowComponent_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 3);\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-group-cell\", true);\n} }\nfunction FilterRowComponent_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 3);\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-hierarchy-cell\", true);\n} }\nfunction FilterRowComponent_td_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 4);\n} if (rf & 2) {\n const column_r182 = ctx.$implicit;\n const columnIndex_r183 = ctx.index;\n const ctx_r180 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"column\", column_r182)(\"filter\", ctx_r180.filter)(\"logicalRowIndex\", ctx_r180.logicalRowIndex)(\"logicalColIndex\", ctx_r180.lockedColumnsCount + columnIndex_r183);\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r180.filterLabel);\n} }\nconst _c124 = [\"kendoGridFilterCell\", \"\"];\nfunction FilterCellComponent_ng_template_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelementContainer(1, 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r185 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"column\", ctx_r185.column)(\"filter\", ctx_r185.filter);\n} }\nfunction FilterCellComponent_ng_template_0_ng_container_2_1_ng_template_0_Template(rf, ctx) { }\nfunction FilterCellComponent_ng_template_0_ng_container_2_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FilterCellComponent_ng_template_0_ng_container_2_1_ng_template_0_Template, 0, 0, \"ng-template\", 5);\n} if (rf & 2) {\n const ctx_r187 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r187.column.filterCellTemplateRef)(\"ngTemplateOutletContext\", ctx_r187.templateContext);\n} }\nfunction FilterCellComponent_ng_template_0_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, FilterCellComponent_ng_template_0_ng_container_2_1_Template, 1, 2, undefined, 4);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r186 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r186.column.filterCellTemplateRef);\n} }\nfunction FilterCellComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 1);\n ɵngcc0.ɵɵtemplate(1, FilterCellComponent_ng_template_0_ng_container_1_Template, 2, 2, \"ng-container\", 2);\n ɵngcc0.ɵɵtemplate(2, FilterCellComponent_ng_template_0_ng_container_2_Template, 2, 1, \"ng-container\", 2);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r184 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx_r184.hasTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n} }\nconst _c125 = [\"*\"];\nconst _c126 = [\"dropdown\"];\nconst _c127 = function () { return { width: \"auto\" }; };\nfunction FilterCellOperatorsComponent_kendo_dropdownlist_0_Template(rf, ctx) { if (rf & 1) {\n const _r192 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-dropdownlist\", 3, 4);\n ɵngcc0.ɵɵlistener(\"valueChange\", function FilterCellOperatorsComponent_kendo_dropdownlist_0_Template_kendo_dropdownlist_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r192); const ctx_r191 = ɵngcc0.ɵɵnextContext(); return ctx_r191.onChange($event); })(\"keydown\", function FilterCellOperatorsComponent_kendo_dropdownlist_0_Template_kendo_dropdownlist_keydown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r192); const ctx_r193 = ɵngcc0.ɵɵnextContext(); return ctx_r193.dropdownKeydown($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r189 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"data\", ctx_r189.operators)(\"value\", ctx_r189.value)(\"valuePrimitive\", true)(\"popupSettings\", ɵngcc0.ɵɵpureFunction0(4, _c127));\n} }\nconst _c128 = function (a0) { return { \"k-clear-button-visible\": a0 }; };\nconst _c129 = [\"kendoGridColGroup\", \"\"];\nfunction ColGroupComponent_ng_template_0_col_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"col\");\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-group-col\", true);\n} }\nfunction ColGroupComponent_ng_template_0_col_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"col\");\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-hierarchy-col\", true);\n} }\nfunction ColGroupComponent_ng_template_0_col_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"col\");\n} if (rf & 2) {\n const column_r199 = ctx.$implicit;\n ɵngcc0.ɵɵstyleProp(\"width\", column_r199.width, \"px\");\n} }\nfunction ColGroupComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ColGroupComponent_ng_template_0_col_0_Template, 1, 2, \"col\", 1);\n ɵngcc0.ɵɵtemplate(1, ColGroupComponent_ng_template_0_col_1_Template, 1, 2, \"col\", 2);\n ɵngcc0.ɵɵtemplate(2, ColGroupComponent_ng_template_0_col_2_Template, 1, 2, \"col\", 3);\n} if (rf & 2) {\n const ctx_r194 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r194.groups);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r194.detailTemplate == null ? null : ctx_r194.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r194.columnsToRender)(\"ngForTrackBy\", ctx_r194.trackBy);\n} }\nconst _c130 = [\"kendoGridLoading\", \"\"];\nfunction PagerComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, 2);\n} if (rf & 2) {\n const ctx_r200 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r200.template.templateRef)(\"ngTemplateOutletContext\", ctx_r200.templateContext);\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_prev_buttons_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-prev-buttons\");\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_numeric_buttons_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-numeric-buttons\", 5);\n} if (rf & 2) {\n const ctx_r203 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"buttonCount\", ctx_r203.settings.buttonCount);\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_input_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-input\");\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_next_buttons_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-next-buttons\");\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_info_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-info\");\n} }\nfunction PagerComponent_ng_container_1_kendo_pager_page_sizes_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-pager-page-sizes\", 6);\n} if (rf & 2) {\n const ctx_r207 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"pageSizes\", ctx_r207.settings.pageSizes);\n} }\nfunction PagerComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, PagerComponent_ng_container_1_kendo_pager_prev_buttons_1_Template, 1, 0, \"kendo-pager-prev-buttons\", 1);\n ɵngcc0.ɵɵtemplate(2, PagerComponent_ng_container_1_kendo_pager_numeric_buttons_2_Template, 1, 1, \"kendo-pager-numeric-buttons\", 3);\n ɵngcc0.ɵɵtemplate(3, PagerComponent_ng_container_1_kendo_pager_input_3_Template, 1, 0, \"kendo-pager-input\", 1);\n ɵngcc0.ɵɵtemplate(4, PagerComponent_ng_container_1_kendo_pager_next_buttons_4_Template, 1, 0, \"kendo-pager-next-buttons\", 1);\n ɵngcc0.ɵɵtemplate(5, PagerComponent_ng_container_1_kendo_pager_info_5_Template, 1, 0, \"kendo-pager-info\", 1);\n ɵngcc0.ɵɵtemplate(6, PagerComponent_ng_container_1_kendo_pager_page_sizes_6_Template, 1, 1, \"kendo-pager-page-sizes\", 4);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r201 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.previousNext);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.type === \"numeric\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.type === \"input\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.previousNext);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.info);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r201.settings.pageSizes);\n} }\nconst _c131 = function (a2) { return { \"k-link\": true, \"k-pager-nav\": true, \"k-state-disabled\": a2, \"k-pager-first\": true }; };\nconst _c132 = function () { return { \"k-icon\": true, \"k-i-seek-w\": true }; };\nconst _c133 = function (a2) { return { \"k-link\": true, \"k-pager-nav\": true, \"k-state-disabled\": a2, \"\": true }; };\nconst _c134 = function () { return { \"k-icon\": true, \"k-i-arrow-w\": true }; };\nconst _c135 = function () { return { \"k-icon\": true, \"k-i-arrow-e\": true }; };\nconst _c136 = function (a2) { return { \"k-link\": true, \"k-pager-nav\": true, \"k-state-disabled\": a2, \"k-pager-last\": true }; };\nconst _c137 = function () { return { \"k-icon\": true, \"k-i-seek-e\": true }; };\nfunction PagerNumericButtonsComponent_li_1_Template(rf, ctx) { if (rf & 1) {\n const _r212 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\");\n ɵngcc0.ɵɵelementStart(1, \"a\", 3);\n ɵngcc0.ɵɵlistener(\"click\", function PagerNumericButtonsComponent_li_1_Template_a_click_1_listener() { ɵngcc0.ɵɵrestoreView(_r212); const ctx_r211 = ɵngcc0.ɵɵnextContext(); return ctx_r211.changePage(ctx_r211.start - 2); });\n ɵngcc0.ɵɵtext(2, \"...\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r208 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r208.pageLabel(ctx_r208.start - 1));\n} }\nconst _c138 = function (a1) { return { \"k-link\": true, \"k-state-selected\": a1 }; };\nfunction PagerNumericButtonsComponent_li_2_Template(rf, ctx) { if (rf & 1) {\n const _r215 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\");\n ɵngcc0.ɵɵelementStart(1, \"a\", 4);\n ɵngcc0.ɵɵlistener(\"click\", function PagerNumericButtonsComponent_li_2_Template_a_click_1_listener() { ɵngcc0.ɵɵrestoreView(_r215); const num_r213 = ctx.$implicit; const ctx_r214 = ɵngcc0.ɵɵnextContext(); return ctx_r214.changePage(num_r213 - 1); });\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const num_r213 = ctx.$implicit;\n const ctx_r209 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction1(3, _c138, ctx_r209.currentPage == num_r213));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r209.pageLabel(num_r213));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", num_r213, \" \");\n} }\nfunction PagerNumericButtonsComponent_li_3_Template(rf, ctx) { if (rf & 1) {\n const _r217 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\");\n ɵngcc0.ɵɵelementStart(1, \"a\", 3);\n ɵngcc0.ɵɵlistener(\"click\", function PagerNumericButtonsComponent_li_3_Template_a_click_1_listener() { ɵngcc0.ɵɵrestoreView(_r217); const ctx_r216 = ɵngcc0.ɵɵnextContext(); return ctx_r216.changePage(ctx_r216.end); });\n ɵngcc0.ɵɵtext(2, \"...\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r210 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r210.pageLabel(ctx_r210.end + 1));\n} }\nconst _c139 = function () { return { \"k-pager-numbers\": true, \"k-reset\": true }; };\nconst _c140 = function () { return { \"k-pager-input\": true, \"k-label\": true }; };\nconst _c141 = function (a0, a1) { return { keydown: a0, focusout: a1 }; };\nfunction PagerPageSizesComponent_option_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"option\", 4);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r219 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"value\", ctx_r219.pageSize);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r219.pageSize);\n} }\nfunction PagerPageSizesComponent_option_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"option\", 5);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const page_r221 = ctx.$implicit;\n const ctx_r220 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"value\", ctx_r220.getValue(page_r221))(\"selected\", ctx_r220.getSelectedState(page_r221));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", page_r221[\"text\"], \" \");\n} }\nconst _c142 = [\"kendoGridGroupHeader\", \"\"];\nfunction GroupHeaderComponent_ng_template_0_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 4);\n} }\nfunction GroupHeaderComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, GroupHeaderComponent_ng_template_0_td_0_Template, 1, 0, \"td\", 3);\n} if (rf & 2) {\n const ctx_r223 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r223.prefixGroupCell(ctx_r223.item));\n} }\nfunction GroupHeaderComponent_td_1_ng_template_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n ɵngcc0.ɵɵpipe(1, \"valueOf\");\n} if (rf & 2) {\n const ctx_r229 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵtextInterpolate2(\" \", ctx_r229.groupTitle(ctx_r229.item), \": \", ɵngcc0.ɵɵpipeBind3(1, 2, ctx_r229.item.data, \"value\", ctx_r229.formatForGroup(ctx_r229.item)), \" \");\n} }\nfunction GroupHeaderComponent_td_1_ng_template_2_ng_template_2_Template(rf, ctx) { }\nconst _c143 = function (a0, a1) { return { \"k-i-collapse\": a0, \"k-i-expand\": a1 }; };\nconst _c144 = function (a0, a1, a2, a3, a4, a5, a6, a7) { return { templateRef: a0, group: a1, aggregates: a2, value: a3, field: a4, index: a5, expanded: a6, $implicit: a7 }; };\nfunction GroupHeaderComponent_td_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n const _r232 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"a\", 7);\n ɵngcc0.ɵɵlistener(\"click\", function GroupHeaderComponent_td_1_ng_template_2_Template_a_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r232); const ctx_r231 = ɵngcc0.ɵɵnextContext(2); return ctx_r231.toggleGroup(ctx_r231.item); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(1, GroupHeaderComponent_td_1_ng_template_2_ng_template_1_Template, 2, 6, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(2, GroupHeaderComponent_td_1_ng_template_2_ng_template_2_Template, 0, 0, \"ng-template\", 8);\n} if (rf & 2) {\n const ctx_r228 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction2(3, _c143, ctx_r228.isExpanded, !ctx_r228.isExpanded));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r228.groupHeaderTemplate(ctx_r228.item));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction8(6, _c144, ctx_r228.groupHeaderTemplate(ctx_r228.item), ctx_r228.item.data, ctx_r228.item.data == null ? null : ctx_r228.item.data.aggregates, ctx_r228.item.data == null ? null : ctx_r228.item.data.value, ctx_r228.item.data == null ? null : ctx_r228.item.data.field, ctx_r228.item.index, ctx_r228.isExpanded, ctx_r228.item.data));\n} }\nfunction GroupHeaderComponent_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 5);\n ɵngcc0.ɵɵelementStart(1, \"p\", 6);\n ɵngcc0.ɵɵtemplate(2, GroupHeaderComponent_td_1_ng_template_2_Template, 3, 15, \"ng-template\", 0);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r224 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r224.logicalRowIndex)(\"logicalColIndex\", 0)(\"logicalSlaveCell\", ctx_r224.skipGroupDecoration)(\"groupItem\", ctx_r224.item)(\"colSpan\", ctx_r224.logicalColSpan());\n ɵngcc0.ɵɵattribute(\"colspan\", ctx_r224.groupSpan(ctx_r224.item))(\"role\", ctx_r224.ariaRole())(\"aria-expanded\", ctx_r224.isExpanded);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r224.skipGroupDecoration);\n} }\nconst _c145 = function (a0, a1, a2, a3, a4, a5) { return { group: a0, aggregates: a1, value: a2, field: a3, index: a4, $implicit: a5 }; };\nfunction GroupHeaderComponent_ng_container_2_td_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, 12);\n} if (rf & 2) {\n const column_r234 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r236 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", column_r234.groupHeaderColumnTemplateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction6(2, _c145, ctx_r236.item.data, ctx_r236.item.data == null ? null : ctx_r236.item.data.aggregates, ctx_r236.item.data == null ? null : ctx_r236.item.data.value, ctx_r236.item.data == null ? null : ctx_r236.item.data.field, ctx_r236.item.index, ctx_r236.item.data));\n} }\nfunction GroupHeaderComponent_ng_container_2_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 10);\n ɵngcc0.ɵɵtemplate(1, GroupHeaderComponent_ng_container_2_td_1_ng_container_1_Template, 1, 9, \"ng-container\", 11);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const column_r234 = ctx.$implicit;\n const index_r235 = ctx.index;\n const ctx_r233 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r233.logicalRowIndex)(\"logicalColIndex\", index_r235 + 1)(\"logicalSlaveCell\", false)(\"groupItem\", ctx_r233.item)(\"colSpan\", 1);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", column_r234.groupHeaderColumnTemplateRef);\n} }\nfunction GroupHeaderComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, GroupHeaderComponent_ng_container_2_td_1_Template, 2, 6, \"td\", 9);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r225 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r225.groupHeaderColumns);\n} }\nconst _c146 = function () { return { lastTarget: true }; };\nfunction GroupPanelComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 3);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r238 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"context\", ɵngcc0.ɵɵpureFunction0(2, _c146));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r238.text, \" \");\n} }\nconst _c147 = function (a0) { return { field: a0 }; };\nconst _c148 = function (a0, a2) { return { field: a0, type: \"groupIndicator\", hint: a2 }; };\nfunction GroupPanelComponent_div_1_Template(rf, ctx) { if (rf & 1) {\n const _r244 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 3);\n ɵngcc0.ɵɵelementStart(1, \"div\", 4);\n ɵngcc0.ɵɵlistener(\"directionChange\", function GroupPanelComponent_div_1_Template_div_directionChange_1_listener($event) { ɵngcc0.ɵɵrestoreView(_r244); const ctx_r243 = ɵngcc0.ɵɵnextContext(); return ctx_r243.directionChange($event); })(\"remove\", function GroupPanelComponent_div_1_Template_div_remove_1_listener($event) { ɵngcc0.ɵɵrestoreView(_r244); const ctx_r245 = ɵngcc0.ɵɵnextContext(); return ctx_r245.remove($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const group_r241 = ctx.$implicit;\n const index_r242 = ctx.index;\n const ctx_r239 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"context\", ɵngcc0.ɵɵpureFunction1(5, _c147, group_r241.field));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"enableDrag\", true)(\"context\", ɵngcc0.ɵɵpureFunction2(7, _c148, group_r241.field, ctx_r239.groupTitles[index_r242]))(\"group\", group_r241)(\"groupTitle\", ctx_r239.groupTitles[index_r242]);\n} }\nfunction GroupPanelComponent_div_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 3);\n ɵngcc0.ɵɵtext(1, \"\\u00A0\");\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"context\", ɵngcc0.ɵɵpureFunction0(1, _c146));\n} }\nconst _c149 = [\"kendoGroupIndicator\", \"\"];\nconst _c150 = [\"kendoGridHeader\", \"\"];\nfunction HeaderComponent_ng_template_0_tr_0_th_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"th\", 7);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_th_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"th\", 8);\n} if (rf & 2) {\n const levelIndex_r250 = ɵngcc0.ɵɵnextContext().index;\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", levelIndex_r250)(\"logicalColIndex\", 0);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_filter_menu_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-filter-menu\", 15);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r261 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"column\", column_r256)(\"filter\", ctx_r261.filter);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_column_menu_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-column-menu\", 16);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r262 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"standalone\", false)(\"settings\", ctx_r262.columnMenu)(\"column\", column_r256)(\"columnMenuTemplate\", ctx_r262.columnMenuTemplate)(\"sort\", ctx_r262.sort)(\"filter\", ctx_r262.filter)(\"sortable\", ctx_r262.sortable);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_0_Template(rf, ctx) { }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(3).$implicit;\n ɵngcc0.ɵɵtextInterpolate(column_r256.displayTitle);\n} }\nconst _c151 = function (a0, a1, a2, a3) { return { templateRef: a0, columnIndex: a1, column: a2, $implicit: a3 }; };\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_0_Template, 0, 0, \"ng-template\", 17);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_ng_template_1_Template, 1, 1, \"ng-template\", 0);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction4(2, _c151, column_r256.headerTemplateRef, column_r256.leafIndex, column_r256, column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !column_r256.headerTemplateRef);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_2_Template(rf, ctx) { }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(3).$implicit;\n ɵngcc0.ɵɵtextInterpolate(column_r256.displayTitle);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_span_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 23);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(3).$implicit;\n const ctx_r276 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r276.sortOrder(column_r256.field));\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_Template(rf, ctx) { if (rf & 1) {\n const _r281 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"span\", 18, 19);\n ɵngcc0.ɵɵlistener(\"click\", function HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_Template_span_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r281); const _r273 = ɵngcc0.ɵɵreference(1); const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit; const ctx_r279 = ɵngcc0.ɵɵnextContext(3); return ctx_r279.onSortClick(column_r256, $event, _r273); });\n ɵngcc0.ɵɵtemplate(2, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_2_Template, 0, 0, \"ng-template\", 17);\n ɵngcc0.ɵɵtemplate(3, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_ng_template_3_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵelement(4, \"span\", 20);\n ɵngcc0.ɵɵtemplate(5, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_span_5_Template, 2, 1, \"span\", 21);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelement(6, \"span\", 22);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r264 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction4(6, _c151, column_r256.headerTemplateRef, column_r256.leafIndex, column_r256, column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !column_r256.headerTemplateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r264.sortIcon(column_r256.field));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r264.sortableLabel);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r264.showSortNumbering(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"innerHtml\", ctx_r264.sortStatus(column_r256), ɵngcc0.ɵɵsanitizeHtml);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"input\", 24);\n ɵngcc0.ɵɵelement(1, \"label\", 25);\n} if (rf & 2) {\n const ctx_r265 = ɵngcc0.ɵɵnextContext(5);\n ɵngcc0.ɵɵattribute(\"id\", ctx_r265.selectAllCheckboxId());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"for\", ctx_r265.selectAllCheckboxId());\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_span_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 26);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r266 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"column\", column_r256)(\"columns\", ctx_r266.columns);\n} }\nconst _c152 = function (a0, a2, a3, a4) { return { field: a0, type: \"column\", column: a2, hint: a3, lastColumn: a4 }; };\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_Template(rf, ctx) { if (rf & 1) {\n const _r286 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"th\", 11);\n ɵngcc0.ɵɵlistener(\"keydown\", function HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_Template_th_keydown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r286); const column_r256 = ɵngcc0.ɵɵnextContext().$implicit; const ctx_r284 = ɵngcc0.ɵɵnextContext(3); return ctx_r284.onHeaderKeydown(column_r256, $event); });\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_filter_menu_1_Template, 1, 2, \"kendo-grid-filter-menu\", 12);\n ɵngcc0.ɵɵtemplate(2, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_kendo_grid_column_menu_2_Template, 1, 7, \"kendo-grid-column-menu\", 13);\n ɵngcc0.ɵɵtemplate(3, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_3_Template, 2, 7, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(4, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_4_Template, 7, 11, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(5, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_ng_template_5_Template, 2, 2, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(6, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_span_6_Template, 1, 2, \"span\", 14);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r287 = ɵngcc0.ɵɵnextContext();\n const column_r256 = ctx_r287.$implicit;\n const columnIndex_r257 = ctx_r287.index;\n const last_r258 = ctx_r287.last;\n const levelIndex_r250 = ɵngcc0.ɵɵnextContext().index;\n const ctx_r259 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵclassProp(\"k-filterable\", ctx_r259.showFilterMenu && ctx_r259.isFilterable(column_r256) || ctx_r259.showColumnMenu(column_r256))(\"k-first\", ctx_r259.isFirstOnRow(column_r256, columnIndex_r257));\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", levelIndex_r250)(\"logicalColIndex\", ctx_r259.logicalColumnIndex(column_r256))(\"colSpan\", column_r256.colspan)(\"rowSpan\", column_r256.rowspan(ctx_r259.totalColumnLevels))(\"enableDrag\", ctx_r259.shouldActivate(column_r256))(\"context\", ɵngcc0.ɵɵpureFunction4(21, _c152, column_r256.field, column_r256, column_r256.title || column_r256.field, last_r258 && columnIndex_r257 === 0))(\"ngClass\", column_r256.headerClass)(\"ngStyle\", column_r256.headerStyle);\n ɵngcc0.ɵɵattribute(\"aria-sort\", ctx_r259.sortState(column_r256))(\"rowspan\", column_r256.rowspan(ctx_r259.totalColumnLevels))(\"colspan\", column_r256.colspan);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r259.showFilterMenu && ctx_r259.isFilterable(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r259.showColumnMenu(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r259.isSortable(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r259.isSortable(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r259.isCheckboxColumn(column_r256) && !column_r256.headerTemplateRef && column_r256.showSelectAll);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r259.resizable);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_kendo_grid_column_menu_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-column-menu\", 29);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r289 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"standalone\", false)(\"settings\", ctx_r289.columnMenu)(\"column\", column_r256)(\"columnMenuTemplate\", ctx_r289.columnMenuTemplate);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_2_Template(rf, ctx) { }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n ɵngcc0.ɵɵtextInterpolate(column_r256.displayTitle);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_span_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 26);\n} if (rf & 2) {\n const column_r256 = ɵngcc0.ɵɵnextContext(2).$implicit;\n const ctx_r292 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"column\", column_r256)(\"columns\", ctx_r292.columns);\n} }\nconst _c153 = function (a1, a2, a3) { return { type: \"columnGroup\", column: a1, hint: a2, lastColumn: a3 }; };\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"th\", 27);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_kendo_grid_column_menu_1_Template, 1, 4, \"kendo-grid-column-menu\", 28);\n ɵngcc0.ɵɵtemplate(2, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_2_Template, 0, 0, \"ng-template\", 17);\n ɵngcc0.ɵɵtemplate(3, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_ng_template_3_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(4, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_span_4_Template, 1, 2, \"span\", 14);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r296 = ɵngcc0.ɵɵnextContext();\n const column_r256 = ctx_r296.$implicit;\n const columnIndex_r257 = ctx_r296.index;\n const last_r258 = ctx_r296.last;\n const levelIndex_r250 = ɵngcc0.ɵɵnextContext().index;\n const ctx_r260 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵclassProp(\"k-first\", ctx_r260.isFirstOnRow(column_r256, columnIndex_r257))(\"k-filterable\", ctx_r260.showColumnMenu(column_r256));\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", levelIndex_r250)(\"logicalColIndex\", ctx_r260.logicalColumnIndex(column_r256))(\"rowSpan\", column_r256.rowspan(ctx_r260.totalColumnLevels))(\"colSpan\", column_r256.colspan)(\"enableDrag\", ctx_r260.shouldActivate(column_r256))(\"context\", ɵngcc0.ɵɵpureFunction3(18, _c153, column_r256, column_r256.title, last_r258 && columnIndex_r257 === 0))(\"ngClass\", column_r256.headerClass)(\"ngStyle\", column_r256.headerStyle);\n ɵngcc0.ɵɵattribute(\"rowspan\", column_r256.rowspan(ctx_r260.totalColumnLevels))(\"colspan\", column_r256.colspan);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r260.showColumnMenu(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction4(22, _c151, column_r256.headerTemplateRef, ctx_r260.lockedColumnsCount + columnIndex_r257, column_r256, column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !column_r256.headerTemplateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r260.resizable);\n} }\nfunction HeaderComponent_ng_template_0_tr_0_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_0_Template, 7, 26, \"th\", 9);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_0_ng_template_3_th_1_Template, 5, 27, \"th\", 10);\n} if (rf & 2) {\n const column_r256 = ctx.$implicit;\n const ctx_r253 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r253.isColumnGroupComponent(column_r256));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r253.isColumnGroupComponent(column_r256));\n} }\nfunction HeaderComponent_ng_template_0_tr_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 3);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_0_th_1_Template, 1, 0, \"th\", 4);\n ɵngcc0.ɵɵtemplate(2, HeaderComponent_ng_template_0_tr_0_th_2_Template, 1, 2, \"th\", 5);\n ɵngcc0.ɵɵtemplate(3, HeaderComponent_ng_template_0_tr_0_ng_template_3_Template, 2, 2, \"ng-template\", 6);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const levelIndex_r250 = ctx.index;\n const ctx_r247 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", levelIndex_r250)(\"logicalSlaveRow\", ctx_r247.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r247.columns.length)(\"logicalSlaveCellsCount\", ctx_r247.unlockedColumnsCount);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r247.groups);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r247.detailTemplate == null ? null : ctx_r247.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r247.columnsForLevel(levelIndex_r250))(\"ngForTrackBy\", ctx_r247.trackByIndex);\n} }\nfunction HeaderComponent_ng_template_0_tr_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"tr\", 30);\n} if (rf & 2) {\n const ctx_r248 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r248.leafColumns)(\"filter\", ctx_r248.filter)(\"groups\", ctx_r248.groups)(\"detailTemplate\", ctx_r248.detailTemplate)(\"lockedColumnsCount\", ctx_r248.lockedColumnsCount)(\"logicalRowIndex\", ctx_r248.totalColumnLevels + 1)(\"logicalSlaveRow\", ctx_r248.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r248.columns.length)(\"logicalSlaveCellsCount\", ctx_r248.unlockedColumnsCount);\n} }\nfunction HeaderComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, HeaderComponent_ng_template_0_tr_0_Template, 4, 8, \"tr\", 1);\n ɵngcc0.ɵɵtemplate(1, HeaderComponent_ng_template_0_tr_1_Template, 1, 9, \"tr\", 2);\n} if (rf & 2) {\n const ctx_r246 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r246.columnLevels);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r246.showFilterRow);\n} }\nfunction FilterMenuComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n const _r302 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-menu-container\", 4);\n ɵngcc0.ɵɵlistener(\"close\", function FilterMenuComponent_ng_template_3_Template_kendo_grid_filter_menu_container_close_0_listener() { ɵngcc0.ɵɵrestoreView(_r302); const ctx_r301 = ɵngcc0.ɵɵnextContext(); return ctx_r301.close(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r300 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"column\", ctx_r300.column)(\"filter\", ctx_r300.filter);\n} }\nconst _c154 = function (a1) { return { \"k-grid-filter\": true, \"k-state-active\": a1 }; };\nfunction FilterMenuContainerComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelementContainer(1, 7);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r304 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterService\", ctx_r304.childService)(\"column\", ctx_r304.column)(\"filter\", ctx_r304.childFilter);\n} }\nfunction FilterMenuContainerComponent_ng_container_4_1_ng_template_0_Template(rf, ctx) { }\nfunction FilterMenuContainerComponent_ng_container_4_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FilterMenuContainerComponent_ng_container_4_1_ng_template_0_Template, 0, 0, \"ng-template\", 9);\n} if (rf & 2) {\n const ctx_r306 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r306.column.filterMenuTemplateRef)(\"ngTemplateOutletContext\", ctx_r306.templateContext);\n} }\nfunction FilterMenuContainerComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, FilterMenuContainerComponent_ng_container_4_1_Template, 1, 2, undefined, 8);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r305 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r305.column.filterMenuTemplateRef);\n} }\nfunction StringFilterMenuComponent_kendo_dropdownlist_1_Template(rf, ctx) { if (rf & 1) {\n const _r311 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-dropdownlist\", 3);\n ɵngcc0.ɵɵlistener(\"valueChange\", function StringFilterMenuComponent_kendo_dropdownlist_1_Template_kendo_dropdownlist_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r311); const ctx_r310 = ɵngcc0.ɵɵnextContext(); return ctx_r310.logicChange($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r308 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"data\", ctx_r308.logicOperators)(\"valuePrimitive\", true)(\"value\", ctx_r308.filter == null ? null : ctx_r308.filter.logic);\n} }\nfunction StringFilterMenuComponent_kendo_grid_string_filter_menu_input_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-string-filter-menu-input\", 4);\n} if (rf & 2) {\n const ctx_r309 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"operators\", ctx_r309.operators)(\"currentFilter\", ctx_r309.secondFilter)(\"filterService\", ctx_r309.filterService)(\"column\", ctx_r309.column)(\"filter\", ctx_r309.filter);\n} }\nfunction NumericFilterMenuComponent_kendo_dropdownlist_1_Template(rf, ctx) { if (rf & 1) {\n const _r315 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-dropdownlist\", 3);\n ɵngcc0.ɵɵlistener(\"valueChange\", function NumericFilterMenuComponent_kendo_dropdownlist_1_Template_kendo_dropdownlist_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r315); const ctx_r314 = ɵngcc0.ɵɵnextContext(); return ctx_r314.logicChange($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r312 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"data\", ctx_r312.logicOperators)(\"valuePrimitive\", true)(\"value\", ctx_r312.filter == null ? null : ctx_r312.filter.logic);\n} }\nfunction NumericFilterMenuComponent_kendo_grid_numeric_filter_menu_input_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-numeric-filter-menu-input\", 4);\n} if (rf & 2) {\n const ctx_r313 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"operators\", ctx_r313.operators)(\"currentFilter\", ctx_r313.secondFilter)(\"filterService\", ctx_r313.filterService)(\"column\", ctx_r313.column)(\"filter\", ctx_r313.filter)(\"format\", ctx_r313.format)(\"decimals\", ctx_r313.decimals)(\"spinners\", ctx_r313.spinners)(\"min\", ctx_r313.min)(\"max\", ctx_r313.max)(\"step\", ctx_r313.step);\n} }\nfunction DateFilterMenuComponent_kendo_dropdownlist_1_Template(rf, ctx) { if (rf & 1) {\n const _r319 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-dropdownlist\", 3);\n ɵngcc0.ɵɵlistener(\"valueChange\", function DateFilterMenuComponent_kendo_dropdownlist_1_Template_kendo_dropdownlist_valueChange_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r319); const ctx_r318 = ɵngcc0.ɵɵnextContext(); return ctx_r318.logicChange($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r316 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"data\", ctx_r316.logicOperators)(\"valuePrimitive\", true)(\"value\", ctx_r316.filter == null ? null : ctx_r316.filter.logic);\n} }\nfunction DateFilterMenuComponent_kendo_grid_date_filter_menu_input_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-date-filter-menu-input\", 4);\n} if (rf & 2) {\n const ctx_r317 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"operators\", ctx_r317.operators)(\"currentFilter\", ctx_r317.secondFilter)(\"filterService\", ctx_r317.filterService)(\"column\", ctx_r317.column)(\"filter\", ctx_r317.filter)(\"activeView\", ctx_r317.activeView)(\"bottomView\", ctx_r317.bottomView)(\"topView\", ctx_r317.topView)(\"format\", ctx_r317.format)(\"formatPlaceholder\", ctx_r317.formatPlaceholder)(\"placeholder\", ctx_r317.placeholder)(\"min\", ctx_r317.min)(\"max\", ctx_r317.max)(\"weekNumber\", ctx_r317.weekNumber);\n} }\nfunction BooleanFilterMenuComponent_li_1_Template(rf, ctx) { if (rf & 1) {\n const _r323 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\");\n ɵngcc0.ɵɵelementStart(1, \"input\", 2);\n ɵngcc0.ɵɵlistener(\"change\", function BooleanFilterMenuComponent_li_1_Template_input_change_1_listener() { ɵngcc0.ɵɵrestoreView(_r323); const item_r321 = ctx.$implicit; const ctx_r322 = ɵngcc0.ɵɵnextContext(); return ctx_r322.onChange(item_r321.value); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"label\", 3);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const item_r321 = ctx.$implicit;\n const ctx_r320 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"name\", ctx_r320.idPrefix)(\"checked\", ctx_r320.isSelected(item_r321.value));\n ɵngcc0.ɵɵattribute(\"id\", ctx_r320.radioId(item_r321.value));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"for\", ctx_r320.radioId(item_r321.value));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(item_r321.text);\n} }\nfunction ColumnListComponent_label_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"label\", 3);\n ɵngcc0.ɵɵelement(1, \"input\", 4);\n ɵngcc0.ɵɵelementStart(2, \"span\", 5);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const column_r328 = ctx.$implicit;\n const index_r329 = ctx.index;\n const ctx_r326 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"checked\", !column_r328.hidden)(\"disabled\", ctx_r326.isDisabled(column_r328));\n ɵngcc0.ɵɵattribute(\"data-index\", index_r329);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(column_r328.displayTitle);\n} }\nfunction ColumnListComponent_div_2_Template(rf, ctx) { if (rf & 1) {\n const _r331 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 6);\n ɵngcc0.ɵɵelementStart(1, \"button\", 7);\n ɵngcc0.ɵɵlistener(\"click\", function ColumnListComponent_div_2_Template_button_click_1_listener() { ɵngcc0.ɵɵrestoreView(_r331); const ctx_r330 = ɵngcc0.ɵɵnextContext(); return ctx_r330.cancelChanges(); });\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(3, \"button\", 8);\n ɵngcc0.ɵɵlistener(\"click\", function ColumnListComponent_div_2_Template_button_click_3_listener() { ɵngcc0.ɵɵrestoreView(_r331); const ctx_r332 = ɵngcc0.ɵɵnextContext(); return ctx_r332.applyChanges(); });\n ɵngcc0.ɵɵtext(4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r327 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r327.actionsClass);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r327.resetText);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r327.applyText);\n} }\nfunction ColumnChooserComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n const _r337 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"span\", 4);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"kendo-grid-columnlist\", 5);\n ɵngcc0.ɵɵlistener(\"apply\", function ColumnChooserComponent_ng_template_3_Template_kendo_grid_columnlist_apply_2_listener($event) { ɵngcc0.ɵɵrestoreView(_r337); const ctx_r336 = ɵngcc0.ɵɵnextContext(); return ctx_r336.onApply($event); })(\"columnChange\", function ColumnChooserComponent_ng_template_3_Template_kendo_grid_columnlist_columnChange_2_listener($event) { ɵngcc0.ɵɵrestoreView(_r337); const ctx_r338 = ɵngcc0.ɵɵnextContext(); return ctx_r338.onChange($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r335 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r335.localization.get(\"columns\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r335.columns)(\"applyText\", ctx_r335.localization.get(\"columnsApply\"))(\"resetText\", ctx_r335.localization.get(\"columnsReset\"))(\"autoSync\", ctx_r335.autoSync)(\"allowHideAll\", ctx_r335.allowHideAll);\n} }\nfunction ColumnMenuChooserComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n const _r342 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnlist\", 2);\n ɵngcc0.ɵɵlistener(\"apply\", function ColumnMenuChooserComponent_ng_template_1_Template_kendo_grid_columnlist_apply_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r342); const ctx_r341 = ɵngcc0.ɵɵnextContext(); return ctx_r341.onApply($event); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r340 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"applyText\", ctx_r340.localization.get(\"columnsApply\"))(\"resetText\", ctx_r340.localization.get(\"columnsReset\"))(\"columns\", ctx_r340.columns)(\"autoSync\", false)(\"allowHideAll\", false)(\"actionsClass\", ctx_r340.actionsClass);\n} }\nfunction ColumnMenuFilterComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n const _r345 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-menu-container\", 2);\n ɵngcc0.ɵɵlistener(\"close\", function ColumnMenuFilterComponent_ng_template_1_Template_kendo_grid_filter_menu_container_close_0_listener() { ɵngcc0.ɵɵrestoreView(_r345); const ctx_r344 = ɵngcc0.ɵɵnextContext(); return ctx_r344.close(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r343 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"column\", ctx_r343.service.column)(\"filter\", ctx_r343.service.filter)(\"actionsClass\", ctx_r343.actionsClass);\n} }\nfunction ColumnMenuItemComponent_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 3);\n} if (rf & 2) {\n const ctx_r346 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r346.iconClass);\n} }\nfunction ColumnMenuItemComponent_div_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 4);\n ɵngcc0.ɵɵelementContainer(1, 5);\n ɵngcc0.ɵɵelement(2, \"div\");\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r347 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"@state\", ctx_r347.contentState);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r347.contentTemplate.templateRef);\n} }\nconst _c155 = function (a0, a1) { return { service: a0, column: a1 }; };\nfunction ColumnMenuComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, 5);\n} if (rf & 2) {\n const ctx_r350 = ɵngcc0.ɵɵnextContext();\n const _r351 = ɵngcc0.ɵɵreference(6);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r350.column.columnMenuTemplateRef || ctx_r350.columnMenuTemplate || _r351)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(2, _c155, ctx_r350.service, ctx_r350.column));\n} }\nfunction ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_sort_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-columnmenu-sort\", 8);\n} if (rf & 2) {\n const ctx_r353 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"service\", ctx_r353.service);\n} }\nfunction ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_lock_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-columnmenu-lock\", 8);\n} if (rf & 2) {\n const ctx_r354 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"service\", ctx_r354.service);\n} }\nfunction ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_chooser_2_Template(rf, ctx) { if (rf & 1) {\n const _r358 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-chooser\", 9);\n ɵngcc0.ɵɵlistener(\"expand\", function ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_chooser_2_Template_kendo_grid_columnmenu_chooser_expand_0_listener() { ɵngcc0.ɵɵrestoreView(_r358); const ctx_r357 = ɵngcc0.ɵɵnextContext(2); return ctx_r357.onColumnsExpand(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r355 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"service\", ctx_r355.service)(\"expanded\", ctx_r355.expandedColumns);\n} }\nfunction ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_filter_3_Template(rf, ctx) { if (rf & 1) {\n const _r360 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-filter\", 9);\n ɵngcc0.ɵɵlistener(\"expand\", function ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_filter_3_Template_kendo_grid_columnmenu_filter_expand_0_listener() { ɵngcc0.ɵɵrestoreView(_r360); const ctx_r359 = ɵngcc0.ɵɵnextContext(2); return ctx_r359.onFilterExpand(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r356 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"service\", ctx_r356.service)(\"expanded\", ctx_r356.expandedFilter);\n} }\nfunction ColumnMenuComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_sort_0_Template, 1, 1, \"kendo-grid-columnmenu-sort\", 6);\n ɵngcc0.ɵɵtemplate(1, ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_lock_1_Template, 1, 1, \"kendo-grid-columnmenu-lock\", 6);\n ɵngcc0.ɵɵtemplate(2, ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_chooser_2_Template, 1, 2, \"kendo-grid-columnmenu-chooser\", 7);\n ɵngcc0.ɵɵtemplate(3, ColumnMenuComponent_ng_template_5_kendo_grid_columnmenu_filter_3_Template, 1, 2, \"kendo-grid-columnmenu-filter\", 7);\n} if (rf & 2) {\n const ctx_r352 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r352.hasSort);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r352.hasLock);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r352.hasColumnChooser);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r352.hasFilter);\n} }\nconst _c156 = function (a0) { return { \"k-state-active\": a0 }; };\nconst _c157 = [\"kendoGridTableBody\", \"\"];\nfunction TableBodyComponent_ng_template_0_ng_template_1_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 7);\n} }\nfunction TableBodyComponent_ng_template_0_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TableBodyComponent_ng_template_0_ng_template_1_td_0_Template, 1, 0, \"td\", 6);\n} if (rf & 2) {\n const ctx_r365 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r365.groups);\n} }\nfunction TableBodyComponent_ng_template_0_td_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 8);\n} if (rf & 2) {\n const ctx_r366 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r366.addRowLogicalIndex())(\"logicalColIndex\", 0);\n} }\nfunction TableBodyComponent_ng_template_0_td_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 9);\n} if (rf & 2) {\n const column_r370 = ctx.$implicit;\n const columnIndex_r371 = ctx.index;\n const ctx_r367 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"rowIndex\", 0 - 1)(\"columnIndex\", ctx_r367.lockedColumnsCount + columnIndex_r371)(\"isNew\", true)(\"column\", column_r370)(\"dataItem\", ctx_r367.newDataItem)(\"ngClass\", column_r370.cssClass)(\"ngStyle\", column_r370.style)(\"logicalRowIndex\", ctx_r367.addRowLogicalIndex())(\"logicalColIndex\", ctx_r367.logicalColIndex(column_r370))(\"colSpan\", column_r370.colspan);\n ɵngcc0.ɵɵattribute(\"colspan\", column_r370.colspan);\n} }\nfunction TableBodyComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 3);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_0_ng_template_1_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_ng_template_0_td_2_Template, 1, 2, \"td\", 4);\n ɵngcc0.ɵɵtemplate(3, TableBodyComponent_ng_template_0_td_3_Template, 1, 11, \"td\", 5);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r362 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r362.addRowLogicalIndex())(\"logicalSlaveRow\", ctx_r362.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r362.columns.length)(\"logicalSlaveCellsCount\", ctx_r362.unlockedColumnsCount);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r362.skipGroupDecoration);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r362.detailTemplate == null ? null : ctx_r362.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r362.columns)(\"ngForTrackBy\", ctx_r362.trackByColumns);\n} }\nfunction TableBodyComponent_tr_1_ng_template_2_Template(rf, ctx) { }\nfunction TableBodyComponent_tr_1_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r373 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx_r373.noRecordsText, \" \");\n} }\nconst _c158 = function (a0) { return { templateRef: a0 }; };\nfunction TableBodyComponent_tr_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 10);\n ɵngcc0.ɵɵelementStart(1, \"td\");\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_tr_1_ng_template_2_Template, 0, 0, \"ng-template\", 11);\n ɵngcc0.ɵɵtemplate(3, TableBodyComponent_tr_1_ng_container_3_Template, 2, 1, \"ng-container\", 12);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r363 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"colspan\", ctx_r363.colSpan);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r363.noRecordsTemplate == null ? null : ctx_r363.noRecordsTemplate.templateRef)(\"templateContext\", ɵngcc0.ɵɵpureFunction1(4, _c158, ctx_r363.noRecordsTemplate == null ? null : ctx_r363.noRecordsTemplate.templateRef));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !(ctx_r363.noRecordsTemplate == null ? null : ctx_r363.noRecordsTemplate.templateRef));\n} }\nfunction TableBodyComponent_ng_template_2_tr_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"tr\", 17);\n} if (rf & 2) {\n const ctx_r380 = ɵngcc0.ɵɵnextContext();\n const item_r374 = ctx_r380.$implicit;\n const rowIndex_r375 = ctx_r380.index;\n const ctx_r376 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"columns\", ctx_r376.columns)(\"groups\", ctx_r376.groups)(\"item\", item_r374)(\"hasDetails\", ctx_r376.detailTemplate == null ? null : ctx_r376.detailTemplate.templateRef)(\"skipGroupDecoration\", ctx_r376.skipGroupDecoration)(\"hasGroupHeaderColumn\", ctx_r376.hasGroupHeaderColumn)(\"groupHeaderColumns\", ctx_r376.groupHeaderColumns)(\"rowIndex\", rowIndex_r375 + 1)(\"totalColumnsCount\", ctx_r376.totalColumnsCount)(\"logicalRowIndex\", ctx_r376.logicalRowIndex(rowIndex_r375))(\"logicalSlaveRow\", ctx_r376.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r376.columns.length)(\"logicalSlaveCellsCount\", ctx_r376.groupHeaderSlaveCellsCount);\n} }\nfunction TableBodyComponent_ng_template_2_tr_1_ng_template_1_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 7);\n} }\nfunction TableBodyComponent_ng_template_2_tr_1_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TableBodyComponent_ng_template_2_tr_1_ng_template_1_td_0_Template, 1, 0, \"td\", 6);\n} if (rf & 2) {\n const ctx_r381 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r381.groups);\n} }\nfunction TableBodyComponent_ng_template_2_tr_1_td_2_a_1_Template(rf, ctx) { if (rf & 1) {\n const _r389 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"a\", 23);\n ɵngcc0.ɵɵlistener(\"click\", function TableBodyComponent_ng_template_2_tr_1_td_2_a_1_Template_a_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r389); const item_r374 = ɵngcc0.ɵɵnextContext(3).$implicit; const ctx_r387 = ɵngcc0.ɵɵnextContext(); return ctx_r387.toggleRow(item_r374.index, item_r374.data); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const item_r374 = ɵngcc0.ɵɵnextContext(3).$implicit;\n const ctx_r386 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r386.detailButtonStyles(item_r374));\n ɵngcc0.ɵɵattribute(\"title\", ctx_r386.detailButtonTitle(item_r374));\n} }\nfunction TableBodyComponent_ng_template_2_tr_1_td_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 21);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_1_td_2_a_1_Template, 1, 2, \"a\", 22);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r391 = ɵngcc0.ɵɵnextContext(2);\n const rowIndex_r375 = ctx_r391.index;\n const item_r374 = ctx_r391.$implicit;\n const ctx_r382 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r382.logicalRowIndex(rowIndex_r375))(\"logicalColIndex\", 0)(\"dataRowIndex\", item_r374.index)(\"dataItem\", item_r374.data)(\"detailExpandCell\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r382.detailTemplate.showIf(item_r374.data, item_r374.index));\n} }\nfunction TableBodyComponent_ng_template_2_tr_1_td_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 24);\n} if (rf & 2) {\n const column_r392 = ctx.$implicit;\n const columnIndex_r393 = ctx.index;\n const ctx_r394 = ɵngcc0.ɵɵnextContext(2);\n const item_r374 = ctx_r394.$implicit;\n const rowIndex_r375 = ctx_r394.index;\n const ctx_r383 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"touch-action\", ctx_r383.isSelectable() && ctx_r383.selectable.drag ? \"none\" : \"auto\");\n ɵngcc0.ɵɵclassProp(\"k-grid-edit-cell\", ctx_r383.isEditingCell(item_r374.index, column_r392))(\"k-state-selected\", ctx_r383.isSelectable && ctx_r383.cellSelectionService.isCellSelected(item_r374, column_r392));\n ɵngcc0.ɵɵproperty(\"rowIndex\", item_r374.index)(\"columnIndex\", ctx_r383.lockedColumnsCount + columnIndex_r393)(\"column\", column_r392)(\"dataItem\", item_r374.data)(\"logicalRowIndex\", ctx_r383.logicalRowIndex(rowIndex_r375))(\"logicalColIndex\", ctx_r383.logicalColIndex(column_r392))(\"dataRowIndex\", item_r374.index)(\"dataItem\", item_r374.data)(\"colIndex\", columnIndex_r393)(\"colSpan\", column_r392.colspan)(\"ngClass\", column_r392.cssClass)(\"ngStyle\", column_r392.style);\n ɵngcc0.ɵɵattribute(\"data-kendo-grid-column-index\", ctx_r383.lockedColumnsCount + columnIndex_r393)(\"aria-selected\", ctx_r383.isSelectable() ? ctx_r383.isAriaSelected(item_r374, column_r392) : undefined)(\"colspan\", column_r392.colspan);\n} }\nconst _c159 = function (a0, a1) { return { dataItem: a0, index: a1 }; };\nfunction TableBodyComponent_ng_template_2_tr_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 18);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_1_ng_template_1_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_ng_template_2_tr_1_td_2_Template, 2, 6, \"td\", 19);\n ɵngcc0.ɵɵtemplate(3, TableBodyComponent_ng_template_2_tr_1_td_3_Template, 1, 21, \"td\", 20);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r395 = ɵngcc0.ɵɵnextContext();\n const item_r374 = ctx_r395.$implicit;\n const rowIndex_r375 = ctx_r395.index;\n const ctx_r377 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"k-alt\", ctx_r377.isOdd(item_r374))(\"k-master-row\", ctx_r377.detailTemplate == null ? null : ctx_r377.detailTemplate.templateRef)(\"k-grid-edit-row\", ctx_r377.isEditingRow(item_r374.index))(\"k-state-selected\", ctx_r377.isSelectable() && ctx_r377.isRowSelected(item_r374));\n ɵngcc0.ɵɵproperty(\"dataRowIndex\", item_r374.index)(\"dataItem\", item_r374.data)(\"logicalRowIndex\", ctx_r377.logicalRowIndex(rowIndex_r375))(\"logicalSlaveRow\", ctx_r377.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r377.columns.length)(\"logicalSlaveCellsCount\", ctx_r377.unlockedColumnsCount)(\"ngClass\", ctx_r377.rowClass(ɵngcc0.ɵɵpureFunction2(20, _c159, item_r374.data, item_r374.index)));\n ɵngcc0.ɵɵattribute(\"data-kendo-grid-item-index\", item_r374.index);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r377.skipGroupDecoration);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r377.detailTemplate == null ? null : ctx_r377.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r377.columns)(\"ngForTrackBy\", ctx_r377.trackByColumns);\n} }\nfunction TableBodyComponent_ng_template_2_tr_2_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 30);\n} }\nfunction TableBodyComponent_ng_template_2_tr_2_ng_template_4_Template(rf, ctx) { }\nconst _c160 = function (a0, a1, a2) { return { dataItem: a0, rowIndex: a1, $implicit: a2 }; };\nfunction TableBodyComponent_ng_template_2_tr_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 25);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_2_td_1_Template, 1, 0, \"td\", 26);\n ɵngcc0.ɵɵelement(2, \"td\", 27);\n ɵngcc0.ɵɵelementStart(3, \"td\", 28);\n ɵngcc0.ɵɵtemplate(4, TableBodyComponent_ng_template_2_tr_2_ng_template_4_Template, 0, 0, \"ng-template\", 29);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r399 = ɵngcc0.ɵɵnextContext();\n const item_r374 = ctx_r399.$implicit;\n const rowIndex_r375 = ctx_r399.index;\n const ctx_r378 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"k-alt\", ctx_r378.isOdd(item_r374));\n ɵngcc0.ɵɵproperty(\"dataRowIndex\", item_r374.index)(\"dataItem\", item_r374.data)(\"logicalRowIndex\", ctx_r378.logicalRowIndex(rowIndex_r375) + 1)(\"logicalSlaveRow\", false)(\"logicalCellsCount\", 1);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r378.groups);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r378.logicalRowIndex(rowIndex_r375) + 1)(\"logicalColIndex\", 0)(\"dataRowIndex\", item_r374.index)(\"dataItem\", item_r374.data)(\"colIndex\", 0)(\"colSpan\", ctx_r378.allColumnsSpan + 1);\n ɵngcc0.ɵɵattribute(\"colspan\", ctx_r378.columnsSpan);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r378.detailTemplate.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction3(17, _c160, item_r374.data, item_r374.index, item_r374.data));\n} }\nfunction TableBodyComponent_ng_template_2_tr_3_ng_template_1_td_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 30);\n} }\nfunction TableBodyComponent_ng_template_2_tr_3_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TableBodyComponent_ng_template_2_tr_3_ng_template_1_td_0_Template, 1, 0, \"td\", 26);\n} if (rf & 2) {\n const ctx_r400 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r400.groups);\n} }\nfunction TableBodyComponent_ng_template_2_tr_3_td_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 8);\n} if (rf & 2) {\n const rowIndex_r375 = ɵngcc0.ɵɵnextContext(2).index;\n const ctx_r401 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r401.logicalRowIndex(rowIndex_r375))(\"logicalColIndex\", 0);\n} }\nfunction TableBodyComponent_ng_template_2_tr_3_td_3_ng_template_1_Template(rf, ctx) { }\nconst _c161 = function (a0, a1, a2, a3, a4, a5) { return { templateRef: a0, group: a1, field: a2, column: a3, aggregates: a4, $implicit: a5 }; };\nfunction TableBodyComponent_ng_template_2_tr_3_td_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 33);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_3_td_3_ng_template_1_Template, 0, 0, \"ng-template\", 34);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const column_r406 = ctx.$implicit;\n const ctx_r409 = ɵngcc0.ɵɵnextContext(2);\n const rowIndex_r375 = ctx_r409.index;\n const item_r374 = ctx_r409.$implicit;\n const ctx_r402 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r402.logicalRowIndex(rowIndex_r375))(\"logicalColIndex\", ctx_r402.logicalColIndex(column_r406));\n ɵngcc0.ɵɵattribute(\"data-skip\", ctx_r402.skipGroupDecoration);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction6(4, _c161, column_r406.groupFooterTemplateRef, item_r374.data, column_r406.field, column_r406, item_r374.data == null ? null : item_r374.data.aggregates, item_r374.data == null ? null : item_r374.data.aggregates));\n} }\nfunction TableBodyComponent_ng_template_2_tr_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 31);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_3_ng_template_1_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_ng_template_2_tr_3_td_2_Template, 1, 2, \"td\", 4);\n ɵngcc0.ɵɵtemplate(3, TableBodyComponent_ng_template_2_tr_3_td_3_Template, 2, 11, \"td\", 32);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const rowIndex_r375 = ɵngcc0.ɵɵnextContext().index;\n const ctx_r379 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r379.logicalRowIndex(rowIndex_r375))(\"logicalSlaveRow\", ctx_r379.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r379.columns.length)(\"logicalSlaveCellsCount\", ctx_r379.unlockedColumnsCount);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r379.skipGroupDecoration);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r379.detailTemplate == null ? null : ctx_r379.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r379.footerColumns)(\"ngForTrackBy\", ctx_r379.trackByColumns);\n} }\nfunction TableBodyComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TableBodyComponent_ng_template_2_tr_0_Template, 1, 13, \"tr\", 13);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_ng_template_2_tr_1_Template, 4, 23, \"tr\", 14);\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_ng_template_2_tr_2_Template, 5, 21, \"tr\", 15);\n ɵngcc0.ɵɵtemplate(3, TableBodyComponent_ng_template_2_tr_3_Template, 4, 8, \"tr\", 16);\n} if (rf & 2) {\n const item_r374 = ctx.$implicit;\n const ctx_r364 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r364.isGroup(item_r374) && ctx_r364.isParentGroupExpanded(item_r374) && ctx_r364.showGroupHeader(item_r374));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r364.isDataItem(item_r374) && ctx_r364.isInExpandedGroup(item_r374));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r364.isDataItem(item_r374) && ctx_r364.isInExpandedGroup(item_r374) && (ctx_r364.detailTemplate == null ? null : ctx_r364.detailTemplate.templateRef) && ctx_r364.detailTemplate.showIf(item_r374.data, item_r374.index) && ctx_r364.isExpanded(item_r374));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r364.isFooter(item_r374) && (ctx_r364.isInExpandedGroup(item_r374) || ctx_r364.showGroupFooters && ctx_r364.isParentGroupExpanded(item_r374)) && !item_r374.data.hideFooter);\n} }\nconst _c162 = [\"kendoGridCell\", \"\"];\nfunction CellComponent_ng_container_1_ng_template_1_Template(rf, ctx) { }\nfunction CellComponent_ng_container_1_ng_template_2_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n ɵngcc0.ɵɵpipe(1, \"valueOf\");\n} if (rf & 2) {\n const childColumn_r418 = ctx.$implicit;\n const ctx_r417 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ɵngcc0.ɵɵpipeBind3(1, 1, ctx_r417.dataItem, childColumn_r418.field, childColumn_r418.format), \" \");\n} }\nfunction CellComponent_ng_container_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, CellComponent_ng_container_1_ng_template_2_ng_template_0_Template, 2, 5, \"ng-template\", 4);\n} if (rf & 2) {\n const ctx_r414 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r414.childColumns);\n} }\nfunction CellComponent_ng_container_1_ng_template_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n ɵngcc0.ɵɵpipe(1, \"valueOf\");\n} if (rf & 2) {\n const ctx_r415 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵtextInterpolate(ɵngcc0.ɵɵpipeBind3(1, 1, ctx_r415.dataItem, ctx_r415.column.field, ctx_r415.column.format));\n} }\nfunction CellComponent_ng_container_1_ng_template_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"input\", 5);\n ɵngcc0.ɵɵelement(1, \"label\", 6);\n} if (rf & 2) {\n const ctx_r416 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"kendoGridSelectionCheckbox\", ctx_r416.rowIndex);\n ɵngcc0.ɵɵattribute(\"id\", ctx_r416.selectionCheckboxId);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"for\", ctx_r416.selectionCheckboxId);\n} }\nfunction CellComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, CellComponent_ng_container_1_ng_template_1_Template, 0, 0, \"ng-template\", 2);\n ɵngcc0.ɵɵtemplate(2, CellComponent_ng_container_1_ng_template_2_Template, 1, 1, \"ng-template\", 3);\n ɵngcc0.ɵɵtemplate(3, CellComponent_ng_container_1_ng_template_3_Template, 2, 5, \"ng-template\", 3);\n ɵngcc0.ɵɵtemplate(4, CellComponent_ng_container_1_ng_template_4_Template, 2, 3, \"ng-template\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r411 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r411.column.templateRef)(\"ngTemplateOutlet\", ctx_r411.column.templateRef)(\"ngTemplateOutletContext\", ctx_r411.templateContext);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r411.isSpanColumn);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r411.isBoundColumn);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r411.isCheckboxColumn && !ctx_r411.isNew);\n} }\nfunction CellComponent_ng_container_2_1_ng_template_0_Template(rf, ctx) { }\nfunction CellComponent_ng_container_2_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, CellComponent_ng_container_2_1_ng_template_0_Template, 0, 0, \"ng-template\", 9);\n} if (rf & 2) {\n const ctx_r419 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r419.column.editTemplateRef)(\"ngTemplateOutletContext\", ctx_r419.editTemplateContext);\n} }\nfunction CellComponent_ng_container_2_ng_container_2_kendo_numerictextbox_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-numerictextbox\", 13);\n} if (rf & 2) {\n const ctx_r422 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"format\", ctx_r422.format)(\"formControl\", ctx_r422.formGroup.get(ctx_r422.column.field));\n} }\nfunction CellComponent_ng_container_2_ng_container_2_kendo_datepicker_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-datepicker\", 13);\n} if (rf & 2) {\n const ctx_r423 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"format\", ctx_r423.format)(\"formControl\", ctx_r423.formGroup.get(ctx_r423.column.field));\n} }\nfunction CellComponent_ng_container_2_ng_container_2_input_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"input\", 14);\n} if (rf & 2) {\n const ctx_r424 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"formControl\", ctx_r424.formGroup.get(ctx_r424.column.field));\n} }\nfunction CellComponent_ng_container_2_ng_container_2_input_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"input\", 15);\n} if (rf & 2) {\n const ctx_r425 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"formControl\", ctx_r425.formGroup.get(ctx_r425.column.field));\n} }\nfunction CellComponent_ng_container_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵtemplate(1, CellComponent_ng_container_2_ng_container_2_kendo_numerictextbox_1_Template, 1, 2, \"kendo-numerictextbox\", 10);\n ɵngcc0.ɵɵtemplate(2, CellComponent_ng_container_2_ng_container_2_kendo_datepicker_2_Template, 1, 2, \"kendo-datepicker\", 10);\n ɵngcc0.ɵɵtemplate(3, CellComponent_ng_container_2_ng_container_2_input_3_Template, 1, 1, \"input\", 11);\n ɵngcc0.ɵɵtemplate(4, CellComponent_ng_container_2_ng_container_2_input_4_Template, 1, 1, \"input\", 12);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r420 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx_r420.column.editor);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"numeric\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"date\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"boolean\");\n} }\nfunction CellComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, CellComponent_ng_container_2_1_Template, 1, 2, undefined, 7);\n ɵngcc0.ɵɵtemplate(2, CellComponent_ng_container_2_ng_container_2_Template, 5, 4, \"ng-container\", 8);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r412 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r412.column.editTemplateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r412.column.editTemplateRef);\n} }\nconst _c163 = [\"kendoGridFooter\", \"\"];\nfunction FooterComponent_ng_template_0_td_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 5);\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-group-cell\", true);\n} }\nfunction FooterComponent_ng_template_0_td_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"td\", 5);\n} if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-hierarchy-cell\", true);\n} }\nfunction FooterComponent_ng_template_0_td_3_ng_template_1_Template(rf, ctx) { }\nfunction FooterComponent_ng_template_0_td_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"td\", 6);\n ɵngcc0.ɵɵtemplate(1, FooterComponent_ng_template_0_td_3_ng_template_1_Template, 0, 0, \"ng-template\", 7);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const column_r431 = ctx.$implicit;\n const columnIndex_r432 = ctx.index;\n const ctx_r429 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r429.logicalRowIndex)(\"logicalColIndex\", ctx_r429.logicalColumnIndex(column_r431))(\"ngClass\", column_r431.footerClass)(\"ngStyle\", column_r431.footerStyle);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"templateContext\", ɵngcc0.ɵɵpureFunction4(5, _c151, column_r431.footerTemplateRef, ctx_r429.lockedColumnsCount + columnIndex_r432, column_r431, column_r431));\n} }\nfunction FooterComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"tr\", 1);\n ɵngcc0.ɵɵtemplate(1, FooterComponent_ng_template_0_td_1_Template, 1, 2, \"td\", 2);\n ɵngcc0.ɵɵtemplate(2, FooterComponent_ng_template_0_td_2_Template, 1, 2, \"td\", 3);\n ɵngcc0.ɵɵtemplate(3, FooterComponent_ng_template_0_td_3_Template, 2, 10, \"td\", 4);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r426 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"k-footer-template\", true);\n ɵngcc0.ɵɵproperty(\"logicalRowIndex\", ctx_r426.logicalRowIndex)(\"logicalSlaveRow\", ctx_r426.lockedColumnsCount > 0)(\"logicalCellsCount\", ctx_r426.columns.length)(\"logicalSlaveCellsCount\", ctx_r426.columns.length - ctx_r426.lockedColumnsCount);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r426.groups);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r426.detailTemplate == null ? null : ctx_r426.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r426.columnsToRender);\n} }\nfunction ToolbarComponent_0_ng_template_0_Template(rf, ctx) { }\nfunction ToolbarComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ToolbarComponent_0_ng_template_0_Template, 0, 0, \"ng-template\", 1);\n} if (rf & 2) {\n const ctx_r434 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r434.toolbarTemplateRef)(\"ngTemplateOutletContext\", ctx_r434.context);\n} }\nclass DomEventsService {\n constructor() {\n this.cellClick = new EventEmitter();\n this.cellMousedown = new EventEmitter();\n this.cellMouseup = new EventEmitter();\n this.click = new EventEmitter();\n this.keydown = new EventEmitter();\n this.focus = new EventEmitter();\n this.focusIn = new EventEmitter();\n this.focusOut = new EventEmitter();\n this.windowBlur = new EventEmitter();\n }\n}\nDomEventsService.ɵfac = function DomEventsService_Factory(t) { return new (t || DomEventsService)(); };\nDomEventsService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DomEventsService, factory: DomEventsService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DomEventsService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst EMPTY_REGEX = /^\\s*$/;\n/**\n * @hidden\n */\nconst isPresent = (value) => value !== null && value !== undefined;\n/**\n * @hidden\n */\nconst isBlank = (value) => value === null || value === undefined;\n/**\n * @hidden\n */\nconst isArray = (value) => Array.isArray(value);\n/**\n * @hidden\n */\nconst isTruthy = (value) => !!value;\n/**\n * @hidden\n */\nconst isNullOrEmptyString = (value) => isBlank(value) || EMPTY_REGEX.test(value);\n/**\n * @hidden\n */\nconst observe = (list) => merge(of(list), list.changes);\n/**\n * @hidden\n */\nconst isUniversal = () => typeof document === 'undefined';\n/**\n * @hidden\n */\nconst isString = (value) => typeof value === 'string';\n/**\n * @hidden\n */\nconst isNumber = (value) => typeof value === \"number\" && !isNaN(value);\n/**\n * @hidden\n */\nconst extractFormat = (format) => {\n if (isString(format) && !isNullOrEmptyString(format) && format.startsWith('{0:')) {\n return format.slice(3, format.length - 1);\n }\n return format;\n};\n/**\n * @hidden\n */\nconst not = (fn) => (...args) => !fn.apply(null, args);\n/**\n * @hidden\n */\nconst or = (...conditions) => (value) => conditions.reduce((acc, x) => acc || x(value), false);\n/**\n * @hidden\n */\nconst and = (...conditions) => (value) => conditions.reduce((acc, x) => acc && x(value), true);\n/**\n * @hidden\n */\nconst Skip = new InjectionToken(\"Skip\"); // tslint:disable-line:variable-name\n/**\n * @hidden\n */\nconst createPromise = () => {\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = (data) => {\n resolve(data);\n return promise;\n };\n rejectFn = (data) => {\n reject(data);\n return promise;\n };\n });\n promise.resolve = resolveFn;\n promise.reject = rejectFn;\n return promise;\n};\n/** @hidden */\nconst iterator = getIterator();\n// TODO: Move to kendo-common\nfunction getIterator() {\n if (typeof Symbol === 'function' && Symbol.iterator) {\n return Symbol.iterator;\n }\n const keys = Object.getOwnPropertyNames(Map.prototype);\n const proto = Map.prototype;\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n if (key !== 'entries' && key !== 'size' && proto[key] === proto.entries) {\n return key;\n }\n }\n}\nconst FRAME_DURATION = 1000 / 60;\nconst wnd = typeof window !== 'undefined' ? window : {};\n/** @hidden */\nconst requestAnimationFrame = wnd.requestAnimationFrame || wnd.msRequestAnimationFrame || (callback => setTimeout(callback, FRAME_DURATION));\n/** @hidden */\nconst cancelAnimationFrame = wnd.cancelAnimationFrame || wnd.msCancelRequestAnimationFrame || clearTimeout;\n/**\n * @hidden\n */\nconst detectIE = () => {\n if (!isDocumentAvailable()) {\n return;\n }\n const ua = window.navigator.userAgent;\n const msie = ua.indexOf('MSIE ');\n const trident = ua.indexOf('Trident/');\n return msie > 0 || trident > 0;\n};\n\n/**\n * @hidden\n */\nclass LocalDataChangesService {\n constructor() {\n this.changes = new EventEmitter();\n }\n}\nLocalDataChangesService.ɵfac = function LocalDataChangesService_Factory(t) { return new (t || LocalDataChangesService)(); };\nLocalDataChangesService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: LocalDataChangesService, factory: LocalDataChangesService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalDataChangesService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass FocusRoot {\n constructor() {\n this.groups = new Set();\n }\n registerGroup(group) {\n if (this.alive) {\n this.groups.add(group);\n }\n }\n unregisterGroup(group) {\n if (this.alive) {\n this.groups.delete(group);\n }\n }\n activate() {\n if (this.alive) {\n this.groups.forEach(f => f.activate());\n }\n }\n deactivate() {\n if (this.alive) {\n this.groups.forEach(f => f.deactivate());\n }\n }\n}\nFocusRoot.ɵfac = function FocusRoot_Factory(t) { return new (t || FocusRoot)(); };\nFocusRoot.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: FocusRoot, factory: FocusRoot.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FocusRoot, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst focusableRegex = /^(?:a|input|select|option|textarea|button|object)$/i;\nconst NODE_NAME_PREDICATES = {};\nconst toClassList = (classNames) => String(classNames).trim().split(' ');\n/**\n * @hidden\n */\nconst hasClasses = (element, classNames) => {\n const namesList = toClassList(classNames);\n return Boolean(toClassList(element.className).find((className) => namesList.indexOf(className) >= 0));\n};\n/**\n * @hidden\n */\nconst matchesClasses = (classNames) => (element) => hasClasses(element, classNames);\n/**\n * @hidden\n */\nconst matchesNodeName = (nodeName) => {\n if (!NODE_NAME_PREDICATES[nodeName]) {\n NODE_NAME_PREDICATES[nodeName] = (element) => String(element.nodeName).toLowerCase() === nodeName.toLowerCase();\n }\n return NODE_NAME_PREDICATES[nodeName];\n};\n/**\n * @hidden\n */\nconst closest = (node, predicate) => {\n while (node && !predicate(node)) {\n node = node.parentNode;\n }\n return node;\n};\n/**\n * @hidden\n */\nconst closestInScope = (node, predicate, scope) => {\n while (node && node !== scope && !predicate(node)) {\n node = node.parentNode;\n }\n if (node !== scope) {\n return node;\n }\n};\n/**\n * @hidden\n */\nconst contains = (parent, node, matchSelf = false) => {\n const outside = !closest(node, (child) => child === parent);\n if (outside) {\n return false;\n }\n const el = closest(node, (child) => child === node);\n return el && (matchSelf || el !== parent);\n};\n/**\n * @hidden\n */\nconst isVisible = (element) => {\n const rect = element.getBoundingClientRect();\n const hasSize = rect.width > 0 && rect.height > 0;\n const hasPosition = rect.x !== 0 && rect.y !== 0;\n // Elements can have zero size due to styling, but they will still count as visible.\n // For example, the selection checkbox has no size, but is made visible through styling.\n return (hasSize || hasPosition) && window.getComputedStyle(element).visibility !== 'hidden';\n};\n/**\n * @hidden\n */\nconst isFocusable = (element) => {\n if (!element.tagName) {\n return false;\n }\n const tagName = element.tagName.toLowerCase();\n const hasTabIndex = Boolean(element.getAttribute('tabIndex'));\n const focusable = !element.disabled && focusableRegex.test(tagName);\n return focusable || hasTabIndex;\n};\n/**\n * @hidden\n */\nconst isFocusableWithTabKey = (element, checkVisibility = true) => {\n if (!isFocusable(element)) {\n return false;\n }\n const tabIndex = element.getAttribute('tabIndex');\n const visible = !checkVisibility || isVisible(element);\n return visible && tabIndex !== '-1';\n};\n/**\n * @hidden\n */\nconst findElement = (node, predicate, matchSelf = true) => {\n if (!node) {\n return;\n }\n if (matchSelf && predicate(node)) {\n return node;\n }\n node = node.firstChild;\n while (node) {\n if (node.nodeType === 1) {\n const element = findElement(node, predicate);\n if (element) {\n return element;\n }\n }\n node = node.nextSibling;\n }\n};\n/**\n * @hidden\n */\nconst findFocusable = (element, checkVisibility = true) => {\n return findElement(element, (node) => isFocusableWithTabKey(node, checkVisibility));\n};\n/**\n * @hidden\n */\nconst findFocusableChild = (element, checkVisibility = true) => {\n return findElement(element, (node) => isFocusableWithTabKey(node, checkVisibility), false);\n};\n/**\n * @hidden\n */\nfunction rtlScrollPosition(position, element, initial) {\n let result = position;\n if (initial < 0) {\n result = -position;\n }\n else if (initial > 0) {\n result = element.scrollWidth - element.offsetWidth - position;\n }\n return result;\n}\n\nconst isButton = matchesNodeName('button');\nconst isInputTag = matchesNodeName('input');\nconst navigableRegex = /(button|checkbox|color|file|radio|reset|submit)/i;\nconst isNavigableInput = element => isInputTag(element) && navigableRegex.test(element.type);\nconst isNavigable = element => !element.disabled && (isButton(element) || isNavigableInput(element));\n/**\n * @hidden\n */\nclass DefaultFocusableElement {\n constructor(host, renderer) {\n this.renderer = renderer;\n this.element = host.nativeElement;\n this.focusable = findFocusable(this.element, false) || this.element;\n }\n get enabled() {\n return this.focusable && !this.focusable.disabled;\n }\n get visible() {\n return this.focusable && isVisible(this.focusable);\n }\n isNavigable() {\n return this.canFocus() && isNavigable(this.element);\n }\n toggle(active) {\n this.renderer.setAttribute(this.focusable, 'tabIndex', active ? '0' : '-1');\n }\n focus() {\n if (this.focusable) {\n this.focusable.focus();\n }\n }\n canFocus() {\n return this.visible && this.enabled;\n }\n hasFocus() {\n return document.activeElement !== this.element && closest(document.activeElement, e => e === this.element);\n }\n}\n\n/**\n * @hidden\n */\nconst CELL_CONTEXT = new InjectionToken('grid-cell-context');\n/**\n * @hidden\n */\nconst EMPTY_CELL_CONTEXT = {};\n\n/**\n * A directive that controls the way focusable elements receive\n * [focus in a navigable Grid]({% slug keyboard_navigation_grid %}).\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public readonly data: any = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }];\n * }\n * ```\n */\nclass FocusableDirective {\n constructor(cellContext, hostElement, renderer) {\n this.cellContext = cellContext;\n this.hostElement = hostElement;\n this.renderer = renderer;\n this.active = true;\n if (this.cellContext) {\n this.group = this.cellContext.focusGroup;\n }\n if (this.group) {\n this.group.registerElement(this);\n }\n }\n ngAfterViewInit() {\n if (!this.element) {\n this.element = new DefaultFocusableElement(this.hostElement, this.renderer);\n }\n if (this.group) {\n const isActive = this.group.isActive;\n this.toggle(isActive);\n }\n }\n ngOnDestroy() {\n if (this.group) {\n this.group.unregisterElement(this);\n }\n }\n /**\n * @hidden\n */\n toggle(active) {\n if (this.element && active !== this.active) {\n this.active = active;\n this.element.toggle(active);\n }\n }\n /**\n * @hidden\n */\n canFocus() {\n return this.element && this.element.canFocus();\n }\n /**\n * @hidden\n */\n isNavigable() {\n return this.element && this.element.isNavigable();\n }\n /**\n * @hidden\n */\n focus() {\n if (this.element) {\n this.element.focus();\n }\n }\n /**\n * @hidden\n */\n hasFocus() {\n return this.element && this.element.hasFocus();\n }\n /**\n * @hidden\n */\n registerElement(element) {\n this.element = element;\n }\n}\nFocusableDirective.ɵfac = function FocusableDirective_Factory(t) { return new (t || FocusableDirective)(ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT, 12), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nFocusableDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FocusableDirective, selectors: [[\"\", \"kendoGridFocusable\", \"\"], [\"\", \"kendoGridEditCommand\", \"\"], [\"\", \"kendoGridRemoveCommand\", \"\"], [\"\", \"kendoGridSaveCommand\", \"\"], [\"\", \"kendoGridCancelCommand\", \"\"], [\"\", \"kendoGridSelectionCheckbox\", \"\"]] });\n/** @nocollapse */\nFocusableDirective.ctorParameters = () => [\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CELL_CONTEXT,] }, { type: SkipSelf }] },\n { type: ElementRef },\n { type: Renderer2 }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FocusableDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridFocusable]' + `,\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n `\n }]\n }], function () { return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [CELL_CONTEXT]\n }, {\n type: SkipSelf\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }]; }, null); })();\n\n/**\n * @hidden\n */\nclass GridFocusableElement {\n constructor(navigationService) {\n this.navigationService = navigationService;\n }\n focus() {\n this.navigationService.focusCell();\n }\n toggle(active) {\n this.navigationService.toggle(active);\n }\n canFocus() {\n return true;\n }\n hasFocus() {\n return this.navigationService.hasFocus();\n }\n isNavigable() {\n return false;\n }\n}\n\n/**\n * @hidden\n */\nclass NavigationCursor {\n constructor(model) {\n this.model = model;\n this.changes = new Subject();\n this.activeRow = 0;\n this.activeCol = 0;\n this.virtualCol = 0;\n this.virtualRow = 0;\n }\n get row() {\n return this.model.findRow(this.activeRow);\n }\n get cell() {\n const row = this.row;\n if (row) {\n return this.model.findCell(this.activeCol, row);\n }\n }\n get dataRowIndex() {\n const row = this.row;\n if (row) {\n return row.dataRowIndex;\n }\n return -1;\n }\n /**\n * Assumes and announces a new cursor position.\n */\n reset(rowIndex = this.activeRow, colIndex = this.activeCol, force = true) {\n if (this.activate(rowIndex, colIndex, force)) {\n this.virtualRow = rowIndex;\n this.virtualCol = colIndex;\n }\n }\n activate(rowIndex, colIndex, force) {\n if (!force && this.isActiveRange(rowIndex, colIndex)) {\n return false;\n }\n const prevColIndex = this.activeCol;\n const prevRowIndex = this.activeRow;\n this.activeCol = colIndex;\n this.activeRow = rowIndex;\n this.changes.next({\n colIndex,\n prevColIndex,\n prevRowIndex,\n rowIndex\n });\n return true;\n }\n isActiveRange(rowIndex, colIndex) {\n if (this.activeRow !== rowIndex) {\n return false;\n }\n const cell = this.cell;\n const { start, end } = this.model.cellRange(cell);\n return !Boolean(cell) || (start <= colIndex && colIndex <= end);\n }\n /**\n * Assumes a new cursor position without announcing it.\n */\n assume(rowIndex = this.activeRow, colIndex = this.activeCol) {\n this.virtualRow = rowIndex;\n this.virtualCol = colIndex;\n this.activeCol = colIndex;\n this.activeRow = rowIndex;\n }\n /**\n * Announces a current cursor position to subscribers.\n */\n announce() {\n this.changes.next({\n colIndex: this.activeCol,\n prevColIndex: this.activeCol,\n prevRowIndex: this.activeRow,\n rowIndex: this.activeRow\n });\n }\n activateVirtualCell(cell) {\n const rowRange = this.model.rowRange(cell);\n const cellRange = this.model.cellRange(cell);\n const activeCol = this.activeCol;\n const activeRow = this.activeRow;\n if (rowRange.start <= activeRow && activeRow <= rowRange.end &&\n cellRange.start <= activeCol && activeCol <= cellRange.end) {\n this.activeRow = cell.rowIndex;\n this.activeCol = cell.colIndex;\n return true;\n }\n }\n isActive(rowIndex, colIndex) {\n return this.activeCol === colIndex && this.activeRow === rowIndex;\n }\n moveUp(offset = 1) {\n return this.offsetRow(-offset);\n }\n moveDown(offset = 1) {\n return this.offsetRow(offset);\n }\n moveLeft(offset = 1) {\n return this.offsetCol(-offset);\n }\n moveRight(offset = 1) {\n return this.offsetCol(offset);\n }\n lastCellIndex(row) {\n return this.metadata.columns.leafColumnsToRender.length - 1 +\n (this.metadata.hasDetailTemplate && (!row || !row.groupItem) ? 1 : 0);\n }\n offsetCol(offset) {\n const prevRow = this.model.findRow(this.virtualRow);\n const lastIndex = this.lastCellIndex(prevRow);\n const virtualCol = this.virtualCol;\n this.virtualCol = Math.max(0, Math.min(virtualCol + offset, lastIndex));\n let nextColIndex = this.virtualCol;\n let nextRowIndex = this.virtualRow;\n let cell = this.model.findCell(this.virtualCol, prevRow);\n if (!cell && this.metadata.virtualColumns) {\n return this.activate(nextRowIndex, nextColIndex);\n }\n if (cell.colSpan > 1 && cell.colIndex <= virtualCol && virtualCol < cell.colIndex + cell.colSpan) {\n nextColIndex = offset > 0 ? Math.min(cell.colIndex + cell.colSpan, lastIndex) : Math.max(0, cell.colIndex + offset);\n const nextCell = this.model.findCell(nextColIndex, prevRow);\n if (cell !== nextCell) {\n cell = nextCell;\n this.virtualCol = cell.colIndex;\n }\n else {\n this.virtualCol = virtualCol;\n }\n }\n return this.activate(cell.rowIndex, cell.colIndex);\n }\n offsetRow(offset) {\n let nextColIndex = this.virtualCol;\n if (this.metadata && this.metadata.isVirtual) {\n const maxIndex = this.metadata.maxLogicalRowIndex;\n let nextIndex = Math.max(0, Math.min(this.activeRow + offset, maxIndex));\n if (this.metadata.hasDetailTemplate && !this.model.findRow(nextIndex)) {\n nextIndex = offset > 0 ? nextIndex + 1 : nextIndex - 1;\n nextIndex = Math.max(0, Math.min(nextIndex, maxIndex));\n }\n if (this.metadata.hasDetailTemplate && nextIndex === maxIndex) {\n if (this.model.lastRow.index !== maxIndex) {\n // Don't attempt to navigate past the last collapsed row.\n nextIndex--;\n }\n }\n const nextRow = this.model.findRow(nextIndex);\n if (nextRow) {\n // remove duplication\n let cell = this.model.findCell(this.virtualCol, nextRow);\n if (cell.rowIndex <= this.virtualRow && offset > 0 && cell.rowSpan > 1) {\n cell = this.model.findCell(this.virtualCol, this.model.findRow(cell.rowIndex + cell.rowSpan - 1 + offset));\n }\n nextIndex = cell.rowIndex;\n nextColIndex = cell.colIndex;\n }\n this.virtualRow = nextIndex;\n return this.activate(nextIndex, nextColIndex);\n }\n const nextRow = this.model.findRow(this.virtualRow + offset) || this.model.nextRow(this.virtualRow, offset);\n if (!nextRow) {\n return false;\n }\n let cell = this.model.findCell(this.virtualCol, nextRow);\n if (cell && cell.rowIndex <= this.virtualRow && offset > 0 && cell.rowSpan > 1) { // spanned cell go to next\n const nextPos = cell.rowIndex + cell.rowSpan - 1 + offset;\n cell = this.model.findCell(this.virtualCol, this.model.findRow(nextPos));\n }\n if (!cell && this.metadata.virtualColumns) {\n return this.activate(this.virtualRow + offset, this.virtualCol);\n }\n this.virtualRow = cell.rowIndex;\n return this.activate(this.virtualRow, cell.colIndex);\n }\n}\n\n/**\n * @hidden\n */\nclass ItemMap {\n constructor() {\n this.count = 0;\n this.items = {};\n }\n get first() {\n if (this.count > 0) {\n let result;\n this.forEach(item => {\n result = item;\n return true;\n });\n return result;\n }\n }\n get last() {\n if (this.count > 0) {\n const keys = Object.keys(this.items);\n return this.items[keys[keys.length - 1]];\n }\n }\n removeItem(key) {\n if (this.items[key]) {\n delete this.items[key];\n this.count--;\n }\n }\n setItem(key, item) {\n if (!this.items[key]) {\n this.count++;\n }\n this.items[key] = item;\n }\n getItem(key) {\n return this.items[key];\n }\n toArray() {\n const result = [];\n this.forEach(item => {\n result.push(item);\n });\n return result;\n }\n forEach(callback) {\n for (let key in this.items) {\n if (this.items.hasOwnProperty(key) && callback(this.items[key])) {\n return this.items[key];\n }\n }\n }\n find(callback) {\n return this.forEach(callback);\n }\n}\n\n/**\n * @hidden\n *\n * Contains information for the currently rendered rows and cells.\n */\nclass NavigationModel {\n constructor() {\n this.rows = new ItemMap();\n }\n get firstRow() {\n return this.rows.first;\n }\n get lastRow() {\n return this.rows.last;\n }\n registerCell(cell) {\n const row = this.rows.getItem(cell.logicalRowIndex);\n if (!row) {\n return;\n }\n const colIndex = cell.logicalColIndex;\n const modelCell = {\n uid: cell.uid,\n colIndex,\n rowIndex: row.index,\n colSpan: cell.colSpan,\n rowSpan: cell.rowSpan,\n detailExpandCell: cell.detailExpandCell,\n dataItem: row.dataItem,\n dataRowIndex: row.dataRowIndex,\n focusGroup: cell.focusGroup\n };\n row.cells.setItem(colIndex, modelCell);\n if (cell.groupItem) {\n row.groupItem = cell.groupItem;\n }\n return modelCell;\n }\n unregisterCell(index, rowIndex, cell) {\n const row = this.rows.getItem(rowIndex);\n if (row) {\n const match = row.cells.getItem(index);\n if (match && match.uid === cell.uid) {\n row.cells.removeItem(index);\n }\n }\n }\n registerRow(row) {\n const modelRow = {\n uid: row.uid,\n index: row.logicalRowIndex,\n dataItem: row.dataItem,\n dataRowIndex: row.dataRowIndex,\n cells: new ItemMap()\n };\n this.rows.setItem(row.logicalRowIndex, modelRow);\n }\n updateRow(row) {\n const current = this.rows.getItem(row.logicalRowIndex);\n if (current) {\n Object.assign(current, {\n dataItem: row.dataItem,\n dataRowIndex: row.dataRowIndex\n });\n }\n }\n unregisterRow(index, row) {\n const match = this.rows.getItem(index);\n if (match && match.uid === row.uid) {\n this.rows.removeItem(index);\n }\n }\n cellRange(cell) {\n if (cell) {\n const start = cell.colIndex;\n const end = cell.colIndex + (cell.colSpan || 1) - 1;\n return {\n start,\n end\n };\n }\n return {};\n }\n rowRange(cell) {\n if (cell) {\n const start = cell.rowIndex;\n const end = cell.rowIndex + (cell.rowSpan || 1) - 1;\n return {\n start,\n end\n };\n }\n return {};\n }\n nextRow(rowIndex, offset) {\n const rows = this.rows.toArray();\n const row = this.rows.getItem(rowIndex);\n const position = rows.indexOf(row);\n const next = rows[position + offset];\n return next;\n }\n findRow(index) {\n return this.rows.getItem(index);\n }\n findCell(index, row) {\n if (!row) {\n return;\n }\n const rowIndex = row.index;\n let cell = row.cells.getItem(index);\n let currentIndex = rowIndex;\n while (!cell && row) {\n row = this.rows.getItem(currentIndex);\n cell = this.rowCell(index, row);\n currentIndex--;\n }\n if (cell && rowIndex <= row.index + (cell.rowSpan || 1) - 1) {\n return cell;\n }\n }\n rowCell(index, row) {\n if (!row || !row.cells.count) {\n return;\n }\n const firstCell = row.cells.first;\n let cell, currentIndex = index;\n while (!cell && currentIndex >= firstCell.colIndex) {\n cell = row.cells.getItem(currentIndex);\n currentIndex--;\n }\n if (cell && index <= cell.colIndex + (cell.colSpan || 1) - 1) {\n return cell;\n }\n }\n}\n\n/**\n * @hidden\n */\nclass PreventableEvent {\n constructor() {\n this.prevented = false;\n }\n /**\n * Prevents the default action for a specified event.\n * In this way, the source component suppresses\n * the built-in behavior that follows the event.\n */\n preventDefault() {\n this.prevented = true;\n }\n /**\n * Returns `true` if the event was prevented\n * by any of its subscribers.\n *\n * @returns `true` if the default action was prevented.\n * Otherwise, returns `false`.\n */\n isDefaultPrevented() {\n return this.prevented;\n }\n}\n\n/**\n * Arguments for the `cellClose` event.\n */\nclass CellCloseEvent extends PreventableEvent {\n constructor(options) {\n super();\n /**\n * @hidden\n */\n this.action = 'cellClose';\n Object.assign(this, options);\n }\n}\n\n/**\n * @hidden\n */\nconst isEqual = (index) => (item) => item.index === index;\n/**\n * @hidden\n */\nconst isNotEqual = (index) => (item) => item.index !== index;\n/**\n * @hidden\n */\nconst isNewRow = (index) => index === -1 || index === undefined;\n/**\n * @hidden\n */\nclass EditService {\n constructor(ngZone) {\n this.ngZone = ngZone;\n this.changes = new EventEmitter();\n this.editedIndices = [];\n this.keepEditCell = false;\n this.closingCell = false;\n this.changedSource = new Subject();\n this.changed = this.changedSource.asObservable().pipe(switchMap(() => this.ngZone.onStable.asObservable().pipe(take(1))));\n }\n editRow(index, group = undefined) {\n this.editedIndices.push({ index, group });\n this.onChanged();\n }\n addRow(group) {\n this.newItemGroup = { group };\n this.onChanged();\n }\n editCell(rowIndex, column, group) {\n if (isNewRow(rowIndex) || column.editable === false || !(column.editTemplate || column.field)) {\n return;\n }\n this.preventCellClose();\n if (!this.closeCell()) {\n this.editRow(rowIndex, group);\n this.column = column;\n this.onChanged();\n }\n }\n isEditing() {\n return this.editedIndices.length > 0;\n }\n isEditingCell() {\n return this.isEditing() && this.column !== undefined;\n }\n get hasNewItem() {\n return isPresent(this.newItemGroup);\n }\n get newDataItem() {\n if (this.hasNewItem) {\n return this.newItemGroup.group.value;\n }\n return {};\n }\n close(index) {\n if (isNewRow(index)) {\n this.newItemGroup = undefined;\n return;\n }\n this.editedIndices = this.editedIndices.filter(isNotEqual(index));\n delete this.column;\n this.onChanged();\n }\n closeCell(originalEvent) {\n if (this.column && !this.closingCell) {\n return this.ngZone.run(() => {\n const { index, group } = this.editedIndices[0];\n const args = new CellCloseEvent({\n column: this.column,\n formGroup: group,\n originalEvent: originalEvent,\n rowIndex: index\n });\n this.closingCell = true;\n this.changes.emit(args);\n this.closingCell = false;\n if (!args.isDefaultPrevented()) {\n this.cancelCell();\n }\n return args.isDefaultPrevented();\n });\n }\n }\n cancelCell() {\n if (this.column) {\n this.editedIndices = [];\n delete this.column;\n this.onChanged();\n }\n }\n shouldCloseCell() {\n return this.column && !this.keepEditCell;\n }\n preventCellClose() {\n this.ngZone.runOutsideAngular(() => {\n window.clearTimeout(this.keepCellTimeout);\n this.keepEditCell = true;\n this.keepCellTimeout = window.setTimeout(() => {\n this.keepEditCell = false;\n }, 0); // tslint:disable-line:align\n });\n }\n context(index) {\n if (isNewRow(index)) {\n return this.newItemGroup;\n }\n return this.findByIndex(index);\n }\n columnContext(index, column) {\n if (isNewRow(index)) {\n return this.newItemGroup;\n }\n if (!this.column || column === this.column) {\n return this.findByIndex(index);\n }\n }\n isEdited(index) {\n if (isNewRow(index) && isPresent(this.newItemGroup)) {\n return true;\n }\n return !this.column && isPresent(this.findByIndex(index));\n }\n hasEdited(index) {\n return isPresent(this.context(index));\n }\n isEditedColumn(index, column) {\n if (this.column && this.column === column) {\n return isPresent(this.findByIndex(index));\n }\n return false;\n }\n beginEdit(rowIndex) {\n this.changes.emit({ action: 'edit', rowIndex });\n }\n beginAdd() {\n this.changes.emit({ action: 'add' });\n }\n endEdit(rowIndex) {\n const { group: formGroup } = this.context(rowIndex);\n this.changes.emit({ action: 'cancel', rowIndex, formGroup, isNew: isNewRow(rowIndex) });\n }\n save(rowIndex) {\n const { group: formGroup } = this.context(rowIndex);\n this.changes.emit({ action: 'save', rowIndex, formGroup, isNew: isNewRow(rowIndex) });\n }\n remove(rowIndex) {\n this.changes.emit({ action: 'remove', rowIndex });\n }\n findByIndex(index) {\n return this.editedIndices.find(isEqual(index));\n }\n onChanged() {\n this.ngZone.runOutsideAngular(() => {\n this.changedSource.next();\n });\n }\n}\nEditService.ɵfac = function EditService_Factory(t) { return new (t || EditService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nEditService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: EditService, factory: EditService.ɵfac });\n/** @nocollapse */\nEditService.ctorParameters = () => [\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(EditService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * @hidden\n */\nclass ExpandStateService {\n constructor(isInitiallyCollapsed) {\n this.isInitiallyCollapsed = isInitiallyCollapsed;\n this.changes = new Subject();\n this.rowState = new Set();\n }\n toggleRow(index, dataItem) {\n const found = this.rowState.has(index);\n const expand = !this.isInitiallyCollapsed ? found : !found;\n const prevented = this.emitEvent({ dataItem, expand, index });\n if (prevented) {\n return;\n }\n if (found) {\n this.rowState.delete(index);\n }\n else {\n this.rowState.add(index);\n }\n }\n isExpanded(index) {\n const found = this.rowState.has(index);\n return this.isInitiallyCollapsed ? found : !found;\n }\n reset() {\n this.rowState.clear();\n }\n emitEvent(args) {\n this.changes.next(args);\n return false;\n }\n}\n\nconst removeLast = groupIndex => groupIndex.lastIndexOf(\"_\") > -1\n ? groupIndex.slice(0, groupIndex.lastIndexOf(\"_\"))\n : \"\";\nconst isChildIndex = (targetIndex, parentIndex) => parentIndex !== targetIndex && targetIndex.startsWith(parentIndex);\n/**\n * @hidden\n */\nclass GroupsService extends ExpandStateService {\n constructor(isCollapsed = false) {\n super(isCollapsed);\n }\n isInExpandedGroup(groupIndex, skipSelf = true) {\n if (skipSelf) {\n groupIndex = removeLast(groupIndex);\n }\n let expanded = true;\n while (groupIndex && expanded) {\n expanded = this.isExpanded(groupIndex);\n groupIndex = removeLast(groupIndex);\n }\n return expanded;\n }\n expandChildren(parentIndex) {\n this.rowState.forEach(index => isChildIndex(index, parentIndex) && this.rowState.delete(index));\n }\n}\nGroupsService.ɵfac = function GroupsService_Factory(t) { return new (t || GroupsService)(ɵngcc0.ɵɵinject(Skip, 8)); };\nGroupsService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: GroupsService, factory: GroupsService.ɵfac });\n/** @nocollapse */\nGroupsService.ctorParameters = () => [\n { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [Skip,] }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupsService, [{\n type: Injectable\n }], function () { return [{ type: Boolean, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [Skip]\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nclass PagerContextService {\n constructor() {\n this.changes = new Subject();\n this.pageChange = new Subject();\n }\n get currentPage() {\n return this.skip / this.pageSize;\n }\n notifyChanges(changes) {\n this.total = changes.total;\n this.pageSize = changes.pageSize;\n this.skip = changes.skip;\n this.changes.next(changes);\n }\n changePage(page) {\n this.pageChange.next({ skip: page * this.pageSize, take: this.pageSize });\n }\n changePageSize(value) {\n this.pageChange.next({ skip: 0, take: value });\n }\n nextPage() {\n const nextPage = this.currentPage + 1;\n if (nextPage * this.pageSize < this.total) {\n this.changePage(nextPage);\n }\n }\n prevPage() {\n const prevPage = this.currentPage - 1;\n if (prevPage * this.pageSize >= 0) {\n this.changePage(prevPage);\n }\n }\n}\nPagerContextService.ɵfac = function PagerContextService_Factory(t) { return new (t || PagerContextService)(); };\nPagerContextService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: PagerContextService, factory: PagerContextService.ɵfac });\n\n\n/**\n * Arguments for the `detailCollapse` event.\n */\nclass DetailCollapseEvent extends PreventableEvent {\n constructor(args) {\n super();\n Object.assign(this, args);\n }\n}\n\n/**\n * Arguments for the `detailExpand` event.\n */\nclass DetailExpandEvent extends PreventableEvent {\n constructor(args) {\n super();\n Object.assign(this, args);\n }\n}\n\n/**\n * @hidden\n */\nclass DetailsService {\n constructor() {\n this.changes = new Subject();\n this.rowState = new Set();\n }\n ngOnDestroy() {\n this.rowState.clear();\n }\n isExpanded(index, dataItem) {\n if (this.userCallback) {\n return this.userCallback({ index, dataItem });\n }\n return this.rowState.has(index);\n }\n toggleRow(index, dataItem) {\n if (this.isExpanded(index, dataItem)) {\n this.collapseRow(index, dataItem);\n }\n else {\n this.expandRow(index, dataItem);\n }\n }\n expandRow(index, dataItem) {\n const prevented = this.emitEvent({ dataItem, index, expand: true });\n if (!prevented && !this.userCallback) {\n this.rowState.add(index);\n }\n }\n collapseRow(index, dataItem) {\n const prevented = this.emitEvent({ dataItem, index, expand: false });\n if (!prevented && !this.userCallback) {\n this.rowState.delete(index);\n }\n }\n emitEvent(args) {\n const eventArg = new (args.expand ? DetailExpandEvent : DetailCollapseEvent)(args);\n this.changes.next(eventArg);\n return eventArg.isDefaultPrevented();\n }\n}\nDetailsService.ɵfac = function DetailsService_Factory(t) { return new (t || DetailsService)(); };\nDetailsService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DetailsService, factory: DetailsService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DetailsService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass ScrollRequestService {\n constructor() {\n this.requests = new Subject();\n }\n scrollTo(request) {\n this.requests.next(request);\n }\n}\nScrollRequestService.ɵfac = function ScrollRequestService_Factory(t) { return new (t || ScrollRequestService)(); };\nScrollRequestService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ScrollRequestService, factory: ScrollRequestService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ScrollRequestService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst isInSameGrid = (element, gridElement) => closest(element, matchesNodeName('kendo-grid')) === gridElement;\nconst matchHeaderCell = matchesNodeName('th');\nconst matchDataCell = matchesNodeName('td');\nconst matchFooterCell = matchesNodeName('.k-grid-footer td');\nconst matchCell = (element) => matchDataCell(element) || matchHeaderCell(element) || matchFooterCell(element);\nconst gridCell = (element, gridElement) => {\n let target = closest(element, matchCell);\n while (target && !isInSameGrid(target, gridElement)) {\n target = closest(target.parentElement, matchCell);\n }\n return target;\n};\nconst targetCell = (target, gridElement) => {\n const cell = gridCell(target, gridElement);\n const row = closest(cell, matchesNodeName('tr'));\n if (cell && row) {\n let rowIndex = row.getAttribute('aria-rowindex');\n rowIndex = rowIndex ? parseInt(rowIndex, 10) - 1 : null;\n let colIndex = cell.getAttribute('aria-colindex');\n colIndex = colIndex ? parseInt(colIndex, 10) - 1 : null;\n if (rowIndex !== null && colIndex !== null) {\n return { colIndex, rowIndex, element: cell };\n }\n }\n};\nconst isArrowKey = keyCode => keyCode === Keys.ArrowLeft || keyCode === Keys.ArrowRight ||\n keyCode === Keys.ArrowUp || keyCode === Keys.ArrowDown;\nconst isNavigationKey = keyCode => isArrowKey(keyCode) ||\n keyCode === Keys.PageUp || keyCode === Keys.PageDown ||\n keyCode === Keys.Home || keyCode === Keys.End;\nconst isInput = matchesNodeName('input');\nconst isTextInput = element => element && isInput(element) && element.type.toLowerCase() === 'text';\nconst isPrintableCharacter = (str) => str.length === 1 && str.match(/\\S/);\n/**\n * @hidden\n */\nclass NavigationViewport {\n constructor(firstItemIndex, lastItemIndex) {\n this.firstItemIndex = firstItemIndex;\n this.lastItemIndex = lastItemIndex;\n }\n containsRow(dataRowIndex) {\n const headerRow = dataRowIndex < 0;\n return headerRow || (dataRowIndex >= this.firstItemIndex && dataRowIndex <= this.lastItemIndex);\n }\n intersects(start, end) {\n return (start <= this.firstItemIndex && this.lastItemIndex <= end) ||\n (this.firstItemIndex <= start && start <= this.lastItemIndex) ||\n (this.firstItemIndex <= end && end <= this.lastItemIndex);\n }\n}\n/**\n * @hidden\n */\nclass NavigationService {\n constructor(zone, domEvents, pagerContextService, scrollRequestService, groupsService, detailsService, focusRoot, editService, cd, localization, focusableParent) {\n this.zone = zone;\n this.domEvents = domEvents;\n this.pagerContextService = pagerContextService;\n this.scrollRequestService = scrollRequestService;\n this.groupsService = groupsService;\n this.detailsService = detailsService;\n this.focusRoot = focusRoot;\n this.editService = editService;\n this.cd = cd;\n this.localization = localization;\n this.focusableParent = focusableParent;\n this.cellKeydown = new EventEmitter();\n this.activeRowIndex = 0;\n this.alive = false;\n this.active = true;\n this.mode = 0 /* Standby */;\n this.model = new NavigationModel();\n this.cursor = new NavigationCursor(this.model);\n this.changes = this.cursor.changes;\n }\n set metadata(value) {\n this.meta = value;\n this.cursor.metadata = value;\n }\n get metadata() {\n return this.meta;\n }\n get enabled() {\n return this.alive;\n }\n get activeCell() {\n if (this.mode !== 0 /* Standby */) {\n return this.cursor.cell;\n }\n }\n get activeRow() {\n if (this.mode !== 0 /* Standby */) {\n return Object.assign({}, this.cursor.row, {\n cells: this.cursor.row.cells.toArray()\n });\n }\n }\n get activeDataRow() {\n return Math.max(0, this.activeRowIndex - this.meta.headerRows);\n }\n init(meta) {\n this.alive = true;\n this.focusRoot.alive = true;\n this.metadata = meta;\n const onStableSubscriber = (...operators) => (args) => this.zone.isStable ?\n from([true]).pipe(map(() => args)) :\n this.zone.onStable.pipe(take(1), map(() => args), ...operators);\n const onStable = onStableSubscriber();\n this.subs = new Subscription();\n this.subs.add(this.cursor.changes\n .subscribe(args => this.onCursorChanges(args)));\n this.subs.add(this.domEvents.focus.pipe(switchMap(onStable))\n .subscribe((args) => this.navigateTo(args.target)));\n this.subs.add(this.domEvents.focusOut.pipe(filter(() => this.mode !== 0 /* Standby */), switchMap(onStableSubscriber(takeUntil(this.domEvents.focus))))\n .subscribe(args => this.onFocusOut(args)));\n this.subs.add(this.domEvents.windowBlur.pipe(filter(() => this.mode !== 0 /* Standby */))\n .subscribe(() => this.onWindowBlur()));\n this.subs.add(\n // Closing the editor will not always trigger focusout in Firefox.\n // To get around this, we ensure that the cell is closed after editing.\n this.editService.changes.pipe(filter(e => e.action !== 'edit' && this.mode === 2 /* Content */), filter((e) => e.action === 'cellClose' && !e.prevented), switchMap(onStable))\n .subscribe(() => this.leaveCell()));\n this.subs.add(this.pagerContextService.pageChange\n .subscribe(() => this.cursor.reset(0, 0)));\n this.subs.add(this.domEvents.keydown\n .subscribe(args => this.onKeydown(args)));\n this.subs.add(this.domEvents.keydown.pipe(filter(args => args.keyCode === Keys.Tab && this.mode === 2 /* Content */), switchMapTo(this.domEvents.focusOut.pipe(takeUntil(\n // Timeout if focusOut doesn't fire very soon\n interval(0).pipe(take(1))))))\n .subscribe(() => this.onTabout()));\n if (this.focusableParent) {\n const element = new GridFocusableElement(this);\n this.focusableParent.registerElement(element);\n }\n this.deactivateElements();\n }\n ngOnDestroy() {\n if (this.subs) {\n this.subs.unsubscribe();\n }\n this.alive = false;\n }\n registerCell(cell) {\n if (cell.logicalRowIndex !== this.pendingRowIndex) {\n const modelCell = this.model.registerCell(cell);\n if (this.virtualCell && this.cursor.activateVirtualCell(modelCell)) {\n this.virtualCell = false;\n }\n }\n }\n registerCellOnCurrentRow(cell) {\n if (cell.logicalRowIndex === this.pendingRowIndex) {\n this.model.registerCell(cell);\n }\n }\n unregisterCell(index, rowIndex, cell) {\n this.model.unregisterCell(index, rowIndex, cell);\n }\n registerRow(row) {\n this.model.registerRow(row);\n this.pendingRowIndex = row.logicalRowIndex;\n }\n updateRow(row) {\n this.model.updateRow(row);\n }\n unregisterRow(index, row) {\n this.model.unregisterRow(index, row);\n }\n isCellFocusable(cell) {\n return this.alive &&\n this.active &&\n this.mode !== 2 /* Content */ &&\n this.cursor.isActive(cell.logicalRowIndex, cell.logicalColIndex);\n }\n isCellFocused(cell) {\n return this.mode === 1 /* Cursor */ && this.isCellFocusable(cell);\n }\n navigateTo(el) {\n if (!this.alive) {\n return;\n }\n const cell = targetCell(el, this.meta.gridElement.nativeElement);\n if (!cell) {\n return;\n }\n const oldMode = this.mode;\n const focusInCell = contains(cell.element, document.activeElement);\n const focusInActiveRowContent = this.mode === 2 /* Content */ &&\n this.activeRowIndex === cell.rowIndex &&\n el !== cell.element;\n if (focusInCell) {\n this.mode = 2 /* Content */;\n this.cursor.reset(cell.rowIndex, cell.colIndex);\n this.activateRow();\n }\n else if (!focusInActiveRowContent) {\n this.mode = 1 /* Cursor */;\n this.deactivateElements();\n const alreadyActive = this.cursor.isActive(cell.rowIndex, cell.colIndex);\n const isCursor = oldMode === 1 /* Cursor */ && alreadyActive;\n if (!isCursor) {\n this.cursor.reset(cell.rowIndex, cell.colIndex);\n }\n }\n }\n tryFocus(el) {\n this.activateElements();\n const focusable = findFocusableChild(el);\n if (focusable) {\n const cell = targetCell(focusable, this.meta.gridElement.nativeElement);\n if (cell) {\n this.cursor.reset(cell.rowIndex, cell.colIndex);\n this.deactivateElements();\n this.enterCell();\n }\n focusable.focus();\n }\n else {\n this.deactivateElements();\n }\n return !!focusable;\n }\n needsViewport() {\n return this.meta && this.meta.isVirtual;\n }\n setViewport(firstItemIndex, lastItemIndex) {\n this.viewport = new NavigationViewport(firstItemIndex, lastItemIndex);\n if (this.meta && this.meta.isVirtual && this.activeDataRow > -1) {\n const dataRowIndex = this.activeDataRow;\n const ahead = firstItemIndex - dataRowIndex;\n const behind = dataRowIndex - lastItemIndex;\n if (ahead > 0) {\n this.cursor.reset(firstItemIndex + this.meta.headerRows);\n }\n else if (behind > 0) {\n this.cursor.reset(lastItemIndex - this.meta.headerRows);\n }\n }\n }\n setColumnViewport(firstItemIndex, lastItemIndex) {\n this.columnViewport = new NavigationViewport(firstItemIndex, lastItemIndex);\n }\n focusCell(rowIndex = undefined, colIndex = undefined) {\n this.mode = 1 /* Cursor */;\n this.cursor.reset(rowIndex, colIndex);\n return this.activeCell;\n }\n focusCellByElement(el) {\n const cell = targetCell(el, this.meta.gridElement.nativeElement);\n if (cell) {\n return this.focusCell(cell.rowIndex, cell.colIndex);\n }\n }\n focusNextCell(wrap = true) {\n return this.focusAdjacentCell(true, wrap);\n }\n focusPrevCell(wrap = true) {\n return this.focusAdjacentCell(false, wrap);\n }\n toggle(active) {\n this.active = active;\n this.cursor.announce();\n }\n hasFocus() {\n return this.mode === 1 /* Cursor */ || this.mode === 2 /* Content */;\n }\n autoFocusCell(start, end) {\n return !this.meta.virtualColumns || end < this.meta.columns.lockedLeafColumns.length || this.columnViewport.intersects(start, end);\n }\n focusAdjacentCell(fwd, wrap) {\n this.focusCell();\n let success = fwd ? this.moveCursorFwd() : this.moveCursorBwd();\n if (wrap && !success) {\n success = fwd ? this.cursor.moveDown(1) : this.cursor.moveUp(1);\n if (success) {\n const row = this.cursor.row;\n const colIdx = fwd ? 0 : this.cursor.lastCellIndex(row);\n this.cursor.reset(row.index, colIdx);\n }\n }\n if (success) {\n return this.activeCell;\n }\n else {\n this.mode = 0 /* Standby */;\n this.cursor.announce();\n }\n return null;\n }\n enterCell() {\n const cell = this.cursor.cell;\n if (!cell) {\n return;\n }\n const group = cell.focusGroup;\n const focusable = group && group.canFocus();\n this.mode = focusable ? 2 /* Content */ : 1 /* Cursor */;\n this.cursor.announce();\n if (focusable) {\n this.activateRow();\n group.focus();\n }\n }\n leaveCell() {\n const cell = this.cursor.cell;\n if (!cell) {\n return;\n }\n const group = cell.focusGroup;\n const focusable = group && group.canFocus();\n if (!focusable) {\n this.deactivateElements();\n }\n this.mode = 1 /* Cursor */;\n this.cursor.announce();\n }\n activateElements() {\n this.focusRoot.activate();\n }\n deactivateElements() {\n this.focusRoot.deactivate();\n }\n activateRow() {\n this.cursor.row.cells\n .forEach(cell => cell.focusGroup && cell.focusGroup.activate());\n }\n moveCursorFwd() {\n return this.localization.rtl ? this.cursor.moveLeft() : this.cursor.moveRight();\n }\n moveCursorBwd() {\n return this.localization.rtl ? this.cursor.moveRight() : this.cursor.moveLeft();\n }\n onCursorKeydown(args) {\n let preventDefault = false;\n const modifier = args.ctrlKey || args.metaKey;\n const step = modifier ? 5 : 1;\n if (!this.onCellKeydown(args)) {\n return;\n }\n const row = this.cursor.row;\n switch (args.keyCode) {\n case Keys.ArrowDown:\n preventDefault = this.cursor.moveDown(step);\n break;\n case Keys.ArrowUp:\n preventDefault = this.cursor.moveUp(step);\n break;\n case Keys.ArrowRight:\n preventDefault = this.moveCursorFwd();\n break;\n case Keys.ArrowLeft:\n preventDefault = this.moveCursorBwd();\n break;\n case Keys.PageDown:\n if (this.metadata.isVirtual && this.viewport) {\n let nextItemIndex = this.meta.headerRows + this.viewport.lastItemIndex + 1;\n if (this.metadata.hasDetailTemplate) {\n nextItemIndex++;\n }\n nextItemIndex = Math.min(this.meta.maxLogicalRowIndex, nextItemIndex);\n this.cursor.reset(nextItemIndex);\n preventDefault = true;\n }\n else if (this.metadata.hasPager) {\n this.zone.run(() => this.pagerContextService.nextPage());\n preventDefault = true;\n }\n break;\n case Keys.PageUp:\n if (this.metadata.isVirtual && this.viewport) {\n let viewportSize = this.viewport.lastItemIndex - this.viewport.firstItemIndex;\n let firstItemIndex = this.viewport.firstItemIndex;\n let nextItemIndex = Math.max(this.meta.headerRows, firstItemIndex - viewportSize - 1);\n this.cursor.reset(nextItemIndex);\n preventDefault = true;\n }\n else if (this.metadata.hasPager) {\n this.zone.run(() => this.pagerContextService.prevPage());\n preventDefault = true;\n }\n break;\n case Keys.Home:\n if (modifier) {\n if (this.meta.isVirtual) {\n this.cursor.reset(this.meta.headerRows, 0, false);\n }\n else {\n this.cursor.reset(this.model.firstRow.index, 0, false);\n }\n }\n else {\n this.cursor.reset(row.index, 0, false);\n }\n preventDefault = true;\n break;\n case Keys.End:\n if (modifier) {\n if (this.meta.isVirtual) {\n let lastRowIndex = this.meta.maxLogicalRowIndex;\n if (this.meta.hasDetailTemplate) {\n lastRowIndex--;\n }\n this.cursor.reset(lastRowIndex, this.cursor.lastCellIndex(), false);\n }\n else {\n this.cursor.reset(this.model.lastRow.index, this.cursor.lastCellIndex(this.model.lastRow), false);\n }\n }\n else {\n const lastIndex = this.cursor.lastCellIndex(row);\n const cell = this.model.findCell(lastIndex, row);\n if (cell) {\n this.cursor.reset(cell.rowIndex, cell.colIndex);\n }\n else {\n this.cursor.reset(row.index, lastIndex);\n }\n }\n preventDefault = true;\n break;\n case Keys.Enter:\n case Keys.F2:\n const groupItem = row.groupItem;\n if (groupItem) {\n this.zone.run(() => this.groupsService.toggleRow(groupItem.index, groupItem.data));\n }\n else if (this.cursor.cell.detailExpandCell) {\n this.zone.run(() => this.detailsService.toggleRow(row.dataRowIndex, row.dataItem));\n }\n else {\n this.enterCell();\n if (!this.cursor.cell.focusGroup.isNavigable()) {\n preventDefault = true;\n }\n }\n break;\n default:\n if (!args.ctrlKey && !args.altKey && isPrintableCharacter(args.key)) {\n this.enterCell();\n }\n }\n if (preventDefault) {\n args.preventDefault();\n }\n }\n onContentKeydown(args) {\n if (!this.onCellKeydown(args)) {\n return;\n }\n const confirm = !args.defaultPrevented && args.keyCode === Keys.Enter && isTextInput(args.srcElement);\n if (args.keyCode === Keys.Escape || args.keyCode === Keys.F2 || confirm) {\n this.leaveCell();\n this.cursor.reset();\n args.stopPropagation();\n }\n else if (isNavigationKey(args.keyCode) && this.cursor.cell.focusGroup.isNavigable()) {\n this.onCursorKeydown(args);\n if (args.defaultPrevented) {\n this.leaveCell();\n }\n }\n }\n onCellKeydown(args) {\n if (this.editService.isEditingCell()) {\n const confirm = args.keyCode === Keys.Enter;\n const cancel = args.keyCode === Keys.Escape;\n const navigate = isNavigationKey(args.keyCode);\n if (confirm) {\n this.editService.closeCell(args);\n }\n else if (cancel) {\n this.editService.cancelCell();\n this.cd.detectChanges();\n }\n else if (navigate) {\n return false;\n }\n }\n this.cellKeydown.emit(args);\n return true;\n }\n onCursorChanges(args) {\n this.activeRowIndex = args.rowIndex;\n const dataRowIndex = this.activeDataRow;\n if (this.meta && (this.meta.isVirtual && this.viewport &&\n !this.viewport.containsRow(dataRowIndex) && dataRowIndex > -1)) {\n this.scrollRequestService.scrollTo({ row: dataRowIndex });\n }\n if (this.meta.virtualColumns && args.colIndex >= this.meta.columns.lockedLeafColumns.length) {\n const cell = this.activeCell;\n const { start, end } = this.model.cellRange(cell);\n if (!cell) {\n this.virtualCell = true;\n }\n if ((!cell && this.mode !== 0 /* Standby */) || (cell && !this.columnViewport.intersects(start, end))) {\n this.scrollRequestService.scrollTo({ column: args.colIndex - (this.metadata.hasDetailTemplate ? 1 : 0) });\n }\n }\n }\n onFocusOut(args) {\n if (isVisible(args.target)) {\n this.mode = 0 /* Standby */;\n }\n else {\n // Focused target is no longer visible,\n // reset to cursor mode and recapture focus.\n this.mode = 1 /* Cursor */;\n }\n this.deactivateElements();\n this.cursor.announce();\n }\n onWindowBlur() {\n this.mode = 0 /* Standby */;\n this.deactivateElements();\n this.cursor.announce();\n }\n onKeydown(args) {\n if (this.mode === 1 /* Cursor */) {\n this.onCursorKeydown(args);\n }\n else if (this.mode === 2 /* Content */) {\n this.onContentKeydown(args);\n }\n }\n onTabout() {\n // Tabbed out of the last focusable content element\n // reset to cursor mode and recapture focus.\n if (this.cursor.cell.focusGroup.isNavigable()) {\n // Unless the cell has a single focusable element,\n // otherwise we'd return to Content mode and enter an endless loop\n return;\n }\n this.leaveCell();\n this.cursor.reset();\n }\n}\nNavigationService.ɵfac = function NavigationService_Factory(t) { return new (t || NavigationService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(DomEventsService), ɵngcc0.ɵɵinject(PagerContextService), ɵngcc0.ɵɵinject(ScrollRequestService), ɵngcc0.ɵɵinject(GroupsService), ɵngcc0.ɵɵinject(DetailsService), ɵngcc0.ɵɵinject(FocusRoot), ɵngcc0.ɵɵinject(EditService), ɵngcc0.ɵɵinject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵinject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵinject(FocusableDirective, 8)); };\nNavigationService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: NavigationService, factory: NavigationService.ɵfac });\n/** @nocollapse */\nNavigationService.ctorParameters = () => [\n { type: NgZone },\n { type: DomEventsService },\n { type: PagerContextService },\n { type: ScrollRequestService },\n { type: GroupsService },\n { type: DetailsService },\n { type: FocusRoot },\n { type: EditService },\n { type: ChangeDetectorRef },\n { type: LocalizationService },\n { type: FocusableDirective, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NavigationService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }, { type: DomEventsService }, { type: PagerContextService }, { type: ScrollRequestService }, { type: GroupsService }, { type: DetailsService }, { type: FocusRoot }, { type: EditService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.LocalizationService }, { type: FocusableDirective, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nclass SelectionService {\n constructor(domEvents, localDataChangesService, navigationService) {\n this.domEvents = domEvents;\n this.localDataChangesService = localDataChangesService;\n this.navigationService = navigationService;\n this.changes = new EventEmitter();\n this.lastSelectionStartIndex = 0;\n this.currentSelection = [];\n this.selectAllChecked = false;\n this.active = false;\n this.dragging = false;\n this.addSubscriptions();\n }\n get enableMarquee() {\n const checkboxOnly = this.settings && typeof this.settings === 'object' && this.settings.checkboxOnly;\n if (!this.settings || checkboxOnly) {\n return false;\n }\n const selectableSettings = this.settings.selectable;\n const dragAndMultiple = typeof (selectableSettings) === 'object' &&\n isPresent(selectableSettings) &&\n selectableSettings.mode === 'multiple' &&\n selectableSettings.enabled !== false &&\n !selectableSettings.checkboxOnly &&\n selectableSettings.drag;\n return this.active && dragAndMultiple;\n }\n init(settings) {\n this.settings = settings;\n this.currentSelection = [];\n if (settings.selectable && settings.selectable.enabled !== false) {\n const iterator$$1 = this.getIterator();\n this._selectAllState = true;\n let item = iterator$$1.next();\n while (!item.done) {\n if (item.value && item.value.type === \"data\") {\n const rowArgs = {\n dataItem: item.value.data,\n index: item.value.index\n };\n if (settings.rowSelected(rowArgs)) {\n this.currentSelection[item.value.index] = rowArgs;\n }\n else {\n this._selectAllState = undefined;\n }\n }\n item = iterator$$1.next();\n }\n if (this.currentSelection.length === 0) {\n this._selectAllState = false;\n }\n }\n }\n isSelected(index) {\n if (this.settings && this.active) {\n return this.options.enabled && isPresent(this.currentSelection[index]);\n }\n }\n handleClick(item, event) {\n if (this.dragging) {\n this.dragging = false;\n return;\n }\n let ev;\n const ctrlKey = event.ctrlKey || event.metaKey;\n if (this.options.mode === \"single\" && ctrlKey && this.isSelected(item.index)) {\n ev = this.toggle(item);\n }\n else if (this.options.mode === \"multiple\") {\n if (ctrlKey && !event.shiftKey) {\n ev = this.toggle(item);\n }\n else if (event.shiftKey) {\n ev = this.addAllTo(item, ctrlKey);\n }\n }\n if (!isPresent(ev)) {\n ev = this.select(item);\n this.currentSelection[item.index] = {\n dataItem: item.data,\n index: item.index\n };\n }\n if (!ev.selectedRows.length && !ev.deselectedRows.length) {\n return;\n }\n ev.ctrlKey = ctrlKey;\n ev.shiftKey = event.shiftKey;\n this.changes.emit(ev);\n }\n toggle(item) {\n let selectedRows = [];\n let deselectedRows = [];\n this.lastSelectionStartIndex = item.index;\n const rowArgs = { dataItem: item.data, index: item.index };\n if (this.isSelected(item.index)) {\n deselectedRows.push(rowArgs);\n }\n else {\n selectedRows.push(rowArgs);\n }\n return {\n deselectedRows: deselectedRows,\n selectedRows: selectedRows\n };\n }\n toggleByIndex(index) {\n const iterator$$1 = this.getIterator();\n if (this.selectAllChecked && this.isSelected(index)) {\n this.selectAllChecked = false;\n }\n let item = iterator$$1.next();\n while (!item.done) {\n if (item.value && item.value.type === \"data\" && item.value.index === index) {\n const itemToToggle = {\n data: item.value.data,\n index: item.value.index\n };\n if (this.isSelected(index) || this.options.mode === \"multiple\") {\n return this.toggle(itemToToggle);\n }\n else {\n return this.select(itemToToggle);\n }\n }\n item = iterator$$1.next();\n }\n }\n select(item) {\n let deselectedRows = [];\n let selectedRows = [];\n this.lastSelectionStartIndex = item.index;\n if (!this.isSelected(item.index)) {\n selectedRows.push({ dataItem: item.data, index: item.index });\n }\n this.currentSelection.forEach((row) => {\n if (row.index !== item.index) {\n deselectedRows.push(row);\n }\n });\n return {\n deselectedRows: deselectedRows,\n selectedRows: selectedRows\n };\n }\n //Used to manually deselect removed items\n deselect(removedItem) {\n const iterator$$1 = this.getIterator();\n let item = iterator$$1.next();\n while (!item.done) {\n if (item.value && item.value.type === \"data\" && item.value.data === removedItem) {\n const rowArgs = {\n dataItem: item.value.data,\n index: item.value.index\n };\n if (this.isSelected(rowArgs.index)) {\n let ev = {\n ctrlKey: false,\n deselectedRows: [rowArgs],\n selectedRows: []\n };\n this.changes.emit(ev);\n }\n }\n item = iterator$$1.next();\n }\n }\n addAllTo(item, ctrlKey) {\n let selectedRows = [];\n let deselectedRows = [];\n const start = Math.min(this.lastSelectionStartIndex, item.index);\n const end = Math.max(this.lastSelectionStartIndex, item.index);\n const iterator$$1 = this.getIterator();\n let next = iterator$$1.next();\n while (!next.done) {\n if (next.value && next.value.type === \"data\") {\n const idx = next.value.index;\n const rowArgs = { dataItem: next.value.data, index: idx };\n if ((idx < start || idx > end) && this.isSelected(idx) && !ctrlKey) {\n deselectedRows.push(rowArgs);\n }\n if ((idx >= start && idx <= end) && !this.isSelected(idx)) {\n selectedRows.push(rowArgs);\n }\n }\n next = iterator$$1.next();\n }\n return {\n deselectedRows: deselectedRows,\n selectedRows: selectedRows\n };\n }\n updateAll(selectAllChecked) {\n this.selectAllChecked = selectAllChecked;\n let selectedRows = [];\n let deselectedRows = [];\n const iterator$$1 = this.getIterator();\n let next = iterator$$1.next();\n while (!next.done) {\n if (next.value && next.value.type === \"data\") {\n const idx = next.value.index;\n const rowArgs = { dataItem: next.value.data, index: idx };\n if (this.isSelected(idx) && !selectAllChecked) {\n deselectedRows.push(rowArgs);\n }\n if (!this.isSelected(idx) && selectAllChecked) {\n selectedRows.push(rowArgs);\n }\n }\n next = iterator$$1.next();\n }\n if (!selectedRows.length && !deselectedRows.length) {\n return;\n }\n let ev = {\n ctrlKey: true,\n deselectedRows: deselectedRows,\n selectedRows: selectedRows,\n shiftKey: true\n };\n this.changes.emit(ev);\n }\n selectRange(startIndex, endIndex) {\n let selectedRows = [];\n let deselectedRows = [];\n const start = Math.min(startIndex, endIndex);\n const end = Math.max(startIndex, endIndex);\n const iterator$$1 = this.getIterator();\n let next = iterator$$1.next();\n while (!next.done) {\n if (next.value && next.value.type === \"data\") {\n const idx = next.value.index;\n const rowArgs = { dataItem: next.value.data, index: idx };\n if ((idx < start || idx > end) && this.isSelected(idx)) {\n deselectedRows.push(rowArgs);\n }\n if ((idx >= start && idx <= end) && !this.isSelected(idx)) {\n selectedRows.push(rowArgs);\n }\n }\n next = iterator$$1.next();\n }\n return {\n deselectedRows: deselectedRows,\n selectedRows: selectedRows\n };\n }\n get selectAllState() {\n return this._selectAllState;\n }\n get selected() {\n return this.currentSelection.map((item) => {\n return item.index;\n }).filter((n) => typeof n === \"number\");\n }\n get options() {\n const defaultOptions = {\n checkboxOnly: false,\n enabled: true,\n mode: \"multiple\"\n };\n if (!isPresent(this.settings)) {\n return defaultOptions;\n }\n if (typeof this.settings.selectable === 'boolean') {\n return {\n checkboxOnly: false,\n enabled: this.settings.selectable,\n mode: \"multiple\"\n };\n }\n else {\n return Object.assign(defaultOptions, this.settings.selectable);\n }\n }\n ngOnDestroy() {\n this.removeSubscriptions();\n }\n targetArgs() {\n return {\n index: this.mouseDownEventArgs.rowIndex,\n dataItem: this.mouseDownEventArgs.dataItem\n };\n }\n addSubscriptions() {\n if (!this.cellClickSubscription) {\n this.cellClickSubscription = this.domEvents.cellClick.subscribe((args) => {\n if (this.options.enabled && !this.options.checkboxOnly && args.type !== 'contextmenu') {\n if (this.active) {\n this.handleClick({ index: args.rowIndex, data: args.dataItem }, args.originalEvent);\n }\n }\n });\n }\n if (!this.mousedownSubscription) {\n this.mousedownSubscription = this.domEvents.cellMousedown.subscribe((args) => {\n this.mouseDownEventArgs = args;\n if ((this.options.enabled && (!this.options.mode || this.options.mode === \"multiple\") &&\n !this.options.checkboxOnly && args.originalEvent.shiftKey)) {\n if (this.active) {\n args.originalEvent.preventDefault();\n this.navigationService.focusCellByElement(args.originalEvent.target);\n }\n }\n });\n }\n if (this.localDataChangesService && !this.dataChangedSubscription) {\n this.dataChangedSubscription = this.localDataChangesService.changes.subscribe((args) => {\n if (this.active) {\n if (isPresent(args.action) && args.action === 'remove') {\n this.deselect(args.item);\n }\n }\n });\n }\n }\n getIterator() {\n const accessor = this.settings.view.accessor();\n if (!accessor) {\n return;\n }\n return accessor[iterator]();\n }\n removeSubscriptions() {\n if (this.cellClickSubscription) {\n this.cellClickSubscription.unsubscribe();\n this.cellClickSubscription = null;\n }\n if (this.mousedownSubscription) {\n this.mousedownSubscription.unsubscribe();\n this.mousedownSubscription = null;\n }\n if (this.dataChangedSubscription) {\n this.dataChangedSubscription.unsubscribe();\n this.dataChangedSubscription = null;\n }\n }\n}\nSelectionService.ɵfac = function SelectionService_Factory(t) { return new (t || SelectionService)(ɵngcc0.ɵɵinject(DomEventsService), ɵngcc0.ɵɵinject(LocalDataChangesService), ɵngcc0.ɵɵinject(NavigationService)); };\nSelectionService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SelectionService, factory: SelectionService.ɵfac });\n/** @nocollapse */\nSelectionService.ctorParameters = () => [\n { type: DomEventsService },\n { type: LocalDataChangesService },\n { type: NavigationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SelectionService, [{\n type: Injectable\n }], function () { return [{ type: DomEventsService }, { type: LocalDataChangesService }, { type: NavigationService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass CellSelectionService {\n constructor(domEvents, localDataChangesService, navigationService) {\n this.domEvents = domEvents;\n this.localDataChangesService = localDataChangesService;\n this.navigationService = navigationService;\n this.changes = new EventEmitter();\n this.mouseUpEvent = new EventEmitter();\n this.currentSelection = [];\n this.active = false;\n this.dragging = false;\n this.dragSelectDeselect = false;\n this.lastSelectionItem = { itemKey: 0, columnKey: 0 };\n this.lastSelectionItemRowIndex = 0;\n this.lastSelectionItemColIndex = 0;\n this.addSubscriptions();\n }\n get enableMarquee() {\n const checkboxOnly = this.settings && typeof this.settings === 'object' && this.settings.checkboxOnly;\n if (!this.settings || checkboxOnly) {\n return false;\n }\n const selectableSettings = this.settings.selectable;\n const dragAndMultiple = typeof (selectableSettings) === 'object' &&\n isPresent(selectableSettings) &&\n selectableSettings.mode === 'multiple' &&\n selectableSettings.cell &&\n selectableSettings.enabled !== false &&\n selectableSettings.drag;\n return this.active && dragAndMultiple;\n }\n init(settings) {\n this.settings = settings;\n this.currentSelection = [];\n if (settings.selectable && settings.selectable.enabled !== false) {\n const iterator$$1 = this.getIterator();\n let item = iterator$$1.next();\n while (!item.done) {\n if (item.value && item.value.type === \"data\") {\n const rowArgs = {\n dataItem: item.value.data,\n index: item.value.index\n };\n settings.columns.forEach(col => {\n const selectedCellArgs = settings.cellSelected(rowArgs, col, col.leafIndex);\n if (selectedCellArgs.selected) {\n this.currentSelection.push(selectedCellArgs.item);\n }\n });\n }\n item = iterator$$1.next();\n }\n }\n }\n isCellSelected(item, col) {\n if (this.settings && this.active) {\n const selectedCellArgs = this.settings.cellSelected({ dataItem: item.data, index: item.index }, col, col.leafIndex);\n return this.options.enabled && selectedCellArgs.selected;\n }\n return false;\n }\n handleClick(item, event) {\n if (this.dragging) {\n this.dragging = false;\n return;\n }\n let ev;\n const ctrlKey = event.ctrlKey || event.metaKey;\n if (this.options.mode === \"single\" && ctrlKey && this.isCellSelected(item, item.column)) {\n ev = this.toggle(item);\n }\n else if (this.options.mode === \"multiple\") {\n if (ctrlKey && !event.shiftKey) {\n ev = this.toggle(item);\n }\n else if (event.shiftKey) {\n const startRowIndex = Math.min(this.lastSelectionItemRowIndex, item.index);\n const startColIndex = Math.min(this.lastSelectionItemColIndex, item.column.leafIndex);\n const endRowIndex = Math.max(this.lastSelectionItemRowIndex, item.index);\n const endColIndex = Math.max(this.lastSelectionItemColIndex, item.column.leafIndex);\n ev = this.selectRange(startRowIndex, startColIndex, endRowIndex, endColIndex);\n }\n }\n if (!isPresent(ev)) {\n ev = this.select(item);\n this.currentSelection = [this.lastSelectionItem];\n }\n if (!ev.selectedCells.length && !ev.deselectedCells.length) {\n return;\n }\n ev.ctrlKey = ctrlKey;\n ev.shiftKey = event.shiftKey;\n this.changes.emit(ev);\n }\n toggle(item) {\n let selectedCells = [];\n let deselectedCells = [];\n this.lastSelectionItem =\n this.settings.cellSelected({ dataItem: item.data, index: item.index }, item.column, item.column.leafIndex).item;\n this.lastSelectionItemRowIndex = item.index;\n this.lastSelectionItemColIndex = item.column.leafIndex;\n if (this.isCellSelected(item, item.column)) {\n deselectedCells.push(this.lastSelectionItem);\n }\n else {\n selectedCells.push(this.lastSelectionItem);\n }\n return {\n deselectedCells,\n selectedCells\n };\n }\n select(item) {\n const selectedCells = [];\n const deselectedCells = [];\n this.lastSelectionItem =\n this.settings.cellSelected({ dataItem: item.data, index: item.index }, item.column, item.column.leafIndex).item;\n this.lastSelectionItemRowIndex = item.index;\n this.lastSelectionItemColIndex = item.column.leafIndex;\n if (!this.isCellSelected(item, item.column)) {\n selectedCells.push(this.lastSelectionItem);\n }\n this.currentSelection.forEach((selectedItem) => {\n if (selectedItem.itemKey !== this.lastSelectionItem.itemKey || selectedItem.columnKey !== this.lastSelectionItem.columnKey) {\n deselectedCells.push(selectedItem);\n }\n });\n return {\n deselectedCells,\n selectedCells\n };\n }\n //Used to manually deselect removed items\n deselect(removedItem) {\n const iterator$$1 = this.getIterator();\n let item = iterator$$1.next();\n let rowArgs;\n while (!item.done) {\n if (item.value && item.value.type === \"data\" && item.value.data === removedItem) {\n rowArgs = {\n dataItem: item.value.data,\n index: item.value.index\n };\n break;\n }\n item = iterator$$1.next();\n }\n if (rowArgs) {\n const cellsToRemove = this.currentSelection.filter(selectedItem => {\n const contender = this.settings.cellSelected(rowArgs, null, null).item;\n return selectedItem.itemKey === contender.itemKey;\n });\n if (cellsToRemove.length) {\n let ev = {\n ctrlKey: false,\n deselectedCells: cellsToRemove,\n selectedCells: []\n };\n this.changes.emit(ev);\n }\n }\n }\n selectRange(startRowIndex, startColIndex, endRowIndex, endColIndex) {\n const selectedCells = [];\n const deselectedCells = [];\n const selectionStartRow = Math.min(startRowIndex, endRowIndex);\n const selectionStartCol = Math.min(startColIndex, endColIndex);\n const selectionEndRow = Math.max(startRowIndex, endRowIndex);\n const selectionEndCol = Math.max(startColIndex, endColIndex);\n const iterator$$1 = this.getIterator();\n let next = iterator$$1.next();\n while (!next.done) {\n if (next.value && next.value.type === \"data\") {\n const idx = next.value.index;\n const data = next.value.data;\n const rowArgs = {\n dataItem: data,\n index: idx\n };\n this.settings.columns.forEach(col => {\n const { item } = this.settings.cellSelected(rowArgs, col, col.leafIndex);\n const selected = this.isCellSelected(next.value, col);\n const isInRowRange = selectionStartRow <= idx && idx <= selectionEndRow;\n const isInColRange = selectionStartCol <= col.leafIndex && col.leafIndex <= selectionEndCol;\n const isInSelectionRect = isInRowRange && isInColRange;\n if (!isInSelectionRect && selected) {\n deselectedCells.push(item);\n }\n if (isInSelectionRect && !selected) {\n selectedCells.push(item);\n }\n });\n }\n next = iterator$$1.next();\n }\n return {\n deselectedCells,\n selectedCells\n };\n }\n get options() {\n const defaultOptions = {\n checkboxOnly: false,\n enabled: true,\n mode: \"multiple\"\n };\n if (!isPresent(this.settings)) {\n return defaultOptions;\n }\n if (typeof this.settings.selectable === 'boolean') {\n return {\n checkboxOnly: false,\n enabled: this.settings.selectable,\n mode: \"multiple\"\n };\n }\n else {\n return Object.assign(defaultOptions, this.settings.selectable);\n }\n }\n ngOnDestroy() {\n this.removeSubscriptions();\n }\n addSubscriptions() {\n if (!this.cellClickSubscription) {\n this.cellClickSubscription = this.domEvents.cellClick.subscribe((args) => {\n if (this.options.enabled && !this.options.checkboxOnly && args.type !== 'contextmenu') {\n if (this.active) {\n this.handleClick({ index: args.rowIndex, data: args.dataItem, column: args.column }, args.originalEvent);\n }\n }\n });\n }\n if (!this.mousedownSubscription) {\n this.mousedownSubscription = this.domEvents.cellMousedown.subscribe((args) => {\n this.mouseDownEventArgs = args;\n if (this.options.enabled && (!this.options.mode || this.options.mode === \"multiple\") &&\n !this.options.checkboxOnly && args.originalEvent.shiftKey) {\n if (this.active) {\n args.originalEvent.preventDefault();\n this.navigationService.focusCellByElement(args.originalEvent.target);\n }\n }\n });\n }\n if (this.localDataChangesService && !this.dataChangedSubscription) {\n this.dataChangedSubscription = this.localDataChangesService.changes.subscribe((args) => {\n if (this.active) {\n if (isPresent(args.action) && args.action === 'remove') {\n this.deselect(args.item);\n }\n }\n });\n }\n }\n getIterator() {\n const accessor = this.settings.view.accessor();\n if (!accessor) {\n return;\n }\n return accessor[iterator]();\n }\n removeSubscriptions() {\n if (this.cellClickSubscription) {\n this.cellClickSubscription.unsubscribe();\n this.cellClickSubscription = null;\n }\n if (this.mousedownSubscription) {\n this.mousedownSubscription.unsubscribe();\n this.mousedownSubscription = null;\n }\n if (this.dataChangedSubscription) {\n this.dataChangedSubscription.unsubscribe();\n this.dataChangedSubscription = null;\n }\n }\n}\nCellSelectionService.ɵfac = function CellSelectionService_Factory(t) { return new (t || CellSelectionService)(ɵngcc0.ɵɵinject(DomEventsService), ɵngcc0.ɵɵinject(LocalDataChangesService), ɵngcc0.ɵɵinject(NavigationService)); };\nCellSelectionService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: CellSelectionService, factory: CellSelectionService.ɵfac });\n/** @nocollapse */\nCellSelectionService.ctorParameters = () => [\n { type: DomEventsService },\n { type: LocalDataChangesService },\n { type: NavigationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CellSelectionService, [{\n type: Injectable\n }], function () { return [{ type: DomEventsService }, { type: LocalDataChangesService }, { type: NavigationService }]; }, null); })();\n\nconst createElement = () => {\n const marquee = document.createElement(\"div\");\n marquee.className = \"k-marquee\";\n const marqueeColor = document.createElement(\"div\");\n marqueeColor.className = \"k-marquee-color\";\n marquee.appendChild(marqueeColor);\n return marquee;\n};\nconst POINTER_OFFSET = 2;\nconst MINIMAL_DRAG_DISTANCE = 5;\nconst offsets = {\n topLeft: { x: POINTER_OFFSET, y: POINTER_OFFSET },\n topRight: { x: -POINTER_OFFSET, y: POINTER_OFFSET },\n bottomLeft: { x: POINTER_OFFSET, y: -POINTER_OFFSET },\n bottomRight: { x: -POINTER_OFFSET, y: -POINTER_OFFSET }\n};\n/**\n * @hidden\n */\nclass GridMarqueeDirective {\n constructor(draggable, selection, cellSelection, domEvents) {\n this.draggable = draggable;\n this.selection = selection;\n this.cellSelection = cellSelection;\n this.domEvents = domEvents;\n this.selectionStarted = false;\n }\n get userSelection() {\n return (this.cellSelection.enableMarquee || this.selection.enableMarquee) ? 'none' : null;\n }\n ngOnInit() {\n this.subscriptions = (this.draggable.kendoPress.subscribe(this.start.bind(this)));\n this.subscriptions.add(this.draggable.kendoDrag.subscribe(this.moveMarquee.bind(this)));\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n this.clean();\n }\n start(args) {\n if (args.originalEvent.target.classList.contains('k-checkbox')) {\n this.pressArgs = null;\n return;\n }\n this.pressArgs = args;\n this.pressTarget = null;\n }\n moveMarquee(args) {\n if (!this.pressTarget) {\n this.pressTarget = this.cellSelection.active ? this.cellSelection.mouseDownEventArgs : this.selection.mouseDownEventArgs;\n }\n const press = this.pressArgs;\n if (!press) {\n return;\n }\n if (!this.selectionStarted) {\n const distance = Math.sqrt(Math.pow((args.pageX - press.pageX), 2) + Math.pow((args.pageY - press.pageY), 2));\n if (distance > MINIMAL_DRAG_DISTANCE) {\n this.selectionStarted = true;\n this.dragEndSubscription = merge(this.domEvents.cellMouseup.pipe(take(1)), this.draggable.kendoRelease.pipe(delay(1), take(1)))\n .subscribe(this.endSelection.bind(this));\n }\n else {\n return;\n }\n }\n this.initMarquee();\n const element = this.marqueeElement;\n const marqueeQuadrant = this.getMarqueeQuadrant(args.pageX, args.pageY, press.pageX, press.pageY);\n let left = Math.min(args.pageX, press.pageX);\n let top = Math.min(args.pageY, press.pageY);\n const width = Math.abs(args.pageX - press.pageX);\n const height = Math.abs(args.pageY - press.pageY);\n if (marqueeQuadrant) {\n left += offsets[marqueeQuadrant].x;\n top += offsets[marqueeQuadrant].y;\n }\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n }\n endSelection(args) {\n if (args.type === 'mouseup' || args.type === 'touchend') {\n if (this.cellSelection.active) {\n this.cellSelection.dragging = true;\n this.cellSelection.changes.emit(this.cellSelection.selectRange(this.pressTarget.rowIndex, this.pressTarget.column.leafIndex, args.rowIndex, args.column.leafIndex));\n }\n else if (this.selection.active) {\n this.selection.dragging = true;\n this.selection.changes.emit(this.selection.selectRange(this.pressTarget.rowIndex, args.rowIndex));\n }\n }\n this.clean();\n }\n clean() {\n if (this.marqueeElement) {\n document.body.removeChild(this.marqueeElement);\n this.marqueeElement = null;\n }\n if (this.dragEndSubscription) {\n this.dragEndSubscription.unsubscribe();\n }\n this.dragEndSubscription = null;\n this.pressTarget = null;\n this.pressArgs = null;\n this.selectionStarted = false;\n this.cellSelection.active ? this.cellSelection.dragging = false : this.selection.dragging = false;\n }\n initMarquee() {\n if (!this.marqueeElement) {\n this.marqueeElement = createElement();\n document.body.appendChild(this.marqueeElement);\n }\n }\n getMarqueeQuadrant(pointerX, pointerY, startX, startY) {\n const leftHalf = pointerX < startX;\n const rightHalf = pointerX > startX;\n const topHalf = pointerY < startY;\n const bottomHalf = pointerY > startY;\n if (leftHalf && topHalf) {\n return 'topLeft';\n }\n if (leftHalf && bottomHalf) {\n return 'bottomLeft';\n }\n if (rightHalf && topHalf) {\n return 'topRight';\n }\n if (rightHalf && bottomHalf) {\n return 'bottomRight';\n }\n return null;\n }\n}\nGridMarqueeDirective.ɵfac = function GridMarqueeDirective_Factory(t) { return new (t || GridMarqueeDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.DraggableDirective), ɵngcc0.ɵɵdirectiveInject(SelectionService), ɵngcc0.ɵɵdirectiveInject(CellSelectionService), ɵngcc0.ɵɵdirectiveInject(DomEventsService)); };\nGridMarqueeDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GridMarqueeDirective, selectors: [[\"\", \"kendoGridSelectionMarquee\", \"\"]], hostVars: 4, hostBindings: function GridMarqueeDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"user-select\", ctx.userSelection)(\"-webkit-user-select\", ctx.userSelection);\n } } });\n/** @nocollapse */\nGridMarqueeDirective.ctorParameters = () => [\n { type: DraggableDirective },\n { type: SelectionService },\n { type: CellSelectionService },\n { type: DomEventsService }\n];\nGridMarqueeDirective.propDecorators = {\n userSelection: [{ type: HostBinding, args: ['style.user-select',] }, { type: HostBinding, args: ['style.-webkit-user-select',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GridMarqueeDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridSelectionMarquee]'\n }]\n }], function () { return [{ type: ɵngcc2.DraggableDirective }, { type: SelectionService }, { type: CellSelectionService }, { type: DomEventsService }]; }, { userSelection: [{\n type: HostBinding,\n args: ['style.user-select']\n }, {\n type: HostBinding,\n args: ['style.-webkit-user-select']\n }] }); })();\n\n/**\n * @hidden\n */\nclass ZoneAwareEventEmitter extends EventEmitter {\n constructor(ngZone, isAsync = false) {\n super(isAsync);\n this.ngZone = ngZone;\n }\n subscribe(generatorOrNext, error, complete) {\n let schedulerFn;\n let errorFn = (_) => null;\n let completeFn = () => null;\n if (generatorOrNext && typeof generatorOrNext === 'object') {\n schedulerFn = (value) => { this.ngZone.run(() => generatorOrNext.next(value)); };\n if (generatorOrNext.error) {\n errorFn = (err) => { this.ngZone.run(() => generatorOrNext.error(err)); };\n }\n if (generatorOrNext.complete) {\n completeFn = () => { this.ngZone.run(() => generatorOrNext.complete()); };\n }\n }\n else {\n schedulerFn = (value) => { this.ngZone.run(() => generatorOrNext(value)); };\n if (error) {\n errorFn = (err) => { this.ngZone.run(() => error(err)); };\n }\n if (complete) {\n completeFn = () => { this.ngZone.run(() => complete()); };\n }\n }\n return super.subscribe(schedulerFn, errorFn, completeFn);\n }\n}\n\n/**\n * Represents the column cell template of the Grid ([more information and example]({% slug templates_columns_grid %}#toc-cell-template)).\n * Helps to customize the content of the cells. To define the cell template, nest an `` tag\n * with the `kendoGridCellTemplate` directive inside a `` tag.\n *\n * The template context is set to the current data item and the following additional fields are passed:\n * - `columnIndex`—The current column index. Use it as an alias for a template variable by utilizing the `let-columnIndex=\"columnIndex\"` syntax.\n * - `rowIndex`—The current data row index. Use it as an alias for a template variable by utilizing the `let-rowIndex=\"rowIndex\"` syntax.\n * - `dataItem`—The current data item. Represents the default context that will be assigned to any template variable which utilizes the `let-x` syntax—for example, `let-dataItem`.\n * - `column`—The current column instance. Use it as an alias for a template variable by utilizing the `let-column=\"column\"` syntax.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Data Row #: {{rowIndex}} /\n * {{dataItem.ProductName}}\n * ({{dataItem.Discontinued ? \"discontinued\" : \"active\"}})\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n * }\n *\n * ```\n */\nclass CellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nCellTemplateDirective.ɵfac = function CellTemplateDirective_Factory(t) { return new (t || CellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CellTemplateDirective, selectors: [[\"\", \"kendoGridCellTemplate\", \"\"]] });\n/** @nocollapse */\nCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the group-header cell template of the Grid which helps to customize the content of the group header item.\n * To define the group header template, nest an `` tag with the `kendoGridGroupHeaderTemplate`\n * directive inside ``.\n *\n * The template context is set to the current data item and the following additional fields are passed:\n * - `group`—The current group item.\n * - `field`—The name of the field by which data is grouped.\n * - `value`—The current group value.\n * - `aggregates`—All aggregate values for the current group.\n * - `index`—The index of the current group.\n * - `expanded`—A boolean value indicating if the group is currently expanded.\n * ([see example]({% slug groupable_grid_with_aggregates %})).\n *\n * @example\n * ```ts\n * import { process } from '@progress/kendo-data-query';\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * {{field}}: {{value}}\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public groups = [{ field: \"ProductName\" }];\n *\n * public gridData = process([{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ], {\n * group: this.groups\n * });\n * }\n *\n * ```\n */\nclass GroupHeaderTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupHeaderTemplateDirective.ɵfac = function GroupHeaderTemplateDirective_Factory(t) { return new (t || GroupHeaderTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupHeaderTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupHeaderTemplateDirective, selectors: [[\"\", \"kendoGridGroupHeaderTemplate\", \"\"]] });\n/** @nocollapse */\nGroupHeaderTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupHeaderTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridGroupHeaderTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the group-header column template of the Grid which helps to customize the content of the group headers.\n * To define the group header template, nest an `` tag with the `kendoGridGroupHeaderColumnTemplate`\n * directive inside ``. ([See example]({% slug groupable_grid_with_aggregates %})).\n *\n * The template context is set to the current data item and the following additional fields are passed:\n * - `group`—The current group item.\n * - `field`—The name of the field by which data is grouped.\n * - `value`—The current group value.\n * - `aggregates`—All aggregate values for the current group.\n *\n * @example\n * ```ts\n * \n * \n * \n * Count: {{ aggregates.Discontinued.count }}\n * \n * \n * \n * ```\n */\nclass GroupHeaderColumnTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupHeaderColumnTemplateDirective.ɵfac = function GroupHeaderColumnTemplateDirective_Factory(t) { return new (t || GroupHeaderColumnTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupHeaderColumnTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupHeaderColumnTemplateDirective, selectors: [[\"\", \"kendoGridGroupHeaderColumnTemplate\", \"\"]] });\n/** @nocollapse */\nGroupHeaderColumnTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupHeaderColumnTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridGroupHeaderColumnTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the column edit-cell template of the Grid ([see example]({% slug editing_template_forms_grid %})).\n * Helps to customize the content of the edited cells. To define the cell template, nest an ``\n * tag with the `kendoGridEditTemplate` directive inside a `` tag.\n *\n * The template context contains the following fields:\n * - `formGroup`—The current [`FormGroup`]({{ site.data.urls.angular['formgroupapi'] }}).\n * If you use the Grid inside [Template-Driven Forms]({{ site.data.urls.angular['forms'] }}), it will be `undefined`.\n * - `rowIndex`—The current data row index. If inside a new item row, `rowIndex` is `-1`.\n * - `dataItem`—The current data item.\n * - `column`—The current column instance.\n * - `isNew`—The state of the current item.\n */\nclass EditTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nEditTemplateDirective.ɵfac = function EditTemplateDirective_Factory(t) { return new (t || EditTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nEditTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: EditTemplateDirective, selectors: [[\"\", \"kendoGridEditTemplate\", \"\"]] });\n/** @nocollapse */\nEditTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(EditTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridEditTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the column group footer cell template of the Grid which helps to customize the group footer cell for the column.\n * To define the group footer template, nest an `` tag with the `kendoGridGroupFooterTemplate` directive\n * inside ``.\n *\n * The template context is set to the current aggregates and the following additional fields are passed:\n * - `column`—Defines an instance of the `ColumnComponent` option.\n * - `field`—The current column field name.\n * - `group`—The current group data item.\n * - `aggregates`—All aggregate values for the current group.\n *\n * @example\n * ```ts-preview\n * import { process } from '@progress/kendo-data-query';\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Count: {{aggregates[field].count}}\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public groups = [{ field: \"ProductName\", aggregates: [{ field: \"ProductName\", aggregate: \"count\" }] }];\n *\n * public gridData = process([{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ], {\n * group: this.groups\n * });\n * }\n * ```\n */\nclass GroupFooterTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nGroupFooterTemplateDirective.ɵfac = function GroupFooterTemplateDirective_Factory(t) { return new (t || GroupFooterTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nGroupFooterTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupFooterTemplateDirective, selectors: [[\"\", \"kendoGridGroupFooterTemplate\", \"\"]] });\n/** @nocollapse */\nGroupFooterTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupFooterTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridGroupFooterTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the column header cell template of the Grid\n * ([more information and example]({% slug templates_columns_grid %}#toc-header-template)).\n * Helps to customize the table header cell for the column.\n * To define a header template, nest an `` tag with the\n * [`kendoGridHeaderTemplate`]({% slug api_grid_headertemplatedirective %}) directive inside the `` tag.\n *\n * The template context is set to the current column and then the following additional fields are passed:\n * * `column`—Defines an instance of the [`ColumnComponent`]({% slug api_grid_columncomponent %}) option.\n * * `columnIndex`—Defines the current column index.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * {{column.field}}({{columnIndex}})\n * \n * \n * \n * \n * {{column.field}}({{columnIndex}})\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n * }\n *\n * ```\n */\nclass HeaderTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nHeaderTemplateDirective.ɵfac = function HeaderTemplateDirective_Factory(t) { return new (t || HeaderTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nHeaderTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: HeaderTemplateDirective, selectors: [[\"\", \"kendoGridHeaderTemplate\", \"\"]] });\n/** @nocollapse */\nHeaderTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HeaderTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridHeaderTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the column footer cell template of the Grid\n * ([more information and example]({% slug templates_columns_grid %}#toc-footer-template)).\n * Helps to customize the table footer cell for the column.\n * To define a footer template, nest an `` tag with the\n * [`kendoGridFooterTemplate`]({% slug api_grid_footertemplatedirective %}) directive inside the `` tag.\n *\n * The template context is set to the current column and the following additional fields are passed:\n * * `column`—Defines an instance of the [`ColumnComponent`]({% slug api_grid_columncomponent %}) option.\n * * `columnIndex`—Defines the current column index.\n *\n * For more information on how to display aggregates in the footer of the Grid,\n * refer to the article on [aggregates]({% slug groupable_grid_with_aggregates %}).\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * {{column.field}}({{columnIndex}})\n * \n * \n * \n * \n * {{column.field}}({{columnIndex}})\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n * }\n *\n * ```\n */\nclass FooterTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nFooterTemplateDirective.ɵfac = function FooterTemplateDirective_Factory(t) { return new (t || FooterTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nFooterTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FooterTemplateDirective, selectors: [[\"\", \"kendoGridFooterTemplate\", \"\"]] });\n/** @nocollapse */\nFooterTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FooterTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridFooterTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/* tslint:disable:max-line-length */\n/**\n * Represents the template for the column menu in the Grid. Provides an option for\n * customizing the content of the column menu for all or for specific columns.\n * To define the content template, nest an `` tag with the\n * `kendoGridColumnMenuTemplate` directive inside the `kendo-grid` or the `` component.\n *\n * The template context is passes through the following fields:\n * - `service`—Represents the [ColumnMenuService]({% slug api_grid_columnmenuservice %}).\n * - `column`—Represents the Grid column.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }, { Field1: 'Foo1', Field2: 'Bar1' }];\n * }\n *\n * ```\n */\nclass ColumnMenuTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nColumnMenuTemplateDirective.ɵfac = function ColumnMenuTemplateDirective_Factory(t) { return new (t || ColumnMenuTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nColumnMenuTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnMenuTemplateDirective, selectors: [[\"\", \"kendoGridColumnMenuTemplate\", \"\"]] });\n/** @nocollapse */\nColumnMenuTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridColumnMenuTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nconst isSpanColumn = column => column.isSpanColumn;\n/**\n * @hidden\n */\nconst isCheckboxColumn = column => column.isCheckboxColumn;\nconst isColumnContainer = column => column.isColumnGroup || isSpanColumn(column);\n/**\n * The base class for the column components of the Grid.\n */\nclass ColumnBase$1 {\n constructor(parent) {\n this.parent = parent;\n /**\n * @hidden\n */\n this.matchesMedia = true;\n /**\n * The column index after reordering.\n *\n * > `orderIndex` is a read-only property. Setting this field does not affect column order.\n */\n this.orderIndex = 0;\n /**\n * @hidden\n */\n this.isColumnGroup = false;\n /**\n * @hidden\n */\n this.isSpanColumn = false;\n /**\n * Indicates whether the column is resizable.\n * @default true\n */\n this.resizable = true;\n /**\n * Indicates whether the column is reorderable.\n * @default true\n */\n this.reorderable = true;\n /**\n * The width (in pixels) below which the user is not able to resize the column by using the UI.\n */\n this.minResizableWidth = 10;\n /**\n * Toggles the locked (frozen) state of the columns ([more information and example]({% slug locked_columns_grid %})).\n *\n * @default false\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\n this.locked = false;\n /**\n * Specifies if the column can be locked or unlocked from the column menu or by reordering the columns.\n */\n this.lockable = true;\n /**\n * Specifies if the column menu will be shown for the column.\n */\n this.columnMenu = true;\n /**\n * Specifies if the column will be included in the column-chooser list.\n */\n this.includeInChooser = true;\n /**\n * @hidden\n */\n this.headerTemplates = new QueryList();\n /**\n * @hidden\n */\n this.columnMenuTemplates = new QueryList();\n if (parent && !isColumnContainer(parent)) {\n throw new Error('Columns can be nested only inside ColumnGroupComponent');\n }\n }\n /**\n * The width of the column (in pixels).\n */\n set width(value) {\n this._width = parseInt(value, 10);\n }\n get width() { return this._width; }\n /**\n * @hidden\n */\n get level() {\n if (this.parent && isSpanColumn(this.parent)) {\n return this.parent.level;\n }\n return this.parent ? this.parent.level + 1 : 0;\n }\n /**\n * @hidden\n */\n get isLocked() {\n return this.parent ? this.parent.isLocked : this.locked;\n }\n /**\n * @hidden\n */\n get colspan() {\n return 1;\n }\n /**\n * @hidden\n */\n rowspan(totalColumnLevels) {\n return this.level < totalColumnLevels ? (totalColumnLevels - this.level) + 1 : 1;\n }\n /**\n * @hidden\n */\n get headerTemplateRef() {\n const template = this.headerTemplates.first;\n return template ? template.templateRef : undefined;\n }\n /**\n * @hidden\n */\n get footerTemplateRef() {\n return this.footerTemplate ? this.footerTemplate.templateRef : undefined;\n }\n /**\n * @hidden\n */\n get columnMenuTemplateRef() {\n const template = this.columnMenuTemplates.first;\n return template ? template.templateRef : null;\n }\n /**\n * @hidden\n */\n get displayTitle() {\n return this.title;\n }\n /**\n * @hidden\n */\n get isVisible() {\n return !this.hidden && this.matchesMedia;\n }\n}\nColumnBase$1.ɵfac = function ColumnBase$1_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nColumnBase$1.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnBase$1, contentQueries: function ColumnBase$1_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, FooterTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, HeaderTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnMenuTemplateDirective, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.footerTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTemplates = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columnMenuTemplates = _t);\n } }, inputs: { resizable: \"resizable\", reorderable: \"reorderable\", minResizableWidth: \"minResizableWidth\", locked: \"locked\", lockable: \"lockable\", columnMenu: \"columnMenu\", includeInChooser: \"includeInChooser\", width: \"width\", title: \"title\", autoSize: \"autoSize\", hidden: \"hidden\", media: \"media\", style: \"style\", headerStyle: \"headerStyle\", footerStyle: \"footerStyle\", cssClass: [\"class\", \"cssClass\"], headerClass: \"headerClass\", footerClass: \"footerClass\" } });\nColumnBase$1.propDecorators = {\n resizable: [{ type: Input }],\n reorderable: [{ type: Input }],\n minResizableWidth: [{ type: Input }],\n title: [{ type: Input }],\n width: [{ type: Input }],\n autoSize: [{ type: Input }],\n locked: [{ type: Input }],\n hidden: [{ type: Input }],\n media: [{ type: Input }],\n lockable: [{ type: Input }],\n columnMenu: [{ type: Input }],\n includeInChooser: [{ type: Input }],\n style: [{ type: Input }],\n headerStyle: [{ type: Input }],\n footerStyle: [{ type: Input }],\n cssClass: [{ type: Input, args: ['class',] }],\n headerClass: [{ type: Input }],\n footerClass: [{ type: Input }],\n headerTemplates: [{ type: ContentChildren, args: [HeaderTemplateDirective, { descendants: false },] }],\n footerTemplate: [{ type: ContentChild, args: [FooterTemplateDirective,] }],\n columnMenuTemplates: [{ type: ContentChildren, args: [ColumnMenuTemplateDirective,] }]\n};\n\n\n/**\n * Represents the filter-cell template ([see example]({% slug builtinfiltertemplate_grid %}#toc-customizing-filter-rows)).\n */\nclass FilterCellTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nFilterCellTemplateDirective.ɵfac = function FilterCellTemplateDirective_Factory(t) { return new (t || FilterCellTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nFilterCellTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterCellTemplateDirective, selectors: [[\"\", \"kendoGridFilterCellTemplate\", \"\"]] });\n/** @nocollapse */\nFilterCellTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterCellTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridFilterCellTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the filter-menu template\n * ([see example]({% slug builtinfiltertemplate_grid %}#toc-customizing-filter-menus)).\n */\nclass FilterMenuTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nFilterMenuTemplateDirective.ɵfac = function FilterMenuTemplateDirective_Factory(t) { return new (t || FilterMenuTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nFilterMenuTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterMenuTemplateDirective, selectors: [[\"\", \"kendoGridFilterMenuTemplate\", \"\"]] });\n/** @nocollapse */\nFilterMenuTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridFilterMenuTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nfunction isColumnComponent(column) {\n return isPresent(column.field);\n}\n/**\n * Represents the columns of the [Angular Data Grid]({% slug overview_grid %}).\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\nclass ColumnComponent extends ColumnBase$1 {\n constructor(parent) {\n super(parent);\n /**\n * Allows the column headers to be clicked and the `sortChange` event emitted.\n * You have to handle the `sortChange` event yourself and sort the data.\n */\n this.sortable = true;\n /**\n * Determines if the column can be dragged to the group panel. The default value is `true`.\n * If set to `false`, you can group the columns by the column field by using the API of the Grid.\n */\n this.groupable = true;\n /**\n * Defines the editor type ([see example]({% slug editing_reactive_forms_grid %}#toc-setup)).\n * Used when the column enters the edit mode. The default value is `text`.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * ```\n */\n this.editor = 'text';\n /**\n * Defines the filter type that is displayed inside the filter row. The default value is `text`.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * ```\n */\n this.filter = 'text';\n /**\n * Defines if a filter UI will be displayed for this column. The default value is `true`.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * ```\n */\n this.filterable = true;\n /**\n * Defines whether the column is editable. The default value is `true`.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * ```\n */\n this.editable = true;\n }\n get templateRef() {\n return this.template ? this.template.templateRef : undefined;\n }\n get groupHeaderTemplateRef() {\n return this.groupHeaderTemplate ? this.groupHeaderTemplate.templateRef : undefined;\n }\n get groupHeaderColumnTemplateRef() {\n return this.groupHeaderColumnTemplate ? this.groupHeaderColumnTemplate.templateRef : undefined;\n }\n get groupFooterTemplateRef() {\n return this.groupFooterTemplate ? this.groupFooterTemplate.templateRef : undefined;\n }\n get editTemplateRef() {\n return this.editTemplate ? this.editTemplate.templateRef : undefined;\n }\n get filterCellTemplateRef() {\n return this.filterCellTemplate ? this.filterCellTemplate.templateRef : undefined;\n }\n get filterMenuTemplateRef() {\n return this.filterMenuTemplate ? this.filterMenuTemplate.templateRef : undefined;\n }\n get displayTitle() {\n return this.title === undefined ? this.field : this.title;\n }\n}\nColumnComponent.ɵfac = function ColumnComponent_Factory(t) { return new (t || ColumnComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase$1, 13)); };\nColumnComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnComponent, selectors: [[\"kendo-grid-column\"]], contentQueries: function ColumnComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupHeaderTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupHeaderColumnTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, GroupFooterTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, EditTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, FilterCellTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, FilterMenuTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupHeaderTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupHeaderColumnTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.groupFooterTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.editTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.filterCellTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.filterMenuTemplate = _t.first);\n } }, inputs: { sortable: \"sortable\", groupable: \"groupable\", editor: \"editor\", filter: \"filter\", filterable: \"filterable\", editable: \"editable\", field: \"field\", format: \"format\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => ColumnComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function ColumnComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nColumnComponent.ctorParameters = () => [\n { type: ColumnBase$1, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nColumnComponent.propDecorators = {\n field: [{ type: Input }],\n format: [{ type: Input }],\n sortable: [{ type: Input }],\n groupable: [{ type: Input }],\n editor: [{ type: Input }],\n filter: [{ type: Input }],\n filterable: [{ type: Input }],\n editable: [{ type: Input }],\n template: [{ type: ContentChild, args: [CellTemplateDirective,] }],\n groupHeaderTemplate: [{ type: ContentChild, args: [GroupHeaderTemplateDirective,] }],\n groupHeaderColumnTemplate: [{ type: ContentChild, args: [GroupHeaderColumnTemplateDirective,] }],\n groupFooterTemplate: [{ type: ContentChild, args: [GroupFooterTemplateDirective,] }],\n editTemplate: [{ type: ContentChild, args: [EditTemplateDirective,] }],\n filterCellTemplate: [{ type: ContentChild, args: [FilterCellTemplateDirective,] }],\n filterMenuTemplate: [{ type: ContentChild, args: [FilterMenuTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => ColumnComponent)\n }\n ],\n selector: 'kendo-grid-column',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase$1, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { sortable: [{\n type: Input\n }], groupable: [{\n type: Input\n }], editor: [{\n type: Input\n }], filter: [{\n type: Input\n }], filterable: [{\n type: Input\n }], editable: [{\n type: Input\n }], field: [{\n type: Input\n }], format: [{\n type: Input\n }], template: [{\n type: ContentChild,\n args: [CellTemplateDirective]\n }], groupHeaderTemplate: [{\n type: ContentChild,\n args: [GroupHeaderTemplateDirective]\n }], groupHeaderColumnTemplate: [{\n type: ContentChild,\n args: [GroupHeaderColumnTemplateDirective]\n }], groupFooterTemplate: [{\n type: ContentChild,\n args: [GroupFooterTemplateDirective]\n }], editTemplate: [{\n type: ContentChild,\n args: [EditTemplateDirective]\n }], filterCellTemplate: [{\n type: ContentChild,\n args: [FilterCellTemplateDirective]\n }], filterMenuTemplate: [{\n type: ContentChild,\n args: [FilterMenuTemplateDirective]\n }] }); })();\n\n/**\n * @hidden\n */\nfunction isSpanColumnComponent(column) {\n return column.isSpanColumn;\n}\n/**\n * Represents a column which can be spanned over multiple data cells while the individual\n * header and footer cells are retained ([see example]({% slug spanned_columns_grid %})).\n * Enables you to achieve more flexible layout while keeping the built-in UI element for\n * [sorting]({% slug sorting_grid %}), [filtering]({% slug filtering_grid %}), and\n * [grouping]({% slug groupingbasics_grid %}). Wrap the columns that will be\n * merged inside the `` tag.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * }\n *\n * ```\n *\n * By default, the data cell displays the data for the specified fields. To further customize\n * the span-column functionality, use a [cell template]({% slug api_grid_celltemplatedirective %}).\n *\n * ```html-no-run\n * \n * \n * \n * \n *
{{ dataItem.field1 }}
\n *

{{ dataItem.field2 }}

\n *
\n *
\n * ```\n */\nclass SpanColumnComponent extends ColumnBase$1 {\n constructor(parent) {\n super(parent);\n /*\n * @hidden\n */\n this.isSpanColumn = true;\n this.template = new QueryList();\n this.editTemplate = new QueryList();\n /**\n * @hidden\n */\n this.childColumns = new QueryList();\n /**\n * @hidden\n */\n this.includeInChooser = false;\n this._editable = true;\n this._locked = false;\n if (parent && parent.isSpanColumn) {\n throw new Error('SpanColumn cannot be nested inside another SpanColumn');\n }\n }\n /**\n * Defines whether the edit template of the column will be rendered. The default value is `false`.\n *\n * > To enable the editing functionality for a spanned column, set an edit template for it.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * .....\n * \n * \n * \n * ```\n */\n set editable(value) {\n this._editable = value;\n }\n get editable() {\n return isPresent(this.editTemplateRef) && this._editable;\n }\n /**\n * @hidden\n * added for backwards compitability\n */\n set width(_value) {\n }\n get width() {\n return this.childColumns.reduce((total, column) => total + column.width, 0);\n }\n /**\n * @hidden\n */\n get leafIndex() {\n return this.childColumns.first.leafIndex;\n }\n /**\n * @hidden\n */\n get templateRef() {\n const template = this.template.first;\n return template ? template.templateRef : undefined;\n }\n /**\n * @hidden\n */\n get editTemplateRef() {\n const editTemplate = this.editTemplate.first;\n return editTemplate ? editTemplate.templateRef : undefined;\n }\n /**\n * @hidden\n */\n get colspan() {\n return this.childColumns.filter(c => c.isVisible).length;\n }\n /**\n * Toggles the locked (frozen) state of the columns. Locked columns are visible\n * at all times during the horizontal scrolling of the Grid.\n *\n * For the option to work properly, make sure that:\n * - Scrolling is enabled.\n * - The `height` option of the Grid is set.\n * - The widths of all Grid columns are explicitly set in pixels. In this way,\n * the Grid adjusts the layout of the locked and unlocked columns.\n *\n * @default false\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\n set locked(value) {\n this._locked = value;\n }\n get locked() {\n return this._locked || this.childColumns.some(c => c.locked);\n }\n get childrenArray() {\n return this.childColumns.toArray();\n }\n get hasChildren() {\n return this.childColumns.length > 0;\n }\n}\nSpanColumnComponent.ɵfac = function SpanColumnComponent_Factory(t) { return new (t || SpanColumnComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase$1, 13)); };\nSpanColumnComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SpanColumnComponent, selectors: [[\"kendo-grid-span-column\"]], contentQueries: function SpanColumnComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, EditTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.editTemplate = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.childColumns = _t);\n } }, inputs: { editable: \"editable\", locked: \"locked\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => SpanColumnComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function SpanColumnComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nSpanColumnComponent.ctorParameters = () => [\n { type: ColumnBase$1, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nSpanColumnComponent.propDecorators = {\n template: [{ type: ContentChildren, args: [CellTemplateDirective, { descendants: false },] }],\n editTemplate: [{ type: ContentChildren, args: [EditTemplateDirective, { descendants: false },] }],\n childColumns: [{ type: ContentChildren, args: [ColumnComponent,] }],\n editable: [{ type: Input }],\n locked: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SpanColumnComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => SpanColumnComponent)\n }\n ],\n selector: 'kendo-grid-span-column',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase$1, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { template: [{\n type: ContentChildren,\n args: [CellTemplateDirective, { descendants: false }]\n }], editTemplate: [{\n type: ContentChildren,\n args: [EditTemplateDirective, { descendants: false }]\n }], childColumns: [{\n type: ContentChildren,\n args: [ColumnComponent]\n }], editable: [{\n type: Input\n }], locked: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nconst expandColumns = (columns) => (columns.reduce((acc, column) => acc.concat(isSpanColumnComponent(column) ? column.childrenArray : [column]), []) // tslint:disable-line:align\n);\n/**\n * @hidden\n */\nconst expandColumnsWithSpan = (columns) => (columns.reduce((acc, column) => acc.concat(isSpanColumnComponent(column) ?\n [column].concat(column.childrenArray) :\n [column]), []) // tslint:disable-line:align\n);\n/**\n * @hidden\n */\nconst columnsToRender = (columns) => (expandColumns(columns).filter(x => x.isVisible));\nconst sumProp = (prop) => (array) => (array || []).reduce((prev, curr) => prev + (curr[prop] || 0), 0);\n/**\n * @hidden\n */\nconst sumColumnWidths = sumProp('width');\n/**\n * @hidden\n */\nconst columnsSpan = sumProp('colspan');\n// tslint:disable-next-line:max-line-length\nconst validField = new RegExp(`^[$A-Z\\_a-z][$A-Z\\_a-z0-9\\\\.]*$`);\n/**\n * @hidden\n */\nconst isValidFieldName = (fieldName) => !isNullOrEmptyString(fieldName) && validField.test(fieldName) &&\n fieldName[0] !== \".\" && fieldName[fieldName.length - 1] !== \".\";\n/**\n * @hidden\n */\nconst children = column => column.children.filter(child => child !== column);\n/**\n * @hidden\n */\nconst leafColumns = columns => {\n return columns.reduce((acc, column) => {\n if (column.isColumnGroup) {\n acc = acc.concat(leafColumns(children(column)));\n }\n else if (column.isSpanColumn) {\n acc = acc.concat(column.childrenArray);\n }\n else {\n acc.push(column);\n }\n return acc;\n }, []).filter(x => x.isVisible); // tslint:disable-line:align\n};\n/**\n * @hidden\n */\nconst someLeafColumn = (callback, ...columns) => leafColumns(columns).some(callback);\n/**\n * @hidden\n */\nconst resizableColumns = columns => columns.filter(column => isTruthy(column.resizable) && column.isVisible);\n/**\n * @hidden\n */\nconst sortColumns = (columns) => orderBy(columns, [{ field: 'orderIndex', dir: 'asc' }]);\n/**\n * @hidden\n */\nconst isInSpanColumn = (column) => isTruthy(column.parent) && isSpanColumnComponent(column.parent);\n\n/**\n * @hidden\n */\nfunction isColumnGroupComponent(column) {\n return column.isColumnGroup;\n}\n/**\n * Represents the column group header of the Grid\n * ([more information and examples]({% slug multicolumnheaders_columns_grid %})).\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Column index: {{columnIndex}} / column title: {{column.title}}\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\nclass ColumnGroupComponent extends ColumnBase$1 {\n constructor(parent) {\n super(parent);\n this.parent = parent;\n /**\n * @hidden\n */\n this.includeInChooser = false;\n /**\n * @hidden\n */\n this.isColumnGroup = true;\n /**\n * @hidden\n */\n this.minResizableWidth = 10;\n if (parent && parent.isSpanColumn) {\n throw new Error('ColumnGroupComponent cannot be nested inside SpanColumnComponent');\n }\n }\n /**\n * @hidden\n */\n rowspan() {\n return 1;\n }\n /**\n * @hidden\n */\n get colspan() {\n if (!this.children || this.children.length === 1) {\n return 1;\n }\n return columnsSpan(this.children\n .filter(child => child !== this && child.isVisible));\n }\n /**\n * @hidden\n */\n get leafIndex() {\n return this.children ? (this.firstChild || {}).leafIndex : -1;\n }\n get childrenArray() {\n return this.children.filter(c => c !== this);\n }\n get hasChildren() {\n return Boolean(this.firstChild);\n }\n get firstChild() {\n return this.children.find(column => column !== this);\n }\n}\nColumnGroupComponent.ɵfac = function ColumnGroupComponent_Factory(t) { return new (t || ColumnGroupComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase$1, 13)); };\nColumnGroupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnGroupComponent, selectors: [[\"kendo-grid-column-group\"]], contentQueries: function ColumnGroupComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase$1, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.children = _t);\n } }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => ColumnGroupComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function ColumnGroupComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nColumnGroupComponent.ctorParameters = () => [\n { type: ColumnBase$1, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nColumnGroupComponent.propDecorators = {\n children: [{ type: ContentChildren, args: [ColumnBase$1,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnGroupComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => ColumnGroupComponent)\n }\n ],\n selector: 'kendo-grid-column-group',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase$1, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { children: [{\n type: ContentChildren,\n args: [ColumnBase$1]\n }] }); })();\n\n/**\n * Represents the detail template of the Grid ([more information and examples]({% slug detailrowtemplate_grid %})).\n * To define the detail template, nest an `` tag with the `kendoGridDetailTemplate` directive inside a `` tag.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n *
\n *
{{dataItem.Category?.CategoryName}}
\n * {{dataItem.Category?.Description}}\n *
\n *
\n *
\n * `\n * })\n *\n * class AppComponent {\n * public data = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 1,\n * \"CategoryName\": \"Beverages\",\n * \"Description\": \"Soft drinks, coffees, teas, beers, and ales\"\n * }\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 1,\n * \"CategoryName\": \"Beverages\",\n * \"Description\": \"Soft drinks, coffees, teas, beers, and ales\"\n * }\n * }, {\n * \"ProductID\": 3,\n * \"ProductName\": \"Aniseed Syrup\",\n * \"UnitPrice\": 10.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 2,\n * \"CategoryName\": \"Condiments\",\n * \"Description\": \"Sweet and savory sauces, relishes, spreads, and seasonings\"\n * }\n * }];\n *\n * }\n *\n * ```\n *\n */\nclass DetailTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n this._condition = () => true;\n }\n /**\n * Defines the function that indicates if a given detail row and the associated **Expand** or **Collapse** button will be displayed.\n */\n set showIf(fn) {\n if (typeof fn !== 'function') {\n throw new Error(`showIf must be a function, but received ${JSON.stringify(fn)}.`);\n }\n this._condition = fn;\n }\n get showIf() {\n return this._condition;\n }\n}\nDetailTemplateDirective.ɵfac = function DetailTemplateDirective_Factory(t) { return new (t || DetailTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nDetailTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DetailTemplateDirective, selectors: [[\"\", \"kendoGridDetailTemplate\", \"\"]], inputs: { showIf: [\"kendoGridDetailTemplateShowIf\", \"showIf\"] } });\n/** @nocollapse */\nDetailTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\nDetailTemplateDirective.propDecorators = {\n showIf: [{ type: Input, args: [\"kendoGridDetailTemplateShowIf\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DetailTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridDetailTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, { showIf: [{\n type: Input,\n args: [\"kendoGridDetailTemplateShowIf\"]\n }] }); })();\n\nconst canCreateElement = () => isDocumentAvailable() && document.createElement;\nlet cachedScrollbarWidth = null;\nlet cachedPixelRatio;\nlet cachedRtlScrollLeft = null;\nfunction scrollbarWidth() {\n if (cachedScrollbarWidth === null && canCreateElement()) {\n cachedPixelRatio = window.devicePixelRatio || 1;\n const div = document.createElement(\"div\");\n div.style.cssText = \"overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block\";\n div.innerHTML = \" \";\n document.body.appendChild(div);\n cachedScrollbarWidth = div.offsetWidth - div.scrollWidth;\n document.body.removeChild(div);\n }\n return cachedScrollbarWidth;\n}\nfunction rtlScrollLeft() {\n if (cachedRtlScrollLeft === null && canCreateElement()) {\n const div = document.createElement(\"div\");\n div.style.cssText = \"overflow:scroll;zoom:1;clear:both;display:block;width:100px;visibility:hidden;position:absolute;left:-10000px;direction:rtl;\";\n div.innerHTML = \"
\";\n document.body.appendChild(div);\n const initial = div.scrollLeft;\n div.scrollLeft = -1;\n cachedRtlScrollLeft = div.scrollLeft < 0 ? div.scrollLeft : initial;\n document.body.removeChild(div);\n }\n return cachedRtlScrollLeft;\n}\n/**\n * @hidden\n * move to kendo-common\n */\nclass BrowserSupportService {\n constructor(zone, changeDetector) {\n this.zone = zone;\n this.changeDetector = changeDetector;\n this.changes = new EventEmitter();\n if (typeof window === 'undefined') {\n return;\n }\n this.zone.runOutsideAngular(() => {\n this.subscriptions = fromEvent(window, 'resize').pipe(auditTime(100)).subscribe(() => {\n if (cachedPixelRatio !== window.devicePixelRatio) {\n zone.run(() => {\n cachedScrollbarWidth = null;\n this.changes.emit();\n this.changeDetector.markForCheck();\n });\n }\n });\n });\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n this.subscriptions = null;\n }\n }\n get scrollbarWidth() {\n return scrollbarWidth();\n }\n get rtlScrollLeft() {\n return rtlScrollLeft();\n }\n}\nBrowserSupportService.ɵfac = function BrowserSupportService_Factory(t) { return new (t || BrowserSupportService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(ɵngcc0.ChangeDetectorRef)); };\nBrowserSupportService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: BrowserSupportService, factory: BrowserSupportService.ɵfac });\n/** @nocollapse */\nBrowserSupportService.ctorParameters = () => [\n { type: NgZone },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BrowserSupportService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\n/* tslint:disable:use-life-cycle-interface */\nconst isGroupItem = (source) => {\n return source.items !== undefined &&\n source.field !== undefined;\n};\nconst isVirtualGroupItem = (source) => {\n return source.offset !== undefined &&\n source.skipHeader !== undefined;\n};\nconst flattenGroups = (groups) => (groups.reduce((acc, curr) => {\n if (isGroupItem(curr)) {\n return acc.concat(flattenGroups(curr.items));\n }\n return acc.concat([curr]);\n}, []) // tslint:disable-line:align\n);\n/**\n * @hidden\n */\nconst itemAt = (data, index) => {\n const first = data[0];\n if (isPresent(first) && isGroupItem(first)) {\n return flattenGroups(data)[index];\n }\n return data[index];\n};\n/**\n * @hidden\n */\nconst getIterator$1 = (data, { footers, level, dataIndex, parentGroupIndex, groupIndex }) => {\n const first = data[0];\n if (isPresent(first) && isGroupItem(first)) {\n if (isVirtualGroupItem(first)) {\n groupIndex = isPresent(first.offset) ? first.offset : groupIndex;\n }\n //tslint:disable-next-line:no-use-before-declare\n return new GroupIterator(data, footers, level, dataIndex, parentGroupIndex, groupIndex);\n }\n //tslint:disable-next-line:no-use-before-declare\n return new ItemIterator(data, dataIndex, parentGroupIndex);\n};\nclass ArrayIterator {\n constructor(arr, idx = 0) {\n this.arr = arr;\n this.idx = idx;\n this.arr = arr || [];\n }\n [iterator]() {\n return this;\n }\n next() {\n return this.idx < this.arr.length ? {\n done: false,\n value: this.arr[this.idx++]\n } : { done: true, value: undefined };\n }\n}\n/**\n * @hidden\n */\nclass Iterator {\n constructor(arr, dataIndex = 0, resultMap = (x) => x) {\n this.dataIndex = dataIndex;\n this.resultMap = resultMap;\n const iter = arr[iterator];\n this._innerIterator = iter ? arr[iterator]() : new ArrayIterator(arr);\n }\n [iterator]() {\n return this;\n }\n next() {\n return this.resultMap(this._innerIterator.next(), this.dataIndex++);\n }\n}\n/**\n * @hidden\n */\nclass ItemIterator extends Iterator {\n constructor(arr, dataIndex, groupIndex) {\n super(arr, dataIndex, (x, idx) => ({\n done: x.done,\n value: {\n data: x.value,\n groupIndex: groupIndex,\n index: idx,\n type: 'data'\n }\n }));\n }\n /**\n * The index of the next record.\n * @readonly\n * @type {number}\n */\n get index() {\n return this.dataIndex;\n }\n}\nconst prefix = (s, n) => {\n const p = s ? s + \"_\" : s;\n return `${p}${n}`;\n};\n/**\n * @hidden\n */\nclass GroupIterator {\n constructor(arr, outputFooters = false, level = 0, dataIndex = 0, parentIndex = \"\", groupIndex = 0) {\n this.arr = arr;\n this.outputFooters = outputFooters;\n this.level = level;\n this.dataIndex = dataIndex;\n this.parentIndex = parentIndex;\n this.groupIndex = groupIndex;\n this.currentGroupIndex = \"\";\n this.arr = arr || [];\n this._iterator = new Iterator(this.arr, this.dataIndex);\n }\n [iterator]() {\n return this;\n }\n nextGroupItem() {\n this.current = this._iterator.next().value;\n this._innerIterator = null;\n if (this.current) {\n this.currentGroupIndex = prefix(this.parentIndex, this.groupIndex++);\n return {\n done: false,\n value: {\n data: this.current,\n index: this.currentGroupIndex,\n level: this.level,\n type: 'group'\n }\n };\n }\n else {\n this.current = null;\n return { done: true, value: undefined };\n }\n }\n footerItem() {\n if (this.current) {\n const group = this.current;\n this.current = null;\n return {\n done: false,\n value: {\n data: group,\n groupIndex: this.currentGroupIndex,\n level: this.level,\n type: 'footer'\n }\n };\n }\n else {\n this.current = null;\n return { done: true, value: undefined };\n }\n }\n innerIterator(group) {\n if (!this._innerIterator) {\n this._innerIterator = getIterator$1(group.items, {\n dataIndex: this.dataIndex,\n footers: this.outputFooters,\n level: this.level + 1,\n parentGroupIndex: this.currentGroupIndex\n });\n }\n return this._innerIterator;\n }\n nextDataItem(group) {\n const iterator$$1 = this.innerIterator(group);\n const result = iterator$$1.next();\n if (isPresent(result.value) && !result.done && result.value.type === \"data\") {\n this.dataIndex = result.value.index + 1;\n }\n return !result.done ? result : undefined;\n }\n next() {\n if (!isPresent(this.current)) {\n return this.nextGroupItem();\n }\n const item = this.nextDataItem(this.current);\n return item ? item : (this.outputFooters ? this.footerItem() : this.nextGroupItem());\n }\n /**\n * The index of the last iterated data record.\n * @readonly\n * @type {number}\n */\n get index() {\n return this.dataIndex + 1;\n }\n}\n\n/**\n * @hidden\n */\nclass DataResultIterator {\n constructor(source, skip = 0, groupFooters = false) {\n this.source = source;\n this.skip = skip;\n this.groupFooters = groupFooters;\n this.source = this.source ? this.source : [];\n this.isObject = this.isGridDataResult(this.source);\n }\n isGridDataResult(source) {\n return source.total !== undefined && source.data !== undefined;\n }\n get total() {\n return this.isObject ? this.source.total : this.source.length;\n }\n get data() {\n return this.isObject ? this.source.data : this.source;\n }\n map(fn) {\n return this.data.map(fn);\n }\n filter(fn) {\n return this.data.filter(fn);\n }\n reduce(fn, init) {\n return this.data.reduce(fn, init);\n }\n forEach(fn) {\n this.data.forEach(fn);\n }\n some(fn) {\n return this.data.some(fn);\n }\n [iterator]() {\n return getIterator$1(this.data, {\n dataIndex: this.skip,\n footers: this.groupFooters,\n groupIndex: this.skip\n });\n }\n toString() { return this.data.toString(); }\n}\n/**\n * @hidden\n */\nclass DataCollection {\n constructor(accessor) {\n this.accessor = accessor;\n }\n get total() { return this.accessor().total; }\n get length() { return this.accessor().data.length; }\n get first() { return this.accessor().data[0]; }\n get last() { return this.accessor().data[this.length - 1]; }\n at(index) {\n return itemAt(this.accessor().data, index);\n }\n map(fn) { return this.accessor().map(fn); }\n filter(fn) {\n return this.accessor().filter(fn);\n }\n reduce(fn, init) {\n return this.accessor().reduce(fn, init);\n }\n forEach(fn) {\n this.accessor().forEach(fn);\n }\n some(fn) {\n return this.accessor().some(fn);\n }\n [iterator]() {\n return this.accessor()[iterator]();\n }\n toString() { return this.accessor().toString(); }\n}\n\n/* tslint:disable:no-input-rename */\n/**\n * @hidden\n */\nclass Selection {\n constructor(grid, cd) {\n this.grid = grid;\n this.cd = cd;\n /**\n * Defines the collection that will store the selected item keys.\n */\n this.selectedKeys = [];\n /**\n * Fires when the `selectedKeys` collection has been updated.\n */\n this.selectedKeysChange = new EventEmitter();\n this.init();\n }\n init() {\n if (!isPresent(this.grid.rowSelected)) {\n this.grid.rowSelected = (row) => {\n return this.selectedKeys.indexOf(this.getItemKey(row)) >= 0;\n };\n }\n if (!isPresent(this.grid.cellSelected)) {\n this.grid.cellSelected = (row, column, colIndex) => {\n const contender = this.getSelectionItem(row, column, colIndex);\n return {\n selected: this.selectedKeys.some(item => item.columnKey === contender.columnKey && item.itemKey === contender.itemKey),\n item: contender\n };\n };\n }\n this.selectionChangeSubscription = this.grid\n .selectionChange\n .subscribe(this.onSelectionChange.bind(this));\n }\n /**\n * @hidden\n */\n destroy() {\n this.selectionChangeSubscription.unsubscribe();\n }\n /**\n * @hidden\n */\n reset() {\n this.selectedKeys = [];\n }\n getItemKey(row) {\n if (this.selectionKey) {\n if (typeof this.selectionKey === \"string\") {\n return row.dataItem[this.selectionKey];\n }\n if (typeof this.selectionKey === \"function\") {\n return this.selectionKey(row);\n }\n }\n return row.index;\n }\n getSelectionItem(row, col, colIndex) {\n const itemIdentifiers = {};\n itemIdentifiers.itemKey = this.getItemKey(row);\n if (!isPresent(col) && !isPresent(colIndex)) {\n return itemIdentifiers;\n }\n if (this.columnKey) {\n if (typeof this.columnKey === \"string\") {\n itemIdentifiers.columnKey = row.dataItem[this.columnKey];\n }\n if (typeof this.columnKey === \"function\") {\n itemIdentifiers.columnKey = this.columnKey(col, colIndex);\n }\n }\n return {\n itemKey: itemIdentifiers.itemKey,\n columnKey: itemIdentifiers.columnKey ? itemIdentifiers.columnKey : colIndex\n };\n }\n onSelectionChange(selection) {\n if (selection.selectedRows) {\n selection.deselectedRows.forEach((item) => {\n const itemKey = this.getItemKey(item);\n const itemIndex = this.selectedKeys.indexOf(itemKey);\n if (itemIndex >= 0) {\n this.selectedKeys.splice(itemIndex, 1);\n }\n });\n if (this.grid.selectableSettings.mode === \"single\" && this.selectedKeys.length > 0) {\n this.reset();\n }\n selection.selectedRows.forEach((item) => {\n const itemKey = this.getItemKey(item);\n if (this.selectedKeys.indexOf(itemKey) < 0) {\n this.selectedKeys.push(itemKey);\n }\n });\n }\n else {\n selection.deselectedCells.forEach((item) => {\n const itemIndex = this.getCellSelectionItemIndex(item);\n if (itemIndex >= 0) {\n this.selectedKeys.splice(itemIndex, 1);\n }\n });\n if (this.grid.selectableSettings.mode === \"single\" && this.selectedKeys.length > 0) {\n this.reset();\n }\n selection.selectedCells.forEach((item) => {\n const itemIndex = this.getCellSelectionItemIndex(item);\n if (itemIndex < 0) {\n this.selectedKeys.push(item);\n }\n });\n }\n this.cd.markForCheck();\n this.selectedKeysChange.emit(this.selectedKeys);\n }\n getCellSelectionItemIndex(item) {\n return this.selectedKeys.findIndex(selectedItem => selectedItem.itemKey === item.itemKey && selectedItem.columnKey === item.columnKey);\n }\n}\nSelection.ɵfac = function Selection_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nSelection.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Selection, inputs: { selectedKeys: \"selectedKeys\", selectionKey: [\"kendoGridSelectBy\", \"selectionKey\"], columnKey: \"columnKey\" }, outputs: { selectedKeysChange: \"selectedKeysChange\" } });\nSelection.propDecorators = {\n selectedKeys: [{ type: Input }],\n selectionKey: [{ type: Input, args: [\"kendoGridSelectBy\",] }],\n columnKey: [{ type: Input }],\n selectedKeysChange: [{ type: Output }]\n};\n\n\nconst reset = (...lists) => {\n let diff = false;\n for (let idx = 0; idx < lists.length; idx++) {\n const [list, columns] = lists[idx];\n diff = diff || list.length !== columns.length;\n list.reset(columns);\n }\n return diff;\n};\n/**\n * @hidden\n */\nclass ColumnsContainer {\n constructor(columns) {\n this.columns = columns;\n this.allColumns = new QueryList();\n this.leafColumns = new QueryList();\n this.lockedColumns = new QueryList();\n this.nonLockedColumns = new QueryList();\n this.lockedLeafColumns = new QueryList();\n this.nonLockedLeafColumns = new QueryList();\n this.totalLevels = 0;\n this.changes = new EventEmitter();\n this.leafColumnsToRender = [];\n this.lockedColumnsToRender = [];\n this.nonLockedColumnsToRender = [];\n this.hasGroupHeaderColumn = false;\n this.hasGroupFooter = false;\n this.hasFooter = false;\n this.unlockedWidth = 0;\n }\n refresh() {\n const currentLevels = this.totalLevels;\n const leafColumns$$1 = new Array();\n const lockedLeafColumns = new Array();\n const nonLockedLeafColumns = new Array();\n const lockedColumns = new Array();\n const nonLockedColumns = new Array();\n const allColumns = new Array();\n const leafColumnsToRender = new Array();\n const lockedColumnsToRender = new Array();\n const nonLockedColumnsToRender = new Array();\n let hasGroupHeaderColumn = false;\n let hasGroupFooter = false;\n let hasFooter = false;\n let unlockedWidth = 0;\n let leafIndex = 0;\n this.totalLevels = 0;\n this.columns().forEach(column => {\n const containerLeafColumns = column.isLocked === true ? lockedLeafColumns : nonLockedLeafColumns;\n const containerColumns = column.isLocked === true ? lockedColumns : nonLockedColumns;\n const toRenderContainer = column.isLocked === true ? lockedColumnsToRender : nonLockedColumnsToRender;\n if (!isColumnGroupComponent(column)) {\n containerLeafColumns.push(column);\n leafColumns$$1.push(column);\n leafColumnsToRender.push.apply(leafColumnsToRender, columnsToRender([column]));\n toRenderContainer.push.apply(toRenderContainer, columnsToRender([column]));\n hasGroupHeaderColumn = hasGroupHeaderColumn || someLeafColumn(leaf => Boolean(leaf.groupHeaderColumnTemplateRef), column);\n hasGroupFooter = hasGroupFooter || someLeafColumn(leaf => Boolean(leaf.groupFooterTemplateRef), column);\n hasFooter = hasFooter || someLeafColumn(leaf => Boolean(leaf.footerTemplateRef), column);\n if (!column.isLocked) {\n unlockedWidth += column.width || 0;\n }\n if (column.isSpanColumn) {\n column.childColumns.forEach(c => {\n c.leafIndex = leafIndex++;\n });\n }\n else {\n column.leafIndex = leafIndex++;\n }\n }\n containerColumns.push(column);\n allColumns.push(column);\n this.totalLevels = column.level > this.totalLevels ? column.level : this.totalLevels;\n });\n this.hasGroupHeaderColumn = hasGroupHeaderColumn;\n this.hasGroupFooter = hasGroupFooter;\n this.hasFooter = hasFooter;\n this.leafColumnsToRender = leafColumnsToRender;\n this.lockedColumnsToRender = lockedColumnsToRender;\n this.nonLockedColumnsToRender = nonLockedColumnsToRender;\n this.unlockedWidth = unlockedWidth;\n const changes = reset([this.leafColumns, leafColumns$$1], [this.lockedLeafColumns, lockedLeafColumns], [this.nonLockedLeafColumns, nonLockedLeafColumns], [this.lockedColumns, lockedColumns], [this.allColumns, allColumns], [this.nonLockedColumns, nonLockedColumns]) || currentLevels !== this.totalLevels;\n if (changes) {\n this.changes.emit();\n }\n return changes;\n }\n}\n\nconst forEachColumn = (list, callback) => {\n list.forEach((column) => {\n callback(column);\n if (column.isColumnGroup && column.hasChildren) {\n forEachColumn(column.childrenArray, callback);\n }\n });\n};\nconst forEachLevel = (list, callback) => {\n sortColumns(list)\n .forEach((column) => {\n callback(column);\n if (column.isColumnGroup && column.hasChildren) {\n forEachLevel(column.childrenArray, callback);\n }\n });\n};\nconst filterHierarchy = (list, predicate) => {\n const result = [];\n sortColumns(list)\n .forEach((column) => {\n if (predicate(column)) {\n if (column.isColumnGroup) {\n const children$$1 = filterHierarchy(column.childrenArray, predicate);\n if (children$$1.length) {\n result.push(column, ...children$$1);\n }\n }\n else if (!column.isSpanColumn || filterHierarchy(column.childrenArray, predicate).length) {\n result.push(column);\n }\n }\n });\n return result;\n};\n/**\n * @hidden\n */\nclass ColumnList {\n constructor(columns) {\n this.columns = columns;\n }\n static empty() {\n return new ColumnList(new QueryList());\n }\n forEach(callback) {\n forEachColumn(this.columns, callback);\n }\n filter(callback) {\n const result = [];\n forEachColumn(this.columns, (column) => {\n if (callback(column)) {\n result.push(column);\n }\n });\n return result;\n }\n filterHierarchy(predicate) {\n return filterHierarchy(this.columns.toArray(), predicate);\n }\n filterSort(callback) {\n const result = [];\n forEachLevel(this.columns.toArray(), (column) => {\n if (callback(column)) {\n result.push(column);\n }\n });\n return result;\n }\n toArray() {\n const result = [];\n forEachColumn(this.columns, (column) => {\n result.push(column);\n });\n return result;\n }\n rootColumns() {\n return this.columns.toArray();\n }\n}\n\n/**\n * @hidden\n */\nclass GroupInfoService {\n constructor() {\n this._columnList = ColumnList.empty;\n }\n get columns() {\n return expandColumns(this._columnList().toArray()).filter(isColumnComponent);\n }\n registerColumnsContainer(columns) {\n this._columnList = columns;\n }\n formatForGroup(item) {\n const column = this.columnForGroup(item);\n return column ? column.format : \"\";\n }\n isGroupable(groupField) {\n const [column] = this.columns.filter(x => x.field === groupField);\n return column ? column.groupable : true;\n }\n groupTitle(item) {\n const column = this.columnForGroup(item);\n return column ? (column.title || column.field) : this.groupField(item);\n }\n groupHeaderTemplate(item) {\n const column = this.columnForGroup(item);\n return column ? column.groupHeaderTemplateRef || column.groupHeaderColumnTemplateRef : undefined;\n }\n groupField(group) {\n return group.data ? group.data.field : group.field;\n }\n columnForGroup(group) {\n const field = this.groupField(group);\n const [column] = this.columns.filter(x => x.field === field);\n return column;\n }\n}\nGroupInfoService.ɵfac = function GroupInfoService_Factory(t) { return new (t || GroupInfoService)(); };\nGroupInfoService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: GroupInfoService, factory: GroupInfoService.ɵfac });\n\n\n/**\n * @hidden\n */\nclass ChangeNotificationService {\n constructor(ngZone) {\n this.ngZone = ngZone;\n this.changes = new EventEmitter();\n }\n notify() {\n if (!this.subscription || this.subscription.closed) {\n this.subscription = this.ngZone.onStable\n .asObservable().pipe(take(1))\n .subscribe(() => this.changes.emit());\n }\n }\n}\nChangeNotificationService.ɵfac = function ChangeNotificationService_Factory(t) { return new (t || ChangeNotificationService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nChangeNotificationService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ChangeNotificationService, factory: ChangeNotificationService.ɵfac });\n/** @nocollapse */\nChangeNotificationService.ctorParameters = () => [\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ChangeNotificationService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * Represents the no-records template of the Grid. Provides an option to customize the\n * appearance of the item that is displayed when no data is present. To define the no-records template,\n * nest an `` tag with the `kendoGridNoRecordsTemplate` directive inside ``.\n *\n * > When the locked columns of the Grid are in use, the template is displayed in the non-locked part of the content.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * There are not products. Click here to refresh.\n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data = [];\n * public refresh() {\n * this.data = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 1,\n * \"CategoryName\": \"Beverages\",\n * \"Description\": \"Soft drinks, coffees, teas, beers, and ales\"\n * }\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 1,\n * \"CategoryName\": \"Beverages\",\n * \"Description\": \"Soft drinks, coffees, teas, beers, and ales\"\n * }\n * }, {\n * \"ProductID\": 3,\n * \"ProductName\": \"Aniseed Syrup\",\n * \"UnitPrice\": 10.0000,\n * \"Discontinued\": false,\n * \"Category\": {\n * \"CategoryID\": 2,\n * \"CategoryName\": \"Condiments\",\n * \"Description\": \"Sweet and savory sauces, relishes, spreads, and seasonings\"\n * }\n * }];\n *\n * }\n * }\n *\n * ```\n */\nclass NoRecordsTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nNoRecordsTemplateDirective.ɵfac = function NoRecordsTemplateDirective_Factory(t) { return new (t || NoRecordsTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nNoRecordsTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: NoRecordsTemplateDirective, selectors: [[\"\", \"kendoGridNoRecordsTemplate\", \"\"]] });\n/** @nocollapse */\nNoRecordsTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NoRecordsTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridNoRecordsTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\nconst set = value => pair => pair.forEach(x => x.style.height = value);\nconst clearHeight = pairs => pairs\n .filter(([left, right]) => left.style.height || right.style.height)\n .forEach(set(\"\"));\nconst zip$1 = (arr1, arr2) => {\n const result = [];\n for (let idx = 0, len = arr1.length; idx < len; idx++) {\n if (!arr2[idx]) {\n break;\n }\n result.push([arr1[idx], arr2[idx]]);\n }\n return result;\n};\nconst setHeight = heights => (row, idx) => set(`${heights[idx] + 1}px`)(row);\nconst getHeights = rows => rows.map(([left, right]) => {\n const height = left.offsetHeight;\n const offsetHeight2 = right.offsetHeight;\n if (height < offsetHeight2) {\n return offsetHeight2;\n }\n return height;\n});\n/**\n * @hidden\n */\nconst syncRowsHeight = (table1, table2) => {\n const activeElement = document.activeElement;\n const rows = zip$1(table1.rows, table2.rows);\n clearHeight(rows);\n const heights = getHeights(rows);\n [table1, table2].forEach(x => x.style.display = 'none');\n rows.forEach(setHeight(heights));\n [table1, table2].forEach(x => x.style.display = '');\n if (document.activeElement !== activeElement &&\n (table1.contains(activeElement) || table2.contains(activeElement))) {\n activeElement.focus();\n }\n};\n\n/**\n * Represents a service to set the filter descriptor\n * ([see example]({% slug reusablecustomfilters_grid %})).\n */\nclass FilterService {\n constructor() {\n /**\n * Fires when the filter descriptors is set.\n */\n this.changes = new Subject();\n }\n /**\n * Sets the filter descriptor.\n *\n * @param {CompositeFilterDescriptor} value - The filter descriptor that will be set.\n */\n filter(value) {\n this.changes.next(value);\n }\n}\nFilterService.ɵfac = function FilterService_Factory(t) { return new (t || FilterService)(); };\nFilterService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: FilterService, factory: FilterService.ɵfac });\n\n\n/**\n * Represents the pager template which helps to customize the pager appearance in the Grid. To define a pager\n * template, nest an `` tag with the `kendoPagerTemplate` directive inside ``.\n *\n * The template context provides the following fields:\n * * `currentPage`—The index of the displayed page.\n * * `pageSize`—The value of the current `pageSize`.\n * * `skip`—The current skip value.\n * * `total`—The total number of records.\n * * `totalPages`—The total number of available pages.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n *\n * \n * \n * \n * \n * \n * Current page: {{currentPage}}\n * \n *\n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n * }\n *\n * ```\n */\nclass PagerTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nPagerTemplateDirective.ɵfac = function PagerTemplateDirective_Factory(t) { return new (t || PagerTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nPagerTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PagerTemplateDirective, selectors: [[\"\", \"kendoPagerTemplate\", \"\"]] });\n/** @nocollapse */\nPagerTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoPagerTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nclass PDFService {\n constructor() {\n this.savePDF = new EventEmitter();\n this.drawPDF = new EventEmitter();\n this.exportClick = new EventEmitter();\n this.dataChanged = new EventEmitter();\n }\n save(component) {\n this.emitEvent(this.savePDF, component);\n }\n draw(component, promise) {\n this.emitEvent(this.drawPDF, { component, promise });\n }\n emitEvent(emitter, args) {\n if (emitter.observers.length === 0) {\n if (isDevMode()) {\n throw new Error('Creating PDF requires including the PDFModule and adding the component.');\n }\n }\n else {\n emitter.emit(args);\n }\n }\n}\nPDFService.ɵfac = function PDFService_Factory(t) { return new (t || PDFService)(); };\nPDFService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: PDFService, factory: PDFService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * Arguments for the `pdfExport` event.\n */\nclass PDFExportEvent extends PreventableEvent {\n}\n\n/**\n * @hidden\n */\nclass SuspendService {\n constructor() {\n this.scroll = false;\n }\n}\nSuspendService.ɵfac = function SuspendService_Factory(t) { return new (t || SuspendService)(); };\nSuspendService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SuspendService, factory: SuspendService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SuspendService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/* tslint:disable: object-literal-sort-keys */\nconst bootstrapToMedia = (media) => (({\n \"xs\": \"(max-width: 576px)\",\n \"sm\": \"(min-width: 576px)\",\n \"md\": \"(min-width: 768px)\",\n \"lg\": \"(min-width: 992px)\",\n \"xl\": \"(min-width: 1200px)\"\n})[media] || media);\n/* tslint:enable: object-literal-sort-keys */\nconst browserMatchMedia = (media) => window.matchMedia(media).matches;\n/**\n * @hidden\n */\nclass ResponsiveService {\n constructor() {\n /**\n * @hidden\n */\n this.matchMedia = browserMatchMedia;\n }\n /**\n * @hidden\n */\n matchesMedia(media) {\n return !media || this.matchMedia(bootstrapToMedia(media));\n }\n}\nResponsiveService.ɵfac = function ResponsiveService_Factory(t) { return new (t || ResponsiveService)(); };\nResponsiveService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ResponsiveService, factory: ResponsiveService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ResponsiveService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass ExcelService {\n constructor() {\n this.saveToExcel = new EventEmitter();\n this.exportClick = new EventEmitter();\n }\n save(component) {\n if (this.saveToExcel.observers.length === 0) {\n if (isDevMode()) {\n throw new Error('Saving excel requires including the ExcelModule and adding the component.');\n }\n }\n else {\n this.saveToExcel.emit(component);\n }\n }\n}\nExcelService.ɵfac = function ExcelService_Factory(t) { return new (t || ExcelService)(); };\nExcelService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ExcelService, factory: ExcelService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * Represents the toolbar template of the Grid.\n *\n * The template context has the following field:\n * - `position`—The position at which the toolbar template is rendered. The possible values are \"top\" and \"bottom\".\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n *
\n * \n *
\n * \n *
\n * \n *
\n *
\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public position: 'top' | 'bottom' | 'both' = 'top';\n *\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n *\n * public onClick(): void {\n * console.log(\"button was clicked\");\n * }\n *\n * public positionChange({ target }): void {\n * this.position = target.value;\n * }\n * }\n *\n * ```\n */\nclass ToolbarTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n this._position = \"top\";\n }\n /**\n * The position of the toolbar ([see example]({% slug toolbartemplate_grid %})).\n *\n * The possible values are:\n * - `top`—Positions the toolbar above the group panel or header.\n * - `bottom`—Positions the toolbar below the pager.\n * - `both`—Displays two toolbar instances. Positions the first one above\n * the group panel or header and the second one below the pager.\n */\n set position(position) {\n this._position = position;\n }\n get position() {\n return this._position;\n }\n}\nToolbarTemplateDirective.ɵfac = function ToolbarTemplateDirective_Factory(t) { return new (t || ToolbarTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nToolbarTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ToolbarTemplateDirective, selectors: [[\"\", \"kendoGridToolbarTemplate\", \"\"]], inputs: { position: \"position\" } });\n/** @nocollapse */\nToolbarTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\nToolbarTemplateDirective.propDecorators = {\n position: [{ type: Input, args: [\"position\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ToolbarTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridToolbarTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, { position: [{\n type: Input,\n args: [\"position\"]\n }] }); })();\n\n/**\n * @hidden\n */\nclass ScrollSyncService {\n constructor(ngZone) {\n this.ngZone = ngZone;\n this.changes = new Subject();\n this.elements = [];\n this.subscriptions = new Subscription();\n this.headerSubscription = new Subscription();\n this.bodySubscription = new Subscription();\n this.subscriptions.add(this.changes.subscribe(args => this.scrollLeft(args)));\n }\n registerEmitter(el, sourceType) {\n this.unregister(sourceType);\n this.elements.push({ element: el, sourceType });\n if (sourceType === \"body\" || sourceType === \"header\") {\n this.ngZone.runOutsideAngular(() => {\n const obs = fromEvent(el, \"scroll\").pipe(map(({ target: { scrollLeft } }) => ({\n scrollLeft,\n sourceType\n })));\n const subscription = obs.pipe(distinctUntilChanged((x, y) => (x.scrollLeft === y.scrollLeft)), filter(x => !this.source || this.source === x.sourceType), tap(x => this.source = x.sourceType))\n .subscribe((x) => this.changes.next(x));\n subscription.add(obs.pipe(filter(x => this.source && this.source !== x.sourceType))\n .subscribe(() => this.source = undefined));\n if (sourceType === \"body\") {\n this.bodySubscription.add(subscription);\n }\n else {\n this.headerSubscription.add(subscription);\n }\n });\n }\n }\n /**\n * destroy\n */\n destroy() {\n this.subscriptions.unsubscribe();\n this.headerSubscription.unsubscribe();\n this.bodySubscription.unsubscribe();\n }\n scrollLeft({ scrollLeft, sourceType }) {\n this.ngZone.runOutsideAngular(() => {\n this.elements\n .filter(x => sourceType !== x.sourceType)\n .forEach(({ element }) => element.scrollLeft = scrollLeft);\n });\n }\n unregister(sourceType) {\n const index = this.elements.findIndex(x => x.sourceType === sourceType);\n if (index > -1) {\n if (sourceType === \"header\") {\n this.headerSubscription.unsubscribe();\n this.headerSubscription = new Subscription();\n }\n else if (sourceType === \"body\") {\n this.bodySubscription.unsubscribe();\n this.bodySubscription = new Subscription();\n }\n this.elements.splice(index, 1);\n }\n }\n}\nScrollSyncService.ɵfac = function ScrollSyncService_Factory(t) { return new (t || ScrollSyncService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nScrollSyncService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ScrollSyncService, factory: ScrollSyncService.ɵfac });\n/** @nocollapse */\nScrollSyncService.ctorParameters = () => [\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ScrollSyncService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * @hidden\n */\nclass ResizeService {\n constructor() {\n this.resizeSubscription = new Subscription(() => { });\n this.dispatcher = new Subject();\n // tslint:disable-next-line:member-ordering\n this.changes = this.dispatcher.asObservable().pipe(throttleTime(100));\n }\n connect(resizes) {\n this.resizeSubscription.add(resizes.subscribe(this.dispatcher));\n }\n destroy() {\n if (this.resizeSubscription) {\n this.resizeSubscription.unsubscribe();\n }\n }\n}\nResizeService.ɵfac = function ResizeService_Factory(t) { return new (t || ResizeService)(); };\nResizeService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ResizeService, factory: ResizeService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ResizeService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nconst isLocked = column => column.parent ? isLocked(column.parent) : !!column.locked;\n/**\n * @hidden\n */\nconst resizeArgs = (column, extra) => Object.assign({\n columns: leafColumns([column]),\n locked: isLocked(column)\n}, extra); // tslint:disable-line:align\n/**\n * @hidden\n */\nclass ColumnResizingService {\n constructor() {\n this.changes = new EventEmitter();\n this.tables = [];\n this.batch = null;\n }\n start(column) {\n this.trackColumns(column);\n const columns = (this.column.isColumnGroup ? [column] : [])\n .concat(leafColumns([column]));\n this.changes.emit({\n columns: columns,\n locked: isLocked(this.column),\n type: 'start'\n });\n }\n resizeColumns(deltaPercent) {\n const action = resizeArgs(this.column, {\n deltaPercent,\n type: 'resizeColumn'\n });\n this.changes.emit(action);\n }\n resizeTable(column, delta) {\n const action = resizeArgs(column, {\n delta,\n type: 'resizeTable'\n });\n this.changes.emit(action);\n }\n resizedColumn(state$$1) {\n this.resizedColumns.push(state$$1);\n }\n end() {\n this.changes.emit({\n columns: [],\n resizedColumns: this.resizedColumns,\n type: 'end'\n });\n }\n registerTable(tableMetadata) {\n this.tables.push(tableMetadata);\n const unregisterTable = () => {\n this.tables.splice(this.tables.indexOf(tableMetadata), 1);\n };\n return unregisterTable;\n }\n measureColumns(info) {\n if (this.batch !== null) {\n this.batch.push(...info);\n }\n else {\n this.autoFitBatch(info, () => this.end());\n }\n }\n autoFit(...columns) {\n const nonLockedColumns = columns.filter(column => !column.isLocked);\n this.autoFitStart(nonLockedColumns);\n this.autoFitBatch(this.batch, () => {\n if (nonLockedColumns.length < columns.length) {\n const lockedColumns = columns.filter(column => column.isLocked);\n this.autoFitStart(lockedColumns);\n this.autoFitBatch(this.batch, () => this.end());\n }\n else {\n this.end();\n }\n });\n }\n trackColumns(column) {\n this.resizedColumns = [];\n this.column = column;\n }\n autoFitStart(columns) {\n this.batch = [];\n this.resizedColumns = [];\n if (columns.length === 0) {\n return;\n }\n const locked = columns[0].isLocked;\n this.changes.emit({\n type: 'start',\n columns,\n locked\n });\n this.changes.emit({\n type: 'triggerAutoFit',\n columns,\n locked\n });\n }\n autoFitBatch(info, onComplete) {\n const locked = info.length > 0 ? info[0].column.isLocked : false;\n const observables = this.tables\n .filter(table => table.locked === locked)\n .map(table => table.autoFit(info));\n zip(...observables)\n .pipe(take(1))\n .subscribe(widths => {\n this.changes.emit({\n columns: info.map(i => i.column),\n type: 'autoFitComplete',\n widths,\n locked\n });\n if (onComplete) {\n onComplete();\n }\n });\n this.batch = null;\n }\n}\nColumnResizingService.ɵfac = function ColumnResizingService_Factory(t) { return new (t || ColumnResizingService)(); };\nColumnResizingService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ColumnResizingService, factory: ColumnResizingService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnResizingService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\n/**\n * @hidden\n */\nconst hasFilterMenu = (settings) => typeof settings === 'string' && settings.indexOf('menu') > -1;\n/**\n * @hidden\n */\nconst hasFilterRow = (settings) => settings === true || (typeof settings === 'string' && settings.indexOf('row') > -1);\n\nconst contains$1 = (node, predicate) => {\n while (node) {\n if (predicate(node)) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n};\n/**\n * Arguments for the `close` event of the filter and column-menu popup.\n */\nclass PopupCloseEvent extends PreventableEvent {\n constructor(e) {\n super();\n this.originalEvent = e;\n }\n}\nconst DEFAULT_POPUP_CLASS = 'k-grid-filter-popup';\n/**\n * The service that is used for the popups of the filter and column menus\n * ([see example]({% slug reusablecustomfilters_grid %}#toc-filter-menu-with-popup)).\n */\nclass SinglePopupService {\n constructor(popupService, renderer, ngZone, scrollSyncService, localization) {\n this.popupService = popupService;\n this.renderer = renderer;\n this.ngZone = ngZone;\n this.localization = localization;\n /**\n * Fires when the filter or column menus are about to close because the user clicked outside their popups.\n * Used to prevent the popup from closing.\n */\n this.onClose = new Subject();\n this.scrollSubscription = scrollSyncService.changes.subscribe(() => this.destroy());\n }\n /**\n * @hidden\n */\n open(anchor, template, popupRef, popupClass = DEFAULT_POPUP_CLASS) {\n const toggle = isPresent(popupRef) && this.popupRef === popupRef;\n this.destroy();\n if (!toggle) {\n const direction = this.localization.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchorAlign: { vertical: 'bottom', horizontal: direction },\n popupAlign: { vertical: 'top', horizontal: direction },\n anchor: anchor,\n popupClass: popupClass,\n content: template,\n positionMode: \"absolute\"\n });\n this.renderer.setAttribute(this.popupRef.popupElement, 'dir', this.localization.rtl ? 'rtl' : 'ltr');\n this.attachClose(anchor);\n }\n return this.popupRef;\n }\n /**\n * @hidden\n */\n destroy() {\n if (this.popupRef) {\n this.detachClose();\n this.popupRef.close();\n this.popupRef = null;\n }\n }\n ngOnDestroy() {\n this.destroy();\n this.scrollSubscription.unsubscribe();\n }\n detachClose() {\n if (this.removeClick) {\n this.removeClick();\n }\n }\n attachClose(skipElement) {\n this.detachClose();\n this.ngZone.runOutsideAngular(() => this.removeClick = this.renderer.listen(\"document\", \"click\", (e) => {\n if (!contains$1(e.target, x => this.popupRef.popupElement === x || x === skipElement)) {\n const args = new PopupCloseEvent(e);\n this.onClose.next(args);\n if (!args.isDefaultPrevented()) {\n this.destroy();\n }\n }\n }));\n }\n}\nSinglePopupService.ɵfac = function SinglePopupService_Factory(t) { return new (t || SinglePopupService)(ɵngcc0.ɵɵinject(ɵngcc3.PopupService), ɵngcc0.ɵɵinject(ɵngcc0.Renderer2), ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(ScrollSyncService), ɵngcc0.ɵɵinject(ɵngcc1.LocalizationService)); };\nSinglePopupService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SinglePopupService, factory: SinglePopupService.ɵfac });\n/** @nocollapse */\nSinglePopupService.ctorParameters = () => [\n { type: PopupService },\n { type: Renderer2 },\n { type: NgZone },\n { type: ScrollSyncService },\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SinglePopupService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc3.PopupService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }, { type: ScrollSyncService }, { type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/* tslint:disable: no-bitwise */\n/**\n * @hidden\n */\nconst append = (element) => {\n let appended = false;\n return () => {\n if (!appended) {\n document.body.appendChild(element);\n appended = true;\n }\n return element;\n };\n};\n/**\n * @hidden\n */\nconst getDocument = element => element.ownerDocument.documentElement;\n/**\n * @hidden\n */\nconst getWindow = element => element.ownerDocument.defaultView;\n/**\n * @hidden\n */\nconst offset = element => {\n const { clientTop, clientLeft } = getDocument(element);\n const { pageYOffset, pageXOffset } = getWindow(element);\n const { top, left } = element.getBoundingClientRect();\n return {\n top: top + pageYOffset - clientTop,\n left: left + pageXOffset - clientLeft\n };\n};\n/**\n * @hidden\n * If the target is before the draggable element, returns `true`.\n *\n * DOCUMENT_POSITION_FOLLOWING = 4\n */\nconst isTargetBefore = (draggable, target) => (target.compareDocumentPosition(draggable) & 4) !== 0;\n/**\n * @hidden\n * If the container and the element are the same\n * or if the container holds (contains) the element, returns `true`.\n *\n * DOCUMENT_POSITION_CONTAINED_BY = 16\n */\nconst contains$2 = (element, container) => element === container ||\n (container.compareDocumentPosition(element) & 16) !== 0;\n/**\n * @hidden\n */\nconst position = (target, before) => {\n const targetRect = offset(target);\n const { offsetWidth, offsetHeight } = target;\n const left = targetRect.left + (before ? 0 : offsetWidth);\n const top = targetRect.top;\n const height = offsetHeight;\n return { left, top, height };\n};\n\n/**\n * @hidden\n */\nclass DragAndDropService {\n constructor() {\n this.changes = new EventEmitter();\n this.register = [];\n this.lastTarget = null;\n }\n add(target) {\n this.register.push(target);\n }\n remove(target) {\n this.register = this.register.filter(current => current !== target);\n }\n notifyDrag(draggable, element, mouseEvent) {\n const target = this.targetFor(element);\n if (this.lastTarget === target) {\n return;\n }\n this.changes.next({\n draggable,\n mouseEvent,\n target: this.lastTarget,\n type: 'leave'\n });\n if (target) {\n this.changes.next({\n draggable,\n mouseEvent,\n target,\n type: 'enter'\n });\n }\n this.lastTarget = target;\n }\n notifyDrop(draggable, mouseEvent) {\n this.changes.next({\n draggable,\n mouseEvent,\n target: this.lastTarget,\n type: 'drop'\n });\n this.lastTarget = null;\n }\n targetFor(element) {\n const comparer = contains$2.bind(null, element);\n return this.register.find(({ element: { nativeElement } }) => comparer(nativeElement));\n }\n}\nDragAndDropService.ɵfac = function DragAndDropService_Factory(t) { return new (t || DragAndDropService)(); };\nDragAndDropService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DragAndDropService, factory: DragAndDropService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DragAndDropService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst updateClass = (element, valid) => {\n const icon = element.querySelector('.k-icon');\n icon.className = icon.className\n .replace(/(plus|cancel)/, valid ? 'plus' : 'cancel');\n};\nconst updateLock = (element, locked = null) => {\n const icon = element.querySelectorAll('.k-icon')[1];\n const value = locked == null ? '' : (locked ? 'k-i-lock' : 'k-i-unlock');\n icon.className = icon.className\n .replace(/(k-i-unlock|k-i-lock)/, '') + ` ${value}`;\n};\nconst decorate = (element, target) => {\n const targetStyles = getComputedStyle(target);\n element.className = 'k-header k-drag-clue';\n element.style.position = 'absolute';\n element.style.zIndex = '20000';\n element.style.paddingLeft = targetStyles.paddingLeft;\n element.style.paddingTop = targetStyles.paddingTop;\n element.style.paddingBottom = targetStyles.paddingBottom;\n element.style.paddingRight = targetStyles.paddingRight;\n element.style.width = targetStyles.width;\n element.style.height = targetStyles.height;\n};\n/**\n * @hidden\n */\nclass DragHintService {\n constructor(santizer) {\n this.santizer = santizer;\n }\n create(down, target, title) {\n this.initCoords(down);\n this.dom = document.createElement(\"div\");\n decorate(this.dom, target);\n const safeTitle = this.santizer.sanitize(SecurityContext.HTML, title);\n this.dom.innerHTML = `\n \n \n \n ${safeTitle}\n `;\n }\n attach() {\n return append(this.dom);\n }\n remove() {\n if (this.dom && this.dom.parentNode) {\n (function (el) {\n setTimeout(() => document.body.removeChild(el));\n })(this.dom); // hack for IE + pointer events!\n this.dom = null;\n }\n }\n show() {\n this.dom.style.display = \"\";\n }\n hide() {\n this.dom.style.display = \"none\";\n }\n enable() {\n updateClass(this.dom, true);\n }\n disable() {\n updateClass(this.dom, false);\n }\n removeLock() {\n updateLock(this.dom);\n }\n toggleLock(locked) {\n updateLock(this.dom, locked);\n }\n move(move) {\n this.dom.style.top = this.initialTop + move.pageY + 'px';\n this.dom.style.left = this.initialLeft + move.pageX + 'px';\n }\n initCoords(down) {\n const { top, left } = offset(down.originalEvent.target);\n this.initialTop = top - down.pageY;\n this.initialLeft = left - down.pageX;\n }\n}\nDragHintService.ɵfac = function DragHintService_Factory(t) { return new (t || DragHintService)(ɵngcc0.ɵɵinject(ɵngcc4.DomSanitizer)); };\nDragHintService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DragHintService, factory: DragHintService.ɵfac });\n/** @nocollapse */\nDragHintService.ctorParameters = () => [\n { type: DomSanitizer }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DragHintService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc4.DomSanitizer }]; }, null); })();\n\n/**\n * @hidden\n */\nclass DropCueService {\n create() {\n this.dom = document.createElement(\"div\");\n this.dom.className = 'k-grouping-dropclue';\n this.hide();\n }\n attach() {\n return append(this.dom);\n }\n remove() {\n if (this.dom && this.dom.parentElement) {\n document.body.removeChild(this.dom);\n this.dom = null;\n }\n }\n hide() {\n this.dom.style.display = \"none\";\n }\n position({ left, top, height }) {\n this.dom.style.display = 'block';\n this.dom.style.height = height + 'px';\n this.dom.style.top = top + 'px';\n const width = this.dom.offsetWidth / 2;\n this.dom.style.left = left - width + 'px';\n }\n}\nDropCueService.ɵfac = function DropCueService_Factory(t) { return new (t || DropCueService)(); };\nDropCueService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DropCueService, factory: DropCueService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DropCueService, [{\n type: Injectable\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass ColumnReorderService {\n constructor() {\n this.changes = new EventEmitter();\n }\n reorder(e) {\n this.changes.emit(e);\n }\n}\nColumnReorderService.ɵfac = function ColumnReorderService_Factory(t) { return new (t || ColumnReorderService)(); };\nColumnReorderService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ColumnReorderService, factory: ColumnReorderService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnReorderService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * Arguments for the `columnReorder` event.\n */\nclass ColumnReorderEvent extends PreventableEvent {\n /**\n * @hidden\n */\n constructor({ column, newIndex, oldIndex }) {\n super();\n this.column = column;\n this.newIndex = newIndex;\n this.oldIndex = oldIndex;\n }\n}\n\n/**\n * @hidden\n */\nclass NavigationMetadata {\n constructor(dataRows, headerRows, isVirtual, hasPager, hasDetailTemplate, gridElement, virtualColumns, columns) {\n this.dataRows = dataRows;\n this.headerRows = headerRows;\n this.isVirtual = isVirtual;\n this.hasPager = hasPager;\n this.hasDetailTemplate = hasDetailTemplate;\n this.gridElement = gridElement;\n this.virtualColumns = virtualColumns;\n this.columns = columns;\n }\n get maxLogicalRowIndex() {\n const dataRows = this.hasDetailTemplate ? this.dataRows * 2 : this.dataRows;\n return this.headerRows + dataRows - 1;\n }\n}\n\n// Incremented each time the service is instantiated.\nlet sequence = 0;\n/**\n * @hidden\n */\nclass IdService {\n constructor() {\n this.prefix = `k-grid${sequence++}`;\n }\n cellId(rowIndex, colIndex) {\n return `${this.prefix}-r${rowIndex}c${colIndex}`;\n }\n selectionCheckboxId(itemIndex) {\n return `${this.prefix}-checkbox${itemIndex}`;\n }\n selectAllCheckboxId() {\n return `${this.prefix}-select-all`;\n }\n}\nIdService.ɵfac = function IdService_Factory(t) { return new (t || IdService)(); };\nIdService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: IdService, factory: IdService.ɵfac });\n/** @nocollapse */\nIdService.ctorParameters = () => [];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(IdService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass ColumnInfoService {\n constructor() {\n this.visibilityChange = new EventEmitter();\n this.lockedChange = new EventEmitter();\n this.columnRangeChange = new EventEmitter();\n this.columnsContainer = new ColumnsContainer(() => []);\n }\n get lockedLeafColumns() {\n return this.columnsContainer.lockedLeafColumns;\n }\n get nonLockedLeafColumns() {\n return this.columnsContainer.nonLockedLeafColumns;\n }\n get isLocked() {\n return this.lockedLeafColumns.length > 0;\n }\n get totalLevels() {\n return this.columnsContainer.totalLevels;\n }\n get leafNamedColumns() {\n const columns = expandColumns(this.list().filterSort(column => !column.isColumnGroup))\n .filter(column => column.matchesMedia && column.displayTitle);\n return orderBy(columns, [{ field: 'locked', dir: 'desc' }]);\n }\n get unlockedRootCount() {\n return this.list().rootColumns().filter(column => !column.locked && column.isVisible).length;\n }\n init(columns, list) {\n this.columnsContainer = columns;\n this.list = list;\n }\n changeVisibility(columns) {\n this.visibilityChange.emit(columns);\n }\n changeLocked(columns) {\n this.lockedChange.emit(columns);\n }\n}\nColumnInfoService.ɵfac = function ColumnInfoService_Factory(t) { return new (t || ColumnInfoService)(); };\nColumnInfoService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ColumnInfoService, factory: ColumnInfoService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnInfoService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass SortService {\n constructor() {\n this.changes = new Subject();\n }\n sort(value) {\n this.changes.next(value);\n }\n}\nSortService.ɵfac = function SortService_Factory(t) { return new (t || SortService)(); };\nSortService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SortService, factory: SortService.ɵfac });\n\n\n/**\n * Arguments for the `columnVisibilityChange` event.\n */\nclass ColumnVisibilityChangeEvent {\n /**\n * @hidden\n */\n constructor(columns) {\n this.columns = columns;\n }\n}\n\n/**\n * Arguments for the `columnLockedChange` event.\n */\nclass ColumnLockedChangeEvent {\n /**\n * @hidden\n */\n constructor(columns) {\n this.columns = columns;\n }\n}\n\n/**\n * @hidden\n */\nconst GROUP_CELL_WIDTH = 32; // this should be the value of group-cell inside the theme!\n\n/**\n * @hidden\n */\nfunction defaultTrackBy(index, item) {\n if (item.type === 'data' && item.isEditing) {\n return item.data;\n }\n return index;\n}\n\nconst createControl = (source) => (acc, key) => {\n acc[key] = new FormControl(source[key]);\n return acc;\n};\nconst validateColumnsField = (columns) => expandColumns(columns.toArray())\n .filter(isColumnComponent)\n .filter(({ field }) => !isValidFieldName(field))\n .forEach(({ field }) => console.warn(`\n Grid column field name '${field}' does not look like a valid JavaScript identifier.\n Identifiers can contain only alphanumeric characters (including \"$\" or \"_\"), and may not start with a digit.\n Please use only valid identifier names to ensure error-free operation.\n `));\nconst handleExpandCollapseService = (service, expandEmitter, collapseEmitter, map$$1) => (service.changes.pipe(filter(({ dataItem }) => isPresent(dataItem)))\n .subscribe((x) => x.expand ? expandEmitter.emit(map$$1(x)) : collapseEmitter.emit(map$$1(x))));\nconst isInEditedCell = (element, gridElement) => closest(element, matchesClasses('k-grid-edit-cell')) &&\n closest(element, matchesNodeName('kendo-grid')) === gridElement;\nconst ɵ4$2 = EMPTY_CELL_CONTEXT;\n/**\n * Represents the Kendo UI Grid component for Angular.\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\nclass GridComponent {\n constructor(supportService, selectionService, cellSelectionService, wrapper, groupInfoService, groupsService, changeNotification, detailsService, editService, filterService, pdfService, responsiveService, renderer, excelService, ngZone, scrollSyncService, domEvents, columnResizingService, changeDetectorRef, columnReorderService, columnInfoService, navigationService, sortService, scrollRequestService, localization) {\n this.supportService = supportService;\n this.selectionService = selectionService;\n this.cellSelectionService = cellSelectionService;\n this.wrapper = wrapper;\n this.groupInfoService = groupInfoService;\n this.groupsService = groupsService;\n this.changeNotification = changeNotification;\n this.detailsService = detailsService;\n this.editService = editService;\n this.filterService = filterService;\n this.pdfService = pdfService;\n this.responsiveService = responsiveService;\n this.renderer = renderer;\n this.excelService = excelService;\n this.ngZone = ngZone;\n this.scrollSyncService = scrollSyncService;\n this.domEvents = domEvents;\n this.columnResizingService = columnResizingService;\n this.changeDetectorRef = changeDetectorRef;\n this.columnReorderService = columnReorderService;\n this.columnInfoService = columnInfoService;\n this.navigationService = navigationService;\n this.sortService = sortService;\n this.scrollRequestService = scrollRequestService;\n /**\n * Sets the data of the Grid. If an array is provided, the Grid automatically gets the total count\n * ([more information and example]({% slug databinding_grid %})).\n */\n this.data = [];\n /**\n * Defines the scroll mode used by the Grid.\n *\n * The available options are:\n * - `none`—Renders no scrollbar.\n * - `scrollable`—The default scroll mode. It requires the setting of the `height` option.\n * - `virtual`—Displays no pager and renders a portion of the data (optimized rendering) while the user is scrolling the content.\n */\n this.scrollable = 'scrollable';\n /**\n * Enables the single-row [selection]({% slug selection_grid %}) of the Grid.\n */\n this.selectable = false;\n /**\n * A function that defines how to track changes for the data rows.\n *\n * By default, the Grid tracks changes by the index of the data item.\n * Edited rows are tracked by reference.\n * In some cases, you might need to override the default behavior,\n * for example, when you implement editing with immutable data items.\n *\n * The following example demonstrates how to track items only by index.\n *\n * @example\n * ```ts\n * import { Component } from '@angular/core';\n * import { GridItem } from '@progress/kendo-angular-grid';\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n *\n * public trackBy(index: number, item: GridItem): any {\n * console.log(item);\n * return index;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\n this.trackBy = defaultTrackBy;\n /**\n * If set to `true`, the grid will render only the columns in the current viewport.\n */\n this.virtualColumns = false;\n /**\n * Enables the [filtering]({% slug filtering_grid %}) of the Grid columns that have their `field` option set.\n */\n this.filterable = false;\n /**\n * Enables the [sorting]({% slug sorting_grid %}) of the Grid columns that have their `field` option set.\n */\n this.sortable = false;\n /**\n * Configures the pager of the Grid ([see example]({% slug paging_grid %})).\n *\n * The available options are:\n * - `buttonCount: Number`—Sets the maximum numeric buttons count before the buttons are collapsed.\n * - `info: Boolean`—Toggles the information about the current page and the total number of records.\n * - `type: PagerType`—Accepts the `numeric` (buttons with numbers) and `input` (input for typing the page number) values.\n * - `pageSizes: Boolean` or `Array`—Shows a menu for selecting the page size.\n * - `previousNext: Boolean`—Toggles the **Previous** and **Next** buttons.\n */\n this.pageable = false;\n /**\n * If set to `true`, the user can group the Grid by dragging the column header cells.\n * By default, grouping is disabled ([see example]({% slug groupingbasics_grid %})).\n */\n this.groupable = false;\n /**\n * If set to `true`, the user can use dedicated shortcuts to interact with the Grid.\n * By default, navigation is disabled and the Grid content is accessible in the normal tab sequence.\n */\n this.navigable = false;\n /**\n * Indicates whether the Grid columns will be resized during initialization so that\n * they fit their headers and row content. Defaults to `false`.\n * Columns with `autoSize` set to `false` are excluded.\n * To dynamically update the column width to match the new content,\n * refer to [this example]({% slug resizing_columns_grid %}).\n */\n this.autoSize = false;\n /**\n * If set to `true`, the user can resize columns by dragging the edges (resize handles) of their header cells\n * ([see example]({% slug resizing_columns_grid %})).\n *\n * @default false\n */\n this.resizable = false;\n /**\n * If set to `true`, the user can reorder columns by dragging their header cells\n * ([see example]({% slug reordering_columns_grid %})).\n *\n * @default false\n */\n this.reorderable = false;\n /**\n * Specifies if the loading indicator of the Grid will be displayed ([see example]({% slug databinding_grid %})).\n *\n * @default false\n */\n this.loading = false;\n /**\n * Specifies if the column menu of the columns will be displayed ([see example]({% slug columnmenu_grid %})).\n *\n * @default false\n */\n this.columnMenu = false;\n /**\n * Specifies if the header of the grid will be hidden. The header is visible by default.\n *\n * > The header includes column headers and the [filter row]({% slug filtering_grid %}#toc-filter-row).\n */\n this.hideHeader = false;\n /**\n * Fires when the Grid filter is modified through the UI.\n * You have to handle the event yourself and filter the data.\n */\n this.filterChange = new EventEmitter();\n /**\n * Fires when the page of the Grid is changed ([see example]({% slug paging_grid %})).\n * You have to handle the event yourself and page the data.\n */\n this.pageChange = new EventEmitter();\n /**\n * Fires when the grouping of the Grid is changed.\n * You have to handle the event yourself and group the data ([see example]({% slug groupingbasics_grid %})).\n */\n this.groupChange = new ZoneAwareEventEmitter(this.ngZone);\n /**\n * Fires when the sorting of the Grid is changed ([see example]({% slug sorting_grid %})).\n * You have to handle the event yourself and sort the data.\n */\n this.sortChange = new EventEmitter();\n /**\n * Fires when the user selects a Grid row.\n * Emits the [`SelectionEvent`]({% slug api_grid_selectionevent %}#toc-selectionchange).\n */\n this.selectionChange = new EventEmitter();\n /**\n * Fires when the data state of the Grid is changed.\n */\n this.dataStateChange = new EventEmitter();\n /**\n * Fires when the user expands a group header.\n */\n this.groupExpand = new EventEmitter();\n /**\n * Fires when the user collapses a group header.\n */\n this.groupCollapse = new EventEmitter();\n /**\n * Fires when the user expands a master row.\n */\n this.detailExpand = new EventEmitter();\n /**\n * Fires when the user collapses a master row.\n */\n this.detailCollapse = new EventEmitter();\n /**\n * Fires when the user clicks the **Edit** command button to edit a row\n * ([see example]({% slug editing_template_forms_grid %}#toc-editing-records)).\n */\n this.edit = new EventEmitter();\n /**\n * Fires when the user clicks the **Cancel** command button to close a row\n * ([see example]({% slug editing_template_forms_grid %}#toc-cancelling-editing)).\n */\n this.cancel = new EventEmitter();\n /**\n * Fires when the user clicks the **Save** command button to save changes in a row\n * ([see example]({% slug editing_template_forms_grid %}#toc-saving-records)).\n */\n this.save = new EventEmitter();\n /**\n * Fires when the user clicks the **Remove** command button to remove a row\n * ([see example]({% slug editing_template_forms_grid %}#toc-removing-records)).\n */\n this.remove = new EventEmitter();\n /**\n * Fires when the user clicks the **Add** command button to add a new row\n * ([see example]({% slug editing_template_forms_grid %}#toc-adding-records)).\n */\n this.add = new EventEmitter();\n /**\n * Fires when the user leaves an edited cell ([see example]({% slug editing_incell_grid %}#toc-basic-concepts)).\n */\n this.cellClose = new EventEmitter();\n /**\n * Fires when the user clicks a cell ([see example]({% slug editing_incell_grid %}#toc-basic-concepts)).\n */\n this.cellClick = new ZoneAwareEventEmitter(this.ngZone);\n /**\n * Fires when the user clicks the **Export to PDF** command button.\n */\n this.pdfExport = new EventEmitter();\n /**\n * Fires when the user clicks the **Export to Excel** command button.\n */\n this.excelExport = new EventEmitter();\n /**\n * Fires when the user completes the resizing of the column.\n */\n this.columnResize = new ZoneAwareEventEmitter(this.ngZone);\n /**\n * Fires when the user completes the reordering of the column.\n */\n this.columnReorder = new EventEmitter();\n /**\n * Fires when the user changes the visibility of the columns from the column menu or column chooser.\n */\n this.columnVisibilityChange = new EventEmitter();\n /**\n * Fires when the user changes the locked state of the columns from the column menu or by reordering the columns.\n */\n this.columnLockedChange = new EventEmitter();\n /**\n * Fires when the user scrolls to the last record on the page and enables endless scrolling\n * ([see example]({% slug scrollmmodes_grid %}#toc-endless-scrolling)).\n * You have to handle the event yourself and page the data.\n */\n this.scrollBottom = new EventEmitter();\n /**\n * Fires when the grid content is scrolled.\n * For performance reasons, the event is triggered outside the Angular zone. Enter the Angular zone if you make any changes that require change detection.\n */\n this.contentScroll = new EventEmitter();\n /**\n * A query list of all declared columns.\n */\n this.columns = new QueryList();\n this.footer = new QueryList();\n this.selectionDirective = false;\n this.columnsContainer = new ColumnsContainer(() => this.columnList.filterHierarchy(column => {\n column.matchesMedia = this.matchesMedia(column);\n return column.isVisible;\n }));\n this.view = new DataCollection(() => new DataResultIterator(this.data, this.skip, this.hasGroupFooters));\n this.shouldGenerateColumns = true;\n this._sort = new Array();\n this._group = new Array();\n this._skip = 0;\n this.cachedWindowWidth = 0;\n this._rowSelected = null;\n this._cellSelected = null;\n this.rtl = false;\n this._rowClass = () => null;\n this.localizationSubscription = localization.changes.subscribe(({ rtl }) => {\n this.rtl = rtl;\n this.direction = this.rtl ? 'rtl' : 'ltr';\n });\n this.groupInfoService.registerColumnsContainer(() => this.columnList);\n this.columnInfoService.init(this.columnsContainer, () => this.columnList);\n this.columnVisibilityChangeSubscription = this.columnInfoService.visibilityChange.subscribe((changed) => {\n this.columnVisibilityChange.emit(new ColumnVisibilityChangeEvent(changed));\n });\n this.columnLockedChangeSubscription = this.columnInfoService.lockedChange.subscribe((changed) => {\n this.columnLockedChange.emit(new ColumnLockedChangeEvent(changed));\n });\n this.groupExpandCollapseSubscription = handleExpandCollapseService(groupsService, this.groupExpand, this.groupCollapse, ({ dataItem: group, index }) => ({ group, groupIndex: index }));\n this.detailsServiceSubscription = handleExpandCollapseService(detailsService, this.detailExpand, this.detailCollapse, args => args);\n this.filterSubscription = this.filterService.changes.subscribe(x => {\n this.filterChange.emit(x);\n });\n this.sortSubscription = this.sortService.changes.subscribe(x => {\n this.sortChange.emit(x);\n });\n this.attachStateChangesEmitter();\n this.attachEditHandlers();\n this.attachDomEventHandlers();\n this.pdfSubscription = this.pdfService.exportClick.subscribe(this.emitPDFExportEvent.bind(this));\n this.excelSubscription = this.excelService.exportClick.subscribe(this.saveAsExcel.bind(this));\n this.columnsContainerChange();\n this.handleColumnResize();\n this.columnList = new ColumnList(this.columns);\n this.columnReorderSubscription = this.columnReorderService\n .changes.subscribe(this.reorder.bind(this));\n this.columnRangeChangeSubscription = this.columnInfoService.columnRangeChange.subscribe(this.onColumnRangeChange.bind(this));\n }\n /**\n * Defines the number of records to be skipped by the pager.\n * Required by the [paging]({% slug paging_grid %}) functionality.\n */\n get skip() {\n return this._skip;\n }\n set skip(value) {\n if (value >= 0) {\n this._skip = value;\n }\n }\n /**\n * The descriptors by which the data will be sorted ([see example]({% slug sorting_grid %})).\n */\n set sort(value) {\n if (isArray(value)) {\n this._sort = value;\n }\n }\n get sort() {\n return this._sort;\n }\n /**\n * The descriptors by which the data will be grouped ([see example]({% slug groupingbasics_grid %})).\n */\n set group(value) {\n if (isArray(value)) {\n this._group = value;\n }\n }\n /**\n */\n get group() {\n return this._group;\n }\n /**\n * @hidden\n */\n get showTopToolbar() {\n return this.toolbarTemplate && ['top', 'both'].indexOf(this.toolbarTemplate.position) > -1;\n }\n /**\n * @hidden\n */\n get showBottomToolbar() {\n return this.toolbarTemplate && ['bottom', 'both'].indexOf(this.toolbarTemplate.position) > -1;\n }\n /**\n * @hidden\n */\n get isLocked() {\n return this.lockedLeafColumns.length > 0;\n }\n /**\n * @hidden\n */\n get showPager() {\n return !this.isVirtual && this.pageable !== false;\n }\n /**\n * @hidden\n */\n get showGroupPanel() {\n return this.groupable && this.groupable.enabled !== false;\n }\n /**\n * @hidden\n */\n get groupableEmptyText() {\n return this.groupable.emptyText;\n }\n /**\n * @hidden\n */\n get marqueeSelection() {\n return this.selectionService.enableMarquee || this.cellSelectionService.enableMarquee;\n }\n /**\n * @hidden\n *\n * An alias for `navigable` for users who migrate from Kendo UI for jQuery.\n */\n set navigatable(value) {\n this.navigable = value;\n }\n /**\n * @hidden\n */\n get navigatable() {\n return this.navigable;\n }\n /**\n * Defines a function that is executed for every data row in the component.\n *\n * @example\n * ```ts\n * import { Component, ViewEncapsulation } from '@angular/core';\n * import { RowClassArgs } from '@progress/kendo-angular-grid';\n *\n * _@Component({\n * selector: 'my-app',\n * encapsulation: ViewEncapsulation.None,\n * styles: [`\n * .k-grid tr.even { background-color: #f45c42; }\n * .k-grid tr.odd { background-color: #41f4df; }\n * `],\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n *\n * public rowCallback(context: RowClassArgs) {\n * const isEven = context.index % 2 == 0;\n * return {\n * even: isEven,\n * odd: !isEven\n * };\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\n set rowClass(fn) {\n if (isDevMode && typeof fn !== 'function') {\n throw new Error(`rowClass must be a function, but received ${JSON.stringify(fn)}.`);\n }\n this._rowClass = fn;\n }\n get rowClass() {\n return this._rowClass;\n }\n /**\n * Defines a Boolean function that is executed for each data row in the component\n * ([see example]({% slug selection_grid %}#toc-setting-the-selected-rows)).\n * Determines whether the row will be selected.\n */\n set rowSelected(fn) {\n if (isDevMode && typeof fn !== 'function') {\n throw new Error(`rowSelected must be a function, but received ${JSON.stringify(fn)}.`);\n }\n this._rowSelected = fn;\n }\n get rowSelected() {\n return this._rowSelected;\n }\n /**\n * Defines a function that determines the selected state of a data cell.\n * Returns an object with `selected` and `item` properties.\n * The cell is marked as selected only if the `selected` property equals `true`.\n *\n * The function is executed for each data cell and may be called more than once\n * as part of a change detection cycle. ([see example]({% slug grid_selection_custom %}toc-setting-the-selected-cells))\n */\n set cellSelected(fn) {\n if (isDevMode && typeof fn !== 'function') {\n throw new Error(`cellSelected must be a function, but received ${JSON.stringify(fn)}.`);\n }\n this._cellSelected = fn;\n }\n get cellSelected() {\n return this._cellSelected;\n }\n /**\n * Returns the currently focused cell (if any).\n */\n get activeCell() {\n return this.navigationService.activeCell;\n }\n /**\n * Returns the currently focused row (if any).\n */\n get activeRow() {\n return this.navigationService.activeRow;\n }\n get dir() {\n return this.direction;\n }\n get hostClasses() {\n return true;\n }\n get lockedClasses() {\n return this.lockedLeafColumns.length > 0;\n }\n get virtualClasses() {\n return this.isVirtual;\n }\n get noScrollbarClass() {\n return this.scrollbarWidth === 0;\n }\n get detailTemplate() {\n if (this._customDetailTemplate) {\n return this._customDetailTemplate;\n }\n return this.detailTemplateChildren ? this.detailTemplateChildren.first : undefined;\n }\n set detailTemplate(detailTemplate) {\n this._customDetailTemplate = detailTemplate;\n }\n get noRecordsTemplate() {\n if (this._customNoRecordsTemplate) {\n return this._customNoRecordsTemplate;\n }\n return this.noRecordsTemplateChildren ? this.noRecordsTemplateChildren.first : undefined;\n }\n set noRecordsTemplate(customNoRecordsTemplate) {\n this._customNoRecordsTemplate = customNoRecordsTemplate;\n }\n get pagerTemplate() {\n if (this._customPagerTemplate) {\n return this._customPagerTemplate;\n }\n return this.pagerTemplateChildren ? this.pagerTemplateChildren.first : undefined;\n }\n set pagerTemplate(customPagerTemplate) {\n this._customPagerTemplate = customPagerTemplate;\n }\n get toolbarTemplate() {\n if (this._customToolbarTemplate) {\n return this._customToolbarTemplate;\n }\n return this.toolbarTemplateChildren ? this.toolbarTemplateChildren.first : undefined;\n }\n set toolbarTemplate(customToolbarTemplate) {\n this._customToolbarTemplate = customToolbarTemplate;\n }\n get scrollbarWidth() {\n return this.supportService.scrollbarWidth;\n }\n get headerPadding() {\n if (isUniversal()) {\n return \"\";\n }\n const padding = Math.max(0, this.scrollbarWidth - 1) + 'px';\n const right = this.rtl ? 0 : padding;\n const left = this.rtl ? padding : 0;\n return `0 ${right} 0 ${left}`;\n }\n get hasGroupFooters() {\n return this.columnsContainer.hasGroupFooter;\n }\n get showFooter() {\n return this.columnsContainer.hasFooter;\n }\n get showGroupFooters() {\n return this.groupable && this.groupable.showFooter;\n }\n get ariaRowCount() {\n return this.totalColumnLevels + 1 + this.view.total;\n }\n get ariaColCount() {\n return this.columnsContainer.leafColumnsToRender.length;\n }\n get isVirtual() {\n return this.scrollable === 'virtual';\n }\n get isScrollable() {\n return this.scrollable !== 'none';\n }\n get visibleColumns() {\n return this.columnsContainer.allColumns;\n }\n get lockedColumns() {\n return this.columnsContainer.lockedColumns;\n }\n get nonLockedColumns() {\n return this.columnsContainer.nonLockedColumns;\n }\n get lockedLeafColumns() {\n return this.columnsContainer.lockedLeafColumns;\n }\n get nonLockedLeafColumns() {\n return this.columnsContainer.nonLockedLeafColumns;\n }\n get leafColumns() {\n return this.columnsContainer.leafColumns;\n }\n get totalColumnLevels() {\n return this.columnsContainer.totalLevels;\n }\n get headerColumns() {\n if (this.virtualColumns && !this.pdfService.exporting) {\n return this.viewportColumns;\n }\n return this.nonLockedColumns;\n }\n get headerLeafColumns() {\n if (this.virtualColumns && !this.pdfService.exporting) {\n return this.leafViewportColumns;\n }\n return this.nonLockedLeafColumns;\n }\n get lockedWidth() {\n const groupCellsWidth = this.group.length * GROUP_CELL_WIDTH;\n return expandColumns(this.lockedLeafColumns.toArray()).reduce((prev, curr) => prev + (curr.width || 0), groupCellsWidth);\n }\n get nonLockedWidth() {\n if ((!this.rtl && this.lockedLeafColumns.length) || this.virtualColumns) {\n return !this.virtualColumns ? this.columnsContainer.unlockedWidth :\n this.leafViewportColumns.reduce((acc, column) => acc + (column.width || 0), 0);\n }\n return undefined;\n }\n get selectableSettings() {\n if (this.selectionService) {\n return this.selectionService.options;\n }\n return undefined;\n }\n get columnMenuTemplate() {\n const template = this.columnMenuTemplates.first;\n return template ? template.templateRef : null;\n }\n get totalCount() {\n if (this.isVirtual || !isPresent(this.pageSize)) {\n return this.view.total;\n }\n return this.pageSize;\n }\n /**\n * Expands the specified master row ([see example]({% slug hierarchy_grid %})).\n *\n * This method is provided only for backwards-compatibility with legacy versions.\n * These versions tracked the expanded state internally using the data row index.\n *\n * For new development, use the [`kendoGridDetailsExpandBy` directive]({% slug api_grid_expanddetailsdirective %})\n * or provide an isDetailExpanded callback. See [Controlling the Expanded State]({% slug master_detail_expanded_state_grid %})\n * for examples on how to control the expanded state.\n *\n * @param index - The data row index of the master row.\n */\n expandRow(index) {\n this.toggleDetailRowLegacy(index, true);\n }\n /**\n * Collapses the specified master row ([see example]({% slug hierarchy_grid %})).\n *\n * This method is provided only for backwards-compatibility with legacy versions.\n * These versions tracked the expanded state internally using the data row index.\n *\n * For new development, use the [`kendoGridDetailsExpandBy` directive]({% slug api_grid_expanddetailsdirective %})\n * or provide an isDetailExpanded callback. See [Controlling the Expanded State]({% slug master_detail_expanded_state_grid %})\n * for examples on how to control the expanded state.\n *\n * @param index - The data row index of the master row.\n */\n collapseRow(index) {\n this.toggleDetailRowLegacy(index, false);\n }\n /**\n * Expands a group header item for the given index. For example,\n * `0_1` expands the second inner group of the first master group.\n *\n * > * When you use the [`kendoGridGroupBinding`]({% slug api_grid_groupbindingdirective %}) directive,\n * > the `expandGroup` method is not supported.\n * > * When a Grid is pageable, the indexes of the groups are offset by the current Grid [`skip`]({% slug api_grid_gridcomponent %}#toc-skip).\n *\n * @param {string} index - The underscore separated hierarchical index of the group.\n */\n expandGroup(index) {\n if (!this.groupsService.isExpanded(index)) {\n this.groupsService.toggleRow(index, null);\n }\n }\n /**\n * Collapses a group header item for the given index. For example,\n * `0_1` collapses the second inner group of the first master group.\n *\n * > * When you use the [`kendoGridGroupBinding`]({% slug api_grid_groupbindingdirective %}) directive,\n * > the `collapseGroup` method is not supported.\n * > * When a Grid is pageable, the indexes of the groups are offset by the current Grid [`skip`]({% slug api_grid_gridcomponent %}#toc-skip).\n *\n * @param {string} index - The underscore separated hierarchical index of the group.\n */\n collapseGroup(index) {\n if (this.groupsService.isExpanded(index)) {\n this.groupsService.toggleRow(index, null);\n }\n }\n /**\n * @hidden\n */\n resetGroupsState() {\n this.groupsService.reset();\n }\n /**\n * @hidden\n */\n expandGroupChildren(groupIndex) {\n this.groupsService.expandChildren(groupIndex);\n }\n /**\n * @hidden\n */\n onDataChange() {\n this.autoGenerateColumns();\n this.changeNotification.notify();\n this.pdfService.dataChanged.emit();\n if (isPresent(this.defaultSelection)) {\n this.defaultSelection.reset();\n }\n this.initSelectionService();\n this.updateNavigationMetadata();\n }\n ngOnChanges(changes) {\n if (isChanged(\"data\", changes)) {\n this.onDataChange();\n }\n if (this.lockedLeafColumns.length && anyChanged([\"pageSize\", \"skip\", \"sort\", \"group\"], changes)) {\n this.changeNotification.notify();\n }\n if (anyChanged([\"pageSize\", \"scrollable\", 'virtualColumns'], changes)) {\n this.updateNavigationMetadata();\n }\n if (isChanged(\"virtualColumns\", changes)) {\n this.viewportColumns = this.leafViewportColumns = null;\n }\n if (isChanged(\"height\", changes, false)) {\n this.renderer.setStyle(this.wrapper.nativeElement, 'height', `${this.height}px`);\n }\n if (isChanged(\"filterable\", changes) && this.lockedColumns.length) {\n this.syncHeaderHeight(this.ngZone.onStable.asObservable().pipe(take(1)));\n }\n if (anyChanged([\"columnMenu\", \"sortable\", \"filterable\"], changes, false)) {\n this.columnMenuOptions = this.columnMenu && Object.assign({\n filter: Boolean(this.filterable),\n sort: Boolean(this.sortable)\n }, this.columnMenu); // tslint:disable-line:align\n }\n if (isChanged(\"scrollable\", changes) && this.isScrollable) {\n this.ngZone.onStable.pipe(take(1)).subscribe(() => this.attachScrollSync());\n }\n if (isChanged(\"selectable\", changes) && this.shouldResetSelection(changes.selectable)) {\n if (this.defaultSelection) {\n this.defaultSelection.reset();\n }\n else if (this.selectionDirective) {\n this.selectionDirective.reset();\n }\n }\n }\n ngAfterViewInit() {\n this.attachScrollSync();\n this.attachElementEventHandlers();\n this.updateNavigationMetadata();\n this.applyAutoSize();\n }\n ngAfterContentChecked() {\n this.columnsContainer.refresh();\n this.verifySettings();\n this.initSelectionService();\n }\n ngAfterContentInit() {\n this.shouldGenerateColumns = !this.columns.length;\n this.autoGenerateColumns();\n this.columnList = new ColumnList(this.columns);\n this.columnsChangeSubscription = this.columns.changes.subscribe(() => this.verifySettings());\n }\n ngOnInit() {\n if (this.navigable) {\n this.navigationService.init(this.navigationMetadata());\n }\n }\n ngOnDestroy() {\n if (this.selectionSubscription) {\n this.selectionSubscription.unsubscribe();\n }\n if (this.stateChangeSubscription) {\n this.stateChangeSubscription.unsubscribe();\n }\n if (this.groupExpandCollapseSubscription) {\n this.groupExpandCollapseSubscription.unsubscribe();\n }\n if (this.detailsServiceSubscription) {\n this.detailsServiceSubscription.unsubscribe();\n }\n if (this.editServiceSubscription) {\n this.editServiceSubscription.unsubscribe();\n }\n if (this.pdfSubscription) {\n this.pdfSubscription.unsubscribe();\n }\n if (this.filterSubscription) {\n this.filterSubscription.unsubscribe();\n }\n if (this.sortSubscription) {\n this.sortSubscription.unsubscribe();\n }\n if (this.columnsChangeSubscription) {\n this.columnsChangeSubscription.unsubscribe();\n }\n if (this.excelSubscription) {\n this.excelSubscription.unsubscribe();\n }\n if (this.columnsContainerChangeSubscription) {\n this.columnsContainerChangeSubscription.unsubscribe();\n }\n if (this.scrollSyncService) {\n this.scrollSyncService.destroy();\n }\n if (this.detachElementEventHandlers) {\n this.detachElementEventHandlers();\n }\n if (this.defaultSelection) {\n this.defaultSelection.destroy();\n }\n if (this.cellClickSubscription) {\n this.cellClickSubscription.unsubscribe();\n }\n if (this.footerChangeSubscription) {\n this.footerChangeSubscription.unsubscribe();\n }\n this.ngZone = null;\n if (this.columnResizingSubscription) {\n this.columnResizingSubscription.unsubscribe();\n }\n if (this.columnReorderSubscription) {\n this.columnReorderSubscription.unsubscribe();\n }\n if (this.localizationSubscription) {\n this.localizationSubscription.unsubscribe();\n }\n if (this.columnVisibilityChangeSubscription) {\n this.columnVisibilityChangeSubscription.unsubscribe();\n }\n if (this.columnLockedChangeSubscription) {\n this.columnLockedChangeSubscription.unsubscribe();\n }\n if (this.focusElementSubscription) {\n this.focusElementSubscription.unsubscribe();\n }\n this.columnRangeChangeSubscription.unsubscribe();\n }\n /**\n * @hidden\n */\n attachScrollSync() {\n if (isUniversal()) {\n return;\n }\n if (this.header) {\n this.scrollSyncService.registerEmitter(this.header.nativeElement, \"header\");\n }\n if (this.footer) {\n this.footerChangeSubscription = observe(this.footer)\n .subscribe(footers => footers\n .map(footer => footer.nativeElement)\n .filter(isPresent)\n .forEach(element => this.scrollSyncService.registerEmitter(element, \"footer\")));\n }\n }\n /**\n * Switches the specified table row in the edit mode ([see example]({% slug editing_template_forms_grid %}#toc-editing-records)).\n *\n * @param rowIndex - The data row index that will be switched in the edit mode.\n * @param group - The [`FormGroup`]({{ site.data.urls.angular['formgroupapi'] }})\n * that describes the edit form.\n * @param options - Additional options configuring the focus target once the editor opens.\n */\n editRow(rowIndex, group, options) {\n this.editService.editRow(rowIndex, group);\n if (isPresent(options) && options.skipFocus) {\n return;\n }\n const row = `tr[data-kendo-grid-item-index=\"${rowIndex}\"]`;\n const columnIndex = options && options.columnIndex;\n const target = isNaN(columnIndex) ? row : `${row} td[data-kendo-grid-column-index=\"${columnIndex}\"]`;\n this.focusEditElement(target);\n }\n /**\n * Closes the editor for a given row ([see example]({% slug editing_template_forms_grid %}#toc-cancelling-editing)).\n *\n * @param {number} index - The row index that will be switched out of the edit mode. If no index is provided, it is assumed\n * that the new item editor will be closed.\n */\n closeRow(index) {\n this.editService.close(index);\n }\n /**\n * Creates a new row editor ([see example]({% slug editing_template_forms_grid %}#toc-adding-records)).\n *\n * @param {FormGroup} group - The [`FormGroup`]({{ site.data.urls.angular['formgroupapi'] }}) that describes\n * the edit form. If called with a data item, it will build the `FormGroup` from the data item fields.\n */\n addRow(group) {\n const isFormGroup = group instanceof FormGroup;\n if (!isFormGroup) {\n const fields = Object.keys(group).reduce(createControl(group), {}); // FormBuilder?\n group = new FormGroup(fields);\n }\n this.editService.addRow(group);\n this.focusEditElement('.k-grid-add-row');\n }\n /**\n * Puts the cell that is specified by the table row and column in edit mode.\n *\n * @param {number} rowIndex - The data row index that will be switched in the edit mode.\n * @param {number|string|any} column - The leaf column index, or the field name or the column instance that should be edited.\n * @param {FormGroup} group - The [`FormGroup`]({{ site.data.urls.angular['formgroupapi'] }})\n * that describes the edit form.\n */\n editCell(rowIndex, column, group) {\n const instance = this.columnInstance(column);\n this.editService.editCell(rowIndex, instance, group);\n this.focusEditElement('.k-grid-edit-cell');\n }\n /**\n * Closes the current cell in edit mode and fires\n * the [`cellClose`]({% slug api_grid_gridcomponent %}#toc-cellclose) event.\n *\n * @return {boolean} Indicates whether the edited cell was closed.\n * A `false` value indicates that the\n * [`cellClose`]({% slug api_grid_gridcomponent %}#toc-cellclose) event was prevented.\n */\n closeCell() {\n return !this.editService.closeCell();\n }\n /**\n * Closes the current cell in edit mode.\n */\n cancelCell() {\n this.editService.cancelCell();\n }\n /**\n * Returns a flag which indicates if a row or a cell is currently edited.\n *\n * @return {boolean} A flag which indicates if a row or a cell is currently edited.\n */\n isEditing() {\n return this.editService.isEditing();\n }\n /**\n * Returns a flag which indicates if a cell is currently edited.\n *\n * @return {boolean} A flag which indicates if a cell is currently being edited.\n */\n isEditingCell() {\n return this.editService.isEditingCell();\n }\n /**\n * Initiates the PDF export ([see example]({% slug pdfexport_grid %})).\n */\n saveAsPDF() {\n this.pdfService.save(this);\n }\n /**\n * Exports the Grid element to a Drawing [`Group`]({% slug api_kendo-drawing_group %}) by using the `kendo-grid-pdf` component options.\n * ([see example]({% slug pdfexport_grid %}#toc-exporting-multiple-grids-to-the-same-pdf)).\n *\n * @return {Promise} - A promise that will be resolved with the Drawing `Group`.\n */\n drawPDF() {\n const promise = createPromise();\n this.pdfService.draw(this, promise);\n return promise;\n }\n /**\n * Initiates the Excel export ([see example]({% slug excelexport_grid %})).\n */\n saveAsExcel() {\n this.excelService.save(this);\n }\n /**\n * Applies the minimum possible width for the specified column,\n * so that the whole text fits without wrapping. This method expects the Grid\n * to be resizable (set `resizable` to `true`).\n * Makes sense to execute this method only\n * after the Grid is already populated with data.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n *\n * \n * \n * \n *\n * \n * \n *
\n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\n autoFitColumn(column) {\n this.columnResizingService.autoFit(column);\n }\n /**\n * Adjusts the width of the specified columns to fit the entire content, including headers, without wrapping.\n * If no columns are specified, `autoFitColumns` is applied to all columns.\n *\n * This method requires the Grid to be resizable (set `resizable` to `true`).\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\n autoFitColumns(columns = this.columns) {\n let cols;\n if (columns instanceof QueryList) {\n cols = columns.toArray();\n }\n else {\n cols = columns;\n }\n this.columnResizingService.autoFit(...cols);\n }\n /**\n * @hidden\n */\n notifyPageChange(source, event) {\n if (source === \"list\" && !this.isVirtual) {\n return;\n }\n this.pageChange.emit(event);\n }\n /**\n * @hidden\n */\n notifyScrollBottom() {\n if (this.scrollable === 'none') {\n return;\n }\n if (hasObservers(this.scrollBottom)) {\n this.ngZone.run(() => this.scrollBottom.emit({ sender: this }));\n }\n }\n /**\n * @hidden\n */\n focusEditElement(containerSelector) {\n if (this.focusElementSubscription) {\n this.focusElementSubscription.unsubscribe();\n }\n this.ngZone.runOutsideAngular(() => {\n this.focusElementSubscription = this.ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n const wrapper = this.wrapper.nativeElement;\n if (!this.setEditFocus(wrapper.querySelector(containerSelector)) && this.isLocked) {\n this.setEditFocus(wrapper.querySelector(`.k-grid-content ${containerSelector}`));\n }\n this.focusElementSubscription = null;\n });\n });\n }\n /**\n * Focuses the last active or the first cell of the Grid.\n *\n * @returns {NavigationCell} The focused cell.\n */\n focus() {\n this.assertNavigable();\n return this.navigationService.focusCell();\n }\n /**\n * Focuses the cell with the specified row and column index.\n *\n * The row index is based on the logical structure of the Grid and does not correspond to the data item index:\n * * Header rows are included, starting at index 0.\n * * Group headers and footers are included.\n * * The row indexing is absolute and does not change with paging.\n *\n * If the Grid is configured for scrolling, including virtual scrolling, the scroll position will be updated.\n * If the row is not present on the current page, the method will have no effect.\n *\n * @param rowIndex - The logical row index to focus. The top header row has an index 0.\n * @param colIndex - The column index to focus.\n * @returns {NavigationCell} The focused cell.\n *\n */\n focusCell(rowIndex, colIndex) {\n this.assertNavigable();\n return this.navigationService.focusCell(rowIndex, colIndex);\n }\n /**\n * Focuses the next cell, optionally wrapping to the next row.\n *\n * @param wrap - A Boolean value which indicates if the focus will move to the next row. Defaults to `true`.\n * @returns {NavigationCell} The focused cell. If the focus is already on the last cell, returns `null`.\n */\n focusNextCell(wrap = true) {\n this.assertNavigable();\n return this.navigationService.focusNextCell(wrap);\n }\n /**\n * Focuses the previous cell. Optionally wraps to the previous row.\n *\n * @param wrap - A Boolean value which indicates if the focus will move to the next row. Defaults to `true`.\n * @returns {NavigationCell} The focused cell. If the focus is already on the first cell, returns `null`.\n */\n focusPrevCell(wrap = true) {\n this.assertNavigable();\n return this.navigationService.focusPrevCell(wrap);\n }\n /**\n * Scrolls to the specified row and column\n */\n scrollTo(request) {\n this.scrollRequestService.scrollTo(request);\n }\n /**\n * Changes the position of the specified column.\n * The reordering of columns operates only on the level\n * which is inferred by the source column.\n * For the `reorderColumn` method to work properly,\n * the `source` column has to be visible.\n *\n * @param {ColumnBase} source - The column whose position will be changed.\n * @param {number} destIndex - The new position of the column.\n * @param {ColumnReorderConfig} options - Additional options.\n *\n * @example\n * ```ts\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n *\n * \n * \n * \n *\n * \n * \n *\n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n * ```\n */\n reorderColumn(source, destIndex, options = { before: false }) {\n const columnsForLevel = this.columnsForLevel(source.level);\n let target = columnsForLevel[destIndex];\n if (!target) {\n return;\n }\n const lastNonLocked = target.isLocked &&\n !source.isLocked &&\n this.columnsContainer.nonLockedColumns.length === 1;\n if (lastNonLocked) {\n return;\n }\n if (isSpanColumnComponent(target) && !options.before) {\n target = target.childColumns.last;\n }\n this.reorder({\n before: options.before,\n source: source,\n target: target\n });\n }\n /**\n * A function which determines if a specific row is expanded.\n */\n set isDetailExpanded(callback) {\n this.detailsService.userCallback = callback;\n }\n get isDetailExpanded() {\n return this.detailsService.userCallback;\n }\n /**\n * @hidden\n */\n reorder({ target, source, before, changeContainer }) {\n this.ngZone.run(() => {\n const columnsForLevel = this.columnsForLevel(source.level);\n let newIndex = columnsForLevel.indexOf(target);\n if (target.parent && target.parent.isSpanColumn) {\n newIndex = columnsForLevel.indexOf(target.parent);\n if (before) {\n target = target.parent;\n }\n }\n let oldIndex = columnsForLevel.indexOf(source);\n if (changeContainer) {\n if (before && 0 < newIndex && oldIndex < newIndex) { // dropped before the first not locked column\n newIndex--;\n }\n else if (!before && oldIndex > newIndex) { // dropped after the last locked column\n newIndex++;\n }\n }\n const args = new ColumnReorderEvent({\n column: source,\n oldIndex: oldIndex,\n newIndex: newIndex\n });\n this.columnReorder.emit(args);\n if (args.isDefaultPrevented()) {\n return;\n }\n if (changeContainer) {\n this.columnLockedChange.emit(new ColumnLockedChangeEvent([source]));\n }\n this.updateColumnIndices({ source, target, before });\n if (source.locked !== target.locked) {\n source.locked = target.locked;\n }\n this.columnsContainer.refresh();\n this.changeDetectorRef.markForCheck();\n });\n }\n updateColumnIndices({ source, target, before }) {\n const expandedColumns = expandColumnsWithSpan(this.columnsForLevel(source.level));\n const sourceColumnIndex = expandedColumns.indexOf(source);\n let nextSourceIndex = 0;\n let nextIndex = 0;\n let toSkip = 1;\n // Possible only when called from the API.\n if (source.isSpanColumn) {\n toSkip += source.childColumns.length;\n }\n let i = 0;\n while (i < expandedColumns.length) {\n let column = expandedColumns[i];\n if (column === target) {\n nextSourceIndex = before ? nextIndex : nextIndex + 1;\n nextIndex = before ? nextIndex + toSkip : nextIndex;\n column.orderIndex = nextIndex;\n if (nextSourceIndex === nextIndex + 1) {\n nextIndex += toSkip;\n }\n }\n else if (column === source) {\n i += toSkip;\n continue;\n }\n else {\n column.orderIndex = nextIndex;\n }\n nextIndex++;\n i++;\n }\n for (i = sourceColumnIndex; i < sourceColumnIndex + toSkip; i++) {\n expandedColumns[i].orderIndex = nextSourceIndex++;\n }\n this.updateIndicesForLevel(source.level + 1);\n }\n updateIndicesForLevel(level) {\n const colsForParentLevel = this.columnsForLevel(level - 1);\n const colsForLevel = [];\n sortColumns(colsForParentLevel).forEach((c) => {\n if (c.isColumnGroup) {\n colsForLevel.push(...c.childrenArray.sort((a, b) => a.orderIndex - b.orderIndex));\n }\n });\n expandColumnsWithSpan(colsForLevel).map((c, i) => c.orderIndex = i);\n if (level < this.columnsContainer.totalLevels) {\n this.updateIndicesForLevel(level + 1);\n }\n }\n columnsForLevel(level) {\n return this.columnsContainer\n .allColumns.filter(column => column.level === level);\n }\n initSelectionService() {\n if (!this.selectable) {\n this.selectionService.ngOnDestroy();\n this.cellSelectionService.ngOnDestroy();\n return;\n }\n if (!this.selectionDirective && !isPresent(this.defaultSelection)) {\n this.defaultSelection = new Selection(this, this.changeDetectorRef);\n }\n const cellSelectionMode = this.selectable['cell'];\n const activeService = cellSelectionMode ? this.cellSelectionService : this.selectionService;\n const inactiveService = cellSelectionMode ? this.selectionService : this.cellSelectionService;\n if (inactiveService.active) {\n inactiveService.ngOnDestroy();\n activeService.addSubscriptions();\n inactiveService.active = false;\n }\n activeService.active = true;\n activeService.init({\n cellSelected: cellSelectionMode ? this.cellSelected : undefined,\n rowSelected: cellSelectionMode ? undefined : this.rowSelected,\n selectable: this.selectable,\n view: this.view,\n columns: cellSelectionMode ? this.columnList.toArray() : undefined\n });\n if (!this.selectionDirective && !this.selectableSettings.enabled) {\n this.defaultSelection.reset();\n }\n if (this.selectionSubscription) {\n this.selectionSubscription.unsubscribe();\n }\n if (cellSelectionMode) {\n this.selectionSubscription = this.cellSelectionService.changes.subscribe((event) => {\n this.ngZone.run(() => this.selectionChange.emit(event));\n });\n }\n else {\n this.selectionSubscription = this.selectionService.changes.subscribe((event) => {\n this.ngZone.run(() => this.selectionChange.emit(event));\n });\n }\n }\n setEditFocus(element) {\n if (element) {\n return this.navigationService.tryFocus(element);\n }\n }\n columnInstance(column) {\n let instance;\n if (typeof column === 'number') {\n instance = this.columnsContainer.lockedLeafColumns.toArray()\n .concat(this.columnsContainer.nonLockedLeafColumns.toArray())[column];\n }\n else if (typeof column === 'string') {\n instance = this.columnList.filter((item) => item.field === column)[0];\n }\n else {\n instance = column;\n }\n if (!instance && isDevMode()) {\n throw new Error(`Invalid column ${column}`);\n }\n return instance;\n }\n verifySettings() {\n if (isDevMode()) {\n const locked = this.lockedLeafColumns.length || (this.columnMenu && this.columnMenu.lock);\n if (locked && this.detailTemplate) {\n throw new Error('Having both detail template and locked columns is not supported.');\n }\n if (this.lockedLeafColumns.length && !this.nonLockedLeafColumns.length) {\n throw new Error('There should be at least one non-locked column');\n }\n if ((locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {\n throw new Error((locked ? 'Locked' : 'Virtual') + ' columns feature requires all columns to have set width.');\n }\n if (locked && !this.isScrollable) {\n throw new Error('Locked columns are only supported when scrolling is enabled.');\n }\n if (this.columnList.filter(isColumnGroupComponent).filter((x) => !x.hasChildren).length) {\n throw new Error('ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.');\n }\n if (this.columnList.filter(x => x.locked && x.parent && !x.parent.isLocked).length) {\n throw new Error('Locked child columns require their parent columns to be locked.');\n }\n if ((this.rowHeight || this.detailRowHeight) && !this.isVirtual) {\n throw new Error('Row height and detail row height settings require virtual scrolling mode to be enabled.');\n }\n validateColumnsField(this.columnList);\n }\n }\n autoGenerateColumns() {\n if (this.shouldGenerateColumns && !this.columns.length && this.view.length) {\n this.columns.reset(Object.keys(this.view.at(0)).map(field => {\n let column = new ColumnComponent();\n column.field = field;\n return column;\n }));\n }\n }\n attachStateChangesEmitter() {\n this.stateChangeSubscription =\n merge(this.pageChange.pipe(map(x => ({\n filter: this.filter, group: this.group, skip: x.skip, sort: this.sort, take: x.take\n }))), this.sortChange.pipe(map(sort => ({ filter: this.filter, group: this.group, skip: this.skip, sort: sort, take: this.pageSize }))), this.groupChange.pipe(map(group => ({\n filter: this.filter, group: group, skip: this.skip, sort: this.sort, take: this.pageSize\n }))), this.filterChange.pipe(map(filter$$1 => ({\n filter: filter$$1, group: this.group, skip: 0, sort: this.sort, take: this.pageSize\n }))))\n .subscribe(x => {\n this.closeCell();\n this.cancelCell();\n this.dataStateChange.emit(x);\n });\n }\n attachEditHandlers() {\n if (!this.editService) {\n return;\n }\n this.editServiceSubscription = this.editService\n .changes.subscribe(this.emitCRUDEvent.bind(this));\n }\n emitCRUDEvent(args) {\n const { action, rowIndex, formGroup } = args;\n let dataItem = this.view.at(rowIndex - this.skip);\n if (action !== 'add' && !dataItem) {\n dataItem = formGroup.value;\n }\n this.closeCell();\n Object.assign(args, {\n dataItem: dataItem,\n sender: this\n });\n switch (action) {\n case 'add':\n this.add.emit(args);\n break;\n case 'cancel':\n this.cancel.emit(args);\n break;\n case 'edit':\n this.edit.emit(args);\n break;\n case 'remove':\n this.remove.emit(args);\n break;\n case 'save':\n this.save.emit(args);\n break;\n case 'cellClose':\n this.cellClose.emit(args);\n break;\n default: break;\n }\n }\n attachDomEventHandlers() {\n this.cellClickSubscription = this.domEvents.cellClick.subscribe((args) => {\n this.cellClick.emit(Object.assign({ sender: this }, args));\n });\n }\n attachElementEventHandlers() {\n if (isUniversal()) {\n return;\n }\n const wrapper = this.wrapper.nativeElement;\n const ariaRoot = this.ariaRoot.nativeElement;\n this.ngZone.runOutsideAngular(() => {\n const resizeCheck = this.resizeCheck.bind(this);\n const resizeSubscription = this.renderer.listen('window', 'resize', resizeCheck);\n const orientationSubscription = this.renderer.listen('window', 'orientationchange', resizeCheck);\n const documentClickSubscription = this.renderer.listen('document', 'click', (args) => {\n const activeElement = document.activeElement;\n if (this.editService.shouldCloseCell() &&\n !closest(args.target, matchesClasses('k-animation-container k-grid-ignore-click')) &&\n !(activeElement &&\n (closest(activeElement, matchesClasses('k-animation-container')) ||\n isInEditedCell(activeElement, this.wrapper.nativeElement)))) {\n this.editService.closeCell(args);\n }\n });\n const windowBlurSubscription = this.renderer.listen('window', 'blur', (args) => {\n const activeElement = document.activeElement;\n if (activeElement && !(matchesNodeName('input')(activeElement) && activeElement.type === 'file' &&\n isInEditedCell(activeElement, this.wrapper.nativeElement))) {\n this.editService.closeCell(args);\n }\n this.domEvents.windowBlur.emit(args);\n });\n const clickSubscription = this.renderer.listen(wrapper, 'click', (args) => {\n this.domEvents.click.emit(args);\n });\n const keydownSubscription = this.renderer.listen(wrapper, 'keydown', (args) => {\n this.domEvents.keydown.emit(args);\n });\n // focusIn and focusOut are relative to the element with ARIA role \"grid\"\n let focused = false;\n const focusInSubscription = this.renderer.listen(ariaRoot, 'focusin', (args) => {\n this.domEvents.focus.emit(args);\n if (!focused) {\n this.domEvents.focusIn.emit(args);\n focused = true;\n }\n });\n const focusOutSubscription = this.renderer.listen(ariaRoot, 'focusout', (args) => {\n const next = args.relatedTarget || document.activeElement;\n const outside = !closest(next, (node) => node === ariaRoot);\n if (outside) {\n this.domEvents.focusOut.emit(args);\n focused = false;\n }\n });\n this.detachElementEventHandlers = () => {\n resizeSubscription();\n orientationSubscription();\n documentClickSubscription();\n windowBlurSubscription();\n clickSubscription();\n keydownSubscription();\n focusInSubscription();\n focusOutSubscription();\n };\n });\n }\n matchesMedia(c) {\n return this.responsiveService.matchesMedia(c.media);\n }\n resizeCheck() {\n if (window.innerWidth !== this.cachedWindowWidth) {\n this.cachedWindowWidth = window.innerWidth;\n let hasChanges = false;\n this.columnList.filterHierarchy(column => {\n const matchesMedia = this.matchesMedia(column);\n if (column.matchesMedia !== matchesMedia) {\n hasChanges = true;\n column.matchesMedia = matchesMedia;\n }\n return column.isVisible;\n });\n if (hasChanges) {\n this.ngZone.run(() => {\n this.changeDetectorRef.markForCheck();\n });\n }\n }\n }\n emitPDFExportEvent() {\n const args = new PDFExportEvent();\n this.pdfExport.emit(args);\n if (!args.isDefaultPrevented()) {\n this.saveAsPDF();\n }\n }\n syncHeaderHeight(observable) {\n return observable\n .pipe(filter(() => isPresent(this.lockedHeader)))\n .subscribe(() => syncRowsHeight(this.lockedHeader.nativeElement.children[0], this.header.nativeElement.children[0]));\n }\n columnsContainerChange() {\n this.columnsContainerChangeSubscription =\n this.syncHeaderHeight(this.columnsContainer.changes.pipe(filter(() => this.lockedColumns.length > 0), switchMap(() => this.ngZone.onStable.asObservable().pipe(take(1)))));\n }\n handleColumnResize() {\n const resizes = this.columnResizingService.changes;\n this.columnResizingSubscription = resizes.pipe(tap(e => {\n if (e.type === 'start') {\n this.renderer.addClass(this.wrapper.nativeElement, 'k-grid-column-resizing');\n }\n else if (e.type === 'end') {\n this.renderer.removeClass(this.wrapper.nativeElement, 'k-grid-column-resizing');\n }\n }), filter(e => e.type === 'start'), switchMap(() => resizes.pipe(\n // tslint:disable-next-line: rxjs-no-unsafe-takeuntil\n takeUntil(resizes.pipe(filter(e => e.type === 'triggerAutoFit'))), filter(e => e.type === 'end'))))\n .subscribe(this.notifyResize.bind(this));\n }\n notifyResize(e) {\n const args = e.resizedColumns\n .filter(item => isTruthy(item.column.resizable) && !item.column.isColumnGroup)\n .map(item => ({\n column: item.column,\n newWidth: item.column.width,\n oldWidth: item.oldWidth\n }));\n this.columnResize.emit(args);\n }\n assertNavigable() {\n if (isDevMode() && !this.navigable) {\n throw new Error('The Grid should be configured as [navigable]=\"true\" to control focus');\n }\n }\n navigationMetadata() {\n const isVirtual = this.isVirtual;\n const pageSize = this.pageSize;\n const dataRows = isVirtual ? this.view.total : pageSize;\n const addRowOffset = this.editService.hasNewItem ? 1 : 0;\n const filterRowOffset = hasFilterRow(this.filterable) ? 1 : 0;\n const headerRows = this.totalColumnLevels + 1 + filterRowOffset + addRowOffset;\n return new NavigationMetadata(dataRows, headerRows, isVirtual, this.showPager, isPresent(this.detailTemplate), this.wrapper, this.virtualColumns, this.columnsContainer);\n }\n updateNavigationMetadata() {\n this.navigationService.metadata = this.navigationMetadata();\n }\n applyAutoSize() {\n const cols = this.columns.filter((c) => this.autoSize ? c.autoSize !== false : c.autoSize);\n if (cols.length > 0) {\n this.ngZone.onStable.pipe(take(1)).subscribe(_ => this.autoFitColumns(cols));\n }\n }\n onColumnRangeChange(range) {\n const viewportColumns = this.viewportColumns = [];\n const leafViewportColumns = this.columnsContainer\n .nonLockedLeafColumns.toArray().slice(range.start, range.end + 1);\n for (let idx = 0; idx < leafViewportColumns.length; idx++) {\n let column = leafViewportColumns[idx];\n while (column.parent) {\n column = column.parent;\n }\n const toAdd = [column];\n while (toAdd.length) {\n column = toAdd.shift();\n viewportColumns.push(column);\n if (column.isColumnGroup) {\n toAdd.unshift.apply(toAdd, column.childrenArray);\n }\n }\n const lastFromGroup = viewportColumns[viewportColumns.length - 1];\n column = leafViewportColumns[idx];\n while (column !== lastFromGroup && idx < leafViewportColumns.length) {\n idx++;\n column = leafViewportColumns[idx];\n }\n }\n if (range.start > 0) {\n const first = leafViewportColumns[0];\n let offset = range.offset;\n let current = viewportColumns[0];\n let index = 0;\n while (current !== first) {\n offset -= current.isColumnGroup ? 0 : current.width;\n index++;\n current = viewportColumns[index];\n }\n if (offset > 0) {\n const totalLevels = this.columnsContainer.totalLevels;\n let previous;\n for (let idx = 0; idx <= totalLevels; idx++) {\n const offsetColumn = idx < totalLevels ? new ColumnGroupComponent(previous) : new ColumnBase$1(previous);\n previous = offsetColumn;\n offsetColumn.title = \"\\u00A0\";\n offsetColumn.width = offset;\n viewportColumns.unshift(offsetColumn);\n }\n }\n }\n this.leafViewportColumns = viewportColumns.filter(c => !c.isColumnGroup);\n }\n toggleDetailRowLegacy(index, expand) {\n const hasCallback = typeof this.isDetailExpanded === 'function';\n if (isDevMode() && hasCallback) {\n throw new Error('The expandRow and collapseRow methods should not be called when using the ' +\n 'kendoGridDetailsExpandBy directive or the isDetailExpanded callback. ' +\n 'These methods are provided only for backwards compatibility with legacy versions.');\n }\n if (!isDevMode() && hasCallback) {\n return;\n }\n if (this.detailsService.isExpanded(index, null) !== expand) {\n this.detailsService.toggleRow(index, null);\n }\n }\n shouldResetSelection(selectableChanges) {\n const previousValue = selectableChanges.previousValue;\n if (!previousValue) {\n // Selection was disabled, no need to reset.\n return false;\n }\n const currentValue = selectableChanges.currentValue;\n if (!currentValue || currentValue.enabled === false) {\n // Selection disabled, reset.\n return true;\n }\n return previousValue.cell !== currentValue.cell;\n }\n}\nGridComponent.ɵfac = function GridComponent_Factory(t) { return new (t || GridComponent)(ɵngcc0.ɵɵdirectiveInject(BrowserSupportService), ɵngcc0.ɵɵdirectiveInject(SelectionService), ɵngcc0.ɵɵdirectiveInject(CellSelectionService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(GroupInfoService), ɵngcc0.ɵɵdirectiveInject(GroupsService), ɵngcc0.ɵɵdirectiveInject(ChangeNotificationService), ɵngcc0.ɵɵdirectiveInject(DetailsService), ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(PDFService), ɵngcc0.ɵɵdirectiveInject(ResponsiveService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ExcelService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ScrollSyncService), ɵngcc0.ɵɵdirectiveInject(DomEventsService), ɵngcc0.ɵɵdirectiveInject(ColumnResizingService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ColumnReorderService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(SortService), ɵngcc0.ɵɵdirectiveInject(ScrollRequestService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nGridComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GridComponent, selectors: [[\"kendo-grid\"]], contentQueries: function GridComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase$1, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DetailTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, NoRecordsTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PagerTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, ToolbarTemplateDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnMenuTemplateDirective, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columns = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.detailTemplateChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.noRecordsTemplateChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.pagerTemplateChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.toolbarTemplateChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columnMenuTemplates = _t);\n } }, viewQuery: function GridComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, true);\n ɵngcc0.ɵɵviewQuery(_c1, true);\n ɵngcc0.ɵɵviewQuery(_c2, true);\n ɵngcc0.ɵɵviewQuery(_c3, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.lockedHeader = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.header = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.ariaRoot = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.footer = _t);\n } }, hostVars: 11, hostBindings: function GridComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-grid\", ctx.hostClasses)(\"k-grid-lockedcolumns\", ctx.lockedClasses)(\"k-grid-virtual\", ctx.virtualClasses)(\"k-grid-no-scrollbar\", ctx.noScrollbarClass);\n } }, inputs: { data: \"data\", scrollable: \"scrollable\", selectable: \"selectable\", trackBy: \"trackBy\", virtualColumns: \"virtualColumns\", filterable: \"filterable\", sortable: \"sortable\", pageable: \"pageable\", groupable: \"groupable\", navigable: \"navigable\", autoSize: \"autoSize\", resizable: \"resizable\", reorderable: \"reorderable\", loading: \"loading\", columnMenu: \"columnMenu\", hideHeader: \"hideHeader\", skip: \"skip\", sort: \"sort\", group: \"group\", navigatable: \"navigatable\", rowClass: \"rowClass\", rowSelected: \"rowSelected\", cellSelected: \"cellSelected\", isDetailExpanded: \"isDetailExpanded\", pageSize: \"pageSize\", height: \"height\", rowHeight: \"rowHeight\", detailRowHeight: \"detailRowHeight\", filter: \"filter\" }, outputs: { filterChange: \"filterChange\", pageChange: \"pageChange\", groupChange: \"groupChange\", sortChange: \"sortChange\", selectionChange: \"selectionChange\", dataStateChange: \"dataStateChange\", groupExpand: \"groupExpand\", groupCollapse: \"groupCollapse\", detailExpand: \"detailExpand\", detailCollapse: \"detailCollapse\", edit: \"edit\", cancel: \"cancel\", save: \"save\", remove: \"remove\", add: \"add\", cellClose: \"cellClose\", cellClick: \"cellClick\", pdfExport: \"pdfExport\", excelExport: \"excelExport\", columnResize: \"columnResize\", columnReorder: \"columnReorder\", columnVisibilityChange: \"columnVisibilityChange\", columnLockedChange: \"columnLockedChange\", scrollBottom: \"scrollBottom\", contentScroll: \"contentScroll\" }, exportAs: [\"kendoGrid\"], features: [ɵngcc0.ɵɵProvidersFeature([\n BrowserSupportService,\n LocalizationService,\n ColumnInfoService,\n SelectionService,\n CellSelectionService,\n DetailsService,\n GroupsService,\n GroupInfoService,\n ChangeNotificationService,\n EditService,\n PDFService,\n SuspendService,\n {\n provide: CELL_CONTEXT,\n useValue: ɵ4$2\n },\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.grid'\n },\n FilterService,\n ResponsiveService,\n PagerContextService,\n ExcelService,\n ScrollSyncService,\n ResizeService,\n LocalDataChangesService,\n DomEventsService,\n ColumnResizingService,\n SinglePopupService,\n DragAndDropService,\n DragHintService,\n DropCueService,\n ColumnReorderService,\n NavigationService,\n FocusRoot,\n IdService,\n ScrollRequestService,\n SortService\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 10, vars: 8, consts: [[\"kendoGridLocalizedMessages\", \"\", 6, \"groupPanelEmpty\", \"noRecords\", \"pagerFirstPage\", \"pagerPreviousPage\", \"pagerNextPage\", \"pagerLastPage\", \"pagerPage\", \"pagerOf\", \"pagerItems\", \"pagerPageNumberInputTitle\", \"pagerItemsPerPage\", \"filter\", \"filterEqOperator\", \"filterNotEqOperator\", \"filterIsNullOperator\", \"filterIsNotNullOperator\", \"filterIsEmptyOperator\", \"filterIsNotEmptyOperator\", \"filterStartsWithOperator\", \"filterContainsOperator\", \"filterNotContainsOperator\", \"filterEndsWithOperator\", \"filterGteOperator\", \"filterGtOperator\", \"filterLteOperator\", \"filterLtOperator\", \"filterIsTrue\", \"filterIsFalse\", \"filterBooleanAll\", \"filterAfterOrEqualOperator\", \"filterAfterOperator\", \"filterBeforeOperator\", \"filterBeforeOrEqualOperator\", \"filterFilterButton\", \"filterClearButton\", \"filterAndLogic\", \"filterOrLogic\", \"loading\", \"columnMenu\", \"columns\", \"lock\", \"unlock\", \"sortable\", \"sortAscending\", \"sortDescending\", \"sortedAscending\", \"sortedDescending\", \"sortedDefault\", \"columnsApply\", \"columnsReset\", \"detailExpand\", \"detailCollapse\", \"filterDateToday\", \"filterDateToggle\", \"filterNumericDecrement\", \"filterNumericIncrement\"], [\"position\", \"top\", 4, \"ngIf\"], [3, \"text\", \"groups\", \"change\", 4, \"ngIf\"], [\"role\", \"grid\", 1, \"k-grid-aria-root\"], [\"ariaRoot\", \"\"], [3, \"ngIf\"], [3, \"template\", \"pageSize\", \"total\", \"skip\", \"options\", \"pageChange\", 4, \"ngIf\"], [\"position\", \"bottom\", 4, \"ngIf\"], [\"position\", \"top\"], [3, \"text\", \"groups\", \"change\"], [\"class\", \"k-grid-header\", \"role\", \"presentation\", 3, \"padding\", 4, \"ngIf\"], [\"kendoDraggable\", \"\", \"kendoGridSelectionMarquee\", \"\", 3, \"data\", \"rowHeight\", \"detailRowHeight\", \"total\", \"take\", \"groups\", \"groupable\", \"skip\", \"trackBy\", \"columns\", \"selectable\", \"filterable\", \"detailTemplate\", \"noRecordsTemplate\", \"rowClass\", \"loading\", \"isVirtual\", \"virtualColumns\", \"enableDrag\", \"pageChange\", \"scrollBottom\", \"contentScroll\"], [\"class\", \"k-grid-footer\", 3, \"padding\", 4, \"ngIf\"], [\"role\", \"presentation\", 1, \"k-grid-header\"], [\"role\", \"presentation\", \"class\", \"k-grid-header-locked\", 3, \"width\", 4, \"ngIf\"], [\"role\", \"presentation\", \"data-scrollable\", \"\", 1, \"k-grid-header-wrap\", 3, \"kendoGridResizableContainer\", \"lockedWidth\"], [\"header\", \"\"], [\"role\", \"presentation\", 3, \"virtualColumns\"], [\"kendoGridColGroup\", \"\", \"role\", \"presentation\", 3, \"columns\", \"groups\", \"detailTemplate\"], [\"kendoGridHeader\", \"\", \"role\", \"presentation\", 3, \"resizable\", \"scrollable\", \"columns\", \"totalColumnLevels\", \"sort\", \"filter\", \"filterable\", \"groupable\", \"reorderable\", \"groups\", \"sortable\", \"columnMenu\", \"columnMenuTemplate\", \"lockedColumnsCount\", \"totalColumnsCount\", \"detailTemplate\"], [\"class\", \"k-width-container\", \"role\", \"presentation\", 4, \"ngIf\"], [\"role\", \"presentation\", 1, \"k-grid-header-locked\"], [\"lockedHeader\", \"\"], [\"role\", \"presentation\", 3, \"locked\"], [\"kendoGridHeader\", \"\", 3, \"resizable\", \"scrollable\", \"columns\", \"totalColumnLevels\", \"sort\", \"groups\", \"filter\", \"filterable\", \"groupable\", \"reorderable\", \"sortable\", \"columnMenu\", \"columnMenuTemplate\", \"totalColumnsCount\", \"detailTemplate\"], [\"role\", \"presentation\", 1, \"k-width-container\"], [1, \"k-grid-footer\"], [\"class\", \"k-grid-footer-locked\", 3, \"width\", 4, \"ngIf\"], [\"data-scrollable\", \"\", 1, \"k-grid-footer-wrap\", 3, \"kendoGridResizableContainer\", \"lockedWidth\"], [\"footer\", \"\"], [\"role\", \"presentation\"], [\"kendoGridColGroup\", \"\", 3, \"columns\", \"groups\", \"detailTemplate\"], [\"kendoGridFooter\", \"\", 3, \"logicalRowIndex\", \"scrollable\", \"groups\", \"columns\", \"lockedColumnsCount\", \"detailTemplate\"], [1, \"k-grid-footer-locked\"], [\"kendoGridFooter\", \"\", 3, \"scrollable\", \"groups\", \"columns\", \"detailTemplate\", \"logicalRowIndex\"], [\"kendoGridHeader\", \"\", 3, \"resizable\", \"scrollable\", \"columns\", \"totalColumnLevels\", \"groups\", \"groupable\", \"reorderable\", \"sort\", \"sortable\", \"filter\", \"filterable\", \"columnMenu\", \"columnMenuTemplate\", \"detailTemplate\", 4, \"ngIf\"], [\"kendoGridTableBody\", \"\", \"kendoDraggable\", \"\", \"kendoGridSelectionMarquee\", \"\", 3, \"groups\", \"data\", \"skip\", \"columns\", \"selectable\", \"filterable\", \"noRecordsTemplate\", \"detailTemplate\", \"showGroupFooters\", \"trackBy\", \"rowClass\", \"enableDrag\"], [\"kendoGridFooter\", \"\", 3, \"scrollable\", \"logicalRowIndex\", \"groups\", \"columns\", \"detailTemplate\", 4, \"ngIf\"], [\"kendoGridLoading\", \"\", 4, \"ngIf\"], [\"kendoGridHeader\", \"\", 3, \"resizable\", \"scrollable\", \"columns\", \"totalColumnLevels\", \"groups\", \"groupable\", \"reorderable\", \"sort\", \"sortable\", \"filter\", \"filterable\", \"columnMenu\", \"columnMenuTemplate\", \"detailTemplate\"], [\"kendoGridFooter\", \"\", 3, \"scrollable\", \"logicalRowIndex\", \"groups\", \"columns\", \"detailTemplate\"], [\"kendoGridLoading\", \"\"], [3, \"template\", \"pageSize\", \"total\", \"skip\", \"options\", \"pageChange\"], [\"position\", \"bottom\"]], template: function GridComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c116);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵtemplate(2, GridComponent_kendo_grid_toolbar_2_Template, 1, 0, \"kendo-grid-toolbar\", 1);\n ɵngcc0.ɵɵtemplate(3, GridComponent_kendo_grid_group_panel_3_Template, 1, 2, \"kendo-grid-group-panel\", 2);\n ɵngcc0.ɵɵelementStart(4, \"div\", 3, 4);\n ɵngcc0.ɵɵtemplate(6, GridComponent_ng_template_6_Template, 3, 21, \"ng-template\", 5);\n ɵngcc0.ɵɵtemplate(7, GridComponent_ng_template_7_Template, 6, 20, \"ng-template\", 5);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(8, GridComponent_kendo_pager_8_Template, 1, 5, \"kendo-pager\", 6);\n ɵngcc0.ɵɵtemplate(9, GridComponent_kendo_grid_toolbar_9_Template, 1, 0, \"kendo-grid-toolbar\", 7);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showTopToolbar);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showGroupPanel);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵattribute(\"aria-rowcount\", ctx.ariaRowCount)(\"aria-colcount\", ctx.ariaColCount);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isScrollable);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.isScrollable);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showPager);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showBottomToolbar);\n } }, directives: function () { return [LocalizedMessagesDirective, ɵngcc5.NgIf, ToolbarComponent,\n GroupPanelComponent,\n ListComponent, ɵngcc2.DraggableDirective, GridMarqueeDirective,\n ResizableContainerDirective,\n TableDirective,\n ColGroupComponent,\n HeaderComponent,\n FooterComponent,\n TableBodyComponent,\n LoadingComponent,\n PagerComponent]; }, styles: [\" .k-grid .k-grid-aria-root {\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n overflow: hidden;\\n }\\n\\n .k-grid .k-filter-row td {\\n white-space: nowrap;\\n }\"], encapsulation: 2 });\n/** @nocollapse */\nGridComponent.ctorParameters = () => [\n { type: BrowserSupportService },\n { type: SelectionService },\n { type: CellSelectionService },\n { type: ElementRef },\n { type: GroupInfoService },\n { type: GroupsService },\n { type: ChangeNotificationService },\n { type: DetailsService },\n { type: EditService },\n { type: FilterService },\n { type: PDFService },\n { type: ResponsiveService },\n { type: Renderer2 },\n { type: ExcelService },\n { type: NgZone },\n { type: ScrollSyncService },\n { type: DomEventsService },\n { type: ColumnResizingService },\n { type: ChangeDetectorRef },\n { type: ColumnReorderService },\n { type: ColumnInfoService },\n { type: NavigationService },\n { type: SortService },\n { type: ScrollRequestService },\n { type: LocalizationService }\n];\nGridComponent.propDecorators = {\n data: [{ type: Input }],\n pageSize: [{ type: Input }],\n height: [{ type: Input }],\n rowHeight: [{ type: Input }],\n detailRowHeight: [{ type: Input }],\n skip: [{ type: Input }],\n scrollable: [{ type: Input }],\n selectable: [{ type: Input }],\n sort: [{ type: Input }],\n trackBy: [{ type: Input }],\n filter: [{ type: Input }],\n group: [{ type: Input }],\n virtualColumns: [{ type: Input }],\n filterable: [{ type: Input }],\n sortable: [{ type: Input }],\n pageable: [{ type: Input }],\n groupable: [{ type: Input }],\n navigable: [{ type: Input }],\n navigatable: [{ type: Input }],\n autoSize: [{ type: Input }],\n rowClass: [{ type: Input }],\n rowSelected: [{ type: Input }],\n cellSelected: [{ type: Input }],\n resizable: [{ type: Input }],\n reorderable: [{ type: Input }],\n loading: [{ type: Input }],\n columnMenu: [{ type: Input }],\n hideHeader: [{ type: Input }],\n filterChange: [{ type: Output }],\n pageChange: [{ type: Output }],\n groupChange: [{ type: Output }],\n sortChange: [{ type: Output }],\n selectionChange: [{ type: Output }],\n dataStateChange: [{ type: Output }],\n groupExpand: [{ type: Output }],\n groupCollapse: [{ type: Output }],\n detailExpand: [{ type: Output }],\n detailCollapse: [{ type: Output }],\n edit: [{ type: Output }],\n cancel: [{ type: Output }],\n save: [{ type: Output }],\n remove: [{ type: Output }],\n add: [{ type: Output }],\n cellClose: [{ type: Output }],\n cellClick: [{ type: Output }],\n pdfExport: [{ type: Output }],\n excelExport: [{ type: Output }],\n columnResize: [{ type: Output }],\n columnReorder: [{ type: Output }],\n columnVisibilityChange: [{ type: Output }],\n columnLockedChange: [{ type: Output }],\n scrollBottom: [{ type: Output }],\n contentScroll: [{ type: Output }],\n columns: [{ type: ContentChildren, args: [ColumnBase$1,] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-grid',] }],\n lockedClasses: [{ type: HostBinding, args: ['class.k-grid-lockedcolumns',] }],\n virtualClasses: [{ type: HostBinding, args: ['class.k-grid-virtual',] }],\n noScrollbarClass: [{ type: HostBinding, args: ['class.k-grid-no-scrollbar',] }],\n detailTemplateChildren: [{ type: ContentChildren, args: [DetailTemplateDirective,] }],\n noRecordsTemplateChildren: [{ type: ContentChildren, args: [NoRecordsTemplateDirective,] }],\n pagerTemplateChildren: [{ type: ContentChildren, args: [PagerTemplateDirective,] }],\n toolbarTemplateChildren: [{ type: ContentChildren, args: [ToolbarTemplateDirective,] }],\n columnMenuTemplates: [{ type: ContentChildren, args: [ColumnMenuTemplateDirective,] }],\n lockedHeader: [{ type: ViewChild, args: [\"lockedHeader\",] }],\n header: [{ type: ViewChild, args: [\"header\",] }],\n footer: [{ type: ViewChildren, args: [\"footer\",] }],\n ariaRoot: [{ type: ViewChild, args: ['ariaRoot',] }],\n isDetailExpanded: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GridComponent, [{\n type: Component,\n args: [{\n encapsulation: ViewEncapsulation.None,\n exportAs: 'kendoGrid',\n providers: [\n BrowserSupportService,\n LocalizationService,\n ColumnInfoService,\n SelectionService,\n CellSelectionService,\n DetailsService,\n GroupsService,\n GroupInfoService,\n ChangeNotificationService,\n EditService,\n PDFService,\n SuspendService,\n {\n provide: CELL_CONTEXT,\n useValue: ɵ4$2\n },\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.grid'\n },\n FilterService,\n ResponsiveService,\n PagerContextService,\n ExcelService,\n ScrollSyncService,\n ResizeService,\n LocalDataChangesService,\n DomEventsService,\n ColumnResizingService,\n SinglePopupService,\n DragAndDropService,\n DragHintService,\n DropCueService,\n ColumnReorderService,\n NavigationService,\n FocusRoot,\n IdService,\n ScrollRequestService,\n SortService\n ],\n selector: 'kendo-grid',\n styles: [\n // Styles for backwards compatibility with kendo-theme-default@v2.46.0 and earlier.\n ` .k-grid .k-grid-aria-root {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n overflow: hidden;\n }\n\n .k-grid .k-filter-row td {\n white-space: nowrap;\n }`\n ],\n template: `\n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n \n \n `\n }]\n }], function () { return [{ type: BrowserSupportService }, { type: SelectionService }, { type: CellSelectionService }, { type: ɵngcc0.ElementRef }, { type: GroupInfoService }, { type: GroupsService }, { type: ChangeNotificationService }, { type: DetailsService }, { type: EditService }, { type: FilterService }, { type: PDFService }, { type: ResponsiveService }, { type: ɵngcc0.Renderer2 }, { type: ExcelService }, { type: ɵngcc0.NgZone }, { type: ScrollSyncService }, { type: DomEventsService }, { type: ColumnResizingService }, { type: ɵngcc0.ChangeDetectorRef }, { type: ColumnReorderService }, { type: ColumnInfoService }, { type: NavigationService }, { type: SortService }, { type: ScrollRequestService }, { type: ɵngcc1.LocalizationService }]; }, { data: [{\n type: Input\n }], scrollable: [{\n type: Input\n }], selectable: [{\n type: Input\n }], trackBy: [{\n type: Input\n }], virtualColumns: [{\n type: Input\n }], filterable: [{\n type: Input\n }], sortable: [{\n type: Input\n }], pageable: [{\n type: Input\n }], groupable: [{\n type: Input\n }], navigable: [{\n type: Input\n }], autoSize: [{\n type: Input\n }], resizable: [{\n type: Input\n }], reorderable: [{\n type: Input\n }], loading: [{\n type: Input\n }], columnMenu: [{\n type: Input\n }], hideHeader: [{\n type: Input\n }], filterChange: [{\n type: Output\n }], pageChange: [{\n type: Output\n }], groupChange: [{\n type: Output\n }], sortChange: [{\n type: Output\n }], selectionChange: [{\n type: Output\n }], dataStateChange: [{\n type: Output\n }], groupExpand: [{\n type: Output\n }], groupCollapse: [{\n type: Output\n }], detailExpand: [{\n type: Output\n }], detailCollapse: [{\n type: Output\n }], edit: [{\n type: Output\n }], cancel: [{\n type: Output\n }], save: [{\n type: Output\n }], remove: [{\n type: Output\n }], add: [{\n type: Output\n }], cellClose: [{\n type: Output\n }], cellClick: [{\n type: Output\n }], pdfExport: [{\n type: Output\n }], excelExport: [{\n type: Output\n }], columnResize: [{\n type: Output\n }], columnReorder: [{\n type: Output\n }], columnVisibilityChange: [{\n type: Output\n }], columnLockedChange: [{\n type: Output\n }], scrollBottom: [{\n type: Output\n }], contentScroll: [{\n type: Output\n }], columns: [{\n type: ContentChildren,\n args: [ColumnBase$1]\n }], footer: [{\n type: ViewChildren,\n args: [\"footer\"]\n }], skip: [{\n type: Input\n }], sort: [{\n type: Input\n }], group: [{\n type: Input\n }], navigatable: [{\n type: Input\n }], rowClass: [{\n type: Input\n }], rowSelected: [{\n type: Input\n }], cellSelected: [{\n type: Input\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-grid']\n }], lockedClasses: [{\n type: HostBinding,\n args: ['class.k-grid-lockedcolumns']\n }], virtualClasses: [{\n type: HostBinding,\n args: ['class.k-grid-virtual']\n }], noScrollbarClass: [{\n type: HostBinding,\n args: ['class.k-grid-no-scrollbar']\n }], isDetailExpanded: [{\n type: Input\n }], pageSize: [{\n type: Input\n }], height: [{\n type: Input\n }], rowHeight: [{\n type: Input\n }], detailRowHeight: [{\n type: Input\n }], filter: [{\n type: Input\n }], detailTemplateChildren: [{\n type: ContentChildren,\n args: [DetailTemplateDirective]\n }], noRecordsTemplateChildren: [{\n type: ContentChildren,\n args: [NoRecordsTemplateDirective]\n }], pagerTemplateChildren: [{\n type: ContentChildren,\n args: [PagerTemplateDirective]\n }], toolbarTemplateChildren: [{\n type: ContentChildren,\n args: [ToolbarTemplateDirective]\n }], columnMenuTemplates: [{\n type: ContentChildren,\n args: [ColumnMenuTemplateDirective]\n }], lockedHeader: [{\n type: ViewChild,\n args: [\"lockedHeader\"]\n }], header: [{\n type: ViewChild,\n args: [\"header\"]\n }], ariaRoot: [{\n type: ViewChild,\n args: ['ariaRoot']\n }] }); })();\n\n/**\n * @hidden\n */\nconst update = (arr, idx, value) => ([\n ...arr.slice(0, idx + 1),\n ...(arr.slice(idx + 1).map(x => x + value))\n]);\n/**\n * @hidden\n */\nclass RowHeightService {\n constructor(total = 0, rowHeight, detailRowHeight) {\n this.total = total;\n this.rowHeight = rowHeight;\n this.detailRowHeight = detailRowHeight;\n this.offsets = [];\n this.heights = [];\n let agg = 0;\n for (let idx = 0; idx < total; idx++) {\n this.offsets.push(agg);\n agg += rowHeight;\n this.heights.push(rowHeight);\n }\n }\n height(rowIndex) {\n return this.heights[rowIndex];\n }\n expandDetail(rowIndex) {\n if (this.height(rowIndex) === this.rowHeight) {\n this.updateRowHeight(rowIndex, this.detailRowHeight);\n }\n }\n collapseDetail(rowIndex) {\n if (this.height(rowIndex) > this.rowHeight) {\n this.updateRowHeight(rowIndex, this.detailRowHeight * -1);\n }\n }\n isExpanded(rowIndex) {\n return this.height(rowIndex) > this.rowHeight;\n }\n index(position) {\n if (position < 0) {\n return undefined;\n }\n const result = this.offsets.reduce((prev, current, idx) => {\n if (prev !== undefined) {\n return prev;\n }\n else if (current === position) {\n return idx;\n }\n else if (current > position) {\n return idx - 1;\n }\n return undefined;\n }, undefined); // tslint:disable-line:align\n return result === undefined ? this.total - 1 : result;\n }\n offset(rowIndex) {\n return this.offsets[rowIndex];\n }\n totalHeight() {\n return this.heights.reduce((prev, curr) => prev + curr, 0);\n }\n updateRowHeight(rowIndex, value) {\n if (this.total > 0) {\n this.heights[rowIndex] += value;\n this.offsets = update(this.offsets, rowIndex, value);\n }\n }\n}\n\n/**\n * @hidden\n */\nclass ScrollAction {\n constructor(offset) {\n this.offset = offset;\n }\n}\n/**\n * @hidden\n */\nclass PageAction {\n constructor(skip, take$$1) {\n this.skip = skip;\n this.take = take$$1;\n }\n}\n/**\n * @hidden\n */\nclass ScrollBottomAction {\n}\nconst SCROLL_BOTTOM_THRESHOLD = 2;\n/**\n * @hidden\n */\nclass ScrollerService {\n constructor(scrollObservable) {\n this.scrollObservable = scrollObservable;\n this.firstLoaded = 0;\n }\n create(rowHeightService, skip, take$$1, total) {\n this.rowHeightService = rowHeightService;\n this.firstLoaded = skip;\n this.lastLoaded = skip + take$$1;\n this.take = take$$1;\n this.total = total;\n this.lastScrollTop = 0;\n const subject = new BehaviorSubject(new ScrollAction(this.rowHeightService.offset(skip)));\n this.subscription = Observable.create(observer => {\n this.unsubscribe();\n this.scrollSubscription = this.scrollObservable.subscribe(x => this.onScroll(x, observer));\n }).subscribe(x => subject.next(x));\n return subject;\n }\n destroy() {\n this.unsubscribe();\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n onScroll({ scrollTop, offsetHeight, scrollHeight, clientHeight }, observer) {\n if (this.lastScrollTop === scrollTop) {\n return;\n }\n const up = this.lastScrollTop >= scrollTop;\n this.lastScrollTop = scrollTop;\n let firstItemIndex = this.rowHeightService.index(scrollTop);\n let firstItemOffset = this.rowHeightService.offset(firstItemIndex);\n const lastItemIndex = this.rowHeightService.index(scrollTop + offsetHeight);\n if (!up) {\n if (lastItemIndex >= this.lastLoaded && this.lastLoaded < this.total) {\n const overflow = (firstItemIndex + this.take) - this.total;\n if (overflow > 0) {\n firstItemIndex = firstItemIndex - overflow;\n firstItemOffset = this.rowHeightService.offset(firstItemIndex);\n }\n this.firstLoaded = firstItemIndex;\n observer.next(new ScrollAction(firstItemOffset));\n let nextTake = this.firstLoaded + this.take;\n this.lastLoaded = Math.min(nextTake, this.total);\n nextTake = nextTake > this.total ? this.total - this.firstLoaded : this.take;\n observer.next(new PageAction(this.firstLoaded, this.take));\n }\n else {\n const atBottom = scrollHeight - clientHeight - scrollTop < SCROLL_BOTTOM_THRESHOLD;\n if (atBottom) {\n observer.next(new ScrollBottomAction());\n }\n }\n }\n if (up && firstItemIndex < this.firstLoaded) {\n const nonVisibleBuffer = Math.floor(this.take * 0.3);\n this.firstLoaded = Math.max(firstItemIndex - nonVisibleBuffer, 0);\n observer.next(new ScrollAction(this.rowHeightService.offset(this.firstLoaded)));\n this.lastLoaded = Math.min(this.firstLoaded + this.take, this.total);\n observer.next(new PageAction(this.firstLoaded, this.take));\n }\n }\n unsubscribe() {\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n this.scrollSubscription = undefined;\n }\n }\n}\n\n/**\n * @hidden\n */\nconst NON_DATA_CELL_CLASSES = 'k-hierarchy-cell k-detail-cell k-group-cell';\n/**\n * @hidden\n */\nconst NON_DATA_ROW_CLASSES = 'k-grouping-row k-group-footer k-detail-row k-grid-norecords';\n/**\n * @hidden\n */\nconst IGNORE_TARGET_CLASSSES = 'k-icon';\n/**\n * @hidden\n */\nconst IGNORE_CONTAINER_CLASSES = 'k-widget k-grid-ignore-click';\n\nconst elementAt = (index, elements, elementOffset) => {\n for (let idx = 0, elementIdx = 0; idx < elements.length; idx++) {\n const offset = elementOffset(elements[idx]);\n if (elementIdx <= index && index <= elementIdx + offset - 1) {\n return elements[idx];\n }\n elementIdx += offset;\n }\n};\nconst rowAt = (index, rows) => elementAt(index, rows, row => row.hasAttribute('data-kendo-grid-item-index') ? 1 : 0);\nconst cellAt = (index, cells) => elementAt(index, cells, cell => !hasClasses(cell, NON_DATA_CELL_CLASSES) ? parseInt(cell.getAttribute('colSpan'), 10) || 1 : 0);\nconst EMPTY_OBJECT = {};\n/**\n * @hidden\n */\nconst SCROLLER_FACTORY_TOKEN = new InjectionToken('grid-scroll-service-factory');\n/**\n * @hidden\n */\nfunction DEFAULT_SCROLLER_FACTORY(observable) {\n return new ScrollerService(observable);\n}\nconst wheelDeltaY = (e) => {\n const deltaY = e.wheelDeltaY;\n if (e.wheelDelta && (deltaY === undefined || deltaY)) {\n return e.wheelDelta;\n }\n else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n return (-e.detail) * 10;\n }\n return 0;\n};\nconst preventLockedScroll = (args, element) => {\n const delta = wheelDeltaY(args);\n const scrollTop = element.scrollTop;\n const allowScroll = (scrollTop === 0 && 0 < delta) || (element.scrollHeight <= element.offsetHeight + scrollTop && delta < 0);\n if (!allowScroll) {\n event.preventDefault();\n }\n};\nconst translateY = (renderer, value) => el => renderer.setStyle(el, \"transform\", `translateY(${value}px)`);\nconst maybeNativeElement = el => el ? el.nativeElement : null;\nconst hasScrollbar = (el, parent) => el.nativeElement.offsetWidth > parent.nativeElement.clientWidth;\nconst setHeight$1 = renderer => ({ el, height }) => renderer.setStyle(el, \"height\", `${height}px`);\nconst bufferSize = 1;\n/**\n * @hidden\n */\nclass ListComponent {\n constructor(scrollerFactory, detailsService, changeNotification, suspendService, groupsService, ngZone, renderer, scrollSyncService, resizeService, editService, supportService, navigationService, scrollRequestService, localization, columnResizingService, changeDetector, pdfService, columnInfo) {\n this.changeNotification = changeNotification;\n this.suspendService = suspendService;\n this.groupsService = groupsService;\n this.ngZone = ngZone;\n this.renderer = renderer;\n this.scrollSyncService = scrollSyncService;\n this.resizeService = resizeService;\n this.editService = editService;\n this.supportService = supportService;\n this.navigationService = navigationService;\n this.localization = localization;\n this.columnResizingService = columnResizingService;\n this.changeDetector = changeDetector;\n this.pdfService = pdfService;\n this.columnInfo = columnInfo;\n this.groups = [];\n this.skip = 0;\n this.columns = new ColumnsContainer(() => []);\n this.selectable = false;\n this.groupable = false;\n this.trackBy = defaultTrackBy;\n this.contentScroll = new EventEmitter();\n this.pageChange = new EventEmitter();\n this.scrollBottom = new EventEmitter();\n this.columnsStartIdx = 0;\n this.resizeSensors = new QueryList();\n this.dispatcher = new Subject();\n this.containerScrollTop = 0;\n this.scrollLeft = 0;\n this.rtl = false;\n this.scroller = scrollerFactory(this.dispatcher);\n this.subscriptions =\n detailsService.changes.subscribe(x => this.detailExpand(x)).add(scrollRequestService.requests.subscribe(x => this.scrollTo(x)));\n }\n get hostClass() {\n return true;\n }\n get hostRole() {\n return 'presentation';\n }\n get showFooter() {\n return this.groupable && this.groupable.showFooter;\n }\n get totalWidth() {\n if (this.virtualColumns && this.columns.unlockedWidth) {\n return this.columns.unlockedWidth;\n }\n }\n get lockedLeafColumns() {\n return this.columns.lockedLeafColumns;\n }\n get nonLockedLeafColumns() {\n return this.columns.nonLockedLeafColumns;\n }\n get nonLockedColumnsToRender() {\n if (this.virtualColumns && !this.pdfService.exporting) {\n return this.viewportColumns;\n }\n return this.nonLockedLeafColumns;\n }\n get leafColumns() {\n return this.columns.leafColumnsToRender;\n }\n get lockedWidth() {\n const groupCellsWidth = this.groups.length * GROUP_CELL_WIDTH;\n return expandColumns(this.lockedLeafColumns.toArray()).reduce((prev, curr) => prev + (curr.width || 0), groupCellsWidth);\n }\n get nonLockedWidth() {\n if ((!this.rtl && this.lockedLeafColumns.length) || this.virtualColumns) {\n return sumColumnWidths(expandColumns(this.nonLockedColumnsToRender.toArray()));\n }\n return undefined;\n }\n get isLocked() {\n return this.lockedLeafColumns.length > 0;\n }\n ngOnInit() {\n this.init();\n this.subscriptions.add(this.ngZone.runOutsideAngular(this.handleRowSync.bind(this)));\n this.subscriptions.add(this.ngZone.runOutsideAngular(this.handleRowNavigationLocked.bind(this)));\n this.subscriptions.add(merge(this.columns.changes, this.resizeService.changes).subscribe(() => {\n if (this.virtualColumns) {\n this.ngZone.run(() => {\n this.updateViewportColumns();\n this.changeDetector.markForCheck();\n });\n }\n }));\n this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => this.rtl = rtl));\n }\n ngOnChanges(changes) {\n const hasInitialSkip = changes.skip && changes.skip.firstChange && changes.skip.currentValue > 0;\n if (hasInitialSkip) {\n this.handleInitialScrollToSkip();\n }\n if (isChanged(\"skip\", changes) && !this.rebind) {\n this.skipScroll = true;\n this.container.nativeElement.scrollTop = this.rowHeightService.offset(this.skip);\n }\n if (anyChanged([\"total\", \"take\"], changes)) {\n this.init();\n }\n this.rebind = false;\n }\n ngDoCheck() {\n if (this.virtualColumns && (!this.viewportColumns || this.viewportWidthChange())) {\n this.updateViewportColumns();\n }\n }\n ngAfterViewInit() {\n if (this.skip && this.isVirtual) {\n this.container.nativeElement.scrollTop = this.rowHeightService.offset(this.skip);\n }\n this.resetNavigationViewport();\n this.attachContainerScroll();\n this.initResizeService();\n }\n ngAfterViewChecked() {\n const isLocked = this.isLocked;\n if (isLocked && !this.hasLockedContainer) {\n this.syncRowsHeight();\n }\n this.hasLockedContainer = isLocked;\n }\n syncRowsHeight() {\n if (this.lockedContainer) {\n syncRowsHeight(this.lockedTable.nativeElement, this.table.nativeElement);\n }\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n if (this.resizeService) {\n this.resizeService.destroy();\n }\n this.cleanupScroller();\n }\n init() {\n if (this.suspendService.scroll) {\n return;\n }\n this.rowHeightService = new RowHeightService(this.total, this.rowHeight, this.detailRowHeight);\n this.totalHeight = this.rowHeightService.totalHeight();\n if (!isUniversal()) {\n this.ngZone.runOutsideAngular(this.createScroller.bind(this));\n }\n }\n lockedScroll() {\n if (!this.suspendService.scroll) {\n const lockedScrollTop = this.lockedContainer.nativeElement.scrollTop;\n if (lockedScrollTop !== this.containerScrollTop) {\n this.container.nativeElement.scrollTop = this.containerScrollTop = lockedScrollTop;\n }\n }\n }\n lockedMousewheel(args) {\n if (!args.ctrlKey) {\n preventLockedScroll(args, this.container.nativeElement);\n const scrollDelta = wheelDeltaY(args);\n this.container.nativeElement.scrollTop -= scrollDelta;\n }\n }\n lockedKeydown(args) {\n if (args.keyCode === Keys.PageDown || args.keyCode === Keys.PageUp) {\n const dir = args.keyCode === Keys.PageDown ? 1 : -1;\n const element = this.container.nativeElement;\n element.scrollTop += element.offsetHeight * dir * 0.8;\n args.preventDefault();\n }\n }\n detailExpand({ index, expand }) {\n if (expand) {\n this.rowHeightService.expandDetail(index);\n }\n else {\n this.rowHeightService.collapseDetail(index);\n }\n this.totalHeight = this.rowHeightService.totalHeight();\n this.resetNavigationViewport();\n }\n attachContainerScroll() {\n if (isUniversal()) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n this.subscriptions.add(fromEvent(this.container.nativeElement, 'scroll').pipe(map((event) => event.target), filter(() => !this.suspendService.scroll), tap((target) => {\n this.onContainerScroll(target);\n this.resetNavigationViewport();\n if (this.virtualColumns) {\n this.handleColumnScroll();\n }\n const rowViewport = this.navigationService.viewport || EMPTY_OBJECT;\n const columnViewport = this.navigationService.columnViewport || EMPTY_OBJECT;\n this.contentScroll.emit({\n scrollLeft: target.scrollLeft,\n scrollTop: target.scrollTop,\n startRow: rowViewport.firstItemIndex,\n endRow: rowViewport.lastItemIndex,\n startColumn: columnViewport.firstItemIndex,\n endColumn: columnViewport.lastItemIndex\n });\n })).subscribe(this.dispatcher));\n });\n this.scrollSyncService.registerEmitter(this.container.nativeElement, \"body\");\n }\n createScroller() {\n this.cleanupScroller();\n const observable = this.scroller\n .create(this.rowHeightService, this.skip, this.take, this.total);\n this.skipScroll = false;\n this.scrollerSubscription = observable.pipe(filter((x) => x instanceof PageAction), filter(() => {\n const temp = this.skipScroll;\n this.skipScroll = false;\n return !temp;\n }), tap(() => this.rebind = true))\n .subscribe((x) => this.ngZone.run(() => this.pageChange.emit(x)));\n this.scrollerSubscription.add(observable.pipe(filter((x) => x instanceof ScrollAction))\n .subscribe(this.scroll.bind(this)));\n this.scrollerSubscription.add(observable.pipe(filter((x) => x instanceof ScrollBottomAction))\n .subscribe(() => this.scrollBottom.emit()));\n }\n scroll({ offset = 0 }) {\n if (this.isVirtual) {\n [\n maybeNativeElement(this.table),\n maybeNativeElement(this.lockedTable)\n ].filter(isPresent).forEach(translateY(this.renderer, offset));\n }\n this.resetNavigationViewport();\n }\n onContainerScroll({ scrollTop }) {\n this.containerScrollTop = scrollTop;\n if (this.lockedContainer) {\n this.lockedContainer.nativeElement.scrollTop = scrollTop;\n }\n }\n handleInitialScrollToSkip() {\n const shouldScroll = () => this.isVirtual && this.skip > 0 && this.total > 0;\n const sub = this.changeNotification.changes\n .pipe(filter(shouldScroll))\n .subscribe(_ => {\n this.scrollTo({ row: this.skip });\n sub.unsubscribe();\n });\n }\n handleRowSync() {\n const isLocked = () => isPresent(this.lockedContainer);\n const onStable = () => this.ngZone.onStable.asObservable().pipe(take(1));\n return merge(this.changeNotification.changes, this.groupsService.changes\n .pipe(filter(isLocked), switchMapTo(onStable())), this.editService.changed, this.resizeService.changes, this.columnResizingService.changes\n .pipe(filter(change => change.type === 'end')), this.supportService.changes)\n .pipe(tap(() => this.resetNavigationViewport()), filter(isLocked))\n .subscribe(() => {\n const scrollTop = this.container.nativeElement.scrollTop;\n const scrollLeft = this.container.nativeElement.scrollLeft;\n this.syncRowsHeight();\n this.syncContainerHeight();\n this.lockedContainer.nativeElement.scrollTop = this.container.nativeElement.scrollTop = scrollTop;\n // fixes scroll left position in IE when editing\n this.container.nativeElement.scrollLeft = scrollLeft;\n this.resizeSensors.forEach(sensor => sensor.acceptSize());\n });\n }\n handleRowNavigationLocked() {\n return this.navigationService.changes.pipe(filter(() => isPresent(this.lockedContainer)), delay(10)).subscribe((args) => {\n if (this.lockedLeafColumns.length <= args.prevColIndex && args.colIndex < this.lockedLeafColumns.length) {\n const cell = this.navigationService.activeCell;\n if (cell && cell.colIndex + cell.colSpan < args.prevColIndex) {\n this.container.nativeElement.scrollLeft = 0;\n }\n }\n });\n }\n scrollToVirtualRow(itemIndex) {\n if (isPresent(this.detailTemplate)) {\n itemIndex = Math.floor(itemIndex / 2);\n }\n const offset = this.rowHeightService.offset(itemIndex);\n this.container.nativeElement.scrollTop = offset;\n this.resetNavigationViewport();\n }\n scrollTo({ row, column }) {\n if (isNumber(row)) {\n if (this.isVirtual) {\n this.scrollToVirtualRow(row);\n }\n else {\n const element = rowAt(row, this.table.nativeElement.rows);\n if (element) {\n this.container.nativeElement.scrollTop = element.offsetTop;\n }\n }\n }\n if (isNumber(column)) {\n column -= this.lockedLeafColumns.length;\n if (this.virtualColumns) {\n const columns = this.columns.leafColumnsToRender;\n let offset = 0;\n for (let idx = 0; idx < column; idx++) {\n offset += columns[idx].width || 0;\n }\n const startOffset = this.lockedLeafColumns.length ? 0 : this.groups.length * GROUP_CELL_WIDTH + (this.detailTemplate && column > 0 ? GROUP_CELL_WIDTH : 0);\n this.container.nativeElement.scrollLeft = this.normalizeScrollLeft(offset + startOffset);\n }\n else if (column === 0 && this.detailTemplate) {\n this.container.nativeElement.scrollLeft = this.normalizeScrollLeft(0);\n }\n else {\n const firstRow = rowAt(0, this.table.nativeElement.rows);\n if (firstRow) {\n const element = cellAt(column, firstRow.cells);\n if (element) {\n this.container.nativeElement.scrollLeft = this.elementScrollLeft(element);\n }\n }\n }\n }\n }\n resetNavigationViewport() {\n if (!this.container || !this.navigationService.enabled ||\n !this.navigationService.needsViewport() || this.data.length === 0) {\n return;\n }\n const { scrollTop, offsetHeight } = this.container.nativeElement;\n const scrollBottom = scrollTop + offsetHeight;\n const firstItemIndex = this.rowHeightService.index(scrollTop);\n let lastItemIndex = this.rowHeightService.index(scrollBottom);\n const lastItemOffset = this.rowHeightService.offset(lastItemIndex);\n const lastItemOverflows = lastItemOffset + this.rowHeight > scrollBottom;\n if (lastItemIndex > 0 && lastItemOverflows) {\n lastItemIndex--;\n }\n let viewportStart = firstItemIndex;\n let viewportEnd = lastItemIndex;\n if (isPresent(this.detailTemplate)) {\n viewportStart *= 2;\n viewportEnd *= 2;\n const firstItemHeight = this.rowHeightService.offset(firstItemIndex);\n if (firstItemHeight + this.rowHeight < scrollTop) {\n viewportStart++;\n }\n const lastItemHeight = this.rowHeightService.height(lastItemIndex);\n const lastItemExpanded = this.rowHeightService.isExpanded(lastItemIndex);\n const lastItemDetailOverflows = lastItemOffset + lastItemHeight > scrollBottom;\n if (lastItemExpanded && !lastItemDetailOverflows) {\n viewportEnd++;\n }\n }\n this.navigationService.setViewport(viewportStart, viewportEnd);\n }\n cleanupScroller() {\n if (this.scrollerSubscription) {\n this.scrollerSubscription.unsubscribe();\n }\n if (this.scroller) {\n this.scroller.destroy();\n }\n }\n initResizeService() {\n this.resizeService.connect(merge(...this.resizeSensors.map(sensor => sensor.resize)));\n }\n syncContainerHeight() {\n [maybeNativeElement(this.lockedContainer)]\n .filter(isPresent)\n .map(el => {\n el.style.height = '';\n let height = this.container.nativeElement.offsetHeight;\n if (hasScrollbar(this.table, this.container)) {\n height -= this.supportService.scrollbarWidth;\n }\n return { el, height };\n })\n .forEach(setHeight$1(this.renderer));\n }\n updateViewportColumns(range) {\n const columns = this.columns.nonLockedLeafColumns.toArray();\n let { startIdx, endIdx, offset } = range || this.calculateViewportColumns();\n const start = Math.max(0, startIdx - bufferSize);\n const end = Math.min(endIdx + bufferSize, columns.length - 1);\n if (start < startIdx) {\n for (let idx = startIdx - 1; idx >= start; idx--) {\n offset -= columns[idx].width;\n }\n }\n let currentColumns = columns.slice(start, end + 1);\n this.viewportColumnsWidth = currentColumns.reduce((total, column) => total + column.width, 0);\n if (start > 0) {\n const offsetColumn = new ColumnBase$1();\n offsetColumn.width = offset;\n currentColumns.unshift(offsetColumn);\n }\n this.viewportColumns = new QueryList();\n this.viewportColumns.reset(currentColumns);\n this.columnsStartIdx = start;\n this.columnsEndIdx = end;\n this.columnInfo.columnRangeChange.emit({ start, end, offset });\n if (!range) {\n this.updateColumnViewport(startIdx, endIdx);\n }\n }\n handleColumnScroll() {\n const container = this.container.nativeElement;\n const scrollLeft = container.scrollLeft;\n if (this.scrollLeft !== scrollLeft) {\n this.scrollLeft = scrollLeft;\n const range = this.calculateViewportColumns();\n this.updateColumnViewport(range.startIdx, range.endIdx);\n if (range.startIdx < this.columnsStartIdx || this.columnsEndIdx < range.endIdx) {\n cancelAnimationFrame(this.columnUpdateFrame);\n this.columnUpdateFrame = requestAnimationFrame(() => {\n this.ngZone.run(() => {\n this.updateViewportColumns(range);\n this.changeDetector.markForCheck();\n });\n });\n }\n }\n }\n updateColumnViewport(startIdx, endIdx) {\n const lockedCount = this.lockedLeafColumns.length;\n const leafColumns$$1 = this.nonLockedLeafColumns.toArray();\n const viewportStart = lockedCount + startIdx + (this.detailTemplate && startIdx > 0 ? 1 : 0);\n let viewportEnd = lockedCount + endIdx + (this.detailTemplate ? 1 : 0);\n for (let idx = 0; idx < leafColumns$$1.length; idx++) {\n const column = leafColumns$$1[idx];\n if (column.isSpanColumn) {\n viewportEnd += column.childColumns.length;\n }\n }\n this.navigationService.setColumnViewport(viewportStart, viewportEnd);\n }\n calculateViewportColumns() {\n const { scrollLeft, clientWidth } = this.container.nativeElement;\n const columns = this.columns.nonLockedLeafColumns.toArray();\n const normalizedScrollLeft = this.normalizeScrollLeft(scrollLeft);\n const viewportEnd = normalizedScrollLeft + clientWidth;\n let startIdx;\n let endIdx = 0;\n let current = 0;\n let offset = 0;\n let idx;\n for (idx = 0; idx < columns.length; idx++) {\n const column = columns[idx];\n current += column.width || 0;\n if (startIdx === undefined && current > normalizedScrollLeft) {\n startIdx = idx;\n offset = current - (column.width || 0);\n }\n if (current >= viewportEnd) {\n endIdx = idx;\n break;\n }\n }\n if (!endIdx && idx > 0) {\n endIdx = columns.length - 1;\n }\n return { startIdx, endIdx, offset };\n }\n viewportWidthChange() {\n const currentWidth = this.viewportColumns.toArray().reduce((total, column) => total + column.width, 0);\n return currentWidth !== this.viewportColumnsWidth;\n }\n normalizeScrollLeft(position) {\n return this.rtl ? rtlScrollPosition(position, this.container.nativeElement, this.supportService.rtlScrollLeft) : position;\n }\n elementScrollLeft(element) {\n if (this.rtl) {\n return this.normalizeScrollLeft(this.container.nativeElement.scrollWidth - element.offsetLeft - element.offsetWidth);\n }\n return element.offsetLeft;\n }\n}\nListComponent.ɵfac = function ListComponent_Factory(t) { return new (t || ListComponent)(ɵngcc0.ɵɵdirectiveInject(SCROLLER_FACTORY_TOKEN), ɵngcc0.ɵɵdirectiveInject(DetailsService), ɵngcc0.ɵɵdirectiveInject(ChangeNotificationService), ɵngcc0.ɵɵdirectiveInject(SuspendService), ɵngcc0.ɵɵdirectiveInject(GroupsService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ScrollSyncService), ɵngcc0.ɵɵdirectiveInject(ResizeService), ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(BrowserSupportService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ScrollRequestService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ColumnResizingService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(PDFService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService)); };\nListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ListComponent, selectors: [[\"kendo-grid-list\"]], viewQuery: function ListComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(_c118, true);\n ɵngcc0.ɵɵviewQuery(_c119, true);\n ɵngcc0.ɵɵviewQuery(_c120, true);\n ɵngcc0.ɵɵviewQuery(_c121, true);\n ɵngcc0.ɵɵviewQuery(ResizeSensorComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.container = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.lockedContainer = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.lockedTable = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.table = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.resizeSensors = _t);\n } }, hostVars: 3, hostBindings: function ListComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.hostRole);\n ɵngcc0.ɵɵclassProp(\"k-grid-container\", ctx.hostClass);\n } }, inputs: { groups: \"groups\", skip: \"skip\", columns: \"columns\", selectable: \"selectable\", groupable: \"groupable\", trackBy: \"trackBy\", data: \"data\", total: \"total\", rowHeight: \"rowHeight\", detailRowHeight: \"detailRowHeight\", take: \"take\", detailTemplate: \"detailTemplate\", noRecordsTemplate: \"noRecordsTemplate\", filterable: \"filterable\", rowClass: \"rowClass\", loading: \"loading\", virtualColumns: \"virtualColumns\", isVirtual: \"isVirtual\" }, outputs: { contentScroll: \"contentScroll\", pageChange: \"pageChange\", scrollBottom: \"scrollBottom\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: SCROLLER_FACTORY_TOKEN,\n useValue: DEFAULT_SCROLLER_FACTORY\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 14, vars: 32, consts: [[\"class\", \"k-grid-content-locked\", \"role\", \"presentation\", 3, \"width\", \"kendoEventsOutsideAngular\", \"scope\", 4, \"ngIf\"], [\"role\", \"presentation\", \"tabindex\", \"-1\", 1, \"k-grid-content\", \"k-virtual-content\", 3, \"kendoGridResizableContainer\", \"lockedWidth\"], [\"container\", \"\"], [\"role\", \"presentation\", 1, \"k-grid-table-wrap\"], [\"role\", \"presentation\", 1, \"k-grid-table\", 3, \"virtualColumns\"], [\"table\", \"\"], [\"kendoGridColGroup\", \"\", \"role\", \"presentation\", 3, \"groups\", \"columns\", \"detailTemplate\"], [\"kendoGridTableBody\", \"\", \"role\", \"presentation\", 3, \"skipGroupDecoration\", \"data\", \"groups\", \"showGroupFooters\", \"columns\", \"allColumns\", \"detailTemplate\", \"noRecordsTemplate\", \"lockedColumnsCount\", \"totalColumnsCount\", \"skip\", \"selectable\", \"trackBy\", \"filterable\", \"rowClass\", \"virtualColumns\"], [4, \"ngIf\"], [\"role\", \"presentation\", 1, \"k-height-container\"], [\"class\", \"k-width-container\", \"role\", \"presentation\", 4, \"ngIf\"], [\"kendoGridLoading\", \"\", 4, \"ngIf\"], [\"role\", \"presentation\", 1, \"k-grid-content-locked\", 3, \"kendoEventsOutsideAngular\", \"scope\"], [\"lockedContainer\", \"\"], [\"role\", \"presentation\", 1, \"k-grid-table\", 3, \"locked\"], [\"lockedTable\", \"\"], [\"kendoGridTableBody\", \"\", \"role\", \"presentation\", 3, \"groups\", \"isLocked\", \"data\", \"noRecordsText\", \"columns\", \"totalColumnsCount\", \"detailTemplate\", \"showGroupFooters\", \"skip\", \"selectable\", \"trackBy\", \"filterable\", \"rowClass\"], [\"role\", \"presentation\", 1, \"k-width-container\"], [\"kendoGridLoading\", \"\"]], template: function ListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ListComponent_div_0_Template, 10, 30, \"div\", 0);\n ɵngcc0.ɵɵelementStart(1, \"div\", 1, 2);\n ɵngcc0.ɵɵelementStart(3, \"div\", 3);\n ɵngcc0.ɵɵelementStart(4, \"table\", 4, 5);\n ɵngcc0.ɵɵelement(6, \"colgroup\", 6);\n ɵngcc0.ɵɵelement(7, \"tbody\", 7);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(8, ListComponent_kendo_resize_sensor_8_Template, 1, 0, \"kendo-resize-sensor\", 8);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(9, ListComponent_kendo_resize_sensor_9_Template, 1, 0, \"kendo-resize-sensor\", 8);\n ɵngcc0.ɵɵelementStart(10, \"div\", 9);\n ɵngcc0.ɵɵelement(11, \"div\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(12, ListComponent_div_12_Template, 2, 2, \"div\", 10);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(13, ListComponent_div_13_Template, 1, 0, \"div\", 11);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isLocked);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"kendoGridResizableContainer\", ctx.lockedLeafColumns.length)(\"lockedWidth\", ctx.lockedWidth + 1);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.nonLockedWidth, \"px\");\n ɵngcc0.ɵɵproperty(\"virtualColumns\", ctx.virtualColumns);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"groups\", ctx.isLocked ? ɵngcc0.ɵɵpureFunction0(31, _c117) : ctx.groups)(\"columns\", ctx.nonLockedColumnsToRender)(\"detailTemplate\", ctx.detailTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"skipGroupDecoration\", ctx.isLocked)(\"data\", ctx.data)(\"groups\", ctx.groups)(\"showGroupFooters\", ctx.showFooter)(\"columns\", ctx.nonLockedColumnsToRender)(\"allColumns\", ctx.nonLockedLeafColumns)(\"detailTemplate\", ctx.detailTemplate)(\"noRecordsTemplate\", ctx.noRecordsTemplate)(\"lockedColumnsCount\", ctx.lockedLeafColumns.length)(\"totalColumnsCount\", ctx.leafColumns.length)(\"skip\", ctx.skip)(\"selectable\", ctx.selectable)(\"trackBy\", ctx.trackBy)(\"filterable\", ctx.filterable)(\"rowClass\", ctx.rowClass)(\"virtualColumns\", ctx.virtualColumns);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isLocked);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isLocked || ctx.virtualColumns);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵstyleProp(\"height\", ctx.totalHeight, \"px\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.virtualColumns);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.loading);\n } }, directives: function () { return [ɵngcc5.NgIf, ResizableContainerDirective,\n TableDirective,\n ColGroupComponent,\n TableBodyComponent, ɵngcc2.EventsOutsideAngularDirective, ɵngcc2.ResizeSensorComponent, LoadingComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nListComponent.ctorParameters = () => [\n { type: undefined, decorators: [{ type: Inject, args: [SCROLLER_FACTORY_TOKEN,] }] },\n { type: DetailsService },\n { type: ChangeNotificationService },\n { type: SuspendService },\n { type: GroupsService },\n { type: NgZone },\n { type: Renderer2 },\n { type: ScrollSyncService },\n { type: ResizeService },\n { type: EditService },\n { type: BrowserSupportService },\n { type: NavigationService },\n { type: ScrollRequestService },\n { type: LocalizationService },\n { type: ColumnResizingService },\n { type: ChangeDetectorRef },\n { type: PDFService },\n { type: ColumnInfoService }\n];\nListComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: [\"class.k-grid-container\",] }],\n hostRole: [{ type: HostBinding, args: [\"attr.role\",] }],\n data: [{ type: Input }],\n groups: [{ type: Input }],\n total: [{ type: Input }],\n rowHeight: [{ type: Input }],\n detailRowHeight: [{ type: Input }],\n take: [{ type: Input }],\n skip: [{ type: Input }],\n columns: [{ type: Input }],\n detailTemplate: [{ type: Input }],\n noRecordsTemplate: [{ type: Input }],\n selectable: [{ type: Input }],\n groupable: [{ type: Input }],\n filterable: [{ type: Input }],\n rowClass: [{ type: Input }],\n loading: [{ type: Input }],\n trackBy: [{ type: Input }],\n virtualColumns: [{ type: Input }],\n isVirtual: [{ type: Input }],\n contentScroll: [{ type: Output }],\n pageChange: [{ type: Output }],\n scrollBottom: [{ type: Output }],\n container: [{ type: ViewChild, args: [\"container\", { static: true },] }],\n lockedContainer: [{ type: ViewChild, args: [\"lockedContainer\",] }],\n lockedTable: [{ type: ViewChild, args: [\"lockedTable\",] }],\n table: [{ type: ViewChild, args: [\"table\",] }],\n resizeSensors: [{ type: ViewChildren, args: [ResizeSensorComponent,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ListComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: SCROLLER_FACTORY_TOKEN,\n useValue: DEFAULT_SCROLLER_FACTORY\n }\n ],\n selector: 'kendo-grid-list',\n template: `\n
\n
\n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n \n \n
\n \n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n `\n }]\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [SCROLLER_FACTORY_TOKEN]\n }] }, { type: DetailsService }, { type: ChangeNotificationService }, { type: SuspendService }, { type: GroupsService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: ScrollSyncService }, { type: ResizeService }, { type: EditService }, { type: BrowserSupportService }, { type: NavigationService }, { type: ScrollRequestService }, { type: ɵngcc1.LocalizationService }, { type: ColumnResizingService }, { type: ɵngcc0.ChangeDetectorRef }, { type: PDFService }, { type: ColumnInfoService }]; }, { groups: [{\n type: Input\n }], skip: [{\n type: Input\n }], columns: [{\n type: Input\n }], selectable: [{\n type: Input\n }], groupable: [{\n type: Input\n }], trackBy: [{\n type: Input\n }], contentScroll: [{\n type: Output\n }], pageChange: [{\n type: Output\n }], scrollBottom: [{\n type: Output\n }], resizeSensors: [{\n type: ViewChildren,\n args: [ResizeSensorComponent]\n }], hostClass: [{\n type: HostBinding,\n args: [\"class.k-grid-container\"]\n }], hostRole: [{\n type: HostBinding,\n args: [\"attr.role\"]\n }], data: [{\n type: Input\n }], total: [{\n type: Input\n }], rowHeight: [{\n type: Input\n }], detailRowHeight: [{\n type: Input\n }], take: [{\n type: Input\n }], detailTemplate: [{\n type: Input\n }], noRecordsTemplate: [{\n type: Input\n }], filterable: [{\n type: Input\n }], rowClass: [{\n type: Input\n }], loading: [{\n type: Input\n }], virtualColumns: [{\n type: Input\n }], isVirtual: [{\n type: Input\n }], container: [{\n type: ViewChild,\n args: [\"container\", { static: true }]\n }], lockedContainer: [{\n type: ViewChild,\n args: [\"lockedContainer\"]\n }], lockedTable: [{\n type: ViewChild,\n args: [\"lockedTable\"]\n }], table: [{\n type: ViewChild,\n args: [\"table\"]\n }] }); })();\n\n/**\n * A directive which encapsulates the in-memory handling of data operations such as [paging]({% slug paging_grid %}),\n * [sorting]({% slug sorting_grid %}), and [grouping]({% slug groupingbasics_grid %})\n * ([more information and examples]({% slug automaticoperations_grid %})).\n */\nclass DataBindingDirective {\n constructor(grid, changeDetector, localDataChangesService) {\n this.grid = grid;\n this.changeDetector = changeDetector;\n this.localDataChangesService = localDataChangesService;\n this.state = {\n skip: 0\n };\n this.originalData = [];\n if (localDataChangesService) {\n this.dataChangedSubscription = this.localDataChangesService.changes.subscribe(this.rebind.bind(this));\n }\n }\n /**\n * Defines the number of records that will be skipped by the pager.\n */\n set skip(value) {\n if (!isPresent(value)) {\n value = 0;\n }\n this.grid.skip = this.state.skip = value;\n }\n /**\n * Defines the descriptors by which the data will be sorted.\n */\n set sort(value) {\n this.grid.sort = this.state.sort = value;\n }\n /**\n * Defines the descriptor by which the data will be filtered.\n */\n set filter(value) {\n this.grid.filter = this.state.filter = value;\n }\n /**\n * Defines the page size used by the Grid pager.\n */\n set pageSize(value) {\n this.grid.pageSize = this.state.take = value;\n }\n /**\n * The descriptors by which the data will be grouped.\n */\n set group(value) {\n this.grid.group = this.state.group = value;\n }\n /**\n * The array of data which will be used to populate the Grid.\n */\n set data(value) {\n this.originalData = value || [];\n if (this.localDataChangesService) {\n this.localDataChangesService.data = value;\n }\n this.dataChanged = true;\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.applyState(this.state);\n this.stateChangeSubscription = this.grid\n .dataStateChange\n .subscribe(this.onStateChange.bind(this));\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n if (this.stateChangeSubscription) {\n this.stateChangeSubscription.unsubscribe();\n }\n if (this.dataChangedSubscription) {\n this.dataChangedSubscription.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n if (anyChanged([\"pageSize\", \"skip\", \"sort\", \"group\", \"filter\"], changes)) {\n this.rebind();\n }\n }\n ngDoCheck() {\n if (this.dataChanged) {\n this.updateGridData();\n }\n }\n /**\n * @hidden\n */\n onStateChange(state$$1) {\n this.applyState(state$$1);\n this.rebind();\n }\n /**\n * @hidden\n */\n rebind() {\n this.data = this.originalData;\n this.updateGridData();\n this.notifyDataChange();\n }\n /**\n * Notifies the Grid that its data has changed.\n */\n notifyDataChange() {\n this.grid.onDataChange();\n if (this.changeDetector) {\n this.changeDetector.markForCheck();\n }\n }\n process(state$$1) {\n return process(this.originalData, state$$1);\n }\n applyState({ skip, take: take$$1, sort, group, filter: filter$$1 }) {\n this.skip = skip;\n this.pageSize = take$$1;\n this.sort = sort;\n this.group = group;\n this.filter = filter$$1;\n }\n updateGridData() {\n this.grid.data = this.process(this.state);\n this.dataChanged = false;\n }\n}\nDataBindingDirective.ɵfac = function DataBindingDirective_Factory(t) { return new (t || DataBindingDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(LocalDataChangesService)); };\nDataBindingDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DataBindingDirective, selectors: [[\"\", \"kendoGridBinding\", \"\"]], inputs: { skip: \"skip\", sort: \"sort\", filter: \"filter\", pageSize: \"pageSize\", group: \"group\", data: [\"kendoGridBinding\", \"data\"] }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nDataBindingDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: ChangeDetectorRef },\n { type: LocalDataChangesService }\n];\nDataBindingDirective.propDecorators = {\n skip: [{ type: Input }],\n sort: [{ type: Input }],\n filter: [{ type: Input }],\n pageSize: [{ type: Input }],\n group: [{ type: Input }],\n data: [{ type: Input, args: [\"kendoGridBinding\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DataBindingDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridBinding]'\n }]\n }], function () { return [{ type: GridComponent }, { type: ɵngcc0.ChangeDetectorRef }, { type: LocalDataChangesService }]; }, { skip: [{\n type: Input\n }], sort: [{\n type: Input\n }], filter: [{\n type: Input\n }], pageSize: [{\n type: Input\n }], group: [{\n type: Input\n }], data: [{\n type: Input,\n args: [\"kendoGridBinding\"]\n }] }); })();\n\n/**\n * A directive which stores the row selection state of the Grid in memory\n * ([see example]({% slug selection_grid %}#toc-during-data-operations)).\n */\nclass SelectionDirective extends Selection {\n constructor(grid, cd) {\n super(grid, cd);\n this.grid = grid;\n }\n /**\n * @hidden\n */\n ngOnInit() {\n if (this.grid.selectable === false) {\n this.grid.selectable = true;\n }\n this.grid.selectionDirective = this;\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n super.destroy();\n }\n}\nSelectionDirective.ɵfac = function SelectionDirective_Factory(t) { return new (t || SelectionDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nSelectionDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: SelectionDirective, selectors: [[\"\", \"kendoGridSelectBy\", \"\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nSelectionDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SelectionDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridSelectBy]'\n }]\n }], function () { return [{ type: GridComponent }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\n/**\n * A directive which controls the expanded state of the master detail rows.\n */\nclass ExpandDetailsDirective {\n constructor(grid) {\n this.grid = grid;\n /**\n * Fires when the expandedDetailKeys are changed.\n */\n this.expandedDetailKeysChange = new EventEmitter();\n /**\n * Defines the collection that will store the expanded keys.\n */\n this.expandedDetailKeys = [];\n /**\n * Specifies if the items should be initially expanded.\n * @default false\n */\n this.initiallyExpanded = false;\n this.subscriptions = new Subscription();\n this.grid.isDetailExpanded = this.isExpanded.bind(this);\n this.subscriptions.add(merge(this.grid.detailExpand.pipe(map(e => (Object.assign({ expand: true }, e)))), this.grid.detailCollapse.pipe(map(e => (Object.assign({ expand: false }, e))))).subscribe(this.toggleState.bind(this)));\n }\n /**\n * Defines the item key that will be stored in the `expandedDetailKeys` collection ([see example]({% slug master_detail_expanded_state_grid %}#toc-built-in-directive)).\n */\n get expandDetailsKey() {\n return this._expandBy;\n }\n set expandDetailsKey(key) {\n if (isString(key)) {\n this._expandBy = getter(key);\n }\n else {\n this._expandBy = key;\n }\n }\n /**\n *\n * @hidden\n * A deprecated alias for setting the `expandDetailsKey` property.\n */\n get expandDetailBy() {\n return this.expandDetailsKey;\n }\n set expandDetailBy(key) {\n this.expandDetailsKey = key;\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n get keyGetter() {\n return this._expandBy || getter(undefined);\n }\n /**\n * @hidden\n */\n isExpanded(args) {\n const key = this.keyGetter(args.dataItem);\n return this.expandedDetailKeys.indexOf(key) > -1 ? !this.initiallyExpanded : this.initiallyExpanded;\n }\n toggleState(args) {\n const key = this.keyGetter(args.dataItem);\n if (Boolean(this.initiallyExpanded) !== args.expand) {\n this.expandedDetailKeys.push(key);\n }\n else {\n const index = this.expandedDetailKeys.indexOf(key);\n this.expandedDetailKeys.splice(index, 1);\n }\n this.expandedDetailKeysChange.emit(this.expandedDetailKeys);\n }\n}\nExpandDetailsDirective.ɵfac = function ExpandDetailsDirective_Factory(t) { return new (t || ExpandDetailsDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent)); };\nExpandDetailsDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ExpandDetailsDirective, selectors: [[\"\", \"kendoGridExpandDetailsBy\", \"\"]], inputs: { expandedDetailKeys: \"expandedDetailKeys\", initiallyExpanded: \"initiallyExpanded\", expandDetailsKey: [\"kendoGridExpandDetailsBy\", \"expandDetailsKey\"], expandDetailBy: \"expandDetailBy\" }, outputs: { expandedDetailKeysChange: \"expandedDetailKeysChange\" }, exportAs: [\"kendoGridExpandDetailsBy\"] });\n/** @nocollapse */\nExpandDetailsDirective.ctorParameters = () => [\n { type: GridComponent }\n];\nExpandDetailsDirective.propDecorators = {\n expandedDetailKeysChange: [{ type: Output }],\n expandDetailsKey: [{ type: Input, args: ['kendoGridExpandDetailsBy',] }],\n expandDetailBy: [{ type: Input }],\n expandedDetailKeys: [{ type: Input }],\n initiallyExpanded: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExpandDetailsDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridExpandDetailsBy]',\n exportAs: 'kendoGridExpandDetailsBy'\n }]\n }], function () { return [{ type: GridComponent }]; }, { expandedDetailKeysChange: [{\n type: Output\n }], expandedDetailKeys: [{\n type: Input\n }], initiallyExpanded: [{\n type: Input\n }], expandDetailsKey: [{\n type: Input,\n args: ['kendoGridExpandDetailsBy']\n }], expandDetailBy: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass Messages extends ComponentMessages {\n}\nMessages.ɵfac = function Messages_Factory(t) { return ɵMessages_BaseFactory(t || Messages); };\nMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages, inputs: { groupPanelEmpty: \"groupPanelEmpty\", noRecords: \"noRecords\", pagerFirstPage: \"pagerFirstPage\", pagerLastPage: \"pagerLastPage\", pagerPreviousPage: \"pagerPreviousPage\", pagerNextPage: \"pagerNextPage\", pagerPage: \"pagerPage\", pagerItemsPerPage: \"pagerItemsPerPage\", pagerOf: \"pagerOf\", pagerItems: \"pagerItems\", pagerPageNumberInputTitle: \"pagerPageNumberInputTitle\", filter: \"filter\", filterEqOperator: \"filterEqOperator\", filterNotEqOperator: \"filterNotEqOperator\", filterIsNullOperator: \"filterIsNullOperator\", filterIsNotNullOperator: \"filterIsNotNullOperator\", filterIsEmptyOperator: \"filterIsEmptyOperator\", filterIsNotEmptyOperator: \"filterIsNotEmptyOperator\", filterStartsWithOperator: \"filterStartsWithOperator\", filterContainsOperator: \"filterContainsOperator\", filterNotContainsOperator: \"filterNotContainsOperator\", filterEndsWithOperator: \"filterEndsWithOperator\", filterGteOperator: \"filterGteOperator\", filterGtOperator: \"filterGtOperator\", filterLteOperator: \"filterLteOperator\", filterLtOperator: \"filterLtOperator\", filterIsTrue: \"filterIsTrue\", filterIsFalse: \"filterIsFalse\", filterBooleanAll: \"filterBooleanAll\", filterAfterOrEqualOperator: \"filterAfterOrEqualOperator\", filterAfterOperator: \"filterAfterOperator\", filterBeforeOperator: \"filterBeforeOperator\", filterBeforeOrEqualOperator: \"filterBeforeOrEqualOperator\", filterFilterButton: \"filterFilterButton\", filterClearButton: \"filterClearButton\", filterAndLogic: \"filterAndLogic\", filterOrLogic: \"filterOrLogic\", loading: \"loading\", columnMenu: \"columnMenu\", columns: \"columns\", lock: \"lock\", unlock: \"unlock\", sortable: \"sortable\", sortAscending: \"sortAscending\", sortDescending: \"sortDescending\", sortedAscending: \"sortedAscending\", sortedDescending: \"sortedDescending\", sortedDefault: \"sortedDefault\", columnsApply: \"columnsApply\", columnsReset: \"columnsReset\", detailExpand: \"detailExpand\", detailCollapse: \"detailCollapse\", filterDateToday: \"filterDateToday\", filterDateToggle: \"filterDateToggle\", filterNumericDecrement: \"filterNumericDecrement\", filterNumericIncrement: \"filterNumericIncrement\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages.propDecorators = {\n groupPanelEmpty: [{ type: Input }],\n noRecords: [{ type: Input }],\n pagerFirstPage: [{ type: Input }],\n pagerLastPage: [{ type: Input }],\n pagerPreviousPage: [{ type: Input }],\n pagerNextPage: [{ type: Input }],\n pagerPage: [{ type: Input }],\n pagerItemsPerPage: [{ type: Input }],\n pagerOf: [{ type: Input }],\n pagerItems: [{ type: Input }],\n pagerPageNumberInputTitle: [{ type: Input }],\n filter: [{ type: Input }],\n filterEqOperator: [{ type: Input }],\n filterNotEqOperator: [{ type: Input }],\n filterIsNullOperator: [{ type: Input }],\n filterIsNotNullOperator: [{ type: Input }],\n filterIsEmptyOperator: [{ type: Input }],\n filterIsNotEmptyOperator: [{ type: Input }],\n filterStartsWithOperator: [{ type: Input }],\n filterContainsOperator: [{ type: Input }],\n filterNotContainsOperator: [{ type: Input }],\n filterEndsWithOperator: [{ type: Input }],\n filterGteOperator: [{ type: Input }],\n filterGtOperator: [{ type: Input }],\n filterLteOperator: [{ type: Input }],\n filterLtOperator: [{ type: Input }],\n filterIsTrue: [{ type: Input }],\n filterIsFalse: [{ type: Input }],\n filterBooleanAll: [{ type: Input }],\n filterAfterOrEqualOperator: [{ type: Input }],\n filterAfterOperator: [{ type: Input }],\n filterBeforeOperator: [{ type: Input }],\n filterBeforeOrEqualOperator: [{ type: Input }],\n filterFilterButton: [{ type: Input }],\n filterClearButton: [{ type: Input }],\n filterAndLogic: [{ type: Input }],\n filterOrLogic: [{ type: Input }],\n loading: [{ type: Input }],\n columnMenu: [{ type: Input }],\n columns: [{ type: Input }],\n lock: [{ type: Input }],\n unlock: [{ type: Input }],\n sortable: [{ type: Input }],\n sortAscending: [{ type: Input }],\n sortDescending: [{ type: Input }],\n sortedAscending: [{ type: Input }],\n sortedDescending: [{ type: Input }],\n sortedDefault: [{ type: Input }],\n columnsApply: [{ type: Input }],\n columnsReset: [{ type: Input }],\n detailExpand: [{ type: Input }],\n detailCollapse: [{ type: Input }],\n filterDateToday: [{ type: Input }],\n filterDateToggle: [{ type: Input }],\n filterNumericDecrement: [{ type: Input }],\n filterNumericIncrement: [{ type: Input }]\n};\nconst ɵMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages);\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoGridLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: '[kendoGridLocalizedMessages]'\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages\n * ([see example]({% slug globalization_grid %}#toc-localization)).\n */\nclass CustomMessagesComponent extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nCustomMessagesComponent.ɵfac = function CustomMessagesComponent_Factory(t) { return new (t || CustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CustomMessagesComponent, selectors: [[\"kendo-grid-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ],\n selector: 'kendo-grid-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * @hidden\n */\nclass FilterRowComponent {\n constructor(localization) {\n this.localization = localization;\n this.columns = [];\n this.groups = [];\n this.filterRowClass = true;\n this.filterLabel = this.localization.get('filter');\n }\n}\nFilterRowComponent.ɵfac = function FilterRowComponent_Factory(t) { return new (t || FilterRowComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nFilterRowComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterRowComponent, selectors: [[\"\", \"kendoGridFilterRow\", \"\"]], hostVars: 2, hostBindings: function FilterRowComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filter-row\", ctx.filterRowClass);\n } }, inputs: { columns: \"columns\", groups: \"groups\", filter: \"filter\", detailTemplate: \"detailTemplate\", logicalRowIndex: \"logicalRowIndex\", lockedColumnsCount: \"lockedColumnsCount\" }, attrs: _c123, decls: 3, vars: 3, consts: [[\"role\", \"presentation\", 3, \"k-group-cell\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\", 3, \"k-hierarchy-cell\", 4, \"ngIf\"], [\"kendoGridFilterCell\", \"\", \"kendoGridLogicalCell\", \"\", 3, \"column\", \"filter\", \"logicalRowIndex\", \"logicalColIndex\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\"], [\"kendoGridFilterCell\", \"\", \"kendoGridLogicalCell\", \"\", 3, \"column\", \"filter\", \"logicalRowIndex\", \"logicalColIndex\"]], template: function FilterRowComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FilterRowComponent_td_0_Template, 1, 2, \"td\", 0);\n ɵngcc0.ɵɵtemplate(1, FilterRowComponent_td_1_Template, 1, 2, \"td\", 1);\n ɵngcc0.ɵɵtemplate(2, FilterRowComponent_td_2_Template, 1, 5, \"td\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.groups);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.detailTemplate == null ? null : ctx.detailTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.columns);\n } }, directives: function () { return [ɵngcc5.NgForOf, ɵngcc5.NgIf, FilterCellComponent,\n LogicalCellDirective]; }, encapsulation: 2 });\n/** @nocollapse */\nFilterRowComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nFilterRowComponent.propDecorators = {\n columns: [{ type: Input }],\n filter: [{ type: Input }],\n groups: [{ type: Input }],\n detailTemplate: [{ type: Input }],\n logicalRowIndex: [{ type: Input }],\n lockedColumnsCount: [{ type: Input }],\n filterRowClass: [{ type: HostBinding, args: ['class.k-filter-row',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterRowComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridFilterRow]',\n template: `\n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { columns: [{\n type: Input\n }], groups: [{\n type: Input\n }], filterRowClass: [{\n type: HostBinding,\n args: ['class.k-filter-row']\n }], filter: [{\n type: Input\n }], detailTemplate: [{\n type: Input\n }], logicalRowIndex: [{\n type: Input\n }], lockedColumnsCount: [{\n type: Input\n }] }); })();\n\nconst areDifferent = (a, b) => a.field !== b.field || a.operator !== b.operator || a.value !== b.value;\nconst isChanged$1 = (a, b) => {\n if (a.length !== b.length) {\n return true;\n }\n for (let idx = 0, len = a.length; idx < len; idx++) {\n const prev = a[idx];\n const curr = b[idx];\n if (isCompositeFilterDescriptor(prev)) {\n // tslint:disable-next-line:no-use-before-declare\n if (diffFilters(prev, curr[idx])) {\n return true;\n }\n }\n else if (areDifferent(prev, curr)) {\n return true;\n }\n }\n return false;\n};\nconst copyObject = (obj) => {\n const result = {};\n Object.assign(result, obj);\n if (obj.constructor !== Object) {\n const proto = obj.constructor.prototype;\n Object.getOwnPropertyNames(proto).forEach((property) => {\n if (property !== 'constructor' && proto.hasOwnProperty(property)) {\n result[property] = obj[property];\n }\n });\n }\n return result;\n};\nconst cloneFilter = (filter$$1) => copyObject(filter$$1);\n/**\n * @hidden\n */\nconst cloneFilters = (filter$$1) => {\n if (!filter$$1) {\n return;\n }\n if (isCompositeFilterDescriptor(filter$$1)) {\n return {\n filters: cloneFilters(filter$$1.filters),\n logic: filter$$1.logic\n };\n }\n else if (Array.isArray(filter$$1)) {\n return filter$$1.map(cloneFilters);\n }\n return cloneFilter(filter$$1);\n};\n/**\n * @hidden\n */\nconst diffFilters = (a, b) => {\n if (isPresent(a) && !isPresent(b)) {\n return true;\n }\n if (!isPresent(a) && isPresent(b)) {\n return true;\n }\n return isPresent(a) && isPresent(b) && isChanged$1(a.filters, b.filters);\n};\n\n/**\n * @hidden\n */\nclass FilterCellComponent {\n constructor() {\n this._templateContext = {};\n }\n get filter() {\n return this._filter;\n }\n set filter(value) {\n this._filter = cloneFilters(value);\n }\n get templateContext() {\n this._templateContext.column = this.column;\n this._templateContext.filter = this.filter;\n // tslint:disable-next-line:no-string-literal\n this._templateContext[\"$implicit\"] = this.filter;\n return this._templateContext;\n }\n get hasTemplate() {\n return isPresent(this.column.filterCellTemplateRef);\n }\n get isFilterable() {\n return isPresent(this.column) && !isNullOrEmptyString(this.column.field) && this.column.filterable;\n }\n}\nFilterCellComponent.ɵfac = function FilterCellComponent_Factory(t) { return new (t || FilterCellComponent)(); };\nFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterCellComponent, selectors: [[\"\", \"kendoGridFilterCell\", \"\"]], inputs: { filter: \"filter\", column: \"column\" }, attrs: _c124, decls: 1, vars: 1, consts: [[3, \"ngIf\"], [3, \"ngSwitch\"], [4, \"ngSwitchCase\"], [\"kendoFilterCellHost\", \"\", 3, \"column\", \"filter\"], [4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function FilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FilterCellComponent_ng_template_0_Template, 3, 3, \"ng-template\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.isFilterable);\n } }, directives: function () { return [ɵngcc5.NgIf, ɵngcc5.NgSwitch, ɵngcc5.NgSwitchCase, FilterCellHostDirective, ɵngcc5.NgTemplateOutlet]; }, encapsulation: 2 });\nFilterCellComponent.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterCellComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridFilterCell]',\n template: `\n \n \n \n \n \n \n \n \n
\n \n \n `\n }]\n }], function () { return []; }, { filter: [{\n type: Input\n }], column: [{\n type: Input\n }] }); })();\n\nconst localizeOperators = operators => localization => Object.keys(operators).reduce((acc, key) => {\n acc[operators[key]] = localization.get(key);\n return acc;\n}, {}); // tslint:disable-line:align\nconst operatorTexts = localizeOperators({\n \"filterEqOperator\": \"eq\",\n \"filterNotEqOperator\": \"neq\",\n // tslint:disable-next-line:object-literal-sort-keys\n \"filterGteOperator\": \"gte\",\n \"filterGtOperator\": \"gt\",\n \"filterLteOperator\": \"lte\",\n \"filterLtOperator\": \"lt\",\n \"filterIsNullOperator\": \"isnull\",\n \"filterIsNotNullOperator\": \"isnotnull\",\n \"filterIsEmptyOperator\": \"isempty\",\n \"filterIsNotEmptyOperator\": \"isnotempty\",\n \"filterContainsOperator\": \"contains\",\n \"filterNotContainsOperator\": \"doesnotcontain\",\n \"filterStartsWithOperator\": \"startswith\",\n \"filterEndsWithOperator\": \"endswith\",\n \"filterAfterOrEqualOperator\": \"after-eq\",\n \"filterAfterOperator\": \"after\",\n \"filterBeforeOrEqualOperator\": \"before-eq\",\n \"filterBeforeOperator\": \"before\"\n});\n/**\n * @hidden\n */\nconst toJSON = (xs) => xs.map(x => x.toJSON());\n/**\n * @hidden\n */\nclass FilterOperatorBase {\n constructor(operator, localization) {\n this.operator = operator;\n this.localization = localization;\n this.messages = operatorTexts(this.localization);\n this._text = this.messages[this.operator];\n this.localization.changes.subscribe(this.refreshText.bind(this));\n }\n /**\n * The text that will be displayed in the drop-down list.\n * @readonly\n * @type {string}\n * @memberOf FilterOperatorBase\n */\n get text() {\n return this._text;\n }\n /**\n *\n */\n set text(value) {\n this._text = isNullOrEmptyString(value) ? this.messages[this.operator] : value;\n }\n /**\n * @hidden\n */\n toJSON() {\n return {\n text: this.text,\n value: this.operator\n };\n }\n refreshText() {\n const update = this._text === this.messages[this.operator];\n this.messages = operatorTexts(this.localization);\n if (update) {\n this._text = this.messages[this.operator];\n }\n }\n}\nFilterOperatorBase.ɵfac = function FilterOperatorBase_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nFilterOperatorBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterOperatorBase, inputs: { text: \"text\" } });\nFilterOperatorBase.propDecorators = {\n text: [{ type: Input }]\n};\n\n\nconst insertDefaultFilter = (index, rootFilter, filter$$1) => {\n rootFilter = (rootFilter || { filters: [], logic: \"and\" });\n rootFilter.filters[index] = filter$$1;\n return filter$$1;\n};\n/**\n * @hidden\n */\nconst setFilter = (index, filter$$1, field, defaultOperator) => {\n if (isPresent(filter$$1) && isPresent(filter$$1.filters) && filter$$1.filters.length > index) {\n return filter$$1.filters[index];\n }\n else {\n return insertDefaultFilter(index, filter$$1, {\n field,\n operator: defaultOperator\n });\n }\n};\n/**\n * @hidden\n */\nconst logicOperators = (localization) => [\n { text: localization.get(\"filterAndLogic\"), value: \"and\" },\n { text: localization.get(\"filterOrLogic\"), value: \"or\" }\n];\n/**\n * @hidden\n */\nconst flatten = (filter$$1) => {\n if (isPresent(filter$$1.filters)) {\n return filter$$1.filters.reduce((acc, curr) => acc.concat(isCompositeFilterDescriptor(curr) ? flatten(curr) : [curr]), []);\n }\n return [];\n};\nconst trimFilterByField = (filter$$1, field) => {\n if (isPresent(filter$$1) && isPresent(filter$$1.filters)) {\n filter$$1.filters = filter$$1.filters.filter(x => {\n if (isCompositeFilterDescriptor(x)) {\n trimFilterByField(x, field);\n return x.filters.length;\n }\n else {\n return x.field !== field;\n }\n });\n }\n};\n/**\n * @hidden\n */\nconst filtersByField = (filter$$1, field) => flatten(filter$$1 || {}).filter(x => x.field === field);\n/**\n * @hidden\n */\nconst filterByField = (filter$$1, field) => {\n let [currentFilter] = filtersByField(filter$$1, field);\n return currentFilter;\n};\n/**\n * @hidden\n */\nconst removeFilter = (filter$$1, field) => {\n trimFilterByField(filter$$1, field);\n return filter$$1;\n};\n/**\n * @hidden\n */\nconst localizeOperators$1 = operators => localization => Object.keys(operators).map(key => ({\n text: localization.get(key),\n value: operators[key]\n}));\n/**\n * An abstract base class for the filter-cell component ([see example]({% slug reusablecustomfilters_grid %}#toc-filter-row)).\n */\nclass BaseFilterCellComponent {\n constructor(filterService) {\n this.filterService = filterService;\n this.operatorList = new QueryList();\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return true;\n }\n get operators() {\n return this._operators.length ? this._operators : this.defaultOperators;\n }\n set operators(values) {\n this._operators = values;\n }\n /**\n * @hidden\n */\n ngAfterContentInit() {\n this.operationListSubscription = observe(this.operatorList)\n .pipe(map(q => q.toArray()), map(toJSON))\n .subscribe(x => {\n this.operators = x;\n });\n }\n ngOnDestroy() {\n if (this.operationListSubscription) {\n this.operationListSubscription.unsubscribe();\n }\n }\n filterByField(field) {\n return filterByField(this.filter, field);\n }\n filtersByField(field) {\n return filtersByField(this.filter, field);\n }\n removeFilter(field) {\n return removeFilter(this.filter, field);\n }\n updateFilter(filter$$1) {\n const root = this.filter || {\n filters: [],\n logic: \"and\"\n };\n let [currentFilter] = flatten(root).filter(x => x.field === filter$$1.field);\n if (!isPresent(currentFilter)) {\n root.filters.push(filter$$1);\n }\n else {\n Object.assign(currentFilter, filter$$1);\n }\n return root;\n }\n applyFilter(filter$$1) {\n this.filterService.filter(filter$$1);\n }\n}\nBaseFilterCellComponent.ɵfac = function BaseFilterCellComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nBaseFilterCellComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: BaseFilterCellComponent, contentQueries: function BaseFilterCellComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, FilterOperatorBase, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.operatorList = _t);\n } }, hostVars: 2, hostBindings: function BaseFilterCellComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell\", ctx.hostClasses);\n } } });\nBaseFilterCellComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n operatorList: [{ type: ContentChildren, args: [FilterOperatorBase,] }]\n};\n\n\n// tslint:disable:no-access-missing-member\nconst numericOperators = localizeOperators$1({\n \"filterEqOperator\": \"eq\",\n \"filterNotEqOperator\": \"neq\",\n // tslint:disable-next-line:object-literal-sort-keys\n \"filterGteOperator\": \"gte\",\n \"filterGtOperator\": \"gt\",\n \"filterLteOperator\": \"lte\",\n \"filterLtOperator\": \"lt\",\n \"filterIsNullOperator\": \"isnull\",\n \"filterIsNotNullOperator\": \"isnotnull\"\n});\n/**\n * Represents a base numeric filter component.\n */\nclass NumericFilterComponent extends BaseFilterCellComponent {\n constructor(filterService, localization) {\n super(filterService);\n this.localization = localization;\n /**\n * The default filter operator. Defaults to `eq`.\n * @type {string}\n */\n this.operator = \"eq\";\n /**\n * Specifies the value that is used to increment or decrement the component value.\n * @type {numeric}\n */\n this.step = 1;\n /**\n * Specifies whether the **Up** and **Down** spin buttons will be rendered.\n * @type {boolean}\n */\n this.spinners = true;\n this.defaultOperators = numericOperators(this.localization);\n }\n /**\n * Specifies the number format used when the component is not focused.\n * By default, the `column.format` value is used (if set).\n */\n set format(value) {\n this._format = value;\n }\n /**\n * Specifies the number format used when the component is not focused.\n * By default, the `column.format` value is used (if set).\n *\n * @readonly\n * @type {string}\n */\n get format() {\n return !isNullOrEmptyString(this._format) ? this._format : this.columnFormat;\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n get currentFilter() {\n return this.filterByField(this.column.field);\n }\n /**\n * The current filter operator for the associated column field.\n * @readonly\n * @type {string}\n */\n get currentOperator() {\n return this.currentFilter ? this.currentFilter.operator : this.operator;\n }\n get columnFormat() {\n return this.column && !isNullOrEmptyString(this.column.format) ?\n extractFormat(this.column.format) : \"n2\";\n }\n ngOnInit() {\n this.subscription = this.localization.changes.subscribe(this.localizationChange.bind(this));\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n super.ngOnDestroy();\n }\n localizationChange() {\n this.defaultOperators = numericOperators(this.localization);\n if (this.operatorList.length) {\n this.operators = toJSON(this.operatorList.toArray());\n }\n }\n}\nNumericFilterComponent.ɵfac = function NumericFilterComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nNumericFilterComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: NumericFilterComponent, inputs: { operator: \"operator\", step: \"step\", spinners: \"spinners\", format: \"format\", column: \"column\", filter: \"filter\", min: \"min\", max: \"max\", decimals: \"decimals\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nNumericFilterComponent.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }],\n step: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n spinners: [{ type: Input }],\n decimals: [{ type: Input }],\n format: [{ type: Input }]\n};\n\n\n/**\n * Represents a numeric filter cell.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass NumericFilterCellComponent extends NumericFilterComponent {\n constructor(filterService, localization) {\n super(filterService, localization);\n this.localization = localization;\n /**\n * Determines the delay time (in milliseconds) before the filter value is submitted.\n * A value of `0` indicates no delay. The default value is `500`.\n * @type {boolean}\n */\n this.filterDelay = 500;\n /**\n * Determines if the drop-down filter operators will be displayed.\n * The default value is `true`.\n * @type {boolean}\n */\n this.showOperators = true;\n }\n /**\n * @hidden\n */\n messageFor(key) {\n return this.localization.get(key);\n }\n}\nNumericFilterCellComponent.ɵfac = function NumericFilterCellComponent_Factory(t) { return new (t || NumericFilterCellComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nNumericFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: NumericFilterCellComponent, selectors: [[\"kendo-grid-numeric-filter-cell\"]], inputs: { filterDelay: \"filterDelay\", showOperators: \"showOperators\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 16, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"showOperators\"], [\"kendoGridFocusable\", \"\", \"kendoFilterInput\", \"\", 3, \"filterDelay\", \"autoCorrect\", \"value\", \"format\", \"decimals\", \"spinners\", \"min\", \"max\", \"step\"], [3, \"increment\", \"decrement\"]], template: function NumericFilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-wrapper-cell\", 0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-numerictextbox\", 1);\n ɵngcc0.ɵɵelement(2, \"kendo-numerictextbox-messages\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"showOperators\", ctx.showOperators);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterDelay\", ctx.filterDelay)(\"autoCorrect\", true)(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value)(\"format\", ctx.format)(\"decimals\", ctx.decimals)(\"spinners\", ctx.spinners)(\"min\", ctx.min)(\"max\", ctx.max)(\"step\", ctx.step);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"increment\", ctx.messageFor(\"filterNumericIncrement\"))(\"decrement\", ctx.messageFor(\"filterNumericDecrement\"));\n } }, directives: function () { return [FilterCellWrapperComponent, ɵngcc6.NumericTextBoxComponent, FocusableDirective,\n FilterInputDirective, ɵngcc6.NumericTextBoxCustomMessagesComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nNumericFilterCellComponent.ctorParameters = () => [\n { type: FilterService },\n { type: LocalizationService }\n];\nNumericFilterCellComponent.propDecorators = {\n filterDelay: [{ type: Input }],\n showOperators: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NumericFilterCellComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-numeric-filter-cell',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: ɵngcc1.LocalizationService }]; }, { filterDelay: [{\n type: Input\n }], showOperators: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass FilterInputDirective {\n constructor(valueAccessors, ngZone, element, renderer) {\n this.change = new EventEmitter();\n this.composing = false;\n this.filterDelay = 500;\n this.changeRequests = new Subject();\n this.accessor = valueAccessors[0];\n ngZone.runOutsideAngular(() => {\n const unsubscribeStart = renderer.listen(element.nativeElement, 'compositionstart', () => this.composing = true);\n const unsubscribeEnd = renderer.listen(element.nativeElement, 'compositionend', () => this.composing = false);\n this.unsubscribeEvents = () => {\n unsubscribeStart();\n unsubscribeEnd();\n };\n });\n }\n set value(value) {\n this.accessor.writeValue(value);\n }\n set disabled(value) {\n this.accessor.setDisabledState(value);\n }\n ngAfterViewInit() {\n this.accessor.registerOnChange(x => this.filterDelay > 0 ?\n this.changeRequests.next(x) :\n this.change.emit(x));\n this.subscribeChanges();\n }\n ngOnChanges(changes) {\n if (isChanged('filterDelay', changes)) {\n this.unsubscribeChanges();\n this.subscribeChanges();\n }\n }\n ngOnDestroy() {\n this.unsubscribeChanges();\n this.unsubscribeEvents();\n }\n subscribeChanges() {\n this.changeRequestsSubscription = this.changeRequests\n .pipe(debounceTime(this.filterDelay), filter(() => !this.composing))\n .subscribe(x => this.change.emit(x));\n }\n unsubscribeChanges() {\n if (this.changeRequestsSubscription) {\n this.changeRequestsSubscription.unsubscribe();\n }\n }\n}\nFilterInputDirective.ɵfac = function FilterInputDirective_Factory(t) { return new (t || FilterInputDirective)(ɵngcc0.ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nFilterInputDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterInputDirective, selectors: [[\"\", \"kendoFilterInput\", \"\"]], inputs: { filterDelay: \"filterDelay\", value: \"value\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nFilterInputDirective.ctorParameters = () => [\n { type: Array, decorators: [{ type: Self }, { type: Inject, args: [NG_VALUE_ACCESSOR,] }] },\n { type: NgZone },\n { type: ElementRef },\n { type: Renderer2 }\n];\nFilterInputDirective.propDecorators = {\n filterDelay: [{ type: Input }],\n value: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterInputDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoFilterInput]'\n }]\n }], function () { return [{ type: Array, decorators: [{\n type: Self\n }, {\n type: Inject,\n args: [NG_VALUE_ACCESSOR]\n }] }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }]; }, { filterDelay: [{\n type: Input\n }], value: [{\n type: Input\n }] }); })();\n\nconst EMPTY_VALUE_OPERATORS = new Set(['isnull', 'isnotnull', 'isempty', 'isnotempty']);\nconst isEmptyValueOperator = (operator) => EMPTY_VALUE_OPERATORS.has(operator);\n/**\n * @hidden\n */\nclass FilterInputWrapperComponent extends BaseFilterCellComponent {\n constructor(filterService) {\n super(filterService);\n this.operators = [];\n }\n get currentFilter() {\n return this.filterByField(this.column.field);\n }\n get currentOperator() {\n const filter$$1 = this.currentFilter;\n if (!this._operator) {\n this._operator = filter$$1 ? filter$$1.operator : this.defaultOperator;\n }\n return this._operator;\n }\n set currentOperator(value) {\n this._operator = value;\n const emptyValueOperator = isEmptyValueOperator(value);\n this.filterInputDisabled = emptyValueOperator;\n if (emptyValueOperator) {\n this.applyNoValueFilter(value);\n }\n else if (!isBlank(value) && isPresent(this.currentFilter)) {\n this.onChange(this.currentFilter.value);\n }\n }\n get defaultOperator() {\n if (!isNullOrEmptyString(this._defaultOperator)) {\n return this._defaultOperator;\n }\n else if (this.operators && this.operators.length) {\n return this.operators[0].value;\n }\n return \"eq\";\n }\n set defaultOperator(value) {\n this._defaultOperator = value;\n }\n set filterInputDisabled(disabled) {\n if (!this.input) {\n return;\n }\n this.input.disabled = disabled;\n }\n ngAfterContentInit() {\n if (isPresent(this.input)) {\n this.changeSubscription = this.input.change.subscribe(this.onChange.bind(this));\n this.filterInputDisabled = isEmptyValueOperator(this.currentOperator);\n }\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n if (this.changeSubscription) {\n this.changeSubscription.unsubscribe();\n }\n }\n onChange(value) {\n if (!isNullOrEmptyString(value) || this.filterByField(this.column.field)) {\n this.filterChange(isNullOrEmptyString(value) ?\n this.removeFilter(this.column.field) :\n this.updateFilter({\n field: this.column.field,\n operator: this.currentOperator,\n value: value\n }));\n }\n }\n onClear() {\n this.onChange(null);\n this.filterInputDisabled = isEmptyValueOperator(this.defaultOperator);\n }\n applyNoValueFilter(operator) {\n this.filterChange(this.updateFilter({\n field: this.column.field,\n operator: operator,\n value: null\n }));\n }\n ngOnChanges(changes) {\n if (isChanged(\"filter\", changes, false)) {\n this._operator = null;\n this.filterInputDisabled = isEmptyValueOperator(this.currentOperator);\n }\n }\n}\nFilterInputWrapperComponent.ɵfac = function FilterInputWrapperComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nFilterInputWrapperComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterInputWrapperComponent, contentQueries: function FilterInputWrapperComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, FilterInputDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.input = _t.first);\n } }, inputs: { operators: \"operators\", defaultOperator: \"defaultOperator\", column: \"column\", filter: \"filter\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature, ɵngcc0.ɵɵNgOnChangesFeature] });\nFilterInputWrapperComponent.propDecorators = {\n operators: [{ type: Input }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n input: [{ type: ContentChild, args: [FilterInputDirective,] }],\n defaultOperator: [{ type: Input }]\n};\n\n\nconst EMPTY_FILTER_OPERATORS = ['isnull', 'isnotnull', 'isempty', 'isnotempty'];\n/**\n * @hidden\n */\nclass FilterCellWrapperComponent extends FilterInputWrapperComponent {\n constructor(filterService) {\n super(filterService);\n this.showOperators = true;\n }\n get hostClasses() {\n return true;\n }\n get overrideBaseClasses() {\n return false;\n }\n get showButton() {\n const filter$$1 = this.currentFilter;\n return isPresent(filter$$1) && (!isNullOrEmptyString(filter$$1.value) ||\n EMPTY_FILTER_OPERATORS.indexOf(String(filter$$1.operator)) >= 0);\n }\n filterChange(filter$$1) {\n this.applyFilter(filter$$1);\n }\n}\nFilterCellWrapperComponent.ɵfac = function FilterCellWrapperComponent_Factory(t) { return new (t || FilterCellWrapperComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService)); };\nFilterCellWrapperComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterCellWrapperComponent, selectors: [[\"kendo-grid-filter-wrapper-cell\"]], hostVars: 4, hostBindings: function FilterCellWrapperComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell-wrapper\", ctx.hostClasses)(\"k-filtercell\", ctx.overrideBaseClasses);\n } }, inputs: { showOperators: \"showOperators\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c125, decls: 2, vars: 4, consts: [[3, \"showOperators\", \"operators\", \"showButton\", \"value\", \"clear\", \"valueChange\"]], template: function FilterCellWrapperComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-grid-filter-cell-operators\", 0);\n ɵngcc0.ɵɵlistener(\"clear\", function FilterCellWrapperComponent_Template_kendo_grid_filter_cell_operators_clear_1_listener() { return ctx.onClear(); })(\"valueChange\", function FilterCellWrapperComponent_Template_kendo_grid_filter_cell_operators_valueChange_1_listener($event) { return ctx.currentOperator = $event; });\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"showOperators\", ctx.showOperators)(\"operators\", ctx.operators)(\"showButton\", ctx.showButton)(\"value\", ctx.currentOperator);\n } }, directives: function () { return [FilterCellOperatorsComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nFilterCellWrapperComponent.ctorParameters = () => [\n { type: FilterService }\n];\nFilterCellWrapperComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell-wrapper',] }],\n overrideBaseClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n showOperators: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterCellWrapperComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-filter-wrapper-cell',\n template: `\n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }]; }, { showOperators: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell-wrapper']\n }], overrideBaseClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell']\n }] }); })();\n\n// tslint:disable:no-access-missing-member\nconst stringOperators = localizeOperators$1({\n \"filterEqOperator\": \"eq\",\n \"filterNotEqOperator\": \"neq\",\n // tslint:disable-next-line:object-literal-sort-keys\n \"filterContainsOperator\": \"contains\",\n \"filterNotContainsOperator\": \"doesnotcontain\",\n \"filterStartsWithOperator\": \"startswith\",\n \"filterEndsWithOperator\": \"endswith\",\n \"filterIsNullOperator\": \"isnull\",\n \"filterIsNotNullOperator\": \"isnotnull\",\n \"filterIsEmptyOperator\": \"isempty\",\n \"filterIsNotEmptyOperator\": \"isnotempty\"\n});\n/**\n * Represents a base string filter component.\n */\nclass StringFilterComponent extends BaseFilterCellComponent {\n constructor(filterService, localization) {\n super(filterService);\n this.localization = localization;\n /**\n * The default filter operator. Defaults to `contains`.\n * @type {string}\n */\n this.operator = \"contains\";\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n get currentFilter() {\n return this.filterByField((this.column || {}).field);\n }\n /**\n * The current filter operator for the associated column field.\n * @readonly\n * @type {string}\n */\n get currentOperator() {\n return this.currentFilter ? this.currentFilter.operator : this.operator;\n }\n ngOnInit() {\n this.subscription = this.localization.changes.subscribe(this.localizationChange.bind(this));\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n super.ngOnDestroy();\n }\n localizationChange() {\n this.defaultOperators = stringOperators(this.localization);\n if (this.operatorList.length) {\n this.operators = toJSON(this.operatorList.toArray());\n }\n }\n}\nStringFilterComponent.ɵfac = function StringFilterComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nStringFilterComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: StringFilterComponent, inputs: { operator: \"operator\", column: \"column\", filter: \"filter\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nStringFilterComponent.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }]\n};\n\n\n/**\n * Represents a string-filter cell component\n * ([see example]({% slug builtinfiltertemplate_grid %}#toc-configuration-components-for-filter-templates)).\n *\n * @example\n *\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass StringFilterCellComponent extends StringFilterComponent {\n constructor(filterService, localization) {\n super(filterService, localization);\n /**\n * Determines the delay time (in milliseconds) before the filter value is submitted.\n * A value of `0` indicates no delay. The default value is `500`.\n * @type {boolean}\n */\n this.filterDelay = 500;\n /**\n * Determines if the drop-down filter operators will be displayed.\n * The default value is `true`.\n * @type {boolean}\n */\n this.showOperators = true;\n }\n}\nStringFilterCellComponent.ɵfac = function StringFilterCellComponent_Factory(t) { return new (t || StringFilterCellComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nStringFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StringFilterCellComponent, selectors: [[\"kendo-grid-string-filter-cell\"]], inputs: { filterDelay: \"filterDelay\", showOperators: \"showOperators\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 7, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"showOperators\"], [\"kendoGridFocusable\", \"\", \"kendoFilterInput\", \"\", 1, \"k-textbox\", 3, \"filterDelay\", \"ngModel\"]], template: function StringFilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-wrapper-cell\", 0);\n ɵngcc0.ɵɵelement(1, \"input\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"showOperators\", ctx.showOperators);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterDelay\", ctx.filterDelay)(\"ngModel\", ctx.currentFilter == null ? null : ctx.currentFilter.value);\n } }, directives: [FilterCellWrapperComponent, ɵngcc7.DefaultValueAccessor, FocusableDirective,\n FilterInputDirective, ɵngcc7.NgControlStatus, ɵngcc7.NgModel], encapsulation: 2 });\n/** @nocollapse */\nStringFilterCellComponent.ctorParameters = () => [\n { type: FilterService },\n { type: LocalizationService }\n];\nStringFilterCellComponent.propDecorators = {\n filterDelay: [{ type: Input }],\n showOperators: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StringFilterCellComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-string-filter-cell',\n template: `\n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: ɵngcc1.LocalizationService }]; }, { filterDelay: [{\n type: Input\n }], showOperators: [{\n type: Input\n }] }); })();\n\n/**\n * Represents a component which accommodates the filter operators.\n */\nclass FilterCellOperatorsComponent {\n constructor(localization) {\n this.localization = localization;\n this.clearText = 'Clear';\n /**\n * The filter operators that will be displayed.\n */\n this.operators = [];\n /**\n * Determines if the list of operators will be displayed.\n * @type {boolean}\n */\n this.showOperators = true;\n /**\n * Fires when the operator is selected.\n * @type {EventEmitter}\n */\n this.valueChange = new EventEmitter();\n /**\n * Fires when the **Clear** button is clicked.\n * @type {EventEmitter<{}>}\n */\n this.clear = new EventEmitter();\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return true;\n }\n /**\n * @hidden\n */\n onChange(dataItem) {\n this.valueChange.emit(dataItem);\n }\n /**\n * @hidden\n */\n clearClick() {\n this.clear.emit();\n return false;\n }\n /**\n * @hidden\n */\n clearKeydown(args) {\n if (args.keyCode === Keys.Enter || args.keyCode === Keys.Space) {\n this.clear.emit();\n }\n }\n /**\n * @hidden\n */\n dropdownKeydown(args) {\n if (args.defaultPrevented) {\n return;\n }\n if (args.keyCode === Keys.Enter && !this.dropdown.isOpen) {\n this.dropdown.toggle(true);\n args.preventDefault();\n }\n }\n ngOnInit() {\n this.localization.changes.subscribe(() => this.clearText = this.localization.get(\"filterClearButton\"));\n }\n}\nFilterCellOperatorsComponent.ɵfac = function FilterCellOperatorsComponent_Factory(t) { return new (t || FilterCellOperatorsComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nFilterCellOperatorsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterCellOperatorsComponent, selectors: [[\"kendo-grid-filter-cell-operators\"]], viewQuery: function FilterCellOperatorsComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c126, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dropdown = _t.first);\n } }, hostVars: 2, hostBindings: function FilterCellOperatorsComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell-operator\", ctx.hostClasses);\n } }, inputs: { operators: \"operators\", showOperators: \"showOperators\", showButton: \"showButton\", value: \"value\" }, outputs: { valueChange: \"valueChange\", clear: \"clear\" }, decls: 3, vars: 5, consts: [[\"kendoGridFocusable\", \"\", \"class\", \"k-dropdown-operator\", \"iconClass\", \"k-i-filter\", \"textField\", \"text\", \"valueField\", \"value\", 3, \"data\", \"value\", \"valuePrimitive\", \"popupSettings\", \"valueChange\", \"keydown\", 4, \"ngIf\"], [\"type\", \"button\", \"kendoGridFocusable\", \"\", 1, \"k-button\", \"k-button-icon\", 3, \"ngClass\", \"title\", \"click\", \"keydown\"], [1, \"k-icon\", \"k-i-filter-clear\"], [\"kendoGridFocusable\", \"\", \"iconClass\", \"k-i-filter\", \"textField\", \"text\", \"valueField\", \"value\", 1, \"k-dropdown-operator\", 3, \"data\", \"value\", \"valuePrimitive\", \"popupSettings\", \"valueChange\", \"keydown\"], [\"dropdown\", \"\"]], template: function FilterCellOperatorsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FilterCellOperatorsComponent_kendo_dropdownlist_0_Template, 2, 5, \"kendo-dropdownlist\", 0);\n ɵngcc0.ɵɵelementStart(1, \"button\", 1);\n ɵngcc0.ɵɵlistener(\"click\", function FilterCellOperatorsComponent_Template_button_click_1_listener() { return ctx.clearClick(); })(\"keydown\", function FilterCellOperatorsComponent_Template_button_keydown_1_listener($event) { return ctx.clearKeydown($event); });\n ɵngcc0.ɵɵelement(2, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showOperators);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction1(3, _c128, ctx.showButton))(\"title\", ctx.clearText);\n } }, directives: [ɵngcc5.NgIf, FocusableDirective, ɵngcc5.NgClass, ɵngcc8.DropDownListComponent], encapsulation: 2 });\n/** @nocollapse */\nFilterCellOperatorsComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nFilterCellOperatorsComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell-operator',] }],\n dropdown: [{ type: ViewChild, args: ['dropdown',] }],\n operators: [{ type: Input }],\n showButton: [{ type: Input }],\n showOperators: [{ type: Input }],\n value: [{ type: Input }],\n valueChange: [{ type: Output }],\n clear: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterCellOperatorsComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-filter-cell-operators',\n template: `\n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { operators: [{\n type: Input\n }], showOperators: [{\n type: Input\n }], valueChange: [{\n type: Output\n }], clear: [{\n type: Output\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell-operator']\n }], dropdown: [{\n type: ViewChild,\n args: ['dropdown']\n }], showButton: [{\n type: Input\n }], value: [{\n type: Input\n }] }); })();\n\n// tslint:disable:no-access-missing-member\nconst stringOperators$1 = localizeOperators$1({\n \"filterContainsOperator\": \"contains\",\n \"filterNotContainsOperator\": \"doesnotcontain\",\n // tslint:disable-next-line:object-literal-sort-keys\n \"filterEqOperator\": \"eq\",\n \"filterNotEqOperator\": \"neq\",\n \"filterStartsWithOperator\": \"startswith\",\n \"filterEndsWithOperator\": \"endswith\",\n \"filterIsNullOperator\": \"isnull\",\n \"filterIsNotNullOperator\": \"isnotnull\",\n \"filterIsEmptyOperator\": \"isempty\",\n \"filterIsNotEmptyOperator\": \"isnotempty\"\n});\n/**\n * @hidden\n */\nclass AutoCompleteFilterCellComponent extends BaseFilterCellComponent {\n constructor(filterService, column, localization) {\n super(filterService);\n this.localization = localization;\n this.showOperators = true;\n this.defaultOperators = stringOperators$1(this.localization);\n this.column = column;\n }\n set valueField(value) {\n this._valueField = value;\n }\n get valueField() {\n return this._valueField ? this._valueField : this.column.field;\n }\n get currentFilter() {\n return this.filterByField(this.column.field);\n }\n get currentOperator() {\n return this.currentFilter ? this.currentFilter.operator : \"contains\";\n }\n}\nAutoCompleteFilterCellComponent.ɵfac = function AutoCompleteFilterCellComponent_Factory(t) { return new (t || AutoCompleteFilterCellComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ColumnComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nAutoCompleteFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: AutoCompleteFilterCellComponent, selectors: [[\"kendo-grid-autocomplete-filter-cell\"]], inputs: { showOperators: \"showOperators\", column: \"column\", valueField: \"valueField\", filter: \"filter\", data: \"data\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 7, consts: [[3, \"column\", \"filter\", \"operators\", \"showOperators\"], [\"kendoFilterInput\", \"\", 3, \"data\", \"valueField\", \"value\"]], template: function AutoCompleteFilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-wrapper-cell\", 0);\n ɵngcc0.ɵɵelement(1, \"kendo-autocomplete\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"showOperators\", ctx.showOperators);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"data\", ctx.data)(\"valueField\", ctx.valueField)(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value);\n } }, directives: [FilterCellWrapperComponent, ɵngcc8.AutoCompleteComponent, FilterInputDirective], encapsulation: 2 });\n/** @nocollapse */\nAutoCompleteFilterCellComponent.ctorParameters = () => [\n { type: FilterService },\n { type: ColumnComponent },\n { type: LocalizationService }\n];\nAutoCompleteFilterCellComponent.propDecorators = {\n showOperators: [{ type: Input }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n data: [{ type: Input }],\n valueField: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AutoCompleteFilterCellComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-autocomplete-filter-cell',\n template: `\n \n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: ColumnComponent }, { type: ɵngcc1.LocalizationService }]; }, { showOperators: [{\n type: Input\n }], column: [{\n type: Input\n }], valueField: [{\n type: Input\n }], filter: [{\n type: Input\n }], data: [{\n type: Input\n }] }); })();\n\n// tslint:disable:no-access-missing-member\n/**\n * @hidden\n */\nclass BooleanFilterComponent extends BaseFilterCellComponent {\n constructor(filterService, localization) {\n super(filterService);\n this.localization = localization;\n /**\n * @hidden\n */\n this.operator = \"eq\";\n /**\n * @hidden\n */\n this.items = [\n { text: this.localization.get(\"filterIsTrue\"), value: true },\n { text: this.localization.get(\"filterIsFalse\"), value: false }\n ];\n /**\n * @hidden\n */\n this.defaultItem = { text: this.localization.get(\"filterBooleanAll\"), value: null };\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return true;\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n get currentFilter() {\n return this.filterByField(this.column.field);\n }\n /**\n * The current filter operator for the associated column field.\n * @readonly\n * @type {string}\n */\n get currentOperator() {\n return this.currentFilter ? this.currentFilter.operator : this.operator;\n }\n ngOnInit() {\n this.subscription = this.localization.changes.subscribe(this.localizationChange.bind(this));\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n super.ngOnDestroy();\n }\n localizationChange() {\n this.items = [\n { text: this.localization.get(\"filterIsTrue\"), value: true },\n { text: this.localization.get(\"filterIsFalse\"), value: false }\n ];\n this.defaultItem = { text: this.localization.get(\"filterBooleanAll\"), value: null };\n }\n}\nBooleanFilterComponent.ɵfac = function BooleanFilterComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nBooleanFilterComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: BooleanFilterComponent, hostVars: 2, hostBindings: function BooleanFilterComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell-boolean\", ctx.hostClasses);\n } }, inputs: { column: \"column\", filter: \"filter\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nBooleanFilterComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell-boolean',] }],\n column: [{ type: Input }],\n filter: [{ type: Input }]\n};\n\n\n/**\n * Represents a Boolean filter-cell component.\n *\n * @example\n *\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass BooleanFilterCellComponent extends BooleanFilterComponent {\n constructor(filterService, localization, cd) {\n super(filterService, localization);\n this.cd = cd;\n }\n localizationChange() {\n super.localizationChange();\n this.cd.markForCheck();\n }\n}\nBooleanFilterCellComponent.ɵfac = function BooleanFilterCellComponent_Factory(t) { return new (t || BooleanFilterCellComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nBooleanFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: BooleanFilterCellComponent, selectors: [[\"kendo-grid-boolean-filter-cell\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 10, consts: [[3, \"column\", \"filter\", \"showOperators\", \"defaultOperator\"], [\"kendoFilterInput\", \"\", \"textField\", \"text\", \"valueField\", \"value\", 3, \"defaultItem\", \"data\", \"popupSettings\", \"valuePrimitive\", \"value\"]], template: function BooleanFilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-wrapper-cell\", 0);\n ɵngcc0.ɵɵelement(1, \"kendo-dropdownlist\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"showOperators\", false)(\"defaultOperator\", ctx.operator);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"defaultItem\", ctx.defaultItem)(\"data\", ctx.items)(\"popupSettings\", ɵngcc0.ɵɵpureFunction0(9, _c127))(\"valuePrimitive\", true)(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value);\n } }, directives: [FilterCellWrapperComponent, ɵngcc8.DropDownListComponent, FilterInputDirective], encapsulation: 2 });\n/** @nocollapse */\nBooleanFilterCellComponent.ctorParameters = () => [\n { type: FilterService },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BooleanFilterCellComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-boolean-filter-cell',\n template: `\n \n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\n// tslint:disable:no-access-missing-member\nconst dateOperators = localizeOperators$1({\n \"filterEqOperator\": \"eq\",\n \"filterNotEqOperator\": \"neq\",\n // tslint:disable-next-line:object-literal-sort-keys\n \"filterAfterOrEqualOperator\": \"gte\",\n \"filterAfterOperator\": \"gt\",\n \"filterBeforeOrEqualOperator\": \"lte\",\n \"filterBeforeOperator\": \"lt\",\n \"filterIsNullOperator\": \"isnull\",\n \"filterIsNotNullOperator\": \"isnotnull\"\n});\n/**\n * @hidden\n */\nclass DateFilterComponent extends BaseFilterCellComponent {\n constructor(filterService, localization) {\n super(filterService);\n this.localization = localization;\n /**\n * The default filter operator. Defaults to `contains`.\n * @type {string}\n */\n this.operator = \"gte\";\n /**\n * Defines the active view that the calendar initially renders.\n * By default, the active view is `month`.\n *\n * > You have to set `activeView` within the `topView`-`bottomView` range.\n */\n this.activeView = \"month\";\n /**\n * Defines the bottommost calendar view, to which the user can navigate.\n */\n this.bottomView = \"month\";\n /**\n * Defines the topmost calendar view, to which the user can navigate.\n */\n this.topView = \"century\";\n /**\n * Determines whether to display a week number column in the `month` view of the Calendar.\n */\n this.weekNumber = false;\n this.defaultOperators = dateOperators(this.localization);\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n get currentFilter() {\n return this.filterByField(this.column.field);\n }\n /**\n * Specifies the date format that is used when the component is not focused.\n * By default, the `column.format` value is used (if set).\n */\n set format(value) {\n this._format = value;\n }\n /**\n * Specifies the date format that is used when the component is not focused.\n * By default, the `column.format` value is used (if set).\n *\n * @readonly\n * @type {string}\n */\n get format() {\n return !isNullOrEmptyString(this._format) ? this._format : this.columnFormat;\n }\n get columnFormat() {\n return this.column && !isNullOrEmptyString(this.column.format) ?\n extractFormat(this.column.format) : \"d\";\n }\n /**\n * The current filter operator for the associated column field.\n * @readonly\n * @type {string}\n */\n get currentOperator() {\n return this.currentFilter ? this.currentFilter.operator : this.operator;\n }\n ngOnInit() {\n this.subscription = this.localization.changes.subscribe(this.localizationChange.bind(this));\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n super.ngOnDestroy();\n }\n localizationChange() {\n this.defaultOperators = dateOperators(this.localization);\n if (this.operatorList.length) {\n this.operators = toJSON(this.operatorList.toArray());\n }\n }\n}\nDateFilterComponent.ɵfac = function DateFilterComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nDateFilterComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DateFilterComponent, inputs: { operator: \"operator\", activeView: \"activeView\", bottomView: \"bottomView\", topView: \"topView\", weekNumber: \"weekNumber\", format: \"format\", column: \"column\", filter: \"filter\", min: \"min\", max: \"max\", formatPlaceholder: \"formatPlaceholder\", placeholder: \"placeholder\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nDateFilterComponent.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }],\n format: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n activeView: [{ type: Input }],\n bottomView: [{ type: Input }],\n topView: [{ type: Input }],\n weekNumber: [{ type: Input }]\n};\n\n\n/**\n * Represents a date-filter cell component.\n *\n * @example\n *\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass DateFilterCellComponent extends DateFilterComponent {\n constructor(filterService, localization) {\n super(filterService, localization);\n this.localization = localization;\n /**\n * Determines if the drop-down filter operators will be displayed. The default value is `true`.\n * @type {boolean}\n */\n this.showOperators = true;\n }\n /**\n * @hidden\n */\n messageFor(key) {\n return this.localization.get(key);\n }\n}\nDateFilterCellComponent.ɵfac = function DateFilterCellComponent_Factory(t) { return new (t || DateFilterCellComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nDateFilterCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateFilterCellComponent, selectors: [[\"kendo-grid-date-filter-cell\"]], inputs: { showOperators: \"showOperators\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 17, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"showOperators\"], [\"kendoFilterInput\", \"\", 3, \"value\", \"format\", \"formatPlaceholder\", \"placeholder\", \"activeView\", \"bottomView\", \"topView\", \"min\", \"max\", \"weekNumber\"], [3, \"toggle\", \"today\"]], template: function DateFilterCellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-wrapper-cell\", 0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-datepicker\", 1);\n ɵngcc0.ɵɵelement(2, \"kendo-datepicker-messages\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"showOperators\", ctx.showOperators);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value)(\"format\", ctx.format)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"placeholder\", ctx.placeholder)(\"activeView\", ctx.activeView)(\"bottomView\", ctx.bottomView)(\"topView\", ctx.topView)(\"min\", ctx.min)(\"max\", ctx.max)(\"weekNumber\", ctx.weekNumber);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"toggle\", ctx.messageFor(\"filterDateToggle\"))(\"today\", ctx.messageFor(\"filterDateToday\"));\n } }, directives: [FilterCellWrapperComponent, ɵngcc9.DatePickerComponent, FilterInputDirective, ɵngcc9.DatePickerCustomMessagesComponent], encapsulation: 2 });\n/** @nocollapse */\nDateFilterCellComponent.ctorParameters = () => [\n { type: FilterService },\n { type: LocalizationService }\n];\nDateFilterCellComponent.propDecorators = {\n showOperators: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateFilterCellComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-date-filter-cell',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: ɵngcc1.LocalizationService }]; }, { showOperators: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass ColGroupComponent {\n constructor() {\n this.columns = [];\n this.groups = [];\n }\n get columnsToRender() {\n return columnsToRender(this.columns);\n }\n trackBy(index, _item) {\n return index;\n }\n}\nColGroupComponent.ɵfac = function ColGroupComponent_Factory(t) { return new (t || ColGroupComponent)(); };\nColGroupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColGroupComponent, selectors: [[\"\", \"kendoGridColGroup\", \"\"]], inputs: { columns: \"columns\", groups: \"groups\", detailTemplate: \"detailTemplate\" }, attrs: _c129, decls: 1, vars: 1, consts: [[3, \"ngIf\"], [3, \"k-group-col\", 4, \"ngFor\", \"ngForOf\"], [3, \"k-hierarchy-col\", 4, \"ngIf\"], [3, \"width\", 4, \"ngFor\", \"ngForOf\", \"ngForTrackBy\"]], template: function ColGroupComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ColGroupComponent_ng_template_0_Template, 3, 4, \"ng-template\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", true);\n } }, directives: [ɵngcc5.NgIf, ɵngcc5.NgForOf], encapsulation: 2 });\nColGroupComponent.propDecorators = {\n columns: [{ type: Input }],\n groups: [{ type: Input }],\n detailTemplate: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColGroupComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridColGroup]',\n template: `\n \n \n \n \n \n `\n }]\n }], function () { return []; }, { columns: [{\n type: Input\n }], groups: [{\n type: Input\n }], detailTemplate: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass LoadingComponent {\n constructor(localization) {\n this.localization = localization;\n this.hostClass = true;\n }\n get loadingText() {\n return this.localization.get('loading');\n }\n}\nLoadingComponent.ɵfac = function LoadingComponent_Factory(t) { return new (t || LoadingComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLoadingComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: LoadingComponent, selectors: [[\"\", \"kendoGridLoading\", \"\"]], hostVars: 2, hostBindings: function LoadingComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-loading-mask\", ctx.hostClass);\n } }, attrs: _c130, decls: 4, vars: 1, consts: [[1, \"k-loading-text\"], [1, \"k-loading-image\"], [1, \"k-loading-color\"]], template: function LoadingComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 0);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelement(2, \"div\", 1);\n ɵngcc0.ɵɵelement(3, \"div\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx.loadingText);\n } }, encapsulation: 2 });\n/** @nocollapse */\nLoadingComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nLoadingComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-loading-mask',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LoadingComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridLoading]',\n template: `\n {{ loadingText }}\n
\n
\n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-loading-mask']\n }] }); })();\n\n/**\n * @hidden\n */\nclass ResizableContainerDirective {\n constructor(el, renderer, resizeService, grid) {\n this.el = el;\n this.renderer = renderer;\n this.resizeService = resizeService;\n this.grid = grid;\n this.enabled = false;\n }\n set lockedWidth(value) {\n this._lockedWidth = value;\n if (this.enabled) {\n this.attachResize();\n this.resize();\n }\n }\n set kendoGridResizableContainer(enabled) {\n const refresh = enabled !== this.enabled;\n this.enabled = enabled;\n if (refresh) {\n this.attachResize();\n this.resize();\n }\n }\n ngOnDestroy() {\n if (this.resizeSubscription) {\n this.resizeSubscription.unsubscribe();\n }\n }\n attachResize() {\n if (this.resizeSubscription && !this.enabled) {\n this.resizeSubscription.unsubscribe();\n this.resizeSubscription = null;\n }\n if (!this.resizeSubscription && this.enabled) {\n this.resizeSubscription = this.resizeService.changes.subscribe(this.resize.bind(this));\n }\n }\n resize() {\n if (this.grid && this.grid.wrapper) {\n const containerElement = this.grid.wrapper.nativeElement;\n const width = Math.max(containerElement.clientWidth - this._lockedWidth, 0);\n if (this.enabled && width > 0) {\n this.renderer.setStyle(this.el.nativeElement, \"width\", width + \"px\");\n }\n else {\n this.renderer.setStyle(this.el.nativeElement, \"width\", \"\");\n }\n }\n }\n}\nResizableContainerDirective.ɵfac = function ResizableContainerDirective_Factory(t) { return new (t || ResizableContainerDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ResizeService), ɵngcc0.ɵɵdirectiveInject(GridComponent, 8)); };\nResizableContainerDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ResizableContainerDirective, selectors: [[\"\", \"kendoGridResizableContainer\", \"\"]], inputs: { lockedWidth: \"lockedWidth\", kendoGridResizableContainer: \"kendoGridResizableContainer\" } });\n/** @nocollapse */\nResizableContainerDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: ResizeService },\n { type: GridComponent, decorators: [{ type: Optional }] }\n];\nResizableContainerDirective.propDecorators = {\n lockedWidth: [{ type: Input, args: ['lockedWidth',] }],\n kendoGridResizableContainer: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ResizableContainerDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridResizableContainer]'\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ResizeService }, { type: GridComponent, decorators: [{\n type: Optional\n }] }]; }, { lockedWidth: [{\n type: Input,\n args: ['lockedWidth']\n }], kendoGridResizableContainer: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass TemplateContextDirective {\n constructor(viewContainerRef) {\n this.viewContainerRef = viewContainerRef;\n }\n set templateContext(context) {\n this.removeView();\n if (context.templateRef) {\n this.insertedViewRef = this.viewContainerRef.createEmbeddedView(context.templateRef, context);\n }\n }\n ngOnDestroy() {\n this.removeView();\n }\n removeView() {\n if (this.insertedViewRef) {\n this.viewContainerRef.remove(this.viewContainerRef.indexOf(this.insertedViewRef));\n this.insertedViewRef = undefined;\n }\n }\n}\nTemplateContextDirective.ɵfac = function TemplateContextDirective_Factory(t) { return new (t || TemplateContextDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef)); };\nTemplateContextDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TemplateContextDirective, selectors: [[\"\", \"templateContext\", \"\"]], inputs: { templateContext: \"templateContext\" } });\n/** @nocollapse */\nTemplateContextDirective.ctorParameters = () => [\n { type: ViewContainerRef }\n];\nTemplateContextDirective.propDecorators = {\n templateContext: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TemplateContextDirective, [{\n type: Directive,\n args: [{\n selector: '[templateContext]' // tslint:disable-line:directive-selector\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }]; }, { templateContext: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass FocusGroup {\n constructor(root) {\n this.root = root;\n this.active = true;\n this.children = [];\n this.root.registerGroup(this);\n }\n get focusableChildren() {\n return this.children.filter(el => el.canFocus());\n }\n get isActive() {\n return this.active;\n }\n ngOnDestroy() {\n this.root.unregisterGroup(this);\n }\n registerElement(element) {\n this.unregisterElement(element);\n this.children.push(element);\n }\n unregisterElement(element) {\n this.children = this.children.filter(f => f !== element);\n }\n /**\n * Returns a Boolean value which indicates if the group will receive focus when the cell is focused.\n * Requires a single \"simple\" focusable element such as a button or a checkbox.\n */\n isNavigable() {\n const focusable = this.focusableChildren;\n return focusable.length === 1 && focusable[0].isNavigable();\n }\n canFocus() {\n return this.focusableChildren.length > 0;\n }\n focus() {\n if (this.canFocus() && !this.hasFocus()) {\n this.focusableChildren[0].focus();\n }\n }\n activate() {\n this.toggleState(true);\n }\n deactivate() {\n this.toggleState(false);\n }\n hasFocus() {\n return this.children.reduce((focused, element) => focused || element.hasFocus(), false);\n }\n toggleState(active) {\n if (this.active !== active) {\n this.active = active;\n this.children.forEach(f => f.toggle(active));\n }\n }\n}\nFocusGroup.ɵfac = function FocusGroup_Factory(t) { return new (t || FocusGroup)(ɵngcc0.ɵɵinject(FocusRoot)); };\nFocusGroup.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: FocusGroup, factory: FocusGroup.ɵfac });\n/** @nocollapse */\nFocusGroup.ctorParameters = () => [\n { type: FocusRoot }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FocusGroup, [{\n type: Injectable\n }], function () { return [{ type: FocusRoot }]; }, null); })();\n\nlet id = 0;\nfunction nextId() {\n return id++;\n}\n/**\n * @hidden\n */\nclass LogicalCellDirective {\n constructor(focusGroup, element, columnInfoService, idService, navigationService, renderer, zone, cellContext) {\n this.focusGroup = focusGroup;\n this.element = element;\n this.columnInfoService = columnInfoService;\n this.idService = idService;\n this.navigationService = navigationService;\n this.renderer = renderer;\n this.zone = zone;\n this.cellContext = cellContext;\n this.logicalSlaveCell = false;\n this.colSpan = 1;\n this.rowSpan = 1;\n this.dataRowIndex = -1;\n this.detailExpandCell = false;\n this.uid = nextId();\n }\n get id() {\n if (!this.logicalSlaveCell && this.columnInfoService.isLocked) {\n return this.idService.cellId(this.logicalRowIndex, this.logicalColIndex);\n }\n }\n get ariaColIndex() {\n if (this.logicalSlaveCell || this.logicalColIndex === -1) {\n return undefined;\n }\n return this.logicalColIndex + 1;\n }\n ngOnInit() {\n if (!this.navigationService.enabled) {\n return;\n }\n this.navigationChange = this.navigationService.changes.subscribe((e) => this.onNavigationChange(e));\n }\n ngDoCheck() {\n if (!this.navigationService.enabled || this.logicalColIndex === -1) {\n return;\n }\n if (this.cellContext) {\n this.cellContext.focusGroup = this.focusGroup;\n }\n this.registerNoChanges();\n }\n ngOnChanges(changes) {\n if (!this.navigationService.enabled) {\n return;\n }\n const keys = Object.keys(changes);\n if ((keys.length === 1 && keys[0] === 'groupItem') || this.logicalColIndex === -1) {\n // Ignore groupItem changes as the reference is not stable\n return;\n }\n const indexChange = changes.logicalColIndex;\n const rowIndexChange = changes.logicalRowIndex;\n const index = indexChange && !indexChange.isFirstChange() ? indexChange.previousValue : this.logicalColIndex;\n const rowIndex = rowIndexChange && !rowIndexChange.isFirstChange() ? rowIndexChange.previousValue : this.logicalRowIndex;\n this.navigationService.unregisterCell(index, rowIndex, this);\n this.registerChanges();\n this.updateElement();\n }\n ngOnDestroy() {\n if (this.navigationChange) {\n this.navigationChange.unsubscribe();\n }\n this.navigationService.unregisterCell(this.logicalColIndex, this.logicalRowIndex, this);\n }\n onNavigationChange(e) {\n const active = this.logicalColIndex === e.colIndex && this.logicalRowIndex === e.rowIndex;\n const wasActive = this.logicalColIndex === e.prevColIndex && this.logicalRowIndex === e.prevRowIndex;\n if (active || wasActive) {\n this.updateElement();\n }\n }\n updateElement() {\n const el = this.element.nativeElement;\n this.renderer.setAttribute(el, 'tabIndex', this.isFocusable() && !this.logicalSlaveCell ? '0' : '-1');\n if (this.isFocused()) {\n if (this.focusGroup.isNavigable()) {\n this.focusGroup.focus();\n }\n else {\n if (!this.logicalSlaveCell && this.navigationService.autoFocusCell(this.logicalColIndex, this.logicalColIndex + this.colSpan - 1)) {\n this.microtask(() => this.isFocused() && el.focus());\n }\n this.renderer.addClass(el, 'k-state-focused');\n }\n }\n else {\n this.renderer.removeClass(el, 'k-state-focused');\n }\n }\n microtask(callback) {\n this.zone.runOutsideAngular(() => Promise.resolve(null).then(callback));\n }\n registerChanges() {\n if (!this.logicalSlaveCell) {\n this.navigationService.registerCell(this);\n }\n }\n registerNoChanges() {\n if (!this.logicalSlaveCell) {\n this.navigationService.registerCellOnCurrentRow(this);\n }\n }\n isFocusable() {\n return this.navigationService.isCellFocusable(this);\n }\n isFocused() {\n return this.navigationService.isCellFocused(this);\n }\n}\nLogicalCellDirective.ɵfac = function LogicalCellDirective_Factory(t) { return new (t || LogicalCellDirective)(ɵngcc0.ɵɵdirectiveInject(FocusGroup), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(IdService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT, 8)); };\nLogicalCellDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LogicalCellDirective, selectors: [[\"\", \"kendoGridLogicalCell\", \"\"]], hostVars: 2, hostBindings: function LogicalCellDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"id\", ctx.id)(\"aria-colindex\", ctx.ariaColIndex);\n } }, inputs: { logicalSlaveCell: \"logicalSlaveCell\", colSpan: \"colSpan\", rowSpan: \"rowSpan\", dataRowIndex: \"dataRowIndex\", detailExpandCell: \"detailExpandCell\", logicalColIndex: \"logicalColIndex\", logicalRowIndex: \"logicalRowIndex\", colIndex: \"colIndex\", groupItem: \"groupItem\", dataItem: \"dataItem\" }, features: [ɵngcc0.ɵɵProvidersFeature([{\n provide: FocusGroup,\n deps: [FocusRoot],\n useClass: FocusGroup\n }]), ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nLogicalCellDirective.ctorParameters = () => [\n { type: FocusGroup },\n { type: ElementRef },\n { type: ColumnInfoService },\n { type: IdService },\n { type: NavigationService },\n { type: Renderer2 },\n { type: NgZone },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CELL_CONTEXT,] }] }\n];\nLogicalCellDirective.propDecorators = {\n logicalColIndex: [{ type: Input }],\n logicalRowIndex: [{ type: Input }],\n logicalSlaveCell: [{ type: Input }],\n colIndex: [{ type: Input }],\n colSpan: [{ type: Input }],\n rowSpan: [{ type: Input }],\n groupItem: [{ type: Input }],\n dataRowIndex: [{ type: Input }],\n dataItem: [{ type: Input }],\n detailExpandCell: [{ type: Input }],\n id: [{ type: HostBinding, args: ['attr.id',] }],\n ariaColIndex: [{ type: HostBinding, args: ['attr.aria-colindex',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LogicalCellDirective, [{\n type: Directive,\n args: [{\n providers: [{\n provide: FocusGroup,\n deps: [FocusRoot],\n useClass: FocusGroup\n }],\n selector: '[kendoGridLogicalCell]'\n }]\n }], function () { return [{ type: FocusGroup }, { type: ɵngcc0.ElementRef }, { type: ColumnInfoService }, { type: IdService }, { type: NavigationService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [CELL_CONTEXT]\n }] }]; }, { logicalSlaveCell: [{\n type: Input\n }], colSpan: [{\n type: Input\n }], rowSpan: [{\n type: Input\n }], dataRowIndex: [{\n type: Input\n }], detailExpandCell: [{\n type: Input\n }], id: [{\n type: HostBinding,\n args: ['attr.id']\n }], ariaColIndex: [{\n type: HostBinding,\n args: ['attr.aria-colindex']\n }], logicalColIndex: [{\n type: Input\n }], logicalRowIndex: [{\n type: Input\n }], colIndex: [{\n type: Input\n }], groupItem: [{\n type: Input\n }], dataItem: [{\n type: Input\n }] }); })();\n\nlet id$1 = 0;\nfunction nextId$1() {\n return id$1++;\n}\n/**\n * @hidden\n */\nclass LogicalRowDirective {\n constructor(idService, navigation) {\n this.idService = idService;\n this.navigation = navigation;\n this.logicalSlaveRow = false;\n this.logicalSlaveCellsCount = 0;\n this.dataRowIndex = -1;\n this.uid = nextId$1();\n }\n get hostRole() {\n return this.logicalSlaveRow ? 'presentation' : 'row';\n }\n get ariaRowIndex() {\n if (this.navigation.enabled) {\n return this.logicalRowIndex + 1;\n }\n }\n get ariaOwns() {\n if (!this.navigation.enabled || this.logicalSlaveRow || this.logicalSlaveCellsCount === 0) {\n return undefined;\n }\n const ids = [];\n const total = this.logicalCellsCount + this.logicalSlaveCellsCount;\n for (let cellIndex = this.logicalCellsCount; cellIndex < total; cellIndex++) {\n ids.push(this.idService.cellId(this.logicalRowIndex, cellIndex));\n }\n return ids.join(' ');\n }\n ngOnChanges(changes) {\n if (!this.navigation.enabled || this.logicalSlaveRow) {\n return;\n }\n const indexChange = changes.logicalRowIndex;\n const logicalSlaveRowChange = changes.logicalSlaveRow;\n if (indexChange || logicalSlaveRowChange) {\n const index = indexChange && !indexChange.isFirstChange() ? indexChange.previousValue : this.logicalRowIndex;\n this.navigation.unregisterRow(index, this);\n this.navigation.registerRow(this);\n }\n else if (anyChanged(['dataRowIndex', 'dataItem'], changes)) {\n this.navigation.updateRow(this);\n }\n }\n ngOnDestroy() {\n this.navigation.unregisterRow(this.logicalRowIndex, this);\n }\n}\nLogicalRowDirective.ɵfac = function LogicalRowDirective_Factory(t) { return new (t || LogicalRowDirective)(ɵngcc0.ɵɵdirectiveInject(IdService), ɵngcc0.ɵɵdirectiveInject(NavigationService)); };\nLogicalRowDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LogicalRowDirective, selectors: [[\"\", \"kendoGridLogicalRow\", \"\"]], hostVars: 3, hostBindings: function LogicalRowDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.hostRole)(\"aria-rowindex\", ctx.ariaRowIndex)(\"aria-owns\", ctx.ariaOwns);\n } }, inputs: { logicalSlaveRow: \"logicalSlaveRow\", logicalSlaveCellsCount: \"logicalSlaveCellsCount\", dataRowIndex: \"dataRowIndex\", logicalRowIndex: \"logicalRowIndex\", logicalCellsCount: \"logicalCellsCount\", dataItem: \"dataItem\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nLogicalRowDirective.ctorParameters = () => [\n { type: IdService },\n { type: NavigationService }\n];\nLogicalRowDirective.propDecorators = {\n logicalRowIndex: [{ type: Input }],\n logicalSlaveRow: [{ type: Input }],\n logicalCellsCount: [{ type: Input }],\n logicalSlaveCellsCount: [{ type: Input }],\n dataRowIndex: [{ type: Input }],\n dataItem: [{ type: Input }],\n hostRole: [{ type: HostBinding, args: ['attr.role',] }],\n ariaRowIndex: [{ type: HostBinding, args: ['attr.aria-rowindex',] }],\n ariaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LogicalRowDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridLogicalRow]'\n }]\n }], function () { return [{ type: IdService }, { type: NavigationService }]; }, { logicalSlaveRow: [{\n type: Input\n }], logicalSlaveCellsCount: [{\n type: Input\n }], dataRowIndex: [{\n type: Input\n }], hostRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], ariaRowIndex: [{\n type: HostBinding,\n args: ['attr.aria-rowindex']\n }], ariaOwns: [{\n type: HostBinding,\n args: ['attr.aria-owns']\n }], logicalRowIndex: [{\n type: Input\n }], logicalCellsCount: [{\n type: Input\n }], dataItem: [{\n type: Input\n }] }); })();\n\n/* tslint:disable:pipe-naming */\nconst FORMAT_REGEX = /\\{\\d+:?/;\n/**\n * @hidden\n */\nclass FieldAccessorPipe {\n constructor(intlService) {\n this.intlService = intlService;\n }\n transform(dataItem, fieldName, format) {\n if (!isNullOrEmptyString(fieldName)) {\n const value = getter(fieldName)(dataItem);\n if (!isNullOrEmptyString(format)) {\n return this.formatValue(format, value);\n }\n return value;\n }\n return dataItem;\n }\n formatValue(format, value) {\n const intl = this.intlService;\n if (isString(format) && format.match(FORMAT_REGEX)) {\n return intl.format(format, value);\n }\n return intl.toString(value, format);\n }\n}\nFieldAccessorPipe.ɵfac = function FieldAccessorPipe_Factory(t) { return new (t || FieldAccessorPipe)(ɵngcc0.ɵɵdirectiveInject(ɵngcc10.IntlService)); };\nFieldAccessorPipe.ɵpipe = ɵngcc0.ɵɵdefinePipe({ name: \"valueOf\", type: FieldAccessorPipe, pure: false });\n/** @nocollapse */\nFieldAccessorPipe.ctorParameters = () => [\n { type: IntlService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FieldAccessorPipe, [{\n type: Pipe,\n args: [{\n name: 'valueOf',\n pure: false\n }]\n }], function () { return [{ type: ɵngcc10.IntlService }]; }, null); })();\n\n/**\n * @hidden\n */\nconst columnsToResize = ({ columns }) => Math.max(1, resizableColumns(columns).length);\n/**\n * @hidden\n */\nconst row = selector => element => element.querySelector(selector);\n/**\n * @hidden\n */\nconst headerRow = index => element => element.querySelectorAll('thead>tr')[index];\n/**\n * @hidden\n */\nconst cell = (index, selector = 'td') => element => element.querySelectorAll(`${selector}:not(.k-group-cell):not(.k-hierarchy-cell)`)[index];\n/**\n * @hidden\n */\nconst offsetWidth = element => element.offsetWidth;\n/**\n * @hidden\n */\nconst pipe = (...fns) => data => fns.reduce((state$$1, fn) => state$$1 ? fn(state$$1) : 0, data);\n/**\n * @hidden\n */\nclass TableDirective {\n constructor(element, renderer, service, zone, cdr) {\n this.element = element;\n this.renderer = renderer;\n this.service = service;\n this.zone = zone;\n this.cdr = cdr;\n this.locked = false;\n this.firstResize = false;\n }\n get minWidth() {\n return this.firstResize ? 0 : null;\n }\n ngOnInit() {\n const obs = this.service\n .changes.pipe(filter(e => this.locked === e.locked));\n this.subscription = obs.pipe(filter(e => e.type === 'start'), tap(this.initState.bind(this)), map(columnsToResize), switchMap((take$$1) => obs.pipe(filter(e => e.type === 'resizeTable'), map(e => e.delta), bufferCount(take$$1)))).subscribe(this.resize.bind(this));\n this.autoFitSubscription = this.service\n .registerTable({\n autoFit: this.autoFitObservable.bind(this),\n locked: this.locked\n });\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n if (this.autoFitSubscription) {\n this.autoFitSubscription();\n this.autoFitSubscription = null;\n }\n }\n initState() {\n this.firstResize = true;\n if (!this.virtualColumns || this.locked) {\n this.originalWidth = offsetWidth(this.element.nativeElement);\n }\n }\n resize(deltas) {\n if (!this.virtualColumns || this.locked) {\n const delta = deltas.reduce((sum, item) => sum + item, 0);\n const width = this.originalWidth + delta;\n this.renderer.setStyle(this.element.nativeElement, 'width', width + 'px');\n }\n this.cdr.detectChanges();\n }\n autoFitObservable(columnInfo) {\n return Observable.create(observer => {\n this.zone.runOutsideAngular(() => {\n this.renderer.addClass(this.element.nativeElement, 'k-autofitting');\n this.cdr.detectChanges();\n const widths = columnInfo.map(this.measureColumn.bind(this));\n this.renderer.removeClass(this.element.nativeElement, 'k-autofitting');\n observer.next(widths);\n });\n });\n }\n measureColumn(info) {\n const dom = this.element.nativeElement;\n const header = pipe(headerRow(info.level), cell(info.headerIndex, 'th'), offsetWidth)(dom);\n let data = 0;\n if (!info.isParentSpan || (info.isParentSpan && info.isLastInSpan)) {\n data = pipe(row('tbody>tr:not(.k-grouping-row):not(.k-grid-norecords)'), cell(info.index), offsetWidth)(dom);\n }\n const footer = pipe(row('tfoot>tr'), cell(info.index), offsetWidth)(dom);\n return Math.max(header, data, footer);\n }\n}\nTableDirective.ɵfac = function TableDirective_Factory(t) { return new (t || TableDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ColumnResizingService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nTableDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TableDirective, selectors: [[\"table\"]], hostVars: 2, hostBindings: function TableDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"min-width\", ctx.minWidth);\n } }, inputs: { locked: \"locked\", virtualColumns: \"virtualColumns\" } });\n/** @nocollapse */\nTableDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: ColumnResizingService },\n { type: NgZone },\n { type: ChangeDetectorRef }\n];\nTableDirective.propDecorators = {\n locked: [{ type: Input }],\n virtualColumns: [{ type: Input }],\n minWidth: [{ type: HostBinding, args: ['style.min-width',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TableDirective, [{\n type: Directive,\n args: [{\n selector: 'table' // tslint:disable-line:directive-selector\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ColumnResizingService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }]; }, { locked: [{\n type: Input\n }], minWidth: [{\n type: HostBinding,\n args: ['style.min-width']\n }], virtualColumns: [{\n type: Input\n }] }); })();\n\nconst exportedModules = [\n ColumnComponent,\n ColumnGroupComponent,\n LogicalCellDirective,\n LogicalRowDirective,\n FocusableDirective,\n FooterTemplateDirective,\n ColGroupComponent,\n ResizableContainerDirective,\n TemplateContextDirective,\n FieldAccessorPipe,\n DetailTemplateDirective,\n SpanColumnComponent,\n TableDirective,\n LoadingComponent\n];\n/**\n * @hidden\n */\nclass SharedModule {\n static exports() {\n return [\n ColumnComponent,\n SpanColumnComponent,\n ColumnGroupComponent,\n FooterTemplateDirective,\n DetailTemplateDirective,\n FocusableDirective\n ];\n }\n}\nSharedModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SharedModule });\nSharedModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SharedModule_Factory(t) { return new (t || SharedModule)(); }, imports: [[CommonModule],\n DraggableModule, EventsModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SharedModule, { declarations: function () { return [ColumnComponent,\n ColumnGroupComponent,\n LogicalCellDirective,\n LogicalRowDirective,\n FocusableDirective,\n FooterTemplateDirective,\n ColGroupComponent,\n ResizableContainerDirective,\n TemplateContextDirective,\n FieldAccessorPipe,\n DetailTemplateDirective,\n SpanColumnComponent,\n TableDirective,\n LoadingComponent]; }, imports: function () { return [CommonModule]; }, exports: function () { return [ColumnComponent,\n ColumnGroupComponent,\n LogicalCellDirective,\n LogicalRowDirective,\n FocusableDirective,\n FooterTemplateDirective,\n ColGroupComponent,\n ResizableContainerDirective,\n TemplateContextDirective,\n FieldAccessorPipe,\n DetailTemplateDirective,\n SpanColumnComponent,\n TableDirective,\n LoadingComponent,\n DraggableModule, EventsModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SharedModule, [{\n type: NgModule,\n args: [{\n declarations: [exportedModules],\n exports: [exportedModules, DraggableModule, EventsModule],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * Represents the `Contains` (**Contains**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass ContainsFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"contains\", localization); }\n}\nContainsFilterOperatorComponent.ɵfac = function ContainsFilterOperatorComponent_Factory(t) { return new (t || ContainsFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nContainsFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ContainsFilterOperatorComponent, selectors: [[\"kendo-filter-contains-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => ContainsFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function ContainsFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nContainsFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ContainsFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => ContainsFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-contains-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `DoesNotContain` (**Does not contain**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass DoesNotContainFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"doesnotcontain\", localization); }\n}\nDoesNotContainFilterOperatorComponent.ɵfac = function DoesNotContainFilterOperatorComponent_Factory(t) { return new (t || DoesNotContainFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nDoesNotContainFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DoesNotContainFilterOperatorComponent, selectors: [[\"kendo-filter-not-contains-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => DoesNotContainFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DoesNotContainFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nDoesNotContainFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DoesNotContainFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => DoesNotContainFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-not-contains-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `EndsWith` (**Ends with**) string filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass EndsWithFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"endswith\", localization); }\n}\nEndsWithFilterOperatorComponent.ɵfac = function EndsWithFilterOperatorComponent_Factory(t) { return new (t || EndsWithFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nEndsWithFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: EndsWithFilterOperatorComponent, selectors: [[\"kendo-filter-endswith-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => EndsWithFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function EndsWithFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nEndsWithFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(EndsWithFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => EndsWithFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-endswith-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `Equal` (**Is equal to**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass EqualFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"eq\", localization); }\n}\nEqualFilterOperatorComponent.ɵfac = function EqualFilterOperatorComponent_Factory(t) { return new (t || EqualFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nEqualFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: EqualFilterOperatorComponent, selectors: [[\"kendo-filter-eq-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => EqualFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function EqualFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nEqualFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(EqualFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => EqualFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-eq-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `IsEmpty` (**Is empty**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass IsEmptyFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"isempty\", localization); }\n}\nIsEmptyFilterOperatorComponent.ɵfac = function IsEmptyFilterOperatorComponent_Factory(t) { return new (t || IsEmptyFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nIsEmptyFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: IsEmptyFilterOperatorComponent, selectors: [[\"kendo-filter-isempty-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsEmptyFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function IsEmptyFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nIsEmptyFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(IsEmptyFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsEmptyFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-isempty-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `IsNotEmpty` (**Is not empty**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass IsNotEmptyFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"isnotempty\", localization); }\n}\nIsNotEmptyFilterOperatorComponent.ɵfac = function IsNotEmptyFilterOperatorComponent_Factory(t) { return new (t || IsNotEmptyFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nIsNotEmptyFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: IsNotEmptyFilterOperatorComponent, selectors: [[\"kendo-filter-isnotempty-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNotEmptyFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function IsNotEmptyFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nIsNotEmptyFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(IsNotEmptyFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNotEmptyFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-isnotempty-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `IsNotNull` (**Is not null**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass IsNotNullFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"isnotnull\", localization); }\n}\nIsNotNullFilterOperatorComponent.ɵfac = function IsNotNullFilterOperatorComponent_Factory(t) { return new (t || IsNotNullFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nIsNotNullFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: IsNotNullFilterOperatorComponent, selectors: [[\"kendo-filter-isnotnull-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNotNullFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function IsNotNullFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nIsNotNullFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(IsNotNullFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNotNullFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-isnotnull-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `IsNull` (**Is null**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass IsNullFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"isnull\", localization); }\n}\nIsNullFilterOperatorComponent.ɵfac = function IsNullFilterOperatorComponent_Factory(t) { return new (t || IsNullFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nIsNullFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: IsNullFilterOperatorComponent, selectors: [[\"kendo-filter-isnull-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNullFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function IsNullFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nIsNullFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(IsNullFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => IsNullFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-isnull-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `NotEqual` (**Is not equal to**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass NotEqualFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"neq\", localization); }\n}\nNotEqualFilterOperatorComponent.ɵfac = function NotEqualFilterOperatorComponent_Factory(t) { return new (t || NotEqualFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nNotEqualFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: NotEqualFilterOperatorComponent, selectors: [[\"kendo-filter-neq-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => NotEqualFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function NotEqualFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nNotEqualFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NotEqualFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => NotEqualFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-neq-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `StartsWith` (**Starts with**) filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass StartsWithFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"startswith\", localization); }\n}\nStartsWithFilterOperatorComponent.ɵfac = function StartsWithFilterOperatorComponent_Factory(t) { return new (t || StartsWithFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nStartsWithFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StartsWithFilterOperatorComponent, selectors: [[\"kendo-filter-startswith-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => StartsWithFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function StartsWithFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nStartsWithFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StartsWithFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => StartsWithFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-startswith-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `Greater` (**Is greater than**) numeric filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass GreaterFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"gt\", localization); }\n}\nGreaterFilterOperatorComponent.ɵfac = function GreaterFilterOperatorComponent_Factory(t) { return new (t || GreaterFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nGreaterFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GreaterFilterOperatorComponent, selectors: [[\"kendo-filter-gt-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => GreaterFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function GreaterFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nGreaterFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GreaterFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => GreaterFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-gt-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/**\n * Represents the `GreaterOrEqualTo` (**Is greater than or equal to**) numeric filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass GreaterOrEqualToFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"gte\", localization); }\n}\nGreaterOrEqualToFilterOperatorComponent.ɵfac = function GreaterOrEqualToFilterOperatorComponent_Factory(t) { return new (t || GreaterOrEqualToFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nGreaterOrEqualToFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GreaterOrEqualToFilterOperatorComponent, selectors: [[\"kendo-filter-gte-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => GreaterOrEqualToFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function GreaterOrEqualToFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nGreaterOrEqualToFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GreaterOrEqualToFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => GreaterOrEqualToFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-gte-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `Less` (**Is less than**) numeric filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass LessFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"lt\", localization); }\n}\nLessFilterOperatorComponent.ɵfac = function LessFilterOperatorComponent_Factory(t) { return new (t || LessFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLessFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: LessFilterOperatorComponent, selectors: [[\"kendo-filter-lt-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => LessFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function LessFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nLessFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LessFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => LessFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-lt-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `LessOrEqualTo` (**Is less than or equal to**) numeric filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass LessOrEqualToFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"lte\", localization); }\n}\nLessOrEqualToFilterOperatorComponent.ɵfac = function LessOrEqualToFilterOperatorComponent_Factory(t) { return new (t || LessOrEqualToFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nLessOrEqualToFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: LessOrEqualToFilterOperatorComponent, selectors: [[\"kendo-filter-lte-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => LessOrEqualToFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function LessOrEqualToFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nLessOrEqualToFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LessOrEqualToFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => LessOrEqualToFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-lte-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `Greater` (**Is after**) date filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass AfterFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"after\", localization); }\n /**\n * @hidden\n */\n toJSON() {\n return {\n text: this.text,\n value: \"gt\"\n };\n }\n}\nAfterFilterOperatorComponent.ɵfac = function AfterFilterOperatorComponent_Factory(t) { return new (t || AfterFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nAfterFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: AfterFilterOperatorComponent, selectors: [[\"kendo-filter-after-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => AfterFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function AfterFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nAfterFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AfterFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => AfterFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-after-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `GreaterOrEqualTo` (**Is after or equal to**) date filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass AfterEqFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"after-eq\", localization); }\n /**\n * @hidden\n */\n toJSON() {\n return {\n text: this.text,\n value: \"gte\"\n };\n }\n}\nAfterEqFilterOperatorComponent.ɵfac = function AfterEqFilterOperatorComponent_Factory(t) { return new (t || AfterEqFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nAfterEqFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: AfterEqFilterOperatorComponent, selectors: [[\"kendo-filter-after-eq-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => AfterEqFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function AfterEqFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nAfterEqFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AfterEqFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => AfterEqFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-after-eq-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `LessOrEqualTo` (**Is before or equal to**) date filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass BeforeEqFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"before-eq\", localization); }\n /**\n * @hidden\n */\n toJSON() {\n return {\n text: this.text,\n value: \"lte\"\n };\n }\n}\nBeforeEqFilterOperatorComponent.ɵfac = function BeforeEqFilterOperatorComponent_Factory(t) { return new (t || BeforeEqFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nBeforeEqFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: BeforeEqFilterOperatorComponent, selectors: [[\"kendo-filter-before-eq-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => BeforeEqFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function BeforeEqFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nBeforeEqFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BeforeEqFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => BeforeEqFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-before-eq-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\n/*\n * Represents the `Less then` (**Is before**) date filter operator.\n *\n * For more information and examples, refer to:\n * * [Setting the default filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-default-filter-operator)\n * * [Setting the order of the filter operators]({% slug builtinfiltertemplate_grid %}#toc-setting-the-order-of-the-filter-operators)\n */\nclass BeforeFilterOperatorComponent extends FilterOperatorBase {\n constructor(localization) { super(\"before\", localization); }\n /**\n * @hidden\n */\n toJSON() {\n return {\n text: this.text,\n value: \"lt\"\n };\n }\n}\nBeforeFilterOperatorComponent.ɵfac = function BeforeFilterOperatorComponent_Factory(t) { return new (t || BeforeFilterOperatorComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nBeforeFilterOperatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: BeforeFilterOperatorComponent, selectors: [[\"kendo-filter-before-operator\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => BeforeFilterOperatorComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function BeforeFilterOperatorComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nBeforeFilterOperatorComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BeforeFilterOperatorComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: FilterOperatorBase,\n useExisting: forwardRef(() => BeforeFilterOperatorComponent)\n }\n ],\n selector: 'kendo-filter-before-operator',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, null); })();\n\nconst FILTER_OPERATORS = [\n FilterCellOperatorsComponent,\n ContainsFilterOperatorComponent,\n DoesNotContainFilterOperatorComponent,\n EndsWithFilterOperatorComponent,\n EqualFilterOperatorComponent,\n IsEmptyFilterOperatorComponent,\n IsNotEmptyFilterOperatorComponent,\n IsNotNullFilterOperatorComponent,\n IsNullFilterOperatorComponent,\n NotEqualFilterOperatorComponent,\n StartsWithFilterOperatorComponent,\n GreaterFilterOperatorComponent,\n GreaterOrEqualToFilterOperatorComponent,\n LessFilterOperatorComponent,\n LessOrEqualToFilterOperatorComponent,\n AfterFilterOperatorComponent,\n AfterEqFilterOperatorComponent,\n BeforeEqFilterOperatorComponent,\n BeforeFilterOperatorComponent\n];\nconst importedModules = [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DropDownListModule,\n AutoCompleteModule,\n InputsModule,\n DatePickerModule,\n PopupModule,\n SharedModule\n];\nconst COMPONENTS = [\n FilterInputDirective\n];\n/**\n * @hidden\n */\nclass SharedFilterModule {\n static exports() {\n return [\n ...FILTER_OPERATORS\n ];\n }\n}\nSharedFilterModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SharedFilterModule });\nSharedFilterModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SharedFilterModule_Factory(t) { return new (t || SharedFilterModule)(); }, imports: [[...importedModules],\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DropDownListModule,\n AutoCompleteModule,\n InputsModule,\n DatePickerModule,\n PopupModule,\n SharedModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SharedFilterModule, { declarations: [FilterCellOperatorsComponent,\n ContainsFilterOperatorComponent,\n DoesNotContainFilterOperatorComponent,\n EndsWithFilterOperatorComponent,\n EqualFilterOperatorComponent,\n IsEmptyFilterOperatorComponent,\n IsNotEmptyFilterOperatorComponent,\n IsNotNullFilterOperatorComponent,\n IsNullFilterOperatorComponent,\n NotEqualFilterOperatorComponent,\n StartsWithFilterOperatorComponent,\n GreaterFilterOperatorComponent,\n GreaterOrEqualToFilterOperatorComponent,\n LessFilterOperatorComponent,\n LessOrEqualToFilterOperatorComponent,\n AfterFilterOperatorComponent,\n AfterEqFilterOperatorComponent,\n BeforeEqFilterOperatorComponent,\n BeforeFilterOperatorComponent,\n FilterInputDirective], imports: [CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DropDownListModule,\n AutoCompleteModule,\n InputsModule,\n DatePickerModule,\n PopupModule,\n SharedModule], exports: [FilterCellOperatorsComponent,\n ContainsFilterOperatorComponent,\n DoesNotContainFilterOperatorComponent,\n EndsWithFilterOperatorComponent,\n EqualFilterOperatorComponent,\n IsEmptyFilterOperatorComponent,\n IsNotEmptyFilterOperatorComponent,\n IsNotNullFilterOperatorComponent,\n IsNullFilterOperatorComponent,\n NotEqualFilterOperatorComponent,\n StartsWithFilterOperatorComponent,\n GreaterFilterOperatorComponent,\n GreaterOrEqualToFilterOperatorComponent,\n LessFilterOperatorComponent,\n LessOrEqualToFilterOperatorComponent,\n AfterFilterOperatorComponent,\n AfterEqFilterOperatorComponent,\n BeforeEqFilterOperatorComponent,\n BeforeFilterOperatorComponent,\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DropDownListModule,\n AutoCompleteModule,\n InputsModule,\n DatePickerModule,\n PopupModule,\n SharedModule,\n FilterInputDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SharedFilterModule, [{\n type: NgModule,\n args: [{\n declarations: [FILTER_OPERATORS, COMPONENTS],\n exports: [FILTER_OPERATORS, importedModules, COMPONENTS],\n imports: [...importedModules]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass FilterHostDirective {\n constructor(host, resolver) {\n this.host = host;\n this.resolver = resolver;\n }\n ngOnInit() {\n this.component = this.host.createComponent(this.resolver.resolveComponentFactory(this.componentType()));\n this.initComponent({\n column: this.column,\n filter: this.filter\n });\n }\n ngOnDestroy() {\n if (this.component) {\n this.component.destroy();\n this.component = null;\n }\n }\n ngOnChanges(changes) {\n if (anyChanged([\"column\", \"filter\"], changes)) {\n this.initComponent({\n column: this.column,\n filter: this.filter\n });\n }\n }\n initComponent({ column, filter: filter$$1 }) {\n const instance = this.component.instance;\n instance.column = column;\n instance.filter = filter$$1;\n }\n}\nFilterHostDirective.ɵfac = function FilterHostDirective_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nFilterHostDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterHostDirective, inputs: { column: \"column\", filter: \"filter\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\nFilterHostDirective.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }]\n};\n\n\n/**\n * @hidden\n *\n * > List the following components in the GridModule as `entryComponents`.\n */\nconst filterComponentFactory = (type) => ({\n \"boolean\": BooleanFilterCellComponent,\n \"date\": DateFilterCellComponent,\n \"numeric\": NumericFilterCellComponent,\n \"text\": StringFilterCellComponent\n}[type]);\n\n/**\n * @hidden\n */\nclass FilterCellHostDirective extends FilterHostDirective {\n constructor(host, resolver) {\n super(host, resolver);\n }\n componentType() {\n if (!isNullOrEmptyString(this.column.filter)) {\n return filterComponentFactory(this.column.filter);\n }\n return StringFilterCellComponent;\n }\n}\nFilterCellHostDirective.ɵfac = function FilterCellHostDirective_Factory(t) { return new (t || FilterCellHostDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ComponentFactoryResolver)); };\nFilterCellHostDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterCellHostDirective, selectors: [[\"\", \"kendoFilterCellHost\", \"\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nFilterCellHostDirective.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: ComponentFactoryResolver }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterCellHostDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoFilterCellHost]'\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: ɵngcc0.ComponentFactoryResolver }]; }, null); })();\n\nconst INTERNAL_COMPONENTS = [\n FilterRowComponent,\n FilterCellComponent,\n FilterCellTemplateDirective,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n AutoCompleteFilterCellComponent,\n BooleanFilterCellComponent,\n FilterCellHostDirective,\n FilterCellWrapperComponent,\n DateFilterCellComponent\n];\nconst ENTRY_COMPONENTS = [\n StringFilterCellComponent,\n NumericFilterCellComponent,\n BooleanFilterCellComponent,\n DateFilterCellComponent\n];\n/**\n * @hidden\n */\nclass RowFilterModule {\n static exports() {\n return [\n FilterRowComponent,\n FilterCellComponent,\n FilterCellTemplateDirective,\n FilterCellOperatorsComponent,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n AutoCompleteFilterCellComponent,\n BooleanFilterCellComponent,\n DateFilterCellComponent,\n SharedFilterModule.exports()\n ];\n }\n}\nRowFilterModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: RowFilterModule });\nRowFilterModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function RowFilterModule_Factory(t) { return new (t || RowFilterModule)(); }, imports: [[SharedFilterModule],\n SharedFilterModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(RowFilterModule, { declarations: [FilterRowComponent,\n FilterCellComponent,\n FilterCellTemplateDirective,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n AutoCompleteFilterCellComponent,\n BooleanFilterCellComponent,\n FilterCellHostDirective,\n FilterCellWrapperComponent,\n DateFilterCellComponent], imports: [SharedFilterModule], exports: [FilterRowComponent,\n FilterCellComponent,\n FilterCellTemplateDirective,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n AutoCompleteFilterCellComponent,\n BooleanFilterCellComponent,\n FilterCellHostDirective,\n FilterCellWrapperComponent,\n DateFilterCellComponent,\n SharedFilterModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(RowFilterModule, [{\n type: NgModule,\n args: [{\n declarations: [INTERNAL_COMPONENTS],\n entryComponents: ENTRY_COMPONENTS,\n exports: [INTERNAL_COMPONENTS, SharedFilterModule],\n imports: [SharedFilterModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nconst normalizeSettings = ({ buttonCount = 10, info = true, type = 'numeric', pageSizes = false, previousNext = true }) => ({\n buttonCount,\n info,\n pageSizes: pageSizes === true ? [5, 10, 20] : pageSizes,\n previousNext,\n type\n});\n/**\n * @hidden\n */\nconst normalize = (settings) => normalizeSettings(settings === true ? {} : settings);\n\n/**\n * @hidden\n */\nclass PagerComponent {\n constructor(pagerContext) {\n this.pagerContext = pagerContext;\n this.total = 0;\n this.skip = 1;\n this.pageChange = new EventEmitter();\n this.settings = normalize({});\n this._templateContext = {};\n }\n set options(value) {\n this.settings = normalize(value);\n }\n get pagerWrapClass() {\n return true;\n }\n get gridPagerClass() {\n return true;\n }\n get widgetClass() {\n return true;\n }\n get totalPages() {\n return Math.ceil((this.total || 0) / this.pageSize);\n }\n get currentPage() {\n return Math.floor((this.skip || 0) / this.pageSize) + 1;\n }\n get templateContext() {\n const context = this._templateContext;\n context.totalPages = this.totalPages;\n context.total = this.total;\n context.skip = this.skip;\n context.pageSize = this.pageSize;\n context.currentPage = this.currentPage;\n return context;\n }\n ngOnInit() {\n this.pageChangeSubscription = this.pagerContext.pageChange.subscribe(this.changePage.bind(this));\n }\n ngOnChanges(changes) {\n if (anyChanged(['pageSize', 'skip', 'total'], changes, false)) {\n this.pagerContext.notifyChanges({\n pageSize: this.pageSize,\n skip: this.skip,\n total: this.total\n });\n }\n }\n ngOnDestroy() {\n if (this.pageChangeSubscription) {\n this.pageChangeSubscription.unsubscribe();\n }\n }\n changePage(event) {\n this.pageChange.emit(event);\n }\n}\nPagerComponent.ɵfac = function PagerComponent_Factory(t) { return new (t || PagerComponent)(ɵngcc0.ɵɵdirectiveInject(PagerContextService)); };\nPagerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerComponent, selectors: [[\"kendo-pager\"]], hostVars: 6, hostBindings: function PagerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-pager-wrap\", ctx.pagerWrapClass)(\"k-grid-pager\", ctx.gridPagerClass)(\"k-widget\", ctx.widgetClass);\n } }, inputs: { total: \"total\", skip: \"skip\", options: \"options\", pageSize: \"pageSize\", template: \"template\" }, outputs: { pageChange: \"pageChange\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 2, vars: 2, consts: [[3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\", 4, \"ngIf\"], [4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [3, \"buttonCount\", 4, \"ngIf\"], [3, \"pageSizes\", 4, \"ngIf\"], [3, \"buttonCount\"], [3, \"pageSizes\"]], template: function PagerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, PagerComponent_ng_container_0_Template, 1, 2, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(1, PagerComponent_ng_container_1_Template, 7, 6, \"ng-container\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.template == null ? null : ctx.template.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !(ctx.template == null ? null : ctx.template.templateRef));\n } }, directives: function () { return [ɵngcc5.NgIf, ɵngcc5.NgTemplateOutlet, PagerPrevButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerNextButtonsComponent,\n PagerInfoComponent,\n PagerPageSizesComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nPagerComponent.ctorParameters = () => [\n { type: PagerContextService }\n];\nPagerComponent.propDecorators = {\n total: [{ type: Input }],\n skip: [{ type: Input }],\n pageSize: [{ type: Input }],\n options: [{ type: Input }],\n template: [{ type: Input }],\n pageChange: [{ type: Output }],\n pagerWrapClass: [{ type: HostBinding, args: ['class.k-pager-wrap',] }],\n gridPagerClass: [{ type: HostBinding, args: ['class.k-grid-pager',] }],\n widgetClass: [{ type: HostBinding, args: ['class.k-widget',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-pager',\n template: `\n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: PagerContextService }]; }, { total: [{\n type: Input\n }], skip: [{\n type: Input\n }], pageChange: [{\n type: Output\n }], options: [{\n type: Input\n }], pagerWrapClass: [{\n type: HostBinding,\n args: ['class.k-pager-wrap']\n }], gridPagerClass: [{\n type: HostBinding,\n args: ['class.k-grid-pager']\n }], widgetClass: [{\n type: HostBinding,\n args: ['class.k-widget']\n }], pageSize: [{\n type: Input\n }], template: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass PagerElementComponent {\n constructor(localization, pagerContext, cd) {\n this.localization = localization;\n this.pagerContext = pagerContext;\n this.cd = cd;\n this.total = this.pagerContext.total;\n this.skip = this.pagerContext.skip;\n this.pageSize = this.pagerContext.pageSize;\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {number}\n * @memberOf PagerElementComponent\n */\n get currentPage() {\n return Math.floor((this.skip || 0) / this.pageSize) + 1;\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {number}\n * @memberOf PagerElementComponent\n */\n get totalPages() {\n return Math.ceil((this.total || 0) / this.pageSize);\n }\n /**\n * @hidden\n *\n * @param {string} key\n * @returns {string}\n *\n * @memberOf PagerElementComponent\n */\n textFor(key) {\n return this.localization.get(key);\n }\n /**\n * @hidden\n *\n * @param {number} page\n *\n * @memberOf PagerElementComponent\n */\n changePage(page) {\n this.pagerContext.changePage(page);\n return false;\n }\n /**\n * @hidden\n *\n * @memberOf PagerElementComponent\n */\n ngOnInit() {\n this.subscriptions = this.pagerContext.changes.subscribe(this.onChanges.bind(this));\n this.subscriptions.add(this.localization.changes.subscribe(() => this.cd.markForCheck()));\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n}\nPagerElementComponent.ɵfac = function PagerElementComponent_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nPagerElementComponent.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PagerElementComponent });\n\n\n// tslint:disable:no-access-missing-member\n/**\n * Displays buttons for navigating to the first and to the previous page ([see example]({% slug paging_grid %}#toc-pager-templates)).\n */\nclass PagerPrevButtonsComponent extends PagerElementComponent {\n constructor(localization, pagerContext, cd) {\n super(localization, pagerContext, cd);\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {boolean}\n * @memberOf PagerPrevButtonsComponent\n */\n get disabled() {\n return this.currentPage === 1 || !this.total;\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = pageSize;\n this.cd.markForCheck();\n }\n}\nPagerPrevButtonsComponent.ɵfac = function PagerPrevButtonsComponent_Factory(t) { return new (t || PagerPrevButtonsComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(PagerContextService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nPagerPrevButtonsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerPrevButtonsComponent, selectors: [[\"kendo-pager-prev-buttons\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 4, vars: 14, consts: [[\"href\", \"#\", \"tabindex\", \"-1\", 3, \"title\", \"ngClass\", \"click\"], [3, \"ngClass\"]], template: function PagerPrevButtonsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"a\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function PagerPrevButtonsComponent_Template_a_click_0_listener() { return ctx.currentPage !== 1 ? ctx.changePage(0) : false; });\n ɵngcc0.ɵɵelement(1, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"a\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function PagerPrevButtonsComponent_Template_a_click_2_listener() { return ctx.currentPage !== 1 ? ctx.changePage(ctx.currentPage - 2) : false; });\n ɵngcc0.ɵɵelement(3, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"title\", ctx.textFor(\"pagerFirstPage\"))(\"ngClass\", ɵngcc0.ɵɵpureFunction1(8, _c131, ctx.disabled));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(10, _c132));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx.textFor(\"pagerFirstPage\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"title\", ctx.textFor(\"pagerPreviousPage\"))(\"ngClass\", ɵngcc0.ɵɵpureFunction1(11, _c133, ctx.disabled));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(13, _c134));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx.textFor(\"pagerPreviousPage\"));\n } }, directives: [ɵngcc5.NgClass], encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nPagerPrevButtonsComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: PagerContextService },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerPrevButtonsComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-pager-prev-buttons',\n template: `\n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: PagerContextService }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\n// tslint:disable: no-access-missing-member\n/**\n * Displays buttons for navigating to the next and to the last page ([see example]({% slug paging_grid %}#toc-pager-template)).\n */\nclass PagerNextButtonsComponent extends PagerElementComponent {\n constructor(localization, pagerContext, cd) {\n super(localization, pagerContext, cd);\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {boolean}\n * @memberOf PagerNextButtonsComponent\n */\n get disabled() {\n return this.currentPage === this.totalPages || !this.total;\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = pageSize;\n this.cd.markForCheck();\n }\n}\nPagerNextButtonsComponent.ɵfac = function PagerNextButtonsComponent_Factory(t) { return new (t || PagerNextButtonsComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(PagerContextService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nPagerNextButtonsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerNextButtonsComponent, selectors: [[\"kendo-pager-next-buttons\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 4, vars: 14, consts: [[\"href\", \"#\", \"tabindex\", \"-1\", 3, \"title\", \"ngClass\", \"click\"], [3, \"ngClass\"]], template: function PagerNextButtonsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"a\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function PagerNextButtonsComponent_Template_a_click_0_listener() { return ctx.currentPage !== ctx.totalPages ? ctx.changePage(ctx.currentPage) : false; });\n ɵngcc0.ɵɵelement(1, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"a\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function PagerNextButtonsComponent_Template_a_click_2_listener() { return ctx.currentPage !== ctx.totalPages ? ctx.changePage(ctx.totalPages - 1) : false; });\n ɵngcc0.ɵɵelement(3, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"title\", ctx.textFor(\"pagerNextPage\"))(\"ngClass\", ɵngcc0.ɵɵpureFunction1(8, _c133, ctx.disabled));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(10, _c135));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx.textFor(\"pagerNextPage\"));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"title\", ctx.textFor(\"pagerLastPage\"))(\"ngClass\", ɵngcc0.ɵɵpureFunction1(11, _c136, ctx.disabled));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(13, _c137));\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx.textFor(\"pagerLastPage\"));\n } }, directives: [ɵngcc5.NgClass], encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nPagerNextButtonsComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: PagerContextService },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerNextButtonsComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-pager-next-buttons',\n template: `\n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: PagerContextService }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\n/**\n * Displays numeric buttons to enable navigation between the pages.\n */\nclass PagerNumericButtonsComponent extends PagerElementComponent {\n constructor(localization, cd, pagerContext) {\n super(localization, pagerContext, cd);\n this.pagerContext = pagerContext;\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {number[]}\n * @memberOf PagerNumericButtonsComponent\n */\n get buttons() {\n let result = [];\n for (let idx = this.start; idx <= this.end; idx++) {\n result.push(idx);\n }\n return result;\n }\n /**\n * @hidden\n */\n get end() {\n return Math.min((this.start + this.buttonCount) - 1, this.totalPages);\n }\n /**\n * @hidden\n */\n get start() {\n const page = this.currentPage;\n const buttonCount = this.buttonCount;\n if (page > buttonCount) {\n const reminder = (page % buttonCount);\n return (reminder === 0) ? (page - buttonCount) + 1 : (page - reminder) + 1;\n }\n return 1;\n }\n /**\n * @hidden\n */\n pageLabel(num) {\n const pageText = this.textFor('pagerPage');\n if (pageText) {\n return pageText + ' ' + num;\n }\n return num.toString();\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = pageSize;\n this.cd.markForCheck();\n }\n}\nPagerNumericButtonsComponent.ɵfac = function PagerNumericButtonsComponent_Factory(t) { return new (t || PagerNumericButtonsComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(PagerContextService)); };\nPagerNumericButtonsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerNumericButtonsComponent, selectors: [[\"kendo-pager-numeric-buttons\"]], inputs: { buttonCount: \"buttonCount\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 4, vars: 5, consts: [[3, \"ngClass\"], [4, \"ngIf\"], [4, \"ngFor\", \"ngForOf\"], [\"href\", \"#\", \"tabindex\", \"-1\", 1, \"k-link\", 3, \"click\"], [\"href\", \"#\", \"tabindex\", \"-1\", 3, \"ngClass\", \"click\"]], template: function PagerNumericButtonsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"ul\", 0);\n ɵngcc0.ɵɵtemplate(1, PagerNumericButtonsComponent_li_1_Template, 3, 1, \"li\", 1);\n ɵngcc0.ɵɵtemplate(2, PagerNumericButtonsComponent_li_2_Template, 3, 5, \"li\", 2);\n ɵngcc0.ɵɵtemplate(3, PagerNumericButtonsComponent_li_3_Template, 3, 1, \"li\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(4, _c139));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.start > 1);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.buttons);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.end < ctx.totalPages);\n } }, directives: [ɵngcc5.NgClass, ɵngcc5.NgIf, ɵngcc5.NgForOf], encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nPagerNumericButtonsComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: PagerContextService }\n];\nPagerNumericButtonsComponent.propDecorators = {\n buttonCount: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerNumericButtonsComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-pager-numeric-buttons',\n template: `\n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: PagerContextService }]; }, { buttonCount: [{\n type: Input\n }] }); })();\n\n/**\n * Displays an input element which allows the typing and rendering of page numbers.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n *\n * \n * \n * \n * \n * \n * \n * \n *\n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": false\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": true\n * }\n * ];\n * }\n *\n * ```\n */\nclass PagerInputComponent extends PagerElementComponent {\n constructor(localization, pagerContext, zone, cd) {\n super(localization, pagerContext, cd);\n this.pagerContext = pagerContext;\n this.zone = zone;\n /**\n * @hidden\n *\n * @param {string} value\n *\n * @memberOf PagerInputComponent\n */\n this.handleKeyDown = (event) => {\n let incomingValue = this.numericInput.value || this.current;\n if (event.keyCode === Keys.Enter) {\n event.preventDefault();\n if (incomingValue !== this.current) {\n this.zone.run(() => {\n this.changePage(incomingValue - 1);\n });\n }\n }\n };\n /**\n * @hidden\n *\n * @param {string} value\n *\n * @memberOf PagerInputComponent\n */\n this.handleBlur = () => {\n const inputValue = this.numericInput.value;\n if (!inputValue) {\n this.numericInput.writeValue(this.current);\n return;\n }\n if (inputValue !== this.current) {\n this.zone.run(() => {\n this.changePage(inputValue - 1);\n });\n }\n };\n }\n /**\n * @hidden\n */\n get current() {\n return this.hasPages ? this.currentPage : 0;\n }\n get hasPages() {\n return this.totalPages !== 0;\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = pageSize;\n this.cd.markForCheck();\n }\n}\nPagerInputComponent.ɵfac = function PagerInputComponent_Factory(t) { return new (t || PagerInputComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(PagerContextService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nPagerInputComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerInputComponent, selectors: [[\"kendo-pager-input\"]], viewQuery: function PagerInputComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(NumericTextBoxComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.numericInput = _t.first);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 4, vars: 17, consts: [[3, \"ngClass\"], [\"format\", \"n0\", 3, \"spinners\", \"decimals\", \"disabled\", \"value\", \"min\", \"max\", \"autoCorrect\", \"title\", \"kendoEventsOutsideAngular\"]], template: function PagerInputComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 0);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelement(2, \"kendo-numerictextbox\", 1);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction0(13, _c140));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.textFor(\"pagerPage\"), \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"spinners\", false)(\"decimals\", 0)(\"disabled\", !ctx.hasPages)(\"value\", ctx.current)(\"min\", ctx.hasPages ? 1 : 0)(\"max\", ctx.totalPages)(\"autoCorrect\", true)(\"title\", ctx.textFor(\"pagerPageNumberInputTitle\"))(\"kendoEventsOutsideAngular\", ɵngcc0.ɵɵpureFunction2(14, _c141, ctx.handleKeyDown, ctx.handleBlur));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate2(\" \", ctx.textFor(\"pagerOf\"), \" \", ctx.totalPages, \" \");\n } }, directives: [ɵngcc5.NgClass, ɵngcc6.NumericTextBoxComponent, ɵngcc2.EventsOutsideAngularDirective], encapsulation: 2 });\n/** @nocollapse */\nPagerInputComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: PagerContextService },\n { type: NgZone },\n { type: ChangeDetectorRef }\n];\nPagerInputComponent.propDecorators = {\n numericInput: [{ type: ViewChild, args: [NumericTextBoxComponent,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerInputComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-pager-input',\n template: `\n \n {{textFor('pagerPage')}}\n \n \n {{textFor('pagerOf')}} {{totalPages}}\n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: PagerContextService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }]; }, { numericInput: [{\n type: ViewChild,\n args: [NumericTextBoxComponent]\n }] }); })();\n\n// tslint:disable:no-access-missing-member\n/**\n * Displays information about the current page and the total number of records ([see example]({% slug paging_grid %}#toc-pager-templates)).\n */\nclass PagerInfoComponent extends PagerElementComponent {\n constructor(localization, cd, pagerContext) {\n super(localization, pagerContext, cd);\n this.pagerContext = pagerContext;\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {number}\n * @memberOf PagerInfoComponent\n */\n get maxItems() {\n return Math.min(this.currentPage * this.pageSize, this.total);\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {number}\n * @memberOf PagerInfoComponent\n */\n get currentPageText() {\n return this.total ?\n (this.currentPage - 1) * this.pageSize + 1 :\n 0;\n }\n /**\n * @hidden\n *\n * @readonly\n * @type {boolean}\n * @memberOf PagerInfoComponent\n */\n get classes() {\n return true;\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = pageSize;\n this.cd.markForCheck();\n }\n}\nPagerInfoComponent.ɵfac = function PagerInfoComponent_Factory(t) { return new (t || PagerInfoComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(PagerContextService)); };\nPagerInfoComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerInfoComponent, selectors: [[\"kendo-pager-info\"]], hostVars: 4, hostBindings: function PagerInfoComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-pager-info\", ctx.classes)(\"k-label\", ctx.classes);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 1, vars: 5, template: function PagerInfoComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n } if (rf & 2) {\n ɵngcc0.ɵɵtextInterpolate5(\"\", ctx.currentPageText, \" - \", ctx.maxItems, \" \", ctx.textFor(\"pagerOf\"), \" \", ctx.total, \" \", ctx.textFor(\"pagerItems\"), \"\");\n } }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nPagerInfoComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: PagerContextService }\n];\nPagerInfoComponent.propDecorators = {\n classes: [{ type: HostBinding, args: [\"class.k-pager-info\",] }, { type: HostBinding, args: [\"class.k-label\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerInfoComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-pager-info',\n template: `{{currentPageText}} - {{maxItems}} {{textFor('pagerOf')}} {{total}} {{textFor('pagerItems')}}`\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: PagerContextService }]; }, { classes: [{\n type: HostBinding,\n args: [\"class.k-pager-info\"]\n }, {\n type: HostBinding,\n args: [\"class.k-label\"]\n }] }); })();\n\n// tslint:disable:no-access-missing-member\n/**\n * Displays a drop-down list for the page size selection ([see example]({% slug paging_grid %}#toc-pager-templates)).\n */\nclass PagerPageSizesComponent extends PagerElementComponent {\n constructor(localization, cd, pagerContext) {\n super(localization, pagerContext, cd);\n this.pagerContext = pagerContext;\n this._pageSizes = [];\n }\n get pageSizes() {\n return this._pageSizes;\n }\n /**\n * The page sizes collection. Can be an Array of numbers and/or PageSizeItem objects.\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public gridData: any[] = products;\n * public pageSize = 2;\n * public pagesizes = [{text: 'One', value: 1}, {text: 'Two', value: 2}, {text: 'All', value : 'all'}];\n * }\n *\n * const products = [{\n * 'ProductID' : 1,\n * 'ProductName' : \"Chai\",\n * 'SupplierID' : 1,\n * 'CategoryID' : 1,\n * 'QuantityPerUnit' : \"10 boxes x 20 bags\",\n * 'UnitPrice' : 18.0000,\n * 'UnitsInStock' : 39,\n * 'UnitsOnOrder' : 0,\n * 'ReorderLevel' : 10,\n * 'Discontinued' : false\n *\n * }, {\n * 'ProductID' : 2,\n * 'ProductName' : \"Chang\",\n * 'SupplierID' : 1,\n * 'CategoryID' : 1,\n * 'QuantityPerUnit' : \"24 - 12 oz bottles\",\n * 'UnitPrice' : 19.0000,\n * 'UnitsInStock' : 17,\n * 'UnitsOnOrder' : 40,\n * 'ReorderLevel' : 25,\n * 'Discontinued' : false\n * }, {\n * 'ProductID' : 3,\n * 'ProductName' : \"Aniseed Syrup\",\n * 'SupplierID' : 1,\n * 'CategoryID' : 2,\n * 'QuantityPerUnit' : \"12 - 550 ml bottles\",\n * 'UnitPrice' : 10.0000,\n * 'UnitsInStock' : 13,\n * 'UnitsOnOrder' : 70,\n * 'ReorderLevel' : 25,\n * 'Discontinued' : false\n * }, {\n * 'ProductID' : 4,\n * 'ProductName' : \"Chef Anton\\'s Cajun Seasoning\",\n * 'SupplierID' : 2,\n * 'CategoryID' : 2,\n * 'QuantityPerUnit' : \"48 - 6 oz jars\",\n * 'UnitPrice' : 22.0000,\n * 'UnitsInStock' : 53,\n * 'UnitsOnOrder' : 0,\n * 'ReorderLevel' : 0,\n * 'Discontinued' : false\n * }, {\n * 'ProductID' : 5,\n * 'ProductName' : \"Chef Anton\\'s Gumbo Mix\",\n * 'SupplierID' : 2,\n * 'CategoryID' : 2,\n * 'QuantityPerUnit' : \"36 boxes\",\n * 'UnitPrice' : 21.3500,\n * 'UnitsInStock' : 0,\n * 'UnitsOnOrder' : 0,\n * 'ReorderLevel' : 0,\n * 'Discontinued' : true\n * }, {\n * 'ProductID' : 6,\n * 'ProductName' : \"Grandma\\'s Boysenberry Spread\",\n * 'SupplierID' : 3,\n * 'CategoryID' : 2,\n * 'QuantityPerUnit' : \"12 - 8 oz jars\",\n * 'UnitPrice' : 25.0000,\n * 'UnitsInStock' : 120,\n * 'UnitsOnOrder' : 0,\n * 'ReorderLevel' : 25,\n * 'Discontinued' : false\n * }];\n * ```\n */\n set pageSizes(pageSizes) {\n const normalizedItems = [];\n pageSizes.forEach(item => {\n if (typeof item === 'number') {\n normalizedItems.push({\n text: item.toString(),\n value: item\n });\n }\n else {\n normalizedItems.push(item);\n }\n });\n this._pageSizes = normalizedItems;\n }\n /**\n * @hidden\n *\n * @readonly\n */\n get classes() {\n return true;\n }\n /**\n * @hidden\n *\n * @readonly\n */\n get showInitialPageSize() {\n return this.pageSizes\n .filter(item => {\n if (typeof item.value === 'number') {\n return item.value === Number(this.pageSize);\n }\n return this.total === Number(this.pageSize);\n })\n .length === 0;\n }\n /**\n * @hidden\n */\n pageSizeChange(value) {\n this.pageSize = parseInt(value, 10);\n this.pagerContext.changePageSize(this.pageSize);\n }\n /**\n * @hidden\n */\n getValue(page) {\n return typeof page.value === 'number' ? page.value : this.total;\n }\n /**\n * @hidden\n */\n getSelectedState(page) {\n if (typeof page.value === 'number') {\n return page.value === this.pageSize ? true : undefined;\n }\n return this.pageSize === this.total;\n }\n onChanges({ total, skip, pageSize }) {\n this.total = total;\n this.skip = skip;\n this.pageSize = typeof pageSize === 'number' ? pageSize : this.total;\n this.cd.markForCheck();\n }\n}\nPagerPageSizesComponent.ɵfac = function PagerPageSizesComponent_Factory(t) { return new (t || PagerPageSizesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(PagerContextService)); };\nPagerPageSizesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PagerPageSizesComponent, selectors: [[\"kendo-pager-page-sizes\"]], hostVars: 4, hostBindings: function PagerPageSizesComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-pager-sizes\", ctx.classes)(\"k-label\", ctx.classes);\n } }, inputs: { pageSizes: \"pageSizes\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 5, vars: 4, consts: [[3, \"change\"], [\"select\", \"\"], [3, \"value\", 4, \"ngIf\"], [3, \"value\", \"selected\", 4, \"ngFor\", \"ngForOf\"], [3, \"value\"], [3, \"value\", \"selected\"]], template: function PagerPageSizesComponent_Template(rf, ctx) { if (rf & 1) {\n const _r222 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"select\", 0, 1);\n ɵngcc0.ɵɵlistener(\"change\", function PagerPageSizesComponent_Template_select_change_0_listener() { ɵngcc0.ɵɵrestoreView(_r222); const _r218 = ɵngcc0.ɵɵreference(1); return ctx.pageSizeChange(_r218.value); });\n ɵngcc0.ɵɵtemplate(2, PagerPageSizesComponent_option_2_Template, 2, 2, \"option\", 2);\n ɵngcc0.ɵɵtemplate(3, PagerPageSizesComponent_option_3_Template, 2, 3, \"option\", 3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtext(4);\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx.textFor(\"pagerItemsPerPage\"));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showInitialPageSize);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.pageSizes);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.textFor(\"pagerItemsPerPage\"), \" \");\n } }, directives: [ɵngcc5.NgIf, ɵngcc5.NgForOf], encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nPagerPageSizesComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ChangeDetectorRef },\n { type: PagerContextService }\n];\nPagerPageSizesComponent.propDecorators = {\n pageSizes: [{ type: Input }],\n classes: [{ type: HostBinding, args: ['class.k-pager-sizes',] }, { type: HostBinding, args: ['class.k-label',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerPageSizesComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-pager-page-sizes',\n template: `\n \n {{ textFor('pagerItemsPerPage') }}\n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }, { type: PagerContextService }]; }, { pageSizes: [{\n type: Input\n }], classes: [{\n type: HostBinding,\n args: ['class.k-pager-sizes']\n }, {\n type: HostBinding,\n args: ['class.k-label']\n }] }); })();\n\nconst importedModules$1 = [\n CommonModule,\n InputsModule,\n SharedModule\n];\nconst INTERNAL_COMPONENTS$1 = [\n PagerComponent,\n PagerPrevButtonsComponent,\n PagerNextButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerInfoComponent,\n PagerPageSizesComponent,\n PagerTemplateDirective\n];\n/**\n * @hidden\n */\nclass PagerModule {\n static exports() {\n return [\n PagerComponent,\n PagerPrevButtonsComponent,\n PagerNextButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerInfoComponent,\n PagerPageSizesComponent,\n PagerTemplateDirective\n ];\n }\n}\nPagerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: PagerModule });\nPagerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function PagerModule_Factory(t) { return new (t || PagerModule)(); }, imports: [[...importedModules$1]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(PagerModule, { declarations: [PagerComponent,\n PagerPrevButtonsComponent,\n PagerNextButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerInfoComponent,\n PagerPageSizesComponent,\n PagerTemplateDirective], imports: [CommonModule,\n InputsModule,\n SharedModule], exports: [PagerComponent,\n PagerPrevButtonsComponent,\n PagerNextButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerInfoComponent,\n PagerPageSizesComponent,\n PagerTemplateDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PagerModule, [{\n type: NgModule,\n args: [{\n declarations: [INTERNAL_COMPONENTS$1],\n exports: [INTERNAL_COMPONENTS$1],\n imports: [...importedModules$1]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass GroupHeaderComponent {\n constructor(groupsService, groupInfoService) {\n this.groupsService = groupsService;\n this.groupInfoService = groupInfoService;\n this.skipGroupDecoration = false;\n this.hasDetails = false;\n this.totalColumnsCount = 0;\n this.groups = [];\n this.isExpanded = false;\n }\n get groupItemClass() {\n return true;\n }\n ngDoCheck() {\n this.isExpanded = this.groupsService.isExpanded(this.item.index);\n }\n prefixGroupCell(item) {\n return new Array(item.level);\n }\n toggleGroup(item) {\n this.groupsService.toggleRow(item.index, item.data);\n return false;\n }\n groupSpan(item) {\n const groupCount = (this.groups || []).length;\n const detailOffset = this.hasDetails ? 1 : 0;\n if (this.hasGroupHeaderColumn) {\n return groupCount + 1 + detailOffset - item.level;\n }\n let columnCount = columnsSpan(this.columns);\n if (this.skipGroupDecoration) {\n return columnCount;\n }\n return groupCount + columnCount + detailOffset - item.level;\n }\n logicalColSpan() {\n return this.skipGroupDecoration ? 1 : this.totalColumnsCount;\n }\n ariaRole() {\n if (this.skipGroupDecoration) {\n return 'presentation';\n }\n return 'gridcell';\n }\n formatForGroup(item) {\n return this.groupInfoService.formatForGroup(item);\n }\n groupTitle(item) {\n return this.groupInfoService.groupTitle(item);\n }\n groupHeaderTemplate(item) {\n return this.groupInfoService.groupHeaderTemplate(item);\n }\n}\nGroupHeaderComponent.ɵfac = function GroupHeaderComponent_Factory(t) { return new (t || GroupHeaderComponent)(ɵngcc0.ɵɵdirectiveInject(GroupsService), ɵngcc0.ɵɵdirectiveInject(GroupInfoService)); };\nGroupHeaderComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GroupHeaderComponent, selectors: [[\"\", \"kendoGridGroupHeader\", \"\"]], hostVars: 2, hostBindings: function GroupHeaderComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grouping-row\", ctx.groupItemClass);\n } }, inputs: { skipGroupDecoration: \"skipGroupDecoration\", hasDetails: \"hasDetails\", totalColumnsCount: \"totalColumnsCount\", groups: \"groups\", rowIndex: \"rowIndex\", logicalRowIndex: \"logicalRowIndex\", item: \"item\", hasGroupHeaderColumn: \"hasGroupHeaderColumn\", groupHeaderColumns: \"groupHeaderColumns\", columns: \"columns\" }, attrs: _c142, decls: 3, vars: 3, consts: [[3, \"ngIf\"], [\"aria-selected\", \"false\", \"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"logicalSlaveCell\", \"groupItem\", \"colSpan\", 4, \"ngIf\"], [4, \"ngIf\"], [\"class\", \"k-group-cell\", \"role\", \"presentation\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\", 1, \"k-group-cell\"], [\"aria-selected\", \"false\", \"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"logicalSlaveCell\", \"groupItem\", \"colSpan\"], [1, \"k-reset\"], [\"href\", \"#\", \"tabindex\", \"-1\", \"role\", \"presentation\", 1, \"k-icon\", 3, \"ngClass\", \"click\"], [3, \"templateContext\"], [\"role\", \"gridcell\", \"aria-selected\", \"false\", \"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"logicalSlaveCell\", \"groupItem\", \"colSpan\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"gridcell\", \"aria-selected\", \"false\", \"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"logicalSlaveCell\", \"groupItem\", \"colSpan\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\", 4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function GroupHeaderComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, GroupHeaderComponent_ng_template_0_Template, 1, 1, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(1, GroupHeaderComponent_td_1_Template, 3, 9, \"td\", 1);\n ɵngcc0.ɵɵtemplate(2, GroupHeaderComponent_ng_container_2_Template, 2, 1, \"ng-container\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.skipGroupDecoration);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !(ctx.skipGroupDecoration && ctx.hasGroupHeaderColumn));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasGroupHeaderColumn);\n } }, directives: [ɵngcc5.NgIf, ɵngcc5.NgForOf, LogicalCellDirective, ɵngcc5.NgClass, TemplateContextDirective, ɵngcc5.NgTemplateOutlet], pipes: [FieldAccessorPipe], encapsulation: 2 });\n/** @nocollapse */\nGroupHeaderComponent.ctorParameters = () => [\n { type: GroupsService },\n { type: GroupInfoService }\n];\nGroupHeaderComponent.propDecorators = {\n rowIndex: [{ type: Input }],\n logicalRowIndex: [{ type: Input }],\n item: [{ type: Input }],\n skipGroupDecoration: [{ type: Input }],\n hasDetails: [{ type: Input }],\n totalColumnsCount: [{ type: Input }],\n hasGroupHeaderColumn: [{ type: Input }],\n groupHeaderColumns: [{ type: Input }],\n columns: [{ type: Input }],\n groups: [{ type: Input }],\n groupItemClass: [{ type: HostBinding, args: ['class.k-grouping-row',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupHeaderComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridGroupHeader]',\n template: `\n \n \n \n \n

\n \n \n \n \n {{groupTitle(item)}}: {{item.data | valueOf:\"value\": formatForGroup(item)}}\n \n \n \n \n

\n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: GroupsService }, { type: GroupInfoService }]; }, { skipGroupDecoration: [{\n type: Input\n }], hasDetails: [{\n type: Input\n }], totalColumnsCount: [{\n type: Input\n }], groups: [{\n type: Input\n }], groupItemClass: [{\n type: HostBinding,\n args: ['class.k-grouping-row']\n }], rowIndex: [{\n type: Input\n }], logicalRowIndex: [{\n type: Input\n }], item: [{\n type: Input\n }], hasGroupHeaderColumn: [{\n type: Input\n }], groupHeaderColumns: [{\n type: Input\n }], columns: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass DropTargetDirective {\n constructor(element, service) {\n this.element = element;\n this.service = service;\n this.context = {};\n this.enter = new EventEmitter();\n this.leave = new EventEmitter();\n this.drop = new EventEmitter();\n this.subscriptions = new Subscription();\n }\n ngOnInit() {\n this.service.add(this);\n const changes = this.service.changes.pipe(filter(({ target }) => target === this));\n this.subscriptions.add(changes.pipe(filter(({ type }) => type === 'leave'))\n .subscribe(e => {\n this.leave.next(this.eventArgs(e));\n }));\n this.subscriptions.add(changes.pipe(filter(({ type }) => type === 'enter'))\n .subscribe(e => {\n this.enter.next(this.eventArgs(e));\n }));\n this.subscriptions.add(changes.pipe(filter(({ type }) => type === 'drop'))\n .subscribe(e => {\n this.drop.next(this.eventArgs(e));\n }));\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n eventArgs(e) {\n return {\n target: this,\n mouseEvent: e.mouseEvent,\n draggable: e.draggable\n };\n }\n}\nDropTargetDirective.ɵfac = function DropTargetDirective_Factory(t) { return new (t || DropTargetDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(DragAndDropService)); };\nDropTargetDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DropTargetDirective, selectors: [[\"\", \"kendoDropTarget\", \"\"]], inputs: { context: \"context\" }, outputs: { enter: \"enter\", leave: \"leave\", drop: \"drop\" } });\n/** @nocollapse */\nDropTargetDirective.ctorParameters = () => [\n { type: ElementRef },\n { type: DragAndDropService }\n];\nDropTargetDirective.propDecorators = {\n context: [{ type: Input }],\n enter: [{ type: Output }],\n leave: [{ type: Output }],\n drop: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DropTargetDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDropTarget]'\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: DragAndDropService }]; }, { context: [{\n type: Input\n }], enter: [{\n type: Output\n }], leave: [{\n type: Output\n }], drop: [{\n type: Output\n }] }); })();\n\nconst withoutField = ({ field }) => isNullOrEmptyString(field);\nconst alreadyGrouped = ({ groups, field }) => groups.some(group => group.field === field);\nconst overSameTarget = ({ target, field }) => target.field === field;\nconst overLastTarget = ({ target }) => target.lastTarget;\nconst isLastGroup = ({ groups, field }) => groups.map(group => group.field).indexOf(field) === groups.length - 1;\nconst isNotGroupable = (groupsService) => ({ field }) => !groupsService.isGroupable(field);\nconst columnRules = (groupService) => or(withoutField, alreadyGrouped, isNotGroupable(groupService));\nconst indicatorRules = or(overSameTarget, and(overLastTarget, isLastGroup));\n/**\n * @hidden\n */\nclass GroupPanelComponent {\n constructor(hint, cue, groupInfoService, localization, cd) {\n this.hint = hint;\n this.cue = cue;\n this.groupInfoService = groupInfoService;\n this.localization = localization;\n this.cd = cd;\n this.change = new EventEmitter();\n this.groups = [];\n this.dropTargets = new QueryList();\n this.groupTitles = [];\n this.subscription = new Subscription();\n }\n get groupHeaderClass() {\n return true;\n }\n set text(value) {\n this.emptyText = value;\n }\n get text() {\n return this.emptyText ? this.emptyText : this.localization.get('groupPanelEmpty');\n }\n ngAfterViewInit() {\n this.subscription.add(observe(this.dropTargets)\n .subscribe(this.attachTargets.bind(this)));\n }\n ngOnInit() {\n this.subscription.add(this.localization.changes.subscribe(() => this.cd.markForCheck()));\n }\n ngDoCheck() {\n const currentTitles = this.groups.map(group => this.groupInfoService.groupTitle(group));\n if (currentTitles.length !== this.groupTitles.length || currentTitles.some((current, idx) => current !== this.groupTitles[idx])) {\n this.groupTitles = currentTitles;\n this.cd.markForCheck();\n }\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n if (this.targetSubscription) {\n this.targetSubscription.unsubscribe();\n }\n }\n directionChange(group) {\n const index = this.groups.findIndex(x => x.field === group.field);\n const groups = [...this.groups.slice(0, index), group, ...this.groups.slice(index + 1)];\n this.change.emit(groups);\n }\n insert(field, index) {\n const groups = this.groups.filter(x => x.field !== field);\n if (groups.length || this.groups.length === 0) {\n this.change.emit([...groups.slice(0, index), { field: field }, ...groups.slice(index)]);\n }\n }\n remove(group) {\n this.change.emit(this.groups.filter(x => x.field !== group.field));\n }\n canDrop(draggable, target) {\n const isIndicator = draggable.type === 'groupIndicator';\n const rules = isIndicator\n ? indicatorRules\n : columnRules(this.groupInfoService);\n return !rules({\n field: draggable.field,\n groups: this.groups,\n target\n });\n }\n attachTargets() {\n if (this.targetSubscription) {\n this.targetSubscription.unsubscribe();\n }\n this.targetSubscription = new Subscription();\n const enterStream = this.dropTargets\n .reduce((acc, target) => merge(acc, target.enter), from([]));\n const leaveStream = this.dropTargets\n .reduce((acc, target) => merge(acc, target.leave), from([]));\n const dropStream = this.dropTargets\n .reduce((acc, target) => merge(acc, target.drop), from([]));\n this.targetSubscription.add(enterStream.pipe(tap(_ => this.hint.removeLock()), filter(({ draggable, target }) => this.canDrop(draggable.context, target.context)), tap(this.enter.bind(this)), switchMapTo(dropStream.pipe(takeUntil(leaveStream.pipe(tap(this.leave.bind(this))))))).subscribe(this.drop.bind(this)));\n }\n enter({ draggable, target }) {\n this.hint.enable();\n let before = target.context.lastTarget || isTargetBefore(draggable.element.nativeElement, target.element.nativeElement);\n if (this.localization.rtl) {\n before = !before;\n }\n this.cue.position(position(target.element.nativeElement, before));\n }\n leave() {\n this.hint.disable();\n this.cue.hide();\n }\n drop({ target, draggable }) {\n const field = draggable.context.field;\n const index = this.dropTargets.toArray().indexOf(target);\n this.insert(field, index);\n }\n}\nGroupPanelComponent.ɵfac = function GroupPanelComponent_Factory(t) { return new (t || GroupPanelComponent)(ɵngcc0.ɵɵdirectiveInject(DragHintService), ɵngcc0.ɵɵdirectiveInject(DropCueService), ɵngcc0.ɵɵdirectiveInject(GroupInfoService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nGroupPanelComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GroupPanelComponent, selectors: [[\"kendo-grid-group-panel\"]], viewQuery: function GroupPanelComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(DropTargetDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dropTargets = _t);\n } }, hostVars: 4, hostBindings: function GroupPanelComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grouping-header\", ctx.groupHeaderClass)(\"k-grouping-header-flex\", ctx.groupHeaderClass);\n } }, inputs: { groups: \"groups\", text: \"text\" }, outputs: { change: \"change\" }, decls: 3, vars: 3, consts: [[3, \"ngIf\"], [\"class\", \"k-indicator-container\", \"kendoDropTarget\", \"\", 3, \"context\", 4, \"ngFor\", \"ngForOf\"], [\"class\", \"k-indicator-container\", \"kendoDropTarget\", \"\", 3, \"context\", 4, \"ngIf\"], [\"kendoDropTarget\", \"\", 1, \"k-indicator-container\", 3, \"context\"], [\"kendoDraggableColumn\", \"\", \"kendoGroupIndicator\", \"\", \"kendoDraggable\", \"\", 3, \"enableDrag\", \"context\", \"group\", \"groupTitle\", \"directionChange\", \"remove\"]], template: function GroupPanelComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, GroupPanelComponent_ng_template_0_Template, 2, 3, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(1, GroupPanelComponent_div_1_Template, 2, 10, \"div\", 1);\n ɵngcc0.ɵɵtemplate(2, GroupPanelComponent_div_2_Template, 2, 2, \"div\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.groups.length === 0);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.groups);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.groups.length !== 0);\n } }, directives: function () { return [ɵngcc5.NgIf, ɵngcc5.NgForOf, DropTargetDirective,\n DraggableColumnDirective,\n GroupIndicatorComponent, ɵngcc2.DraggableDirective]; }, encapsulation: 2, changeDetection: 0 });\n/** @nocollapse */\nGroupPanelComponent.ctorParameters = () => [\n { type: DragHintService },\n { type: DropCueService },\n { type: GroupInfoService },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nGroupPanelComponent.propDecorators = {\n change: [{ type: Output }],\n groupHeaderClass: [{ type: HostBinding, args: [\"class.k-grouping-header\",] }, { type: HostBinding, args: [\"class.k-grouping-header-flex\",] }],\n text: [{ type: Input }],\n groups: [{ type: Input }],\n dropTargets: [{ type: ViewChildren, args: [DropTargetDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupPanelComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'kendo-grid-group-panel',\n template: `\n \n \n {{ text }}\n \n \n
\n \n
\n \n
 
\n `\n }]\n }], function () { return [{ type: DragHintService }, { type: DropCueService }, { type: GroupInfoService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { change: [{\n type: Output\n }], groups: [{\n type: Input\n }], dropTargets: [{\n type: ViewChildren,\n args: [DropTargetDirective]\n }], groupHeaderClass: [{\n type: HostBinding,\n args: [\"class.k-grouping-header\"]\n }, {\n type: HostBinding,\n args: [\"class.k-grouping-header-flex\"]\n }], text: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass GroupIndicatorComponent {\n constructor() {\n this.directionChange = new EventEmitter();\n this.remove = new EventEmitter();\n }\n get groupIndicatorClass() {\n return true;\n }\n get dir() {\n return this.group.dir ? this.group.dir : \"asc\";\n }\n toggleDirection() {\n this.directionChange.emit({\n dir: this.dir === \"asc\" ? \"desc\" : \"asc\",\n field: this.group.field\n });\n return false;\n }\n removeDescriptor() {\n this.remove.emit({\n dir: this.group.dir,\n field: this.group.field\n });\n return false;\n }\n}\nGroupIndicatorComponent.ɵfac = function GroupIndicatorComponent_Factory(t) { return new (t || GroupIndicatorComponent)(); };\nGroupIndicatorComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: GroupIndicatorComponent, selectors: [[\"\", \"kendoGroupIndicator\", \"\"]], hostVars: 2, hostBindings: function GroupIndicatorComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-group-indicator\", ctx.groupIndicatorClass);\n } }, inputs: { group: \"group\", groupTitle: \"groupTitle\" }, outputs: { directionChange: \"directionChange\", remove: \"remove\" }, attrs: _c149, decls: 5, vars: 5, consts: [[\"href\", \"#\", \"tabindex\", \"-1\", 1, \"k-link\", 3, \"click\"], [1, \"k-icon\"], [\"tabindex\", \"-1\", 1, \"k-button\", \"k-button-icon\", \"k-bare\", 3, \"click\"], [1, \"k-icon\", \"k-i-group-delete\"]], template: function GroupIndicatorComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"a\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function GroupIndicatorComponent_Template_a_click_0_listener() { return ctx.toggleDirection(); });\n ɵngcc0.ɵɵelement(1, \"span\", 1);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(3, \"a\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function GroupIndicatorComponent_Template_a_click_3_listener() { return ctx.removeDescriptor(); });\n ɵngcc0.ɵɵelement(4, \"span\", 3);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵclassProp(\"k-i-sort-asc-sm\", ctx.dir === \"asc\")(\"k-i-sort-desc-sm\", ctx.dir === \"desc\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.groupTitle, \"\");\n } }, encapsulation: 2, changeDetection: 0 });\nGroupIndicatorComponent.propDecorators = {\n directionChange: [{ type: Output }],\n remove: [{ type: Output }],\n group: [{ type: Input }],\n groupTitle: [{ type: Input }],\n groupIndicatorClass: [{ type: HostBinding, args: [\"class.k-group-indicator\",] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupIndicatorComponent, [{\n type: Component,\n args: [{\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: '[kendoGroupIndicator]',\n template: `\n \n \n {{groupTitle}}\n \n \n \n `\n }]\n }], function () { return []; }, { directionChange: [{\n type: Output\n }], remove: [{\n type: Output\n }], groupIndicatorClass: [{\n type: HostBinding,\n args: [\"class.k-group-indicator\"]\n }], group: [{\n type: Input\n }], groupTitle: [{\n type: Input\n }] }); })();\n\n// TODO\n// tslint:disable:rxjs-no-unsafe-takeuntil\n/**\n * @hidden\n */\nconst preventOnDblClick = release => mouseDown => of(mouseDown).pipe(delay(150), takeUntil(release));\nconst hasClass = className => el => new RegExp(`(^| )${className}( |$)`).test(el.className);\nconst isDeleteButton = or(hasClass(\"k-i-group-delete\"), hasClass(\"k-button-icon\"));\nconst isSortIcon = or(hasClass(\"k-i-sort-asc-sm\"), hasClass(\"k-i-sort-desc-sm\"));\nconst skipButtons = and(not(isDeleteButton), not(isSortIcon), not(isFocusableWithTabKey), not(matchesNodeName(\"label\")));\nconst elementUnderCursor = ({ clientX, clientY }) => document.elementFromPoint(clientX, clientY);\nconst hideThenShow = (element, cont) => {\n element.style.display = 'none';\n const result = cont();\n element.style.display = 'block';\n return result;\n};\n/**\n * @hidden\n */\nclass DraggableColumnDirective {\n constructor(draggable, element, zone, service, hint, cue, nav, renderer) {\n this.draggable = draggable;\n this.element = element;\n this.zone = zone;\n this.service = service;\n this.hint = hint;\n this.cue = cue;\n this.nav = nav;\n this.renderer = renderer;\n this.context = {};\n this.drag = new EventEmitter();\n this.subscriptions = new Subscription();\n }\n set enableDrag(enabled) {\n this.enabled = enabled;\n this.updateTouchAction();\n }\n get hostClass() {\n return this.enabled;\n }\n ngOnInit() {\n this.subscriptions.add(this.zone.runOutsideAngular(() => this.draggable.kendoPress.pipe(filter(_ => this.enabled), filter(({ originalEvent: { target } }) => target === this.element.nativeElement || skipButtons(target)), tap((e) => {\n const originalEvent = e.originalEvent;\n if (!e.isTouch) {\n originalEvent.preventDefault();\n }\n this.nav.navigateTo(originalEvent.target);\n }), switchMap(preventOnDblClick(this.draggable.kendoRelease)), tap(down => {\n this.hint.create(down, this.element.nativeElement, this.context.hint);\n this.cue.create();\n }), switchMap(down => this.draggable.kendoDrag.pipe(tap((e) => {\n if (e.isTouch) {\n e.originalEvent.preventDefault();\n }\n }), tap(this.hint.attach()), tap(this.cue.attach()), takeUntil(this.draggable.kendoRelease), map(move => ({ move, down })))), tap(this.performDrag.bind(this)), switchMapTo(this.draggable.kendoRelease)).subscribe(this.drop.bind(this))));\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n drop(upEvent) {\n this.hint.remove();\n this.cue.remove();\n this.service.notifyDrop(this, upEvent);\n }\n performDrag({ move }) {\n this.hint.move(move);\n const cursorElement = this.elementUnderCursor(move);\n if (cursorElement) {\n this.service.notifyDrag(this, cursorElement, move);\n }\n this.drag.emit({\n draggable: this,\n mouseEvent: move\n });\n }\n elementUnderCursor(mouseEvent) {\n this.hint.hide();\n let target = elementUnderCursor(mouseEvent);\n if (target && /k-grouping-dropclue/.test(target.className)) {\n target = hideThenShow(target, elementUnderCursor.bind(this, mouseEvent));\n }\n this.hint.show();\n return target;\n }\n updateTouchAction() {\n if (!this.element) {\n return;\n }\n this.renderer.setStyle(this.element.nativeElement, 'touch-action', this.enabled ? 'none' : '');\n }\n}\nDraggableColumnDirective.ɵfac = function DraggableColumnDirective_Factory(t) { return new (t || DraggableColumnDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.DraggableDirective, 1), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DragAndDropService), ɵngcc0.ɵɵdirectiveInject(DragHintService), ɵngcc0.ɵɵdirectiveInject(DropCueService), ɵngcc0.ɵɵdirectiveInject(NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nDraggableColumnDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DraggableColumnDirective, selectors: [[\"\", \"kendoDraggableColumn\", \"\"]], hostVars: 2, hostBindings: function DraggableColumnDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-draggable-header\", ctx.hostClass);\n } }, inputs: { context: \"context\", enableDrag: \"enableDrag\" }, outputs: { drag: \"drag\" } });\n/** @nocollapse */\nDraggableColumnDirective.ctorParameters = () => [\n { type: DraggableDirective, decorators: [{ type: Host }] },\n { type: ElementRef },\n { type: NgZone },\n { type: DragAndDropService },\n { type: DragHintService },\n { type: DropCueService },\n { type: NavigationService },\n { type: Renderer2 }\n];\nDraggableColumnDirective.propDecorators = {\n context: [{ type: Input }],\n enableDrag: [{ type: Input }],\n drag: [{ type: Output }],\n hostClass: [{ type: HostBinding, args: ['class.k-grid-draggable-header',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DraggableColumnDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDraggableColumn]'\n }]\n }], function () { return [{ type: ɵngcc2.DraggableDirective, decorators: [{\n type: Host\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: DragAndDropService }, { type: DragHintService }, { type: DropCueService }, { type: NavigationService }, { type: ɵngcc0.Renderer2 }]; }, { context: [{\n type: Input\n }], drag: [{\n type: Output\n }], enableDrag: [{\n type: Input\n }], hostClass: [{\n type: HostBinding,\n args: ['class.k-grid-draggable-header']\n }] }); })();\n\nconst exported = [\n DraggableColumnDirective,\n DropTargetDirective\n];\n/**\n * @hidden\n */\nclass DragAndDropModule {\n}\nDragAndDropModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DragAndDropModule });\nDragAndDropModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DragAndDropModule_Factory(t) { return new (t || DragAndDropModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DragAndDropModule, { declarations: [DraggableColumnDirective,\n DropTargetDirective], exports: [DraggableColumnDirective,\n DropTargetDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DragAndDropModule, [{\n type: NgModule,\n args: [{\n declarations: [exported],\n exports: [exported]\n }]\n }], null, null); })();\n\nconst exportedModules$1 = [\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderComponent,\n GroupPanelComponent,\n GroupIndicatorComponent\n];\n/**\n * @hidden\n */\nclass GroupModule {\n static exports() {\n return [\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective,\n GroupFooterTemplateDirective\n ];\n }\n}\nGroupModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: GroupModule });\nGroupModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function GroupModule_Factory(t) { return new (t || GroupModule)(); }, imports: [[CommonModule, SharedModule, DragAndDropModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(GroupModule, { declarations: function () { return [GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderComponent,\n GroupPanelComponent,\n GroupIndicatorComponent]; }, imports: function () { return [CommonModule,\n SharedModule,\n DragAndDropModule]; }, exports: function () { return [GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective,\n GroupFooterTemplateDirective,\n GroupHeaderComponent,\n GroupPanelComponent,\n GroupIndicatorComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupModule, [{\n type: NgModule,\n args: [{\n declarations: [exportedModules$1],\n exports: [exportedModules$1],\n imports: [CommonModule, SharedModule, DragAndDropModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nconst DEFAULTS = {\n allowUnsort: true,\n mode: 'single',\n showIndexes: true,\n initialDirection: 'asc'\n};\n/**\n * @hidden\n */\nconst normalize$1 = (...settings) => Object.assign({}, DEFAULTS, ...settings);\n\n/**\n * @hidden\n */\nconst hasFilter = (settings, column) => settings.filter !== false && column.field && column.filterable;\n/**\n * @hidden\n */\nconst hasSort = (settings, column) => settings.sort !== false && column.field && column.sortable;\n/**\n * @hidden\n */\nconst hasLock = (settings, column) => settings.lock && column.lockable && !(column.parent && !column.parent.isSpanColumn);\n/**\n * @hidden\n */\nconst hasColumnChooser = (settings) => settings.columnChooser !== false;\n/**\n * @hidden\n */\nconst hasItems = (settings, column) => hasColumnChooser(settings) || hasLock(settings, column) || hasSort(settings, column) || hasFilter(settings, column);\n\nconst mergeObjects = (...args) => Object.assign.apply(null, [{}].concat(args));\nconst directions = initialDirection => initialDirection === \"asc\" ? [\"asc\", \"desc\"] : [\"desc\", \"asc\"];\n/**\n * @hidden\n */\nconst isRootLevel = ({ parent }) => !isTruthy(parent);\nconst ofColumnType = ({ draggable }) => ['column', 'columnGroup']\n .indexOf(draggable.context.type) >= 0;\nconst notSameElement = ({ draggable, target }) => draggable.element.nativeElement !== target.element.nativeElement;\nconst inSameParent = (x, y) => x.parent === y.parent ||\n (isInSpanColumn(y) && inSameParent(x, y.parent));\nconst sameParent = ({ draggable, target }) => inSameParent(draggable.context.column, target.context.column);\nconst lastNonLocked = ({ draggable }) => !isTruthy(draggable.context.column.locked) &&\n isRootLevel(draggable.context.column) &&\n draggable.context.lastColumn;\nconst notInSpanColumn = ({ draggable }) => !isInSpanColumn(draggable.context.column);\nconst reorderable = ({ draggable }) => draggable.context.column.reorderable;\nconst lockable = ({ draggable, target }) => draggable.context.column.lockable !== false ||\n draggable.context.column.isLocked === target.context.column.isLocked;\nconst rules = and(ofColumnType, reorderable, notInSpanColumn, notSameElement, sameParent, not(lastNonLocked), lockable);\n/**\n * @hidden\n */\nclass HeaderComponent {\n constructor(popupService, hint, cue, reorderService, idService, sortService, localization, cd) {\n this.popupService = popupService;\n this.hint = hint;\n this.cue = cue;\n this.reorderService = reorderService;\n this.idService = idService;\n this.sortService = sortService;\n this.localization = localization;\n this.cd = cd;\n this.columns = [];\n this.groups = [];\n this.sort = new Array();\n this.sortable = false;\n this.groupable = false;\n this.lockedColumnsCount = 0;\n this.resizable = false;\n this.reorderable = false;\n this.columnMenu = false;\n this.totalColumnsCount = 0;\n this.sortedFields = {};\n this.dropTargets = new QueryList();\n this.subscription = new Subscription();\n }\n get headerClass() {\n return !this.scrollable;\n }\n get sortableLabel() {\n return this.localization.get('sortable');\n }\n // Number of unlocked columns in the next table, if any\n get unlockedColumnsCount() {\n return this.totalColumnsCount - this.lockedColumnsCount - this.columns.length;\n }\n sortColumn(column) {\n this.sortService.sort(this.toggleSort(column));\n }\n onSortClick(column, event, link) {\n const target = event.target;\n if (column.headerTemplateRef && target !== link) {\n const hasFocusableParent = Boolean(closestInScope(target, isFocusable, link));\n if (hasFocusableParent) {\n // Do not sort when clicking focusable template elements.\n return;\n }\n }\n this.sortColumn(column);\n }\n onHeaderKeydown(column, args) {\n if (!this.sortable || args.defaultPrevented || column.sortable === false) {\n return;\n }\n if (args.keyCode === Keys.Enter && isPresent(column.field)) {\n this.sortService.sort(this.toggleSort(column));\n }\n }\n showSortNumbering(column) {\n const { showIndexes } = normalize$1(this.sortable);\n return showIndexes\n && this.sort\n && this.sort.filter(({ dir }) => isPresent(dir)).length > 1\n && this.sortOrder(column.field) > 0;\n }\n sortOrder(field) {\n return this.sort\n .filter(({ dir }) => isPresent(dir))\n .findIndex(x => x.field === field)\n + 1;\n }\n sortIcon(field) {\n const state$$1 = this.sortDescriptor(field);\n return {\n 'k-icon': isPresent(state$$1.dir),\n 'k-i-sort-desc-sm': state$$1.dir === \"desc\",\n 'k-i-sort-asc-sm': state$$1.dir === \"asc\"\n };\n }\n sortState(column) {\n if (!this.isSortable(column)) {\n return;\n }\n const state$$1 = this.sortDescriptor(column.field);\n if (state$$1.dir === 'asc') {\n return 'ascending';\n }\n if (state$$1.dir === 'desc') {\n return 'descending';\n }\n }\n sortStatus(column) {\n if (!this.sortedFields[column.field] || !this.isSortable(column)) {\n return;\n }\n let msg = 'sortedDefault';\n const state$$1 = this.sortDescriptor(column.field);\n if (state$$1.dir === 'asc') {\n msg = 'sortedAscending';\n }\n else if (state$$1.dir === 'desc') {\n msg = 'sortedDescending';\n }\n return this.localization.get(msg);\n }\n toggleSort(column) {\n const { allowUnsort, mode, initialDirection } = normalize$1(this.sortable, column.sortable);\n const descriptor = this.toggleDirection(column.field, allowUnsort, initialDirection);\n if (mode === 'single') {\n return [descriptor];\n }\n return [...this.sort.filter(desc => desc.field !== column.field), descriptor];\n }\n ngAfterViewInit() {\n this.subscription.add(observe(this.dropTargets)\n .subscribe(this.attachTargets.bind(this)));\n }\n ngDoCheck() {\n this._leafColumns = columnsToRender(this.columns || []).filter(x => !isColumnGroupComponent(x));\n }\n ngOnChanges(changes) {\n const sortChange = changes.sort;\n if (sortChange && !sortChange.isFirstChange()) {\n sortChange.currentValue.forEach(change => {\n this.sortedFields[change.field] = true;\n });\n }\n }\n ngOnInit() {\n this.subscription.add(this.localization.changes\n .subscribe(() => this.cd.markForCheck()));\n }\n ngOnDestroy() {\n if (this.targetSubscription) {\n this.targetSubscription.unsubscribe();\n }\n if (this.popupService) {\n this.popupService.destroy();\n }\n this.subscription.unsubscribe();\n }\n selectAllCheckboxId() {\n return this.idService.selectAllCheckboxId();\n }\n isFirstOnRow(column, index) {\n const isTailing = (c) => c &&\n (this.columnsForLevel(c.level).indexOf(c) > 0 || isTailing(c.parent));\n return index === 0 && !this.groups.length && !this.detailTemplate && isTailing(column.parent);\n }\n logicalColumnIndex(column) {\n const index = column.leafIndex;\n if (isPresent(index)) {\n return index + (isPresent(this.detailTemplate) ? 1 : 0);\n }\n return -1;\n }\n get showFilterMenu() {\n return !this.columnMenu && hasFilterMenu(this.filterable);\n }\n get showFilterRow() {\n return hasFilterRow(this.filterable);\n }\n showColumnMenu(column) {\n return this.columnMenu && column.columnMenu &&\n (this.columnMenuTemplate || column.columnMenuTemplates.length || hasItems(this.columnMenu, column));\n }\n isFilterable(column) {\n return !isNullOrEmptyString(column.field) && column.filterable === true;\n }\n canDrop(draggable, target) {\n return this.reorderable && rules({ draggable, target });\n }\n shouldActivate(column) {\n const canReorder = this.reorderable && column.reorderable;\n if (!canReorder && !isColumnComponent(column)) {\n return false;\n }\n const groupable = this.groupable && isColumnComponent(column) && column.groupable !== false;\n return groupable || canReorder;\n }\n isSortable(column) {\n return !isNullOrEmptyString(column.field)\n && isTruthy(this.sortable) && isTruthy(column.sortable);\n }\n isCheckboxColumn(column) {\n return isCheckboxColumn(column) && !column.templateRef;\n }\n trackByIndex(index, _item) {\n return index;\n }\n toggleDirection(field, allowUnsort, initialDirection) {\n const descriptor = this.sortDescriptor(field);\n const [first, second] = directions(initialDirection);\n let dir = first;\n if (descriptor.dir === first) {\n dir = second;\n }\n else if (descriptor.dir === second && allowUnsort) {\n dir = undefined;\n }\n return { dir, field };\n }\n columnsForLevel(level) {\n const columns = this.columns ? this.columns.filter(column => column.level === level) : [];\n return sortColumns(columnsToRender(columns));\n }\n isColumnGroupComponent(column) {\n return isColumnGroupComponent(column);\n }\n get columnLevels() {\n return new Array((this.totalColumnLevels || 0) + 1);\n }\n sortDescriptor(field) {\n return this.sort.find(item => item.field === field) || { field };\n }\n get leafColumns() {\n return this._leafColumns;\n }\n attachTargets() {\n if (this.targetSubscription) {\n this.targetSubscription.unsubscribe();\n }\n this.targetSubscription = new Subscription();\n const enterStream = merge(...this.dropTargets.map(target => target.enter));\n const leaveStream = merge(...this.dropTargets.map(target => target.leave));\n const dropStream = merge(...this.dropTargets.map(target => target.drop));\n this.targetSubscription.add(enterStream.pipe(tap(({ target, draggable }) => {\n if (draggable.context.type === 'groupIndicator') {\n return;\n }\n const targetLocked = isTruthy(target.context.column.isLocked);\n const draggableLocked = isTruthy(draggable.context.column.isLocked);\n if (this.lockedColumnsCount > 0 || targetLocked || draggableLocked) {\n this.hint.toggleLock(targetLocked);\n }\n }), filter(({ draggable, target }) => this.canDrop(draggable, target)), switchMap(this.trackMove.bind(this, leaveStream, dropStream)), map((e) => mergeObjects(e, { before: this.calculateBefore(e), changeContainer: e.changeContainer })), map(this.normalizeTarget.bind(this)), tap(this.enter.bind(this)), switchMap((args) => dropStream.pipe(map(() => args), takeUntil(leaveStream.pipe(tap(this.leave.bind(this)))))))\n .subscribe(this.drop.bind(this)));\n }\n normalizeTarget(e) {\n let target = e.target;\n const parent = target.context.column.parent;\n if (parent && parent.isSpanColumn) {\n const arr = this.dropTargets.toArray();\n const firstSpan = arr.find(t => t.context.column.parent === parent);\n const index = arr.indexOf(firstSpan);\n const adjust = e.before ? 0 : parent.childColumns.length - 1;\n target = arr[index + adjust];\n }\n return mergeObjects(e, { target });\n }\n trackMove(leaveStream, dropStream, e) {\n const column = e.target.context.column;\n const levelColumns = this.columnsForLevel(column.level);\n const index = levelColumns.indexOf(column);\n const isFirst = (column.locked ? index === levelColumns.length - 1 : index === 0);\n const changed = e.draggable.context.column.isLocked !== column.isLocked;\n if (changed && isFirst) {\n return e.draggable.drag\n .pipe(takeUntil(leaveStream), takeUntil(dropStream), map(({ mouseEvent }) => mergeObjects({ changeContainer: true }, e, { mouseEvent })));\n }\n return of(mergeObjects({ changeContainer: changed }, e));\n }\n calculateBefore({ draggable, target, mouseEvent, changeContainer = false }) {\n const targetElement = target.element.nativeElement;\n let before = false;\n if (changeContainer) {\n const { left } = offset(targetElement);\n const halfWidth = targetElement.offsetWidth / 2;\n const middle = left + halfWidth;\n before = middle > mouseEvent.pageX;\n if (this.localization.rtl) {\n before = !before;\n }\n }\n else {\n before = isTargetBefore(draggable.element.nativeElement, targetElement);\n }\n return before;\n }\n enter({ target, before }) {\n this.hint.enable();\n if (this.localization.rtl) {\n before = !before;\n }\n this.cue.position(position(target.element.nativeElement, before));\n }\n leave() {\n this.hint.disable();\n this.cue.hide();\n }\n drop({ draggable, target, before, changeContainer }) {\n this.reorderService.reorder({\n before,\n changeContainer,\n source: draggable.context.column,\n target: target.context.column\n });\n }\n}\nHeaderComponent.ɵfac = function HeaderComponent_Factory(t) { return new (t || HeaderComponent)(ɵngcc0.ɵɵdirectiveInject(SinglePopupService), ɵngcc0.ɵɵdirectiveInject(DragHintService), ɵngcc0.ɵɵdirectiveInject(DropCueService), ɵngcc0.ɵɵdirectiveInject(ColumnReorderService), ɵngcc0.ɵɵdirectiveInject(IdService), ɵngcc0.ɵɵdirectiveInject(SortService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nHeaderComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: HeaderComponent, selectors: [[\"\", \"kendoGridHeader\", \"\"]], viewQuery: function HeaderComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(DropTargetDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.dropTargets = _t);\n } }, hostVars: 2, hostBindings: function HeaderComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-header\", ctx.headerClass);\n } }, inputs: { columns: \"columns\", groups: \"groups\", sort: \"sort\", sortable: \"sortable\", groupable: \"groupable\", lockedColumnsCount: \"lockedColumnsCount\", resizable: \"resizable\", reorderable: \"reorderable\", columnMenu: \"columnMenu\", totalColumnsCount: \"totalColumnsCount\", totalColumnLevels: \"totalColumnLevels\", detailTemplate: \"detailTemplate\", scrollable: \"scrollable\", filterable: \"filterable\", filter: \"filter\", columnMenuTemplate: \"columnMenuTemplate\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c150, decls: 1, vars: 1, consts: [[3, \"ngIf\"], [\"kendoGridLogicalRow\", \"\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", 4, \"ngFor\", \"ngForOf\"], [\"kendoGridFilterRow\", \"\", \"kendoGridLogicalRow\", \"\", 3, \"columns\", \"filter\", \"groups\", \"detailTemplate\", \"lockedColumnsCount\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", 4, \"ngIf\"], [\"kendoGridLogicalRow\", \"\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"], [\"class\", \"k-group-cell k-header\", \"role\", \"presentation\", 4, \"ngFor\", \"ngForOf\"], [\"class\", \"k-hierarchy-cell k-header\", \"role\", \"presentation\", \"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 3, \"logicalRowIndex\", \"logicalColIndex\", 4, \"ngIf\"], [\"ngFor\", \"\", 3, \"ngForOf\", \"ngForTrackBy\"], [\"role\", \"presentation\", 1, \"k-group-cell\", \"k-header\"], [\"role\", \"presentation\", \"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 1, \"k-hierarchy-cell\", \"k-header\", 3, \"logicalRowIndex\", \"logicalColIndex\"], [\"kendoGridLogicalCell\", \"\", \"role\", \"columnheader\", \"aria-selected\", \"false\", \"kendoDropTarget\", \"\", \"kendoDraggable\", \"\", \"kendoDraggableColumn\", \"\", \"class\", \"k-header\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"colSpan\", \"rowSpan\", \"enableDrag\", \"context\", \"k-filterable\", \"k-first\", \"ngClass\", \"ngStyle\", \"keydown\", 4, \"ngIf\"], [\"kendoGridLogicalCell\", \"\", \"kendoDropTarget\", \"\", \"kendoDraggable\", \"\", \"kendoDraggableColumn\", \"\", \"class\", \"k-header\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"rowSpan\", \"colSpan\", \"enableDrag\", \"context\", \"k-first\", \"k-filterable\", \"ngClass\", \"ngStyle\", 4, \"ngIf\"], [\"kendoGridLogicalCell\", \"\", \"role\", \"columnheader\", \"aria-selected\", \"false\", \"kendoDropTarget\", \"\", \"kendoDraggable\", \"\", \"kendoDraggableColumn\", \"\", 1, \"k-header\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"colSpan\", \"rowSpan\", \"enableDrag\", \"context\", \"ngClass\", \"ngStyle\", \"keydown\"], [3, \"column\", \"filter\", 4, \"ngIf\"], [3, \"standalone\", \"settings\", \"column\", \"columnMenuTemplate\", \"sort\", \"filter\", \"sortable\", 4, \"ngIf\"], [\"kendoGridColumnHandle\", \"\", \"kendoDraggable\", \"\", \"class\", \"k-column-resizer\", 3, \"column\", \"columns\", 4, \"ngIf\"], [3, \"column\", \"filter\"], [3, \"standalone\", \"settings\", \"column\", \"columnMenuTemplate\", \"sort\", \"filter\", \"sortable\"], [3, \"templateContext\"], [1, \"k-link\", 3, \"click\"], [\"link\", \"\"], [3, \"ngClass\"], [\"class\", \"k-sort-order\", 4, \"ngIf\"], [\"role\", \"status\", 1, \"k-sort-status\", 2, \"position\", \"absolute\", \"left\", \"-10000px\", 3, \"innerHtml\"], [1, \"k-sort-order\"], [\"kendoGridSelectAllCheckbox\", \"\", \"kendoGridFocusable\", \"\", 1, \"k-checkbox\"], [1, \"k-checkbox-label\"], [\"kendoGridColumnHandle\", \"\", \"kendoDraggable\", \"\", 1, \"k-column-resizer\", 3, \"column\", \"columns\"], [\"kendoGridLogicalCell\", \"\", \"kendoDropTarget\", \"\", \"kendoDraggable\", \"\", \"kendoDraggableColumn\", \"\", 1, \"k-header\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"rowSpan\", \"colSpan\", \"enableDrag\", \"context\", \"ngClass\", \"ngStyle\"], [3, \"standalone\", \"settings\", \"column\", \"columnMenuTemplate\", 4, \"ngIf\"], [3, \"standalone\", \"settings\", \"column\", \"columnMenuTemplate\"], [\"kendoGridFilterRow\", \"\", \"kendoGridLogicalRow\", \"\", 3, \"columns\", \"filter\", \"groups\", \"detailTemplate\", \"lockedColumnsCount\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"]], template: function HeaderComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, HeaderComponent_ng_template_0_Template, 2, 2, \"ng-template\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", true);\n } }, directives: function () { return [ɵngcc5.NgIf, ɵngcc5.NgForOf, LogicalRowDirective,\n LogicalCellDirective,\n DropTargetDirective, ɵngcc2.DraggableDirective, DraggableColumnDirective, ɵngcc5.NgClass, ɵngcc5.NgStyle, FilterMenuComponent,\n ColumnMenuComponent,\n TemplateContextDirective,\n SelectAllCheckboxDirective,\n FocusableDirective,\n ColumnHandleDirective,\n FilterRowComponent]; }, styles: [\".k-column-resizer[_ngcontent-%COMP%] {\\n cursor: col-resize;\\n display: block;\\n height: 1000%;\\n position: absolute;\\n top: 0;\\n width: .5em;\\n }\"] });\n/** @nocollapse */\nHeaderComponent.ctorParameters = () => [\n { type: SinglePopupService },\n { type: DragHintService },\n { type: DropCueService },\n { type: ColumnReorderService },\n { type: IdService },\n { type: SortService },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nHeaderComponent.propDecorators = {\n totalColumnLevels: [{ type: Input }],\n columns: [{ type: Input }],\n groups: [{ type: Input }],\n detailTemplate: [{ type: Input }],\n scrollable: [{ type: Input }],\n filterable: [{ type: Input }],\n sort: [{ type: Input }],\n filter: [{ type: Input }],\n sortable: [{ type: Input }],\n groupable: [{ type: Input }],\n lockedColumnsCount: [{ type: Input }],\n resizable: [{ type: Input }],\n reorderable: [{ type: Input }],\n columnMenu: [{ type: Input }],\n columnMenuTemplate: [{ type: Input }],\n totalColumnsCount: [{ type: Input }],\n headerClass: [{ type: HostBinding, args: ['class.k-grid-header',] }],\n dropTargets: [{ type: ViewChildren, args: [DropTargetDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HeaderComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridHeader]',\n styles: [`\n .k-column-resizer {\n cursor: col-resize;\n display: block;\n height: 1000%;\n position: absolute;\n top: 0;\n width: .5em;\n }\n `],\n template: `\n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n {{column.displayTitle}}\n \n \n \n \n \n {{column.displayTitle}}\n \n {{sortOrder(column.field)}}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{column.displayTitle}}\n \n \n \n \n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\"\n >\n \n `\n }]\n }], function () { return [{ type: SinglePopupService }, { type: DragHintService }, { type: DropCueService }, { type: ColumnReorderService }, { type: IdService }, { type: SortService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { columns: [{\n type: Input\n }], groups: [{\n type: Input\n }], sort: [{\n type: Input\n }], sortable: [{\n type: Input\n }], groupable: [{\n type: Input\n }], lockedColumnsCount: [{\n type: Input\n }], resizable: [{\n type: Input\n }], reorderable: [{\n type: Input\n }], columnMenu: [{\n type: Input\n }], totalColumnsCount: [{\n type: Input\n }], dropTargets: [{\n type: ViewChildren,\n args: [DropTargetDirective]\n }], headerClass: [{\n type: HostBinding,\n args: ['class.k-grid-header']\n }], totalColumnLevels: [{\n type: Input\n }], detailTemplate: [{\n type: Input\n }], scrollable: [{\n type: Input\n }], filterable: [{\n type: Input\n }], filter: [{\n type: Input\n }], columnMenuTemplate: [{\n type: Input\n }] }); })();\n\n// TODO\n// tslint:disable:rxjs-no-unsafe-takeuntil\n/**\n * @hidden\n */\nconst fromPercentage = (value, percent) => {\n const sign = percent < 0 ? -1 : 1;\n return Math.ceil((Math.abs(percent) / 100) * value) * sign;\n};\n/**\n * @hidden\n */\nconst toPercentage = (value, whole) => (value / whole) * 100;\n/**\n * @hidden\n */\nconst headerWidth = (handle) => handle.nativeElement.parentElement.offsetWidth;\n/**\n * @hidden\n */\nconst allLeafColumns = columns => expandColumns(columns)\n .filter(c => !c.isColumnGroup);\n/**\n * @hidden\n */\nconst stopPropagation = ({ originalEvent: event }) => {\n event.stopPropagation();\n event.preventDefault();\n};\n/**\n * @hidden\n */\nconst createMoveStream = (service, draggable) => mouseDown => draggable.kendoDrag.pipe(takeUntil(draggable.kendoRelease.pipe(tap(() => service.end()))), map(({ pageX }) => ({\n originalX: mouseDown.pageX,\n pageX\n})));\n/**\n * @hidden\n */\nconst preventOnDblClick$1 = release => mouseDown => of(mouseDown).pipe(delay(150), takeUntil(release));\n/**\n * @hidden\n */\nconst isInSpanColumn$1 = column => !!(column.parent && column.parent.isSpanColumn);\n/**\n * @hidden\n *\n * Calculates the column index. If the column is stated in `SpanColumn`,\n * the index for all child columns equals the index of the first child.\n */\nconst indexOf = (target, list) => {\n let index = 0;\n let ignore = 0;\n let skip = 0;\n while (index < list.length) {\n const current = list[index];\n const isParentSpanColumn = isInSpanColumn$1(current);\n if (current === target) {\n break;\n }\n if ((ignore-- <= 0) && isParentSpanColumn) {\n ignore = current.parent.childColumns.length - 1;\n skip += ignore;\n }\n index++;\n }\n return index - skip;\n};\n/**\n * @hidden\n */\nclass ColumnHandleDirective {\n constructor(draggable, element, service, zone, cdr, localization) {\n this.draggable = draggable;\n this.element = element;\n this.service = service;\n this.zone = zone;\n this.cdr = cdr;\n this.localization = localization;\n this.columns = [];\n this.subscriptions = new Subscription();\n this.rtl = false;\n }\n get visible() {\n return this.column.resizable ? 'block' : 'none';\n }\n get leftStyle() {\n return isTruthy(this.rtl) ? 0 : null;\n }\n get rightStyle() {\n return isTruthy(this.rtl) ? null : 0;\n }\n autoFit() {\n const allLeafs = allLeafColumns(this.columns);\n const currentLeafs = leafColumns([this.column]).filter(column => isTruthy(column.resizable));\n const columnInfo = currentLeafs.map(column => {\n const isParentSpan = isInSpanColumn$1(column);\n const isLastInSpan = isParentSpan ? column.parent.childColumns.last === column : false;\n const index = indexOf(column, allLeafs);\n return {\n column,\n headerIndex: this.columnsForLevel(column.level).indexOf(column),\n index,\n isLastInSpan,\n isParentSpan,\n level: column.level\n };\n });\n currentLeafs.forEach(column => column.width = 0);\n this.service.measureColumns(columnInfo);\n }\n ngOnInit() {\n const service = this.service.changes.pipe(filter(() => this.column.resizable), filter(e => isPresent(e.columns.find(column => column === this.column))));\n this.subscriptions.add(service.pipe(filter(e => e.type === 'start'))\n .subscribe(this.initState.bind(this)));\n this.subscriptions.add(service.pipe(filter(e => e.type === 'resizeColumn'))\n .subscribe(this.resize.bind(this)));\n this.subscriptions.add(this.service.changes.pipe(filter(e => e.type === 'start'), filter(this.shouldUpdate.bind(this)), take(1) //on first resize only\n ).subscribe(this.initColumnWidth.bind(this)));\n this.subscriptions.add(this.zone.runOutsideAngular(() => this.draggable.kendoPress.pipe(tap(stopPropagation), tap(() => this.service.start(this.column)), switchMap(preventOnDblClick$1(this.draggable.kendoRelease)), switchMap(createMoveStream(this.service, this.draggable)))\n .subscribe(({ pageX, originalX }) => {\n const delta = pageX - originalX;\n const percent = toPercentage(delta, this.column.resizeStartWidth || this.column.width);\n this.service.resizeColumns(percent);\n })));\n this.subscriptions.add(service.pipe(filter(e => e.type === 'autoFitComplete'))\n .subscribe(this.sizeToFit.bind(this)));\n this.subscriptions.add(service.pipe(filter(e => e.type === 'triggerAutoFit'))\n .subscribe(this.autoFit.bind(this)));\n this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => this.rtl = rtl));\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n shouldUpdate() {\n return !allLeafColumns(this.columns)\n .map(column => column.width)\n .some(isBlank);\n }\n initColumnWidth() {\n this.column.width = headerWidth(this.element);\n }\n initState() {\n this.column.resizeStartWidth = headerWidth(this.element);\n this.service.resizedColumn({\n column: this.column,\n oldWidth: this.column.resizeStartWidth\n });\n }\n resize({ deltaPercent }) {\n let delta = fromPercentage(this.column.resizeStartWidth, deltaPercent);\n if (isTruthy(this.rtl)) {\n delta *= -1;\n }\n const newWidth = Math.max(this.column.resizeStartWidth + delta, this.column.minResizableWidth);\n const tableDelta = newWidth > this.column.minResizableWidth ?\n delta : this.column.minResizableWidth - this.column.resizeStartWidth;\n this.updateWidth(this.column, newWidth);\n this.service.resizeTable(this.column, tableDelta);\n }\n sizeToFit({ columns, widths }) {\n const index = columns.indexOf(this.column);\n const width = Math.max(...widths.map(w => w[index])) + 1; //add 1px for IE\n const tableDelta = width - this.column.resizeStartWidth;\n this.updateWidth(this.column, width);\n this.service.resizeTable(this.column, tableDelta);\n }\n updateWidth(column, width) {\n column.width = width;\n this.cdr.markForCheck(); //force CD cycle\n }\n columnsForLevel(level) {\n return columnsToRender(this.columns ? this.columns.filter(column => column.level === level) : []);\n }\n}\nColumnHandleDirective.ɵfac = function ColumnHandleDirective_Factory(t) { return new (t || ColumnHandleDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.DraggableDirective, 1), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ColumnResizingService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nColumnHandleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnHandleDirective, selectors: [[\"\", \"kendoGridColumnHandle\", \"\"]], hostVars: 6, hostBindings: function ColumnHandleDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"dblclick\", function ColumnHandleDirective_dblclick_HostBindingHandler() { return ctx.autoFit(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible)(\"left\", ctx.leftStyle)(\"right\", ctx.rightStyle);\n } }, inputs: { columns: \"columns\", column: \"column\" } });\n/** @nocollapse */\nColumnHandleDirective.ctorParameters = () => [\n { type: DraggableDirective, decorators: [{ type: Host }] },\n { type: ElementRef },\n { type: ColumnResizingService },\n { type: NgZone },\n { type: ChangeDetectorRef },\n { type: LocalizationService }\n];\nColumnHandleDirective.propDecorators = {\n columns: [{ type: Input }],\n column: [{ type: Input }],\n visible: [{ type: HostBinding, args: ['style.display',] }],\n leftStyle: [{ type: HostBinding, args: ['style.left',] }],\n rightStyle: [{ type: HostBinding, args: ['style.right',] }],\n autoFit: [{ type: HostListener, args: ['dblclick',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnHandleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridColumnHandle]'\n }]\n }], function () { return [{ type: ɵngcc2.DraggableDirective, decorators: [{\n type: Host\n }] }, { type: ɵngcc0.ElementRef }, { type: ColumnResizingService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.LocalizationService }]; }, { columns: [{\n type: Input\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }], leftStyle: [{\n type: HostBinding,\n args: ['style.left']\n }], rightStyle: [{\n type: HostBinding,\n args: ['style.right']\n }], autoFit: [{\n type: HostListener,\n args: ['dblclick']\n }], column: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the select-all checkbox feature of the Grid ([see example]({% slug selection_grid %}#toc-select-all-feature)).\n */\nclass SelectAllCheckboxDirective {\n constructor(selectionService, el, renderer, ngZone) {\n this.selectionService = selectionService;\n this.el = el;\n this.renderer = renderer;\n this.ngZone = ngZone;\n /**\n * Fires when the user clicks the `kendoGridSelectAllCheckbox` select-all checkbox\n * ([see example]({% slug selection_grid %}#toc-select-all-feature)).\n */\n this.selectAllChange = new EventEmitter();\n this.type = \"checkbox\";\n this.stateSet = false;\n this.ngZone.runOutsideAngular(() => {\n this.destroyClick = this.renderer.listen(this.el.nativeElement, \"click\", this.onClick.bind(this));\n });\n }\n ngAfterContentChecked() {\n this.setState();\n }\n ngOnChanges() {\n this.stateSet = true;\n }\n ngOnDestroy() {\n if (this.destroyClick) {\n this.destroyClick();\n }\n }\n /**\n * @hidden\n */\n onClick() {\n // yields consistent cross-browser behavior when clicking an \"indeterminate\" checkbox\n const undefinedCheckedStateInIE = detectIE() && this.selectionService.selectAllState === undefined;\n const isChecked = undefinedCheckedStateInIE ? true : this.el.nativeElement.checked;\n const options = this.selectionService.options;\n this.selectAllChange.emit(isChecked ? \"checked\" : \"unchecked\");\n if (options.enabled && options.mode === \"multiple\") {\n this.ngZone.run(() => {\n this.selectionService.updateAll(isChecked);\n });\n }\n }\n /**\n * @hidden\n */\n setState() {\n const state$$1 = this.stateSet ? this.stateToBool() : this.selectionService.selectAllState;\n const elem = this.el.nativeElement;\n this.renderer.setProperty(elem, \"indeterminate\", !isPresent(state$$1));\n this.renderer.setProperty(elem, \"checked\", isPresent(state$$1) ? state$$1 : false);\n }\n /**\n * @hidden\n */\n stateToBool() {\n switch (this.state) {\n case \"checked\":\n return true;\n case \"unchecked\":\n return false;\n default:\n return undefined;\n }\n }\n}\nSelectAllCheckboxDirective.ɵfac = function SelectAllCheckboxDirective_Factory(t) { return new (t || SelectAllCheckboxDirective)(ɵngcc0.ɵɵdirectiveInject(SelectionService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nSelectAllCheckboxDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: SelectAllCheckboxDirective, selectors: [[\"\", \"kendoGridSelectAllCheckbox\", \"\"]], hostVars: 1, hostBindings: function SelectAllCheckboxDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.type);\n } }, inputs: { state: \"state\" }, outputs: { selectAllChange: \"selectAllChange\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n/** @nocollapse */\nSelectAllCheckboxDirective.ctorParameters = () => [\n { type: SelectionService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nSelectAllCheckboxDirective.propDecorators = {\n state: [{ type: Input }],\n selectAllChange: [{ type: Output }],\n type: [{ type: HostBinding, args: ['attr.type',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SelectAllCheckboxDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridSelectAllCheckbox]'\n }]\n }], function () { return [{ type: SelectionService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { selectAllChange: [{\n type: Output\n }], type: [{\n type: HostBinding,\n args: ['attr.type']\n }], state: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass FilterMenuComponent {\n constructor(filterService, popupService, localization) {\n this.filterService = filterService;\n this.popupService = popupService;\n this.localization = localization;\n /**\n * @hidden\n */\n this.filterLabel = this.localization.get('filter');\n }\n get hasFilters() {\n return filtersByField(this.filter, (this.column || {}).field).length > 0;\n }\n toggle(anchor, template) {\n this.popupRef = this.popupService.open(anchor, template, this.popupRef);\n return false;\n }\n close() {\n this.popupService.destroy();\n }\n}\nFilterMenuComponent.ɵfac = function FilterMenuComponent_Factory(t) { return new (t || FilterMenuComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(SinglePopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nFilterMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterMenuComponent, selectors: [[\"kendo-grid-filter-menu\"]], inputs: { column: \"column\", filter: \"filter\" }, decls: 5, vars: 4, consts: [[\"href\", \"#\", 3, \"ngClass\", \"click\"], [\"anchor\", \"\"], [1, \"k-icon\", \"k-i-filter\"], [\"template\", \"\"], [3, \"column\", \"filter\", \"close\"]], template: function FilterMenuComponent_Template(rf, ctx) { if (rf & 1) {\n const _r303 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"a\", 0, 1);\n ɵngcc0.ɵɵlistener(\"click\", function FilterMenuComponent_Template_a_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r303); const _r298 = ɵngcc0.ɵɵreference(1); const _r299 = ɵngcc0.ɵɵreference(4); return ctx.toggle(_r298, _r299); });\n ɵngcc0.ɵɵelement(2, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, FilterMenuComponent_ng_template_3_Template, 1, 2, \"ng-template\", null, 3, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction1(2, _c154, ctx.hasFilters));\n ɵngcc0.ɵɵattribute(\"title\", ctx.filterLabel);\n } }, directives: function () { return [ɵngcc5.NgClass, FilterMenuContainerComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nFilterMenuComponent.ctorParameters = () => [\n { type: FilterService },\n { type: SinglePopupService },\n { type: LocalizationService }\n];\nFilterMenuComponent.propDecorators = {\n column: [{ type: Input }],\n filter: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-filter-menu',\n template: `\n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: FilterService }, { type: SinglePopupService }, { type: ɵngcc1.LocalizationService }]; }, { column: [{\n type: Input\n }], filter: [{\n type: Input\n }] }); })();\n\nconst isNoValueOperator = operator => (operator === \"isnull\"\n || operator === \"isnotnull\"\n || operator === \"isempty\"\n || operator === \"isnotempty\");\nconst validFilters = ({ value, operator }) => !isNullOrEmptyString(value) || isNoValueOperator(operator);\nconst trimFilters = filter$$1 => {\n filter$$1.filters = filter$$1.filters.filter(validFilters);\n return filter$$1;\n};\nconst findParent = (filters, field, parent) => {\n return filters.reduce((acc, filter$$1) => {\n if (acc) {\n return acc;\n }\n if (filter$$1.filters) {\n return findParent(filter$$1.filters, field, filter$$1);\n }\n else if (filter$$1.field === field) {\n return parent;\n }\n return acc;\n }, undefined); // tslint:disable-line:align\n};\nconst parentLogicOfDefault = (filter$$1, field, def = \"and\") => {\n const parent = findParent(((filter$$1 || {}).filters || []), field);\n return isPresent(parent) ? parent.logic : def;\n};\n/**\n * @hidden\n */\nclass FilterMenuContainerComponent {\n constructor(parentService, childService, localization, cd) {\n this.parentService = parentService;\n this.childService = childService;\n this.localization = localization;\n this.cd = cd;\n this.close = new EventEmitter();\n /**\n * @hidden\n */\n this.actionsClass = 'k-action-buttons k-button-group';\n this._templateContext = {};\n }\n get filter() {\n return this._filter;\n }\n /**\n * The current root filter.\n * @type {CompositeFilterDescriptor}\n */\n set filter(value) {\n this._filter = cloneFilters(value);\n }\n get childFilter() {\n if (!isPresent(this._childFilter)) {\n this._childFilter = {\n filters: filtersByField(this.filter, (this.column || {}).field),\n logic: parentLogicOfDefault(this.filter, (this.column || {}).field)\n };\n }\n return this._childFilter;\n }\n ngOnInit() {\n this.subscription = this.childService.changes.subscribe(filter$$1 => this._childFilter = filter$$1);\n this.subscription.add(this.localization.changes.subscribe(() => this.cd.markForCheck()));\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n get disabled() {\n return !this.childFilter.filters.some(validFilters);\n }\n get templateContext() {\n this._templateContext.column = this.column;\n this._templateContext.filter = this.childFilter;\n this._templateContext.filterService = this.childService;\n // tslint:disable-next-line:no-string-literal\n this._templateContext[\"$implicit\"] = this.childFilter;\n return this._templateContext;\n }\n get hasTemplate() {\n return isPresent(this.column) && isPresent(this.column.filterMenuTemplateRef);\n }\n submit() {\n const filter$$1 = trimFilters(this.childFilter);\n if (filter$$1.filters.length) {\n const root = this.filter || {\n filters: [],\n logic: \"and\"\n };\n removeFilter(root, this.column.field);\n root.filters.push(filter$$1);\n this.parentService.filter(root);\n }\n this.close.emit();\n return false;\n }\n reset() {\n const root = this.filter || {\n filters: [],\n logic: \"and\"\n };\n removeFilter(root, this.column.field);\n this.parentService.filter(root);\n this.close.emit();\n }\n get clearText() {\n return this.localization.get(\"filterClearButton\");\n }\n get filterText() {\n return this.localization.get(\"filterFilterButton\");\n }\n}\nFilterMenuContainerComponent.ɵfac = function FilterMenuContainerComponent_Factory(t) { return new (t || FilterMenuContainerComponent)(ɵngcc0.ɵɵdirectiveInject(FilterService, 4), ɵngcc0.ɵɵdirectiveInject(FilterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nFilterMenuContainerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterMenuContainerComponent, selectors: [[\"kendo-grid-filter-menu-container\"]], inputs: { actionsClass: \"actionsClass\", filter: \"filter\", column: \"column\" }, outputs: { close: \"close\" }, features: [ɵngcc0.ɵɵProvidersFeature([FilterService])], decls: 10, vars: 7, consts: [[1, \"k-filter-menu\", \"k-group\", \"k-reset\", \"k-state-border-up\", 3, \"submit\", \"reset\"], [1, \"k-filter-menu-container\"], [3, \"ngSwitch\"], [4, \"ngSwitchCase\"], [3, \"ngClass\"], [\"type\", \"reset\", 1, \"k-button\"], [\"type\", \"submit\", 1, \"k-button\", \"k-primary\", 3, \"disabled\"], [\"kendoFilterMenuHost\", \"\", 3, \"filterService\", \"column\", \"filter\"], [4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function FilterMenuContainerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"form\", 0);\n ɵngcc0.ɵɵlistener(\"submit\", function FilterMenuContainerComponent_Template_form_submit_0_listener() { return ctx.submit(); })(\"reset\", function FilterMenuContainerComponent_Template_form_reset_0_listener() { return ctx.reset(); });\n ɵngcc0.ɵɵelementStart(1, \"div\", 1);\n ɵngcc0.ɵɵelementContainerStart(2, 2);\n ɵngcc0.ɵɵtemplate(3, FilterMenuContainerComponent_ng_container_3_Template, 2, 3, \"ng-container\", 3);\n ɵngcc0.ɵɵtemplate(4, FilterMenuContainerComponent_ng_container_4_Template, 2, 1, \"ng-container\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelementStart(5, \"div\", 4);\n ɵngcc0.ɵɵelementStart(6, \"button\", 5);\n ɵngcc0.ɵɵtext(7);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(8, \"button\", 6);\n ɵngcc0.ɵɵtext(9);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.hasTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx.actionsClass);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx.clearText);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"disabled\", ctx.disabled);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx.filterText);\n } }, directives: function () { return [ɵngcc7.ɵangular_packages_forms_forms_y, ɵngcc7.NgControlStatusGroup, ɵngcc7.NgForm, ɵngcc5.NgSwitch, ɵngcc5.NgSwitchCase, ɵngcc5.NgClass, FilterMenuHostDirective, ɵngcc5.NgIf, ɵngcc5.NgTemplateOutlet]; }, encapsulation: 2 });\n/** @nocollapse */\nFilterMenuContainerComponent.ctorParameters = () => [\n { type: FilterService, decorators: [{ type: SkipSelf }] },\n { type: FilterService },\n { type: LocalizationService },\n { type: ChangeDetectorRef }\n];\nFilterMenuContainerComponent.propDecorators = {\n close: [{ type: Output }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n actionsClass: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuContainerComponent, [{\n type: Component,\n args: [{\n providers: [FilterService],\n selector: 'kendo-grid-filter-menu-container',\n template: `\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n
\n
\n
\n `\n }]\n }], function () { return [{ type: FilterService, decorators: [{\n type: SkipSelf\n }] }, { type: FilterService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { close: [{\n type: Output\n }], actionsClass: [{\n type: Input\n }], filter: [{\n type: Input\n }], column: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass FilterMenuInputWrapperComponent extends FilterInputWrapperComponent {\n constructor() {\n super(null);\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return false;\n }\n operatorChange(dataItem) {\n this.currentOperator = dataItem;\n }\n filterChange(filter$$1) {\n this.applyFilter(filter$$1);\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n get currentFilter() {\n return this._currentFilter;\n }\n /**\n * The current filter for the associated column field.\n * @readonly\n * @type {FilterDescriptor}\n */\n set currentFilter(value) {\n this._currentFilter = value;\n }\n updateFilter(filter$$1) {\n Object.assign(this.currentFilter, filter$$1);\n return this.filter;\n }\n onChange(value) {\n this.filterChange(this.updateFilter({\n field: this.column.field,\n operator: this.currentOperator,\n value: value\n }));\n }\n}\nFilterMenuInputWrapperComponent.ɵfac = function FilterMenuInputWrapperComponent_Factory(t) { return new (t || FilterMenuInputWrapperComponent)(); };\nFilterMenuInputWrapperComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FilterMenuInputWrapperComponent, selectors: [[\"kendo-grid-filter-menu-input-wrapper\"]], inputs: { currentFilter: \"currentFilter\", filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c125, decls: 2, vars: 3, consts: [[\"textField\", \"text\", \"valueField\", \"value\", 3, \"data\", \"value\", \"valuePrimitive\", \"valueChange\"]], template: function FilterMenuInputWrapperComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"kendo-dropdownlist\", 0);\n ɵngcc0.ɵɵlistener(\"valueChange\", function FilterMenuInputWrapperComponent_Template_kendo_dropdownlist_valueChange_0_listener($event) { return ctx.operatorChange($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵprojection(1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"data\", ctx.operators)(\"value\", ctx.currentOperator)(\"valuePrimitive\", true);\n } }, directives: [ɵngcc8.DropDownListComponent], encapsulation: 2 });\n/** @nocollapse */\nFilterMenuInputWrapperComponent.ctorParameters = () => [];\nFilterMenuInputWrapperComponent.propDecorators = {\n filterService: [{ type: Input }],\n currentFilter: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuInputWrapperComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-filter-menu-input-wrapper',\n template: `\n \n \n \n `\n }]\n }], function () { return []; }, { currentFilter: [{\n type: Input\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass StringFilterMenuInputComponent {\n constructor() {\n this.operators = [];\n }\n}\nStringFilterMenuInputComponent.ɵfac = function StringFilterMenuInputComponent_Factory(t) { return new (t || StringFilterMenuInputComponent)(); };\nStringFilterMenuInputComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StringFilterMenuInputComponent, selectors: [[\"kendo-grid-string-filter-menu-input\"]], inputs: { operators: \"operators\", column: \"column\", filter: \"filter\", operator: \"operator\", currentFilter: \"currentFilter\", filterService: \"filterService\" }, decls: 2, vars: 8, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"currentFilter\", \"filterService\"], [\"kendoFilterInput\", \"\", 1, \"k-textbox\", 3, \"filterDelay\", \"ngModel\"]], template: function StringFilterMenuInputComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-menu-input-wrapper\", 0);\n ɵngcc0.ɵɵelement(1, \"input\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"currentFilter\", ctx.currentFilter)(\"filterService\", ctx.filterService);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterDelay\", 0)(\"ngModel\", ctx.currentFilter == null ? null : ctx.currentFilter.value);\n } }, directives: [FilterMenuInputWrapperComponent, ɵngcc7.DefaultValueAccessor, FilterInputDirective, ɵngcc7.NgControlStatus, ɵngcc7.NgModel], encapsulation: 2 });\nStringFilterMenuInputComponent.propDecorators = {\n operators: [{ type: Input }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }],\n currentFilter: [{ type: Input }],\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StringFilterMenuInputComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-string-filter-menu-input',\n template: `\n \n \n \n `\n }]\n }], function () { return []; }, { operators: [{\n type: Input\n }], column: [{\n type: Input\n }], filter: [{\n type: Input\n }], operator: [{\n type: Input\n }], currentFilter: [{\n type: Input\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * Represents a string-filter menu component.\n * ([see example]({% slug builtinfiltertemplate_grid %}#toc-configuration-components-for-filter-templates)).\n */\nclass StringFilterMenuComponent extends StringFilterComponent {\n constructor(localization) {\n super(null, localization);\n this.logicOperators = logicOperators(this.localization);\n /**\n * The current menu filter.\n * @type {CompositeFilterDescriptor}\n */\n this.filter = { filters: [], logic: \"and\" };\n /**\n * Determines if the inputs of second criteria will displayed.\n */\n this.extra = true;\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return false;\n }\n get firstFilter() {\n return setFilter(0, this.filter, (this.column || {}).field, this.operator);\n }\n get secondFilter() {\n return setFilter(1, this.filter, (this.column || {}).field, this.operator);\n }\n logicChange(value) {\n this.filter.logic = value;\n }\n localizationChange() {\n this.logicOperators = logicOperators(this.localization);\n super.localizationChange();\n }\n}\nStringFilterMenuComponent.ɵfac = function StringFilterMenuComponent_Factory(t) { return new (t || StringFilterMenuComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nStringFilterMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StringFilterMenuComponent, selectors: [[\"kendo-grid-string-filter-menu\"]], hostVars: 2, hostBindings: function StringFilterMenuComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell\", ctx.hostClasses);\n } }, inputs: { filter: \"filter\", extra: \"extra\", column: \"column\", filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 7, consts: [[3, \"currentFilter\", \"operators\", \"filterService\", \"column\", \"filter\"], [\"class\", \"k-filter-and\", \"textField\", \"text\", \"valueField\", \"value\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\", 4, \"ngIf\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\", 4, \"ngIf\"], [\"textField\", \"text\", \"valueField\", \"value\", 1, \"k-filter-and\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\"]], template: function StringFilterMenuComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-string-filter-menu-input\", 0);\n ɵngcc0.ɵɵtemplate(1, StringFilterMenuComponent_kendo_dropdownlist_1_Template, 1, 3, \"kendo-dropdownlist\", 1);\n ɵngcc0.ɵɵtemplate(2, StringFilterMenuComponent_kendo_grid_string_filter_menu_input_2_Template, 1, 5, \"kendo-grid-string-filter-menu-input\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"currentFilter\", ctx.firstFilter)(\"operators\", ctx.operators)(\"filterService\", ctx.filterService)(\"column\", ctx.column)(\"filter\", ctx.filter);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n } }, directives: [StringFilterMenuInputComponent, ɵngcc5.NgIf, ɵngcc8.DropDownListComponent], encapsulation: 2 });\n/** @nocollapse */\nStringFilterMenuComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nStringFilterMenuComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n extra: [{ type: Input }],\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StringFilterMenuComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-string-filter-menu',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { filter: [{\n type: Input\n }], extra: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell']\n }], column: [{\n type: Input\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * Represents a numeric-filter menu component.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass NumericFilterMenuComponent extends NumericFilterComponent {\n constructor(localization) {\n super(null, localization);\n this.logicOperators = logicOperators(this.localization);\n /**\n * The current menu filter.\n * @type {CompositeFilterDescriptor}\n */\n this.filter = { filters: [], logic: \"and\" };\n /**\n * Determines if the inputs of second criteria will displayed.\n */\n this.extra = true;\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return false;\n }\n get firstFilter() {\n return setFilter(0, this.filter, (this.column || {}).field, this.operator);\n }\n get secondFilter() {\n return setFilter(1, this.filter, (this.column || {}).field, this.operator);\n }\n logicChange(value) {\n this.filter.logic = value;\n }\n localizationChange() {\n this.logicOperators = logicOperators(this.localization);\n super.localizationChange();\n }\n}\nNumericFilterMenuComponent.ɵfac = function NumericFilterMenuComponent_Factory(t) { return new (t || NumericFilterMenuComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nNumericFilterMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: NumericFilterMenuComponent, selectors: [[\"kendo-grid-numeric-filter-menu\"]], hostVars: 2, hostBindings: function NumericFilterMenuComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell\", ctx.hostClasses);\n } }, inputs: { filter: \"filter\", extra: \"extra\", column: \"column\", filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 13, consts: [[3, \"currentFilter\", \"operators\", \"filterService\", \"column\", \"filter\", \"format\", \"decimals\", \"spinners\", \"min\", \"max\", \"step\"], [\"class\", \"k-filter-and\", \"textField\", \"text\", \"valueField\", \"value\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\", 4, \"ngIf\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\", \"format\", \"decimals\", \"spinners\", \"min\", \"max\", \"step\", 4, \"ngIf\"], [\"textField\", \"text\", \"valueField\", \"value\", 1, \"k-filter-and\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\", \"format\", \"decimals\", \"spinners\", \"min\", \"max\", \"step\"]], template: function NumericFilterMenuComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-numeric-filter-menu-input\", 0);\n ɵngcc0.ɵɵtemplate(1, NumericFilterMenuComponent_kendo_dropdownlist_1_Template, 1, 3, \"kendo-dropdownlist\", 1);\n ɵngcc0.ɵɵtemplate(2, NumericFilterMenuComponent_kendo_grid_numeric_filter_menu_input_2_Template, 1, 11, \"kendo-grid-numeric-filter-menu-input\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"currentFilter\", ctx.firstFilter)(\"operators\", ctx.operators)(\"filterService\", ctx.filterService)(\"column\", ctx.column)(\"filter\", ctx.filter)(\"format\", ctx.format)(\"decimals\", ctx.decimals)(\"spinners\", ctx.spinners)(\"min\", ctx.min)(\"max\", ctx.max)(\"step\", ctx.step);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n } }, directives: function () { return [NumericFilterMenuInputComponent, ɵngcc5.NgIf, ɵngcc8.DropDownListComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nNumericFilterMenuComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nNumericFilterMenuComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n extra: [{ type: Input }],\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NumericFilterMenuComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-numeric-filter-menu',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { filter: [{\n type: Input\n }], extra: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell']\n }], column: [{\n type: Input\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass NumericFilterMenuInputComponent {\n constructor(localization) {\n this.localization = localization;\n this.operators = [];\n /**\n * Specifies the value which is used to increment or decrement the component value.\n * @type {numeric}\n */\n this.step = 1;\n /**\n * Specifies whether the **Up** and **Down** spin buttons will be rendered.\n * @type {boolean}\n */\n this.spinners = true;\n }\n messageFor(key) {\n return this.localization.get(key);\n }\n}\nNumericFilterMenuInputComponent.ɵfac = function NumericFilterMenuInputComponent_Factory(t) { return new (t || NumericFilterMenuInputComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nNumericFilterMenuInputComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: NumericFilterMenuInputComponent, selectors: [[\"kendo-grid-numeric-filter-menu-input\"]], inputs: { operators: \"operators\", step: \"step\", spinners: \"spinners\", column: \"column\", filter: \"filter\", operator: \"operator\", currentFilter: \"currentFilter\", filterService: \"filterService\", min: \"min\", max: \"max\", decimals: \"decimals\", format: \"format\" }, decls: 3, vars: 17, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"currentFilter\", \"filterService\"], [\"kendoFilterInput\", \"\", 3, \"filterDelay\", \"autoCorrect\", \"value\", \"format\", \"decimals\", \"spinners\", \"min\", \"max\", \"step\"], [3, \"increment\", \"decrement\"]], template: function NumericFilterMenuInputComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-menu-input-wrapper\", 0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-numerictextbox\", 1);\n ɵngcc0.ɵɵelement(2, \"kendo-numerictextbox-messages\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"currentFilter\", ctx.currentFilter)(\"filterService\", ctx.filterService);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterDelay\", 0)(\"autoCorrect\", true)(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value)(\"format\", ctx.format)(\"decimals\", ctx.decimals)(\"spinners\", ctx.spinners)(\"min\", ctx.min)(\"max\", ctx.max)(\"step\", ctx.step);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"increment\", ctx.messageFor(\"filterNumericIncrement\"))(\"decrement\", ctx.messageFor(\"filterNumericDecrement\"));\n } }, directives: [FilterMenuInputWrapperComponent, ɵngcc6.NumericTextBoxComponent, FilterInputDirective, ɵngcc6.NumericTextBoxCustomMessagesComponent], encapsulation: 2 });\n/** @nocollapse */\nNumericFilterMenuInputComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nNumericFilterMenuInputComponent.propDecorators = {\n operators: [{ type: Input }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }],\n currentFilter: [{ type: Input }],\n filterService: [{ type: Input }],\n step: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n spinners: [{ type: Input }],\n decimals: [{ type: Input }],\n format: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NumericFilterMenuInputComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-numeric-filter-menu-input',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { operators: [{\n type: Input\n }], step: [{\n type: Input\n }], spinners: [{\n type: Input\n }], column: [{\n type: Input\n }], filter: [{\n type: Input\n }], operator: [{\n type: Input\n }], currentFilter: [{\n type: Input\n }], filterService: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], decimals: [{\n type: Input\n }], format: [{\n type: Input\n }] }); })();\n\n/**\n * Represents a date-filter menu component.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass DateFilterMenuComponent extends DateFilterComponent {\n constructor(localization) {\n super(null, localization);\n this.logicOperators = logicOperators(this.localization);\n /**\n * The current menu filter.\n * @type {CompositeFilterDescriptor}\n */\n this.filter = { filters: [], logic: \"and\" };\n /**\n * Determines if the inputs of second criteria will be displayed.\n */\n this.extra = true;\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return false;\n }\n get firstFilter() {\n return setFilter(0, this.filter, (this.column || {}).field, this.operator);\n }\n get secondFilter() {\n return setFilter(1, this.filter, (this.column || {}).field, this.operator);\n }\n logicChange(value) {\n this.filter.logic = value;\n }\n localizationChange() {\n this.logicOperators = logicOperators(this.localization);\n super.localizationChange();\n }\n}\nDateFilterMenuComponent.ɵfac = function DateFilterMenuComponent_Factory(t) { return new (t || DateFilterMenuComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nDateFilterMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateFilterMenuComponent, selectors: [[\"kendo-grid-date-filter-menu\"]], hostVars: 2, hostBindings: function DateFilterMenuComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell\", ctx.hostClasses);\n } }, inputs: { filter: \"filter\", extra: \"extra\", column: \"column\", filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 16, consts: [[3, \"currentFilter\", \"operators\", \"filterService\", \"column\", \"filter\", \"activeView\", \"bottomView\", \"topView\", \"format\", \"formatPlaceholder\", \"placeholder\", \"min\", \"max\", \"weekNumber\"], [\"class\", \"k-filter-and\", \"textField\", \"text\", \"valueField\", \"value\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\", 4, \"ngIf\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\", \"activeView\", \"bottomView\", \"topView\", \"format\", \"formatPlaceholder\", \"placeholder\", \"min\", \"max\", \"weekNumber\", 4, \"ngIf\"], [\"textField\", \"text\", \"valueField\", \"value\", 1, \"k-filter-and\", 3, \"data\", \"valuePrimitive\", \"value\", \"valueChange\"], [3, \"operators\", \"currentFilter\", \"filterService\", \"column\", \"filter\", \"activeView\", \"bottomView\", \"topView\", \"format\", \"formatPlaceholder\", \"placeholder\", \"min\", \"max\", \"weekNumber\"]], template: function DateFilterMenuComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-grid-date-filter-menu-input\", 0);\n ɵngcc0.ɵɵtemplate(1, DateFilterMenuComponent_kendo_dropdownlist_1_Template, 1, 3, \"kendo-dropdownlist\", 1);\n ɵngcc0.ɵɵtemplate(2, DateFilterMenuComponent_kendo_grid_date_filter_menu_input_2_Template, 1, 14, \"kendo-grid-date-filter-menu-input\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"currentFilter\", ctx.firstFilter)(\"operators\", ctx.operators)(\"filterService\", ctx.filterService)(\"column\", ctx.column)(\"filter\", ctx.filter)(\"activeView\", ctx.activeView)(\"bottomView\", ctx.bottomView)(\"topView\", ctx.topView)(\"format\", ctx.format)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"placeholder\", ctx.placeholder)(\"min\", ctx.min)(\"max\", ctx.max)(\"weekNumber\", ctx.weekNumber);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.extra);\n } }, directives: function () { return [DateFilterMenuInputComponent, ɵngcc5.NgIf, ɵngcc8.DropDownListComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nDateFilterMenuComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nDateFilterMenuComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n extra: [{ type: Input }],\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateFilterMenuComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-date-filter-menu',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { filter: [{\n type: Input\n }], extra: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell']\n }], column: [{\n type: Input\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * Represents a Boolean-filter menu component.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * ```\n */\nclass BooleanFilterMenuComponent extends BooleanFilterComponent {\n constructor(localization) {\n super(null, localization);\n /**\n * The current menu filter.\n * @type {CompositeFilterDescriptor}\n */\n this.filter = { filters: [], logic: \"and\" };\n this.idPrefix = guid();\n }\n /**\n * @hidden\n */\n get hostClasses() {\n return false;\n }\n /**\n * @hidden\n */\n radioId(value) {\n return `${this.idPrefix}_${value}`;\n }\n /**\n * @hidden\n */\n onChange(value) {\n this.applyFilter(this.updateFilter({\n field: this.column.field,\n operator: \"eq\",\n value: value\n }));\n }\n /**\n * @hidden\n */\n isSelected(radioValue) {\n return this.filtersByField(this.column.field).some(({ value }) => value === radioValue);\n }\n}\nBooleanFilterMenuComponent.ɵfac = function BooleanFilterMenuComponent_Factory(t) { return new (t || BooleanFilterMenuComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nBooleanFilterMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: BooleanFilterMenuComponent, selectors: [[\"kendo-grid-boolean-filter-menu\"]], hostVars: 2, hostBindings: function BooleanFilterMenuComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-filtercell\", ctx.hostClasses);\n } }, inputs: { filter: \"filter\", filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, \"k-radio-list\", \"k-reset\"], [4, \"ngFor\", \"ngForOf\"], [\"type\", \"radio\", 1, \"k-radio\", 3, \"name\", \"checked\", \"change\"], [1, \"k-radio-label\"]], template: function BooleanFilterMenuComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"ul\", 0);\n ɵngcc0.ɵɵtemplate(1, BooleanFilterMenuComponent_li_1_Template, 4, 5, \"li\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.items);\n } }, directives: [ɵngcc5.NgForOf], encapsulation: 2 });\n/** @nocollapse */\nBooleanFilterMenuComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nBooleanFilterMenuComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-filtercell',] }],\n filter: [{ type: Input }],\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BooleanFilterMenuComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-boolean-filter-menu',\n template: `\n
    \n
  • \n \n \n
  • \n
\n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { filter: [{\n type: Input\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-filtercell']\n }], filterService: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n *\n * > List the following components as `entryComponents` in the GridModule.\n */\nconst filterMenuComponentFactory = (type) => ({\n \"boolean\": BooleanFilterMenuComponent,\n \"date\": DateFilterMenuComponent,\n \"numeric\": NumericFilterMenuComponent,\n \"text\": StringFilterMenuComponent\n}[type]);\n\n/**\n * @hidden\n */\nclass FilterMenuHostDirective extends FilterHostDirective {\n constructor(host, resolver) {\n super(host, resolver);\n }\n componentType() {\n if (isPresent(this.column) && !isNullOrEmptyString(this.column.filter)) {\n return filterMenuComponentFactory(this.column.filter);\n }\n return StringFilterMenuComponent;\n }\n initComponent(ctx) {\n super.initComponent(ctx);\n this.component.instance.filterService = this.filterService;\n }\n}\nFilterMenuHostDirective.ɵfac = function FilterMenuHostDirective_Factory(t) { return new (t || FilterMenuHostDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ComponentFactoryResolver)); };\nFilterMenuHostDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: FilterMenuHostDirective, selectors: [[\"\", \"kendoFilterMenuHost\", \"\"]], inputs: { filterService: \"filterService\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nFilterMenuHostDirective.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: ComponentFactoryResolver }\n];\nFilterMenuHostDirective.propDecorators = {\n filterService: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuHostDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoFilterMenuHost]'\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: ɵngcc0.ComponentFactoryResolver }]; }, { filterService: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass DateFilterMenuInputComponent {\n constructor(popupService, localizationService) {\n this.popupService = popupService;\n this.localizationService = localizationService;\n this.operators = [];\n }\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n open(picker) {\n this.subscription = this.popupService.onClose\n .pipe(filter(() => picker.isActive))\n .subscribe(e => e.preventDefault());\n }\n messageFor(key) {\n return this.localizationService.get(key);\n }\n}\nDateFilterMenuInputComponent.ɵfac = function DateFilterMenuInputComponent_Factory(t) { return new (t || DateFilterMenuInputComponent)(ɵngcc0.ɵɵdirectiveInject(SinglePopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nDateFilterMenuInputComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DateFilterMenuInputComponent, selectors: [[\"kendo-grid-date-filter-menu-input\"]], inputs: { operators: \"operators\", column: \"column\", filter: \"filter\", operator: \"operator\", currentFilter: \"currentFilter\", filterService: \"filterService\", format: \"format\", formatPlaceholder: \"formatPlaceholder\", placeholder: \"placeholder\", min: \"min\", max: \"max\", activeView: \"activeView\", bottomView: \"bottomView\", topView: \"topView\", weekNumber: \"weekNumber\" }, decls: 4, vars: 19, consts: [[3, \"column\", \"filter\", \"operators\", \"defaultOperator\", \"currentFilter\", \"filterService\"], [\"kendoFilterInput\", \"\", 3, \"filterDelay\", \"value\", \"placeholder\", \"formatPlaceholder\", \"format\", \"min\", \"max\", \"activeView\", \"bottomView\", \"topView\", \"weekNumber\", \"open\"], [\"picker\", \"\"], [3, \"toggle\", \"today\"]], template: function DateFilterMenuInputComponent_Template(rf, ctx) { if (rf & 1) {\n const _r325 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-filter-menu-input-wrapper\", 0);\n ɵngcc0.ɵɵelementStart(1, \"kendo-datepicker\", 1, 2);\n ɵngcc0.ɵɵlistener(\"open\", function DateFilterMenuInputComponent_Template_kendo_datepicker_open_1_listener() { ɵngcc0.ɵɵrestoreView(_r325); const _r324 = ɵngcc0.ɵɵreference(2); return ctx.open(_r324); });\n ɵngcc0.ɵɵelement(3, \"kendo-datepicker-messages\", 3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"column\", ctx.column)(\"filter\", ctx.filter)(\"operators\", ctx.operators)(\"defaultOperator\", ctx.operator)(\"currentFilter\", ctx.currentFilter)(\"filterService\", ctx.filterService);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"filterDelay\", 0)(\"value\", ctx.currentFilter == null ? null : ctx.currentFilter.value)(\"placeholder\", ctx.placeholder)(\"formatPlaceholder\", ctx.formatPlaceholder)(\"format\", ctx.format)(\"min\", ctx.min)(\"max\", ctx.max)(\"activeView\", ctx.activeView)(\"bottomView\", ctx.bottomView)(\"topView\", ctx.topView)(\"weekNumber\", ctx.weekNumber);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"toggle\", ctx.messageFor(\"filterDateToggle\"))(\"today\", ctx.messageFor(\"filterDateToday\"));\n } }, directives: [FilterMenuInputWrapperComponent, ɵngcc9.DatePickerComponent, FilterInputDirective, ɵngcc9.DatePickerCustomMessagesComponent], encapsulation: 2 });\n/** @nocollapse */\nDateFilterMenuInputComponent.ctorParameters = () => [\n { type: SinglePopupService },\n { type: LocalizationService }\n];\nDateFilterMenuInputComponent.propDecorators = {\n operators: [{ type: Input }],\n column: [{ type: Input }],\n filter: [{ type: Input }],\n operator: [{ type: Input }],\n currentFilter: [{ type: Input }],\n filterService: [{ type: Input }],\n format: [{ type: Input }],\n formatPlaceholder: [{ type: Input }],\n placeholder: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n activeView: [{ type: Input }],\n bottomView: [{ type: Input }],\n topView: [{ type: Input }],\n weekNumber: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DateFilterMenuInputComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-date-filter-menu-input',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: SinglePopupService }, { type: ɵngcc1.LocalizationService }]; }, { operators: [{\n type: Input\n }], column: [{\n type: Input\n }], filter: [{\n type: Input\n }], operator: [{\n type: Input\n }], currentFilter: [{\n type: Input\n }], filterService: [{\n type: Input\n }], format: [{\n type: Input\n }], formatPlaceholder: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], activeView: [{\n type: Input\n }], bottomView: [{\n type: Input\n }], topView: [{\n type: Input\n }], weekNumber: [{\n type: Input\n }] }); })();\n\nconst INTERNAL_COMPONENTS$2 = [\n FilterMenuComponent,\n FilterMenuContainerComponent,\n FilterMenuInputWrapperComponent,\n StringFilterMenuInputComponent,\n StringFilterMenuComponent,\n FilterMenuTemplateDirective,\n NumericFilterMenuComponent,\n NumericFilterMenuInputComponent,\n DateFilterMenuInputComponent,\n DateFilterMenuComponent,\n FilterMenuHostDirective,\n BooleanFilterMenuComponent\n];\nconst ENTRY_COMPONENTS$1 = [\n StringFilterMenuComponent,\n NumericFilterMenuComponent,\n DateFilterMenuComponent,\n BooleanFilterMenuComponent\n];\n/**\n * @hidden\n */\nclass FilterMenuModule {\n static exports() {\n return [\n StringFilterMenuComponent,\n FilterMenuTemplateDirective,\n NumericFilterMenuComponent,\n DateFilterMenuComponent,\n BooleanFilterMenuComponent,\n SharedFilterModule.exports()\n ];\n }\n}\nFilterMenuModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: FilterMenuModule });\nFilterMenuModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function FilterMenuModule_Factory(t) { return new (t || FilterMenuModule)(); }, imports: [[SharedFilterModule],\n SharedFilterModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(FilterMenuModule, { declarations: [FilterMenuComponent,\n FilterMenuContainerComponent,\n FilterMenuInputWrapperComponent,\n StringFilterMenuInputComponent,\n StringFilterMenuComponent,\n FilterMenuTemplateDirective,\n NumericFilterMenuComponent,\n NumericFilterMenuInputComponent,\n DateFilterMenuInputComponent,\n DateFilterMenuComponent,\n FilterMenuHostDirective,\n BooleanFilterMenuComponent], imports: [SharedFilterModule], exports: [FilterMenuComponent,\n FilterMenuContainerComponent,\n FilterMenuInputWrapperComponent,\n StringFilterMenuInputComponent,\n StringFilterMenuComponent,\n FilterMenuTemplateDirective,\n NumericFilterMenuComponent,\n NumericFilterMenuInputComponent,\n DateFilterMenuInputComponent,\n DateFilterMenuComponent,\n FilterMenuHostDirective,\n BooleanFilterMenuComponent,\n SharedFilterModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FilterMenuModule, [{\n type: NgModule,\n args: [{\n declarations: [INTERNAL_COMPONENTS$2],\n entryComponents: ENTRY_COMPONENTS$1,\n exports: [INTERNAL_COMPONENTS$2, SharedFilterModule],\n imports: [SharedFilterModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass ColumnListComponent {\n constructor(element, ngZone, renderer) {\n this.element = element;\n this.ngZone = ngZone;\n this.renderer = renderer;\n this.reset = new EventEmitter();\n this.apply = new EventEmitter();\n this.columnChange = new EventEmitter();\n this.autoSync = true;\n this.allowHideAll = false;\n this.actionsClass = 'k-action-buttons';\n this.unlockedCount = 0;\n }\n get className() {\n return true;\n }\n set columns(value) {\n this._columns = value.filter(column => column.includeInChooser !== false);\n this.allColumns = value;\n this.updateColumnState();\n }\n get columns() {\n return this._columns;\n }\n isDisabled(column) {\n return !(this.allowHideAll || this.hasFiltered || column.hidden || this.columns.find(current => current !== column && !current.hidden)) ||\n (this.hasVisibleLocked && !this.hasUnlockedFiltered && this.unlockedCount === 1 && !column.locked && !column.hidden);\n }\n ngOnInit() {\n if (!this.element) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n this.domSubscriptions = this.renderer.listen(this.element.nativeElement, 'click', (e) => {\n if (hasClasses(e.target, 'k-checkbox')) {\n if (this.autoSync) {\n const index = parseInt(e.target.getAttribute('data-index'), 10);\n const column = this.columns[index];\n const hidden = !e.target.checked;\n if (Boolean(column.hidden) !== hidden) {\n this.ngZone.run(() => {\n column.hidden = hidden;\n this.columnChange.emit([column]);\n });\n }\n }\n else {\n this.updateDisabled();\n }\n }\n });\n });\n }\n ngOnDestroy() {\n if (this.domSubscriptions) {\n this.domSubscriptions();\n }\n }\n cancelChanges() {\n this.forEachCheckBox((element, index) => {\n element.checked = !this.columns[index].hidden;\n });\n this.updateDisabled();\n this.reset.emit();\n }\n applyChanges() {\n const changed = [];\n this.forEachCheckBox((element, index) => {\n const column = this.columns[index];\n const hidden = !element.checked;\n if (Boolean(column.hidden) !== hidden) {\n column.hidden = hidden;\n changed.push(column);\n }\n });\n this.updateDisabled();\n this.apply.emit(changed);\n }\n forEachCheckBox(callback) {\n const checkboxes = this.element.nativeElement.getElementsByClassName('k-checkbox');\n const length = checkboxes.length;\n for (let idx = 0; idx < length; idx++) {\n callback(checkboxes[idx], idx);\n }\n }\n updateDisabled() {\n if (this.allowHideAll && !this.hasLocked) {\n return;\n }\n const checkedItems = [];\n this.forEachCheckBox((checkbox, index) => {\n if (checkbox.checked) {\n checkedItems.push({ checkbox, index });\n }\n checkbox.disabled = false;\n });\n if (!this.allowHideAll && checkedItems.length === 1 && !this.hasFiltered) {\n checkedItems[0].checkbox.disabled = true;\n }\n else if (this.hasLocked && !this.hasUnlockedFiltered) {\n const columns = this.columns;\n const checkedUnlocked = checkedItems.filter(item => !columns[item.index].locked);\n if (checkedUnlocked.length === 1) {\n checkedUnlocked[0].checkbox.disabled = true;\n }\n }\n }\n updateColumnState() {\n this.hasLocked = this.allColumns.filter(column => column.locked && (!column.hidden || column.includeInChooser !== false)).length > 0;\n this.hasVisibleLocked = this.allColumns.filter(column => column.locked && !column.hidden).length > 0;\n this.unlockedCount = this.columns.filter(column => !column.locked && !column.hidden).length;\n const filteredColumns = this.allColumns.filter(column => column.includeInChooser === false && !column.hidden);\n if (filteredColumns.length) {\n this.hasFiltered = filteredColumns.length > 0;\n this.hasUnlockedFiltered = filteredColumns.filter(column => !column.locked).length > 0;\n }\n else {\n this.hasFiltered = false;\n this.hasUnlockedFiltered = false;\n }\n }\n}\nColumnListComponent.ɵfac = function ColumnListComponent_Factory(t) { return new (t || ColumnListComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nColumnListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnListComponent, selectors: [[\"kendo-grid-columnlist\"]], hostVars: 2, hostBindings: function ColumnListComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-column-list-wrapper\", ctx.className);\n } }, inputs: { autoSync: \"autoSync\", allowHideAll: \"allowHideAll\", actionsClass: \"actionsClass\", columns: \"columns\", applyText: \"applyText\", resetText: \"resetText\" }, outputs: { reset: \"reset\", apply: \"apply\", columnChange: \"columnChange\" }, decls: 3, vars: 2, consts: [[1, \"k-column-list\"], [\"class\", \"k-column-list-item\", 4, \"ngFor\", \"ngForOf\"], [3, \"ngClass\", 4, \"ngIf\"], [1, \"k-column-list-item\"], [\"type\", \"checkbox\", 1, \"k-checkbox\", 3, \"checked\", \"disabled\"], [1, \"k-checkbox-label\"], [3, \"ngClass\"], [\"type\", \"button\", 1, \"k-button\", 3, \"click\"], [\"type\", \"button\", 1, \"k-button\", \"k-primary\", 3, \"click\"]], template: function ColumnListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵtemplate(1, ColumnListComponent_label_1_Template, 4, 4, \"label\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(2, ColumnListComponent_div_2_Template, 5, 3, \"div\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.columns);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.autoSync);\n } }, directives: [ɵngcc5.NgForOf, ɵngcc5.NgIf, ɵngcc5.NgClass], encapsulation: 2 });\n/** @nocollapse */\nColumnListComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: NgZone },\n { type: Renderer2 }\n];\nColumnListComponent.propDecorators = {\n className: [{ type: HostBinding, args: [\"class.k-column-list-wrapper\",] }],\n reset: [{ type: Output }],\n apply: [{ type: Output }],\n columnChange: [{ type: Output }],\n columns: [{ type: Input }],\n autoSync: [{ type: Input }],\n allowHideAll: [{ type: Input }],\n applyText: [{ type: Input }],\n resetText: [{ type: Input }],\n actionsClass: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnListComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-columnlist',\n template: `\n
\n \n
\n
\n \n \n
\n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }]; }, { reset: [{\n type: Output\n }], apply: [{\n type: Output\n }], columnChange: [{\n type: Output\n }], autoSync: [{\n type: Input\n }], allowHideAll: [{\n type: Input\n }], actionsClass: [{\n type: Input\n }], className: [{\n type: HostBinding,\n args: [\"class.k-column-list-wrapper\"]\n }], columns: [{\n type: Input\n }], applyText: [{\n type: Input\n }], resetText: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the component for selecting columns in the Grid. To enable the user to show or hide columns,\n * add the component inside a [`ToolbarTemplate`]({% slug api_grid_toolbartemplatedirective %}) directive.\n *\n * @example\n * {% meta height:300 %}\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n * {% endmeta %}\n */\nclass ColumnChooserComponent {\n constructor(localization, columnInfoService, popupService, ngZone, renderer, changeDetector) {\n this.localization = localization;\n this.columnInfoService = columnInfoService;\n this.popupService = popupService;\n this.ngZone = ngZone;\n this.renderer = renderer;\n this.changeDetector = changeDetector;\n /**\n * Specifies if the changes in the visibility of the column will be immediately applied.\n */\n this.autoSync = false;\n /**\n * Specifies if all columns can be hidden.\n */\n this.allowHideAll = true;\n }\n get columns() {\n return this.columnInfoService.leafNamedColumns;\n }\n ngOnDestroy() {\n this.close();\n }\n /**\n * @hidden\n */\n toggle(anchor, template) {\n if (!this.popupRef) {\n const direction = this.localization.rtl ? 'right' : 'left';\n this.popupRef = this.popupService.open({\n anchor: anchor,\n content: template,\n positionMode: 'absolute',\n anchorAlign: { vertical: 'bottom', horizontal: direction },\n popupAlign: { vertical: 'top', horizontal: direction }\n });\n this.renderer.setAttribute(this.popupRef.popupElement, 'dir', this.localization.rtl ? 'rtl' : 'ltr');\n this.ngZone.runOutsideAngular(() => this.closeClick = this.renderer.listen(\"document\", \"click\", ({ target }) => {\n if (!closest(target, node => node === this.popupRef.popupElement || node === anchor)) {\n this.close();\n }\n }));\n }\n else {\n this.close();\n }\n }\n /**\n * @hidden\n */\n onApply(changed) {\n this.close();\n if (changed.length) {\n this.changeDetector.markForCheck();\n this.columnInfoService.changeVisibility(changed);\n }\n }\n /**\n * @hidden\n */\n onChange(changed) {\n this.changeDetector.markForCheck();\n this.columnInfoService.changeVisibility(changed);\n }\n close() {\n if (this.popupRef) {\n this.popupRef.close();\n this.popupRef = null;\n }\n this.detachClose();\n }\n detachClose() {\n if (this.closeClick) {\n this.closeClick();\n this.closeClick = null;\n }\n }\n}\nColumnChooserComponent.ɵfac = function ColumnChooserComponent_Factory(t) { return new (t || ColumnChooserComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.PopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nColumnChooserComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnChooserComponent, selectors: [[\"kendo-grid-column-chooser\"]], inputs: { autoSync: \"autoSync\", allowHideAll: \"allowHideAll\" }, decls: 5, vars: 1, consts: [[\"type\", \"button\", 1, \"k-button\", \"k-bare\", \"k-button-icon\", 3, \"click\"], [\"anchor\", \"\"], [1, \"k-icon\", \"k-i-columns\"], [\"template\", \"\"], [1, \"k-column-chooser-title\"], [3, \"columns\", \"applyText\", \"resetText\", \"autoSync\", \"allowHideAll\", \"apply\", \"columnChange\"]], template: function ColumnChooserComponent_Template(rf, ctx) { if (rf & 1) {\n const _r339 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"button\", 0, 1);\n ɵngcc0.ɵɵlistener(\"click\", function ColumnChooserComponent_Template_button_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r339); const _r333 = ɵngcc0.ɵɵreference(1); const _r334 = ɵngcc0.ɵɵreference(4); return ctx.toggle(_r333, _r334); });\n ɵngcc0.ɵɵelement(2, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, ColumnChooserComponent_ng_template_3_Template, 3, 6, \"ng-template\", null, 3, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"title\", ctx.localization.get(\"columns\"));\n } }, directives: [ColumnListComponent], encapsulation: 2 });\n/** @nocollapse */\nColumnChooserComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ColumnInfoService },\n { type: PopupService },\n { type: NgZone },\n { type: Renderer2 },\n { type: ChangeDetectorRef }\n];\nColumnChooserComponent.propDecorators = {\n autoSync: [{ type: Input }],\n allowHideAll: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnChooserComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-column-chooser',\n template: `\n \n \n {{ localization.get('columns') }}\n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ColumnInfoService }, { type: ɵngcc3.PopupService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ChangeDetectorRef }]; }, { autoSync: [{\n type: Input\n }], allowHideAll: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the service that is passed to the\n * [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n */\nclass ColumnMenuService {\n constructor() {\n /**\n * @hidden\n */\n this.closeMenu = new EventEmitter();\n }\n /**\n * Closes the column menu.\n */\n close() {\n this.closeMenu.emit();\n }\n}\nColumnMenuService.ɵfac = function ColumnMenuService_Factory(t) { return new (t || ColumnMenuService)(); };\nColumnMenuService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: ColumnMenuService, factory: ColumnMenuService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * @hidden\n */\nclass ColumnMenuItemBase {\n constructor() {\n this.hostClass = true;\n }\n ngOnInit() {\n if (isDevMode() && !this.service) {\n throw new Error('The service input of the predefined column menu components is mandatory.');\n }\n }\n /**\n * @hidden\n */\n close() {\n this.service.close();\n }\n}\nColumnMenuItemBase.ɵfac = function ColumnMenuItemBase_Factory(t) { return new (t || ColumnMenuItemBase)(); };\nColumnMenuItemBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnMenuItemBase, hostVars: 2, hostBindings: function ColumnMenuItemBase_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-columnmenu-item-wrapper\", ctx.hostClass);\n } }, inputs: { service: \"service\" } });\nColumnMenuItemBase.propDecorators = {\n service: [{ type: Input }],\n hostClass: [{ type: HostBinding, args: ['class.k-columnmenu-item-wrapper',] }]\n};\n\n\n/* tslint:disable:max-line-length */\n/**\n * Represents the component for selecting columns in the Grid that can be placed\n * inside a [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n *\n * > You have to set the [ColumnMenuService]({% slug api_grid_columnmenuservice %}) that is passed by\n * > the template to the service input of the `kendo-grid-columnmenu-chooser` component.\n *\n * @example\n * {% meta height:300 %}\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n * {% endmeta %}\n */\nclass ColumnMenuChooserComponent extends ColumnMenuItemBase {\n constructor(localization, columnInfoService, changeDetector) {\n super();\n this.localization = localization;\n this.columnInfoService = columnInfoService;\n this.changeDetector = changeDetector;\n /**\n * Fires when the content is expanded.\n */\n this.expand = new EventEmitter();\n /**\n * Fires when the content is collapsed.\n */\n this.collapse = new EventEmitter();\n /**\n * Specifies if the content is expanded.\n */\n this.expanded = false;\n /**\n * @hidden\n */\n this.actionsClass = 'k-columnmenu-actions';\n }\n get columns() {\n return this.columnInfoService.leafNamedColumns;\n }\n /**\n * @hidden\n */\n onApply(changed) {\n this.close();\n if (changed.length) {\n this.changeDetector.markForCheck();\n this.columnInfoService.changeVisibility(changed);\n }\n }\n}\nColumnMenuChooserComponent.ɵfac = function ColumnMenuChooserComponent_Factory(t) { return new (t || ColumnMenuChooserComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nColumnMenuChooserComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuChooserComponent, selectors: [[\"kendo-grid-columnmenu-chooser\"]], inputs: { expanded: \"expanded\" }, outputs: { expand: \"expand\", collapse: \"collapse\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 2, consts: [[\"icon\", \"columns\", 3, \"text\", \"expanded\", \"collapse\", \"expand\"], [\"kendoGridColumnMenuItemContentTemplate\", \"\"], [3, \"applyText\", \"resetText\", \"columns\", \"autoSync\", \"allowHideAll\", \"actionsClass\", \"apply\"]], template: function ColumnMenuChooserComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-item\", 0);\n ɵngcc0.ɵɵlistener(\"collapse\", function ColumnMenuChooserComponent_Template_kendo_grid_columnmenu_item_collapse_0_listener() { return ctx.collapse.emit(); })(\"expand\", function ColumnMenuChooserComponent_Template_kendo_grid_columnmenu_item_expand_0_listener() { return ctx.expand.emit(); });\n ɵngcc0.ɵɵtemplate(1, ColumnMenuChooserComponent_ng_template_1_Template, 1, 6, \"ng-template\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"text\", ctx.localization.get(\"columns\"))(\"expanded\", ctx.expanded);\n } }, directives: function () { return [ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnListComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nColumnMenuChooserComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ColumnInfoService },\n { type: ChangeDetectorRef }\n];\nColumnMenuChooserComponent.propDecorators = {\n expand: [{ type: Output }],\n collapse: [{ type: Output }],\n expanded: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuChooserComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-columnmenu-chooser',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ColumnInfoService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { expand: [{\n type: Output\n }], collapse: [{\n type: Output\n }], expanded: [{\n type: Input\n }] }); })();\n\n/* tslint:disable:max-line-length */\n/**\n * Represents the component for editing column filters in the Grid that can be placed\n * inside a [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n *\n * > You have to set the [ColumnMenuService]({% slug api_grid_columnmenuservice %}) that is passed by\n * > the template to the service input of the `kendo-grid-columnmenu-filter` component.\n *\n * @example\n * {% meta height:400 %}\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n * {% endmeta %}\n */\nclass ColumnMenuFilterComponent extends ColumnMenuItemBase {\n constructor(localization) {\n super();\n this.localization = localization;\n /**\n * Fires when the content is expanded.\n */\n this.expand = new EventEmitter();\n /**\n * Fires when the content is collapsed.\n */\n this.collapse = new EventEmitter();\n /**\n * Specifies if the content is expanded.\n */\n this.expanded = false;\n /**\n * @hidden\n */\n this.actionsClass = 'k-columnmenu-actions';\n }\n}\nColumnMenuFilterComponent.ɵfac = function ColumnMenuFilterComponent_Factory(t) { return new (t || ColumnMenuFilterComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nColumnMenuFilterComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuFilterComponent, selectors: [[\"kendo-grid-columnmenu-filter\"]], inputs: { expanded: \"expanded\" }, outputs: { expand: \"expand\", collapse: \"collapse\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 2, consts: [[\"icon\", \"filter\", 3, \"text\", \"expanded\", \"collapse\", \"expand\"], [\"kendoGridColumnMenuItemContentTemplate\", \"\"], [3, \"column\", \"filter\", \"actionsClass\", \"close\"]], template: function ColumnMenuFilterComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-item\", 0);\n ɵngcc0.ɵɵlistener(\"collapse\", function ColumnMenuFilterComponent_Template_kendo_grid_columnmenu_item_collapse_0_listener() { return ctx.collapse.emit(); })(\"expand\", function ColumnMenuFilterComponent_Template_kendo_grid_columnmenu_item_expand_0_listener() { return ctx.expand.emit(); });\n ɵngcc0.ɵɵtemplate(1, ColumnMenuFilterComponent_ng_template_1_Template, 1, 3, \"ng-template\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"text\", ctx.localization.get(\"filter\"))(\"expanded\", ctx.expanded);\n } }, directives: function () { return [ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n FilterMenuContainerComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nColumnMenuFilterComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nColumnMenuFilterComponent.propDecorators = {\n expand: [{ type: Output }],\n collapse: [{ type: Output }],\n expanded: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuFilterComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-columnmenu-filter',\n template: `\n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { expand: [{\n type: Output\n }], collapse: [{\n type: Output\n }], expanded: [{\n type: Input\n }] }); })();\n\n/* tslint:disable:max-line-length */\n/**\n * Represents the content template of the\n * [`kendo-grid-columnmenu-item`]({% slug api_grid_columnmenuitemcomponent %}) component.\n * Provides an option for specifying the content of a column item.\n * To define the content template, nest an `` tag with the\n * `kendoGridColumnMenuItemContentTemplate` directive inside a ``.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * Item Content\n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n */\nclass ColumnMenuItemContentTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nColumnMenuItemContentTemplateDirective.ɵfac = function ColumnMenuItemContentTemplateDirective_Factory(t) { return new (t || ColumnMenuItemContentTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nColumnMenuItemContentTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ColumnMenuItemContentTemplateDirective, selectors: [[\"\", \"kendoGridColumnMenuItemContentTemplate\", \"\"]] });\n/** @nocollapse */\nColumnMenuItemContentTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuItemContentTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridColumnMenuItemContentTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents an item that can be placed inside a\n * [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n */\nclass ColumnMenuItemComponent {\n constructor() {\n /**\n * Fires when the item is clicked.\n */\n this.itemClick = new EventEmitter();\n /**\n * Fires when the content is expanded.\n */\n this.expand = new EventEmitter();\n /**\n * Fires when the content is collapsed.\n */\n this.collapse = new EventEmitter();\n this.contentState = 'collapsed';\n }\n get iconClass() {\n return `k-i-${this.icon}`;\n }\n ngOnChanges(changes) {\n if (changes.expanded) {\n this.updateContentState();\n }\n }\n /**\n * @hidden\n */\n onClick(e) {\n this.itemClick.emit(e);\n if (this.contentTemplate) {\n this.expanded = !this.expanded;\n this.updateContentState();\n if (this.expanded) {\n this.expand.emit();\n }\n else {\n this.collapse.emit();\n }\n }\n }\n updateContentState() {\n this.contentState = this.expanded ? 'expanded' : 'collapsed';\n }\n}\nColumnMenuItemComponent.ɵfac = function ColumnMenuItemComponent_Factory(t) { return new (t || ColumnMenuItemComponent)(); };\nColumnMenuItemComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuItemComponent, selectors: [[\"kendo-grid-columnmenu-item\"]], contentQueries: function ColumnMenuItemComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnMenuItemContentTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentTemplate = _t.first);\n } }, inputs: { expanded: \"expanded\", icon: \"icon\", text: \"text\", selected: \"selected\", disabled: \"disabled\" }, outputs: { itemClick: \"itemClick\", expand: \"expand\", collapse: \"collapse\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 4, vars: 7, consts: [[1, \"k-columnmenu-item\", 3, \"click\"], [\"class\", \"k-icon\", 3, \"ngClass\", 4, \"ngIf\"], [\"style\", \"overflow:hidden;\", \"class\", \"k-columnmenu-item-content\", 4, \"ngIf\"], [1, \"k-icon\", 3, \"ngClass\"], [1, \"k-columnmenu-item-content\", 2, \"overflow\", \"hidden\"], [3, \"ngTemplateOutlet\"]], template: function ColumnMenuItemComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function ColumnMenuItemComponent_Template_div_click_0_listener($event) { return ctx.onClick($event); });\n ɵngcc0.ɵɵtemplate(1, ColumnMenuItemComponent_span_1_Template, 1, 1, \"span\", 1);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, ColumnMenuItemComponent_div_3_Template, 3, 2, \"div\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-state-selected\", ctx.selected)(\"k-state-disabled\", ctx.disabled);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.icon);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.text, \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.contentTemplate);\n } }, directives: [ɵngcc5.NgIf, ɵngcc5.NgClass, ɵngcc5.NgTemplateOutlet], encapsulation: 2, data: { animation: [\n trigger('state', [\n state('collapsed', style({ display: 'none' })),\n state('expanded', style({ display: 'block' })),\n transition('collapsed => expanded', [\n style({\n height: '0px',\n display: 'block'\n }),\n animate('100ms ease-in', style({\n height: '*'\n }))\n ]),\n transition('expanded => collapsed', [\n style({\n height: '*'\n }),\n animate('100ms ease-in', style({\n height: '0px'\n }))\n ])\n ])\n ] } });\nColumnMenuItemComponent.propDecorators = {\n itemClick: [{ type: Output }],\n expand: [{ type: Output }],\n collapse: [{ type: Output }],\n icon: [{ type: Input }],\n text: [{ type: Input }],\n selected: [{ type: Input }],\n disabled: [{ type: Input }],\n expanded: [{ type: Input }],\n contentTemplate: [{ type: ContentChild, args: [ColumnMenuItemContentTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuItemComponent, [{\n type: Component,\n args: [{\n animations: [\n trigger('state', [\n state('collapsed', style({ display: 'none' })),\n state('expanded', style({ display: 'block' })),\n transition('collapsed => expanded', [\n style({\n height: '0px',\n display: 'block'\n }),\n animate('100ms ease-in', style({\n height: '*'\n }))\n ]),\n transition('expanded => collapsed', [\n style({\n height: '*'\n }),\n animate('100ms ease-in', style({\n height: '0px'\n }))\n ])\n ])\n ],\n selector: 'kendo-grid-columnmenu-item',\n template: `\n
\n \n \n {{ text }}\n
\n
\n \n \n
\n `\n }]\n }], function () { return []; }, { itemClick: [{\n type: Output\n }], expand: [{\n type: Output\n }], collapse: [{\n type: Output\n }], expanded: [{\n type: Input\n }], icon: [{\n type: Input\n }], text: [{\n type: Input\n }], selected: [{\n type: Input\n }], disabled: [{\n type: Input\n }], contentTemplate: [{\n type: ContentChild,\n args: [ColumnMenuItemContentTemplateDirective]\n }] }); })();\n\n/* tslint:disable:max-line-length */\n/**\n * Represents a column-menu item for sorting Grid columns that can be placed inside a\n * [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n * Allows the user to sort the column.\n *\n * > You have to set the [ColumnMenuService]({% slug api_grid_columnmenuservice %}) that is passed by\n * > the template to the service input of the `kendo-grid-columnmenu-sort` component.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }, { Field1: 'Foo1', Field2: 'Bar1' }];\n * }\n *\n * ```\n */\nclass ColumnMenuSortComponent extends ColumnMenuItemBase {\n constructor(localization, sortService) {\n super();\n this.localization = localization;\n this.sortService = sortService;\n }\n get sortedAsc() {\n const descriptor = this.descriptor;\n return descriptor && (!descriptor.dir || descriptor.dir === 'asc');\n }\n get sortedDesc() {\n const descriptor = this.descriptor;\n return descriptor && descriptor.dir === 'desc';\n }\n /**\n * @hidden\n */\n toggleSort(dir) {\n const field = this.service.column.field;\n const { mode, allowUnsort } = normalize$1(this.service.sortable);\n const descriptor = this.descriptor;\n const sort = mode === 'multiple' ? this.service.sort.filter(s => s.field !== field) : [];\n if (descriptor && descriptor.dir === dir) {\n if (!allowUnsort) {\n return;\n }\n }\n else {\n sort.push({ field, dir });\n }\n this.sortService.sort(sort);\n this.close();\n }\n get descriptor() {\n return [].concat(this.service.sort || []).find(s => s.field === this.service.column.field);\n }\n}\nColumnMenuSortComponent.ɵfac = function ColumnMenuSortComponent_Factory(t) { return new (t || ColumnMenuSortComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(SortService)); };\nColumnMenuSortComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuSortComponent, selectors: [[\"kendo-grid-columnmenu-sort\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 4, consts: [[\"icon\", \"sort-asc-sm\", 3, \"text\", \"selected\", \"itemClick\"], [\"icon\", \"sort-desc-sm\", 3, \"text\", \"selected\", \"itemClick\"]], template: function ColumnMenuSortComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-item\", 0);\n ɵngcc0.ɵɵlistener(\"itemClick\", function ColumnMenuSortComponent_Template_kendo_grid_columnmenu_item_itemClick_0_listener() { return ctx.toggleSort(\"asc\"); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(1, \"kendo-grid-columnmenu-item\", 1);\n ɵngcc0.ɵɵlistener(\"itemClick\", function ColumnMenuSortComponent_Template_kendo_grid_columnmenu_item_itemClick_1_listener() { return ctx.toggleSort(\"desc\"); });\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"text\", ctx.localization.get(\"sortAscending\"))(\"selected\", ctx.sortedAsc);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"text\", ctx.localization.get(\"sortDescending\"))(\"selected\", ctx.sortedDesc);\n } }, directives: [ColumnMenuItemComponent], encapsulation: 2 });\n/** @nocollapse */\nColumnMenuSortComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: SortService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuSortComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-columnmenu-sort',\n template: `\n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: SortService }]; }, null); })();\n\nconst POPUP_CLASS = 'k-grid-columnmenu-popup';\n/**\n * Represents the [column menu]({% slug columnmenu_grid %}) component.\n */\nclass ColumnMenuComponent {\n constructor(popupService, localization, service) {\n this.popupService = popupService;\n this.localization = localization;\n this.service = service;\n /**\n * @hidden\n */\n this.standalone = true;\n /**\n * The settings for the Column Menu.\n */\n this.settings = {};\n /**\n * @hidden\n */\n this.sortable = true;\n /**\n * @hidden\n */\n this.expandedFilter = false;\n /**\n * @hidden\n */\n this.expandedColumns = false;\n this.closeSubscription = service.closeMenu.subscribe(this.close.bind(this));\n }\n /**\n * @hidden\n */\n get isActive() {\n return (this.hasFilter && filtersByField(this.filter, this.column.field).length > 0) ||\n (!this.sortable && this.hasSort && this.sort.find(descriptor => descriptor.field === this.column.field));\n }\n /**\n * @hidden\n */\n get hasFilter() {\n return hasFilter(this.settings, this.column);\n }\n /**\n * @hidden\n */\n get hasSort() {\n return hasSort(this.settings, this.column);\n }\n /**\n * @hidden\n */\n get hasColumnChooser() {\n return hasColumnChooser(this.settings);\n }\n /**\n * @hidden\n */\n get hasLock() {\n return hasLock(this.settings, this.column);\n }\n ngOnChanges() {\n this.service.column = this.column;\n this.service.sort = this.sort;\n this.service.filter = this.filter;\n this.service.sortable = this.sortable;\n }\n ngOnDestroy() {\n this.close();\n this.closeSubscription.unsubscribe();\n }\n /**\n * @hidden\n */\n toggle(e, anchor, template) {\n e.preventDefault();\n this.expandedFilter = !this.hasColumnChooser;\n this.expandedColumns = !this.hasFilter;\n this.popupRef = this.popupService.open(anchor, template, this.popupRef, POPUP_CLASS);\n }\n /**\n * @hidden\n */\n close() {\n this.popupService.destroy();\n this.popupRef = null;\n }\n /**\n * @hidden\n */\n onColumnsExpand() {\n this.expandedColumns = true;\n this.expandedFilter = false;\n }\n /**\n * @hidden\n */\n onFilterExpand() {\n this.expandedFilter = true;\n this.expandedColumns = false;\n }\n}\nColumnMenuComponent.ɵfac = function ColumnMenuComponent_Factory(t) { return new (t || ColumnMenuComponent)(ɵngcc0.ɵɵdirectiveInject(SinglePopupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ColumnMenuService)); };\nColumnMenuComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuComponent, selectors: [[\"kendo-grid-column-menu\"]], hostVars: 2, hostBindings: function ColumnMenuComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-column-menu-standalone\", ctx.standalone);\n } }, inputs: { standalone: \"standalone\", settings: \"settings\", sortable: \"sortable\", column: \"column\", sort: \"sort\", filter: \"filter\", columnMenuTemplate: \"columnMenuTemplate\" }, features: [ɵngcc0.ɵɵProvidersFeature([ColumnMenuService]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 7, vars: 4, consts: [[\"href\", \"#\", \"tabindex\", \"-1\", 1, \"k-grid-column-menu\", \"k-grid-filter\", 3, \"ngClass\", \"click\"], [\"anchor\", \"\"], [1, \"k-icon\", \"k-i-more-vertical\"], [\"template\", \"\"], [\"defaultTemplate\", \"\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [3, \"service\", 4, \"ngIf\"], [3, \"service\", \"expanded\", \"expand\", 4, \"ngIf\"], [3, \"service\"], [3, \"service\", \"expanded\", \"expand\"]], template: function ColumnMenuComponent_Template(rf, ctx) { if (rf & 1) {\n const _r361 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"a\", 0, 1);\n ɵngcc0.ɵɵlistener(\"click\", function ColumnMenuComponent_Template_a_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r361); const _r348 = ɵngcc0.ɵɵreference(1); const _r349 = ɵngcc0.ɵɵreference(4); return ctx.toggle($event, _r348, _r349); });\n ɵngcc0.ɵɵelement(2, \"span\", 2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(3, ColumnMenuComponent_ng_template_3_Template, 1, 5, \"ng-template\", null, 3, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵtemplate(5, ColumnMenuComponent_ng_template_5_Template, 4, 4, \"ng-template\", null, 4, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngClass\", ɵngcc0.ɵɵpureFunction1(2, _c156, ctx.isActive));\n ɵngcc0.ɵɵattribute(\"title\", ctx.localization.get(\"columnMenu\"));\n } }, directives: function () { return [ɵngcc5.NgClass, ɵngcc5.NgTemplateOutlet, ɵngcc5.NgIf, ColumnMenuSortComponent,\n ColumnMenuLockComponent,\n ColumnMenuChooserComponent,\n ColumnMenuFilterComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nColumnMenuComponent.ctorParameters = () => [\n { type: SinglePopupService },\n { type: LocalizationService },\n { type: ColumnMenuService }\n];\nColumnMenuComponent.propDecorators = {\n standalone: [{ type: HostBinding, args: ['class.k-grid-column-menu-standalone',] }, { type: Input }],\n column: [{ type: Input }],\n settings: [{ type: Input }],\n sort: [{ type: Input }],\n filter: [{ type: Input }],\n sortable: [{ type: Input }],\n columnMenuTemplate: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuComponent, [{\n type: Component,\n args: [{\n providers: [ColumnMenuService],\n selector: 'kendo-grid-column-menu',\n template: `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: SinglePopupService }, { type: ɵngcc1.LocalizationService }, { type: ColumnMenuService }]; }, { standalone: [{\n type: HostBinding,\n args: ['class.k-grid-column-menu-standalone']\n }, {\n type: Input\n }], settings: [{\n type: Input\n }], sortable: [{\n type: Input\n }], column: [{\n type: Input\n }], sort: [{\n type: Input\n }], filter: [{\n type: Input\n }], columnMenuTemplate: [{\n type: Input\n }] }); })();\n\n/* tslint:disable:max-line-length */\n/**\n * Represents a column-menu item that can be placed inside a\n * [`ColumnMenuTemplate`]({% slug api_grid_columnmenutemplatedirective %}) directive.\n * Allows the user to lock or unlock the columns.\n *\n * > You have to set the [ColumnMenuService]({% slug api_grid_columnmenuservice %}) that is passed by\n * > the template to the service input of the `kendo-grid-columnmenu-lock` component.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public data: any[] = [{ Field1: 'Foo', Field2: 'Bar' }];\n * }\n *\n * ```\n */\nclass ColumnMenuLockComponent extends ColumnMenuItemBase {\n constructor(localization, columnInfoService, changeDetector) {\n super();\n this.localization = localization;\n this.columnInfoService = columnInfoService;\n this.changeDetector = changeDetector;\n }\n get text() {\n return this.localization.get(this.locked ? 'unlock' : 'lock');\n }\n get icon() {\n return this.locked ? 'unlock' : 'lock';\n }\n get disabled() {\n return !this.locked && this.columnInfoService.unlockedRootCount < 2;\n }\n /**\n * @hidden\n */\n toggleColumn() {\n this.toggleHierarchy(!this.locked);\n this.close();\n this.changeDetector.markForCheck();\n }\n toggleHierarchy(locked) {\n let root = this.service.column;\n while (root.parent) {\n root = root.parent;\n }\n const columns = [root];\n const allChanged = [];\n while (columns.length) {\n const column = columns.shift();\n column.locked = locked;\n allChanged.push(column);\n if (column.hasChildren) {\n columns.push(...column.childrenArray);\n }\n }\n this.columnInfoService.changeLocked(allChanged);\n }\n get locked() {\n return this.service.column.locked;\n }\n}\nColumnMenuLockComponent.ɵfac = function ColumnMenuLockComponent_Factory(t) { return new (t || ColumnMenuLockComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nColumnMenuLockComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ColumnMenuLockComponent, selectors: [[\"kendo-grid-columnmenu-lock\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 1, vars: 3, consts: [[3, \"text\", \"icon\", \"disabled\", \"itemClick\"]], template: function ColumnMenuLockComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"kendo-grid-columnmenu-item\", 0);\n ɵngcc0.ɵɵlistener(\"itemClick\", function ColumnMenuLockComponent_Template_kendo_grid_columnmenu_item_itemClick_0_listener() { return ctx.toggleColumn(); });\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"text\", ctx.text)(\"icon\", ctx.icon)(\"disabled\", ctx.disabled);\n } }, directives: [ColumnMenuItemComponent], encapsulation: 2 });\n/** @nocollapse */\nColumnMenuLockComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: ColumnInfoService },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuLockComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-columnmenu-lock',\n template: `\n \n \n `\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ColumnInfoService }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\nconst COMPONENTS$1 = [\n ColumnListComponent,\n ColumnChooserComponent,\n ColumnMenuChooserComponent,\n ColumnMenuFilterComponent,\n ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnMenuSortComponent,\n ColumnMenuComponent,\n ColumnMenuLockComponent,\n ColumnMenuTemplateDirective\n];\n/**\n * @hidden\n */\nclass ColumnMenuModule {\n static exports() {\n return [\n ColumnChooserComponent,\n ColumnMenuFilterComponent,\n ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnMenuSortComponent,\n ColumnMenuLockComponent,\n ColumnMenuChooserComponent,\n ColumnMenuTemplateDirective,\n ColumnMenuComponent\n ];\n }\n}\nColumnMenuModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ColumnMenuModule });\nColumnMenuModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ColumnMenuModule_Factory(t) { return new (t || ColumnMenuModule)(); }, imports: [[CommonModule, FilterMenuModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ColumnMenuModule, { declarations: function () { return [ColumnListComponent,\n ColumnChooserComponent,\n ColumnMenuChooserComponent,\n ColumnMenuFilterComponent,\n ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnMenuSortComponent,\n ColumnMenuComponent,\n ColumnMenuLockComponent,\n ColumnMenuTemplateDirective]; }, imports: function () { return [CommonModule,\n FilterMenuModule]; }, exports: function () { return [ColumnListComponent,\n ColumnChooserComponent,\n ColumnMenuChooserComponent,\n ColumnMenuFilterComponent,\n ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnMenuSortComponent,\n ColumnMenuComponent,\n ColumnMenuLockComponent,\n ColumnMenuTemplateDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ColumnMenuModule, [{\n type: NgModule,\n args: [{\n declarations: [COMPONENTS$1],\n imports: [CommonModule, FilterMenuModule],\n exports: [COMPONENTS$1]\n }]\n }], null, null); })();\n\nconst exportedModules$2 = [\n HeaderComponent,\n HeaderTemplateDirective,\n ColumnHandleDirective,\n SelectAllCheckboxDirective\n];\nconst importedModules$2 = [\n CommonModule,\n GroupModule,\n RowFilterModule,\n FilterMenuModule,\n SharedModule,\n DragAndDropModule,\n ColumnMenuModule\n];\n/**\n * @hidden\n */\nclass HeaderModule {\n static exports() {\n return [\n HeaderTemplateDirective,\n SelectAllCheckboxDirective\n ];\n }\n}\nHeaderModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: HeaderModule });\nHeaderModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function HeaderModule_Factory(t) { return new (t || HeaderModule)(); }, imports: [[...importedModules$2]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(HeaderModule, { declarations: [HeaderComponent,\n HeaderTemplateDirective,\n ColumnHandleDirective,\n SelectAllCheckboxDirective], imports: [CommonModule,\n GroupModule,\n RowFilterModule,\n FilterMenuModule,\n SharedModule,\n DragAndDropModule,\n ColumnMenuModule], exports: [HeaderComponent,\n HeaderTemplateDirective,\n ColumnHandleDirective,\n SelectAllCheckboxDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(HeaderModule, [{\n type: NgModule,\n args: [{\n declarations: [exportedModules$2],\n exports: [exportedModules$2],\n imports: [...importedModules$2]\n }]\n }], null, null); })();\n\n/**\n * Represents the command columns of the Grid. You have to define the content of the\n * column inside an `` tag. The template context is set to the current\n * data item. For more information and examples on using the passed fields\n * and the command directives, refer to the article on\n * [editing the Grid in Angular Reactive Forms]({% slug editing_reactive_forms_grid %}).\n *\n * The following additional fields are passed:\n * - `columnIndex`—The current column index.\n * - `rowIndex`—The current data row index. If inside a new item row, `rowIndex`is `-1`.\n * - `dataItem`—The current data item.\n * - `column`—The current column instance.\n * - `isNew`—The state of the current item.\n *\n * Usually, the template contains CRUD command directives such as:\n * - [`EditCommandDirective`]({% slug api_grid_editcommanddirective %})\n * - [`RemoveCommandDirective`]({% slug api_grid_removecommanddirective %})\n * - [`CancelCommandDirective`]({% slug api_grid_cancelcommanddirective %})\n * - [`SaveCommandDirective`]({% slug api_grid_savecommanddirective %})\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\nclass CommandColumnComponent extends ColumnBase$1 {\n constructor(parent) {\n super(parent);\n this.parent = parent;\n }\n get templateRef() {\n return this.template ? this.template.templateRef : undefined;\n }\n}\nCommandColumnComponent.ɵfac = function CommandColumnComponent_Factory(t) { return new (t || CommandColumnComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase$1, 13)); };\nCommandColumnComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CommandColumnComponent, selectors: [[\"kendo-grid-command-column\"]], contentQueries: function CommandColumnComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n } }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => CommandColumnComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CommandColumnComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCommandColumnComponent.ctorParameters = () => [\n { type: ColumnBase$1, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nCommandColumnComponent.propDecorators = {\n template: [{ type: ContentChild, args: [CellTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CommandColumnComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => CommandColumnComponent)\n }\n ],\n selector: 'kendo-grid-command-column',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase$1, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { template: [{\n type: ContentChild,\n args: [CellTemplateDirective]\n }] }); })();\n\n/**\n * Represents the checkbox for selecting columns in the Grid. If the column is\n * defined as empty, it renders a default checkbox for row selection.\n * You can also define the content of the column inside an `` tag.\n * The input requires you to include the `SelectionCheckbox` option.\n *\n * The template context is set to the current data item and the following additional fields are passed:\n * - `columnIndex`—The current column index.\n * - `rowIndex`—The current data row index. If inside a new item row, it will be `-1`.\n * - `dataItem`—The current data item.\n * - `column`—The current column instance.\n * - `isNew`—The state of the current item.\n *\n * For more examples, refer to:\n * - [Selecting or deselecting all items on a page]({% slug selection_grid %}#toc-select-all-feature)\n * - [Persisting the selection]({% slug selection_grid %}#toc-in-combination-with-the-select-all-feature)\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * Select row \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\nclass CheckboxColumnComponent extends ColumnBase$1 {\n constructor(parent) {\n super(parent);\n this.parent = parent;\n /*\n * @hidden\n */\n this.isCheckboxColumn = true;\n }\n get templateRef() {\n return this.template ? this.template.templateRef : undefined;\n }\n}\nCheckboxColumnComponent.ɵfac = function CheckboxColumnComponent_Factory(t) { return new (t || CheckboxColumnComponent)(ɵngcc0.ɵɵdirectiveInject(ColumnBase$1, 13)); };\nCheckboxColumnComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CheckboxColumnComponent, selectors: [[\"kendo-grid-checkbox-column\"]], contentQueries: function CheckboxColumnComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CellTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n } }, inputs: { showSelectAll: \"showSelectAll\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => CheckboxColumnComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CheckboxColumnComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCheckboxColumnComponent.ctorParameters = () => [\n { type: ColumnBase$1, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] }\n];\nCheckboxColumnComponent.propDecorators = {\n showSelectAll: [{ type: Input }],\n template: [{ type: ContentChild, args: [CellTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CheckboxColumnComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: ColumnBase$1,\n useExisting: forwardRef(() => CheckboxColumnComponent)\n }\n ],\n selector: 'kendo-grid-checkbox-column',\n template: ``\n }]\n }], function () { return [{ type: ColumnBase$1, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }]; }, { showSelectAll: [{\n type: Input\n }], template: [{\n type: ContentChild,\n args: [CellTemplateDirective]\n }] }); })();\n\n/* tslint:disable:no-input-rename */\n/**\n * Represents the row-selection checkbox of the Grid. The directive expects the\n * index of the current row as an input parameter. Inside the\n * [`CheckboxColumnComponent`]({% slug api_grid_checkboxcolumncomponent %}), apply the\n * directive to an `input` element. When the user clicks the checkbox that is associated\n * with the directive, a [`selectionChange`]({% slug api_grid_gridcomponent %}#toc-selectionChange)\n * event is triggered.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Select row \n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n *\n * class AppComponent {\n * public gridData: any[];\n *\n * constructor() {\n * this.gridData = products;\n * }\n * }\n *\n * const products = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000,\n * \"Discontinued\": true\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000,\n * \"Discontinued\": false\n * }\n * ];\n *\n * ```\n */\nclass SelectionCheckboxDirective {\n constructor(selectionService, el, renderer, ngZone) {\n this.selectionService = selectionService;\n this.el = el;\n this.renderer = renderer;\n this.ngZone = ngZone;\n this.type = \"checkbox\";\n this.ngZone.runOutsideAngular(() => {\n this.destroyClick = this.renderer.listen(this.el.nativeElement, \"click\", this.onClick.bind(this));\n this.destroyKeyDown = this.renderer.listen(this.el.nativeElement, \"keydown\", this.onKeyDown.bind(this));\n });\n }\n ngAfterContentChecked() {\n this.setCheckedState();\n }\n ngOnDestroy() {\n if (this.destroyClick) {\n this.destroyClick();\n }\n if (this.destroyKeyDown) {\n this.destroyKeyDown();\n }\n }\n onClick() {\n if (this.selectionService.options.enabled) {\n this.ngZone.run(() => {\n const ev = this.selectionService.toggleByIndex(this.itemIndex);\n ev.ctrlKey = true;\n ev.shiftKey = false;\n this.selectionService.changes.emit(ev);\n });\n }\n }\n onKeyDown(e) {\n if (e.keyCode === Keys.Enter) {\n this.onClick();\n }\n }\n /*\n * @hidden\n */\n setCheckedState() {\n this.renderer.setProperty(this.el.nativeElement, \"checked\", this.selectionService.isSelected(this.itemIndex));\n }\n}\nSelectionCheckboxDirective.ɵfac = function SelectionCheckboxDirective_Factory(t) { return new (t || SelectionCheckboxDirective)(ɵngcc0.ɵɵdirectiveInject(SelectionService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nSelectionCheckboxDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: SelectionCheckboxDirective, selectors: [[\"\", \"kendoGridSelectionCheckbox\", \"\"]], hostVars: 1, hostBindings: function SelectionCheckboxDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"type\", ctx.type);\n } }, inputs: { itemIndex: [\"kendoGridSelectionCheckbox\", \"itemIndex\"] } });\n/** @nocollapse */\nSelectionCheckboxDirective.ctorParameters = () => [\n { type: SelectionService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: NgZone }\n];\nSelectionCheckboxDirective.propDecorators = {\n itemIndex: [{ type: Input, args: [\"kendoGridSelectionCheckbox\",] }],\n type: [{ type: HostBinding, args: ['attr.type',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SelectionCheckboxDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridSelectionCheckbox]'\n }]\n }], function () { return [{ type: SelectionService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }]; }, { type: [{\n type: HostBinding,\n args: ['attr.type']\n }], itemIndex: [{\n type: Input,\n args: [\"kendoGridSelectionCheckbox\"]\n }] }); })();\n\nconst columnCellIndex = (cell, cells) => {\n let cellIndex = 0;\n for (let idx = 0; idx < cells.length; idx++) {\n if (cells[idx] === cell) {\n return cellIndex;\n }\n if (!hasClasses(cells[idx], 'k-hierarchy-cell k-group-cell')) {\n cellIndex++;\n }\n }\n};\n/**\n * @hidden\n */\nclass TableBodyComponent {\n constructor(detailsService, groupsService, changeNotification, editService, localization, ngZone, renderer, element, domEvents, selectionService, cellSelectionService, columnInfoService, navigationService) {\n this.detailsService = detailsService;\n this.groupsService = groupsService;\n this.changeNotification = changeNotification;\n this.editService = editService;\n this.localization = localization;\n this.ngZone = ngZone;\n this.renderer = renderer;\n this.element = element;\n this.domEvents = domEvents;\n this.selectionService = selectionService;\n this.cellSelectionService = cellSelectionService;\n this.columnInfoService = columnInfoService;\n this.navigationService = navigationService;\n this.columns = [];\n this.groups = [];\n this.skip = 0;\n this.noRecordsText = this.localization.get('noRecords');\n this.isLocked = false;\n this.skipGroupDecoration = false;\n this.showGroupFooters = false;\n this.lockedColumnsCount = 0;\n this.totalColumnsCount = 0;\n this.trackBy = defaultTrackBy;\n this.rowClass = () => null;\n this.cellKeydownSubscription = this.navigationService.cellKeydown.subscribe((args) => this.cellKeydownHandler(args));\n this.trackByWrapper = this.trackByWrapper.bind(this);\n this.trackByColumns = this.trackByColumns.bind(this);\n }\n get newDataItem() {\n return this.editService.newDataItem;\n }\n // Number of unlocked columns in the next table, if any\n get unlockedColumnsCount() {\n return this.totalColumnsCount - this.lockedColumnsCount - (this.allColumns || this.columns).length;\n }\n isAriaSelected(item, column) {\n return this.cellSelectionService.isCellSelected(item, column) ||\n this.isRowSelected(item) ? 'true' : 'false';\n }\n toggleRow(index, dataItem) {\n this.detailsService.toggleRow(index, dataItem);\n return false;\n }\n isExpanded(viewItem) {\n return this.detailsService.isExpanded(viewItem.index, viewItem.data);\n }\n detailButtonStyles(viewItem) {\n const expanded = this.isExpanded(viewItem);\n return expanded ? 'k-minus' : 'k-plus';\n }\n detailButtonTitle(viewItem) {\n const messageKey = this.isExpanded(viewItem) ? 'detailCollapse' : 'detailExpand';\n return this.localization.get(messageKey);\n }\n isGroup(item) {\n return item.type === 'group';\n }\n isDataItem(item) {\n return !this.isGroup(item) && !this.isFooter(item);\n }\n isFooter(item) {\n return item.type === 'footer';\n }\n isInExpandedGroup(item) {\n return this.groupsService.isInExpandedGroup(item.groupIndex, false);\n }\n isParentGroupExpanded(item) {\n return this.groupsService.isInExpandedGroup(item.index || item.groupIndex);\n }\n isOdd(item) {\n return item.index % 2 !== 0;\n }\n isSelectable() {\n return this.selectable && this.selectable.enabled !== false;\n }\n isRowSelected(item) {\n return this.selectionService.isSelected(item.index);\n }\n trackByWrapper(index, item) {\n if (item.type === 'data') {\n item.isEditing = this.editService.hasEdited(item.index);\n }\n return this.trackBy(index, item);\n }\n trackByColumns(index, item) {\n return this.virtualColumns ? index : item;\n }\n ngDoCheck() {\n if (this.hasGroupHeaderColumn) {\n this.groupHeaderColumns = columnsToRender(this.skipGroupDecoration ? this.columns : this.columns.toArray().slice(1));\n }\n else {\n this.groupHeaderColumns = [];\n }\n if (this.isLocked) {\n this.groupHeaderSlaveCellsCount =\n this.hasGroupHeaderColumn ? this.columnsContainer.nonLockedColumnsToRender.length : 1;\n }\n else {\n this.groupHeaderSlaveCellsCount = 0;\n }\n }\n ngOnChanges(changes) {\n if (isChanged(\"columns\", changes, false)) {\n this.changeNotification.notify();\n }\n }\n logicalRowIndex(rowIndex) {\n let pos = this.skip + rowIndex;\n if (this.hasDetailTemplate) {\n pos *= 2;\n }\n const absoluteRowIndex = 1 + pos;\n const addRowOffset = this.editService.hasNewItem ? 1 : 0;\n const filterRowOffset = hasFilterRow(this.filterable) ? 1 : 0;\n const headerRowCount = this.columnInfoService.totalLevels + filterRowOffset + addRowOffset;\n return absoluteRowIndex + headerRowCount;\n }\n addRowLogicalIndex() {\n return this.columnInfoService.totalLevels + 1 +\n (hasFilterRow(this.filterable) ? 1 : 0);\n }\n logicalColIndex(column) {\n if (!isPresent(column.leafIndex)) {\n return -1;\n }\n return column.leafIndex + (this.hasDetailTemplate ? 1 : 0);\n }\n ngOnInit() {\n this.ngZone.runOutsideAngular(() => {\n const clickHandler = this.clickHandler.bind(this);\n const mousedownSubscription = this.renderer.listen(this.element.nativeElement, 'mousedown', clickHandler);\n const mouseupSubscription = this.renderer.listen(this.element.nativeElement, 'mouseup', clickHandler);\n const clickSubscription = this.renderer.listen(this.element.nativeElement, 'click', clickHandler);\n const contextmenuSubscription = this.renderer.listen(this.element.nativeElement, 'contextmenu', clickHandler);\n const touchstartSubscription = this.renderer.listen(this.element.nativeElement, 'touchstart', clickHandler);\n const touchendSubscription = this.renderer.listen(this.element.nativeElement, 'touchend', clickHandler);\n this.clickSubscription = () => {\n mousedownSubscription();\n mouseupSubscription();\n clickSubscription();\n contextmenuSubscription();\n };\n this.touchSubscription = () => {\n touchstartSubscription();\n touchendSubscription();\n };\n });\n let originalNoRecordText = this.localization.get('noRecords');\n this.localization.changes.subscribe(() => {\n if (this.noRecordsText === originalNoRecordText) {\n this.noRecordsText = this.localization.get('noRecords');\n originalNoRecordText = this.noRecordsText;\n }\n });\n }\n ngOnDestroy() {\n if (this.clickSubscription) {\n this.clickSubscription();\n }\n if (this.touchSubscription) {\n this.touchSubscription();\n }\n this.cellKeydownSubscription.unsubscribe();\n clearTimeout(this.clickTimeout);\n }\n isEditingCell(index, column) {\n return this.editService.isEditing() && this.editService.isEditedColumn(index, column);\n }\n isEditingRow(index) {\n return this.editService.isEditing() && this.editService.hasEdited(index);\n }\n get hasGroupHeaderColumn() {\n return this.columnsContainer.hasGroupHeaderColumn;\n }\n get columnsContainer() {\n return this.columnInfoService.columnsContainer;\n }\n get columnsSpan() {\n return columnsSpan(this.columns);\n }\n get allColumnsSpan() {\n return columnsSpan(this.allColumns || this.columns);\n }\n get colSpan() {\n return this.columnsSpan + this.groups.length + (this.hasDetailTemplate ? 1 : 0);\n }\n get footerColumns() {\n return this.isLocked ? this.columnsContainer.lockedColumnsToRender : this.columnsContainer.nonLockedColumnsToRender;\n }\n showGroupHeader(item) {\n return !item.data.skipHeader;\n }\n get hasDetailTemplate() {\n return isPresent(this.detailTemplate);\n }\n clickHandler(eventArg) {\n const element = this.element.nativeElement;\n const target = this.eventTarget(eventArg);\n let cell, row, body, gridElement;\n let currentTarget = target;\n do {\n cell = closest(currentTarget, matchesNodeName('td'));\n row = closest(cell, matchesNodeName('tr'));\n body = closest(row, matchesNodeName('tbody'));\n currentTarget = body;\n gridElement = closestInScope(currentTarget, matchesClasses('k-grid'), element);\n } while (body && body !== element && !gridElement);\n if (cell && !hasClasses(cell, NON_DATA_CELL_CLASSES) &&\n !hasClasses(row, NON_DATA_ROW_CLASSES) &&\n body === element && !gridElement) {\n this.editService.preventCellClose();\n const focusable = target !== cell && isFocusableWithTabKey(target, false);\n if (!focusable && !matchesNodeName('label')(target) && !hasClasses(target, IGNORE_TARGET_CLASSSES) &&\n !closestInScope(target, matchesClasses(IGNORE_CONTAINER_CLASSES), cell)) {\n const args = this.cellClickArgs(cell, row, eventArg);\n if (eventArg.type === 'mousedown' || eventArg.type === 'touchstart') {\n this.domEvents.cellMousedown.emit(args);\n }\n else if (eventArg.type === 'mouseup' || eventArg.type === 'touchend') {\n this.domEvents.cellMouseup.emit(args);\n }\n else {\n if (args.isEditedColumn || !this.editService.closeCell(eventArg)) {\n if (eventArg.type === 'click') {\n this.clickTimeout = setTimeout(() => {\n this.emitCellClick(args);\n }, 0);\n }\n else {\n this.emitCellClick(args);\n }\n }\n }\n }\n }\n }\n emitCellClick(args) {\n this.domEvents.cellClick.emit(Object.assign(args, {\n isEdited: args.isEditedRow || args.isEditedColumn\n }));\n }\n cellKeydownHandler(args) {\n if (args.keyCode === Keys.Enter) {\n this.clickHandler(args);\n }\n }\n cellClickArgs(cell, row, eventArg) {\n const index = columnCellIndex(cell, row.cells);\n const column = this.columns.toArray()[index];\n const columnIndex = this.lockedColumnsCount + index;\n let rowIndex = row.getAttribute('data-kendo-grid-item-index');\n rowIndex = rowIndex ? parseInt(rowIndex, 10) : -1;\n const dataItem = rowIndex === -1 ? this.editService.newDataItem : this.data.at(rowIndex - this.skip);\n const isEditedColumn = this.editService.isEditedColumn(rowIndex, column);\n const isEditedRow = this.editService.isEdited(rowIndex);\n const type = eventArg.type === 'keydown' ? 'click' : eventArg.type;\n return {\n column: column,\n columnIndex: columnIndex,\n dataItem: dataItem,\n isEditedColumn: isEditedColumn,\n isEditedRow: isEditedRow,\n originalEvent: eventArg,\n rowIndex: rowIndex,\n type: type\n };\n }\n eventTarget(args) {\n if (args.type === 'touchend') {\n const touch = args.changedTouches[0];\n return document.elementFromPoint(touch.clientX, touch.clientY);\n }\n return args.target;\n }\n}\nTableBodyComponent.ɵfac = function TableBodyComponent_Factory(t) { return new (t || TableBodyComponent)(ɵngcc0.ɵɵdirectiveInject(DetailsService), ɵngcc0.ɵɵdirectiveInject(GroupsService), ɵngcc0.ɵɵdirectiveInject(ChangeNotificationService), ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(DomEventsService), ɵngcc0.ɵɵdirectiveInject(SelectionService), ɵngcc0.ɵɵdirectiveInject(CellSelectionService), ɵngcc0.ɵɵdirectiveInject(ColumnInfoService), ɵngcc0.ɵɵdirectiveInject(NavigationService)); };\nTableBodyComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TableBodyComponent, selectors: [[\"\", \"kendoGridTableBody\", \"\"]], inputs: { columns: \"columns\", groups: \"groups\", skip: \"skip\", noRecordsText: \"noRecordsText\", isLocked: \"isLocked\", skipGroupDecoration: \"skipGroupDecoration\", showGroupFooters: \"showGroupFooters\", lockedColumnsCount: \"lockedColumnsCount\", totalColumnsCount: \"totalColumnsCount\", trackBy: \"trackBy\", rowClass: \"rowClass\", allColumns: \"allColumns\", detailTemplate: \"detailTemplate\", noRecordsTemplate: \"noRecordsTemplate\", data: \"data\", selectable: \"selectable\", filterable: \"filterable\", virtualColumns: \"virtualColumns\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c157, decls: 3, vars: 4, consts: [[3, \"ngIf\"], [\"class\", \"k-grid-norecords\", 4, \"ngIf\"], [\"ngFor\", \"\", 3, \"ngForOf\", \"ngForTrackBy\"], [\"kendoGridLogicalRow\", \"\", 1, \"k-grid-add-row\", \"k-grid-edit-row\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"], [\"class\", \"k-hierarchy-cell\", \"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 3, \"logicalRowIndex\", \"logicalColIndex\", 4, \"ngIf\"], [\"kendoGridCell\", \"\", \"kendoGridLogicalCell\", \"\", \"role\", \"gridcell\", 3, \"rowIndex\", \"columnIndex\", \"isNew\", \"column\", \"dataItem\", \"ngClass\", \"ngStyle\", \"logicalRowIndex\", \"logicalColIndex\", \"colSpan\", 4, \"ngFor\", \"ngForOf\", \"ngForTrackBy\"], [\"class\", \"k-group-cell\", \"role\", \"presentation\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\", 1, \"k-group-cell\"], [\"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 1, \"k-hierarchy-cell\", 3, \"logicalRowIndex\", \"logicalColIndex\"], [\"kendoGridCell\", \"\", \"kendoGridLogicalCell\", \"\", \"role\", \"gridcell\", 3, \"rowIndex\", \"columnIndex\", \"isNew\", \"column\", \"dataItem\", \"ngClass\", \"ngStyle\", \"logicalRowIndex\", \"logicalColIndex\", \"colSpan\"], [1, \"k-grid-norecords\"], [3, \"ngIf\", \"templateContext\"], [4, \"ngIf\"], [\"kendoGridGroupHeader\", \"\", \"kendoGridLogicalRow\", \"\", 3, \"columns\", \"groups\", \"item\", \"hasDetails\", \"skipGroupDecoration\", \"hasGroupHeaderColumn\", \"groupHeaderColumns\", \"rowIndex\", \"totalColumnsCount\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", 4, \"ngIf\"], [\"kendoGridLogicalRow\", \"\", 3, \"dataRowIndex\", \"dataItem\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", \"ngClass\", \"k-alt\", \"k-master-row\", \"k-grid-edit-row\", \"k-state-selected\", 4, \"ngIf\"], [\"class\", \"k-detail-row\", \"kendoGridLogicalRow\", \"\", 3, \"k-alt\", \"dataRowIndex\", \"dataItem\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", 4, \"ngIf\"], [\"class\", \"k-group-footer\", \"kendoGridLogicalRow\", \"\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", 4, \"ngIf\"], [\"kendoGridGroupHeader\", \"\", \"kendoGridLogicalRow\", \"\", 3, \"columns\", \"groups\", \"item\", \"hasDetails\", \"skipGroupDecoration\", \"hasGroupHeaderColumn\", \"groupHeaderColumns\", \"rowIndex\", \"totalColumnsCount\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"], [\"kendoGridLogicalRow\", \"\", 3, \"dataRowIndex\", \"dataItem\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\", \"ngClass\"], [\"class\", \"k-hierarchy-cell\", \"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"dataRowIndex\", \"dataItem\", \"detailExpandCell\", 4, \"ngIf\"], [\"kendoGridCell\", \"\", \"kendoGridLogicalCell\", \"\", \"role\", \"gridcell\", 3, \"rowIndex\", \"columnIndex\", \"column\", \"dataItem\", \"logicalRowIndex\", \"logicalColIndex\", \"dataRowIndex\", \"colIndex\", \"colSpan\", \"touch-action\", \"ngClass\", \"k-grid-edit-cell\", \"ngStyle\", \"k-state-selected\", 4, \"ngFor\", \"ngForOf\", \"ngForTrackBy\"], [\"kendoGridLogicalCell\", \"\", \"aria-selected\", \"false\", 1, \"k-hierarchy-cell\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"dataRowIndex\", \"dataItem\", \"detailExpandCell\"], [\"class\", \"k-icon\", \"href\", \"#\", \"tabindex\", \"-1\", 3, \"ngClass\", \"click\", 4, \"ngIf\"], [\"href\", \"#\", \"tabindex\", \"-1\", 1, \"k-icon\", 3, \"ngClass\", \"click\"], [\"kendoGridCell\", \"\", \"kendoGridLogicalCell\", \"\", \"role\", \"gridcell\", 3, \"rowIndex\", \"columnIndex\", \"column\", \"dataItem\", \"logicalRowIndex\", \"logicalColIndex\", \"dataRowIndex\", \"colIndex\", \"colSpan\", \"ngClass\", \"ngStyle\"], [\"kendoGridLogicalRow\", \"\", 1, \"k-detail-row\", 3, \"dataRowIndex\", \"dataItem\", \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\"], [\"class\", \"k-group-cell\", 4, \"ngFor\", \"ngForOf\"], [1, \"k-hierarchy-cell\"], [\"kendoGridLogicalCell\", \"\", \"role\", \"gridcell\", \"aria-selected\", \"false\", 1, \"k-detail-cell\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"dataRowIndex\", \"dataItem\", \"colIndex\", \"colSpan\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [1, \"k-group-cell\"], [\"kendoGridLogicalRow\", \"\", 1, \"k-group-footer\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"], [\"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\", 4, \"ngFor\", \"ngForOf\", \"ngForTrackBy\"], [\"kendoGridLogicalCell\", \"\", 3, \"logicalRowIndex\", \"logicalColIndex\"], [3, \"templateContext\"]], template: function TableBodyComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TableBodyComponent_ng_template_0_Template, 4, 8, \"ng-template\", 0);\n ɵngcc0.ɵɵtemplate(1, TableBodyComponent_tr_1_Template, 4, 6, \"tr\", 1);\n ɵngcc0.ɵɵtemplate(2, TableBodyComponent_ng_template_2_Template, 4, 4, \"ng-template\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.editService.hasNewItem);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", (ctx.data == null ? null : ctx.data.length) === 0 || ctx.data == null);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.data)(\"ngForTrackBy\", ctx.trackByWrapper);\n } }, directives: function () { return [ɵngcc5.NgIf, ɵngcc5.NgForOf, LogicalRowDirective,\n LogicalCellDirective,\n CellComponent, ɵngcc5.NgClass, ɵngcc5.NgStyle, TemplateContextDirective,\n GroupHeaderComponent, ɵngcc5.NgTemplateOutlet]; }, encapsulation: 2 });\n/** @nocollapse */\nTableBodyComponent.ctorParameters = () => [\n { type: DetailsService },\n { type: GroupsService },\n { type: ChangeNotificationService },\n { type: EditService },\n { type: LocalizationService },\n { type: NgZone },\n { type: Renderer2 },\n { type: ElementRef },\n { type: DomEventsService },\n { type: SelectionService },\n { type: CellSelectionService },\n { type: ColumnInfoService },\n { type: NavigationService }\n];\nTableBodyComponent.propDecorators = {\n columns: [{ type: Input }],\n allColumns: [{ type: Input }],\n groups: [{ type: Input }],\n detailTemplate: [{ type: Input }],\n noRecordsTemplate: [{ type: Input }],\n data: [{ type: Input }],\n skip: [{ type: Input }],\n selectable: [{ type: Input }],\n filterable: [{ type: Input }],\n noRecordsText: [{ type: Input }],\n isLocked: [{ type: Input }],\n skipGroupDecoration: [{ type: Input }],\n showGroupFooters: [{ type: Input }],\n lockedColumnsCount: [{ type: Input }],\n totalColumnsCount: [{ type: Input }],\n virtualColumns: [{ type: Input }],\n trackBy: [{ type: Input }],\n rowClass: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TableBodyComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridTableBody]',\n template: `\n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{noRecordsText}}\n \n \n \n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"groupHeaderSlaveCellsCount\">\n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\"\n [ngClass]=\"rowClass({ dataItem: item.data, index: item.index })\"\n [class.k-alt]=\"isOdd(item)\"\n [class.k-master-row]=\"detailTemplate?.templateRef\"\n [class.k-grid-edit-row]=\"isEditingRow(item.index)\"\n [attr.data-kendo-grid-item-index]=\"item.index\"\n [class.k-state-selected]=\"isSelectable() && isRowSelected(item)\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"unlockedColumnsCount\">\n \n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: DetailsService }, { type: GroupsService }, { type: ChangeNotificationService }, { type: EditService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }, { type: DomEventsService }, { type: SelectionService }, { type: CellSelectionService }, { type: ColumnInfoService }, { type: NavigationService }]; }, { columns: [{\n type: Input\n }], groups: [{\n type: Input\n }], skip: [{\n type: Input\n }], noRecordsText: [{\n type: Input\n }], isLocked: [{\n type: Input\n }], skipGroupDecoration: [{\n type: Input\n }], showGroupFooters: [{\n type: Input\n }], lockedColumnsCount: [{\n type: Input\n }], totalColumnsCount: [{\n type: Input\n }], trackBy: [{\n type: Input\n }], rowClass: [{\n type: Input\n }], allColumns: [{\n type: Input\n }], detailTemplate: [{\n type: Input\n }], noRecordsTemplate: [{\n type: Input\n }], data: [{\n type: Input\n }], selectable: [{\n type: Input\n }], filterable: [{\n type: Input\n }], virtualColumns: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass CellComponent {\n constructor(editService, idService, cellContext) {\n this.editService = editService;\n this.idService = idService;\n this.cellContext = cellContext;\n this.isNew = false;\n this._templateContext = {};\n this._editTemplateContext = {};\n }\n get commandCellClass() {\n return this.isCommand(this.column);\n }\n set rowIndex(index) {\n this._rowIndex = index;\n this.updateCellContext();\n }\n get rowIndex() {\n return this._rowIndex;\n }\n get isEdited() {\n if (!(this.editService.isEditing() || this.isNew) || !this.isColumnEditable) {\n return false;\n }\n const editContext = this.editService.columnContext(this.rowIndex, this.column);\n return this.isFieldEditable(editContext, this.column);\n }\n get formGroup() {\n return this.editService.context(this.rowIndex).group;\n }\n get templateContext() {\n return this._templateContext;\n }\n get editTemplateContext() {\n this._editTemplateContext.$implicit = this.formGroup;\n this._editTemplateContext.isNew = this.isNew;\n this._editTemplateContext.column = this.column;\n this._editTemplateContext.dataItem = this.dataItem;\n this._editTemplateContext.formGroup = this.formGroup;\n this._editTemplateContext.rowIndex = this.rowIndex;\n return this._editTemplateContext;\n }\n get format() {\n if (isColumnComponent(this.column) && !isNullOrEmptyString(this.column.format)) {\n return extractFormat(this.column.format);\n }\n return undefined;\n }\n get isBoundColumn() {\n return this.column.field && !this.column.templateRef;\n }\n get isCheckboxColumn() {\n return isCheckboxColumn(this.column) && !this.column.templateRef;\n }\n get selectionCheckboxId() {\n return this.idService.selectionCheckboxId(this.rowIndex);\n }\n get isSpanColumn() {\n return isSpanColumn(this.column) && !this.column.templateRef;\n }\n get childColumns() {\n return columnsToRender([this.column]);\n }\n get isColumnEditable() {\n if (!this.column || this.isCommand(this.column)) {\n return false;\n }\n return this.column.editable !== false;\n }\n ngDoCheck() {\n this.updateCellContext();\n }\n ngOnChanges(_changes) {\n this.updateTemplateContext();\n }\n isCommand(column) {\n return column instanceof CommandColumnComponent;\n }\n isFieldEditable(editContext, column) {\n if (!isPresent(editContext)) {\n return false;\n }\n if (isPresent(column.editTemplate)) {\n return true;\n }\n return isPresent(editContext.group) && isPresent(editContext.group.get(column.field));\n }\n updateCellContext() {\n if (this.cellContext) {\n this.cellContext.rowIndex = this._rowIndex;\n }\n }\n updateTemplateContext() {\n if (!this.column.templateRef) {\n return;\n }\n const context = this._templateContext;\n context.isNew = this.isNew;\n context.column = this.column;\n context.dataItem = this.dataItem;\n context.rowIndex = this.rowIndex;\n context.columnIndex = this.columnIndex;\n context.$implicit = this.dataItem;\n }\n}\nCellComponent.ɵfac = function CellComponent_Factory(t) { return new (t || CellComponent)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(IdService), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT, 8)); };\nCellComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CellComponent, selectors: [[\"\", \"kendoGridCell\", \"\"]], hostVars: 2, hostBindings: function CellComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-command-cell\", ctx.commandCellClass);\n } }, inputs: { isNew: \"isNew\", rowIndex: \"rowIndex\", column: \"column\", columnIndex: \"columnIndex\", dataItem: \"dataItem\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c162, decls: 3, vars: 3, consts: [[3, \"ngSwitch\"], [4, \"ngSwitchCase\"], [3, \"ngIf\", \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [3, \"ngIf\"], [\"ngFor\", \"\", 3, \"ngForOf\"], [1, \"k-checkbox\", 3, \"kendoGridSelectionCheckbox\"], [1, \"k-checkbox-label\"], [4, \"ngIf\"], [3, \"ngSwitch\", 4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [\"kendoGridFocusable\", \"\", 3, \"format\", \"formControl\", 4, \"ngSwitchCase\"], [\"type\", \"checkbox\", \"class\", \"k-checkbox\", \"kendoGridFocusable\", \"\", 3, \"formControl\", 4, \"ngSwitchCase\"], [\"type\", \"text\", \"class\", \"k-textbox\", \"kendoGridFocusable\", \"\", 3, \"formControl\", 4, \"ngSwitchDefault\"], [\"kendoGridFocusable\", \"\", 3, \"format\", \"formControl\"], [\"type\", \"checkbox\", \"kendoGridFocusable\", \"\", 1, \"k-checkbox\", 3, \"formControl\"], [\"type\", \"text\", \"kendoGridFocusable\", \"\", 1, \"k-textbox\", 3, \"formControl\"]], template: function CellComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵtemplate(1, CellComponent_ng_container_1_Template, 5, 6, \"ng-container\", 1);\n ɵngcc0.ɵɵtemplate(2, CellComponent_ng_container_2_Template, 3, 2, \"ng-container\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.isEdited);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n } }, directives: [ɵngcc5.NgSwitch, ɵngcc5.NgSwitchCase, ɵngcc5.NgIf, ɵngcc5.NgTemplateOutlet, ɵngcc5.NgForOf, FocusableDirective,\n SelectionCheckboxDirective, ɵngcc5.NgSwitchDefault, ɵngcc6.NumericTextBoxComponent, ɵngcc7.NgControlStatus, ɵngcc7.FormControlDirective, ɵngcc9.DatePickerComponent, ɵngcc7.CheckboxControlValueAccessor, ɵngcc7.DefaultValueAccessor], pipes: [FieldAccessorPipe], encapsulation: 2 });\n/** @nocollapse */\nCellComponent.ctorParameters = () => [\n { type: EditService },\n { type: IdService },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CELL_CONTEXT,] }] }\n];\nCellComponent.propDecorators = {\n commandCellClass: [{ type: HostBinding, args: ['class.k-command-cell',] }],\n column: [{ type: Input }],\n columnIndex: [{ type: Input }],\n isNew: [{ type: Input }],\n rowIndex: [{ type: Input }],\n dataItem: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CellComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridCell]',\n template: `\n \n \n \n \n \n \n {{ dataItem | valueOf: childColumn.field: childColumn.format}}\n \n \n {{ dataItem | valueOf: column.field: column.format}}\n \n \n \n \n \n \n \n \n \n\n \n\n \n\n \n \n \n \n `\n }]\n }], function () { return [{ type: EditService }, { type: IdService }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [CELL_CONTEXT]\n }] }]; }, { isNew: [{\n type: Input\n }], commandCellClass: [{\n type: HostBinding,\n args: ['class.k-command-cell']\n }], rowIndex: [{\n type: Input\n }], column: [{\n type: Input\n }], columnIndex: [{\n type: Input\n }], dataItem: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the `edit` command of the Grid. You can apply this directive to any `button`\n * element inside a [`CommandColumnComponent`]({% slug api_grid_commandcolumncomponent %}).\n * When an associated button with the directive is clicked, the\n * [`edit`]({% slug api_grid_gridcomponent %}#toc-edit) event\n * is triggered ([see example]({% slug editing_grid %})).\n *\n * > When the row is in the edit mode, the button with `kendoGridEditCommand` is automatically hidden.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n *\n */\nclass EditCommandDirective extends Button {\n constructor(editService, cellContext, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.editService = editService;\n this.cellContext = cellContext;\n /**\n * @hidden\n */\n this.commandClass = true;\n }\n /**\n * @hidden\n */\n get visible() {\n return this.isEdited ? 'none' : '';\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n this.editService.beginEdit(this.rowIndex);\n }\n ngDoCheck() {\n if (this.cellContext) {\n this.rowIndex = this.cellContext.rowIndex;\n this.isEdited = this.editService.isEdited(this.rowIndex);\n }\n }\n}\nEditCommandDirective.ɵfac = function EditCommandDirective_Factory(t) { return new (t || EditCommandDirective)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nEditCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: EditCommandDirective, selectors: [[\"\", \"kendoGridEditCommand\", \"\"]], hostVars: 4, hostBindings: function EditCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function EditCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n ɵngcc0.ɵɵclassProp(\"k-grid-edit-command\", ctx.commandClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nEditCommandDirective.ctorParameters = () => [\n { type: EditService },\n { type: undefined, decorators: [{ type: Inject, args: [CELL_CONTEXT,] }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nEditCommandDirective.propDecorators = {\n visible: [{ type: HostBinding, args: ['style.display',] }],\n commandClass: [{ type: HostBinding, args: ['class.k-grid-edit-command',] }],\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(EditCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridEditCommand]'\n }]\n }], function () { return [{ type: EditService }, { type: undefined, decorators: [{\n type: Inject,\n args: [CELL_CONTEXT]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { commandClass: [{\n type: HostBinding,\n args: ['class.k-grid-edit-command']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }], onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }] }); })();\n\n/**\n * Represents the `cancel` command of the Grid. You can apply this directive to any `button`\n * element inside a [`CommandColumnComponent`]({% slug api_grid_commandcolumncomponent %}).\n * When an associated button with the directive is clicked, the\n * [`cancel`]({% slug api_grid_gridcomponent %}#toc-cancel) event\n * is triggered ([see example]({% slug editing_grid %})).\n *\n * > When the row is not in the edit mode, the button with the `kendoGridCancelCommand` is automatically hidden.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n *\n * You can control the content of the button based on the state of the row.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n */\nclass CancelCommandDirective extends Button {\n constructor(editService, cellContext, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.editService = editService;\n this.cellContext = cellContext;\n /**\n * @hidden\n */\n this.commandClass = true;\n }\n /**\n * @hidden\n */\n get visible() {\n return !this.isEdited ? 'none' : '';\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n if (this.isEdited) {\n this.editService.endEdit(this.rowIndex);\n }\n }\n ngDoCheck() {\n if (this.cellContext) {\n this.rowIndex = this.cellContext.rowIndex;\n this.isEdited = this.editService.isEdited(this.rowIndex);\n }\n }\n}\nCancelCommandDirective.ɵfac = function CancelCommandDirective_Factory(t) { return new (t || CancelCommandDirective)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nCancelCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CancelCommandDirective, selectors: [[\"\", \"kendoGridCancelCommand\", \"\"]], hostVars: 4, hostBindings: function CancelCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function CancelCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n ɵngcc0.ɵɵclassProp(\"k-grid-cancel-command\", ctx.commandClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nCancelCommandDirective.ctorParameters = () => [\n { type: EditService },\n { type: undefined, decorators: [{ type: Inject, args: [CELL_CONTEXT,] }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nCancelCommandDirective.propDecorators = {\n visible: [{ type: HostBinding, args: ['style.display',] }],\n commandClass: [{ type: HostBinding, args: ['class.k-grid-cancel-command',] }],\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CancelCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridCancelCommand]'\n }]\n }], function () { return [{ type: EditService }, { type: undefined, decorators: [{\n type: Inject,\n args: [CELL_CONTEXT]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { commandClass: [{\n type: HostBinding,\n args: ['class.k-grid-cancel-command']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }], onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }] }); })();\n\n/**\n * Represents the `save` command of the Grid. You can apply this directive to any `button`\n * element inside a [`CommandColumnComponent`]({% slug api_grid_commandcolumncomponent %}).\n * When an associated button with the directive is clicked, the\n * [`save`]({% slug api_grid_gridcomponent %}#toc-save) event\n * is triggered ([see example]({% slug editing_grid %})).\n *\n * > When the row is not in the edit mode, the button with `kendoGridSaveCommand` is automatically hidden.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n *\n * You can control the content of the button based on the state of the row.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n */\nclass SaveCommandDirective extends Button {\n constructor(editService, cellContext, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.editService = editService;\n this.cellContext = cellContext;\n /**\n * @hidden\n */\n this.commandClass = true;\n }\n /**\n * @hidden\n */\n get visible() {\n return !this.isEdited ? 'none' : '';\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n if (this.isEdited) {\n this.editService.save(this.rowIndex);\n }\n }\n ngDoCheck() {\n if (this.cellContext) {\n this.rowIndex = this.cellContext.rowIndex;\n this.isEdited = this.editService.isEdited(this.rowIndex);\n }\n }\n}\nSaveCommandDirective.ɵfac = function SaveCommandDirective_Factory(t) { return new (t || SaveCommandDirective)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nSaveCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: SaveCommandDirective, selectors: [[\"\", \"kendoGridSaveCommand\", \"\"]], hostVars: 4, hostBindings: function SaveCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function SaveCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n ɵngcc0.ɵɵclassProp(\"k-grid-save-command\", ctx.commandClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nSaveCommandDirective.ctorParameters = () => [\n { type: EditService },\n { type: undefined, decorators: [{ type: Inject, args: [CELL_CONTEXT,] }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nSaveCommandDirective.propDecorators = {\n visible: [{ type: HostBinding, args: ['style.display',] }],\n commandClass: [{ type: HostBinding, args: ['class.k-grid-save-command',] }],\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SaveCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridSaveCommand]'\n }]\n }], function () { return [{ type: EditService }, { type: undefined, decorators: [{\n type: Inject,\n args: [CELL_CONTEXT]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { commandClass: [{\n type: HostBinding,\n args: ['class.k-grid-save-command']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }], onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }] }); })();\n\n/**\n * Represents the `remove` command of the Grid. You can apply this directive to any `button` element\n * inside a [`CommandColumnComponent`]({% slug api_grid_commandcolumncomponent %}).\n * When an associated button with the directive is clicked, the\n * [`remove` event]({% slug api_grid_gridcomponent %}#toc-remove)\n * is triggered ([see example]({% slug editing_reactive_forms_grid %})).\n *\n * > When the row is in the edit mode, the button with the `kendoGridRemoveCommand` is automatically hidden.\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n */\nclass RemoveCommandDirective extends Button {\n constructor(editService, cellContext, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.editService = editService;\n this.cellContext = cellContext;\n /**\n * @hidden\n */\n this.commandClass = true;\n }\n /**\n * @hidden\n */\n get visible() {\n return this.isEdited ? 'none' : '';\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n this.editService.remove(this.rowIndex);\n }\n ngDoCheck() {\n if (this.cellContext) {\n this.rowIndex = this.cellContext.rowIndex;\n this.isEdited = this.editService.isEdited(this.rowIndex);\n }\n }\n}\nRemoveCommandDirective.ɵfac = function RemoveCommandDirective_Factory(t) { return new (t || RemoveCommandDirective)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(CELL_CONTEXT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nRemoveCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: RemoveCommandDirective, selectors: [[\"\", \"kendoGridRemoveCommand\", \"\"]], hostVars: 4, hostBindings: function RemoveCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function RemoveCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.visible);\n ɵngcc0.ɵɵclassProp(\"k-grid-remove-command\", ctx.commandClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nRemoveCommandDirective.ctorParameters = () => [\n { type: EditService },\n { type: undefined, decorators: [{ type: Inject, args: [CELL_CONTEXT,] }] },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nRemoveCommandDirective.propDecorators = {\n visible: [{ type: HostBinding, args: ['style.display',] }],\n commandClass: [{ type: HostBinding, args: ['class.k-grid-remove-command',] }],\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(RemoveCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridRemoveCommand]'\n }]\n }], function () { return [{ type: EditService }, { type: undefined, decorators: [{\n type: Inject,\n args: [CELL_CONTEXT]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { commandClass: [{\n type: HostBinding,\n args: ['class.k-grid-remove-command']\n }], visible: [{\n type: HostBinding,\n args: ['style.display']\n }], onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }] }); })();\n\n/**\n * Represents the command for adding a new item to the Grid. You can apply this directive to any\n * `button` element inside a [`ToolbarTemplate`]({% slug api_grid_commandcolumncomponent %}).\n * When an associated button with the directive is clicked, the\n * [`add`]({% slug api_grid_gridcomponent %}#toc-add) event is triggered\n * ([see example]({% slug editing_grid %})).\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * ```\n */\nclass AddCommandDirective extends Button {\n constructor(editService, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.editService = editService;\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n this.editService.beginAdd();\n }\n /**\n * @hidden\n */\n get commandClass() {\n return true;\n }\n}\nAddCommandDirective.ɵfac = function AddCommandDirective_Factory(t) { return new (t || AddCommandDirective)(ɵngcc0.ɵɵdirectiveInject(EditService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nAddCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: AddCommandDirective, selectors: [[\"\", \"kendoGridAddCommand\", \"\"]], hostVars: 2, hostBindings: function AddCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function AddCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-add-command\", ctx.commandClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nAddCommandDirective.ctorParameters = () => [\n { type: EditService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nAddCommandDirective.propDecorators = {\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }],\n commandClass: [{ type: HostBinding, args: ['class.k-grid-add-command',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AddCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridAddCommand]'\n }]\n }], function () { return [{ type: EditService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], commandClass: [{\n type: HostBinding,\n args: ['class.k-grid-add-command']\n }] }); })();\n\nconst exported$1 = [\n CommandColumnComponent,\n CheckboxColumnComponent,\n SelectionCheckboxDirective,\n CellTemplateDirective,\n EditTemplateDirective,\n TableBodyComponent,\n NoRecordsTemplateDirective,\n CellComponent,\n EditCommandDirective,\n CancelCommandDirective,\n SaveCommandDirective,\n RemoveCommandDirective,\n AddCommandDirective\n];\nconst importedModules$3 = [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n SharedModule,\n GroupModule,\n NumericTextBoxModule,\n DatePickerModule\n];\n/**\n * @hidden\n */\nclass BodyModule {\n static exports() {\n return [\n CommandColumnComponent,\n CheckboxColumnComponent,\n SelectionCheckboxDirective,\n CellTemplateDirective,\n NoRecordsTemplateDirective,\n EditTemplateDirective,\n EditCommandDirective,\n CancelCommandDirective,\n SaveCommandDirective,\n RemoveCommandDirective,\n AddCommandDirective\n ];\n }\n}\nBodyModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: BodyModule });\nBodyModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function BodyModule_Factory(t) { return new (t || BodyModule)(); }, imports: [[...importedModules$3]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(BodyModule, { declarations: [CommandColumnComponent,\n CheckboxColumnComponent,\n SelectionCheckboxDirective,\n CellTemplateDirective,\n EditTemplateDirective,\n TableBodyComponent,\n NoRecordsTemplateDirective,\n CellComponent,\n EditCommandDirective,\n CancelCommandDirective,\n SaveCommandDirective,\n RemoveCommandDirective,\n AddCommandDirective], imports: [CommonModule,\n ReactiveFormsModule,\n FormsModule,\n SharedModule,\n GroupModule,\n NumericTextBoxModule,\n DatePickerModule], exports: [CommandColumnComponent,\n CheckboxColumnComponent,\n SelectionCheckboxDirective,\n CellTemplateDirective,\n EditTemplateDirective,\n TableBodyComponent,\n NoRecordsTemplateDirective,\n CellComponent,\n EditCommandDirective,\n CancelCommandDirective,\n SaveCommandDirective,\n RemoveCommandDirective,\n AddCommandDirective] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BodyModule, [{\n type: NgModule,\n args: [{\n declarations: [exported$1],\n exports: [exported$1],\n imports: [...importedModules$3]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass FooterComponent {\n constructor() {\n this.columns = [];\n this.groups = [];\n this.lockedColumnsCount = 0;\n this.logicalRowIndex = 0;\n }\n get footerClass() {\n return !this.scrollable;\n }\n get columnsToRender() {\n return columnsToRender(this.columns || []);\n }\n logicalColumnIndex(column) {\n const index = column.leafIndex;\n if (isPresent(index)) {\n return index + (isPresent(this.detailTemplate) ? 1 : 0);\n }\n return -1;\n }\n}\nFooterComponent.ɵfac = function FooterComponent_Factory(t) { return new (t || FooterComponent)(); };\nFooterComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: FooterComponent, selectors: [[\"\", \"kendoGridFooter\", \"\"]], hostVars: 2, hostBindings: function FooterComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-footer\", ctx.footerClass);\n } }, inputs: { columns: \"columns\", groups: \"groups\", lockedColumnsCount: \"lockedColumnsCount\", logicalRowIndex: \"logicalRowIndex\", detailTemplate: \"detailTemplate\", scrollable: \"scrollable\" }, attrs: _c163, decls: 1, vars: 1, consts: [[3, \"ngIf\"], [\"kendoGridLogicalRow\", \"\", 3, \"logicalRowIndex\", \"logicalSlaveRow\", \"logicalCellsCount\", \"logicalSlaveCellsCount\"], [\"role\", \"presentation\", 3, \"k-group-cell\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\", 3, \"k-hierarchy-cell\", 4, \"ngIf\"], [\"kendoGridLogicalCell\", \"\", \"role\", \"columnfooter\", \"aria-selected\", \"false\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"ngClass\", \"ngStyle\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"presentation\"], [\"kendoGridLogicalCell\", \"\", \"role\", \"columnfooter\", \"aria-selected\", \"false\", 3, \"logicalRowIndex\", \"logicalColIndex\", \"ngClass\", \"ngStyle\"], [3, \"templateContext\"]], template: function FooterComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, FooterComponent_ng_template_0_Template, 4, 9, \"ng-template\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", true);\n } }, directives: [ɵngcc5.NgIf, LogicalRowDirective, ɵngcc5.NgForOf, LogicalCellDirective, ɵngcc5.NgClass, ɵngcc5.NgStyle, TemplateContextDirective], encapsulation: 2 });\nFooterComponent.propDecorators = {\n columns: [{ type: Input }],\n groups: [{ type: Input }],\n detailTemplate: [{ type: Input }],\n scrollable: [{ type: Input }],\n lockedColumnsCount: [{ type: Input }],\n logicalRowIndex: [{ type: Input }],\n footerClass: [{ type: HostBinding, args: ['class.k-grid-footer',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FooterComponent, [{\n type: Component,\n args: [{\n selector: '[kendoGridFooter]',\n template: `\n \n 0\"\n [logicalCellsCount]=\"columns.length\"\n [logicalSlaveCellsCount]=\"columns.length - lockedColumnsCount\"\n >\n \n \n \n \n \n \n \n \n \n \n `\n }]\n }], function () { return []; }, { columns: [{\n type: Input\n }], groups: [{\n type: Input\n }], lockedColumnsCount: [{\n type: Input\n }], logicalRowIndex: [{\n type: Input\n }], footerClass: [{\n type: HostBinding,\n args: ['class.k-grid-footer']\n }], detailTemplate: [{\n type: Input\n }], scrollable: [{\n type: Input\n }] }); })();\n\nconst exportedModules$3 = [\n FooterComponent\n];\nconst importedModules$4 = [\n CommonModule,\n SharedModule\n];\n/**\n * @hidden\n */\nclass FooterModule {\n static exports() {\n return [];\n }\n}\nFooterModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: FooterModule });\nFooterModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function FooterModule_Factory(t) { return new (t || FooterModule)(); }, imports: [[...importedModules$4]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(FooterModule, { declarations: [FooterComponent], imports: [CommonModule,\n SharedModule], exports: [FooterComponent] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(FooterModule, [{\n type: NgModule,\n args: [{\n declarations: [exportedModules$3],\n exports: [exportedModules$3],\n imports: [...importedModules$4]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass ToolbarComponent {\n constructor(grid) {\n this.grid = grid;\n this.context = {};\n }\n get classNames() {\n return 'k-header k-grid-toolbar';\n }\n set position(value) {\n this.context.position = value;\n }\n get toolbarTemplateRef() {\n return this.grid.toolbarTemplate ? this.grid.toolbarTemplate.templateRef : undefined;\n }\n}\nToolbarComponent.ɵfac = function ToolbarComponent_Factory(t) { return new (t || ToolbarComponent)(ɵngcc0.ɵɵdirectiveInject(GridComponent)); };\nToolbarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ToolbarComponent, selectors: [[\"kendo-grid-toolbar\"]], hostVars: 2, hostBindings: function ToolbarComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassMap(ctx.classNames);\n } }, inputs: { position: \"position\" }, decls: 1, vars: 1, consts: [[4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"]], template: function ToolbarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, ToolbarComponent_0_Template, 1, 2, undefined, 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.toolbarTemplateRef);\n } }, directives: [ɵngcc5.NgIf, ɵngcc5.NgTemplateOutlet], encapsulation: 2 });\n/** @nocollapse */\nToolbarComponent.ctorParameters = () => [\n { type: GridComponent }\n];\nToolbarComponent.propDecorators = {\n classNames: [{ type: HostBinding, args: ['class',] }],\n position: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ToolbarComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-toolbar',\n template: `\n \n \n `\n }]\n }], function () { return [{ type: GridComponent }]; }, { classNames: [{\n type: HostBinding,\n args: ['class']\n }], position: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass LocalEditService {\n constructor(grid, localDataChangesService) {\n this.grid = grid;\n this.localDataChangesService = localDataChangesService;\n }\n create(item) {\n if (this.hasLocalData && this.grid.skip) {\n this.localDataChangesService.data.splice(this.grid.skip, 0, item);\n }\n else {\n this.data.unshift(item);\n }\n this.dataChanged();\n }\n update(_item) { } // tslint:disable-line:no-empty\n remove(item) {\n const data = this.data;\n for (let idx = 0; idx < data.length; idx++) {\n if (item === data[idx]) {\n data.splice(idx, 1);\n this.dataChanged({ action: 'remove', item: item });\n break;\n }\n }\n }\n assignValues(target, source) {\n Object.assign(target, source);\n }\n dataChanged(args = {}) {\n if (this.hasLocalData) {\n this.localDataChangesService.changes.emit(args);\n }\n }\n get hasLocalData() {\n return Array.isArray(this.localDataChangesService.data);\n }\n get data() {\n if (this.hasLocalData) {\n return this.localDataChangesService.data;\n }\n const data = this.grid.data;\n if (Array.isArray(data)) {\n return data;\n }\n if (isDevMode()) {\n throw new Error('The default edit service of the editing directives works only when binding to plain array.' +\n 'Please provide an editService.');\n }\n return [];\n }\n}\n\n/**\n * @hidden\n */\nclass EditingDirectiveBase {\n constructor(grid, localDataChangesService) {\n this.grid = grid;\n this.localDataChangesService = localDataChangesService;\n this.defaultEditService = this.createDefaultService();\n }\n // Consider adding support for the dependency injection of the service to allow for specifying a generic service without code.\n // The Input should still be kept.\n /**\n * The edit service that will handle the operations.\n */\n set editService(value) {\n this.userEditService = value;\n }\n get editService() {\n return this.userEditService || this.defaultEditService;\n }\n /**\n * @hidden\n */\n ngOnInit() {\n this.subscriptions = this.grid.add.subscribe(this.addHandler.bind(this));\n this.subscriptions.add(this.grid.remove.subscribe(this.removeHandler.bind(this)));\n this.subscriptions.add(this.grid.cancel.subscribe(this.cancelHandler.bind(this)));\n this.subscriptions.add(this.grid.save.subscribe(this.saveHandler.bind(this)));\n this.subscriptions.add(this.grid.dataStateChange.subscribe(this.onStateChange.bind(this)));\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n createDefaultService() {\n return new LocalEditService(this.grid, this.localDataChangesService);\n }\n addHandler() {\n this.grid.addRow(this.createModel({ isNew: true }));\n }\n saveHandler(args) {\n const item = this.saveModel(args);\n if (item) {\n if (args.isNew) {\n this.editService.create(item);\n }\n else {\n this.editService.update(item);\n }\n }\n this.grid.closeRow(args.rowIndex);\n }\n cancelHandler({ rowIndex }) {\n this.closeEditor(rowIndex);\n }\n removeHandler({ dataItem }) {\n const removeItem = (shouldRemove) => {\n if (shouldRemove) {\n this.editService.remove(dataItem);\n }\n };\n if (this.removeConfirmation) {\n const result = this.removeConfirmation(dataItem);\n if (result instanceof Promise) {\n result.then(removeItem);\n }\n else if (result instanceof Observable) {\n result.pipe(take(1)).subscribe(removeItem);\n }\n else {\n removeItem(result);\n }\n }\n else {\n removeItem(true);\n }\n }\n onStateChange() {\n this.closeEditor();\n }\n closeEditor(rowIndex) {\n this.grid.closeRow(rowIndex);\n }\n}\nEditingDirectiveBase.ɵfac = function EditingDirectiveBase_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nEditingDirectiveBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: EditingDirectiveBase, inputs: { editService: \"editService\", removeConfirmation: \"removeConfirmation\" } });\nEditingDirectiveBase.propDecorators = {\n editService: [{ type: Input }],\n removeConfirmation: [{ type: Input }]\n};\n\n\n/**\n * @hidden\n */\nclass LocalRowEditService extends LocalEditService {\n update(_item) {\n this.dataChanged();\n }\n}\n\n/**\n * @hidden\n */\nclass RowEditingDirectiveBase extends EditingDirectiveBase {\n /**\n * @hidden\n */\n ngOnInit() {\n super.ngOnInit();\n this.subscriptions\n .add(this.grid.edit.subscribe(this.editHandler.bind(this)));\n }\n createDefaultService() {\n return new LocalRowEditService(this.grid, this.localDataChangesService);\n }\n addHandler() {\n this.closeEditor();\n super.addHandler();\n }\n editHandler(args) {\n this.closeEditor();\n this.rowIndex = args.rowIndex;\n this.grid.editRow(args.rowIndex, this.createModel(args));\n }\n saveHandler(args) {\n super.saveHandler(args);\n this.clean();\n }\n closeEditor(rowIndex = this.rowIndex) {\n super.closeEditor(rowIndex);\n this.clean();\n }\n clean() {\n delete this.rowIndex;\n }\n}\nRowEditingDirectiveBase.ɵfac = function RowEditingDirectiveBase_Factory(t) { return ɵRowEditingDirectiveBase_BaseFactory(t || RowEditingDirectiveBase); };\nRowEditingDirectiveBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: RowEditingDirectiveBase, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nconst ɵRowEditingDirectiveBase_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(RowEditingDirectiveBase);\n\n/**\n * A directive which encapsulates the editing operations of the Grid when using\n * the Template-Driven Angular Forms ([see example]({% slug editing_directives_grid %}#toc-the-template-directive)).\n */\nclass TemplateEditingDirective extends RowEditingDirectiveBase {\n constructor(grid, localDataChangesService) {\n super(grid, localDataChangesService);\n this.grid = grid;\n this.localDataChangesService = localDataChangesService;\n }\n editHandler(args) {\n super.editHandler(args);\n this.dataItem = args.dataItem;\n this.originalValues = {};\n this.editService.assignValues(this.originalValues, this.dataItem);\n }\n closeEditor(rowIndex) {\n if (this.dataItem) {\n this.editService.assignValues(this.dataItem, this.originalValues);\n }\n super.closeEditor(rowIndex);\n }\n createModel(args) {\n if (args.isNew) {\n return this.createNewItem();\n }\n }\n saveModel(args) {\n return args.dataItem;\n }\n clean() {\n super.clean();\n delete this.dataItem;\n }\n}\nTemplateEditingDirective.ɵfac = function TemplateEditingDirective_Factory(t) { return new (t || TemplateEditingDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(LocalDataChangesService)); };\nTemplateEditingDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TemplateEditingDirective, selectors: [[\"\", \"kendoGridTemplateEditing\", \"\"]], inputs: { createNewItem: [\"kendoGridTemplateEditing\", \"createNewItem\"] }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nTemplateEditingDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: LocalDataChangesService }\n];\nTemplateEditingDirective.propDecorators = {\n createNewItem: [{ type: Input, args: ['kendoGridTemplateEditing',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TemplateEditingDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridTemplateEditing]'\n }]\n }], function () { return [{ type: GridComponent }, { type: LocalDataChangesService }]; }, { createNewItem: [{\n type: Input,\n args: ['kendoGridTemplateEditing']\n }] }); })();\n\n/**\n * @hidden\n */\nconst markAllAsTouched = (control) => {\n control.markAsTouched();\n if (control.hasOwnProperty('controls')) {\n let controls = control.controls;\n for (let inner in controls) {\n if (controls.hasOwnProperty(inner)) {\n markAllAsTouched(controls[inner]);\n }\n }\n }\n};\n\n/**\n * A directive which encapsulates the editing operations of the Grid when using the\n * Reactive Forms ([see example]({% slug editing_directives_grid %}#toc-the-reactive-directive)).\n */\nclass ReactiveEditingDirective extends RowEditingDirectiveBase {\n constructor(grid, localDataChangesService) {\n super(grid, localDataChangesService);\n this.grid = grid;\n this.localDataChangesService = localDataChangesService;\n }\n createModel(args) {\n return this.createFormGroup(args);\n }\n saveModel({ dataItem, formGroup, isNew }) {\n if (!formGroup.dirty && !isNew) {\n return;\n }\n if (formGroup.valid) {\n this.editService.assignValues(dataItem, formGroup.value);\n return dataItem;\n }\n markAllAsTouched(formGroup);\n }\n}\nReactiveEditingDirective.ɵfac = function ReactiveEditingDirective_Factory(t) { return new (t || ReactiveEditingDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(LocalDataChangesService)); };\nReactiveEditingDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ReactiveEditingDirective, selectors: [[\"\", \"kendoGridReactiveEditing\", \"\"]], inputs: { createFormGroup: [\"kendoGridReactiveEditing\", \"createFormGroup\"] }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nReactiveEditingDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: LocalDataChangesService }\n];\nReactiveEditingDirective.propDecorators = {\n createFormGroup: [{ type: Input, args: ['kendoGridReactiveEditing',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ReactiveEditingDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridReactiveEditing]'\n }]\n }], function () { return [{ type: GridComponent }, { type: LocalDataChangesService }]; }, { createFormGroup: [{\n type: Input,\n args: ['kendoGridReactiveEditing']\n }] }); })();\n\n/**\n * A directive which encapsulates the editing operations of the Grid when using the in-cell\n * editing with Reactive Forms ([see example]({% slug editing_directives_grid %}#toc-the-incell-directive)).\n */\nclass InCellEditingDirective extends EditingDirectiveBase {\n constructor(grid, localDataChangesService) {\n super(grid, localDataChangesService);\n this.grid = grid;\n this.localDataChangesService = localDataChangesService;\n }\n // Need mixin\n createModel(args) {\n return this.createFormGroup(args);\n }\n saveModel({ dataItem, formGroup, isNew }) {\n if (!formGroup.dirty && !isNew) {\n return;\n }\n if (formGroup.valid) {\n this.editService.assignValues(dataItem, formGroup.value);\n return dataItem;\n }\n markAllAsTouched(formGroup);\n }\n /**\n * @hidden\n */\n ngOnInit() {\n super.ngOnInit();\n this.subscriptions.add(this.grid.cellClick.subscribe(this.cellClickHandler.bind(this)));\n this.subscriptions.add(this.grid.cellClose.subscribe(this.cellCloseHandler.bind(this)));\n }\n removeHandler(args) {\n super.removeHandler(args);\n this.grid.cancelCell();\n }\n cellClickHandler(args) {\n if (!args.isEdited && args.type !== 'contextmenu') {\n this.grid.editCell(args.rowIndex, args.columnIndex, this.createFormGroup(args));\n }\n }\n cellCloseHandler(args) {\n const { formGroup, dataItem } = args;\n if (!formGroup.valid) {\n args.preventDefault();\n }\n else if (formGroup.dirty) {\n this.editService.assignValues(dataItem, formGroup.value);\n this.editService.update(dataItem);\n }\n }\n}\nInCellEditingDirective.ɵfac = function InCellEditingDirective_Factory(t) { return new (t || InCellEditingDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(LocalDataChangesService)); };\nInCellEditingDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: InCellEditingDirective, selectors: [[\"\", \"kendoGridInCellEditing\", \"\"]], inputs: { createFormGroup: [\"kendoGridInCellEditing\", \"createFormGroup\"] }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nInCellEditingDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: LocalDataChangesService }\n];\nInCellEditingDirective.propDecorators = {\n createFormGroup: [{ type: Input, args: ['kendoGridInCellEditing',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(InCellEditingDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridInCellEditing]'\n }]\n }], function () { return [{ type: GridComponent }, { type: LocalDataChangesService }]; }, { createFormGroup: [{\n type: Input,\n args: ['kendoGridInCellEditing']\n }] }); })();\n\nconst hasGroups = (items) => items && items.length && items[0].field && items[0].items;\nconst groupDescriptorsPresent = (descriptors) => isPresent(descriptors) && descriptors.length > 0;\nconst processGroups = (data, state$$1) => process(data, state$$1).data;\nconst removeParentDescriptors = (parents, owner) => g => g.field !== owner.field && !parents.some(y => y.field === g.field);\nconst findGroup = (groupIndex, groups) => {\n const parents = [];\n return {\n group: groupIndex.split(\"_\").reduce((acc, x) => {\n const idx = parseInt(x, 10);\n if (acc.items) {\n parents.push(acc);\n return acc.items[idx];\n }\n return isArray(acc) ? acc[idx] : acc;\n }, groups),\n parents\n };\n};\nconst findChildren = (data, parents) => {\n const filters = parents.map(p => ({ field: p.field, operator: \"eq\", value: p.value }));\n return filterBy(data, {\n filters: filters,\n logic: \"and\"\n });\n};\n/**\n * @hidden\n */\nconst count = (groups, includeFooters = false) => (groups.reduce((acc, group) => {\n if (!group.skipHeader) {\n acc++;\n }\n if (group.items) {\n const children = count(group.items, includeFooters);\n if (includeFooters && children && !group.hideFooter) {\n acc++;\n }\n acc += children;\n }\n return acc;\n}, 0) // tslint:disable-line:align\n);\n/**\n * @hidden\n */\nconst slice = (groups, skip, take$$1, includeFooters = false) => {\n if (!isPresent(take$$1)) {\n return groups;\n }\n const result = [];\n for (let idx = 0, length = groups.length; idx < length; idx++) {\n if (take$$1 <= 0) {\n break;\n }\n const group = groups[idx];\n const groupItems = group.items;\n let itemCount = count(groupItems, includeFooters);\n if (includeFooters && groupItems.length) {\n itemCount++;\n }\n const skipHeader = skip > 0;\n if (skip) {\n skip--;\n if (itemCount && skip >= itemCount) {\n skip -= itemCount;\n continue;\n }\n }\n if (!skipHeader || itemCount) {\n const items = [];\n let hideFooter = true;\n if (!skipHeader) {\n take$$1--;\n }\n if (take$$1) {\n if (hasGroups(groupItems)) {\n const children = slice(groupItems, skip, take$$1, includeFooters);\n items.push(...children);\n take$$1 -= count(children, includeFooters);\n }\n else {\n items.push(...groupItems.slice(skip, Math.min(skip + take$$1, groupItems.length)));\n take$$1 -= items.length;\n }\n if (take$$1 && includeFooters) {\n hideFooter = false;\n take$$1--;\n }\n skip = 0;\n }\n result.push({\n aggregates: group.aggregates,\n field: group.field,\n hideFooter,\n items,\n offset: idx,\n skipHeader,\n value: group.value\n });\n }\n }\n return result;\n};\nconst skippedHeaders = (groupItem) => {\n let total = 0;\n while (groupItem) {\n if (groupItem.skipHeader) {\n total++;\n }\n groupItem = groupItem.items && groupItem.items[0] || null;\n }\n return total;\n};\n/**\n * A directive which encapsulates the in-memory handling of grouping with virtual scrolling.\n */\nclass GroupBindingDirective extends DataBindingDirective {\n constructor(grid, changeDetector, localDataChangesService) {\n super(grid, changeDetector, localDataChangesService);\n }\n /**\n * The array of data which will be used to populate the Grid.\n */\n set kendoGridGroupBinding(value) {\n this.groups = null;\n this.grid.resetGroupsState();\n this.data = value;\n }\n /**\n * @hidden\n */\n set data(value) {\n this.originalData = value || [];\n this.dataChanged = true;\n }\n /**\n * Defines the descriptors by which the data will be sorted.\n */\n set sort(value) {\n const clear = this.state.sort !== value;\n this.grid.sort = this.state.sort = value;\n if (clear) {\n this.groups = null;\n this.grid.resetGroupsState();\n }\n }\n /**\n * Defines the descriptor by which the data will be filtered.\n */\n set filter(value) {\n const clear = diffFilters(this.state.filter, value);\n if (clear) {\n this.state.filter = value;\n this.grid.filter = cloneFilters(value);\n this.groups = null;\n this.grid.resetGroupsState();\n }\n }\n /**\n * Defines the descriptors by which the data will be grouped.\n */\n set group(value) {\n // don't clear if no groups are present in previous and current value\n const groupsPresent = groupDescriptorsPresent(this.state.group) || groupDescriptorsPresent(value);\n const clear = this.state.group !== value && groupsPresent;\n this.grid.group = this.state.group = value;\n if (clear) {\n this.groups = null;\n this.grid.resetGroupsState();\n this.skip = 0;\n }\n }\n /**\n * @hidden\n */\n ngOnInit() {\n super.ngOnInit();\n this.grid.groupExpand.subscribe(this.groupExpand.bind(this));\n this.grid.groupCollapse.subscribe(this.groupCollapse.bind(this));\n }\n groupExpand({ groupIndex }) {\n this.grid.expandGroupChildren(groupIndex);\n const { group, parents } = findGroup(groupIndex, this.groups);\n if (!group.items.length) {\n const descriptors = this.state.group.filter(removeParentDescriptors(parents, group));\n const children = findChildren(this.originalData, parents.concat(group));\n group.items = processGroups(children, {\n filter: this.state.filter,\n group: descriptors,\n sort: this.state.sort\n });\n }\n this.grid.data = this.dataResult(this.state.skip, this.state.take);\n }\n groupCollapse({ groupIndex }) {\n const { group } = findGroup(groupIndex, this.groups);\n if (group) {\n group.items = [];\n }\n this.grid.data = this.dataResult(this.state.skip, this.state.take);\n }\n process(state$$1) {\n if (state$$1.group && state$$1.group.length) {\n const groups = this.processGroups(state$$1);\n this.grid.skip -= skippedHeaders(groups.data[0]);\n return groups;\n }\n else {\n this.groups = null;\n }\n return super.process(state$$1);\n }\n processGroups(state$$1) {\n if (!this.groups || !this.groups.length) {\n this.groups = processGroups(this.originalData, {\n filter: state$$1.filter,\n group: state$$1.group,\n sort: state$$1.sort\n });\n }\n return this.dataResult(state$$1.skip, state$$1.take);\n }\n dataResult(skip, take$$1) {\n const includeFooters = this.grid.showGroupFooters;\n return {\n data: slice(this.groups, skip, take$$1, includeFooters),\n total: count(this.groups, includeFooters)\n };\n }\n applyState({ skip, take: take$$1, sort, group, filter: filter$$1 }) {\n this.skip = skip;\n this.state.take = take$$1;\n // this.pageSize = take; // do need to update take as the process with slice correctly\n this.sort = sort;\n this.group = group;\n this.filter = filter$$1;\n }\n}\nGroupBindingDirective.ɵfac = function GroupBindingDirective_Factory(t) { return new (t || GroupBindingDirective)(ɵngcc0.ɵɵdirectiveInject(GridComponent), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(LocalDataChangesService)); };\nGroupBindingDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: GroupBindingDirective, selectors: [[\"\", \"kendoGridGroupBinding\", \"\"]], inputs: { kendoGridGroupBinding: \"kendoGridGroupBinding\", sort: \"sort\", filter: \"filter\", group: \"group\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nGroupBindingDirective.ctorParameters = () => [\n { type: GridComponent },\n { type: ChangeDetectorRef },\n { type: LocalDataChangesService }\n];\nGroupBindingDirective.propDecorators = {\n kendoGridGroupBinding: [{ type: Input, args: [\"kendoGridGroupBinding\",] }],\n sort: [{ type: Input }],\n filter: [{ type: Input }],\n group: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GroupBindingDirective, [{\n type: Directive,\n args: [{ selector: '[kendoGridGroupBinding]' }]\n }], function () { return [{ type: GridComponent }, { type: ɵngcc0.ChangeDetectorRef }, { type: LocalDataChangesService }]; }, { kendoGridGroupBinding: [{\n type: Input,\n args: [\"kendoGridGroupBinding\"]\n }], sort: [{\n type: Input\n }], filter: [{\n type: Input\n }], group: [{\n type: Input\n }] }); })();\n\nconst exportedModules$4 = [\n GridComponent,\n ToolbarTemplateDirective,\n ToolbarComponent,\n DataBindingDirective,\n SelectionDirective,\n CustomMessagesComponent,\n GroupBindingDirective,\n TemplateEditingDirective,\n ReactiveEditingDirective,\n InCellEditingDirective,\n ExpandDetailsDirective,\n ...GroupModule.exports(),\n ...SharedModule.exports(),\n ...BodyModule.exports(),\n ...HeaderModule.exports(),\n ...FooterModule.exports(),\n ...PagerModule.exports(),\n ...RowFilterModule.exports(),\n ...FilterMenuModule.exports(),\n ...ColumnMenuModule.exports()\n];\nconst declarations = [\n GridComponent,\n ListComponent,\n ToolbarComponent,\n LocalizedMessagesDirective,\n CustomMessagesComponent,\n DataBindingDirective,\n ToolbarTemplateDirective,\n SelectionDirective,\n TemplateEditingDirective,\n ReactiveEditingDirective,\n InCellEditingDirective,\n ExpandDetailsDirective,\n GroupBindingDirective,\n GridMarqueeDirective\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Grid component.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Grid module\n * import { GridModule } from '@progress/kendo-angular-grid';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, GridModule], // import Grid module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass GridModule {\n}\nGridModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: GridModule });\nGridModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function GridModule_Factory(t) { return new (t || GridModule)(); }, imports: [[\n CommonModule,\n GroupModule,\n SharedModule,\n BodyModule,\n HeaderModule,\n FooterModule,\n PagerModule,\n RowFilterModule,\n FilterMenuModule,\n ResizeSensorModule,\n ColumnMenuModule\n ]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(GridModule, { declarations: function () { return [GridComponent,\n ListComponent,\n ToolbarComponent,\n LocalizedMessagesDirective,\n CustomMessagesComponent,\n DataBindingDirective,\n ToolbarTemplateDirective,\n SelectionDirective,\n TemplateEditingDirective,\n ReactiveEditingDirective,\n InCellEditingDirective,\n ExpandDetailsDirective,\n GroupBindingDirective,\n GridMarqueeDirective]; }, imports: function () { return [CommonModule,\n GroupModule,\n SharedModule,\n BodyModule,\n HeaderModule,\n FooterModule,\n PagerModule,\n RowFilterModule,\n FilterMenuModule,\n ResizeSensorModule,\n ColumnMenuModule]; }, exports: function () { return [GridComponent,\n ToolbarTemplateDirective,\n ToolbarComponent,\n DataBindingDirective,\n SelectionDirective,\n CustomMessagesComponent,\n GroupBindingDirective,\n TemplateEditingDirective,\n ReactiveEditingDirective,\n InCellEditingDirective,\n ExpandDetailsDirective,\n GroupHeaderTemplateDirective,\n GroupHeaderColumnTemplateDirective,\n GroupFooterTemplateDirective,\n ColumnComponent,\n SpanColumnComponent,\n ColumnGroupComponent,\n FooterTemplateDirective,\n DetailTemplateDirective,\n FocusableDirective,\n CommandColumnComponent,\n CheckboxColumnComponent,\n SelectionCheckboxDirective,\n CellTemplateDirective,\n NoRecordsTemplateDirective,\n EditTemplateDirective,\n EditCommandDirective,\n CancelCommandDirective,\n SaveCommandDirective,\n RemoveCommandDirective,\n AddCommandDirective,\n HeaderTemplateDirective,\n SelectAllCheckboxDirective,\n PagerComponent,\n PagerPrevButtonsComponent,\n PagerNextButtonsComponent,\n PagerNumericButtonsComponent,\n PagerInputComponent,\n PagerInfoComponent,\n PagerPageSizesComponent,\n PagerTemplateDirective,\n FilterRowComponent,\n FilterCellComponent,\n FilterCellTemplateDirective,\n FilterCellOperatorsComponent,\n StringFilterCellComponent,\n NumericFilterCellComponent,\n AutoCompleteFilterCellComponent,\n BooleanFilterCellComponent,\n DateFilterCellComponent,\n FilterCellOperatorsComponent,\n ContainsFilterOperatorComponent,\n DoesNotContainFilterOperatorComponent,\n EndsWithFilterOperatorComponent,\n EqualFilterOperatorComponent,\n IsEmptyFilterOperatorComponent,\n IsNotEmptyFilterOperatorComponent,\n IsNotNullFilterOperatorComponent,\n IsNullFilterOperatorComponent,\n NotEqualFilterOperatorComponent,\n StartsWithFilterOperatorComponent,\n GreaterFilterOperatorComponent,\n GreaterOrEqualToFilterOperatorComponent,\n LessFilterOperatorComponent,\n LessOrEqualToFilterOperatorComponent,\n AfterFilterOperatorComponent,\n AfterEqFilterOperatorComponent,\n BeforeEqFilterOperatorComponent,\n BeforeFilterOperatorComponent,\n StringFilterMenuComponent,\n FilterMenuTemplateDirective,\n NumericFilterMenuComponent,\n DateFilterMenuComponent,\n BooleanFilterMenuComponent,\n FilterCellOperatorsComponent,\n ContainsFilterOperatorComponent,\n DoesNotContainFilterOperatorComponent,\n EndsWithFilterOperatorComponent,\n EqualFilterOperatorComponent,\n IsEmptyFilterOperatorComponent,\n IsNotEmptyFilterOperatorComponent,\n IsNotNullFilterOperatorComponent,\n IsNullFilterOperatorComponent,\n NotEqualFilterOperatorComponent,\n StartsWithFilterOperatorComponent,\n GreaterFilterOperatorComponent,\n GreaterOrEqualToFilterOperatorComponent,\n LessFilterOperatorComponent,\n LessOrEqualToFilterOperatorComponent,\n AfterFilterOperatorComponent,\n AfterEqFilterOperatorComponent,\n BeforeEqFilterOperatorComponent,\n BeforeFilterOperatorComponent,\n ColumnChooserComponent,\n ColumnMenuFilterComponent,\n ColumnMenuItemComponent,\n ColumnMenuItemContentTemplateDirective,\n ColumnMenuSortComponent,\n ColumnMenuLockComponent,\n ColumnMenuChooserComponent,\n ColumnMenuTemplateDirective,\n ColumnMenuComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(GridModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations],\n exports: [exportedModules$4],\n imports: [\n CommonModule,\n GroupModule,\n SharedModule,\n BodyModule,\n HeaderModule,\n FooterModule,\n PagerModule,\n RowFilterModule,\n FilterMenuModule,\n ResizeSensorModule,\n ColumnMenuModule\n ]\n }]\n }], null, null); })();\n\nclass PDFMarginComponent$1 extends PDFMarginComponent {\n}\nPDFMarginComponent$1.ɵfac = function PDFMarginComponent$1_Factory(t) { return ɵPDFMarginComponent$1_BaseFactory(t || PDFMarginComponent$1); };\nPDFMarginComponent$1.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PDFMarginComponent$1, selectors: [[\"kendo-grid-pdf-margin\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function PDFMarginComponent$1_Template(rf, ctx) { }, encapsulation: 2 });\nconst ɵPDFMarginComponent$1_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(PDFMarginComponent$1);\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFMarginComponent$1, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-pdf-margin',\n template: ''\n }]\n }], null, null); })();\n\n/**\n * Represents the PDF page template of the Grid that helps to customize the PDF pages. To define a page template,\n * nest an `` tag with the `kendoGridPDFTemplate` directive inside ``.\n *\n * The template context provides the following fields:\n * - `pageNumber`—Defines PDF page number.\n * - `totalPages`—Defines the total number of PDF pages.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *
\n * Page {{ pageNum }} of {{ totalPages }}\n *
\n *
\n *
\n *
\n * `\n * })\n *\n * class AppComponent {\n * public gridData = [{\n * \"ProductID\": 1,\n * \"ProductName\": \"Chai\",\n * \"UnitPrice\": 18.0000\n * }, {\n * \"ProductID\": 2,\n * \"ProductName\": \"Chang\",\n * \"UnitPrice\": 19.0000\n * }\n * ];\n * }\n *\n * ```\n */\nclass PDFTemplateDirective$1 extends PDFTemplateDirective {\n constructor(templateRef) {\n super(templateRef);\n }\n}\nPDFTemplateDirective$1.ɵfac = function PDFTemplateDirective$1_Factory(t) { return new (t || PDFTemplateDirective$1)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nPDFTemplateDirective$1.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PDFTemplateDirective$1, selectors: [[\"\", \"kendoGridPDFTemplate\", \"\"]], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nPDFTemplateDirective$1.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFTemplateDirective$1, [{\n type: Directive,\n args: [{\n selector: '[kendoGridPDFTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nconst HEADER_CLASS = 'k-grid-header';\n/**\n * @hidden\n */\nconst FOOTER_CLASS = 'k-grid-footer';\nconst GRID_LIST = 'KENDO-GRID-LIST';\nconst TABLE = 'TABLE';\nconst matchesList = matchesNodeName(GRID_LIST);\nconst matchesTable = matchesNodeName(TABLE);\nconst suffix = (locked) => locked ? 'locked' : 'wrap';\n/**\n * @hidden\n */\nclass GridQuery {\n constructor(element) {\n this.element = element;\n this.list = findElement(element, matchesList);\n }\n content(locked) {\n return findElement(this.list, matchesClasses(`k-grid-content${locked ? '-locked' : ''}`));\n }\n header(locked) {\n this.headerWrap = this.headerWrap || findElement(this.element, matchesClasses(HEADER_CLASS));\n return findElement(this.headerWrap, matchesClasses(`${HEADER_CLASS}-${suffix(locked)}`));\n }\n footer(locked) {\n this.footerWrap = this.footerWrap || findElement(this.element, matchesClasses(FOOTER_CLASS));\n return findElement(this.footerWrap, matchesClasses(`${FOOTER_CLASS}-${suffix(locked)}`));\n }\n table() {\n return findElement(this.element, matchesTable);\n }\n}\n\nconst FIRST_CLASS = 'k-first';\nconst INPUTS = ['input', 'select', 'textarea', 'option'];\n/** @hidden */\nconst cloneNode = (node) => {\n const clone = node.cloneNode(false);\n if (node._kendoExportVisual) {\n clone._kendoExportVisual = node._kendoExportVisual;\n }\n if (INPUTS.indexOf(String(node.nodeName).toLowerCase()) >= 0) {\n clone.removeAttribute(\"id\");\n clone.removeAttribute(\"name\");\n clone.value = node.value;\n clone.checked = node.checked;\n clone.selected = node.selected;\n }\n let child = node.firstChild;\n while (child) {\n clone.appendChild(cloneNode(child));\n child = child.nextSibling;\n }\n return clone;\n};\nconst appendNodes = (element, nodes) => {\n const length = nodes.length;\n for (let idx = 0; idx < length; idx++) {\n element.appendChild(cloneNode(nodes[idx]));\n }\n};\nconst wrapTable = (table) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'k-widget k-grid';\n wrapper.appendChild(table);\n return wrapper;\n};\nconst createTableElement = (sources) => {\n const sourceCount = sources.length;\n const element = cloneNode(sources[0]);\n const rowsCount = element.rows.length;\n if (sourceCount > 1) {\n for (let rowIdx = 0; rowIdx < rowsCount; rowIdx++) {\n for (let sourceIdx = 1; sourceIdx < sourceCount; sourceIdx++) {\n appendNodes(element.rows[rowIdx], sources[sourceIdx].rows[rowIdx].cells);\n }\n }\n }\n return element;\n};\nconst setFirstCellClass = (header, headers) => {\n if (headers.length > 1 && header.rows.length > 1) {\n for (let idx = 1; idx < header.rows.length; idx++) {\n const firstCellIndex = headers[0].rows[idx].cells.length;\n const cell = header.rows[idx].cells[firstCellIndex];\n if (String(cell.className).indexOf(FIRST_CLASS) === -1) {\n cell.className += ` ${FIRST_CLASS}`;\n }\n }\n }\n};\nconst createTable = (colGroups, headers, bodies, footers) => {\n const table = document.createElement('table');\n const colGroup = colGroups[0].cloneNode(true);\n for (let idx = 1; idx < colGroups.length; idx++) {\n appendNodes(colGroup, colGroups[idx].querySelectorAll('col'));\n }\n const header = createTableElement(headers);\n const body = createTableElement(bodies);\n header.className = HEADER_CLASS;\n setFirstCellClass(header, headers);\n table.appendChild(colGroup);\n table.appendChild(header);\n table.appendChild(body);\n if (footers.length) {\n const footer = createTableElement(footers);\n footer.className = FOOTER_CLASS;\n table.appendChild(footer);\n }\n return wrapTable(table);\n};\n/**\n * @hidden\n */\nconst exportElement = (wrapper) => {\n const query = new GridQuery(wrapper);\n const content = query.content();\n let result;\n if (content) {\n const colGroups = [content.querySelector('colgroup')];\n const headers = [query.header().querySelector('thead')];\n const bodies = [content.querySelector('tbody')];\n const footer = query.footer();\n const footers = [];\n if (footer) {\n footers.push(footer.querySelector('tfoot'));\n }\n const lockedContent = query.content(true);\n if (lockedContent) {\n colGroups.unshift(lockedContent.querySelector('colgroup'));\n headers.unshift(query.header(true).querySelector('thead'));\n bodies.unshift(lockedContent.querySelector('tbody'));\n if (footer) {\n footers.unshift(query.footer(true).querySelector('tfoot'));\n }\n }\n result = createTable(colGroups, headers, bodies, footers);\n }\n else {\n result = wrapTable(query.table().cloneNode(true));\n }\n return result;\n};\n\nconst createElement$1 = (tagName, className) => {\n const element = document.createElement(tagName);\n if (className) {\n element.className = className;\n }\n return element;\n};\nconst createDiv = (className) => {\n return createElement$1('div', className);\n};\n/**\n * Configures the settings for the export of Grid in PDF ([see example]({% slug pdfexport_grid %})).\n */\nclass PDFComponent extends PDFExportComponent {\n constructor(pdfService, suspendService, ngZone, element) {\n super(element);\n this.pdfService = pdfService;\n this.suspendService = suspendService;\n this.ngZone = ngZone;\n this.columns = new QueryList();\n this.saveSubscription = pdfService.savePDF.subscribe(this.savePDF.bind(this));\n this.drawSubscription = pdfService.drawPDF.subscribe(this.drawPDF.bind(this));\n this.reset = this.reset.bind(this);\n this.draw = this.draw.bind(this);\n }\n ngOnDestroy() {\n this.saveSubscription.unsubscribe();\n this.drawSubscription.unsubscribe();\n this.reset();\n }\n savePDF(component) {\n this.createPDF(component, this.draw);\n }\n drawPDF({ component, promise }) {\n this.createPDF(component, () => {\n this.createExportGroup(promise);\n });\n }\n createPDF(component, callback) {\n const pageSize = component.pageSize;\n const total = component.view.total;\n const columns = this.columns.toArray();\n if (columns.length) {\n this.originalColumns = component.columns.toArray();\n }\n this.component = component;\n this.suspendService.scroll = true;\n this.pdfService.exporting = true;\n this.initProgress();\n this.renderAllPages = this.allPages && pageSize < total;\n if (this.renderAllPages) {\n this.skip = component.skip;\n this.pageSize = pageSize;\n this.changePage(0, total, callback, columns);\n }\n else if (columns.length || component.virtualColumns) {\n this.changeColumns(columns, callback);\n }\n else {\n callback();\n }\n }\n initProgress() {\n const wrapperElement = this.component.wrapper.nativeElement;\n const progress = this.progress = createDiv('k-loading-pdf-mask');\n const overlay = cloneNode(wrapperElement);\n progress.appendChild(overlay);\n progress.appendChild(createDiv('k-loading-color'));\n progress.appendChild(createElement$1('span', 'k-i-loading k-icon'));\n this.originalHeight = wrapperElement.style.height;\n this.originalOverflow = wrapperElement.style.overflow;\n wrapperElement.style.height = wrapperElement.offsetHeight + 'px';\n wrapperElement.style.overflow = 'hidden';\n wrapperElement.appendChild(progress);\n this.applyScroll(overlay);\n }\n applyScroll(overlay) {\n const query = new GridQuery(this.component.wrapper.nativeElement);\n const content = query.content();\n if (content) {\n const overlayQuery = new GridQuery(overlay);\n const overlayContent = overlayQuery.content();\n overlayContent.scrollTop = content.scrollTop;\n overlayContent.scrollLeft = content.scrollLeft;\n overlayQuery.header().scrollLeft = query.header().scrollLeft;\n const footer = query.footer();\n if (footer) {\n overlayQuery.footer().scrollLeft = footer.scrollLeft;\n }\n const lockedContent = query.content(true);\n if (lockedContent) {\n const overlayLockedContent = overlayQuery.content(true);\n overlayLockedContent.scrollTop = lockedContent.scrollTop;\n overlayLockedContent.scrollLeft = lockedContent.scrollLeft;\n }\n }\n }\n draw() {\n this.createExportElement((element) => {\n this.save(element, this.fileName);\n });\n }\n createExportGroup(promise) {\n this.createExportElement((element) => {\n this.exportElement(element).then(group => promise.resolve(group));\n });\n }\n createExportElement(callback) {\n this.ngZone.runOutsideAngular(() => {\n const container = this.container = createDiv('k-grid-pdf-export-element');\n const element = exportElement(this.component.wrapper.nativeElement);\n container.appendChild(element);\n document.body.appendChild(container);\n callback(element);\n });\n }\n drawOptions() {\n const options = super.drawOptions();\n options._destructive = true;\n return options;\n }\n cleanup() {\n super.cleanup();\n this.pdfService.exporting = false;\n if (this.component) {\n const originalColumns = this.originalColumns;\n delete this.originalColumns;\n if (this.renderAllPages) {\n this.changePage(this.skip, this.pageSize, this.reset, originalColumns);\n }\n else if (originalColumns || this.component.virtualColumns) {\n this.changeColumns(originalColumns, this.reset);\n }\n else {\n this.reset();\n }\n }\n else {\n this.reset();\n }\n this.removeContainer();\n }\n removeContainer() {\n if (this.container) {\n document.body.removeChild(this.container);\n delete this.container;\n }\n }\n changePage(skip, _take, callback, columns) {\n this.ngZone.run(() => {\n this.pdfService.dataChanged.pipe(take(1)).subscribe(() => {\n if ((columns && columns.length) || this.component.virtualColumns) {\n this.changeColumns(columns, callback);\n }\n else {\n this.onStable(callback);\n }\n });\n this.component.notifyPageChange('pdf', { skip: skip, take: _take });\n });\n }\n changeColumns(columns, callback) {\n this.ngZone.run(() => {\n this.onStable(callback);\n if (columns && columns.length) {\n this.component.columns.reset(columns);\n }\n });\n }\n reset() {\n this.suspendService.scroll = false;\n this.renderAllPages = false;\n if (!this.component) {\n return;\n }\n const wrapperElement = this.component.wrapper.nativeElement;\n wrapperElement.removeChild(this.progress);\n wrapperElement.style.height = this.originalHeight;\n wrapperElement.style.overflow = this.originalOverflow;\n delete this.progress;\n delete this.component;\n }\n onStable(callback) {\n // not sure if it is an actual scenario. occurs in the tests.\n // onStable is triggered in the same pass without the change detection.\n // thus, the callback is called before the changes are applied without the timeout.\n setTimeout(() => {\n this.ngZone.onStable.asObservable().pipe(take(1)).subscribe(callback);\n }, 0); // tslint:disable-line: align\n }\n}\nPDFComponent.ɵfac = function PDFComponent_Factory(t) { return new (t || PDFComponent)(ɵngcc0.ɵɵdirectiveInject(PDFService), ɵngcc0.ɵɵdirectiveInject(SuspendService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nPDFComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PDFComponent, selectors: [[\"kendo-grid-pdf\"]], contentQueries: function PDFComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, PDFMarginComponent$1, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PDFTemplateDirective$1, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase$1, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.marginComponent = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.pageTemplateDirective = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columns = _t);\n } }, inputs: { allPages: \"allPages\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function PDFComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nPDFComponent.ctorParameters = () => [\n { type: PDFService },\n { type: SuspendService },\n { type: NgZone },\n { type: ElementRef }\n];\nPDFComponent.propDecorators = {\n allPages: [{ type: Input }],\n columns: [{ type: ContentChildren, args: [ColumnBase$1,] }],\n marginComponent: [{ type: ContentChild, args: [PDFMarginComponent$1,] }],\n pageTemplateDirective: [{ type: ContentChild, args: [PDFTemplateDirective$1,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-pdf',\n template: ''\n }]\n }], function () { return [{ type: PDFService }, { type: SuspendService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ElementRef }]; }, { columns: [{\n type: ContentChildren,\n args: [ColumnBase$1]\n }], allPages: [{\n type: Input\n }], marginComponent: [{\n type: ContentChild,\n args: [PDFMarginComponent$1]\n }], pageTemplateDirective: [{\n type: ContentChild,\n args: [PDFTemplateDirective$1]\n }] }); })();\n\n/**\n * Represents the `export-to-PDF` command of the Grid.\n * You can apply this directive to any `button` element inside a\n * [`ToolbarTemplate`]({% slug api_grid_commandcolumncomponent %}).\n * When the user clicks a button that is associated with the directive, the\n * [`pdfExport`]({% slug api_grid_gridcomponent %}#toc-pdfexport) event\n * fires ([see example]({% slug pdfexport_grid %})).\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n */\nclass PDFCommandDirective extends Button {\n constructor(pdfService, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.pdfService = pdfService;\n this.ngZone = ngZone;\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n this.pdfService.exportClick.emit();\n }\n /**\n * @hidden\n */\n get pdfClass() {\n return true;\n }\n}\nPDFCommandDirective.ɵfac = function PDFCommandDirective_Factory(t) { return new (t || PDFCommandDirective)(ɵngcc0.ɵɵdirectiveInject(PDFService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nPDFCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PDFCommandDirective, selectors: [[\"\", \"kendoGridPDFCommand\", \"\"]], hostVars: 2, hostBindings: function PDFCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function PDFCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-pdf\", ctx.pdfClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nPDFCommandDirective.ctorParameters = () => [\n { type: PDFService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nPDFCommandDirective.propDecorators = {\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }],\n pdfClass: [{ type: HostBinding, args: ['class.k-grid-pdf',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridPDFCommand]'\n }]\n }], function () { return [{ type: PDFService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], pdfClass: [{\n type: HostBinding,\n args: ['class.k-grid-pdf']\n }] }); })();\n\nconst exportedModules$5 = [\n PDFComponent,\n PDFMarginComponent$1,\n PDFCommandDirective,\n PDFTemplateDirective$1\n];\nconst declarations$1 = [\n PDFComponent,\n PDFMarginComponent$1,\n PDFCommandDirective,\n PDFTemplateDirective$1\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Grid PDF component.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Grid and PDF modules\n * import { GridModule, PDFModule } from '@progress/kendo-angular-grid';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, GridModule, PDFModule], // import Grid and PDF modules\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass PDFModule {\n}\nPDFModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: PDFModule });\nPDFModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function PDFModule_Factory(t) { return new (t || PDFModule)(); } });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(PDFModule, { declarations: [PDFComponent,\n PDFMarginComponent$1,\n PDFCommandDirective,\n PDFTemplateDirective$1], exports: [PDFComponent,\n PDFMarginComponent$1,\n PDFCommandDirective,\n PDFTemplateDirective$1] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PDFModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$1],\n exports: [exportedModules$5]\n }]\n }], null, null); })();\n\n/**\n * Arguments for the `excelExport` event.\n */\nclass ExcelExportEvent extends PreventableEvent {\n constructor(workbook) {\n super();\n this.workbook = workbook;\n }\n}\n\n/* tslint:disable object-literal-sort-keys */\nconst fetchComponentData = (component) => {\n return {\n data: component.view.map(item => item),\n group: component.group\n };\n};\nconst toExcelColumn = (column) => {\n return {\n title: column.title,\n field: column.field,\n locked: Boolean(column.locked),\n width: column.width,\n level: column.level,\n hidden: !column.isVisible,\n groupHeaderTemplate: column.groupHeaderTemplate,\n groupHeaderColumnTemplate: column.groupHeaderColumnTemplate,\n groupFooterTemplate: column.groupFooterTemplate,\n footerTemplate: column.footerTemplate\n };\n};\nconst toExcelColumns = (columns) => {\n const result = [];\n sortColumns(columns)\n .forEach((column) => {\n if (column.isSpanColumn) {\n result.push(...toExcelColumns(column.childrenArray));\n }\n else {\n const excelColumn = toExcelColumn(column);\n if (column.isColumnGroup) {\n excelColumn.children = [excelColumn].concat(toExcelColumns(column.childrenArray));\n }\n result.push(excelColumn);\n }\n });\n return result;\n};\nconst componentColumns = (component) => {\n const columns = toExcelColumns(component.columns.toArray());\n return orderBy(columns, [{ field: 'locked', dir: 'desc' }]);\n};\n/**\n * Configures the settings for the export of Grid in Excel ([see example]({% slug excelexport_grid %})).\n */\nclass ExcelComponent {\n constructor(excelService, localization, zone) {\n this.localization = localization;\n this.zone = zone;\n /**\n * Specifies the file name of the exported Excel file.\n * @default \"Export.xlsx\"\n */\n this.fileName = 'Export.xlsx';\n /**\n * @hidden\n */\n this.columns = new QueryList();\n this.saveSubscription = excelService.saveToExcel.subscribe(this.save.bind(this));\n }\n ngOnDestroy() {\n this.saveSubscription.unsubscribe();\n if (this.dataSubscription) {\n this.dataSubscription.unsubscribe();\n }\n }\n save(component) {\n const data = (this.fetchData || fetchComponentData)(component);\n const exportData = (result) => {\n delete this.dataSubscription;\n this.exportData(component, result);\n };\n if (data instanceof Promise) {\n data.then(exportData);\n }\n else if (data instanceof Observable) {\n this.dataSubscription = data.pipe(take(1)).subscribe(exportData);\n }\n else {\n exportData(data);\n }\n }\n exportData(component, result) {\n const options = workbookOptions({\n columns: this.columns.length ? this.columns : componentColumns(component),\n data: result.data,\n group: result.group,\n filterable: this.filterable,\n creator: this.creator,\n date: this.date,\n paddingCellOptions: this.paddingCellOptions,\n headerPaddingCellOptions: this.headerPaddingCellOptions,\n rtl: this.localization.rtl,\n collapsible: this.collapsible\n });\n const args = new ExcelExportEvent(options);\n component.excelExport.emit(args);\n if (!args.isDefaultPrevented()) {\n this.zone.runOutsideAngular(() => this.saveFile(options));\n }\n }\n saveFile(options) {\n toDataURL(options).then((dataURL) => {\n saveAs(dataURL, this.fileName, {\n forceProxy: this.forceProxy,\n proxyURL: this.proxyURL\n });\n });\n }\n}\nExcelComponent.ɵfac = function ExcelComponent_Factory(t) { return new (t || ExcelComponent)(ɵngcc0.ɵɵdirectiveInject(ExcelService), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nExcelComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ExcelComponent, selectors: [[\"kendo-grid-excel\"]], contentQueries: function ExcelComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, ColumnBase, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.columns = _t);\n } }, inputs: { fileName: \"fileName\", filterable: \"filterable\", creator: \"creator\", date: \"date\", forceProxy: \"forceProxy\", proxyURL: \"proxyURL\", fetchData: \"fetchData\", paddingCellOptions: \"paddingCellOptions\", headerPaddingCellOptions: \"headerPaddingCellOptions\", collapsible: \"collapsible\" }, decls: 0, vars: 0, template: function ExcelComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nExcelComponent.ctorParameters = () => [\n { type: ExcelService },\n { type: LocalizationService },\n { type: NgZone }\n];\nExcelComponent.propDecorators = {\n fileName: [{ type: Input }],\n filterable: [{ type: Input }],\n creator: [{ type: Input }],\n date: [{ type: Input }],\n forceProxy: [{ type: Input }],\n proxyURL: [{ type: Input }],\n fetchData: [{ type: Input }],\n paddingCellOptions: [{ type: Input }],\n headerPaddingCellOptions: [{ type: Input }],\n collapsible: [{ type: Input }],\n columns: [{ type: ContentChildren, args: [ColumnBase, { descendants: true },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-grid-excel',\n template: ``\n }]\n }], function () { return [{ type: ExcelService }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { fileName: [{\n type: Input\n }], columns: [{\n type: ContentChildren,\n args: [ColumnBase, { descendants: true }]\n }], filterable: [{\n type: Input\n }], creator: [{\n type: Input\n }], date: [{\n type: Input\n }], forceProxy: [{\n type: Input\n }], proxyURL: [{\n type: Input\n }], fetchData: [{\n type: Input\n }], paddingCellOptions: [{\n type: Input\n }], headerPaddingCellOptions: [{\n type: Input\n }], collapsible: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the `export-to-Excel` command of the Grid. You can apply this\n * directive to any `button` element inside a\n * [`ToolbarTemplate`]({% slug api_grid_commandcolumncomponent %}).\n * When the user clicks a button associated with the directive, the\n * [`excelExport`]({% slug api_grid_gridcomponent %}#toc-excelexport) event\n * fires ([see example]({% slug excelexport_grid %})).\n *\n * @example\n * ```html-no-run\n * \n * \n * \n * \n * \n * \n * \n * ```\n */\nclass ExcelCommandDirective extends Button {\n constructor(excelService, element, renderer, localization, ngZone) {\n super(element, renderer, null, localization, ngZone);\n this.excelService = excelService;\n this.ngZone = ngZone;\n }\n /**\n * @hidden\n */\n onClick(e) {\n e.preventDefault();\n this.excelService.exportClick.emit();\n }\n /**\n * @hidden\n */\n get excelClass() {\n return true;\n }\n}\nExcelCommandDirective.ɵfac = function ExcelCommandDirective_Factory(t) { return new (t || ExcelCommandDirective)(ɵngcc0.ɵɵdirectiveInject(ExcelService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nExcelCommandDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ExcelCommandDirective, selectors: [[\"\", \"kendoGridExcelCommand\", \"\"]], hostVars: 2, hostBindings: function ExcelCommandDirective_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function ExcelCommandDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-grid-excel\", ctx.excelClass);\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nExcelCommandDirective.ctorParameters = () => [\n { type: ExcelService },\n { type: ElementRef },\n { type: Renderer2 },\n { type: LocalizationService },\n { type: NgZone }\n];\nExcelCommandDirective.propDecorators = {\n onClick: [{ type: HostListener, args: ['click', ['$event'],] }],\n excelClass: [{ type: HostBinding, args: ['class.k-grid-excel',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelCommandDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoGridExcelCommand]'\n }]\n }], function () { return [{ type: ExcelService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { onClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], excelClass: [{\n type: HostBinding,\n args: ['class.k-grid-excel']\n }] }); })();\n\nconst declarations$2 = [ExcelComponent, ExcelCommandDirective];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Excel component of the Grid.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Grid and Excel modules\n * import { GridModule, ExcelModule } from '@progress/kendo-angular-grid';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, GridModule, ExcelModule], // import Grid and Excel modules\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass ExcelModule {\n}\nExcelModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ExcelModule });\nExcelModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ExcelModule_Factory(t) { return new (t || ExcelModule)(); }, imports: [ExcelExportModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ExcelModule, { declarations: function () { return [ExcelComponent,\n ExcelCommandDirective]; }, exports: function () { return [ExcelComponent,\n ExcelCommandDirective,\n ExcelExportModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ExcelModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$2],\n exports: [declarations$2, ExcelExportModule]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ColumnChooserComponent, ColumnListComponent, ColumnMenuChooserComponent, ColumnMenuFilterComponent, ColumnMenuItemBase, ColumnMenuItemContentTemplateDirective, ColumnMenuItemComponent, ColumnMenuLockComponent, ColumnMenuSortComponent, ColumnMenuTemplateDirective, ColumnMenuModule, ColumnMenuService, ColumnHandleDirective, ColumnResizingService, TableDirective, ColumnInfoService, DomEventsService, ExpandStateService, IdService, PreventableEvent, SortService, ChangeNotificationService, ColumnReorderService, DragAndDropModule, DragAndDropService, DragHintService, DraggableColumnDirective, DropCueService, DropTargetDirective, EditingDirectiveBase, RowEditingDirectiveBase, AddCommandDirective, CancelCommandDirective, EditCommandDirective, EditService as EditService$1, LocalDataChangesService, RemoveCommandDirective, SaveCommandDirective, ExcelCommandDirective, BooleanFilterComponent, BooleanFilterCellComponent, FilterCellHostDirective, FilterCellOperatorsComponent, FilterCellWrapperComponent, DateFilterComponent, FilterHostDirective, FilterInputWrapperComponent, FilterInputDirective, FilterRowComponent, DateFilterMenuInputComponent, FilterMenuContainerComponent, FilterMenuHostDirective, FilterMenuInputWrapperComponent, FilterMenuComponent, NumericFilterMenuInputComponent, StringFilterMenuInputComponent, NumericFilterComponent, FilterOperatorBase, SharedFilterModule, StringFilterComponent, GroupHeaderComponent, GroupIndicatorComponent, GroupInfoService, GroupPanelComponent, GroupsService, BrowserSupportService, ResizeService, ResponsiveService, LocalizedMessagesDirective, Messages, FocusGroup, FocusRoot, LogicalCellDirective, LogicalRowDirective, NavigationService, PagerContextService, PagerElementComponent, PDFCommandDirective, PDFTemplateDirective$1 as PDFTemplateDirective, CellComponent, CELL_CONTEXT, EMPTY_CELL_CONTEXT, FieldAccessorPipe, DetailsService, DEFAULT_SCROLLER_FACTORY, SCROLLER_FACTORY_TOKEN, ScrollRequestService, ScrollSyncService, ScrollerService, CellSelectionService, GridMarqueeDirective, SelectAllCheckboxDirective, SelectionCheckboxDirective, Selection, SelectionService, GridModule, SharedModule, GridComponent, ColumnBase$1 as ColumnBase, ColumnComponent, CommandColumnComponent, SpanColumnComponent, ColumnGroupComponent, CheckboxColumnComponent, ToolbarComponent, ToolbarTemplateDirective, CellTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, PagerTemplateDirective, ExpandDetailsDirective, DetailTemplateDirective, DetailExpandEvent, DetailCollapseEvent, GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, ResizableContainerDirective, TemplateContextDirective, NoRecordsTemplateDirective, DataBindingDirective, SelectionDirective, FilterService, FilterCellTemplateDirective, FilterCellComponent, StringFilterCellComponent, DateFilterCellComponent, BaseFilterCellComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, StringFilterMenuComponent, DateFilterMenuComponent, BooleanFilterMenuComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, AfterEqFilterOperatorComponent, AfterFilterOperatorComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, PagerPrevButtonsComponent, PagerNextButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerInfoComponent, PagerPageSizesComponent, RowFilterModule, FilterMenuModule, BodyModule, GroupModule, HeaderModule, FooterModule, PagerModule, TemplateEditingDirective, ReactiveEditingDirective, InCellEditingDirective, EditTemplateDirective, ColGroupComponent, HeaderComponent, ListComponent, FooterComponent, TableBodyComponent, PagerComponent, CustomMessagesComponent, LoadingComponent, PDFModule, PDFComponent, PDFMarginComponent$1 as PDFMarginComponent, PDFService, ExcelModule, ExcelComponent, ExcelService, ExcelExportEvent, CellCloseEvent, SuspendService, GroupBindingDirective, slice, count, Skip, ColumnReorderEvent, FocusableDirective, ColumnVisibilityChangeEvent, ColumnMenuComponent, SinglePopupService, PopupCloseEvent };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztnREFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a1RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O2lHQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozt1RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O21IQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Z0hBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzswSUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs0SEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzBJQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUlBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NEpBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OEtBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUlBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzRKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7eUpBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7b2RBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3lKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3lKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O3FKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztzSkFZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzhNQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OytIQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzJHQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Nk9BQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzJJQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozt1RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztzSkFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztzSUFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztnREFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0RBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztnREFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a0xBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O21IQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozt1RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztzSEFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztxTUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZHQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs2RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7MEJBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzJGQUdFO0FBQ0Y7QUFDQTs7O2dEQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dVRBaWNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBJQW1HRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZTQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzRLQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzJHQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7MmJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O29wRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO3FFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0RBV0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozt5SkFZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29GQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztzREEwQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7d0tBcUJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzJHQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O1dBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztrVEFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7b0dBa0NFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztpT0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O21NQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O2lHQWVFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzRNQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OzsyRkFvQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBIQStCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OzJIQW1CRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzswR0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OzsySEF1QkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpSkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7d1pBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzttS0FrQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozt3RUFZRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs2QkFVRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NlBBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt1TEFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzhGQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OzttRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2lEQVVFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O3NSQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt5R0FNRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzZFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzJFQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2lLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O3VLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2lLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzhKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2dLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O21LQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2tLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OytKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2lLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O21LQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2dLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O3lLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzZKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O3NLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzhKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2dLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2lLQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OytKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs0S0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3dMQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRIQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBUUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozt5REF1QkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEwQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUpBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMENFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VKQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7NEdBaUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUlBMkJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7aURBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs0RkFpQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs2TEFxRUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzt3TkFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3R0E4Q0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lEQWdCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztnR0FLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OzswQkFNRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MlFBNExFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs2REFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2lJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztpSEFzQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NFFBbUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7eUVBZ0JFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7dUtBaUJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztzSEErQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OytJQThDRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztnTEFrQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OzRJQW9ERTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OzJEQW1CRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O29PQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7d0tBc0NFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQVFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozt3RkFnQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Z0VBMEJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztnREFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7MkNBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7cURBcUJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OzhEQWtCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzswTEFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztlQXVDRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7b0VBYUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzsyR0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyREFrQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O29FQVNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O3FKQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O3dKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O3lKQVlFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzsrRUFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OzsrRUFnTkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O2dTQThERTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzBEQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzBEQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzBEQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzBEQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7MERBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7NktBOENFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7aUZBYUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VLQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7bUdBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3lRQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZRQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7cVFBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztrU0FHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQW1CRTtBQUNGO0FBQ0E7QUFDQTs7Ozs7Ozs7OzswQkFNRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUxBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7d0xBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzswREFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBTUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzsyWUFNRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzBEQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzBCQU1FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IMKpIDIwMjAgUHJvZ3Jlc3MgU29mdHdhcmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qIExpY2Vuc2VkIHVuZGVyIGNvbW1lcmNpYWwgbGljZW5zZS4gU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgRGlyZWN0aXZlLCBPcHRpb25hbCwgSW5qZWN0LCBTa2lwU2VsZiwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBOZ1pvbmUsIENoYW5nZURldGVjdG9yUmVmLCBIb3N0QmluZGluZywgVGVtcGxhdGVSZWYsIFF1ZXJ5TGlzdCwgSW5wdXQsIENvbnRlbnRDaGlsZHJlbiwgQ29udGVudENoaWxkLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEhvc3QsIE91dHB1dCwgaXNEZXZNb2RlLCBTZWN1cml0eUNvbnRleHQsIFZpZXdFbmNhcHN1bGF0aW9uLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgU2VsZiwgVmlld0NvbnRhaW5lclJlZiwgUGlwZSwgTmdNb2R1bGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNEb2N1bWVudEF2YWlsYWJsZSwgS2V5cywgRHJhZ2dhYmxlRGlyZWN0aXZlLCBpc0NoYW5nZWQsIGFueUNoYW5nZWQsIGhhc09ic2VydmVycywgUmVzaXplU2Vuc29yQ29tcG9uZW50LCBEcmFnZ2FibGVNb2R1bGUsIEV2ZW50c01vZHVsZSwgZ3VpZCwgUmVzaXplU2Vuc29yTW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IG1lcmdlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBmcm9tLCBpbnRlcnZhbCwgZnJvbUV2ZW50LCB6aXAsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSwgTDEwTl9QUkVGSVgsIENvbXBvbmVudE1lc3NhZ2VzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2UsIGZpbHRlciwgdGFrZVVudGlsLCBtYXAsIHN3aXRjaE1hcFRvLCBkZWxheSwgYXVkaXRUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFwLCB0aHJvdHRsZVRpbWUsIGRlYm91bmNlVGltZSwgYnVmZmVyQ291bnQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgb3JkZXJCeSwgcHJvY2VzcywgaXNDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yLCBmaWx0ZXJCeSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IFBvcHVwU2VydmljZSwgUG9wdXBNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1wb3B1cCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGdldHRlciB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1jb21tb24nO1xuaW1wb3J0IHsgRHJvcERvd25MaXN0TW9kdWxlLCBBdXRvQ29tcGxldGVNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0IHsgSW5wdXRzTW9kdWxlLCBOdW1lcmljVGV4dEJveENvbXBvbmVudCwgTnVtZXJpY1RleHRCb3hNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1pbnB1dHMnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xuaW1wb3J0IHsgSW50bFNlcnZpY2UgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1pbnRsJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItYnV0dG9ucyc7XG5pbXBvcnQgeyBQREZNYXJnaW5Db21wb25lbnQsIFBERlRlbXBsYXRlRGlyZWN0aXZlLCBQREZFeHBvcnRDb21wb25lbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1wZGYtZXhwb3J0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1maWxlLXNhdmVyJztcbmltcG9ydCB7IHdvcmtib29rT3B0aW9ucywgdG9EYXRhVVJMLCBDb2x1bW5CYXNlLCBFeGNlbEV4cG9ydE1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWV4Y2VsLWV4cG9ydCc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEb21FdmVudHNTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jZWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2VsbE1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jZWxsTW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5rZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmZvY3VzSW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZm9jdXNPdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMud2luZG93Qmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG59XG5Eb21FdmVudHNTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG5jb25zdCBFTVBUWV9SRUdFWCA9IC9eXFxzKiQvO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzUHJlc2VudCA9ICh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0JsYW5rID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzQXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzVHJ1dGh5ID0gKHZhbHVlKSA9PiAhIXZhbHVlO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzTnVsbE9yRW1wdHlTdHJpbmcgPSAodmFsdWUpID0+IGlzQmxhbmsodmFsdWUpIHx8IEVNUFRZX1JFR0VYLnRlc3QodmFsdWUpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IG9ic2VydmUgPSAobGlzdCkgPT4gbWVyZ2Uob2YobGlzdCksIGxpc3QuY2hhbmdlcyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNVbml2ZXJzYWwgPSAoKSA9PiB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBleHRyYWN0Rm9ybWF0ID0gKGZvcm1hdCkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhmb3JtYXQpICYmICFpc051bGxPckVtcHR5U3RyaW5nKGZvcm1hdCkgJiYgZm9ybWF0LnN0YXJ0c1dpdGgoJ3swOicpKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQuc2xpY2UoMywgZm9ybWF0Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0O1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBub3QgPSAoZm4pID0+ICguLi5hcmdzKSA9PiAhZm4uYXBwbHkobnVsbCwgYXJncyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgb3IgPSAoLi4uY29uZGl0aW9ucykgPT4gKHZhbHVlKSA9PiBjb25kaXRpb25zLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgfHwgeCh2YWx1ZSksIGZhbHNlKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBhbmQgPSAoLi4uY29uZGl0aW9ucykgPT4gKHZhbHVlKSA9PiBjb25kaXRpb25zLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgJiYgeCh2YWx1ZSksIHRydWUpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IFNraXAgPSBuZXcgSW5qZWN0aW9uVG9rZW4oXCJTa2lwXCIpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOnZhcmlhYmxlLW5hbWVcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjcmVhdGVQcm9taXNlID0gKCkgPT4ge1xuICAgIGxldCByZXNvbHZlRm4sIHJlamVjdEZuO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc29sdmVGbiA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJlamVjdEZuID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChkYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmVGbjtcbiAgICBwcm9taXNlLnJlamVjdCA9IHJlamVjdEZuO1xuICAgIHJldHVybiBwcm9taXNlO1xufTtcbi8qKiBAaGlkZGVuICovXG5jb25zdCBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKCk7XG4vLyBUT0RPOiBNb3ZlIHRvIGtlbmRvLWNvbW1vblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBTeW1ib2wuaXRlcmF0b3I7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhNYXAucHJvdG90eXBlKTtcbiAgICBjb25zdCBwcm90byA9IE1hcC5wcm90b3R5cGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJiBwcm90b1trZXldID09PSBwcm90by5lbnRyaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgRlJBTUVfRFVSQVRJT04gPSAxMDAwIC8gNjA7XG5jb25zdCB3bmQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHt9O1xuLyoqIEBoaWRkZW4gKi9cbmNvbnN0IHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHduZC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd25kLm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IChjYWxsYmFjayA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBGUkFNRV9EVVJBVElPTikpO1xuLyoqIEBoaWRkZW4gKi9cbmNvbnN0IGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd25kLmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHduZC5tc0NhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBjbGVhclRpbWVvdXQ7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZGV0ZWN0SUUgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIGNvbnN0IG1zaWUgPSB1YS5pbmRleE9mKCdNU0lFICcpO1xuICAgIGNvbnN0IHRyaWRlbnQgPSB1YS5pbmRleE9mKCdUcmlkZW50LycpO1xuICAgIHJldHVybiBtc2llID4gMCB8fCB0cmlkZW50ID4gMDtcbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMb2NhbERhdGFDaGFuZ2VzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG59XG5Mb2NhbERhdGFDaGFuZ2VzU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZvY3VzUm9vdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICByZWdpc3Rlckdyb3VwKGdyb3VwKSB7XG4gICAgICAgIGlmICh0aGlzLmFsaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwcy5hZGQoZ3JvdXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVucmVnaXN0ZXJHcm91cChncm91cCkge1xuICAgICAgICBpZiAodGhpcy5hbGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMuZGVsZXRlKGdyb3VwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmZvckVhY2goZiA9PiBmLmFjdGl2YXRlKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmFsaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKGYgPT4gZi5kZWFjdGl2YXRlKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuRm9jdXNSb290LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG5jb25zdCBmb2N1c2FibGVSZWdleCA9IC9eKD86YXxpbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pO1xuY29uc3QgTk9ERV9OQU1FX1BSRURJQ0FURVMgPSB7fTtcbmNvbnN0IHRvQ2xhc3NMaXN0ID0gKGNsYXNzTmFtZXMpID0+IFN0cmluZyhjbGFzc05hbWVzKS50cmltKCkuc3BsaXQoJyAnKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBoYXNDbGFzc2VzID0gKGVsZW1lbnQsIGNsYXNzTmFtZXMpID0+IHtcbiAgICBjb25zdCBuYW1lc0xpc3QgPSB0b0NsYXNzTGlzdChjbGFzc05hbWVzKTtcbiAgICByZXR1cm4gQm9vbGVhbih0b0NsYXNzTGlzdChlbGVtZW50LmNsYXNzTmFtZSkuZmluZCgoY2xhc3NOYW1lKSA9PiBuYW1lc0xpc3QuaW5kZXhPZihjbGFzc05hbWUpID49IDApKTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgbWF0Y2hlc0NsYXNzZXMgPSAoY2xhc3NOYW1lcykgPT4gKGVsZW1lbnQpID0+IGhhc0NsYXNzZXMoZWxlbWVudCwgY2xhc3NOYW1lcyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgbWF0Y2hlc05vZGVOYW1lID0gKG5vZGVOYW1lKSA9PiB7XG4gICAgaWYgKCFOT0RFX05BTUVfUFJFRElDQVRFU1tub2RlTmFtZV0pIHtcbiAgICAgICAgTk9ERV9OQU1FX1BSRURJQ0FURVNbbm9kZU5hbWVdID0gKGVsZW1lbnQpID0+IFN0cmluZyhlbGVtZW50Lm5vZGVOYW1lKS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gTk9ERV9OQU1FX1BSRURJQ0FURVNbbm9kZU5hbWVdO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjbG9zZXN0ID0gKG5vZGUsIHByZWRpY2F0ZSkgPT4ge1xuICAgIHdoaWxlIChub2RlICYmICFwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNsb3Nlc3RJblNjb3BlID0gKG5vZGUsIHByZWRpY2F0ZSwgc2NvcGUpID0+IHtcbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBzY29wZSAmJiAhcHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIGlmIChub2RlICE9PSBzY29wZSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNvbnRhaW5zID0gKHBhcmVudCwgbm9kZSwgbWF0Y2hTZWxmID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBvdXRzaWRlID0gIWNsb3Nlc3Qobm9kZSwgKGNoaWxkKSA9PiBjaGlsZCA9PT0gcGFyZW50KTtcbiAgICBpZiAob3V0c2lkZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVsID0gY2xvc2VzdChub2RlLCAoY2hpbGQpID0+IGNoaWxkID09PSBub2RlKTtcbiAgICByZXR1cm4gZWwgJiYgKG1hdGNoU2VsZiB8fCBlbCAhPT0gcGFyZW50KTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNWaXNpYmxlID0gKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBoYXNTaXplID0gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwO1xuICAgIGNvbnN0IGhhc1Bvc2l0aW9uID0gcmVjdC54ICE9PSAwICYmIHJlY3QueSAhPT0gMDtcbiAgICAvLyBFbGVtZW50cyBjYW4gaGF2ZSB6ZXJvIHNpemUgZHVlIHRvIHN0eWxpbmcsIGJ1dCB0aGV5IHdpbGwgc3RpbGwgY291bnQgYXMgdmlzaWJsZS5cbiAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHNlbGVjdGlvbiBjaGVja2JveCBoYXMgbm8gc2l6ZSwgYnV0IGlzIG1hZGUgdmlzaWJsZSB0aHJvdWdoIHN0eWxpbmcuXG4gICAgcmV0dXJuIChoYXNTaXplIHx8IGhhc1Bvc2l0aW9uKSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJztcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNGb2N1c2FibGUgPSAoZWxlbWVudCkgPT4ge1xuICAgIGlmICghZWxlbWVudC50YWdOYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGhhc1RhYkluZGV4ID0gQm9vbGVhbihlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiSW5kZXgnKSk7XG4gICAgY29uc3QgZm9jdXNhYmxlID0gIWVsZW1lbnQuZGlzYWJsZWQgJiYgZm9jdXNhYmxlUmVnZXgudGVzdCh0YWdOYW1lKTtcbiAgICByZXR1cm4gZm9jdXNhYmxlIHx8IGhhc1RhYkluZGV4O1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0ZvY3VzYWJsZVdpdGhUYWJLZXkgPSAoZWxlbWVudCwgY2hlY2tWaXNpYmlsaXR5ID0gdHJ1ZSkgPT4ge1xuICAgIGlmICghaXNGb2N1c2FibGUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0YWJJbmRleCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgIGNvbnN0IHZpc2libGUgPSAhY2hlY2tWaXNpYmlsaXR5IHx8IGlzVmlzaWJsZShlbGVtZW50KTtcbiAgICByZXR1cm4gdmlzaWJsZSAmJiB0YWJJbmRleCAhPT0gJy0xJztcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZmluZEVsZW1lbnQgPSAobm9kZSwgcHJlZGljYXRlLCBtYXRjaFNlbGYgPSB0cnVlKSA9PiB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1hdGNoU2VsZiAmJiBwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaW5kRWxlbWVudChub2RlLCBwcmVkaWNhdGUpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGZpbmRGb2N1c2FibGUgPSAoZWxlbWVudCwgY2hlY2tWaXNpYmlsaXR5ID0gdHJ1ZSkgPT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudChlbGVtZW50LCAobm9kZSkgPT4gaXNGb2N1c2FibGVXaXRoVGFiS2V5KG5vZGUsIGNoZWNrVmlzaWJpbGl0eSkpO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBmaW5kRm9jdXNhYmxlQ2hpbGQgPSAoZWxlbWVudCwgY2hlY2tWaXNpYmlsaXR5ID0gdHJ1ZSkgPT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudChlbGVtZW50LCAobm9kZSkgPT4gaXNGb2N1c2FibGVXaXRoVGFiS2V5KG5vZGUsIGNoZWNrVmlzaWJpbGl0eSksIGZhbHNlKTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gcnRsU2Nyb2xsUG9zaXRpb24ocG9zaXRpb24sIGVsZW1lbnQsIGluaXRpYWwpIHtcbiAgICBsZXQgcmVzdWx0ID0gcG9zaXRpb247XG4gICAgaWYgKGluaXRpYWwgPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IC1wb3NpdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5pdGlhbCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gZWxlbWVudC5zY3JvbGxXaWR0aCAtIGVsZW1lbnQub2Zmc2V0V2lkdGggLSBwb3NpdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgaXNCdXR0b24gPSBtYXRjaGVzTm9kZU5hbWUoJ2J1dHRvbicpO1xuY29uc3QgaXNJbnB1dFRhZyA9IG1hdGNoZXNOb2RlTmFtZSgnaW5wdXQnKTtcbmNvbnN0IG5hdmlnYWJsZVJlZ2V4ID0gLyhidXR0b258Y2hlY2tib3h8Y29sb3J8ZmlsZXxyYWRpb3xyZXNldHxzdWJtaXQpL2k7XG5jb25zdCBpc05hdmlnYWJsZUlucHV0ID0gZWxlbWVudCA9PiBpc0lucHV0VGFnKGVsZW1lbnQpICYmIG5hdmlnYWJsZVJlZ2V4LnRlc3QoZWxlbWVudC50eXBlKTtcbmNvbnN0IGlzTmF2aWdhYmxlID0gZWxlbWVudCA9PiAhZWxlbWVudC5kaXNhYmxlZCAmJiAoaXNCdXR0b24oZWxlbWVudCkgfHwgaXNOYXZpZ2FibGVJbnB1dChlbGVtZW50KSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGVmYXVsdEZvY3VzYWJsZUVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKGhvc3QsIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gaG9zdC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmZvY3VzYWJsZSA9IGZpbmRGb2N1c2FibGUodGhpcy5lbGVtZW50LCBmYWxzZSkgfHwgdGhpcy5lbGVtZW50O1xuICAgIH1cbiAgICBnZXQgZW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlICYmICF0aGlzLmZvY3VzYWJsZS5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IHZpc2libGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzYWJsZSAmJiBpc1Zpc2libGUodGhpcy5mb2N1c2FibGUpO1xuICAgIH1cbiAgICBpc05hdmlnYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuRm9jdXMoKSAmJiBpc05hdmlnYWJsZSh0aGlzLmVsZW1lbnQpO1xuICAgIH1cbiAgICB0b2dnbGUoYWN0aXZlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZm9jdXNhYmxlLCAndGFiSW5kZXgnLCBhY3RpdmUgPyAnMCcgOiAnLTEnKTtcbiAgICB9XG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYW5Gb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZSAmJiB0aGlzLmVuYWJsZWQ7XG4gICAgfVxuICAgIGhhc0ZvY3VzKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy5lbGVtZW50ICYmIGNsb3Nlc3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgZSA9PiBlID09PSB0aGlzLmVsZW1lbnQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IENFTExfQ09OVEVYVCA9IG5ldyBJbmplY3Rpb25Ub2tlbignZ3JpZC1jZWxsLWNvbnRleHQnKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBFTVBUWV9DRUxMX0NPTlRFWFQgPSB7fTtcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IGNvbnRyb2xzIHRoZSB3YXkgZm9jdXNhYmxlIGVsZW1lbnRzIHJlY2VpdmVcbiAqIFtmb2N1cyBpbiBhIG5hdmlnYWJsZSBHcmlkXSh7JSBzbHVnIGtleWJvYXJkX25hdmlnYXRpb25fZ3JpZCAlfSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiay10ZXh0Ym94XCIgcGxhY2Vob2xkZXI9XCJUYWIgc3RvcCAjMFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4O1wiIC8+XG4gKiAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImRhdGFcIiBbbmF2aWdhYmxlXT1cInRydWVcIj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3RJRFwiIHRpdGxlPVwiUHJvZHVjdCBJRFwiIHdpZHRoPVwiMTAwXCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIiB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiIHdpZHRoPVwiMTUwXCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxuICogICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCB3aWxsIGJlIGZvY3VzZWQgd2hlbiBwcmVzc2luZyBFbnRlciBvbiB0aGUgY2VsbCAtLT5cbiAqICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJrLXRleHRib3hcIiBrZW5kb0dyaWRGb2N1c2FibGUgW3ZhbHVlXT1cImRhdGFJdGVtLlByb2R1Y3ROYW1lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPlxuICogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiay1idXR0b25cIiBrZW5kb0dyaWRGb2N1c2FibGU+VXBkYXRlPC9idXR0b24+XG4gKiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gd2lkdGg9XCIxMDBcIj5cbiAqICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlPlxuICogICAgICAgICAgICAgICAgICA8IS0tIEEgc2luZ2xlIGZvY3VzYWJsZSBlbGVtZW50IHdpbGwgYmUgZm9jdXNlZCBkdXJpbmcgbmF2aWdhdGlvbiAtLT5cbiAqICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImstYnV0dG9uXCIga2VuZG9HcmlkRm9jdXNhYmxlPkRlbGV0ZTwvYnV0dG9uPlxuICogICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiay10ZXh0Ym94XCIgcGxhY2Vob2xkZXI9XCJUYWIgc3RvcCAjMlwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4O1wiIC8+XG4gKiAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IGFueSA9IFt7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICB9LCB7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICogICAgICAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICogICAgICAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZVxuICogICAgIH1dO1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIEZvY3VzYWJsZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoY2VsbENvbnRleHQsIGhvc3RFbGVtZW50LCByZW5kZXJlcikge1xuICAgICAgICB0aGlzLmNlbGxDb250ZXh0ID0gY2VsbENvbnRleHQ7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNlbGxDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwID0gdGhpcy5jZWxsQ29udGV4dC5mb2N1c0dyb3VwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwLnJlZ2lzdGVyRWxlbWVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBuZXcgRGVmYXVsdEZvY3VzYWJsZUVsZW1lbnQodGhpcy5ob3N0RWxlbWVudCwgdGhpcy5yZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5ncm91cC5pc0FjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKGlzQWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAudW5yZWdpc3RlckVsZW1lbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRvZ2dsZShhY3RpdmUpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCAmJiBhY3RpdmUgIT09IHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50b2dnbGUoYWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY2FuRm9jdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LmNhbkZvY3VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBpc05hdmlnYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuaXNOYXZpZ2FibGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Lmhhc0ZvY3VzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWdpc3RlckVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbn1cbkZvY3VzYWJsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEZvY3VzYWJsZV0nICsgYCxcbiAgICAgICAgW2tlbmRvR3JpZEVkaXRDb21tYW5kXSxcbiAgICAgICAgW2tlbmRvR3JpZFJlbW92ZUNvbW1hbmRdLFxuICAgICAgICBba2VuZG9HcmlkU2F2ZUNvbW1hbmRdLFxuICAgICAgICBba2VuZG9HcmlkQ2FuY2VsQ29tbWFuZF0sXG4gICAgICAgIFtrZW5kb0dyaWRTZWxlY3Rpb25DaGVja2JveF1cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZvY3VzYWJsZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtDRUxMX0NPTlRFWFQsXSB9LCB7IHR5cGU6IFNraXBTZWxmIH1dIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEdyaWRGb2N1c2FibGVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3RvcihuYXZpZ2F0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gbmF2aWdhdGlvblNlcnZpY2U7XG4gICAgfVxuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvY3VzQ2VsbCgpO1xuICAgIH1cbiAgICB0b2dnbGUoYWN0aXZlKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UudG9nZ2xlKGFjdGl2ZSk7XG4gICAgfVxuICAgIGNhbkZvY3VzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmhhc0ZvY3VzKCk7XG4gICAgfVxuICAgIGlzTmF2aWdhYmxlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTmF2aWdhdGlvbkN1cnNvciB7XG4gICAgY29uc3RydWN0b3IobW9kZWwpIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmFjdGl2ZVJvdyA9IDA7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29sID0gMDtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ29sID0gMDtcbiAgICAgICAgdGhpcy52aXJ0dWFsUm93ID0gMDtcbiAgICB9XG4gICAgZ2V0IHJvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZmluZFJvdyh0aGlzLmFjdGl2ZVJvdyk7XG4gICAgfVxuICAgIGdldCBjZWxsKCkge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnJvdztcbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZmluZENlbGwodGhpcy5hY3RpdmVDb2wsIHJvdyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRhdGFSb3dJbmRleCgpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiByb3cuZGF0YVJvd0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzdW1lcyBhbmQgYW5ub3VuY2VzIGEgbmV3IGN1cnNvciBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICByZXNldChyb3dJbmRleCA9IHRoaXMuYWN0aXZlUm93LCBjb2xJbmRleCA9IHRoaXMuYWN0aXZlQ29sLCBmb3JjZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGUocm93SW5kZXgsIGNvbEluZGV4LCBmb3JjZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFJvdyA9IHJvd0luZGV4O1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsQ29sID0gY29sSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWN0aXZhdGUocm93SW5kZXgsIGNvbEluZGV4LCBmb3JjZSkge1xuICAgICAgICBpZiAoIWZvcmNlICYmIHRoaXMuaXNBY3RpdmVSYW5nZShyb3dJbmRleCwgY29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldkNvbEluZGV4ID0gdGhpcy5hY3RpdmVDb2w7XG4gICAgICAgIGNvbnN0IHByZXZSb3dJbmRleCA9IHRoaXMuYWN0aXZlUm93O1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbCA9IGNvbEluZGV4O1xuICAgICAgICB0aGlzLmFjdGl2ZVJvdyA9IHJvd0luZGV4O1xuICAgICAgICB0aGlzLmNoYW5nZXMubmV4dCh7XG4gICAgICAgICAgICBjb2xJbmRleCxcbiAgICAgICAgICAgIHByZXZDb2xJbmRleCxcbiAgICAgICAgICAgIHByZXZSb3dJbmRleCxcbiAgICAgICAgICAgIHJvd0luZGV4XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNBY3RpdmVSYW5nZShyb3dJbmRleCwgY29sSW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlUm93ICE9PSByb3dJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmNlbGw7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5tb2RlbC5jZWxsUmFuZ2UoY2VsbCk7XG4gICAgICAgIHJldHVybiAhQm9vbGVhbihjZWxsKSB8fCAoc3RhcnQgPD0gY29sSW5kZXggJiYgY29sSW5kZXggPD0gZW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzdW1lcyBhIG5ldyBjdXJzb3IgcG9zaXRpb24gd2l0aG91dCBhbm5vdW5jaW5nIGl0LlxuICAgICAqL1xuICAgIGFzc3VtZShyb3dJbmRleCA9IHRoaXMuYWN0aXZlUm93LCBjb2xJbmRleCA9IHRoaXMuYWN0aXZlQ29sKSB7XG4gICAgICAgIHRoaXMudmlydHVhbFJvdyA9IHJvd0luZGV4O1xuICAgICAgICB0aGlzLnZpcnR1YWxDb2wgPSBjb2xJbmRleDtcbiAgICAgICAgdGhpcy5hY3RpdmVDb2wgPSBjb2xJbmRleDtcbiAgICAgICAgdGhpcy5hY3RpdmVSb3cgPSByb3dJbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW5ub3VuY2VzIGEgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gc3Vic2NyaWJlcnMuXG4gICAgICovXG4gICAgYW5ub3VuY2UoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5uZXh0KHtcbiAgICAgICAgICAgIGNvbEluZGV4OiB0aGlzLmFjdGl2ZUNvbCxcbiAgICAgICAgICAgIHByZXZDb2xJbmRleDogdGhpcy5hY3RpdmVDb2wsXG4gICAgICAgICAgICBwcmV2Um93SW5kZXg6IHRoaXMuYWN0aXZlUm93LFxuICAgICAgICAgICAgcm93SW5kZXg6IHRoaXMuYWN0aXZlUm93XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhY3RpdmF0ZVZpcnR1YWxDZWxsKGNlbGwpIHtcbiAgICAgICAgY29uc3Qgcm93UmFuZ2UgPSB0aGlzLm1vZGVsLnJvd1JhbmdlKGNlbGwpO1xuICAgICAgICBjb25zdCBjZWxsUmFuZ2UgPSB0aGlzLm1vZGVsLmNlbGxSYW5nZShjZWxsKTtcbiAgICAgICAgY29uc3QgYWN0aXZlQ29sID0gdGhpcy5hY3RpdmVDb2w7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuYWN0aXZlUm93O1xuICAgICAgICBpZiAocm93UmFuZ2Uuc3RhcnQgPD0gYWN0aXZlUm93ICYmIGFjdGl2ZVJvdyA8PSByb3dSYW5nZS5lbmQgJiZcbiAgICAgICAgICAgIGNlbGxSYW5nZS5zdGFydCA8PSBhY3RpdmVDb2wgJiYgYWN0aXZlQ29sIDw9IGNlbGxSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUm93ID0gY2VsbC5yb3dJbmRleDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29sID0gY2VsbC5jb2xJbmRleDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzQWN0aXZlKHJvd0luZGV4LCBjb2xJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVDb2wgPT09IGNvbEluZGV4ICYmIHRoaXMuYWN0aXZlUm93ID09PSByb3dJbmRleDtcbiAgICB9XG4gICAgbW92ZVVwKG9mZnNldCA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0Um93KC1vZmZzZXQpO1xuICAgIH1cbiAgICBtb3ZlRG93bihvZmZzZXQgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFJvdyhvZmZzZXQpO1xuICAgIH1cbiAgICBtb3ZlTGVmdChvZmZzZXQgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldENvbCgtb2Zmc2V0KTtcbiAgICB9XG4gICAgbW92ZVJpZ2h0KG9mZnNldCA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0Q29sKG9mZnNldCk7XG4gICAgfVxuICAgIGxhc3RDZWxsSW5kZXgocm93KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmNvbHVtbnMubGVhZkNvbHVtbnNUb1JlbmRlci5sZW5ndGggLSAxICtcbiAgICAgICAgICAgICh0aGlzLm1ldGFkYXRhLmhhc0RldGFpbFRlbXBsYXRlICYmICghcm93IHx8ICFyb3cuZ3JvdXBJdGVtKSA/IDEgOiAwKTtcbiAgICB9XG4gICAgb2Zmc2V0Q29sKG9mZnNldCkge1xuICAgICAgICBjb25zdCBwcmV2Um93ID0gdGhpcy5tb2RlbC5maW5kUm93KHRoaXMudmlydHVhbFJvdyk7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMubGFzdENlbGxJbmRleChwcmV2Um93KTtcbiAgICAgICAgY29uc3QgdmlydHVhbENvbCA9IHRoaXMudmlydHVhbENvbDtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmlydHVhbENvbCArIG9mZnNldCwgbGFzdEluZGV4KSk7XG4gICAgICAgIGxldCBuZXh0Q29sSW5kZXggPSB0aGlzLnZpcnR1YWxDb2w7XG4gICAgICAgIGxldCBuZXh0Um93SW5kZXggPSB0aGlzLnZpcnR1YWxSb3c7XG4gICAgICAgIGxldCBjZWxsID0gdGhpcy5tb2RlbC5maW5kQ2VsbCh0aGlzLnZpcnR1YWxDb2wsIHByZXZSb3cpO1xuICAgICAgICBpZiAoIWNlbGwgJiYgdGhpcy5tZXRhZGF0YS52aXJ0dWFsQ29sdW1ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGUobmV4dFJvd0luZGV4LCBuZXh0Q29sSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsLmNvbFNwYW4gPiAxICYmIGNlbGwuY29sSW5kZXggPD0gdmlydHVhbENvbCAmJiB2aXJ0dWFsQ29sIDwgY2VsbC5jb2xJbmRleCArIGNlbGwuY29sU3Bhbikge1xuICAgICAgICAgICAgbmV4dENvbEluZGV4ID0gb2Zmc2V0ID4gMCA/IE1hdGgubWluKGNlbGwuY29sSW5kZXggKyBjZWxsLmNvbFNwYW4sIGxhc3RJbmRleCkgOiBNYXRoLm1heCgwLCBjZWxsLmNvbEluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDZWxsID0gdGhpcy5tb2RlbC5maW5kQ2VsbChuZXh0Q29sSW5kZXgsIHByZXZSb3cpO1xuICAgICAgICAgICAgaWYgKGNlbGwgIT09IG5leHRDZWxsKSB7XG4gICAgICAgICAgICAgICAgY2VsbCA9IG5leHRDZWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbENvbCA9IGNlbGwuY29sSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxDb2wgPSB2aXJ0dWFsQ29sO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlKGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgIH1cbiAgICBvZmZzZXRSb3cob2Zmc2V0KSB7XG4gICAgICAgIGxldCBuZXh0Q29sSW5kZXggPSB0aGlzLnZpcnR1YWxDb2w7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhICYmIHRoaXMubWV0YWRhdGEuaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMubWV0YWRhdGEubWF4TG9naWNhbFJvd0luZGV4O1xuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuYWN0aXZlUm93ICsgb2Zmc2V0LCBtYXhJbmRleCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEuaGFzRGV0YWlsVGVtcGxhdGUgJiYgIXRoaXMubW9kZWwuZmluZFJvdyhuZXh0SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gb2Zmc2V0ID4gMCA/IG5leHRJbmRleCArIDEgOiBuZXh0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5leHRJbmRleCwgbWF4SW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmhhc0RldGFpbFRlbXBsYXRlICYmIG5leHRJbmRleCA9PT0gbWF4SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5sYXN0Um93LmluZGV4ICE9PSBtYXhJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIG5hdmlnYXRlIHBhc3QgdGhlIGxhc3QgY29sbGFwc2VkIHJvdy5cbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dFJvdyA9IHRoaXMubW9kZWwuZmluZFJvdyhuZXh0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKG5leHRSb3cpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRpb25cbiAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IHRoaXMubW9kZWwuZmluZENlbGwodGhpcy52aXJ0dWFsQ29sLCBuZXh0Um93KTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5yb3dJbmRleCA8PSB0aGlzLnZpcnR1YWxSb3cgJiYgb2Zmc2V0ID4gMCAmJiBjZWxsLnJvd1NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwgPSB0aGlzLm1vZGVsLmZpbmRDZWxsKHRoaXMudmlydHVhbENvbCwgdGhpcy5tb2RlbC5maW5kUm93KGNlbGwucm93SW5kZXggKyBjZWxsLnJvd1NwYW4gLSAxICsgb2Zmc2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IGNlbGwucm93SW5kZXg7XG4gICAgICAgICAgICAgICAgbmV4dENvbEluZGV4ID0gY2VsbC5jb2xJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlydHVhbFJvdyA9IG5leHRJbmRleDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlKG5leHRJbmRleCwgbmV4dENvbEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Um93ID0gdGhpcy5tb2RlbC5maW5kUm93KHRoaXMudmlydHVhbFJvdyArIG9mZnNldCkgfHwgdGhpcy5tb2RlbC5uZXh0Um93KHRoaXMudmlydHVhbFJvdywgb2Zmc2V0KTtcbiAgICAgICAgaWYgKCFuZXh0Um93KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNlbGwgPSB0aGlzLm1vZGVsLmZpbmRDZWxsKHRoaXMudmlydHVhbENvbCwgbmV4dFJvdyk7XG4gICAgICAgIGlmIChjZWxsICYmIGNlbGwucm93SW5kZXggPD0gdGhpcy52aXJ0dWFsUm93ICYmIG9mZnNldCA+IDAgJiYgY2VsbC5yb3dTcGFuID4gMSkgeyAvLyBzcGFubmVkIGNlbGwgZ28gdG8gbmV4dFxuICAgICAgICAgICAgY29uc3QgbmV4dFBvcyA9IGNlbGwucm93SW5kZXggKyBjZWxsLnJvd1NwYW4gLSAxICsgb2Zmc2V0O1xuICAgICAgICAgICAgY2VsbCA9IHRoaXMubW9kZWwuZmluZENlbGwodGhpcy52aXJ0dWFsQ29sLCB0aGlzLm1vZGVsLmZpbmRSb3cobmV4dFBvcykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2VsbCAmJiB0aGlzLm1ldGFkYXRhLnZpcnR1YWxDb2x1bW5zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZSh0aGlzLnZpcnR1YWxSb3cgKyBvZmZzZXQsIHRoaXMudmlydHVhbENvbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXJ0dWFsUm93ID0gY2VsbC5yb3dJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGUodGhpcy52aXJ0dWFsUm93LCBjZWxsLmNvbEluZGV4KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBJdGVtTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB7fTtcbiAgICB9XG4gICAgZ2V0IGZpcnN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlbTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5pdGVtcyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1trZXlzW2tleXMubGVuZ3RoIC0gMV1dO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1zW2tleV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLml0ZW1zW2tleV07XG4gICAgICAgICAgICB0aGlzLmNvdW50LS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0SXRlbShrZXksIGl0ZW0pIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuY291bnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zW2tleV0gPSBpdGVtO1xuICAgIH1cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1trZXldO1xuICAgIH1cbiAgICB0b0FycmF5KCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNhbGxiYWNrKHRoaXMuaXRlbXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmQoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSByZW5kZXJlZCByb3dzIGFuZCBjZWxscy5cbiAqL1xuY2xhc3MgTmF2aWdhdGlvbk1vZGVsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gbmV3IEl0ZW1NYXAoKTtcbiAgICB9XG4gICAgZ2V0IGZpcnN0Um93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzLmZpcnN0O1xuICAgIH1cbiAgICBnZXQgbGFzdFJvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93cy5sYXN0O1xuICAgIH1cbiAgICByZWdpc3RlckNlbGwoY2VsbCkge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnJvd3MuZ2V0SXRlbShjZWxsLmxvZ2ljYWxSb3dJbmRleCk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sSW5kZXggPSBjZWxsLmxvZ2ljYWxDb2xJbmRleDtcbiAgICAgICAgY29uc3QgbW9kZWxDZWxsID0ge1xuICAgICAgICAgICAgdWlkOiBjZWxsLnVpZCxcbiAgICAgICAgICAgIGNvbEluZGV4LFxuICAgICAgICAgICAgcm93SW5kZXg6IHJvdy5pbmRleCxcbiAgICAgICAgICAgIGNvbFNwYW46IGNlbGwuY29sU3BhbixcbiAgICAgICAgICAgIHJvd1NwYW46IGNlbGwucm93U3BhbixcbiAgICAgICAgICAgIGRldGFpbEV4cGFuZENlbGw6IGNlbGwuZGV0YWlsRXhwYW5kQ2VsbCxcbiAgICAgICAgICAgIGRhdGFJdGVtOiByb3cuZGF0YUl0ZW0sXG4gICAgICAgICAgICBkYXRhUm93SW5kZXg6IHJvdy5kYXRhUm93SW5kZXgsXG4gICAgICAgICAgICBmb2N1c0dyb3VwOiBjZWxsLmZvY3VzR3JvdXBcbiAgICAgICAgfTtcbiAgICAgICAgcm93LmNlbGxzLnNldEl0ZW0oY29sSW5kZXgsIG1vZGVsQ2VsbCk7XG4gICAgICAgIGlmIChjZWxsLmdyb3VwSXRlbSkge1xuICAgICAgICAgICAgcm93Lmdyb3VwSXRlbSA9IGNlbGwuZ3JvdXBJdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2RlbENlbGw7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJDZWxsKGluZGV4LCByb3dJbmRleCwgY2VsbCkge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnJvd3MuZ2V0SXRlbShyb3dJbmRleCk7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcm93LmNlbGxzLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLnVpZCA9PT0gY2VsbC51aWQpIHtcbiAgICAgICAgICAgICAgICByb3cuY2VsbHMucmVtb3ZlSXRlbShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVnaXN0ZXJSb3cocm93KSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUm93ID0ge1xuICAgICAgICAgICAgdWlkOiByb3cudWlkLFxuICAgICAgICAgICAgaW5kZXg6IHJvdy5sb2dpY2FsUm93SW5kZXgsXG4gICAgICAgICAgICBkYXRhSXRlbTogcm93LmRhdGFJdGVtLFxuICAgICAgICAgICAgZGF0YVJvd0luZGV4OiByb3cuZGF0YVJvd0luZGV4LFxuICAgICAgICAgICAgY2VsbHM6IG5ldyBJdGVtTWFwKClcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3dzLnNldEl0ZW0ocm93LmxvZ2ljYWxSb3dJbmRleCwgbW9kZWxSb3cpO1xuICAgIH1cbiAgICB1cGRhdGVSb3cocm93KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd3MuZ2V0SXRlbShyb3cubG9naWNhbFJvd0luZGV4KTtcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3VycmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGFJdGVtOiByb3cuZGF0YUl0ZW0sXG4gICAgICAgICAgICAgICAgZGF0YVJvd0luZGV4OiByb3cuZGF0YVJvd0luZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnJlZ2lzdGVyUm93KGluZGV4LCByb3cpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnJvd3MuZ2V0SXRlbShpbmRleCk7XG4gICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC51aWQgPT09IHJvdy51aWQpIHtcbiAgICAgICAgICAgIHRoaXMucm93cy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjZWxsUmFuZ2UoY2VsbCkge1xuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBjZWxsLmNvbEluZGV4O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gY2VsbC5jb2xJbmRleCArIChjZWxsLmNvbFNwYW4gfHwgMSkgLSAxO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByb3dSYW5nZShjZWxsKSB7XG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGNlbGwucm93SW5kZXg7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBjZWxsLnJvd0luZGV4ICsgKGNlbGwucm93U3BhbiB8fCAxKSAtIDE7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIG5leHRSb3cocm93SW5kZXgsIG9mZnNldCkge1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5yb3dzLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzLmdldEl0ZW0ocm93SW5kZXgpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJvd3MuaW5kZXhPZihyb3cpO1xuICAgICAgICBjb25zdCBuZXh0ID0gcm93c1twb3NpdGlvbiArIG9mZnNldF07XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cbiAgICBmaW5kUm93KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3MuZ2V0SXRlbShpbmRleCk7XG4gICAgfVxuICAgIGZpbmRDZWxsKGluZGV4LCByb3cpIHtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IHJvdy5pbmRleDtcbiAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHMuZ2V0SXRlbShpbmRleCk7XG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSByb3dJbmRleDtcbiAgICAgICAgd2hpbGUgKCFjZWxsICYmIHJvdykge1xuICAgICAgICAgICAgcm93ID0gdGhpcy5yb3dzLmdldEl0ZW0oY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGNlbGwgPSB0aGlzLnJvd0NlbGwoaW5kZXgsIHJvdyk7XG4gICAgICAgICAgICBjdXJyZW50SW5kZXgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbCAmJiByb3dJbmRleCA8PSByb3cuaW5kZXggKyAoY2VsbC5yb3dTcGFuIHx8IDEpIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcm93Q2VsbChpbmRleCwgcm93KSB7XG4gICAgICAgIGlmICghcm93IHx8ICFyb3cuY2VsbHMuY291bnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdENlbGwgPSByb3cuY2VsbHMuZmlyc3Q7XG4gICAgICAgIGxldCBjZWxsLCBjdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgd2hpbGUgKCFjZWxsICYmIGN1cnJlbnRJbmRleCA+PSBmaXJzdENlbGwuY29sSW5kZXgpIHtcbiAgICAgICAgICAgIGNlbGwgPSByb3cuY2VsbHMuZ2V0SXRlbShjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgY3VycmVudEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNlbGwgJiYgaW5kZXggPD0gY2VsbC5jb2xJbmRleCArIChjZWxsLmNvbFNwYW4gfHwgMSkgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gY2VsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFByZXZlbnRhYmxlRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByZXZlbnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGEgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEluIHRoaXMgd2F5LCB0aGUgc291cmNlIGNvbXBvbmVudCBzdXBwcmVzc2VzXG4gICAgICogdGhlIGJ1aWx0LWluIGJlaGF2aW9yIHRoYXQgZm9sbG93cyB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMucHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50IHdhcyBwcmV2ZW50ZWRcbiAgICAgKiBieSBhbnkgb2YgaXRzIHN1YnNjcmliZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZWZhdWx0IGFjdGlvbiB3YXMgcHJldmVudGVkLlxuICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqL1xuICAgIGlzRGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudGVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIHRoZSBgY2VsbENsb3NlYCBldmVudC5cbiAqL1xuY2xhc3MgQ2VsbENsb3NlRXZlbnQgZXh0ZW5kcyBQcmV2ZW50YWJsZUV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGlvbiA9ICdjZWxsQ2xvc2UnO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzRXF1YWwgPSAoaW5kZXgpID0+IChpdGVtKSA9PiBpdGVtLmluZGV4ID09PSBpbmRleDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc05vdEVxdWFsID0gKGluZGV4KSA9PiAoaXRlbSkgPT4gaXRlbS5pbmRleCAhPT0gaW5kZXg7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNOZXdSb3cgPSAoaW5kZXgpID0+IGluZGV4ID09PSAtMSB8fCBpbmRleCA9PT0gdW5kZWZpbmVkO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEVkaXRTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihuZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5lZGl0ZWRJbmRpY2VzID0gW107XG4gICAgICAgIHRoaXMua2VlcEVkaXRDZWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xvc2luZ0NlbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkU291cmNlID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdGhpcy5jaGFuZ2VkU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMubmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSkpKTtcbiAgICB9XG4gICAgZWRpdFJvdyhpbmRleCwgZ3JvdXAgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lZGl0ZWRJbmRpY2VzLnB1c2goeyBpbmRleCwgZ3JvdXAgfSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VkKCk7XG4gICAgfVxuICAgIGFkZFJvdyhncm91cCkge1xuICAgICAgICB0aGlzLm5ld0l0ZW1Hcm91cCA9IHsgZ3JvdXAgfTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZWQoKTtcbiAgICB9XG4gICAgZWRpdENlbGwocm93SW5kZXgsIGNvbHVtbiwgZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzTmV3Um93KHJvd0luZGV4KSB8fCBjb2x1bW4uZWRpdGFibGUgPT09IGZhbHNlIHx8ICEoY29sdW1uLmVkaXRUZW1wbGF0ZSB8fCBjb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2ZW50Q2VsbENsb3NlKCk7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZUNlbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Um93KHJvd0luZGV4LCBncm91cCk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNFZGl0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0ZWRJbmRpY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGlzRWRpdGluZ0NlbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRWRpdGluZygpICYmIHRoaXMuY29sdW1uICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBoYXNOZXdJdGVtKCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMubmV3SXRlbUdyb3VwKTtcbiAgICB9XG4gICAgZ2V0IG5ld0RhdGFJdGVtKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNOZXdJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdJdGVtR3JvdXAuZ3JvdXAudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjbG9zZShpbmRleCkge1xuICAgICAgICBpZiAoaXNOZXdSb3coaW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLm5ld0l0ZW1Hcm91cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRlZEluZGljZXMgPSB0aGlzLmVkaXRlZEluZGljZXMuZmlsdGVyKGlzTm90RXF1YWwoaW5kZXgpKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuY29sdW1uO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBjbG9zZUNlbGwob3JpZ2luYWxFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4gJiYgIXRoaXMuY2xvc2luZ0NlbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGdyb3VwIH0gPSB0aGlzLmVkaXRlZEluZGljZXNbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IG5ldyBDZWxsQ2xvc2VFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogZ3JvdXAsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2luZ0NlbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2luZ0NlbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIWFyZ3MuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxDZWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdzLmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2FuY2VsQ2VsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRlZEluZGljZXMgPSBbXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkQ2xvc2VDZWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4gJiYgIXRoaXMua2VlcEVkaXRDZWxsO1xuICAgIH1cbiAgICBwcmV2ZW50Q2VsbENsb3NlKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2VlcENlbGxUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMua2VlcEVkaXRDZWxsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMua2VlcENlbGxUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMua2VlcEVkaXRDZWxsID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAwKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTphbGlnblxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29udGV4dChpbmRleCkge1xuICAgICAgICBpZiAoaXNOZXdSb3coaW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdJdGVtR3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEJ5SW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICBjb2x1bW5Db250ZXh0KGluZGV4LCBjb2x1bW4pIHtcbiAgICAgICAgaWYgKGlzTmV3Um93KGluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3SXRlbUdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW4gfHwgY29sdW1uID09PSB0aGlzLmNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzRWRpdGVkKGluZGV4KSB7XG4gICAgICAgIGlmIChpc05ld1JvdyhpbmRleCkgJiYgaXNQcmVzZW50KHRoaXMubmV3SXRlbUdyb3VwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbHVtbiAmJiBpc1ByZXNlbnQodGhpcy5maW5kQnlJbmRleChpbmRleCkpO1xuICAgIH1cbiAgICBoYXNFZGl0ZWQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRleHQoaW5kZXgpKTtcbiAgICB9XG4gICAgaXNFZGl0ZWRDb2x1bW4oaW5kZXgsIGNvbHVtbikge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmZpbmRCeUluZGV4KGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBiZWdpbkVkaXQocm93SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoeyBhY3Rpb246ICdlZGl0Jywgcm93SW5kZXggfSk7XG4gICAgfVxuICAgIGJlZ2luQWRkKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7IGFjdGlvbjogJ2FkZCcgfSk7XG4gICAgfVxuICAgIGVuZEVkaXQocm93SW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBncm91cDogZm9ybUdyb3VwIH0gPSB0aGlzLmNvbnRleHQocm93SW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7IGFjdGlvbjogJ2NhbmNlbCcsIHJvd0luZGV4LCBmb3JtR3JvdXAsIGlzTmV3OiBpc05ld1Jvdyhyb3dJbmRleCkgfSk7XG4gICAgfVxuICAgIHNhdmUocm93SW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBncm91cDogZm9ybUdyb3VwIH0gPSB0aGlzLmNvbnRleHQocm93SW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7IGFjdGlvbjogJ3NhdmUnLCByb3dJbmRleCwgZm9ybUdyb3VwLCBpc05ldzogaXNOZXdSb3cocm93SW5kZXgpIH0pO1xuICAgIH1cbiAgICByZW1vdmUocm93SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoeyBhY3Rpb246ICdyZW1vdmUnLCByb3dJbmRleCB9KTtcbiAgICB9XG4gICAgZmluZEJ5SW5kZXgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGVkSW5kaWNlcy5maW5kKGlzRXF1YWwoaW5kZXgpKTtcbiAgICB9XG4gICAgb25DaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRTb3VyY2UubmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5FZGl0U2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRWRpdFNlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEV4cGFuZFN0YXRlU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoaXNJbml0aWFsbHlDb2xsYXBzZWQpIHtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxseUNvbGxhcHNlZCA9IGlzSW5pdGlhbGx5Q29sbGFwc2VkO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLnJvd1N0YXRlID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICB0b2dnbGVSb3coaW5kZXgsIGRhdGFJdGVtKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5yb3dTdGF0ZS5oYXMoaW5kZXgpO1xuICAgICAgICBjb25zdCBleHBhbmQgPSAhdGhpcy5pc0luaXRpYWxseUNvbGxhcHNlZCA/IGZvdW5kIDogIWZvdW5kO1xuICAgICAgICBjb25zdCBwcmV2ZW50ZWQgPSB0aGlzLmVtaXRFdmVudCh7IGRhdGFJdGVtLCBleHBhbmQsIGluZGV4IH0pO1xuICAgICAgICBpZiAocHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1N0YXRlLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd1N0YXRlLmFkZChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNFeHBhbmRlZChpbmRleCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMucm93U3RhdGUuaGFzKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbml0aWFsbHlDb2xsYXBzZWQgPyBmb3VuZCA6ICFmb3VuZDtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucm93U3RhdGUuY2xlYXIoKTtcbiAgICB9XG4gICAgZW1pdEV2ZW50KGFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLm5leHQoYXJncyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmNvbnN0IHJlbW92ZUxhc3QgPSBncm91cEluZGV4ID0+IGdyb3VwSW5kZXgubGFzdEluZGV4T2YoXCJfXCIpID4gLTFcbiAgICA/IGdyb3VwSW5kZXguc2xpY2UoMCwgZ3JvdXBJbmRleC5sYXN0SW5kZXhPZihcIl9cIikpXG4gICAgOiBcIlwiO1xuY29uc3QgaXNDaGlsZEluZGV4ID0gKHRhcmdldEluZGV4LCBwYXJlbnRJbmRleCkgPT4gcGFyZW50SW5kZXggIT09IHRhcmdldEluZGV4ICYmIHRhcmdldEluZGV4LnN0YXJ0c1dpdGgocGFyZW50SW5kZXgpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEdyb3Vwc1NlcnZpY2UgZXh0ZW5kcyBFeHBhbmRTdGF0ZVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGlzQ29sbGFwc2VkID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoaXNDb2xsYXBzZWQpO1xuICAgIH1cbiAgICBpc0luRXhwYW5kZWRHcm91cChncm91cEluZGV4LCBza2lwU2VsZiA9IHRydWUpIHtcbiAgICAgICAgaWYgKHNraXBTZWxmKSB7XG4gICAgICAgICAgICBncm91cEluZGV4ID0gcmVtb3ZlTGFzdChncm91cEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoZ3JvdXBJbmRleCAmJiBleHBhbmRlZCkge1xuICAgICAgICAgICAgZXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQoZ3JvdXBJbmRleCk7XG4gICAgICAgICAgICBncm91cEluZGV4ID0gcmVtb3ZlTGFzdChncm91cEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwYW5kZWQ7XG4gICAgfVxuICAgIGV4cGFuZENoaWxkcmVuKHBhcmVudEluZGV4KSB7XG4gICAgICAgIHRoaXMucm93U3RhdGUuZm9yRWFjaChpbmRleCA9PiBpc0NoaWxkSW5kZXgoaW5kZXgsIHBhcmVudEluZGV4KSAmJiB0aGlzLnJvd1N0YXRlLmRlbGV0ZShpbmRleCkpO1xuICAgIH1cbn1cbkdyb3Vwc1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkdyb3Vwc1NlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBCb29sZWFuLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW1NraXAsXSB9XSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUGFnZXJDb250ZXh0U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIGdldCBjdXJyZW50UGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCAvIHRoaXMucGFnZVNpemU7XG4gICAgfVxuICAgIG5vdGlmeUNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICB0aGlzLnRvdGFsID0gY2hhbmdlcy50b3RhbDtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGNoYW5nZXMucGFnZVNpemU7XG4gICAgICAgIHRoaXMuc2tpcCA9IGNoYW5nZXMuc2tpcDtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLm5leHQoY2hhbmdlcyk7XG4gICAgfVxuICAgIGNoYW5nZVBhZ2UocGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UubmV4dCh7IHNraXA6IHBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0YWtlOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgIH1cbiAgICBjaGFuZ2VQYWdlU2l6ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UubmV4dCh7IHNraXA6IDAsIHRha2U6IHZhbHVlIH0pO1xuICAgIH1cbiAgICBuZXh0UGFnZSgpIHtcbiAgICAgICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgMTtcbiAgICAgICAgaWYgKG5leHRQYWdlICogdGhpcy5wYWdlU2l6ZSA8IHRoaXMudG90YWwpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUGFnZShuZXh0UGFnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJldlBhZ2UoKSB7XG4gICAgICAgIGNvbnN0IHByZXZQYWdlID0gdGhpcy5jdXJyZW50UGFnZSAtIDE7XG4gICAgICAgIGlmIChwcmV2UGFnZSAqIHRoaXMucGFnZVNpemUgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VQYWdlKHByZXZQYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIHRoZSBgZGV0YWlsQ29sbGFwc2VgIGV2ZW50LlxuICovXG5jbGFzcyBEZXRhaWxDb2xsYXBzZUV2ZW50IGV4dGVuZHMgUHJldmVudGFibGVFdmVudCB7XG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGFyZ3MpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIHRoZSBgZGV0YWlsRXhwYW5kYCBldmVudC5cbiAqL1xuY2xhc3MgRGV0YWlsRXhwYW5kRXZlbnQgZXh0ZW5kcyBQcmV2ZW50YWJsZUV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgYXJncyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRGV0YWlsc1NlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLnJvd1N0YXRlID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5yb3dTdGF0ZS5jbGVhcigpO1xuICAgIH1cbiAgICBpc0V4cGFuZGVkKGluZGV4LCBkYXRhSXRlbSkge1xuICAgICAgICBpZiAodGhpcy51c2VyQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJDYWxsYmFjayh7IGluZGV4LCBkYXRhSXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dTdGF0ZS5oYXMoaW5kZXgpO1xuICAgIH1cbiAgICB0b2dnbGVSb3coaW5kZXgsIGRhdGFJdGVtKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRXhwYW5kZWQoaW5kZXgsIGRhdGFJdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZVJvdyhpbmRleCwgZGF0YUl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRSb3coaW5kZXgsIGRhdGFJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBleHBhbmRSb3coaW5kZXgsIGRhdGFJdGVtKSB7XG4gICAgICAgIGNvbnN0IHByZXZlbnRlZCA9IHRoaXMuZW1pdEV2ZW50KHsgZGF0YUl0ZW0sIGluZGV4LCBleHBhbmQ6IHRydWUgfSk7XG4gICAgICAgIGlmICghcHJldmVudGVkICYmICF0aGlzLnVzZXJDYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5yb3dTdGF0ZS5hZGQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbGxhcHNlUm93KGluZGV4LCBkYXRhSXRlbSkge1xuICAgICAgICBjb25zdCBwcmV2ZW50ZWQgPSB0aGlzLmVtaXRFdmVudCh7IGRhdGFJdGVtLCBpbmRleCwgZXhwYW5kOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKCFwcmV2ZW50ZWQgJiYgIXRoaXMudXNlckNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1N0YXRlLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEV2ZW50KGFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnRBcmcgPSBuZXcgKGFyZ3MuZXhwYW5kID8gRGV0YWlsRXhwYW5kRXZlbnQgOiBEZXRhaWxDb2xsYXBzZUV2ZW50KShhcmdzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLm5leHQoZXZlbnRBcmcpO1xuICAgICAgICByZXR1cm4gZXZlbnRBcmcuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgfVxufVxuRGV0YWlsc1NlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTY3JvbGxSZXF1ZXN0U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMgPSBuZXcgU3ViamVjdCgpO1xuICAgIH1cbiAgICBzY3JvbGxUbyhyZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMubmV4dChyZXF1ZXN0KTtcbiAgICB9XG59XG5TY3JvbGxSZXF1ZXN0U2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuY29uc3QgaXNJblNhbWVHcmlkID0gKGVsZW1lbnQsIGdyaWRFbGVtZW50KSA9PiBjbG9zZXN0KGVsZW1lbnQsIG1hdGNoZXNOb2RlTmFtZSgna2VuZG8tZ3JpZCcpKSA9PT0gZ3JpZEVsZW1lbnQ7XG5jb25zdCBtYXRjaEhlYWRlckNlbGwgPSBtYXRjaGVzTm9kZU5hbWUoJ3RoJyk7XG5jb25zdCBtYXRjaERhdGFDZWxsID0gbWF0Y2hlc05vZGVOYW1lKCd0ZCcpO1xuY29uc3QgbWF0Y2hGb290ZXJDZWxsID0gbWF0Y2hlc05vZGVOYW1lKCcuay1ncmlkLWZvb3RlciB0ZCcpO1xuY29uc3QgbWF0Y2hDZWxsID0gKGVsZW1lbnQpID0+IG1hdGNoRGF0YUNlbGwoZWxlbWVudCkgfHwgbWF0Y2hIZWFkZXJDZWxsKGVsZW1lbnQpIHx8IG1hdGNoRm9vdGVyQ2VsbChlbGVtZW50KTtcbmNvbnN0IGdyaWRDZWxsID0gKGVsZW1lbnQsIGdyaWRFbGVtZW50KSA9PiB7XG4gICAgbGV0IHRhcmdldCA9IGNsb3Nlc3QoZWxlbWVudCwgbWF0Y2hDZWxsKTtcbiAgICB3aGlsZSAodGFyZ2V0ICYmICFpc0luU2FtZUdyaWQodGFyZ2V0LCBncmlkRWxlbWVudCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQucGFyZW50RWxlbWVudCwgbWF0Y2hDZWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5jb25zdCB0YXJnZXRDZWxsID0gKHRhcmdldCwgZ3JpZEVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBjZWxsID0gZ3JpZENlbGwodGFyZ2V0LCBncmlkRWxlbWVudCk7XG4gICAgY29uc3Qgcm93ID0gY2xvc2VzdChjZWxsLCBtYXRjaGVzTm9kZU5hbWUoJ3RyJykpO1xuICAgIGlmIChjZWxsICYmIHJvdykge1xuICAgICAgICBsZXQgcm93SW5kZXggPSByb3cuZ2V0QXR0cmlidXRlKCdhcmlhLXJvd2luZGV4Jyk7XG4gICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggPyBwYXJzZUludChyb3dJbmRleCwgMTApIC0gMSA6IG51bGw7XG4gICAgICAgIGxldCBjb2xJbmRleCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdhcmlhLWNvbGluZGV4Jyk7XG4gICAgICAgIGNvbEluZGV4ID0gY29sSW5kZXggPyBwYXJzZUludChjb2xJbmRleCwgMTApIC0gMSA6IG51bGw7XG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gbnVsbCAmJiBjb2xJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50OiBjZWxsIH07XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT4ga2V5Q29kZSA9PT0gS2V5cy5BcnJvd0xlZnQgfHwga2V5Q29kZSA9PT0gS2V5cy5BcnJvd1JpZ2h0IHx8XG4gICAga2V5Q29kZSA9PT0gS2V5cy5BcnJvd1VwIHx8IGtleUNvZGUgPT09IEtleXMuQXJyb3dEb3duO1xuY29uc3QgaXNOYXZpZ2F0aW9uS2V5ID0ga2V5Q29kZSA9PiBpc0Fycm93S2V5KGtleUNvZGUpIHx8XG4gICAga2V5Q29kZSA9PT0gS2V5cy5QYWdlVXAgfHwga2V5Q29kZSA9PT0gS2V5cy5QYWdlRG93biB8fFxuICAgIGtleUNvZGUgPT09IEtleXMuSG9tZSB8fCBrZXlDb2RlID09PSBLZXlzLkVuZDtcbmNvbnN0IGlzSW5wdXQgPSBtYXRjaGVzTm9kZU5hbWUoJ2lucHV0Jyk7XG5jb25zdCBpc1RleHRJbnB1dCA9IGVsZW1lbnQgPT4gZWxlbWVudCAmJiBpc0lucHV0KGVsZW1lbnQpICYmIGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpID09PSAndGV4dCc7XG5jb25zdCBpc1ByaW50YWJsZUNoYXJhY3RlciA9IChzdHIpID0+IHN0ci5sZW5ndGggPT09IDEgJiYgc3RyLm1hdGNoKC9cXFMvKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBOYXZpZ2F0aW9uVmlld3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKGZpcnN0SXRlbUluZGV4LCBsYXN0SXRlbUluZGV4KSB7XG4gICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSBmaXJzdEl0ZW1JbmRleDtcbiAgICAgICAgdGhpcy5sYXN0SXRlbUluZGV4ID0gbGFzdEl0ZW1JbmRleDtcbiAgICB9XG4gICAgY29udGFpbnNSb3coZGF0YVJvd0luZGV4KSB7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IGRhdGFSb3dJbmRleCA8IDA7XG4gICAgICAgIHJldHVybiBoZWFkZXJSb3cgfHwgKGRhdGFSb3dJbmRleCA+PSB0aGlzLmZpcnN0SXRlbUluZGV4ICYmIGRhdGFSb3dJbmRleCA8PSB0aGlzLmxhc3RJdGVtSW5kZXgpO1xuICAgIH1cbiAgICBpbnRlcnNlY3RzKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIChzdGFydCA8PSB0aGlzLmZpcnN0SXRlbUluZGV4ICYmIHRoaXMubGFzdEl0ZW1JbmRleCA8PSBlbmQpIHx8XG4gICAgICAgICAgICAodGhpcy5maXJzdEl0ZW1JbmRleCA8PSBzdGFydCAmJiBzdGFydCA8PSB0aGlzLmxhc3RJdGVtSW5kZXgpIHx8XG4gICAgICAgICAgICAodGhpcy5maXJzdEl0ZW1JbmRleCA8PSBlbmQgJiYgZW5kIDw9IHRoaXMubGFzdEl0ZW1JbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih6b25lLCBkb21FdmVudHMsIHBhZ2VyQ29udGV4dFNlcnZpY2UsIHNjcm9sbFJlcXVlc3RTZXJ2aWNlLCBncm91cHNTZXJ2aWNlLCBkZXRhaWxzU2VydmljZSwgZm9jdXNSb290LCBlZGl0U2VydmljZSwgY2QsIGxvY2FsaXphdGlvbiwgZm9jdXNhYmxlUGFyZW50KSB7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzID0gZG9tRXZlbnRzO1xuICAgICAgICB0aGlzLnBhZ2VyQ29udGV4dFNlcnZpY2UgPSBwYWdlckNvbnRleHRTZXJ2aWNlO1xuICAgICAgICB0aGlzLnNjcm9sbFJlcXVlc3RTZXJ2aWNlID0gc2Nyb2xsUmVxdWVzdFNlcnZpY2U7XG4gICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZSA9IGdyb3Vwc1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZGV0YWlsc1NlcnZpY2UgPSBkZXRhaWxzU2VydmljZTtcbiAgICAgICAgdGhpcy5mb2N1c1Jvb3QgPSBmb2N1c1Jvb3Q7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UgPSBlZGl0U2VydmljZTtcbiAgICAgICAgdGhpcy5jZCA9IGNkO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5mb2N1c2FibGVQYXJlbnQgPSBmb2N1c2FibGVQYXJlbnQ7XG4gICAgICAgIHRoaXMuY2VsbEtleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlUm93SW5kZXggPSAwO1xuICAgICAgICB0aGlzLmFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tb2RlID0gMCAvKiBTdGFuZGJ5ICovO1xuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IE5hdmlnYXRpb25Nb2RlbCgpO1xuICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyBOYXZpZ2F0aW9uQ3Vyc29yKHRoaXMubW9kZWwpO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSB0aGlzLmN1cnNvci5jaGFuZ2VzO1xuICAgIH1cbiAgICBzZXQgbWV0YWRhdGEodmFsdWUpIHtcbiAgICAgICAgdGhpcy5tZXRhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3Vyc29yLm1ldGFkYXRhID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgICB9XG4gICAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFsaXZlO1xuICAgIH1cbiAgICBnZXQgYWN0aXZlQ2VsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSAhPT0gMCAvKiBTdGFuZGJ5ICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJzb3IuY2VsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYWN0aXZlUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlICE9PSAwIC8qIFN0YW5kYnkgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmN1cnNvci5yb3csIHtcbiAgICAgICAgICAgICAgICBjZWxsczogdGhpcy5jdXJzb3Iucm93LmNlbGxzLnRvQXJyYXkoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFjdGl2ZURhdGFSb3coKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmFjdGl2ZVJvd0luZGV4IC0gdGhpcy5tZXRhLmhlYWRlclJvd3MpO1xuICAgIH1cbiAgICBpbml0KG1ldGEpIHtcbiAgICAgICAgdGhpcy5hbGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9jdXNSb290LmFsaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IG9uU3RhYmxlU3Vic2NyaWJlciA9ICguLi5vcGVyYXRvcnMpID0+IChhcmdzKSA9PiB0aGlzLnpvbmUuaXNTdGFibGUgP1xuICAgICAgICAgICAgZnJvbShbdHJ1ZV0pLnBpcGUobWFwKCgpID0+IGFyZ3MpKSA6XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZSh0YWtlKDEpLCBtYXAoKCkgPT4gYXJncyksIC4uLm9wZXJhdG9ycyk7XG4gICAgICAgIGNvbnN0IG9uU3RhYmxlID0gb25TdGFibGVTdWJzY3JpYmVyKCk7XG4gICAgICAgIHRoaXMuc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLmN1cnNvci5jaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5vbkN1cnNvckNoYW5nZXMoYXJncykpKTtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLmRvbUV2ZW50cy5mb2N1cy5waXBlKHN3aXRjaE1hcChvblN0YWJsZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChhcmdzKSA9PiB0aGlzLm5hdmlnYXRlVG8oYXJncy50YXJnZXQpKSk7XG4gICAgICAgIHRoaXMuc3Vicy5hZGQodGhpcy5kb21FdmVudHMuZm9jdXNPdXQucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5tb2RlICE9PSAwIC8qIFN0YW5kYnkgKi8pLCBzd2l0Y2hNYXAob25TdGFibGVTdWJzY3JpYmVyKHRha2VVbnRpbCh0aGlzLmRvbUV2ZW50cy5mb2N1cykpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLm9uRm9jdXNPdXQoYXJncykpKTtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLmRvbUV2ZW50cy53aW5kb3dCbHVyLnBpcGUoZmlsdGVyKCgpID0+IHRoaXMubW9kZSAhPT0gMCAvKiBTdGFuZGJ5ICovKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbldpbmRvd0JsdXIoKSkpO1xuICAgICAgICB0aGlzLnN1YnMuYWRkKFxuICAgICAgICAvLyBDbG9zaW5nIHRoZSBlZGl0b3Igd2lsbCBub3QgYWx3YXlzIHRyaWdnZXIgZm9jdXNvdXQgaW4gRmlyZWZveC5cbiAgICAgICAgLy8gVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBlbnN1cmUgdGhhdCB0aGUgY2VsbCBpcyBjbG9zZWQgYWZ0ZXIgZWRpdGluZy5cbiAgICAgICAgdGhpcy5lZGl0U2VydmljZS5jaGFuZ2VzLnBpcGUoZmlsdGVyKGUgPT4gZS5hY3Rpb24gIT09ICdlZGl0JyAmJiB0aGlzLm1vZGUgPT09IDIgLyogQ29udGVudCAqLyksIGZpbHRlcigoZSkgPT4gZS5hY3Rpb24gPT09ICdjZWxsQ2xvc2UnICYmICFlLnByZXZlbnRlZCksIHN3aXRjaE1hcChvblN0YWJsZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubGVhdmVDZWxsKCkpKTtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLnBhZ2VyQ29udGV4dFNlcnZpY2UucGFnZUNoYW5nZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmN1cnNvci5yZXNldCgwLCAwKSkpO1xuICAgICAgICB0aGlzLnN1YnMuYWRkKHRoaXMuZG9tRXZlbnRzLmtleWRvd25cbiAgICAgICAgICAgIC5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLm9uS2V5ZG93bihhcmdzKSkpO1xuICAgICAgICB0aGlzLnN1YnMuYWRkKHRoaXMuZG9tRXZlbnRzLmtleWRvd24ucGlwZShmaWx0ZXIoYXJncyA9PiBhcmdzLmtleUNvZGUgPT09IEtleXMuVGFiICYmIHRoaXMubW9kZSA9PT0gMiAvKiBDb250ZW50ICovKSwgc3dpdGNoTWFwVG8odGhpcy5kb21FdmVudHMuZm9jdXNPdXQucGlwZSh0YWtlVW50aWwoXG4gICAgICAgIC8vIFRpbWVvdXQgaWYgZm9jdXNPdXQgZG9lc24ndCBmaXJlIHZlcnkgc29vblxuICAgICAgICBpbnRlcnZhbCgwKS5waXBlKHRha2UoMSkpKSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uVGFib3V0KCkpKTtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNhYmxlUGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbmV3IEdyaWRGb2N1c2FibGVFbGVtZW50KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVQYXJlbnQucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsaXZlID0gZmFsc2U7XG4gICAgfVxuICAgIHJlZ2lzdGVyQ2VsbChjZWxsKSB7XG4gICAgICAgIGlmIChjZWxsLmxvZ2ljYWxSb3dJbmRleCAhPT0gdGhpcy5wZW5kaW5nUm93SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsQ2VsbCA9IHRoaXMubW9kZWwucmVnaXN0ZXJDZWxsKGNlbGwpO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbENlbGwgJiYgdGhpcy5jdXJzb3IuYWN0aXZhdGVWaXJ0dWFsQ2VsbChtb2RlbENlbGwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsQ2VsbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJlZ2lzdGVyQ2VsbE9uQ3VycmVudFJvdyhjZWxsKSB7XG4gICAgICAgIGlmIChjZWxsLmxvZ2ljYWxSb3dJbmRleCA9PT0gdGhpcy5wZW5kaW5nUm93SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVnaXN0ZXJDZWxsKGNlbGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVucmVnaXN0ZXJDZWxsKGluZGV4LCByb3dJbmRleCwgY2VsbCkge1xuICAgICAgICB0aGlzLm1vZGVsLnVucmVnaXN0ZXJDZWxsKGluZGV4LCByb3dJbmRleCwgY2VsbCk7XG4gICAgfVxuICAgIHJlZ2lzdGVyUm93KHJvdykge1xuICAgICAgICB0aGlzLm1vZGVsLnJlZ2lzdGVyUm93KHJvdyk7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jvd0luZGV4ID0gcm93LmxvZ2ljYWxSb3dJbmRleDtcbiAgICB9XG4gICAgdXBkYXRlUm93KHJvdykge1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZVJvdyhyb3cpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyUm93KGluZGV4LCByb3cpIHtcbiAgICAgICAgdGhpcy5tb2RlbC51bnJlZ2lzdGVyUm93KGluZGV4LCByb3cpO1xuICAgIH1cbiAgICBpc0NlbGxGb2N1c2FibGUoY2VsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGl2ZSAmJlxuICAgICAgICAgICAgdGhpcy5hY3RpdmUgJiZcbiAgICAgICAgICAgIHRoaXMubW9kZSAhPT0gMiAvKiBDb250ZW50ICovICYmXG4gICAgICAgICAgICB0aGlzLmN1cnNvci5pc0FjdGl2ZShjZWxsLmxvZ2ljYWxSb3dJbmRleCwgY2VsbC5sb2dpY2FsQ29sSW5kZXgpO1xuICAgIH1cbiAgICBpc0NlbGxGb2N1c2VkKGNlbGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gMSAvKiBDdXJzb3IgKi8gJiYgdGhpcy5pc0NlbGxGb2N1c2FibGUoY2VsbCk7XG4gICAgfVxuICAgIG5hdmlnYXRlVG8oZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsaXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbCA9IHRhcmdldENlbGwoZWwsIHRoaXMubWV0YS5ncmlkRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkTW9kZSA9IHRoaXMubW9kZTtcbiAgICAgICAgY29uc3QgZm9jdXNJbkNlbGwgPSBjb250YWlucyhjZWxsLmVsZW1lbnQsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCBmb2N1c0luQWN0aXZlUm93Q29udGVudCA9IHRoaXMubW9kZSA9PT0gMiAvKiBDb250ZW50ICovICYmXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVJvd0luZGV4ID09PSBjZWxsLnJvd0luZGV4ICYmXG4gICAgICAgICAgICBlbCAhPT0gY2VsbC5lbGVtZW50O1xuICAgICAgICBpZiAoZm9jdXNJbkNlbGwpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IDIgLyogQ29udGVudCAqLztcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJvdygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFmb2N1c0luQWN0aXZlUm93Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlID0gMSAvKiBDdXJzb3IgKi87XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50cygpO1xuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUFjdGl2ZSA9IHRoaXMuY3Vyc29yLmlzQWN0aXZlKGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgaXNDdXJzb3IgPSBvbGRNb2RlID09PSAxIC8qIEN1cnNvciAqLyAmJiBhbHJlYWR5QWN0aXZlO1xuICAgICAgICAgICAgaWYgKCFpc0N1cnNvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRyeUZvY3VzKGVsKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBmaW5kRm9jdXNhYmxlQ2hpbGQoZWwpO1xuICAgICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGFyZ2V0Q2VsbChmb2N1c2FibGUsIHRoaXMubWV0YS5ncmlkRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQoY2VsbC5yb3dJbmRleCwgY2VsbC5jb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRWxlbWVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGVyQ2VsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIWZvY3VzYWJsZTtcbiAgICB9XG4gICAgbmVlZHNWaWV3cG9ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YSAmJiB0aGlzLm1ldGEuaXNWaXJ0dWFsO1xuICAgIH1cbiAgICBzZXRWaWV3cG9ydChmaXJzdEl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbmV3IE5hdmlnYXRpb25WaWV3cG9ydChmaXJzdEl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCk7XG4gICAgICAgIGlmICh0aGlzLm1ldGEgJiYgdGhpcy5tZXRhLmlzVmlydHVhbCAmJiB0aGlzLmFjdGl2ZURhdGFSb3cgPiAtMSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YVJvd0luZGV4ID0gdGhpcy5hY3RpdmVEYXRhUm93O1xuICAgICAgICAgICAgY29uc3QgYWhlYWQgPSBmaXJzdEl0ZW1JbmRleCAtIGRhdGFSb3dJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGJlaGluZCA9IGRhdGFSb3dJbmRleCAtIGxhc3RJdGVtSW5kZXg7XG4gICAgICAgICAgICBpZiAoYWhlYWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQoZmlyc3RJdGVtSW5kZXggKyB0aGlzLm1ldGEuaGVhZGVyUm93cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWhpbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQobGFzdEl0ZW1JbmRleCAtIHRoaXMubWV0YS5oZWFkZXJSb3dzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDb2x1bW5WaWV3cG9ydChmaXJzdEl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCkge1xuICAgICAgICB0aGlzLmNvbHVtblZpZXdwb3J0ID0gbmV3IE5hdmlnYXRpb25WaWV3cG9ydChmaXJzdEl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCk7XG4gICAgfVxuICAgIGZvY3VzQ2VsbChyb3dJbmRleCA9IHVuZGVmaW5lZCwgY29sSW5kZXggPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gMSAvKiBDdXJzb3IgKi87XG4gICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KHJvd0luZGV4LCBjb2xJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNlbGw7XG4gICAgfVxuICAgIGZvY3VzQ2VsbEJ5RWxlbWVudChlbCkge1xuICAgICAgICBjb25zdCBjZWxsID0gdGFyZ2V0Q2VsbChlbCwgdGhpcy5tZXRhLmdyaWRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNDZWxsKGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvY3VzTmV4dENlbGwod3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNBZGphY2VudENlbGwodHJ1ZSwgd3JhcCk7XG4gICAgfVxuICAgIGZvY3VzUHJldkNlbGwod3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNBZGphY2VudENlbGwoZmFsc2UsIHdyYXApO1xuICAgIH1cbiAgICB0b2dnbGUoYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICB0aGlzLmN1cnNvci5hbm5vdW5jZSgpO1xuICAgIH1cbiAgICBoYXNGb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gMSAvKiBDdXJzb3IgKi8gfHwgdGhpcy5tb2RlID09PSAyIC8qIENvbnRlbnQgKi87XG4gICAgfVxuICAgIGF1dG9Gb2N1c0NlbGwoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gIXRoaXMubWV0YS52aXJ0dWFsQ29sdW1ucyB8fCBlbmQgPCB0aGlzLm1ldGEuY29sdW1ucy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGggfHwgdGhpcy5jb2x1bW5WaWV3cG9ydC5pbnRlcnNlY3RzKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBmb2N1c0FkamFjZW50Q2VsbChmd2QsIHdyYXApIHtcbiAgICAgICAgdGhpcy5mb2N1c0NlbGwoKTtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmd2QgPyB0aGlzLm1vdmVDdXJzb3JGd2QoKSA6IHRoaXMubW92ZUN1cnNvckJ3ZCgpO1xuICAgICAgICBpZiAod3JhcCAmJiAhc3VjY2Vzcykge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZ3ZCA/IHRoaXMuY3Vyc29yLm1vdmVEb3duKDEpIDogdGhpcy5jdXJzb3IubW92ZVVwKDEpO1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmN1cnNvci5yb3c7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWR4ID0gZndkID8gMCA6IHRoaXMuY3Vyc29yLmxhc3RDZWxsSW5kZXgocm93KTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5yZXNldChyb3cuaW5kZXgsIGNvbElkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNlbGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGUgPSAwIC8qIFN0YW5kYnkgKi87XG4gICAgICAgICAgICB0aGlzLmN1cnNvci5hbm5vdW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbnRlckNlbGwoKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmN1cnNvci5jZWxsO1xuICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cCA9IGNlbGwuZm9jdXNHcm91cDtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gZ3JvdXAgJiYgZ3JvdXAuY2FuRm9jdXMoKTtcbiAgICAgICAgdGhpcy5tb2RlID0gZm9jdXNhYmxlID8gMiAvKiBDb250ZW50ICovIDogMSAvKiBDdXJzb3IgKi87XG4gICAgICAgIHRoaXMuY3Vyc29yLmFubm91bmNlKCk7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSb3coKTtcbiAgICAgICAgICAgIGdyb3VwLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGVhdmVDZWxsKCkge1xuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5jdXJzb3IuY2VsbDtcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjZWxsLmZvY3VzR3JvdXA7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IGdyb3VwICYmIGdyb3VwLmNhbkZvY3VzKCk7XG4gICAgICAgIGlmICghZm9jdXNhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZSA9IDEgLyogQ3Vyc29yICovO1xuICAgICAgICB0aGlzLmN1cnNvci5hbm5vdW5jZSgpO1xuICAgIH1cbiAgICBhY3RpdmF0ZUVsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLmZvY3VzUm9vdC5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICBkZWFjdGl2YXRlRWxlbWVudHMoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNSb290LmRlYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgYWN0aXZhdGVSb3coKSB7XG4gICAgICAgIHRoaXMuY3Vyc29yLnJvdy5jZWxsc1xuICAgICAgICAgICAgLmZvckVhY2goY2VsbCA9PiBjZWxsLmZvY3VzR3JvdXAgJiYgY2VsbC5mb2N1c0dyb3VwLmFjdGl2YXRlKCkpO1xuICAgIH1cbiAgICBtb3ZlQ3Vyc29yRndkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24ucnRsID8gdGhpcy5jdXJzb3IubW92ZUxlZnQoKSA6IHRoaXMuY3Vyc29yLm1vdmVSaWdodCgpO1xuICAgIH1cbiAgICBtb3ZlQ3Vyc29yQndkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24ucnRsID8gdGhpcy5jdXJzb3IubW92ZVJpZ2h0KCkgOiB0aGlzLmN1cnNvci5tb3ZlTGVmdCgpO1xuICAgIH1cbiAgICBvbkN1cnNvcktleWRvd24oYXJncykge1xuICAgICAgICBsZXQgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbW9kaWZpZXIgPSBhcmdzLmN0cmxLZXkgfHwgYXJncy5tZXRhS2V5O1xuICAgICAgICBjb25zdCBzdGVwID0gbW9kaWZpZXIgPyA1IDogMTtcbiAgICAgICAgaWYgKCF0aGlzLm9uQ2VsbEtleWRvd24oYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmN1cnNvci5yb3c7XG4gICAgICAgIHN3aXRjaCAoYXJncy5rZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEtleXMuQXJyb3dEb3duOlxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdGhpcy5jdXJzb3IubW92ZURvd24oc3RlcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtleXMuQXJyb3dVcDpcbiAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdCA9IHRoaXMuY3Vyc29yLm1vdmVVcChzdGVwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5cy5BcnJvd1JpZ2h0OlxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdGhpcy5tb3ZlQ3Vyc29yRndkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtleXMuQXJyb3dMZWZ0OlxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdGhpcy5tb3ZlQ3Vyc29yQndkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtleXMuUGFnZURvd246XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEuaXNWaXJ0dWFsICYmIHRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRJdGVtSW5kZXggPSB0aGlzLm1ldGEuaGVhZGVyUm93cyArIHRoaXMudmlld3BvcnQubGFzdEl0ZW1JbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmhhc0RldGFpbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW1JbmRleCA9IE1hdGgubWluKHRoaXMubWV0YS5tYXhMb2dpY2FsUm93SW5kZXgsIG5leHRJdGVtSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5yZXNldChuZXh0SXRlbUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLmhhc1BhZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5wYWdlckNvbnRleHRTZXJ2aWNlLm5leHRQYWdlKCkpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlzLlBhZ2VVcDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5pc1ZpcnR1YWwgJiYgdGhpcy52aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlld3BvcnRTaXplID0gdGhpcy52aWV3cG9ydC5sYXN0SXRlbUluZGV4IC0gdGhpcy52aWV3cG9ydC5maXJzdEl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0SXRlbUluZGV4ID0gdGhpcy52aWV3cG9ydC5maXJzdEl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRJdGVtSW5kZXggPSBNYXRoLm1heCh0aGlzLm1ldGEuaGVhZGVyUm93cywgZmlyc3RJdGVtSW5kZXggLSB2aWV3cG9ydFNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQobmV4dEl0ZW1JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRhZGF0YS5oYXNQYWdlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMucGFnZXJDb250ZXh0U2VydmljZS5wcmV2UGFnZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5cy5Ib21lOlxuICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXRhLmlzVmlydHVhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQodGhpcy5tZXRhLmhlYWRlclJvd3MsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KHRoaXMubW9kZWwuZmlyc3RSb3cuaW5kZXgsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQocm93LmluZGV4LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5cy5FbmQ6XG4gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGEuaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFJvd0luZGV4ID0gdGhpcy5tZXRhLm1heExvZ2ljYWxSb3dJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGEuaGFzRGV0YWlsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Um93SW5kZXgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KGxhc3RSb3dJbmRleCwgdGhpcy5jdXJzb3IubGFzdENlbGxJbmRleCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5yZXNldCh0aGlzLm1vZGVsLmxhc3RSb3cuaW5kZXgsIHRoaXMuY3Vyc29yLmxhc3RDZWxsSW5kZXgodGhpcy5tb2RlbC5sYXN0Um93KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLmN1cnNvci5sYXN0Q2VsbEluZGV4KHJvdyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLm1vZGVsLmZpbmRDZWxsKGxhc3RJbmRleCwgcm93KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQocm93LmluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5cy5FbnRlcjpcbiAgICAgICAgICAgIGNhc2UgS2V5cy5GMjpcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW0gPSByb3cuZ3JvdXBJdGVtO1xuICAgICAgICAgICAgICAgIGlmIChncm91cEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmdyb3Vwc1NlcnZpY2UudG9nZ2xlUm93KGdyb3VwSXRlbS5pbmRleCwgZ3JvdXBJdGVtLmRhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJzb3IuY2VsbC5kZXRhaWxFeHBhbmRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5kZXRhaWxzU2VydmljZS50b2dnbGVSb3cocm93LmRhdGFSb3dJbmRleCwgcm93LmRhdGFJdGVtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudGVyQ2VsbCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yLmNlbGwuZm9jdXNHcm91cC5pc05hdmlnYWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICghYXJncy5jdHJsS2V5ICYmICFhcmdzLmFsdEtleSAmJiBpc1ByaW50YWJsZUNoYXJhY3RlcihhcmdzLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRlckNlbGwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Db250ZW50S2V5ZG93bihhcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5vbkNlbGxLZXlkb3duKGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybSA9ICFhcmdzLmRlZmF1bHRQcmV2ZW50ZWQgJiYgYXJncy5rZXlDb2RlID09PSBLZXlzLkVudGVyICYmIGlzVGV4dElucHV0KGFyZ3Muc3JjRWxlbWVudCk7XG4gICAgICAgIGlmIChhcmdzLmtleUNvZGUgPT09IEtleXMuRXNjYXBlIHx8IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5GMiB8fCBjb25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmxlYXZlQ2VsbCgpO1xuICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVzZXQoKTtcbiAgICAgICAgICAgIGFyZ3Muc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOYXZpZ2F0aW9uS2V5KGFyZ3Mua2V5Q29kZSkgJiYgdGhpcy5jdXJzb3IuY2VsbC5mb2N1c0dyb3VwLmlzTmF2aWdhYmxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25DdXJzb3JLZXlkb3duKGFyZ3MpO1xuICAgICAgICAgICAgaWYgKGFyZ3MuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhdmVDZWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DZWxsS2V5ZG93bihhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGluZ0NlbGwoKSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlybSA9IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5FbnRlcjtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbCA9IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5Fc2NhcGU7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0ZSA9IGlzTmF2aWdhdGlvbktleShhcmdzLmtleUNvZGUpO1xuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmNsb3NlQ2VsbChhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY2FuY2VsQ2VsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmF2aWdhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZWxsS2V5ZG93bi5lbWl0KGFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgb25DdXJzb3JDaGFuZ2VzKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVSb3dJbmRleCA9IGFyZ3Mucm93SW5kZXg7XG4gICAgICAgIGNvbnN0IGRhdGFSb3dJbmRleCA9IHRoaXMuYWN0aXZlRGF0YVJvdztcbiAgICAgICAgaWYgKHRoaXMubWV0YSAmJiAodGhpcy5tZXRhLmlzVmlydHVhbCAmJiB0aGlzLnZpZXdwb3J0ICYmXG4gICAgICAgICAgICAhdGhpcy52aWV3cG9ydC5jb250YWluc1JvdyhkYXRhUm93SW5kZXgpICYmIGRhdGFSb3dJbmRleCA+IC0xKSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxSZXF1ZXN0U2VydmljZS5zY3JvbGxUbyh7IHJvdzogZGF0YVJvd0luZGV4IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGEudmlydHVhbENvbHVtbnMgJiYgYXJncy5jb2xJbmRleCA+PSB0aGlzLm1ldGEuY29sdW1ucy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmFjdGl2ZUNlbGw7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMubW9kZWwuY2VsbFJhbmdlKGNlbGwpO1xuICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsQ2VsbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKCFjZWxsICYmIHRoaXMubW9kZSAhPT0gMCAvKiBTdGFuZGJ5ICovKSB8fCAoY2VsbCAmJiAhdGhpcy5jb2x1bW5WaWV3cG9ydC5pbnRlcnNlY3RzKHN0YXJ0LCBlbmQpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUmVxdWVzdFNlcnZpY2Uuc2Nyb2xsVG8oeyBjb2x1bW46IGFyZ3MuY29sSW5kZXggLSAodGhpcy5tZXRhZGF0YS5oYXNEZXRhaWxUZW1wbGF0ZSA/IDEgOiAwKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkZvY3VzT3V0KGFyZ3MpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZShhcmdzLnRhcmdldCkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IDAgLyogU3RhbmRieSAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvY3VzZWQgdGFyZ2V0IGlzIG5vIGxvbmdlciB2aXNpYmxlLFxuICAgICAgICAgICAgLy8gcmVzZXQgdG8gY3Vyc29yIG1vZGUgYW5kIHJlY2FwdHVyZSBmb2N1cy5cbiAgICAgICAgICAgIHRoaXMubW9kZSA9IDEgLyogQ3Vyc29yICovO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZUVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3Vyc29yLmFubm91bmNlKCk7XG4gICAgfVxuICAgIG9uV2luZG93Qmx1cigpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gMCAvKiBTdGFuZGJ5ICovO1xuICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50cygpO1xuICAgICAgICB0aGlzLmN1cnNvci5hbm5vdW5jZSgpO1xuICAgIH1cbiAgICBvbktleWRvd24oYXJncykge1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAxIC8qIEN1cnNvciAqLykge1xuICAgICAgICAgICAgdGhpcy5vbkN1cnNvcktleWRvd24oYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tb2RlID09PSAyIC8qIENvbnRlbnQgKi8pIHtcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50S2V5ZG93bihhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblRhYm91dCgpIHtcbiAgICAgICAgLy8gVGFiYmVkIG91dCBvZiB0aGUgbGFzdCBmb2N1c2FibGUgY29udGVudCBlbGVtZW50XG4gICAgICAgIC8vIHJlc2V0IHRvIGN1cnNvciBtb2RlIGFuZCByZWNhcHR1cmUgZm9jdXMuXG4gICAgICAgIGlmICh0aGlzLmN1cnNvci5jZWxsLmZvY3VzR3JvdXAuaXNOYXZpZ2FibGUoKSkge1xuICAgICAgICAgICAgLy8gVW5sZXNzIHRoZSBjZWxsIGhhcyBhIHNpbmdsZSBmb2N1c2FibGUgZWxlbWVudCxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSdkIHJldHVybiB0byBDb250ZW50IG1vZGUgYW5kIGVudGVyIGFuIGVuZGxlc3MgbG9vcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVhdmVDZWxsKCk7XG4gICAgICAgIHRoaXMuY3Vyc29yLnJlc2V0KCk7XG4gICAgfVxufVxuTmF2aWdhdGlvblNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk5hdmlnYXRpb25TZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBEb21FdmVudHNTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBQYWdlckNvbnRleHRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTY3JvbGxSZXF1ZXN0U2VydmljZSB9LFxuICAgIHsgdHlwZTogR3JvdXBzU2VydmljZSB9LFxuICAgIHsgdHlwZTogRGV0YWlsc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEZvY3VzUm9vdCB9LFxuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBGb2N1c2FibGVEaXJlY3RpdmUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihkb21FdmVudHMsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLmRvbUV2ZW50cyA9IGRvbUV2ZW50cztcbiAgICAgICAgdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZSA9IGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gbmF2aWdhdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uU3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0IGVuYWJsZU1hcnF1ZWUoKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94T25seSA9IHRoaXMuc2V0dGluZ3MgJiYgdHlwZW9mIHRoaXMuc2V0dGluZ3MgPT09ICdvYmplY3QnICYmIHRoaXMuc2V0dGluZ3MuY2hlY2tib3hPbmx5O1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MgfHwgY2hlY2tib3hPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0YWJsZVNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5zZWxlY3RhYmxlO1xuICAgICAgICBjb25zdCBkcmFnQW5kTXVsdGlwbGUgPSB0eXBlb2YgKHNlbGVjdGFibGVTZXR0aW5ncykgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBpc1ByZXNlbnQoc2VsZWN0YWJsZVNldHRpbmdzKSAmJlxuICAgICAgICAgICAgc2VsZWN0YWJsZVNldHRpbmdzLm1vZGUgPT09ICdtdWx0aXBsZScgJiZcbiAgICAgICAgICAgIHNlbGVjdGFibGVTZXR0aW5ncy5lbmFibGVkICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgIXNlbGVjdGFibGVTZXR0aW5ncy5jaGVja2JveE9ubHkgJiZcbiAgICAgICAgICAgIHNlbGVjdGFibGVTZXR0aW5ncy5kcmFnO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmUgJiYgZHJhZ0FuZE11bHRpcGxlO1xuICAgIH1cbiAgICBpbml0KHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gW107XG4gICAgICAgIGlmIChzZXR0aW5ncy5zZWxlY3RhYmxlICYmIHNldHRpbmdzLnNlbGVjdGFibGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0QWxsU3RhdGUgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoIWl0ZW0uZG9uZSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlICYmIGl0ZW0udmFsdWUudHlwZSA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93QXJncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJdGVtOiBpdGVtLnZhbHVlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS52YWx1ZS5pbmRleFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Mucm93U2VsZWN0ZWQocm93QXJncykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbltpdGVtLnZhbHVlLmluZGV4XSA9IHJvd0FyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RBbGxTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RBbGxTdGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0ZWQoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MgJiYgdGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlZCAmJiBpc1ByZXNlbnQodGhpcy5jdXJyZW50U2VsZWN0aW9uW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlQ2xpY2soaXRlbSwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXY7XG4gICAgICAgIGNvbnN0IGN0cmxLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PT0gXCJzaW5nbGVcIiAmJiBjdHJsS2V5ICYmIHRoaXMuaXNTZWxlY3RlZChpdGVtLmluZGV4KSkge1xuICAgICAgICAgICAgZXYgPSB0aGlzLnRvZ2dsZShpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICBpZiAoY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBldiA9IHRoaXMudG9nZ2xlKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBldiA9IHRoaXMuYWRkQWxsVG8oaXRlbSwgY3RybEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1ByZXNlbnQoZXYpKSB7XG4gICAgICAgICAgICBldiA9IHRoaXMuc2VsZWN0KGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uW2l0ZW0uaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgIGRhdGFJdGVtOiBpdGVtLmRhdGEsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGl0ZW0uaW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFldi5zZWxlY3RlZFJvd3MubGVuZ3RoICYmICFldi5kZXNlbGVjdGVkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldi5jdHJsS2V5ID0gY3RybEtleTtcbiAgICAgICAgZXYuc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoZXYpO1xuICAgIH1cbiAgICB0b2dnbGUoaXRlbSkge1xuICAgICAgICBsZXQgc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIGxldCBkZXNlbGVjdGVkUm93cyA9IFtdO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25TdGFydEluZGV4ID0gaXRlbS5pbmRleDtcbiAgICAgICAgY29uc3Qgcm93QXJncyA9IHsgZGF0YUl0ZW06IGl0ZW0uZGF0YSwgaW5kZXg6IGl0ZW0uaW5kZXggfTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChpdGVtLmluZGV4KSkge1xuICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3MucHVzaChyb3dBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvd0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXNlbGVjdGVkUm93czogZGVzZWxlY3RlZFJvd3MsXG4gICAgICAgICAgICBzZWxlY3RlZFJvd3M6IHNlbGVjdGVkUm93c1xuICAgICAgICB9O1xuICAgIH1cbiAgICB0b2dnbGVCeUluZGV4KGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RBbGxDaGVja2VkICYmIHRoaXMuaXNTZWxlY3RlZChpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICB3aGlsZSAoIWl0ZW0uZG9uZSkge1xuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZS50eXBlID09PSBcImRhdGFcIiAmJiBpdGVtLnZhbHVlLmluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Ub1RvZ2dsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbS52YWx1ZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS52YWx1ZS5pbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChpbmRleCkgfHwgdGhpcy5vcHRpb25zLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2dnbGUoaXRlbVRvVG9nZ2xlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdChpdGVtVG9Ub2dnbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0gPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0KGl0ZW0pIHtcbiAgICAgICAgbGV0IGRlc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIGxldCBzZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uU3RhcnRJbmRleCA9IGl0ZW0uaW5kZXg7XG4gICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGl0ZW0uaW5kZXgpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFJvd3MucHVzaCh7IGRhdGFJdGVtOiBpdGVtLmRhdGEsIGluZGV4OiBpdGVtLmluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgIGlmIChyb3cuaW5kZXggIT09IGl0ZW0uaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBkZXNlbGVjdGVkUm93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3M6IGRlc2VsZWN0ZWRSb3dzLFxuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzOiBzZWxlY3RlZFJvd3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy9Vc2VkIHRvIG1hbnVhbGx5IGRlc2VsZWN0IHJlbW92ZWQgaXRlbXNcbiAgICBkZXNlbGVjdChyZW1vdmVkSXRlbSkge1xuICAgICAgICBjb25zdCBpdGVyYXRvciQkMSA9IHRoaXMuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIHdoaWxlICghaXRlbS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFwiZGF0YVwiICYmIGl0ZW0udmFsdWUuZGF0YSA9PT0gcmVtb3ZlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dBcmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSXRlbTogaXRlbS52YWx1ZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS52YWx1ZS5pbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChyb3dBcmdzLmluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXYgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHJsS2V5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VsZWN0ZWRSb3dzOiBbcm93QXJnc10sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvd3M6IFtdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KGV2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEFsbFRvKGl0ZW0sIGN0cmxLZXkpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkUm93cyA9IFtdO1xuICAgICAgICBsZXQgZGVzZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbih0aGlzLmxhc3RTZWxlY3Rpb25TdGFydEluZGV4LCBpdGVtLmluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgodGhpcy5sYXN0U2VsZWN0aW9uU3RhcnRJbmRleCwgaXRlbS5pbmRleCk7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICBsZXQgbmV4dCA9IGl0ZXJhdG9yJCQxLm5leHQoKTtcbiAgICAgICAgd2hpbGUgKCFuZXh0LmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0LnZhbHVlICYmIG5leHQudmFsdWUudHlwZSA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBuZXh0LnZhbHVlLmluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0FyZ3MgPSB7IGRhdGFJdGVtOiBuZXh0LnZhbHVlLmRhdGEsIGluZGV4OiBpZHggfTtcbiAgICAgICAgICAgICAgICBpZiAoKGlkeCA8IHN0YXJ0IHx8IGlkeCA+IGVuZCkgJiYgdGhpcy5pc1NlbGVjdGVkKGlkeCkgJiYgIWN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3MucHVzaChyb3dBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChpZHggPj0gc3RhcnQgJiYgaWR4IDw9IGVuZCkgJiYgIXRoaXMuaXNTZWxlY3RlZChpZHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvd0FyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlc2VsZWN0ZWRSb3dzOiBkZXNlbGVjdGVkUm93cyxcbiAgICAgICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWRSb3dzXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZUFsbChzZWxlY3RBbGxDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2tlZCA9IHNlbGVjdEFsbENoZWNrZWQ7XG4gICAgICAgIGxldCBzZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgbGV0IGRlc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICBsZXQgbmV4dCA9IGl0ZXJhdG9yJCQxLm5leHQoKTtcbiAgICAgICAgd2hpbGUgKCFuZXh0LmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0LnZhbHVlICYmIG5leHQudmFsdWUudHlwZSA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBuZXh0LnZhbHVlLmluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0FyZ3MgPSB7IGRhdGFJdGVtOiBuZXh0LnZhbHVlLmRhdGEsIGluZGV4OiBpZHggfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKGlkeCkgJiYgIXNlbGVjdEFsbENoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3MucHVzaChyb3dBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaWR4KSAmJiBzZWxlY3RBbGxDaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvd0FyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3RlZFJvd3MubGVuZ3RoICYmICFkZXNlbGVjdGVkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXYgPSB7XG4gICAgICAgICAgICBjdHJsS2V5OiB0cnVlLFxuICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3M6IGRlc2VsZWN0ZWRSb3dzLFxuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzOiBzZWxlY3RlZFJvd3MsXG4gICAgICAgICAgICBzaGlmdEtleTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdChldik7XG4gICAgfVxuICAgIHNlbGVjdFJhbmdlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgbGV0IGRlc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICBsZXQgbmV4dCA9IGl0ZXJhdG9yJCQxLm5leHQoKTtcbiAgICAgICAgd2hpbGUgKCFuZXh0LmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0LnZhbHVlICYmIG5leHQudmFsdWUudHlwZSA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBuZXh0LnZhbHVlLmluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0FyZ3MgPSB7IGRhdGFJdGVtOiBuZXh0LnZhbHVlLmRhdGEsIGluZGV4OiBpZHggfTtcbiAgICAgICAgICAgICAgICBpZiAoKGlkeCA8IHN0YXJ0IHx8IGlkeCA+IGVuZCkgJiYgdGhpcy5pc1NlbGVjdGVkKGlkeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZFJvd3MucHVzaChyb3dBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChpZHggPj0gc3RhcnQgJiYgaWR4IDw9IGVuZCkgJiYgIXRoaXMuaXNTZWxlY3RlZChpZHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvd0FyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlc2VsZWN0ZWRSb3dzOiBkZXNlbGVjdGVkUm93cyxcbiAgICAgICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWRSb3dzXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBzZWxlY3RBbGxTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbFN0YXRlO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTZWxlY3Rpb24ubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5pbmRleDtcbiAgICAgICAgfSkuZmlsdGVyKChuKSA9PiB0eXBlb2YgbiA9PT0gXCJudW1iZXJcIik7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNoZWNrYm94T25seTogZmFsc2UsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogXCJtdWx0aXBsZVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghaXNQcmVzZW50KHRoaXMuc2V0dGluZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLnNlbGVjdGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjaGVja2JveE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuc2V0dGluZ3Muc2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICBtb2RlOiBcIm11bHRpcGxlXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0T3B0aW9ucywgdGhpcy5zZXR0aW5ncy5zZWxlY3RhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuICAgIHRhcmdldEFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogdGhpcy5tb3VzZURvd25FdmVudEFyZ3Mucm93SW5kZXgsXG4gICAgICAgICAgICBkYXRhSXRlbTogdGhpcy5tb3VzZURvd25FdmVudEFyZ3MuZGF0YUl0ZW1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgYWRkU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jZWxsQ2xpY2tTdWJzY3JpcHRpb24gPSB0aGlzLmRvbUV2ZW50cy5jZWxsQ2xpY2suc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVkICYmICF0aGlzLm9wdGlvbnMuY2hlY2tib3hPbmx5ICYmIGFyZ3MudHlwZSAhPT0gJ2NvbnRleHRtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soeyBpbmRleDogYXJncy5yb3dJbmRleCwgZGF0YTogYXJncy5kYXRhSXRlbSB9LCBhcmdzLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1vdXNlZG93blN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25TdWJzY3JpcHRpb24gPSB0aGlzLmRvbUV2ZW50cy5jZWxsTW91c2Vkb3duLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW91c2VEb3duRXZlbnRBcmdzID0gYXJncztcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMub3B0aW9ucy5lbmFibGVkICYmICghdGhpcy5vcHRpb25zLm1vZGUgfHwgdGhpcy5vcHRpb25zLm1vZGUgPT09IFwibXVsdGlwbGVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMub3B0aW9ucy5jaGVja2JveE9ubHkgJiYgYXJncy5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Mub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mb2N1c0NlbGxCeUVsZW1lbnQoYXJncy5vcmlnaW5hbEV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZSAmJiAhdGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UuY2hhbmdlcy5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChhcmdzLmFjdGlvbikgJiYgYXJncy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGFyZ3MuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRJdGVyYXRvcigpIHtcbiAgICAgICAgY29uc3QgYWNjZXNzb3IgPSB0aGlzLnNldHRpbmdzLnZpZXcuYWNjZXNzb3IoKTtcbiAgICAgICAgaWYgKCFhY2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2Nlc3NvcltpdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgcmVtb3ZlU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbENsaWNrU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5jZWxsQ2xpY2tTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vdXNlZG93blN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMubW91c2Vkb3duU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5TZWxlY3Rpb25TZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TZWxlY3Rpb25TZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRG9tRXZlbnRzU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDZWxsU2VsZWN0aW9uU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoZG9tRXZlbnRzLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5kb21FdmVudHMgPSBkb21FdmVudHM7XG4gICAgICAgIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgPSBsb2NhbERhdGFDaGFuZ2VzU2VydmljZTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZSA9IG5hdmlnYXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMubW91c2VVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRyYWdTZWxlY3REZXNlbGVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25JdGVtID0geyBpdGVtS2V5OiAwLCBjb2x1bW5LZXk6IDAgfTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uSXRlbVJvd0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uSXRlbUNvbEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5hZGRTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuICAgIGdldCBlbmFibGVNYXJxdWVlKCkge1xuICAgICAgICBjb25zdCBjaGVja2JveE9ubHkgPSB0aGlzLnNldHRpbmdzICYmIHR5cGVvZiB0aGlzLnNldHRpbmdzID09PSAnb2JqZWN0JyAmJiB0aGlzLnNldHRpbmdzLmNoZWNrYm94T25seTtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzIHx8IGNoZWNrYm94T25seSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGFibGVTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3Muc2VsZWN0YWJsZTtcbiAgICAgICAgY29uc3QgZHJhZ0FuZE11bHRpcGxlID0gdHlwZW9mIChzZWxlY3RhYmxlU2V0dGluZ3MpID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgaXNQcmVzZW50KHNlbGVjdGFibGVTZXR0aW5ncykgJiZcbiAgICAgICAgICAgIHNlbGVjdGFibGVTZXR0aW5ncy5tb2RlID09PSAnbXVsdGlwbGUnICYmXG4gICAgICAgICAgICBzZWxlY3RhYmxlU2V0dGluZ3MuY2VsbCAmJlxuICAgICAgICAgICAgc2VsZWN0YWJsZVNldHRpbmdzLmVuYWJsZWQgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBzZWxlY3RhYmxlU2V0dGluZ3MuZHJhZztcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlICYmIGRyYWdBbmRNdWx0aXBsZTtcbiAgICB9XG4gICAgaW5pdChzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IFtdO1xuICAgICAgICBpZiAoc2V0dGluZ3Muc2VsZWN0YWJsZSAmJiBzZXR0aW5ncy5zZWxlY3RhYmxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVyYXRvciQkMSA9IHRoaXMuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgICAgIGxldCBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICAgICAgd2hpbGUgKCFpdGVtLmRvbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0FyZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhSXRlbTogaXRlbS52YWx1ZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGl0ZW0udmFsdWUuaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxBcmdzID0gc2V0dGluZ3MuY2VsbFNlbGVjdGVkKHJvd0FyZ3MsIGNvbCwgY29sLmxlYWZJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDZWxsQXJncy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5wdXNoKHNlbGVjdGVkQ2VsbEFyZ3MuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlzQ2VsbFNlbGVjdGVkKGl0ZW0sIGNvbCkge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncyAmJiB0aGlzLmFjdGl2ZSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsQXJncyA9IHRoaXMuc2V0dGluZ3MuY2VsbFNlbGVjdGVkKHsgZGF0YUl0ZW06IGl0ZW0uZGF0YSwgaW5kZXg6IGl0ZW0uaW5kZXggfSwgY29sLCBjb2wubGVhZkluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlZCAmJiBzZWxlY3RlZENlbGxBcmdzLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQ2xpY2soaXRlbSwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXY7XG4gICAgICAgIGNvbnN0IGN0cmxLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PT0gXCJzaW5nbGVcIiAmJiBjdHJsS2V5ICYmIHRoaXMuaXNDZWxsU2VsZWN0ZWQoaXRlbSwgaXRlbS5jb2x1bW4pKSB7XG4gICAgICAgICAgICBldiA9IHRoaXMudG9nZ2xlKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgICAgIGlmIChjdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ID0gdGhpcy50b2dnbGUoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSBNYXRoLm1pbih0aGlzLmxhc3RTZWxlY3Rpb25JdGVtUm93SW5kZXgsIGl0ZW0uaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29sSW5kZXggPSBNYXRoLm1pbih0aGlzLmxhc3RTZWxlY3Rpb25JdGVtQ29sSW5kZXgsIGl0ZW0uY29sdW1uLmxlYWZJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUm93SW5kZXggPSBNYXRoLm1heCh0aGlzLmxhc3RTZWxlY3Rpb25JdGVtUm93SW5kZXgsIGl0ZW0uaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZENvbEluZGV4ID0gTWF0aC5tYXgodGhpcy5sYXN0U2VsZWN0aW9uSXRlbUNvbEluZGV4LCBpdGVtLmNvbHVtbi5sZWFmSW5kZXgpO1xuICAgICAgICAgICAgICAgIGV2ID0gdGhpcy5zZWxlY3RSYW5nZShzdGFydFJvd0luZGV4LCBzdGFydENvbEluZGV4LCBlbmRSb3dJbmRleCwgZW5kQ29sSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNQcmVzZW50KGV2KSkge1xuICAgICAgICAgICAgZXYgPSB0aGlzLnNlbGVjdChpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IFt0aGlzLmxhc3RTZWxlY3Rpb25JdGVtXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2LnNlbGVjdGVkQ2VsbHMubGVuZ3RoICYmICFldi5kZXNlbGVjdGVkQ2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXYuY3RybEtleSA9IGN0cmxLZXk7XG4gICAgICAgIGV2LnNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KGV2KTtcbiAgICB9XG4gICAgdG9nZ2xlKGl0ZW0pIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkQ2VsbHMgPSBbXTtcbiAgICAgICAgbGV0IGRlc2VsZWN0ZWRDZWxscyA9IFtdO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25JdGVtID1cbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuY2VsbFNlbGVjdGVkKHsgZGF0YUl0ZW06IGl0ZW0uZGF0YSwgaW5kZXg6IGl0ZW0uaW5kZXggfSwgaXRlbS5jb2x1bW4sIGl0ZW0uY29sdW1uLmxlYWZJbmRleCkuaXRlbTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uSXRlbVJvd0luZGV4ID0gaXRlbS5pbmRleDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uSXRlbUNvbEluZGV4ID0gaXRlbS5jb2x1bW4ubGVhZkluZGV4O1xuICAgICAgICBpZiAodGhpcy5pc0NlbGxTZWxlY3RlZChpdGVtLCBpdGVtLmNvbHVtbikpIHtcbiAgICAgICAgICAgIGRlc2VsZWN0ZWRDZWxscy5wdXNoKHRoaXMubGFzdFNlbGVjdGlvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5wdXNoKHRoaXMubGFzdFNlbGVjdGlvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXNlbGVjdGVkQ2VsbHMsXG4gICAgICAgICAgICBzZWxlY3RlZENlbGxzXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNlbGVjdChpdGVtKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSBbXTtcbiAgICAgICAgY29uc3QgZGVzZWxlY3RlZENlbGxzID0gW107XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbkl0ZW0gPVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5jZWxsU2VsZWN0ZWQoeyBkYXRhSXRlbTogaXRlbS5kYXRhLCBpbmRleDogaXRlbS5pbmRleCB9LCBpdGVtLmNvbHVtbiwgaXRlbS5jb2x1bW4ubGVhZkluZGV4KS5pdGVtO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25JdGVtUm93SW5kZXggPSBpdGVtLmluZGV4O1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25JdGVtQ29sSW5kZXggPSBpdGVtLmNvbHVtbi5sZWFmSW5kZXg7XG4gICAgICAgIGlmICghdGhpcy5pc0NlbGxTZWxlY3RlZChpdGVtLCBpdGVtLmNvbHVtbikpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMucHVzaCh0aGlzLmxhc3RTZWxlY3Rpb25JdGVtKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZm9yRWFjaCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtLml0ZW1LZXkgIT09IHRoaXMubGFzdFNlbGVjdGlvbkl0ZW0uaXRlbUtleSB8fCBzZWxlY3RlZEl0ZW0uY29sdW1uS2V5ICE9PSB0aGlzLmxhc3RTZWxlY3Rpb25JdGVtLmNvbHVtbktleSkge1xuICAgICAgICAgICAgICAgIGRlc2VsZWN0ZWRDZWxscy5wdXNoKHNlbGVjdGVkSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzZWxlY3RlZENlbGxzLFxuICAgICAgICAgICAgc2VsZWN0ZWRDZWxsc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvL1VzZWQgdG8gbWFudWFsbHkgZGVzZWxlY3QgcmVtb3ZlZCBpdGVtc1xuICAgIGRlc2VsZWN0KHJlbW92ZWRJdGVtKSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yJCQxID0gdGhpcy5nZXRJdGVyYXRvcigpO1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZXJhdG9yJCQxLm5leHQoKTtcbiAgICAgICAgbGV0IHJvd0FyZ3M7XG4gICAgICAgIHdoaWxlICghaXRlbS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFwiZGF0YVwiICYmIGl0ZW0udmFsdWUuZGF0YSA9PT0gcmVtb3ZlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICByb3dBcmdzID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSXRlbTogaXRlbS52YWx1ZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS52YWx1ZS5pbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtID0gaXRlcmF0b3IkJDEubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dBcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsc1RvUmVtb3ZlID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uLmZpbHRlcihzZWxlY3RlZEl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbmRlciA9IHRoaXMuc2V0dGluZ3MuY2VsbFNlbGVjdGVkKHJvd0FyZ3MsIG51bGwsIG51bGwpLml0ZW07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbS5pdGVtS2V5ID09PSBjb250ZW5kZXIuaXRlbUtleTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNlbGxzVG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV2ID0ge1xuICAgICAgICAgICAgICAgICAgICBjdHJsS2V5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZENlbGxzOiBjZWxsc1RvUmVtb3ZlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENlbGxzOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNlbGVjdFJhbmdlKHN0YXJ0Um93SW5kZXgsIHN0YXJ0Q29sSW5kZXgsIGVuZFJvd0luZGV4LCBlbmRDb2xJbmRleCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gW107XG4gICAgICAgIGNvbnN0IGRlc2VsZWN0ZWRDZWxscyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdGFydFJvdyA9IE1hdGgubWluKHN0YXJ0Um93SW5kZXgsIGVuZFJvd0luZGV4KTtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnRDb2wgPSBNYXRoLm1pbihzdGFydENvbEluZGV4LCBlbmRDb2xJbmRleCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkVuZFJvdyA9IE1hdGgubWF4KHN0YXJ0Um93SW5kZXgsIGVuZFJvd0luZGV4KTtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kQ29sID0gTWF0aC5tYXgoc3RhcnRDb2xJbmRleCwgZW5kQ29sSW5kZXgpO1xuICAgICAgICBjb25zdCBpdGVyYXRvciQkMSA9IHRoaXMuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgbGV0IG5leHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIHdoaWxlICghbmV4dC5kb25lKSB7XG4gICAgICAgICAgICBpZiAobmV4dC52YWx1ZSAmJiBuZXh0LnZhbHVlLnR5cGUgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbmV4dC52YWx1ZS5pbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV4dC52YWx1ZS5kYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0FyZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFJdGVtOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaWR4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGl0ZW0gfSA9IHRoaXMuc2V0dGluZ3MuY2VsbFNlbGVjdGVkKHJvd0FyZ3MsIGNvbCwgY29sLmxlYWZJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pc0NlbGxTZWxlY3RlZChuZXh0LnZhbHVlLCBjb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0luUm93UmFuZ2UgPSBzZWxlY3Rpb25TdGFydFJvdyA8PSBpZHggJiYgaWR4IDw9IHNlbGVjdGlvbkVuZFJvdztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbkNvbFJhbmdlID0gc2VsZWN0aW9uU3RhcnRDb2wgPD0gY29sLmxlYWZJbmRleCAmJiBjb2wubGVhZkluZGV4IDw9IHNlbGVjdGlvbkVuZENvbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJblNlbGVjdGlvblJlY3QgPSBpc0luUm93UmFuZ2UgJiYgaXNJbkNvbFJhbmdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5TZWxlY3Rpb25SZWN0ICYmIHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdGVkQ2VsbHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJblNlbGVjdGlvblJlY3QgJiYgIXNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENlbGxzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlc2VsZWN0ZWRDZWxscyxcbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICAgICAgY2hlY2tib3hPbmx5OiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBtb2RlOiBcIm11bHRpcGxlXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5zZXR0aW5ncykpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3Muc2VsZWN0YWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94T25seTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5zZXR0aW5ncy5zZWxlY3RhYmxlLFxuICAgICAgICAgICAgICAgIG1vZGU6IFwibXVsdGlwbGVcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRPcHRpb25zLCB0aGlzLnNldHRpbmdzLnNlbGVjdGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG4gICAgYWRkU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jZWxsQ2xpY2tTdWJzY3JpcHRpb24gPSB0aGlzLmRvbUV2ZW50cy5jZWxsQ2xpY2suc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVkICYmICF0aGlzLm9wdGlvbnMuY2hlY2tib3hPbmx5ICYmIGFyZ3MudHlwZSAhPT0gJ2NvbnRleHRtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soeyBpbmRleDogYXJncy5yb3dJbmRleCwgZGF0YTogYXJncy5kYXRhSXRlbSwgY29sdW1uOiBhcmdzLmNvbHVtbiB9LCBhcmdzLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1vdXNlZG93blN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25TdWJzY3JpcHRpb24gPSB0aGlzLmRvbUV2ZW50cy5jZWxsTW91c2Vkb3duLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW91c2VEb3duRXZlbnRBcmdzID0gYXJncztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZWQgJiYgKCF0aGlzLm9wdGlvbnMubW9kZSB8fCB0aGlzLm9wdGlvbnMubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLmNoZWNrYm94T25seSAmJiBhcmdzLm9yaWdpbmFsRXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9jdXNDZWxsQnlFbGVtZW50KGFyZ3Mub3JpZ2luYWxFdmVudC50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgJiYgIXRoaXMuZGF0YUNoYW5nZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZWRTdWJzY3JpcHRpb24gPSB0aGlzLmxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoYXJncy5hY3Rpb24pICYmIGFyZ3MuYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdChhcmdzLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5zZXR0aW5ncy52aWV3LmFjY2Vzc29yKCk7XG4gICAgICAgIGlmICghYWNjZXNzb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjZXNzb3JbaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIHJlbW92ZVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jZWxsQ2xpY2tTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuY2VsbENsaWNrU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb3VzZWRvd25TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubW91c2Vkb3duU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLm1vdXNlZG93blN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YUNoYW5nZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZWRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuQ2VsbFNlbGVjdGlvblNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNlbGxTZWxlY3Rpb25TZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRG9tRXZlbnRzU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH1cbl07XG5cbmNvbnN0IGNyZWF0ZUVsZW1lbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgbWFycXVlZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbWFycXVlZS5jbGFzc05hbWUgPSBcImstbWFycXVlZVwiO1xuICAgIGNvbnN0IG1hcnF1ZWVDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbWFycXVlZUNvbG9yLmNsYXNzTmFtZSA9IFwiay1tYXJxdWVlLWNvbG9yXCI7XG4gICAgbWFycXVlZS5hcHBlbmRDaGlsZChtYXJxdWVlQ29sb3IpO1xuICAgIHJldHVybiBtYXJxdWVlO1xufTtcbmNvbnN0IFBPSU5URVJfT0ZGU0VUID0gMjtcbmNvbnN0IE1JTklNQUxfRFJBR19ESVNUQU5DRSA9IDU7XG5jb25zdCBvZmZzZXRzID0ge1xuICAgIHRvcExlZnQ6IHsgeDogUE9JTlRFUl9PRkZTRVQsIHk6IFBPSU5URVJfT0ZGU0VUIH0sXG4gICAgdG9wUmlnaHQ6IHsgeDogLVBPSU5URVJfT0ZGU0VULCB5OiBQT0lOVEVSX09GRlNFVCB9LFxuICAgIGJvdHRvbUxlZnQ6IHsgeDogUE9JTlRFUl9PRkZTRVQsIHk6IC1QT0lOVEVSX09GRlNFVCB9LFxuICAgIGJvdHRvbVJpZ2h0OiB7IHg6IC1QT0lOVEVSX09GRlNFVCwgeTogLVBPSU5URVJfT0ZGU0VUIH1cbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgR3JpZE1hcnF1ZWVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSwgc2VsZWN0aW9uLCBjZWxsU2VsZWN0aW9uLCBkb21FdmVudHMpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLmNlbGxTZWxlY3Rpb24gPSBjZWxsU2VsZWN0aW9uO1xuICAgICAgICB0aGlzLmRvbUV2ZW50cyA9IGRvbUV2ZW50cztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCB1c2VyU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuY2VsbFNlbGVjdGlvbi5lbmFibGVNYXJxdWVlIHx8IHRoaXMuc2VsZWN0aW9uLmVuYWJsZU1hcnF1ZWUpID8gJ25vbmUnIDogbnVsbDtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9ICh0aGlzLmRyYWdnYWJsZS5rZW5kb1ByZXNzLnN1YnNjcmliZSh0aGlzLnN0YXJ0LmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmRyYWdnYWJsZS5rZW5kb0RyYWcuc3Vic2NyaWJlKHRoaXMubW92ZU1hcnF1ZWUuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuY2xlYW4oKTtcbiAgICB9XG4gICAgc3RhcnQoYXJncykge1xuICAgICAgICBpZiAoYXJncy5vcmlnaW5hbEV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2stY2hlY2tib3gnKSkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc0FyZ3MgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlc3NBcmdzID0gYXJncztcbiAgICAgICAgdGhpcy5wcmVzc1RhcmdldCA9IG51bGw7XG4gICAgfVxuICAgIG1vdmVNYXJxdWVlKGFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByZXNzVGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzVGFyZ2V0ID0gdGhpcy5jZWxsU2VsZWN0aW9uLmFjdGl2ZSA/IHRoaXMuY2VsbFNlbGVjdGlvbi5tb3VzZURvd25FdmVudEFyZ3MgOiB0aGlzLnNlbGVjdGlvbi5tb3VzZURvd25FdmVudEFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJlc3MgPSB0aGlzLnByZXNzQXJncztcbiAgICAgICAgaWYgKCFwcmVzcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25TdGFydGVkKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdygoYXJncy5wYWdlWCAtIHByZXNzLnBhZ2VYKSwgMikgKyBNYXRoLnBvdygoYXJncy5wYWdlWSAtIHByZXNzLnBhZ2VZKSwgMikpO1xuICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gTUlOSU1BTF9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdFbmRTdWJzY3JpcHRpb24gPSBtZXJnZSh0aGlzLmRvbUV2ZW50cy5jZWxsTW91c2V1cC5waXBlKHRha2UoMSkpLCB0aGlzLmRyYWdnYWJsZS5rZW5kb1JlbGVhc2UucGlwZShkZWxheSgxKSwgdGFrZSgxKSkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5lbmRTZWxlY3Rpb24uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0TWFycXVlZSgpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5tYXJxdWVlRWxlbWVudDtcbiAgICAgICAgY29uc3QgbWFycXVlZVF1YWRyYW50ID0gdGhpcy5nZXRNYXJxdWVlUXVhZHJhbnQoYXJncy5wYWdlWCwgYXJncy5wYWdlWSwgcHJlc3MucGFnZVgsIHByZXNzLnBhZ2VZKTtcbiAgICAgICAgbGV0IGxlZnQgPSBNYXRoLm1pbihhcmdzLnBhZ2VYLCBwcmVzcy5wYWdlWCk7XG4gICAgICAgIGxldCB0b3AgPSBNYXRoLm1pbihhcmdzLnBhZ2VZLCBwcmVzcy5wYWdlWSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5hYnMoYXJncy5wYWdlWCAtIHByZXNzLnBhZ2VYKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnMoYXJncy5wYWdlWSAtIHByZXNzLnBhZ2VZKTtcbiAgICAgICAgaWYgKG1hcnF1ZWVRdWFkcmFudCkge1xuICAgICAgICAgICAgbGVmdCArPSBvZmZzZXRzW21hcnF1ZWVRdWFkcmFudF0ueDtcbiAgICAgICAgICAgIHRvcCArPSBvZmZzZXRzW21hcnF1ZWVRdWFkcmFudF0ueTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgfVxuICAgIGVuZFNlbGVjdGlvbihhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLnR5cGUgPT09ICdtb3VzZXVwJyB8fCBhcmdzLnR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxTZWxlY3Rpb24uY2hhbmdlcy5lbWl0KHRoaXMuY2VsbFNlbGVjdGlvbi5zZWxlY3RSYW5nZSh0aGlzLnByZXNzVGFyZ2V0LnJvd0luZGV4LCB0aGlzLnByZXNzVGFyZ2V0LmNvbHVtbi5sZWFmSW5kZXgsIGFyZ3Mucm93SW5kZXgsIGFyZ3MuY29sdW1uLmxlYWZJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNoYW5nZXMuZW1pdCh0aGlzLnNlbGVjdGlvbi5zZWxlY3RSYW5nZSh0aGlzLnByZXNzVGFyZ2V0LnJvd0luZGV4LCBhcmdzLnJvd0luZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgIH1cbiAgICBjbGVhbigpIHtcbiAgICAgICAgaWYgKHRoaXMubWFycXVlZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5tYXJxdWVlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLm1hcnF1ZWVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kcmFnRW5kU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbmRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdFbmRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXNzVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmVzc0FyZ3MgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uLmFjdGl2ZSA/IHRoaXMuY2VsbFNlbGVjdGlvbi5kcmFnZ2luZyA9IGZhbHNlIDogdGhpcy5zZWxlY3Rpb24uZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaW5pdE1hcnF1ZWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXJxdWVlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5tYXJxdWVlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5tYXJxdWVlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TWFycXVlZVF1YWRyYW50KHBvaW50ZXJYLCBwb2ludGVyWSwgc3RhcnRYLCBzdGFydFkpIHtcbiAgICAgICAgY29uc3QgbGVmdEhhbGYgPSBwb2ludGVyWCA8IHN0YXJ0WDtcbiAgICAgICAgY29uc3QgcmlnaHRIYWxmID0gcG9pbnRlclggPiBzdGFydFg7XG4gICAgICAgIGNvbnN0IHRvcEhhbGYgPSBwb2ludGVyWSA8IHN0YXJ0WTtcbiAgICAgICAgY29uc3QgYm90dG9tSGFsZiA9IHBvaW50ZXJZID4gc3RhcnRZO1xuICAgICAgICBpZiAobGVmdEhhbGYgJiYgdG9wSGFsZikge1xuICAgICAgICAgICAgcmV0dXJuICd0b3BMZWZ0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdEhhbGYgJiYgYm90dG9tSGFsZikge1xuICAgICAgICAgICAgcmV0dXJuICdib3R0b21MZWZ0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmlnaHRIYWxmICYmIHRvcEhhbGYpIHtcbiAgICAgICAgICAgIHJldHVybiAndG9wUmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaWdodEhhbGYgJiYgYm90dG9tSGFsZikge1xuICAgICAgICAgICAgcmV0dXJuICdib3R0b21SaWdodCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuR3JpZE1hcnF1ZWVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRTZWxlY3Rpb25NYXJxdWVlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuR3JpZE1hcnF1ZWVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEcmFnZ2FibGVEaXJlY3RpdmUgfSxcbiAgICB7IHR5cGU6IFNlbGVjdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENlbGxTZWxlY3Rpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEb21FdmVudHNTZXJ2aWNlIH1cbl07XG5HcmlkTWFycXVlZURpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB1c2VyU2VsZWN0aW9uOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS51c2VyLXNlbGVjdCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLi13ZWJraXQtdXNlci1zZWxlY3QnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBab25lQXdhcmVFdmVudEVtaXR0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG5nWm9uZSwgaXNBc3luYyA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKGlzQXN5bmMpO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICB9XG4gICAgc3Vic2NyaWJlKGdlbmVyYXRvck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIGxldCBzY2hlZHVsZXJGbjtcbiAgICAgICAgbGV0IGVycm9yRm4gPSAoXykgPT4gbnVsbDtcbiAgICAgICAgbGV0IGNvbXBsZXRlRm4gPSAoKSA9PiBudWxsO1xuICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0ICYmIHR5cGVvZiBnZW5lcmF0b3JPck5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzY2hlZHVsZXJGbiA9ICh2YWx1ZSkgPT4geyB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpKTsgfTtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvckZuID0gKGVycikgPT4geyB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycikpOyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlRm4gPSAoKSA9PiB7IHRoaXMubmdab25lLnJ1bigoKSA9PiBnZW5lcmF0b3JPck5leHQuY29tcGxldGUoKSk7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY2hlZHVsZXJGbiA9ICh2YWx1ZSkgPT4geyB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gZ2VuZXJhdG9yT3JOZXh0KHZhbHVlKSk7IH07XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvckZuID0gKGVycikgPT4geyB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gZXJyb3IoZXJyKSk7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUZuID0gKCkgPT4geyB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gY29tcGxldGUoKSk7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnN1YnNjcmliZShzY2hlZHVsZXJGbiwgZXJyb3JGbiwgY29tcGxldGVGbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbHVtbiBjZWxsIHRlbXBsYXRlIG9mIHRoZSBHcmlkIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyB0ZW1wbGF0ZXNfY29sdW1uc19ncmlkICV9I3RvYy1jZWxsLXRlbXBsYXRlKSkuXG4gKiBIZWxwcyB0byBjdXN0b21pemUgdGhlIGNvbnRlbnQgb2YgdGhlIGNlbGxzLiBUbyBkZWZpbmUgdGhlIGNlbGwgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZ1xuICogd2l0aCB0aGUgYGtlbmRvR3JpZENlbGxUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSBhIGA8a2VuZG8tZ3JpZC1jb2x1bW4+YCB0YWcuXG4gKlxuICogVGhlIHRlbXBsYXRlIGNvbnRleHQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGEgaXRlbSBhbmQgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgcGFzc2VkOlxuICogLSBgY29sdW1uSW5kZXhgJm1kYXNoO1RoZSBjdXJyZW50IGNvbHVtbiBpbmRleC4gVXNlIGl0IGFzIGFuIGFsaWFzIGZvciBhIHRlbXBsYXRlIHZhcmlhYmxlIGJ5IHV0aWxpemluZyB0aGUgYGxldC1jb2x1bW5JbmRleD1cImNvbHVtbkluZGV4XCJgIHN5bnRheC5cbiAqIC0gYHJvd0luZGV4YCZtZGFzaDtUaGUgY3VycmVudCBkYXRhIHJvdyBpbmRleC4gVXNlIGl0IGFzIGFuIGFsaWFzIGZvciBhIHRlbXBsYXRlIHZhcmlhYmxlIGJ5IHV0aWxpemluZyB0aGUgYGxldC1yb3dJbmRleD1cInJvd0luZGV4XCJgIHN5bnRheC5cbiAqIC0gYGRhdGFJdGVtYCZtZGFzaDtUaGUgY3VycmVudCBkYXRhIGl0ZW0uIFJlcHJlc2VudHMgdGhlIGRlZmF1bHQgY29udGV4dCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHRlbXBsYXRlIHZhcmlhYmxlIHdoaWNoIHV0aWxpemVzIHRoZSBgbGV0LXhgIHN5bnRheCZtZGFzaDtmb3IgZXhhbXBsZSwgYGxldC1kYXRhSXRlbWAuXG4gKiAtIGBjb2x1bW5gJm1kYXNoO1RoZSBjdXJyZW50IGNvbHVtbiBpbnN0YW5jZS4gVXNlIGl0IGFzIGFuIGFsaWFzIGZvciBhIHRlbXBsYXRlIHZhcmlhYmxlIGJ5IHV0aWxpemluZyB0aGUgYGxldC1jb2x1bW49XCJjb2x1bW5cImAgc3ludGF4LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiPlxuICogICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIj5cbiAqICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1kYXRhSXRlbSBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiPlxuICogICAgICAgICAgICAgICAgICAgICBEYXRhIFJvdyAjOiB7e3Jvd0luZGV4fX0gL1xuICogICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7ZGF0YUl0ZW0uUHJvZHVjdE5hbWV9fTwvc3Ryb25nPlxuICogICAgICAgICAgICAgICAgICAgICAoe3tkYXRhSXRlbS5EaXNjb250aW51ZWQgPyBcImRpc2NvbnRpbnVlZFwiIDogXCJhY3RpdmVcIn19KVxuICogICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyBncmlkRGF0YSA9IFt7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gKiAgICAgICB9LCB7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICogICAgICAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICogICAgICAgICBcIkRpc2NvbnRpbnVlZFwiOiB0cnVlXG4gKiAgICAgICB9XG4gKiAgICAgXTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ2VsbFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkQ2VsbFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ3JvdXAtaGVhZGVyIGNlbGwgdGVtcGxhdGUgb2YgdGhlIEdyaWQgd2hpY2ggaGVscHMgdG8gY3VzdG9taXplIHRoZSBjb250ZW50IG9mIHRoZSBncm91cCBoZWFkZXIgaXRlbS5cbiAqIFRvIGRlZmluZSB0aGUgZ3JvdXAgaGVhZGVyIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWcgd2l0aCB0aGUgYGtlbmRvR3JpZEdyb3VwSGVhZGVyVGVtcGxhdGVgXG4gKiBkaXJlY3RpdmUgaW5zaWRlIGA8a2VuZG8tZ3JpZC1jb2x1bW4+YC5cbiAqXG4gKiBUaGUgdGVtcGxhdGUgY29udGV4dCBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0YSBpdGVtIGFuZCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmllbGRzIGFyZSBwYXNzZWQ6XG4gKiAtIGBncm91cGAmbWRhc2g7VGhlIGN1cnJlbnQgZ3JvdXAgaXRlbS5cbiAqIC0gYGZpZWxkYCZtZGFzaDtUaGUgbmFtZSBvZiB0aGUgZmllbGQgYnkgd2hpY2ggZGF0YSBpcyBncm91cGVkLlxuICogLSBgdmFsdWVgJm1kYXNoO1RoZSBjdXJyZW50IGdyb3VwIHZhbHVlLlxuICogLSBgYWdncmVnYXRlc2AmbWRhc2g7QWxsIGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGdyb3VwLlxuICogLSBgaW5kZXhgJm1kYXNoO1RoZSBpbmRleCBvZiB0aGUgY3VycmVudCBncm91cC5cbiAqIC0gYGV4cGFuZGVkYCZtZGFzaDtBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgZ3JvdXAgaXMgY3VycmVudGx5IGV4cGFuZGVkLlxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBncm91cGFibGVfZ3JpZF93aXRoX2FnZ3JlZ2F0ZXMgJX0pKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb2Nlc3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiIFtncm91cF09XCJncm91cHNcIj5cbiAqICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCI+XG4gKiAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEdyb3VwSGVhZGVyVGVtcGxhdGUgbGV0LWdyb3VwIGxldC1maWVsZD1cImZpZWxkXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAqICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7ZmllbGR9fTwvc3Ryb25nPjoge3t2YWx1ZX19XG4gKiAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIGdyb3VwcyA9IFt7IGZpZWxkOiBcIlByb2R1Y3ROYW1lXCIgfV07XG4gKlxuICogICAgIHB1YmxpYyBncmlkRGF0YSA9IHByb2Nlc3MoW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdLCB7XG4gKiAgICAgIGdyb3VwOiB0aGlzLmdyb3Vwc1xuICogICAgIH0pO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBHcm91cEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEdyb3VwSGVhZGVyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Hcm91cEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ3JvdXAtaGVhZGVyIGNvbHVtbiB0ZW1wbGF0ZSBvZiB0aGUgR3JpZCB3aGljaCBoZWxwcyB0byBjdXN0b21pemUgdGhlIGNvbnRlbnQgb2YgdGhlIGdyb3VwIGhlYWRlcnMuXG4gKiBUbyBkZWZpbmUgdGhlIGdyb3VwIGhlYWRlciB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb0dyaWRHcm91cEhlYWRlckNvbHVtblRlbXBsYXRlYFxuICogZGlyZWN0aXZlIGluc2lkZSBgPGtlbmRvLWdyaWQtY29sdW1uPmAuIChbU2VlIGV4YW1wbGVdKHslIHNsdWcgZ3JvdXBhYmxlX2dyaWRfd2l0aF9hZ2dyZWdhdGVzICV9KSkuXG4gKlxuICogVGhlIHRlbXBsYXRlIGNvbnRleHQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGEgaXRlbSBhbmQgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgcGFzc2VkOlxuICogLSBgZ3JvdXBgJm1kYXNoO1RoZSBjdXJyZW50IGdyb3VwIGl0ZW0uXG4gKiAtIGBmaWVsZGAmbWRhc2g7VGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJ5IHdoaWNoIGRhdGEgaXMgZ3JvdXBlZC5cbiAqIC0gYHZhbHVlYCZtZGFzaDtUaGUgY3VycmVudCBncm91cCB2YWx1ZS5cbiAqIC0gYGFnZ3JlZ2F0ZXNgJm1kYXNoO0FsbCBhZ2dyZWdhdGUgdmFsdWVzIGZvciB0aGUgY3VycmVudCBncm91cC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCIgdGl0bGU9XCJQcm9kdWN0IE5hbWVcIj5cbiAqICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkR3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZSBsZXQtZ3JvdXA9XCJncm91cFwiIGxldC1hZ2dyZWdhdGVzPVwiYWdncmVnYXRlc1wiPlxuICogICAgICAgICA8c3BhbiB0aXRsZT1cIkdyb3VwIEhlYWRlciBDb2x1bW4gVGVtcGxhdGUgZm9yIFByb2R1Y3ROYW1lXCI+XG4gKiAgICAgICAgICAgICBDb3VudDoge3sgYWdncmVnYXRlcy5EaXNjb250aW51ZWQuY291bnQgfX1cbiAqICAgICAgICAgPC9zcGFuPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogYGBgXG4gKi9cbmNsYXNzIEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5Hcm91cEhlYWRlckNvbHVtblRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkR3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb2x1bW4gZWRpdC1jZWxsIHRlbXBsYXRlIG9mIHRoZSBHcmlkIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ190ZW1wbGF0ZV9mb3Jtc19ncmlkICV9KSkuXG4gKiBIZWxwcyB0byBjdXN0b21pemUgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRlZCBjZWxscy4gVG8gZGVmaW5lIHRoZSBjZWxsIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YFxuICogdGFnIHdpdGggdGhlIGBrZW5kb0dyaWRFZGl0VGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgYSBgPGtlbmRvLWdyaWQtY29sdW1uPmAgdGFnLlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogLSBgZm9ybUdyb3VwYCZtZGFzaDtUaGUgY3VycmVudCBbYEZvcm1Hcm91cGBdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ2Zvcm1ncm91cGFwaSddIH19KS5cbiAqIElmIHlvdSB1c2UgdGhlIEdyaWQgaW5zaWRlIFtUZW1wbGF0ZS1Ecml2ZW4gRm9ybXNdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ2Zvcm1zJ10gfX0pLCBpdCB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICogLSBgcm93SW5kZXhgJm1kYXNoO1RoZSBjdXJyZW50IGRhdGEgcm93IGluZGV4LiBJZiBpbnNpZGUgYSBuZXcgaXRlbSByb3csIGByb3dJbmRleGAgaXMgYC0xYC5cbiAqIC0gYGRhdGFJdGVtYCZtZGFzaDtUaGUgY3VycmVudCBkYXRhIGl0ZW0uXG4gKiAtIGBjb2x1bW5gJm1kYXNoO1RoZSBjdXJyZW50IGNvbHVtbiBpbnN0YW5jZS5cbiAqIC0gYGlzTmV3YCZtZGFzaDtUaGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaXRlbS5cbiAqL1xuY2xhc3MgRWRpdFRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuRWRpdFRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkRWRpdFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRWRpdFRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29sdW1uIGdyb3VwIGZvb3RlciBjZWxsIHRlbXBsYXRlIG9mIHRoZSBHcmlkIHdoaWNoIGhlbHBzIHRvIGN1c3RvbWl6ZSB0aGUgZ3JvdXAgZm9vdGVyIGNlbGwgZm9yIHRoZSBjb2x1bW4uXG4gKiBUbyBkZWZpbmUgdGhlIGdyb3VwIGZvb3RlciB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb0dyaWRHcm91cEZvb3RlclRlbXBsYXRlYCBkaXJlY3RpdmVcbiAqIGluc2lkZSBgPGtlbmRvLWdyaWQtY29sdW1uPmAuXG4gKlxuICogVGhlIHRlbXBsYXRlIGNvbnRleHQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGFnZ3JlZ2F0ZXMgYW5kIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmaWVsZHMgYXJlIHBhc3NlZDpcbiAqIC0gYGNvbHVtbmAmbWRhc2g7RGVmaW5lcyBhbiBpbnN0YW5jZSBvZiB0aGUgYENvbHVtbkNvbXBvbmVudGAgb3B0aW9uLlxuICogLSBgZmllbGRgJm1kYXNoO1RoZSBjdXJyZW50IGNvbHVtbiBmaWVsZCBuYW1lLlxuICogLSBgZ3JvdXBgJm1kYXNoO1RoZSBjdXJyZW50IGdyb3VwIGRhdGEgaXRlbS5cbiAqIC0gYGFnZ3JlZ2F0ZXNgJm1kYXNoO0FsbCBhZ2dyZWdhdGUgdmFsdWVzIGZvciB0aGUgY3VycmVudCBncm91cC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICogaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5JztcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImdyaWREYXRhXCIgW2dyb3VwXT1cImdyb3Vwc1wiPlxuICogICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIj5cbiAqICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkR3JvdXBGb290ZXJUZW1wbGF0ZSBsZXQtYWdncmVnYXRlcyBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICogICAgICAgICAgICAgICAgICAgIENvdW50OiB7e2FnZ3JlZ2F0ZXNbZmllbGRdLmNvdW50fX1cbiAqICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgICBwdWJsaWMgZ3JvdXBzID0gW3sgZmllbGQ6IFwiUHJvZHVjdE5hbWVcIiwgYWdncmVnYXRlczogW3sgZmllbGQ6IFwiUHJvZHVjdE5hbWVcIiwgYWdncmVnYXRlOiBcImNvdW50XCIgfV0gfV07XG4gKlxuICogICAgIHB1YmxpYyBncmlkRGF0YSA9IHByb2Nlc3MoW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdLCB7XG4gKiAgICAgIGdyb3VwOiB0aGlzLmdyb3Vwc1xuICogICAgIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIEdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5Hcm91cEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkR3JvdXBGb290ZXJUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb2x1bW4gaGVhZGVyIGNlbGwgdGVtcGxhdGUgb2YgdGhlIEdyaWRcbiAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyB0ZW1wbGF0ZXNfY29sdW1uc19ncmlkICV9I3RvYy1oZWFkZXItdGVtcGxhdGUpKS5cbiAqIEhlbHBzIHRvIGN1c3RvbWl6ZSB0aGUgdGFibGUgaGVhZGVyIGNlbGwgZm9yIHRoZSBjb2x1bW4uXG4gKiBUbyBkZWZpbmUgYSBoZWFkZXIgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZVxuICogW2BrZW5kb0dyaWRIZWFkZXJUZW1wbGF0ZWBdKHslIHNsdWcgYXBpX2dyaWRfaGVhZGVydGVtcGxhdGVkaXJlY3RpdmUgJX0pIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tZ3JpZC1jb2x1bW4+YCB0YWcuXG4gKlxuICogIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHNldCB0byB0aGUgY3VycmVudCBjb2x1bW4gYW5kIHRoZW4gdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgcGFzc2VkOlxuICogKiBgY29sdW1uYCZtZGFzaDtEZWZpbmVzIGFuIGluc3RhbmNlIG9mIHRoZSBbYENvbHVtbkNvbXBvbmVudGBdKHslIHNsdWcgYXBpX2dyaWRfY29sdW1uY29tcG9uZW50ICV9KSBvcHRpb24uXG4gKiAqIGBjb2x1bW5JbmRleGAmbWRhc2g7RGVmaW5lcyB0aGUgY3VycmVudCBjb2x1bW4gaW5kZXguXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImdyaWREYXRhXCI+XG4gKiAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiPlxuICogICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRIZWFkZXJUZW1wbGF0ZSBsZXQtY29sdW1uIGxldC1jb2x1bW5JbmRleD1cImNvbHVtbkluZGV4XCI+XG4gKiAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5maWVsZH19KHt7Y29sdW1uSW5kZXh9fSlcbiAqICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIj5cbiAqICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkSGVhZGVyVGVtcGxhdGUgbGV0LWNvbHVtbiBsZXQtY29sdW1uSW5kZXg9XCJjb2x1bW5JbmRleFwiPlxuICogICAgICAgICAgICAgICAgICAge3tjb2x1bW4uZmllbGR9fSh7e2NvbHVtbkluZGV4fX0pXG4gKiAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIGdyaWREYXRhID0gW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkSGVhZGVyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbHVtbiBmb290ZXIgY2VsbCB0ZW1wbGF0ZSBvZiB0aGUgR3JpZFxuICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlXSh7JSBzbHVnIHRlbXBsYXRlc19jb2x1bW5zX2dyaWQgJX0jdG9jLWZvb3Rlci10ZW1wbGF0ZSkpLlxuICogSGVscHMgdG8gY3VzdG9taXplIHRoZSB0YWJsZSBmb290ZXIgY2VsbCBmb3IgdGhlIGNvbHVtbi5cbiAqIFRvIGRlZmluZSBhIGZvb3RlciB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlXG4gKiBbYGtlbmRvR3JpZEZvb3RlclRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9mb290ZXJ0ZW1wbGF0ZWRpcmVjdGl2ZSAlfSkgZGlyZWN0aXZlIGluc2lkZSB0aGUgYDxrZW5kby1ncmlkLWNvbHVtbj5gIHRhZy5cbiAqXG4gKiBUaGUgdGVtcGxhdGUgY29udGV4dCBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmllbGRzIGFyZSBwYXNzZWQ6XG4gKiAqIGBjb2x1bW5gJm1kYXNoO0RlZmluZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFtgQ29sdW1uQ29tcG9uZW50YF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5jb21wb25lbnQgJX0pIG9wdGlvbi5cbiAqICogYGNvbHVtbkluZGV4YCZtZGFzaDtEZWZpbmVzIHRoZSBjdXJyZW50IGNvbHVtbiBpbmRleC5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZGlzcGxheSBhZ2dyZWdhdGVzIGluIHRoZSBmb290ZXIgb2YgdGhlIEdyaWQsXG4gKiByZWZlciB0byB0aGUgYXJ0aWNsZSBvbiBbYWdncmVnYXRlc10oeyUgc2x1ZyBncm91cGFibGVfZ3JpZF93aXRoX2FnZ3JlZ2F0ZXMgJX0pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiIHNjcm9sbGFibGU9XCJub25lXCI+XG4gKiAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiPlxuICogICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGb290ZXJUZW1wbGF0ZSBsZXQtY29sdW1uIGxldC1jb2x1bW5JbmRleD1cImNvbHVtbkluZGV4XCI+XG4gKiAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5maWVsZH19KHt7Y29sdW1uSW5kZXh9fSlcbiAqICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIj5cbiAqICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRm9vdGVyVGVtcGxhdGUgbGV0LWNvbHVtbiBsZXQtY29sdW1uSW5kZXg9XCJjb2x1bW5JbmRleFwiPlxuICogICAgICAgICAgICAgICAgICAge3tjb2x1bW4uZmllbGR9fSh7e2NvbHVtbkluZGV4fX0pXG4gKiAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIGdyaWREYXRhID0gW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkRm9vdGVyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4gbWVudSBpbiB0aGUgR3JpZC4gUHJvdmlkZXMgYW4gb3B0aW9uIGZvclxuICogY3VzdG9taXppbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBtZW51IGZvciBhbGwgb3IgZm9yIHNwZWNpZmljIGNvbHVtbnMuXG4gKiBUbyBkZWZpbmUgdGhlIGNvbnRlbnQgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZVxuICogYGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSB0aGUgYGtlbmRvLWdyaWRgIG9yIHRoZSBgPGtlbmRvLWdyaWQtY29sdW1uPmAgY29tcG9uZW50LlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IGlzIHBhc3NlcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogLSBgc2VydmljZWAmbWRhc2g7UmVwcmVzZW50cyB0aGUgW0NvbHVtbk1lbnVTZXJ2aWNlXSh7JSBzbHVnIGFwaV9ncmlkX2NvbHVtbm1lbnVzZXJ2aWNlICV9KS5cbiAqIC0gYGNvbHVtbmAmbWRhc2g7UmVwcmVzZW50cyB0aGUgR3JpZCBjb2x1bW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBba2VuZG9HcmlkQmluZGluZ109XCJkYXRhXCIgW3NvcnRhYmxlXT1cInRydWVcIiBbY29sdW1uTWVudV09XCJ0cnVlXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ29sdW1uTWVudVRlbXBsYXRlIGxldC1zZXJ2aWNlPVwic2VydmljZVwiPlxuICogICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtc29ydCBbc2VydmljZV09XCJzZXJ2aWNlXCI+XG4gKiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtc29ydD5cbiAqICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJGaWVsZDFcIiBbd2lkdGhdPVwiMTAwXCI+XG4gKiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZSBsZXQtc2VydmljZT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1sb2NrIFtzZXJ2aWNlXT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtbG9jaz5cbiAqICAgICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1zb3J0IFtzZXJ2aWNlXT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtc29ydD5cbiAqICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMlwiIFt3aWR0aF09XCIxMDBcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgcHVibGljIGRhdGE6IGFueVtdID0gW3sgRmllbGQxOiAnRm9vJywgRmllbGQyOiAnQmFyJyB9LCB7IEZpZWxkMTogJ0ZvbzEnLCBGaWVsZDI6ICdCYXIxJyB9XTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29sdW1uTWVudVRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuQ29sdW1uTWVudVRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkQ29sdW1uTWVudVRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ29sdW1uTWVudVRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1NwYW5Db2x1bW4gPSBjb2x1bW4gPT4gY29sdW1uLmlzU3BhbkNvbHVtbjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc0NoZWNrYm94Q29sdW1uID0gY29sdW1uID0+IGNvbHVtbi5pc0NoZWNrYm94Q29sdW1uO1xuY29uc3QgaXNDb2x1bW5Db250YWluZXIgPSBjb2x1bW4gPT4gY29sdW1uLmlzQ29sdW1uR3JvdXAgfHwgaXNTcGFuQ29sdW1uKGNvbHVtbik7XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciB0aGUgY29sdW1uIGNvbXBvbmVudHMgb2YgdGhlIEdyaWQuXG4gKi9cbmNsYXNzIENvbHVtbkJhc2UkMSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXRjaGVzTWVkaWEgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNvbHVtbiBpbmRleCBhZnRlciByZW9yZGVyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiA+IGBvcmRlckluZGV4YCBpcyBhIHJlYWQtb25seSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIGZpZWxkIGRvZXMgbm90IGFmZmVjdCBjb2x1bW4gb3JkZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yZGVySW5kZXggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0NvbHVtbkdyb3VwID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzU3BhbkNvbHVtbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyByZXNpemFibGUuXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzaXphYmxlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcmVvcmRlcmFibGUuXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVvcmRlcmFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHdpZHRoIChpbiBwaXhlbHMpIGJlbG93IHdoaWNoIHRoZSB1c2VyIGlzIG5vdCBhYmxlIHRvIHJlc2l6ZSB0aGUgY29sdW1uIGJ5IHVzaW5nIHRoZSBVSS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWluUmVzaXphYmxlV2lkdGggPSAxMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRvZ2dsZXMgdGhlIGxvY2tlZCAoZnJvemVuKSBzdGF0ZSBvZiB0aGUgY29sdW1ucyAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgbG9ja2VkX2NvbHVtbnNfZ3JpZCAlfSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICAgICAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgICAgICogICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICogICAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImdyaWREYXRhXCIgW3Njcm9sbGFibGVdPVwic2Nyb2xsYWJsZVwiIHN0eWxlPVwiaGVpZ2h0OiAyMDBweFwiPlxuICAgICAgICAgKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIlByb2R1Y3QgSURcIiB3aWR0aD1cIjEyMFwiIFtsb2NrZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAgICAgKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiIHRpdGxlPVwiUHJvZHVjdCBOYW1lXCIgd2lkdGg9XCIyMDBcIj5cbiAgICAgICAgICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgICAgICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCIgdGl0bGU9XCJVbml0IFByaWNlXCIgd2lkdGg9XCIyMzBcIj5cbiAgICAgICAgICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgICAgICogICAgICAgIDwva2VuZG8tZ3JpZD5cbiAgICAgICAgICogICAgYFxuICAgICAgICAgKiB9KVxuICAgICAgICAgKlxuICAgICAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAgICAgKiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueVtdO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBwcm9kdWN0cztcbiAgICAgICAgICogICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnN0IHByb2R1Y3RzID0gW3tcbiAgICAgICAgICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAgICAgICAgICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAgICAgICAgICogICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAgICAgICAgICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICAgICAgICAgKiAgfSwge1xuICAgICAgICAgKiAgICBcIlByb2R1Y3RJRFwiOiAyLFxuICAgICAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAgICAgICAgICogICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAgICAgICAgICogICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAgICAgICAgICogIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gY2FuIGJlIGxvY2tlZCBvciB1bmxvY2tlZCBmcm9tIHRoZSBjb2x1bW4gbWVudSBvciBieSByZW9yZGVyaW5nIHRoZSBjb2x1bW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2NrYWJsZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBtZW51IHdpbGwgYmUgc2hvd24gZm9yIHRoZSBjb2x1bW4uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbk1lbnUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY29sdW1uLWNob29zZXIgbGlzdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5jbHVkZUluQ2hvb3NlciA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhlYWRlclRlbXBsYXRlcyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTWVudVRlbXBsYXRlcyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgaWYgKHBhcmVudCAmJiAhaXNDb2x1bW5Db250YWluZXIocGFyZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW5zIGNhbiBiZSBuZXN0ZWQgb25seSBpbnNpZGUgQ29sdW1uR3JvdXBDb21wb25lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGNvbHVtbiAoaW4gcGl4ZWxzKS5cbiAgICAgKi9cbiAgICBzZXQgd2lkdGgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fd2lkdGggPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cbiAgICBnZXQgd2lkdGgoKSB7IHJldHVybiB0aGlzLl93aWR0aDsgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAmJiBpc1NwYW5Db2x1bW4odGhpcy5wYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQubGV2ZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQubGV2ZWwgKyAxIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpc0xvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuaXNMb2NrZWQgOiB0aGlzLmxvY2tlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBjb2xzcGFuKCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJvd3NwYW4odG90YWxDb2x1bW5MZXZlbHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWwgPCB0b3RhbENvbHVtbkxldmVscyA/ICh0b3RhbENvbHVtbkxldmVscyAtIHRoaXMubGV2ZWwpICsgMSA6IDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaGVhZGVyVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZXMuZmlyc3Q7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZSA/IHRlbXBsYXRlLnRlbXBsYXRlUmVmIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGZvb3RlclRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb290ZXJUZW1wbGF0ZSA/IHRoaXMuZm9vdGVyVGVtcGxhdGUudGVtcGxhdGVSZWYgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY29sdW1uTWVudVRlbXBsYXRlUmVmKCkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY29sdW1uTWVudVRlbXBsYXRlcy5maXJzdDtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlID8gdGVtcGxhdGUudGVtcGxhdGVSZWYgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGRpc3BsYXlUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaXNWaXNpYmxlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGlkZGVuICYmIHRoaXMubWF0Y2hlc01lZGlhO1xuICAgIH1cbn1cbkNvbHVtbkJhc2UkMS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICByZXNpemFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJlb3JkZXJhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW5SZXNpemFibGVXaWR0aDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHdpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhdXRvU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9ja2VkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBoaWRkZW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1lZGlhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb2NrYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uTWVudTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW5jbHVkZUluQ2hvb3NlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3R5bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhlYWRlclN0eWxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb290ZXJTdHlsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY3NzQ2xhc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2NsYXNzJyxdIH1dLFxuICAgIGhlYWRlckNsYXNzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb290ZXJDbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVhZGVyVGVtcGxhdGVzOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UgfSxdIH1dLFxuICAgIGZvb3RlclRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGNvbHVtbk1lbnVUZW1wbGF0ZXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NvbHVtbk1lbnVUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGZpbHRlci1jZWxsIHRlbXBsYXRlIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgYnVpbHRpbmZpbHRlcnRlbXBsYXRlX2dyaWQgJX0jdG9jLWN1c3RvbWl6aW5nLWZpbHRlci1yb3dzKSkuXG4gKi9cbmNsYXNzIEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGZpbHRlci1tZW51IHRlbXBsYXRlXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1jdXN0b21pemluZy1maWx0ZXItbWVudXMpKS5cbiAqL1xuY2xhc3MgRmlsdGVyTWVudVRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuRmlsdGVyTWVudVRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkRmlsdGVyTWVudVRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRmlsdGVyTWVudVRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBpc0NvbHVtbkNvbXBvbmVudChjb2x1bW4pIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KGNvbHVtbi5maWVsZCk7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbHVtbnMgb2YgdGhlIFtBbmd1bGFyIERhdGEgR3JpZF0oeyUgc2x1ZyBvdmVydmlld19ncmlkICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZ3JpZERhdGFcIj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3RJRFwiIHRpdGxlPVwiUHJvZHVjdCBJRFwiIHdpZHRoPVwiMTIwXCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIiB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlVuaXRQcmljZVwiIHRpdGxlPVwiVW5pdCBQcmljZVwiIHdpZHRoPVwiMjMwXCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRGlzY29udGludWVkXCIgd2lkdGg9XCIxMjBcIj5cbiAqICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1kYXRhSXRlbT5cbiAqICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImRhdGFJdGVtLkRpc2NvbnRpbnVlZFwiIGRpc2FibGVkLz5cbiAqICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueVtdO1xuICpcbiAqICAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBwcm9kdWN0cztcbiAqICAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwcm9kdWN0cyA9IFt7XG4gKiAgICBcIlByb2R1Y3RJRFwiOiAxLFxuICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICBcIkRpc2NvbnRpbnVlZFwiOiB0cnVlXG4gKiAgfSwge1xuICogICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICogICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAqICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gKiAgfVxuICogXTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29sdW1uQ29tcG9uZW50IGV4dGVuZHMgQ29sdW1uQmFzZSQxIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYmUgY2xpY2tlZCBhbmQgdGhlIGBzb3J0Q2hhbmdlYCBldmVudCBlbWl0dGVkLlxuICAgICAgICAgKiBZb3UgaGF2ZSB0byBoYW5kbGUgdGhlIGBzb3J0Q2hhbmdlYCBldmVudCB5b3Vyc2VsZiBhbmQgc29ydCB0aGUgZGF0YS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc29ydGFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29sdW1uIGNhbiBiZSBkcmFnZ2VkIHRvIHRoZSBncm91cCBwYW5lbC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgeW91IGNhbiBncm91cCB0aGUgY29sdW1ucyBieSB0aGUgY29sdW1uIGZpZWxkIGJ5IHVzaW5nIHRoZSBBUEkgb2YgdGhlIEdyaWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdyb3VwYWJsZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBlZGl0b3IgdHlwZSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfcmVhY3RpdmVfZm9ybXNfZ3JpZCAlfSN0b2Mtc2V0dXApKS5cbiAgICAgICAgICogVXNlZCB3aGVuIHRoZSBjb2x1bW4gZW50ZXJzIHRoZSBlZGl0IG1vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0ZXh0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgaHRtbC1uby1ydW5cbiAgICAgICAgICogPGtlbmRvLWdyaWQ+XG4gICAgICAgICAqICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlVuaXRQcmljZVwiIGVkaXRvcj1cIm51bWVyaWNcIj5cbiAgICAgICAgICogICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgICAgICogPC9rZW5kby1ncmlkPlxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZWRpdG9yID0gJ3RleHQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgZmlsdGVyIHR5cGUgdGhhdCBpcyBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBmaWx0ZXIgcm93LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdGV4dGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYGh0bWwtbm8tcnVuXG4gICAgICAgICAqIDxrZW5kby1ncmlkPlxuICAgICAgICAgKiAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiBmaWx0ZXI9XCJudW1lcmljXCI+XG4gICAgICAgICAqICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gICAgICAgICAqIDwva2VuZG8tZ3JpZD5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlciA9ICd0ZXh0JztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgaWYgYSBmaWx0ZXIgVUkgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMgY29sdW1uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYGh0bWwtbm8tcnVuXG4gICAgICAgICAqIDxrZW5kby1ncmlkPlxuICAgICAgICAgKiAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiBbZmlsdGVyYWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgKiAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAgICAgKiA8L2tlbmRvLWdyaWQ+XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgd2hldGhlciB0aGUgY29sdW1uIGlzIGVkaXRhYmxlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGBgYGh0bWwtbm8tcnVuXG4gICAgICAgICAqIDxrZW5kby1ncmlkPlxuICAgICAgICAgKiAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiBbZWRpdGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICogICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgICAgICogPC9rZW5kby1ncmlkPlxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZWRpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlID8gdGhpcy50ZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGdyb3VwSGVhZGVyVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGUgPyB0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGUudGVtcGxhdGVSZWYgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBncm91cEhlYWRlckNvbHVtblRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlID8gdGhpcy5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlLnRlbXBsYXRlUmVmIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgZ3JvdXBGb290ZXJUZW1wbGF0ZVJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBGb290ZXJUZW1wbGF0ZSA/IHRoaXMuZ3JvdXBGb290ZXJUZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGVkaXRUZW1wbGF0ZVJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFRlbXBsYXRlID8gdGhpcy5lZGl0VGVtcGxhdGUudGVtcGxhdGVSZWYgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBmaWx0ZXJDZWxsVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZSA/IHRoaXMuZmlsdGVyQ2VsbFRlbXBsYXRlLnRlbXBsYXRlUmVmIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgZmlsdGVyTWVudVRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJNZW51VGVtcGxhdGUgPyB0aGlzLmZpbHRlck1lbnVUZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGRpc3BsYXlUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGUgPT09IHVuZGVmaW5lZCA/IHRoaXMuZmllbGQgOiB0aGlzLnRpdGxlO1xuICAgIH1cbn1cbkNvbHVtbkNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDb2x1bW5CYXNlJDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2x1bW5Db21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1jb2x1bW4nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db2x1bW5Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBDb2x1bW5CYXNlJDEsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNraXBTZWxmIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5Db2x1bW5Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmllbGQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcm1hdDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydGFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGdyb3VwYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZWRpdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGVkaXRhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0ZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgZ3JvdXBIZWFkZXJUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbR3JvdXBIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0dyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBncm91cEZvb3RlclRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtHcm91cEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgZWRpdFRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBmaWx0ZXJDZWxsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0ZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGZpbHRlck1lbnVUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbRmlsdGVyTWVudVRlbXBsYXRlRGlyZWN0aXZlLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBpc1NwYW5Db2x1bW5Db21wb25lbnQoY29sdW1uKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5pc1NwYW5Db2x1bW47XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2x1bW4gd2hpY2ggY2FuIGJlIHNwYW5uZWQgb3ZlciBtdWx0aXBsZSBkYXRhIGNlbGxzIHdoaWxlIHRoZSBpbmRpdmlkdWFsXG4gKiBoZWFkZXIgYW5kIGZvb3RlciBjZWxscyBhcmUgcmV0YWluZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzcGFubmVkX2NvbHVtbnNfZ3JpZCAlfSkpLlxuICogRW5hYmxlcyB5b3UgdG8gYWNoaWV2ZSBtb3JlIGZsZXhpYmxlIGxheW91dCB3aGlsZSBrZWVwaW5nIHRoZSBidWlsdC1pbiBVSSBlbGVtZW50IGZvclxuICogW3NvcnRpbmddKHslIHNsdWcgc29ydGluZ19ncmlkICV9KSwgW2ZpbHRlcmluZ10oeyUgc2x1ZyBmaWx0ZXJpbmdfZ3JpZCAlfSksIGFuZFxuICogW2dyb3VwaW5nXSh7JSBzbHVnIGdyb3VwaW5nYmFzaWNzX2dyaWQgJX0pLiBXcmFwIHRoZSBjb2x1bW5zIHRoYXQgd2lsbCBiZVxuICogbWVyZ2VkIGluc2lkZSB0aGUgYDxrZW5kby1ncmlkLXNwYW4tY29sdW1uPmAgdGFnLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tZ3JpZFxuICogICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJ0cnVlXCJcbiAqICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJ0cnVlXCJcbiAqICAgICAgICAgICAgICBba2VuZG9HcmlkQmluZGluZ109XCJwcm9kdWN0c1wiPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdElEXCIgdGl0bGU9XCJQcm9kdWN0IElEXCIgd2lkdGg9XCIxMjBcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1zcGFuLWNvbHVtbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiIHRpdGxlPVwiUHJvZHVjdCBOYW1lXCI+XG4gKiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiB0aXRsZT1cIlVuaXQgUHJpY2VcIiBmaWx0ZXI9XCJudW1lcmljXCIgd2lkdGg9XCIxODBcIiBmb3JtYXQ9XCJ7MDpjfVwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtc3Bhbi1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJEaXNjb250aW51ZWRcIiB3aWR0aD1cIjEyMFwiIGZpbHRlcj1cImJvb2xlYW5cIj5cbiAqICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1kYXRhSXRlbT5cbiAqICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImRhdGFJdGVtLkRpc2NvbnRpbnVlZFwiIGRpc2FibGVkLz5cbiAqICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgIHB1YmxpYyBwcm9kdWN0cyA9IFt7XG4gKiAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgIH0sIHtcbiAqICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gKiAgICB9XG4gKiAgIF07XG4gKiB9XG4gKlxuICogYGBgXG4gKlxuICogQnkgZGVmYXVsdCwgdGhlIGRhdGEgY2VsbCBkaXNwbGF5cyB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuIFRvIGZ1cnRoZXIgY3VzdG9taXplXG4gKiB0aGUgc3Bhbi1jb2x1bW4gZnVuY3Rpb25hbGl0eSwgdXNlIGEgW2NlbGwgdGVtcGxhdGVdKHslIHNsdWcgYXBpX2dyaWRfY2VsbHRlbXBsYXRlZGlyZWN0aXZlICV9KS5cbiAqXG4gKiBgYGBodG1sLW5vLXJ1blxuICogPGtlbmRvLWdyaWQtc3Bhbi1jb2x1bW4+XG4gKiAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiZmllbGQxXCIgdGl0bGU9XCJGaWVsZCAxXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJmaWVsZDJcIiB0aXRsZT1cIkZpZWxkIDJcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XG4gKiAgICAgICAgPGg1Pnt7IGRhdGFJdGVtLmZpZWxkMSB9fTwvaDU+XG4gKiAgICAgICAgPHA+e3sgZGF0YUl0ZW0uZmllbGQyIH19PC9wPlxuICogICAgPC9uZy10ZW1wbGF0ZT5cbiAqICA8L2tlbmRvLWdyaWQtc3Bhbi1jb2x1bW4+XG4gKiBgYGBcbiAqL1xuY2xhc3MgU3BhbkNvbHVtbkNvbXBvbmVudCBleHRlbmRzIENvbHVtbkJhc2UkMSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTcGFuQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy5lZGl0VGVtcGxhdGUgPSBuZXcgUXVlcnlMaXN0KCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoaWxkQ29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5jbHVkZUluQ2hvb3NlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lZGl0YWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5pc1NwYW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3BhbkNvbHVtbiBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIFNwYW5Db2x1bW4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGVkaXQgdGVtcGxhdGUgb2YgdGhlIGNvbHVtbiB3aWxsIGJlIHJlbmRlcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogPiBUbyBlbmFibGUgdGhlIGVkaXRpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBzcGFubmVkIGNvbHVtbiwgc2V0IGFuIGVkaXQgdGVtcGxhdGUgZm9yIGl0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sLW5vLXJ1blxuICAgICAqIDxrZW5kby1ncmlkPlxuICAgICAqICAgIDxrZW5kby1ncmlkLXNwYW4tY29sdW1uIFtlZGl0YWJsZV09XCJmYWxzZVwiPlxuICAgICAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCI+XG4gICAgICogICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIj5cbiAgICAgKiAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gICAgICogICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRWRpdFRlbXBsYXRlPlxuICAgICAqICAgICAgICAgLi4uLi5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogICAgPC9rZW5kby1ncmlkLXNwYW4tY29sdW1uPlxuICAgICAqIDwva2VuZG8tZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXQgZWRpdGFibGUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZWRpdGFibGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuZWRpdFRlbXBsYXRlUmVmKSAmJiB0aGlzLl9lZGl0YWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIGFkZGVkIGZvciBiYWNrd2FyZHMgY29tcGl0YWJpbGl0eVxuICAgICAqL1xuICAgIHNldCB3aWR0aChfdmFsdWUpIHtcbiAgICB9XG4gICAgZ2V0IHdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZENvbHVtbnMucmVkdWNlKCh0b3RhbCwgY29sdW1uKSA9PiB0b3RhbCArIGNvbHVtbi53aWR0aCwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgbGVhZkluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZENvbHVtbnMuZmlyc3QubGVhZkluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHRlbXBsYXRlUmVmKCkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUuZmlyc3Q7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZSA/IHRlbXBsYXRlLnRlbXBsYXRlUmVmIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGVkaXRUZW1wbGF0ZVJlZigpIHtcbiAgICAgICAgY29uc3QgZWRpdFRlbXBsYXRlID0gdGhpcy5lZGl0VGVtcGxhdGUuZmlyc3Q7XG4gICAgICAgIHJldHVybiBlZGl0VGVtcGxhdGUgPyBlZGl0VGVtcGxhdGUudGVtcGxhdGVSZWYgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY29sc3BhbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRDb2x1bW5zLmZpbHRlcihjID0+IGMuaXNWaXNpYmxlKS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGxvY2tlZCAoZnJvemVuKSBzdGF0ZSBvZiB0aGUgY29sdW1ucy4gTG9ja2VkIGNvbHVtbnMgYXJlIHZpc2libGVcbiAgICAgKiBhdCBhbGwgdGltZXMgZHVyaW5nIHRoZSBob3Jpem9udGFsIHNjcm9sbGluZyBvZiB0aGUgR3JpZC5cbiAgICAgKlxuICAgICAqIEZvciB0aGUgb3B0aW9uIHRvIHdvcmsgcHJvcGVybHksIG1ha2Ugc3VyZSB0aGF0OlxuICAgICAqIC0gU2Nyb2xsaW5nIGlzIGVuYWJsZWQuXG4gICAgICogLSBUaGUgYGhlaWdodGAgb3B0aW9uIG9mIHRoZSBHcmlkIGlzIHNldC5cbiAgICAgKiAtIFRoZSB3aWR0aHMgb2YgYWxsIEdyaWQgY29sdW1ucyBhcmUgZXhwbGljaXRseSBzZXQgaW4gcGl4ZWxzLiBJbiB0aGlzIHdheSxcbiAgICAgKiB0aGUgR3JpZCBhZGp1c3RzIHRoZSBsYXlvdXQgb2YgdGhlIGxvY2tlZCBhbmQgdW5sb2NrZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAqICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIiBzdHlsZT1cImhlaWdodDogMjAwcHhcIj5cbiAgICAgKiAgICAgICAgICA8a2VuZG8tZ3JpZC1zcGFuLWNvbHVtbiBbbG9ja2VkXT1cInRydWVcIj5cbiAgICAgKiAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIlByb2R1Y3QgSURcIiB3aWR0aD1cIjEyMFwiPlxuICAgICAqICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gICAgICogICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIiB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiIHdpZHRoPVwiMjAwXCI+XG4gICAgICogICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgKiAgICAgICAgICA8L2tlbmRvLWdyaWQtc3Bhbi1jb2x1bW4+XG4gICAgICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCIgdGl0bGU9XCJVbml0IFByaWNlXCIgd2lkdGg9XCIyMzBcIj5cbiAgICAgKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gICAgICogICAgYFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgIHB1YmxpYyBncmlkRGF0YTogYW55W107XG4gICAgICpcbiAgICAgKiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgKiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2R1Y3RzO1xuICAgICAqICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBwcm9kdWN0cyA9IFt7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhaVwiLFxuICAgICAqICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gICAgICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICAgICAqICB9LCB7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMixcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAgICAgKiAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICAgICAqICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gICAgICogIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGxvY2tlZCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9sb2NrZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2tlZCB8fCB0aGlzLmNoaWxkQ29sdW1ucy5zb21lKGMgPT4gYy5sb2NrZWQpO1xuICAgIH1cbiAgICBnZXQgY2hpbGRyZW5BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRDb2x1bW5zLnRvQXJyYXkoKTtcbiAgICB9XG4gICAgZ2V0IGhhc0NoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZENvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG59XG5TcGFuQ29sdW1uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IENvbHVtbkJhc2UkMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNwYW5Db2x1bW5Db21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1zcGFuLWNvbHVtbicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblNwYW5Db2x1bW5Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBDb2x1bW5CYXNlJDEsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNraXBTZWxmIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5TcGFuQ29sdW1uQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlIH0sXSB9XSxcbiAgICBlZGl0VGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UgfSxdIH1dLFxuICAgIGNoaWxkQ29sdW1uczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbQ29sdW1uQ29tcG9uZW50LF0gfV0sXG4gICAgZWRpdGFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvY2tlZDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBleHBhbmRDb2x1bW5zID0gKGNvbHVtbnMpID0+IChjb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IGFjYy5jb25jYXQoaXNTcGFuQ29sdW1uQ29tcG9uZW50KGNvbHVtbikgPyBjb2x1bW4uY2hpbGRyZW5BcnJheSA6IFtjb2x1bW5dKSwgW10pIC8vIHRzbGludDpkaXNhYmxlLWxpbmU6YWxpZ25cbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZXhwYW5kQ29sdW1uc1dpdGhTcGFuID0gKGNvbHVtbnMpID0+IChjb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IGFjYy5jb25jYXQoaXNTcGFuQ29sdW1uQ29tcG9uZW50KGNvbHVtbikgP1xuICAgIFtjb2x1bW5dLmNvbmNhdChjb2x1bW4uY2hpbGRyZW5BcnJheSkgOlxuICAgIFtjb2x1bW5dKSwgW10pIC8vIHRzbGludDpkaXNhYmxlLWxpbmU6YWxpZ25cbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY29sdW1uc1RvUmVuZGVyID0gKGNvbHVtbnMpID0+IChleHBhbmRDb2x1bW5zKGNvbHVtbnMpLmZpbHRlcih4ID0+IHguaXNWaXNpYmxlKSk7XG5jb25zdCBzdW1Qcm9wID0gKHByb3ApID0+IChhcnJheSkgPT4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyAoY3Vycltwcm9wXSB8fCAwKSwgMCk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgc3VtQ29sdW1uV2lkdGhzID0gc3VtUHJvcCgnd2lkdGgnKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjb2x1bW5zU3BhbiA9IHN1bVByb3AoJ2NvbHNwYW4nKTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbmNvbnN0IHZhbGlkRmllbGQgPSBuZXcgUmVnRXhwKGBeWyRBLVpcXF9hLXpdWyRBLVpcXF9hLXowLTlcXFxcLl0qJGApO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzVmFsaWRGaWVsZE5hbWUgPSAoZmllbGROYW1lKSA9PiAhaXNOdWxsT3JFbXB0eVN0cmluZyhmaWVsZE5hbWUpICYmIHZhbGlkRmllbGQudGVzdChmaWVsZE5hbWUpICYmXG4gICAgZmllbGROYW1lWzBdICE9PSBcIi5cIiAmJiBmaWVsZE5hbWVbZmllbGROYW1lLmxlbmd0aCAtIDFdICE9PSBcIi5cIjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjaGlsZHJlbiA9IGNvbHVtbiA9PiBjb2x1bW4uY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+IGNoaWxkICE9PSBjb2x1bW4pO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGxlYWZDb2x1bW5zID0gY29sdW1ucyA9PiB7XG4gICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgIGFjYyA9IGFjYy5jb25jYXQobGVhZkNvbHVtbnMoY2hpbGRyZW4oY29sdW1uKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbi5pc1NwYW5Db2x1bW4pIHtcbiAgICAgICAgICAgIGFjYyA9IGFjYy5jb25jYXQoY29sdW1uLmNoaWxkcmVuQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKS5maWx0ZXIoeCA9PiB4LmlzVmlzaWJsZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6YWxpZ25cbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgc29tZUxlYWZDb2x1bW4gPSAoY2FsbGJhY2ssIC4uLmNvbHVtbnMpID0+IGxlYWZDb2x1bW5zKGNvbHVtbnMpLnNvbWUoY2FsbGJhY2spO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHJlc2l6YWJsZUNvbHVtbnMgPSBjb2x1bW5zID0+IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBpc1RydXRoeShjb2x1bW4ucmVzaXphYmxlKSAmJiBjb2x1bW4uaXNWaXNpYmxlKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBzb3J0Q29sdW1ucyA9IChjb2x1bW5zKSA9PiBvcmRlckJ5KGNvbHVtbnMsIFt7IGZpZWxkOiAnb3JkZXJJbmRleCcsIGRpcjogJ2FzYycgfV0pO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzSW5TcGFuQ29sdW1uID0gKGNvbHVtbikgPT4gaXNUcnV0aHkoY29sdW1uLnBhcmVudCkgJiYgaXNTcGFuQ29sdW1uQ29tcG9uZW50KGNvbHVtbi5wYXJlbnQpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gaXNDb2x1bW5Hcm91cENvbXBvbmVudChjb2x1bW4pIHtcbiAgICByZXR1cm4gY29sdW1uLmlzQ29sdW1uR3JvdXA7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbHVtbiBncm91cCBoZWFkZXIgb2YgdGhlIEdyaWRcbiAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXNdKHslIHNsdWcgbXVsdGljb2x1bW5oZWFkZXJzX2NvbHVtbnNfZ3JpZCAlfSkpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiPlxuICogICAgICAgPGtlbmRvLWdyaWQtY29sdW1uLWdyb3VwIHRpdGxlPVwiUHJvZHVjdCBJbmZvXCI+XG4gKiAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRIZWFkZXJUZW1wbGF0ZSBsZXQtY29sdW1uSW5kZXg9XCJjb2x1bW5JbmRleFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAqICAgICAgICAgICAgICAgQ29sdW1uIGluZGV4OiB7e2NvbHVtbkluZGV4fX0gLyBjb2x1bW4gdGl0bGU6IHt7Y29sdW1uLnRpdGxlfX1cbiAqICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdElEXCIgdGl0bGU9XCJQcm9kdWN0IElEXCIgd2lkdGg9XCIxMjBcIj5cbiAqICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIiB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiPlxuICogICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbi1ncm91cD5cbiAqICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlVuaXRQcmljZVwiIHRpdGxlPVwiVW5pdCBQcmljZVwiIHdpZHRoPVwiMjMwXCI+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRGlzY29udGludWVkXCIgd2lkdGg9XCIxMjBcIj5cbiAqICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1kYXRhSXRlbT5cbiAqICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImRhdGFJdGVtLkRpc2NvbnRpbnVlZFwiIGRpc2FibGVkLz5cbiAqICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueVtdO1xuICpcbiAqICAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBwcm9kdWN0cztcbiAqICAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwcm9kdWN0cyA9IFt7XG4gKiAgICBcIlByb2R1Y3RJRFwiOiAxLFxuICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICBcIkRpc2NvbnRpbnVlZFwiOiB0cnVlXG4gKiAgfSwge1xuICogICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICogICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAqICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gKiAgfVxuICogXTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29sdW1uR3JvdXBDb21wb25lbnQgZXh0ZW5kcyBDb2x1bW5CYXNlJDEge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgICBzdXBlcihwYXJlbnQpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5jbHVkZUluQ2hvb3NlciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0NvbHVtbkdyb3VwID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWluUmVzaXphYmxlV2lkdGggPSAxMDtcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuaXNTcGFuQ29sdW1uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbkdyb3VwQ29tcG9uZW50IGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIFNwYW5Db2x1bW5Db21wb25lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcm93c3BhbigpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY29sc3BhbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uc1NwYW4odGhpcy5jaGlsZHJlblxuICAgICAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZCAhPT0gdGhpcyAmJiBjaGlsZC5pc1Zpc2libGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBsZWFmSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuID8gKHRoaXMuZmlyc3RDaGlsZCB8fCB7fSkubGVhZkluZGV4IDogLTE7XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbkFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maWx0ZXIoYyA9PiBjICE9PSB0aGlzKTtcbiAgICB9XG4gICAgZ2V0IGhhc0NoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZmluZChjb2x1bW4gPT4gY29sdW1uICE9PSB0aGlzKTtcbiAgICB9XG59XG5Db2x1bW5Hcm91cENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDb2x1bW5CYXNlJDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2x1bW5Hcm91cENvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWNvbHVtbi1ncm91cCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNvbHVtbkdyb3VwQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQ29sdW1uQmFzZSQxLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuQ29sdW1uR3JvdXBDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2hpbGRyZW46IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NvbHVtbkJhc2UkMSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGRldGFpbCB0ZW1wbGF0ZSBvZiB0aGUgR3JpZCAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzXSh7JSBzbHVnIGRldGFpbHJvd3RlbXBsYXRlX2dyaWQgJX0pKS5cbiAqIFRvIGRlZmluZSB0aGUgZGV0YWlsIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWcgd2l0aCB0aGUgYGtlbmRvR3JpZERldGFpbFRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIGEgYDxrZW5kby1ncmlkPmAgdGFnLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZFxuICogICAgICAgICBbZGF0YV09XCJkYXRhXCJcbiAqICAgICAgICAgc2VsZWN0YWJsZT1cInRydWVcIlxuICogICAgICAgICBzdHlsZT1cImhlaWdodDogMTYwcHhcIlxuICogICAgICAgICA+XG4gKiAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3RJRFwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZERldGFpbFRlbXBsYXRlIGxldC1kYXRhSXRlbT5cbiAqICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YUl0ZW0uQ2F0ZWdvcnlcIj5cbiAqICAgICAgICAgICAgIDxoZWFkZXI+e3tkYXRhSXRlbS5DYXRlZ29yeT8uQ2F0ZWdvcnlOYW1lfX08L2hlYWRlcj5cbiAqICAgICAgICAgICAgIDxzcGFuPnt7ZGF0YUl0ZW0uQ2F0ZWdvcnk/LkRlc2NyaXB0aW9ufX08L3NwYW4+XG4gKiAgICAgICAgICAgPC9kaXY+XG4gKiAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgICBwdWJsaWMgZGF0YSA9IFt7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlLFxuICogICAgICAgICBcIkNhdGVnb3J5XCI6IHtcbiAqICAgICAgICAgICAgIFwiQ2F0ZWdvcnlJRFwiOiAxLFxuICogICAgICAgICAgICAgXCJDYXRlZ29yeU5hbWVcIjogXCJCZXZlcmFnZXNcIixcbiAqICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJTb2Z0IGRyaW5rcywgY29mZmVlcywgdGVhcywgYmVlcnMsIGFuZCBhbGVzXCJcbiAqICAgICAgICAgfVxuICogICAgICAgfSwge1xuICogICAgICAgICBcIlByb2R1Y3RJRFwiOiAyLFxuICogICAgICAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2UsXG4gKiAgICAgICAgIFwiQ2F0ZWdvcnlcIjoge1xuICogICAgICAgICAgICAgXCJDYXRlZ29yeUlEXCI6IDEsXG4gKiAgICAgICAgICAgICBcIkNhdGVnb3J5TmFtZVwiOiBcIkJldmVyYWdlc1wiLFxuICogICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIlNvZnQgZHJpbmtzLCBjb2ZmZWVzLCB0ZWFzLCBiZWVycywgYW5kIGFsZXNcIlxuICogICAgICAgICB9XG4gKiAgICAgICB9LCB7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDMsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJBbmlzZWVkIFN5cnVwXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDEwLjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlLFxuICogICAgICAgICBcIkNhdGVnb3J5XCI6IHtcbiAqICAgICAgICAgICAgIFwiQ2F0ZWdvcnlJRFwiOiAyLFxuICogICAgICAgICAgICAgXCJDYXRlZ29yeU5hbWVcIjogXCJDb25kaW1lbnRzXCIsXG4gKiAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiU3dlZXQgYW5kIHNhdm9yeSBzYXVjZXMsIHJlbGlzaGVzLCBzcHJlYWRzLCBhbmQgc2Vhc29uaW5nc1wiXG4gKiAgICAgICAgIH1cbiAqICAgICB9XTtcbiAqXG4gKiB9XG4gKlxuICogYGBgXG4gKlxuICovXG5jbGFzcyBEZXRhaWxUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgICAgICB0aGlzLl9jb25kaXRpb24gPSAoKSA9PiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIGdpdmVuIGRldGFpbCByb3cgYW5kIHRoZSBhc3NvY2lhdGVkICoqRXhwYW5kKiogb3IgKipDb2xsYXBzZSoqIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBzZXQgc2hvd0lmKGZuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2hvd0lmIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoZm4pfS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25kaXRpb24gPSBmbjtcbiAgICB9XG4gICAgZ2V0IHNob3dJZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmRpdGlvbjtcbiAgICB9XG59XG5EZXRhaWxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZERldGFpbFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGV0YWlsVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcbkRldGFpbFRlbXBsYXRlRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHNob3dJZjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFtcImtlbmRvR3JpZERldGFpbFRlbXBsYXRlU2hvd0lmXCIsXSB9XVxufTtcblxuY29uc3QgY2FuQ3JlYXRlRWxlbWVudCA9ICgpID0+IGlzRG9jdW1lbnRBdmFpbGFibGUoKSAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50O1xubGV0IGNhY2hlZFNjcm9sbGJhcldpZHRoID0gbnVsbDtcbmxldCBjYWNoZWRQaXhlbFJhdGlvO1xubGV0IGNhY2hlZFJ0bFNjcm9sbExlZnQgPSBudWxsO1xuZnVuY3Rpb24gc2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgaWYgKGNhY2hlZFNjcm9sbGJhcldpZHRoID09PSBudWxsICYmIGNhbkNyZWF0ZUVsZW1lbnQoKSkge1xuICAgICAgICBjYWNoZWRQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LnN0eWxlLmNzc1RleHQgPSBcIm92ZXJmbG93OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbjt6b29tOjE7Y2xlYXI6Ym90aDtkaXNwbGF5OmJsb2NrXCI7XG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBcIiZuYnNwO1wiO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNhY2hlZFNjcm9sbGJhcldpZHRoID0gZGl2Lm9mZnNldFdpZHRoIC0gZGl2LnNjcm9sbFdpZHRoO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRTY3JvbGxiYXJXaWR0aDtcbn1cbmZ1bmN0aW9uIHJ0bFNjcm9sbExlZnQoKSB7XG4gICAgaWYgKGNhY2hlZFJ0bFNjcm9sbExlZnQgPT09IG51bGwgJiYgY2FuQ3JlYXRlRWxlbWVudCgpKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gXCJvdmVyZmxvdzpzY3JvbGw7em9vbToxO2NsZWFyOmJvdGg7ZGlzcGxheTpibG9jazt3aWR0aDoxMDBweDt2aXNpYmlsaXR5OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMDAwMHB4O2RpcmVjdGlvbjpydGw7XCI7XG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBcIjxkaXYgc3R5bGU9J3dpZHRoOjIwMHB4O2hlaWdodDoxcHg7JzwvZGl2PlwiO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBkaXYuc2Nyb2xsTGVmdDtcbiAgICAgICAgZGl2LnNjcm9sbExlZnQgPSAtMTtcbiAgICAgICAgY2FjaGVkUnRsU2Nyb2xsTGVmdCA9IGRpdi5zY3JvbGxMZWZ0IDwgMCA/IGRpdi5zY3JvbGxMZWZ0IDogaW5pdGlhbDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkUnRsU2Nyb2xsTGVmdDtcbn1cbi8qKlxuICogQGhpZGRlblxuICogbW92ZSB0byBrZW5kby1jb21tb25cbiAqL1xuY2xhc3MgQnJvd3NlclN1cHBvcnRTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih6b25lLCBjaGFuZ2VEZXRlY3Rvcikge1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKGF1ZGl0VGltZSgxMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRQaXhlbFJhdGlvICE9PSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRTY3JvbGxiYXJXaWR0aCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbGJhcldpZHRoKCk7XG4gICAgfVxuICAgIGdldCBydGxTY3JvbGxMZWZ0KCkge1xuICAgICAgICByZXR1cm4gcnRsU2Nyb2xsTGVmdCgpO1xuICAgIH1cbn1cbkJyb3dzZXJTdXBwb3J0U2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQnJvd3NlclN1cHBvcnRTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9XG5dO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp1c2UtbGlmZS1jeWNsZS1pbnRlcmZhY2UgKi9cbmNvbnN0IGlzR3JvdXBJdGVtID0gKHNvdXJjZSkgPT4ge1xuICAgIHJldHVybiBzb3VyY2UuaXRlbXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBzb3VyY2UuZmllbGQgIT09IHVuZGVmaW5lZDtcbn07XG5jb25zdCBpc1ZpcnR1YWxHcm91cEl0ZW0gPSAoc291cmNlKSA9PiB7XG4gICAgcmV0dXJuIHNvdXJjZS5vZmZzZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBzb3VyY2Uuc2tpcEhlYWRlciAhPT0gdW5kZWZpbmVkO1xufTtcbmNvbnN0IGZsYXR0ZW5Hcm91cHMgPSAoZ3JvdXBzKSA9PiAoZ3JvdXBzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgaWYgKGlzR3JvdXBJdGVtKGN1cnIpKSB7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KGZsYXR0ZW5Hcm91cHMoY3Vyci5pdGVtcykpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjLmNvbmNhdChbY3Vycl0pO1xufSwgW10pIC8vIHRzbGludDpkaXNhYmxlLWxpbmU6YWxpZ25cbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXRlbUF0ID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmlyc3QgPSBkYXRhWzBdO1xuICAgIGlmIChpc1ByZXNlbnQoZmlyc3QpICYmIGlzR3JvdXBJdGVtKGZpcnN0KSkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbkdyb3VwcyhkYXRhKVtpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhW2luZGV4XTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZ2V0SXRlcmF0b3IkMSA9IChkYXRhLCB7IGZvb3RlcnMsIGxldmVsLCBkYXRhSW5kZXgsIHBhcmVudEdyb3VwSW5kZXgsIGdyb3VwSW5kZXggfSkgPT4ge1xuICAgIGNvbnN0IGZpcnN0ID0gZGF0YVswXTtcbiAgICBpZiAoaXNQcmVzZW50KGZpcnN0KSAmJiBpc0dyb3VwSXRlbShmaXJzdCkpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbEdyb3VwSXRlbShmaXJzdCkpIHtcbiAgICAgICAgICAgIGdyb3VwSW5kZXggPSBpc1ByZXNlbnQoZmlyc3Qub2Zmc2V0KSA/IGZpcnN0Lm9mZnNldCA6IGdyb3VwSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgLy90c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgICAgIHJldHVybiBuZXcgR3JvdXBJdGVyYXRvcihkYXRhLCBmb290ZXJzLCBsZXZlbCwgZGF0YUluZGV4LCBwYXJlbnRHcm91cEluZGV4LCBncm91cEluZGV4KTtcbiAgICB9XG4gICAgLy90c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgcmV0dXJuIG5ldyBJdGVtSXRlcmF0b3IoZGF0YSwgZGF0YUluZGV4LCBwYXJlbnRHcm91cEluZGV4KTtcbn07XG5jbGFzcyBBcnJheUl0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihhcnIsIGlkeCA9IDApIHtcbiAgICAgICAgdGhpcy5hcnIgPSBhcnI7XG4gICAgICAgIHRoaXMuaWR4ID0gaWR4O1xuICAgICAgICB0aGlzLmFyciA9IGFyciB8fCBbXTtcbiAgICB9XG4gICAgW2l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkeCA8IHRoaXMuYXJyLmxlbmd0aCA/IHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuYXJyW3RoaXMuaWR4KytdXG4gICAgICAgIH0gOiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGFyciwgZGF0YUluZGV4ID0gMCwgcmVzdWx0TWFwID0gKHgpID0+IHgpIHtcbiAgICAgICAgdGhpcy5kYXRhSW5kZXggPSBkYXRhSW5kZXg7XG4gICAgICAgIHRoaXMucmVzdWx0TWFwID0gcmVzdWx0TWFwO1xuICAgICAgICBjb25zdCBpdGVyID0gYXJyW2l0ZXJhdG9yXTtcbiAgICAgICAgdGhpcy5faW5uZXJJdGVyYXRvciA9IGl0ZXIgPyBhcnJbaXRlcmF0b3JdKCkgOiBuZXcgQXJyYXlJdGVyYXRvcihhcnIpO1xuICAgIH1cbiAgICBbaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0TWFwKHRoaXMuX2lubmVySXRlcmF0b3IubmV4dCgpLCB0aGlzLmRhdGFJbmRleCsrKTtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgSXRlbUl0ZXJhdG9yIGV4dGVuZHMgSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGFyciwgZGF0YUluZGV4LCBncm91cEluZGV4KSB7XG4gICAgICAgIHN1cGVyKGFyciwgZGF0YUluZGV4LCAoeCwgaWR4KSA9PiAoe1xuICAgICAgICAgICAgZG9uZTogeC5kb25lLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB4LnZhbHVlLFxuICAgICAgICAgICAgICAgIGdyb3VwSW5kZXg6IGdyb3VwSW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGlkeCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5leHQgcmVjb3JkLlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSW5kZXg7XG4gICAgfVxufVxuY29uc3QgcHJlZml4ID0gKHMsIG4pID0+IHtcbiAgICBjb25zdCBwID0gcyA/IHMgKyBcIl9cIiA6IHM7XG4gICAgcmV0dXJuIGAke3B9JHtufWA7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEdyb3VwSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGFyciwgb3V0cHV0Rm9vdGVycyA9IGZhbHNlLCBsZXZlbCA9IDAsIGRhdGFJbmRleCA9IDAsIHBhcmVudEluZGV4ID0gXCJcIiwgZ3JvdXBJbmRleCA9IDApIHtcbiAgICAgICAgdGhpcy5hcnIgPSBhcnI7XG4gICAgICAgIHRoaXMub3V0cHV0Rm9vdGVycyA9IG91dHB1dEZvb3RlcnM7XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgdGhpcy5kYXRhSW5kZXggPSBkYXRhSW5kZXg7XG4gICAgICAgIHRoaXMucGFyZW50SW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ncm91cEluZGV4ID0gZ3JvdXBJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXBJbmRleCA9IFwiXCI7XG4gICAgICAgIHRoaXMuYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB0aGlzLl9pdGVyYXRvciA9IG5ldyBJdGVyYXRvcih0aGlzLmFyciwgdGhpcy5kYXRhSW5kZXgpO1xuICAgIH1cbiAgICBbaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dEdyb3VwSXRlbSgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5faXRlcmF0b3IubmV4dCgpLnZhbHVlO1xuICAgICAgICB0aGlzLl9pbm5lckl0ZXJhdG9yID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXBJbmRleCA9IHByZWZpeCh0aGlzLnBhcmVudEluZGV4LCB0aGlzLmdyb3VwSW5kZXgrKyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuY3VycmVudEdyb3VwSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiB0aGlzLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZ3JvdXAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9vdGVySXRlbSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBncm91cCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRleDogdGhpcy5jdXJyZW50R3JvdXBJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHRoaXMubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmb290ZXInXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5uZXJJdGVyYXRvcihncm91cCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubmVySXRlcmF0b3IgPSBnZXRJdGVyYXRvciQxKGdyb3VwLml0ZW1zLCB7XG4gICAgICAgICAgICAgICAgZGF0YUluZGV4OiB0aGlzLmRhdGFJbmRleCxcbiAgICAgICAgICAgICAgICBmb290ZXJzOiB0aGlzLm91dHB1dEZvb3RlcnMsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHRoaXMubGV2ZWwgKyAxLFxuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwSW5kZXg6IHRoaXMuY3VycmVudEdyb3VwSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lckl0ZXJhdG9yO1xuICAgIH1cbiAgICBuZXh0RGF0YUl0ZW0oZ3JvdXApIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IkJDEgPSB0aGlzLmlubmVySXRlcmF0b3IoZ3JvdXApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVyYXRvciQkMS5uZXh0KCk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQocmVzdWx0LnZhbHVlKSAmJiAhcmVzdWx0LmRvbmUgJiYgcmVzdWx0LnZhbHVlLnR5cGUgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFJbmRleCA9IHJlc3VsdC52YWx1ZS5pbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFyZXN1bHQuZG9uZSA/IHJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5jdXJyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dEdyb3VwSXRlbSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm5leHREYXRhSXRlbSh0aGlzLmN1cnJlbnQpO1xuICAgICAgICByZXR1cm4gaXRlbSA/IGl0ZW0gOiAodGhpcy5vdXRwdXRGb290ZXJzID8gdGhpcy5mb290ZXJJdGVtKCkgOiB0aGlzLm5leHRHcm91cEl0ZW0oKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBpdGVyYXRlZCBkYXRhIHJlY29yZC5cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUluZGV4ICsgMTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEYXRhUmVzdWx0SXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc2tpcCA9IDAsIGdyb3VwRm9vdGVycyA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLmdyb3VwRm9vdGVycyA9IGdyb3VwRm9vdGVycztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnNvdXJjZSA/IHRoaXMuc291cmNlIDogW107XG4gICAgICAgIHRoaXMuaXNPYmplY3QgPSB0aGlzLmlzR3JpZERhdGFSZXN1bHQodGhpcy5zb3VyY2UpO1xuICAgIH1cbiAgICBpc0dyaWREYXRhUmVzdWx0KHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnRvdGFsICE9PSB1bmRlZmluZWQgJiYgc291cmNlLmRhdGEgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHRvdGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc09iamVjdCA/IHRoaXMuc291cmNlLnRvdGFsIDogdGhpcy5zb3VyY2UubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNPYmplY3QgPyB0aGlzLnNvdXJjZS5kYXRhIDogdGhpcy5zb3VyY2U7XG4gICAgfVxuICAgIG1hcChmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1hcChmbik7XG4gICAgfVxuICAgIGZpbHRlcihmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmZpbHRlcihmbik7XG4gICAgfVxuICAgIHJlZHVjZShmbiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJlZHVjZShmbiwgaW5pdCk7XG4gICAgfVxuICAgIGZvckVhY2goZm4pIHtcbiAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goZm4pO1xuICAgIH1cbiAgICBzb21lKGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc29tZShmbik7XG4gICAgfVxuICAgIFtpdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiBnZXRJdGVyYXRvciQxKHRoaXMuZGF0YSwge1xuICAgICAgICAgICAgZGF0YUluZGV4OiB0aGlzLnNraXAsXG4gICAgICAgICAgICBmb290ZXJzOiB0aGlzLmdyb3VwRm9vdGVycyxcbiAgICAgICAgICAgIGdyb3VwSW5kZXg6IHRoaXMuc2tpcFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLmRhdGEudG9TdHJpbmcoKTsgfVxufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERhdGFDb2xsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihhY2Nlc3Nvcikge1xuICAgICAgICB0aGlzLmFjY2Vzc29yID0gYWNjZXNzb3I7XG4gICAgfVxuICAgIGdldCB0b3RhbCgpIHsgcmV0dXJuIHRoaXMuYWNjZXNzb3IoKS50b3RhbDsgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLmFjY2Vzc29yKCkuZGF0YS5sZW5ndGg7IH1cbiAgICBnZXQgZmlyc3QoKSB7IHJldHVybiB0aGlzLmFjY2Vzc29yKCkuZGF0YVswXTsgfVxuICAgIGdldCBsYXN0KCkgeyByZXR1cm4gdGhpcy5hY2Nlc3NvcigpLmRhdGFbdGhpcy5sZW5ndGggLSAxXTsgfVxuICAgIGF0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpdGVtQXQodGhpcy5hY2Nlc3NvcigpLmRhdGEsIGluZGV4KTtcbiAgICB9XG4gICAgbWFwKGZuKSB7IHJldHVybiB0aGlzLmFjY2Vzc29yKCkubWFwKGZuKTsgfVxuICAgIGZpbHRlcihmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NvcigpLmZpbHRlcihmbik7XG4gICAgfVxuICAgIHJlZHVjZShmbiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NvcigpLnJlZHVjZShmbiwgaW5pdCk7XG4gICAgfVxuICAgIGZvckVhY2goZm4pIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NvcigpLmZvckVhY2goZm4pO1xuICAgIH1cbiAgICBzb21lKGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc29yKCkuc29tZShmbik7XG4gICAgfVxuICAgIFtpdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc29yKClbaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5hY2Nlc3NvcigpLnRvU3RyaW5nKCk7IH1cbn1cblxuLyogdHNsaW50OmRpc2FibGU6bm8taW5wdXQtcmVuYW1lICovXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihncmlkLCBjZCkge1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmNkID0gY2Q7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2lsbCBzdG9yZSB0aGUgc2VsZWN0ZWQgaXRlbSBrZXlzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGBzZWxlY3RlZEtleXNgIGNvbGxlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgaW5pdCgpIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5ncmlkLnJvd1NlbGVjdGVkKSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLnJvd1NlbGVjdGVkID0gKHJvdykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkS2V5cy5pbmRleE9mKHRoaXMuZ2V0SXRlbUtleShyb3cpKSA+PSAwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLmdyaWQuY2VsbFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNlbGxTZWxlY3RlZCA9IChyb3csIGNvbHVtbiwgY29sSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW5kZXIgPSB0aGlzLmdldFNlbGVjdGlvbkl0ZW0ocm93LCBjb2x1bW4sIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZEtleXMuc29tZShpdGVtID0+IGl0ZW0uY29sdW1uS2V5ID09PSBjb250ZW5kZXIuY29sdW1uS2V5ICYmIGl0ZW0uaXRlbUtleSA9PT0gY29udGVuZGVyLml0ZW1LZXkpLFxuICAgICAgICAgICAgICAgICAgICBpdGVtOiBjb250ZW5kZXJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuZ3JpZFxuICAgICAgICAgICAgLnNlbGVjdGlvbkNoYW5nZVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5cyA9IFtdO1xuICAgIH1cbiAgICBnZXRJdGVtS2V5KHJvdykge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LZXkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWxlY3Rpb25LZXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcm93LmRhdGFJdGVtW3RoaXMuc2VsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWxlY3Rpb25LZXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbktleShyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3cuaW5kZXg7XG4gICAgfVxuICAgIGdldFNlbGVjdGlvbkl0ZW0ocm93LCBjb2wsIGNvbEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZGVudGlmaWVycyA9IHt9O1xuICAgICAgICBpdGVtSWRlbnRpZmllcnMuaXRlbUtleSA9IHRoaXMuZ2V0SXRlbUtleShyb3cpO1xuICAgICAgICBpZiAoIWlzUHJlc2VudChjb2wpICYmICFpc1ByZXNlbnQoY29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbUlkZW50aWZpZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbktleSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbHVtbktleSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGl0ZW1JZGVudGlmaWVycy5jb2x1bW5LZXkgPSByb3cuZGF0YUl0ZW1bdGhpcy5jb2x1bW5LZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbHVtbktleSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaXRlbUlkZW50aWZpZXJzLmNvbHVtbktleSA9IHRoaXMuY29sdW1uS2V5KGNvbCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtS2V5OiBpdGVtSWRlbnRpZmllcnMuaXRlbUtleSxcbiAgICAgICAgICAgIGNvbHVtbktleTogaXRlbUlkZW50aWZpZXJzLmNvbHVtbktleSA/IGl0ZW1JZGVudGlmaWVycy5jb2x1bW5LZXkgOiBjb2xJbmRleFxuICAgICAgICB9O1xuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5zZWxlY3RlZFJvd3MpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5kZXNlbGVjdGVkUm93cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUtleSA9IHRoaXMuZ2V0SXRlbUtleShpdGVtKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLnNlbGVjdGVkS2V5cy5pbmRleE9mKGl0ZW1LZXkpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5cy5zcGxpY2UoaXRlbUluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQuc2VsZWN0YWJsZVNldHRpbmdzLm1vZGUgPT09IFwic2luZ2xlXCIgJiYgdGhpcy5zZWxlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3RlZFJvd3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1LZXkgPSB0aGlzLmdldEl0ZW1LZXkoaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRLZXlzLmluZGV4T2YoaXRlbUtleSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzLnB1c2goaXRlbUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uZGVzZWxlY3RlZENlbGxzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmdldENlbGxTZWxlY3Rpb25JdGVtSW5kZXgoaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5zZWxlY3RhYmxlU2V0dGluZ3MubW9kZSA9PT0gXCJzaW5nbGVcIiAmJiB0aGlzLnNlbGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0aW9uLnNlbGVjdGVkQ2VsbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuZ2V0Q2VsbFNlbGVjdGlvbkl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEtleXMpO1xuICAgIH1cbiAgICBnZXRDZWxsU2VsZWN0aW9uSXRlbUluZGV4KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRLZXlzLmZpbmRJbmRleChzZWxlY3RlZEl0ZW0gPT4gc2VsZWN0ZWRJdGVtLml0ZW1LZXkgPT09IGl0ZW0uaXRlbUtleSAmJiBzZWxlY3RlZEl0ZW0uY29sdW1uS2V5ID09PSBpdGVtLmNvbHVtbktleSk7XG4gICAgfVxufVxuU2VsZWN0aW9uLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHNlbGVjdGVkS2V5czogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0aW9uS2V5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogW1wia2VuZG9HcmlkU2VsZWN0QnlcIixdIH1dLFxuICAgIGNvbHVtbktleTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0ZWRLZXlzQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV1cbn07XG5cbmNvbnN0IHJlc2V0ID0gKC4uLmxpc3RzKSA9PiB7XG4gICAgbGV0IGRpZmYgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBsaXN0cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGNvbnN0IFtsaXN0LCBjb2x1bW5zXSA9IGxpc3RzW2lkeF07XG4gICAgICAgIGRpZmYgPSBkaWZmIHx8IGxpc3QubGVuZ3RoICE9PSBjb2x1bW5zLmxlbmd0aDtcbiAgICAgICAgbGlzdC5yZXNldChjb2x1bW5zKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmY7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIENvbHVtbnNDb250YWluZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgdGhpcy5hbGxDb2x1bW5zID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLmxlYWZDb2x1bW5zID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLmxvY2tlZENvbHVtbnMgPSBuZXcgUXVlcnlMaXN0KCk7XG4gICAgICAgIHRoaXMubm9uTG9ja2VkQ29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy5sb2NrZWRMZWFmQ29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy5ub25Mb2NrZWRMZWFmQ29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy50b3RhbExldmVscyA9IDA7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5sZWFmQ29sdW1uc1RvUmVuZGVyID0gW107XG4gICAgICAgIHRoaXMubG9ja2VkQ29sdW1uc1RvUmVuZGVyID0gW107XG4gICAgICAgIHRoaXMubm9uTG9ja2VkQ29sdW1uc1RvUmVuZGVyID0gW107XG4gICAgICAgIHRoaXMuaGFzR3JvdXBIZWFkZXJDb2x1bW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNHcm91cEZvb3RlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0Zvb3RlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVubG9ja2VkV2lkdGggPSAwO1xuICAgIH1cbiAgICByZWZyZXNoKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50TGV2ZWxzID0gdGhpcy50b3RhbExldmVscztcbiAgICAgICAgY29uc3QgbGVhZkNvbHVtbnMkJDEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbG9ja2VkTGVhZkNvbHVtbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3Qgbm9uTG9ja2VkTGVhZkNvbHVtbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbG9ja2VkQ29sdW1ucyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBjb25zdCBub25Mb2NrZWRDb2x1bW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbGVhZkNvbHVtbnNUb1JlbmRlciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBjb25zdCBsb2NrZWRDb2x1bW5zVG9SZW5kZXIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3Qgbm9uTG9ja2VkQ29sdW1uc1RvUmVuZGVyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBoYXNHcm91cEhlYWRlckNvbHVtbiA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzR3JvdXBGb290ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc0Zvb3RlciA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5sb2NrZWRXaWR0aCA9IDA7XG4gICAgICAgIGxldCBsZWFmSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnRvdGFsTGV2ZWxzID0gMDtcbiAgICAgICAgdGhpcy5jb2x1bW5zKCkuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTGVhZkNvbHVtbnMgPSBjb2x1bW4uaXNMb2NrZWQgPT09IHRydWUgPyBsb2NrZWRMZWFmQ29sdW1ucyA6IG5vbkxvY2tlZExlYWZDb2x1bW5zO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ29sdW1ucyA9IGNvbHVtbi5pc0xvY2tlZCA9PT0gdHJ1ZSA/IGxvY2tlZENvbHVtbnMgOiBub25Mb2NrZWRDb2x1bW5zO1xuICAgICAgICAgICAgY29uc3QgdG9SZW5kZXJDb250YWluZXIgPSBjb2x1bW4uaXNMb2NrZWQgPT09IHRydWUgPyBsb2NrZWRDb2x1bW5zVG9SZW5kZXIgOiBub25Mb2NrZWRDb2x1bW5zVG9SZW5kZXI7XG4gICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXBDb21wb25lbnQoY29sdW1uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckxlYWZDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICBsZWFmQ29sdW1ucyQkMS5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgbGVhZkNvbHVtbnNUb1JlbmRlci5wdXNoLmFwcGx5KGxlYWZDb2x1bW5zVG9SZW5kZXIsIGNvbHVtbnNUb1JlbmRlcihbY29sdW1uXSkpO1xuICAgICAgICAgICAgICAgIHRvUmVuZGVyQ29udGFpbmVyLnB1c2guYXBwbHkodG9SZW5kZXJDb250YWluZXIsIGNvbHVtbnNUb1JlbmRlcihbY29sdW1uXSkpO1xuICAgICAgICAgICAgICAgIGhhc0dyb3VwSGVhZGVyQ29sdW1uID0gaGFzR3JvdXBIZWFkZXJDb2x1bW4gfHwgc29tZUxlYWZDb2x1bW4obGVhZiA9PiBCb29sZWFuKGxlYWYuZ3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZVJlZiksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgaGFzR3JvdXBGb290ZXIgPSBoYXNHcm91cEZvb3RlciB8fCBzb21lTGVhZkNvbHVtbihsZWFmID0+IEJvb2xlYW4obGVhZi5ncm91cEZvb3RlclRlbXBsYXRlUmVmKSwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICBoYXNGb290ZXIgPSBoYXNGb290ZXIgfHwgc29tZUxlYWZDb2x1bW4obGVhZiA9PiBCb29sZWFuKGxlYWYuZm9vdGVyVGVtcGxhdGVSZWYpLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGlmICghY29sdW1uLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVubG9ja2VkV2lkdGggKz0gY29sdW1uLndpZHRoIHx8IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNTcGFuQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jaGlsZENvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMubGVhZkluZGV4ID0gbGVhZkluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmxlYWZJbmRleCA9IGxlYWZJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRhaW5lckNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgYWxsQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB0aGlzLnRvdGFsTGV2ZWxzID0gY29sdW1uLmxldmVsID4gdGhpcy50b3RhbExldmVscyA/IGNvbHVtbi5sZXZlbCA6IHRoaXMudG90YWxMZXZlbHM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhhc0dyb3VwSGVhZGVyQ29sdW1uID0gaGFzR3JvdXBIZWFkZXJDb2x1bW47XG4gICAgICAgIHRoaXMuaGFzR3JvdXBGb290ZXIgPSBoYXNHcm91cEZvb3RlcjtcbiAgICAgICAgdGhpcy5oYXNGb290ZXIgPSBoYXNGb290ZXI7XG4gICAgICAgIHRoaXMubGVhZkNvbHVtbnNUb1JlbmRlciA9IGxlYWZDb2x1bW5zVG9SZW5kZXI7XG4gICAgICAgIHRoaXMubG9ja2VkQ29sdW1uc1RvUmVuZGVyID0gbG9ja2VkQ29sdW1uc1RvUmVuZGVyO1xuICAgICAgICB0aGlzLm5vbkxvY2tlZENvbHVtbnNUb1JlbmRlciA9IG5vbkxvY2tlZENvbHVtbnNUb1JlbmRlcjtcbiAgICAgICAgdGhpcy51bmxvY2tlZFdpZHRoID0gdW5sb2NrZWRXaWR0aDtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHJlc2V0KFt0aGlzLmxlYWZDb2x1bW5zLCBsZWFmQ29sdW1ucyQkMV0sIFt0aGlzLmxvY2tlZExlYWZDb2x1bW5zLCBsb2NrZWRMZWFmQ29sdW1uc10sIFt0aGlzLm5vbkxvY2tlZExlYWZDb2x1bW5zLCBub25Mb2NrZWRMZWFmQ29sdW1uc10sIFt0aGlzLmxvY2tlZENvbHVtbnMsIGxvY2tlZENvbHVtbnNdLCBbdGhpcy5hbGxDb2x1bW5zLCBhbGxDb2x1bW5zXSwgW3RoaXMubm9uTG9ja2VkQ29sdW1ucywgbm9uTG9ja2VkQ29sdW1uc10pIHx8IGN1cnJlbnRMZXZlbHMgIT09IHRoaXMudG90YWxMZXZlbHM7XG4gICAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH1cbn1cblxuY29uc3QgZm9yRWFjaENvbHVtbiA9IChsaXN0LCBjYWxsYmFjaykgPT4ge1xuICAgIGxpc3QuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKGNvbHVtbik7XG4gICAgICAgIGlmIChjb2x1bW4uaXNDb2x1bW5Hcm91cCAmJiBjb2x1bW4uaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGZvckVhY2hDb2x1bW4oY29sdW1uLmNoaWxkcmVuQXJyYXksIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbmNvbnN0IGZvckVhY2hMZXZlbCA9IChsaXN0LCBjYWxsYmFjaykgPT4ge1xuICAgIHNvcnRDb2x1bW5zKGxpc3QpXG4gICAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgY2FsbGJhY2soY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbi5pc0NvbHVtbkdyb3VwICYmIGNvbHVtbi5oYXNDaGlsZHJlbikge1xuICAgICAgICAgICAgZm9yRWFjaExldmVsKGNvbHVtbi5jaGlsZHJlbkFycmF5LCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5jb25zdCBmaWx0ZXJIaWVyYXJjaHkgPSAobGlzdCwgcHJlZGljYXRlKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgc29ydENvbHVtbnMobGlzdClcbiAgICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocHJlZGljYXRlKGNvbHVtbikpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNDb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuJCQxID0gZmlsdGVySGllcmFyY2h5KGNvbHVtbi5jaGlsZHJlbkFycmF5LCBwcmVkaWNhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiQkMS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29sdW1uLCAuLi5jaGlsZHJlbiQkMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWNvbHVtbi5pc1NwYW5Db2x1bW4gfHwgZmlsdGVySGllcmFyY2h5KGNvbHVtbi5jaGlsZHJlbkFycmF5LCBwcmVkaWNhdGUpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDb2x1bW5MaXN0IHtcbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5MaXN0KG5ldyBRdWVyeUxpc3QoKSk7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2spIHtcbiAgICAgICAgZm9yRWFjaENvbHVtbih0aGlzLmNvbHVtbnMsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZmlsdGVyKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3JFYWNoQ29sdW1uKHRoaXMuY29sdW1ucywgKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmlsdGVySGllcmFyY2h5KHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gZmlsdGVySGllcmFyY2h5KHRoaXMuY29sdW1ucy50b0FycmF5KCksIHByZWRpY2F0ZSk7XG4gICAgfVxuICAgIGZpbHRlclNvcnQoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvckVhY2hMZXZlbCh0aGlzLmNvbHVtbnMudG9BcnJheSgpLCAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2soY29sdW1uKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0b0FycmF5KCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yRWFjaENvbHVtbih0aGlzLmNvbHVtbnMsIChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByb290Q29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy50b0FycmF5KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgR3JvdXBJbmZvU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkxpc3QgPSBDb2x1bW5MaXN0LmVtcHR5O1xuICAgIH1cbiAgICBnZXQgY29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZENvbHVtbnModGhpcy5fY29sdW1uTGlzdCgpLnRvQXJyYXkoKSkuZmlsdGVyKGlzQ29sdW1uQ29tcG9uZW50KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJDb2x1bW5zQ29udGFpbmVyKGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uTGlzdCA9IGNvbHVtbnM7XG4gICAgfVxuICAgIGZvcm1hdEZvckdyb3VwKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5Gb3JHcm91cChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbiA/IGNvbHVtbi5mb3JtYXQgOiBcIlwiO1xuICAgIH1cbiAgICBpc0dyb3VwYWJsZShncm91cEZpZWxkKSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5dID0gdGhpcy5jb2x1bW5zLmZpbHRlcih4ID0+IHguZmllbGQgPT09IGdyb3VwRmllbGQpO1xuICAgICAgICByZXR1cm4gY29sdW1uID8gY29sdW1uLmdyb3VwYWJsZSA6IHRydWU7XG4gICAgfVxuICAgIGdyb3VwVGl0bGUoaXRlbSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbkZvckdyb3VwKGl0ZW0pO1xuICAgICAgICByZXR1cm4gY29sdW1uID8gKGNvbHVtbi50aXRsZSB8fCBjb2x1bW4uZmllbGQpIDogdGhpcy5ncm91cEZpZWxkKGl0ZW0pO1xuICAgIH1cbiAgICBncm91cEhlYWRlclRlbXBsYXRlKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5Gb3JHcm91cChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbiA/IGNvbHVtbi5ncm91cEhlYWRlclRlbXBsYXRlUmVmIHx8IGNvbHVtbi5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlUmVmIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBncm91cEZpZWxkKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiBncm91cC5kYXRhID8gZ3JvdXAuZGF0YS5maWVsZCA6IGdyb3VwLmZpZWxkO1xuICAgIH1cbiAgICBjb2x1bW5Gb3JHcm91cChncm91cCkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JvdXBGaWVsZChncm91cCk7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5dID0gdGhpcy5jb2x1bW5zLmZpbHRlcih4ID0+IHguZmllbGQgPT09IGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDaGFuZ2VOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihuZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG4gICAgbm90aWZ5KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uIHx8IHRoaXMuc3Vic2NyaXB0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoYW5nZXMuZW1pdCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNoYW5nZU5vdGlmaWNhdGlvblNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNoYW5nZU5vdGlmaWNhdGlvblNlcnZpY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBuby1yZWNvcmRzIHRlbXBsYXRlIG9mIHRoZSBHcmlkLiBQcm92aWRlcyBhbiBvcHRpb24gdG8gY3VzdG9taXplIHRoZVxuICogYXBwZWFyYW5jZSBvZiB0aGUgaXRlbSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIG5vIGRhdGEgaXMgcHJlc2VudC4gVG8gZGVmaW5lIHRoZSBuby1yZWNvcmRzIHRlbXBsYXRlLFxuICogbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb0dyaWROb1JlY29yZHNUZW1wbGF0ZWAgZGlyZWN0aXZlIGluc2lkZSBgPGtlbmRvLWdyaWQ+YC5cbiAqXG4gKiA+IFdoZW4gdGhlIGxvY2tlZCBjb2x1bW5zIG9mIHRoZSBHcmlkIGFyZSBpbiB1c2UsIHRoZSB0ZW1wbGF0ZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIG5vbi1sb2NrZWQgcGFydCBvZiB0aGUgY29udGVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZGF0YVwiPlxuICogICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlVuaXRQcmljZVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWROb1JlY29yZHNUZW1wbGF0ZT5cbiAqICAgICAgICAgICAgVGhlcmUgYXJlIG5vdCBwcm9kdWN0cy4gPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwicmVmcmVzaCgpXCI+Q2xpY2sgaGVyZSB0byByZWZyZXNoPC9hPi5cbiAqICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyBkYXRhID0gW107XG4gKiAgICAgcHVibGljIHJlZnJlc2goKSB7XG4gKiAgICAgICB0aGlzLmRhdGEgPSBbe1xuICogICAgICAgICAgICBcIlByb2R1Y3RJRFwiOiAxLFxuICogICAgICAgICAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhaVwiLFxuICogICAgICAgICAgICBcIlVuaXRQcmljZVwiOiAxOC4wMDAwLFxuICogICAgICAgICAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZSxcbiAqICAgICAgICAgICAgXCJDYXRlZ29yeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcIkNhdGVnb3J5SURcIjogMSxcbiAqICAgICAgICAgICAgICAgIFwiQ2F0ZWdvcnlOYW1lXCI6IFwiQmV2ZXJhZ2VzXCIsXG4gKiAgICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiU29mdCBkcmlua3MsIGNvZmZlZXMsIHRlYXMsIGJlZXJzLCBhbmQgYWxlc1wiXG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICAgIH0sIHtcbiAqICAgICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlLFxuICogICAgICAgICAgICBcIkNhdGVnb3J5XCI6IHtcbiAqICAgICAgICAgICAgICAgIFwiQ2F0ZWdvcnlJRFwiOiAxLFxuICogICAgICAgICAgICAgICAgXCJDYXRlZ29yeU5hbWVcIjogXCJCZXZlcmFnZXNcIixcbiAqICAgICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJTb2Z0IGRyaW5rcywgY29mZmVlcywgdGVhcywgYmVlcnMsIGFuZCBhbGVzXCJcbiAqICAgICAgICAgICAgfVxuICogICAgICAgICAgfSwge1xuICogICAgICAgICAgICBcIlByb2R1Y3RJRFwiOiAzLFxuICogICAgICAgICAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQW5pc2VlZCBTeXJ1cFwiLFxuICogICAgICAgICAgICBcIlVuaXRQcmljZVwiOiAxMC4wMDAwLFxuICogICAgICAgICAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZSxcbiAqICAgICAgICAgICAgXCJDYXRlZ29yeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcIkNhdGVnb3J5SURcIjogMixcbiAqICAgICAgICAgICAgICAgIFwiQ2F0ZWdvcnlOYW1lXCI6IFwiQ29uZGltZW50c1wiLFxuICogICAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIlN3ZWV0IGFuZCBzYXZvcnkgc2F1Y2VzLCByZWxpc2hlcywgc3ByZWFkcywgYW5kIHNlYXNvbmluZ3NcIlxuICogICAgICAgICAgICB9XG4gKiAgICAgICAgfV07XG4gKlxuICogICAgIH1cbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgTm9SZWNvcmRzVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5Ob1JlY29yZHNUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZE5vUmVjb3Jkc1RlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTm9SZWNvcmRzVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuY29uc3Qgc2V0ID0gdmFsdWUgPT4gcGFpciA9PiBwYWlyLmZvckVhY2goeCA9PiB4LnN0eWxlLmhlaWdodCA9IHZhbHVlKTtcbmNvbnN0IGNsZWFySGVpZ2h0ID0gcGFpcnMgPT4gcGFpcnNcbiAgICAuZmlsdGVyKChbbGVmdCwgcmlnaHRdKSA9PiBsZWZ0LnN0eWxlLmhlaWdodCB8fCByaWdodC5zdHlsZS5oZWlnaHQpXG4gICAgLmZvckVhY2goc2V0KFwiXCIpKTtcbmNvbnN0IHppcCQxID0gKGFycjEsIGFycjIpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBhcnIxLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoIWFycjJbaWR4XSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goW2FycjFbaWR4XSwgYXJyMltpZHhdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuY29uc3Qgc2V0SGVpZ2h0ID0gaGVpZ2h0cyA9PiAocm93LCBpZHgpID0+IHNldChgJHtoZWlnaHRzW2lkeF0gKyAxfXB4YCkocm93KTtcbmNvbnN0IGdldEhlaWdodHMgPSByb3dzID0+IHJvd3MubWFwKChbbGVmdCwgcmlnaHRdKSA9PiB7XG4gICAgY29uc3QgaGVpZ2h0ID0gbGVmdC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0SGVpZ2h0MiA9IHJpZ2h0Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoaGVpZ2h0IDwgb2Zmc2V0SGVpZ2h0Mikge1xuICAgICAgICByZXR1cm4gb2Zmc2V0SGVpZ2h0MjtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbn0pO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHN5bmNSb3dzSGVpZ2h0ID0gKHRhYmxlMSwgdGFibGUyKSA9PiB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgcm93cyA9IHppcCQxKHRhYmxlMS5yb3dzLCB0YWJsZTIucm93cyk7XG4gICAgY2xlYXJIZWlnaHQocm93cyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IGdldEhlaWdodHMocm93cyk7XG4gICAgW3RhYmxlMSwgdGFibGUyXS5mb3JFYWNoKHggPT4geC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTtcbiAgICByb3dzLmZvckVhY2goc2V0SGVpZ2h0KGhlaWdodHMpKTtcbiAgICBbdGFibGUxLCB0YWJsZTJdLmZvckVhY2goeCA9PiB4LnN0eWxlLmRpc3BsYXkgPSAnJyk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGFjdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgKHRhYmxlMS5jb250YWlucyhhY3RpdmVFbGVtZW50KSB8fCB0YWJsZTIuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzZXJ2aWNlIHRvIHNldCB0aGUgZmlsdGVyIGRlc2NyaXB0b3JcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcmV1c2FibGVjdXN0b21maWx0ZXJzX2dyaWQgJX0pKS5cbiAqL1xuY2xhc3MgRmlsdGVyU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBmaWx0ZXIgZGVzY3JpcHRvcnMgaXMgc2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gbmV3IFN1YmplY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmlsdGVyIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NvbXBvc2l0ZUZpbHRlckRlc2NyaXB0b3J9IHZhbHVlIC0gVGhlIGZpbHRlciBkZXNjcmlwdG9yIHRoYXQgd2lsbCBiZSBzZXQuXG4gICAgICovXG4gICAgZmlsdGVyKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5uZXh0KHZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcGFnZXIgdGVtcGxhdGUgd2hpY2ggaGVscHMgdG8gY3VzdG9taXplIHRoZSBwYWdlciBhcHBlYXJhbmNlIGluIHRoZSBHcmlkLiBUbyBkZWZpbmUgYSBwYWdlclxuICogdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZSBga2VuZG9QYWdlclRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIGA8a2VuZG8tZ3JpZD5gLlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogKiBgY3VycmVudFBhZ2VgJm1kYXNoO1RoZSBpbmRleCBvZiB0aGUgZGlzcGxheWVkIHBhZ2UuXG4gKiAqIGBwYWdlU2l6ZWAmbWRhc2g7VGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGBwYWdlU2l6ZWAuXG4gKiAqIGBza2lwYCZtZGFzaDtUaGUgY3VycmVudCBza2lwIHZhbHVlLlxuICogKiBgdG90YWxgJm1kYXNoO1RoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkcy5cbiAqICogYHRvdGFsUGFnZXNgJm1kYXNoO1RoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHBhZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICA8a2VuZG8tZ3JpZFxuICogICAgICAgIFtrZW5kb0dyaWRCaW5kaW5nXT1cImdyaWREYXRhXCJcbiAqICAgICAgICBbcGFnZVNpemVdPVwiMVwiXG4gKiAgICAgICAgW3BhZ2VhYmxlXT1cInRydWVcIlxuICogICAgICA+XG4gKiAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIklEXCIgd2lkdGg9XCI0MFwiPlxuICogICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCIgdGl0bGU9XCJOYW1lXCIgd2lkdGg9XCIyNTBcIj5cbiAqICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiB0aXRsZT1cIlByaWNlXCIgd2lkdGg9XCI4MFwiIGZvcm1hdD1cInswOmN9XCI+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICpcbiAqICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1BhZ2VyVGVtcGxhdGUgbGV0LXRvdGFsUGFnZXM9XCJ0b3RhbFBhZ2VzXCIgbGV0LWN1cnJlbnRQYWdlPVwiY3VycmVudFBhZ2VcIj5cbiAqICAgICAgICAgIDxrZW5kby1wYWdlci1wcmV2LWJ1dHRvbnM+PC9rZW5kby1wYWdlci1wcmV2LWJ1dHRvbnM+XG4gKiAgICAgICAgICA8a2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zIFtidXR0b25Db3VudF09XCIxMFwiPjwva2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zPlxuICogICAgICAgICAgPGtlbmRvLXBhZ2VyLW5leHQtYnV0dG9ucz48L2tlbmRvLXBhZ2VyLW5leHQtYnV0dG9ucz5cbiAqICAgICAgICAgIDxrZW5kby1wYWdlci1pbmZvPjwva2VuZG8tcGFnZXItaW5mbz5cbiAqICAgICAgICAgIEN1cnJlbnQgcGFnZToge3tjdXJyZW50UGFnZX19XG4gKiAgICAgICA8L25nLXRlbXBsYXRlPlxuICpcbiAqICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICAgcHVibGljIGdyaWREYXRhID0gW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBQYWdlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuUGFnZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvUGFnZXJUZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhZ2VyVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFBERlNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNhdmVQREYgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuZHJhd1BERiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5leHBvcnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG4gICAgc2F2ZShjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5lbWl0RXZlbnQodGhpcy5zYXZlUERGLCBjb21wb25lbnQpO1xuICAgIH1cbiAgICBkcmF3KGNvbXBvbmVudCwgcHJvbWlzZSkge1xuICAgICAgICB0aGlzLmVtaXRFdmVudCh0aGlzLmRyYXdQREYsIHsgY29tcG9uZW50LCBwcm9taXNlIH0pO1xuICAgIH1cbiAgICBlbWl0RXZlbnQoZW1pdHRlciwgYXJncykge1xuICAgICAgICBpZiAoZW1pdHRlci5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWF0aW5nIFBERiByZXF1aXJlcyBpbmNsdWRpbmcgdGhlIFBERk1vZHVsZSBhbmQgYWRkaW5nIHRoZSA8a2VuZG8tZ3JpZC1wZGY+IGNvbXBvbmVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVtaXR0ZXIuZW1pdChhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblBERlNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qKlxuICogQXJndW1lbnRzIGZvciB0aGUgYHBkZkV4cG9ydGAgZXZlbnQuXG4gKi9cbmNsYXNzIFBERkV4cG9ydEV2ZW50IGV4dGVuZHMgUHJldmVudGFibGVFdmVudCB7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTdXNwZW5kU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsID0gZmFsc2U7XG4gICAgfVxufVxuU3VzcGVuZFNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOiBvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXMgKi9cbmNvbnN0IGJvb3RzdHJhcFRvTWVkaWEgPSAobWVkaWEpID0+ICgoe1xuICAgIFwieHNcIjogXCIobWF4LXdpZHRoOiA1NzZweClcIixcbiAgICBcInNtXCI6IFwiKG1pbi13aWR0aDogNTc2cHgpXCIsXG4gICAgXCJtZFwiOiBcIihtaW4td2lkdGg6IDc2OHB4KVwiLFxuICAgIFwibGdcIjogXCIobWluLXdpZHRoOiA5OTJweClcIixcbiAgICBcInhsXCI6IFwiKG1pbi13aWR0aDogMTIwMHB4KVwiXG59KVttZWRpYV0gfHwgbWVkaWEpO1xuLyogdHNsaW50OmVuYWJsZTogb2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzICovXG5jb25zdCBicm93c2VyTWF0Y2hNZWRpYSA9IChtZWRpYSkgPT4gd2luZG93Lm1hdGNoTWVkaWEobWVkaWEpLm1hdGNoZXM7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUmVzcG9uc2l2ZVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXRjaE1lZGlhID0gYnJvd3Nlck1hdGNoTWVkaWE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBtYXRjaGVzTWVkaWEobWVkaWEpIHtcbiAgICAgICAgcmV0dXJuICFtZWRpYSB8fCB0aGlzLm1hdGNoTWVkaWEoYm9vdHN0cmFwVG9NZWRpYShtZWRpYSkpO1xuICAgIH1cbn1cblJlc3BvbnNpdmVTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRXhjZWxTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zYXZlVG9FeGNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5leHBvcnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG4gICAgc2F2ZShjb21wb25lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZVRvRXhjZWwub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTYXZpbmcgZXhjZWwgcmVxdWlyZXMgaW5jbHVkaW5nIHRoZSBFeGNlbE1vZHVsZSBhbmQgYWRkaW5nIHRoZSA8a2VuZG8tZ3JpZC1leGNlbD4gY29tcG9uZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zYXZlVG9FeGNlbC5lbWl0KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5FeGNlbFNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdG9vbGJhciB0ZW1wbGF0ZSBvZiB0aGUgR3JpZC5cbiAqXG4gKiBUaGUgdGVtcGxhdGUgY29udGV4dCBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZDpcbiAqIC0gYHBvc2l0aW9uYCZtZGFzaDtUaGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHRvb2xiYXIgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIFwidG9wXCIgYW5kIFwiYm90dG9tXCIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1jb25maWdcIj5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGlkPVwidG9wXCIgbmFtZT1cInBvc2l0aW9uXCIgY2xhc3M9XCJrLXJhZGlvXCIgdmFsdWU9XCJ0b3BcIiBjaGVja2VkIChjbGljayk9XCJwb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCIvPlxuICogICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwidG9wXCI+VG9wPC9sYWJlbD48YnIvPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgaWQ9XCJib3R0b21cIiBuYW1lPVwicG9zaXRpb25cIiBjbGFzcz1cImstcmFkaW9cIiB2YWx1ZT1cImJvdHRvbVwiIChjbGljayk9XCJwb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCIvPlxuICogICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiYm90dG9tXCI+Qm90dG9tPC9sYWJlbD48YnIvPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgaWQ9XCJib3RoXCIgbmFtZT1cInBvc2l0aW9uXCIgdmFsdWU9XCJib3RoXCIgY2xhc3M9XCJrLXJhZGlvXCIgKGNsaWNrKT1cInBvc2l0aW9uQ2hhbmdlKCRldmVudClcIi8+XG4gKiAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJib3RoXCI+Qm90aDwvbGFiZWw+PGJyLz5cbiAqICAgICAgIDwvZGl2PlxuICogICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZ3JpZERhdGFcIiBzdHlsZT1cImhlaWdodDogMjAwcHhcIj5cbiAqICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZSBbcG9zaXRpb25dPVwicG9zaXRpb25cIiBsZXQtcG9zaXRpb249XCJwb3NpdGlvblwiPlxuICogICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DbGljaygpXCIgY2xhc3M9XCJrLWJ1dHRvblwiPkN1c3RvbSBhY3Rpb248L2J1dHRvbj5cbiAqICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIj5cbiAqICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCI+XG4gKiAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgICBwdWJsaWMgcG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnYm90aCcgPSAndG9wJztcbiAqXG4gKiAgICAgcHVibGljIGdyaWREYXRhID0gW3tcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAqICAgICAgICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgICAgICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICAgICAgIH1cbiAqICAgICBdO1xuICpcbiAqICAgICBwdWJsaWMgb25DbGljaygpOiB2b2lkIHtcbiAqICAgICAgICAgY29uc29sZS5sb2coXCJidXR0b24gd2FzIGNsaWNrZWRcIik7XG4gKiAgICAgfVxuICpcbiAqICAgICBwdWJsaWMgcG9zaXRpb25DaGFuZ2UoeyB0YXJnZXQgfSk6IHZvaWQge1xuICogICAgICAgIHRoaXMucG9zaXRpb24gPSB0YXJnZXQudmFsdWU7XG4gKiAgICAgfVxuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBUb29sYmFyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBcInRvcFwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIHRvb2xiYXIgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyB0b29sYmFydGVtcGxhdGVfZ3JpZCAlfSkpLlxuICAgICAqXG4gICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICogLSBgdG9wYCZtZGFzaDtQb3NpdGlvbnMgdGhlIHRvb2xiYXIgYWJvdmUgdGhlIGdyb3VwIHBhbmVsIG9yIGhlYWRlci5cbiAgICAgKiAtIGBib3R0b21gJm1kYXNoO1Bvc2l0aW9ucyB0aGUgdG9vbGJhciBiZWxvdyB0aGUgcGFnZXIuXG4gICAgICogLSBgYm90aGAmbWRhc2g7RGlzcGxheXMgdHdvIHRvb2xiYXIgaW5zdGFuY2VzLiBQb3NpdGlvbnMgdGhlIGZpcnN0IG9uZSBhYm92ZVxuICAgICAqIHRoZSBncm91cCBwYW5lbCBvciBoZWFkZXIgYW5kIHRoZSBzZWNvbmQgb25lIGJlbG93IHRoZSBwYWdlci5cbiAgICAgKi9cbiAgICBzZXQgcG9zaXRpb24ocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB9XG4gICAgZ2V0IHBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gICAgfVxufVxuVG9vbGJhclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkVG9vbGJhclRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVG9vbGJhclRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5Ub29sYmFyVGVtcGxhdGVEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgcG9zaXRpb246IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbXCJwb3NpdGlvblwiLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTY3JvbGxTeW5jU2VydmljZSB7XG4gICAgY29uc3RydWN0b3Iobmdab25lKSB7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdGhpcy5oZWFkZXJTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHRoaXMuYm9keVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmNoYW5nZXMuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5zY3JvbGxMZWZ0KGFyZ3MpKSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyRW1pdHRlcihlbCwgc291cmNlVHlwZSkge1xuICAgICAgICB0aGlzLnVucmVnaXN0ZXIoc291cmNlVHlwZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGVsLCBzb3VyY2VUeXBlIH0pO1xuICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gXCJib2R5XCIgfHwgc291cmNlVHlwZSA9PT0gXCJoZWFkZXJcIikge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9icyA9IGZyb21FdmVudChlbCwgXCJzY3JvbGxcIikucGlwZShtYXAoKHsgdGFyZ2V0OiB7IHNjcm9sbExlZnQgfSB9KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlXG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4gKHguc2Nyb2xsTGVmdCA9PT0geS5zY3JvbGxMZWZ0KSksIGZpbHRlcih4ID0+ICF0aGlzLnNvdXJjZSB8fCB0aGlzLnNvdXJjZSA9PT0geC5zb3VyY2VUeXBlKSwgdGFwKHggPT4gdGhpcy5zb3VyY2UgPSB4LnNvdXJjZVR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB0aGlzLmNoYW5nZXMubmV4dCh4KSk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChvYnMucGlwZShmaWx0ZXIoeCA9PiB0aGlzLnNvdXJjZSAmJiB0aGlzLnNvdXJjZSAhPT0geC5zb3VyY2VUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNvdXJjZSA9IHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJvZHlTdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclN1YnNjcmlwdGlvbi5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBkZXN0cm95XG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaGVhZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuYm9keVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBzY3JvbGxMZWZ0KHsgc2Nyb2xsTGVmdCwgc291cmNlVHlwZSB9KSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHggPT4gc291cmNlVHlwZSAhPT0geC5zb3VyY2VUeXBlKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKCh7IGVsZW1lbnQgfSkgPT4gZWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyKHNvdXJjZVR5cGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguc291cmNlVHlwZSA9PT0gc291cmNlVHlwZSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gXCJoZWFkZXJcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VUeXBlID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuYm9keVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYm9keVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblNjcm9sbFN5bmNTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TY3JvbGxTeW5jU2VydmljZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUmVzaXplU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVzaXplU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWVtYmVyLW9yZGVyaW5nXG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuZGlzcGF0Y2hlci5hc09ic2VydmFibGUoKS5waXBlKHRocm90dGxlVGltZSgxMDApKTtcbiAgICB9XG4gICAgY29ubmVjdChyZXNpemVzKSB7XG4gICAgICAgIHRoaXMucmVzaXplU3Vic2NyaXB0aW9uLmFkZChyZXNpemVzLnN1YnNjcmliZSh0aGlzLmRpc3BhdGNoZXIpKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVzaXplU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzTG9ja2VkID0gY29sdW1uID0+IGNvbHVtbi5wYXJlbnQgPyBpc0xvY2tlZChjb2x1bW4ucGFyZW50KSA6ICEhY29sdW1uLmxvY2tlZDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCByZXNpemVBcmdzID0gKGNvbHVtbiwgZXh0cmEpID0+IE9iamVjdC5hc3NpZ24oe1xuICAgIGNvbHVtbnM6IGxlYWZDb2x1bW5zKFtjb2x1bW5dKSxcbiAgICBsb2NrZWQ6IGlzTG9ja2VkKGNvbHVtbilcbn0sIGV4dHJhKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTphbGlnblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIENvbHVtblJlc2l6aW5nU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYXRjaCA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KGNvbHVtbikge1xuICAgICAgICB0aGlzLnRyYWNrQ29sdW1ucyhjb2x1bW4pO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gKHRoaXMuY29sdW1uLmlzQ29sdW1uR3JvdXAgPyBbY29sdW1uXSA6IFtdKVxuICAgICAgICAgICAgLmNvbmNhdChsZWFmQ29sdW1ucyhbY29sdW1uXSkpO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgbG9ja2VkOiBpc0xvY2tlZCh0aGlzLmNvbHVtbiksXG4gICAgICAgICAgICB0eXBlOiAnc3RhcnQnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNpemVDb2x1bW5zKGRlbHRhUGVyY2VudCkge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSByZXNpemVBcmdzKHRoaXMuY29sdW1uLCB7XG4gICAgICAgICAgICBkZWx0YVBlcmNlbnQsXG4gICAgICAgICAgICB0eXBlOiAncmVzaXplQ29sdW1uJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoYWN0aW9uKTtcbiAgICB9XG4gICAgcmVzaXplVGFibGUoY29sdW1uLCBkZWx0YSkge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSByZXNpemVBcmdzKGNvbHVtbiwge1xuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICB0eXBlOiAncmVzaXplVGFibGUnXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdChhY3Rpb24pO1xuICAgIH1cbiAgICByZXNpemVkQ29sdW1uKHN0YXRlJCQxKSB7XG4gICAgICAgIHRoaXMucmVzaXplZENvbHVtbnMucHVzaChzdGF0ZSQkMSk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoe1xuICAgICAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgICAgICByZXNpemVkQ29sdW1uczogdGhpcy5yZXNpemVkQ29sdW1ucyxcbiAgICAgICAgICAgIHR5cGU6ICdlbmQnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWdpc3RlclRhYmxlKHRhYmxlTWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy50YWJsZXMucHVzaCh0YWJsZU1ldGFkYXRhKTtcbiAgICAgICAgY29uc3QgdW5yZWdpc3RlclRhYmxlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50YWJsZXMuc3BsaWNlKHRoaXMudGFibGVzLmluZGV4T2YodGFibGVNZXRhZGF0YSksIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdW5yZWdpc3RlclRhYmxlO1xuICAgIH1cbiAgICBtZWFzdXJlQ29sdW1ucyhpbmZvKSB7XG4gICAgICAgIGlmICh0aGlzLmJhdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoLnB1c2goLi4uaW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9GaXRCYXRjaChpbmZvLCAoKSA9PiB0aGlzLmVuZCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdXRvRml0KC4uLmNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgbm9uTG9ja2VkQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmlzTG9ja2VkKTtcbiAgICAgICAgdGhpcy5hdXRvRml0U3RhcnQobm9uTG9ja2VkQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuYXV0b0ZpdEJhdGNoKHRoaXMuYmF0Y2gsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChub25Mb2NrZWRDb2x1bW5zLmxlbmd0aCA8IGNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9ja2VkQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaXNMb2NrZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b0ZpdFN0YXJ0KGxvY2tlZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b0ZpdEJhdGNoKHRoaXMuYmF0Y2gsICgpID0+IHRoaXMuZW5kKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYWNrQ29sdW1ucyhjb2x1bW4pIHtcbiAgICAgICAgdGhpcy5yZXNpemVkQ29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICB9XG4gICAgYXV0b0ZpdFN0YXJ0KGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5iYXRjaCA9IFtdO1xuICAgICAgICB0aGlzLnJlc2l6ZWRDb2x1bW5zID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY2tlZCA9IGNvbHVtbnNbMF0uaXNMb2NrZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHtcbiAgICAgICAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgbG9ja2VkXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAndHJpZ2dlckF1dG9GaXQnLFxuICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgIGxvY2tlZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXV0b0ZpdEJhdGNoKGluZm8sIG9uQ29tcGxldGUpIHtcbiAgICAgICAgY29uc3QgbG9ja2VkID0gaW5mby5sZW5ndGggPiAwID8gaW5mb1swXS5jb2x1bW4uaXNMb2NrZWQgOiBmYWxzZTtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSB0aGlzLnRhYmxlc1xuICAgICAgICAgICAgLmZpbHRlcih0YWJsZSA9PiB0YWJsZS5sb2NrZWQgPT09IGxvY2tlZClcbiAgICAgICAgICAgIC5tYXAodGFibGUgPT4gdGFibGUuYXV0b0ZpdChpbmZvKSk7XG4gICAgICAgIHppcCguLi5vYnNlcnZhYmxlcylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHdpZHRocyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh7XG4gICAgICAgICAgICAgICAgY29sdW1uczogaW5mby5tYXAoaSA9PiBpLmNvbHVtbiksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2F1dG9GaXRDb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgd2lkdGhzLFxuICAgICAgICAgICAgICAgIGxvY2tlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAob25Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYmF0Y2ggPSBudWxsO1xuICAgIH1cbn1cbkNvbHVtblJlc2l6aW5nU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBoYXNGaWx0ZXJNZW51ID0gKHNldHRpbmdzKSA9PiB0eXBlb2Ygc2V0dGluZ3MgPT09ICdzdHJpbmcnICYmIHNldHRpbmdzLmluZGV4T2YoJ21lbnUnKSA+IC0xO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGhhc0ZpbHRlclJvdyA9IChzZXR0aW5ncykgPT4gc2V0dGluZ3MgPT09IHRydWUgfHwgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycgJiYgc2V0dGluZ3MuaW5kZXhPZigncm93JykgPiAtMSk7XG5cbmNvbnN0IGNvbnRhaW5zJDEgPSAobm9kZSwgcHJlZGljYXRlKSA9PiB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuICogQXJndW1lbnRzIGZvciB0aGUgYGNsb3NlYCBldmVudCBvZiB0aGUgZmlsdGVyIGFuZCBjb2x1bW4tbWVudSBwb3B1cC5cbiAqL1xuY2xhc3MgUG9wdXBDbG9zZUV2ZW50IGV4dGVuZHMgUHJldmVudGFibGVFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBlO1xuICAgIH1cbn1cbmNvbnN0IERFRkFVTFRfUE9QVVBfQ0xBU1MgPSAnay1ncmlkLWZpbHRlci1wb3B1cCc7XG4vKipcbiAqIFRoZSBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBmb3IgdGhlIHBvcHVwcyBvZiB0aGUgZmlsdGVyIGFuZCBjb2x1bW4gbWVudXNcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcmV1c2FibGVjdXN0b21maWx0ZXJzX2dyaWQgJX0jdG9jLWZpbHRlci1tZW51LXdpdGgtcG9wdXApKS5cbiAqL1xuY2xhc3MgU2luZ2xlUG9wdXBTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3B1cFNlcnZpY2UsIHJlbmRlcmVyLCBuZ1pvbmUsIHNjcm9sbFN5bmNTZXJ2aWNlLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2UgPSBwb3B1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgZmlsdGVyIG9yIGNvbHVtbiBtZW51cyBhcmUgYWJvdXQgdG8gY2xvc2UgYmVjYXVzZSB0aGUgdXNlciBjbGlja2VkIG91dHNpZGUgdGhlaXIgcG9wdXBzLlxuICAgICAgICAgKiBVc2VkIHRvIHByZXZlbnQgdGhlIHBvcHVwIGZyb20gY2xvc2luZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25DbG9zZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uID0gc2Nyb2xsU3luY1NlcnZpY2UuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb3BlbihhbmNob3IsIHRlbXBsYXRlLCBwb3B1cFJlZiwgcG9wdXBDbGFzcyA9IERFRkFVTFRfUE9QVVBfQ0xBU1MpIHtcbiAgICAgICAgY29uc3QgdG9nZ2xlID0gaXNQcmVzZW50KHBvcHVwUmVmKSAmJiB0aGlzLnBvcHVwUmVmID09PSBwb3B1cFJlZjtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmICghdG9nZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgICAgICAgICAgIGFuY2hvckFsaWduOiB7IHZlcnRpY2FsOiAnYm90dG9tJywgaG9yaXpvbnRhbDogZGlyZWN0aW9uIH0sXG4gICAgICAgICAgICAgICAgcG9wdXBBbGlnbjogeyB2ZXJ0aWNhbDogJ3RvcCcsIGhvcml6b250YWw6IGRpcmVjdGlvbiB9LFxuICAgICAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M6IHBvcHVwQ2xhc3MsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlOiBcImFic29sdXRlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5wb3B1cFJlZi5wb3B1cEVsZW1lbnQsICdkaXInLCB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncnRsJyA6ICdsdHInKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoQ2xvc2UoYW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3B1cFJlZjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcHVwUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaENsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVwUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGRldGFjaENsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZW1vdmVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF0dGFjaENsb3NlKHNraXBFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZGV0YWNoQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5yZW1vdmVDbGljayA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFwiZG9jdW1lbnRcIiwgXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250YWlucyQxKGUudGFyZ2V0LCB4ID0+IHRoaXMucG9wdXBSZWYucG9wdXBFbGVtZW50ID09PSB4IHx8IHggPT09IHNraXBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBuZXcgUG9wdXBDbG9zZUV2ZW50KGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZS5uZXh0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmICghYXJncy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5TaW5nbGVQb3B1cFNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblNpbmdsZVBvcHVwU2VydmljZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFBvcHVwU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IFNjcm9sbFN5bmNTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgYXBwZW5kID0gKGVsZW1lbnQpID0+IHtcbiAgICBsZXQgYXBwZW5kZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWFwcGVuZGVkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgYXBwZW5kZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH07XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGdldERvY3VtZW50ID0gZWxlbWVudCA9PiBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGdldFdpbmRvdyA9IGVsZW1lbnQgPT4gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IG9mZnNldCA9IGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IHsgY2xpZW50VG9wLCBjbGllbnRMZWZ0IH0gPSBnZXREb2N1bWVudChlbGVtZW50KTtcbiAgICBjb25zdCB7IHBhZ2VZT2Zmc2V0LCBwYWdlWE9mZnNldCB9ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICAgIGNvbnN0IHsgdG9wLCBsZWZ0IH0gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogdG9wICsgcGFnZVlPZmZzZXQgLSBjbGllbnRUb3AsXG4gICAgICAgIGxlZnQ6IGxlZnQgKyBwYWdlWE9mZnNldCAtIGNsaWVudExlZnRcbiAgICB9O1xufTtcbi8qKlxuICogQGhpZGRlblxuICogSWYgdGhlIHRhcmdldCBpcyBiZWZvcmUgdGhlIGRyYWdnYWJsZSBlbGVtZW50LCByZXR1cm5zIGB0cnVlYC5cbiAqXG4gKiBET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgPSA0XG4gKi9cbmNvbnN0IGlzVGFyZ2V0QmVmb3JlID0gKGRyYWdnYWJsZSwgdGFyZ2V0KSA9PiAodGFyZ2V0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRyYWdnYWJsZSkgJiA0KSAhPT0gMDtcbi8qKlxuICogQGhpZGRlblxuICogSWYgdGhlIGNvbnRhaW5lciBhbmQgdGhlIGVsZW1lbnQgYXJlIHRoZSBzYW1lXG4gKiBvciBpZiB0aGUgY29udGFpbmVyIGhvbGRzIChjb250YWlucykgdGhlIGVsZW1lbnQsIHJldHVybnMgYHRydWVgLlxuICpcbiAqIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSA9IDE2XG4gKi9cbmNvbnN0IGNvbnRhaW5zJDIgPSAoZWxlbWVudCwgY29udGFpbmVyKSA9PiBlbGVtZW50ID09PSBjb250YWluZXIgfHxcbiAgICAoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQpICYgMTYpICE9PSAwO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHBvc2l0aW9uID0gKHRhcmdldCwgYmVmb3JlKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IG9mZnNldCh0YXJnZXQpO1xuICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGgsIG9mZnNldEhlaWdodCB9ID0gdGFyZ2V0O1xuICAgIGNvbnN0IGxlZnQgPSB0YXJnZXRSZWN0LmxlZnQgKyAoYmVmb3JlID8gMCA6IG9mZnNldFdpZHRoKTtcbiAgICBjb25zdCB0b3AgPSB0YXJnZXRSZWN0LnRvcDtcbiAgICBjb25zdCBoZWlnaHQgPSBvZmZzZXRIZWlnaHQ7XG4gICAgcmV0dXJuIHsgbGVmdCwgdG9wLCBoZWlnaHQgfTtcbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEcmFnQW5kRHJvcFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIgPSBbXTtcbiAgICAgICAgdGhpcy5sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkKHRhcmdldCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyLnB1c2godGFyZ2V0KTtcbiAgICB9XG4gICAgcmVtb3ZlKHRhcmdldCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5maWx0ZXIoY3VycmVudCA9PiBjdXJyZW50ICE9PSB0YXJnZXQpO1xuICAgIH1cbiAgICBub3RpZnlEcmFnKGRyYWdnYWJsZSwgZWxlbWVudCwgbW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldEZvcihlbGVtZW50KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VzLm5leHQoe1xuICAgICAgICAgICAgZHJhZ2dhYmxlLFxuICAgICAgICAgICAgbW91c2VFdmVudCxcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5sYXN0VGFyZ2V0LFxuICAgICAgICAgICAgdHlwZTogJ2xlYXZlJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VzLm5leHQoe1xuICAgICAgICAgICAgICAgIGRyYWdnYWJsZSxcbiAgICAgICAgICAgICAgICBtb3VzZUV2ZW50LFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZW50ZXInXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RUYXJnZXQgPSB0YXJnZXQ7XG4gICAgfVxuICAgIG5vdGlmeURyb3AoZHJhZ2dhYmxlLCBtb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5uZXh0KHtcbiAgICAgICAgICAgIGRyYWdnYWJsZSxcbiAgICAgICAgICAgIG1vdXNlRXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMubGFzdFRhcmdldCxcbiAgICAgICAgICAgIHR5cGU6ICdkcm9wJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgdGFyZ2V0Rm9yKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcGFyZXIgPSBjb250YWlucyQyLmJpbmQobnVsbCwgZWxlbWVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyLmZpbmQoKHsgZWxlbWVudDogeyBuYXRpdmVFbGVtZW50IH0gfSkgPT4gY29tcGFyZXIobmF0aXZlRWxlbWVudCkpO1xuICAgIH1cbn1cbkRyYWdBbmREcm9wU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuY29uc3QgdXBkYXRlQ2xhc3MgPSAoZWxlbWVudCwgdmFsaWQpID0+IHtcbiAgICBjb25zdCBpY29uID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuay1pY29uJyk7XG4gICAgaWNvbi5jbGFzc05hbWUgPSBpY29uLmNsYXNzTmFtZVxuICAgICAgICAucmVwbGFjZSgvKHBsdXN8Y2FuY2VsKS8sIHZhbGlkID8gJ3BsdXMnIDogJ2NhbmNlbCcpO1xufTtcbmNvbnN0IHVwZGF0ZUxvY2sgPSAoZWxlbWVudCwgbG9ja2VkID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGljb24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5rLWljb24nKVsxXTtcbiAgICBjb25zdCB2YWx1ZSA9IGxvY2tlZCA9PSBudWxsID8gJycgOiAobG9ja2VkID8gJ2staS1sb2NrJyA6ICdrLWktdW5sb2NrJyk7XG4gICAgaWNvbi5jbGFzc05hbWUgPSBpY29uLmNsYXNzTmFtZVxuICAgICAgICAucmVwbGFjZSgvKGstaS11bmxvY2t8ay1pLWxvY2spLywgJycpICsgYCAke3ZhbHVlfWA7XG59O1xuY29uc3QgZGVjb3JhdGUgPSAoZWxlbWVudCwgdGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0U3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gJ2staGVhZGVyIGstZHJhZy1jbHVlJztcbiAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBlbGVtZW50LnN0eWxlLnpJbmRleCA9ICcyMDAwMCc7XG4gICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9IHRhcmdldFN0eWxlcy5wYWRkaW5nTGVmdDtcbiAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AgPSB0YXJnZXRTdHlsZXMucGFkZGluZ1RvcDtcbiAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdCb3R0b20gPSB0YXJnZXRTdHlsZXMucGFkZGluZ0JvdHRvbTtcbiAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9IHRhcmdldFN0eWxlcy5wYWRkaW5nUmlnaHQ7XG4gICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHRhcmdldFN0eWxlcy53aWR0aDtcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHRhcmdldFN0eWxlcy5oZWlnaHQ7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERyYWdIaW50U2VydmljZSB7XG4gICAgY29uc3RydWN0b3Ioc2FudGl6ZXIpIHtcbiAgICAgICAgdGhpcy5zYW50aXplciA9IHNhbnRpemVyO1xuICAgIH1cbiAgICBjcmVhdGUoZG93biwgdGFyZ2V0LCB0aXRsZSkge1xuICAgICAgICB0aGlzLmluaXRDb29yZHMoZG93bik7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGVjb3JhdGUodGhpcy5kb20sIHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHNhZmVUaXRsZSA9IHRoaXMuc2FudGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5kb20uaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1kcmFnLXN0YXR1cyBrLWktY2FuY2VsIGstaWNvbi13aXRoLW1vZGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLW1vZGlmaWVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgJHtzYWZlVGl0bGV9XG4gICAgICAgIGA7XG4gICAgfVxuICAgIGF0dGFjaCgpIHtcbiAgICAgICAgcmV0dXJuIGFwcGVuZCh0aGlzLmRvbSk7XG4gICAgfVxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9tICYmIHRoaXMuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpKTtcbiAgICAgICAgICAgIH0pKHRoaXMuZG9tKTsgLy8gaGFjayBmb3IgSUUgKyBwb2ludGVyIGV2ZW50cyFcbiAgICAgICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICB9XG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHVwZGF0ZUNsYXNzKHRoaXMuZG9tLCB0cnVlKTtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdXBkYXRlQ2xhc3ModGhpcy5kb20sIGZhbHNlKTtcbiAgICB9XG4gICAgcmVtb3ZlTG9jaygpIHtcbiAgICAgICAgdXBkYXRlTG9jayh0aGlzLmRvbSk7XG4gICAgfVxuICAgIHRvZ2dsZUxvY2sobG9ja2VkKSB7XG4gICAgICAgIHVwZGF0ZUxvY2sodGhpcy5kb20sIGxvY2tlZCk7XG4gICAgfVxuICAgIG1vdmUobW92ZSkge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS50b3AgPSB0aGlzLmluaXRpYWxUb3AgKyBtb3ZlLnBhZ2VZICsgJ3B4JztcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IHRoaXMuaW5pdGlhbExlZnQgKyBtb3ZlLnBhZ2VYICsgJ3B4JztcbiAgICB9XG4gICAgaW5pdENvb3Jkcyhkb3duKSB7XG4gICAgICAgIGNvbnN0IHsgdG9wLCBsZWZ0IH0gPSBvZmZzZXQoZG93bi5vcmlnaW5hbEV2ZW50LnRhcmdldCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbFRvcCA9IHRvcCAtIGRvd24ucGFnZVk7XG4gICAgICAgIHRoaXMuaW5pdGlhbExlZnQgPSBsZWZ0IC0gZG93bi5wYWdlWDtcbiAgICB9XG59XG5EcmFnSGludFNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRyYWdIaW50U2VydmljZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IERvbVNhbml0aXplciB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRHJvcEN1ZVNlcnZpY2Uge1xuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSAnay1ncm91cGluZy1kcm9wY2x1ZSc7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgICBhdHRhY2goKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmQodGhpcy5kb20pO1xuICAgIH1cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLmRvbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgfVxuICAgIHBvc2l0aW9uKHsgbGVmdCwgdG9wLCBoZWlnaHQgfSkge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdG9wICsgJ3B4JztcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmRvbS5vZmZzZXRXaWR0aCAvIDI7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLmxlZnQgPSBsZWZ0IC0gd2lkdGggKyAncHgnO1xuICAgIH1cbn1cbkRyb3BDdWVTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ29sdW1uUmVvcmRlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIHJlb3JkZXIoZSkge1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdChlKTtcbiAgICB9XG59XG5Db2x1bW5SZW9yZGVyU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIHRoZSBgY29sdW1uUmVvcmRlcmAgZXZlbnQuXG4gKi9cbmNsYXNzIENvbHVtblJlb3JkZXJFdmVudCBleHRlbmRzIFByZXZlbnRhYmxlRXZlbnQge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IGNvbHVtbiwgbmV3SW5kZXgsIG9sZEluZGV4IH0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMubmV3SW5kZXggPSBuZXdJbmRleDtcbiAgICAgICAgdGhpcy5vbGRJbmRleCA9IG9sZEluZGV4O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25NZXRhZGF0YSB7XG4gICAgY29uc3RydWN0b3IoZGF0YVJvd3MsIGhlYWRlclJvd3MsIGlzVmlydHVhbCwgaGFzUGFnZXIsIGhhc0RldGFpbFRlbXBsYXRlLCBncmlkRWxlbWVudCwgdmlydHVhbENvbHVtbnMsIGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5kYXRhUm93cyA9IGRhdGFSb3dzO1xuICAgICAgICB0aGlzLmhlYWRlclJvd3MgPSBoZWFkZXJSb3dzO1xuICAgICAgICB0aGlzLmlzVmlydHVhbCA9IGlzVmlydHVhbDtcbiAgICAgICAgdGhpcy5oYXNQYWdlciA9IGhhc1BhZ2VyO1xuICAgICAgICB0aGlzLmhhc0RldGFpbFRlbXBsYXRlID0gaGFzRGV0YWlsVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZ3JpZEVsZW1lbnQgPSBncmlkRWxlbWVudDtcbiAgICAgICAgdGhpcy52aXJ0dWFsQ29sdW1ucyA9IHZpcnR1YWxDb2x1bW5zO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgbWF4TG9naWNhbFJvd0luZGV4KCkge1xuICAgICAgICBjb25zdCBkYXRhUm93cyA9IHRoaXMuaGFzRGV0YWlsVGVtcGxhdGUgPyB0aGlzLmRhdGFSb3dzICogMiA6IHRoaXMuZGF0YVJvd3M7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlclJvd3MgKyBkYXRhUm93cyAtIDE7XG4gICAgfVxufVxuXG4vLyBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNlcnZpY2UgaXMgaW5zdGFudGlhdGVkLlxubGV0IHNlcXVlbmNlID0gMDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBJZFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByZWZpeCA9IGBrLWdyaWQke3NlcXVlbmNlKyt9YDtcbiAgICB9XG4gICAgY2VsbElkKHJvd0luZGV4LCBjb2xJbmRleCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LXIke3Jvd0luZGV4fWMke2NvbEluZGV4fWA7XG4gICAgfVxuICAgIHNlbGVjdGlvbkNoZWNrYm94SWQoaXRlbUluZGV4KSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0tY2hlY2tib3gke2l0ZW1JbmRleH1gO1xuICAgIH1cbiAgICBzZWxlY3RBbGxDaGVja2JveElkKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LXNlbGVjdC1hbGxgO1xuICAgIH1cbn1cbklkU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSWRTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDb2x1bW5JbmZvU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5sb2NrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29sdW1uUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lciA9IG5ldyBDb2x1bW5zQ29udGFpbmVyKCgpID0+IFtdKTtcbiAgICB9XG4gICAgZ2V0IGxvY2tlZExlYWZDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zQ29udGFpbmVyLmxvY2tlZExlYWZDb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgbm9uTG9ja2VkTGVhZkNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNDb250YWluZXIubm9uTG9ja2VkTGVhZkNvbHVtbnM7XG4gICAgfVxuICAgIGdldCBpc0xvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0IHRvdGFsTGV2ZWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zQ29udGFpbmVyLnRvdGFsTGV2ZWxzO1xuICAgIH1cbiAgICBnZXQgbGVhZk5hbWVkQ29sdW1ucygpIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGV4cGFuZENvbHVtbnModGhpcy5saXN0KCkuZmlsdGVyU29ydChjb2x1bW4gPT4gIWNvbHVtbi5pc0NvbHVtbkdyb3VwKSlcbiAgICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5tYXRjaGVzTWVkaWEgJiYgY29sdW1uLmRpc3BsYXlUaXRsZSk7XG4gICAgICAgIHJldHVybiBvcmRlckJ5KGNvbHVtbnMsIFt7IGZpZWxkOiAnbG9ja2VkJywgZGlyOiAnZGVzYycgfV0pO1xuICAgIH1cbiAgICBnZXQgdW5sb2NrZWRSb290Q291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QoKS5yb290Q29sdW1ucygpLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5sb2NrZWQgJiYgY29sdW1uLmlzVmlzaWJsZSkubGVuZ3RoO1xuICAgIH1cbiAgICBpbml0KGNvbHVtbnMsIGxpc3QpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zQ29udGFpbmVyID0gY29sdW1ucztcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY2hhbmdlVmlzaWJpbGl0eShjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudmlzaWJpbGl0eUNoYW5nZS5lbWl0KGNvbHVtbnMpO1xuICAgIH1cbiAgICBjaGFuZ2VMb2NrZWQoY29sdW1ucykge1xuICAgICAgICB0aGlzLmxvY2tlZENoYW5nZS5lbWl0KGNvbHVtbnMpO1xuICAgIH1cbn1cbkNvbHVtbkluZm9TZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU29ydFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgIH1cbiAgICBzb3J0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5uZXh0KHZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQXJndW1lbnRzIGZvciB0aGUgYGNvbHVtblZpc2liaWxpdHlDaGFuZ2VgIGV2ZW50LlxuICovXG5jbGFzcyBDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlRXZlbnQge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgfVxufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3IgdGhlIGBjb2x1bW5Mb2NrZWRDaGFuZ2VgIGV2ZW50LlxuICovXG5jbGFzcyBDb2x1bW5Mb2NrZWRDaGFuZ2VFdmVudCB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBHUk9VUF9DRUxMX1dJRFRIID0gMzI7IC8vIHRoaXMgc2hvdWxkIGJlIHRoZSB2YWx1ZSBvZiBncm91cC1jZWxsIGluc2lkZSB0aGUgdGhlbWUhXG5cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBkZWZhdWx0VHJhY2tCeShpbmRleCwgaXRlbSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRhJyAmJiBpdGVtLmlzRWRpdGluZykge1xuICAgICAgICByZXR1cm4gaXRlbS5kYXRhO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG59XG5cbmNvbnN0IGNyZWF0ZUNvbnRyb2wgPSAoc291cmNlKSA9PiAoYWNjLCBrZXkpID0+IHtcbiAgICBhY2Nba2V5XSA9IG5ldyBGb3JtQ29udHJvbChzb3VyY2Vba2V5XSk7XG4gICAgcmV0dXJuIGFjYztcbn07XG5jb25zdCB2YWxpZGF0ZUNvbHVtbnNGaWVsZCA9IChjb2x1bW5zKSA9PiBleHBhbmRDb2x1bW5zKGNvbHVtbnMudG9BcnJheSgpKVxuICAgIC5maWx0ZXIoaXNDb2x1bW5Db21wb25lbnQpXG4gICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiAhaXNWYWxpZEZpZWxkTmFtZShmaWVsZCkpXG4gICAgLmZvckVhY2goKHsgZmllbGQgfSkgPT4gY29uc29sZS53YXJuKGBcbiAgICAgICAgICAgICAgICBHcmlkIGNvbHVtbiBmaWVsZCBuYW1lICcke2ZpZWxkfScgZG9lcyBub3QgbG9vayBsaWtlIGEgdmFsaWQgSmF2YVNjcmlwdCBpZGVudGlmaWVyLlxuICAgICAgICAgICAgICAgIElkZW50aWZpZXJzIGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBcIiRcIiBvciBcIl9cIiksIGFuZCBtYXkgbm90IHN0YXJ0IHdpdGggYSBkaWdpdC5cbiAgICAgICAgICAgICAgICBQbGVhc2UgdXNlIG9ubHkgdmFsaWQgaWRlbnRpZmllciBuYW1lcyB0byBlbnN1cmUgZXJyb3ItZnJlZSBvcGVyYXRpb24uXG4gICAgICAgICAgICBgKSk7XG5jb25zdCBoYW5kbGVFeHBhbmRDb2xsYXBzZVNlcnZpY2UgPSAoc2VydmljZSwgZXhwYW5kRW1pdHRlciwgY29sbGFwc2VFbWl0dGVyLCBtYXAkJDEpID0+IChzZXJ2aWNlLmNoYW5nZXMucGlwZShmaWx0ZXIoKHsgZGF0YUl0ZW0gfSkgPT4gaXNQcmVzZW50KGRhdGFJdGVtKSkpXG4gICAgLnN1YnNjcmliZSgoeCkgPT4geC5leHBhbmQgPyBleHBhbmRFbWl0dGVyLmVtaXQobWFwJCQxKHgpKSA6IGNvbGxhcHNlRW1pdHRlci5lbWl0KG1hcCQkMSh4KSkpKTtcbmNvbnN0IGlzSW5FZGl0ZWRDZWxsID0gKGVsZW1lbnQsIGdyaWRFbGVtZW50KSA9PiBjbG9zZXN0KGVsZW1lbnQsIG1hdGNoZXNDbGFzc2VzKCdrLWdyaWQtZWRpdC1jZWxsJykpICYmXG4gICAgY2xvc2VzdChlbGVtZW50LCBtYXRjaGVzTm9kZU5hbWUoJ2tlbmRvLWdyaWQnKSkgPT09IGdyaWRFbGVtZW50O1xuY29uc3QgybU0JDIgPSBFTVBUWV9DRUxMX0NPTlRFWFQ7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIEtlbmRvIFVJIEdyaWQgY29tcG9uZW50IGZvciBBbmd1bGFyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImdyaWREYXRhXCI+XG4gKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgYFxuICogfSlcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueVtdID0gcHJvZHVjdHM7XG4gKiB9XG4gKlxuICogY29uc3QgcHJvZHVjdHMgPSBbe1xuICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICBcIlVuaXRQcmljZVwiOiAxOC4wMDAwLFxuICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICogIH0sIHtcbiAqICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAqICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZVxuICogIH1cbiAqIF07XG4gKiBgYGBcbiAqL1xuY2xhc3MgR3JpZENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Ioc3VwcG9ydFNlcnZpY2UsIHNlbGVjdGlvblNlcnZpY2UsIGNlbGxTZWxlY3Rpb25TZXJ2aWNlLCB3cmFwcGVyLCBncm91cEluZm9TZXJ2aWNlLCBncm91cHNTZXJ2aWNlLCBjaGFuZ2VOb3RpZmljYXRpb24sIGRldGFpbHNTZXJ2aWNlLCBlZGl0U2VydmljZSwgZmlsdGVyU2VydmljZSwgcGRmU2VydmljZSwgcmVzcG9uc2l2ZVNlcnZpY2UsIHJlbmRlcmVyLCBleGNlbFNlcnZpY2UsIG5nWm9uZSwgc2Nyb2xsU3luY1NlcnZpY2UsIGRvbUV2ZW50cywgY29sdW1uUmVzaXppbmdTZXJ2aWNlLCBjaGFuZ2VEZXRlY3RvclJlZiwgY29sdW1uUmVvcmRlclNlcnZpY2UsIGNvbHVtbkluZm9TZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgc29ydFNlcnZpY2UsIHNjcm9sbFJlcXVlc3RTZXJ2aWNlLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0U2VydmljZSA9IHN1cHBvcnRTZXJ2aWNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UgPSBzZWxlY3Rpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNlbGxTZWxlY3Rpb25TZXJ2aWNlID0gY2VsbFNlbGVjdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIHRoaXMuZ3JvdXBJbmZvU2VydmljZSA9IGdyb3VwSW5mb1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZSA9IGdyb3Vwc1NlcnZpY2U7XG4gICAgICAgIHRoaXMuY2hhbmdlTm90aWZpY2F0aW9uID0gY2hhbmdlTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLmRldGFpbHNTZXJ2aWNlID0gZGV0YWlsc1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UgPSBlZGl0U2VydmljZTtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlID0gZmlsdGVyU2VydmljZTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlID0gcGRmU2VydmljZTtcbiAgICAgICAgdGhpcy5yZXNwb25zaXZlU2VydmljZSA9IHJlc3BvbnNpdmVTZXJ2aWNlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuZXhjZWxTZXJ2aWNlID0gZXhjZWxTZXJ2aWNlO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5zY3JvbGxTeW5jU2VydmljZSA9IHNjcm9sbFN5bmNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmRvbUV2ZW50cyA9IGRvbUV2ZW50cztcbiAgICAgICAgdGhpcy5jb2x1bW5SZXNpemluZ1NlcnZpY2UgPSBjb2x1bW5SZXNpemluZ1NlcnZpY2U7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYgPSBjaGFuZ2VEZXRlY3RvclJlZjtcbiAgICAgICAgdGhpcy5jb2x1bW5SZW9yZGVyU2VydmljZSA9IGNvbHVtblJlb3JkZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLmNvbHVtbkluZm9TZXJ2aWNlID0gY29sdW1uSW5mb1NlcnZpY2U7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBuYXZpZ2F0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5zb3J0U2VydmljZSA9IHNvcnRTZXJ2aWNlO1xuICAgICAgICB0aGlzLnNjcm9sbFJlcXVlc3RTZXJ2aWNlID0gc2Nyb2xsUmVxdWVzdFNlcnZpY2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBHcmlkLiBJZiBhbiBhcnJheSBpcyBwcm92aWRlZCwgdGhlIEdyaWQgYXV0b21hdGljYWxseSBnZXRzIHRoZSB0b3RhbCBjb3VudFxuICAgICAgICAgKiAoW21vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVdKHslIHNsdWcgZGF0YWJpbmRpbmdfZ3JpZCAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBzY3JvbGwgbW9kZSB1c2VkIGJ5IHRoZSBHcmlkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICAgICAgICAgKiAgLSBgbm9uZWAmbWRhc2g7UmVuZGVycyBubyBzY3JvbGxiYXIuXG4gICAgICAgICAqICAtIGBzY3JvbGxhYmxlYCZtZGFzaDtUaGUgZGVmYXVsdCBzY3JvbGwgbW9kZS4gSXQgcmVxdWlyZXMgdGhlIHNldHRpbmcgb2YgdGhlIGBoZWlnaHRgIG9wdGlvbi5cbiAgICAgICAgICogIC0gYHZpcnR1YWxgJm1kYXNoO0Rpc3BsYXlzIG5vIHBhZ2VyIGFuZCByZW5kZXJzIGEgcG9ydGlvbiBvZiB0aGUgZGF0YSAob3B0aW1pemVkIHJlbmRlcmluZykgd2hpbGUgdGhlIHVzZXIgaXMgc2Nyb2xsaW5nIHRoZSBjb250ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlID0gJ3Njcm9sbGFibGUnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcyB0aGUgc2luZ2xlLXJvdyBbc2VsZWN0aW9uXSh7JSBzbHVnIHNlbGVjdGlvbl9ncmlkICV9KSBvZiB0aGUgR3JpZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIHRyYWNrIGNoYW5nZXMgZm9yIHRoZSBkYXRhIHJvd3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBHcmlkIHRyYWNrcyBjaGFuZ2VzIGJ5IHRoZSBpbmRleCBvZiB0aGUgZGF0YSBpdGVtLlxuICAgICAgICAgKiBFZGl0ZWQgcm93cyBhcmUgdHJhY2tlZCBieSByZWZlcmVuY2UuXG4gICAgICAgICAqIEluIHNvbWUgY2FzZXMsIHlvdSBtaWdodCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLFxuICAgICAgICAgKiBmb3IgZXhhbXBsZSwgd2hlbiB5b3UgaW1wbGVtZW50IGVkaXRpbmcgd2l0aCBpbW11dGFibGUgZGF0YSBpdGVtcy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdHJhY2sgaXRlbXMgb25seSBieSBpbmRleC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gICAgICAgICAqIGltcG9ydCB7IEdyaWRJdGVtIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZCc7XG4gICAgICAgICAqXG4gICAgICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgICAgICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgKiAgICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZ3JpZERhdGFcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCI+XG4gICAgICAgICAqICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gICAgICAgICAqICAgIGBcbiAgICAgICAgICogfSlcbiAgICAgICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgICAgICogICAgcHVibGljIGdyaWREYXRhOiBhbnlbXSA9IHByb2R1Y3RzO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICBwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBHcmlkSXRlbSk6IGFueSB7XG4gICAgICAgICAqICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgICogICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgICogICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnN0IHByb2R1Y3RzID0gW3tcbiAgICAgICAgICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAgICAgICAgICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAgICAgICAgICogICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAgICAgICAgICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICAgICAgICAgKiAgfSwge1xuICAgICAgICAgKiAgICBcIlByb2R1Y3RJRFwiOiAyLFxuICAgICAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAgICAgICAgICogICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAgICAgICAgICogICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAgICAgICAgICogIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrQnkgPSBkZWZhdWx0VHJhY2tCeTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBncmlkIHdpbGwgcmVuZGVyIG9ubHkgdGhlIGNvbHVtbnMgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZpcnR1YWxDb2x1bW5zID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSBbZmlsdGVyaW5nXSh7JSBzbHVnIGZpbHRlcmluZ19ncmlkICV9KSBvZiB0aGUgR3JpZCBjb2x1bW5zIHRoYXQgaGF2ZSB0aGVpciBgZmllbGRgIG9wdGlvbiBzZXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlcmFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgdGhlIFtzb3J0aW5nXSh7JSBzbHVnIHNvcnRpbmdfZ3JpZCAlfSkgb2YgdGhlIEdyaWQgY29sdW1ucyB0aGF0IGhhdmUgdGhlaXIgYGZpZWxkYCBvcHRpb24gc2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3J0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29uZmlndXJlcyB0aGUgcGFnZXIgb2YgdGhlIEdyaWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBwYWdpbmdfZ3JpZCAlfSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICAgICAgICAgKiAtIGBidXR0b25Db3VudDogTnVtYmVyYCZtZGFzaDtTZXRzIHRoZSBtYXhpbXVtIG51bWVyaWMgYnV0dG9ucyBjb3VudCBiZWZvcmUgdGhlIGJ1dHRvbnMgYXJlIGNvbGxhcHNlZC5cbiAgICAgICAgICogLSBgaW5mbzogQm9vbGVhbmAmbWRhc2g7VG9nZ2xlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzLlxuICAgICAgICAgKiAtIGB0eXBlOiBQYWdlclR5cGVgJm1kYXNoO0FjY2VwdHMgdGhlIGBudW1lcmljYCAoYnV0dG9ucyB3aXRoIG51bWJlcnMpIGFuZCBgaW5wdXRgIChpbnB1dCBmb3IgdHlwaW5nIHRoZSBwYWdlIG51bWJlcikgdmFsdWVzLlxuICAgICAgICAgKiAtIGBwYWdlU2l6ZXM6IEJvb2xlYW5gIG9yIGBBcnJheTxudW1iZXI+YCZtZGFzaDtTaG93cyBhIG1lbnUgZm9yIHNlbGVjdGluZyB0aGUgcGFnZSBzaXplLlxuICAgICAgICAgKiAtIGBwcmV2aW91c05leHQ6IEJvb2xlYW5gJm1kYXNoO1RvZ2dsZXMgdGhlICoqUHJldmlvdXMqKiBhbmQgKipOZXh0KiogYnV0dG9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFnZWFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB1c2VyIGNhbiBncm91cCB0aGUgR3JpZCBieSBkcmFnZ2luZyB0aGUgY29sdW1uIGhlYWRlciBjZWxscy5cbiAgICAgICAgICogQnkgZGVmYXVsdCwgZ3JvdXBpbmcgaXMgZGlzYWJsZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBncm91cGluZ2Jhc2ljc19ncmlkICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdyb3VwYWJsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHVzZXIgY2FuIHVzZSBkZWRpY2F0ZWQgc2hvcnRjdXRzIHRvIGludGVyYWN0IHdpdGggdGhlIEdyaWQuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIG5hdmlnYXRpb24gaXMgZGlzYWJsZWQgYW5kIHRoZSBHcmlkIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSBpbiB0aGUgbm9ybWFsIHRhYiBzZXF1ZW5jZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF2aWdhYmxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgR3JpZCBjb2x1bW5zIHdpbGwgYmUgcmVzaXplZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gc28gdGhhdFxuICAgICAgICAgKiB0aGV5IGZpdCB0aGVpciBoZWFkZXJzIGFuZCByb3cgY29udGVudC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICogQ29sdW1ucyB3aXRoIGBhdXRvU2l6ZWAgc2V0IHRvIGBmYWxzZWAgYXJlIGV4Y2x1ZGVkLlxuICAgICAgICAgKiBUbyBkeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbHVtbiB3aWR0aCB0byBtYXRjaCB0aGUgbmV3IGNvbnRlbnQsXG4gICAgICAgICAqIHJlZmVyIHRvIFt0aGlzIGV4YW1wbGVdKHslIHNsdWcgcmVzaXppbmdfY29sdW1uc19ncmlkICV9KS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0b1NpemUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB1c2VyIGNhbiByZXNpemUgY29sdW1ucyBieSBkcmFnZ2luZyB0aGUgZWRnZXMgKHJlc2l6ZSBoYW5kbGVzKSBvZiB0aGVpciBoZWFkZXIgY2VsbHNcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyByZXNpemluZ19jb2x1bW5zX2dyaWQgJX0pKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzaXphYmxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdXNlciBjYW4gcmVvcmRlciBjb2x1bW5zIGJ5IGRyYWdnaW5nIHRoZWlyIGhlYWRlciBjZWxsc1xuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJlb3JkZXJpbmdfY29sdW1uc19ncmlkICV9KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlb3JkZXJhYmxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIG9mIHRoZSBHcmlkIHdpbGwgYmUgZGlzcGxheWVkIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZGF0YWJpbmRpbmdfZ3JpZCAlfSkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBtZW51IG9mIHRoZSBjb2x1bW5zIHdpbGwgYmUgZGlzcGxheWVkIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgY29sdW1ubWVudV9ncmlkICV9KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbk1lbnUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgaGVhZGVyIG9mIHRoZSBncmlkIHdpbGwgYmUgaGlkZGVuLiBUaGUgaGVhZGVyIGlzIHZpc2libGUgYnkgZGVmYXVsdC5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBUaGUgaGVhZGVyIGluY2x1ZGVzIGNvbHVtbiBoZWFkZXJzIGFuZCB0aGUgW2ZpbHRlciByb3ddKHslIHNsdWcgZmlsdGVyaW5nX2dyaWQgJX0jdG9jLWZpbHRlci1yb3cpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oaWRlSGVhZGVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBHcmlkIGZpbHRlciBpcyBtb2RpZmllZCB0aHJvdWdoIHRoZSBVSS5cbiAgICAgICAgICogWW91IGhhdmUgdG8gaGFuZGxlIHRoZSBldmVudCB5b3Vyc2VsZiBhbmQgZmlsdGVyIHRoZSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBwYWdlIG9mIHRoZSBHcmlkIGlzIGNoYW5nZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBwYWdpbmdfZ3JpZCAlfSkpLlxuICAgICAgICAgKiBZb3UgaGF2ZSB0byBoYW5kbGUgdGhlIGV2ZW50IHlvdXJzZWxmIGFuZCBwYWdlIHRoZSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgZ3JvdXBpbmcgb2YgdGhlIEdyaWQgaXMgY2hhbmdlZC5cbiAgICAgICAgICogWW91IGhhdmUgdG8gaGFuZGxlIHRoZSBldmVudCB5b3Vyc2VsZiBhbmQgZ3JvdXAgdGhlIGRhdGEgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBncm91cGluZ2Jhc2ljc19ncmlkICV9KSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdyb3VwQ2hhbmdlID0gbmV3IFpvbmVBd2FyZUV2ZW50RW1pdHRlcih0aGlzLm5nWm9uZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBzb3J0aW5nIG9mIHRoZSBHcmlkIGlzIGNoYW5nZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzb3J0aW5nX2dyaWQgJX0pKS5cbiAgICAgICAgICogWW91IGhhdmUgdG8gaGFuZGxlIHRoZSBldmVudCB5b3Vyc2VsZiBhbmQgc29ydCB0aGUgZGF0YS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIEdyaWQgcm93LlxuICAgICAgICAgKiBFbWl0cyB0aGUgW2BTZWxlY3Rpb25FdmVudGBdKHslIHNsdWcgYXBpX2dyaWRfc2VsZWN0aW9uZXZlbnQgJX0jdG9jLXNlbGVjdGlvbmNoYW5nZSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGRhdGEgc3RhdGUgb2YgdGhlIEdyaWQgaXMgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGF0YVN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBleHBhbmRzIGEgZ3JvdXAgaGVhZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cEV4cGFuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY29sbGFwc2VzIGEgZ3JvdXAgaGVhZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cENvbGxhcHNlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBleHBhbmRzIGEgbWFzdGVyIHJvdy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGV0YWlsRXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjb2xsYXBzZXMgYSBtYXN0ZXIgcm93LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXRhaWxDb2xsYXBzZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSAqKkVkaXQqKiBjb21tYW5kIGJ1dHRvbiB0byBlZGl0IGEgcm93XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ190ZW1wbGF0ZV9mb3Jtc19ncmlkICV9I3RvYy1lZGl0aW5nLXJlY29yZHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSAqKkNhbmNlbCoqIGNvbW1hbmQgYnV0dG9uIHRvIGNsb3NlIGEgcm93XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ190ZW1wbGF0ZV9mb3Jtc19ncmlkICV9I3RvYy1jYW5jZWxsaW5nLWVkaXRpbmcpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlICoqU2F2ZSoqIGNvbW1hbmQgYnV0dG9uIHRvIHNhdmUgY2hhbmdlcyBpbiBhIHJvd1xuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfdGVtcGxhdGVfZm9ybXNfZ3JpZCAlfSN0b2Mtc2F2aW5nLXJlY29yZHMpKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSAqKlJlbW92ZSoqIGNvbW1hbmQgYnV0dG9uIHRvIHJlbW92ZSBhIHJvd1xuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfdGVtcGxhdGVfZm9ybXNfZ3JpZCAlfSN0b2MtcmVtb3ZpbmctcmVjb3JkcykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgKipBZGQqKiBjb21tYW5kIGJ1dHRvbiB0byBhZGQgYSBuZXcgcm93XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ190ZW1wbGF0ZV9mb3Jtc19ncmlkICV9I3RvYy1hZGRpbmctcmVjb3JkcykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZGQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGxlYXZlcyBhbiBlZGl0ZWQgY2VsbCAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfaW5jZWxsX2dyaWQgJX0jdG9jLWJhc2ljLWNvbmNlcHRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNlbGxDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgY2VsbCAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfaW5jZWxsX2dyaWQgJX0jdG9jLWJhc2ljLWNvbmNlcHRzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNlbGxDbGljayA9IG5ldyBab25lQXdhcmVFdmVudEVtaXR0ZXIodGhpcy5uZ1pvbmUpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlICoqRXhwb3J0IHRvIFBERioqIGNvbW1hbmQgYnV0dG9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wZGZFeHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgKipFeHBvcnQgdG8gRXhjZWwqKiBjb21tYW5kIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhjZWxFeHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgcmVzaXppbmcgb2YgdGhlIGNvbHVtbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXplID0gbmV3IFpvbmVBd2FyZUV2ZW50RW1pdHRlcih0aGlzLm5nWm9uZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgcmVvcmRlcmluZyBvZiB0aGUgY29sdW1uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5SZW9yZGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb2x1bW5zIGZyb20gdGhlIGNvbHVtbiBtZW51IG9yIGNvbHVtbiBjaG9vc2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBsb2NrZWQgc3RhdGUgb2YgdGhlIGNvbHVtbnMgZnJvbSB0aGUgY29sdW1uIG1lbnUgb3IgYnkgcmVvcmRlcmluZyB0aGUgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTG9ja2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBzY3JvbGxzIHRvIHRoZSBsYXN0IHJlY29yZCBvbiB0aGUgcGFnZSBhbmQgZW5hYmxlcyBlbmRsZXNzIHNjcm9sbGluZ1xuICAgICAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHNjcm9sbG1tb2Rlc19ncmlkICV9I3RvYy1lbmRsZXNzLXNjcm9sbGluZykpLlxuICAgICAgICAgKiBZb3UgaGF2ZSB0byBoYW5kbGUgdGhlIGV2ZW50IHlvdXJzZWxmIGFuZCBwYWdlIHRoZSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zY3JvbGxCb3R0b20gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBncmlkIGNvbnRlbnQgaXMgc2Nyb2xsZWQuXG4gICAgICAgICAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4gRW50ZXIgdGhlIEFuZ3VsYXIgem9uZSBpZiB5b3UgbWFrZSBhbnkgY2hhbmdlcyB0aGF0IHJlcXVpcmUgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29udGVudFNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcXVlcnkgbGlzdCBvZiBhbGwgZGVjbGFyZWQgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy5mb290ZXIgPSBuZXcgUXVlcnlMaXN0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRGlyZWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lciA9IG5ldyBDb2x1bW5zQ29udGFpbmVyKCgpID0+IHRoaXMuY29sdW1uTGlzdC5maWx0ZXJIaWVyYXJjaHkoY29sdW1uID0+IHtcbiAgICAgICAgICAgIGNvbHVtbi5tYXRjaGVzTWVkaWEgPSB0aGlzLm1hdGNoZXNNZWRpYShjb2x1bW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IERhdGFDb2xsZWN0aW9uKCgpID0+IG5ldyBEYXRhUmVzdWx0SXRlcmF0b3IodGhpcy5kYXRhLCB0aGlzLnNraXAsIHRoaXMuaGFzR3JvdXBGb290ZXJzKSk7XG4gICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGVDb2x1bW5zID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc29ydCA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLl9ncm91cCA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLl9za2lwID0gMDtcbiAgICAgICAgdGhpcy5jYWNoZWRXaW5kb3dXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY2VsbFNlbGVjdGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5ydGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3MgPSAoKSA9PiBudWxsO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvblN1YnNjcmlwdGlvbiA9IGxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoeyBydGwgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydGwgPSBydGw7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JvdXBJbmZvU2VydmljZS5yZWdpc3RlckNvbHVtbnNDb250YWluZXIoKCkgPT4gdGhpcy5jb2x1bW5MaXN0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5JbmZvU2VydmljZS5pbml0KHRoaXMuY29sdW1uc0NvbnRhaW5lciwgKCkgPT4gdGhpcy5jb2x1bW5MaXN0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5jb2x1bW5JbmZvU2VydmljZS52aXNpYmlsaXR5Q2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdlLmVtaXQobmV3IENvbHVtblZpc2liaWxpdHlDaGFuZ2VFdmVudChjaGFuZ2VkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbHVtbkxvY2tlZENoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuY29sdW1uSW5mb1NlcnZpY2UubG9ja2VkQ2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5Mb2NrZWRDaGFuZ2UuZW1pdChuZXcgQ29sdW1uTG9ja2VkQ2hhbmdlRXZlbnQoY2hhbmdlZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cEV4cGFuZENvbGxhcHNlU3Vic2NyaXB0aW9uID0gaGFuZGxlRXhwYW5kQ29sbGFwc2VTZXJ2aWNlKGdyb3Vwc1NlcnZpY2UsIHRoaXMuZ3JvdXBFeHBhbmQsIHRoaXMuZ3JvdXBDb2xsYXBzZSwgKHsgZGF0YUl0ZW06IGdyb3VwLCBpbmRleCB9KSA9PiAoeyBncm91cCwgZ3JvdXBJbmRleDogaW5kZXggfSkpO1xuICAgICAgICB0aGlzLmRldGFpbHNTZXJ2aWNlU3Vic2NyaXB0aW9uID0gaGFuZGxlRXhwYW5kQ29sbGFwc2VTZXJ2aWNlKGRldGFpbHNTZXJ2aWNlLCB0aGlzLmRldGFpbEV4cGFuZCwgdGhpcy5kZXRhaWxDb2xsYXBzZSwgYXJncyA9PiBhcmdzKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTdWJzY3JpcHRpb24gPSB0aGlzLmZpbHRlclNlcnZpY2UuY2hhbmdlcy5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uID0gdGhpcy5zb3J0U2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hdHRhY2hTdGF0ZUNoYW5nZXNFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYXR0YWNoRWRpdEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuYXR0YWNoRG9tRXZlbnRIYW5kbGVycygpO1xuICAgICAgICB0aGlzLnBkZlN1YnNjcmlwdGlvbiA9IHRoaXMucGRmU2VydmljZS5leHBvcnRDbGljay5zdWJzY3JpYmUodGhpcy5lbWl0UERGRXhwb3J0RXZlbnQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZXhjZWxTdWJzY3JpcHRpb24gPSB0aGlzLmV4Y2VsU2VydmljZS5leHBvcnRDbGljay5zdWJzY3JpYmUodGhpcy5zYXZlQXNFeGNlbC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zQ29udGFpbmVyQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29sdW1uUmVzaXplKCk7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdCA9IG5ldyBDb2x1bW5MaXN0KHRoaXMuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuY29sdW1uUmVvcmRlclN1YnNjcmlwdGlvbiA9IHRoaXMuY29sdW1uUmVvcmRlclNlcnZpY2VcbiAgICAgICAgICAgIC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnJlb3JkZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuY29sdW1uUmFuZ2VDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbHVtbkluZm9TZXJ2aWNlLmNvbHVtblJhbmdlQ2hhbmdlLnN1YnNjcmliZSh0aGlzLm9uQ29sdW1uUmFuZ2VDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHRvIGJlIHNraXBwZWQgYnkgdGhlIHBhZ2VyLlxuICAgICAqIFJlcXVpcmVkIGJ5IHRoZSBbcGFnaW5nXSh7JSBzbHVnIHBhZ2luZ19ncmlkICV9KSBmdW5jdGlvbmFsaXR5LlxuICAgICAqL1xuICAgIGdldCBza2lwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2tpcDtcbiAgICB9XG4gICAgc2V0IHNraXAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NraXAgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRvcnMgYnkgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzb3J0ZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzb3J0aW5nX2dyaWQgJX0pKS5cbiAgICAgKi9cbiAgICBzZXQgc29ydCh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc29ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdG9ycyBieSB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIGdyb3VwZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBncm91cGluZ2Jhc2ljc19ncmlkICV9KSkuXG4gICAgICovXG4gICAgc2V0IGdyb3VwKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXAgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKi9cbiAgICBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBzaG93VG9wVG9vbGJhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbGJhclRlbXBsYXRlICYmIFsndG9wJywgJ2JvdGgnXS5pbmRleE9mKHRoaXMudG9vbGJhclRlbXBsYXRlLnBvc2l0aW9uKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHNob3dCb3R0b21Ub29sYmFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b29sYmFyVGVtcGxhdGUgJiYgWydib3R0b20nLCAnYm90aCddLmluZGV4T2YodGhpcy50b29sYmFyVGVtcGxhdGUucG9zaXRpb24pID4gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaXNMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgc2hvd1BhZ2VyKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNWaXJ0dWFsICYmIHRoaXMucGFnZWFibGUgIT09IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHNob3dHcm91cFBhbmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cGFibGUgJiYgdGhpcy5ncm91cGFibGUuZW5hYmxlZCAhPT0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgZ3JvdXBhYmxlRW1wdHlUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cGFibGUuZW1wdHlUZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG1hcnF1ZWVTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZW5hYmxlTWFycXVlZSB8fCB0aGlzLmNlbGxTZWxlY3Rpb25TZXJ2aWNlLmVuYWJsZU1hcnF1ZWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEFuIGFsaWFzIGZvciBgbmF2aWdhYmxlYCBmb3IgdXNlcnMgd2hvIG1pZ3JhdGUgZnJvbSBLZW5kbyBVSSBmb3IgalF1ZXJ5LlxuICAgICAqL1xuICAgIHNldCBuYXZpZ2F0YWJsZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdmlnYWJsZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG5hdmlnYXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2FibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGZvciBldmVyeSBkYXRhIHJvdyBpbiB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAgICAgKiBpbXBvcnQgeyBSb3dDbGFzc0FyZ3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcbiAgICAgKlxuICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgKiAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICogICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICAgKiAgICBzdHlsZXM6IFtgXG4gICAgICogICAgICAgIC5rLWdyaWQgdHIuZXZlbiB7IGJhY2tncm91bmQtY29sb3I6ICNmNDVjNDI7IH1cbiAgICAgKiAgICAgICAgLmstZ3JpZCB0ci5vZGQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNDFmNGRmOyB9XG4gICAgICogICAgYF0sXG4gICAgICogICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZ3JpZERhdGFcIiBbcm93Q2xhc3NdPVwicm93Q2FsbGJhY2tcIj5cbiAgICAgKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICAgICAqICAgIGBcbiAgICAgKiB9KVxuICAgICAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gICAgICogICAgcHVibGljIGdyaWREYXRhOiBhbnlbXSA9IHByb2R1Y3RzO1xuICAgICAqXG4gICAgICogICAgcHVibGljIHJvd0NhbGxiYWNrKGNvbnRleHQ6IFJvd0NsYXNzQXJncykge1xuICAgICAqICAgICAgICBjb25zdCBpc0V2ZW4gPSBjb250ZXh0LmluZGV4ICUgMiA9PSAwO1xuICAgICAqICAgICAgICByZXR1cm4ge1xuICAgICAqICAgICAgICAgICAgZXZlbjogaXNFdmVuLFxuICAgICAqICAgICAgICAgICAgb2RkOiAhaXNFdmVuXG4gICAgICogICAgICAgIH07XG4gICAgICogICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHByb2R1Y3RzID0gW3tcbiAgICAgKiAgICBcIlByb2R1Y3RJRFwiOiAxLFxuICAgICAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gICAgICogICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAgICAgKiAgICBcIkRpc2NvbnRpbnVlZFwiOiB0cnVlXG4gICAgICogIH0sIHtcbiAgICAgKiAgICBcIlByb2R1Y3RJRFwiOiAyLFxuICAgICAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICAgICAqICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gICAgICogICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAgICAgKiAgfVxuICAgICAqIF07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IHJvd0NsYXNzKGZuKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUgJiYgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJvd0NsYXNzIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoZm4pfS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb3dDbGFzcyA9IGZuO1xuICAgIH1cbiAgICBnZXQgcm93Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dDbGFzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIEJvb2xlYW4gZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBmb3IgZWFjaCBkYXRhIHJvdyBpbiB0aGUgY29tcG9uZW50XG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzZWxlY3Rpb25fZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtc2VsZWN0ZWQtcm93cykpLlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgcm93IHdpbGwgYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgc2V0IHJvd1NlbGVjdGVkKGZuKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUgJiYgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJvd1NlbGVjdGVkIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoZm4pfS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb3dTZWxlY3RlZCA9IGZuO1xuICAgIH1cbiAgICBnZXQgcm93U2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgYSBkYXRhIGNlbGwuXG4gICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBgc2VsZWN0ZWRgIGFuZCBgaXRlbWAgcHJvcGVydGllcy5cbiAgICAgKiBUaGUgY2VsbCBpcyBtYXJrZWQgYXMgc2VsZWN0ZWQgb25seSBpZiB0aGUgYHNlbGVjdGVkYCBwcm9wZXJ0eSBlcXVhbHMgYHRydWVgLlxuICAgICAqXG4gICAgICogVGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGZvciBlYWNoIGRhdGEgY2VsbCBhbmQgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuICAgICAqIGFzIHBhcnQgb2YgYSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGdyaWRfc2VsZWN0aW9uX2N1c3RvbSAlfXRvYy1zZXR0aW5nLXRoZS1zZWxlY3RlZC1jZWxscykpXG4gICAgICovXG4gICAgc2V0IGNlbGxTZWxlY3RlZChmbikge1xuICAgICAgICBpZiAoaXNEZXZNb2RlICYmIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjZWxsU2VsZWN0ZWQgbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShmbil9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NlbGxTZWxlY3RlZCA9IGZuO1xuICAgIH1cbiAgICBnZXQgY2VsbFNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNlbGVjdGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBjZWxsIChpZiBhbnkpLlxuICAgICAqL1xuICAgIGdldCBhY3RpdmVDZWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3RpdmVDZWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgZm9jdXNlZCByb3cgKGlmIGFueSkuXG4gICAgICovXG4gICAgZ2V0IGFjdGl2ZVJvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aXZlUm93O1xuICAgIH1cbiAgICBnZXQgZGlyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XG4gICAgfVxuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBsb2NrZWRDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBnZXQgdmlydHVhbENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmlydHVhbDtcbiAgICB9XG4gICAgZ2V0IG5vU2Nyb2xsYmFyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGJhcldpZHRoID09PSAwO1xuICAgIH1cbiAgICBnZXQgZGV0YWlsVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXN0b21EZXRhaWxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbURldGFpbFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRldGFpbFRlbXBsYXRlQ2hpbGRyZW4gPyB0aGlzLmRldGFpbFRlbXBsYXRlQ2hpbGRyZW4uZmlyc3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHNldCBkZXRhaWxUZW1wbGF0ZShkZXRhaWxUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLl9jdXN0b21EZXRhaWxUZW1wbGF0ZSA9IGRldGFpbFRlbXBsYXRlO1xuICAgIH1cbiAgICBnZXQgbm9SZWNvcmRzVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXN0b21Ob1JlY29yZHNUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbU5vUmVjb3Jkc1RlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5vUmVjb3Jkc1RlbXBsYXRlQ2hpbGRyZW4gPyB0aGlzLm5vUmVjb3Jkc1RlbXBsYXRlQ2hpbGRyZW4uZmlyc3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHNldCBub1JlY29yZHNUZW1wbGF0ZShjdXN0b21Ob1JlY29yZHNUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLl9jdXN0b21Ob1JlY29yZHNUZW1wbGF0ZSA9IGN1c3RvbU5vUmVjb3Jkc1RlbXBsYXRlO1xuICAgIH1cbiAgICBnZXQgcGFnZXJUZW1wbGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVBhZ2VyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXN0b21QYWdlclRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VyVGVtcGxhdGVDaGlsZHJlbiA/IHRoaXMucGFnZXJUZW1wbGF0ZUNoaWxkcmVuLmZpcnN0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzZXQgcGFnZXJUZW1wbGF0ZShjdXN0b21QYWdlclRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbVBhZ2VyVGVtcGxhdGUgPSBjdXN0b21QYWdlclRlbXBsYXRlO1xuICAgIH1cbiAgICBnZXQgdG9vbGJhclRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fY3VzdG9tVG9vbGJhclRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tVG9vbGJhclRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRvb2xiYXJUZW1wbGF0ZUNoaWxkcmVuID8gdGhpcy50b29sYmFyVGVtcGxhdGVDaGlsZHJlbi5maXJzdCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IHRvb2xiYXJUZW1wbGF0ZShjdXN0b21Ub29sYmFyVGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5fY3VzdG9tVG9vbGJhclRlbXBsYXRlID0gY3VzdG9tVG9vbGJhclRlbXBsYXRlO1xuICAgIH1cbiAgICBnZXQgc2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cHBvcnRTZXJ2aWNlLnNjcm9sbGJhcldpZHRoO1xuICAgIH1cbiAgICBnZXQgaGVhZGVyUGFkZGluZygpIHtcbiAgICAgICAgaWYgKGlzVW5pdmVyc2FsKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCB0aGlzLnNjcm9sbGJhcldpZHRoIC0gMSkgKyAncHgnO1xuICAgICAgICBjb25zdCByaWdodCA9IHRoaXMucnRsID8gMCA6IHBhZGRpbmc7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLnJ0bCA/IHBhZGRpbmcgOiAwO1xuICAgICAgICByZXR1cm4gYDAgJHtyaWdodH0gMCAke2xlZnR9YDtcbiAgICB9XG4gICAgZ2V0IGhhc0dyb3VwRm9vdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5oYXNHcm91cEZvb3RlcjtcbiAgICB9XG4gICAgZ2V0IHNob3dGb290ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNDb250YWluZXIuaGFzRm9vdGVyO1xuICAgIH1cbiAgICBnZXQgc2hvd0dyb3VwRm9vdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBhYmxlICYmIHRoaXMuZ3JvdXBhYmxlLnNob3dGb290ZXI7XG4gICAgfVxuICAgIGdldCBhcmlhUm93Q291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdGFsQ29sdW1uTGV2ZWxzICsgMSArIHRoaXMudmlldy50b3RhbDtcbiAgICB9XG4gICAgZ2V0IGFyaWFDb2xDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5sZWFmQ29sdW1uc1RvUmVuZGVyLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGlzVmlydHVhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsYWJsZSA9PT0gJ3ZpcnR1YWwnO1xuICAgIH1cbiAgICBnZXQgaXNTY3JvbGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxhYmxlICE9PSAnbm9uZSc7XG4gICAgfVxuICAgIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5hbGxDb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgbG9ja2VkQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5sb2NrZWRDb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgbm9uTG9ja2VkQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5ub25Mb2NrZWRDb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgbG9ja2VkTGVhZkNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNDb250YWluZXIubG9ja2VkTGVhZkNvbHVtbnM7XG4gICAgfVxuICAgIGdldCBub25Mb2NrZWRMZWFmQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc0NvbnRhaW5lci5ub25Mb2NrZWRMZWFmQ29sdW1ucztcbiAgICB9XG4gICAgZ2V0IGxlYWZDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zQ29udGFpbmVyLmxlYWZDb2x1bW5zO1xuICAgIH1cbiAgICBnZXQgdG90YWxDb2x1bW5MZXZlbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNDb250YWluZXIudG90YWxMZXZlbHM7XG4gICAgfVxuICAgIGdldCBoZWFkZXJDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy52aXJ0dWFsQ29sdW1ucyAmJiAhdGhpcy5wZGZTZXJ2aWNlLmV4cG9ydGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5vbkxvY2tlZENvbHVtbnM7XG4gICAgfVxuICAgIGdldCBoZWFkZXJMZWFmQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbENvbHVtbnMgJiYgIXRoaXMucGRmU2VydmljZS5leHBvcnRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlYWZWaWV3cG9ydENvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9uTG9ja2VkTGVhZkNvbHVtbnM7XG4gICAgfVxuICAgIGdldCBsb2NrZWRXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBDZWxsc1dpZHRoID0gdGhpcy5ncm91cC5sZW5ndGggKiBHUk9VUF9DRUxMX1dJRFRIO1xuICAgICAgICByZXR1cm4gZXhwYW5kQ29sdW1ucyh0aGlzLmxvY2tlZExlYWZDb2x1bW5zLnRvQXJyYXkoKSkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgKGN1cnIud2lkdGggfHwgMCksIGdyb3VwQ2VsbHNXaWR0aCk7XG4gICAgfVxuICAgIGdldCBub25Mb2NrZWRXaWR0aCgpIHtcbiAgICAgICAgaWYgKCghdGhpcy5ydGwgJiYgdGhpcy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGgpIHx8IHRoaXMudmlydHVhbENvbHVtbnMpIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy52aXJ0dWFsQ29sdW1ucyA/IHRoaXMuY29sdW1uc0NvbnRhaW5lci51bmxvY2tlZFdpZHRoIDpcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZWaWV3cG9ydENvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4gYWNjICsgKGNvbHVtbi53aWR0aCB8fCAwKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHNlbGVjdGFibGVTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5vcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBjb2x1bW5NZW51VGVtcGxhdGUoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5jb2x1bW5NZW51VGVtcGxhdGVzLmZpcnN0O1xuICAgICAgICByZXR1cm4gdGVtcGxhdGUgPyB0ZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IG51bGw7XG4gICAgfVxuICAgIGdldCB0b3RhbENvdW50KCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZpcnR1YWwgfHwgIWlzUHJlc2VudCh0aGlzLnBhZ2VTaXplKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy50b3RhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgc3BlY2lmaWVkIG1hc3RlciByb3cgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBoaWVyYXJjaHlfZ3JpZCAlfSkpLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdmVyc2lvbnMuXG4gICAgICogVGhlc2UgdmVyc2lvbnMgdHJhY2tlZCB0aGUgZXhwYW5kZWQgc3RhdGUgaW50ZXJuYWxseSB1c2luZyB0aGUgZGF0YSByb3cgaW5kZXguXG4gICAgICpcbiAgICAgKiBGb3IgbmV3IGRldmVsb3BtZW50LCB1c2UgdGhlIFtga2VuZG9HcmlkRGV0YWlsc0V4cGFuZEJ5YCBkaXJlY3RpdmVdKHslIHNsdWcgYXBpX2dyaWRfZXhwYW5kZGV0YWlsc2RpcmVjdGl2ZSAlfSlcbiAgICAgKiBvciBwcm92aWRlIGFuIGlzRGV0YWlsRXhwYW5kZWQgY2FsbGJhY2suIFNlZSBbQ29udHJvbGxpbmcgdGhlIEV4cGFuZGVkIFN0YXRlXSh7JSBzbHVnIG1hc3Rlcl9kZXRhaWxfZXhwYW5kZWRfc3RhdGVfZ3JpZCAlfSlcbiAgICAgKiBmb3IgZXhhbXBsZXMgb24gaG93IHRvIGNvbnRyb2wgdGhlIGV4cGFuZGVkIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGRhdGEgcm93IGluZGV4IG9mIHRoZSBtYXN0ZXIgcm93LlxuICAgICAqL1xuICAgIGV4cGFuZFJvdyhpbmRleCkge1xuICAgICAgICB0aGlzLnRvZ2dsZURldGFpbFJvd0xlZ2FjeShpbmRleCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyB0aGUgc3BlY2lmaWVkIG1hc3RlciByb3cgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBoaWVyYXJjaHlfZ3JpZCAlfSkpLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdmVyc2lvbnMuXG4gICAgICogVGhlc2UgdmVyc2lvbnMgdHJhY2tlZCB0aGUgZXhwYW5kZWQgc3RhdGUgaW50ZXJuYWxseSB1c2luZyB0aGUgZGF0YSByb3cgaW5kZXguXG4gICAgICpcbiAgICAgKiBGb3IgbmV3IGRldmVsb3BtZW50LCB1c2UgdGhlIFtga2VuZG9HcmlkRGV0YWlsc0V4cGFuZEJ5YCBkaXJlY3RpdmVdKHslIHNsdWcgYXBpX2dyaWRfZXhwYW5kZGV0YWlsc2RpcmVjdGl2ZSAlfSlcbiAgICAgKiBvciBwcm92aWRlIGFuIGlzRGV0YWlsRXhwYW5kZWQgY2FsbGJhY2suIFNlZSBbQ29udHJvbGxpbmcgdGhlIEV4cGFuZGVkIFN0YXRlXSh7JSBzbHVnIG1hc3Rlcl9kZXRhaWxfZXhwYW5kZWRfc3RhdGVfZ3JpZCAlfSlcbiAgICAgKiBmb3IgZXhhbXBsZXMgb24gaG93IHRvIGNvbnRyb2wgdGhlIGV4cGFuZGVkIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGRhdGEgcm93IGluZGV4IG9mIHRoZSBtYXN0ZXIgcm93LlxuICAgICAqL1xuICAgIGNvbGxhcHNlUm93KGluZGV4KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRGV0YWlsUm93TGVnYWN5KGluZGV4LCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYSBncm91cCBoZWFkZXIgaXRlbSBmb3IgdGhlIGdpdmVuIGluZGV4LiBGb3IgZXhhbXBsZSxcbiAgICAgKiBgMF8xYCBleHBhbmRzIHRoZSBzZWNvbmQgaW5uZXIgZ3JvdXAgb2YgdGhlIGZpcnN0IG1hc3RlciBncm91cC5cbiAgICAgKlxuICAgICAqID4gKiBXaGVuIHlvdSB1c2UgdGhlIFtga2VuZG9HcmlkR3JvdXBCaW5kaW5nYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncm91cGJpbmRpbmdkaXJlY3RpdmUgJX0pIGRpcmVjdGl2ZSxcbiAgICAgKiA+IHRoZSBgZXhwYW5kR3JvdXBgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLlxuICAgICAqID4gKiBXaGVuIGEgR3JpZCBpcyBwYWdlYWJsZSwgdGhlIGluZGV4ZXMgb2YgdGhlIGdyb3VwcyBhcmUgb2Zmc2V0IGJ5IHRoZSBjdXJyZW50IEdyaWQgW2Bza2lwYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1za2lwKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRleCAtIFRoZSB1bmRlcnNjb3JlIHNlcGFyYXRlZCBoaWVyYXJjaGljYWwgaW5kZXggb2YgdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIGV4cGFuZEdyb3VwKGluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5ncm91cHNTZXJ2aWNlLmlzRXhwYW5kZWQoaW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc1NlcnZpY2UudG9nZ2xlUm93KGluZGV4LCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYSBncm91cCBoZWFkZXIgaXRlbSBmb3IgdGhlIGdpdmVuIGluZGV4LiBGb3IgZXhhbXBsZSxcbiAgICAgKiBgMF8xYCBjb2xsYXBzZXMgdGhlIHNlY29uZCBpbm5lciBncm91cCBvZiB0aGUgZmlyc3QgbWFzdGVyIGdyb3VwLlxuICAgICAqXG4gICAgICogPiAqIFdoZW4geW91IHVzZSB0aGUgW2BrZW5kb0dyaWRHcm91cEJpbmRpbmdgXSh7JSBzbHVnIGFwaV9ncmlkX2dyb3VwYmluZGluZ2RpcmVjdGl2ZSAlfSkgZGlyZWN0aXZlLFxuICAgICAqID4gdGhlIGBjb2xsYXBzZUdyb3VwYCBtZXRob2QgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiA+ICogV2hlbiBhIEdyaWQgaXMgcGFnZWFibGUsIHRoZSBpbmRleGVzIG9mIHRoZSBncm91cHMgYXJlIG9mZnNldCBieSB0aGUgY3VycmVudCBHcmlkIFtgc2tpcGBdKHslIHNsdWcgYXBpX2dyaWRfZ3JpZGNvbXBvbmVudCAlfSN0b2Mtc2tpcCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5kZXggLSBUaGUgdW5kZXJzY29yZSBzZXBhcmF0ZWQgaGllcmFyY2hpY2FsIGluZGV4IG9mIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBjb2xsYXBzZUdyb3VwKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmdyb3Vwc1NlcnZpY2UuaXNFeHBhbmRlZChpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZS50b2dnbGVSb3coaW5kZXgsIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZXNldEdyb3Vwc1N0YXRlKCkge1xuICAgICAgICB0aGlzLmdyb3Vwc1NlcnZpY2UucmVzZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGV4cGFuZEdyb3VwQ2hpbGRyZW4oZ3JvdXBJbmRleCkge1xuICAgICAgICB0aGlzLmdyb3Vwc1NlcnZpY2UuZXhwYW5kQ2hpbGRyZW4oZ3JvdXBJbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkRhdGFDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuYXV0b0dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLmNoYW5nZU5vdGlmaWNhdGlvbi5ub3RpZnkoKTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLmRhdGFDaGFuZ2VkLmVtaXQoKTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmRlZmF1bHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRTZWxlY3Rpb25TZXJ2aWNlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbk1ldGFkYXRhKCk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGlzQ2hhbmdlZChcImRhdGFcIiwgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoICYmIGFueUNoYW5nZWQoW1wicGFnZVNpemVcIiwgXCJza2lwXCIsIFwic29ydFwiLCBcImdyb3VwXCJdLCBjaGFuZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VOb3RpZmljYXRpb24ubm90aWZ5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFueUNoYW5nZWQoW1wicGFnZVNpemVcIiwgXCJzY3JvbGxhYmxlXCIsICd2aXJ0dWFsQ29sdW1ucyddLCBjaGFuZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uTWV0YWRhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDaGFuZ2VkKFwidmlydHVhbENvbHVtbnNcIiwgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRDb2x1bW5zID0gdGhpcy5sZWFmVmlld3BvcnRDb2x1bW5zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDaGFuZ2VkKFwiaGVpZ2h0XCIsIGNoYW5nZXMsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIGAke3RoaXMuaGVpZ2h0fXB4YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ2hhbmdlZChcImZpbHRlcmFibGVcIiwgY2hhbmdlcykgJiYgdGhpcy5sb2NrZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zeW5jSGVhZGVySGVpZ2h0KHRoaXMubmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbnlDaGFuZ2VkKFtcImNvbHVtbk1lbnVcIiwgXCJzb3J0YWJsZVwiLCBcImZpbHRlcmFibGVcIl0sIGNoYW5nZXMsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZW51T3B0aW9ucyA9IHRoaXMuY29sdW1uTWVudSAmJiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IEJvb2xlYW4odGhpcy5maWx0ZXJhYmxlKSxcbiAgICAgICAgICAgICAgICBzb3J0OiBCb29sZWFuKHRoaXMuc29ydGFibGUpXG4gICAgICAgICAgICB9LCB0aGlzLmNvbHVtbk1lbnUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOmFsaWduXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ2hhbmdlZChcInNjcm9sbGFibGVcIiwgY2hhbmdlcykgJiYgdGhpcy5pc1Njcm9sbGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuYXR0YWNoU2Nyb2xsU3luYygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDaGFuZ2VkKFwic2VsZWN0YWJsZVwiLCBjaGFuZ2VzKSAmJiB0aGlzLnNob3VsZFJlc2V0U2VsZWN0aW9uKGNoYW5nZXMuc2VsZWN0YWJsZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25EaXJlY3RpdmUucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2Nyb2xsU3luYygpO1xuICAgICAgICB0aGlzLmF0dGFjaEVsZW1lbnRFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbk1ldGFkYXRhKCk7XG4gICAgICAgIHRoaXMuYXBwbHlBdXRvU2l6ZSgpO1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lci5yZWZyZXNoKCk7XG4gICAgICAgIHRoaXMudmVyaWZ5U2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uU2VydmljZSgpO1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGVDb2x1bW5zID0gIXRoaXMuY29sdW1ucy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYXV0b0dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3QgPSBuZXcgQ29sdW1uTGlzdCh0aGlzLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmNvbHVtbnNDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbHVtbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy52ZXJpZnlTZXR0aW5ncygpKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdmlnYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pbml0KHRoaXMubmF2aWdhdGlvbk1ldGFkYXRhKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cEV4cGFuZENvbGxhcHNlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwRXhwYW5kQ29sbGFwc2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXRhaWxzU2VydmljZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kZXRhaWxzU2VydmljZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVkaXRTZXJ2aWNlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGRmU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBkZlN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb3J0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leGNlbFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5leGNlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnNDb250YWluZXJDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFN5bmNTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN5bmNTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXRhY2hFbGVtZW50RXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hFbGVtZW50RXZlbnRIYW5kbGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2VsbENsaWNrU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvb3RlckNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5mb290ZXJDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtblJlc2l6aW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtblJlc2l6aW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uUmVvcmRlclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5SZW9yZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9jYWxpemF0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsaXphdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtblZpc2liaWxpdHlDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxvY2tlZENoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5Mb2NrZWRDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb2N1c0VsZW1lbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFbGVtZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5SYW5nZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgYXR0YWNoU2Nyb2xsU3luYygpIHtcbiAgICAgICAgaWYgKGlzVW5pdmVyc2FsKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oZWFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3luY1NlcnZpY2UucmVnaXN0ZXJFbWl0dGVyKHRoaXMuaGVhZGVyLm5hdGl2ZUVsZW1lbnQsIFwiaGVhZGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgdGhpcy5mb290ZXJDaGFuZ2VTdWJzY3JpcHRpb24gPSBvYnNlcnZlKHRoaXMuZm9vdGVyKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZm9vdGVycyA9PiBmb290ZXJzXG4gICAgICAgICAgICAgICAgLm1hcChmb290ZXIgPT4gZm9vdGVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc1ByZXNlbnQpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiB0aGlzLnNjcm9sbFN5bmNTZXJ2aWNlLnJlZ2lzdGVyRW1pdHRlcihlbGVtZW50LCBcImZvb3RlclwiKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN3aXRjaGVzIHRoZSBzcGVjaWZpZWQgdGFibGUgcm93IGluIHRoZSBlZGl0IG1vZGUgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX3RlbXBsYXRlX2Zvcm1zX2dyaWQgJX0jdG9jLWVkaXRpbmctcmVjb3JkcykpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IC0gVGhlIGRhdGEgcm93IGluZGV4IHRoYXQgd2lsbCBiZSBzd2l0Y2hlZCBpbiB0aGUgZWRpdCBtb2RlLlxuICAgICAqIEBwYXJhbSBncm91cCAtIFRoZSBbYEZvcm1Hcm91cGBdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ2Zvcm1ncm91cGFwaSddIH19KVxuICAgICAqIHRoYXQgZGVzY3JpYmVzIHRoZSBlZGl0IGZvcm0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgY29uZmlndXJpbmcgdGhlIGZvY3VzIHRhcmdldCBvbmNlIHRoZSBlZGl0b3Igb3BlbnMuXG4gICAgICovXG4gICAgZWRpdFJvdyhyb3dJbmRleCwgZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZS5lZGl0Um93KHJvd0luZGV4LCBncm91cCk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQob3B0aW9ucykgJiYgb3B0aW9ucy5za2lwRm9jdXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3cgPSBgdHJbZGF0YS1rZW5kby1ncmlkLWl0ZW0taW5kZXg9XCIke3Jvd0luZGV4fVwiXWA7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbHVtbkluZGV4O1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpc05hTihjb2x1bW5JbmRleCkgPyByb3cgOiBgJHtyb3d9IHRkW2RhdGEta2VuZG8tZ3JpZC1jb2x1bW4taW5kZXg9XCIke2NvbHVtbkluZGV4fVwiXWA7XG4gICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCh0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGVkaXRvciBmb3IgYSBnaXZlbiByb3cgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX3RlbXBsYXRlX2Zvcm1zX2dyaWQgJX0jdG9jLWNhbmNlbGxpbmctZWRpdGluZykpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHJvdyBpbmRleCB0aGF0IHdpbGwgYmUgc3dpdGNoZWQgb3V0IG9mIHRoZSBlZGl0IG1vZGUuIElmIG5vIGluZGV4IGlzIHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkXG4gICAgICogdGhhdCB0aGUgbmV3IGl0ZW0gZWRpdG9yIHdpbGwgYmUgY2xvc2VkLlxuICAgICAqL1xuICAgIGNsb3NlUm93KGluZGV4KSB7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY2xvc2UoaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJvdyBlZGl0b3IgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX3RlbXBsYXRlX2Zvcm1zX2dyaWQgJX0jdG9jLWFkZGluZy1yZWNvcmRzKSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZ3JvdXAgLSBUaGUgW2BGb3JtR3JvdXBgXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWydmb3JtZ3JvdXBhcGknXSB9fSkgdGhhdCBkZXNjcmliZXNcbiAgICAgKiB0aGUgZWRpdCBmb3JtLiBJZiBjYWxsZWQgd2l0aCBhIGRhdGEgaXRlbSwgaXQgd2lsbCBidWlsZCB0aGUgYEZvcm1Hcm91cGAgZnJvbSB0aGUgZGF0YSBpdGVtIGZpZWxkcy5cbiAgICAgKi9cbiAgICBhZGRSb3coZ3JvdXApIHtcbiAgICAgICAgY29uc3QgaXNGb3JtR3JvdXAgPSBncm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cDtcbiAgICAgICAgaWYgKCFpc0Zvcm1Hcm91cCkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoZ3JvdXApLnJlZHVjZShjcmVhdGVDb250cm9sKGdyb3VwKSwge30pOyAvLyBGb3JtQnVpbGRlcj9cbiAgICAgICAgICAgIGdyb3VwID0gbmV3IEZvcm1Hcm91cChmaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuYWRkUm93KGdyb3VwKTtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCcuay1ncmlkLWFkZC1yb3cnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHV0cyB0aGUgY2VsbCB0aGF0IGlzIHNwZWNpZmllZCBieSB0aGUgdGFibGUgcm93IGFuZCBjb2x1bW4gaW4gZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0luZGV4IC0gVGhlIGRhdGEgcm93IGluZGV4IHRoYXQgd2lsbCBiZSBzd2l0Y2hlZCBpbiB0aGUgZWRpdCBtb2RlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xhbnl9IGNvbHVtbiAtIFRoZSBsZWFmIGNvbHVtbiBpbmRleCwgb3IgdGhlIGZpZWxkIG5hbWUgb3IgdGhlIGNvbHVtbiBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSBlZGl0ZWQuXG4gICAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGdyb3VwIC0gVGhlIFtgRm9ybUdyb3VwYF0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnZm9ybWdyb3VwYXBpJ10gfX0pXG4gICAgICogdGhhdCBkZXNjcmliZXMgdGhlIGVkaXQgZm9ybS5cbiAgICAgKi9cbiAgICBlZGl0Q2VsbChyb3dJbmRleCwgY29sdW1uLCBncm91cCkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29sdW1uSW5zdGFuY2UoY29sdW1uKTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZS5lZGl0Q2VsbChyb3dJbmRleCwgaW5zdGFuY2UsIGdyb3VwKTtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCcuay1ncmlkLWVkaXQtY2VsbCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgY2VsbCBpbiBlZGl0IG1vZGUgYW5kIGZpcmVzXG4gICAgICogdGhlIFtgY2VsbENsb3NlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1jZWxsY2xvc2UpIGV2ZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRlZCBjZWxsIHdhcyBjbG9zZWQuXG4gICAgICogQSBgZmFsc2VgIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZVxuICAgICAqIFtgY2VsbENsb3NlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1jZWxsY2xvc2UpIGV2ZW50IHdhcyBwcmV2ZW50ZWQuXG4gICAgICovXG4gICAgY2xvc2VDZWxsKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZWRpdFNlcnZpY2UuY2xvc2VDZWxsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBjZWxsIGluIGVkaXQgbW9kZS5cbiAgICAgKi9cbiAgICBjYW5jZWxDZWxsKCkge1xuICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmNhbmNlbENlbGwoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIGEgcm93IG9yIGEgY2VsbCBpcyBjdXJyZW50bHkgZWRpdGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gQSBmbGFnIHdoaWNoIGluZGljYXRlcyBpZiBhIHJvdyBvciBhIGNlbGwgaXMgY3VycmVudGx5IGVkaXRlZC5cbiAgICAgKi9cbiAgICBpc0VkaXRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgYSBjZWxsIGlzIGN1cnJlbnRseSBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIGEgY2VsbCBpcyBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLlxuICAgICAqL1xuICAgIGlzRWRpdGluZ0NlbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVzIHRoZSBQREYgZXhwb3J0IChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcGRmZXhwb3J0X2dyaWQgJX0pKS5cbiAgICAgKi9cbiAgICBzYXZlQXNQREYoKSB7XG4gICAgICAgIHRoaXMucGRmU2VydmljZS5zYXZlKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIHRoZSBHcmlkIGVsZW1lbnQgdG8gYSBEcmF3aW5nIFtgR3JvdXBgXSh7JSBzbHVnIGFwaV9rZW5kby1kcmF3aW5nX2dyb3VwICV9KSBieSB1c2luZyB0aGUgYGtlbmRvLWdyaWQtcGRmYCBjb21wb25lbnQgb3B0aW9ucy5cbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHBkZmV4cG9ydF9ncmlkICV9I3RvYy1leHBvcnRpbmctbXVsdGlwbGUtZ3JpZHMtdG8tdGhlLXNhbWUtcGRmKSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgRHJhd2luZyBgR3JvdXBgLlxuICAgICAqL1xuICAgIGRyYXdQREYoKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjcmVhdGVQcm9taXNlKCk7XG4gICAgICAgIHRoaXMucGRmU2VydmljZS5kcmF3KHRoaXMsIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVzIHRoZSBFeGNlbCBleHBvcnQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBleGNlbGV4cG9ydF9ncmlkICV9KSkuXG4gICAgICovXG4gICAgc2F2ZUFzRXhjZWwoKSB7XG4gICAgICAgIHRoaXMuZXhjZWxTZXJ2aWNlLnNhdmUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIG1pbmltdW0gcG9zc2libGUgd2lkdGggZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLFxuICAgICAqIHNvIHRoYXQgdGhlIHdob2xlIHRleHQgZml0cyB3aXRob3V0IHdyYXBwaW5nLiBUaGlzIG1ldGhvZCBleHBlY3RzIHRoZSBHcmlkXG4gICAgICogdG8gYmUgcmVzaXphYmxlIChzZXQgYHJlc2l6YWJsZWAgdG8gYHRydWVgKS5cbiAgICAgKiBNYWtlcyBzZW5zZSB0byBleGVjdXRlIHRoaXMgbWV0aG9kIG9ubHlcbiAgICAgKiBhZnRlciB0aGUgR3JpZCBpcyBhbHJlYWR5IHBvcHVsYXRlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAqICAgICAgICA8a2VuZG8tZ3JpZFxuICAgICAqICAgICAgICAgICAgI2dyaWRcbiAgICAgKiAgICAgICAgICAgIFtkYXRhXT1cImdyaWREYXRhXCJcbiAgICAgKiAgICAgICAgICAgIFtyZXNpemFibGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMzAwcHhcIj5cbiAgICAgKiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGU+XG4gICAgICogICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJrLWJ1dHRvblwiIChjbGljayk9XCJncmlkLmF1dG9GaXRDb2x1bW4oZ3JvdXBDb2x1bW4pXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICBBdXRvLWZpdCB0aGUgZ3JvdXAgY29sdW1uXG4gICAgICogICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAqICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbi1ncm91cCAjZ3JvdXBDb2x1bW4gdGl0bGU9XCJQcm9kdWN0IEluZm9cIj5cbiAgICAgKiAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgZmllbGQ9XCJQcm9kdWN0SURcIlxuICAgICAqICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiNTBcIlxuICAgICAqICAgICAgICAgICAgICAgICAgICBbbWluUmVzaXphYmxlV2lkdGhdPVwiMzBcIlxuICAgICAqICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIklEXCI+XG4gICAgICogICAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtblxuICAgICAqICAgICAgICAgICAgICAgICAgICBmaWVsZD1cIlByb2R1Y3ROYW1lXCJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJQcm9kdWN0IE5hbWVcIj5cbiAgICAgKiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbi1ncm91cD5cbiAgICAgKlxuICAgICAqICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uXG4gICAgICogICAgICAgICAgICAgICAgZmllbGQ9XCJVbml0UHJpY2VcIlxuICAgICAqICAgICAgICAgICAgICAgIHRpdGxlPVwiVW5pdCBQcmljZVwiXG4gICAgICogICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE4MFwiXG4gICAgICogICAgICAgICAgICAgICAgZmlsdGVyPVwibnVtZXJpY1wiXG4gICAgICogICAgICAgICAgICAgICAgZm9ybWF0PVwiezA6Y31cIj5cbiAgICAgKiAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gICAgICogICAgICAgIDwva2VuZG8tZ3JpZD5cbiAgICAgKiAgICBgXG4gICAgICogfSlcbiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgIHB1YmxpYyBncmlkRGF0YTogYW55W10gPSBwcm9kdWN0cztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBwcm9kdWN0cyA9IFt7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhaVwiLFxuICAgICAqICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gICAgICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICAgICAqICB9LCB7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMixcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAgICAgKiAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICAgICAqICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gICAgICogIH1cbiAgICAgKiBdO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF1dG9GaXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXppbmdTZXJ2aWNlLmF1dG9GaXQoY29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRqdXN0cyB0aGUgd2lkdGggb2YgdGhlIHNwZWNpZmllZCBjb2x1bW5zIHRvIGZpdCB0aGUgZW50aXJlIGNvbnRlbnQsIGluY2x1ZGluZyBoZWFkZXJzLCB3aXRob3V0IHdyYXBwaW5nLlxuICAgICAqIElmIG5vIGNvbHVtbnMgYXJlIHNwZWNpZmllZCwgYGF1dG9GaXRDb2x1bW5zYCBpcyBhcHBsaWVkIHRvIGFsbCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhlIEdyaWQgdG8gYmUgcmVzaXphYmxlIChzZXQgYHJlc2l6YWJsZWAgdG8gYHRydWVgKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBfQENvbXBvbmVudCh7XG4gICAgICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgICAqICAgIHRlbXBsYXRlOiBgXG4gICAgICogICAgICA8a2VuZG8tZ3JpZFxuICAgICAqICAgICAgICAgICNncmlkXG4gICAgICogICAgICAgICAgW2RhdGFdPVwiZ3JpZERhdGFcIlxuICAgICAqICAgICAgICAgIFtyZXNpemFibGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDMwMHB4XCI+XG4gICAgICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZT5cbiAgICAgKiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImstYnV0dG9uXCIgKGNsaWNrKT1cImdyaWQuYXV0b0ZpdENvbHVtbnMoW2ZpcnN0Q29sdW1uLCBsYXN0Q29sdW1uXSlcIj5cbiAgICAgKiAgICAgICAgICAgICAgICAgIEF1dG8tZml0IHRoZSBmaXJzdCBhbmQgbGFzdCBjb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJrLWJ1dHRvblwiIChjbGljayk9XCJncmlkLmF1dG9GaXRDb2x1bW5zKClcIj5cbiAgICAgKiAgICAgICAgICAgICAgICAgIEF1dG8tZml0IGFsbCBjb2x1bW5zXG4gICAgICogICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAqICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uLWdyb3VwIHRpdGxlPVwiUHJvZHVjdCBJbmZvXCI+XG4gICAgICogICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtblxuICAgICAqICAgICAgICAgICAgICAgICAgI2ZpcnN0Q29sdW1uXG4gICAgICogICAgICAgICAgICAgICAgICBmaWVsZD1cIlByb2R1Y3RJRFwiXG4gICAgICogICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiNTBcIlxuICAgICAqICAgICAgICAgICAgICAgICAgW21pblJlc2l6YWJsZVdpZHRoXT1cIjMwXCJcbiAgICAgKiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSURcIj5cbiAgICAgKiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgICAgIGZpZWxkPVwiUHJvZHVjdE5hbWVcIlxuICAgICAqICAgICAgICAgICAgICAgICAgdGl0bGU9XCJQcm9kdWN0IE5hbWVcIlxuICAgICAqICAgICAgICAgICAgICAgICAgPlxuICAgICAqICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4tZ3JvdXA+XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgI2xhc3RDb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgZmllbGQ9XCJVbml0UHJpY2VcIlxuICAgICAqICAgICAgICAgICAgICB0aXRsZT1cIlVuaXQgUHJpY2VcIlxuICAgICAqICAgICAgICAgICAgICBbd2lkdGhdPVwiMTgwXCJcbiAgICAgKiAgICAgICAgICAgICAgZmlsdGVyPVwibnVtZXJpY1wiXG4gICAgICogICAgICAgICAgICAgIGZvcm1hdD1cInswOmN9XCI+XG4gICAgICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgKiAgICAgIDwva2VuZG8tZ3JpZD5cbiAgICAgKiAgICBgXG4gICAgICogfSlcbiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgIHB1YmxpYyBncmlkRGF0YTogYW55W10gPSBwcm9kdWN0cztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBwcm9kdWN0cyA9IFt7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhaVwiLFxuICAgICAqICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gICAgICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICAgICAqICB9LCB7XG4gICAgICogICAgXCJQcm9kdWN0SURcIjogMixcbiAgICAgKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAgICAgKiAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICAgICAqICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gICAgICogIH1cbiAgICAgKiBdO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF1dG9GaXRDb2x1bW5zKGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgbGV0IGNvbHM7XG4gICAgICAgIGlmIChjb2x1bW5zIGluc3RhbmNlb2YgUXVlcnlMaXN0KSB7XG4gICAgICAgICAgICBjb2xzID0gY29sdW1ucy50b0FycmF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb2xzID0gY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbHVtblJlc2l6aW5nU2VydmljZS5hdXRvRml0KC4uLmNvbHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbm90aWZ5UGFnZUNoYW5nZShzb3VyY2UsIGV2ZW50KSB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IFwibGlzdFwiICYmICF0aGlzLmlzVmlydHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5vdGlmeVNjcm9sbEJvdHRvbSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc09ic2VydmVycyh0aGlzLnNjcm9sbEJvdHRvbSkpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnNjcm9sbEJvdHRvbS5lbWl0KHsgc2VuZGVyOiB0aGlzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZm9jdXNFZGl0RWxlbWVudChjb250YWluZXJTZWxlY3Rvcikge1xuICAgICAgICBpZiAodGhpcy5mb2N1c0VsZW1lbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFbGVtZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnRTdWJzY3JpcHRpb24gPSB0aGlzLm5nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZXRFZGl0Rm9jdXMod3JhcHBlci5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lclNlbGVjdG9yKSkgJiYgdGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVkaXRGb2N1cyh3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoYC5rLWdyaWQtY29udGVudCAke2NvbnRhaW5lclNlbGVjdG9yfWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBsYXN0IGFjdGl2ZSBvciB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgR3JpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOYXZpZ2F0aW9uQ2VsbH0gVGhlIGZvY3VzZWQgY2VsbC5cbiAgICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5hc3NlcnROYXZpZ2FibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9jdXNDZWxsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIGNlbGwgd2l0aCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uIGluZGV4LlxuICAgICAqXG4gICAgICogVGhlIHJvdyBpbmRleCBpcyBiYXNlZCBvbiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEdyaWQgYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGRhdGEgaXRlbSBpbmRleDpcbiAgICAgKiAqIEhlYWRlciByb3dzIGFyZSBpbmNsdWRlZCwgc3RhcnRpbmcgYXQgaW5kZXggMC5cbiAgICAgKiAqIEdyb3VwIGhlYWRlcnMgYW5kIGZvb3RlcnMgYXJlIGluY2x1ZGVkLlxuICAgICAqICogVGhlIHJvdyBpbmRleGluZyBpcyBhYnNvbHV0ZSBhbmQgZG9lcyBub3QgY2hhbmdlIHdpdGggcGFnaW5nLlxuICAgICAqXG4gICAgICogSWYgdGhlIEdyaWQgaXMgY29uZmlndXJlZCBmb3Igc2Nyb2xsaW5nLCBpbmNsdWRpbmcgdmlydHVhbCBzY3JvbGxpbmcsIHRoZSBzY3JvbGwgcG9zaXRpb24gd2lsbCBiZSB1cGRhdGVkLlxuICAgICAqIElmIHRoZSByb3cgaXMgbm90IHByZXNlbnQgb24gdGhlIGN1cnJlbnQgcGFnZSwgdGhlIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IC0gVGhlIGxvZ2ljYWwgcm93IGluZGV4IHRvIGZvY3VzLiBUaGUgdG9wIGhlYWRlciByb3cgaGFzIGFuIGluZGV4IDAuXG4gICAgICogQHBhcmFtIGNvbEluZGV4IC0gVGhlIGNvbHVtbiBpbmRleCB0byBmb2N1cy5cbiAgICAgKiBAcmV0dXJucyB7TmF2aWdhdGlvbkNlbGx9IFRoZSBmb2N1c2VkIGNlbGwuXG4gICAgICpcbiAgICAgKi9cbiAgICBmb2N1c0NlbGwocm93SW5kZXgsIGNvbEluZGV4KSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0TmF2aWdhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvY3VzQ2VsbChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb2N1c2VzIHRoZSBuZXh0IGNlbGwsIG9wdGlvbmFsbHkgd3JhcHBpbmcgdG8gdGhlIG5leHQgcm93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdyYXAgLSBBIEJvb2xlYW4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSBmb2N1cyB3aWxsIG1vdmUgdG8gdGhlIG5leHQgcm93LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHJldHVybnMge05hdmlnYXRpb25DZWxsfSBUaGUgZm9jdXNlZCBjZWxsLiBJZiB0aGUgZm9jdXMgaXMgYWxyZWFkeSBvbiB0aGUgbGFzdCBjZWxsLCByZXR1cm5zIGBudWxsYC5cbiAgICAgKi9cbiAgICBmb2N1c05leHRDZWxsKHdyYXAgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0TmF2aWdhYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvY3VzTmV4dENlbGwod3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIHByZXZpb3VzIGNlbGwuIE9wdGlvbmFsbHkgd3JhcHMgdG8gdGhlIHByZXZpb3VzIHJvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3cmFwIC0gQSBCb29sZWFuIHZhbHVlIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgZm9jdXMgd2lsbCBtb3ZlIHRvIHRoZSBuZXh0IHJvdy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEByZXR1cm5zIHtOYXZpZ2F0aW9uQ2VsbH0gVGhlIGZvY3VzZWQgY2VsbC4gSWYgdGhlIGZvY3VzIGlzIGFscmVhZHkgb24gdGhlIGZpcnN0IGNlbGwsIHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGZvY3VzUHJldkNlbGwod3JhcCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5hc3NlcnROYXZpZ2FibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9jdXNQcmV2Q2VsbCh3cmFwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uXG4gICAgICovXG4gICAgc2Nyb2xsVG8ocmVxdWVzdCkge1xuICAgICAgICB0aGlzLnNjcm9sbFJlcXVlc3RTZXJ2aWNlLnNjcm9sbFRvKHJlcXVlc3QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbi5cbiAgICAgKiBUaGUgcmVvcmRlcmluZyBvZiBjb2x1bW5zIG9wZXJhdGVzIG9ubHkgb24gdGhlIGxldmVsXG4gICAgICogd2hpY2ggaXMgaW5mZXJyZWQgYnkgdGhlIHNvdXJjZSBjb2x1bW4uXG4gICAgICogRm9yIHRoZSBgcmVvcmRlckNvbHVtbmAgbWV0aG9kIHRvIHdvcmsgcHJvcGVybHksXG4gICAgICogdGhlIGBzb3VyY2VgIGNvbHVtbiBoYXMgdG8gYmUgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29sdW1uQmFzZX0gc291cmNlIC0gVGhlIGNvbHVtbiB3aG9zZSBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlc3RJbmRleCAtIFRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0NvbHVtblJlb3JkZXJDb25maWd9IG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogX0BDb21wb25lbnQoe1xuICAgICAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiAgICB0ZW1wbGF0ZTogYFxuICAgICAqICAgICAgICA8a2VuZG8tZ3JpZFxuICAgICAqICAgICAgICAgICAgI2dyaWRcbiAgICAgKiAgICAgICAgICAgIFtkYXRhXT1cImdyaWREYXRhXCJcbiAgICAgKiAgICAgICAgICAgIFtyZW9yZGVyYWJsZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAzMDBweFwiPlxuICAgICAqICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZT5cbiAgICAgKiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImstYnV0dG9uXCJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJncmlkLnJlb3JkZXJDb2x1bW4oZ3JvdXBDb2x1bW4sIDIsIHsgYmVmb3JlOiB0cnVlIH0pXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICBNb3ZlIHRoZSBncm91cCBjb2x1bW4gYmVmb3JlIHRoZSBsYXN0IG9uZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uLWdyb3VwICNncm91cENvbHVtbiB0aXRsZT1cIlByb2R1Y3QgSW5mb1wiPlxuICAgICAqICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtblxuICAgICAqICAgICAgICAgICAgICAgICAgICBmaWVsZD1cIlByb2R1Y3RJRFwiXG4gICAgICogICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCI1MFwiXG4gICAgICogICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSURcIj5cbiAgICAgKiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqXG4gICAgICogICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uXG4gICAgICogICAgICAgICAgICAgICAgICAgIGZpZWxkPVwiUHJvZHVjdE5hbWVcIlxuICAgICAqICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiPlxuICAgICAqICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gICAgICogICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uLWdyb3VwPlxuICAgICAqXG4gICAgICogICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5cbiAgICAgKiAgICAgICAgICAgICAgICBmaWVsZD1cIlVuaXRQcmljZVwiXG4gICAgICogICAgICAgICAgICAgICAgdGl0bGU9XCJVbml0IFByaWNlXCJcbiAgICAgKiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTgwXCJcbiAgICAgKiAgICAgICAgICAgICAgICBmb3JtYXQ9XCJ7MDpjfVwiPlxuICAgICAqICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAgICAgKlxuICAgICAqICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uXG4gICAgICogICAgICAgICAgICAgICAgZmllbGQ9XCJEaXNjb250aW51ZWRcIlxuICAgICAqICAgICAgICAgICAgICAgIHRpdGxlPVwiRGlzY29udGludWVkXCJcbiAgICAgKiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTAwXCI+XG4gICAgICogICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICAgICAqICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gICAgICogICAgYFxuICAgICAqIH0pXG4gICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgKiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueVtdID0gcHJvZHVjdHM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogY29uc3QgcHJvZHVjdHMgPSBbe1xuICAgICAqICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gICAgICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYWlcIixcbiAgICAgKiAgICBcIlVuaXRQcmljZVwiOiAxOC4wMDAwLFxuICAgICAqICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAgICAgKiAgfSwge1xuICAgICAqICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gICAgICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gICAgICogICAgXCJVbml0UHJpY2VcIjogMTkuMDAwMCxcbiAgICAgKiAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZVxuICAgICAqICB9XG4gICAgICogXTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZW9yZGVyQ29sdW1uKHNvdXJjZSwgZGVzdEluZGV4LCBvcHRpb25zID0geyBiZWZvcmU6IGZhbHNlIH0pIHtcbiAgICAgICAgY29uc3QgY29sdW1uc0ZvckxldmVsID0gdGhpcy5jb2x1bW5zRm9yTGV2ZWwoc291cmNlLmxldmVsKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IGNvbHVtbnNGb3JMZXZlbFtkZXN0SW5kZXhdO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3ROb25Mb2NrZWQgPSB0YXJnZXQuaXNMb2NrZWQgJiZcbiAgICAgICAgICAgICFzb3VyY2UuaXNMb2NrZWQgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lci5ub25Mb2NrZWRDb2x1bW5zLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgaWYgKGxhc3ROb25Mb2NrZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTcGFuQ29sdW1uQ29tcG9uZW50KHRhcmdldCkgJiYgIW9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuY2hpbGRDb2x1bW5zLmxhc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW9yZGVyKHtcbiAgICAgICAgICAgIGJlZm9yZTogb3B0aW9ucy5iZWZvcmUsXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHdoaWNoIGRldGVybWluZXMgaWYgYSBzcGVjaWZpYyByb3cgaXMgZXhwYW5kZWQuXG4gICAgICovXG4gICAgc2V0IGlzRGV0YWlsRXhwYW5kZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5kZXRhaWxzU2VydmljZS51c2VyQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgZ2V0IGlzRGV0YWlsRXhwYW5kZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldGFpbHNTZXJ2aWNlLnVzZXJDYWxsYmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHJlb3JkZXIoeyB0YXJnZXQsIHNvdXJjZSwgYmVmb3JlLCBjaGFuZ2VDb250YWluZXIgfSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uc0ZvckxldmVsID0gdGhpcy5jb2x1bW5zRm9yTGV2ZWwoc291cmNlLmxldmVsKTtcbiAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IGNvbHVtbnNGb3JMZXZlbC5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnBhcmVudCAmJiB0YXJnZXQucGFyZW50LmlzU3BhbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIG5ld0luZGV4ID0gY29sdW1uc0ZvckxldmVsLmluZGV4T2YodGFyZ2V0LnBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvbGRJbmRleCA9IGNvbHVtbnNGb3JMZXZlbC5pbmRleE9mKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiAwIDwgbmV3SW5kZXggJiYgb2xkSW5kZXggPCBuZXdJbmRleCkgeyAvLyBkcm9wcGVkIGJlZm9yZSB0aGUgZmlyc3Qgbm90IGxvY2tlZCBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgbmV3SW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWJlZm9yZSAmJiBvbGRJbmRleCA+IG5ld0luZGV4KSB7IC8vIGRyb3BwZWQgYWZ0ZXIgdGhlIGxhc3QgbG9ja2VkIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBuZXcgQ29sdW1uUmVvcmRlckV2ZW50KHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IHNvdXJjZSxcbiAgICAgICAgICAgICAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgICAgICAgICAgICAgbmV3SW5kZXg6IG5ld0luZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uUmVvcmRlci5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgaWYgKGFyZ3MuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Mb2NrZWRDaGFuZ2UuZW1pdChuZXcgQ29sdW1uTG9ja2VkQ2hhbmdlRXZlbnQoW3NvdXJjZV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uSW5kaWNlcyh7IHNvdXJjZSwgdGFyZ2V0LCBiZWZvcmUgfSk7XG4gICAgICAgICAgICBpZiAoc291cmNlLmxvY2tlZCAhPT0gdGFyZ2V0LmxvY2tlZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZS5sb2NrZWQgPSB0YXJnZXQubG9ja2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zQ29udGFpbmVyLnJlZnJlc2goKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGVDb2x1bW5JbmRpY2VzKHsgc291cmNlLCB0YXJnZXQsIGJlZm9yZSB9KSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkQ29sdW1ucyA9IGV4cGFuZENvbHVtbnNXaXRoU3Bhbih0aGlzLmNvbHVtbnNGb3JMZXZlbChzb3VyY2UubGV2ZWwpKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uSW5kZXggPSBleHBhbmRlZENvbHVtbnMuaW5kZXhPZihzb3VyY2UpO1xuICAgICAgICBsZXQgbmV4dFNvdXJjZUluZGV4ID0gMDtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgIGxldCB0b1NraXAgPSAxO1xuICAgICAgICAvLyBQb3NzaWJsZSBvbmx5IHdoZW4gY2FsbGVkIGZyb20gdGhlIEFQSS5cbiAgICAgICAgaWYgKHNvdXJjZS5pc1NwYW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHRvU2tpcCArPSBzb3VyY2UuY2hpbGRDb2x1bW5zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgZXhwYW5kZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNvbHVtbiA9IGV4cGFuZGVkQ29sdW1uc1tpXTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4gPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIG5leHRTb3VyY2VJbmRleCA9IGJlZm9yZSA/IG5leHRJbmRleCA6IG5leHRJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gYmVmb3JlID8gbmV4dEluZGV4ICsgdG9Ta2lwIDogbmV4dEluZGV4O1xuICAgICAgICAgICAgICAgIGNvbHVtbi5vcmRlckluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChuZXh0U291cmNlSW5kZXggPT09IG5leHRJbmRleCArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4ICs9IHRvU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4gPT09IHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGkgKz0gdG9Ta2lwO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLm9yZGVySW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBzb3VyY2VDb2x1bW5JbmRleDsgaSA8IHNvdXJjZUNvbHVtbkluZGV4ICsgdG9Ta2lwOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGFuZGVkQ29sdW1uc1tpXS5vcmRlckluZGV4ID0gbmV4dFNvdXJjZUluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2VzRm9yTGV2ZWwoc291cmNlLmxldmVsICsgMSk7XG4gICAgfVxuICAgIHVwZGF0ZUluZGljZXNGb3JMZXZlbChsZXZlbCkge1xuICAgICAgICBjb25zdCBjb2xzRm9yUGFyZW50TGV2ZWwgPSB0aGlzLmNvbHVtbnNGb3JMZXZlbChsZXZlbCAtIDEpO1xuICAgICAgICBjb25zdCBjb2xzRm9yTGV2ZWwgPSBbXTtcbiAgICAgICAgc29ydENvbHVtbnMoY29sc0ZvclBhcmVudExldmVsKS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAoYy5pc0NvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgY29sc0ZvckxldmVsLnB1c2goLi4uYy5jaGlsZHJlbkFycmF5LnNvcnQoKGEsIGIpID0+IGEub3JkZXJJbmRleCAtIGIub3JkZXJJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZXhwYW5kQ29sdW1uc1dpdGhTcGFuKGNvbHNGb3JMZXZlbCkubWFwKChjLCBpKSA9PiBjLm9yZGVySW5kZXggPSBpKTtcbiAgICAgICAgaWYgKGxldmVsIDwgdGhpcy5jb2x1bW5zQ29udGFpbmVyLnRvdGFsTGV2ZWxzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluZGljZXNGb3JMZXZlbChsZXZlbCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbHVtbnNGb3JMZXZlbChsZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zQ29udGFpbmVyXG4gICAgICAgICAgICAuYWxsQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5sZXZlbCA9PT0gbGV2ZWwpO1xuICAgIH1cbiAgICBpbml0U2VsZWN0aW9uU2VydmljZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5uZ09uRGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uU2VydmljZS5uZ09uRGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25EaXJlY3RpdmUgJiYgIWlzUHJlc2VudCh0aGlzLmRlZmF1bHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uKHRoaXMsIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxTZWxlY3Rpb25Nb2RlID0gdGhpcy5zZWxlY3RhYmxlWydjZWxsJ107XG4gICAgICAgIGNvbnN0IGFjdGl2ZVNlcnZpY2UgPSBjZWxsU2VsZWN0aW9uTW9kZSA/IHRoaXMuY2VsbFNlbGVjdGlvblNlcnZpY2UgOiB0aGlzLnNlbGVjdGlvblNlcnZpY2U7XG4gICAgICAgIGNvbnN0IGluYWN0aXZlU2VydmljZSA9IGNlbGxTZWxlY3Rpb25Nb2RlID8gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlIDogdGhpcy5jZWxsU2VsZWN0aW9uU2VydmljZTtcbiAgICAgICAgaWYgKGluYWN0aXZlU2VydmljZS5hY3RpdmUpIHtcbiAgICAgICAgICAgIGluYWN0aXZlU2VydmljZS5uZ09uRGVzdHJveSgpO1xuICAgICAgICAgICAgYWN0aXZlU2VydmljZS5hZGRTdWJzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICBpbmFjdGl2ZVNlcnZpY2UuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYWN0aXZlU2VydmljZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBhY3RpdmVTZXJ2aWNlLmluaXQoe1xuICAgICAgICAgICAgY2VsbFNlbGVjdGVkOiBjZWxsU2VsZWN0aW9uTW9kZSA/IHRoaXMuY2VsbFNlbGVjdGVkIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcm93U2VsZWN0ZWQ6IGNlbGxTZWxlY3Rpb25Nb2RlID8gdW5kZWZpbmVkIDogdGhpcy5yb3dTZWxlY3RlZCxcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IHRoaXMuc2VsZWN0YWJsZSxcbiAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGNlbGxTZWxlY3Rpb25Nb2RlID8gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKSA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbkRpcmVjdGl2ZSAmJiAhdGhpcy5zZWxlY3RhYmxlU2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsU2VsZWN0aW9uTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLmNlbGxTZWxlY3Rpb25TZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGV2ZW50KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGV2ZW50KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRFZGl0Rm9jdXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UudHJ5Rm9jdXMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29sdW1uSW5zdGFuY2UoY29sdW1uKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMuY29sdW1uc0NvbnRhaW5lci5sb2NrZWRMZWFmQ29sdW1ucy50b0FycmF5KClcbiAgICAgICAgICAgICAgICAuY29uY2F0KHRoaXMuY29sdW1uc0NvbnRhaW5lci5ub25Mb2NrZWRMZWFmQ29sdW1ucy50b0FycmF5KCkpW2NvbHVtbl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5maWVsZCA9PT0gY29sdW1uKVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5zdGFuY2UgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb2x1bW4gJHtjb2x1bW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICB2ZXJpZnlTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NrZWQgPSB0aGlzLmxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aCB8fCAodGhpcy5jb2x1bW5NZW51ICYmIHRoaXMuY29sdW1uTWVudS5sb2NrKTtcbiAgICAgICAgICAgIGlmIChsb2NrZWQgJiYgdGhpcy5kZXRhaWxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSGF2aW5nIGJvdGggZGV0YWlsIHRlbXBsYXRlIGFuZCBsb2NrZWQgY29sdW1ucyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoICYmICF0aGlzLm5vbkxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBub24tbG9ja2VkIGNvbHVtbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChsb2NrZWQgfHwgdGhpcy52aXJ0dWFsQ29sdW1ucykgJiYgZXhwYW5kQ29sdW1ucyh0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpKS5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ud2lkdGggJiYgIWlzQ29sdW1uR3JvdXBDb21wb25lbnQoY29sdW1uKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChsb2NrZWQgPyAnTG9ja2VkJyA6ICdWaXJ0dWFsJykgKyAnIGNvbHVtbnMgZmVhdHVyZSByZXF1aXJlcyBhbGwgY29sdW1ucyB0byBoYXZlIHNldCB3aWR0aC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb2NrZWQgJiYgIXRoaXMuaXNTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NrZWQgY29sdW1ucyBhcmUgb25seSBzdXBwb3J0ZWQgd2hlbiBzY3JvbGxpbmcgaXMgZW5hYmxlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGlzQ29sdW1uR3JvdXBDb21wb25lbnQpLmZpbHRlcigoeCkgPT4gIXguaGFzQ2hpbGRyZW4pLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sdW1uR3JvdXBDb21wb25lbnQgc2hvdWxkIGNvbnRhaW4gQ29sdW1uQ29tcG9uZW50IG9yIENvbW1hbmRDb2x1bW5Db21wb25lbnQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5MaXN0LmZpbHRlcih4ID0+IHgubG9ja2VkICYmIHgucGFyZW50ICYmICF4LnBhcmVudC5pc0xvY2tlZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NrZWQgY2hpbGQgY29sdW1ucyByZXF1aXJlIHRoZWlyIHBhcmVudCBjb2x1bW5zIHRvIGJlIGxvY2tlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodGhpcy5yb3dIZWlnaHQgfHwgdGhpcy5kZXRhaWxSb3dIZWlnaHQpICYmICF0aGlzLmlzVmlydHVhbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm93IGhlaWdodCBhbmQgZGV0YWlsIHJvdyBoZWlnaHQgc2V0dGluZ3MgcmVxdWlyZSB2aXJ0dWFsIHNjcm9sbGluZyBtb2RlIHRvIGJlIGVuYWJsZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbnNGaWVsZCh0aGlzLmNvbHVtbkxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF1dG9HZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEdlbmVyYXRlQ29sdW1ucyAmJiAhdGhpcy5jb2x1bW5zLmxlbmd0aCAmJiB0aGlzLnZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucmVzZXQoT2JqZWN0LmtleXModGhpcy52aWV3LmF0KDApKS5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gPSBuZXcgQ29sdW1uQ29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpZWxkID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdHRhY2hTdGF0ZUNoYW5nZXNFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlU3Vic2NyaXB0aW9uID1cbiAgICAgICAgICAgIG1lcmdlKHRoaXMucGFnZUNoYW5nZS5waXBlKG1hcCh4ID0+ICh7XG4gICAgICAgICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlciwgZ3JvdXA6IHRoaXMuZ3JvdXAsIHNraXA6IHguc2tpcCwgc29ydDogdGhpcy5zb3J0LCB0YWtlOiB4LnRha2VcbiAgICAgICAgICAgIH0pKSksIHRoaXMuc29ydENoYW5nZS5waXBlKG1hcChzb3J0ID0+ICh7IGZpbHRlcjogdGhpcy5maWx0ZXIsIGdyb3VwOiB0aGlzLmdyb3VwLCBza2lwOiB0aGlzLnNraXAsIHNvcnQ6IHNvcnQsIHRha2U6IHRoaXMucGFnZVNpemUgfSkpKSwgdGhpcy5ncm91cENoYW5nZS5waXBlKG1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIsIGdyb3VwOiBncm91cCwgc2tpcDogdGhpcy5za2lwLCBzb3J0OiB0aGlzLnNvcnQsIHRha2U6IHRoaXMucGFnZVNpemVcbiAgICAgICAgICAgIH0pKSksIHRoaXMuZmlsdGVyQ2hhbmdlLnBpcGUobWFwKGZpbHRlciQkMSA9PiAoe1xuICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyJCQxLCBncm91cDogdGhpcy5ncm91cCwgc2tpcDogMCwgc29ydDogdGhpcy5zb3J0LCB0YWtlOiB0aGlzLnBhZ2VTaXplXG4gICAgICAgICAgICB9KSkpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUNlbGwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbENlbGwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTdGF0ZUNoYW5nZS5lbWl0KHgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIGF0dGFjaEVkaXRIYW5kbGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRTZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0U2VydmljZVN1YnNjcmlwdGlvbiA9IHRoaXMuZWRpdFNlcnZpY2VcbiAgICAgICAgICAgIC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmVtaXRDUlVERXZlbnQuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGVtaXRDUlVERXZlbnQoYXJncykge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcm93SW5kZXgsIGZvcm1Hcm91cCB9ID0gYXJncztcbiAgICAgICAgbGV0IGRhdGFJdGVtID0gdGhpcy52aWV3LmF0KHJvd0luZGV4IC0gdGhpcy5za2lwKTtcbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gJ2FkZCcgJiYgIWRhdGFJdGVtKSB7XG4gICAgICAgICAgICBkYXRhSXRlbSA9IGZvcm1Hcm91cC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlQ2VsbCgpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGFyZ3MsIHtcbiAgICAgICAgICAgIGRhdGFJdGVtOiBkYXRhSXRlbSxcbiAgICAgICAgICAgIHNlbmRlcjogdGhpc1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2FkZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQuZW1pdChhcmdzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwuZW1pdChhcmdzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdC5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZS5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlLmVtaXQoYXJncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjZWxsQ2xvc2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2VsbENsb3NlLmVtaXQoYXJncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdHRhY2hEb21FdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLmNlbGxDbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMuZG9tRXZlbnRzLmNlbGxDbGljay5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2VsbENsaWNrLmVtaXQoT2JqZWN0LmFzc2lnbih7IHNlbmRlcjogdGhpcyB9LCBhcmdzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhdHRhY2hFbGVtZW50RXZlbnRIYW5kbGVycygpIHtcbiAgICAgICAgaWYgKGlzVW5pdmVyc2FsKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGFyaWFSb290ID0gdGhpcy5hcmlhUm9vdC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNpemVDaGVjayA9IHRoaXMucmVzaXplQ2hlY2suYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZVN1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgcmVzaXplQ2hlY2spO1xuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ29yaWVudGF0aW9uY2hhbmdlJywgcmVzaXplQ2hlY2spO1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdjbGljaycsIChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdFNlcnZpY2Uuc2hvdWxkQ2xvc2VDZWxsKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWNsb3Nlc3QoYXJncy50YXJnZXQsIG1hdGNoZXNDbGFzc2VzKCdrLWFuaW1hdGlvbi1jb250YWluZXIgay1ncmlkLWlnbm9yZS1jbGljaycpKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKGFjdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXN0KGFjdGl2ZUVsZW1lbnQsIG1hdGNoZXNDbGFzc2VzKCdrLWFuaW1hdGlvbi1jb250YWluZXInKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luRWRpdGVkQ2VsbChhY3RpdmVFbGVtZW50LCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCkpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmNsb3NlQ2VsbChhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0JsdXJTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2JsdXInLCAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50ICYmICEobWF0Y2hlc05vZGVOYW1lKCdpbnB1dCcpKGFjdGl2ZUVsZW1lbnQpICYmIGFjdGl2ZUVsZW1lbnQudHlwZSA9PT0gJ2ZpbGUnICYmXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FZGl0ZWRDZWxsKGFjdGl2ZUVsZW1lbnQsIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5jbG9zZUNlbGwoYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tRXZlbnRzLndpbmRvd0JsdXIuZW1pdChhcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih3cmFwcGVyLCAnY2xpY2snLCAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tRXZlbnRzLmNsaWNrLmVtaXQoYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleWRvd25TdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih3cmFwcGVyLCAna2V5ZG93bicsIChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb21FdmVudHMua2V5ZG93bi5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBmb2N1c0luIGFuZCBmb2N1c091dCBhcmUgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgXCJncmlkXCJcbiAgICAgICAgICAgIGxldCBmb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBmb2N1c0luU3Vic2NyaXB0aW9uID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oYXJpYVJvb3QsICdmb2N1c2luJywgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbUV2ZW50cy5mb2N1cy5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbUV2ZW50cy5mb2N1c0luLmVtaXQoYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNPdXRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihhcmlhUm9vdCwgJ2ZvY3Vzb3V0JywgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gYXJncy5yZWxhdGVkVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZSA9ICFjbG9zZXN0KG5leHQsIChub2RlKSA9PiBub2RlID09PSBhcmlhUm9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKG91dHNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb21FdmVudHMuZm9jdXNPdXQuZW1pdChhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hFbGVtZW50RXZlbnRIYW5kbGVycyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNpemVTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvblN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICB3aW5kb3dCbHVyU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgY2xpY2tTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICBrZXlkb3duU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgZm9jdXNJblN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgICAgIGZvY3VzT3V0U3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF0Y2hlc01lZGlhKGMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UubWF0Y2hlc01lZGlhKGMubWVkaWEpO1xuICAgIH1cbiAgICByZXNpemVDaGVjaygpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoICE9PSB0aGlzLmNhY2hlZFdpbmRvd1dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZFdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZpbHRlckhpZXJhcmNoeShjb2x1bW4gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXNNZWRpYSA9IHRoaXMubWF0Y2hlc01lZGlhKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5tYXRjaGVzTWVkaWEgIT09IG1hdGNoZXNNZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLm1hdGNoZXNNZWRpYSA9IG1hdGNoZXNNZWRpYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbWl0UERGRXhwb3J0RXZlbnQoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBuZXcgUERGRXhwb3J0RXZlbnQoKTtcbiAgICAgICAgdGhpcy5wZGZFeHBvcnQuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKCFhcmdzLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc1BERigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmNIZWFkZXJIZWlnaHQob2JzZXJ2YWJsZSkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+IGlzUHJlc2VudCh0aGlzLmxvY2tlZEhlYWRlcikpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiBzeW5jUm93c0hlaWdodCh0aGlzLmxvY2tlZEhlYWRlci5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdLCB0aGlzLmhlYWRlci5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdKSk7XG4gICAgfVxuICAgIGNvbHVtbnNDb250YWluZXJDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc0NvbnRhaW5lckNoYW5nZVN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICB0aGlzLnN5bmNIZWFkZXJIZWlnaHQodGhpcy5jb2x1bW5zQ29udGFpbmVyLmNoYW5nZXMucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5sb2NrZWRDb2x1bW5zLmxlbmd0aCA+IDApLCBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5uZ1pvbmUub25TdGFibGUuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKSkpKTtcbiAgICB9XG4gICAgaGFuZGxlQ29sdW1uUmVzaXplKCkge1xuICAgICAgICBjb25zdCByZXNpemVzID0gdGhpcy5jb2x1bW5SZXNpemluZ1NlcnZpY2UuY2hhbmdlcztcbiAgICAgICAgdGhpcy5jb2x1bW5SZXNpemluZ1N1YnNjcmlwdGlvbiA9IHJlc2l6ZXMucGlwZSh0YXAoZSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50eXBlID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2stZ3JpZC1jb2x1bW4tcmVzaXppbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGUudHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCAnay1ncmlkLWNvbHVtbi1yZXNpemluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgZmlsdGVyKGUgPT4gZS50eXBlID09PSAnc3RhcnQnKSwgc3dpdGNoTWFwKCgpID0+IHJlc2l6ZXMucGlwZShcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiByeGpzLW5vLXVuc2FmZS10YWtldW50aWxcbiAgICAgICAgdGFrZVVudGlsKHJlc2l6ZXMucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICd0cmlnZ2VyQXV0b0ZpdCcpKSksIGZpbHRlcihlID0+IGUudHlwZSA9PT0gJ2VuZCcpKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMubm90aWZ5UmVzaXplLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBub3RpZnlSZXNpemUoZSkge1xuICAgICAgICBjb25zdCBhcmdzID0gZS5yZXNpemVkQ29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGlzVHJ1dGh5KGl0ZW0uY29sdW1uLnJlc2l6YWJsZSkgJiYgIWl0ZW0uY29sdW1uLmlzQ29sdW1uR3JvdXApXG4gICAgICAgICAgICAubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICAgICAgICBuZXdXaWR0aDogaXRlbS5jb2x1bW4ud2lkdGgsXG4gICAgICAgICAgICBvbGRXaWR0aDogaXRlbS5vbGRXaWR0aFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXplLmVtaXQoYXJncyk7XG4gICAgfVxuICAgIGFzc2VydE5hdmlnYWJsZSgpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICF0aGlzLm5hdmlnYWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgR3JpZCBzaG91bGQgYmUgY29uZmlndXJlZCBhcyBbbmF2aWdhYmxlXT1cInRydWVcIiB0byBjb250cm9sIGZvY3VzJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmF2aWdhdGlvbk1ldGFkYXRhKCkge1xuICAgICAgICBjb25zdCBpc1ZpcnR1YWwgPSB0aGlzLmlzVmlydHVhbDtcbiAgICAgICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgICBjb25zdCBkYXRhUm93cyA9IGlzVmlydHVhbCA/IHRoaXMudmlldy50b3RhbCA6IHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBhZGRSb3dPZmZzZXQgPSB0aGlzLmVkaXRTZXJ2aWNlLmhhc05ld0l0ZW0gPyAxIDogMDtcbiAgICAgICAgY29uc3QgZmlsdGVyUm93T2Zmc2V0ID0gaGFzRmlsdGVyUm93KHRoaXMuZmlsdGVyYWJsZSkgPyAxIDogMDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93cyA9IHRoaXMudG90YWxDb2x1bW5MZXZlbHMgKyAxICsgZmlsdGVyUm93T2Zmc2V0ICsgYWRkUm93T2Zmc2V0O1xuICAgICAgICByZXR1cm4gbmV3IE5hdmlnYXRpb25NZXRhZGF0YShkYXRhUm93cywgaGVhZGVyUm93cywgaXNWaXJ0dWFsLCB0aGlzLnNob3dQYWdlciwgaXNQcmVzZW50KHRoaXMuZGV0YWlsVGVtcGxhdGUpLCB0aGlzLndyYXBwZXIsIHRoaXMudmlydHVhbENvbHVtbnMsIHRoaXMuY29sdW1uc0NvbnRhaW5lcik7XG4gICAgfVxuICAgIHVwZGF0ZU5hdmlnYXRpb25NZXRhZGF0YSgpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5tZXRhZGF0YSA9IHRoaXMubmF2aWdhdGlvbk1ldGFkYXRhKCk7XG4gICAgfVxuICAgIGFwcGx5QXV0b1NpemUoKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjKSA9PiB0aGlzLmF1dG9TaXplID8gYy5hdXRvU2l6ZSAhPT0gZmFsc2UgOiBjLmF1dG9TaXplKTtcbiAgICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXyA9PiB0aGlzLmF1dG9GaXRDb2x1bW5zKGNvbHMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkNvbHVtblJhbmdlQ2hhbmdlKHJhbmdlKSB7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29sdW1ucyA9IHRoaXMudmlld3BvcnRDb2x1bW5zID0gW107XG4gICAgICAgIGNvbnN0IGxlYWZWaWV3cG9ydENvbHVtbnMgPSB0aGlzLmNvbHVtbnNDb250YWluZXJcbiAgICAgICAgICAgIC5ub25Mb2NrZWRMZWFmQ29sdW1ucy50b0FycmF5KCkuc2xpY2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCArIDEpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBsZWFmVmlld3BvcnRDb2x1bW5zLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBsZWFmVmlld3BvcnRDb2x1bW5zW2lkeF07XG4gICAgICAgICAgICB3aGlsZSAoY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbi5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0b0FkZCA9IFtjb2x1bW5dO1xuICAgICAgICAgICAgd2hpbGUgKHRvQWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRvQWRkLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQudW5zaGlmdC5hcHBseSh0b0FkZCwgY29sdW1uLmNoaWxkcmVuQXJyYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxhc3RGcm9tR3JvdXAgPSB2aWV3cG9ydENvbHVtbnNbdmlld3BvcnRDb2x1bW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29sdW1uID0gbGVhZlZpZXdwb3J0Q29sdW1uc1tpZHhdO1xuICAgICAgICAgICAgd2hpbGUgKGNvbHVtbiAhPT0gbGFzdEZyb21Hcm91cCAmJiBpZHggPCBsZWFmVmlld3BvcnRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGxlYWZWaWV3cG9ydENvbHVtbnNbaWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGxlYWZWaWV3cG9ydENvbHVtbnNbMF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmFuZ2Uub2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB2aWV3cG9ydENvbHVtbnNbMF07XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0IC09IGN1cnJlbnQuaXNDb2x1bW5Hcm91cCA/IDAgOiBjdXJyZW50LndpZHRoO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHZpZXdwb3J0Q29sdW1uc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTGV2ZWxzID0gdGhpcy5jb2x1bW5zQ29udGFpbmVyLnRvdGFsTGV2ZWxzO1xuICAgICAgICAgICAgICAgIGxldCBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPD0gdG90YWxMZXZlbHM7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldENvbHVtbiA9IGlkeCA8IHRvdGFsTGV2ZWxzID8gbmV3IENvbHVtbkdyb3VwQ29tcG9uZW50KHByZXZpb3VzKSA6IG5ldyBDb2x1bW5CYXNlJDEocHJldmlvdXMpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IG9mZnNldENvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Q29sdW1uLnRpdGxlID0gXCJcXHUwMEEwXCI7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldENvbHVtbi53aWR0aCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb2x1bW5zLnVuc2hpZnQob2Zmc2V0Q29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sZWFmVmlld3BvcnRDb2x1bW5zID0gdmlld3BvcnRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmlzQ29sdW1uR3JvdXApO1xuICAgIH1cbiAgICB0b2dnbGVEZXRhaWxSb3dMZWdhY3koaW5kZXgsIGV4cGFuZCkge1xuICAgICAgICBjb25zdCBoYXNDYWxsYmFjayA9IHR5cGVvZiB0aGlzLmlzRGV0YWlsRXhwYW5kZWQgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiBoYXNDYWxsYmFjaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZXhwYW5kUm93IGFuZCBjb2xsYXBzZVJvdyBtZXRob2RzIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdXNpbmcgdGhlICcgK1xuICAgICAgICAgICAgICAgICdrZW5kb0dyaWREZXRhaWxzRXhwYW5kQnkgZGlyZWN0aXZlIG9yIHRoZSBpc0RldGFpbEV4cGFuZGVkIGNhbGxiYWNrLiAnICtcbiAgICAgICAgICAgICAgICAnVGhlc2UgbWV0aG9kcyBhcmUgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdmVyc2lvbnMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSAmJiBoYXNDYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRldGFpbHNTZXJ2aWNlLmlzRXhwYW5kZWQoaW5kZXgsIG51bGwpICE9PSBleHBhbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1NlcnZpY2UudG9nZ2xlUm93KGluZGV4LCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG91bGRSZXNldFNlbGVjdGlvbihzZWxlY3RhYmxlQ2hhbmdlcykge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gc2VsZWN0YWJsZUNoYW5nZXMucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAvLyBTZWxlY3Rpb24gd2FzIGRpc2FibGVkLCBubyBuZWVkIHRvIHJlc2V0LlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHNlbGVjdGFibGVDaGFuZ2VzLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBTZWxlY3Rpb24gZGlzYWJsZWQsIHJlc2V0LlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWUuY2VsbCAhPT0gY3VycmVudFZhbHVlLmNlbGw7XG4gICAgfVxufVxuR3JpZENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb0dyaWQnLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBCcm93c2VyU3VwcG9ydFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbkluZm9TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBDZWxsU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRGV0YWlsc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIEdyb3Vwc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIEdyb3VwSW5mb1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIENoYW5nZU5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIEVkaXRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBQREZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBTdXNwZW5kU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ0VMTF9DT05URVhULFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IMm1NCQyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5ncmlkJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBSZXNwb25zaXZlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgUGFnZXJDb250ZXh0U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRXhjZWxTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBTY3JvbGxTeW5jU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgUmVzaXplU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERvbUV2ZW50c1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgU2luZ2xlUG9wdXBTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBEcmFnQW5kRHJvcFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIERyYWdIaW50U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRHJvcEN1ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtblJlb3JkZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRm9jdXNSb290LFxuICAgICAgICAgICAgICAgICAgICBJZFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFNjcm9sbFJlcXVlc3RTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBTb3J0U2VydmljZVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkJyxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3R5bGVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGtlbmRvLXRoZW1lLWRlZmF1bHRAdjIuNDYuMCBhbmQgZWFybGllci5cbiAgICAgICAgICAgICAgICAgICAgYCAgIC5rLWdyaWQgLmstZ3JpZC1hcmlhLXJvb3Qge1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIH1cblxuICAgICAgICAuay1ncmlkIC5rLWZpbHRlci1yb3cgdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgfWBcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIga2VuZG9HcmlkTG9jYWxpemVkTWVzc2FnZXNcbiAgICAgICAgICAgIGkxOG4tZ3JvdXBQYW5lbEVtcHR5PVwia2VuZG8uZ3JpZC5ncm91cFBhbmVsRW1wdHl8VGhlIGxhYmVsIHZpc2libGUgaW4gdGhlIEdyaWQgZ3JvdXAgcGFuZWwgd2hlbiBpdCBpcyBlbXB0eVwiXG4gICAgICAgICAgICBncm91cFBhbmVsRW1wdHk9XCJEcmFnIGEgY29sdW1uIGhlYWRlciBhbmQgZHJvcCBpdCBoZXJlIHRvIGdyb3VwIGJ5IHRoYXQgY29sdW1uXCJcblxuICAgICAgICAgICAgaTE4bi1ub1JlY29yZHM9XCJrZW5kby5ncmlkLm5vUmVjb3Jkc3xUaGUgbGFiZWwgdmlzaWJsZSBpbiB0aGUgR3JpZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzXCJcbiAgICAgICAgICAgIG5vUmVjb3Jkcz1cIk5vIHJlY29yZHMgYXZhaWxhYmxlLlwiXG5cbiAgICAgICAgICAgIGkxOG4tcGFnZXJGaXJzdFBhZ2U9XCJrZW5kby5ncmlkLnBhZ2VyRmlyc3RQYWdlfFRoZSBsYWJlbCBmb3IgdGhlIGZpcnN0IHBhZ2UgYnV0dG9uIGluIEdyaWQgcGFnZXJcIlxuICAgICAgICAgICAgcGFnZXJGaXJzdFBhZ2U9XCJHbyB0byB0aGUgZmlyc3QgcGFnZVwiXG5cbiAgICAgICAgICAgIGkxOG4tcGFnZXJQcmV2aW91c1BhZ2U9XCJrZW5kby5ncmlkLnBhZ2VyUHJldmlvdXNQYWdlfFRoZSBsYWJlbCBmb3IgdGhlIHByZXZpb3VzIHBhZ2UgYnV0dG9uIGluIEdyaWQgcGFnZXJcIlxuICAgICAgICAgICAgcGFnZXJQcmV2aW91c1BhZ2U9XCJHbyB0byB0aGUgcHJldmlvdXMgcGFnZVwiXG5cbiAgICAgICAgICAgIGkxOG4tcGFnZXJOZXh0UGFnZT1cImtlbmRvLmdyaWQucGFnZXJOZXh0UGFnZXxUaGUgbGFiZWwgZm9yIHRoZSBuZXh0IHBhZ2UgYnV0dG9uIGluIEdyaWQgcGFnZXJcIlxuICAgICAgICAgICAgcGFnZXJOZXh0UGFnZT1cIkdvIHRvIHRoZSBuZXh0IHBhZ2VcIlxuXG4gICAgICAgICAgICBpMThuLXBhZ2VyTGFzdFBhZ2U9XCJrZW5kby5ncmlkLnBhZ2VyTGFzdFBhZ2V8VGhlIGxhYmVsIGZvciB0aGUgbGFzdCBwYWdlIGJ1dHRvbiBpbiBHcmlkIHBhZ2VyXCJcbiAgICAgICAgICAgIHBhZ2VyTGFzdFBhZ2U9XCJHbyB0byB0aGUgbGFzdCBwYWdlXCJcblxuICAgICAgICAgICAgaTE4bi1wYWdlclBhZ2U9XCJrZW5kby5ncmlkLnBhZ2VyUGFnZXxUaGUgbGFiZWwgYmVmb3JlIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGluIHRoZSBHcmlkIHBhZ2VyXCJcbiAgICAgICAgICAgIHBhZ2VyUGFnZT1cIlBhZ2VcIlxuXG4gICAgICAgICAgICBpMThuLXBhZ2VyT2Y9XCJrZW5kby5ncmlkLnBhZ2VyT2Z8VGhlIGxhYmVsIGJlZm9yZSB0aGUgdG90YWwgcGFnZXMgbnVtYmVyIGluIHRoZSBHcmlkIHBhZ2VyXCJcbiAgICAgICAgICAgIHBhZ2VyT2Y9XCJvZlwiXG5cbiAgICAgICAgICAgIGkxOG4tcGFnZXJJdGVtcz1cImtlbmRvLmdyaWQucGFnZXJJdGVtc3xUaGUgbGFiZWwgYWZ0ZXIgdGhlIHRvdGFsIHBhZ2VzIG51bWJlciBpbiB0aGUgR3JpZCBwYWdlclwiXG4gICAgICAgICAgICBwYWdlckl0ZW1zPVwiaXRlbXNcIlxuXG4gICAgICAgICAgICBpMThuLXBhZ2VyUGFnZU51bWJlcklucHV0VGl0bGU9XCJrZW5kby5ncmlkLnBhZ2VyUGFnZU51bWJlcklucHV0VGl0bGV8VGhlIGxhYmVsIGZvciB0aGUgcGFnZXIgaW5wdXQgaW4gdGhlIEdyaWQgcGFnZXJcIlxuICAgICAgICAgICAgcGFnZXJQYWdlTnVtYmVySW5wdXRUaXRsZT1cIlBhZ2UgTnVtYmVyXCJcblxuICAgICAgICAgICAgaTE4bi1wYWdlckl0ZW1zUGVyUGFnZT1cImtlbmRvLmdyaWQucGFnZXJJdGVtc1BlclBhZ2V8VGhlIGxhYmVsIGZvciB0aGUgcGFnZSBzaXplIGNob29zZXIgaW4gdGhlIEdyaWQgcGFnZXJcIlxuICAgICAgICAgICAgcGFnZXJJdGVtc1BlclBhZ2U9XCJpdGVtcyBwZXIgcGFnZVwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyPVwia2VuZG8uZ3JpZC5maWx0ZXJ8VGhlIGxhYmVsIG9mIHRoZSBmaWx0ZXIgY2VsbCBvciBpY29uXCJcbiAgICAgICAgICAgIGZpbHRlcj1cIkZpbHRlclwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyRXFPcGVyYXRvcj1cImtlbmRvLmdyaWQuZmlsdGVyRXFPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgZXF1YWwgZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlckVxT3BlcmF0b3I9XCJJcyBlcXVhbCB0b1wiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyTm90RXFPcGVyYXRvcj1cImtlbmRvLmdyaWQuZmlsdGVyTm90RXFPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgbm90IGVxdWFsIGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJOb3RFcU9wZXJhdG9yPVwiSXMgbm90IGVxdWFsIHRvXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJJc051bGxPcGVyYXRvcj1cImtlbmRvLmdyaWQuZmlsdGVySXNOdWxsT3BlcmF0b3J8VGhlIHRleHQgb2YgdGhlIGlzIG51bGwgZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlcklzTnVsbE9wZXJhdG9yPVwiSXMgbnVsbFwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVySXNOb3ROdWxsT3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlcklzTm90TnVsbE9wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBpcyBub3QgbnVsbCBmaWx0ZXIgb3BlcmF0b3JcIlxuICAgICAgICAgICAgZmlsdGVySXNOb3ROdWxsT3BlcmF0b3I9XCJJcyBub3QgbnVsbFwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVySXNFbXB0eU9wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJJc0VtcHR5T3BlcmF0b3J8VGhlIHRleHQgb2YgdGhlIGlzIGVtcHR5IGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJJc0VtcHR5T3BlcmF0b3I9XCJJcyBlbXB0eVwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVySXNOb3RFbXB0eU9wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJJc05vdEVtcHR5T3BlcmF0b3J8VGhlIHRleHQgb2YgdGhlIGlzIG5vdCBlbXB0eSBmaWx0ZXIgb3BlcmF0b3JcIlxuICAgICAgICAgICAgZmlsdGVySXNOb3RFbXB0eU9wZXJhdG9yPVwiSXMgbm90IGVtcHR5XCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJTdGFydHNXaXRoT3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlclN0YXJ0c1dpdGhPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgc3RhcnRzIHdpdGggZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlclN0YXJ0c1dpdGhPcGVyYXRvcj1cIlN0YXJ0cyB3aXRoXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJDb250YWluc09wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJDb250YWluc09wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBjb250YWlucyBmaWx0ZXIgb3BlcmF0b3JcIlxuICAgICAgICAgICAgZmlsdGVyQ29udGFpbnNPcGVyYXRvcj1cIkNvbnRhaW5zXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJOb3RDb250YWluc09wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJOb3RDb250YWluc09wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBkb2VzIG5vdCBjb250YWluIGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJOb3RDb250YWluc09wZXJhdG9yPVwiRG9lcyBub3QgY29udGFpblwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyRW5kc1dpdGhPcGVyYXRvcj1cImtlbmRvLmdyaWQuZmlsdGVyRW5kc1dpdGhPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgZW5kcyB3aXRoIGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJFbmRzV2l0aE9wZXJhdG9yPVwiRW5kcyB3aXRoXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJHdGVPcGVyYXRvcj1cImtlbmRvLmdyaWQuZmlsdGVyR3RlT3BlcmF0b3J8VGhlIHRleHQgb2YgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBmaWx0ZXIgb3BlcmF0b3JcIlxuICAgICAgICAgICAgZmlsdGVyR3RlT3BlcmF0b3I9XCJJcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIlxuXG4gICAgICAgICAgICBpMThuLWZpbHRlckd0T3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlckd0T3BlcmF0b3J8VGhlIHRleHQgb2YgdGhlIGdyZWF0ZXIgdGhhbiBmaWx0ZXIgb3BlcmF0b3JcIlxuICAgICAgICAgICAgZmlsdGVyR3RPcGVyYXRvcj1cIklzIGdyZWF0ZXIgdGhhblwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyTHRlT3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlckx0ZU9wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlckx0ZU9wZXJhdG9yPVwiSXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJMdE9wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJMdE9wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBsZXNzIHRoYW4gZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlckx0T3BlcmF0b3I9XCJJcyBsZXNzIHRoYW5cIlxuXG4gICAgICAgICAgICBpMThuLWZpbHRlcklzVHJ1ZT1cImtlbmRvLmdyaWQuZmlsdGVySXNUcnVlfFRoZSB0ZXh0IG9mIHRoZSBJc1RydWUgYm9vbGVhbiBmaWx0ZXIgb3B0aW9uXCJcbiAgICAgICAgICAgIGZpbHRlcklzVHJ1ZT1cIklzIFRydWVcIlxuXG4gICAgICAgICAgICBpMThuLWZpbHRlcklzRmFsc2U9XCJrZW5kby5ncmlkLmZpbHRlcklzRmFsc2V8VGhlIHRleHQgb2YgdGhlIElzRmFsc2UgYm9vbGVhbiBmaWx0ZXIgb3B0aW9uXCJcbiAgICAgICAgICAgIGZpbHRlcklzRmFsc2U9XCJJcyBGYWxzZVwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyQm9vbGVhbkFsbD1cImtlbmRvLmdyaWQuZmlsdGVyQm9vbGVhbkFsbHxUaGUgdGV4dCBvZiB0aGUgKEFsbCkgYm9vbGVhbiBmaWx0ZXIgb3B0aW9uXCJcbiAgICAgICAgICAgIGZpbHRlckJvb2xlYW5BbGw9XCIoQWxsKVwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyQWZ0ZXJPckVxdWFsT3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlckFmdGVyT3JFcXVhbE9wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBhZnRlciBvciBlcXVhbCBkYXRlIGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJBZnRlck9yRXF1YWxPcGVyYXRvcj1cIklzIGFmdGVyIG9yIGVxdWFsIHRvXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJBZnRlck9wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJBZnRlck9wZXJhdG9yfFRoZSB0ZXh0IG9mIHRoZSBhZnRlciBkYXRlIGZpbHRlciBvcGVyYXRvclwiXG4gICAgICAgICAgICBmaWx0ZXJBZnRlck9wZXJhdG9yPVwiSXMgYWZ0ZXJcIlxuXG4gICAgICAgICAgICBpMThuLWZpbHRlckJlZm9yZU9wZXJhdG9yPVwia2VuZG8uZ3JpZC5maWx0ZXJCZWZvcmVPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgYmVmb3JlIGRhdGUgZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlckJlZm9yZU9wZXJhdG9yPVwiSXMgYmVmb3JlXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJCZWZvcmVPckVxdWFsT3BlcmF0b3I9XCJrZW5kby5ncmlkLmZpbHRlckJlZm9yZU9yRXF1YWxPcGVyYXRvcnxUaGUgdGV4dCBvZiB0aGUgYmVmb3JlIG9yIGVxdWFsIGRhdGUgZmlsdGVyIG9wZXJhdG9yXCJcbiAgICAgICAgICAgIGZpbHRlckJlZm9yZU9yRXF1YWxPcGVyYXRvcj1cIklzIGJlZm9yZSBvciBlcXVhbCB0b1wiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyRmlsdGVyQnV0dG9uPVwia2VuZG8uZ3JpZC5maWx0ZXJGaWx0ZXJCdXR0b258VGhlIHRleHQgb2YgdGhlIGZpbHRlciBidXR0b25cIlxuICAgICAgICAgICAgZmlsdGVyRmlsdGVyQnV0dG9uPVwiRmlsdGVyXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJDbGVhckJ1dHRvbj1cImtlbmRvLmdyaWQuZmlsdGVyQ2xlYXJCdXR0b258VGhlIHRleHQgb2YgdGhlIGNsZWFyIGZpbHRlciBidXR0b25cIlxuICAgICAgICAgICAgZmlsdGVyQ2xlYXJCdXR0b249XCJDbGVhclwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyQW5kTG9naWM9XCJrZW5kby5ncmlkLmZpbHRlckFuZExvZ2ljfFRoZSB0ZXh0IG9mIHRoZSBBbmQgZmlsdGVyIGxvZ2ljXCJcbiAgICAgICAgICAgIGZpbHRlckFuZExvZ2ljPVwiQW5kXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJPckxvZ2ljPVwia2VuZG8uZ3JpZC5maWx0ZXJPckxvZ2ljfFRoZSB0ZXh0IG9mIHRoZSBPciBmaWx0ZXIgbG9naWNcIlxuICAgICAgICAgICAgZmlsdGVyT3JMb2dpYz1cIk9yXCJcblxuICAgICAgICAgICAgaTE4bi1sb2FkaW5nPVwia2VuZG8uZ3JpZC5sb2FkaW5nfFRoZSBsb2FkaW5nIHRleHRcIlxuICAgICAgICAgICAgbG9hZGluZz1cIkxvYWRpbmdcIlxuXG4gICAgICAgICAgICBpMThuLWNvbHVtbk1lbnU9XCJrZW5kby5ncmlkLmNvbHVtbk1lbnV8VGhlIHRpdGxlIG9mIHRoZSBjb2x1bW4gbWVudSBpY29uXCJcbiAgICAgICAgICAgIGNvbHVtbk1lbnU9XCJDb2x1bW4gTWVudVwiXG5cbiAgICAgICAgICAgIGkxOG4tY29sdW1ucz1cImtlbmRvLmdyaWQuY29sdW1uc3xUaGUgdGV4dCBzaG93biBpbiB0aGUgY29sdW1uIG1lbnUgZm9yIHRoZSBjb2x1bW5zIGl0ZW1cIlxuICAgICAgICAgICAgY29sdW1ucz1cIkNvbHVtbnNcIlxuXG4gICAgICAgICAgICBpMThuLWxvY2s9XCJrZW5kby5ncmlkLmxvY2t8VGhlIHRleHQgc2hvd24gaW4gdGhlIGNvbHVtbiBtZW51IGZvciB0aGUgbG9jayBpdGVtXCJcbiAgICAgICAgICAgIGxvY2s9XCJMb2NrXCJcblxuICAgICAgICAgICAgaTE4bi11bmxvY2s9XCJrZW5kby5ncmlkLnVubG9ja3xUaGUgdGV4dCBzaG93biBpbiB0aGUgY29sdW1uIG1lbnUgZm9yIHRoZSB1bmxvY2sgaXRlbVwiXG4gICAgICAgICAgICB1bmxvY2s9XCJVbmxvY2tcIlxuXG4gICAgICAgICAgICBpMThuLXNvcnRhYmxlPVwia2VuZG8uZ3JpZC5zb3J0YWJsZXxUaGUgbGFiZWwgb2YgdGhlIHNvcnQgaWNvblwiXG4gICAgICAgICAgICBzb3J0YWJsZT1cIlNvcnRhYmxlXCJcblxuICAgICAgICAgICAgaTE4bi1zb3J0QXNjZW5kaW5nPVwia2VuZG8uZ3JpZC5zb3J0QXNjZW5kaW5nfFRoZSB0ZXh0IHNob3duIGluIHRoZSBjb2x1bW4gbWVudSBmb3IgdGhlIHNvcnQgYXNjZW5kaW5nIGl0ZW1cIlxuICAgICAgICAgICAgc29ydEFzY2VuZGluZz1cIlNvcnQgQXNjZW5kaW5nXCJcblxuICAgICAgICAgICAgaTE4bi1zb3J0RGVzY2VuZGluZz1cImtlbmRvLmdyaWQuc29ydERlc2NlbmRpbmd8VGhlIHRleHQgc2hvd24gaW4gdGhlIGNvbHVtbiBtZW51IGZvciB0aGUgc29ydCBkZXNjZW5kaW5nIGl0ZW1cIlxuICAgICAgICAgICAgc29ydERlc2NlbmRpbmc9XCJTb3J0IERlc2NlbmRpbmdcIlxuXG4gICAgICAgICAgICBpMThuLXNvcnRlZEFzY2VuZGluZz1cImtlbmRvLmdyaWQuc29ydGVkQXNjZW5kaW5nfFRoZSBzdGF0dXMgYW5ub3VuY2VtZW50IHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkIGFzY2VuZGluZ1wiXG4gICAgICAgICAgICBzb3J0ZWRBc2NlbmRpbmc9XCJTb3J0ZWQgQXNjZW5kaW5nXCJcblxuICAgICAgICAgICAgaTE4bi1zb3J0ZWREZXNjZW5kaW5nPVwia2VuZG8uZ3JpZC5zb3J0ZWREZXNjZW5kaW5nfFRoZSBzdGF0dXMgYW5ub3VuY2VtZW50IHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkIGRlc2NlbmRpbmdcIlxuICAgICAgICAgICAgc29ydGVkRGVzY2VuZGluZz1cIlNvcnRlZCBEZXNjZW5kaW5nXCJcblxuICAgICAgICAgICAgaTE4bi1zb3J0ZWREZWZhdWx0PVwia2VuZG8uZ3JpZC5zb3J0ZWREZWZhdWx0fFRoZSBzdGF0dXMgYW5ub3VuY2VtZW50IHdoZW4gYSBjb2x1bW4gaXMgbm8gbG9uZ2VyIHNvcnRlZFwiXG4gICAgICAgICAgICBzb3J0ZWREZWZhdWx0PVwiTm90IFNvcnRlZFwiXG5cbiAgICAgICAgICAgIGkxOG4tY29sdW1uc0FwcGx5PVwia2VuZG8uZ3JpZC5jb2x1bW5zQXBwbHl8VGhlIHRleHQgc2hvd24gaW4gdGhlIGNvbHVtbiBtZW51IG9yIGNvbHVtbiBjaG9vc2VyIGZvciB0aGUgY29sdW1ucyBhcHBseSBidXR0b25cIlxuICAgICAgICAgICAgY29sdW1uc0FwcGx5PVwiQXBwbHlcIlxuXG4gICAgICAgICAgICBpMThuLWNvbHVtbnNSZXNldD1cImtlbmRvLmdyaWQuY29sdW1uc1Jlc2V0fFRoZSB0ZXh0IHNob3duIGluIHRoZSBjb2x1bW4gbWVudSBvciBjb2x1bW4gY2hvb3NlciBmb3IgdGhlIGNvbHVtbnMgcmVzZXQgYnV0dG9uXCJcbiAgICAgICAgICAgIGNvbHVtbnNSZXNldD1cIlJlc2V0XCJcblxuICAgICAgICAgICAgaTE4bi1kZXRhaWxFeHBhbmQ9XCJrZW5kby5ncmlkLmRldGFpbEV4cGFuZHxUaGUgdGl0bGUgb2YgdGhlIGV4cGFuZCBpY29uIG9mIGRldGFpbCByb3dzLlwiXG4gICAgICAgICAgICBkZXRhaWxFeHBhbmQ9XCJFeHBhbmQgRGV0YWlsc1wiXG5cbiAgICAgICAgICAgIGkxOG4tZGV0YWlsQ29sbGFwc2U9XCJrZW5kby5ncmlkLmRldGFpbENvbGxhcHNlfFRoZSB0aXRsZSBvZiB0aGUgY29sbGFwc2UgaWNvbiBvZiBkZXRhaWwgcm93cy5cIlxuICAgICAgICAgICAgZGV0YWlsQ29sbGFwc2U9XCJDb2xsYXBzZSBEZXRhaWxzXCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJEYXRlVG9kYXk9XCJrZW5kby5ncmlkLmZpbHRlckRhdGVUb2RheXxUaGUgdGV4dCBvZiB0aGUgVG9kYXkgYnV0dG9uIG9mIHRoZSBEYXRlIGZpbHRlci5cIlxuICAgICAgICAgICAgZmlsdGVyRGF0ZVRvZGF5PVwiVE9EQVlcIlxuXG4gICAgICAgICAgICBpMThuLWZpbHRlckRhdGVUb2dnbGU9XCJrZW5kby5ncmlkLmZpbHRlckRhdGVUb2dnbGV8VGhlIHRpdGxlIG9mIHRoZSBUb2dnbGUgYnV0dG9uIG9mIHRoZSBEYXRlIGZpbHRlci5cIlxuICAgICAgICAgICAgZmlsdGVyRGF0ZVRvZ2dsZT1cIlRvZ2dsZSBDYWxlbmRhclwiXG5cbiAgICAgICAgICAgIGkxOG4tZmlsdGVyTnVtZXJpY0RlY3JlbWVudD1cImtlbmRvLmdyaWQuZmlsdGVyTnVtZXJpY0RlY3JlbWVudHxUaGUgdGl0bGUgb2YgdGhlIERlY3JlbWVudCBidXR0b24gb2YgdGhlIE51bWVyaWMgZmlsdGVyLlwiXG4gICAgICAgICAgICBmaWx0ZXJOdW1lcmljRGVjcmVtZW50PVwiRGVjcmVtZW50XCJcblxuICAgICAgICAgICAgaTE4bi1maWx0ZXJOdW1lcmljSW5jcmVtZW50PVwia2VuZG8uZ3JpZC5maWx0ZXJOdW1lcmljSW5jcmVtZW50fFRoZSB0aXRsZSBvZiB0aGUgSW5jcmVtZW50IGJ1dHRvbiBvZiB0aGUgTnVtZXJpYyBmaWx0ZXIuXCJcbiAgICAgICAgICAgIGZpbHRlck51bWVyaWNJbmNyZW1lbnQ9XCJJbmNyZW1lbnRcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8a2VuZG8tZ3JpZC10b29sYmFyICpuZ0lmPVwic2hvd1RvcFRvb2xiYXJcIiBwb3NpdGlvbj1cInRvcFwiPjwva2VuZG8tZ3JpZC10b29sYmFyPlxuICAgICAgICA8a2VuZG8tZ3JpZC1ncm91cC1wYW5lbFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93R3JvdXBQYW5lbFwiXG4gICAgICAgICAgICBbdGV4dF09XCJncm91cGFibGVFbXB0eVRleHRcIlxuICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImdyb3VwQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2tlbmRvLWdyaWQtZ3JvdXAtcGFuZWw+XG4gICAgICAgIDxkaXYgI2FyaWFSb290XG4gICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1hcmlhLXJvb3RcIlxuICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJhcmlhUm93Q291bnRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb2xjb3VudF09XCJhcmlhQ29sQ291bnRcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzU2Nyb2xsYWJsZVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFoaWRlSGVhZGVyXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cImhlYWRlclBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2NrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgI2xvY2tlZEhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1oZWFkZXItbG9ja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJsb2NrZWRXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgW2xvY2tlZF09XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIFtzdHlsZS53aWR0aC5weF09XCJsb2NrZWRXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwIGtlbmRvR3JpZENvbEdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibG9ja2VkTGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxUZW1wbGF0ZV09XCJkZXRhaWxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZCBrZW5kb0dyaWRIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibG9ja2VkQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RvdGFsQ29sdW1uTGV2ZWxzXT1cInRvdGFsQ29sdW1uTGV2ZWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydF09XCJzb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwYWJsZV09XCJzaG93R3JvdXBQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlb3JkZXJhYmxlXT1cInJlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51XT1cImNvbHVtbk1lbnVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTWVudVRlbXBsYXRlXT1cImNvbHVtbk1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RvdGFsQ29sdW1uc0NvdW50XT1cImxlYWZDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PjxkaXYgI2hlYWRlciBjbGFzcz1cImstZ3JpZC1oZWFkZXItd3JhcFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIiBkYXRhLXNjcm9sbGFibGVcbiAgICAgICAgICAgICAgICAgICAgW2tlbmRvR3JpZFJlc2l6YWJsZUNvbnRhaW5lcl09XCJsb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbG9ja2VkV2lkdGhdPVwibG9ja2VkV2lkdGggKyBzY3JvbGxiYXJXaWR0aCArIDJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHJvbGU9XCJwcmVzZW50YXRpb25cIiBbc3R5bGUud2lkdGgucHhdPVwibm9uTG9ja2VkV2lkdGhcIiBbdmlydHVhbENvbHVtbnNdPVwidmlydHVhbENvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cCBrZW5kb0dyaWRDb2xHcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImhlYWRlckxlYWZDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImlzTG9ja2VkID8gW10gOiBncm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkIGtlbmRvR3JpZEhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwicmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJoZWFkZXJDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG90YWxDb2x1bW5MZXZlbHNdPVwidG90YWxDb2x1bW5MZXZlbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0XT1cInNvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJmaWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBhYmxlXT1cInNob3dHcm91cFBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVvcmRlcmFibGVdPVwicmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiaXNMb2NrZWQgPyBbXSA6IGdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51XT1cImNvbHVtbk1lbnVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTWVudVRlbXBsYXRlXT1cImNvbHVtbk1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2tlZENvbHVtbnNDb3VudF09XCJsb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbENvbHVtbnNDb3VudF09XCJsZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxUZW1wbGF0ZV09XCJkZXRhaWxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZpcnR1YWxDb2x1bW5zXCIgY2xhc3M9XCJrLXdpZHRoLWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbnNDb250YWluZXIudW5sb2NrZWRXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGtlbmRvLWdyaWQtbGlzdFxuICAgICAgICAgICAgICAgIFtkYXRhXT1cInZpZXdcIlxuICAgICAgICAgICAgICAgIFtyb3dIZWlnaHRdPVwicm93SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGV0YWlsUm93SGVpZ2h0XT1cImRldGFpbFJvd0hlaWdodFwiXG4gICAgICAgICAgICAgICAgW3RvdGFsXT1cInRvdGFsQ291bnRcIlxuICAgICAgICAgICAgICAgIFt0YWtlXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBhYmxlXT1cImdyb3VwYWJsZVwiXG4gICAgICAgICAgICAgICAgW3NraXBdPVwic2tpcFwiXG4gICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc0NvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbm9SZWNvcmRzVGVtcGxhdGVdPVwibm9SZWNvcmRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm5vdGlmeVBhZ2VDaGFuZ2UoJ2xpc3QnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbcm93Q2xhc3NdPVwicm93Q2xhc3NcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICAgICAgICAgIFtpc1ZpcnR1YWxdPVwiaXNWaXJ0dWFsXCJcbiAgICAgICAgICAgICAgICBbdmlydHVhbENvbHVtbnNdPVwidmlydHVhbENvbHVtbnNcIlxuICAgICAgICAgICAgICAgIChzY3JvbGxCb3R0b20pPVwibm90aWZ5U2Nyb2xsQm90dG9tKClcIlxuICAgICAgICAgICAgICAgIChjb250ZW50U2Nyb2xsKT1cImNvbnRlbnRTY3JvbGwuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBrZW5kb0RyYWdnYWJsZVxuICAgICAgICAgICAgICAgIGtlbmRvR3JpZFNlbGVjdGlvbk1hcnF1ZWVcbiAgICAgICAgICAgICAgICBbZW5hYmxlRHJhZ109XCJtYXJxdWVlU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2tlbmRvLWdyaWQtbGlzdD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dGb290ZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1ncmlkLWZvb3RlclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiaGVhZGVyUGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1mb290ZXItbG9ja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImxvY2tlZFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSByb2xlPVwicHJlc2VudGF0aW9uXCIgW2xvY2tlZF09XCJ0cnVlXCIgW3N0eWxlLndpZHRoLnB4XT1cImxvY2tlZFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXAga2VuZG9HcmlkQ29sR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJsb2NrZWRMZWFmQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRmb290IGtlbmRvR3JpZEZvb3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImxvY2tlZExlYWZDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGV0YWlsVGVtcGxhdGVdPVwiZGV0YWlsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsUm93SW5kZXhdPVwiYXJpYVJvd0NvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PjxkaXYgI2Zvb3RlclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1mb290ZXItd3JhcFwiIGRhdGEtc2Nyb2xsYWJsZVxuICAgICAgICAgICAgICAgICAgICBba2VuZG9HcmlkUmVzaXphYmxlQ29udGFpbmVyXT1cImxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NrZWRXaWR0aF09XCJsb2NrZWRXaWR0aCArIHNjcm9sbGJhcldpZHRoICsgM1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgcm9sZT1cInByZXNlbnRhdGlvblwiIFtzdHlsZS53aWR0aC5weF09XCJub25Mb2NrZWRXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwIGtlbmRvR3JpZENvbEdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibm9uTG9ja2VkTGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiaXNMb2NrZWQgPyBbXSA6IGdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGV0YWlsVGVtcGxhdGVdPVwiZGV0YWlsVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGZvb3Qga2VuZG9HcmlkRm9vdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJhcmlhUm93Q291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiaXNMb2NrZWQgPyBbXSA6IGdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJub25Mb2NrZWRMZWFmQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2tlZENvbHVtbnNDb3VudF09XCJsb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxUZW1wbGF0ZV09XCJkZXRhaWxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWlzU2Nyb2xsYWJsZVwiPlxuICAgICAgICAgICAgPHRhYmxlIFtzdHlsZS50YWJsZS1sYXlvdXRdPVwicmVzaXphYmxlID8gJ2ZpeGVkJyA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICA8Y29sZ3JvdXAga2VuZG9HcmlkQ29sR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgICAgICAgICA8dGhlYWQga2VuZG9HcmlkSGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWhpZGVIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxDb2x1bW5MZXZlbHNdPVwidG90YWxDb2x1bW5MZXZlbHNcIlxuICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgW2dyb3VwYWJsZV09XCJzaG93R3JvdXBQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZW9yZGVyYWJsZV09XCJyZW9yZGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzb3J0XT1cInNvcnRcIlxuICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCJjb2x1bW5NZW51T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51VGVtcGxhdGVdPVwiY29sdW1uTWVudVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHkga2VuZG9HcmlkVGFibGVCb2R5XG4gICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ2aWV3XCJcbiAgICAgICAgICAgICAgICAgICAgW3NraXBdPVwic2tpcFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImxlYWZDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbbm9SZWNvcmRzVGVtcGxhdGVdPVwibm9SZWNvcmRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGV0YWlsVGVtcGxhdGVdPVwiZGV0YWlsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0dyb3VwRm9vdGVyc109XCJzaG93R3JvdXBGb290ZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dDbGFzc109XCJyb3dDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgICAgIGtlbmRvR3JpZFNlbGVjdGlvbk1hcnF1ZWVcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZURyYWddPVwibWFycXVlZVNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPHRmb290IGtlbmRvR3JpZEZvb3RlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsUm93SW5kZXhdPVwiYXJpYVJvd0NvdW50XCJcbiAgICAgICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImxlYWZDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGtlbmRvR3JpZExvYWRpbmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxrZW5kby1wYWdlclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UGFnZXJcIlxuICAgICAgICAgICAgW3RlbXBsYXRlXT1cInBhZ2VyVGVtcGxhdGVcIlxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgIFt0b3RhbF09XCJ2aWV3LnRvdGFsXCJcbiAgICAgICAgICAgIFtza2lwXT1cInNraXBcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwicGFnZWFibGVcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwibm90aWZ5UGFnZUNoYW5nZSgncGFnZXInLCAkZXZlbnQpXCI+XG4gICAgICAgIDwva2VuZG8tcGFnZXI+XG4gICAgICAgIDxrZW5kby1ncmlkLXRvb2xiYXIgKm5nSWY9XCJzaG93Qm90dG9tVG9vbGJhclwiIHBvc2l0aW9uPVwiYm90dG9tXCI+PC9rZW5kby1ncmlkLXRvb2xiYXI+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5HcmlkQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQnJvd3NlclN1cHBvcnRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTZWxlY3Rpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDZWxsU2VsZWN0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogR3JvdXBJbmZvU2VydmljZSB9LFxuICAgIHsgdHlwZTogR3JvdXBzU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlTm90aWZpY2F0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogRGV0YWlsc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVkaXRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBGaWx0ZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBQREZTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBSZXNwb25zaXZlU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBFeGNlbFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogU2Nyb2xsU3luY1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IERvbUV2ZW50c1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENvbHVtblJlc2l6aW5nU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IENvbHVtblJlb3JkZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5JbmZvU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmF2aWdhdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFNvcnRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTY3JvbGxSZXF1ZXN0U2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuR3JpZENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBkYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVpZ2h0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByb3dIZWlnaHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRldGFpbFJvd0hlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2tpcDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2Nyb2xsYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0YWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmlydHVhbENvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNvcnRhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBuYXZpZ2FibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5hdmlnYXRhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhdXRvU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcm93Q2xhc3M6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJvd1NlbGVjdGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjZWxsU2VsZWN0ZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJlc2l6YWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVvcmRlcmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvYWRpbmc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbHVtbk1lbnU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhpZGVIZWFkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHBhZ2VDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBncm91cENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHNvcnRDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBzZWxlY3Rpb25DaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBkYXRhU3RhdGVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBncm91cEV4cGFuZDogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGdyb3VwQ29sbGFwc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBkZXRhaWxFeHBhbmQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBkZXRhaWxDb2xsYXBzZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGVkaXQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjYW5jZWw6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBzYXZlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcmVtb3ZlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgYWRkOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2VsbENsb3NlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY2VsbENsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcGRmRXhwb3J0OiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgZXhjZWxFeHBvcnQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2x1bW5SZXNpemU6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2x1bW5SZW9yZGVyOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY29sdW1uVmlzaWJpbGl0eUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNvbHVtbkxvY2tlZENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHNjcm9sbEJvdHRvbTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNvbnRlbnRTY3JvbGw6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2x1bW5zOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtDb2x1bW5CYXNlJDEsXSB9XSxcbiAgICBkaXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpZGdldCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZCcsXSB9XSxcbiAgICBsb2NrZWRDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWdyaWQtbG9ja2VkY29sdW1ucycsXSB9XSxcbiAgICB2aXJ0dWFsQ2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1ncmlkLXZpcnR1YWwnLF0gfV0sXG4gICAgbm9TY3JvbGxiYXJDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1ncmlkLW5vLXNjcm9sbGJhcicsXSB9XSxcbiAgICBkZXRhaWxUZW1wbGF0ZUNoaWxkcmVuOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtEZXRhaWxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIG5vUmVjb3Jkc1RlbXBsYXRlQ2hpbGRyZW46IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW05vUmVjb3Jkc1RlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgcGFnZXJUZW1wbGF0ZUNoaWxkcmVuOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtQYWdlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgdG9vbGJhclRlbXBsYXRlQ2hpbGRyZW46IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1Rvb2xiYXJUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGNvbHVtbk1lbnVUZW1wbGF0ZXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NvbHVtbk1lbnVUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dLFxuICAgIGxvY2tlZEhlYWRlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbXCJsb2NrZWRIZWFkZXJcIixdIH1dLFxuICAgIGhlYWRlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbXCJoZWFkZXJcIixdIH1dLFxuICAgIGZvb3RlcjogW3sgdHlwZTogVmlld0NoaWxkcmVuLCBhcmdzOiBbXCJmb290ZXJcIixdIH1dLFxuICAgIGFyaWFSb290OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnYXJpYVJvb3QnLF0gfV0sXG4gICAgaXNEZXRhaWxFeHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCB1cGRhdGUgPSAoYXJyLCBpZHgsIHZhbHVlKSA9PiAoW1xuICAgIC4uLmFyci5zbGljZSgwLCBpZHggKyAxKSxcbiAgICAuLi4oYXJyLnNsaWNlKGlkeCArIDEpLm1hcCh4ID0+IHggKyB2YWx1ZSkpXG5dKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBSb3dIZWlnaHRTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b3RhbCA9IDAsIHJvd0hlaWdodCwgZGV0YWlsUm93SGVpZ2h0KSB7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICAgIHRoaXMuZGV0YWlsUm93SGVpZ2h0ID0gZGV0YWlsUm93SGVpZ2h0O1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHRzID0gW107XG4gICAgICAgIGxldCBhZ2cgPSAwO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0b3RhbDsgaWR4KyspIHtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wdXNoKGFnZyk7XG4gICAgICAgICAgICBhZ2cgKz0gcm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5oZWlnaHRzLnB1c2gocm93SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoZWlnaHQocm93SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0c1tyb3dJbmRleF07XG4gICAgfVxuICAgIGV4cGFuZERldGFpbChyb3dJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQocm93SW5kZXgpID09PSB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVSb3dIZWlnaHQocm93SW5kZXgsIHRoaXMuZGV0YWlsUm93SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb2xsYXBzZURldGFpbChyb3dJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQocm93SW5kZXgpID4gdGhpcy5yb3dIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUm93SGVpZ2h0KHJvd0luZGV4LCB0aGlzLmRldGFpbFJvd0hlaWdodCAqIC0xKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0V4cGFuZGVkKHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlaWdodChyb3dJbmRleCkgPiB0aGlzLnJvd0hlaWdodDtcbiAgICB9XG4gICAgaW5kZXgocG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9mZnNldHMucmVkdWNlKChwcmV2LCBjdXJyZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmV2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPiBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZHggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgdW5kZWZpbmVkKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTphbGlnblxuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyB0aGlzLnRvdGFsIC0gMSA6IHJlc3VsdDtcbiAgICB9XG4gICAgb2Zmc2V0KHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldHNbcm93SW5kZXhdO1xuICAgIH1cbiAgICB0b3RhbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKTtcbiAgICB9XG4gICAgdXBkYXRlUm93SGVpZ2h0KHJvd0luZGV4LCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy50b3RhbCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0c1tyb3dJbmRleF0gKz0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm9mZnNldHMgPSB1cGRhdGUodGhpcy5vZmZzZXRzLCByb3dJbmRleCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2Nyb2xsQWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFBhZ2VBY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNraXAsIHRha2UkJDEpIHtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy50YWtlID0gdGFrZSQkMTtcbiAgICB9XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2Nyb2xsQm90dG9tQWN0aW9uIHtcbn1cbmNvbnN0IFNDUk9MTF9CT1RUT01fVEhSRVNIT0xEID0gMjtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTY3JvbGxlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNjcm9sbE9ic2VydmFibGUpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxPYnNlcnZhYmxlID0gc2Nyb2xsT2JzZXJ2YWJsZTtcbiAgICAgICAgdGhpcy5maXJzdExvYWRlZCA9IDA7XG4gICAgfVxuICAgIGNyZWF0ZShyb3dIZWlnaHRTZXJ2aWNlLCBza2lwLCB0YWtlJCQxLCB0b3RhbCkge1xuICAgICAgICB0aGlzLnJvd0hlaWdodFNlcnZpY2UgPSByb3dIZWlnaHRTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZpcnN0TG9hZGVkID0gc2tpcDtcbiAgICAgICAgdGhpcy5sYXN0TG9hZGVkID0gc2tpcCArIHRha2UkJDE7XG4gICAgICAgIHRoaXMudGFrZSA9IHRha2UkJDE7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5sYXN0U2Nyb2xsVG9wID0gMDtcbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QobmV3IFNjcm9sbEFjdGlvbih0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KHNraXApKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gT2JzZXJ2YWJsZS5jcmVhdGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbE9ic2VydmFibGUuc3Vic2NyaWJlKHggPT4gdGhpcy5vblNjcm9sbCh4LCBvYnNlcnZlcikpO1xuICAgICAgICB9KS5zdWJzY3JpYmUoeCA9PiBzdWJqZWN0Lm5leHQoeCkpO1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25TY3JvbGwoeyBzY3JvbGxUb3AsIG9mZnNldEhlaWdodCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSwgb2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXAgPSB0aGlzLmxhc3RTY3JvbGxUb3AgPj0gc2Nyb2xsVG9wO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIGxldCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5pbmRleChzY3JvbGxUb3ApO1xuICAgICAgICBsZXQgZmlyc3RJdGVtT2Zmc2V0ID0gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLm9mZnNldChmaXJzdEl0ZW1JbmRleCk7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtSW5kZXggPSB0aGlzLnJvd0hlaWdodFNlcnZpY2UuaW5kZXgoc2Nyb2xsVG9wICsgb2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgaWYgKCF1cCkge1xuICAgICAgICAgICAgaWYgKGxhc3RJdGVtSW5kZXggPj0gdGhpcy5sYXN0TG9hZGVkICYmIHRoaXMubGFzdExvYWRlZCA8IHRoaXMudG90YWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IChmaXJzdEl0ZW1JbmRleCArIHRoaXMudGFrZSkgLSB0aGlzLnRvdGFsO1xuICAgICAgICAgICAgICAgIGlmIChvdmVyZmxvdyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtSW5kZXggPSBmaXJzdEl0ZW1JbmRleCAtIG92ZXJmbG93O1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW1PZmZzZXQgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KGZpcnN0SXRlbUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdExvYWRlZCA9IGZpcnN0SXRlbUluZGV4O1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobmV3IFNjcm9sbEFjdGlvbihmaXJzdEl0ZW1PZmZzZXQpKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFRha2UgPSB0aGlzLmZpcnN0TG9hZGVkICsgdGhpcy50YWtlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdExvYWRlZCA9IE1hdGgubWluKG5leHRUYWtlLCB0aGlzLnRvdGFsKTtcbiAgICAgICAgICAgICAgICBuZXh0VGFrZSA9IG5leHRUYWtlID4gdGhpcy50b3RhbCA/IHRoaXMudG90YWwgLSB0aGlzLmZpcnN0TG9hZGVkIDogdGhpcy50YWtlO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobmV3IFBhZ2VBY3Rpb24odGhpcy5maXJzdExvYWRlZCwgdGhpcy50YWtlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdEJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCAtIHNjcm9sbFRvcCA8IFNDUk9MTF9CT1RUT01fVEhSRVNIT0xEO1xuICAgICAgICAgICAgICAgIGlmIChhdEJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG5ldyBTY3JvbGxCb3R0b21BY3Rpb24oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cCAmJiBmaXJzdEl0ZW1JbmRleCA8IHRoaXMuZmlyc3RMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblZpc2libGVCdWZmZXIgPSBNYXRoLmZsb29yKHRoaXMudGFrZSAqIDAuMyk7XG4gICAgICAgICAgICB0aGlzLmZpcnN0TG9hZGVkID0gTWF0aC5tYXgoZmlyc3RJdGVtSW5kZXggLSBub25WaXNpYmxlQnVmZmVyLCAwKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQobmV3IFNjcm9sbEFjdGlvbih0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KHRoaXMuZmlyc3RMb2FkZWQpKSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RMb2FkZWQgPSBNYXRoLm1pbih0aGlzLmZpcnN0TG9hZGVkICsgdGhpcy50YWtlLCB0aGlzLnRvdGFsKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQobmV3IFBhZ2VBY3Rpb24odGhpcy5maXJzdExvYWRlZCwgdGhpcy50YWtlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgTk9OX0RBVEFfQ0VMTF9DTEFTU0VTID0gJ2staGllcmFyY2h5LWNlbGwgay1kZXRhaWwtY2VsbCBrLWdyb3VwLWNlbGwnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IE5PTl9EQVRBX1JPV19DTEFTU0VTID0gJ2stZ3JvdXBpbmctcm93IGstZ3JvdXAtZm9vdGVyIGstZGV0YWlsLXJvdyBrLWdyaWQtbm9yZWNvcmRzJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBJR05PUkVfVEFSR0VUX0NMQVNTU0VTID0gJ2staWNvbic7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgSUdOT1JFX0NPTlRBSU5FUl9DTEFTU0VTID0gJ2std2lkZ2V0IGstZ3JpZC1pZ25vcmUtY2xpY2snO1xuXG5jb25zdCBlbGVtZW50QXQgPSAoaW5kZXgsIGVsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KSA9PiB7XG4gICAgZm9yIChsZXQgaWR4ID0gMCwgZWxlbWVudElkeCA9IDA7IGlkeCA8IGVsZW1lbnRzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZWxlbWVudE9mZnNldChlbGVtZW50c1tpZHhdKTtcbiAgICAgICAgaWYgKGVsZW1lbnRJZHggPD0gaW5kZXggJiYgaW5kZXggPD0gZWxlbWVudElkeCArIG9mZnNldCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50c1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRJZHggKz0gb2Zmc2V0O1xuICAgIH1cbn07XG5jb25zdCByb3dBdCA9IChpbmRleCwgcm93cykgPT4gZWxlbWVudEF0KGluZGV4LCByb3dzLCByb3cgPT4gcm93Lmhhc0F0dHJpYnV0ZSgnZGF0YS1rZW5kby1ncmlkLWl0ZW0taW5kZXgnKSA/IDEgOiAwKTtcbmNvbnN0IGNlbGxBdCA9IChpbmRleCwgY2VsbHMpID0+IGVsZW1lbnRBdChpbmRleCwgY2VsbHMsIGNlbGwgPT4gIWhhc0NsYXNzZXMoY2VsbCwgTk9OX0RBVEFfQ0VMTF9DTEFTU0VTKSA/IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdjb2xTcGFuJyksIDEwKSB8fCAxIDogMCk7XG5jb25zdCBFTVBUWV9PQkpFQ1QgPSB7fTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBTQ1JPTExFUl9GQUNUT1JZX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdncmlkLXNjcm9sbC1zZXJ2aWNlLWZhY3RvcnknKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBERUZBVUxUX1NDUk9MTEVSX0ZBQ1RPUlkob2JzZXJ2YWJsZSkge1xuICAgIHJldHVybiBuZXcgU2Nyb2xsZXJTZXJ2aWNlKG9ic2VydmFibGUpO1xufVxuY29uc3Qgd2hlZWxEZWx0YVkgPSAoZSkgPT4ge1xuICAgIGNvbnN0IGRlbHRhWSA9IGUud2hlZWxEZWx0YVk7XG4gICAgaWYgKGUud2hlZWxEZWx0YSAmJiAoZGVsdGFZID09PSB1bmRlZmluZWQgfHwgZGVsdGFZKSkge1xuICAgICAgICByZXR1cm4gZS53aGVlbERlbHRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChlLmRldGFpbCAmJiBlLmF4aXMgPT09IGUuVkVSVElDQUxfQVhJUykge1xuICAgICAgICByZXR1cm4gKC1lLmRldGFpbCkgKiAxMDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59O1xuY29uc3QgcHJldmVudExvY2tlZFNjcm9sbCA9IChhcmdzLCBlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgZGVsdGEgPSB3aGVlbERlbHRhWShhcmdzKTtcbiAgICBjb25zdCBzY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBhbGxvd1Njcm9sbCA9IChzY3JvbGxUb3AgPT09IDAgJiYgMCA8IGRlbHRhKSB8fCAoZWxlbWVudC5zY3JvbGxIZWlnaHQgPD0gZWxlbWVudC5vZmZzZXRIZWlnaHQgKyBzY3JvbGxUb3AgJiYgZGVsdGEgPCAwKTtcbiAgICBpZiAoIWFsbG93U2Nyb2xsKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcbmNvbnN0IHRyYW5zbGF0ZVkgPSAocmVuZGVyZXIsIHZhbHVlKSA9PiBlbCA9PiByZW5kZXJlci5zZXRTdHlsZShlbCwgXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZVkoJHt2YWx1ZX1weClgKTtcbmNvbnN0IG1heWJlTmF0aXZlRWxlbWVudCA9IGVsID0+IGVsID8gZWwubmF0aXZlRWxlbWVudCA6IG51bGw7XG5jb25zdCBoYXNTY3JvbGxiYXIgPSAoZWwsIHBhcmVudCkgPT4gZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA+IHBhcmVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuY29uc3Qgc2V0SGVpZ2h0JDEgPSByZW5kZXJlciA9PiAoeyBlbCwgaGVpZ2h0IH0pID0+IHJlbmRlcmVyLnNldFN0eWxlKGVsLCBcImhlaWdodFwiLCBgJHtoZWlnaHR9cHhgKTtcbmNvbnN0IGJ1ZmZlclNpemUgPSAxO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExpc3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHNjcm9sbGVyRmFjdG9yeSwgZGV0YWlsc1NlcnZpY2UsIGNoYW5nZU5vdGlmaWNhdGlvbiwgc3VzcGVuZFNlcnZpY2UsIGdyb3Vwc1NlcnZpY2UsIG5nWm9uZSwgcmVuZGVyZXIsIHNjcm9sbFN5bmNTZXJ2aWNlLCByZXNpemVTZXJ2aWNlLCBlZGl0U2VydmljZSwgc3VwcG9ydFNlcnZpY2UsIG5hdmlnYXRpb25TZXJ2aWNlLCBzY3JvbGxSZXF1ZXN0U2VydmljZSwgbG9jYWxpemF0aW9uLCBjb2x1bW5SZXNpemluZ1NlcnZpY2UsIGNoYW5nZURldGVjdG9yLCBwZGZTZXJ2aWNlLCBjb2x1bW5JbmZvKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTm90aWZpY2F0aW9uID0gY2hhbmdlTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLnN1c3BlbmRTZXJ2aWNlID0gc3VzcGVuZFNlcnZpY2U7XG4gICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZSA9IGdyb3Vwc1NlcnZpY2U7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3luY1NlcnZpY2UgPSBzY3JvbGxTeW5jU2VydmljZTtcbiAgICAgICAgdGhpcy5yZXNpemVTZXJ2aWNlID0gcmVzaXplU2VydmljZTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZSA9IGVkaXRTZXJ2aWNlO1xuICAgICAgICB0aGlzLnN1cHBvcnRTZXJ2aWNlID0gc3VwcG9ydFNlcnZpY2U7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBuYXZpZ2F0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXppbmdTZXJ2aWNlID0gY29sdW1uUmVzaXppbmdTZXJ2aWNlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgICAgIHRoaXMucGRmU2VydmljZSA9IHBkZlNlcnZpY2U7XG4gICAgICAgIHRoaXMuY29sdW1uSW5mbyA9IGNvbHVtbkluZm87XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gW107XG4gICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IG5ldyBDb2x1bW5zQ29udGFpbmVyKCgpID0+IFtdKTtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ3JvdXBhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhY2tCeSA9IGRlZmF1bHRUcmFja0J5O1xuICAgICAgICB0aGlzLmNvbnRlbnRTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxCb3R0b20gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29sdW1uc1N0YXJ0SWR4ID0gMDtcbiAgICAgICAgdGhpcy5yZXNpemVTZW5zb3JzID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIHRoaXMucnRsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXIgPSBzY3JvbGxlckZhY3RvcnkodGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID1cbiAgICAgICAgICAgIGRldGFpbHNTZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKHggPT4gdGhpcy5kZXRhaWxFeHBhbmQoeCkpLmFkZChzY3JvbGxSZXF1ZXN0U2VydmljZS5yZXF1ZXN0cy5zdWJzY3JpYmUoeCA9PiB0aGlzLnNjcm9sbFRvKHgpKSk7XG4gICAgfVxuICAgIGdldCBob3N0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgaG9zdFJvbGUoKSB7XG4gICAgICAgIHJldHVybiAncHJlc2VudGF0aW9uJztcbiAgICB9XG4gICAgZ2V0IHNob3dGb290ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwYWJsZSAmJiB0aGlzLmdyb3VwYWJsZS5zaG93Rm9vdGVyO1xuICAgIH1cbiAgICBnZXQgdG90YWxXaWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbENvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLnVubG9ja2VkV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMudW5sb2NrZWRXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbG9ja2VkTGVhZkNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMubG9ja2VkTGVhZkNvbHVtbnM7XG4gICAgfVxuICAgIGdldCBub25Mb2NrZWRMZWFmQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5ub25Mb2NrZWRMZWFmQ29sdW1ucztcbiAgICB9XG4gICAgZ2V0IG5vbkxvY2tlZENvbHVtbnNUb1JlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbENvbHVtbnMgJiYgIXRoaXMucGRmU2VydmljZS5leHBvcnRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub25Mb2NrZWRMZWFmQ29sdW1ucztcbiAgICB9XG4gICAgZ2V0IGxlYWZDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmxlYWZDb2x1bW5zVG9SZW5kZXI7XG4gICAgfVxuICAgIGdldCBsb2NrZWRXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBDZWxsc1dpZHRoID0gdGhpcy5ncm91cHMubGVuZ3RoICogR1JPVVBfQ0VMTF9XSURUSDtcbiAgICAgICAgcmV0dXJuIGV4cGFuZENvbHVtbnModGhpcy5sb2NrZWRMZWFmQ29sdW1ucy50b0FycmF5KCkpLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIChjdXJyLndpZHRoIHx8IDApLCBncm91cENlbGxzV2lkdGgpO1xuICAgIH1cbiAgICBnZXQgbm9uTG9ja2VkV2lkdGgoKSB7XG4gICAgICAgIGlmICgoIXRoaXMucnRsICYmIHRoaXMubG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoKSB8fCB0aGlzLnZpcnR1YWxDb2x1bW5zKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VtQ29sdW1uV2lkdGhzKGV4cGFuZENvbHVtbnModGhpcy5ub25Mb2NrZWRDb2x1bW5zVG9SZW5kZXIudG9BcnJheSgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGlzTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIodGhpcy5oYW5kbGVSb3dTeW5jLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcih0aGlzLmhhbmRsZVJvd05hdmlnYXRpb25Mb2NrZWQuYmluZCh0aGlzKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKG1lcmdlKHRoaXMuY29sdW1ucy5jaGFuZ2VzLCB0aGlzLnJlc2l6ZVNlcnZpY2UuY2hhbmdlcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydENvbHVtbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB0aGlzLnJ0bCA9IHJ0bCkpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IGhhc0luaXRpYWxTa2lwID0gY2hhbmdlcy5za2lwICYmIGNoYW5nZXMuc2tpcC5maXJzdENoYW5nZSAmJiBjaGFuZ2VzLnNraXAuY3VycmVudFZhbHVlID4gMDtcbiAgICAgICAgaWYgKGhhc0luaXRpYWxTa2lwKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUluaXRpYWxTY3JvbGxUb1NraXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDaGFuZ2VkKFwic2tpcFwiLCBjaGFuZ2VzKSAmJiAhdGhpcy5yZWJpbmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcFNjcm9sbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5vZmZzZXQodGhpcy5za2lwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55Q2hhbmdlZChbXCJ0b3RhbFwiLCBcInRha2VcIl0sIGNoYW5nZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYmluZCA9IGZhbHNlO1xuICAgIH1cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxDb2x1bW5zICYmICghdGhpcy52aWV3cG9ydENvbHVtbnMgfHwgdGhpcy52aWV3cG9ydFdpZHRoQ2hhbmdlKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0Q29sdW1ucygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2tpcCAmJiB0aGlzLmlzVmlydHVhbCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KHRoaXMuc2tpcCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb25WaWV3cG9ydCgpO1xuICAgICAgICB0aGlzLmF0dGFjaENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICB0aGlzLmluaXRSZXNpemVTZXJ2aWNlKCk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgY29uc3QgaXNMb2NrZWQgPSB0aGlzLmlzTG9ja2VkO1xuICAgICAgICBpZiAoaXNMb2NrZWQgJiYgIXRoaXMuaGFzTG9ja2VkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnN5bmNSb3dzSGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNMb2NrZWRDb250YWluZXIgPSBpc0xvY2tlZDtcbiAgICB9XG4gICAgc3luY1Jvd3NIZWlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvY2tlZENvbnRhaW5lcikge1xuICAgICAgICAgICAgc3luY1Jvd3NIZWlnaHQodGhpcy5sb2NrZWRUYWJsZS5uYXRpdmVFbGVtZW50LCB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZXNpemVTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cFNjcm9sbGVyKCk7XG4gICAgfVxuICAgIGluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1c3BlbmRTZXJ2aWNlLnNjcm9sbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm93SGVpZ2h0U2VydmljZSA9IG5ldyBSb3dIZWlnaHRTZXJ2aWNlKHRoaXMudG90YWwsIHRoaXMucm93SGVpZ2h0LCB0aGlzLmRldGFpbFJvd0hlaWdodCk7XG4gICAgICAgIHRoaXMudG90YWxIZWlnaHQgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2UudG90YWxIZWlnaHQoKTtcbiAgICAgICAgaWYgKCFpc1VuaXZlcnNhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcih0aGlzLmNyZWF0ZVNjcm9sbGVyLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxvY2tlZFNjcm9sbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1c3BlbmRTZXJ2aWNlLnNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3QgbG9ja2VkU2Nyb2xsVG9wID0gdGhpcy5sb2NrZWRDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICBpZiAobG9ja2VkU2Nyb2xsVG9wICE9PSB0aGlzLmNvbnRhaW5lclNjcm9sbFRvcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5jb250YWluZXJTY3JvbGxUb3AgPSBsb2NrZWRTY3JvbGxUb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9ja2VkTW91c2V3aGVlbChhcmdzKSB7XG4gICAgICAgIGlmICghYXJncy5jdHJsS2V5KSB7XG4gICAgICAgICAgICBwcmV2ZW50TG9ja2VkU2Nyb2xsKGFyZ3MsIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSB3aGVlbERlbHRhWShhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHNjcm9sbERlbHRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxvY2tlZEtleWRvd24oYXJncykge1xuICAgICAgICBpZiAoYXJncy5rZXlDb2RlID09PSBLZXlzLlBhZ2VEb3duIHx8IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5QYWdlVXApIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5QYWdlRG93biA/IDEgOiAtMTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgKz0gZWxlbWVudC5vZmZzZXRIZWlnaHQgKiBkaXIgKiAwLjg7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGV0YWlsRXhwYW5kKHsgaW5kZXgsIGV4cGFuZCB9KSB7XG4gICAgICAgIGlmIChleHBhbmQpIHtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0U2VydmljZS5leHBhbmREZXRhaWwoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLmNvbGxhcHNlRGV0YWlsKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsSGVpZ2h0ID0gdGhpcy5yb3dIZWlnaHRTZXJ2aWNlLnRvdGFsSGVpZ2h0KCk7XG4gICAgICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uVmlld3BvcnQoKTtcbiAgICB9XG4gICAgYXR0YWNoQ29udGFpbmVyU2Nyb2xsKCkge1xuICAgICAgICBpZiAoaXNVbml2ZXJzYWwoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZnJvbUV2ZW50KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKS5waXBlKG1hcCgoZXZlbnQpID0+IGV2ZW50LnRhcmdldCksIGZpbHRlcigoKSA9PiAhdGhpcy5zdXNwZW5kU2VydmljZS5zY3JvbGwpLCB0YXAoKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db250YWluZXJTY3JvbGwodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0TmF2aWdhdGlvblZpZXdwb3J0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb2x1bW5TY3JvbGwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93Vmlld3BvcnQgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnZpZXdwb3J0IHx8IEVNUFRZX09CSkVDVDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5WaWV3cG9ydCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY29sdW1uVmlld3BvcnQgfHwgRU1QVFlfT0JKRUNUO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFNjcm9sbC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogdGFyZ2V0LnNjcm9sbExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdGFyZ2V0LnNjcm9sbFRvcCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRSb3c6IHJvd1ZpZXdwb3J0LmZpcnN0SXRlbUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBlbmRSb3c6IHJvd1ZpZXdwb3J0Lmxhc3RJdGVtSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiBjb2x1bW5WaWV3cG9ydC5maXJzdEl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiBjb2x1bW5WaWV3cG9ydC5sYXN0SXRlbUluZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSkuc3Vic2NyaWJlKHRoaXMuZGlzcGF0Y2hlcikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY3JvbGxTeW5jU2VydmljZS5yZWdpc3RlckVtaXR0ZXIodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCwgXCJib2R5XCIpO1xuICAgIH1cbiAgICBjcmVhdGVTY3JvbGxlcigpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwU2Nyb2xsZXIoKTtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IHRoaXMuc2Nyb2xsZXJcbiAgICAgICAgICAgIC5jcmVhdGUodGhpcy5yb3dIZWlnaHRTZXJ2aWNlLCB0aGlzLnNraXAsIHRoaXMudGFrZSwgdGhpcy50b3RhbCk7XG4gICAgICAgIHRoaXMuc2tpcFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcm9sbGVyU3Vic2NyaXB0aW9uID0gb2JzZXJ2YWJsZS5waXBlKGZpbHRlcigoeCkgPT4geCBpbnN0YW5jZW9mIFBhZ2VBY3Rpb24pLCBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVtcCA9IHRoaXMuc2tpcFNjcm9sbDtcbiAgICAgICAgICAgIHRoaXMuc2tpcFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuICF0ZW1wO1xuICAgICAgICB9KSwgdGFwKCgpID0+IHRoaXMucmViaW5kID0gdHJ1ZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5wYWdlQ2hhbmdlLmVtaXQoeCkpKTtcbiAgICAgICAgdGhpcy5zY3JvbGxlclN1YnNjcmlwdGlvbi5hZGQob2JzZXJ2YWJsZS5waXBlKGZpbHRlcigoeCkgPT4geCBpbnN0YW5jZW9mIFNjcm9sbEFjdGlvbikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuc2Nyb2xsLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zY3JvbGxlclN1YnNjcmlwdGlvbi5hZGQob2JzZXJ2YWJsZS5waXBlKGZpbHRlcigoeCkgPT4geCBpbnN0YW5jZW9mIFNjcm9sbEJvdHRvbUFjdGlvbikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2Nyb2xsQm90dG9tLmVtaXQoKSkpO1xuICAgIH1cbiAgICBzY3JvbGwoeyBvZmZzZXQgPSAwIH0pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgbWF5YmVOYXRpdmVFbGVtZW50KHRoaXMudGFibGUpLFxuICAgICAgICAgICAgICAgIG1heWJlTmF0aXZlRWxlbWVudCh0aGlzLmxvY2tlZFRhYmxlKVxuICAgICAgICAgICAgXS5maWx0ZXIoaXNQcmVzZW50KS5mb3JFYWNoKHRyYW5zbGF0ZVkodGhpcy5yZW5kZXJlciwgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb25WaWV3cG9ydCgpO1xuICAgIH1cbiAgICBvbkNvbnRhaW5lclNjcm9sbCh7IHNjcm9sbFRvcCB9KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyU2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICBpZiAodGhpcy5sb2NrZWRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9ja2VkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUluaXRpYWxTY3JvbGxUb1NraXAoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbCA9ICgpID0+IHRoaXMuaXNWaXJ0dWFsICYmIHRoaXMuc2tpcCA+IDAgJiYgdGhpcy50b3RhbCA+IDA7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRoaXMuY2hhbmdlTm90aWZpY2F0aW9uLmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihzaG91bGRTY3JvbGwpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8oeyByb3c6IHRoaXMuc2tpcCB9KTtcbiAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlUm93U3luYygpIHtcbiAgICAgICAgY29uc3QgaXNMb2NrZWQgPSAoKSA9PiBpc1ByZXNlbnQodGhpcy5sb2NrZWRDb250YWluZXIpO1xuICAgICAgICBjb25zdCBvblN0YWJsZSA9ICgpID0+IHRoaXMubmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSk7XG4gICAgICAgIHJldHVybiBtZXJnZSh0aGlzLmNoYW5nZU5vdGlmaWNhdGlvbi5jaGFuZ2VzLCB0aGlzLmdyb3Vwc1NlcnZpY2UuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKGlzTG9ja2VkKSwgc3dpdGNoTWFwVG8ob25TdGFibGUoKSkpLCB0aGlzLmVkaXRTZXJ2aWNlLmNoYW5nZWQsIHRoaXMucmVzaXplU2VydmljZS5jaGFuZ2VzLCB0aGlzLmNvbHVtblJlc2l6aW5nU2VydmljZS5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoY2hhbmdlID0+IGNoYW5nZS50eXBlID09PSAnZW5kJykpLCB0aGlzLnN1cHBvcnRTZXJ2aWNlLmNoYW5nZXMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKCkgPT4gdGhpcy5yZXNldE5hdmlnYXRpb25WaWV3cG9ydCgpKSwgZmlsdGVyKGlzTG9ja2VkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgdGhpcy5zeW5jUm93c0hlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLmxvY2tlZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICAgICAgLy8gZml4ZXMgc2Nyb2xsIGxlZnQgcG9zaXRpb24gaW4gSUUgd2hlbiBlZGl0aW5nXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTZW5zb3JzLmZvckVhY2goc2Vuc29yID0+IHNlbnNvci5hY2NlcHRTaXplKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlUm93TmF2aWdhdGlvbkxvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiBpc1ByZXNlbnQodGhpcy5sb2NrZWRDb250YWluZXIpKSwgZGVsYXkoMTApKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aCA8PSBhcmdzLnByZXZDb2xJbmRleCAmJiBhcmdzLmNvbEluZGV4IDwgdGhpcy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3RpdmVDZWxsO1xuICAgICAgICAgICAgICAgIGlmIChjZWxsICYmIGNlbGwuY29sSW5kZXggKyBjZWxsLmNvbFNwYW4gPCBhcmdzLnByZXZDb2xJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNjcm9sbFRvVmlydHVhbFJvdyhpdGVtSW5kZXgpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmRldGFpbFRlbXBsYXRlKSkge1xuICAgICAgICAgICAgaXRlbUluZGV4ID0gTWF0aC5mbG9vcihpdGVtSW5kZXggLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2Uub2Zmc2V0KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnJlc2V0TmF2aWdhdGlvblZpZXdwb3J0KCk7XG4gICAgfVxuICAgIHNjcm9sbFRvKHsgcm93LCBjb2x1bW4gfSkge1xuICAgICAgICBpZiAoaXNOdW1iZXIocm93KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpcnR1YWxSb3cocm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByb3dBdChyb3csIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoY29sdW1uKSkge1xuICAgICAgICAgICAgY29sdW1uIC09IHRoaXMubG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLmxlYWZDb2x1bW5zVG9SZW5kZXI7XG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY29sdW1uOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29sdW1uc1tpZHhdLndpZHRoIHx8IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdGhpcy5sb2NrZWRMZWFmQ29sdW1ucy5sZW5ndGggPyAwIDogdGhpcy5ncm91cHMubGVuZ3RoICogR1JPVVBfQ0VMTF9XSURUSCArICh0aGlzLmRldGFpbFRlbXBsYXRlICYmIGNvbHVtbiA+IDAgPyBHUk9VUF9DRUxMX1dJRFRIIDogMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGhpcy5ub3JtYWxpemVTY3JvbGxMZWZ0KG9mZnNldCArIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbiA9PT0gMCAmJiB0aGlzLmRldGFpbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGhpcy5ub3JtYWxpemVTY3JvbGxMZWZ0KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb3cgPSByb3dBdCgwLCB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93cyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjZWxsQXQoY29sdW1uLCBmaXJzdFJvdy5jZWxscyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLmVsZW1lbnRTY3JvbGxMZWZ0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJlc2V0TmF2aWdhdGlvblZpZXdwb3J0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmVuYWJsZWQgfHxcbiAgICAgICAgICAgICF0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm5lZWRzVmlld3BvcnQoKSB8fCB0aGlzLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIG9mZnNldEhlaWdodCB9ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgb2Zmc2V0SGVpZ2h0O1xuICAgICAgICBjb25zdCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5pbmRleChzY3JvbGxUb3ApO1xuICAgICAgICBsZXQgbGFzdEl0ZW1JbmRleCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5pbmRleChzY3JvbGxCb3R0b20pO1xuICAgICAgICBjb25zdCBsYXN0SXRlbU9mZnNldCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5vZmZzZXQobGFzdEl0ZW1JbmRleCk7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtT3ZlcmZsb3dzID0gbGFzdEl0ZW1PZmZzZXQgKyB0aGlzLnJvd0hlaWdodCA+IHNjcm9sbEJvdHRvbTtcbiAgICAgICAgaWYgKGxhc3RJdGVtSW5kZXggPiAwICYmIGxhc3RJdGVtT3ZlcmZsb3dzKSB7XG4gICAgICAgICAgICBsYXN0SXRlbUluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpZXdwb3J0U3RhcnQgPSBmaXJzdEl0ZW1JbmRleDtcbiAgICAgICAgbGV0IHZpZXdwb3J0RW5kID0gbGFzdEl0ZW1JbmRleDtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmRldGFpbFRlbXBsYXRlKSkge1xuICAgICAgICAgICAgdmlld3BvcnRTdGFydCAqPSAyO1xuICAgICAgICAgICAgdmlld3BvcnRFbmQgKj0gMjtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbUhlaWdodCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5vZmZzZXQoZmlyc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZpcnN0SXRlbUhlaWdodCArIHRoaXMucm93SGVpZ2h0IDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRTdGFydCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1IZWlnaHQgPSB0aGlzLnJvd0hlaWdodFNlcnZpY2UuaGVpZ2h0KGxhc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1FeHBhbmRlZCA9IHRoaXMucm93SGVpZ2h0U2VydmljZS5pc0V4cGFuZGVkKGxhc3RJdGVtSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1EZXRhaWxPdmVyZmxvd3MgPSBsYXN0SXRlbU9mZnNldCArIGxhc3RJdGVtSGVpZ2h0ID4gc2Nyb2xsQm90dG9tO1xuICAgICAgICAgICAgaWYgKGxhc3RJdGVtRXhwYW5kZWQgJiYgIWxhc3RJdGVtRGV0YWlsT3ZlcmZsb3dzKSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRFbmQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnNldFZpZXdwb3J0KHZpZXdwb3J0U3RhcnQsIHZpZXdwb3J0RW5kKTtcbiAgICB9XG4gICAgY2xlYW51cFNjcm9sbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxlclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0UmVzaXplU2VydmljZSgpIHtcbiAgICAgICAgdGhpcy5yZXNpemVTZXJ2aWNlLmNvbm5lY3QobWVyZ2UoLi4udGhpcy5yZXNpemVTZW5zb3JzLm1hcChzZW5zb3IgPT4gc2Vuc29yLnJlc2l6ZSkpKTtcbiAgICB9XG4gICAgc3luY0NvbnRhaW5lckhlaWdodCgpIHtcbiAgICAgICAgW21heWJlTmF0aXZlRWxlbWVudCh0aGlzLmxvY2tlZENvbnRhaW5lcildXG4gICAgICAgICAgICAuZmlsdGVyKGlzUHJlc2VudClcbiAgICAgICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaGFzU2Nyb2xsYmFyKHRoaXMudGFibGUsIHRoaXMuY29udGFpbmVyKSkge1xuICAgICAgICAgICAgICAgIGhlaWdodCAtPSB0aGlzLnN1cHBvcnRTZXJ2aWNlLnNjcm9sbGJhcldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZWwsIGhlaWdodCB9O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZvckVhY2goc2V0SGVpZ2h0JDEodGhpcy5yZW5kZXJlcikpO1xuICAgIH1cbiAgICB1cGRhdGVWaWV3cG9ydENvbHVtbnMocmFuZ2UpIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucy5ub25Mb2NrZWRMZWFmQ29sdW1ucy50b0FycmF5KCk7XG4gICAgICAgIGxldCB7IHN0YXJ0SWR4LCBlbmRJZHgsIG9mZnNldCB9ID0gcmFuZ2UgfHwgdGhpcy5jYWxjdWxhdGVWaWV3cG9ydENvbHVtbnMoKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydElkeCAtIGJ1ZmZlclNpemUpO1xuICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihlbmRJZHggKyBidWZmZXJTaXplLCBjb2x1bW5zLmxlbmd0aCAtIDEpO1xuICAgICAgICBpZiAoc3RhcnQgPCBzdGFydElkeCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHggLSAxOyBpZHggPj0gc3RhcnQ7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0IC09IGNvbHVtbnNbaWR4XS53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VycmVudENvbHVtbnMgPSBjb2x1bW5zLnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydENvbHVtbnNXaWR0aCA9IGN1cnJlbnRDb2x1bW5zLnJlZHVjZSgodG90YWwsIGNvbHVtbikgPT4gdG90YWwgKyBjb2x1bW4ud2lkdGgsIDApO1xuICAgICAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRDb2x1bW4gPSBuZXcgQ29sdW1uQmFzZSQxKCk7XG4gICAgICAgICAgICBvZmZzZXRDb2x1bW4ud2lkdGggPSBvZmZzZXQ7XG4gICAgICAgICAgICBjdXJyZW50Q29sdW1ucy51bnNoaWZ0KG9mZnNldENvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydENvbHVtbnMgPSBuZXcgUXVlcnlMaXN0KCk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDb2x1bW5zLnJlc2V0KGN1cnJlbnRDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zU3RhcnRJZHggPSBzdGFydDtcbiAgICAgICAgdGhpcy5jb2x1bW5zRW5kSWR4ID0gZW5kO1xuICAgICAgICB0aGlzLmNvbHVtbkluZm8uY29sdW1uUmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0LCBlbmQsIG9mZnNldCB9KTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5WaWV3cG9ydChzdGFydElkeCwgZW5kSWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVDb2x1bW5TY3JvbGwoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5jYWxjdWxhdGVWaWV3cG9ydENvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uVmlld3BvcnQocmFuZ2Uuc3RhcnRJZHgsIHJhbmdlLmVuZElkeCk7XG4gICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRJZHggPCB0aGlzLmNvbHVtbnNTdGFydElkeCB8fCB0aGlzLmNvbHVtbnNFbmRJZHggPCByYW5nZS5lbmRJZHgpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmNvbHVtblVwZGF0ZUZyYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtblVwZGF0ZUZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRDb2x1bW5zKHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNvbHVtblZpZXdwb3J0KHN0YXJ0SWR4LCBlbmRJZHgpIHtcbiAgICAgICAgY29uc3QgbG9ja2VkQ291bnQgPSB0aGlzLmxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbGVhZkNvbHVtbnMkJDEgPSB0aGlzLm5vbkxvY2tlZExlYWZDb2x1bW5zLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRTdGFydCA9IGxvY2tlZENvdW50ICsgc3RhcnRJZHggKyAodGhpcy5kZXRhaWxUZW1wbGF0ZSAmJiBzdGFydElkeCA+IDAgPyAxIDogMCk7XG4gICAgICAgIGxldCB2aWV3cG9ydEVuZCA9IGxvY2tlZENvdW50ICsgZW5kSWR4ICsgKHRoaXMuZGV0YWlsVGVtcGxhdGUgPyAxIDogMCk7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGxlYWZDb2x1bW5zJCQxLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGxlYWZDb2x1bW5zJCQxW2lkeF07XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzU3BhbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0RW5kICs9IGNvbHVtbi5jaGlsZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc2V0Q29sdW1uVmlld3BvcnQodmlld3BvcnRTdGFydCwgdmlld3BvcnRFbmQpO1xuICAgIH1cbiAgICBjYWxjdWxhdGVWaWV3cG9ydENvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsTGVmdCwgY2xpZW50V2lkdGggfSA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubm9uTG9ja2VkTGVhZkNvbHVtbnMudG9BcnJheSgpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2Nyb2xsTGVmdCA9IHRoaXMubm9ybWFsaXplU2Nyb2xsTGVmdChzY3JvbGxMZWZ0KTtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbmQgPSBub3JtYWxpemVkU2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgc3RhcnRJZHg7XG4gICAgICAgIGxldCBlbmRJZHggPSAwO1xuICAgICAgICBsZXQgY3VycmVudCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgaWR4O1xuICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNvbHVtbnMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tpZHhdO1xuICAgICAgICAgICAgY3VycmVudCArPSBjb2x1bW4ud2lkdGggfHwgMDtcbiAgICAgICAgICAgIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgPiBub3JtYWxpemVkU2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gaWR4O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGN1cnJlbnQgLSAoY29sdW1uLndpZHRoIHx8IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPj0gdmlld3BvcnRFbmQpIHtcbiAgICAgICAgICAgICAgICBlbmRJZHggPSBpZHg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmRJZHggJiYgaWR4ID4gMCkge1xuICAgICAgICAgICAgZW5kSWR4ID0gY29sdW1ucy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0SWR4LCBlbmRJZHgsIG9mZnNldCB9O1xuICAgIH1cbiAgICB2aWV3cG9ydFdpZHRoQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB0aGlzLnZpZXdwb3J0Q29sdW1ucy50b0FycmF5KCkucmVkdWNlKCh0b3RhbCwgY29sdW1uKSA9PiB0b3RhbCArIGNvbHVtbi53aWR0aCwgMCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50V2lkdGggIT09IHRoaXMudmlld3BvcnRDb2x1bW5zV2lkdGg7XG4gICAgfVxuICAgIG5vcm1hbGl6ZVNjcm9sbExlZnQocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnRsID8gcnRsU2Nyb2xsUG9zaXRpb24ocG9zaXRpb24sIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3VwcG9ydFNlcnZpY2UucnRsU2Nyb2xsTGVmdCkgOiBwb3NpdGlvbjtcbiAgICB9XG4gICAgZWxlbWVudFNjcm9sbExlZnQoZWxlbWVudCkge1xuICAgICAgICBpZiAodGhpcy5ydGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVNjcm9sbExlZnQodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCAtIGVsZW1lbnQub2Zmc2V0TGVmdCAtIGVsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldExlZnQ7XG4gICAgfVxufVxuTGlzdENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBTQ1JPTExFUl9GQUNUT1JZX1RPS0VOLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IERFRkFVTFRfU0NST0xMRVJfRkFDVE9SWVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtbGlzdCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNsb2NrZWRDb250YWluZXIgY2xhc3M9XCJrLWdyaWQtY29udGVudC1sb2NrZWRcIiByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgKm5nSWY9XCJpc0xvY2tlZFwiIFtzdHlsZS53aWR0aC5weF09XCJsb2NrZWRXaWR0aFwiXG4gICAgICAgIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cIntcbiAgICAgICAgICAgIGtleWRvd246IGxvY2tlZEtleWRvd24sXG4gICAgICAgICAgICBzY3JvbGw6IGxvY2tlZFNjcm9sbCxcbiAgICAgICAgICAgIG1vdXNld2hlZWw6IGxvY2tlZE1vdXNld2hlZWwsXG4gICAgICAgICAgICBET01Nb3VzZVNjcm9sbDogbG9ja2VkTW91c2V3aGVlbFxuICAgICAgICB9XCJcbiAgICAgICAgW3Njb3BlXT1cInRoaXNcIlxuICAgICAgICA+XG4gICAgICAgIDxkaXYgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwiay1ncmlkLXRhYmxlLXdyYXBcIj5cbiAgICAgICAgICAgIDx0YWJsZSBbbG9ja2VkXT1cInRydWVcIiAjbG9ja2VkVGFibGUgY2xhc3M9XCJrLWdyaWQtdGFibGVcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgW3N0eWxlLndpZHRoLnB4XT1cImxvY2tlZFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPGNvbGdyb3VwIGtlbmRvR3JpZENvbEdyb3VwXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImxvY2tlZExlYWZDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgICAgICAgICA8dGJvZHkga2VuZG9HcmlkVGFibGVCb2R5XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpc0xvY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtub1JlY29yZHNUZXh0XT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibG9ja2VkTGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxDb2x1bW5zQ291bnRdPVwibGVhZkNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dHcm91cEZvb3RlcnNdPVwic2hvd0Zvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgIFtza2lwXT1cInNraXBcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbcm93Q2xhc3NdPVwicm93Q2xhc3NcIj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDxrZW5kby1yZXNpemUtc2Vuc29yPjwva2VuZG8tcmVzaXplLXNlbnNvcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLWhlaWdodC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IFtzdHlsZS5oZWlnaHQucHhdPVwidG90YWxIZWlnaHRcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+PGRpdiAjY29udGFpbmVyXG4gICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC1jb250ZW50IGstdmlydHVhbC1jb250ZW50XCJcbiAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgIFtrZW5kb0dyaWRSZXNpemFibGVDb250YWluZXJdPVwibG9ja2VkTGVhZkNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgIFtsb2NrZWRXaWR0aF09XCJsb2NrZWRXaWR0aCArIDFcIj5cbiAgICAgICAgPGRpdiByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJrLWdyaWQtdGFibGUtd3JhcFwiPlxuICAgICAgICAgICAgPHRhYmxlIFtzdHlsZS53aWR0aC5weF09XCJub25Mb2NrZWRXaWR0aFwiICN0YWJsZSBbdmlydHVhbENvbHVtbnNdPVwidmlydHVhbENvbHVtbnNcIlxuICAgICAgICAgICAgICBjbGFzcz1cImstZ3JpZC10YWJsZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICA8Y29sZ3JvdXAga2VuZG9HcmlkQ29sR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtncm91cHNdPVwiaXNMb2NrZWQgPyBbXSA6IGdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cIm5vbkxvY2tlZENvbHVtbnNUb1JlbmRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtkZXRhaWxUZW1wbGF0ZV09XCJkZXRhaWxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgICAgICAgICAgPHRib2R5IGtlbmRvR3JpZFRhYmxlQm9keVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3NraXBHcm91cERlY29yYXRpb25dPVwiaXNMb2NrZWRcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0dyb3VwRm9vdGVyc109XCJzaG93Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibm9uTG9ja2VkQ29sdW1uc1RvUmVuZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbENvbHVtbnNdPVwibm9uTG9ja2VkTGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICBbZGV0YWlsVGVtcGxhdGVdPVwiZGV0YWlsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbm9SZWNvcmRzVGVtcGxhdGVdPVwibm9SZWNvcmRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbG9ja2VkQ29sdW1uc0NvdW50XT1cImxvY2tlZExlYWZDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFt0b3RhbENvbHVtbnNDb3VudF09XCJsZWFmQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbc2tpcF09XCJza2lwXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIlxuICAgICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJmaWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0NsYXNzXT1cInJvd0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxDb2x1bW5zXT1cInZpcnR1YWxDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8a2VuZG8tcmVzaXplLXNlbnNvciAqbmdJZj1cImlzTG9ja2VkXCI+PC9rZW5kby1yZXNpemUtc2Vuc29yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGtlbmRvLXJlc2l6ZS1zZW5zb3IgKm5nSWY9XCJpc0xvY2tlZCB8fCB2aXJ0dWFsQ29sdW1uc1wiPjwva2VuZG8tcmVzaXplLXNlbnNvcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImstaGVpZ2h0LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJ0b3RhbEhlaWdodFwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInZpcnR1YWxDb2x1bW5zXCIgY2xhc3M9XCJrLXdpZHRoLWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cInRvdGFsV2lkdGhcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIiBrZW5kb0dyaWRMb2FkaW5nPlxuICAgIDwvZGl2PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTGlzdENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbU0NST0xMRVJfRkFDVE9SWV9UT0tFTixdIH1dIH0sXG4gICAgeyB0eXBlOiBEZXRhaWxzU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlTm90aWZpY2F0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogU3VzcGVuZFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEdyb3Vwc1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBTY3JvbGxTeW5jU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVzaXplU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEJyb3dzZXJTdXBwb3J0U2VydmljZSB9LFxuICAgIHsgdHlwZTogTmF2aWdhdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFNjcm9sbFJlcXVlc3RTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBQREZTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5JbmZvU2VydmljZSB9XG5dO1xuTGlzdENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWdyaWQtY29udGFpbmVyXCIsXSB9XSxcbiAgICBob3N0Um9sZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFtcImF0dHIucm9sZVwiLF0gfV0sXG4gICAgZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3RhbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcm93SGVpZ2h0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkZXRhaWxSb3dIZWlnaHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRha2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNraXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRldGFpbFRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBub1JlY29yZHNUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0YWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByb3dDbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9hZGluZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmlydHVhbENvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGlzVmlydHVhbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29udGVudFNjcm9sbDogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHBhZ2VDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBzY3JvbGxCb3R0b206IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1wiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSxcbiAgICBsb2NrZWRDb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1wibG9ja2VkQ29udGFpbmVyXCIsXSB9XSxcbiAgICBsb2NrZWRUYWJsZTogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbXCJsb2NrZWRUYWJsZVwiLF0gfV0sXG4gICAgdGFibGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1widGFibGVcIixdIH1dLFxuICAgIHJlc2l6ZVNlbnNvcnM6IFt7IHR5cGU6IFZpZXdDaGlsZHJlbiwgYXJnczogW1Jlc2l6ZVNlbnNvckNvbXBvbmVudCxdIH1dXG59O1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIGVuY2Fwc3VsYXRlcyB0aGUgaW4tbWVtb3J5IGhhbmRsaW5nIG9mIGRhdGEgb3BlcmF0aW9ucyBzdWNoIGFzIFtwYWdpbmddKHslIHNsdWcgcGFnaW5nX2dyaWQgJX0pLFxuICogW3NvcnRpbmddKHslIHNsdWcgc29ydGluZ19ncmlkICV9KSwgYW5kIFtncm91cGluZ10oeyUgc2x1ZyBncm91cGluZ2Jhc2ljc19ncmlkICV9KVxuICogKFttb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlc10oeyUgc2x1ZyBhdXRvbWF0aWNvcGVyYXRpb25zX2dyaWQgJX0pKS5cbiAqL1xuY2xhc3MgRGF0YUJpbmRpbmdEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGdyaWQsIGNoYW5nZURldGVjdG9yLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSkge1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgICAgIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgPSBsb2NhbERhdGFDaGFuZ2VzU2VydmljZTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNraXA6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSBbXTtcbiAgICAgICAgaWYgKGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkU3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnJlYmluZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgc2tpcHBlZCBieSB0aGUgcGFnZXIuXG4gICAgICovXG4gICAgc2V0IHNraXAodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkLnNraXAgPSB0aGlzLnN0YXRlLnNraXAgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZGVzY3JpcHRvcnMgYnkgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzb3J0ZWQuXG4gICAgICovXG4gICAgc2V0IHNvcnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5ncmlkLnNvcnQgPSB0aGlzLnN0YXRlLnNvcnQgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZGVzY3JpcHRvciBieSB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIGZpbHRlcmVkLlxuICAgICAqL1xuICAgIHNldCBmaWx0ZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlciA9IHRoaXMuc3RhdGUuZmlsdGVyID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHBhZ2Ugc2l6ZSB1c2VkIGJ5IHRoZSBHcmlkIHBhZ2VyLlxuICAgICAqL1xuICAgIHNldCBwYWdlU2l6ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmdyaWQucGFnZVNpemUgPSB0aGlzLnN0YXRlLnRha2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0b3JzIGJ5IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgZ3JvdXBlZC5cbiAgICAgKi9cbiAgICBzZXQgZ3JvdXAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5ncmlkLmdyb3VwID0gdGhpcy5zdGF0ZS5ncm91cCA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgZGF0YSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIEdyaWQuXG4gICAgICovXG4gICAgc2V0IGRhdGEodmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSB2YWx1ZSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UuZGF0YSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYXBwbHlTdGF0ZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuZ3JpZFxuICAgICAgICAgICAgLmRhdGFTdGF0ZUNoYW5nZVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChhbnlDaGFuZ2VkKFtcInBhZ2VTaXplXCIsIFwic2tpcFwiLCBcInNvcnRcIiwgXCJncm91cFwiLCBcImZpbHRlclwiXSwgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMucmViaW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVHcmlkRGF0YSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvblN0YXRlQ2hhbmdlKHN0YXRlJCQxKSB7XG4gICAgICAgIHRoaXMuYXBwbHlTdGF0ZShzdGF0ZSQkMSk7XG4gICAgICAgIHRoaXMucmViaW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByZWJpbmQoKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWREYXRhKCk7XG4gICAgICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyB0aGUgR3JpZCB0aGF0IGl0cyBkYXRhIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG5vdGlmeURhdGFDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZ3JpZC5vbkRhdGFDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlRGV0ZWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvY2VzcyhzdGF0ZSQkMSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcyh0aGlzLm9yaWdpbmFsRGF0YSwgc3RhdGUkJDEpO1xuICAgIH1cbiAgICBhcHBseVN0YXRlKHsgc2tpcCwgdGFrZTogdGFrZSQkMSwgc29ydCwgZ3JvdXAsIGZpbHRlcjogZmlsdGVyJCQxIH0pIHtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRha2UkJDE7XG4gICAgICAgIHRoaXMuc29ydCA9IHNvcnQ7XG4gICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXIkJDE7XG4gICAgfVxuICAgIHVwZGF0ZUdyaWREYXRhKCkge1xuICAgICAgICB0aGlzLmdyaWQuZGF0YSA9IHRoaXMucHJvY2Vzcyh0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbn1cbkRhdGFCaW5kaW5nRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkQmluZGluZ10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGFCaW5kaW5nRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogR3JpZENvbXBvbmVudCB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlIH1cbl07XG5EYXRhQmluZGluZ0RpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBza2lwOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzb3J0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBhZ2VTaXplOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGF0YTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFtcImtlbmRvR3JpZEJpbmRpbmdcIixdIH1dXG59O1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIHN0b3JlcyB0aGUgcm93IHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgR3JpZCBpbiBtZW1vcnlcbiAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgc2VsZWN0aW9uX2dyaWQgJX0jdG9jLWR1cmluZy1kYXRhLW9wZXJhdGlvbnMpKS5cbiAqL1xuY2xhc3MgU2VsZWN0aW9uRGlyZWN0aXZlIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihncmlkLCBjZCkge1xuICAgICAgICBzdXBlcihncmlkLCBjZCk7XG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5zZWxlY3RhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLnNlbGVjdGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25EaXJlY3RpdmUgPSB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5TZWxlY3Rpb25EaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRTZWxlY3RCeV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblNlbGVjdGlvbkRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEdyaWRDb21wb25lbnQgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgd2hpY2ggY29udHJvbHMgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSBtYXN0ZXIgZGV0YWlsIHJvd3MuXG4gKi9cbmNsYXNzIEV4cGFuZERldGFpbHNEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGdyaWQpIHtcbiAgICAgICAgdGhpcy5ncmlkID0gZ3JpZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGV4cGFuZGVkRGV0YWlsS2V5cyBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhwYW5kZWREZXRhaWxLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0aGF0IHdpbGwgc3RvcmUgdGhlIGV4cGFuZGVkIGtleXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZGVkRGV0YWlsS2V5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBpdGVtcyBzaG91bGQgYmUgaW5pdGlhbGx5IGV4cGFuZGVkLlxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbml0aWFsbHlFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHRoaXMuZ3JpZC5pc0RldGFpbEV4cGFuZGVkID0gdGhpcy5pc0V4cGFuZGVkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQobWVyZ2UodGhpcy5ncmlkLmRldGFpbEV4cGFuZC5waXBlKG1hcChlID0+IChPYmplY3QuYXNzaWduKHsgZXhwYW5kOiB0cnVlIH0sIGUpKSkpLCB0aGlzLmdyaWQuZGV0YWlsQ29sbGFwc2UucGlwZShtYXAoZSA9PiAoT2JqZWN0LmFzc2lnbih7IGV4cGFuZDogZmFsc2UgfSwgZSkpKSkpLnN1YnNjcmliZSh0aGlzLnRvZ2dsZVN0YXRlLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgaXRlbSBrZXkgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYGV4cGFuZGVkRGV0YWlsS2V5c2AgY29sbGVjdGlvbiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIG1hc3Rlcl9kZXRhaWxfZXhwYW5kZWRfc3RhdGVfZ3JpZCAlfSN0b2MtYnVpbHQtaW4tZGlyZWN0aXZlKSkuXG4gICAgICovXG4gICAgZ2V0IGV4cGFuZERldGFpbHNLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBhbmRCeTtcbiAgICB9XG4gICAgc2V0IGV4cGFuZERldGFpbHNLZXkoa2V5KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRCeSA9IGdldHRlcihrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXhwYW5kQnkgPSBrZXk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQSBkZXByZWNhdGVkIGFsaWFzIGZvciBzZXR0aW5nIHRoZSBgZXhwYW5kRGV0YWlsc0tleWAgcHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0IGV4cGFuZERldGFpbEJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBhbmREZXRhaWxzS2V5O1xuICAgIH1cbiAgICBzZXQgZXhwYW5kRGV0YWlsQnkoa2V5KSB7XG4gICAgICAgIHRoaXMuZXhwYW5kRGV0YWlsc0tleSA9IGtleTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBnZXQga2V5R2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kQnkgfHwgZ2V0dGVyKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBpc0V4cGFuZGVkKGFyZ3MpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5rZXlHZXR0ZXIoYXJncy5kYXRhSXRlbSk7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGFuZGVkRGV0YWlsS2V5cy5pbmRleE9mKGtleSkgPiAtMSA/ICF0aGlzLmluaXRpYWxseUV4cGFuZGVkIDogdGhpcy5pbml0aWFsbHlFeHBhbmRlZDtcbiAgICB9XG4gICAgdG9nZ2xlU3RhdGUoYXJncykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmtleUdldHRlcihhcmdzLmRhdGFJdGVtKTtcbiAgICAgICAgaWYgKEJvb2xlYW4odGhpcy5pbml0aWFsbHlFeHBhbmRlZCkgIT09IGFyZ3MuZXhwYW5kKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkRGV0YWlsS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhwYW5kZWREZXRhaWxLZXlzLmluZGV4T2Yoa2V5KTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWREZXRhaWxLZXlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBhbmRlZERldGFpbEtleXNDaGFuZ2UuZW1pdCh0aGlzLmV4cGFuZGVkRGV0YWlsS2V5cyk7XG4gICAgfVxufVxuRXhwYW5kRGV0YWlsc0RpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEV4cGFuZERldGFpbHNCeV0nLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9HcmlkRXhwYW5kRGV0YWlsc0J5J1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5FeHBhbmREZXRhaWxzRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogR3JpZENvbXBvbmVudCB9XG5dO1xuRXhwYW5kRGV0YWlsc0RpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBleHBhbmRlZERldGFpbEtleXNDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBleHBhbmREZXRhaWxzS2V5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydrZW5kb0dyaWRFeHBhbmREZXRhaWxzQnknLF0gfV0sXG4gICAgZXhwYW5kRGV0YWlsQnk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGV4cGFuZGVkRGV0YWlsS2V5czogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW5pdGlhbGx5RXhwYW5kZWQ6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBDb21wb25lbnRNZXNzYWdlcyB7XG59XG5NZXNzYWdlcy5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBncm91cFBhbmVsRW1wdHk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5vUmVjb3JkczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGFnZXJGaXJzdFBhZ2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBhZ2VyTGFzdFBhZ2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBhZ2VyUHJldmlvdXNQYWdlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlck5leHRQYWdlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlclBhZ2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBhZ2VySXRlbXNQZXJQYWdlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlck9mOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlckl0ZW1zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlclBhZ2VOdW1iZXJJbnB1dFRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckVxT3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlck5vdEVxT3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcklzTnVsbE9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJJc05vdE51bGxPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVySXNFbXB0eU9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJJc05vdEVtcHR5T3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlclN0YXJ0c1dpdGhPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyQ29udGFpbnNPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyTm90Q29udGFpbnNPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyRW5kc1dpdGhPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyR3RlT3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckd0T3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckx0ZU9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJMdE9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJJc1RydWU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcklzRmFsc2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckJvb2xlYW5BbGw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckFmdGVyT3JFcXVhbE9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJBZnRlck9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJCZWZvcmVPcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyQmVmb3JlT3JFcXVhbE9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJGaWx0ZXJCdXR0b246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckNsZWFyQnV0dG9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJBbmRMb2dpYzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyT3JMb2dpYzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9hZGluZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uTWVudTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9jazogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdW5sb2NrOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzb3J0YWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydEFzY2VuZGluZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydERlc2NlbmRpbmc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNvcnRlZEFzY2VuZGluZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydGVkRGVzY2VuZGluZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydGVkRGVmYXVsdDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uc0FwcGx5OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW5zUmVzZXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRldGFpbEV4cGFuZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGV0YWlsQ29sbGFwc2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlckRhdGVUb2RheTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyRGF0ZVRvZ2dsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyTnVtZXJpY0RlY3JlbWVudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyTnVtZXJpY0luY3JlbWVudDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSBleHRlbmRzIE1lc3NhZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgfVxufVxuTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkTG9jYWxpemVkTWVzc2FnZXNdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Mb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBDdXN0b20gY29tcG9uZW50IG1lc3NhZ2VzIG92ZXJyaWRlIGRlZmF1bHQgY29tcG9uZW50IG1lc3NhZ2VzXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGdsb2JhbGl6YXRpb25fZ3JpZCAlfSN0b2MtbG9jYWxpemF0aW9uKSkuXG4gKi9cbmNsYXNzIEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgTWVzc2FnZXMge1xuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5DdXN0b21NZXNzYWdlc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtbWVzc2FnZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DdXN0b21NZXNzYWdlc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlclJvd0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXTtcbiAgICAgICAgdGhpcy5maWx0ZXJSb3dDbGFzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuZmlsdGVyTGFiZWwgPSB0aGlzLmxvY2FsaXphdGlvbi5nZXQoJ2ZpbHRlcicpO1xuICAgIH1cbn1cbkZpbHRlclJvd0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEZpbHRlclJvd10nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICA8dGRcbiAgICAgICAgIFtjbGFzcy5rLWdyb3VwLWNlbGxdPVwidHJ1ZVwiXG4gICAgICAgICAqbmdGb3I9XCJsZXQgZyBvZiBncm91cHNcIlxuICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZFxuICAgICAgICAgW2NsYXNzLmstaGllcmFyY2h5LWNlbGxdPVwidHJ1ZVwiXG4gICAgICAgICAqbmdJZj1cImRldGFpbFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICA8L3RkPlxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGNvbHVtbkluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZmlsdGVyTGFiZWxcIlxuICAgICAgICAgIGtlbmRvR3JpZEZpbHRlckNlbGxcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXhcIlxuICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCJsb2NrZWRDb2x1bW5zQ291bnQgKyBjb2x1bW5JbmRleFwiXG4gICAgICA+PC90ZD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZpbHRlclJvd0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkZpbHRlclJvd0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW5zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGdyb3VwczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGV0YWlsVGVtcGxhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvZ2ljYWxSb3dJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9ja2VkQ29sdW1uc0NvdW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJSb3dDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1maWx0ZXItcm93JyxdIH1dXG59O1xuXG5jb25zdCBhcmVEaWZmZXJlbnQgPSAoYSwgYikgPT4gYS5maWVsZCAhPT0gYi5maWVsZCB8fCBhLm9wZXJhdG9yICE9PSBiLm9wZXJhdG9yIHx8IGEudmFsdWUgIT09IGIudmFsdWU7XG5jb25zdCBpc0NoYW5nZWQkMSA9IChhLCBiKSA9PiB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gYS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGFbaWR4XTtcbiAgICAgICAgY29uc3QgY3VyciA9IGJbaWR4XTtcbiAgICAgICAgaWYgKGlzQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcihwcmV2KSkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgICAgICAgICAgaWYgKGRpZmZGaWx0ZXJzKHByZXYsIGN1cnJbaWR4XSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmVEaWZmZXJlbnQocHJldiwgY3VycikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBjb3B5T2JqZWN0ID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBvYmopO1xuICAgIGlmIChvYmouY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICBjb25zdCBwcm90byA9IG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9PSAnY29uc3RydWN0b3InICYmIHByb3RvLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBvYmpbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBjbG9uZUZpbHRlciA9IChmaWx0ZXIkJDEpID0+IGNvcHlPYmplY3QoZmlsdGVyJCQxKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjbG9uZUZpbHRlcnMgPSAoZmlsdGVyJCQxKSA9PiB7XG4gICAgaWYgKCFmaWx0ZXIkJDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yKGZpbHRlciQkMSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbHRlcnM6IGNsb25lRmlsdGVycyhmaWx0ZXIkJDEuZmlsdGVycyksXG4gICAgICAgICAgICBsb2dpYzogZmlsdGVyJCQxLmxvZ2ljXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyJCQxKSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyJCQxLm1hcChjbG9uZUZpbHRlcnMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmVGaWx0ZXIoZmlsdGVyJCQxKTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZGlmZkZpbHRlcnMgPSAoYSwgYikgPT4ge1xuICAgIGlmIChpc1ByZXNlbnQoYSkgJiYgIWlzUHJlc2VudChiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpc1ByZXNlbnQoYSkgJiYgaXNQcmVzZW50KGIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVzZW50KGEpICYmIGlzUHJlc2VudChiKSAmJiBpc0NoYW5nZWQkMShhLmZpbHRlcnMsIGIuZmlsdGVycyk7XG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRmlsdGVyQ2VsbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQ29udGV4dCA9IHt9O1xuICAgIH1cbiAgICBnZXQgZmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xuICAgIH1cbiAgICBzZXQgZmlsdGVyKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlciA9IGNsb25lRmlsdGVycyh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCB0ZW1wbGF0ZUNvbnRleHQoKSB7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQ29udGV4dC5jb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVDb250ZXh0LmZpbHRlciA9IHRoaXMuZmlsdGVyO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVDb250ZXh0W1wiJGltcGxpY2l0XCJdID0gdGhpcy5maWx0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUNvbnRleHQ7XG4gICAgfVxuICAgIGdldCBoYXNUZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbHVtbi5maWx0ZXJDZWxsVGVtcGxhdGVSZWYpO1xuICAgIH1cbiAgICBnZXQgaXNGaWx0ZXJhYmxlKCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29sdW1uKSAmJiAhaXNOdWxsT3JFbXB0eVN0cmluZyh0aGlzLmNvbHVtbi5maWVsZCkgJiYgdGhpcy5jb2x1bW4uZmlsdGVyYWJsZTtcbiAgICB9XG59XG5GaWx0ZXJDZWxsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkRmlsdGVyQ2VsbF0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc0ZpbHRlcmFibGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImhhc1RlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrZW5kb0ZpbHRlckNlbGxIb3N0IFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyQ2VsbFRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5maWx0ZXJDZWxsVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInRlbXBsYXRlQ29udGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuRmlsdGVyQ2VsbENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbmNvbnN0IGxvY2FsaXplT3BlcmF0b3JzID0gb3BlcmF0b3JzID0+IGxvY2FsaXphdGlvbiA9PiBPYmplY3Qua2V5cyhvcGVyYXRvcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBhY2Nbb3BlcmF0b3JzW2tleV1dID0gbG9jYWxpemF0aW9uLmdldChrZXkpO1xuICAgIHJldHVybiBhY2M7XG59LCB7fSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6YWxpZ25cbmNvbnN0IG9wZXJhdG9yVGV4dHMgPSBsb2NhbGl6ZU9wZXJhdG9ycyh7XG4gICAgXCJmaWx0ZXJFcU9wZXJhdG9yXCI6IFwiZXFcIixcbiAgICBcImZpbHRlck5vdEVxT3BlcmF0b3JcIjogXCJuZXFcIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4gICAgXCJmaWx0ZXJHdGVPcGVyYXRvclwiOiBcImd0ZVwiLFxuICAgIFwiZmlsdGVyR3RPcGVyYXRvclwiOiBcImd0XCIsXG4gICAgXCJmaWx0ZXJMdGVPcGVyYXRvclwiOiBcImx0ZVwiLFxuICAgIFwiZmlsdGVyTHRPcGVyYXRvclwiOiBcImx0XCIsXG4gICAgXCJmaWx0ZXJJc051bGxPcGVyYXRvclwiOiBcImlzbnVsbFwiLFxuICAgIFwiZmlsdGVySXNOb3ROdWxsT3BlcmF0b3JcIjogXCJpc25vdG51bGxcIixcbiAgICBcImZpbHRlcklzRW1wdHlPcGVyYXRvclwiOiBcImlzZW1wdHlcIixcbiAgICBcImZpbHRlcklzTm90RW1wdHlPcGVyYXRvclwiOiBcImlzbm90ZW1wdHlcIixcbiAgICBcImZpbHRlckNvbnRhaW5zT3BlcmF0b3JcIjogXCJjb250YWluc1wiLFxuICAgIFwiZmlsdGVyTm90Q29udGFpbnNPcGVyYXRvclwiOiBcImRvZXNub3Rjb250YWluXCIsXG4gICAgXCJmaWx0ZXJTdGFydHNXaXRoT3BlcmF0b3JcIjogXCJzdGFydHN3aXRoXCIsXG4gICAgXCJmaWx0ZXJFbmRzV2l0aE9wZXJhdG9yXCI6IFwiZW5kc3dpdGhcIixcbiAgICBcImZpbHRlckFmdGVyT3JFcXVhbE9wZXJhdG9yXCI6IFwiYWZ0ZXItZXFcIixcbiAgICBcImZpbHRlckFmdGVyT3BlcmF0b3JcIjogXCJhZnRlclwiLFxuICAgIFwiZmlsdGVyQmVmb3JlT3JFcXVhbE9wZXJhdG9yXCI6IFwiYmVmb3JlLWVxXCIsXG4gICAgXCJmaWx0ZXJCZWZvcmVPcGVyYXRvclwiOiBcImJlZm9yZVwiXG59KTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCB0b0pTT04gPSAoeHMpID0+IHhzLm1hcCh4ID0+IHgudG9KU09OKCkpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3IsIGxvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gb3BlcmF0b3JUZXh0cyh0aGlzLmxvY2FsaXphdGlvbik7XG4gICAgICAgIHRoaXMuX3RleHQgPSB0aGlzLm1lc3NhZ2VzW3RoaXMub3BlcmF0b3JdO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hUZXh0LmJpbmQodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdC5cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJPZiBGaWx0ZXJPcGVyYXRvckJhc2VcbiAgICAgKi9cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgc2V0IHRleHQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdGV4dCA9IGlzTnVsbE9yRW1wdHlTdHJpbmcodmFsdWUpID8gdGhpcy5tZXNzYWdlc1t0aGlzLm9wZXJhdG9yXSA6IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub3BlcmF0b3JcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVmcmVzaFRleHQoKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuX3RleHQgPT09IHRoaXMubWVzc2FnZXNbdGhpcy5vcGVyYXRvcl07XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBvcGVyYXRvclRleHRzKHRoaXMubG9jYWxpemF0aW9uKTtcbiAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fdGV4dCA9IHRoaXMubWVzc2FnZXNbdGhpcy5vcGVyYXRvcl07XG4gICAgICAgIH1cbiAgICB9XG59XG5GaWx0ZXJPcGVyYXRvckJhc2UucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdGV4dDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbmNvbnN0IGluc2VydERlZmF1bHRGaWx0ZXIgPSAoaW5kZXgsIHJvb3RGaWx0ZXIsIGZpbHRlciQkMSkgPT4ge1xuICAgIHJvb3RGaWx0ZXIgPSAocm9vdEZpbHRlciB8fCB7IGZpbHRlcnM6IFtdLCBsb2dpYzogXCJhbmRcIiB9KTtcbiAgICByb290RmlsdGVyLmZpbHRlcnNbaW5kZXhdID0gZmlsdGVyJCQxO1xuICAgIHJldHVybiBmaWx0ZXIkJDE7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHNldEZpbHRlciA9IChpbmRleCwgZmlsdGVyJCQxLCBmaWVsZCwgZGVmYXVsdE9wZXJhdG9yKSA9PiB7XG4gICAgaWYgKGlzUHJlc2VudChmaWx0ZXIkJDEpICYmIGlzUHJlc2VudChmaWx0ZXIkJDEuZmlsdGVycykgJiYgZmlsdGVyJCQxLmZpbHRlcnMubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlciQkMS5maWx0ZXJzW2luZGV4XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnNlcnREZWZhdWx0RmlsdGVyKGluZGV4LCBmaWx0ZXIkJDEsIHtcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3I6IGRlZmF1bHRPcGVyYXRvclxuICAgICAgICB9KTtcbiAgICB9XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGxvZ2ljT3BlcmF0b3JzID0gKGxvY2FsaXphdGlvbikgPT4gW1xuICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldChcImZpbHRlckFuZExvZ2ljXCIpLCB2YWx1ZTogXCJhbmRcIiB9LFxuICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldChcImZpbHRlck9yTG9naWNcIiksIHZhbHVlOiBcIm9yXCIgfVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBmbGF0dGVuID0gKGZpbHRlciQkMSkgPT4ge1xuICAgIGlmIChpc1ByZXNlbnQoZmlsdGVyJCQxLmZpbHRlcnMpKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXIkJDEuZmlsdGVycy5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjLmNvbmNhdChpc0NvbXBvc2l0ZUZpbHRlckRlc2NyaXB0b3IoY3VycikgPyBmbGF0dGVuKGN1cnIpIDogW2N1cnJdKSwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59O1xuY29uc3QgdHJpbUZpbHRlckJ5RmllbGQgPSAoZmlsdGVyJCQxLCBmaWVsZCkgPT4ge1xuICAgIGlmIChpc1ByZXNlbnQoZmlsdGVyJCQxKSAmJiBpc1ByZXNlbnQoZmlsdGVyJCQxLmZpbHRlcnMpKSB7XG4gICAgICAgIGZpbHRlciQkMS5maWx0ZXJzID0gZmlsdGVyJCQxLmZpbHRlcnMuZmlsdGVyKHggPT4ge1xuICAgICAgICAgICAgaWYgKGlzQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcih4KSkge1xuICAgICAgICAgICAgICAgIHRyaW1GaWx0ZXJCeUZpZWxkKHgsIGZpZWxkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5maWx0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB4LmZpZWxkICE9PSBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBmaWx0ZXJzQnlGaWVsZCA9IChmaWx0ZXIkJDEsIGZpZWxkKSA9PiBmbGF0dGVuKGZpbHRlciQkMSB8fCB7fSkuZmlsdGVyKHggPT4geC5maWVsZCA9PT0gZmllbGQpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGZpbHRlckJ5RmllbGQgPSAoZmlsdGVyJCQxLCBmaWVsZCkgPT4ge1xuICAgIGxldCBbY3VycmVudEZpbHRlcl0gPSBmaWx0ZXJzQnlGaWVsZChmaWx0ZXIkJDEsIGZpZWxkKTtcbiAgICByZXR1cm4gY3VycmVudEZpbHRlcjtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgcmVtb3ZlRmlsdGVyID0gKGZpbHRlciQkMSwgZmllbGQpID0+IHtcbiAgICB0cmltRmlsdGVyQnlGaWVsZChmaWx0ZXIkJDEsIGZpZWxkKTtcbiAgICByZXR1cm4gZmlsdGVyJCQxO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBsb2NhbGl6ZU9wZXJhdG9ycyQxID0gb3BlcmF0b3JzID0+IGxvY2FsaXphdGlvbiA9PiBPYmplY3Qua2V5cyhvcGVyYXRvcnMpLm1hcChrZXkgPT4gKHtcbiAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0KGtleSksXG4gICAgdmFsdWU6IG9wZXJhdG9yc1trZXldXG59KSk7XG4vKipcbiAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRoZSBmaWx0ZXItY2VsbCBjb21wb25lbnQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyByZXVzYWJsZWN1c3RvbWZpbHRlcnNfZ3JpZCAlfSN0b2MtZmlsdGVyLXJvdykpLlxuICovXG5jbGFzcyBCYXNlRmlsdGVyQ2VsbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UgPSBmaWx0ZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBvcGVyYXRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVyYXRvcnMubGVuZ3RoID8gdGhpcy5fb3BlcmF0b3JzIDogdGhpcy5kZWZhdWx0T3BlcmF0b3JzO1xuICAgIH1cbiAgICBzZXQgb3BlcmF0b3JzKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnMgPSB2YWx1ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uTGlzdFN1YnNjcmlwdGlvbiA9IG9ic2VydmUodGhpcy5vcGVyYXRvckxpc3QpXG4gICAgICAgICAgICAucGlwZShtYXAocSA9PiBxLnRvQXJyYXkoKSksIG1hcCh0b0pTT04pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JzID0geDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25MaXN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9wZXJhdGlvbkxpc3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJCeUZpZWxkKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJCeUZpZWxkKHRoaXMuZmlsdGVyLCBmaWVsZCk7XG4gICAgfVxuICAgIGZpbHRlcnNCeUZpZWxkKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzQnlGaWVsZCh0aGlzLmZpbHRlciwgZmllbGQpO1xuICAgIH1cbiAgICByZW1vdmVGaWx0ZXIoZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZUZpbHRlcih0aGlzLmZpbHRlciwgZmllbGQpO1xuICAgIH1cbiAgICB1cGRhdGVGaWx0ZXIoZmlsdGVyJCQxKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZpbHRlciB8fCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgIGxvZ2ljOiBcImFuZFwiXG4gICAgICAgIH07XG4gICAgICAgIGxldCBbY3VycmVudEZpbHRlcl0gPSBmbGF0dGVuKHJvb3QpLmZpbHRlcih4ID0+IHguZmllbGQgPT09IGZpbHRlciQkMS5maWVsZCk7XG4gICAgICAgIGlmICghaXNQcmVzZW50KGN1cnJlbnRGaWx0ZXIpKSB7XG4gICAgICAgICAgICByb290LmZpbHRlcnMucHVzaChmaWx0ZXIkJDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJyZW50RmlsdGVyLCBmaWx0ZXIkJDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICBhcHBseUZpbHRlcihmaWx0ZXIkJDEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlcihmaWx0ZXIkJDEpO1xuICAgIH1cbn1cbkJhc2VGaWx0ZXJDZWxsQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwnLF0gfV0sXG4gICAgb3BlcmF0b3JMaXN0OiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtGaWx0ZXJPcGVyYXRvckJhc2UsXSB9XVxufTtcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYWNjZXNzLW1pc3NpbmctbWVtYmVyXG5jb25zdCBudW1lcmljT3BlcmF0b3JzID0gbG9jYWxpemVPcGVyYXRvcnMkMSh7XG4gICAgXCJmaWx0ZXJFcU9wZXJhdG9yXCI6IFwiZXFcIixcbiAgICBcImZpbHRlck5vdEVxT3BlcmF0b3JcIjogXCJuZXFcIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4gICAgXCJmaWx0ZXJHdGVPcGVyYXRvclwiOiBcImd0ZVwiLFxuICAgIFwiZmlsdGVyR3RPcGVyYXRvclwiOiBcImd0XCIsXG4gICAgXCJmaWx0ZXJMdGVPcGVyYXRvclwiOiBcImx0ZVwiLFxuICAgIFwiZmlsdGVyTHRPcGVyYXRvclwiOiBcImx0XCIsXG4gICAgXCJmaWx0ZXJJc051bGxPcGVyYXRvclwiOiBcImlzbnVsbFwiLFxuICAgIFwiZmlsdGVySXNOb3ROdWxsT3BlcmF0b3JcIjogXCJpc25vdG51bGxcIlxufSk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYXNlIG51bWVyaWMgZmlsdGVyIGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgTnVtZXJpY0ZpbHRlckNvbXBvbmVudCBleHRlbmRzIEJhc2VGaWx0ZXJDZWxsQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJTZXJ2aWNlLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgc3VwZXIoZmlsdGVyU2VydmljZSk7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yLiBEZWZhdWx0cyB0byBgZXFgLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IFwiZXFcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCBpcyB1c2VkIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgdGhlIGNvbXBvbmVudCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge251bWVyaWN9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0ZXAgPSAxO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlICoqVXAqKiBhbmQgKipEb3duKiogc3BpbiBidXR0b25zIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zcGlubmVycyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IG51bWVyaWNPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIG51bWJlciBmb3JtYXQgdXNlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm90IGZvY3VzZWQuXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBjb2x1bW4uZm9ybWF0YCB2YWx1ZSBpcyB1c2VkIChpZiBzZXQpLlxuICAgICAqL1xuICAgIHNldCBmb3JtYXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgbnVtYmVyIGZvcm1hdCB1c2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBub3QgZm9jdXNlZC5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGNvbHVtbi5mb3JtYXRgIHZhbHVlIGlzIHVzZWQgKGlmIHNldCkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBmb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiAhaXNOdWxsT3JFbXB0eVN0cmluZyh0aGlzLl9mb3JtYXQpID8gdGhpcy5fZm9ybWF0IDogdGhpcy5jb2x1bW5Gb3JtYXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGZpbHRlciBmb3IgdGhlIGFzc29jaWF0ZWQgY29sdW1uIGZpZWxkLlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUZpZWxkKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZmlsdGVyIG9wZXJhdG9yIGZvciB0aGUgYXNzb2NpYXRlZCBjb2x1bW4gZmllbGQuXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudE9wZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyID8gdGhpcy5jdXJyZW50RmlsdGVyLm9wZXJhdG9yIDogdGhpcy5vcGVyYXRvcjtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uICYmICFpc051bGxPckVtcHR5U3RyaW5nKHRoaXMuY29sdW1uLmZvcm1hdCkgP1xuICAgICAgICAgICAgZXh0cmFjdEZvcm1hdCh0aGlzLmNvbHVtbi5mb3JtYXQpIDogXCJuMlwiO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBsb2NhbGl6YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IG51bWVyaWNPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9wZXJhdG9ycyA9IHRvSlNPTih0aGlzLm9wZXJhdG9yTGlzdC50b0FycmF5KCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuTnVtZXJpY0ZpbHRlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgb3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzcGlubmVyczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGVjaW1hbHM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcm1hdDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG51bWVyaWMgZmlsdGVyIGNlbGwuXG4gKlxuICogQGV4YW1wbGVcbiAqICBgYGBodG1sLW5vLXJ1blxuICogICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiIHRpdGxlPVwiUHJvZHVjdCBOYW1lXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbFxuICogICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAqICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLWNlbGw+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICBgYGBcbiAqL1xuY2xhc3MgTnVtZXJpY0ZpbHRlckNlbGxDb21wb25lbnQgZXh0ZW5kcyBOdW1lcmljRmlsdGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJTZXJ2aWNlLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgc3VwZXIoZmlsdGVyU2VydmljZSwgbG9jYWxpemF0aW9uKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBkZWxheSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSB0aGUgZmlsdGVyIHZhbHVlIGlzIHN1Ym1pdHRlZC5cbiAgICAgICAgICogQSB2YWx1ZSBvZiBgMGAgaW5kaWNhdGVzIG5vIGRlbGF5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgNTAwYC5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlckRlbGF5ID0gNTAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZHJvcC1kb3duIGZpbHRlciBvcGVyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNob3dPcGVyYXRvcnMgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbWVzc2FnZUZvcihrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmdldChrZXkpO1xuICAgIH1cbn1cbk51bWVyaWNGaWx0ZXJDZWxsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLWNlbGwnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1ncmlkLWZpbHRlci13cmFwcGVyLWNlbGxcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgIFtvcGVyYXRvcnNdPVwib3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFtkZWZhdWx0T3BlcmF0b3JdPVwib3BlcmF0b3JcIlxuICAgICAgICAgICAgW3Nob3dPcGVyYXRvcnNdPVwic2hvd09wZXJhdG9yc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveFxuICAgICAgICAgICAgICAgIGtlbmRvR3JpZEZvY3VzYWJsZVxuICAgICAgICAgICAgICAgIGtlbmRvRmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICBbZmlsdGVyRGVsYXldPVwiZmlsdGVyRGVsYXlcIlxuICAgICAgICAgICAgICAgIFthdXRvQ29ycmVjdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudEZpbHRlcj8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgICAgICAgICAgICBbZGVjaW1hbHNdPVwiZGVjaW1hbHNcIlxuICAgICAgICAgICAgICAgIFtzcGlubmVyc109XCJzcGlubmVyc1wiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8a2VuZG8tbnVtZXJpY3RleHRib3gtbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAgICAgW2luY3JlbWVudF09XCJtZXNzYWdlRm9yKCdmaWx0ZXJOdW1lcmljSW5jcmVtZW50JylcIlxuICAgICAgICAgICAgICAgICAgICBbZGVjcmVtZW50XT1cIm1lc3NhZ2VGb3IoJ2ZpbHRlck51bWVyaWNEZWNyZW1lbnQnKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tbnVtZXJpY3RleHRib3gtbWVzc2FnZXM+XG4gICAgICAgICAgICA8L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxuICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLXdyYXBwZXItY2VsbD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbk51bWVyaWNGaWx0ZXJDZWxsQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRmlsdGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuTnVtZXJpY0ZpbHRlckNlbGxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmlsdGVyRGVsYXk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNob3dPcGVyYXRvcnM6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRmlsdGVySW5wdXREaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlQWNjZXNzb3JzLCBuZ1pvbmUsIGVsZW1lbnQsIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlckRlbGF5ID0gNTAwO1xuICAgICAgICB0aGlzLmNoYW5nZVJlcXVlc3RzID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NvciA9IHZhbHVlQWNjZXNzb3JzWzBdO1xuICAgICAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmVTdGFydCA9IHJlbmRlcmVyLmxpc3RlbihlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjb21wb3NpdGlvbnN0YXJ0JywgKCkgPT4gdGhpcy5jb21wb3NpbmcgPSB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlRW5kID0gcmVuZGVyZXIubGlzdGVuKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbXBvc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5jb21wb3NpbmcgPSBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRXZlbnRzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZUVuZCgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFjY2Vzc29yLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5hY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKHZhbHVlKTtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UoeCA9PiB0aGlzLmZpbHRlckRlbGF5ID4gMCA/XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVJlcXVlc3RzLm5leHQoeCkgOlxuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh4KSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlQ2hhbmdlcygpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChpc0NoYW5nZWQoJ2ZpbHRlckRlbGF5JywgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmVDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUNoYW5nZXMoKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUV2ZW50cygpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNoYW5nZVJlcXVlc3RzU3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VSZXF1ZXN0c1xuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZmlsdGVyRGVsYXkpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuY29tcG9zaW5nKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB0aGlzLmNoYW5nZS5lbWl0KHgpKTtcbiAgICB9XG4gICAgdW5zdWJzY3JpYmVDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VSZXF1ZXN0c1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZXF1ZXN0c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuRmlsdGVySW5wdXREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0ZpbHRlcklucHV0XSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRmlsdGVySW5wdXREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTFVFX0FDQ0VTU09SLF0gfV0gfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH1cbl07XG5GaWx0ZXJJbnB1dERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBmaWx0ZXJEZWxheTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG5jb25zdCBFTVBUWV9WQUxVRV9PUEVSQVRPUlMgPSBuZXcgU2V0KFsnaXNudWxsJywgJ2lzbm90bnVsbCcsICdpc2VtcHR5JywgJ2lzbm90ZW1wdHknXSk7XG5jb25zdCBpc0VtcHR5VmFsdWVPcGVyYXRvciA9IChvcGVyYXRvcikgPT4gRU1QVFlfVkFMVUVfT1BFUkFUT1JTLmhhcyhvcGVyYXRvcik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRmlsdGVySW5wdXRXcmFwcGVyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZpbHRlckNlbGxDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGZpbHRlclNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZmlsdGVyU2VydmljZSk7XG4gICAgICAgIHRoaXMub3BlcmF0b3JzID0gW107XG4gICAgfVxuICAgIGdldCBjdXJyZW50RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUZpZWxkKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRPcGVyYXRvcigpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyJCQxID0gdGhpcy5jdXJyZW50RmlsdGVyO1xuICAgICAgICBpZiAoIXRoaXMuX29wZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYXRvciA9IGZpbHRlciQkMSA/IGZpbHRlciQkMS5vcGVyYXRvciA6IHRoaXMuZGVmYXVsdE9wZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVyYXRvcjtcbiAgICB9XG4gICAgc2V0IGN1cnJlbnRPcGVyYXRvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLl9vcGVyYXRvciA9IHZhbHVlO1xuICAgICAgICBjb25zdCBlbXB0eVZhbHVlT3BlcmF0b3IgPSBpc0VtcHR5VmFsdWVPcGVyYXRvcih2YWx1ZSk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXREaXNhYmxlZCA9IGVtcHR5VmFsdWVPcGVyYXRvcjtcbiAgICAgICAgaWYgKGVtcHR5VmFsdWVPcGVyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5hcHBseU5vVmFsdWVGaWx0ZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc0JsYW5rKHZhbHVlKSAmJiBpc1ByZXNlbnQodGhpcy5jdXJyZW50RmlsdGVyKSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkZWZhdWx0T3BlcmF0b3IoKSB7XG4gICAgICAgIGlmICghaXNOdWxsT3JFbXB0eVN0cmluZyh0aGlzLl9kZWZhdWx0T3BlcmF0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdE9wZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3BlcmF0b3JzICYmIHRoaXMub3BlcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzWzBdLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcImVxXCI7XG4gICAgfVxuICAgIHNldCBkZWZhdWx0T3BlcmF0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdE9wZXJhdG9yID0gdmFsdWU7XG4gICAgfVxuICAgIHNldCBmaWx0ZXJJbnB1dERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuaW5wdXQpKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuaW5wdXQuY2hhbmdlLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbnB1dERpc2FibGVkID0gaXNFbXB0eVZhbHVlT3BlcmF0b3IodGhpcy5jdXJyZW50T3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5U3RyaW5nKHZhbHVlKSB8fCB0aGlzLmZpbHRlckJ5RmllbGQodGhpcy5jb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZShpc051bGxPckVtcHR5U3RyaW5nKHZhbHVlKSA/XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIodGhpcy5jb2x1bW4uZmllbGQpIDpcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcih7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMuY3VycmVudE9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcigpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dERpc2FibGVkID0gaXNFbXB0eVZhbHVlT3BlcmF0b3IodGhpcy5kZWZhdWx0T3BlcmF0b3IpO1xuICAgIH1cbiAgICBhcHBseU5vVmFsdWVGaWx0ZXIob3BlcmF0b3IpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJDaGFuZ2UodGhpcy51cGRhdGVGaWx0ZXIoe1xuICAgICAgICAgICAgZmllbGQ6IHRoaXMuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChpc0NoYW5nZWQoXCJmaWx0ZXJcIiwgY2hhbmdlcywgZmFsc2UpKSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0RGlzYWJsZWQgPSBpc0VtcHR5VmFsdWVPcGVyYXRvcih0aGlzLmN1cnJlbnRPcGVyYXRvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5GaWx0ZXJJbnB1dFdyYXBwZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3BlcmF0b3JzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW5wdXQ6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0ZpbHRlcklucHV0RGlyZWN0aXZlLF0gfV0sXG4gICAgZGVmYXVsdE9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuY29uc3QgRU1QVFlfRklMVEVSX09QRVJBVE9SUyA9IFsnaXNudWxsJywgJ2lzbm90bnVsbCcsICdpc2VtcHR5JywgJ2lzbm90ZW1wdHknXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGaWx0ZXJDZWxsV3JhcHBlckNvbXBvbmVudCBleHRlbmRzIEZpbHRlcklucHV0V3JhcHBlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyU2VydmljZSkge1xuICAgICAgICBzdXBlcihmaWx0ZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zaG93T3BlcmF0b3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlQmFzZUNsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHNob3dCdXR0b24oKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciQkMSA9IHRoaXMuY3VycmVudEZpbHRlcjtcbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudChmaWx0ZXIkJDEpICYmICghaXNOdWxsT3JFbXB0eVN0cmluZyhmaWx0ZXIkJDEudmFsdWUpIHx8XG4gICAgICAgICAgICBFTVBUWV9GSUxURVJfT1BFUkFUT1JTLmluZGV4T2YoU3RyaW5nKGZpbHRlciQkMS5vcGVyYXRvcikpID49IDApO1xuICAgIH1cbiAgICBmaWx0ZXJDaGFuZ2UoZmlsdGVyJCQxKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyJCQxKTtcbiAgICB9XG59XG5GaWx0ZXJDZWxsV3JhcHBlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1maWx0ZXItd3JhcHBlci1jZWxsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxrZW5kby1ncmlkLWZpbHRlci1jZWxsLW9wZXJhdG9yc1xuICAgICAgICAgICAgW3Nob3dPcGVyYXRvcnNdPVwic2hvd09wZXJhdG9yc1wiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICAoY2xlYXIpPVwib25DbGVhcigpXCJcbiAgICAgICAgICAgIFtzaG93QnV0dG9uXT1cInNob3dCdXR0b25cIlxuICAgICAgICAgICAgWyh2YWx1ZSldPVwiY3VycmVudE9wZXJhdG9yXCI+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1maWx0ZXItY2VsbC1vcGVyYXRvcnM+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5GaWx0ZXJDZWxsV3JhcHBlckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEZpbHRlclNlcnZpY2UgfVxuXTtcbkZpbHRlckNlbGxXcmFwcGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwtd3JhcHBlcicsXSB9XSxcbiAgICBvdmVycmlkZUJhc2VDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwnLF0gfV0sXG4gICAgc2hvd09wZXJhdG9yczogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlclxuY29uc3Qgc3RyaW5nT3BlcmF0b3JzID0gbG9jYWxpemVPcGVyYXRvcnMkMSh7XG4gICAgXCJmaWx0ZXJFcU9wZXJhdG9yXCI6IFwiZXFcIixcbiAgICBcImZpbHRlck5vdEVxT3BlcmF0b3JcIjogXCJuZXFcIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4gICAgXCJmaWx0ZXJDb250YWluc09wZXJhdG9yXCI6IFwiY29udGFpbnNcIixcbiAgICBcImZpbHRlck5vdENvbnRhaW5zT3BlcmF0b3JcIjogXCJkb2Vzbm90Y29udGFpblwiLFxuICAgIFwiZmlsdGVyU3RhcnRzV2l0aE9wZXJhdG9yXCI6IFwic3RhcnRzd2l0aFwiLFxuICAgIFwiZmlsdGVyRW5kc1dpdGhPcGVyYXRvclwiOiBcImVuZHN3aXRoXCIsXG4gICAgXCJmaWx0ZXJJc051bGxPcGVyYXRvclwiOiBcImlzbnVsbFwiLFxuICAgIFwiZmlsdGVySXNOb3ROdWxsT3BlcmF0b3JcIjogXCJpc25vdG51bGxcIixcbiAgICBcImZpbHRlcklzRW1wdHlPcGVyYXRvclwiOiBcImlzZW1wdHlcIixcbiAgICBcImZpbHRlcklzTm90RW1wdHlPcGVyYXRvclwiOiBcImlzbm90ZW1wdHlcIlxufSk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYXNlIHN0cmluZyBmaWx0ZXIgY29tcG9uZW50LlxuICovXG5jbGFzcyBTdHJpbmdGaWx0ZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlRmlsdGVyQ2VsbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyU2VydmljZSwgbG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGZpbHRlclNlcnZpY2UpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGZpbHRlciBvcGVyYXRvci4gRGVmYXVsdHMgdG8gYGNvbnRhaW5zYC5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBcImNvbnRhaW5zXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGZpbHRlciBmb3IgdGhlIGFzc29jaWF0ZWQgY29sdW1uIGZpZWxkLlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUZpZWxkKCh0aGlzLmNvbHVtbiB8fCB7fSkuZmllbGQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgb3BlcmF0b3IgZm9yIHRoZSBhc3NvY2lhdGVkIGNvbHVtbiBmaWVsZC5cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50T3BlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIgPyB0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IgOiB0aGlzLm9wZXJhdG9yO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBsb2NhbGl6YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IHN0cmluZ09wZXJhdG9ycyh0aGlzLmxvY2FsaXphdGlvbik7XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JzID0gdG9KU09OKHRoaXMub3BlcmF0b3JMaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5TdHJpbmdGaWx0ZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3RyaW5nLWZpbHRlciBjZWxsIGNvbXBvbmVudFxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2MtY29uZmlndXJhdGlvbi1jb21wb25lbnRzLWZvci1maWx0ZXItdGVtcGxhdGVzKSkuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgYGBgaHRtbC1uby1ydW5cbiAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdE5hbWVcIiB0aXRsZT1cIlByb2R1Y3QgTmFtZVwiPlxuICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbFxuICogICAgICAgICAgICAgIFtzaG93T3BlcmF0b3JzXT1cImZhbHNlXCJcbiAqICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gKiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1zdHJpbmctZmlsdGVyLWNlbGw+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICBgYGBcbiAqL1xuY2xhc3MgU3RyaW5nRmlsdGVyQ2VsbENvbXBvbmVudCBleHRlbmRzIFN0cmluZ0ZpbHRlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyU2VydmljZSwgbG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGZpbHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBkZWxheSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSB0aGUgZmlsdGVyIHZhbHVlIGlzIHN1Ym1pdHRlZC5cbiAgICAgICAgICogQSB2YWx1ZSBvZiBgMGAgaW5kaWNhdGVzIG5vIGRlbGF5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgNTAwYC5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlckRlbGF5ID0gNTAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZHJvcC1kb3duIGZpbHRlciBvcGVyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNob3dPcGVyYXRvcnMgPSB0cnVlO1xuICAgIH1cbn1cblN0cmluZ0ZpbHRlckNlbGxDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItd3JhcHBlci1jZWxsXG4gICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBbZGVmYXVsdE9wZXJhdG9yXT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtzaG93T3BlcmF0b3JzXT1cInNob3dPcGVyYXRvcnNcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay10ZXh0Ym94XCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgICAgICBrZW5kb0ZpbHRlcklucHV0XG4gICAgICAgICAgICAgICAgW2ZpbHRlckRlbGF5XT1cImZpbHRlckRlbGF5XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50RmlsdGVyPy52YWx1ZVwiIC8+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1maWx0ZXItd3JhcHBlci1jZWxsPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU3RyaW5nRmlsdGVyQ2VsbENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEZpbHRlclNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblN0cmluZ0ZpbHRlckNlbGxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmlsdGVyRGVsYXk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNob3dPcGVyYXRvcnM6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgd2hpY2ggYWNjb21tb2RhdGVzIHRoZSBmaWx0ZXIgb3BlcmF0b3JzLlxuICovXG5jbGFzcyBGaWx0ZXJDZWxsT3BlcmF0b3JzQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuY2xlYXJUZXh0ID0gJ0NsZWFyJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmaWx0ZXIgb3BlcmF0b3JzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZXJhdG9ycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbGlzdCBvZiBvcGVyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaG93T3BlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPHN0cmluZz59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgKipDbGVhcioqIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPHt9Pn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DaGFuZ2UoZGF0YUl0ZW0pIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGFJdGVtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNsZWFyQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuY2xlYXIuZW1pdCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjbGVhcktleWRvd24oYXJncykge1xuICAgICAgICBpZiAoYXJncy5rZXlDb2RlID09PSBLZXlzLkVudGVyIHx8IGFyZ3Mua2V5Q29kZSA9PT0gS2V5cy5TcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhci5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGRyb3Bkb3duS2V5ZG93bihhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5rZXlDb2RlID09PSBLZXlzLkVudGVyICYmICF0aGlzLmRyb3Bkb3duLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi50b2dnbGUodHJ1ZSk7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xlYXJUZXh0ID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KFwiZmlsdGVyQ2xlYXJCdXR0b25cIikpO1xuICAgIH1cbn1cbkZpbHRlckNlbGxPcGVyYXRvcnNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtZmlsdGVyLWNlbGwtb3BlcmF0b3JzJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0XG4gICAgICAgICAgICAjZHJvcGRvd25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd09wZXJhdG9yc1wiXG4gICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgIFtkYXRhXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBjbGFzcz1cImstZHJvcGRvd24tb3BlcmF0b3JcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImstaS1maWx0ZXJcIlxuICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxuICAgICAgICAgICAgdGV4dEZpZWxkPVwidGV4dFwiXG4gICAgICAgICAgICBbcG9wdXBTZXR0aW5nc109XCJ7IHdpZHRoOiAnYXV0bycgfVwiXG4gICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiZHJvcGRvd25LZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgPC9rZW5kby1kcm9wZG93bmxpc3Q+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnay1jbGVhci1idXR0b24tdmlzaWJsZSc6IHNob3dCdXR0b259XCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1idXR0b24gay1idXR0b24taWNvblwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiY2xlYXJUZXh0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhckNsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiY2xlYXJLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktZmlsdGVyLWNsZWFyXCI+PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZpbHRlckNlbGxPcGVyYXRvcnNDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5GaWx0ZXJDZWxsT3BlcmF0b3JzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwtb3BlcmF0b3InLF0gfV0sXG4gICAgZHJvcGRvd246IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydkcm9wZG93bicsXSB9XSxcbiAgICBvcGVyYXRvcnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNob3dCdXR0b246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNob3dPcGVyYXRvcnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNsZWFyOiBbeyB0eXBlOiBPdXRwdXQgfV1cbn07XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlclxuY29uc3Qgc3RyaW5nT3BlcmF0b3JzJDEgPSBsb2NhbGl6ZU9wZXJhdG9ycyQxKHtcbiAgICBcImZpbHRlckNvbnRhaW5zT3BlcmF0b3JcIjogXCJjb250YWluc1wiLFxuICAgIFwiZmlsdGVyTm90Q29udGFpbnNPcGVyYXRvclwiOiBcImRvZXNub3Rjb250YWluXCIsXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9iamVjdC1saXRlcmFsLXNvcnQta2V5c1xuICAgIFwiZmlsdGVyRXFPcGVyYXRvclwiOiBcImVxXCIsXG4gICAgXCJmaWx0ZXJOb3RFcU9wZXJhdG9yXCI6IFwibmVxXCIsXG4gICAgXCJmaWx0ZXJTdGFydHNXaXRoT3BlcmF0b3JcIjogXCJzdGFydHN3aXRoXCIsXG4gICAgXCJmaWx0ZXJFbmRzV2l0aE9wZXJhdG9yXCI6IFwiZW5kc3dpdGhcIixcbiAgICBcImZpbHRlcklzTnVsbE9wZXJhdG9yXCI6IFwiaXNudWxsXCIsXG4gICAgXCJmaWx0ZXJJc05vdE51bGxPcGVyYXRvclwiOiBcImlzbm90bnVsbFwiLFxuICAgIFwiZmlsdGVySXNFbXB0eU9wZXJhdG9yXCI6IFwiaXNlbXB0eVwiLFxuICAgIFwiZmlsdGVySXNOb3RFbXB0eU9wZXJhdG9yXCI6IFwiaXNub3RlbXB0eVwiXG59KTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBBdXRvQ29tcGxldGVGaWx0ZXJDZWxsQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZpbHRlckNlbGxDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGZpbHRlclNlcnZpY2UsIGNvbHVtbiwgbG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGZpbHRlclNlcnZpY2UpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5zaG93T3BlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0T3BlcmF0b3JzID0gc3RyaW5nT3BlcmF0b3JzJDEodGhpcy5sb2NhbGl6YXRpb24pO1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICB9XG4gICAgc2V0IHZhbHVlRmllbGQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVGaWVsZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQgPyB0aGlzLl92YWx1ZUZpZWxkIDogdGhpcy5jb2x1bW4uZmllbGQ7XG4gICAgfVxuICAgIGdldCBjdXJyZW50RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUZpZWxkKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRPcGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlciA/IHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciA6IFwiY29udGFpbnNcIjtcbiAgICB9XG59XG5BdXRvQ29tcGxldGVGaWx0ZXJDZWxsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWF1dG9jb21wbGV0ZS1maWx0ZXItY2VsbCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGtlbmRvLWdyaWQtZmlsdGVyLXdyYXBwZXItY2VsbFxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxuICAgICAgICAgICAgW29wZXJhdG9yc109XCJvcGVyYXRvcnNcIlxuICAgICAgICAgICAgW3Nob3dPcGVyYXRvcnNdPVwic2hvd09wZXJhdG9yc1wiPlxuICAgICAgICAgICAgPGtlbmRvLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgIGtlbmRvRmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJ2YWx1ZUZpZWxkXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudEZpbHRlcj8udmFsdWVcIj5cbiAgICAgICAgICAgIDwva2VuZG8tYXV0b2NvbXBsZXRlPlxuICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLXdyYXBwZXItY2VsbD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkF1dG9Db21wbGV0ZUZpbHRlckNlbGxDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBGaWx0ZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5Db21wb25lbnQgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkF1dG9Db21wbGV0ZUZpbHRlckNlbGxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgc2hvd09wZXJhdG9yczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRhdGE6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZhbHVlRmllbGQ6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hY2Nlc3MtbWlzc2luZy1tZW1iZXJcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBCb29sZWFuRmlsdGVyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZpbHRlckNlbGxDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGZpbHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbikge1xuICAgICAgICBzdXBlcihmaWx0ZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gXCJlcVwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pdGVtcyA9IFtcbiAgICAgICAgICAgIHsgdGV4dDogdGhpcy5sb2NhbGl6YXRpb24uZ2V0KFwiZmlsdGVySXNUcnVlXCIpLCB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyB0ZXh0OiB0aGlzLmxvY2FsaXphdGlvbi5nZXQoXCJmaWx0ZXJJc0ZhbHNlXCIpLCB2YWx1ZTogZmFsc2UgfVxuICAgICAgICBdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0SXRlbSA9IHsgdGV4dDogdGhpcy5sb2NhbGl6YXRpb24uZ2V0KFwiZmlsdGVyQm9vbGVhbkFsbFwiKSwgdmFsdWU6IG51bGwgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGZpbHRlciBmb3IgdGhlIGFzc29jaWF0ZWQgY29sdW1uIGZpZWxkLlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUZpZWxkKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZmlsdGVyIG9wZXJhdG9yIGZvciB0aGUgYXNzb2NpYXRlZCBjb2x1bW4gZmllbGQuXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudE9wZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyID8gdGhpcy5jdXJyZW50RmlsdGVyLm9wZXJhdG9yIDogdGhpcy5vcGVyYXRvcjtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhbGl6YXRpb24uY2hhbmdlcy5zdWJzY3JpYmUodGhpcy5sb2NhbGl6YXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgbG9jYWxpemF0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gW1xuICAgICAgICAgICAgeyB0ZXh0OiB0aGlzLmxvY2FsaXphdGlvbi5nZXQoXCJmaWx0ZXJJc1RydWVcIiksIHZhbHVlOiB0cnVlIH0sXG4gICAgICAgICAgICB7IHRleHQ6IHRoaXMubG9jYWxpemF0aW9uLmdldChcImZpbHRlcklzRmFsc2VcIiksIHZhbHVlOiBmYWxzZSB9XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZGVmYXVsdEl0ZW0gPSB7IHRleHQ6IHRoaXMubG9jYWxpemF0aW9uLmdldChcImZpbHRlckJvb2xlYW5BbGxcIiksIHZhbHVlOiBudWxsIH07XG4gICAgfVxufVxuQm9vbGVhbkZpbHRlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1maWx0ZXJjZWxsLWJvb2xlYW4nLF0gfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBCb29sZWFuIGZpbHRlci1jZWxsIGNvbXBvbmVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICBgYGBodG1sLW5vLXJ1blxuICogICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiIHRpdGxlPVwiUHJvZHVjdCBOYW1lXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtYm9vbGVhbi1maWx0ZXItY2VsbFxuICogICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAqICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWJvb2xlYW4tZmlsdGVyLWNlbGw+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICBgYGBcbiAqL1xuY2xhc3MgQm9vbGVhbkZpbHRlckNlbGxDb21wb25lbnQgZXh0ZW5kcyBCb29sZWFuRmlsdGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJTZXJ2aWNlLCBsb2NhbGl6YXRpb24sIGNkKSB7XG4gICAgICAgIHN1cGVyKGZpbHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbik7XG4gICAgICAgIHRoaXMuY2QgPSBjZDtcbiAgICB9XG4gICAgbG9jYWxpemF0aW9uQ2hhbmdlKCkge1xuICAgICAgICBzdXBlci5sb2NhbGl6YXRpb25DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG59XG5Cb29sZWFuRmlsdGVyQ2VsbENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1ib29sZWFuLWZpbHRlci1jZWxsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItd3JhcHBlci1jZWxsXG4gICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICBbc2hvd09wZXJhdG9yc109XCJmYWxzZVwiXG4gICAgICAgICAgICBbZGVmYXVsdE9wZXJhdG9yXT1cIm9wZXJhdG9yXCI+XG4gICAgICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0XG4gICAgICAgICAgICAgICAga2VuZG9GaWx0ZXJJbnB1dFxuICAgICAgICAgICAgICAgIFtkZWZhdWx0SXRlbV09XCJkZWZhdWx0SXRlbVwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbXNcIlxuICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW3BvcHVwU2V0dGluZ3NdPVwieyB3aWR0aDogJ2F1dG8nIH1cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudEZpbHRlcj8udmFsdWVcIj5cbiAgICAgICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLXdyYXBwZXItY2VsbD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJvb2xlYW5GaWx0ZXJDZWxsQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRmlsdGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYWNjZXNzLW1pc3NpbmctbWVtYmVyXG5jb25zdCBkYXRlT3BlcmF0b3JzID0gbG9jYWxpemVPcGVyYXRvcnMkMSh7XG4gICAgXCJmaWx0ZXJFcU9wZXJhdG9yXCI6IFwiZXFcIixcbiAgICBcImZpbHRlck5vdEVxT3BlcmF0b3JcIjogXCJuZXFcIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4gICAgXCJmaWx0ZXJBZnRlck9yRXF1YWxPcGVyYXRvclwiOiBcImd0ZVwiLFxuICAgIFwiZmlsdGVyQWZ0ZXJPcGVyYXRvclwiOiBcImd0XCIsXG4gICAgXCJmaWx0ZXJCZWZvcmVPckVxdWFsT3BlcmF0b3JcIjogXCJsdGVcIixcbiAgICBcImZpbHRlckJlZm9yZU9wZXJhdG9yXCI6IFwibHRcIixcbiAgICBcImZpbHRlcklzTnVsbE9wZXJhdG9yXCI6IFwiaXNudWxsXCIsXG4gICAgXCJmaWx0ZXJJc05vdE51bGxPcGVyYXRvclwiOiBcImlzbm90bnVsbFwiXG59KTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEYXRlRmlsdGVyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZpbHRlckNlbGxDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGZpbHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbikge1xuICAgICAgICBzdXBlcihmaWx0ZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3IuIERlZmF1bHRzIHRvIGBjb250YWluc2AuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gXCJndGVcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGFjdGl2ZSB2aWV3IHRoYXQgdGhlIGNhbGVuZGFyIGluaXRpYWxseSByZW5kZXJzLlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYWN0aXZlIHZpZXcgaXMgYG1vbnRoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBZb3UgaGF2ZSB0byBzZXQgYGFjdGl2ZVZpZXdgIHdpdGhpbiB0aGUgYHRvcFZpZXdgLWBib3R0b21WaWV3YCByYW5nZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlVmlldyA9IFwibW9udGhcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIGJvdHRvbW1vc3QgY2FsZW5kYXIgdmlldywgdG8gd2hpY2ggdGhlIHVzZXIgY2FuIG5hdmlnYXRlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ib3R0b21WaWV3ID0gXCJtb250aFwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgdG9wbW9zdCBjYWxlbmRhciB2aWV3LCB0byB3aGljaCB0aGUgdXNlciBjYW4gbmF2aWdhdGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRvcFZpZXcgPSBcImNlbnR1cnlcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IGEgd2VlayBudW1iZXIgY29sdW1uIGluIHRoZSBgbW9udGhgIHZpZXcgb2YgdGhlIENhbGVuZGFyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53ZWVrTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IGRhdGVPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgZm9yIHRoZSBhc3NvY2lhdGVkIGNvbHVtbiBmaWVsZC5cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7RmlsdGVyRGVzY3JpcHRvcn1cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlGaWVsZCh0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZGF0ZSBmb3JtYXQgdGhhdCBpcyB1c2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBub3QgZm9jdXNlZC5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGNvbHVtbi5mb3JtYXRgIHZhbHVlIGlzIHVzZWQgKGlmIHNldCkuXG4gICAgICovXG4gICAgc2V0IGZvcm1hdCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBkYXRlIGZvcm1hdCB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCBmb2N1c2VkLlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgY29sdW1uLmZvcm1hdGAgdmFsdWUgaXMgdXNlZCAoaWYgc2V0KS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuICFpc051bGxPckVtcHR5U3RyaW5nKHRoaXMuX2Zvcm1hdCkgPyB0aGlzLl9mb3JtYXQgOiB0aGlzLmNvbHVtbkZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uICYmICFpc051bGxPckVtcHR5U3RyaW5nKHRoaXMuY29sdW1uLmZvcm1hdCkgP1xuICAgICAgICAgICAgZXh0cmFjdEZvcm1hdCh0aGlzLmNvbHVtbi5mb3JtYXQpIDogXCJkXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGZpbHRlciBvcGVyYXRvciBmb3IgdGhlIGFzc29jaWF0ZWQgY29sdW1uIGZpZWxkLlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRPcGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlciA/IHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciA6IHRoaXMub3BlcmF0b3I7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMubG9jYWxpemF0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGxvY2FsaXphdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0T3BlcmF0b3JzID0gZGF0ZU9wZXJhdG9ycyh0aGlzLmxvY2FsaXphdGlvbik7XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JzID0gdG9KU09OKHRoaXMub3BlcmF0b3JMaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5EYXRlRmlsdGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNvbHVtbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvcGVyYXRvcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9ybWF0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1heDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9ybWF0UGxhY2Vob2xkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhY3RpdmVWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBib3R0b21WaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3BWaWV3OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3ZWVrTnVtYmVyOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZGF0ZS1maWx0ZXIgY2VsbCBjb21wb25lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgYGBgaHRtbC1uby1ydW5cbiAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiT3JkZXJEYXRlXCIgdGl0bGU9XCJPcmRlciBEYXRlXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtZGF0ZS1maWx0ZXItY2VsbFxuICogICAgICAgICAgICAgIFtzaG93T3BlcmF0b3JzXT1cImZhbHNlXCJcbiAqICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gKiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsPlxuICogICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgYGBgXG4gKi9cbmNsYXNzIERhdGVGaWx0ZXJDZWxsQ29tcG9uZW50IGV4dGVuZHMgRGF0ZUZpbHRlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyU2VydmljZSwgbG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGZpbHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbik7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZHJvcC1kb3duIGZpbHRlciBvcGVyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNob3dPcGVyYXRvcnMgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbWVzc2FnZUZvcihrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmdldChrZXkpO1xuICAgIH1cbn1cbkRhdGVGaWx0ZXJDZWxsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWRhdGUtZmlsdGVyLWNlbGwnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1ncmlkLWZpbHRlci13cmFwcGVyLWNlbGxcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgIFtvcGVyYXRvcnNdPVwib3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFtkZWZhdWx0T3BlcmF0b3JdPVwib3BlcmF0b3JcIlxuICAgICAgICAgICAgW3Nob3dPcGVyYXRvcnNdPVwic2hvd09wZXJhdG9yc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxrZW5kby1kYXRlcGlja2VyXG4gICAgICAgICAgICAgICAga2VuZG9GaWx0ZXJJbnB1dFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50RmlsdGVyPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgICAgIFtmb3JtYXRQbGFjZWhvbGRlcl09XCJmb3JtYXRQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgICAgICAgICBbYm90dG9tVmlld109XCJib3R0b21WaWV3XCJcbiAgICAgICAgICAgICAgICBbdG9wVmlld109XCJ0b3BWaWV3XCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgICAgICAgIFt3ZWVrTnVtYmVyXT1cIndlZWtOdW1iZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxrZW5kby1kYXRlcGlja2VyLW1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgICAgIFt0b2dnbGVdPVwibWVzc2FnZUZvcignZmlsdGVyRGF0ZVRvZ2dsZScpXCJcbiAgICAgICAgICAgICAgICAgICAgW3RvZGF5XT1cIm1lc3NhZ2VGb3IoJ2ZpbHRlckRhdGVUb2RheScpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9rZW5kby1kYXRlcGlja2VyLW1lc3NhZ2VzPlxuICAgICAgICAgICAgPC9rZW5kby1kYXRlcGlja2VyPlxuICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLXdyYXBwZXItY2VsbD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRhdGVGaWx0ZXJDZWxsQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRmlsdGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuRGF0ZUZpbHRlckNlbGxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgc2hvd09wZXJhdG9yczogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDb2xHcm91cENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xuICAgIH1cbiAgICBnZXQgY29sdW1uc1RvUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gY29sdW1uc1RvUmVuZGVyKHRoaXMuY29sdW1ucyk7XG4gICAgfVxuICAgIHRyYWNrQnkoaW5kZXgsIF9pdGVtKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5Db2xHcm91cENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZENvbEdyb3VwXScsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidHJ1ZVwiPlxuICAgICAgICA8Y29sIFtjbGFzcy5rLWdyb3VwLWNvbF09XCJ0cnVlXCIgKm5nRm9yPVwibGV0IGcgb2YgZ3JvdXBzXCIgLz5cbiAgICAgICAgPGNvbCBbY2xhc3Muay1oaWVyYXJjaHktY29sXT1cInRydWVcIiAqbmdJZj1cImRldGFpbFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiLz5cbiAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNUb1JlbmRlcjsgdHJhY2tCeTogdHJhY2tCeTtcIiBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCIvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuQ29sR3JvdXBDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkZXRhaWxUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBMb2FkaW5nQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuaG9zdENsYXNzID0gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGxvYWRpbmdUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdsb2FkaW5nJyk7XG4gICAgfVxufVxuTG9hZGluZ0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZExvYWRpbmddJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8c3BhbiBjbGFzcz1cImstbG9hZGluZy10ZXh0XCI+e3sgbG9hZGluZ1RleHQgfX08L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLWxvYWRpbmctaW1hZ2VcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImstbG9hZGluZy1jb2xvclwiPjwvZGl2PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTG9hZGluZ0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkxvYWRpbmdDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWxvYWRpbmctbWFzaycsXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFJlc2l6YWJsZUNvbnRhaW5lckRpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZWwsIHJlbmRlcmVyLCByZXNpemVTZXJ2aWNlLCBncmlkKSB7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnJlc2l6ZVNlcnZpY2UgPSByZXNpemVTZXJ2aWNlO1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgc2V0IGxvY2tlZFdpZHRoKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2xvY2tlZFdpZHRoID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoUmVzaXplKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCBrZW5kb0dyaWRSZXNpemFibGVDb250YWluZXIoZW5hYmxlZCkge1xuICAgICAgICBjb25zdCByZWZyZXNoID0gZW5hYmxlZCAhPT0gdGhpcy5lbmFibGVkO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICBpZiAocmVmcmVzaCkge1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hSZXNpemUoKTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdHRhY2hSZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbiAmJiAhdGhpcy5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZXNpemVTdWJzY3JpcHRpb24gJiYgdGhpcy5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzaXplU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy5ncmlkLndyYXBwZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyaWQud3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoIC0gdGhpcy5fbG9ja2VkV2lkdGgsIDApO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5hYmxlZCAmJiB3aWR0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblJlc2l6YWJsZUNvbnRhaW5lckRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZFJlc2l6YWJsZUNvbnRhaW5lcl0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblJlc2l6YWJsZUNvbnRhaW5lckRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogUmVzaXplU2VydmljZSB9LFxuICAgIHsgdHlwZTogR3JpZENvbXBvbmVudCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblJlc2l6YWJsZUNvbnRhaW5lckRpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBsb2NrZWRXaWR0aDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbG9ja2VkV2lkdGgnLF0gfV0sXG4gICAga2VuZG9HcmlkUmVzaXphYmxlQ29udGFpbmVyOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFRlbXBsYXRlQ29udGV4dERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lclJlZikge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmO1xuICAgIH1cbiAgICBzZXQgdGVtcGxhdGVDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVWaWV3KCk7XG4gICAgICAgIGlmIChjb250ZXh0LnRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydGVkVmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dC50ZW1wbGF0ZVJlZiwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmlldygpO1xuICAgIH1cbiAgICByZW1vdmVWaWV3KCkge1xuICAgICAgICBpZiAodGhpcy5pbnNlcnRlZFZpZXdSZWYpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5yZW1vdmUodGhpcy52aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5pbnNlcnRlZFZpZXdSZWYpKTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0ZWRWaWV3UmVmID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdbdGVtcGxhdGVDb250ZXh0XScgLy8gdHNsaW50OmRpc2FibGUtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9XG5dO1xuVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRlbXBsYXRlQ29udGV4dDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGb2N1c0dyb3VwIHtcbiAgICBjb25zdHJ1Y3Rvcihyb290KSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLnJvb3QucmVnaXN0ZXJHcm91cCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IGZvY3VzYWJsZUNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maWx0ZXIoZWwgPT4gZWwuY2FuRm9jdXMoKSk7XG4gICAgfVxuICAgIGdldCBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5yb290LnVucmVnaXN0ZXJHcm91cCh0aGlzKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmZpbHRlcihmID0+IGYgIT09IGVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIGdyb3VwIHdpbGwgcmVjZWl2ZSBmb2N1cyB3aGVuIHRoZSBjZWxsIGlzIGZvY3VzZWQuXG4gICAgICogUmVxdWlyZXMgYSBzaW5nbGUgXCJzaW1wbGVcIiBmb2N1c2FibGUgZWxlbWVudCBzdWNoIGFzIGEgYnV0dG9uIG9yIGEgY2hlY2tib3guXG4gICAgICovXG4gICAgaXNOYXZpZ2FibGUoKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZm9jdXNhYmxlQ2hpbGRyZW47XG4gICAgICAgIHJldHVybiBmb2N1c2FibGUubGVuZ3RoID09PSAxICYmIGZvY3VzYWJsZVswXS5pc05hdmlnYWJsZSgpO1xuICAgIH1cbiAgICBjYW5Gb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlQ2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkZvY3VzKCkgJiYgIXRoaXMuaGFzRm9jdXMoKSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVDaGlsZHJlblswXS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZVN0YXRlKHRydWUpO1xuICAgIH1cbiAgICBkZWFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZVN0YXRlKGZhbHNlKTtcbiAgICB9XG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgoZm9jdXNlZCwgZWxlbWVudCkgPT4gZm9jdXNlZCB8fCBlbGVtZW50Lmhhc0ZvY3VzKCksIGZhbHNlKTtcbiAgICB9XG4gICAgdG9nZ2xlU3RhdGUoYWN0aXZlKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSAhPT0gYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmID0+IGYudG9nZ2xlKGFjdGl2ZSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuRm9jdXNHcm91cC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRm9jdXNHcm91cC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEZvY3VzUm9vdCB9XG5dO1xuXG5sZXQgaWQgPSAwO1xuZnVuY3Rpb24gbmV4dElkKCkge1xuICAgIHJldHVybiBpZCsrO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExvZ2ljYWxDZWxsRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcihmb2N1c0dyb3VwLCBlbGVtZW50LCBjb2x1bW5JbmZvU2VydmljZSwgaWRTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgcmVuZGVyZXIsIHpvbmUsIGNlbGxDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZm9jdXNHcm91cCA9IGZvY3VzR3JvdXA7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UgPSBjb2x1bW5JbmZvU2VydmljZTtcbiAgICAgICAgdGhpcy5pZFNlcnZpY2UgPSBpZFNlcnZpY2U7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBuYXZpZ2F0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLmNlbGxDb250ZXh0ID0gY2VsbENvbnRleHQ7XG4gICAgICAgIHRoaXMubG9naWNhbFNsYXZlQ2VsbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbFNwYW4gPSAxO1xuICAgICAgICB0aGlzLnJvd1NwYW4gPSAxO1xuICAgICAgICB0aGlzLmRhdGFSb3dJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLmRldGFpbEV4cGFuZENlbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51aWQgPSBuZXh0SWQoKTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICBpZiAoIXRoaXMubG9naWNhbFNsYXZlQ2VsbCAmJiB0aGlzLmNvbHVtbkluZm9TZXJ2aWNlLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pZFNlcnZpY2UuY2VsbElkKHRoaXMubG9naWNhbFJvd0luZGV4LCB0aGlzLmxvZ2ljYWxDb2xJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFyaWFDb2xJbmRleCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9naWNhbFNsYXZlQ2VsbCB8fCB0aGlzLmxvZ2ljYWxDb2xJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9naWNhbENvbEluZGV4ICsgMTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQ2hhbmdlID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5vbk5hdmlnYXRpb25DaGFuZ2UoZSkpO1xuICAgIH1cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5lbmFibGVkIHx8IHRoaXMubG9naWNhbENvbEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNlbGxDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxDb250ZXh0LmZvY3VzR3JvdXAgPSB0aGlzLmZvY3VzR3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3Rlck5vQ2hhbmdlcygpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZXMpO1xuICAgICAgICBpZiAoKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdncm91cEl0ZW0nKSB8fCB0aGlzLmxvZ2ljYWxDb2xJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBncm91cEl0ZW0gY2hhbmdlcyBhcyB0aGUgcmVmZXJlbmNlIGlzIG5vdCBzdGFibGVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleENoYW5nZSA9IGNoYW5nZXMubG9naWNhbENvbEluZGV4O1xuICAgICAgICBjb25zdCByb3dJbmRleENoYW5nZSA9IGNoYW5nZXMubG9naWNhbFJvd0luZGV4O1xuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4Q2hhbmdlICYmICFpbmRleENoYW5nZS5pc0ZpcnN0Q2hhbmdlKCkgPyBpbmRleENoYW5nZS5wcmV2aW91c1ZhbHVlIDogdGhpcy5sb2dpY2FsQ29sSW5kZXg7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gcm93SW5kZXhDaGFuZ2UgJiYgIXJvd0luZGV4Q2hhbmdlLmlzRmlyc3RDaGFuZ2UoKSA/IHJvd0luZGV4Q2hhbmdlLnByZXZpb3VzVmFsdWUgOiB0aGlzLmxvZ2ljYWxSb3dJbmRleDtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS51bnJlZ2lzdGVyQ2VsbChpbmRleCwgcm93SW5kZXgsIHRoaXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyQ2hhbmdlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkNoYW5nZS51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UudW5yZWdpc3RlckNlbGwodGhpcy5sb2dpY2FsQ29sSW5kZXgsIHRoaXMubG9naWNhbFJvd0luZGV4LCB0aGlzKTtcbiAgICB9XG4gICAgb25OYXZpZ2F0aW9uQ2hhbmdlKGUpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5sb2dpY2FsQ29sSW5kZXggPT09IGUuY29sSW5kZXggJiYgdGhpcy5sb2dpY2FsUm93SW5kZXggPT09IGUucm93SW5kZXg7XG4gICAgICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMubG9naWNhbENvbEluZGV4ID09PSBlLnByZXZDb2xJbmRleCAmJiB0aGlzLmxvZ2ljYWxSb3dJbmRleCA9PT0gZS5wcmV2Um93SW5kZXg7XG4gICAgICAgIGlmIChhY3RpdmUgfHwgd2FzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbCwgJ3RhYkluZGV4JywgdGhpcy5pc0ZvY3VzYWJsZSgpICYmICF0aGlzLmxvZ2ljYWxTbGF2ZUNlbGwgPyAnMCcgOiAnLTEnKTtcbiAgICAgICAgaWYgKHRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzR3JvdXAuaXNOYXZpZ2FibGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNHcm91cC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ2ljYWxTbGF2ZUNlbGwgJiYgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hdXRvRm9jdXNDZWxsKHRoaXMubG9naWNhbENvbEluZGV4LCB0aGlzLmxvZ2ljYWxDb2xJbmRleCArIHRoaXMuY29sU3BhbiAtIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWljcm90YXNrKCgpID0+IHRoaXMuaXNGb2N1c2VkKCkgJiYgZWwuZm9jdXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICdrLXN0YXRlLWZvY3VzZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtaWNyb3Rhc2soY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNhbGxiYWNrKSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2ljYWxTbGF2ZUNlbGwpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVnaXN0ZXJDZWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlZ2lzdGVyTm9DaGFuZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMubG9naWNhbFNsYXZlQ2VsbCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZWdpc3RlckNlbGxPbkN1cnJlbnRSb3codGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNGb2N1c2FibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzQ2VsbEZvY3VzYWJsZSh0aGlzKTtcbiAgICB9XG4gICAgaXNGb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc0NlbGxGb2N1c2VkKHRoaXMpO1xuICAgIH1cbn1cbkxvZ2ljYWxDZWxsRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRm9jdXNHcm91cCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtGb2N1c1Jvb3RdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ2xhc3M6IEZvY3VzR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkTG9naWNhbENlbGxdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Mb2dpY2FsQ2VsbERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEZvY3VzR3JvdXAgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IENvbHVtbkluZm9TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBJZFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0NFTExfQ09OVEVYVCxdIH1dIH1cbl07XG5Mb2dpY2FsQ2VsbERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBsb2dpY2FsQ29sSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvZ2ljYWxSb3dJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9naWNhbFNsYXZlQ2VsbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbFNwYW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJvd1NwYW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGdyb3VwSXRlbTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGF0YVJvd0luZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRhSXRlbTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGV0YWlsRXhwYW5kQ2VsbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuaWQnLF0gfV0sXG4gICAgYXJpYUNvbEluZGV4OiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmFyaWEtY29saW5kZXgnLF0gfV1cbn07XG5cbmxldCBpZCQxID0gMDtcbmZ1bmN0aW9uIG5leHRJZCQxKCkge1xuICAgIHJldHVybiBpZCQxKys7XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTG9naWNhbFJvd0RpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoaWRTZXJ2aWNlLCBuYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuaWRTZXJ2aWNlID0gaWRTZXJ2aWNlO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLmxvZ2ljYWxTbGF2ZVJvdyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvZ2ljYWxTbGF2ZUNlbGxzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmRhdGFSb3dJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnVpZCA9IG5leHRJZCQxKCk7XG4gICAgfVxuICAgIGdldCBob3N0Um9sZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9naWNhbFNsYXZlUm93ID8gJ3ByZXNlbnRhdGlvbicgOiAncm93JztcbiAgICB9XG4gICAgZ2V0IGFyaWFSb3dJbmRleCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbi5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpY2FsUm93SW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBhcmlhT3ducygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb24uZW5hYmxlZCB8fCB0aGlzLmxvZ2ljYWxTbGF2ZVJvdyB8fCB0aGlzLmxvZ2ljYWxTbGF2ZUNlbGxzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRzID0gW107XG4gICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5sb2dpY2FsQ2VsbHNDb3VudCArIHRoaXMubG9naWNhbFNsYXZlQ2VsbHNDb3VudDtcbiAgICAgICAgZm9yIChsZXQgY2VsbEluZGV4ID0gdGhpcy5sb2dpY2FsQ2VsbHNDb3VudDsgY2VsbEluZGV4IDwgdG90YWw7IGNlbGxJbmRleCsrKSB7XG4gICAgICAgICAgICBpZHMucHVzaCh0aGlzLmlkU2VydmljZS5jZWxsSWQodGhpcy5sb2dpY2FsUm93SW5kZXgsIGNlbGxJbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZHMuam9pbignICcpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uLmVuYWJsZWQgfHwgdGhpcy5sb2dpY2FsU2xhdmVSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleENoYW5nZSA9IGNoYW5nZXMubG9naWNhbFJvd0luZGV4O1xuICAgICAgICBjb25zdCBsb2dpY2FsU2xhdmVSb3dDaGFuZ2UgPSBjaGFuZ2VzLmxvZ2ljYWxTbGF2ZVJvdztcbiAgICAgICAgaWYgKGluZGV4Q2hhbmdlIHx8IGxvZ2ljYWxTbGF2ZVJvd0NoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleENoYW5nZSAmJiAhaW5kZXhDaGFuZ2UuaXNGaXJzdENoYW5nZSgpID8gaW5kZXhDaGFuZ2UucHJldmlvdXNWYWx1ZSA6IHRoaXMubG9naWNhbFJvd0luZGV4O1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnVucmVnaXN0ZXJSb3coaW5kZXgsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnJlZ2lzdGVyUm93KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFueUNoYW5nZWQoWydkYXRhUm93SW5kZXgnLCAnZGF0YUl0ZW0nXSwgY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi51cGRhdGVSb3codGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbi51bnJlZ2lzdGVyUm93KHRoaXMubG9naWNhbFJvd0luZGV4LCB0aGlzKTtcbiAgICB9XG59XG5Mb2dpY2FsUm93RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkTG9naWNhbFJvd10nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkxvZ2ljYWxSb3dEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBJZFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH1cbl07XG5Mb2dpY2FsUm93RGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGxvZ2ljYWxSb3dJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9naWNhbFNsYXZlUm93OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb2dpY2FsQ2VsbHNDb3VudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbG9naWNhbFNsYXZlQ2VsbHNDb3VudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGF0YVJvd0luZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRhSXRlbTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaG9zdFJvbGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIucm9sZScsXSB9XSxcbiAgICBhcmlhUm93SW5kZXg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1yb3dpbmRleCcsXSB9XSxcbiAgICBhcmlhT3duczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLW93bnMnLF0gfV1cbn07XG5cbi8qIHRzbGludDpkaXNhYmxlOnBpcGUtbmFtaW5nICovXG5jb25zdCBGT1JNQVRfUkVHRVggPSAvXFx7XFxkKzo/Lztcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGaWVsZEFjY2Vzc29yUGlwZSB7XG4gICAgY29uc3RydWN0b3IoaW50bFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5pbnRsU2VydmljZSA9IGludGxTZXJ2aWNlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0oZGF0YUl0ZW0sIGZpZWxkTmFtZSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghaXNOdWxsT3JFbXB0eVN0cmluZyhmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlcihmaWVsZE5hbWUpKGRhdGFJdGVtKTtcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eVN0cmluZyhmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWUoZm9ybWF0LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFJdGVtO1xuICAgIH1cbiAgICBmb3JtYXRWYWx1ZShmb3JtYXQsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGludGwgPSB0aGlzLmludGxTZXJ2aWNlO1xuICAgICAgICBpZiAoaXNTdHJpbmcoZm9ybWF0KSAmJiBmb3JtYXQubWF0Y2goRk9STUFUX1JFR0VYKSkge1xuICAgICAgICAgICAgcmV0dXJuIGludGwuZm9ybWF0KGZvcm1hdCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRsLnRvU3RyaW5nKHZhbHVlLCBmb3JtYXQpO1xuICAgIH1cbn1cbkZpZWxkQWNjZXNzb3JQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBQaXBlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd2YWx1ZU9mJyxcbiAgICAgICAgICAgICAgICBwdXJlOiBmYWxzZVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5GaWVsZEFjY2Vzc29yUGlwZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEludGxTZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjb2x1bW5zVG9SZXNpemUgPSAoeyBjb2x1bW5zIH0pID0+IE1hdGgubWF4KDEsIHJlc2l6YWJsZUNvbHVtbnMoY29sdW1ucykubGVuZ3RoKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCByb3cgPSBzZWxlY3RvciA9PiBlbGVtZW50ID0+IGVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGVhZGVyUm93ID0gaW5kZXggPT4gZWxlbWVudCA9PiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoZWFkPnRyJylbaW5kZXhdO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNlbGwgPSAoaW5kZXgsIHNlbGVjdG9yID0gJ3RkJykgPT4gZWxlbWVudCA9PiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCR7c2VsZWN0b3J9Om5vdCguay1ncm91cC1jZWxsKTpub3QoLmstaGllcmFyY2h5LWNlbGwpYClbaW5kZXhdO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IG9mZnNldFdpZHRoID0gZWxlbWVudCA9PiBlbGVtZW50Lm9mZnNldFdpZHRoO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHBpcGUgPSAoLi4uZm5zKSA9PiBkYXRhID0+IGZucy5yZWR1Y2UoKHN0YXRlJCQxLCBmbikgPT4gc3RhdGUkJDEgPyBmbihzdGF0ZSQkMSkgOiAwLCBkYXRhKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBUYWJsZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgcmVuZGVyZXIsIHNlcnZpY2UsIHpvbmUsIGNkcikge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpcnN0UmVzaXplID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCBtaW5XaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RSZXNpemUgPyAwIDogbnVsbDtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IG9icyA9IHRoaXMuc2VydmljZVxuICAgICAgICAgICAgLmNoYW5nZXMucGlwZShmaWx0ZXIoZSA9PiB0aGlzLmxvY2tlZCA9PT0gZS5sb2NrZWQpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBvYnMucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdzdGFydCcpLCB0YXAodGhpcy5pbml0U3RhdGUuYmluZCh0aGlzKSksIG1hcChjb2x1bW5zVG9SZXNpemUpLCBzd2l0Y2hNYXAoKHRha2UkJDEpID0+IG9icy5waXBlKGZpbHRlcihlID0+IGUudHlwZSA9PT0gJ3Jlc2l6ZVRhYmxlJyksIG1hcChlID0+IGUuZGVsdGEpLCBidWZmZXJDb3VudCh0YWtlJCQxKSkpKS5zdWJzY3JpYmUodGhpcy5yZXNpemUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYXV0b0ZpdFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VydmljZVxuICAgICAgICAgICAgLnJlZ2lzdGVyVGFibGUoe1xuICAgICAgICAgICAgYXV0b0ZpdDogdGhpcy5hdXRvRml0T2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgbG9ja2VkOiB0aGlzLmxvY2tlZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdXRvRml0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9GaXRTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b0ZpdFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdFN0YXRlKCkge1xuICAgICAgICB0aGlzLmZpcnN0UmVzaXplID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnZpcnR1YWxDb2x1bW5zIHx8IHRoaXMubG9ja2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsV2lkdGggPSBvZmZzZXRXaWR0aCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzaXplKGRlbHRhcykge1xuICAgICAgICBpZiAoIXRoaXMudmlydHVhbENvbHVtbnMgfHwgdGhpcy5sb2NrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gZGVsdGFzLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5vcmlnaW5hbFdpZHRoICsgZGVsdGE7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCB3aWR0aCArICdweCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgYXV0b0ZpdE9ic2VydmFibGUoY29sdW1uSW5mbykge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnay1hdXRvZml0dGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aHMgPSBjb2x1bW5JbmZvLm1hcCh0aGlzLm1lYXN1cmVDb2x1bW4uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2stYXV0b2ZpdHRpbmcnKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHdpZHRocyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1lYXN1cmVDb2x1bW4oaW5mbykge1xuICAgICAgICBjb25zdCBkb20gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gcGlwZShoZWFkZXJSb3coaW5mby5sZXZlbCksIGNlbGwoaW5mby5oZWFkZXJJbmRleCwgJ3RoJyksIG9mZnNldFdpZHRoKShkb20pO1xuICAgICAgICBsZXQgZGF0YSA9IDA7XG4gICAgICAgIGlmICghaW5mby5pc1BhcmVudFNwYW4gfHwgKGluZm8uaXNQYXJlbnRTcGFuICYmIGluZm8uaXNMYXN0SW5TcGFuKSkge1xuICAgICAgICAgICAgZGF0YSA9IHBpcGUocm93KCd0Ym9keT50cjpub3QoLmstZ3JvdXBpbmctcm93KTpub3QoLmstZ3JpZC1ub3JlY29yZHMpJyksIGNlbGwoaW5mby5pbmRleCksIG9mZnNldFdpZHRoKShkb20pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHBpcGUocm93KCd0Zm9vdD50cicpLCBjZWxsKGluZm8uaW5kZXgpLCBvZmZzZXRXaWR0aCkoZG9tKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGhlYWRlciwgZGF0YSwgZm9vdGVyKTtcbiAgICB9XG59XG5UYWJsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGFibGUnIC8vIHRzbGludDpkaXNhYmxlLWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRhYmxlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcblRhYmxlRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGxvY2tlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdmlydHVhbENvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbldpZHRoOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5taW4td2lkdGgnLF0gfV1cbn07XG5cbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyA9IFtcbiAgICBDb2x1bW5Db21wb25lbnQsXG4gICAgQ29sdW1uR3JvdXBDb21wb25lbnQsXG4gICAgTG9naWNhbENlbGxEaXJlY3RpdmUsXG4gICAgTG9naWNhbFJvd0RpcmVjdGl2ZSxcbiAgICBGb2N1c2FibGVEaXJlY3RpdmUsXG4gICAgRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQ29sR3JvdXBDb21wb25lbnQsXG4gICAgUmVzaXphYmxlQ29udGFpbmVyRGlyZWN0aXZlLFxuICAgIFRlbXBsYXRlQ29udGV4dERpcmVjdGl2ZSxcbiAgICBGaWVsZEFjY2Vzc29yUGlwZSxcbiAgICBEZXRhaWxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBTcGFuQ29sdW1uQ29tcG9uZW50LFxuICAgIFRhYmxlRGlyZWN0aXZlLFxuICAgIExvYWRpbmdDb21wb25lbnRcbl07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU2hhcmVkTW9kdWxlIHtcbiAgICBzdGF0aWMgZXhwb3J0cygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIENvbHVtbkNvbXBvbmVudCxcbiAgICAgICAgICAgIFNwYW5Db2x1bW5Db21wb25lbnQsXG4gICAgICAgICAgICBDb2x1bW5Hcm91cENvbXBvbmVudCxcbiAgICAgICAgICAgIEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgRGV0YWlsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBGb2N1c2FibGVEaXJlY3RpdmVcbiAgICAgICAgXTtcbiAgICB9XG59XG5TaGFyZWRNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2V4cG9ydGVkTW9kdWxlc10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkTW9kdWxlcywgRHJhZ2dhYmxlTW9kdWxlLCBFdmVudHNNb2R1bGVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYENvbnRhaW5zYCAoKipDb250YWlucyoqKSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIENvbnRhaW5zRmlsdGVyT3BlcmF0b3JDb21wb25lbnQgZXh0ZW5kcyBGaWx0ZXJPcGVyYXRvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikgeyBzdXBlcihcImNvbnRhaW5zXCIsIGxvY2FsaXphdGlvbik7IH1cbn1cbkNvbnRhaW5zRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29udGFpbnNGaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItY29udGFpbnMtb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db250YWluc0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGBEb2VzTm90Q29udGFpbmAgKCoqRG9lcyBub3QgY29udGFpbioqKSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIERvZXNOb3RDb250YWluRmlsdGVyT3BlcmF0b3JDb21wb25lbnQgZXh0ZW5kcyBGaWx0ZXJPcGVyYXRvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikgeyBzdXBlcihcImRvZXNub3Rjb250YWluXCIsIGxvY2FsaXphdGlvbik7IH1cbn1cbkRvZXNOb3RDb250YWluRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRG9lc05vdENvbnRhaW5GaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItbm90LWNvbnRhaW5zLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRG9lc05vdENvbnRhaW5GaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBgRW5kc1dpdGhgICgqKkVuZHMgd2l0aCoqKSBzdHJpbmcgZmlsdGVyIG9wZXJhdG9yLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcywgcmVmZXIgdG86XG4gKiAqIFtTZXR0aW5nIHRoZSBkZWZhdWx0IGZpbHRlciBvcGVyYXRvcnNdKHslIHNsdWcgYnVpbHRpbmZpbHRlcnRlbXBsYXRlX2dyaWQgJX0jdG9jLXNldHRpbmctdGhlLWRlZmF1bHQtZmlsdGVyLW9wZXJhdG9yKVxuICogKiBbU2V0dGluZyB0aGUgb3JkZXIgb2YgdGhlIGZpbHRlciBvcGVyYXRvcnNdKHslIHNsdWcgYnVpbHRpbmZpbHRlcnRlbXBsYXRlX2dyaWQgJX0jdG9jLXNldHRpbmctdGhlLW9yZGVyLW9mLXRoZS1maWx0ZXItb3BlcmF0b3JzKVxuICovXG5jbGFzcyBFbmRzV2l0aEZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJlbmRzd2l0aFwiLCBsb2NhbGl6YXRpb24pOyB9XG59XG5FbmRzV2l0aEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZpbHRlck9wZXJhdG9yQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVuZHNXaXRoRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWVuZHN3aXRoLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRW5kc1dpdGhGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBgRXF1YWxgICgqKklzIGVxdWFsIHRvKiopIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgRXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiZXFcIiwgbG9jYWxpemF0aW9uKTsgfVxufVxuRXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBFcXVhbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkVxdWFsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYElzRW1wdHlgICgqKklzIGVtcHR5KiopIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgSXNFbXB0eUZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJpc2VtcHR5XCIsIGxvY2FsaXphdGlvbik7IH1cbn1cbklzRW1wdHlGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJc0VtcHR5RmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWlzZW1wdHktb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Jc0VtcHR5RmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYElzTm90RW1wdHlgICgqKklzIG5vdCBlbXB0eSoqKSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIElzTm90RW1wdHlGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiaXNub3RlbXB0eVwiLCBsb2NhbGl6YXRpb24pOyB9XG59XG5Jc05vdEVtcHR5RmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSXNOb3RFbXB0eUZpbHRlck9wZXJhdG9yQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWZpbHRlci1pc25vdGVtcHR5LW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSXNOb3RFbXB0eUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGBJc05vdE51bGxgICgqKklzIG5vdCBudWxsKiopIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgSXNOb3ROdWxsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQgZXh0ZW5kcyBGaWx0ZXJPcGVyYXRvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikgeyBzdXBlcihcImlzbm90bnVsbFwiLCBsb2NhbGl6YXRpb24pOyB9XG59XG5Jc05vdE51bGxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJc05vdE51bGxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSXNOb3ROdWxsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYElzTnVsbGAgKCoqSXMgbnVsbCoqKSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIElzTnVsbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJpc251bGxcIiwgbG9jYWxpemF0aW9uKTsgfVxufVxuSXNOdWxsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSXNOdWxsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbklzTnVsbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGBOb3RFcXVhbGAgKCoqSXMgbm90IGVxdWFsIHRvKiopIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgTm90RXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwibmVxXCIsIGxvY2FsaXphdGlvbik7IH1cbn1cbk5vdEVxdWFsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTm90RXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTm90RXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBgU3RhcnRzV2l0aGAgKCoqU3RhcnRzIHdpdGgqKikgZmlsdGVyIG9wZXJhdG9yLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcywgcmVmZXIgdG86XG4gKiAqIFtTZXR0aW5nIHRoZSBkZWZhdWx0IGZpbHRlciBvcGVyYXRvcnNdKHslIHNsdWcgYnVpbHRpbmZpbHRlcnRlbXBsYXRlX2dyaWQgJX0jdG9jLXNldHRpbmctdGhlLWRlZmF1bHQtZmlsdGVyLW9wZXJhdG9yKVxuICogKiBbU2V0dGluZyB0aGUgb3JkZXIgb2YgdGhlIGZpbHRlciBvcGVyYXRvcnNdKHslIHNsdWcgYnVpbHRpbmZpbHRlcnRlbXBsYXRlX2dyaWQgJX0jdG9jLXNldHRpbmctdGhlLW9yZGVyLW9mLXRoZS1maWx0ZXItb3BlcmF0b3JzKVxuICovXG5jbGFzcyBTdGFydHNXaXRoRmlsdGVyT3BlcmF0b3JDb21wb25lbnQgZXh0ZW5kcyBGaWx0ZXJPcGVyYXRvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikgeyBzdXBlcihcInN0YXJ0c3dpdGhcIiwgbG9jYWxpemF0aW9uKTsgfVxufVxuU3RhcnRzV2l0aEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZpbHRlck9wZXJhdG9yQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0YXJ0c1dpdGhGaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblN0YXJ0c1dpdGhGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGBHcmVhdGVyYCAoKipJcyBncmVhdGVyIHRoYW4qKikgbnVtZXJpYyBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIEdyZWF0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiZ3RcIiwgbG9jYWxpemF0aW9uKTsgfVxufVxuR3JlYXRlckZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZpbHRlck9wZXJhdG9yQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEdyZWF0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5HcmVhdGVyRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYEdyZWF0ZXJPckVxdWFsVG9gICgqKklzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byoqKSBudW1lcmljIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgR3JlYXRlck9yRXF1YWxUb0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJndGVcIiwgbG9jYWxpemF0aW9uKTsgfVxufVxuR3JlYXRlck9yRXF1YWxUb0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZpbHRlck9wZXJhdG9yQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEdyZWF0ZXJPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuR3JlYXRlck9yRXF1YWxUb0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKlxuICogUmVwcmVzZW50cyB0aGUgYExlc3NgICgqKklzIGxlc3MgdGhhbioqKSBudW1lcmljIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgTGVzc0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJsdFwiLCBsb2NhbGl6YXRpb24pOyB9XG59XG5MZXNzRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTGVzc0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkxlc3NGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGBMZXNzT3JFcXVhbFRvYCAoKipJcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8qKikgbnVtZXJpYyBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIExlc3NPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwibHRlXCIsIGxvY2FsaXphdGlvbik7IH1cbn1cbkxlc3NPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMZXNzT3JFcXVhbFRvRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkxlc3NPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGBHcmVhdGVyYCAoKipJcyBhZnRlcioqKSBkYXRlIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgQWZ0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiYWZ0ZXJcIiwgbG9jYWxpemF0aW9uKTsgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogXCJndFwiXG4gICAgICAgIH07XG4gICAgfVxufVxuQWZ0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBZnRlckZpbHRlck9wZXJhdG9yQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWZpbHRlci1hZnRlci1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkFmdGVyRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qXG4gKiBSZXByZXNlbnRzIHRoZSBgR3JlYXRlck9yRXF1YWxUb2AgKCoqSXMgYWZ0ZXIgb3IgZXF1YWwgdG8qKikgZGF0ZSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIEFmdGVyRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiYWZ0ZXItZXFcIiwgbG9jYWxpemF0aW9uKTsgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogXCJndGVcIlxuICAgICAgICB9O1xuICAgIH1cbn1cbkFmdGVyRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGaWx0ZXJPcGVyYXRvckJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBZnRlckVxRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWFmdGVyLWVxLW9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQWZ0ZXJFcUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG4vKlxuICogUmVwcmVzZW50cyB0aGUgYExlc3NPckVxdWFsVG9gICgqKklzIGJlZm9yZSBvciBlcXVhbCB0byoqKSBkYXRlIGZpbHRlciBvcGVyYXRvci5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogKiBbU2V0dGluZyB0aGUgZGVmYXVsdCBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1kZWZhdWx0LWZpbHRlci1vcGVyYXRvcilcbiAqICogW1NldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmaWx0ZXIgb3BlcmF0b3JzXSh7JSBzbHVnIGJ1aWx0aW5maWx0ZXJ0ZW1wbGF0ZV9ncmlkICV9I3RvYy1zZXR0aW5nLXRoZS1vcmRlci1vZi10aGUtZmlsdGVyLW9wZXJhdG9ycylcbiAqL1xuY2xhc3MgQmVmb3JlRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCBleHRlbmRzIEZpbHRlck9wZXJhdG9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7IHN1cGVyKFwiYmVmb3JlLWVxXCIsIGxvY2FsaXphdGlvbik7IH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IFwibHRlXCJcbiAgICAgICAgfTtcbiAgICB9XG59XG5CZWZvcmVFcUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZpbHRlck9wZXJhdG9yQmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJlZm9yZUVxRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWJlZm9yZS1lcS1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJlZm9yZUVxRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5cbi8qXG4gKiBSZXByZXNlbnRzIHRoZSBgTGVzcyB0aGVuYCAoKipJcyBiZWZvcmUqKikgZGF0ZSBmaWx0ZXIgb3BlcmF0b3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLCByZWZlciB0bzpcbiAqICogW1NldHRpbmcgdGhlIGRlZmF1bHQgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtZGVmYXVsdC1maWx0ZXItb3BlcmF0b3IpXG4gKiAqIFtTZXR0aW5nIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyIG9wZXJhdG9yc10oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2Mtc2V0dGluZy10aGUtb3JkZXItb2YtdGhlLWZpbHRlci1vcGVyYXRvcnMpXG4gKi9cbmNsYXNzIEJlZm9yZUZpbHRlck9wZXJhdG9yQ29tcG9uZW50IGV4dGVuZHMgRmlsdGVyT3BlcmF0b3JCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHsgc3VwZXIoXCJiZWZvcmVcIiwgbG9jYWxpemF0aW9uKTsgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogXCJsdFwiXG4gICAgICAgIH07XG4gICAgfVxufVxuQmVmb3JlRmlsdGVyT3BlcmF0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRmlsdGVyT3BlcmF0b3JCYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQmVmb3JlRmlsdGVyT3BlcmF0b3JDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZmlsdGVyLWJlZm9yZS1vcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJlZm9yZUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG5jb25zdCBGSUxURVJfT1BFUkFUT1JTID0gW1xuICAgIEZpbHRlckNlbGxPcGVyYXRvcnNDb21wb25lbnQsXG4gICAgQ29udGFpbnNGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCxcbiAgICBEb2VzTm90Q29udGFpbkZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIEVuZHNXaXRoRmlsdGVyT3BlcmF0b3JDb21wb25lbnQsXG4gICAgRXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCxcbiAgICBJc0VtcHR5RmlsdGVyT3BlcmF0b3JDb21wb25lbnQsXG4gICAgSXNOb3RFbXB0eUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIElzTm90TnVsbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIElzTnVsbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIE5vdEVxdWFsRmlsdGVyT3BlcmF0b3JDb21wb25lbnQsXG4gICAgU3RhcnRzV2l0aEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIEdyZWF0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCxcbiAgICBHcmVhdGVyT3JFcXVhbFRvRmlsdGVyT3BlcmF0b3JDb21wb25lbnQsXG4gICAgTGVzc0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIExlc3NPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudCxcbiAgICBBZnRlckZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIEFmdGVyRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCxcbiAgICBCZWZvcmVFcUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LFxuICAgIEJlZm9yZUZpbHRlck9wZXJhdG9yQ29tcG9uZW50XG5dO1xuY29uc3QgaW1wb3J0ZWRNb2R1bGVzID0gW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERyb3BEb3duTGlzdE1vZHVsZSxcbiAgICBBdXRvQ29tcGxldGVNb2R1bGUsXG4gICAgSW5wdXRzTW9kdWxlLFxuICAgIERhdGVQaWNrZXJNb2R1bGUsXG4gICAgUG9wdXBNb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlXG5dO1xuY29uc3QgQ09NUE9ORU5UUyA9IFtcbiAgICBGaWx0ZXJJbnB1dERpcmVjdGl2ZVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTaGFyZWRGaWx0ZXJNb2R1bGUge1xuICAgIHN0YXRpYyBleHBvcnRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uRklMVEVSX09QRVJBVE9SU1xuICAgICAgICBdO1xuICAgIH1cbn1cblNoYXJlZEZpbHRlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbRklMVEVSX09QRVJBVE9SUywgQ09NUE9ORU5UU10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW0ZJTFRFUl9PUEVSQVRPUlMsIGltcG9ydGVkTW9kdWxlcywgQ09NUE9ORU5UU10sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogWy4uLmltcG9ydGVkTW9kdWxlc11cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlckhvc3REaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGhvc3QsIHJlc29sdmVyKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gdGhpcy5ob3N0LmNyZWF0ZUNvbXBvbmVudCh0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuY29tcG9uZW50VHlwZSgpKSk7XG4gICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCh7XG4gICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlclxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGFueUNoYW5nZWQoW1wiY29sdW1uXCIsIFwiZmlsdGVyXCJdLCBjaGFuZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDb21wb25lbnQoeyBjb2x1bW4sIGZpbHRlcjogZmlsdGVyJCQxIH0pIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudC5pbnN0YW5jZTtcbiAgICAgICAgaW5zdGFuY2UuY29sdW1uID0gY29sdW1uO1xuICAgICAgICBpbnN0YW5jZS5maWx0ZXIgPSBmaWx0ZXIkJDE7XG4gICAgfVxufVxuRmlsdGVySG9zdERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICpcbiAqID4gTGlzdCB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMgaW4gdGhlIEdyaWRNb2R1bGUgYXMgYGVudHJ5Q29tcG9uZW50c2AuXG4gKi9cbmNvbnN0IGZpbHRlckNvbXBvbmVudEZhY3RvcnkgPSAodHlwZSkgPT4gKHtcbiAgICBcImJvb2xlYW5cIjogQm9vbGVhbkZpbHRlckNlbGxDb21wb25lbnQsXG4gICAgXCJkYXRlXCI6IERhdGVGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIFwibnVtZXJpY1wiOiBOdW1lcmljRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICBcInRleHRcIjogU3RyaW5nRmlsdGVyQ2VsbENvbXBvbmVudFxufVt0eXBlXSk7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGaWx0ZXJDZWxsSG9zdERpcmVjdGl2ZSBleHRlbmRzIEZpbHRlckhvc3REaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGhvc3QsIHJlc29sdmVyKSB7XG4gICAgICAgIHN1cGVyKGhvc3QsIHJlc29sdmVyKTtcbiAgICB9XG4gICAgY29tcG9uZW50VHlwZSgpIHtcbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5U3RyaW5nKHRoaXMuY29sdW1uLmZpbHRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJDb21wb25lbnRGYWN0b3J5KHRoaXMuY29sdW1uLmZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZ0ZpbHRlckNlbGxDb21wb25lbnQ7XG4gICAgfVxufVxuRmlsdGVyQ2VsbEhvc3REaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0ZpbHRlckNlbGxIb3N0XSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRmlsdGVyQ2VsbEhvc3REaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sXG4gICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfVxuXTtcblxuY29uc3QgSU5URVJOQUxfQ09NUE9ORU5UUyA9IFtcbiAgICBGaWx0ZXJSb3dDb21wb25lbnQsXG4gICAgRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICBGaWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgU3RyaW5nRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICBOdW1lcmljRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICBBdXRvQ29tcGxldGVGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIEJvb2xlYW5GaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIEZpbHRlckNlbGxIb3N0RGlyZWN0aXZlLFxuICAgIEZpbHRlckNlbGxXcmFwcGVyQ29tcG9uZW50LFxuICAgIERhdGVGaWx0ZXJDZWxsQ29tcG9uZW50XG5dO1xuY29uc3QgRU5UUllfQ09NUE9ORU5UUyA9IFtcbiAgICBTdHJpbmdGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIE51bWVyaWNGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIEJvb2xlYW5GaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgIERhdGVGaWx0ZXJDZWxsQ29tcG9uZW50XG5dO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFJvd0ZpbHRlck1vZHVsZSB7XG4gICAgc3RhdGljIGV4cG9ydHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBGaWx0ZXJSb3dDb21wb25lbnQsXG4gICAgICAgICAgICBGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgICAgICAgICAgRmlsdGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgRmlsdGVyQ2VsbE9wZXJhdG9yc0NvbXBvbmVudCxcbiAgICAgICAgICAgIFN0cmluZ0ZpbHRlckNlbGxDb21wb25lbnQsXG4gICAgICAgICAgICBOdW1lcmljRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICAgICAgICAgIEF1dG9Db21wbGV0ZUZpbHRlckNlbGxDb21wb25lbnQsXG4gICAgICAgICAgICBCb29sZWFuRmlsdGVyQ2VsbENvbXBvbmVudCxcbiAgICAgICAgICAgIERhdGVGaWx0ZXJDZWxsQ29tcG9uZW50LFxuICAgICAgICAgICAgU2hhcmVkRmlsdGVyTW9kdWxlLmV4cG9ydHMoKVxuICAgICAgICBdO1xuICAgIH1cbn1cblJvd0ZpbHRlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbSU5URVJOQUxfQ09NUE9ORU5UU10sXG4gICAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBFTlRSWV9DT01QT05FTlRTLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtJTlRFUk5BTF9DT01QT05FTlRTLCBTaGFyZWRGaWx0ZXJNb2R1bGVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtTaGFyZWRGaWx0ZXJNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBub3JtYWxpemVTZXR0aW5ncyA9ICh7IGJ1dHRvbkNvdW50ID0gMTAsIGluZm8gPSB0cnVlLCB0eXBlID0gJ251bWVyaWMnLCBwYWdlU2l6ZXMgPSBmYWxzZSwgcHJldmlvdXNOZXh0ID0gdHJ1ZSB9KSA9PiAoe1xuICAgIGJ1dHRvbkNvdW50LFxuICAgIGluZm8sXG4gICAgcGFnZVNpemVzOiBwYWdlU2l6ZXMgPT09IHRydWUgPyBbNSwgMTAsIDIwXSA6IHBhZ2VTaXplcyxcbiAgICBwcmV2aW91c05leHQsXG4gICAgdHlwZVxufSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgbm9ybWFsaXplID0gKHNldHRpbmdzKSA9PiBub3JtYWxpemVTZXR0aW5ncyhzZXR0aW5ncyA9PT0gdHJ1ZSA/IHt9IDogc2V0dGluZ3MpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUGFnZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBhZ2VyQ29udGV4dCkge1xuICAgICAgICB0aGlzLnBhZ2VyQ29udGV4dCA9IHBhZ2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgICAgIHRoaXMuc2tpcCA9IDE7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG5vcm1hbGl6ZSh7fSk7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQ29udGV4dCA9IHt9O1xuICAgIH1cbiAgICBzZXQgb3B0aW9ucyh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gbm9ybWFsaXplKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHBhZ2VyV3JhcENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGdyaWRQYWdlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IHdpZGdldENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IHRvdGFsUGFnZXMoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKHRoaXMudG90YWwgfHwgMCkgLyB0aGlzLnBhZ2VTaXplKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRQYWdlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigodGhpcy5za2lwIHx8IDApIC8gdGhpcy5wYWdlU2l6ZSkgKyAxO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVDb250ZXh0KCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fdGVtcGxhdGVDb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRvdGFsUGFnZXMgPSB0aGlzLnRvdGFsUGFnZXM7XG4gICAgICAgIGNvbnRleHQudG90YWwgPSB0aGlzLnRvdGFsO1xuICAgICAgICBjb250ZXh0LnNraXAgPSB0aGlzLnNraXA7XG4gICAgICAgIGNvbnRleHQucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgICBjb250ZXh0LmN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnBhZ2VyQ29udGV4dC5wYWdlQ2hhbmdlLnN1YnNjcmliZSh0aGlzLmNoYW5nZVBhZ2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGFueUNoYW5nZWQoWydwYWdlU2l6ZScsICdza2lwJywgJ3RvdGFsJ10sIGNoYW5nZXMsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlckNvbnRleHQubm90aWZ5Q2hhbmdlcyh7XG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICAgICAgICAgICAgc2tpcDogdGhpcy5za2lwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0aGlzLnRvdGFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZUNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wYWdlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hhbmdlUGFnZShldmVudCkge1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgfVxufVxuUGFnZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXBhZ2VyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cInRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwidGVtcGxhdGVDb250ZXh0XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgPGtlbmRvLXBhZ2VyLXByZXYtYnV0dG9ucyAqbmdJZj1cInNldHRpbmdzLnByZXZpb3VzTmV4dFwiPjwva2VuZG8tcGFnZXItcHJldi1idXR0b25zPlxuICAgICAgICAgICAgPGtlbmRvLXBhZ2VyLW51bWVyaWMtYnV0dG9uc1xuICAgICAgICAgICAgICAgICpuZ0lmPVwic2V0dGluZ3MudHlwZSA9PT0gJ251bWVyaWMnXCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uQ291bnRdPVwic2V0dGluZ3MuYnV0dG9uQ291bnRcIj5cbiAgICAgICAgICAgIDwva2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zPlxuICAgICAgICAgICAgPGtlbmRvLXBhZ2VyLWlucHV0ICpuZ0lmPVwic2V0dGluZ3MudHlwZSA9PT0gJ2lucHV0J1wiPjwva2VuZG8tcGFnZXItaW5wdXQ+XG4gICAgICAgICAgICA8a2VuZG8tcGFnZXItbmV4dC1idXR0b25zICpuZ0lmPVwic2V0dGluZ3MucHJldmlvdXNOZXh0XCI+PC9rZW5kby1wYWdlci1uZXh0LWJ1dHRvbnM+XG4gICAgICAgICAgICA8a2VuZG8tcGFnZXItaW5mbyAqbmdJZj0nc2V0dGluZ3MuaW5mbyc+PC9rZW5kby1wYWdlci1pbmZvPlxuICAgICAgICAgICAgPGtlbmRvLXBhZ2VyLXBhZ2Utc2l6ZXMgKm5nSWY9XCJzZXR0aW5ncy5wYWdlU2l6ZXNcIiBbcGFnZVNpemVzXT1cInNldHRpbmdzLnBhZ2VTaXplc1wiPjwva2VuZG8tcGFnZXItcGFnZS1zaXplcz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuUGFnZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBQYWdlckNvbnRleHRTZXJ2aWNlIH1cbl07XG5QYWdlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB0b3RhbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2tpcDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcGFnZVNpemU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9wdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwYWdlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgcGFnZXJXcmFwQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstcGFnZXItd3JhcCcsXSB9XSxcbiAgICBncmlkUGFnZXJDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1ncmlkLXBhZ2VyJyxdIH1dLFxuICAgIHdpZGdldENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpZGdldCcsXSB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFBhZ2VyRWxlbWVudENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBwYWdlckNvbnRleHQsIGNkKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLnBhZ2VyQ29udGV4dCA9IHBhZ2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5jZCA9IGNkO1xuICAgICAgICB0aGlzLnRvdGFsID0gdGhpcy5wYWdlckNvbnRleHQudG90YWw7XG4gICAgICAgIHRoaXMuc2tpcCA9IHRoaXMucGFnZXJDb250ZXh0LnNraXA7XG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2VyQ29udGV4dC5wYWdlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgUGFnZXJFbGVtZW50Q29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRQYWdlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigodGhpcy5za2lwIHx8IDApIC8gdGhpcy5wYWdlU2l6ZSkgKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBQYWdlckVsZW1lbnRDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgdG90YWxQYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgodGhpcy50b3RhbCB8fCAwKSAvIHRoaXMucGFnZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBQYWdlckVsZW1lbnRDb21wb25lbnRcbiAgICAgKi9cbiAgICB0ZXh0Rm9yKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUGFnZXJFbGVtZW50Q29tcG9uZW50XG4gICAgICovXG4gICAgY2hhbmdlUGFnZShwYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZXJDb250ZXh0LmNoYW5nZVBhZ2UocGFnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFBhZ2VyRWxlbWVudENvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB0aGlzLnBhZ2VyQ29udGV4dC5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlcy5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkLm1hcmtGb3JDaGVjaygpKSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYWNjZXNzLW1pc3NpbmctbWVtYmVyXG4vKipcbiAqIERpc3BsYXlzIGJ1dHRvbnMgZm9yIG5hdmlnYXRpbmcgdG8gdGhlIGZpcnN0IGFuZCB0byB0aGUgcHJldmlvdXMgcGFnZSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHBhZ2luZ19ncmlkICV9I3RvYy1wYWdlci10ZW1wbGF0ZXMpKS5cbiAqL1xuY2xhc3MgUGFnZXJQcmV2QnV0dG9uc0NvbXBvbmVudCBleHRlbmRzIFBhZ2VyRWxlbWVudENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBwYWdlckNvbnRleHQsIGNkKSB7XG4gICAgICAgIHN1cGVyKGxvY2FsaXphdGlvbiwgcGFnZXJDb250ZXh0LCBjZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBQYWdlclByZXZCdXR0b25zQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA9PT0gMSB8fCAhdGhpcy50b3RhbDtcbiAgICB9XG4gICAgb25DaGFuZ2VzKHsgdG90YWwsIHNraXAsIHBhZ2VTaXplIH0pIHtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuUGFnZXJQcmV2QnV0dG9uc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcGFnZXItcHJldi1idXR0b25zJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YSAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidGV4dEZvcigncGFnZXJGaXJzdFBhZ2UnKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY3VycmVudFBhZ2UgIT09IDEgPyBjaGFuZ2VQYWdlKDApIDogZmFsc2VcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdrLWxpbmsnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdrLXBhZ2VyLW5hdic6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2stc3RhdGUtZGlzYWJsZWQnOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAnay1wYWdlci1maXJzdCc6IHRydWVcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDxzcGFuIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dEZvcigncGFnZXJGaXJzdFBhZ2UnKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnay1pY29uJzp0cnVlLFxuICAgICAgICAgICAgICAgICAgICAnay1pLXNlZWstdyc6IHRydWVcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGEgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInRleHRGb3IoJ3BhZ2VyUHJldmlvdXNQYWdlJylcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImN1cnJlbnRQYWdlICE9PSAxID8gY2hhbmdlUGFnZShjdXJyZW50UGFnZS0yKSA6IGZhbHNlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnay1saW5rJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnay1wYWdlci1uYXYnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdrLXN0YXRlLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgJyc6IHRydWVcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDxzcGFuIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dEZvcigncGFnZXJQcmV2aW91c1BhZ2UnKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnay1pY29uJzp0cnVlLFxuICAgICAgICAgICAgICAgICAgICAnay1pLWFycm93LXcnOiB0cnVlXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5QYWdlclByZXZCdXR0b25zQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogUGFnZXJDb250ZXh0U2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcblxuLy8gdHNsaW50OmRpc2FibGU6IG5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlclxuLyoqXG4gKiBEaXNwbGF5cyBidXR0b25zIGZvciBuYXZpZ2F0aW5nIHRvIHRoZSBuZXh0IGFuZCB0byB0aGUgbGFzdCBwYWdlIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcGFnaW5nX2dyaWQgJX0jdG9jLXBhZ2VyLXRlbXBsYXRlKSkuXG4gKi9cbmNsYXNzIFBhZ2VyTmV4dEJ1dHRvbnNDb21wb25lbnQgZXh0ZW5kcyBQYWdlckVsZW1lbnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbiwgcGFnZXJDb250ZXh0LCBjZCkge1xuICAgICAgICBzdXBlcihsb2NhbGl6YXRpb24sIHBhZ2VyQ29udGV4dCwgY2QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyT2YgUGFnZXJOZXh0QnV0dG9uc0NvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMudG90YWxQYWdlcyB8fCAhdGhpcy50b3RhbDtcbiAgICB9XG4gICAgb25DaGFuZ2VzKHsgdG90YWwsIHNraXAsIHBhZ2VTaXplIH0pIHtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuUGFnZXJOZXh0QnV0dG9uc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcGFnZXItbmV4dC1idXR0b25zJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YSAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidGV4dEZvcigncGFnZXJOZXh0UGFnZScpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjdXJyZW50UGFnZSAhPT0gdG90YWxQYWdlcyA/IGNoYW5nZVBhZ2UoY3VycmVudFBhZ2UpIDogZmFsc2VcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdrLWxpbmsnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdrLXBhZ2VyLW5hdic6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2stc3RhdGUtZGlzYWJsZWQnOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAnJzogdHJ1ZVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgPHNwYW4gW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0Rm9yKCdwYWdlck5leHRQYWdlJylcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2staWNvbic6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgJ2staS1hcnJvdy1lJzogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8YSAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidGV4dEZvcigncGFnZXJMYXN0UGFnZScpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjdXJyZW50UGFnZSAhPT0gdG90YWxQYWdlcyA/IGNoYW5nZVBhZ2UodG90YWxQYWdlcy0xKSA6IGZhbHNlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnay1saW5rJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnay1wYWdlci1uYXYnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdrLXN0YXRlLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgJ2stcGFnZXItbGFzdCc6IHRydWVcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDxzcGFuIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dEZvcigncGFnZXJMYXN0UGFnZScpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdrLWljb24nOnRydWUsXG4gICAgICAgICAgICAgICAgICAgICdrLWktc2Vlay1lJzogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuUGFnZXJOZXh0QnV0dG9uc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFBhZ2VyQ29udGV4dFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5cbi8qKlxuICogRGlzcGxheXMgbnVtZXJpYyBidXR0b25zIHRvIGVuYWJsZSBuYXZpZ2F0aW9uIGJldHdlZW4gdGhlIHBhZ2VzLlxuICovXG5jbGFzcyBQYWdlck51bWVyaWNCdXR0b25zQ29tcG9uZW50IGV4dGVuZHMgUGFnZXJFbGVtZW50Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24sIGNkLCBwYWdlckNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIobG9jYWxpemF0aW9uLCBwYWdlckNvbnRleHQsIGNkKTtcbiAgICAgICAgdGhpcy5wYWdlckNvbnRleHQgPSBwYWdlckNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtudW1iZXJbXX1cbiAgICAgKiBAbWVtYmVyT2YgUGFnZXJOdW1lcmljQnV0dG9uc0NvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBidXR0b25zKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGlkeCA9IHRoaXMuc3RhcnQ7IGlkeCA8PSB0aGlzLmVuZDsgaWR4KyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBlbmQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5zdGFydCArIHRoaXMuYnV0dG9uQ291bnQpIC0gMSwgdGhpcy50b3RhbFBhZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBzdGFydCgpIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvdW50ID0gdGhpcy5idXR0b25Db3VudDtcbiAgICAgICAgaWYgKHBhZ2UgPiBidXR0b25Db3VudCkge1xuICAgICAgICAgICAgY29uc3QgcmVtaW5kZXIgPSAocGFnZSAlIGJ1dHRvbkNvdW50KTtcbiAgICAgICAgICAgIHJldHVybiAocmVtaW5kZXIgPT09IDApID8gKHBhZ2UgLSBidXR0b25Db3VudCkgKyAxIDogKHBhZ2UgLSByZW1pbmRlcikgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcGFnZUxhYmVsKG51bSkge1xuICAgICAgICBjb25zdCBwYWdlVGV4dCA9IHRoaXMudGV4dEZvcigncGFnZXJQYWdlJyk7XG4gICAgICAgIGlmIChwYWdlVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2VUZXh0ICsgJyAnICsgbnVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW0udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgb25DaGFuZ2VzKHsgdG90YWwsIHNraXAsIHBhZ2VTaXplIH0pIHtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuUGFnZXJOdW1lcmljQnV0dG9uc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgIDx1bCBbbmdDbGFzc109XCJ7J2stcGFnZXItbnVtYmVycyc6IHRydWUsICdrLXJlc2V0JzogdHJ1ZX1cIj5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cInN0YXJ0ID4gMVwiPlxuICAgICAgICAgICAgICAgIDxhICBjbGFzcz1cImstbGlua1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicGFnZUxhYmVsKHN0YXJ0IC0gMSlcIlxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiI1wiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlUGFnZShzdGFydCAtIDIpXCI+Li4uPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbnVtIG9mIGJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8YSAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInBhZ2VMYWJlbChudW0pXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnay1saW5rJzogdHJ1ZSwgJ2stc3RhdGUtc2VsZWN0ZWQnOmN1cnJlbnRQYWdlID09IG51bX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlUGFnZShudW0gLSAxKVwiPlxuICAgICAgICAgICAgICAgICAgICB7e251bX19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImVuZCA8IHRvdGFsUGFnZXNcIj5cbiAgICAgICAgICAgICAgICA8YSAgY2xhc3M9XCJrLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInBhZ2VMYWJlbChlbmQgKyAxKVwiXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VQYWdlKGVuZClcIj4uLi48L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuUGFnZXJOdW1lcmljQnV0dG9uc0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBQYWdlckNvbnRleHRTZXJ2aWNlIH1cbl07XG5QYWdlck51bWVyaWNCdXR0b25zQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGJ1dHRvbkNvdW50OiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBEaXNwbGF5cyBhbiBpbnB1dCBlbGVtZW50IHdoaWNoIGFsbG93cyB0aGUgdHlwaW5nIGFuZCByZW5kZXJpbmcgb2YgcGFnZSBudW1iZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICA8a2VuZG8tZ3JpZFxuICogICAgICAgIFtrZW5kb0dyaWRCaW5kaW5nXT1cImdyaWREYXRhXCJcbiAqICAgICAgICBbcGFnZVNpemVdPVwiMVwiXG4gKiAgICAgICAgW3BhZ2VhYmxlXT1cInRydWVcIlxuICogICAgICA+XG4gKiAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIklEXCIgd2lkdGg9XCI0MFwiPlxuICogICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCIgdGl0bGU9XCJOYW1lXCIgd2lkdGg9XCIyNTBcIj5cbiAqICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiB0aXRsZT1cIlByaWNlXCIgd2lkdGg9XCI4MFwiIGZvcm1hdD1cInswOmN9XCI+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICpcbiAqICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1BhZ2VyVGVtcGxhdGUgbGV0LXRvdGFsUGFnZXM9XCJ0b3RhbFBhZ2VzXCIgbGV0LWN1cnJlbnRQYWdlPVwiY3VycmVudFBhZ2VcIj5cbiAqICAgICAgICAgIDxrZW5kby1wYWdlci1wcmV2LWJ1dHRvbnM+PC9rZW5kby1wYWdlci1wcmV2LWJ1dHRvbnM+XG4gKiAgICAgICAgICA8a2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zIFtidXR0b25Db3VudF09XCIxMFwiPjwva2VuZG8tcGFnZXItbnVtZXJpYy1idXR0b25zPlxuICogICAgICAgICAgPGtlbmRvLXBhZ2VyLW5leHQtYnV0dG9ucz48L2tlbmRvLXBhZ2VyLW5leHQtYnV0dG9ucz5cbiAqICAgICAgICAgIDxrZW5kby1wYWdlci1pbnB1dD48L2tlbmRvLXBhZ2VyLWlucHV0PlxuICogICAgICAgICAgPGtlbmRvLXBhZ2VyLWluZm8+PC9rZW5kby1wYWdlci1pbmZvPlxuICogICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqXG4gKiAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyBncmlkRGF0YSA9IFt7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDAsXG4gKiAgICAgICAgIFwiRGlzY29udGludWVkXCI6IGZhbHNlXG4gKiAgICAgICB9LCB7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFuZ1wiLFxuICogICAgICAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICogICAgICAgICBcIkRpc2NvbnRpbnVlZFwiOiB0cnVlXG4gKiAgICAgICB9XG4gKiAgICAgXTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgUGFnZXJJbnB1dENvbXBvbmVudCBleHRlbmRzIFBhZ2VyRWxlbWVudENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBwYWdlckNvbnRleHQsIHpvbmUsIGNkKSB7XG4gICAgICAgIHN1cGVyKGxvY2FsaXphdGlvbiwgcGFnZXJDb250ZXh0LCBjZCk7XG4gICAgICAgIHRoaXMucGFnZXJDb250ZXh0ID0gcGFnZXJDb250ZXh0O1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIFBhZ2VySW5wdXRDb21wb25lbnRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluY29taW5nVmFsdWUgPSB0aGlzLm51bWVyaWNJbnB1dC52YWx1ZSB8fCB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5FbnRlcikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGluY29taW5nVmFsdWUgIT09IHRoaXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlUGFnZShpbmNvbWluZ1ZhbHVlIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBQYWdlcklucHV0Q29tcG9uZW50XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhbmRsZUJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlID0gdGhpcy5udW1lcmljSW5wdXQudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bWVyaWNJbnB1dC53cml0ZVZhbHVlKHRoaXMuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlucHV0VmFsdWUgIT09IHRoaXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBhZ2UoaW5wdXRWYWx1ZSAtIDEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BhZ2VzID8gdGhpcy5jdXJyZW50UGFnZSA6IDA7XG4gICAgfVxuICAgIGdldCBoYXNQYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxQYWdlcyAhPT0gMDtcbiAgICB9XG4gICAgb25DaGFuZ2VzKHsgdG90YWwsIHNraXAsIHBhZ2VTaXplIH0pIHtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuUGFnZXJJbnB1dENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcGFnZXItaW5wdXQnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnay1wYWdlci1pbnB1dCc6IHRydWUsICdrLWxhYmVsJzogdHJ1ZX1cIj5cbiAgICAgICAge3t0ZXh0Rm9yKCdwYWdlclBhZ2UnKX19XG4gICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveFxuICAgICAgICAgICAgW3NwaW5uZXJzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtkZWNpbWFsc109XCIwXCJcbiAgICAgICAgICAgIGZvcm1hdD1cIm4wXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzUGFnZXNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRcIlxuICAgICAgICAgICAgW21pbl09XCJoYXNQYWdlcyA/IDEgOiAwXCJcbiAgICAgICAgICAgIFttYXhdPVwidG90YWxQYWdlc1wiXG4gICAgICAgICAgICBbYXV0b0NvcnJlY3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidGV4dEZvcigncGFnZXJQYWdlTnVtYmVySW5wdXRUaXRsZScpXCJcbiAgICAgICAgICAgIFtrZW5kb0V2ZW50c091dHNpZGVBbmd1bGFyXT1cIntcbiAgICAgICAgICAgICAgICBrZXlkb3duOiBoYW5kbGVLZXlEb3duLFxuICAgICAgICAgICAgICAgIGZvY3Vzb3V0OiBoYW5kbGVCbHVyXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICA8L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxuICAgICAgICB7e3RleHRGb3IoJ3BhZ2VyT2YnKX19IHt7dG90YWxQYWdlc319XG4gICAgIDwvc3Bhbj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhZ2VySW5wdXRDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBQYWdlckNvbnRleHRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5QYWdlcklucHV0Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIG51bWVyaWNJbnB1dDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbTnVtZXJpY1RleHRCb3hDb21wb25lbnQsXSB9XVxufTtcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYWNjZXNzLW1pc3NpbmctbWVtYmVyXG4vKipcbiAqIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHBhZ2UgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHBhZ2luZ19ncmlkICV9I3RvYy1wYWdlci10ZW1wbGF0ZXMpKS5cbiAqL1xuY2xhc3MgUGFnZXJJbmZvQ29tcG9uZW50IGV4dGVuZHMgUGFnZXJFbGVtZW50Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24sIGNkLCBwYWdlckNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIobG9jYWxpemF0aW9uLCBwYWdlckNvbnRleHQsIGNkKTtcbiAgICAgICAgdGhpcy5wYWdlckNvbnRleHQgPSBwYWdlckNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIFBhZ2VySW5mb0NvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBtYXhJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgUGFnZXJJbmZvQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRQYWdlVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWwgP1xuICAgICAgICAgICAgKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUgKyAxIDpcbiAgICAgICAgICAgIDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBQYWdlckluZm9Db21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgY2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uQ2hhbmdlcyh7IHRvdGFsLCBza2lwLCBwYWdlU2l6ZSB9KSB7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cblBhZ2VySW5mb0NvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcGFnZXItaW5mbycsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGB7e2N1cnJlbnRQYWdlVGV4dH19IC0ge3ttYXhJdGVtc319IHt7dGV4dEZvcigncGFnZXJPZicpfX0ge3t0b3RhbH19IHt7dGV4dEZvcigncGFnZXJJdGVtcycpfX1gXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhZ2VySW5mb0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sXG4gICAgeyB0eXBlOiBQYWdlckNvbnRleHRTZXJ2aWNlIH1cbl07XG5QYWdlckluZm9Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFtcImNsYXNzLmstcGFnZXItaW5mb1wiLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1sYWJlbFwiLF0gfV1cbn07XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFjY2Vzcy1taXNzaW5nLW1lbWJlclxuLyoqXG4gKiBEaXNwbGF5cyBhIGRyb3AtZG93biBsaXN0IGZvciB0aGUgcGFnZSBzaXplIHNlbGVjdGlvbiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHBhZ2luZ19ncmlkICV9I3RvYy1wYWdlci10ZW1wbGF0ZXMpKS5cbiAqL1xuY2xhc3MgUGFnZXJQYWdlU2l6ZXNDb21wb25lbnQgZXh0ZW5kcyBQYWdlckVsZW1lbnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbiwgY2QsIHBhZ2VyQ29udGV4dCkge1xuICAgICAgICBzdXBlcihsb2NhbGl6YXRpb24sIHBhZ2VyQ29udGV4dCwgY2QpO1xuICAgICAgICB0aGlzLnBhZ2VyQ29udGV4dCA9IHBhZ2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5fcGFnZVNpemVzID0gW107XG4gICAgfVxuICAgIGdldCBwYWdlU2l6ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBwYWdlIHNpemVzIGNvbGxlY3Rpb24uIENhbiBiZSBhbiBBcnJheSBvZiBudW1iZXJzIGFuZC9vciBQYWdlU2l6ZUl0ZW0gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHMtcHJldmlld1xuICAgICAqIF9AQ29tcG9uZW50KHtcbiAgICAgKiAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICogICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgICAgPGtlbmRvLWdyaWQgW2tlbmRvR3JpZEJpbmRpbmddPVwiZ3JpZERhdGFcIiBbaGVpZ2h0XT1cIjIwMFwiXG4gICAgICogICAgICAgICAgIFtwYWdlYWJsZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiPlxuICAgICAqICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvUGFnZXJUZW1wbGF0ZSBsZXQtdG90YWxQYWdlcz1cInRvdGFsUGFnZXNcIiBsZXQtY3VycmVudFBhZ2U9XCJjdXJyZW50UGFnZVwiPlxuICAgICAqICAgICAgICAgICAgICAgIDxrZW5kby1wYWdlci1wYWdlLXNpemVzIFtwYWdlU2l6ZXNdPVwicGFnZXNpemVzXCI+PC9rZW5kby1wYWdlci1wYWdlLXNpemVzPlxuICAgICAqICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICAgICAqICAgIGBcbiAgICAgKiB9KVxuICAgICAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gICAgICogICAgcHVibGljIGdyaWREYXRhOiBhbnlbXSA9IHByb2R1Y3RzO1xuICAgICAqICAgIHB1YmxpYyBwYWdlU2l6ZSA9IDI7XG4gICAgICogICAgcHVibGljIHBhZ2VzaXplcyA9IFt7dGV4dDogJ09uZScsIHZhbHVlOiAxfSwge3RleHQ6ICdUd28nLCB2YWx1ZTogMn0sIHt0ZXh0OiAnQWxsJywgdmFsdWUgOiAnYWxsJ31dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHByb2R1Y3RzID0gW3tcbiAgICAgKiAgICdQcm9kdWN0SUQnIDogMSxcbiAgICAgKiAgICdQcm9kdWN0TmFtZScgOiBcIkNoYWlcIixcbiAgICAgKiAgICdTdXBwbGllcklEJyA6IDEsXG4gICAgICogICAnQ2F0ZWdvcnlJRCcgOiAxLFxuICAgICAqICAgJ1F1YW50aXR5UGVyVW5pdCcgOiBcIjEwIGJveGVzIHggMjAgYmFnc1wiLFxuICAgICAqICAgJ1VuaXRQcmljZScgOiAxOC4wMDAwLFxuICAgICAqICAgJ1VuaXRzSW5TdG9jaycgOiAzOSxcbiAgICAgKiAgICdVbml0c09uT3JkZXInIDogMCxcbiAgICAgKiAgICdSZW9yZGVyTGV2ZWwnIDogMTAsXG4gICAgICogICAnRGlzY29udGludWVkJyA6IGZhbHNlXG4gICAgICpcbiAgICAgKiB9LCB7XG4gICAgICogICAnUHJvZHVjdElEJyA6IDIsXG4gICAgICogICAnUHJvZHVjdE5hbWUnIDogXCJDaGFuZ1wiLFxuICAgICAqICAgJ1N1cHBsaWVySUQnIDogMSxcbiAgICAgKiAgICdDYXRlZ29yeUlEJyA6IDEsXG4gICAgICogICAnUXVhbnRpdHlQZXJVbml0JyA6IFwiMjQgLSAxMiBveiBib3R0bGVzXCIsXG4gICAgICogICAnVW5pdFByaWNlJyA6IDE5LjAwMDAsXG4gICAgICogICAnVW5pdHNJblN0b2NrJyA6IDE3LFxuICAgICAqICAgJ1VuaXRzT25PcmRlcicgOiA0MCxcbiAgICAgKiAgICdSZW9yZGVyTGV2ZWwnIDogMjUsXG4gICAgICogICAnRGlzY29udGludWVkJyA6IGZhbHNlXG4gICAgICogfSwge1xuICAgICAqICAgJ1Byb2R1Y3RJRCcgOiAzLFxuICAgICAqICAgJ1Byb2R1Y3ROYW1lJyA6IFwiQW5pc2VlZCBTeXJ1cFwiLFxuICAgICAqICAgJ1N1cHBsaWVySUQnIDogMSxcbiAgICAgKiAgICdDYXRlZ29yeUlEJyA6IDIsXG4gICAgICogICAnUXVhbnRpdHlQZXJVbml0JyA6IFwiMTIgLSA1NTAgbWwgYm90dGxlc1wiLFxuICAgICAqICAgJ1VuaXRQcmljZScgOiAxMC4wMDAwLFxuICAgICAqICAgJ1VuaXRzSW5TdG9jaycgOiAxMyxcbiAgICAgKiAgICdVbml0c09uT3JkZXInIDogNzAsXG4gICAgICogICAnUmVvcmRlckxldmVsJyA6IDI1LFxuICAgICAqICAgJ0Rpc2NvbnRpbnVlZCcgOiBmYWxzZVxuICAgICAqIH0sIHtcbiAgICAgKiAgICdQcm9kdWN0SUQnIDogNCxcbiAgICAgKiAgICdQcm9kdWN0TmFtZScgOiBcIkNoZWYgQW50b25cXCdzIENhanVuIFNlYXNvbmluZ1wiLFxuICAgICAqICAgJ1N1cHBsaWVySUQnIDogMixcbiAgICAgKiAgJ0NhdGVnb3J5SUQnIDogMixcbiAgICAgKiAgICdRdWFudGl0eVBlclVuaXQnIDogXCI0OCAtIDYgb3ogamFyc1wiLFxuICAgICAqICAgJ1VuaXRQcmljZScgOiAyMi4wMDAwLFxuICAgICAqICAgJ1VuaXRzSW5TdG9jaycgOiA1MyxcbiAgICAgKiAgICdVbml0c09uT3JkZXInIDogMCxcbiAgICAgKiAgICdSZW9yZGVyTGV2ZWwnIDogMCxcbiAgICAgKiAgICdEaXNjb250aW51ZWQnIDogZmFsc2VcbiAgICAgKiB9LCB7XG4gICAgICogICAnUHJvZHVjdElEJyA6IDUsXG4gICAgICogICAnUHJvZHVjdE5hbWUnIDogXCJDaGVmIEFudG9uXFwncyBHdW1ibyBNaXhcIixcbiAgICAgKiAgICdTdXBwbGllcklEJyA6IDIsXG4gICAgICogICAnQ2F0ZWdvcnlJRCcgOiAyLFxuICAgICAqICAgJ1F1YW50aXR5UGVyVW5pdCcgOiBcIjM2IGJveGVzXCIsXG4gICAgICogICAnVW5pdFByaWNlJyA6IDIxLjM1MDAsXG4gICAgICogICAnVW5pdHNJblN0b2NrJyA6IDAsXG4gICAgICogICAnVW5pdHNPbk9yZGVyJyA6IDAsXG4gICAgICogICAnUmVvcmRlckxldmVsJyA6IDAsXG4gICAgICogICAnRGlzY29udGludWVkJyA6IHRydWVcbiAgICAgKiB9LCB7XG4gICAgICogICAnUHJvZHVjdElEJyA6IDYsXG4gICAgICogICAnUHJvZHVjdE5hbWUnIDogXCJHcmFuZG1hXFwncyBCb3lzZW5iZXJyeSBTcHJlYWRcIixcbiAgICAgKiAgICdTdXBwbGllcklEJyA6IDMsXG4gICAgICogICAnQ2F0ZWdvcnlJRCcgOiAyLFxuICAgICAqICAgJ1F1YW50aXR5UGVyVW5pdCcgOiBcIjEyIC0gOCBveiBqYXJzXCIsXG4gICAgICogICAnVW5pdFByaWNlJyA6IDI1LjAwMDAsXG4gICAgICogICAnVW5pdHNJblN0b2NrJyA6IDEyMCxcbiAgICAgKiAgICdVbml0c09uT3JkZXInIDogMCxcbiAgICAgKiAgICdSZW9yZGVyTGV2ZWwnIDogMjUsXG4gICAgICogICAnRGlzY29udGludWVkJyA6IGZhbHNlXG4gICAgICogfV07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IHBhZ2VTaXplcyhwYWdlU2l6ZXMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEl0ZW1zID0gW107XG4gICAgICAgIHBhZ2VTaXplcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaXRlbS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9wYWdlU2l6ZXMgPSBub3JtYWxpemVkSXRlbXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHNob3dJbml0aWFsUGFnZVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VTaXplc1xuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWwgPT09IE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwYWdlU2l6ZUNoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgdGhpcy5wYWdlckNvbnRleHQuY2hhbmdlUGFnZVNpemUodGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXRWYWx1ZShwYWdlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFnZS52YWx1ZSA9PT0gJ251bWJlcicgPyBwYWdlLnZhbHVlIDogdGhpcy50b3RhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldFNlbGVjdGVkU3RhdGUocGFnZSkge1xuICAgICAgICBpZiAodHlwZW9mIHBhZ2UudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFnZS52YWx1ZSA9PT0gdGhpcy5wYWdlU2l6ZSA/IHRydWUgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZVNpemUgPT09IHRoaXMudG90YWw7XG4gICAgfVxuICAgIG9uQ2hhbmdlcyh7IHRvdGFsLCBza2lwLCBwYWdlU2l6ZSB9KSB7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHR5cGVvZiBwYWdlU2l6ZSA9PT0gJ251bWJlcicgPyBwYWdlU2l6ZSA6IHRoaXMudG90YWw7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuUGFnZXJQYWdlU2l6ZXNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXBhZ2VyLXBhZ2Utc2l6ZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxzZWxlY3QgI3NlbGVjdFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJwYWdlU2l6ZUNoYW5nZShzZWxlY3QudmFsdWUpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dEZvcigncGFnZXJJdGVtc1BlclBhZ2UnKVwiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInNob3dJbml0aWFsUGFnZVNpemVcIiBbdmFsdWVdPVwicGFnZVNpemVcIj57e3BhZ2VTaXplfX08L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZVNpemVzXCIgW3ZhbHVlXT1cImdldFZhbHVlKHBhZ2UpXCIgW3NlbGVjdGVkXT1cImdldFNlbGVjdGVkU3RhdGUocGFnZSlcIj5cbiAgICAgICAgICAgICAgICB7e3BhZ2VbJ3RleHQnXX19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIHt7IHRleHRGb3IoJ3BhZ2VySXRlbXNQZXJQYWdlJykgfX1cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhZ2VyUGFnZVNpemVzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IFBhZ2VyQ29udGV4dFNlcnZpY2UgfVxuXTtcblBhZ2VyUGFnZVNpemVzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHBhZ2VTaXplczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1wYWdlci1zaXplcycsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstbGFiZWwnLF0gfV1cbn07XG5cbmNvbnN0IGltcG9ydGVkTW9kdWxlcyQxID0gW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBJbnB1dHNNb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlXG5dO1xuY29uc3QgSU5URVJOQUxfQ09NUE9ORU5UUyQxID0gW1xuICAgIFBhZ2VyQ29tcG9uZW50LFxuICAgIFBhZ2VyUHJldkJ1dHRvbnNDb21wb25lbnQsXG4gICAgUGFnZXJOZXh0QnV0dG9uc0NvbXBvbmVudCxcbiAgICBQYWdlck51bWVyaWNCdXR0b25zQ29tcG9uZW50LFxuICAgIFBhZ2VySW5wdXRDb21wb25lbnQsXG4gICAgUGFnZXJJbmZvQ29tcG9uZW50LFxuICAgIFBhZ2VyUGFnZVNpemVzQ29tcG9uZW50LFxuICAgIFBhZ2VyVGVtcGxhdGVEaXJlY3RpdmVcbl07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUGFnZXJNb2R1bGUge1xuICAgIHN0YXRpYyBleHBvcnRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgUGFnZXJDb21wb25lbnQsXG4gICAgICAgICAgICBQYWdlclByZXZCdXR0b25zQ29tcG9uZW50LFxuICAgICAgICAgICAgUGFnZXJOZXh0QnV0dG9uc0NvbXBvbmVudCxcbiAgICAgICAgICAgIFBhZ2VyTnVtZXJpY0J1dHRvbnNDb21wb25lbnQsXG4gICAgICAgICAgICBQYWdlcklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgUGFnZXJJbmZvQ29tcG9uZW50LFxuICAgICAgICAgICAgUGFnZXJQYWdlU2l6ZXNDb21wb25lbnQsXG4gICAgICAgICAgICBQYWdlclRlbXBsYXRlRGlyZWN0aXZlXG4gICAgICAgIF07XG4gICAgfVxufVxuUGFnZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0lOVEVSTkFMX0NPTVBPTkVOVFMkMV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW0lOVEVSTkFMX0NPTVBPTkVOVFMkMV0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogWy4uLmltcG9ydGVkTW9kdWxlcyQxXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgR3JvdXBIZWFkZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGdyb3Vwc1NlcnZpY2UsIGdyb3VwSW5mb1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlID0gZ3JvdXBzU2VydmljZTtcbiAgICAgICAgdGhpcy5ncm91cEluZm9TZXJ2aWNlID0gZ3JvdXBJbmZvU2VydmljZTtcbiAgICAgICAgdGhpcy5za2lwR3JvdXBEZWNvcmF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzRGV0YWlscyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvdGFsQ29sdW1uc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXTtcbiAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCBncm91cEl0ZW1DbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5ncm91cHNTZXJ2aWNlLmlzRXhwYW5kZWQodGhpcy5pdGVtLmluZGV4KTtcbiAgICB9XG4gICAgcHJlZml4R3JvdXBDZWxsKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheShpdGVtLmxldmVsKTtcbiAgICB9XG4gICAgdG9nZ2xlR3JvdXAoaXRlbSkge1xuICAgICAgICB0aGlzLmdyb3Vwc1NlcnZpY2UudG9nZ2xlUm93KGl0ZW0uaW5kZXgsIGl0ZW0uZGF0YSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ3JvdXBTcGFuKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZ3JvdXBDb3VudCA9ICh0aGlzLmdyb3VwcyB8fCBbXSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBkZXRhaWxPZmZzZXQgPSB0aGlzLmhhc0RldGFpbHMgPyAxIDogMDtcbiAgICAgICAgaWYgKHRoaXMuaGFzR3JvdXBIZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cENvdW50ICsgMSArIGRldGFpbE9mZnNldCAtIGl0ZW0ubGV2ZWw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbHVtbkNvdW50ID0gY29sdW1uc1NwYW4odGhpcy5jb2x1bW5zKTtcbiAgICAgICAgaWYgKHRoaXMuc2tpcEdyb3VwRGVjb3JhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cENvdW50ICsgY29sdW1uQ291bnQgKyBkZXRhaWxPZmZzZXQgLSBpdGVtLmxldmVsO1xuICAgIH1cbiAgICBsb2dpY2FsQ29sU3BhbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcEdyb3VwRGVjb3JhdGlvbiA/IDEgOiB0aGlzLnRvdGFsQ29sdW1uc0NvdW50O1xuICAgIH1cbiAgICBhcmlhUm9sZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2tpcEdyb3VwRGVjb3JhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICdwcmVzZW50YXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZ3JpZGNlbGwnO1xuICAgIH1cbiAgICBmb3JtYXRGb3JHcm91cChpdGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwSW5mb1NlcnZpY2UuZm9ybWF0Rm9yR3JvdXAoaXRlbSk7XG4gICAgfVxuICAgIGdyb3VwVGl0bGUoaXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cEluZm9TZXJ2aWNlLmdyb3VwVGl0bGUoaXRlbSk7XG4gICAgfVxuICAgIGdyb3VwSGVhZGVyVGVtcGxhdGUoaXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cEluZm9TZXJ2aWNlLmdyb3VwSGVhZGVyVGVtcGxhdGUoaXRlbSk7XG4gICAgfVxufVxuR3JvdXBIZWFkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRHcm91cEhlYWRlcl0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2tpcEdyb3VwRGVjb3JhdGlvblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiay1ncm91cC1jZWxsXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZyBvZiBwcmVmaXhHcm91cENlbGwoaXRlbSlcIj48L3RkPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJncm91cFNwYW4oaXRlbSlcIiAqbmdJZj1cIiEoc2tpcEdyb3VwRGVjb3JhdGlvbiAmJiBoYXNHcm91cEhlYWRlckNvbHVtbilcIlxuICAgICAgICAgICAgW2F0dHIucm9sZV09XCJhcmlhUm9sZSgpXCJcbiAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxuICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGxcbiAgICAgICAgICAgIFtsb2dpY2FsUm93SW5kZXhdPVwibG9naWNhbFJvd0luZGV4XCJcbiAgICAgICAgICAgIFtsb2dpY2FsQ29sSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICBbbG9naWNhbFNsYXZlQ2VsbF09XCJza2lwR3JvdXBEZWNvcmF0aW9uXCJcbiAgICAgICAgICAgIFtncm91cEl0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICBbY29sU3Bhbl09XCJsb2dpY2FsQ29sU3BhbigpXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImstcmVzZXRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNraXBHcm91cERlY29yYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cInRvZ2dsZUdyb3VwKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2staS1jb2xsYXBzZSc6IGlzRXhwYW5kZWQsICdrLWktZXhwYW5kJzogIWlzRXhwYW5kZWQgfVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWdyb3VwSGVhZGVyVGVtcGxhdGUoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3tncm91cFRpdGxlKGl0ZW0pfX06IHt7aXRlbS5kYXRhIHwgdmFsdWVPZjpcInZhbHVlXCI6IGZvcm1hdEZvckdyb3VwKGl0ZW0pfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZjogZ3JvdXBIZWFkZXJUZW1wbGF0ZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cDogaXRlbS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXM6IGl0ZW0uZGF0YT8uYWdncmVnYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5kYXRhPy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogaXRlbS5kYXRhPy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZDogaXNFeHBhbmRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGl0ZW0uZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzR3JvdXBIZWFkZXJDb2x1bW5cIj5cbiAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGdyb3VwSGVhZGVyQ29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgIFtsb2dpY2FsUm93SW5kZXhdPVwibG9naWNhbFJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbENvbEluZGV4XT1cImluZGV4ICsgMVwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxTbGF2ZUNlbGxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtncm91cEl0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiMVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5ncm91cEhlYWRlckNvbHVtblRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IGl0ZW0uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXM6IGl0ZW0uZGF0YT8uYWdncmVnYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLmRhdGE/LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGl0ZW0uZGF0YT8uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXRlbS5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkdyb3VwSGVhZGVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogR3JvdXBzU2VydmljZSB9LFxuICAgIHsgdHlwZTogR3JvdXBJbmZvU2VydmljZSB9XG5dO1xuR3JvdXBIZWFkZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgcm93SW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvZ2ljYWxSb3dJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2tpcEdyb3VwRGVjb3JhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGFzRGV0YWlsczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdG90YWxDb2x1bW5zQ291bnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGhhc0dyb3VwSGVhZGVyQ29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cEhlYWRlckNvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGdyb3VwczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBJdGVtQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JvdXBpbmctcm93JyxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRHJvcFRhcmdldERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgc2VydmljZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICAgICAgdGhpcy5lbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5sZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5kcm9wID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlcnZpY2UuYWRkKHRoaXMpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5zZXJ2aWNlLmNoYW5nZXMucGlwZShmaWx0ZXIoKHsgdGFyZ2V0IH0pID0+IHRhcmdldCA9PT0gdGhpcykpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNoYW5nZXMucGlwZShmaWx0ZXIoKHsgdHlwZSB9KSA9PiB0eXBlID09PSAnbGVhdmUnKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxlYXZlLm5leHQodGhpcy5ldmVudEFyZ3MoZSkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbmdlcy5waXBlKGZpbHRlcigoeyB0eXBlIH0pID0+IHR5cGUgPT09ICdlbnRlcicpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXIubmV4dCh0aGlzLmV2ZW50QXJncyhlKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGFuZ2VzLnBpcGUoZmlsdGVyKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ2Ryb3AnKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyb3AubmV4dCh0aGlzLmV2ZW50QXJncyhlKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV2ZW50QXJncyhlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMsXG4gICAgICAgICAgICBtb3VzZUV2ZW50OiBlLm1vdXNlRXZlbnQsXG4gICAgICAgICAgICBkcmFnZ2FibGU6IGUuZHJhZ2dhYmxlXG4gICAgICAgIH07XG4gICAgfVxufVxuRHJvcFRhcmdldERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJvcFRhcmdldF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRyb3BUYXJnZXREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBEcmFnQW5kRHJvcFNlcnZpY2UgfVxuXTtcbkRyb3BUYXJnZXREaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29udGV4dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZW50ZXI6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBsZWF2ZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGRyb3A6IFt7IHR5cGU6IE91dHB1dCB9XVxufTtcblxuY29uc3Qgd2l0aG91dEZpZWxkID0gKHsgZmllbGQgfSkgPT4gaXNOdWxsT3JFbXB0eVN0cmluZyhmaWVsZCk7XG5jb25zdCBhbHJlYWR5R3JvdXBlZCA9ICh7IGdyb3VwcywgZmllbGQgfSkgPT4gZ3JvdXBzLnNvbWUoZ3JvdXAgPT4gZ3JvdXAuZmllbGQgPT09IGZpZWxkKTtcbmNvbnN0IG92ZXJTYW1lVGFyZ2V0ID0gKHsgdGFyZ2V0LCBmaWVsZCB9KSA9PiB0YXJnZXQuZmllbGQgPT09IGZpZWxkO1xuY29uc3Qgb3Zlckxhc3RUYXJnZXQgPSAoeyB0YXJnZXQgfSkgPT4gdGFyZ2V0Lmxhc3RUYXJnZXQ7XG5jb25zdCBpc0xhc3RHcm91cCA9ICh7IGdyb3VwcywgZmllbGQgfSkgPT4gZ3JvdXBzLm1hcChncm91cCA9PiBncm91cC5maWVsZCkuaW5kZXhPZihmaWVsZCkgPT09IGdyb3Vwcy5sZW5ndGggLSAxO1xuY29uc3QgaXNOb3RHcm91cGFibGUgPSAoZ3JvdXBzU2VydmljZSkgPT4gKHsgZmllbGQgfSkgPT4gIWdyb3Vwc1NlcnZpY2UuaXNHcm91cGFibGUoZmllbGQpO1xuY29uc3QgY29sdW1uUnVsZXMgPSAoZ3JvdXBTZXJ2aWNlKSA9PiBvcih3aXRob3V0RmllbGQsIGFscmVhZHlHcm91cGVkLCBpc05vdEdyb3VwYWJsZShncm91cFNlcnZpY2UpKTtcbmNvbnN0IGluZGljYXRvclJ1bGVzID0gb3Iob3ZlclNhbWVUYXJnZXQsIGFuZChvdmVyTGFzdFRhcmdldCwgaXNMYXN0R3JvdXApKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBHcm91cFBhbmVsQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihoaW50LCBjdWUsIGdyb3VwSW5mb1NlcnZpY2UsIGxvY2FsaXphdGlvbiwgY2QpIHtcbiAgICAgICAgdGhpcy5oaW50ID0gaGludDtcbiAgICAgICAgdGhpcy5jdWUgPSBjdWU7XG4gICAgICAgIHRoaXMuZ3JvdXBJbmZvU2VydmljZSA9IGdyb3VwSW5mb1NlcnZpY2U7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLmNkID0gY2Q7XG4gICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRzID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLmdyb3VwVGl0bGVzID0gW107XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICBnZXQgZ3JvdXBIZWFkZXJDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldCB0ZXh0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW1wdHlUZXh0ID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbXB0eVRleHQgPyB0aGlzLmVtcHR5VGV4dCA6IHRoaXMubG9jYWxpemF0aW9uLmdldCgnZ3JvdXBQYW5lbEVtcHR5Jyk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKG9ic2VydmUodGhpcy5kcm9wVGFyZ2V0cylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5hdHRhY2hUYXJnZXRzLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmxvY2FsaXphdGlvbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkLm1hcmtGb3JDaGVjaygpKSk7XG4gICAgfVxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRpdGxlcyA9IHRoaXMuZ3JvdXBzLm1hcChncm91cCA9PiB0aGlzLmdyb3VwSW5mb1NlcnZpY2UuZ3JvdXBUaXRsZShncm91cCkpO1xuICAgICAgICBpZiAoY3VycmVudFRpdGxlcy5sZW5ndGggIT09IHRoaXMuZ3JvdXBUaXRsZXMubGVuZ3RoIHx8IGN1cnJlbnRUaXRsZXMuc29tZSgoY3VycmVudCwgaWR4KSA9PiBjdXJyZW50ICE9PSB0aGlzLmdyb3VwVGl0bGVzW2lkeF0pKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwVGl0bGVzID0gY3VycmVudFRpdGxlcztcbiAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YXJnZXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlyZWN0aW9uQ2hhbmdlKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncm91cHMuZmluZEluZGV4KHggPT4geC5maWVsZCA9PT0gZ3JvdXAuZmllbGQpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBbLi4udGhpcy5ncm91cHMuc2xpY2UoMCwgaW5kZXgpLCBncm91cCwgLi4udGhpcy5ncm91cHMuc2xpY2UoaW5kZXggKyAxKV07XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoZ3JvdXBzKTtcbiAgICB9XG4gICAgaW5zZXJ0KGZpZWxkLCBpbmRleCkge1xuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3Vwcy5maWx0ZXIoeCA9PiB4LmZpZWxkICE9PSBmaWVsZCk7XG4gICAgICAgIGlmIChncm91cHMubGVuZ3RoIHx8IHRoaXMuZ3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChbLi4uZ3JvdXBzLnNsaWNlKDAsIGluZGV4KSwgeyBmaWVsZDogZmllbGQgfSwgLi4uZ3JvdXBzLnNsaWNlKGluZGV4KV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShncm91cCkge1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuZ3JvdXBzLmZpbHRlcih4ID0+IHguZmllbGQgIT09IGdyb3VwLmZpZWxkKSk7XG4gICAgfVxuICAgIGNhbkRyb3AoZHJhZ2dhYmxlLCB0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgaXNJbmRpY2F0b3IgPSBkcmFnZ2FibGUudHlwZSA9PT0gJ2dyb3VwSW5kaWNhdG9yJztcbiAgICAgICAgY29uc3QgcnVsZXMgPSBpc0luZGljYXRvclxuICAgICAgICAgICAgPyBpbmRpY2F0b3JSdWxlc1xuICAgICAgICAgICAgOiBjb2x1bW5SdWxlcyh0aGlzLmdyb3VwSW5mb1NlcnZpY2UpO1xuICAgICAgICByZXR1cm4gIXJ1bGVzKHtcbiAgICAgICAgICAgIGZpZWxkOiBkcmFnZ2FibGUuZmllbGQsXG4gICAgICAgICAgICBncm91cHM6IHRoaXMuZ3JvdXBzLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhdHRhY2hUYXJnZXRzKCkge1xuICAgICAgICBpZiAodGhpcy50YXJnZXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YXJnZXRTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIGNvbnN0IGVudGVyU3RyZWFtID0gdGhpcy5kcm9wVGFyZ2V0c1xuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCB0YXJnZXQpID0+IG1lcmdlKGFjYywgdGFyZ2V0LmVudGVyKSwgZnJvbShbXSkpO1xuICAgICAgICBjb25zdCBsZWF2ZVN0cmVhbSA9IHRoaXMuZHJvcFRhcmdldHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgdGFyZ2V0KSA9PiBtZXJnZShhY2MsIHRhcmdldC5sZWF2ZSksIGZyb20oW10pKTtcbiAgICAgICAgY29uc3QgZHJvcFN0cmVhbSA9IHRoaXMuZHJvcFRhcmdldHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgdGFyZ2V0KSA9PiBtZXJnZShhY2MsIHRhcmdldC5kcm9wKSwgZnJvbShbXSkpO1xuICAgICAgICB0aGlzLnRhcmdldFN1YnNjcmlwdGlvbi5hZGQoZW50ZXJTdHJlYW0ucGlwZSh0YXAoXyA9PiB0aGlzLmhpbnQucmVtb3ZlTG9jaygpKSwgZmlsdGVyKCh7IGRyYWdnYWJsZSwgdGFyZ2V0IH0pID0+IHRoaXMuY2FuRHJvcChkcmFnZ2FibGUuY29udGV4dCwgdGFyZ2V0LmNvbnRleHQpKSwgdGFwKHRoaXMuZW50ZXIuYmluZCh0aGlzKSksIHN3aXRjaE1hcFRvKGRyb3BTdHJlYW0ucGlwZSh0YWtlVW50aWwobGVhdmVTdHJlYW0ucGlwZSh0YXAodGhpcy5sZWF2ZS5iaW5kKHRoaXMpKSkpKSkpLnN1YnNjcmliZSh0aGlzLmRyb3AuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICBlbnRlcih7IGRyYWdnYWJsZSwgdGFyZ2V0IH0pIHtcbiAgICAgICAgdGhpcy5oaW50LmVuYWJsZSgpO1xuICAgICAgICBsZXQgYmVmb3JlID0gdGFyZ2V0LmNvbnRleHQubGFzdFRhcmdldCB8fCBpc1RhcmdldEJlZm9yZShkcmFnZ2FibGUuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0YXJnZXQuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxpemF0aW9uLnJ0bCkge1xuICAgICAgICAgICAgYmVmb3JlID0gIWJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1ZS5wb3NpdGlvbihwb3NpdGlvbih0YXJnZXQuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBiZWZvcmUpKTtcbiAgICB9XG4gICAgbGVhdmUoKSB7XG4gICAgICAgIHRoaXMuaGludC5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuY3VlLmhpZGUoKTtcbiAgICB9XG4gICAgZHJvcCh7IHRhcmdldCwgZHJhZ2dhYmxlIH0pIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBkcmFnZ2FibGUuY29udGV4dC5maWVsZDtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRyb3BUYXJnZXRzLnRvQXJyYXkoKS5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0KGZpZWxkLCBpbmRleCk7XG4gICAgfVxufVxuR3JvdXBQYW5lbENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1ncm91cC1wYW5lbCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdyb3Vwcy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstaW5kaWNhdG9yLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgW2NvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICBsYXN0VGFyZ2V0OiB0cnVlXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAga2VuZG9Ecm9wVGFyZ2V0PlxuICAgICAgICAgICAgICAgIHt7IHRleHQgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHM7IGxldCBpbmRleCA9IGluZGV4O1wiXG4gICAgICAgICAgICBjbGFzcz1cImstaW5kaWNhdG9yLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbY29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgZmllbGQ6IGdyb3VwLmZpZWxkXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIGtlbmRvRHJvcFRhcmdldD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBrZW5kb0RyYWdnYWJsZUNvbHVtblxuICAgICAgICAgICAgICAgIFtlbmFibGVEcmFnXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGdyb3VwLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZ3JvdXBJbmRpY2F0b3InLFxuICAgICAgICAgICAgICAgICAgICBoaW50OiAgZ3JvdXBUaXRsZXNbaW5kZXhdXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAga2VuZG9Hcm91cEluZGljYXRvclxuICAgICAgICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBUaXRsZV09XCJncm91cFRpdGxlc1tpbmRleF1cIlxuICAgICAgICAgICAgICAgIChkaXJlY3Rpb25DaGFuZ2UpPVwiZGlyZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImstaW5kaWNhdG9yLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAqbmdJZj1cImdyb3Vwcy5sZW5ndGggIT09IDBcIlxuICAgICAgICAgICAgW2NvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIGxhc3RUYXJnZXQ6IHRydWVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAga2VuZG9Ecm9wVGFyZ2V0PiZuYnNwOzwvZGl2PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuR3JvdXBQYW5lbENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IERyYWdIaW50U2VydmljZSB9LFxuICAgIHsgdHlwZTogRHJvcEN1ZVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEdyb3VwSW5mb1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5Hcm91cFBhbmVsQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGdyb3VwSGVhZGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbXCJjbGFzcy5rLWdyb3VwaW5nLWhlYWRlclwiLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1ncm91cGluZy1oZWFkZXItZmxleFwiLF0gfV0sXG4gICAgdGV4dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkcm9wVGFyZ2V0czogW3sgdHlwZTogVmlld0NoaWxkcmVuLCBhcmdzOiBbRHJvcFRhcmdldERpcmVjdGl2ZSxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgR3JvdXBJbmRpY2F0b3JDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRpcmVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5yZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGdldCBncm91cEluZGljYXRvckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGRpcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuZGlyID8gdGhpcy5ncm91cC5kaXIgOiBcImFzY1wiO1xuICAgIH1cbiAgICB0b2dnbGVEaXJlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgZGlyOiB0aGlzLmRpciA9PT0gXCJhc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIixcbiAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdyb3VwLmZpZWxkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJlbW92ZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlLmVtaXQoe1xuICAgICAgICAgICAgZGlyOiB0aGlzLmdyb3VwLmRpcixcbiAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdyb3VwLmZpZWxkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuR3JvdXBJbmRpY2F0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyb3VwSW5kaWNhdG9yXScsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImstbGlua1wiIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwidG9nZ2xlRGlyZWN0aW9uKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1pLXNvcnQtYXNjLXNtXT1cImRpciA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLWktc29ydC1kZXNjLXNtXT1cImRpciA9PT0gJ2Rlc2MnXCI+PC9zcGFuPlxuICAgICAgICAgICAge3tncm91cFRpdGxlfX08L2E+XG4gICAgICAgIDxhIGNsYXNzPVwiay1idXR0b24gay1idXR0b24taWNvbiBrLWJhcmVcIiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cInJlbW92ZURlc2NyaXB0b3IoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWdyb3VwLWRlbGV0ZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkdyb3VwSW5kaWNhdG9yQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGRpcmVjdGlvbkNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHJlbW92ZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGdyb3VwOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cFRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cEluZGljYXRvckNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1ncm91cC1pbmRpY2F0b3JcIixdIH1dXG59O1xuXG4vLyBUT0RPXG4vLyB0c2xpbnQ6ZGlzYWJsZTpyeGpzLW5vLXVuc2FmZS10YWtldW50aWxcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBwcmV2ZW50T25EYmxDbGljayA9IHJlbGVhc2UgPT4gbW91c2VEb3duID0+IG9mKG1vdXNlRG93bikucGlwZShkZWxheSgxNTApLCB0YWtlVW50aWwocmVsZWFzZSkpO1xuY29uc3QgaGFzQ2xhc3MgPSBjbGFzc05hbWUgPT4gZWwgPT4gbmV3IFJlZ0V4cChgKF58ICkke2NsYXNzTmFtZX0oIHwkKWApLnRlc3QoZWwuY2xhc3NOYW1lKTtcbmNvbnN0IGlzRGVsZXRlQnV0dG9uID0gb3IoaGFzQ2xhc3MoXCJrLWktZ3JvdXAtZGVsZXRlXCIpLCBoYXNDbGFzcyhcImstYnV0dG9uLWljb25cIikpO1xuY29uc3QgaXNTb3J0SWNvbiA9IG9yKGhhc0NsYXNzKFwiay1pLXNvcnQtYXNjLXNtXCIpLCBoYXNDbGFzcyhcImstaS1zb3J0LWRlc2Mtc21cIikpO1xuY29uc3Qgc2tpcEJ1dHRvbnMgPSBhbmQobm90KGlzRGVsZXRlQnV0dG9uKSwgbm90KGlzU29ydEljb24pLCBub3QoaXNGb2N1c2FibGVXaXRoVGFiS2V5KSwgbm90KG1hdGNoZXNOb2RlTmFtZShcImxhYmVsXCIpKSk7XG5jb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSAoeyBjbGllbnRYLCBjbGllbnRZIH0pID0+IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG5jb25zdCBoaWRlVGhlblNob3cgPSAoZWxlbWVudCwgY29udCkgPT4ge1xuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCByZXN1bHQgPSBjb250KCk7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEcmFnZ2FibGVDb2x1bW5EaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSwgZWxlbWVudCwgem9uZSwgc2VydmljZSwgaGludCwgY3VlLCBuYXYsIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICB0aGlzLmhpbnQgPSBoaW50O1xuICAgICAgICB0aGlzLmN1ZSA9IGN1ZTtcbiAgICAgICAgdGhpcy5uYXYgPSBuYXY7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0ge307XG4gICAgICAgIHRoaXMuZHJhZyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICBzZXQgZW5hYmxlRHJhZyhlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlVG91Y2hBY3Rpb24oKTtcbiAgICB9XG4gICAgZ2V0IGhvc3RDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZDtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZHJhZ2dhYmxlLmtlbmRvUHJlc3MucGlwZShmaWx0ZXIoXyA9PiB0aGlzLmVuYWJsZWQpLCBmaWx0ZXIoKHsgb3JpZ2luYWxFdmVudDogeyB0YXJnZXQgfSB9KSA9PiB0YXJnZXQgPT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IHNraXBCdXR0b25zKHRhcmdldCkpLCB0YXAoKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICAgICAgICBpZiAoIWUuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmF2Lm5hdmlnYXRlVG8ob3JpZ2luYWxFdmVudC50YXJnZXQpO1xuICAgICAgICB9KSwgc3dpdGNoTWFwKHByZXZlbnRPbkRibENsaWNrKHRoaXMuZHJhZ2dhYmxlLmtlbmRvUmVsZWFzZSkpLCB0YXAoZG93biA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpbnQuY3JlYXRlKGRvd24sIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRleHQuaGludCk7XG4gICAgICAgICAgICB0aGlzLmN1ZS5jcmVhdGUoKTtcbiAgICAgICAgfSksIHN3aXRjaE1hcChkb3duID0+IHRoaXMuZHJhZ2dhYmxlLmtlbmRvRHJhZy5waXBlKHRhcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgdGFwKHRoaXMuaGludC5hdHRhY2goKSksIHRhcCh0aGlzLmN1ZS5hdHRhY2goKSksIHRha2VVbnRpbCh0aGlzLmRyYWdnYWJsZS5rZW5kb1JlbGVhc2UpLCBtYXAobW92ZSA9PiAoeyBtb3ZlLCBkb3duIH0pKSkpLCB0YXAodGhpcy5wZXJmb3JtRHJhZy5iaW5kKHRoaXMpKSwgc3dpdGNoTWFwVG8odGhpcy5kcmFnZ2FibGUua2VuZG9SZWxlYXNlKSkuc3Vic2NyaWJlKHRoaXMuZHJvcC5iaW5kKHRoaXMpKSkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJvcCh1cEV2ZW50KSB7XG4gICAgICAgIHRoaXMuaGludC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5jdWUucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5ub3RpZnlEcm9wKHRoaXMsIHVwRXZlbnQpO1xuICAgIH1cbiAgICBwZXJmb3JtRHJhZyh7IG1vdmUgfSkge1xuICAgICAgICB0aGlzLmhpbnQubW92ZShtb3ZlKTtcbiAgICAgICAgY29uc3QgY3Vyc29yRWxlbWVudCA9IHRoaXMuZWxlbWVudFVuZGVyQ3Vyc29yKG1vdmUpO1xuICAgICAgICBpZiAoY3Vyc29yRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm5vdGlmeURyYWcodGhpcywgY3Vyc29yRWxlbWVudCwgbW92ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnLmVtaXQoe1xuICAgICAgICAgICAgZHJhZ2dhYmxlOiB0aGlzLFxuICAgICAgICAgICAgbW91c2VFdmVudDogbW92ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxlbWVudFVuZGVyQ3Vyc29yKG1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5oaW50LmhpZGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IGVsZW1lbnRVbmRlckN1cnNvcihtb3VzZUV2ZW50KTtcbiAgICAgICAgaWYgKHRhcmdldCAmJiAvay1ncm91cGluZy1kcm9wY2x1ZS8udGVzdCh0YXJnZXQuY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gaGlkZVRoZW5TaG93KHRhcmdldCwgZWxlbWVudFVuZGVyQ3Vyc29yLmJpbmQodGhpcywgbW91c2VFdmVudCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGludC5zaG93KCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHVwZGF0ZVRvdWNoQWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0b3VjaC1hY3Rpb24nLCB0aGlzLmVuYWJsZWQgPyAnbm9uZScgOiAnJyk7XG4gICAgfVxufVxuRHJhZ2dhYmxlQ29sdW1uRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9EcmFnZ2FibGVDb2x1bW5dJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmFnZ2FibGVDb2x1bW5EaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEcmFnZ2FibGVEaXJlY3RpdmUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfV0gfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogRHJhZ0FuZERyb3BTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEcmFnSGludFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IERyb3BDdWVTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOYXZpZ2F0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH1cbl07XG5EcmFnZ2FibGVDb2x1bW5EaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29udGV4dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZW5hYmxlRHJhZzogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZHJhZzogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1ncmlkLWRyYWdnYWJsZS1oZWFkZXInLF0gfV1cbn07XG5cbmNvbnN0IGV4cG9ydGVkID0gW1xuICAgIERyYWdnYWJsZUNvbHVtbkRpcmVjdGl2ZSxcbiAgICBEcm9wVGFyZ2V0RGlyZWN0aXZlXG5dO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERyYWdBbmREcm9wTW9kdWxlIHtcbn1cbkRyYWdBbmREcm9wTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtleHBvcnRlZF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG5jb25zdCBleHBvcnRlZE1vZHVsZXMkMSA9IFtcbiAgICBHcm91cEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgR3JvdXBGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBHcm91cEhlYWRlckNvbXBvbmVudCxcbiAgICBHcm91cFBhbmVsQ29tcG9uZW50LFxuICAgIEdyb3VwSW5kaWNhdG9yQ29tcG9uZW50XG5dO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEdyb3VwTW9kdWxlIHtcbiAgICBzdGF0aWMgZXhwb3J0cygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEdyb3VwSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBHcm91cEhlYWRlckNvbHVtblRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgR3JvdXBGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZVxuICAgICAgICBdO1xuICAgIH1cbn1cbkdyb3VwTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtleHBvcnRlZE1vZHVsZXMkMV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkTW9kdWxlcyQxXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTaGFyZWRNb2R1bGUsIERyYWdBbmREcm9wTW9kdWxlXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgREVGQVVMVFMgPSB7XG4gICAgYWxsb3dVbnNvcnQ6IHRydWUsXG4gICAgbW9kZTogJ3NpbmdsZScsXG4gICAgc2hvd0luZGV4ZXM6IHRydWUsXG4gICAgaW5pdGlhbERpcmVjdGlvbjogJ2FzYydcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3Qgbm9ybWFsaXplJDEgPSAoLi4uc2V0dGluZ3MpID0+IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRTLCAuLi5zZXR0aW5ncyk7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBoYXNGaWx0ZXIgPSAoc2V0dGluZ3MsIGNvbHVtbikgPT4gc2V0dGluZ3MuZmlsdGVyICE9PSBmYWxzZSAmJiBjb2x1bW4uZmllbGQgJiYgY29sdW1uLmZpbHRlcmFibGU7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzU29ydCA9IChzZXR0aW5ncywgY29sdW1uKSA9PiBzZXR0aW5ncy5zb3J0ICE9PSBmYWxzZSAmJiBjb2x1bW4uZmllbGQgJiYgY29sdW1uLnNvcnRhYmxlO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGhhc0xvY2sgPSAoc2V0dGluZ3MsIGNvbHVtbikgPT4gc2V0dGluZ3MubG9jayAmJiBjb2x1bW4ubG9ja2FibGUgJiYgIShjb2x1bW4ucGFyZW50ICYmICFjb2x1bW4ucGFyZW50LmlzU3BhbkNvbHVtbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzQ29sdW1uQ2hvb3NlciA9IChzZXR0aW5ncykgPT4gc2V0dGluZ3MuY29sdW1uQ2hvb3NlciAhPT0gZmFsc2U7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzSXRlbXMgPSAoc2V0dGluZ3MsIGNvbHVtbikgPT4gaGFzQ29sdW1uQ2hvb3NlcihzZXR0aW5ncykgfHwgaGFzTG9jayhzZXR0aW5ncywgY29sdW1uKSB8fCBoYXNTb3J0KHNldHRpbmdzLCBjb2x1bW4pIHx8IGhhc0ZpbHRlcihzZXR0aW5ncywgY29sdW1uKTtcblxuY29uc3QgbWVyZ2VPYmplY3RzID0gKC4uLmFyZ3MpID0+IE9iamVjdC5hc3NpZ24uYXBwbHkobnVsbCwgW3t9XS5jb25jYXQoYXJncykpO1xuY29uc3QgZGlyZWN0aW9ucyA9IGluaXRpYWxEaXJlY3Rpb24gPT4gaW5pdGlhbERpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IFtcImFzY1wiLCBcImRlc2NcIl0gOiBbXCJkZXNjXCIsIFwiYXNjXCJdO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzUm9vdExldmVsID0gKHsgcGFyZW50IH0pID0+ICFpc1RydXRoeShwYXJlbnQpO1xuY29uc3Qgb2ZDb2x1bW5UeXBlID0gKHsgZHJhZ2dhYmxlIH0pID0+IFsnY29sdW1uJywgJ2NvbHVtbkdyb3VwJ11cbiAgICAuaW5kZXhPZihkcmFnZ2FibGUuY29udGV4dC50eXBlKSA+PSAwO1xuY29uc3Qgbm90U2FtZUVsZW1lbnQgPSAoeyBkcmFnZ2FibGUsIHRhcmdldCB9KSA9PiBkcmFnZ2FibGUuZWxlbWVudC5uYXRpdmVFbGVtZW50ICE9PSB0YXJnZXQuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuY29uc3QgaW5TYW1lUGFyZW50ID0gKHgsIHkpID0+IHgucGFyZW50ID09PSB5LnBhcmVudCB8fFxuICAgIChpc0luU3BhbkNvbHVtbih5KSAmJiBpblNhbWVQYXJlbnQoeCwgeS5wYXJlbnQpKTtcbmNvbnN0IHNhbWVQYXJlbnQgPSAoeyBkcmFnZ2FibGUsIHRhcmdldCB9KSA9PiBpblNhbWVQYXJlbnQoZHJhZ2dhYmxlLmNvbnRleHQuY29sdW1uLCB0YXJnZXQuY29udGV4dC5jb2x1bW4pO1xuY29uc3QgbGFzdE5vbkxvY2tlZCA9ICh7IGRyYWdnYWJsZSB9KSA9PiAhaXNUcnV0aHkoZHJhZ2dhYmxlLmNvbnRleHQuY29sdW1uLmxvY2tlZCkgJiZcbiAgICBpc1Jvb3RMZXZlbChkcmFnZ2FibGUuY29udGV4dC5jb2x1bW4pICYmXG4gICAgZHJhZ2dhYmxlLmNvbnRleHQubGFzdENvbHVtbjtcbmNvbnN0IG5vdEluU3BhbkNvbHVtbiA9ICh7IGRyYWdnYWJsZSB9KSA9PiAhaXNJblNwYW5Db2x1bW4oZHJhZ2dhYmxlLmNvbnRleHQuY29sdW1uKTtcbmNvbnN0IHJlb3JkZXJhYmxlID0gKHsgZHJhZ2dhYmxlIH0pID0+IGRyYWdnYWJsZS5jb250ZXh0LmNvbHVtbi5yZW9yZGVyYWJsZTtcbmNvbnN0IGxvY2thYmxlID0gKHsgZHJhZ2dhYmxlLCB0YXJnZXQgfSkgPT4gZHJhZ2dhYmxlLmNvbnRleHQuY29sdW1uLmxvY2thYmxlICE9PSBmYWxzZSB8fFxuICAgIGRyYWdnYWJsZS5jb250ZXh0LmNvbHVtbi5pc0xvY2tlZCA9PT0gdGFyZ2V0LmNvbnRleHQuY29sdW1uLmlzTG9ja2VkO1xuY29uc3QgcnVsZXMgPSBhbmQob2ZDb2x1bW5UeXBlLCByZW9yZGVyYWJsZSwgbm90SW5TcGFuQ29sdW1uLCBub3RTYW1lRWxlbWVudCwgc2FtZVBhcmVudCwgbm90KGxhc3ROb25Mb2NrZWQpLCBsb2NrYWJsZSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgSGVhZGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwb3B1cFNlcnZpY2UsIGhpbnQsIGN1ZSwgcmVvcmRlclNlcnZpY2UsIGlkU2VydmljZSwgc29ydFNlcnZpY2UsIGxvY2FsaXphdGlvbiwgY2QpIHtcbiAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2UgPSBwb3B1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMuaGludCA9IGhpbnQ7XG4gICAgICAgIHRoaXMuY3VlID0gY3VlO1xuICAgICAgICB0aGlzLnJlb3JkZXJTZXJ2aWNlID0gcmVvcmRlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuaWRTZXJ2aWNlID0gaWRTZXJ2aWNlO1xuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlID0gc29ydFNlcnZpY2U7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLmNkID0gY2Q7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xuICAgICAgICB0aGlzLnNvcnQgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmdyb3VwYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvY2tlZENvbHVtbnNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVzaXphYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVvcmRlcmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb2x1bW5NZW51ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG90YWxDb2x1bW5zQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvcnRlZEZpZWxkcyA9IHt9O1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRzID0gbmV3IFF1ZXJ5TGlzdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICB9XG4gICAgZ2V0IGhlYWRlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuc2Nyb2xsYWJsZTtcbiAgICB9XG4gICAgZ2V0IHNvcnRhYmxlTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbi5nZXQoJ3NvcnRhYmxlJyk7XG4gICAgfVxuICAgIC8vIE51bWJlciBvZiB1bmxvY2tlZCBjb2x1bW5zIGluIHRoZSBuZXh0IHRhYmxlLCBpZiBhbnlcbiAgICBnZXQgdW5sb2NrZWRDb2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdGFsQ29sdW1uc0NvdW50IC0gdGhpcy5sb2NrZWRDb2x1bW5zQ291bnQgLSB0aGlzLmNvbHVtbnMubGVuZ3RoO1xuICAgIH1cbiAgICBzb3J0Q29sdW1uKGNvbHVtbikge1xuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLnNvcnQodGhpcy50b2dnbGVTb3J0KGNvbHVtbikpO1xuICAgIH1cbiAgICBvblNvcnRDbGljayhjb2x1bW4sIGV2ZW50LCBsaW5rKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgaWYgKGNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZiAmJiB0YXJnZXQgIT09IGxpbmspIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0ZvY3VzYWJsZVBhcmVudCA9IEJvb2xlYW4oY2xvc2VzdEluU2NvcGUodGFyZ2V0LCBpc0ZvY3VzYWJsZSwgbGluaykpO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzYWJsZVBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzb3J0IHdoZW4gY2xpY2tpbmcgZm9jdXNhYmxlIHRlbXBsYXRlIGVsZW1lbnRzLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvcnRDb2x1bW4oY29sdW1uKTtcbiAgICB9XG4gICAgb25IZWFkZXJLZXlkb3duKGNvbHVtbiwgYXJncykge1xuICAgICAgICBpZiAoIXRoaXMuc29ydGFibGUgfHwgYXJncy5kZWZhdWx0UHJldmVudGVkIHx8IGNvbHVtbi5zb3J0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5rZXlDb2RlID09PSBLZXlzLkVudGVyICYmIGlzUHJlc2VudChjb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLnNvcnQodGhpcy50b2dnbGVTb3J0KGNvbHVtbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3dTb3J0TnVtYmVyaW5nKGNvbHVtbikge1xuICAgICAgICBjb25zdCB7IHNob3dJbmRleGVzIH0gPSBub3JtYWxpemUkMSh0aGlzLnNvcnRhYmxlKTtcbiAgICAgICAgcmV0dXJuIHNob3dJbmRleGVzXG4gICAgICAgICAgICAmJiB0aGlzLnNvcnRcbiAgICAgICAgICAgICYmIHRoaXMuc29ydC5maWx0ZXIoKHsgZGlyIH0pID0+IGlzUHJlc2VudChkaXIpKS5sZW5ndGggPiAxXG4gICAgICAgICAgICAmJiB0aGlzLnNvcnRPcmRlcihjb2x1bW4uZmllbGQpID4gMDtcbiAgICB9XG4gICAgc29ydE9yZGVyKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgZGlyIH0pID0+IGlzUHJlc2VudChkaXIpKVxuICAgICAgICAgICAgLmZpbmRJbmRleCh4ID0+IHguZmllbGQgPT09IGZpZWxkKVxuICAgICAgICAgICAgKyAxO1xuICAgIH1cbiAgICBzb3J0SWNvbihmaWVsZCkge1xuICAgICAgICBjb25zdCBzdGF0ZSQkMSA9IHRoaXMuc29ydERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2staWNvbic6IGlzUHJlc2VudChzdGF0ZSQkMS5kaXIpLFxuICAgICAgICAgICAgJ2staS1zb3J0LWRlc2Mtc20nOiBzdGF0ZSQkMS5kaXIgPT09IFwiZGVzY1wiLFxuICAgICAgICAgICAgJ2staS1zb3J0LWFzYy1zbSc6IHN0YXRlJCQxLmRpciA9PT0gXCJhc2NcIlxuICAgICAgICB9O1xuICAgIH1cbiAgICBzb3J0U3RhdGUoY29sdW1uKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NvcnRhYmxlKGNvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSQkMSA9IHRoaXMuc29ydERlc2NyaXB0b3IoY29sdW1uLmZpZWxkKTtcbiAgICAgICAgaWYgKHN0YXRlJCQxLmRpciA9PT0gJ2FzYycpIHtcbiAgICAgICAgICAgIHJldHVybiAnYXNjZW5kaW5nJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUkJDEuZGlyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc29ydFN0YXR1cyhjb2x1bW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnNvcnRlZEZpZWxkc1tjb2x1bW4uZmllbGRdIHx8ICF0aGlzLmlzU29ydGFibGUoY29sdW1uKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtc2cgPSAnc29ydGVkRGVmYXVsdCc7XG4gICAgICAgIGNvbnN0IHN0YXRlJCQxID0gdGhpcy5zb3J0RGVzY3JpcHRvcihjb2x1bW4uZmllbGQpO1xuICAgICAgICBpZiAoc3RhdGUkJDEuZGlyID09PSAnYXNjJykge1xuICAgICAgICAgICAgbXNnID0gJ3NvcnRlZEFzY2VuZGluZyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUkJDEuZGlyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAgIG1zZyA9ICdzb3J0ZWREZXNjZW5kaW5nJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KG1zZyk7XG4gICAgfVxuICAgIHRvZ2dsZVNvcnQoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dVbnNvcnQsIG1vZGUsIGluaXRpYWxEaXJlY3Rpb24gfSA9IG5vcm1hbGl6ZSQxKHRoaXMuc29ydGFibGUsIGNvbHVtbi5zb3J0YWJsZSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnRvZ2dsZURpcmVjdGlvbihjb2x1bW4uZmllbGQsIGFsbG93VW5zb3J0LCBpbml0aWFsRGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2Rlc2NyaXB0b3JdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5zb3J0LmZpbHRlcihkZXNjID0+IGRlc2MuZmllbGQgIT09IGNvbHVtbi5maWVsZCksIGRlc2NyaXB0b3JdO1xuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChvYnNlcnZlKHRoaXMuZHJvcFRhcmdldHMpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuYXR0YWNoVGFyZ2V0cy5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5fbGVhZkNvbHVtbnMgPSBjb2x1bW5zVG9SZW5kZXIodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoeCA9PiAhaXNDb2x1bW5Hcm91cENvbXBvbmVudCh4KSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc29ydENoYW5nZSA9IGNoYW5nZXMuc29ydDtcbiAgICAgICAgaWYgKHNvcnRDaGFuZ2UgJiYgIXNvcnRDaGFuZ2UuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICBzb3J0Q2hhbmdlLmN1cnJlbnRWYWx1ZS5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0ZWRGaWVsZHNbY2hhbmdlLmZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZC5tYXJrRm9yQ2hlY2soKSkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBvcHVwU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHNlbGVjdEFsbENoZWNrYm94SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkU2VydmljZS5zZWxlY3RBbGxDaGVja2JveElkKCk7XG4gICAgfVxuICAgIGlzRmlyc3RPblJvdyhjb2x1bW4sIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGlzVGFpbGluZyA9IChjKSA9PiBjICYmXG4gICAgICAgICAgICAodGhpcy5jb2x1bW5zRm9yTGV2ZWwoYy5sZXZlbCkuaW5kZXhPZihjKSA+IDAgfHwgaXNUYWlsaW5nKGMucGFyZW50KSk7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gMCAmJiAhdGhpcy5ncm91cHMubGVuZ3RoICYmICF0aGlzLmRldGFpbFRlbXBsYXRlICYmIGlzVGFpbGluZyhjb2x1bW4ucGFyZW50KTtcbiAgICB9XG4gICAgbG9naWNhbENvbHVtbkluZGV4KGNvbHVtbikge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvbHVtbi5sZWFmSW5kZXg7XG4gICAgICAgIGlmIChpc1ByZXNlbnQoaW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXggKyAoaXNQcmVzZW50KHRoaXMuZGV0YWlsVGVtcGxhdGUpID8gMSA6IDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZ2V0IHNob3dGaWx0ZXJNZW51KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29sdW1uTWVudSAmJiBoYXNGaWx0ZXJNZW51KHRoaXMuZmlsdGVyYWJsZSk7XG4gICAgfVxuICAgIGdldCBzaG93RmlsdGVyUm93KCkge1xuICAgICAgICByZXR1cm4gaGFzRmlsdGVyUm93KHRoaXMuZmlsdGVyYWJsZSk7XG4gICAgfVxuICAgIHNob3dDb2x1bW5NZW51KGNvbHVtbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5NZW51ICYmIGNvbHVtbi5jb2x1bW5NZW51ICYmXG4gICAgICAgICAgICAodGhpcy5jb2x1bW5NZW51VGVtcGxhdGUgfHwgY29sdW1uLmNvbHVtbk1lbnVUZW1wbGF0ZXMubGVuZ3RoIHx8IGhhc0l0ZW1zKHRoaXMuY29sdW1uTWVudSwgY29sdW1uKSk7XG4gICAgfVxuICAgIGlzRmlsdGVyYWJsZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuICFpc051bGxPckVtcHR5U3RyaW5nKGNvbHVtbi5maWVsZCkgJiYgY29sdW1uLmZpbHRlcmFibGUgPT09IHRydWU7XG4gICAgfVxuICAgIGNhbkRyb3AoZHJhZ2dhYmxlLCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVvcmRlcmFibGUgJiYgcnVsZXMoeyBkcmFnZ2FibGUsIHRhcmdldCB9KTtcbiAgICB9XG4gICAgc2hvdWxkQWN0aXZhdGUoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGNhblJlb3JkZXIgPSB0aGlzLnJlb3JkZXJhYmxlICYmIGNvbHVtbi5yZW9yZGVyYWJsZTtcbiAgICAgICAgaWYgKCFjYW5SZW9yZGVyICYmICFpc0NvbHVtbkNvbXBvbmVudChjb2x1bW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXBhYmxlID0gdGhpcy5ncm91cGFibGUgJiYgaXNDb2x1bW5Db21wb25lbnQoY29sdW1uKSAmJiBjb2x1bW4uZ3JvdXBhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGdyb3VwYWJsZSB8fCBjYW5SZW9yZGVyO1xuICAgIH1cbiAgICBpc1NvcnRhYmxlKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gIWlzTnVsbE9yRW1wdHlTdHJpbmcoY29sdW1uLmZpZWxkKVxuICAgICAgICAgICAgJiYgaXNUcnV0aHkodGhpcy5zb3J0YWJsZSkgJiYgaXNUcnV0aHkoY29sdW1uLnNvcnRhYmxlKTtcbiAgICB9XG4gICAgaXNDaGVja2JveENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGlzQ2hlY2tib3hDb2x1bW4oY29sdW1uKSAmJiAhY29sdW1uLnRlbXBsYXRlUmVmO1xuICAgIH1cbiAgICB0cmFja0J5SW5kZXgoaW5kZXgsIF9pdGVtKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgdG9nZ2xlRGlyZWN0aW9uKGZpZWxkLCBhbGxvd1Vuc29ydCwgaW5pdGlhbERpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5zb3J0RGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IGRpcmVjdGlvbnMoaW5pdGlhbERpcmVjdGlvbik7XG4gICAgICAgIGxldCBkaXIgPSBmaXJzdDtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyID09PSBmaXJzdCkge1xuICAgICAgICAgICAgZGlyID0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3IuZGlyID09PSBzZWNvbmQgJiYgYWxsb3dVbnNvcnQpIHtcbiAgICAgICAgICAgIGRpciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkaXIsIGZpZWxkIH07XG4gICAgfVxuICAgIGNvbHVtbnNGb3JMZXZlbChsZXZlbCkge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zID8gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmxldmVsID09PSBsZXZlbCkgOiBbXTtcbiAgICAgICAgcmV0dXJuIHNvcnRDb2x1bW5zKGNvbHVtbnNUb1JlbmRlcihjb2x1bW5zKSk7XG4gICAgfVxuICAgIGlzQ29sdW1uR3JvdXBDb21wb25lbnQoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBpc0NvbHVtbkdyb3VwQ29tcG9uZW50KGNvbHVtbik7XG4gICAgfVxuICAgIGdldCBjb2x1bW5MZXZlbHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXJyYXkoKHRoaXMudG90YWxDb2x1bW5MZXZlbHMgfHwgMCkgKyAxKTtcbiAgICB9XG4gICAgc29ydERlc2NyaXB0b3IoZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydC5maW5kKGl0ZW0gPT4gaXRlbS5maWVsZCA9PT0gZmllbGQpIHx8IHsgZmllbGQgfTtcbiAgICB9XG4gICAgZ2V0IGxlYWZDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGVhZkNvbHVtbnM7XG4gICAgfVxuICAgIGF0dGFjaFRhcmdldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhcmdldFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgY29uc3QgZW50ZXJTdHJlYW0gPSBtZXJnZSguLi50aGlzLmRyb3BUYXJnZXRzLm1hcCh0YXJnZXQgPT4gdGFyZ2V0LmVudGVyKSk7XG4gICAgICAgIGNvbnN0IGxlYXZlU3RyZWFtID0gbWVyZ2UoLi4udGhpcy5kcm9wVGFyZ2V0cy5tYXAodGFyZ2V0ID0+IHRhcmdldC5sZWF2ZSkpO1xuICAgICAgICBjb25zdCBkcm9wU3RyZWFtID0gbWVyZ2UoLi4udGhpcy5kcm9wVGFyZ2V0cy5tYXAodGFyZ2V0ID0+IHRhcmdldC5kcm9wKSk7XG4gICAgICAgIHRoaXMudGFyZ2V0U3Vic2NyaXB0aW9uLmFkZChlbnRlclN0cmVhbS5waXBlKHRhcCgoeyB0YXJnZXQsIGRyYWdnYWJsZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZHJhZ2dhYmxlLmNvbnRleHQudHlwZSA9PT0gJ2dyb3VwSW5kaWNhdG9yJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldExvY2tlZCA9IGlzVHJ1dGh5KHRhcmdldC5jb250ZXh0LmNvbHVtbi5pc0xvY2tlZCk7XG4gICAgICAgICAgICBjb25zdCBkcmFnZ2FibGVMb2NrZWQgPSBpc1RydXRoeShkcmFnZ2FibGUuY29udGV4dC5jb2x1bW4uaXNMb2NrZWQpO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9ja2VkQ29sdW1uc0NvdW50ID4gMCB8fCB0YXJnZXRMb2NrZWQgfHwgZHJhZ2dhYmxlTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaW50LnRvZ2dsZUxvY2sodGFyZ2V0TG9ja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIGZpbHRlcigoeyBkcmFnZ2FibGUsIHRhcmdldCB9KSA9PiB0aGlzLmNhbkRyb3AoZHJhZ2dhYmxlLCB0YXJnZXQpKSwgc3dpdGNoTWFwKHRoaXMudHJhY2tNb3ZlLmJpbmQodGhpcywgbGVhdmVTdHJlYW0sIGRyb3BTdHJlYW0pKSwgbWFwKChlKSA9PiBtZXJnZU9iamVjdHMoZSwgeyBiZWZvcmU6IHRoaXMuY2FsY3VsYXRlQmVmb3JlKGUpLCBjaGFuZ2VDb250YWluZXI6IGUuY2hhbmdlQ29udGFpbmVyIH0pKSwgbWFwKHRoaXMubm9ybWFsaXplVGFyZ2V0LmJpbmQodGhpcykpLCB0YXAodGhpcy5lbnRlci5iaW5kKHRoaXMpKSwgc3dpdGNoTWFwKChhcmdzKSA9PiBkcm9wU3RyZWFtLnBpcGUobWFwKCgpID0+IGFyZ3MpLCB0YWtlVW50aWwobGVhdmVTdHJlYW0ucGlwZSh0YXAodGhpcy5sZWF2ZS5iaW5kKHRoaXMpKSkpKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuZHJvcC5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIG5vcm1hbGl6ZVRhcmdldChlKSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGFyZ2V0LmNvbnRleHQuY29sdW1uLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuaXNTcGFuQ29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmRyb3BUYXJnZXRzLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U3BhbiA9IGFyci5maW5kKHQgPT4gdC5jb250ZXh0LmNvbHVtbi5wYXJlbnQgPT09IHBhcmVudCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKGZpcnN0U3Bhbik7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3QgPSBlLmJlZm9yZSA/IDAgOiBwYXJlbnQuY2hpbGRDb2x1bW5zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0YXJnZXQgPSBhcnJbaW5kZXggKyBhZGp1c3RdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZU9iamVjdHMoZSwgeyB0YXJnZXQgfSk7XG4gICAgfVxuICAgIHRyYWNrTW92ZShsZWF2ZVN0cmVhbSwgZHJvcFN0cmVhbSwgZSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBlLnRhcmdldC5jb250ZXh0LmNvbHVtbjtcbiAgICAgICAgY29uc3QgbGV2ZWxDb2x1bW5zID0gdGhpcy5jb2x1bW5zRm9yTGV2ZWwoY29sdW1uLmxldmVsKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsZXZlbENvbHVtbnMuaW5kZXhPZihjb2x1bW4pO1xuICAgICAgICBjb25zdCBpc0ZpcnN0ID0gKGNvbHVtbi5sb2NrZWQgPyBpbmRleCA9PT0gbGV2ZWxDb2x1bW5zLmxlbmd0aCAtIDEgOiBpbmRleCA9PT0gMCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBlLmRyYWdnYWJsZS5jb250ZXh0LmNvbHVtbi5pc0xvY2tlZCAhPT0gY29sdW1uLmlzTG9ja2VkO1xuICAgICAgICBpZiAoY2hhbmdlZCAmJiBpc0ZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZS5kcmFnZ2FibGUuZHJhZ1xuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChsZWF2ZVN0cmVhbSksIHRha2VVbnRpbChkcm9wU3RyZWFtKSwgbWFwKCh7IG1vdXNlRXZlbnQgfSkgPT4gbWVyZ2VPYmplY3RzKHsgY2hhbmdlQ29udGFpbmVyOiB0cnVlIH0sIGUsIHsgbW91c2VFdmVudCB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihtZXJnZU9iamVjdHMoeyBjaGFuZ2VDb250YWluZXI6IGNoYW5nZWQgfSwgZSkpO1xuICAgIH1cbiAgICBjYWxjdWxhdGVCZWZvcmUoeyBkcmFnZ2FibGUsIHRhcmdldCwgbW91c2VFdmVudCwgY2hhbmdlQ29udGFpbmVyID0gZmFsc2UgfSkge1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IGJlZm9yZSA9IGZhbHNlO1xuICAgICAgICBpZiAoY2hhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IG9mZnNldCh0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHRhcmdldEVsZW1lbnQub2Zmc2V0V2lkdGggLyAyO1xuICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gbGVmdCArIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIGJlZm9yZSA9IG1pZGRsZSA+IG1vdXNlRXZlbnQucGFnZVg7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbGl6YXRpb24ucnRsKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlID0gIWJlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IGlzVGFyZ2V0QmVmb3JlKGRyYWdnYWJsZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZWZvcmU7XG4gICAgfVxuICAgIGVudGVyKHsgdGFyZ2V0LCBiZWZvcmUgfSkge1xuICAgICAgICB0aGlzLmhpbnQuZW5hYmxlKCk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbi5ydGwpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICFiZWZvcmU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdWUucG9zaXRpb24ocG9zaXRpb24odGFyZ2V0LmVsZW1lbnQubmF0aXZlRWxlbWVudCwgYmVmb3JlKSk7XG4gICAgfVxuICAgIGxlYXZlKCkge1xuICAgICAgICB0aGlzLmhpbnQuZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLmN1ZS5oaWRlKCk7XG4gICAgfVxuICAgIGRyb3AoeyBkcmFnZ2FibGUsIHRhcmdldCwgYmVmb3JlLCBjaGFuZ2VDb250YWluZXIgfSkge1xuICAgICAgICB0aGlzLnJlb3JkZXJTZXJ2aWNlLnJlb3JkZXIoe1xuICAgICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgICAgY2hhbmdlQ29udGFpbmVyLFxuICAgICAgICAgICAgc291cmNlOiBkcmFnZ2FibGUuY29udGV4dC5jb2x1bW4sXG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldC5jb250ZXh0LmNvbHVtblxuICAgICAgICB9KTtcbiAgICB9XG59XG5IZWFkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRIZWFkZXJdJyxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IFtgXG4gICAgICAgIC5rLWNvbHVtbi1yZXNpemVyIHtcbiAgICAgICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgaGVpZ2h0OiAxMDAwJTtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgIHdpZHRoOiAuNWVtO1xuICAgICAgICB9XG4gICAgYF0sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidHJ1ZVwiPlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGkgb2YgY29sdW1uTGV2ZWxzOyBsZXQgbGV2ZWxJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgIGtlbmRvR3JpZExvZ2ljYWxSb3dcbiAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxldmVsSW5kZXhcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsU2xhdmVSb3ddPVwibG9ja2VkQ29sdW1uc0NvdW50ID4gMFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxDZWxsc0NvdW50XT1cImNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlQ2VsbHNDb3VudF09XCJ1bmxvY2tlZENvbHVtbnNDb3VudFwiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWdyb3VwLWNlbGwgay1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImstaGllcmFyY2h5LWNlbGwgay1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxldmVsSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbENvbEluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sdW1uIFtuZ0Zvck9mXT1cImNvbHVtbnNGb3JMZXZlbChsZXZlbEluZGV4KVwiIFtuZ0ZvclRyYWNrQnldPVwidHJhY2tCeUluZGV4XCIgbGV0LWNvbHVtbkluZGV4PVwiaW5kZXhcIiBsZXQtbGFzdD1cImxhc3RcIj5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhaXNDb2x1bW5Hcm91cENvbXBvbmVudChjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGwgW2xvZ2ljYWxSb3dJbmRleF09XCJsZXZlbEluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCJsb2dpY2FsQ29sdW1uSW5kZXgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xTcGFuXT1cImNvbHVtbi5jb2xzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NwYW5dPVwiY29sdW1uLnJvd3NwYW4odG90YWxDb2x1bW5MZXZlbHMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJzb3J0U3RhdGUoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSGVhZGVyS2V5ZG93bihjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBrZW5kb0Ryb3BUYXJnZXRcbiAgICAgICAgICAgICAgICAgICAga2VuZG9EcmFnZ2FibGVcbiAgICAgICAgICAgICAgICAgICAga2VuZG9EcmFnZ2FibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZURyYWddPVwic2hvdWxkQWN0aXZhdGUoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGludDogY29sdW1uLnRpdGxlIHx8IGNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb2x1bW46IGxhc3QgJiYgY29sdW1uSW5kZXggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muay1maWx0ZXJhYmxlXT1cIihzaG93RmlsdGVyTWVudSAmJiBpc0ZpbHRlcmFibGUoY29sdW1uKSkgfHwgc2hvd0NvbHVtbk1lbnUoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLWZpcnN0XT1cImlzRmlyc3RPblJvdyhjb2x1bW4sIGNvbHVtbkluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJTdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY29sdW1uLnJvd3NwYW4odG90YWxDb2x1bW5MZXZlbHMpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW4uY29sc3BhblwiPlxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItbWVudVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RmlsdGVyTWVudSAmJiBpc0ZpbHRlcmFibGUoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbi1tZW51ICpuZ0lmPVwic2hvd0NvbHVtbk1lbnUoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RhbmRhbG9uZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2V0dGluZ3NdPVwiY29sdW1uTWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTWVudVRlbXBsYXRlXT1cImNvbHVtbk1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc29ydF09XCJzb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJzb3J0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uLW1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXNTb3J0YWJsZShjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IGNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbi5sZWFmSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZlwiPnt7Y29sdW1uLmRpc3BsYXlUaXRsZX19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzU29ydGFibGUoY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gI2xpbmsgY2xhc3M9XCJrLWxpbmtcIiAoY2xpY2spPVwib25Tb3J0Q2xpY2soY29sdW1uLCAkZXZlbnQsIGxpbmspXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IGNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW4ubGVhZkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZlwiPnt7Y29sdW1uLmRpc3BsYXlUaXRsZX19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5hcmlhLWxhYmVsXT1cInNvcnRhYmxlTGFiZWxcIiBbbmdDbGFzc109XCJzb3J0SWNvbihjb2x1bW4uZmllbGQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1NvcnROdW1iZXJpbmcoY29sdW1uKVwiIGNsYXNzPVwiay1zb3J0LW9yZGVyXCI+e3tzb3J0T3JkZXIoY29sdW1uLmZpZWxkKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cInN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstc29ydC1zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0xMDAwMHB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cInNvcnRTdGF0dXMoY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNDaGVja2JveENvbHVtbihjb2x1bW4pICYmICFjb2x1bW4uaGVhZGVyVGVtcGxhdGVSZWYgJiYgY29sdW1uLnNob3dTZWxlY3RBbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwic2VsZWN0QWxsQ2hlY2tib3hJZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0dyaWRTZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlbmRvR3JpZEZvY3VzYWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstY2hlY2tib3gtbGFiZWxcIiBbYXR0ci5mb3JdPVwic2VsZWN0QWxsQ2hlY2tib3hJZCgpXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4ga2VuZG9HcmlkQ29sdW1uSGFuZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0RyYWdnYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWNvbHVtbi1yZXNpemVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNDb2x1bW5Hcm91cENvbXBvbmVudChjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGwgW2xvZ2ljYWxSb3dJbmRleF09XCJsZXZlbEluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCJsb2dpY2FsQ29sdW1uSW5kZXgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNvbHVtbi5yb3dzcGFuKHRvdGFsQ29sdW1uTGV2ZWxzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xTcGFuXT1cImNvbHVtbi5jb2xzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAga2VuZG9Ecm9wVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgIFtlbmFibGVEcmFnXT1cInNob3VsZEFjdGl2YXRlKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBoaW50OiBjb2x1bW4udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29sdW1uOiBsYXN0ICYmIGNvbHVtbkluZGV4ID09PSAwXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmstZmlyc3RdPVwiaXNGaXJzdE9uUm93KGNvbHVtbiwgY29sdW1uSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmstZmlsdGVyYWJsZV09XCJzaG93Q29sdW1uTWVudShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sdW1uLmhlYWRlclN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJjb2x1bW4ucm93c3Bhbih0b3RhbENvbHVtbkxldmVscylcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbi5jb2xzcGFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4tbWVudSAqbmdJZj1cInNob3dDb2x1bW5NZW51KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFuZGFsb25lXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V0dGluZ3NdPVwiY29sdW1uTWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51VGVtcGxhdGVdPVwiY29sdW1uTWVudVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uLW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IGNvbHVtbi5oZWFkZXJUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXg6IGxvY2tlZENvbHVtbnNDb3VudCArIGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFjb2x1bW4uaGVhZGVyVGVtcGxhdGVSZWZcIj57e2NvbHVtbi5kaXNwbGF5VGl0bGV9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBrZW5kb0dyaWRDb2x1bW5IYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0RyYWdnYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1jb2x1bW4tcmVzaXplclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdJZj1cInNob3dGaWx0ZXJSb3dcIlxuICAgICAgICAgICAga2VuZG9HcmlkRmlsdGVyUm93XG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwibGVhZkNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgW2RldGFpbFRlbXBsYXRlXT1cImRldGFpbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbG9ja2VkQ29sdW1uc0NvdW50XT1cImxvY2tlZENvbHVtbnNDb3VudFwiXG4gICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsUm93XG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJ0b3RhbENvbHVtbkxldmVscyArIDFcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsU2xhdmVSb3ddPVwibG9ja2VkQ29sdW1uc0NvdW50ID4gMFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxDZWxsc0NvdW50XT1cImNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlQ2VsbHNDb3VudF09XCJ1bmxvY2tlZENvbHVtbnNDb3VudFwiXG4gICAgICAgID48L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5IZWFkZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBTaW5nbGVQb3B1cFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IERyYWdIaW50U2VydmljZSB9LFxuICAgIHsgdHlwZTogRHJvcEN1ZVNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENvbHVtblJlb3JkZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBJZFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFNvcnRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9XG5dO1xuSGVhZGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRvdGFsQ29sdW1uTGV2ZWxzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW5zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cHM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRldGFpbFRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzY3JvbGxhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzb3J0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNvcnRhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cGFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvY2tlZENvbHVtbnNDb3VudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVzaXphYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZW9yZGVyYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uTWVudTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uTWVudVRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0b3RhbENvbHVtbnNDb3VudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVhZGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1oZWFkZXInLF0gfV0sXG4gICAgZHJvcFRhcmdldHM6IFt7IHR5cGU6IFZpZXdDaGlsZHJlbiwgYXJnczogW0Ryb3BUYXJnZXREaXJlY3RpdmUsXSB9XVxufTtcblxuLy8gVE9ET1xuLy8gdHNsaW50OmRpc2FibGU6cnhqcy1uby11bnNhZmUtdGFrZXVudGlsXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgZnJvbVBlcmNlbnRhZ2UgPSAodmFsdWUsIHBlcmNlbnQpID0+IHtcbiAgICBjb25zdCBzaWduID0gcGVyY2VudCA8IDAgPyAtMSA6IDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgoTWF0aC5hYnMocGVyY2VudCkgLyAxMDApICogdmFsdWUpICogc2lnbjtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdG9QZXJjZW50YWdlID0gKHZhbHVlLCB3aG9sZSkgPT4gKHZhbHVlIC8gd2hvbGUpICogMTAwO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGhlYWRlcldpZHRoID0gKGhhbmRsZSkgPT4gaGFuZGxlLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBhbGxMZWFmQ29sdW1ucyA9IGNvbHVtbnMgPT4gZXhwYW5kQ29sdW1ucyhjb2x1bW5zKVxuICAgIC5maWx0ZXIoYyA9PiAhYy5pc0NvbHVtbkdyb3VwKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBzdG9wUHJvcGFnYXRpb24gPSAoeyBvcmlnaW5hbEV2ZW50OiBldmVudCB9KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY3JlYXRlTW92ZVN0cmVhbSA9IChzZXJ2aWNlLCBkcmFnZ2FibGUpID0+IG1vdXNlRG93biA9PiBkcmFnZ2FibGUua2VuZG9EcmFnLnBpcGUodGFrZVVudGlsKGRyYWdnYWJsZS5rZW5kb1JlbGVhc2UucGlwZSh0YXAoKCkgPT4gc2VydmljZS5lbmQoKSkpKSwgbWFwKCh7IHBhZ2VYIH0pID0+ICh7XG4gICAgb3JpZ2luYWxYOiBtb3VzZURvd24ucGFnZVgsXG4gICAgcGFnZVhcbn0pKSk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgcHJldmVudE9uRGJsQ2xpY2skMSA9IHJlbGVhc2UgPT4gbW91c2VEb3duID0+IG9mKG1vdXNlRG93bikucGlwZShkZWxheSgxNTApLCB0YWtlVW50aWwocmVsZWFzZSkpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGlzSW5TcGFuQ29sdW1uJDEgPSBjb2x1bW4gPT4gISEoY29sdW1uLnBhcmVudCAmJiBjb2x1bW4ucGFyZW50LmlzU3BhbkNvbHVtbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb2x1bW4gaW5kZXguIElmIHRoZSBjb2x1bW4gaXMgc3RhdGVkIGluIGBTcGFuQ29sdW1uYCxcbiAqIHRoZSBpbmRleCBmb3IgYWxsIGNoaWxkIGNvbHVtbnMgZXF1YWxzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hpbGQuXG4gKi9cbmNvbnN0IGluZGV4T2YgPSAodGFyZ2V0LCBsaXN0KSA9PiB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgaWdub3JlID0gMDtcbiAgICBsZXQgc2tpcCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGxpc3RbaW5kZXhdO1xuICAgICAgICBjb25zdCBpc1BhcmVudFNwYW5Db2x1bW4gPSBpc0luU3BhbkNvbHVtbiQxKGN1cnJlbnQpO1xuICAgICAgICBpZiAoY3VycmVudCA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGlnbm9yZS0tIDw9IDApICYmIGlzUGFyZW50U3BhbkNvbHVtbikge1xuICAgICAgICAgICAgaWdub3JlID0gY3VycmVudC5wYXJlbnQuY2hpbGRDb2x1bW5zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBza2lwICs9IGlnbm9yZTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggLSBza2lwO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBDb2x1bW5IYW5kbGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSwgZWxlbWVudCwgc2VydmljZSwgem9uZSwgY2RyLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMuY2RyID0gY2RyO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdGhpcy5ydGwgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHZpc2libGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5yZXNpemFibGUgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIH1cbiAgICBnZXQgbGVmdFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gaXNUcnV0aHkodGhpcy5ydGwpID8gMCA6IG51bGw7XG4gICAgfVxuICAgIGdldCByaWdodFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gaXNUcnV0aHkodGhpcy5ydGwpID8gbnVsbCA6IDA7XG4gICAgfVxuICAgIGF1dG9GaXQoKSB7XG4gICAgICAgIGNvbnN0IGFsbExlYWZzID0gYWxsTGVhZkNvbHVtbnModGhpcy5jb2x1bW5zKTtcbiAgICAgICAgY29uc3QgY3VycmVudExlYWZzID0gbGVhZkNvbHVtbnMoW3RoaXMuY29sdW1uXSkuZmlsdGVyKGNvbHVtbiA9PiBpc1RydXRoeShjb2x1bW4ucmVzaXphYmxlKSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZm8gPSBjdXJyZW50TGVhZnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1BhcmVudFNwYW4gPSBpc0luU3BhbkNvbHVtbiQxKGNvbHVtbik7XG4gICAgICAgICAgICBjb25zdCBpc0xhc3RJblNwYW4gPSBpc1BhcmVudFNwYW4gPyBjb2x1bW4ucGFyZW50LmNoaWxkQ29sdW1ucy5sYXN0ID09PSBjb2x1bW4gOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZihjb2x1bW4sIGFsbExlYWZzKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgICAgIGhlYWRlckluZGV4OiB0aGlzLmNvbHVtbnNGb3JMZXZlbChjb2x1bW4ubGV2ZWwpLmluZGV4T2YoY29sdW1uKSxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBpc0xhc3RJblNwYW4sXG4gICAgICAgICAgICAgICAgaXNQYXJlbnRTcGFuLFxuICAgICAgICAgICAgICAgIGxldmVsOiBjb2x1bW4ubGV2ZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjdXJyZW50TGVhZnMuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLndpZHRoID0gMCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5tZWFzdXJlQ29sdW1ucyhjb2x1bW5JbmZvKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2UuY2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiB0aGlzLmNvbHVtbi5yZXNpemFibGUpLCBmaWx0ZXIoZSA9PiBpc1ByZXNlbnQoZS5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbiA9PT0gdGhpcy5jb2x1bW4pKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHNlcnZpY2UucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdzdGFydCcpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLmluaXRTdGF0ZS5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2VydmljZS5waXBlKGZpbHRlcihlID0+IGUudHlwZSA9PT0gJ3Jlc2l6ZUNvbHVtbicpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5zZXJ2aWNlLmNoYW5nZXMucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdzdGFydCcpLCBmaWx0ZXIodGhpcy5zaG91bGRVcGRhdGUuYmluZCh0aGlzKSksIHRha2UoMSkgLy9vbiBmaXJzdCByZXNpemUgb25seVxuICAgICAgICApLnN1YnNjcmliZSh0aGlzLmluaXRDb2x1bW5XaWR0aC5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZHJhZ2dhYmxlLmtlbmRvUHJlc3MucGlwZSh0YXAoc3RvcFByb3BhZ2F0aW9uKSwgdGFwKCgpID0+IHRoaXMuc2VydmljZS5zdGFydCh0aGlzLmNvbHVtbikpLCBzd2l0Y2hNYXAocHJldmVudE9uRGJsQ2xpY2skMSh0aGlzLmRyYWdnYWJsZS5rZW5kb1JlbGVhc2UpKSwgc3dpdGNoTWFwKGNyZWF0ZU1vdmVTdHJlYW0odGhpcy5zZXJ2aWNlLCB0aGlzLmRyYWdnYWJsZSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBwYWdlWCwgb3JpZ2luYWxYIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGFnZVggLSBvcmlnaW5hbFg7XG4gICAgICAgICAgICBjb25zdCBwZXJjZW50ID0gdG9QZXJjZW50YWdlKGRlbHRhLCB0aGlzLmNvbHVtbi5yZXNpemVTdGFydFdpZHRoIHx8IHRoaXMuY29sdW1uLndpZHRoKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZXNpemVDb2x1bW5zKHBlcmNlbnQpO1xuICAgICAgICB9KSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHNlcnZpY2UucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdhdXRvRml0Q29tcGxldGUnKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5zaXplVG9GaXQuYmluZCh0aGlzKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHNlcnZpY2UucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICd0cmlnZ2VyQXV0b0ZpdCcpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLmF1dG9GaXQuYmluZCh0aGlzKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB0aGlzLnJ0bCA9IHJ0bCkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gIWFsbExlYWZDb2x1bW5zKHRoaXMuY29sdW1ucylcbiAgICAgICAgICAgIC5tYXAoY29sdW1uID0+IGNvbHVtbi53aWR0aClcbiAgICAgICAgICAgIC5zb21lKGlzQmxhbmspO1xuICAgIH1cbiAgICBpbml0Q29sdW1uV2lkdGgoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uLndpZHRoID0gaGVhZGVyV2lkdGgodGhpcy5lbGVtZW50KTtcbiAgICB9XG4gICAgaW5pdFN0YXRlKCkge1xuICAgICAgICB0aGlzLmNvbHVtbi5yZXNpemVTdGFydFdpZHRoID0gaGVhZGVyV2lkdGgodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnJlc2l6ZWRDb2x1bW4oe1xuICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgICAgICAgIG9sZFdpZHRoOiB0aGlzLmNvbHVtbi5yZXNpemVTdGFydFdpZHRoXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNpemUoeyBkZWx0YVBlcmNlbnQgfSkge1xuICAgICAgICBsZXQgZGVsdGEgPSBmcm9tUGVyY2VudGFnZSh0aGlzLmNvbHVtbi5yZXNpemVTdGFydFdpZHRoLCBkZWx0YVBlcmNlbnQpO1xuICAgICAgICBpZiAoaXNUcnV0aHkodGhpcy5ydGwpKSB7XG4gICAgICAgICAgICBkZWx0YSAqPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KHRoaXMuY29sdW1uLnJlc2l6ZVN0YXJ0V2lkdGggKyBkZWx0YSwgdGhpcy5jb2x1bW4ubWluUmVzaXphYmxlV2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZURlbHRhID0gbmV3V2lkdGggPiB0aGlzLmNvbHVtbi5taW5SZXNpemFibGVXaWR0aCA/XG4gICAgICAgICAgICBkZWx0YSA6IHRoaXMuY29sdW1uLm1pblJlc2l6YWJsZVdpZHRoIC0gdGhpcy5jb2x1bW4ucmVzaXplU3RhcnRXaWR0aDtcbiAgICAgICAgdGhpcy51cGRhdGVXaWR0aCh0aGlzLmNvbHVtbiwgbmV3V2lkdGgpO1xuICAgICAgICB0aGlzLnNlcnZpY2UucmVzaXplVGFibGUodGhpcy5jb2x1bW4sIHRhYmxlRGVsdGEpO1xuICAgIH1cbiAgICBzaXplVG9GaXQoeyBjb2x1bW5zLCB3aWR0aHMgfSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvbHVtbnMuaW5kZXhPZih0aGlzLmNvbHVtbik7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoLi4ud2lkdGhzLm1hcCh3ID0+IHdbaW5kZXhdKSkgKyAxOyAvL2FkZCAxcHggZm9yIElFXG4gICAgICAgIGNvbnN0IHRhYmxlRGVsdGEgPSB3aWR0aCAtIHRoaXMuY29sdW1uLnJlc2l6ZVN0YXJ0V2lkdGg7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkdGgodGhpcy5jb2x1bW4sIHdpZHRoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnJlc2l6ZVRhYmxlKHRoaXMuY29sdW1uLCB0YWJsZURlbHRhKTtcbiAgICB9XG4gICAgdXBkYXRlV2lkdGgoY29sdW1uLCB3aWR0aCkge1xuICAgICAgICBjb2x1bW4ud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7IC8vZm9yY2UgQ0QgY3ljbGVcbiAgICB9XG4gICAgY29sdW1uc0ZvckxldmVsKGxldmVsKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zVG9SZW5kZXIodGhpcy5jb2x1bW5zID8gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmxldmVsID09PSBsZXZlbCkgOiBbXSk7XG4gICAgfVxufVxuQ29sdW1uSGFuZGxlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkQ29sdW1uSGFuZGxlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ29sdW1uSGFuZGxlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRHJhZ2dhYmxlRGlyZWN0aXZlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbkNvbHVtbkhhbmRsZURpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW5zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHZpc2libGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmRpc3BsYXknLF0gfV0sXG4gICAgbGVmdFN0eWxlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5sZWZ0JyxdIH1dLFxuICAgIHJpZ2h0U3R5bGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLnJpZ2h0JyxdIH1dLFxuICAgIGF1dG9GaXQ6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydkYmxjbGljaycsXSB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBzZWxlY3QtYWxsIGNoZWNrYm94IGZlYXR1cmUgb2YgdGhlIEdyaWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBzZWxlY3Rpb25fZ3JpZCAlfSN0b2Mtc2VsZWN0LWFsbC1mZWF0dXJlKSkuXG4gKi9cbmNsYXNzIFNlbGVjdEFsbENoZWNrYm94RGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihzZWxlY3Rpb25TZXJ2aWNlLCBlbCwgcmVuZGVyZXIsIG5nWm9uZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UgPSBzZWxlY3Rpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYGtlbmRvR3JpZFNlbGVjdEFsbENoZWNrYm94YCBzZWxlY3QtYWxsIGNoZWNrYm94XG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgc2VsZWN0aW9uX2dyaWQgJX0jdG9jLXNlbGVjdC1hbGwtZmVhdHVyZSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgdGhpcy5zdGF0ZVNldCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lDbGljayA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgXCJjbGlja1wiLCB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXQgPSB0cnVlO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveUNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lDbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICAvLyB5aWVsZHMgY29uc2lzdGVudCBjcm9zcy1icm93c2VyIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgYW4gXCJpbmRldGVybWluYXRlXCIgY2hlY2tib3hcbiAgICAgICAgY29uc3QgdW5kZWZpbmVkQ2hlY2tlZFN0YXRlSW5JRSA9IGRldGVjdElFKCkgJiYgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFN0YXRlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHVuZGVmaW5lZENoZWNrZWRTdGF0ZUluSUUgPyB0cnVlIDogdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNoZWNrZWQ7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2Uub3B0aW9ucztcbiAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGFuZ2UuZW1pdChpc0NoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwidW5jaGVja2VkXCIpO1xuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkICYmIG9wdGlvbnMubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS51cGRhdGVBbGwoaXNDaGVja2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXRTdGF0ZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUkJDEgPSB0aGlzLnN0YXRlU2V0ID8gdGhpcy5zdGF0ZVRvQm9vbCgpIDogdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFN0YXRlO1xuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW0sIFwiaW5kZXRlcm1pbmF0ZVwiLCAhaXNQcmVzZW50KHN0YXRlJCQxKSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbSwgXCJjaGVja2VkXCIsIGlzUHJlc2VudChzdGF0ZSQkMSkgPyBzdGF0ZSQkMSA6IGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHN0YXRlVG9Cb29sKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjYXNlIFwidW5jaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuU2VsZWN0QWxsQ2hlY2tib3hEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRTZWxlY3RBbGxDaGVja2JveF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblNlbGVjdEFsbENoZWNrYm94RGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogU2VsZWN0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcblNlbGVjdEFsbENoZWNrYm94RGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHN0YXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RBbGxDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICB0eXBlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnR5cGUnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGaWx0ZXJNZW51Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJTZXJ2aWNlLCBwb3B1cFNlcnZpY2UsIGxvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UgPSBmaWx0ZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlckxhYmVsID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdmaWx0ZXInKTtcbiAgICB9XG4gICAgZ2V0IGhhc0ZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzQnlGaWVsZCh0aGlzLmZpbHRlciwgKHRoaXMuY29sdW1uIHx8IHt9KS5maWVsZCkubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgdG9nZ2xlKGFuY2hvciwgdGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oYW5jaG9yLCB0ZW1wbGF0ZSwgdGhpcy5wb3B1cFJlZik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucG9wdXBTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICB9XG59XG5GaWx0ZXJNZW51Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWZpbHRlci1tZW51JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YSAjYW5jaG9yXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2stZ3JpZC1maWx0ZXInOnRydWUsICdrLXN0YXRlLWFjdGl2ZSc6IGhhc0ZpbHRlcnN9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoYW5jaG9yLCB0ZW1wbGF0ZSlcIlxuICAgICAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiZmlsdGVyTGFiZWxcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1maWx0ZXJcIj48L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxrZW5kby1ncmlkLWZpbHRlci1tZW51LWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgKGNsb3NlKT1cImNsb3NlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1maWx0ZXItbWVudS1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5GaWx0ZXJNZW51Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRmlsdGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogU2luZ2xlUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5GaWx0ZXJNZW51Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNvbHVtbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuY29uc3QgaXNOb1ZhbHVlT3BlcmF0b3IgPSBvcGVyYXRvciA9PiAob3BlcmF0b3IgPT09IFwiaXNudWxsXCJcbiAgICB8fCBvcGVyYXRvciA9PT0gXCJpc25vdG51bGxcIlxuICAgIHx8IG9wZXJhdG9yID09PSBcImlzZW1wdHlcIlxuICAgIHx8IG9wZXJhdG9yID09PSBcImlzbm90ZW1wdHlcIik7XG5jb25zdCB2YWxpZEZpbHRlcnMgPSAoeyB2YWx1ZSwgb3BlcmF0b3IgfSkgPT4gIWlzTnVsbE9yRW1wdHlTdHJpbmcodmFsdWUpIHx8IGlzTm9WYWx1ZU9wZXJhdG9yKG9wZXJhdG9yKTtcbmNvbnN0IHRyaW1GaWx0ZXJzID0gZmlsdGVyJCQxID0+IHtcbiAgICBmaWx0ZXIkJDEuZmlsdGVycyA9IGZpbHRlciQkMS5maWx0ZXJzLmZpbHRlcih2YWxpZEZpbHRlcnMpO1xuICAgIHJldHVybiBmaWx0ZXIkJDE7XG59O1xuY29uc3QgZmluZFBhcmVudCA9IChmaWx0ZXJzLCBmaWVsZCwgcGFyZW50KSA9PiB7XG4gICAgcmV0dXJuIGZpbHRlcnMucmVkdWNlKChhY2MsIGZpbHRlciQkMSkgPT4ge1xuICAgICAgICBpZiAoYWNjKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIkJDEuZmlsdGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRQYXJlbnQoZmlsdGVyJCQxLmZpbHRlcnMsIGZpZWxkLCBmaWx0ZXIkJDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbHRlciQkMS5maWVsZCA9PT0gZmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB1bmRlZmluZWQpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOmFsaWduXG59O1xuY29uc3QgcGFyZW50TG9naWNPZkRlZmF1bHQgPSAoZmlsdGVyJCQxLCBmaWVsZCwgZGVmID0gXCJhbmRcIikgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGZpbmRQYXJlbnQoKChmaWx0ZXIkJDEgfHwge30pLmZpbHRlcnMgfHwgW10pLCBmaWVsZCk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChwYXJlbnQpID8gcGFyZW50LmxvZ2ljIDogZGVmO1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBGaWx0ZXJNZW51Q29udGFpbmVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRTZXJ2aWNlLCBjaGlsZFNlcnZpY2UsIGxvY2FsaXphdGlvbiwgY2QpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTZXJ2aWNlID0gcGFyZW50U2VydmljZTtcbiAgICAgICAgdGhpcy5jaGlsZFNlcnZpY2UgPSBjaGlsZFNlcnZpY2U7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLmNkID0gY2Q7XG4gICAgICAgIHRoaXMuY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGlvbnNDbGFzcyA9ICdrLWFjdGlvbi1idXR0b25zIGstYnV0dG9uLWdyb3VwJztcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVDb250ZXh0ID0ge307XG4gICAgfVxuICAgIGdldCBmaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHJvb3QgZmlsdGVyLlxuICAgICAqIEB0eXBlIHtDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIHNldCBmaWx0ZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyID0gY2xvbmVGaWx0ZXJzKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGNoaWxkRmlsdGVyKCkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLl9jaGlsZEZpbHRlcikpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRmlsdGVyID0ge1xuICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNCeUZpZWxkKHRoaXMuZmlsdGVyLCAodGhpcy5jb2x1bW4gfHwge30pLmZpZWxkKSxcbiAgICAgICAgICAgICAgICBsb2dpYzogcGFyZW50TG9naWNPZkRlZmF1bHQodGhpcy5maWx0ZXIsICh0aGlzLmNvbHVtbiB8fCB7fSkuZmllbGQpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZEZpbHRlcjtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGlsZFNlcnZpY2UuY2hhbmdlcy5zdWJzY3JpYmUoZmlsdGVyJCQxID0+IHRoaXMuX2NoaWxkRmlsdGVyID0gZmlsdGVyJCQxKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2QubWFya0ZvckNoZWNrKCkpKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jaGlsZEZpbHRlci5maWx0ZXJzLnNvbWUodmFsaWRGaWx0ZXJzKTtcbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlQ29udGV4dCgpIHtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVDb250ZXh0LmNvbHVtbiA9IHRoaXMuY29sdW1uO1xuICAgICAgICB0aGlzLl90ZW1wbGF0ZUNvbnRleHQuZmlsdGVyID0gdGhpcy5jaGlsZEZpbHRlcjtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVDb250ZXh0LmZpbHRlclNlcnZpY2UgPSB0aGlzLmNoaWxkU2VydmljZTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQ29udGV4dFtcIiRpbXBsaWNpdFwiXSA9IHRoaXMuY2hpbGRGaWx0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUNvbnRleHQ7XG4gICAgfVxuICAgIGdldCBoYXNUZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbHVtbikgJiYgaXNQcmVzZW50KHRoaXMuY29sdW1uLmZpbHRlck1lbnVUZW1wbGF0ZVJlZik7XG4gICAgfVxuICAgIHN1Ym1pdCgpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyJCQxID0gdHJpbUZpbHRlcnModGhpcy5jaGlsZEZpbHRlcik7XG4gICAgICAgIGlmIChmaWx0ZXIkJDEuZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZpbHRlciB8fCB7XG4gICAgICAgICAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgICAgICAgICAgbG9naWM6IFwiYW5kXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZW1vdmVGaWx0ZXIocm9vdCwgdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgcm9vdC5maWx0ZXJzLnB1c2goZmlsdGVyJCQxKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50U2VydmljZS5maWx0ZXIocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZS5lbWl0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZpbHRlciB8fCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgIGxvZ2ljOiBcImFuZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJlbW92ZUZpbHRlcihyb290LCB0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMucGFyZW50U2VydmljZS5maWx0ZXIocm9vdCk7XG4gICAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICBnZXQgY2xlYXJUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KFwiZmlsdGVyQ2xlYXJCdXR0b25cIik7XG4gICAgfVxuICAgIGdldCBmaWx0ZXJUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KFwiZmlsdGVyRmlsdGVyQnV0dG9uXCIpO1xuICAgIH1cbn1cbkZpbHRlck1lbnVDb250YWluZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtGaWx0ZXJTZXJ2aWNlXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtZmlsdGVyLW1lbnUtY29udGFpbmVyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8Zm9ybSAoc3VibWl0KT1cInN1Ym1pdCgpXCIgKHJlc2V0KT1cInJlc2V0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWZpbHRlci1tZW51IGstZ3JvdXAgay1yZXNldCBrLXN0YXRlLWJvcmRlci11cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImstZmlsdGVyLW1lbnUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaGFzVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0ZpbHRlck1lbnVIb3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlclNlcnZpY2VdPVwiY2hpbGRTZXJ2aWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJjaGlsZEZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJNZW51VGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5maWx0ZXJNZW51VGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ0ZW1wbGF0ZUNvbnRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiYWN0aW9uc0NsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInJlc2V0XCIgY2xhc3M9XCJrLWJ1dHRvblwiPnt7Y2xlYXJUZXh0fX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj57e2ZpbHRlclRleHR9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZpbHRlck1lbnVDb250YWluZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBGaWx0ZXJTZXJ2aWNlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9XSB9LFxuICAgIHsgdHlwZTogRmlsdGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcbkZpbHRlck1lbnVDb250YWluZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2xvc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aW9uc0NsYXNzOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlck1lbnVJbnB1dFdyYXBwZXJDb21wb25lbnQgZXh0ZW5kcyBGaWx0ZXJJbnB1dFdyYXBwZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvcGVyYXRvckNoYW5nZShkYXRhSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRPcGVyYXRvciA9IGRhdGFJdGVtO1xuICAgIH1cbiAgICBmaWx0ZXJDaGFuZ2UoZmlsdGVyJCQxKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyJCQxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZmlsdGVyIGZvciB0aGUgYXNzb2NpYXRlZCBjb2x1bW4gZmllbGQuXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge0ZpbHRlckRlc2NyaXB0b3J9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50RmlsdGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgZm9yIHRoZSBhc3NvY2lhdGVkIGNvbHVtbiBmaWVsZC5cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7RmlsdGVyRGVzY3JpcHRvcn1cbiAgICAgKi9cbiAgICBzZXQgY3VycmVudEZpbHRlcih2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50RmlsdGVyID0gdmFsdWU7XG4gICAgfVxuICAgIHVwZGF0ZUZpbHRlcihmaWx0ZXIkJDEpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmN1cnJlbnRGaWx0ZXIsIGZpbHRlciQkMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjtcbiAgICB9XG4gICAgb25DaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJDaGFuZ2UodGhpcy51cGRhdGVGaWx0ZXIoe1xuICAgICAgICAgICAgZmllbGQ6IHRoaXMuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMuY3VycmVudE9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5GaWx0ZXJNZW51SW5wdXRXcmFwcGVyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWZpbHRlci1tZW51LWlucHV0LXdyYXBwZXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1kcm9wZG93bmxpc3RcbiAgICAgICAgICAgIFtkYXRhXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib3BlcmF0b3JDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudE9wZXJhdG9yXCJcbiAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgdmFsdWVGaWVsZD1cInZhbHVlXCI+XG4gICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5GaWx0ZXJNZW51SW5wdXRXcmFwcGVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107XG5GaWx0ZXJNZW51SW5wdXRXcmFwcGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGZpbHRlclNlcnZpY2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGN1cnJlbnRGaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU3RyaW5nRmlsdGVyTWVudUlucHV0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRvcnMgPSBbXTtcbiAgICB9XG59XG5TdHJpbmdGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1tZW51LWlucHV0JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItbWVudS1pbnB1dC13cmFwcGVyXG4gICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBbZGVmYXVsdE9wZXJhdG9yXT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxuICAgICAgICAgICAgW2ZpbHRlclNlcnZpY2VdPVwiZmlsdGVyU2VydmljZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJrLXRleHRib3hcIiBrZW5kb0ZpbHRlcklucHV0IFtmaWx0ZXJEZWxheV09XCIwXCIgW25nTW9kZWxdPVwiY3VycmVudEZpbHRlcj8udmFsdWVcIiAvPlxuICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLW1lbnUtaW5wdXQtd3JhcHBlcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5TdHJpbmdGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3BlcmF0b3JzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgb3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGN1cnJlbnRGaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlclNlcnZpY2U6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJpbmctZmlsdGVyIG1lbnUgY29tcG9uZW50LlxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBidWlsdGluZmlsdGVydGVtcGxhdGVfZ3JpZCAlfSN0b2MtY29uZmlndXJhdGlvbi1jb21wb25lbnRzLWZvci1maWx0ZXItdGVtcGxhdGVzKSkuXG4gKi9cbmNsYXNzIFN0cmluZ0ZpbHRlck1lbnVDb21wb25lbnQgZXh0ZW5kcyBTdHJpbmdGaWx0ZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikge1xuICAgICAgICBzdXBlcihudWxsLCBsb2NhbGl6YXRpb24pO1xuICAgICAgICB0aGlzLmxvZ2ljT3BlcmF0b3JzID0gbG9naWNPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGN1cnJlbnQgbWVudSBmaWx0ZXIuXG4gICAgICAgICAqIEB0eXBlIHtDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSB7IGZpbHRlcnM6IFtdLCBsb2dpYzogXCJhbmRcIiB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXRzIG9mIHNlY29uZCBjcml0ZXJpYSB3aWxsIGRpc3BsYXllZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXh0cmEgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBmaXJzdEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHNldEZpbHRlcigwLCB0aGlzLmZpbHRlciwgKHRoaXMuY29sdW1uIHx8IHt9KS5maWVsZCwgdGhpcy5vcGVyYXRvcik7XG4gICAgfVxuICAgIGdldCBzZWNvbmRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoMSwgdGhpcy5maWx0ZXIsICh0aGlzLmNvbHVtbiB8fCB7fSkuZmllbGQsIHRoaXMub3BlcmF0b3IpO1xuICAgIH1cbiAgICBsb2dpY0NoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmZpbHRlci5sb2dpYyA9IHZhbHVlO1xuICAgIH1cbiAgICBsb2NhbGl6YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMubG9naWNPcGVyYXRvcnMgPSBsb2dpY09wZXJhdG9ycyh0aGlzLmxvY2FsaXphdGlvbik7XG4gICAgICAgIHN1cGVyLmxvY2FsaXphdGlvbkNoYW5nZSgpO1xuICAgIH1cbn1cblN0cmluZ0ZpbHRlck1lbnVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1tZW51JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1zdHJpbmctZmlsdGVyLW1lbnUtaW5wdXRcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cImZpcnN0RmlsdGVyXCJcbiAgICAgICAgICAgIFtvcGVyYXRvcnNdPVwib3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFtmaWx0ZXJTZXJ2aWNlXT1cImZpbHRlclNlcnZpY2VcIlxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIj5cbiAgICAgICAgPC9rZW5kby1ncmlkLXN0cmluZy1maWx0ZXItbWVudS1pbnB1dD5cbiAgICAgICAgPGtlbmRvLWRyb3Bkb3dubGlzdFxuICAgICAgICAgICAgKm5nSWY9XCJleHRyYVwiXG4gICAgICAgICAgICBjbGFzcz1cImstZmlsdGVyLWFuZFwiXG4gICAgICAgICAgICBbZGF0YV09XCJsb2dpY09wZXJhdG9yc1wiXG4gICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiICh2YWx1ZUNoYW5nZSk9XCJsb2dpY0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmaWx0ZXI/LmxvZ2ljXCJcbiAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgdmFsdWVGaWVsZD1cInZhbHVlXCI+XG4gICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICA8a2VuZG8tZ3JpZC1zdHJpbmctZmlsdGVyLW1lbnUtaW5wdXRcbiAgICAgICAgICAgICpuZ0lmPVwiZXh0cmFcIlxuICAgICAgICAgICAgW29wZXJhdG9yc109XCJvcGVyYXRvcnNcIlxuICAgICAgICAgICAgW2N1cnJlbnRGaWx0ZXJdPVwic2Vjb25kRmlsdGVyXCJcbiAgICAgICAgICAgIFtmaWx0ZXJTZXJ2aWNlXT1cImZpbHRlclNlcnZpY2VcIlxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIj5cbiAgICAgICAgPC9rZW5kby1ncmlkLXN0cmluZy1maWx0ZXItbWVudS1pbnB1dD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblN0cmluZ0ZpbHRlck1lbnVDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5TdHJpbmdGaWx0ZXJNZW51Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwnLF0gfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGV4dHJhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJTZXJ2aWNlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbnVtZXJpYy1maWx0ZXIgbWVudSBjb21wb25lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqICBgYGBodG1sLW5vLXJ1blxuICogICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIiB0aXRsZT1cIlVuaXQgUHJpY2VcIj5cbiAqICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJNZW51VGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LWZpbHRlclNlcnZpY2U9XCJmaWx0ZXJTZXJ2aWNlXCI+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1tZW51XG4gKiAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICogICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAqICAgICAgICAgICAgICBbZmlsdGVyU2VydmljZV09XCJmaWx0ZXJTZXJ2aWNlXCJcbiAqICAgICAgICAgICAgICA+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItbWVudT5cbiAqICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgIGBgYFxuICovXG5jbGFzcyBOdW1lcmljRmlsdGVyTWVudUNvbXBvbmVudCBleHRlbmRzIE51bWVyaWNGaWx0ZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikge1xuICAgICAgICBzdXBlcihudWxsLCBsb2NhbGl6YXRpb24pO1xuICAgICAgICB0aGlzLmxvZ2ljT3BlcmF0b3JzID0gbG9naWNPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGN1cnJlbnQgbWVudSBmaWx0ZXIuXG4gICAgICAgICAqIEB0eXBlIHtDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSB7IGZpbHRlcnM6IFtdLCBsb2dpYzogXCJhbmRcIiB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXRzIG9mIHNlY29uZCBjcml0ZXJpYSB3aWxsIGRpc3BsYXllZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXh0cmEgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBmaXJzdEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHNldEZpbHRlcigwLCB0aGlzLmZpbHRlciwgKHRoaXMuY29sdW1uIHx8IHt9KS5maWVsZCwgdGhpcy5vcGVyYXRvcik7XG4gICAgfVxuICAgIGdldCBzZWNvbmRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoMSwgdGhpcy5maWx0ZXIsICh0aGlzLmNvbHVtbiB8fCB7fSkuZmllbGQsIHRoaXMub3BlcmF0b3IpO1xuICAgIH1cbiAgICBsb2dpY0NoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmZpbHRlci5sb2dpYyA9IHZhbHVlO1xuICAgIH1cbiAgICBsb2NhbGl6YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMubG9naWNPcGVyYXRvcnMgPSBsb2dpY09wZXJhdG9ycyh0aGlzLmxvY2FsaXphdGlvbik7XG4gICAgICAgIHN1cGVyLmxvY2FsaXphdGlvbkNoYW5nZSgpO1xuICAgIH1cbn1cbk51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLW1lbnUnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLW1lbnUtaW5wdXRcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cImZpcnN0RmlsdGVyXCJcbiAgICAgICAgICAgIFtvcGVyYXRvcnNdPVwib3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFtmaWx0ZXJTZXJ2aWNlXT1cImZpbHRlclNlcnZpY2VcIlxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxuICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgW2RlY2ltYWxzXT1cImRlY2ltYWxzXCJcbiAgICAgICAgICAgIFtzcGlubmVyc109XCJzcGlubmVyc1wiXG4gICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgPC9rZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLW1lbnUtaW5wdXQ+XG4gICAgICAgIDxrZW5kby1kcm9wZG93bmxpc3RcbiAgICAgICAgICAgICpuZ0lmPVwiZXh0cmFcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWZpbHRlci1hbmRcIlxuICAgICAgICAgICAgW2RhdGFdPVwibG9naWNPcGVyYXRvcnNcIlxuICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvZ2ljQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlcj8ubG9naWNcIlxuICAgICAgICAgICAgdGV4dEZpZWxkPVwidGV4dFwiXG4gICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIj5cbiAgICAgICAgPC9rZW5kby1kcm9wZG93bmxpc3Q+XG4gICAgICAgIDxrZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLW1lbnUtaW5wdXRcbiAgICAgICAgICAgICpuZ0lmPVwiZXh0cmFcIlxuICAgICAgICAgICAgW29wZXJhdG9yc109XCJvcGVyYXRvcnNcIlxuICAgICAgICAgICAgW2N1cnJlbnRGaWx0ZXJdPVwic2Vjb25kRmlsdGVyXCJcbiAgICAgICAgICAgIFtmaWx0ZXJTZXJ2aWNlXT1cImZpbHRlclNlcnZpY2VcIlxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxuICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgW2RlY2ltYWxzXT1cImRlY2ltYWxzXCJcbiAgICAgICAgICAgIFtzcGlubmVyc109XCJzcGlubmVyc1wiXG4gICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgPC9rZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLW1lbnUtaW5wdXQ+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5OdW1lcmljRmlsdGVyTWVudUNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbk51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWZpbHRlcmNlbGwnLF0gfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGV4dHJhOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJTZXJ2aWNlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE51bWVyaWNGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5vcGVyYXRvcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgd2hpY2ggaXMgdXNlZCB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRoZSBjb21wb25lbnQgdmFsdWUuXG4gICAgICAgICAqIEB0eXBlIHtudW1lcmljfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGVwID0gMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSAqKlVwKiogYW5kICoqRG93bioqIHNwaW4gYnV0dG9ucyB3aWxsIGJlIHJlbmRlcmVkLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3Bpbm5lcnMgPSB0cnVlO1xuICAgIH1cbiAgICBtZXNzYWdlRm9yKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KGtleSk7XG4gICAgfVxufVxuTnVtZXJpY0ZpbHRlck1lbnVJbnB1dENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1tZW51LWlucHV0JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItbWVudS1pbnB1dC13cmFwcGVyXG4gICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBbZGVmYXVsdE9wZXJhdG9yXT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxuICAgICAgICAgICAgW2ZpbHRlclNlcnZpY2VdPVwiZmlsdGVyU2VydmljZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveFxuICAgICAgICAgICAgICAgIGtlbmRvRmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICBbZmlsdGVyRGVsYXldPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F1dG9Db3JyZWN0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50RmlsdGVyPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgICAgIFtkZWNpbWFsc109XCJkZWNpbWFsc1wiXG4gICAgICAgICAgICAgICAgW3NwaW5uZXJzXT1cInNwaW5uZXJzXCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveC1tZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICBbaW5jcmVtZW50XT1cIm1lc3NhZ2VGb3IoJ2ZpbHRlck51bWVyaWNJbmNyZW1lbnQnKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWNyZW1lbnRdPVwibWVzc2FnZUZvcignZmlsdGVyTnVtZXJpY0RlY3JlbWVudCcpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9rZW5kby1udW1lcmljdGV4dGJveC1tZXNzYWdlcz5cbiAgICAgICAgICAgIDwva2VuZG8tbnVtZXJpY3RleHRib3g+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1maWx0ZXItbWVudS1pbnB1dC13cmFwcGVyPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuTnVtZXJpY0ZpbHRlck1lbnVJbnB1dENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcbk51bWVyaWNGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3BlcmF0b3JzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW46IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgb3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGN1cnJlbnRGaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlclNlcnZpY2U6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzcGlubmVyczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZGVjaW1hbHM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcm1hdDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRhdGUtZmlsdGVyIG1lbnUgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgYGBgaHRtbC1uby1ydW5cbiAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiT3JkZXJEYXRlXCIgdGl0bGU9XCJPcmRlciBEYXRlXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyTWVudVRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1maWx0ZXJTZXJ2aWNlPVwiZmlsdGVyU2VydmljZVwiPlxuICogICAgICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51XG4gKiAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gKiAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gKiAgICAgICAgICAgICAgICBbZmlsdGVyU2VydmljZV09XCJmaWx0ZXJTZXJ2aWNlXCJcbiAqICAgICAgICAgICAgICAgID5cbiAqICAgICAgICAgICAgPC9rZW5kby1ncmlkLWRhdGUtZmlsdGVyLW1lbnU+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICBgYGBcbiAqL1xuY2xhc3MgRGF0ZUZpbHRlck1lbnVDb21wb25lbnQgZXh0ZW5kcyBEYXRlRmlsdGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgc3VwZXIobnVsbCwgbG9jYWxpemF0aW9uKTtcbiAgICAgICAgdGhpcy5sb2dpY09wZXJhdG9ycyA9IGxvZ2ljT3BlcmF0b3JzKHRoaXMubG9jYWxpemF0aW9uKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjdXJyZW50IG1lbnUgZmlsdGVyLlxuICAgICAgICAgKiBAdHlwZSB7Q29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0geyBmaWx0ZXJzOiBbXSwgbG9naWM6IFwiYW5kXCIgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIGlucHV0cyBvZiBzZWNvbmQgY3JpdGVyaWEgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4dHJhID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgZmlyc3RGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoMCwgdGhpcy5maWx0ZXIsICh0aGlzLmNvbHVtbiB8fCB7fSkuZmllbGQsIHRoaXMub3BlcmF0b3IpO1xuICAgIH1cbiAgICBnZXQgc2Vjb25kRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gc2V0RmlsdGVyKDEsIHRoaXMuZmlsdGVyLCAodGhpcy5jb2x1bW4gfHwge30pLmZpZWxkLCB0aGlzLm9wZXJhdG9yKTtcbiAgICB9XG4gICAgbG9naWNDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy5maWx0ZXIubG9naWMgPSB2YWx1ZTtcbiAgICB9XG4gICAgbG9jYWxpemF0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmxvZ2ljT3BlcmF0b3JzID0gbG9naWNPcGVyYXRvcnModGhpcy5sb2NhbGl6YXRpb24pO1xuICAgICAgICBzdXBlci5sb2NhbGl6YXRpb25DaGFuZ2UoKTtcbiAgICB9XG59XG5EYXRlRmlsdGVyTWVudUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51LWlucHV0XG4gICAgICAgICAgICBbY3VycmVudEZpbHRlcl09XCJmaXJzdEZpbHRlclwiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBbZmlsdGVyU2VydmljZV09XCJmaWx0ZXJTZXJ2aWNlXCJcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIlxuICAgICAgICAgICAgW2JvdHRvbVZpZXddPVwiYm90dG9tVmlld1wiXG4gICAgICAgICAgICBbdG9wVmlld109XCJ0b3BWaWV3XCJcbiAgICAgICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgICAgICAgIFtmb3JtYXRQbGFjZWhvbGRlcl09XCJmb3JtYXRQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgICAgW3dlZWtOdW1iZXJdPVwid2Vla051bWJlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51LWlucHV0PlxuICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0XG4gICAgICAgICAgICAqbmdJZj1cImV4dHJhXCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1maWx0ZXItYW5kXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImxvZ2ljT3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJsb2dpY0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmaWx0ZXI/LmxvZ2ljXCJcbiAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgdmFsdWVGaWVsZD1cInZhbHVlXCI+XG4gICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51LWlucHV0XG4gICAgICAgICAgICAqbmdJZj1cImV4dHJhXCJcbiAgICAgICAgICAgIFtvcGVyYXRvcnNdPVwib3BlcmF0b3JzXCJcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cInNlY29uZEZpbHRlclwiXG4gICAgICAgICAgICBbZmlsdGVyU2VydmljZV09XCJmaWx0ZXJTZXJ2aWNlXCJcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAgICAgICAgICAgIFthY3RpdmVWaWV3XT1cImFjdGl2ZVZpZXdcIlxuICAgICAgICAgICAgW2JvdHRvbVZpZXddPVwiYm90dG9tVmlld1wiXG4gICAgICAgICAgICBbdG9wVmlld109XCJ0b3BWaWV3XCJcbiAgICAgICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgICAgICAgIFtmb3JtYXRQbGFjZWhvbGRlcl09XCJmb3JtYXRQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgICAgW3dlZWtOdW1iZXJdPVwid2Vla051bWJlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51LWlucHV0PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRGF0ZUZpbHRlck1lbnVDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5EYXRlRmlsdGVyTWVudUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1maWx0ZXJjZWxsJyxdIH1dLFxuICAgIGNvbHVtbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBleHRyYTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyU2VydmljZTogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIEJvb2xlYW4tZmlsdGVyIG1lbnUgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgYGBgaHRtbC1uby1ydW5cbiAqICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRGlzY29udGludWVkXCIgdGl0bGU9XCJEaXNjb250aW51ZWRcIj5cbiAqICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJNZW51VGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LWZpbHRlclNlcnZpY2U9XCJmaWx0ZXJTZXJ2aWNlXCI+XG4gKiAgICAgICAgICAgIDxrZW5kby1ncmlkLWJvb2xlYW4tZmlsdGVyLW1lbnVcbiAqICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAqICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcbiAqICAgICAgICAgICAgICAgIFtmaWx0ZXJTZXJ2aWNlXT1cImZpbHRlclNlcnZpY2VcIlxuICogICAgICAgICAgICAgICAgPlxuICogICAgICAgICAgICA8L2tlbmRvLWdyaWQtYm9vbGVhbi1maWx0ZXItbWVudT5cbiAqICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgIGBgYFxuICovXG5jbGFzcyBCb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudCBleHRlbmRzIEJvb2xlYW5GaWx0ZXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbikge1xuICAgICAgICBzdXBlcihudWxsLCBsb2NhbGl6YXRpb24pO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGN1cnJlbnQgbWVudSBmaWx0ZXIuXG4gICAgICAgICAqIEB0eXBlIHtDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSB7IGZpbHRlcnM6IFtdLCBsb2dpYzogXCJhbmRcIiB9O1xuICAgICAgICB0aGlzLmlkUHJlZml4ID0gZ3VpZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICByYWRpb0lkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmlkUHJlZml4fV8ke3ZhbHVlfWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKHRoaXMudXBkYXRlRmlsdGVyKHtcbiAgICAgICAgICAgIGZpZWxkOiB0aGlzLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcImVxXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaXNTZWxlY3RlZChyYWRpb1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnNCeUZpZWxkKHRoaXMuY29sdW1uLmZpZWxkKS5zb21lKCh7IHZhbHVlIH0pID0+IHZhbHVlID09PSByYWRpb1ZhbHVlKTtcbiAgICB9XG59XG5Cb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1ib29sZWFuLWZpbHRlci1tZW51JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8dWwgY2xhc3M9XCJrLXJhZGlvLWxpc3Qgay1yZXNldFwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImlkUHJlZml4XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLXJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChpdGVtLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInJhZGlvSWQoaXRlbS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0udmFsdWUpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBbYXR0ci5mb3JdPVwicmFkaW9JZChpdGVtLnZhbHVlKVwiPnt7aXRlbS50ZXh0fX08L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkJvb2xlYW5GaWx0ZXJNZW51Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuQm9vbGVhbkZpbHRlck1lbnVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZmlsdGVyY2VsbCcsXSB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlclNlcnZpY2U6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqXG4gKiA+IExpc3QgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzIGFzIGBlbnRyeUNvbXBvbmVudHNgIGluIHRoZSBHcmlkTW9kdWxlLlxuICovXG5jb25zdCBmaWx0ZXJNZW51Q29tcG9uZW50RmFjdG9yeSA9ICh0eXBlKSA9PiAoe1xuICAgIFwiYm9vbGVhblwiOiBCb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudCxcbiAgICBcImRhdGVcIjogRGF0ZUZpbHRlck1lbnVDb21wb25lbnQsXG4gICAgXCJudW1lcmljXCI6IE51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgIFwidGV4dFwiOiBTdHJpbmdGaWx0ZXJNZW51Q29tcG9uZW50XG59W3R5cGVdKTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlck1lbnVIb3N0RGlyZWN0aXZlIGV4dGVuZHMgRmlsdGVySG9zdERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoaG9zdCwgcmVzb2x2ZXIpIHtcbiAgICAgICAgc3VwZXIoaG9zdCwgcmVzb2x2ZXIpO1xuICAgIH1cbiAgICBjb21wb25lbnRUeXBlKCkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuY29sdW1uKSAmJiAhaXNOdWxsT3JFbXB0eVN0cmluZyh0aGlzLmNvbHVtbi5maWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTWVudUNvbXBvbmVudEZhY3RvcnkodGhpcy5jb2x1bW4uZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nRmlsdGVyTWVudUNvbXBvbmVudDtcbiAgICB9XG4gICAgaW5pdENvbXBvbmVudChjdHgpIHtcbiAgICAgICAgc3VwZXIuaW5pdENvbXBvbmVudChjdHgpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5pbnN0YW5jZS5maWx0ZXJTZXJ2aWNlID0gdGhpcy5maWx0ZXJTZXJ2aWNlO1xuICAgIH1cbn1cbkZpbHRlck1lbnVIb3N0RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9GaWx0ZXJNZW51SG9zdF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkZpbHRlck1lbnVIb3N0RGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LFxuICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH1cbl07XG5GaWx0ZXJNZW51SG9zdERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBmaWx0ZXJTZXJ2aWNlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERhdGVGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBvcHVwU2VydmljZSwgbG9jYWxpemF0aW9uU2VydmljZSkge1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlID0gbG9jYWxpemF0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5vcGVyYXRvcnMgPSBbXTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvcGVuKHBpY2tlcikge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9uQ2xvc2VcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiBwaWNrZXIuaXNBY3RpdmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgfVxuICAgIG1lc3NhZ2VGb3Ioa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0KGtleSk7XG4gICAgfVxufVxuRGF0ZUZpbHRlck1lbnVJbnB1dENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1tZW51LWlucHV0JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItbWVudS1pbnB1dC13cmFwcGVyXG4gICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiXG4gICAgICAgICAgICBbb3BlcmF0b3JzXT1cIm9wZXJhdG9yc1wiXG4gICAgICAgICAgICBbZGVmYXVsdE9wZXJhdG9yXT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxuICAgICAgICAgICAgW2ZpbHRlclNlcnZpY2VdPVwiZmlsdGVyU2VydmljZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxrZW5kby1kYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgIGtlbmRvRmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICBbZmlsdGVyRGVsYXldPVwiMFwiXG4gICAgICAgICAgICAgICAgKG9wZW4pPVwib3BlbihwaWNrZXIpXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudEZpbHRlcj8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdFBsYWNlaG9sZGVyXT1cImZvcm1hdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0XT1cImZvcm1hdFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCJhY3RpdmVWaWV3XCJcbiAgICAgICAgICAgICAgICBbYm90dG9tVmlld109XCJib3R0b21WaWV3XCJcbiAgICAgICAgICAgICAgICBbdG9wVmlld109XCJ0b3BWaWV3XCJcbiAgICAgICAgICAgICAgICBbd2Vla051bWJlcl09XCJ3ZWVrTnVtYmVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8a2VuZG8tZGF0ZXBpY2tlci1tZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICBbdG9nZ2xlXT1cIm1lc3NhZ2VGb3IoJ2ZpbHRlckRhdGVUb2dnbGUnKVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b2RheV09XCJtZXNzYWdlRm9yKCdmaWx0ZXJEYXRlVG9kYXknKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tZGF0ZXBpY2tlci1tZXNzYWdlcz5cbiAgICAgICAgICAgIDwva2VuZG8tZGF0ZXBpY2tlcj5cbiAgICAgICAgPC9rZW5kby1ncmlkLWZpbHRlci1tZW51LWlucHV0LXdyYXBwZXI+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EYXRlRmlsdGVyTWVudUlucHV0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogU2luZ2xlUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5EYXRlRmlsdGVyTWVudUlucHV0Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIG9wZXJhdG9yczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9wZXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjdXJyZW50RmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWx0ZXJTZXJ2aWNlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmb3JtYXQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcm1hdFBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwbGFjZWhvbGRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGl2ZVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGJvdHRvbVZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRvcFZpZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHdlZWtOdW1iZXI6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG5jb25zdCBJTlRFUk5BTF9DT01QT05FTlRTJDIgPSBbXG4gICAgRmlsdGVyTWVudUNvbXBvbmVudCxcbiAgICBGaWx0ZXJNZW51Q29udGFpbmVyQ29tcG9uZW50LFxuICAgIEZpbHRlck1lbnVJbnB1dFdyYXBwZXJDb21wb25lbnQsXG4gICAgU3RyaW5nRmlsdGVyTWVudUlucHV0Q29tcG9uZW50LFxuICAgIFN0cmluZ0ZpbHRlck1lbnVDb21wb25lbnQsXG4gICAgRmlsdGVyTWVudVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIE51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgIE51bWVyaWNGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQsXG4gICAgRGF0ZUZpbHRlck1lbnVJbnB1dENvbXBvbmVudCxcbiAgICBEYXRlRmlsdGVyTWVudUNvbXBvbmVudCxcbiAgICBGaWx0ZXJNZW51SG9zdERpcmVjdGl2ZSxcbiAgICBCb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudFxuXTtcbmNvbnN0IEVOVFJZX0NPTVBPTkVOVFMkMSA9IFtcbiAgICBTdHJpbmdGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgIE51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgIERhdGVGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgIEJvb2xlYW5GaWx0ZXJNZW51Q29tcG9uZW50XG5dO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZpbHRlck1lbnVNb2R1bGUge1xuICAgIHN0YXRpYyBleHBvcnRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgU3RyaW5nRmlsdGVyTWVudUNvbXBvbmVudCxcbiAgICAgICAgICAgIEZpbHRlck1lbnVUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgICAgIE51bWVyaWNGaWx0ZXJNZW51Q29tcG9uZW50LFxuICAgICAgICAgICAgRGF0ZUZpbHRlck1lbnVDb21wb25lbnQsXG4gICAgICAgICAgICBCb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudCxcbiAgICAgICAgICAgIFNoYXJlZEZpbHRlck1vZHVsZS5leHBvcnRzKClcbiAgICAgICAgXTtcbiAgICB9XG59XG5GaWx0ZXJNZW51TW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtJTlRFUk5BTF9DT01QT05FTlRTJDJdLFxuICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogRU5UUllfQ09NUE9ORU5UUyQxLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtJTlRFUk5BTF9DT01QT05FTlRTJDIsIFNoYXJlZEZpbHRlck1vZHVsZV0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW1NoYXJlZEZpbHRlck1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIENvbHVtbkxpc3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG5nWm9uZSwgcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5yZXNldCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5hcHBseSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYXV0b1N5bmMgPSB0cnVlO1xuICAgICAgICB0aGlzLmFsbG93SGlkZUFsbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjdGlvbnNDbGFzcyA9ICdrLWFjdGlvbi1idXR0b25zJztcbiAgICAgICAgdGhpcy51bmxvY2tlZENvdW50ID0gMDtcbiAgICB9XG4gICAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldCBjb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZS5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5pbmNsdWRlSW5DaG9vc2VyICE9PSBmYWxzZSk7XG4gICAgICAgIHRoaXMuYWxsQ29sdW1ucyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtblN0YXRlKCk7XG4gICAgfVxuICAgIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG4gICAgaXNEaXNhYmxlZChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5hbGxvd0hpZGVBbGwgfHwgdGhpcy5oYXNGaWx0ZXJlZCB8fCBjb2x1bW4uaGlkZGVuIHx8IHRoaXMuY29sdW1ucy5maW5kKGN1cnJlbnQgPT4gY3VycmVudCAhPT0gY29sdW1uICYmICFjdXJyZW50LmhpZGRlbikpIHx8XG4gICAgICAgICAgICAodGhpcy5oYXNWaXNpYmxlTG9ja2VkICYmICF0aGlzLmhhc1VubG9ja2VkRmlsdGVyZWQgJiYgdGhpcy51bmxvY2tlZENvdW50ID09PSAxICYmICFjb2x1bW4ubG9ja2VkICYmICFjb2x1bW4uaGlkZGVuKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kb21TdWJzY3JpcHRpb25zID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NsYXNzZXMoZS50YXJnZXQsICdrLWNoZWNrYm94JykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1N5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JyksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW4gPSAhZS50YXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKGNvbHVtbi5oaWRkZW4pICE9PSBoaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkNoYW5nZS5lbWl0KFtjb2x1bW5dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbVN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmNlbENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaENoZWNrQm94KChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5jaGVja2VkID0gIXRoaXMuY29sdW1uc1tpbmRleF0uaGlkZGVuO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNhYmxlZCgpO1xuICAgICAgICB0aGlzLnJlc2V0LmVtaXQoKTtcbiAgICB9XG4gICAgYXBwbHlDaGFuZ2VzKCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaENoZWNrQm94KChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGhpZGRlbiA9ICFlbGVtZW50LmNoZWNrZWQ7XG4gICAgICAgICAgICBpZiAoQm9vbGVhbihjb2x1bW4uaGlkZGVuKSAhPT0gaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmhpZGRlbiA9IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcbiAgICAgICAgdGhpcy5hcHBseS5lbWl0KGNoYW5nZWQpO1xuICAgIH1cbiAgICBmb3JFYWNoQ2hlY2tCb3goY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2hlY2tib3hlcyA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2stY2hlY2tib3gnKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gY2hlY2tib3hlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGNoZWNrYm94ZXNbaWR4XSwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEaXNhYmxlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dIaWRlQWxsICYmICF0aGlzLmhhc0xvY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrZWRJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2hDaGVja0JveCgoY2hlY2tib3gsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGNoZWNrZWRJdGVtcy5wdXNoKHsgY2hlY2tib3gsIGluZGV4IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0hpZGVBbGwgJiYgY2hlY2tlZEl0ZW1zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5oYXNGaWx0ZXJlZCkge1xuICAgICAgICAgICAgY2hlY2tlZEl0ZW1zWzBdLmNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0xvY2tlZCAmJiAhdGhpcy5oYXNVbmxvY2tlZEZpbHRlcmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZFVubG9ja2VkID0gY2hlY2tlZEl0ZW1zLmZpbHRlcihpdGVtID0+ICFjb2x1bW5zW2l0ZW0uaW5kZXhdLmxvY2tlZCk7XG4gICAgICAgICAgICBpZiAoY2hlY2tlZFVubG9ja2VkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNoZWNrZWRVbmxvY2tlZFswXS5jaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ29sdW1uU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuaGFzTG9ja2VkID0gdGhpcy5hbGxDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmxvY2tlZCAmJiAoIWNvbHVtbi5oaWRkZW4gfHwgY29sdW1uLmluY2x1ZGVJbkNob29zZXIgIT09IGZhbHNlKSkubGVuZ3RoID4gMDtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlTG9ja2VkID0gdGhpcy5hbGxDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmxvY2tlZCAmJiAhY29sdW1uLmhpZGRlbikubGVuZ3RoID4gMDtcbiAgICAgICAgdGhpcy51bmxvY2tlZENvdW50ID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5sb2NrZWQgJiYgIWNvbHVtbi5oaWRkZW4pLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gdGhpcy5hbGxDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmluY2x1ZGVJbkNob29zZXIgPT09IGZhbHNlICYmICFjb2x1bW4uaGlkZGVuKTtcbiAgICAgICAgaWYgKGZpbHRlcmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzRmlsdGVyZWQgPSBmaWx0ZXJlZENvbHVtbnMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIHRoaXMuaGFzVW5sb2NrZWRGaWx0ZXJlZCA9IGZpbHRlcmVkQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ubG9ja2VkKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYXNGaWx0ZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oYXNVbmxvY2tlZEZpbHRlcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5Db2x1bW5MaXN0Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWNvbHVtbmxpc3QnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLWNvbHVtbi1saXN0XCI+XG4gICAgICAgICAgICA8bGFiZWwgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleDtcIiBjbGFzcz0nay1jb2x1bW4tbGlzdC1pdGVtJz5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJrLWNoZWNrYm94XCIgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuZGF0YS1pbmRleF09XCJpbmRleFwiIFtjaGVja2VkXT1cIiFjb2x1bW4uaGlkZGVuXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoY29sdW1uKVwiIC8+PHNwYW4gY2xhc3M9XCJrLWNoZWNrYm94LWxhYmVsXCI+e3sgY29sdW1uLmRpc3BsYXlUaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImFjdGlvbnNDbGFzc1wiICpuZ0lmPVwiIWF1dG9TeW5jXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbENoYW5nZXMoKVwiPnt7IHJlc2V0VGV4dCB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIiAoY2xpY2spPVwiYXBwbHlDaGFuZ2VzKClcIj57eyBhcHBseVRleHQgfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db2x1bW5MaXN0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfVxuXTtcbkNvbHVtbkxpc3RDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY2xhc3NOYW1lOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogW1wiY2xhc3Muay1jb2x1bW4tbGlzdC13cmFwcGVyXCIsXSB9XSxcbiAgICByZXNldDogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGFwcGx5OiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY29sdW1uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXV0b1N5bmM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFsbG93SGlkZUFsbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYXBwbHlUZXh0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZXNldFRleHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFjdGlvbnNDbGFzczogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgY29sdW1ucyBpbiB0aGUgR3JpZC4gVG8gZW5hYmxlIHRoZSB1c2VyIHRvIHNob3cgb3IgaGlkZSBjb2x1bW5zLFxuICogYWRkIHRoZSBjb21wb25lbnQgaW5zaWRlIGEgW2BUb29sYmFyVGVtcGxhdGVgXSh7JSBzbHVnIGFwaV9ncmlkX3Rvb2xiYXJ0ZW1wbGF0ZWRpcmVjdGl2ZSAlfSkgZGlyZWN0aXZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB7JSBtZXRhIGhlaWdodDozMDAgJX1cbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJkYXRhXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkVG9vbGJhclRlbXBsYXRlPlxuICogICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uLWNob29zZXI+PC9rZW5kby1ncmlkLWNvbHVtbi1jaG9vc2VyPlxuICogICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJGaWVsZDJcIiBbaGlkZGVuXT1cInRydWVcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgcHVibGljIGRhdGE6IGFueVtdID0gW3sgRmllbGQxOiAnRm9vJywgRmllbGQyOiAnQmFyJyB9XTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqIHslIGVuZG1ldGEgJX1cbiAqL1xuY2xhc3MgQ29sdW1uQ2hvb3NlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBjb2x1bW5JbmZvU2VydmljZSwgcG9wdXBTZXJ2aWNlLCBuZ1pvbmUsIHJlbmRlcmVyLCBjaGFuZ2VEZXRlY3Rvcikge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5jb2x1bW5JbmZvU2VydmljZSA9IGNvbHVtbkluZm9TZXJ2aWNlO1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZSA9IHBvcHVwU2VydmljZTtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjaGFuZ2VzIGluIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb2x1bW4gd2lsbCBiZSBpbW1lZGlhdGVseSBhcHBsaWVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRvU3luYyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFsbCBjb2x1bW5zIGNhbiBiZSBoaWRkZW4uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFsbG93SGlkZUFsbCA9IHRydWU7XG4gICAgfVxuICAgIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5JbmZvU2VydmljZS5sZWFmTmFtZWRDb2x1bW5zO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlKGFuY2hvciwgdGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwUmVmKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBhbmNob3JBbGlnbjogeyB2ZXJ0aWNhbDogJ2JvdHRvbScsIGhvcml6b250YWw6IGRpcmVjdGlvbiB9LFxuICAgICAgICAgICAgICAgIHBvcHVwQWxpZ246IHsgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiBkaXJlY3Rpb24gfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLnBvcHVwUmVmLnBvcHVwRWxlbWVudCwgJ2RpcicsIHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cicpO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5jbG9zZUNsaWNrID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXCJkb2N1bWVudFwiLCBcImNsaWNrXCIsICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbG9zZXN0KHRhcmdldCwgbm9kZSA9PiBub2RlID09PSB0aGlzLnBvcHVwUmVmLnBvcHVwRWxlbWVudCB8fCBub2RlID09PSBhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQXBwbHkoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGlmIChjaGFuZ2VkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UuY2hhbmdlVmlzaWJpbGl0eShjaGFuZ2VkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DaGFuZ2UoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmNvbHVtbkluZm9TZXJ2aWNlLmNoYW5nZVZpc2liaWxpdHkoY2hhbmdlZCk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5wb3B1cFJlZikge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1cFJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRhY2hDbG9zZSgpO1xuICAgIH1cbiAgICBkZXRhY2hDbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VDbGljaykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUNsaWNrKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQ2xpY2sgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuQ29sdW1uQ2hvb3NlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1jb2x1bW4tY2hvb3NlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGJ1dHRvbiAjYW5jaG9yXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoYW5jaG9yLCB0ZW1wbGF0ZSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWJ1dHRvbiBrLWJhcmUgay1idXR0b24taWNvblwiXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJsb2NhbGl6YXRpb24uZ2V0KCdjb2x1bW5zJylcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1jb2x1bW5zXCI+PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdrLWNvbHVtbi1jaG9vc2VyLXRpdGxlJz57eyBsb2NhbGl6YXRpb24uZ2V0KCdjb2x1bW5zJykgfX08L3NwYW4+XG4gICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5saXN0XG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgW2FwcGx5VGV4dF09XCJsb2NhbGl6YXRpb24uZ2V0KCdjb2x1bW5zQXBwbHknKVwiXG4gICAgICAgICAgICAgICAgW3Jlc2V0VGV4dF09XCJsb2NhbGl6YXRpb24uZ2V0KCdjb2x1bW5zUmVzZXQnKVwiXG4gICAgICAgICAgICAgICAgW2F1dG9TeW5jXT1cImF1dG9TeW5jXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dIaWRlQWxsXT1cImFsbG93SGlkZUFsbFwiXG4gICAgICAgICAgICAgICAgKGFwcGx5KT1cIm9uQXBwbHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNvbHVtbkNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubGlzdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNvbHVtbkNob29zZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5JbmZvU2VydmljZSB9LFxuICAgIHsgdHlwZTogUG9wdXBTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcbkNvbHVtbkNob29zZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgYXV0b1N5bmM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFsbG93SGlkZUFsbDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgc2VydmljZSB0aGF0IGlzIHBhc3NlZCB0byB0aGVcbiAqIFtgQ29sdW1uTWVudVRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51dGVtcGxhdGVkaXJlY3RpdmUgJX0pIGRpcmVjdGl2ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgICAgdGVtcGxhdGU6IGBcbiAqICAgICAgIDxrZW5kby1ncmlkIFtkYXRhXT1cImRhdGFcIiBbY29sdW1uTWVudV09XCJ0cnVlXCI+XG4gKiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ29sdW1uTWVudVRlbXBsYXRlIGxldC1zZXJ2aWNlPVwic2VydmljZVwiPlxuICogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1jbG9zZVwiIChjbGljayk9XCJzZXJ2aWNlLmNsb3NlKClcIlxuICogICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDVweDsgdG9wOiA1cHg7Y3Vyc29yOiBwb2ludGVyO1wiPjwvc3Bhbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5tZW51LXNvcnQgW3NlcnZpY2VdPVwic2VydmljZVwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LXNvcnQ+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRmllbGQxXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMlwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0YTogYW55W10gPSBbeyBGaWVsZDE6ICdGb28nLCBGaWVsZDI6ICdCYXInIH1dO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDb2x1bW5NZW51U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlTWVudSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjb2x1bW4gbWVudS5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUuZW1pdCgpO1xuICAgIH1cbn1cbkNvbHVtbk1lbnVTZXJ2aWNlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ29sdW1uTWVudUl0ZW1CYXNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICF0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlcnZpY2UgaW5wdXQgb2YgdGhlIHByZWRlZmluZWQgY29sdW1uIG1lbnUgY29tcG9uZW50cyBpcyBtYW5kYXRvcnkuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG59XG5Db2x1bW5NZW51SXRlbUJhc2UucHJvcERlY29yYXRvcnMgPSB7XG4gICAgc2VydmljZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNvbHVtbm1lbnUtaXRlbS13cmFwcGVyJyxdIH1dXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgY29sdW1ucyBpbiB0aGUgR3JpZCB0aGF0IGNhbiBiZSBwbGFjZWRcbiAqIGluc2lkZSBhIFtgQ29sdW1uTWVudVRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51dGVtcGxhdGVkaXJlY3RpdmUgJX0pIGRpcmVjdGl2ZS5cbiAqXG4gKiA+IFlvdSBoYXZlIHRvIHNldCB0aGUgW0NvbHVtbk1lbnVTZXJ2aWNlXSh7JSBzbHVnIGFwaV9ncmlkX2NvbHVtbm1lbnVzZXJ2aWNlICV9KSB0aGF0IGlzIHBhc3NlZCBieVxuICogPiB0aGUgdGVtcGxhdGUgdG8gdGhlIHNlcnZpY2UgaW5wdXQgb2YgdGhlIGBrZW5kby1ncmlkLWNvbHVtbm1lbnUtY2hvb3NlcmAgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiB7JSBtZXRhIGhlaWdodDozMDAgJX1cbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJkYXRhXCIgW2NvbHVtbk1lbnVdPVwidHJ1ZVwiPlxuICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZSBsZXQtc2VydmljZT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5tZW51LWNob29zZXIgW3NlcnZpY2VdPVwic2VydmljZVwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWNob29zZXI+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRmllbGQxXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMlwiIFtoaWRkZW5dPVwidHJ1ZVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0YTogYW55W10gPSBbeyBGaWVsZDE6ICdGb28nLCBGaWVsZDI6ICdCYXInIH1dO1xuICogfVxuICpcbiAqIGBgYFxuICogeyUgZW5kbWV0YSAlfVxuICovXG5jbGFzcyBDb2x1bW5NZW51Q2hvb3NlckNvbXBvbmVudCBleHRlbmRzIENvbHVtbk1lbnVJdGVtQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBjb2x1bW5JbmZvU2VydmljZSwgY2hhbmdlRGV0ZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UgPSBjb2x1bW5JbmZvU2VydmljZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgY29udGVudCBpcyBleHBhbmRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgY29udGVudCBpcyBjb2xsYXBzZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbGxhcHNlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjb250ZW50IGlzIGV4cGFuZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25zQ2xhc3MgPSAnay1jb2x1bW5tZW51LWFjdGlvbnMnO1xuICAgIH1cbiAgICBnZXQgY29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UubGVhZk5hbWVkQ29sdW1ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQXBwbHkoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGlmIChjaGFuZ2VkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UuY2hhbmdlVmlzaWJpbGl0eShjaGFuZ2VkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNvbHVtbk1lbnVDaG9vc2VyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWNvbHVtbm1lbnUtY2hvb3NlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtIFt0ZXh0XT1cImxvY2FsaXphdGlvbi5nZXQoJ2NvbHVtbnMnKVwiXG4gICAgICAgICAgICBpY29uPVwiY29sdW1uc1wiIFtleHBhbmRlZF09XCJleHBhbmRlZFwiIChjb2xsYXBzZSk9XCJjb2xsYXBzZS5lbWl0KClcIiAoZXhwYW5kKT1cImV4cGFuZC5lbWl0KClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDb2x1bW5NZW51SXRlbUNvbnRlbnRUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5saXN0XG4gICAgICAgICAgICAgICAgICAgIFthcHBseVRleHRdPVwibG9jYWxpemF0aW9uLmdldCgnY29sdW1uc0FwcGx5JylcIlxuICAgICAgICAgICAgICAgICAgICBbcmVzZXRUZXh0XT1cImxvY2FsaXphdGlvbi5nZXQoJ2NvbHVtbnNSZXNldCcpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIFthdXRvU3luY109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFthbGxvd0hpZGVBbGxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc0NsYXNzXT1cImFjdGlvbnNDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIChhcHBseSk9XCJvbkFwcGx5KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubGlzdD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWl0ZW0+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db2x1bW5NZW51Q2hvb3NlckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENvbHVtbkluZm9TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9XG5dO1xuQ29sdW1uTWVudUNob29zZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZXhwYW5kOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgY29sbGFwc2U6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBleHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb21wb25lbnQgZm9yIGVkaXRpbmcgY29sdW1uIGZpbHRlcnMgaW4gdGhlIEdyaWQgdGhhdCBjYW4gYmUgcGxhY2VkXG4gKiBpbnNpZGUgYSBbYENvbHVtbk1lbnVUZW1wbGF0ZWBdKHslIHNsdWcgYXBpX2dyaWRfY29sdW1ubWVudXRlbXBsYXRlZGlyZWN0aXZlICV9KSBkaXJlY3RpdmUuXG4gKlxuICogPiBZb3UgaGF2ZSB0byBzZXQgdGhlIFtDb2x1bW5NZW51U2VydmljZV0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51c2VydmljZSAlfSkgdGhhdCBpcyBwYXNzZWQgYnlcbiAqID4gdGhlIHRlbXBsYXRlIHRvIHRoZSBzZXJ2aWNlIGlucHV0IG9mIHRoZSBga2VuZG8tZ3JpZC1jb2x1bW5tZW51LWZpbHRlcmAgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiB7JSBtZXRhIGhlaWdodDo0MDAgJX1cbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBba2VuZG9HcmlkQmluZGluZ109XCJkYXRhXCIgW2NvbHVtbk1lbnVdPVwidHJ1ZVwiPlxuICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZSBsZXQtc2VydmljZT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5tZW51LWZpbHRlciBbc2VydmljZV09XCJzZXJ2aWNlXCI+XG4gKiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtZmlsdGVyPlxuICogICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJGaWVsZDJcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgcHVibGljIGRhdGE6IGFueVtdID0gW3sgRmllbGQxOiAnRm9vJywgRmllbGQyOiAnQmFyJyB9XTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqIHslIGVuZG1ldGEgJX1cbiAqL1xuY2xhc3MgQ29sdW1uTWVudUZpbHRlckNvbXBvbmVudCBleHRlbmRzIENvbHVtbk1lbnVJdGVtQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgY29udGVudCBpcyBleHBhbmRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgY29udGVudCBpcyBjb2xsYXBzZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbGxhcHNlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjb250ZW50IGlzIGV4cGFuZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25zQ2xhc3MgPSAnay1jb2x1bW5tZW51LWFjdGlvbnMnO1xuICAgIH1cbn1cbkNvbHVtbk1lbnVGaWx0ZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtY29sdW1ubWVudS1maWx0ZXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbSBbdGV4dF09XCJsb2NhbGl6YXRpb24uZ2V0KCdmaWx0ZXInKVwiIGljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgW2V4cGFuZGVkXT1cImV4cGFuZGVkXCIgKGNvbGxhcHNlKT1cImNvbGxhcHNlLmVtaXQoKVwiIChleHBhbmQpPVwiZXhwYW5kLmVtaXQoKVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVJdGVtQ29udGVudFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1maWx0ZXItbWVudS1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwic2VydmljZS5jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJzZXJ2aWNlLmZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc0NsYXNzXT1cImFjdGlvbnNDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiY2xvc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtZmlsdGVyLW1lbnUtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWl0ZW0+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db2x1bW5NZW51RmlsdGVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuQ29sdW1uTWVudUZpbHRlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBleHBhbmQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2xsYXBzZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGV4cGFuZGVkOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbnRlbnQgdGVtcGxhdGUgb2YgdGhlXG4gKiBbYGtlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51aXRlbWNvbXBvbmVudCAlfSkgY29tcG9uZW50LlxuICogUHJvdmlkZXMgYW4gb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHRoZSBjb250ZW50IG9mIGEgY29sdW1uIGl0ZW0uXG4gKiBUbyBkZWZpbmUgdGhlIGNvbnRlbnQgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZVxuICogYGtlbmRvR3JpZENvbHVtbk1lbnVJdGVtQ29udGVudFRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIGEgYDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbT5gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZGF0YVwiIFtjb2x1bW5NZW51XT1cInRydWVcIj5cbiAqICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDb2x1bW5NZW51VGVtcGxhdGU+XG4gKiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtIHRleHQ9XCJJdGVtIFRleHRcIiBbZXhwYW5kZWRdPVwidHJ1ZVwiPlxuICogICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ29sdW1uTWVudUl0ZW1Db250ZW50VGVtcGxhdGU+XG4gKiAgICAgICAgICAgICAgICAgICAgICBJdGVtIENvbnRlbnRcbiAqICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtPlxuICogICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMVwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJGaWVsZDJcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgcHVibGljIGRhdGE6IGFueVtdID0gW3sgRmllbGQxOiAnRm9vJywgRmllbGQyOiAnQmFyJyB9XTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29sdW1uTWVudUl0ZW1Db250ZW50VGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5Db2x1bW5NZW51SXRlbUNvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZENvbHVtbk1lbnVJdGVtQ29udGVudFRlbXBsYXRlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ29sdW1uTWVudUl0ZW1Db250ZW50VGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGl0ZW0gdGhhdCBjYW4gYmUgcGxhY2VkIGluc2lkZSBhXG4gKiBbYENvbHVtbk1lbnVUZW1wbGF0ZWBdKHslIHNsdWcgYXBpX2dyaWRfY29sdW1ubWVudXRlbXBsYXRlZGlyZWN0aXZlICV9KSBkaXJlY3RpdmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJkYXRhXCIgW2NvbHVtbk1lbnVdPVwidHJ1ZVwiIFtyZXNpemFibGVdPVwidHJ1ZVwiICNncmlkPlxuICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZSBsZXQtc2VydmljZT1cInNlcnZpY2VcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gKiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtIGljb249XCJhcnJvd3MtcmVzaXppbmdcIiB0ZXh0PVwiRml0IGNvbHVtblwiXG4gKiAgICAgICAgICAgICAgICAgIChpdGVtQ2xpY2spPVwiZ3JpZC5hdXRvRml0Q29sdW1uKGNvbHVtbik7IHNlcnZpY2UuY2xvc2UoKVwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWl0ZW0+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRmllbGQxXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMlwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0YTogYW55W10gPSBbeyBGaWVsZDE6ICdGb28nLCBGaWVsZDI6ICdCYXInIH1dO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDb2x1bW5NZW51SXRlbUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBpdGVtIGlzIGNsaWNrZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLml0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGNvbnRlbnQgaXMgZXhwYW5kZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGNvbnRlbnQgaXMgY29sbGFwc2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2xsYXBzZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50U3RhdGUgPSAnY29sbGFwc2VkJztcbiAgICB9XG4gICAgZ2V0IGljb25DbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGBrLWktJHt0aGlzLmljb259YDtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5leHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50U3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DbGljayhlKSB7XG4gICAgICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoZSk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50U3RhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmQuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZS5lbWl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ29udGVudFN0YXRlKCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRTdGF0ZSA9IHRoaXMuZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCc7XG4gICAgfVxufVxuQ29sdW1uTWVudUl0ZW1Db21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoJ3N0YXRlJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgZGlzcGxheTogJ25vbmUnIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgZGlzcGxheTogJ2Jsb2NrJyB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKCdjb2xsYXBzZWQgPT4gZXhwYW5kZWQnLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZSgnMTAwbXMgZWFzZS1pbicsIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnKidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPT4gY29sbGFwc2VkJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnKidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlKCcxMDBtcyBlYXNlLWluJywgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwcHgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbScsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImstY29sdW1ubWVudS1pdGVtXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiIFtjbGFzcy5rLXN0YXRlLXNlbGVjdGVkXT1cInNlbGVjdGVkXCIgW2NsYXNzLmstc3RhdGUtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpY29uXCIgY2xhc3M9XCJrLWljb25cIiBbbmdDbGFzc109XCJpY29uQ2xhc3NcIj5cbiAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICB7eyB0ZXh0IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudFRlbXBsYXRlXCIgW0BzdGF0ZV09XCJjb250ZW50U3RhdGVcIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjtcIiBjbGFzcz1cImstY29sdW1ubWVudS1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFRlbXBsYXRlLnRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5Db2x1bW5NZW51SXRlbUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBpdGVtQ2xpY2s6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBleHBhbmQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2xsYXBzZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRleHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNlbGVjdGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZXhwYW5kZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbnRlbnRUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQ29sdW1uTWVudUl0ZW1Db250ZW50VGVtcGxhdGVEaXJlY3RpdmUsXSB9XVxufTtcblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2x1bW4tbWVudSBpdGVtIGZvciBzb3J0aW5nIEdyaWQgY29sdW1ucyB0aGF0IGNhbiBiZSBwbGFjZWQgaW5zaWRlIGFcbiAqIFtgQ29sdW1uTWVudVRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51dGVtcGxhdGVkaXJlY3RpdmUgJX0pIGRpcmVjdGl2ZS5cbiAqIEFsbG93cyB0aGUgdXNlciB0byBzb3J0IHRoZSBjb2x1bW4uXG4gKlxuICogPiBZb3UgaGF2ZSB0byBzZXQgdGhlIFtDb2x1bW5NZW51U2VydmljZV0oeyUgc2x1ZyBhcGlfZ3JpZF9jb2x1bW5tZW51c2VydmljZSAlfSkgdGhhdCBpcyBwYXNzZWQgYnlcbiAqID4gdGhlIHRlbXBsYXRlIHRvIHRoZSBzZXJ2aWNlIGlucHV0IG9mIHRoZSBga2VuZG8tZ3JpZC1jb2x1bW5tZW51LXNvcnRgIGNvbXBvbmVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgICAgdGVtcGxhdGU6IGBcbiAqICAgICAgIDxrZW5kby1ncmlkIFtrZW5kb0dyaWRCaW5kaW5nXT1cImRhdGFcIiBbc29ydGFibGVdPVwidHJ1ZVwiIFtjb2x1bW5NZW51XT1cInRydWVcIj5cbiAqICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDb2x1bW5NZW51VGVtcGxhdGUgbGV0LXNlcnZpY2U9XCJzZXJ2aWNlXCI+XG4gKiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1zb3J0IFtzZXJ2aWNlXT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubWVudS1zb3J0PlxuICogICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIkZpZWxkMVwiIFt3aWR0aF09XCIxMDBcIj48L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRmllbGQyXCIgW3dpZHRoXT1cIjEwMFwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICBwdWJsaWMgZGF0YTogYW55W10gPSBbeyBGaWVsZDE6ICdGb28nLCBGaWVsZDI6ICdCYXInIH0sIHsgRmllbGQxOiAnRm9vMScsIEZpZWxkMjogJ0JhcjEnIH1dO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDb2x1bW5NZW51U29ydENvbXBvbmVudCBleHRlbmRzIENvbHVtbk1lbnVJdGVtQmFzZSB7XG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCBzb3J0U2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5zb3J0U2VydmljZSA9IHNvcnRTZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgc29ydGVkQXNjKCkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAoIWRlc2NyaXB0b3IuZGlyIHx8IGRlc2NyaXB0b3IuZGlyID09PSAnYXNjJyk7XG4gICAgfVxuICAgIGdldCBzb3J0ZWREZXNjKCkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmRpciA9PT0gJ2Rlc2MnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlU29ydChkaXIpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLnNlcnZpY2UuY29sdW1uLmZpZWxkO1xuICAgICAgICBjb25zdCB7IG1vZGUsIGFsbG93VW5zb3J0IH0gPSBub3JtYWxpemUkMSh0aGlzLnNlcnZpY2Uuc29ydGFibGUpO1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yO1xuICAgICAgICBjb25zdCBzb3J0ID0gbW9kZSA9PT0gJ211bHRpcGxlJyA/IHRoaXMuc2VydmljZS5zb3J0LmZpbHRlcihzID0+IHMuZmllbGQgIT09IGZpZWxkKSA6IFtdO1xuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmRpciA9PT0gZGlyKSB7XG4gICAgICAgICAgICBpZiAoIWFsbG93VW5zb3J0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc29ydC5wdXNoKHsgZmllbGQsIGRpciB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLnNvcnQoc29ydCk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gICAgZ2V0IGRlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQodGhpcy5zZXJ2aWNlLnNvcnQgfHwgW10pLmZpbmQocyA9PiBzLmZpZWxkID09PSB0aGlzLnNlcnZpY2UuY29sdW1uLmZpZWxkKTtcbiAgICB9XG59XG5Db2x1bW5NZW51U29ydENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1jb2x1bW5tZW51LXNvcnQnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbSBbdGV4dF09XCJsb2NhbGl6YXRpb24uZ2V0KCdzb3J0QXNjZW5kaW5nJylcIlxuICAgICAgICAgICAgaWNvbj1cInNvcnQtYXNjLXNtXCIgKGl0ZW1DbGljayk9XCJ0b2dnbGVTb3J0KCdhc2MnKVwiIFtzZWxlY3RlZF09XCJzb3J0ZWRBc2NcIj5cbiAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbT5cbiAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtIFt0ZXh0XT1cImxvY2FsaXphdGlvbi5nZXQoJ3NvcnREZXNjZW5kaW5nJylcIlxuICAgICAgICAgICAgaWNvbj1cInNvcnQtZGVzYy1zbVwiIChpdGVtQ2xpY2spPVwidG9nZ2xlU29ydCgnZGVzYycpXCIgW3NlbGVjdGVkXT1cInNvcnRlZERlc2NcIj5cbiAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNvbHVtbk1lbnVTb3J0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogU29ydFNlcnZpY2UgfVxuXTtcblxuY29uc3QgUE9QVVBfQ0xBU1MgPSAnay1ncmlkLWNvbHVtbm1lbnUtcG9wdXAnO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbY29sdW1uIG1lbnVdKHslIHNsdWcgY29sdW1ubWVudV9ncmlkICV9KSBjb21wb25lbnQuXG4gKi9cbmNsYXNzIENvbHVtbk1lbnVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBvcHVwU2VydmljZSwgbG9jYWxpemF0aW9uLCBzZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMucG9wdXBTZXJ2aWNlID0gcG9wdXBTZXJ2aWNlO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhbmRhbG9uZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2V0dGluZ3MgZm9yIHRoZSBDb2x1bW4gTWVudS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc29ydGFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leHBhbmRlZEZpbHRlciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leHBhbmRlZENvbHVtbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZVN1YnNjcmlwdGlvbiA9IHNlcnZpY2UuY2xvc2VNZW51LnN1YnNjcmliZSh0aGlzLmNsb3NlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGFzRmlsdGVyICYmIGZpbHRlcnNCeUZpZWxkKHRoaXMuZmlsdGVyLCB0aGlzLmNvbHVtbi5maWVsZCkubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICghdGhpcy5zb3J0YWJsZSAmJiB0aGlzLmhhc1NvcnQgJiYgdGhpcy5zb3J0LmZpbmQoZGVzY3JpcHRvciA9PiBkZXNjcmlwdG9yLmZpZWxkID09PSB0aGlzLmNvbHVtbi5maWVsZCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhhc0ZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIGhhc0ZpbHRlcih0aGlzLnNldHRpbmdzLCB0aGlzLmNvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgaGFzU29ydCgpIHtcbiAgICAgICAgcmV0dXJuIGhhc1NvcnQodGhpcy5zZXR0aW5ncywgdGhpcy5jb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhhc0NvbHVtbkNob29zZXIoKSB7XG4gICAgICAgIHJldHVybiBoYXNDb2x1bW5DaG9vc2VyKHRoaXMuc2V0dGluZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGhhc0xvY2soKSB7XG4gICAgICAgIHJldHVybiBoYXNMb2NrKHRoaXMuc2V0dGluZ3MsIHRoaXMuY29sdW1uKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuc2VydmljZS5jb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICAgIHRoaXMuc2VydmljZS5maWx0ZXIgPSB0aGlzLmZpbHRlcjtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnNvcnRhYmxlID0gdGhpcy5zb3J0YWJsZTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5jbG9zZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlKGUsIGFuY2hvciwgdGVtcGxhdGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmV4cGFuZGVkRmlsdGVyID0gIXRoaXMuaGFzQ29sdW1uQ2hvb3NlcjtcbiAgICAgICAgdGhpcy5leHBhbmRlZENvbHVtbnMgPSAhdGhpcy5oYXNGaWx0ZXI7XG4gICAgICAgIHRoaXMucG9wdXBSZWYgPSB0aGlzLnBvcHVwU2VydmljZS5vcGVuKGFuY2hvciwgdGVtcGxhdGUsIHRoaXMucG9wdXBSZWYsIFBPUFVQX0NMQVNTKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnBvcHVwU2VydmljZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucG9wdXBSZWYgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Db2x1bW5zRXhwYW5kKCkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkQ29sdW1ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuZXhwYW5kZWRGaWx0ZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uRmlsdGVyRXhwYW5kKCkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbmRlZENvbHVtbnMgPSBmYWxzZTtcbiAgICB9XG59XG5Db2x1bW5NZW51Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbQ29sdW1uTWVudVNlcnZpY2VdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1jb2x1bW4tbWVudScsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGEgI2FuY2hvclxuICAgICAgICAgICAgY2xhc3M9XCJrLWdyaWQtY29sdW1uLW1lbnUgay1ncmlkLWZpbHRlclwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdrLXN0YXRlLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgkZXZlbnQsIGFuY2hvciwgdGVtcGxhdGUpXCJcbiAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibG9jYWxpemF0aW9uLmdldCgnY29sdW1uTWVudScpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktbW9yZS12ZXJ0aWNhbFwiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uY29sdW1uTWVudVRlbXBsYXRlUmVmIHx8IGNvbHVtbk1lbnVUZW1wbGF0ZSB8fCBkZWZhdWx0VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzZXJ2aWNlOiBzZXJ2aWNlLCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5tZW51LXNvcnQgKm5nSWY9XCJoYXNTb3J0XCIgW3NlcnZpY2VdPVwic2VydmljZVwiPlxuICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbm1lbnUtc29ydD5cbiAgICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtbG9jayAqbmdJZj1cImhhc0xvY2tcIiBbc2VydmljZV09XCJzZXJ2aWNlXCI+XG4gICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubWVudS1sb2NrPlxuICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1jaG9vc2VyICpuZ0lmPVwiaGFzQ29sdW1uQ2hvb3NlclwiIFtzZXJ2aWNlXT1cInNlcnZpY2VcIlxuICAgICAgICAgICAgICAgIFtleHBhbmRlZF09XCJleHBhbmRlZENvbHVtbnNcIiAoZXhwYW5kKT1cIm9uQ29sdW1uc0V4cGFuZCgpXCI+XG4gICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubWVudS1jaG9vc2VyPlxuICAgICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1ubWVudS1maWx0ZXIgKm5nSWY9XCJoYXNGaWx0ZXJcIiBbc2VydmljZV09XCJzZXJ2aWNlXCJcbiAgICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwiZXhwYW5kZWRGaWx0ZXJcIiAoZXhwYW5kKT1cIm9uRmlsdGVyRXhwYW5kKClcIj5cbiAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWZpbHRlcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNvbHVtbk1lbnVDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBTaW5nbGVQb3B1cFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IENvbHVtbk1lbnVTZXJ2aWNlIH1cbl07XG5Db2x1bW5NZW51Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHN0YW5kYWxvbmU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1jb2x1bW4tbWVudS1zdGFuZGFsb25lJyxdIH0sIHsgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZXR0aW5nczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc29ydDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzb3J0YWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uTWVudVRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2x1bW4tbWVudSBpdGVtIHRoYXQgY2FuIGJlIHBsYWNlZCBpbnNpZGUgYVxuICogW2BDb2x1bW5NZW51VGVtcGxhdGVgXSh7JSBzbHVnIGFwaV9ncmlkX2NvbHVtbm1lbnV0ZW1wbGF0ZWRpcmVjdGl2ZSAlfSkgZGlyZWN0aXZlLlxuICogQWxsb3dzIHRoZSB1c2VyIHRvIGxvY2sgb3IgdW5sb2NrIHRoZSBjb2x1bW5zLlxuICpcbiAqID4gWW91IGhhdmUgdG8gc2V0IHRoZSBbQ29sdW1uTWVudVNlcnZpY2VdKHslIHNsdWcgYXBpX2dyaWRfY29sdW1ubWVudXNlcnZpY2UgJX0pIHRoYXQgaXMgcGFzc2VkIGJ5XG4gKiA+IHRoZSB0ZW1wbGF0ZSB0byB0aGUgc2VydmljZSBpbnB1dCBvZiB0aGUgYGtlbmRvLWdyaWQtY29sdW1ubWVudS1sb2NrYCBjb21wb25lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJkYXRhXCIgW2NvbHVtbk1lbnVdPVwidHJ1ZVwiPlxuICogICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENvbHVtbk1lbnVUZW1wbGF0ZSBsZXQtc2VydmljZT1cInNlcnZpY2VcIj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW5tZW51LWxvY2sgW3NlcnZpY2VdPVwic2VydmljZVwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW5tZW51LWxvY2s+XG4gKiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiRmllbGQxXCIgW3dpZHRoXT1cIjEwMFwiPjwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJGaWVsZDJcIiBbd2lkdGhdPVwiMTAwXCI+PC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgIHB1YmxpYyBkYXRhOiBhbnlbXSA9IFt7IEZpZWxkMTogJ0ZvbycsIEZpZWxkMjogJ0JhcicgfV07XG4gKiB9XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIENvbHVtbk1lbnVMb2NrQ29tcG9uZW50IGV4dGVuZHMgQ29sdW1uTWVudUl0ZW1CYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24sIGNvbHVtbkluZm9TZXJ2aWNlLCBjaGFuZ2VEZXRlY3Rvcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5jb2x1bW5JbmZvU2VydmljZSA9IGNvbHVtbkluZm9TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgfVxuICAgIGdldCB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KHRoaXMubG9ja2VkID8gJ3VubG9jaycgOiAnbG9jaycpO1xuICAgIH1cbiAgICBnZXQgaWNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ja2VkID8gJ3VubG9jaycgOiAnbG9jayc7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmxvY2tlZCAmJiB0aGlzLmNvbHVtbkluZm9TZXJ2aWNlLnVubG9ja2VkUm9vdENvdW50IDwgMjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRvZ2dsZUNvbHVtbigpIHtcbiAgICAgICAgdGhpcy50b2dnbGVIaWVyYXJjaHkoIXRoaXMubG9ja2VkKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0b2dnbGVIaWVyYXJjaHkobG9ja2VkKSB7XG4gICAgICAgIGxldCByb290ID0gdGhpcy5zZXJ2aWNlLmNvbHVtbjtcbiAgICAgICAgd2hpbGUgKHJvb3QucGFyZW50KSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtyb290XTtcbiAgICAgICAgY29uc3QgYWxsQ2hhbmdlZCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbHVtbi5sb2NrZWQgPSBsb2NrZWQ7XG4gICAgICAgICAgICBhbGxDaGFuZ2VkLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goLi4uY29sdW1uLmNoaWxkcmVuQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UuY2hhbmdlTG9ja2VkKGFsbENoYW5nZWQpO1xuICAgIH1cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmNvbHVtbi5sb2NrZWQ7XG4gICAgfVxufVxuQ29sdW1uTWVudUxvY2tDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtY29sdW1ubWVudS1sb2NrJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbm1lbnUtaXRlbSBbdGV4dF09XCJ0ZXh0XCIgW2ljb25dPVwiaWNvblwiIChpdGVtQ2xpY2spPVwidG9nZ2xlQ29sdW1uKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1ubWVudS1pdGVtPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQ29sdW1uTWVudUxvY2tDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDb2x1bW5JbmZvU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfVxuXTtcblxuY29uc3QgQ09NUE9ORU5UUyQxID0gW1xuICAgIENvbHVtbkxpc3RDb21wb25lbnQsXG4gICAgQ29sdW1uQ2hvb3NlckNvbXBvbmVudCxcbiAgICBDb2x1bW5NZW51Q2hvb3NlckNvbXBvbmVudCxcbiAgICBDb2x1bW5NZW51RmlsdGVyQ29tcG9uZW50LFxuICAgIENvbHVtbk1lbnVJdGVtQ29tcG9uZW50LFxuICAgIENvbHVtbk1lbnVJdGVtQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIENvbHVtbk1lbnVTb3J0Q29tcG9uZW50LFxuICAgIENvbHVtbk1lbnVDb21wb25lbnQsXG4gICAgQ29sdW1uTWVudUxvY2tDb21wb25lbnQsXG4gICAgQ29sdW1uTWVudVRlbXBsYXRlRGlyZWN0aXZlXG5dO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIENvbHVtbk1lbnVNb2R1bGUge1xuICAgIHN0YXRpYyBleHBvcnRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgQ29sdW1uQ2hvb3NlckNvbXBvbmVudCxcbiAgICAgICAgICAgIENvbHVtbk1lbnVGaWx0ZXJDb21wb25lbnQsXG4gICAgICAgICAgICBDb2x1bW5NZW51SXRlbUNvbXBvbmVudCxcbiAgICAgICAgICAgIENvbHVtbk1lbnVJdGVtQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgQ29sdW1uTWVudVNvcnRDb21wb25lbnQsXG4gICAgICAgICAgICBDb2x1bW5NZW51TG9ja0NvbXBvbmVudCxcbiAgICAgICAgICAgIENvbHVtbk1lbnVDaG9vc2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgQ29sdW1uTWVudVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgQ29sdW1uTWVudUNvbXBvbmVudFxuICAgICAgICBdO1xuICAgIH1cbn1cbkNvbHVtbk1lbnVNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0NPTVBPTkVOVFMkMV0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRmlsdGVyTWVudU1vZHVsZV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW0NPTVBPTkVOVFMkMV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuY29uc3QgZXhwb3J0ZWRNb2R1bGVzJDIgPSBbXG4gICAgSGVhZGVyQ29tcG9uZW50LFxuICAgIEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIENvbHVtbkhhbmRsZURpcmVjdGl2ZSxcbiAgICBTZWxlY3RBbGxDaGVja2JveERpcmVjdGl2ZVxuXTtcbmNvbnN0IGltcG9ydGVkTW9kdWxlcyQyID0gW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBHcm91cE1vZHVsZSxcbiAgICBSb3dGaWx0ZXJNb2R1bGUsXG4gICAgRmlsdGVyTWVudU1vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgRHJhZ0FuZERyb3BNb2R1bGUsXG4gICAgQ29sdW1uTWVudU1vZHVsZVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBIZWFkZXJNb2R1bGUge1xuICAgIHN0YXRpYyBleHBvcnRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBTZWxlY3RBbGxDaGVja2JveERpcmVjdGl2ZVxuICAgICAgICBdO1xuICAgIH1cbn1cbkhlYWRlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZXhwb3J0ZWRNb2R1bGVzJDJdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkMl0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogWy4uLmltcG9ydGVkTW9kdWxlcyQyXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbW1hbmQgY29sdW1ucyBvZiB0aGUgR3JpZC4gWW91IGhhdmUgdG8gZGVmaW5lIHRoZSBjb250ZW50IG9mIHRoZVxuICogY29sdW1uIGluc2lkZSBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnLiBUaGUgdGVtcGxhdGUgY29udGV4dCBpcyBzZXQgdG8gdGhlIGN1cnJlbnRcbiAqIGRhdGEgaXRlbS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzIG9uIHVzaW5nIHRoZSBwYXNzZWQgZmllbGRzXG4gKiBhbmQgdGhlIGNvbW1hbmQgZGlyZWN0aXZlcywgcmVmZXIgdG8gdGhlIGFydGljbGUgb25cbiAqIFtlZGl0aW5nIHRoZSBHcmlkIGluIEFuZ3VsYXIgUmVhY3RpdmUgRm9ybXNdKHslIHNsdWcgZWRpdGluZ19yZWFjdGl2ZV9mb3Jtc19ncmlkICV9KS5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmllbGRzIGFyZSBwYXNzZWQ6XG4gKiAtIGBjb2x1bW5JbmRleGAmbWRhc2g7VGhlIGN1cnJlbnQgY29sdW1uIGluZGV4LlxuICogLSBgcm93SW5kZXhgJm1kYXNoO1RoZSBjdXJyZW50IGRhdGEgcm93IGluZGV4LiBJZiBpbnNpZGUgYSBuZXcgaXRlbSByb3csIGByb3dJbmRleGBpcyBgLTFgLlxuICogLSBgZGF0YUl0ZW1gJm1kYXNoO1RoZSBjdXJyZW50IGRhdGEgaXRlbS5cbiAqIC0gYGNvbHVtbmAmbWRhc2g7VGhlIGN1cnJlbnQgY29sdW1uIGluc3RhbmNlLlxuICogLSBgaXNOZXdgJm1kYXNoO1RoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpdGVtLlxuICpcbiAqIFVzdWFsbHksIHRoZSB0ZW1wbGF0ZSBjb250YWlucyBDUlVEIGNvbW1hbmQgZGlyZWN0aXZlcyBzdWNoIGFzOlxuICogLSBbYEVkaXRDb21tYW5kRGlyZWN0aXZlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9lZGl0Y29tbWFuZGRpcmVjdGl2ZSAlfSlcbiAqIC0gW2BSZW1vdmVDb21tYW5kRGlyZWN0aXZlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9yZW1vdmVjb21tYW5kZGlyZWN0aXZlICV9KVxuICogLSBbYENhbmNlbENvbW1hbmREaXJlY3RpdmVgXSh7JSBzbHVnIGFwaV9ncmlkX2NhbmNlbGNvbW1hbmRkaXJlY3RpdmUgJX0pXG4gKiAtIFtgU2F2ZUNvbW1hbmREaXJlY3RpdmVgXSh7JSBzbHVnIGFwaV9ncmlkX3NhdmVjb21tYW5kZGlyZWN0aXZlICV9KVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiUHJvZHVjdElEXCIgdGl0bGU9XCJQcm9kdWN0IElEXCIgd2lkdGg9XCIxMjBcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiIHRpdGxlPVwiUHJvZHVjdCBOYW1lXCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIGZpZWxkPVwiVW5pdFByaWNlXCIgdGl0bGU9XCJVbml0IFByaWNlXCIgd2lkdGg9XCIyMzBcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbiB0aXRsZT1cImNvbW1hbmRcIiB3aWR0aD1cIjIyMFwiPlxuICogICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlPlxuICogICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRFZGl0Q29tbWFuZCBjbGFzcz1cImstcHJpbWFyeVwiPkVkaXQ8L2J1dHRvbj5cbiAqICAgICAgICAgICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkUmVtb3ZlQ29tbWFuZD5SZW1vdmU8L2J1dHRvbj5cbiAqICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICA8L2tlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4+XG4gKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgcHVibGljIGdyaWREYXRhOiBhbnlbXTtcbiAqXG4gKiAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICB0aGlzLmdyaWREYXRhID0gcHJvZHVjdHM7XG4gKiAgICB9XG4gKiB9XG4gKlxuICogY29uc3QgcHJvZHVjdHMgPSBbe1xuICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICBcIlVuaXRQcmljZVwiOiAxOC4wMDAwLFxuICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICogIH0sIHtcbiAqICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAqICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZVxuICogIH1cbiAqIF07XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIENvbW1hbmRDb2x1bW5Db21wb25lbnQgZXh0ZW5kcyBDb2x1bW5CYXNlJDEge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgICBzdXBlcihwYXJlbnQpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZSA/IHRoaXMudGVtcGxhdGUudGVtcGxhdGVSZWYgOiB1bmRlZmluZWQ7XG4gICAgfVxufVxuQ29tbWFuZENvbHVtbkNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDb2x1bW5CYXNlJDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21tYW5kQ29sdW1uQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Db21tYW5kQ29sdW1uQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQ29sdW1uQmFzZSQxLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuQ29tbWFuZENvbHVtbkNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB0ZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLF0gfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY2hlY2tib3ggZm9yIHNlbGVjdGluZyBjb2x1bW5zIGluIHRoZSBHcmlkLiBJZiB0aGUgY29sdW1uIGlzXG4gKiBkZWZpbmVkIGFzIGVtcHR5LCBpdCByZW5kZXJzIGEgZGVmYXVsdCBjaGVja2JveCBmb3Igcm93IHNlbGVjdGlvbi5cbiAqIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpbnNpZGUgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZy5cbiAqIFRoZSBpbnB1dCByZXF1aXJlcyB5b3UgdG8gaW5jbHVkZSB0aGUgYFNlbGVjdGlvbkNoZWNrYm94YCBvcHRpb24uXG4gKlxuICogVGhlIHRlbXBsYXRlIGNvbnRleHQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGEgaXRlbSBhbmQgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgcGFzc2VkOlxuICogLSBgY29sdW1uSW5kZXhgJm1kYXNoO1RoZSBjdXJyZW50IGNvbHVtbiBpbmRleC5cbiAqIC0gYHJvd0luZGV4YCZtZGFzaDtUaGUgY3VycmVudCBkYXRhIHJvdyBpbmRleC4gSWYgaW5zaWRlIGEgbmV3IGl0ZW0gcm93LCBpdCB3aWxsIGJlIGAtMWAuXG4gKiAtIGBkYXRhSXRlbWAmbWRhc2g7VGhlIGN1cnJlbnQgZGF0YSBpdGVtLlxuICogLSBgY29sdW1uYCZtZGFzaDtUaGUgY3VycmVudCBjb2x1bW4gaW5zdGFuY2UuXG4gKiAtIGBpc05ld2AmbWRhc2g7VGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG4gKlxuICogRm9yIG1vcmUgZXhhbXBsZXMsIHJlZmVyIHRvOlxuICogLSBbU2VsZWN0aW5nIG9yIGRlc2VsZWN0aW5nIGFsbCBpdGVtcyBvbiBhIHBhZ2VdKHslIHNsdWcgc2VsZWN0aW9uX2dyaWQgJX0jdG9jLXNlbGVjdC1hbGwtZmVhdHVyZSlcbiAqIC0gW1BlcnNpc3RpbmcgdGhlIHNlbGVjdGlvbl0oeyUgc2x1ZyBzZWxlY3Rpb25fZ3JpZCAlfSN0b2MtaW4tY29tYmluYXRpb24td2l0aC10aGUtc2VsZWN0LWFsbC1mZWF0dXJlKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiIFtzZWxlY3RhYmxlXT1cIntlbmFibGVkOiB0cnVlLCBjaGVja2JveE9ubHk6IHRydWV9XCI+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIlByb2R1Y3QgSURcIiB3aWR0aD1cIjEyMFwiPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCIgdGl0bGU9XCJQcm9kdWN0IE5hbWVcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4gdGl0bGU9XCJEZWZhdWx0IGNoZWNrYm94XCI+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uPlxuICogICAgICAgICAgPGtlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uIHRpdGxlPVwiQ3VzdG9tIGNoZWNrYm94XCI+XG4gKiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gKiAgICAgICAgICAgICAgU2VsZWN0IHJvdyA8aW5wdXQgW2tlbmRvR3JpZFNlbGVjdGlvbkNoZWNrYm94XT1cImlkeFwiIC8+XG4gKiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICA8L2tlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uPlxuICogICAgICAgIDwva2VuZG8tZ3JpZD5cbiAqICAgIGBcbiAqIH0pXG4gKlxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgIHB1YmxpYyBncmlkRGF0YTogYW55W107XG4gKlxuICogICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2R1Y3RzO1xuICogICAgfVxuICogfVxuICpcbiAqIGNvbnN0IHByb2R1Y3RzID0gW3tcbiAqICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhaVwiLFxuICogICAgXCJVbml0UHJpY2VcIjogMTguMDAwMCxcbiAqICAgIFwiRGlzY29udGludWVkXCI6IHRydWVcbiAqICB9LCB7XG4gKiAgICBcIlByb2R1Y3RJRFwiOiAyLFxuICogICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICBcIlVuaXRQcmljZVwiOiAxOS4wMDAwLFxuICogICAgXCJEaXNjb250aW51ZWRcIjogZmFsc2VcbiAqICB9XG4gKiBdO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBDaGVja2JveENvbHVtbkNvbXBvbmVudCBleHRlbmRzIENvbHVtbkJhc2UkMSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAvKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2hlY2tib3hDb2x1bW4gPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlID8gdGhpcy50ZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG59XG5DaGVja2JveENvbHVtbkNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDb2x1bW5CYXNlJDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveENvbHVtbkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWNoZWNrYm94LWNvbHVtbicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNoZWNrYm94Q29sdW1uQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogQ29sdW1uQmFzZSQxLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBTa2lwU2VsZiB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuQ2hlY2tib3hDb2x1bW5Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgc2hvd1NlbGVjdEFsbDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSxdIH1dXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby1pbnB1dC1yZW5hbWUgKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcm93LXNlbGVjdGlvbiBjaGVja2JveCBvZiB0aGUgR3JpZC4gVGhlIGRpcmVjdGl2ZSBleHBlY3RzIHRoZVxuICogaW5kZXggb2YgdGhlIGN1cnJlbnQgcm93IGFzIGFuIGlucHV0IHBhcmFtZXRlci4gSW5zaWRlIHRoZVxuICogW2BDaGVja2JveENvbHVtbkNvbXBvbmVudGBdKHslIHNsdWcgYXBpX2dyaWRfY2hlY2tib3hjb2x1bW5jb21wb25lbnQgJX0pLCBhcHBseSB0aGVcbiAqIGRpcmVjdGl2ZSB0byBhbiBgaW5wdXRgIGVsZW1lbnQuIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjaGVja2JveCB0aGF0IGlzIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIGRpcmVjdGl2ZSwgYSBbYHNlbGVjdGlvbkNoYW5nZWBdKHslIHNsdWcgYXBpX2dyaWRfZ3JpZGNvbXBvbmVudCAlfSN0b2Mtc2VsZWN0aW9uQ2hhbmdlKVxuICogZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tZ3JpZCBbZGF0YV09XCJncmlkRGF0YVwiIFtzZWxlY3RhYmxlXT1cIntlbmFibGVkOiB0cnVlLCBjaGVja2JveE9ubHk6IHRydWV9XCI+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4gdGl0bGU9XCJDdXN0b20gY2hlY2tib3hcIj5cbiAqICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtaWR4PVwicm93SW5kZXhcIj5cbiAqICAgICAgICAgICAgICBTZWxlY3Qgcm93IDxpbnB1dCBba2VuZG9HcmlkU2VsZWN0aW9uQ2hlY2tib3hdPVwiaWR4XCIgLz5cbiAqICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4+XG4gKiAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0SURcIiB0aXRsZT1cIlByb2R1Y3QgSURcIiB3aWR0aD1cIjEyMFwiPlxuICogICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiBmaWVsZD1cIlByb2R1Y3ROYW1lXCIgdGl0bGU9XCJQcm9kdWN0IE5hbWVcIj5cbiAqICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgPC9rZW5kby1ncmlkPlxuICogICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgcHVibGljIGdyaWREYXRhOiBhbnlbXTtcbiAqXG4gKiAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICB0aGlzLmdyaWREYXRhID0gcHJvZHVjdHM7XG4gKiAgICB9XG4gKiB9XG4gKlxuICogY29uc3QgcHJvZHVjdHMgPSBbe1xuICogICAgXCJQcm9kdWN0SURcIjogMSxcbiAqICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICBcIlVuaXRQcmljZVwiOiAxOC4wMDAwLFxuICogICAgXCJEaXNjb250aW51ZWRcIjogdHJ1ZVxuICogIH0sIHtcbiAqICAgIFwiUHJvZHVjdElEXCI6IDIsXG4gKiAgICBcIlByb2R1Y3ROYW1lXCI6IFwiQ2hhbmdcIixcbiAqICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDAsXG4gKiAgICBcIkRpc2NvbnRpbnVlZFwiOiBmYWxzZVxuICogIH1cbiAqIF07XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIFNlbGVjdGlvbkNoZWNrYm94RGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihzZWxlY3Rpb25TZXJ2aWNlLCBlbCwgcmVuZGVyZXIsIG5nWm9uZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UgPSBzZWxlY3Rpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2xpY2sgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFwiY2xpY2tcIiwgdGhpcy5vbkNsaWNrLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95S2V5RG93biA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgXCJrZXlkb3duXCIsIHRoaXMub25LZXlEb3duLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICB0aGlzLnNldENoZWNrZWRTdGF0ZSgpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveUNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lDbGljaygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3lLZXlEb3duKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lLZXlEb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGljaygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5vcHRpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXYgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlQnlJbmRleCh0aGlzLml0ZW1JbmRleCk7XG4gICAgICAgICAgICAgICAgZXYuY3RybEtleSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXYuc2hpZnRLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2hhbmdlcy5lbWl0KGV2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uS2V5RG93bihlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuRW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub25DbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldENoZWNrZWRTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFwiY2hlY2tlZFwiLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNTZWxlY3RlZCh0aGlzLml0ZW1JbmRleCkpO1xuICAgIH1cbn1cblNlbGVjdGlvbkNoZWNrYm94RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkU2VsZWN0aW9uQ2hlY2tib3hdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TZWxlY3Rpb25DaGVja2JveERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFNlbGVjdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5TZWxlY3Rpb25DaGVja2JveERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBpdGVtSW5kZXg6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbXCJrZW5kb0dyaWRTZWxlY3Rpb25DaGVja2JveFwiLF0gfV0sXG4gICAgdHlwZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50eXBlJyxdIH1dXG59O1xuXG5jb25zdCBjb2x1bW5DZWxsSW5kZXggPSAoY2VsbCwgY2VsbHMpID0+IHtcbiAgICBsZXQgY2VsbEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjZWxscy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGlmIChjZWxsc1tpZHhdID09PSBjZWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2VsbEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzQ2xhc3NlcyhjZWxsc1tpZHhdLCAnay1oaWVyYXJjaHktY2VsbCBrLWdyb3VwLWNlbGwnKSkge1xuICAgICAgICAgICAgY2VsbEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFRhYmxlQm9keUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZGV0YWlsc1NlcnZpY2UsIGdyb3Vwc1NlcnZpY2UsIGNoYW5nZU5vdGlmaWNhdGlvbiwgZWRpdFNlcnZpY2UsIGxvY2FsaXphdGlvbiwgbmdab25lLCByZW5kZXJlciwgZWxlbWVudCwgZG9tRXZlbnRzLCBzZWxlY3Rpb25TZXJ2aWNlLCBjZWxsU2VsZWN0aW9uU2VydmljZSwgY29sdW1uSW5mb1NlcnZpY2UsIG5hdmlnYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZGV0YWlsc1NlcnZpY2UgPSBkZXRhaWxzU2VydmljZTtcbiAgICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlID0gZ3JvdXBzU2VydmljZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VOb3RpZmljYXRpb24gPSBjaGFuZ2VOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UgPSBlZGl0U2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzID0gZG9tRXZlbnRzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UgPSBzZWxlY3Rpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNlbGxTZWxlY3Rpb25TZXJ2aWNlID0gY2VsbFNlbGVjdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UgPSBjb2x1bW5JbmZvU2VydmljZTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZSA9IG5hdmlnYXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXTtcbiAgICAgICAgdGhpcy5za2lwID0gMDtcbiAgICAgICAgdGhpcy5ub1JlY29yZHNUZXh0ID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdub1JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNraXBHcm91cERlY29yYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93R3JvdXBGb290ZXJzID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9ja2VkQ29sdW1uc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy50b3RhbENvbHVtbnNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMudHJhY2tCeSA9IGRlZmF1bHRUcmFja0J5O1xuICAgICAgICB0aGlzLnJvd0NsYXNzID0gKCkgPT4gbnVsbDtcbiAgICAgICAgdGhpcy5jZWxsS2V5ZG93blN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY2VsbEtleWRvd24uc3Vic2NyaWJlKChhcmdzKSA9PiB0aGlzLmNlbGxLZXlkb3duSGFuZGxlcihhcmdzKSk7XG4gICAgICAgIHRoaXMudHJhY2tCeVdyYXBwZXIgPSB0aGlzLnRyYWNrQnlXcmFwcGVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhY2tCeUNvbHVtbnMgPSB0aGlzLnRyYWNrQnlDb2x1bW5zLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBuZXdEYXRhSXRlbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFNlcnZpY2UubmV3RGF0YUl0ZW07XG4gICAgfVxuICAgIC8vIE51bWJlciBvZiB1bmxvY2tlZCBjb2x1bW5zIGluIHRoZSBuZXh0IHRhYmxlLCBpZiBhbnlcbiAgICBnZXQgdW5sb2NrZWRDb2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdGFsQ29sdW1uc0NvdW50IC0gdGhpcy5sb2NrZWRDb2x1bW5zQ291bnQgLSAodGhpcy5hbGxDb2x1bW5zIHx8IHRoaXMuY29sdW1ucykubGVuZ3RoO1xuICAgIH1cbiAgICBpc0FyaWFTZWxlY3RlZChpdGVtLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbFNlbGVjdGlvblNlcnZpY2UuaXNDZWxsU2VsZWN0ZWQoaXRlbSwgY29sdW1uKSB8fFxuICAgICAgICAgICAgdGhpcy5pc1Jvd1NlbGVjdGVkKGl0ZW0pID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gICAgdG9nZ2xlUm93KGluZGV4LCBkYXRhSXRlbSkge1xuICAgICAgICB0aGlzLmRldGFpbHNTZXJ2aWNlLnRvZ2dsZVJvdyhpbmRleCwgZGF0YUl0ZW0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzRXhwYW5kZWQodmlld0l0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWlsc1NlcnZpY2UuaXNFeHBhbmRlZCh2aWV3SXRlbS5pbmRleCwgdmlld0l0ZW0uZGF0YSk7XG4gICAgfVxuICAgIGRldGFpbEJ1dHRvblN0eWxlcyh2aWV3SXRlbSkge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaXNFeHBhbmRlZCh2aWV3SXRlbSk7XG4gICAgICAgIHJldHVybiBleHBhbmRlZCA/ICdrLW1pbnVzJyA6ICdrLXBsdXMnO1xuICAgIH1cbiAgICBkZXRhaWxCdXR0b25UaXRsZSh2aWV3SXRlbSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlS2V5ID0gdGhpcy5pc0V4cGFuZGVkKHZpZXdJdGVtKSA/ICdkZXRhaWxDb2xsYXBzZScgOiAnZGV0YWlsRXhwYW5kJztcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmdldChtZXNzYWdlS2V5KTtcbiAgICB9XG4gICAgaXNHcm91cChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT09ICdncm91cCc7XG4gICAgfVxuICAgIGlzRGF0YUl0ZW0oaXRlbSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNHcm91cChpdGVtKSAmJiAhdGhpcy5pc0Zvb3RlcihpdGVtKTtcbiAgICB9XG4gICAgaXNGb290ZXIoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSAnZm9vdGVyJztcbiAgICB9XG4gICAgaXNJbkV4cGFuZGVkR3JvdXAoaXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNTZXJ2aWNlLmlzSW5FeHBhbmRlZEdyb3VwKGl0ZW0uZ3JvdXBJbmRleCwgZmFsc2UpO1xuICAgIH1cbiAgICBpc1BhcmVudEdyb3VwRXhwYW5kZWQoaXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNTZXJ2aWNlLmlzSW5FeHBhbmRlZEdyb3VwKGl0ZW0uaW5kZXggfHwgaXRlbS5ncm91cEluZGV4KTtcbiAgICB9XG4gICAgaXNPZGQoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5pbmRleCAlIDIgIT09IDA7XG4gICAgfVxuICAgIGlzU2VsZWN0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZSAmJiB0aGlzLnNlbGVjdGFibGUuZW5hYmxlZCAhPT0gZmFsc2U7XG4gICAgfVxuICAgIGlzUm93U2VsZWN0ZWQoaXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzU2VsZWN0ZWQoaXRlbS5pbmRleCk7XG4gICAgfVxuICAgIHRyYWNrQnlXcmFwcGVyKGluZGV4LCBpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgaXRlbS5pc0VkaXRpbmcgPSB0aGlzLmVkaXRTZXJ2aWNlLmhhc0VkaXRlZChpdGVtLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cmFja0J5KGluZGV4LCBpdGVtKTtcbiAgICB9XG4gICAgdHJhY2tCeUNvbHVtbnMoaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlydHVhbENvbHVtbnMgPyBpbmRleCA6IGl0ZW07XG4gICAgfVxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzR3JvdXBIZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBIZWFkZXJDb2x1bW5zID0gY29sdW1uc1RvUmVuZGVyKHRoaXMuc2tpcEdyb3VwRGVjb3JhdGlvbiA/IHRoaXMuY29sdW1ucyA6IHRoaXMuY29sdW1ucy50b0FycmF5KCkuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncm91cEhlYWRlckNvbHVtbnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cEhlYWRlclNsYXZlQ2VsbHNDb3VudCA9XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNHcm91cEhlYWRlckNvbHVtbiA/IHRoaXMuY29sdW1uc0NvbnRhaW5lci5ub25Mb2NrZWRDb2x1bW5zVG9SZW5kZXIubGVuZ3RoIDogMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBIZWFkZXJTbGF2ZUNlbGxzQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGlzQ2hhbmdlZChcImNvbHVtbnNcIiwgY2hhbmdlcywgZmFsc2UpKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZU5vdGlmaWNhdGlvbi5ub3RpZnkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuc2tpcCArIHJvd0luZGV4O1xuICAgICAgICBpZiAodGhpcy5oYXNEZXRhaWxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcG9zICo9IDI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWJzb2x1dGVSb3dJbmRleCA9IDEgKyBwb3M7XG4gICAgICAgIGNvbnN0IGFkZFJvd09mZnNldCA9IHRoaXMuZWRpdFNlcnZpY2UuaGFzTmV3SXRlbSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBmaWx0ZXJSb3dPZmZzZXQgPSBoYXNGaWx0ZXJSb3codGhpcy5maWx0ZXJhYmxlKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBoZWFkZXJSb3dDb3VudCA9IHRoaXMuY29sdW1uSW5mb1NlcnZpY2UudG90YWxMZXZlbHMgKyBmaWx0ZXJSb3dPZmZzZXQgKyBhZGRSb3dPZmZzZXQ7XG4gICAgICAgIHJldHVybiBhYnNvbHV0ZVJvd0luZGV4ICsgaGVhZGVyUm93Q291bnQ7XG4gICAgfVxuICAgIGFkZFJvd0xvZ2ljYWxJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UudG90YWxMZXZlbHMgKyAxICtcbiAgICAgICAgICAgIChoYXNGaWx0ZXJSb3codGhpcy5maWx0ZXJhYmxlKSA/IDEgOiAwKTtcbiAgICB9XG4gICAgbG9naWNhbENvbEluZGV4KGNvbHVtbikge1xuICAgICAgICBpZiAoIWlzUHJlc2VudChjb2x1bW4ubGVhZkluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW4ubGVhZkluZGV4ICsgKHRoaXMuaGFzRGV0YWlsVGVtcGxhdGUgPyAxIDogMCk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlja0hhbmRsZXIgPSB0aGlzLmNsaWNrSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgbW91c2Vkb3duU3Vic2NyaXB0aW9uID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nLCBjbGlja0hhbmRsZXIpO1xuICAgICAgICAgICAgY29uc3QgbW91c2V1cFN1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnbW91c2V1cCcsIGNsaWNrSGFuZGxlcik7XG4gICAgICAgICAgICBjb25zdCBjbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dG1lbnVTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbnRleHRtZW51JywgY2xpY2tIYW5kbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdWNoc3RhcnRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBjbGlja0hhbmRsZXIpO1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlbmRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RvdWNoZW5kJywgY2xpY2tIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tTdWJzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbW91c2Vkb3duU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgbW91c2V1cFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgICAgIGNsaWNrU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgY29udGV4dG1lbnVTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnRvdWNoU3Vic2NyaXB0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRvdWNoc3RhcnRTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICB0b3VjaGVuZFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvcmlnaW5hbE5vUmVjb3JkVGV4dCA9IHRoaXMubG9jYWxpemF0aW9uLmdldCgnbm9SZWNvcmRzJyk7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vUmVjb3Jkc1RleHQgPT09IG9yaWdpbmFsTm9SZWNvcmRUZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub1JlY29yZHNUZXh0ID0gdGhpcy5sb2NhbGl6YXRpb24uZ2V0KCdub1JlY29yZHMnKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5vUmVjb3JkVGV4dCA9IHRoaXMubm9SZWNvcmRzVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jbGlja1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbGlja1N1YnNjcmlwdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRvdWNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZWxsS2V5ZG93blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jbGlja1RpbWVvdXQpO1xuICAgIH1cbiAgICBpc0VkaXRpbmdDZWxsKGluZGV4LCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFNlcnZpY2UuaXNFZGl0aW5nKCkgJiYgdGhpcy5lZGl0U2VydmljZS5pc0VkaXRlZENvbHVtbihpbmRleCwgY29sdW1uKTtcbiAgICB9XG4gICAgaXNFZGl0aW5nUm93KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGluZygpICYmIHRoaXMuZWRpdFNlcnZpY2UuaGFzRWRpdGVkKGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IGhhc0dyb3VwSGVhZGVyQ29sdW1uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zQ29udGFpbmVyLmhhc0dyb3VwSGVhZGVyQ29sdW1uO1xuICAgIH1cbiAgICBnZXQgY29sdW1uc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uSW5mb1NlcnZpY2UuY29sdW1uc0NvbnRhaW5lcjtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbnNTcGFuKCkge1xuICAgICAgICByZXR1cm4gY29sdW1uc1NwYW4odGhpcy5jb2x1bW5zKTtcbiAgICB9XG4gICAgZ2V0IGFsbENvbHVtbnNTcGFuKCkge1xuICAgICAgICByZXR1cm4gY29sdW1uc1NwYW4odGhpcy5hbGxDb2x1bW5zIHx8IHRoaXMuY29sdW1ucyk7XG4gICAgfVxuICAgIGdldCBjb2xTcGFuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zU3BhbiArIHRoaXMuZ3JvdXBzLmxlbmd0aCArICh0aGlzLmhhc0RldGFpbFRlbXBsYXRlID8gMSA6IDApO1xuICAgIH1cbiAgICBnZXQgZm9vdGVyQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMb2NrZWQgPyB0aGlzLmNvbHVtbnNDb250YWluZXIubG9ja2VkQ29sdW1uc1RvUmVuZGVyIDogdGhpcy5jb2x1bW5zQ29udGFpbmVyLm5vbkxvY2tlZENvbHVtbnNUb1JlbmRlcjtcbiAgICB9XG4gICAgc2hvd0dyb3VwSGVhZGVyKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICFpdGVtLmRhdGEuc2tpcEhlYWRlcjtcbiAgICB9XG4gICAgZ2V0IGhhc0RldGFpbFRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuZGV0YWlsVGVtcGxhdGUpO1xuICAgIH1cbiAgICBjbGlja0hhbmRsZXIoZXZlbnRBcmcpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmV2ZW50VGFyZ2V0KGV2ZW50QXJnKTtcbiAgICAgICAgbGV0IGNlbGwsIHJvdywgYm9keSwgZ3JpZEVsZW1lbnQ7XG4gICAgICAgIGxldCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjZWxsID0gY2xvc2VzdChjdXJyZW50VGFyZ2V0LCBtYXRjaGVzTm9kZU5hbWUoJ3RkJykpO1xuICAgICAgICAgICAgcm93ID0gY2xvc2VzdChjZWxsLCBtYXRjaGVzTm9kZU5hbWUoJ3RyJykpO1xuICAgICAgICAgICAgYm9keSA9IGNsb3Nlc3Qocm93LCBtYXRjaGVzTm9kZU5hbWUoJ3Rib2R5JykpO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldCA9IGJvZHk7XG4gICAgICAgICAgICBncmlkRWxlbWVudCA9IGNsb3Nlc3RJblNjb3BlKGN1cnJlbnRUYXJnZXQsIG1hdGNoZXNDbGFzc2VzKCdrLWdyaWQnKSwgZWxlbWVudCk7XG4gICAgICAgIH0gd2hpbGUgKGJvZHkgJiYgYm9keSAhPT0gZWxlbWVudCAmJiAhZ3JpZEVsZW1lbnQpO1xuICAgICAgICBpZiAoY2VsbCAmJiAhaGFzQ2xhc3NlcyhjZWxsLCBOT05fREFUQV9DRUxMX0NMQVNTRVMpICYmXG4gICAgICAgICAgICAhaGFzQ2xhc3Nlcyhyb3csIE5PTl9EQVRBX1JPV19DTEFTU0VTKSAmJlxuICAgICAgICAgICAgYm9keSA9PT0gZWxlbWVudCAmJiAhZ3JpZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UucHJldmVudENlbGxDbG9zZSgpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gdGFyZ2V0ICE9PSBjZWxsICYmIGlzRm9jdXNhYmxlV2l0aFRhYktleSh0YXJnZXQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghZm9jdXNhYmxlICYmICFtYXRjaGVzTm9kZU5hbWUoJ2xhYmVsJykodGFyZ2V0KSAmJiAhaGFzQ2xhc3Nlcyh0YXJnZXQsIElHTk9SRV9UQVJHRVRfQ0xBU1NTRVMpICYmXG4gICAgICAgICAgICAgICAgIWNsb3Nlc3RJblNjb3BlKHRhcmdldCwgbWF0Y2hlc0NsYXNzZXMoSUdOT1JFX0NPTlRBSU5FUl9DTEFTU0VTKSwgY2VsbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5jZWxsQ2xpY2tBcmdzKGNlbGwsIHJvdywgZXZlbnRBcmcpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudEFyZy50eXBlID09PSAnbW91c2Vkb3duJyB8fCBldmVudEFyZy50eXBlID09PSAndG91Y2hzdGFydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb21FdmVudHMuY2VsbE1vdXNlZG93bi5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldmVudEFyZy50eXBlID09PSAnbW91c2V1cCcgfHwgZXZlbnRBcmcudHlwZSA9PT0gJ3RvdWNoZW5kJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbUV2ZW50cy5jZWxsTW91c2V1cC5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MuaXNFZGl0ZWRDb2x1bW4gfHwgIXRoaXMuZWRpdFNlcnZpY2UuY2xvc2VDZWxsKGV2ZW50QXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50QXJnLnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRDZWxsQ2xpY2soYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRDZWxsQ2xpY2soYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdENlbGxDbGljayhhcmdzKSB7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRzLmNlbGxDbGljay5lbWl0KE9iamVjdC5hc3NpZ24oYXJncywge1xuICAgICAgICAgICAgaXNFZGl0ZWQ6IGFyZ3MuaXNFZGl0ZWRSb3cgfHwgYXJncy5pc0VkaXRlZENvbHVtblxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGNlbGxLZXlkb3duSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmtleUNvZGUgPT09IEtleXMuRW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVyKGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNlbGxDbGlja0FyZ3MoY2VsbCwgcm93LCBldmVudEFyZykge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvbHVtbkNlbGxJbmRleChjZWxsLCByb3cuY2VsbHMpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMudG9BcnJheSgpW2luZGV4XTtcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmxvY2tlZENvbHVtbnNDb3VudCArIGluZGV4O1xuICAgICAgICBsZXQgcm93SW5kZXggPSByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWtlbmRvLWdyaWQtaXRlbS1pbmRleCcpO1xuICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4ID8gcGFyc2VJbnQocm93SW5kZXgsIDEwKSA6IC0xO1xuICAgICAgICBjb25zdCBkYXRhSXRlbSA9IHJvd0luZGV4ID09PSAtMSA/IHRoaXMuZWRpdFNlcnZpY2UubmV3RGF0YUl0ZW0gOiB0aGlzLmRhdGEuYXQocm93SW5kZXggLSB0aGlzLnNraXApO1xuICAgICAgICBjb25zdCBpc0VkaXRlZENvbHVtbiA9IHRoaXMuZWRpdFNlcnZpY2UuaXNFZGl0ZWRDb2x1bW4ocm93SW5kZXgsIGNvbHVtbik7XG4gICAgICAgIGNvbnN0IGlzRWRpdGVkUm93ID0gdGhpcy5lZGl0U2VydmljZS5pc0VkaXRlZChyb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudEFyZy50eXBlID09PSAna2V5ZG93bicgPyAnY2xpY2snIDogZXZlbnRBcmcudHlwZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgZGF0YUl0ZW06IGRhdGFJdGVtLFxuICAgICAgICAgICAgaXNFZGl0ZWRDb2x1bW46IGlzRWRpdGVkQ29sdW1uLFxuICAgICAgICAgICAgaXNFZGl0ZWRSb3c6IGlzRWRpdGVkUm93LFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRBcmcsXG4gICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGV2ZW50VGFyZ2V0KGFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MudHlwZSA9PT0gJ3RvdWNoZW5kJykge1xuICAgICAgICAgICAgY29uc3QgdG91Y2ggPSBhcmdzLmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3MudGFyZ2V0O1xuICAgIH1cbn1cblRhYmxlQm9keUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZFRhYmxlQm9keV0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImVkaXRTZXJ2aWNlLmhhc05ld0l0ZW1cIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiay1ncmlkLWFkZC1yb3cgay1ncmlkLWVkaXQtcm93XCJcbiAgICAgICAgICAgIGtlbmRvR3JpZExvZ2ljYWxSb3dcbiAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImFkZFJvd0xvZ2ljYWxJbmRleCgpXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlUm93XT1cImxvY2tlZENvbHVtbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsQ2VsbHNDb3VudF09XCJjb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxTbGF2ZUNlbGxzQ291bnRdPVwidW5sb2NrZWRDb2x1bW5zQ291bnRcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2tpcEdyb3VwRGVjb3JhdGlvblwiPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImstZ3JvdXAtY2VsbFwiICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L3RkPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImstaGllcmFyY2h5LWNlbGxcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImFkZFJvd0xvZ2ljYWxJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGNvbHVtbkluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5zO1wiXG4gICAgICAgICAgICAgICAga2VuZG9HcmlkQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uSW5kZXhdPVwibG9ja2VkQ29sdW1uc0NvdW50ICsgY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbaXNOZXddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIm5ld0RhdGFJdGVtXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW4uY29sc3BhblwiXG4gICAgICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGxcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJhZGRSb3dMb2dpY2FsSW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsQ29sSW5kZXhdPVwibG9naWNhbENvbEluZGV4KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2x1bW4uY29sc3BhblwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHRyICpuZ0lmPVwiZGF0YT8ubGVuZ3RoID09PSAwIHx8IGRhdGEgPT0gbnVsbFwiIGNsYXNzPVwiay1ncmlkLW5vcmVjb3Jkc1wiPlxuICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJjb2xTcGFuXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICBbbmdJZl09XCJub1JlY29yZHNUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZjogbm9SZWNvcmRzVGVtcGxhdGU/LnRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vUmVjb3Jkc1RlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgICAgIHt7bm9SZWNvcmRzVGV4dH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvclxuICAgICAgICBbbmdGb3JPZl09XCJkYXRhXCJcbiAgICAgICAgW25nRm9yVHJhY2tCeV09XCJ0cmFja0J5V3JhcHBlclwiXG4gICAgICAgIGxldC1pdGVtXG4gICAgICAgIGxldC1yb3dJbmRleD1cImluZGV4XCI+XG4gICAgICAgIDx0ciAqbmdJZj1cImlzR3JvdXAoaXRlbSkgJiYgaXNQYXJlbnRHcm91cEV4cGFuZGVkKGl0ZW0pICYmIHNob3dHcm91cEhlYWRlcihpdGVtKVwiXG4gICAgICAgICAgICBrZW5kb0dyaWRHcm91cEhlYWRlclxuICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBzXCJcbiAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICBbaGFzRGV0YWlsc109XCJkZXRhaWxUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgIFtza2lwR3JvdXBEZWNvcmF0aW9uXT1cInNraXBHcm91cERlY29yYXRpb25cIlxuICAgICAgICAgICAgICAgIFtoYXNHcm91cEhlYWRlckNvbHVtbl09XCJoYXNHcm91cEhlYWRlckNvbHVtblwiXG4gICAgICAgICAgICAgICAgW2dyb3VwSGVhZGVyQ29sdW1uc109XCJncm91cEhlYWRlckNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleCArIDFcIlxuICAgICAgICAgICAgICAgIFt0b3RhbENvbHVtbnNDb3VudF09XCJ0b3RhbENvbHVtbnNDb3VudFwiXG4gICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsUm93XG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlUm93XT1cImxvY2tlZENvbHVtbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsQ2VsbHNDb3VudF09XCJjb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxTbGF2ZUNlbGxzQ291bnRdPVwiZ3JvdXBIZWFkZXJTbGF2ZUNlbGxzQ291bnRcIj5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdJZj1cImlzRGF0YUl0ZW0oaXRlbSkgJiYgaXNJbkV4cGFuZGVkR3JvdXAoaXRlbSlcIlxuICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbFJvd1xuICAgICAgICAgICAgICAgIFtkYXRhUm93SW5kZXhdPVwiaXRlbS5pbmRleFwiXG4gICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIml0ZW0uZGF0YVwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlUm93XT1cImxvY2tlZENvbHVtbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsQ2VsbHNDb3VudF09XCJjb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxTbGF2ZUNlbGxzQ291bnRdPVwidW5sb2NrZWRDb2x1bW5zQ291bnRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93Q2xhc3MoeyBkYXRhSXRlbTogaXRlbS5kYXRhLCBpbmRleDogaXRlbS5pbmRleCB9KVwiXG4gICAgICAgICAgICBbY2xhc3Muay1hbHRdPVwiaXNPZGQoaXRlbSlcIlxuICAgICAgICAgICAgW2NsYXNzLmstbWFzdGVyLXJvd109XCJkZXRhaWxUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgW2NsYXNzLmstZ3JpZC1lZGl0LXJvd109XCJpc0VkaXRpbmdSb3coaXRlbS5pbmRleClcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1rZW5kby1ncmlkLWl0ZW0taW5kZXhdPVwiaXRlbS5pbmRleFwiXG4gICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1zZWxlY3RlZF09XCJpc1NlbGVjdGFibGUoKSAmJiBpc1Jvd1NlbGVjdGVkKGl0ZW0pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNraXBHcm91cERlY29yYXRpb25cIj5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJrLWdyb3VwLWNlbGxcIiAqbmdGb3I9XCJsZXQgZyBvZiBncm91cHNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC90ZD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJrLWhpZXJhcmNoeS1jZWxsXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImRldGFpbFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGxcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFSb3dJbmRleF09XCJpdGVtLmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIml0ZW0uZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZXRhaWxFeHBhbmRDZWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImstaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsVGVtcGxhdGUuc2hvd0lmKGl0ZW0uZGF0YSwgaXRlbS5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkZXRhaWxCdXR0b25TdHlsZXMoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJkZXRhaWxCdXR0b25UaXRsZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCIgdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJ0b2dnbGVSb3coaXRlbS5pbmRleCwgaXRlbS5kYXRhKVwiPjwvYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRDZWxsXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJpdGVtLmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkluZGV4XT1cImxvY2tlZENvbHVtbnNDb3VudCArIGNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1rZW5kby1ncmlkLWNvbHVtbi1pbmRleF09XCJsb2NrZWRDb2x1bW5zQ291bnQgKyBjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIml0ZW0uZGF0YVwiXG4gICAgICAgICAgICAgICAga2VuZG9HcmlkTG9naWNhbENlbGxcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCJsb2dpY2FsQ29sSW5kZXgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhUm93SW5kZXhdPVwiaXRlbS5pbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhSXRlbV09XCJpdGVtLmRhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbY29sSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2x1bW4uY29sc3BhblwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RhYmxlKCkgPyBpc0FyaWFTZWxlY3RlZChpdGVtLCBjb2x1bW4pIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvdWNoLWFjdGlvbl09XCJpc1NlbGVjdGFibGUoKSAmJiAkYW55KHNlbGVjdGFibGUpLmRyYWcgPyAnbm9uZScgOiAnYXV0bydcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstZ3JpZC1lZGl0LWNlbGxdPVwiaXNFZGl0aW5nQ2VsbChpdGVtLmluZGV4LCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2x1bW4uc3R5bGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uLmNvbHNwYW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLXN0YXRlLXNlbGVjdGVkXT1cImlzU2VsZWN0YWJsZSAmJiBjZWxsU2VsZWN0aW9uU2VydmljZS5pc0NlbGxTZWxlY3RlZChpdGVtLCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBjb2x1bW5JbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Q29sdW1ucztcIj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdJZj1cImlzRGF0YUl0ZW0oaXRlbSkgJiYgaXNJbkV4cGFuZGVkR3JvdXAoaXRlbSkgJiYgZGV0YWlsVGVtcGxhdGU/LnRlbXBsYXRlUmVmICYmXG4gICAgICAgICAgICBkZXRhaWxUZW1wbGF0ZS5zaG93SWYoaXRlbS5kYXRhLCBpdGVtLmluZGV4KSAmJiBpc0V4cGFuZGVkKGl0ZW0pXCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1kZXRhaWwtcm93XCJcbiAgICAgICAgICAgIFtjbGFzcy5rLWFsdF09XCJpc09kZChpdGVtKVwiXG4gICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsUm93XG4gICAgICAgICAgICAgICAgW2RhdGFSb3dJbmRleF09XCJpdGVtLmluZGV4XCJcbiAgICAgICAgICAgICAgICBbZGF0YUl0ZW1dPVwiaXRlbS5kYXRhXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxvZ2ljYWxSb3dJbmRleChyb3dJbmRleCkgKyAxXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlUm93XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbENlbGxzQ291bnRdPVwiMVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJrLWdyb3VwLWNlbGxcIiAqbmdGb3I9XCJsZXQgZyBvZiBncm91cHNcIj48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiay1oaWVyYXJjaHktY2VsbFwiPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJrLWRldGFpbC1jZWxsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNTcGFuXCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxvZ2ljYWxSb3dJbmRleChyb3dJbmRleCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvZ2ljYWxDb2xJbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFSb3dJbmRleF09XCJpdGVtLmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIml0ZW0uZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xJbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiYWxsQ29sdW1uc1NwYW4gKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCIgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRldGFpbFRlbXBsYXRlLnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJdGVtOiBpdGVtLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaXRlbS5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXRlbS5kYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyICpuZ0lmPVwiaXNGb290ZXIoaXRlbSkgJiYgKGlzSW5FeHBhbmRlZEdyb3VwKGl0ZW0pIHx8IChzaG93R3JvdXBGb290ZXJzICYmIGlzUGFyZW50R3JvdXBFeHBhbmRlZChpdGVtKSkpXG4gICAgICAgICAgICAmJiAhaXRlbS5kYXRhLmhpZGVGb290ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJrLWdyb3VwLWZvb3RlclwiXG4gICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsUm93XG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXgocm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlUm93XT1cImxvY2tlZENvbHVtbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsQ2VsbHNDb3VudF09XCJjb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxTbGF2ZUNlbGxzQ291bnRdPVwidW5sb2NrZWRDb2x1bW5zQ291bnRcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2tpcEdyb3VwRGVjb3JhdGlvblwiPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImstZ3JvdXAtY2VsbFwiICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiPjwvdGQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiay1oaWVyYXJjaHktY2VsbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkZXRhaWxUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgIGtlbmRvR3JpZExvZ2ljYWxDZWxsXG4gICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsUm93SW5kZXhdPVwibG9naWNhbFJvd0luZGV4KHJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsQ29sSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxvZ2ljYWxSb3dJbmRleChyb3dJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbENvbEluZGV4XT1cImxvZ2ljYWxDb2xJbmRleChjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXNraXBdPVwic2tpcEdyb3VwRGVjb3JhdGlvblwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmb290ZXJDb2x1bW5zOyBsZXQgY29sdW1uSW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUNvbHVtbnM7XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IGNvbHVtbi5ncm91cEZvb3RlclRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IGl0ZW0uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXM6IGl0ZW0uZGF0YT8uYWdncmVnYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXRlbS5kYXRhPy5hZ2dyZWdhdGVzXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UYWJsZUJvZHlDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEZXRhaWxzU2VydmljZSB9LFxuICAgIHsgdHlwZTogR3JvdXBzU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ2hhbmdlTm90aWZpY2F0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBEb21FdmVudHNTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTZWxlY3Rpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBDZWxsU2VsZWN0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogQ29sdW1uSW5mb1NlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5hdmlnYXRpb25TZXJ2aWNlIH1cbl07XG5UYWJsZUJvZHlDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWxsQ29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkZXRhaWxUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbm9SZWNvcmRzVGVtcGxhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRhdGE6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNraXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNlbGVjdGFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG5vUmVjb3Jkc1RleHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGlzTG9ja2VkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBza2lwR3JvdXBEZWNvcmF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzaG93R3JvdXBGb290ZXJzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb2NrZWRDb2x1bW5zQ291bnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRvdGFsQ29sdW1uc0NvdW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB2aXJ0dWFsQ29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcm93Q2xhc3M6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgQ2VsbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZWRpdFNlcnZpY2UsIGlkU2VydmljZSwgY2VsbENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZSA9IGVkaXRTZXJ2aWNlO1xuICAgICAgICB0aGlzLmlkU2VydmljZSA9IGlkU2VydmljZTtcbiAgICAgICAgdGhpcy5jZWxsQ29udGV4dCA9IGNlbGxDb250ZXh0O1xuICAgICAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQ29udGV4dCA9IHt9O1xuICAgICAgICB0aGlzLl9lZGl0VGVtcGxhdGVDb250ZXh0ID0ge307XG4gICAgfVxuICAgIGdldCBjb21tYW5kQ2VsbENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0NvbW1hbmQodGhpcy5jb2x1bW4pO1xuICAgIH1cbiAgICBzZXQgcm93SW5kZXgoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5fcm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy51cGRhdGVDZWxsQ29udGV4dCgpO1xuICAgIH1cbiAgICBnZXQgcm93SW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dJbmRleDtcbiAgICB9XG4gICAgZ2V0IGlzRWRpdGVkKCkge1xuICAgICAgICBpZiAoISh0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGluZygpIHx8IHRoaXMuaXNOZXcpIHx8ICF0aGlzLmlzQ29sdW1uRWRpdGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZGl0Q29udGV4dCA9IHRoaXMuZWRpdFNlcnZpY2UuY29sdW1uQ29udGV4dCh0aGlzLnJvd0luZGV4LCB0aGlzLmNvbHVtbik7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRmllbGRFZGl0YWJsZShlZGl0Q29udGV4dCwgdGhpcy5jb2x1bW4pO1xuICAgIH1cbiAgICBnZXQgZm9ybUdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0U2VydmljZS5jb250ZXh0KHRoaXMucm93SW5kZXgpLmdyb3VwO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVDb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVDb250ZXh0O1xuICAgIH1cbiAgICBnZXQgZWRpdFRlbXBsYXRlQ29udGV4dCgpIHtcbiAgICAgICAgdGhpcy5fZWRpdFRlbXBsYXRlQ29udGV4dC4kaW1wbGljaXQgPSB0aGlzLmZvcm1Hcm91cDtcbiAgICAgICAgdGhpcy5fZWRpdFRlbXBsYXRlQ29udGV4dC5pc05ldyA9IHRoaXMuaXNOZXc7XG4gICAgICAgIHRoaXMuX2VkaXRUZW1wbGF0ZUNvbnRleHQuY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgIHRoaXMuX2VkaXRUZW1wbGF0ZUNvbnRleHQuZGF0YUl0ZW0gPSB0aGlzLmRhdGFJdGVtO1xuICAgICAgICB0aGlzLl9lZGl0VGVtcGxhdGVDb250ZXh0LmZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwO1xuICAgICAgICB0aGlzLl9lZGl0VGVtcGxhdGVDb250ZXh0LnJvd0luZGV4ID0gdGhpcy5yb3dJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRUZW1wbGF0ZUNvbnRleHQ7XG4gICAgfVxuICAgIGdldCBmb3JtYXQoKSB7XG4gICAgICAgIGlmIChpc0NvbHVtbkNvbXBvbmVudCh0aGlzLmNvbHVtbikgJiYgIWlzTnVsbE9yRW1wdHlTdHJpbmcodGhpcy5jb2x1bW4uZm9ybWF0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RGb3JtYXQodGhpcy5jb2x1bW4uZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgaXNCb3VuZENvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpZWxkICYmICF0aGlzLmNvbHVtbi50ZW1wbGF0ZVJlZjtcbiAgICB9XG4gICAgZ2V0IGlzQ2hlY2tib3hDb2x1bW4oKSB7XG4gICAgICAgIHJldHVybiBpc0NoZWNrYm94Q29sdW1uKHRoaXMuY29sdW1uKSAmJiAhdGhpcy5jb2x1bW4udGVtcGxhdGVSZWY7XG4gICAgfVxuICAgIGdldCBzZWxlY3Rpb25DaGVja2JveElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZFNlcnZpY2Uuc2VsZWN0aW9uQ2hlY2tib3hJZCh0aGlzLnJvd0luZGV4KTtcbiAgICB9XG4gICAgZ2V0IGlzU3BhbkNvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIGlzU3BhbkNvbHVtbih0aGlzLmNvbHVtbikgJiYgIXRoaXMuY29sdW1uLnRlbXBsYXRlUmVmO1xuICAgIH1cbiAgICBnZXQgY2hpbGRDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gY29sdW1uc1RvUmVuZGVyKFt0aGlzLmNvbHVtbl0pO1xuICAgIH1cbiAgICBnZXQgaXNDb2x1bW5FZGl0YWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbiB8fCB0aGlzLmlzQ29tbWFuZCh0aGlzLmNvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZWRpdGFibGUgIT09IGZhbHNlO1xuICAgIH1cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2VsbENvbnRleHQoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoX2NoYW5nZXMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZUNvbnRleHQoKTtcbiAgICB9XG4gICAgaXNDb21tYW5kKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gY29sdW1uIGluc3RhbmNlb2YgQ29tbWFuZENvbHVtbkNvbXBvbmVudDtcbiAgICB9XG4gICAgaXNGaWVsZEVkaXRhYmxlKGVkaXRDb250ZXh0LCBjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQoZWRpdENvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJlc2VudChjb2x1bW4uZWRpdFRlbXBsYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudChlZGl0Q29udGV4dC5ncm91cCkgJiYgaXNQcmVzZW50KGVkaXRDb250ZXh0Lmdyb3VwLmdldChjb2x1bW4uZmllbGQpKTtcbiAgICB9XG4gICAgdXBkYXRlQ2VsbENvbnRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxDb250ZXh0LnJvd0luZGV4ID0gdGhpcy5fcm93SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlVGVtcGxhdGVDb250ZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1uLnRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3RlbXBsYXRlQ29udGV4dDtcbiAgICAgICAgY29udGV4dC5pc05ldyA9IHRoaXMuaXNOZXc7XG4gICAgICAgIGNvbnRleHQuY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgIGNvbnRleHQuZGF0YUl0ZW0gPSB0aGlzLmRhdGFJdGVtO1xuICAgICAgICBjb250ZXh0LnJvd0luZGV4ID0gdGhpcy5yb3dJbmRleDtcbiAgICAgICAgY29udGV4dC5jb2x1bW5JbmRleCA9IHRoaXMuY29sdW1uSW5kZXg7XG4gICAgICAgIGNvbnRleHQuJGltcGxpY2l0ID0gdGhpcy5kYXRhSXRlbTtcbiAgICB9XG59XG5DZWxsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkQ2VsbF0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImlzRWRpdGVkXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjb2x1bW4udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4udGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwidGVtcGxhdGVDb250ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNTcGFuQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY2hpbGRDb2x1bW4gW25nRm9yT2ZdPVwiY2hpbGRDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbSB8IHZhbHVlT2Y6IGNoaWxkQ29sdW1uLmZpZWxkOiBjaGlsZENvbHVtbi5mb3JtYXR9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzQm91bmRDb2x1bW5cIj57eyBkYXRhSXRlbSB8IHZhbHVlT2Y6IGNvbHVtbi5maWVsZDogY29sdW1uLmZvcm1hdH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNDaGVja2JveENvbHVtbiAmJiAhaXNOZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiay1jaGVja2JveFwiIFtrZW5kb0dyaWRTZWxlY3Rpb25DaGVja2JveF09XCJyb3dJbmRleFwiIFthdHRyLmlkXT1cInNlbGVjdGlvbkNoZWNrYm94SWRcIj48bGFiZWwgY2xhc3M9XCJrLWNoZWNrYm94LWxhYmVsXCIgW2F0dHIuZm9yXT1cInNlbGVjdGlvbkNoZWNrYm94SWRcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZWRpdFRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmVkaXRUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJlZGl0VGVtcGxhdGVDb250ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4uZWRpdG9yXCIgKm5nSWY9XCIhY29sdW1uLmVkaXRUZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tbnVtZXJpY3RleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbnVtZXJpYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5nZXQoY29sdW1uLmZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgICAgICAgICAgPjwva2VuZG8tbnVtZXJpY3RleHRib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5nZXQoY29sdW1uLmZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgICAgICAgICAgPjwva2VuZG8tZGF0ZXBpY2tlcj5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2x1bW4uZmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtlbmRvR3JpZEZvY3VzYWJsZVxuICAgICAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLXRleHRib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5nZXQoY29sdW1uLmZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBrZW5kb0dyaWRGb2N1c2FibGVcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNlbGxDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFZGl0U2VydmljZSB9LFxuICAgIHsgdHlwZTogSWRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0VMTF9DT05URVhULF0gfV0gfVxuXTtcbkNlbGxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgY29tbWFuZENlbGxDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jb21tYW5kLWNlbGwnLF0gfV0sXG4gICAgY29sdW1uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2x1bW5JbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXNOZXc6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHJvd0luZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkYXRhSXRlbTogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYGVkaXRgIGNvbW1hbmQgb2YgdGhlIEdyaWQuIFlvdSBjYW4gYXBwbHkgdGhpcyBkaXJlY3RpdmUgdG8gYW55IGBidXR0b25gXG4gKiBlbGVtZW50IGluc2lkZSBhIFtgQ29tbWFuZENvbHVtbkNvbXBvbmVudGBdKHslIHNsdWcgYXBpX2dyaWRfY29tbWFuZGNvbHVtbmNvbXBvbmVudCAlfSkuXG4gKiBXaGVuIGFuIGFzc29jaWF0ZWQgYnV0dG9uIHdpdGggdGhlIGRpcmVjdGl2ZSBpcyBjbGlja2VkLCB0aGVcbiAqIFtgZWRpdGBdKHslIHNsdWcgYXBpX2dyaWRfZ3JpZGNvbXBvbmVudCAlfSN0b2MtZWRpdCkgZXZlbnRcbiAqIGlzIHRyaWdnZXJlZCAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGVkaXRpbmdfZ3JpZCAlfSkpLlxuICpcbiAqID4gV2hlbiB0aGUgcm93IGlzIGluIHRoZSBlZGl0IG1vZGUsIHRoZSBidXR0b24gd2l0aCBga2VuZG9HcmlkRWRpdENvbW1hbmRgIGlzIGF1dG9tYXRpY2FsbHkgaGlkZGVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sLW5vLXJ1blxuICogPGtlbmRvLWdyaWQ+XG4gKiAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uIHRpdGxlPVwiY29tbWFuZFwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGU+XG4gKiAgICAgICA8YnV0dG9uIGtlbmRvR3JpZEVkaXRDb21tYW5kIGNsYXNzPVwiay1wcmltYXJ5XCI+RWRpdDwvYnV0dG9uPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgIDwva2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbj5cbiAqIDwva2VuZG8tZ3JpZD5cbiAqIGBgYFxuICpcbiAqL1xuY2xhc3MgRWRpdENvbW1hbmREaXJlY3RpdmUgZXh0ZW5kcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRTZXJ2aWNlLCBjZWxsQ29udGV4dCwgZWxlbWVudCwgcmVuZGVyZXIsIGxvY2FsaXphdGlvbiwgbmdab25lKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIHJlbmRlcmVyLCBudWxsLCBsb2NhbGl6YXRpb24sIG5nWm9uZSk7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UgPSBlZGl0U2VydmljZTtcbiAgICAgICAgdGhpcy5jZWxsQ29udGV4dCA9IGNlbGxDb250ZXh0O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21tYW5kQ2xhc3MgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHZpc2libGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRWRpdGVkID8gJ25vbmUnIDogJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmJlZ2luRWRpdCh0aGlzLnJvd0luZGV4KTtcbiAgICB9XG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICBpZiAodGhpcy5jZWxsQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yb3dJbmRleCA9IHRoaXMuY2VsbENvbnRleHQucm93SW5kZXg7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdGVkID0gdGhpcy5lZGl0U2VydmljZS5pc0VkaXRlZCh0aGlzLnJvd0luZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkVkaXRDb21tYW5kRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkRWRpdENvbW1hbmRdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5FZGl0Q29tbWFuZERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVkaXRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0NFTExfQ09OVEVYVCxdIH1dIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuRWRpdENvbW1hbmREaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdmlzaWJsZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuZGlzcGxheScsXSB9XSxcbiAgICBjb21tYW5kQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1lZGl0LWNvbW1hbmQnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGBjYW5jZWxgIGNvbW1hbmQgb2YgdGhlIEdyaWQuIFlvdSBjYW4gYXBwbHkgdGhpcyBkaXJlY3RpdmUgdG8gYW55IGBidXR0b25gXG4gKiBlbGVtZW50IGluc2lkZSBhIFtgQ29tbWFuZENvbHVtbkNvbXBvbmVudGBdKHslIHNsdWcgYXBpX2dyaWRfY29tbWFuZGNvbHVtbmNvbXBvbmVudCAlfSkuXG4gKiBXaGVuIGFuIGFzc29jaWF0ZWQgYnV0dG9uIHdpdGggdGhlIGRpcmVjdGl2ZSBpcyBjbGlja2VkLCB0aGVcbiAqIFtgY2FuY2VsYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1jYW5jZWwpIGV2ZW50XG4gKiBpcyB0cmlnZ2VyZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX2dyaWQgJX0pKS5cbiAqXG4gKiA+IFdoZW4gdGhlIHJvdyBpcyBub3QgaW4gdGhlIGVkaXQgbW9kZSwgdGhlIGJ1dHRvbiB3aXRoIHRoZSBga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZGAgaXMgYXV0b21hdGljYWxseSBoaWRkZW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWwtbm8tcnVuXG4gKiA8a2VuZG8tZ3JpZD5cbiAqICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gdGl0bGU9XCJjb21tYW5kXCI+XG4gKiAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZT5cbiAqICAgICAgIDxidXR0b24ga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZD5DYW5jZWwgY2hhbmdlczwvYnV0dG9uPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgIDwva2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbj5cbiAqIDwva2VuZG8tZ3JpZD5cbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gY29udHJvbCB0aGUgY29udGVudCBvZiB0aGUgYnV0dG9uIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcm93LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sLW5vLXJ1blxuICogPGtlbmRvLWdyaWQ+XG4gKiAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uIHRpdGxlPVwiY29tbWFuZFwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWlzTmV3PVwiaXNOZXdcIj5cbiAqICAgICAgIDxidXR0b24ga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZD57e2lzTmV3ID8gJ0Rpc2NhcmQnIDogJ0NhbmNlbCBjaGFuZ2VzJ319PC9idXR0b24+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxuICogPC9rZW5kby1ncmlkPlxuICogYGBgXG4gKi9cbmNsYXNzIENhbmNlbENvbW1hbmREaXJlY3RpdmUgZXh0ZW5kcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRTZXJ2aWNlLCBjZWxsQ29udGV4dCwgZWxlbWVudCwgcmVuZGVyZXIsIGxvY2FsaXphdGlvbiwgbmdab25lKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIHJlbmRlcmVyLCBudWxsLCBsb2NhbGl6YXRpb24sIG5nWm9uZSk7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UgPSBlZGl0U2VydmljZTtcbiAgICAgICAgdGhpcy5jZWxsQ29udGV4dCA9IGNlbGxDb250ZXh0O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21tYW5kQ2xhc3MgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHZpc2libGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0VkaXRlZCA/ICdub25lJyA6ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DbGljayhlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuZW5kRWRpdCh0aGlzLnJvd0luZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJvd0luZGV4ID0gdGhpcy5jZWxsQ29udGV4dC5yb3dJbmRleDtcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0ZWQgPSB0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGVkKHRoaXMucm93SW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxufVxuQ2FuY2VsQ29tbWFuZERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZENhbmNlbENvbW1hbmRdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5DYW5jZWxDb21tYW5kRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0VMTF9DT05URVhULF0gfV0gfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5DYW5jZWxDb21tYW5kRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHZpc2libGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmRpc3BsYXknLF0gfV0sXG4gICAgY29tbWFuZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWdyaWQtY2FuY2VsLWNvbW1hbmQnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGBzYXZlYCBjb21tYW5kIG9mIHRoZSBHcmlkLiBZb3UgY2FuIGFwcGx5IHRoaXMgZGlyZWN0aXZlIHRvIGFueSBgYnV0dG9uYFxuICogZWxlbWVudCBpbnNpZGUgYSBbYENvbW1hbmRDb2x1bW5Db21wb25lbnRgXSh7JSBzbHVnIGFwaV9ncmlkX2NvbW1hbmRjb2x1bW5jb21wb25lbnQgJX0pLlxuICogV2hlbiBhbiBhc3NvY2lhdGVkIGJ1dHRvbiB3aXRoIHRoZSBkaXJlY3RpdmUgaXMgY2xpY2tlZCwgdGhlXG4gKiBbYHNhdmVgXSh7JSBzbHVnIGFwaV9ncmlkX2dyaWRjb21wb25lbnQgJX0jdG9jLXNhdmUpIGV2ZW50XG4gKiBpcyB0cmlnZ2VyZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX2dyaWQgJX0pKS5cbiAqXG4gKiA+IFdoZW4gdGhlIHJvdyBpcyBub3QgaW4gdGhlIGVkaXQgbW9kZSwgdGhlIGJ1dHRvbiB3aXRoIGBrZW5kb0dyaWRTYXZlQ29tbWFuZGAgaXMgYXV0b21hdGljYWxseSBoaWRkZW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWwtbm8tcnVuXG4gKiA8a2VuZG8tZ3JpZD5cbiAqICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gdGl0bGU9XCJjb21tYW5kXCI+XG4gKiAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZT5cbiAqICAgICAgIDxidXR0b24ga2VuZG9HcmlkU2F2ZUNvbW1hbmQ+U2F2ZSBjaGFuZ2VzPC9idXR0b24+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxuICogPC9rZW5kby1ncmlkPlxuICogYGBgXG4gKlxuICogWW91IGNhbiBjb250cm9sIHRoZSBjb250ZW50IG9mIHRoZSBidXR0b24gYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSByb3cuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWwtbm8tcnVuXG4gKiA8a2VuZG8tZ3JpZD5cbiAqICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gdGl0bGU9XCJjb21tYW5kXCI+XG4gKiAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtaXNOZXc9XCJpc05ld1wiPlxuICogICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRTYXZlQ29tbWFuZD57e2lzTmV3ID8gJ0FkZCcgOiAnVXBkYXRlJ319PC9idXR0b24+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxuICogPC9rZW5kby1ncmlkPlxuICogYGBgXG4gKi9cbmNsYXNzIFNhdmVDb21tYW5kRGlyZWN0aXZlIGV4dGVuZHMgQnV0dG9uIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0U2VydmljZSwgY2VsbENvbnRleHQsIGVsZW1lbnQsIHJlbmRlcmVyLCBsb2NhbGl6YXRpb24sIG5nWm9uZSkge1xuICAgICAgICBzdXBlcihlbGVtZW50LCByZW5kZXJlciwgbnVsbCwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpO1xuICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlID0gZWRpdFNlcnZpY2U7XG4gICAgICAgIHRoaXMuY2VsbENvbnRleHQgPSBjZWxsQ29udGV4dDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29tbWFuZENsYXNzID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCB2aXNpYmxlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNFZGl0ZWQgPyAnbm9uZScgOiAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQ2xpY2soZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLnNhdmUodGhpcy5yb3dJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICBpZiAodGhpcy5jZWxsQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yb3dJbmRleCA9IHRoaXMuY2VsbENvbnRleHQucm93SW5kZXg7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdGVkID0gdGhpcy5lZGl0U2VydmljZS5pc0VkaXRlZCh0aGlzLnJvd0luZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblNhdmVDb21tYW5kRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkU2F2ZUNvbW1hbmRdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TYXZlQ29tbWFuZERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEVkaXRTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0NFTExfQ09OVEVYVCxdIH1dIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuU2F2ZUNvbW1hbmREaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgdmlzaWJsZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuZGlzcGxheScsXSB9XSxcbiAgICBjb21tYW5kQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1zYXZlLWNvbW1hbmQnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGByZW1vdmVgIGNvbW1hbmQgb2YgdGhlIEdyaWQuIFlvdSBjYW4gYXBwbHkgdGhpcyBkaXJlY3RpdmUgdG8gYW55IGBidXR0b25gIGVsZW1lbnRcbiAqIGluc2lkZSBhIFtgQ29tbWFuZENvbHVtbkNvbXBvbmVudGBdKHslIHNsdWcgYXBpX2dyaWRfY29tbWFuZGNvbHVtbmNvbXBvbmVudCAlfSkuXG4gKiBXaGVuIGFuIGFzc29jaWF0ZWQgYnV0dG9uIHdpdGggdGhlIGRpcmVjdGl2ZSBpcyBjbGlja2VkLCB0aGVcbiAqIFtgcmVtb3ZlYCBldmVudF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1yZW1vdmUpXG4gKiBpcyB0cmlnZ2VyZWQgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX3JlYWN0aXZlX2Zvcm1zX2dyaWQgJX0pKS5cbiAqXG4gKiA+IFdoZW4gdGhlIHJvdyBpcyBpbiB0aGUgZWRpdCBtb2RlLCB0aGUgYnV0dG9uIHdpdGggdGhlIGBrZW5kb0dyaWRSZW1vdmVDb21tYW5kYCBpcyBhdXRvbWF0aWNhbGx5IGhpZGRlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbC1uby1ydW5cbiAqIDxrZW5kby1ncmlkPlxuICogICA8a2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbiB0aXRsZT1cImNvbW1hbmRcIj5cbiAqICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlPlxuICogICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRSZW1vdmVDb21tYW5kPlJlbW92ZSByb3c8L2J1dHRvbj5cbiAqICAgICA8L25nLXRlbXBsYXRlPlxuICogICA8L2tlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4+XG4gKiA8L2tlbmRvLWdyaWQ+XG4gKiBgYGBcbiAqL1xuY2xhc3MgUmVtb3ZlQ29tbWFuZERpcmVjdGl2ZSBleHRlbmRzIEJ1dHRvbiB7XG4gICAgY29uc3RydWN0b3IoZWRpdFNlcnZpY2UsIGNlbGxDb250ZXh0LCBlbGVtZW50LCByZW5kZXJlciwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgcmVuZGVyZXIsIG51bGwsIGxvY2FsaXphdGlvbiwgbmdab25lKTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZSA9IGVkaXRTZXJ2aWNlO1xuICAgICAgICB0aGlzLmNlbGxDb250ZXh0ID0gY2VsbENvbnRleHQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbW1hbmRDbGFzcyA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFZGl0ZWQgPyAnbm9uZScgOiAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQ2xpY2soZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UucmVtb3ZlKHRoaXMucm93SW5kZXgpO1xuICAgIH1cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJvd0luZGV4ID0gdGhpcy5jZWxsQ29udGV4dC5yb3dJbmRleDtcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0ZWQgPSB0aGlzLmVkaXRTZXJ2aWNlLmlzRWRpdGVkKHRoaXMucm93SW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVtb3ZlQ29tbWFuZERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZFJlbW92ZUNvbW1hbmRdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5SZW1vdmVDb21tYW5kRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0VMTF9DT05URVhULF0gfV0gfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5SZW1vdmVDb21tYW5kRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHZpc2libGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmRpc3BsYXknLF0gfV0sXG4gICAgY29tbWFuZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWdyaWQtcmVtb3ZlLWNvbW1hbmQnLF0gfV0sXG4gICAgb25DbGljazogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbW1hbmQgZm9yIGFkZGluZyBhIG5ldyBpdGVtIHRvIHRoZSBHcmlkLiBZb3UgY2FuIGFwcGx5IHRoaXMgZGlyZWN0aXZlIHRvIGFueVxuICogYGJ1dHRvbmAgZWxlbWVudCBpbnNpZGUgYSBbYFRvb2xiYXJUZW1wbGF0ZWBdKHslIHNsdWcgYXBpX2dyaWRfY29tbWFuZGNvbHVtbmNvbXBvbmVudCAlfSkuXG4gKiBXaGVuIGFuIGFzc29jaWF0ZWQgYnV0dG9uIHdpdGggdGhlIGRpcmVjdGl2ZSBpcyBjbGlja2VkLCB0aGVcbiAqIFtgYWRkYF0oeyUgc2x1ZyBhcGlfZ3JpZF9ncmlkY29tcG9uZW50ICV9I3RvYy1hZGQpIGV2ZW50IGlzIHRyaWdnZXJlZFxuICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX2dyaWQgJX0pKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbC1uby1ydW5cbiAqIDxrZW5kby1ncmlkPlxuICogICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZT5cbiAqICAgICAgIDxidXR0b24ga2VuZG9HcmlkQWRkQ29tbWFuZD5BZGQgbmV3PC9idXR0b24+XG4gKiAgICA8L25nLXRlbXBsYXRlPlxuICogPC9rZW5kby1ncmlkPlxuICogYGBgXG4gKi9cbmNsYXNzIEFkZENvbW1hbmREaXJlY3RpdmUgZXh0ZW5kcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRTZXJ2aWNlLCBlbGVtZW50LCByZW5kZXJlciwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgcmVuZGVyZXIsIG51bGwsIGxvY2FsaXphdGlvbiwgbmdab25lKTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZSA9IGVkaXRTZXJ2aWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DbGljayhlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZS5iZWdpbkFkZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGNvbW1hbmRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuQWRkQ29tbWFuZERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEFkZENvbW1hbmRdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5BZGRDb21tYW5kRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWRpdFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5BZGRDb21tYW5kRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIG9uQ2xpY2s6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydjbGljaycsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBjb21tYW5kQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1hZGQtY29tbWFuZCcsXSB9XVxufTtcblxuY29uc3QgZXhwb3J0ZWQkMSA9IFtcbiAgICBDb21tYW5kQ29sdW1uQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29sdW1uQ29tcG9uZW50LFxuICAgIFNlbGVjdGlvbkNoZWNrYm94RGlyZWN0aXZlLFxuICAgIENlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgVGFibGVCb2R5Q29tcG9uZW50LFxuICAgIE5vUmVjb3Jkc1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgIENlbGxDb21wb25lbnQsXG4gICAgRWRpdENvbW1hbmREaXJlY3RpdmUsXG4gICAgQ2FuY2VsQ29tbWFuZERpcmVjdGl2ZSxcbiAgICBTYXZlQ29tbWFuZERpcmVjdGl2ZSxcbiAgICBSZW1vdmVDb21tYW5kRGlyZWN0aXZlLFxuICAgIEFkZENvbW1hbmREaXJlY3RpdmVcbl07XG5jb25zdCBpbXBvcnRlZE1vZHVsZXMkMyA9IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgR3JvdXBNb2R1bGUsXG4gICAgTnVtZXJpY1RleHRCb3hNb2R1bGUsXG4gICAgRGF0ZVBpY2tlck1vZHVsZVxuXTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBCb2R5TW9kdWxlIHtcbiAgICBzdGF0aWMgZXhwb3J0cygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIENvbW1hbmRDb2x1bW5Db21wb25lbnQsXG4gICAgICAgICAgICBDaGVja2JveENvbHVtbkNvbXBvbmVudCxcbiAgICAgICAgICAgIFNlbGVjdGlvbkNoZWNrYm94RGlyZWN0aXZlLFxuICAgICAgICAgICAgQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgTm9SZWNvcmRzVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBFZGl0Q29tbWFuZERpcmVjdGl2ZSxcbiAgICAgICAgICAgIENhbmNlbENvbW1hbmREaXJlY3RpdmUsXG4gICAgICAgICAgICBTYXZlQ29tbWFuZERpcmVjdGl2ZSxcbiAgICAgICAgICAgIFJlbW92ZUNvbW1hbmREaXJlY3RpdmUsXG4gICAgICAgICAgICBBZGRDb21tYW5kRGlyZWN0aXZlXG4gICAgICAgIF07XG4gICAgfVxufVxuQm9keU1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZXhwb3J0ZWQkMV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkJDFdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFsuLi5pbXBvcnRlZE1vZHVsZXMkM11cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEZvb3RlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xuICAgICAgICB0aGlzLmxvY2tlZENvbHVtbnNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMubG9naWNhbFJvd0luZGV4ID0gMDtcbiAgICB9XG4gICAgZ2V0IGZvb3RlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuc2Nyb2xsYWJsZTtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbnNUb1JlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNUb1JlbmRlcih0aGlzLmNvbHVtbnMgfHwgW10pO1xuICAgIH1cbiAgICBsb2dpY2FsQ29sdW1uSW5kZXgoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29sdW1uLmxlYWZJbmRleDtcbiAgICAgICAgaWYgKGlzUHJlc2VudChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCArIChpc1ByZXNlbnQodGhpcy5kZXRhaWxUZW1wbGF0ZSkgPyAxIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbn1cbkZvb3RlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEZvb3Rlcl0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInRydWVcIj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgICBbY2xhc3Muay1mb290ZXItdGVtcGxhdGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsUm93XG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxSb3dJbmRleF09XCJsb2dpY2FsUm93SW5kZXhcIlxuICAgICAgICAgICAgICAgIFtsb2dpY2FsU2xhdmVSb3ddPVwibG9ja2VkQ29sdW1uc0NvdW50ID4gMFwiXG4gICAgICAgICAgICAgICAgW2xvZ2ljYWxDZWxsc0NvdW50XT1cImNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbbG9naWNhbFNsYXZlQ2VsbHNDb3VudF09XCJjb2x1bW5zLmxlbmd0aCAtIGxvY2tlZENvbHVtbnNDb3VudFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1ncm91cC1jZWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBnIG9mIGdyb3Vwc1wiPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLWhpZXJhcmNoeS1jZWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zVG9SZW5kZXI7IGxldCBjb2x1bW5JbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBrZW5kb0dyaWRMb2dpY2FsQ2VsbFxuICAgICAgICAgICAgICAgICAgICBbbG9naWNhbFJvd0luZGV4XT1cImxvZ2ljYWxSb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2dpY2FsQ29sSW5kZXhdPVwibG9naWNhbENvbHVtbkluZGV4KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uZm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uZm9vdGVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5mb290ZXJTdHlsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiBjb2x1bW4uZm9vdGVyVGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogbG9ja2VkQ29sdW1uc0NvdW50ICsgY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY29sdW1uXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkZvb3RlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjb2x1bW5zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBncm91cHM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRldGFpbFRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzY3JvbGxhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsb2NrZWRDb2x1bW5zQ291bnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxvZ2ljYWxSb3dJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZm9vdGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1mb290ZXInLF0gfV1cbn07XG5cbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyQzID0gW1xuICAgIEZvb3RlckNvbXBvbmVudFxuXTtcbmNvbnN0IGltcG9ydGVkTW9kdWxlcyQ0ID0gW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGVcbl07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRm9vdGVyTW9kdWxlIHtcbiAgICBzdGF0aWMgZXhwb3J0cygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbkZvb3Rlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZXhwb3J0ZWRNb2R1bGVzJDNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkM10sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogWy4uLmltcG9ydGVkTW9kdWxlcyQ0XVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgVG9vbGJhckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZ3JpZCkge1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiAnay1oZWFkZXIgay1ncmlkLXRvb2xiYXInO1xuICAgIH1cbiAgICBzZXQgcG9zaXRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBvc2l0aW9uID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCB0b29sYmFyVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQudG9vbGJhclRlbXBsYXRlID8gdGhpcy5ncmlkLnRvb2xiYXJUZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG59XG5Ub29sYmFyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLXRvb2xiYXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgKm5nSWY9XCJ0b29sYmFyVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidG9vbGJhclRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRvb2xiYXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBHcmlkQ29tcG9uZW50IH1cbl07XG5Ub29sYmFyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNsYXNzTmFtZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzJyxdIH1dLFxuICAgIHBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExvY2FsRWRpdFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGdyaWQsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgPSBsb2NhbERhdGFDaGFuZ2VzU2VydmljZTtcbiAgICB9XG4gICAgY3JlYXRlKGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTG9jYWxEYXRhICYmIHRoaXMuZ3JpZC5za2lwKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlLmRhdGEuc3BsaWNlKHRoaXMuZ3JpZC5za2lwLCAwLCBpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS51bnNoaWZ0KGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQoKTtcbiAgICB9XG4gICAgdXBkYXRlKF9pdGVtKSB7IH0gLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1lbXB0eVxuICAgIHJlbW92ZShpdGVtKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGRhdGEubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IGRhdGFbaWR4XSkge1xuICAgICAgICAgICAgICAgIGRhdGEuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZCh7IGFjdGlvbjogJ3JlbW92ZScsIGl0ZW06IGl0ZW0gfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduVmFsdWVzKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xuICAgIH1cbiAgICBkYXRhQ2hhbmdlZChhcmdzID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTG9jYWxEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlLmNoYW5nZXMuZW1pdChhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaGFzTG9jYWxEYXRhKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLmxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlLmRhdGEpO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTG9jYWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWQuZGF0YTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGVmYXVsdCBlZGl0IHNlcnZpY2Ugb2YgdGhlIGVkaXRpbmcgZGlyZWN0aXZlcyB3b3JrcyBvbmx5IHdoZW4gYmluZGluZyB0byBwbGFpbiBhcnJheS4nICtcbiAgICAgICAgICAgICAgICAnUGxlYXNlIHByb3ZpZGUgYW4gZWRpdFNlcnZpY2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEVkaXRpbmdEaXJlY3RpdmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihncmlkLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSkge1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlID0gbG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdEVkaXRTZXJ2aWNlID0gdGhpcy5jcmVhdGVEZWZhdWx0U2VydmljZSgpO1xuICAgIH1cbiAgICAvLyBDb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIHRoZSBzZXJ2aWNlIHRvIGFsbG93IGZvciBzcGVjaWZ5aW5nIGEgZ2VuZXJpYyBzZXJ2aWNlIHdpdGhvdXQgY29kZS5cbiAgICAvLyBUaGUgSW5wdXQgc2hvdWxkIHN0aWxsIGJlIGtlcHQuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXQgc2VydmljZSB0aGF0IHdpbGwgaGFuZGxlIHRoZSBvcGVyYXRpb25zLlxuICAgICAqL1xuICAgIHNldCBlZGl0U2VydmljZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLnVzZXJFZGl0U2VydmljZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZWRpdFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJFZGl0U2VydmljZSB8fCB0aGlzLmRlZmF1bHRFZGl0U2VydmljZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB0aGlzLmdyaWQuYWRkLnN1YnNjcmliZSh0aGlzLmFkZEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ncmlkLnJlbW92ZS5zdWJzY3JpYmUodGhpcy5yZW1vdmVIYW5kbGVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmdyaWQuY2FuY2VsLnN1YnNjcmliZSh0aGlzLmNhbmNlbEhhbmRsZXIuYmluZCh0aGlzKSkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZ3JpZC5zYXZlLnN1YnNjcmliZSh0aGlzLnNhdmVIYW5kbGVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmdyaWQuZGF0YVN0YXRlQ2hhbmdlLnN1YnNjcmliZSh0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBjcmVhdGVEZWZhdWx0U2VydmljZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEVkaXRTZXJ2aWNlKHRoaXMuZ3JpZCwgdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZSk7XG4gICAgfVxuICAgIGFkZEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZ3JpZC5hZGRSb3codGhpcy5jcmVhdGVNb2RlbCh7IGlzTmV3OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgc2F2ZUhhbmRsZXIoYXJncykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zYXZlTW9kZWwoYXJncyk7XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pc05ldykge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuY3JlYXRlKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS51cGRhdGUoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkLmNsb3NlUm93KGFyZ3Mucm93SW5kZXgpO1xuICAgIH1cbiAgICBjYW5jZWxIYW5kbGVyKHsgcm93SW5kZXggfSkge1xuICAgICAgICB0aGlzLmNsb3NlRWRpdG9yKHJvd0luZGV4KTtcbiAgICB9XG4gICAgcmVtb3ZlSGFuZGxlcih7IGRhdGFJdGVtIH0pIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlSXRlbSA9IChzaG91bGRSZW1vdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLnJlbW92ZShkYXRhSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnJlbW92ZUNvbmZpcm1hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZW1vdmVDb25maXJtYXRpb24oZGF0YUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGhlbihyZW1vdmVJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocmVtb3ZlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVJdGVtKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFZGl0b3IoKTtcbiAgICB9XG4gICAgY2xvc2VFZGl0b3Iocm93SW5kZXgpIHtcbiAgICAgICAgdGhpcy5ncmlkLmNsb3NlUm93KHJvd0luZGV4KTtcbiAgICB9XG59XG5FZGl0aW5nRGlyZWN0aXZlQmFzZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBlZGl0U2VydmljZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgcmVtb3ZlQ29uZmlybWF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIExvY2FsUm93RWRpdFNlcnZpY2UgZXh0ZW5kcyBMb2NhbEVkaXRTZXJ2aWNlIHtcbiAgICB1cGRhdGUoX2l0ZW0pIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFJvd0VkaXRpbmdEaXJlY3RpdmVCYXNlIGV4dGVuZHMgRWRpdGluZ0RpcmVjdGl2ZUJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zXG4gICAgICAgICAgICAuYWRkKHRoaXMuZ3JpZC5lZGl0LnN1YnNjcmliZSh0aGlzLmVkaXRIYW5kbGVyLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgY3JlYXRlRGVmYXVsdFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG9jYWxSb3dFZGl0U2VydmljZSh0aGlzLmdyaWQsIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UpO1xuICAgIH1cbiAgICBhZGRIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLmNsb3NlRWRpdG9yKCk7XG4gICAgICAgIHN1cGVyLmFkZEhhbmRsZXIoKTtcbiAgICB9XG4gICAgZWRpdEhhbmRsZXIoYXJncykge1xuICAgICAgICB0aGlzLmNsb3NlRWRpdG9yKCk7XG4gICAgICAgIHRoaXMucm93SW5kZXggPSBhcmdzLnJvd0luZGV4O1xuICAgICAgICB0aGlzLmdyaWQuZWRpdFJvdyhhcmdzLnJvd0luZGV4LCB0aGlzLmNyZWF0ZU1vZGVsKGFyZ3MpKTtcbiAgICB9XG4gICAgc2F2ZUhhbmRsZXIoYXJncykge1xuICAgICAgICBzdXBlci5zYXZlSGFuZGxlcihhcmdzKTtcbiAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgIH1cbiAgICBjbG9zZUVkaXRvcihyb3dJbmRleCA9IHRoaXMucm93SW5kZXgpIHtcbiAgICAgICAgc3VwZXIuY2xvc2VFZGl0b3Iocm93SW5kZXgpO1xuICAgICAgICB0aGlzLmNsZWFuKCk7XG4gICAgfVxuICAgIGNsZWFuKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5yb3dJbmRleDtcbiAgICB9XG59XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBlZGl0aW5nIG9wZXJhdGlvbnMgb2YgdGhlIEdyaWQgd2hlbiB1c2luZ1xuICogdGhlIFRlbXBsYXRlLURyaXZlbiBBbmd1bGFyIEZvcm1zIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ19kaXJlY3RpdmVzX2dyaWQgJX0jdG9jLXRoZS10ZW1wbGF0ZS1kaXJlY3RpdmUpKS5cbiAqL1xuY2xhc3MgVGVtcGxhdGVFZGl0aW5nRGlyZWN0aXZlIGV4dGVuZHMgUm93RWRpdGluZ0RpcmVjdGl2ZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGdyaWQsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGdyaWQsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5ncmlkID0gZ3JpZDtcbiAgICAgICAgdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZSA9IGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlO1xuICAgIH1cbiAgICBlZGl0SGFuZGxlcihhcmdzKSB7XG4gICAgICAgIHN1cGVyLmVkaXRIYW5kbGVyKGFyZ3MpO1xuICAgICAgICB0aGlzLmRhdGFJdGVtID0gYXJncy5kYXRhSXRlbTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcyA9IHt9O1xuICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmFzc2lnblZhbHVlcyh0aGlzLm9yaWdpbmFsVmFsdWVzLCB0aGlzLmRhdGFJdGVtKTtcbiAgICB9XG4gICAgY2xvc2VFZGl0b3Iocm93SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuYXNzaWduVmFsdWVzKHRoaXMuZGF0YUl0ZW0sIHRoaXMub3JpZ2luYWxWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmNsb3NlRWRpdG9yKHJvd0luZGV4KTtcbiAgICB9XG4gICAgY3JlYXRlTW9kZWwoYXJncykge1xuICAgICAgICBpZiAoYXJncy5pc05ldykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNhdmVNb2RlbChhcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmRhdGFJdGVtO1xuICAgIH1cbiAgICBjbGVhbigpIHtcbiAgICAgICAgc3VwZXIuY2xlYW4oKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YUl0ZW07XG4gICAgfVxufVxuVGVtcGxhdGVFZGl0aW5nRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkVGVtcGxhdGVFZGl0aW5nXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuVGVtcGxhdGVFZGl0aW5nRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogR3JpZENvbXBvbmVudCB9LFxuICAgIHsgdHlwZTogTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgfVxuXTtcblRlbXBsYXRlRWRpdGluZ0RpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjcmVhdGVOZXdJdGVtOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydrZW5kb0dyaWRUZW1wbGF0ZUVkaXRpbmcnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBtYXJrQWxsQXNUb3VjaGVkID0gKGNvbnRyb2wpID0+IHtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICBpZiAoY29udHJvbC5oYXNPd25Qcm9wZXJ0eSgnY29udHJvbHMnKSkge1xuICAgICAgICBsZXQgY29udHJvbHMgPSBjb250cm9sLmNvbnRyb2xzO1xuICAgICAgICBmb3IgKGxldCBpbm5lciBpbiBjb250cm9scykge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xzLmhhc093blByb3BlcnR5KGlubmVyKSkge1xuICAgICAgICAgICAgICAgIG1hcmtBbGxBc1RvdWNoZWQoY29udHJvbHNbaW5uZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBlZGl0aW5nIG9wZXJhdGlvbnMgb2YgdGhlIEdyaWQgd2hlbiB1c2luZyB0aGVcbiAqIFJlYWN0aXZlIEZvcm1zIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZWRpdGluZ19kaXJlY3RpdmVzX2dyaWQgJX0jdG9jLXRoZS1yZWFjdGl2ZS1kaXJlY3RpdmUpKS5cbiAqL1xuY2xhc3MgUmVhY3RpdmVFZGl0aW5nRGlyZWN0aXZlIGV4dGVuZHMgUm93RWRpdGluZ0RpcmVjdGl2ZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGdyaWQsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGdyaWQsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5ncmlkID0gZ3JpZDtcbiAgICAgICAgdGhpcy5sb2NhbERhdGFDaGFuZ2VzU2VydmljZSA9IGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlO1xuICAgIH1cbiAgICBjcmVhdGVNb2RlbChhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZvcm1Hcm91cChhcmdzKTtcbiAgICB9XG4gICAgc2F2ZU1vZGVsKHsgZGF0YUl0ZW0sIGZvcm1Hcm91cCwgaXNOZXcgfSkge1xuICAgICAgICBpZiAoIWZvcm1Hcm91cC5kaXJ0eSAmJiAhaXNOZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmFzc2lnblZhbHVlcyhkYXRhSXRlbSwgZm9ybUdyb3VwLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrQWxsQXNUb3VjaGVkKGZvcm1Hcm91cCk7XG4gICAgfVxufVxuUmVhY3RpdmVFZGl0aW5nRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkUmVhY3RpdmVFZGl0aW5nXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuUmVhY3RpdmVFZGl0aW5nRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogR3JpZENvbXBvbmVudCB9LFxuICAgIHsgdHlwZTogTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgfVxuXTtcblJlYWN0aXZlRWRpdGluZ0RpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBjcmVhdGVGb3JtR3JvdXA6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2tlbmRvR3JpZFJlYWN0aXZlRWRpdGluZycsXSB9XVxufTtcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIGVkaXRpbmcgb3BlcmF0aW9ucyBvZiB0aGUgR3JpZCB3aGVuIHVzaW5nIHRoZSBpbi1jZWxsXG4gKiBlZGl0aW5nIHdpdGggUmVhY3RpdmUgRm9ybXMgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBlZGl0aW5nX2RpcmVjdGl2ZXNfZ3JpZCAlfSN0b2MtdGhlLWluY2VsbC1kaXJlY3RpdmUpKS5cbiAqL1xuY2xhc3MgSW5DZWxsRWRpdGluZ0RpcmVjdGl2ZSBleHRlbmRzIEVkaXRpbmdEaXJlY3RpdmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihncmlkLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSkge1xuICAgICAgICBzdXBlcihncmlkLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSk7XG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHRoaXMubG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgPSBsb2NhbERhdGFDaGFuZ2VzU2VydmljZTtcbiAgICB9XG4gICAgLy8gTmVlZCBtaXhpblxuICAgIGNyZWF0ZU1vZGVsKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRm9ybUdyb3VwKGFyZ3MpO1xuICAgIH1cbiAgICBzYXZlTW9kZWwoeyBkYXRhSXRlbSwgZm9ybUdyb3VwLCBpc05ldyB9KSB7XG4gICAgICAgIGlmICghZm9ybUdyb3VwLmRpcnR5ICYmICFpc05ldykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UuYXNzaWduVmFsdWVzKGRhdGFJdGVtLCBmb3JtR3JvdXAudmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICAgIG1hcmtBbGxBc1RvdWNoZWQoZm9ybUdyb3VwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZ3JpZC5jZWxsQ2xpY2suc3Vic2NyaWJlKHRoaXMuY2VsbENsaWNrSGFuZGxlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ncmlkLmNlbGxDbG9zZS5zdWJzY3JpYmUodGhpcy5jZWxsQ2xvc2VIYW5kbGVyLmJpbmQodGhpcykpKTtcbiAgICB9XG4gICAgcmVtb3ZlSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIHN1cGVyLnJlbW92ZUhhbmRsZXIoYXJncyk7XG4gICAgICAgIHRoaXMuZ3JpZC5jYW5jZWxDZWxsKCk7XG4gICAgfVxuICAgIGNlbGxDbGlja0hhbmRsZXIoYXJncykge1xuICAgICAgICBpZiAoIWFyZ3MuaXNFZGl0ZWQgJiYgYXJncy50eXBlICE9PSAnY29udGV4dG1lbnUnKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuZWRpdENlbGwoYXJncy5yb3dJbmRleCwgYXJncy5jb2x1bW5JbmRleCwgdGhpcy5jcmVhdGVGb3JtR3JvdXAoYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNlbGxDbG9zZUhhbmRsZXIoYXJncykge1xuICAgICAgICBjb25zdCB7IGZvcm1Hcm91cCwgZGF0YUl0ZW0gfSA9IGFyZ3M7XG4gICAgICAgIGlmICghZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9ybUdyb3VwLmRpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLmFzc2lnblZhbHVlcyhkYXRhSXRlbSwgZm9ybUdyb3VwLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UudXBkYXRlKGRhdGFJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkluQ2VsbEVkaXRpbmdEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0dyaWRJbkNlbGxFZGl0aW5nXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuSW5DZWxsRWRpdGluZ0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEdyaWRDb21wb25lbnQgfSxcbiAgICB7IHR5cGU6IExvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlIH1cbl07XG5JbkNlbGxFZGl0aW5nRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGNyZWF0ZUZvcm1Hcm91cDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsna2VuZG9HcmlkSW5DZWxsRWRpdGluZycsXSB9XVxufTtcblxuY29uc3QgaGFzR3JvdXBzID0gKGl0ZW1zKSA9PiBpdGVtcyAmJiBpdGVtcy5sZW5ndGggJiYgaXRlbXNbMF0uZmllbGQgJiYgaXRlbXNbMF0uaXRlbXM7XG5jb25zdCBncm91cERlc2NyaXB0b3JzUHJlc2VudCA9IChkZXNjcmlwdG9ycykgPT4gaXNQcmVzZW50KGRlc2NyaXB0b3JzKSAmJiBkZXNjcmlwdG9ycy5sZW5ndGggPiAwO1xuY29uc3QgcHJvY2Vzc0dyb3VwcyA9IChkYXRhLCBzdGF0ZSQkMSkgPT4gcHJvY2VzcyhkYXRhLCBzdGF0ZSQkMSkuZGF0YTtcbmNvbnN0IHJlbW92ZVBhcmVudERlc2NyaXB0b3JzID0gKHBhcmVudHMsIG93bmVyKSA9PiBnID0+IGcuZmllbGQgIT09IG93bmVyLmZpZWxkICYmICFwYXJlbnRzLnNvbWUoeSA9PiB5LmZpZWxkID09PSBnLmZpZWxkKTtcbmNvbnN0IGZpbmRHcm91cCA9IChncm91cEluZGV4LCBncm91cHMpID0+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6IGdyb3VwSW5kZXguc3BsaXQoXCJfXCIpLnJlZHVjZSgoYWNjLCB4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBwYXJzZUludCh4LCAxMCk7XG4gICAgICAgICAgICBpZiAoYWNjLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKGFjYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5pdGVtc1tpZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkoYWNjKSA/IGFjY1tpZHhdIDogYWNjO1xuICAgICAgICB9LCBncm91cHMpLFxuICAgICAgICBwYXJlbnRzXG4gICAgfTtcbn07XG5jb25zdCBmaW5kQ2hpbGRyZW4gPSAoZGF0YSwgcGFyZW50cykgPT4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSBwYXJlbnRzLm1hcChwID0+ICh7IGZpZWxkOiBwLmZpZWxkLCBvcGVyYXRvcjogXCJlcVwiLCB2YWx1ZTogcC52YWx1ZSB9KSk7XG4gICAgcmV0dXJuIGZpbHRlckJ5KGRhdGEsIHtcbiAgICAgICAgZmlsdGVyczogZmlsdGVycyxcbiAgICAgICAgbG9naWM6IFwiYW5kXCJcbiAgICB9KTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY291bnQgPSAoZ3JvdXBzLCBpbmNsdWRlRm9vdGVycyA9IGZhbHNlKSA9PiAoZ3JvdXBzLnJlZHVjZSgoYWNjLCBncm91cCkgPT4ge1xuICAgIGlmICghZ3JvdXAuc2tpcEhlYWRlcikge1xuICAgICAgICBhY2MrKztcbiAgICB9XG4gICAgaWYgKGdyb3VwLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY291bnQoZ3JvdXAuaXRlbXMsIGluY2x1ZGVGb290ZXJzKTtcbiAgICAgICAgaWYgKGluY2x1ZGVGb290ZXJzICYmIGNoaWxkcmVuICYmICFncm91cC5oaWRlRm9vdGVyKSB7XG4gICAgICAgICAgICBhY2MrKztcbiAgICAgICAgfVxuICAgICAgICBhY2MgKz0gY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59LCAwKSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOmFsaWduXG4pO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHNsaWNlID0gKGdyb3Vwcywgc2tpcCwgdGFrZSQkMSwgaW5jbHVkZUZvb3RlcnMgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghaXNQcmVzZW50KHRha2UkJDEpKSB7XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGlkeCA9IDAsIGxlbmd0aCA9IGdyb3Vwcy5sZW5ndGg7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgaWYgKHRha2UkJDEgPD0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaWR4XTtcbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IGdyb3VwLml0ZW1zO1xuICAgICAgICBsZXQgaXRlbUNvdW50ID0gY291bnQoZ3JvdXBJdGVtcywgaW5jbHVkZUZvb3RlcnMpO1xuICAgICAgICBpZiAoaW5jbHVkZUZvb3RlcnMgJiYgZ3JvdXBJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW1Db3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNraXBIZWFkZXIgPSBza2lwID4gMDtcbiAgICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgICAgIHNraXAtLTtcbiAgICAgICAgICAgIGlmIChpdGVtQ291bnQgJiYgc2tpcCA+PSBpdGVtQ291bnQpIHtcbiAgICAgICAgICAgICAgICBza2lwIC09IGl0ZW1Db3VudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBIZWFkZXIgfHwgaXRlbUNvdW50KSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGhpZGVGb290ZXIgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFza2lwSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdGFrZSQkMS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRha2UkJDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JvdXBzKGdyb3VwSXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xpY2UoZ3JvdXBJdGVtcywgc2tpcCwgdGFrZSQkMSwgaW5jbHVkZUZvb3RlcnMpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKC4uLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgdGFrZSQkMSAtPSBjb3VudChjaGlsZHJlbiwgaW5jbHVkZUZvb3RlcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCguLi5ncm91cEl0ZW1zLnNsaWNlKHNraXAsIE1hdGgubWluKHNraXAgKyB0YWtlJCQxLCBncm91cEl0ZW1zLmxlbmd0aCkpKTtcbiAgICAgICAgICAgICAgICAgICAgdGFrZSQkMSAtPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YWtlJCQxICYmIGluY2x1ZGVGb290ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpZGVGb290ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGFrZSQkMS0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGVzOiBncm91cC5hZ2dyZWdhdGVzLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBncm91cC5maWVsZCxcbiAgICAgICAgICAgICAgICBoaWRlRm9vdGVyLFxuICAgICAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgICAgICAgIG9mZnNldDogaWR4LFxuICAgICAgICAgICAgICAgIHNraXBIZWFkZXIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwLnZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IHNraXBwZWRIZWFkZXJzID0gKGdyb3VwSXRlbSkgPT4ge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgd2hpbGUgKGdyb3VwSXRlbSkge1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLnNraXBIZWFkZXIpIHtcbiAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBJdGVtID0gZ3JvdXBJdGVtLml0ZW1zICYmIGdyb3VwSXRlbS5pdGVtc1swXSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG59O1xuLyoqXG4gKiBBIGRpcmVjdGl2ZSB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIGluLW1lbW9yeSBoYW5kbGluZyBvZiBncm91cGluZyB3aXRoIHZpcnR1YWwgc2Nyb2xsaW5nLlxuICovXG5jbGFzcyBHcm91cEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoZ3JpZCwgY2hhbmdlRGV0ZWN0b3IsIGxvY2FsRGF0YUNoYW5nZXNTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGdyaWQsIGNoYW5nZURldGVjdG9yLCBsb2NhbERhdGFDaGFuZ2VzU2VydmljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBhcnJheSBvZiBkYXRhIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwb3B1bGF0ZSB0aGUgR3JpZC5cbiAgICAgKi9cbiAgICBzZXQga2VuZG9HcmlkR3JvdXBCaW5kaW5nKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncmlkLnJlc2V0R3JvdXBzU3RhdGUoKTtcbiAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgZGF0YSh2YWx1ZSkge1xuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHZhbHVlIHx8IFtdO1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZGVzY3JpcHRvcnMgYnkgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzb3J0ZWQuXG4gICAgICovXG4gICAgc2V0IHNvcnQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2xlYXIgPSB0aGlzLnN0YXRlLnNvcnQgIT09IHZhbHVlO1xuICAgICAgICB0aGlzLmdyaWQuc29ydCA9IHRoaXMuc3RhdGUuc29ydCA9IHZhbHVlO1xuICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXNldEdyb3Vwc1N0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZGVzY3JpcHRvciBieSB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIGZpbHRlcmVkLlxuICAgICAqL1xuICAgIHNldCBmaWx0ZXIodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2xlYXIgPSBkaWZmRmlsdGVycyh0aGlzLnN0YXRlLmZpbHRlciwgdmFsdWUpO1xuICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlsdGVyID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyID0gY2xvbmVGaWx0ZXJzKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXNldEdyb3Vwc1N0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgZGVzY3JpcHRvcnMgYnkgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBncm91cGVkLlxuICAgICAqL1xuICAgIHNldCBncm91cCh2YWx1ZSkge1xuICAgICAgICAvLyBkb24ndCBjbGVhciBpZiBubyBncm91cHMgYXJlIHByZXNlbnQgaW4gcHJldmlvdXMgYW5kIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgY29uc3QgZ3JvdXBzUHJlc2VudCA9IGdyb3VwRGVzY3JpcHRvcnNQcmVzZW50KHRoaXMuc3RhdGUuZ3JvdXApIHx8IGdyb3VwRGVzY3JpcHRvcnNQcmVzZW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgY2xlYXIgPSB0aGlzLnN0YXRlLmdyb3VwICE9PSB2YWx1ZSAmJiBncm91cHNQcmVzZW50O1xuICAgICAgICB0aGlzLmdyaWQuZ3JvdXAgPSB0aGlzLnN0YXRlLmdyb3VwID0gdmFsdWU7XG4gICAgICAgIGlmIChjbGVhcikge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5ncmlkLnJlc2V0R3JvdXBzU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmdyaWQuZ3JvdXBFeHBhbmQuc3Vic2NyaWJlKHRoaXMuZ3JvdXBFeHBhbmQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZ3JpZC5ncm91cENvbGxhcHNlLnN1YnNjcmliZSh0aGlzLmdyb3VwQ29sbGFwc2UuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGdyb3VwRXhwYW5kKHsgZ3JvdXBJbmRleCB9KSB7XG4gICAgICAgIHRoaXMuZ3JpZC5leHBhbmRHcm91cENoaWxkcmVuKGdyb3VwSW5kZXgpO1xuICAgICAgICBjb25zdCB7IGdyb3VwLCBwYXJlbnRzIH0gPSBmaW5kR3JvdXAoZ3JvdXBJbmRleCwgdGhpcy5ncm91cHMpO1xuICAgICAgICBpZiAoIWdyb3VwLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSB0aGlzLnN0YXRlLmdyb3VwLmZpbHRlcihyZW1vdmVQYXJlbnREZXNjcmlwdG9ycyhwYXJlbnRzLCBncm91cCkpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBmaW5kQ2hpbGRyZW4odGhpcy5vcmlnaW5hbERhdGEsIHBhcmVudHMuY29uY2F0KGdyb3VwKSk7XG4gICAgICAgICAgICBncm91cC5pdGVtcyA9IHByb2Nlc3NHcm91cHMoY2hpbGRyZW4sIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHRoaXMuc3RhdGUuZmlsdGVyLFxuICAgICAgICAgICAgICAgIGdyb3VwOiBkZXNjcmlwdG9ycyxcbiAgICAgICAgICAgICAgICBzb3J0OiB0aGlzLnN0YXRlLnNvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC5kYXRhID0gdGhpcy5kYXRhUmVzdWx0KHRoaXMuc3RhdGUuc2tpcCwgdGhpcy5zdGF0ZS50YWtlKTtcbiAgICB9XG4gICAgZ3JvdXBDb2xsYXBzZSh7IGdyb3VwSW5kZXggfSkge1xuICAgICAgICBjb25zdCB7IGdyb3VwIH0gPSBmaW5kR3JvdXAoZ3JvdXBJbmRleCwgdGhpcy5ncm91cHMpO1xuICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwLml0ZW1zID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkLmRhdGEgPSB0aGlzLmRhdGFSZXN1bHQodGhpcy5zdGF0ZS5za2lwLCB0aGlzLnN0YXRlLnRha2UpO1xuICAgIH1cbiAgICBwcm9jZXNzKHN0YXRlJCQxKSB7XG4gICAgICAgIGlmIChzdGF0ZSQkMS5ncm91cCAmJiBzdGF0ZSQkMS5ncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMucHJvY2Vzc0dyb3VwcyhzdGF0ZSQkMSk7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc2tpcCAtPSBza2lwcGVkSGVhZGVycyhncm91cHMuZGF0YVswXSk7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzKHN0YXRlJCQxKTtcbiAgICB9XG4gICAgcHJvY2Vzc0dyb3VwcyhzdGF0ZSQkMSkge1xuICAgICAgICBpZiAoIXRoaXMuZ3JvdXBzIHx8ICF0aGlzLmdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gcHJvY2Vzc0dyb3Vwcyh0aGlzLm9yaWdpbmFsRGF0YSwge1xuICAgICAgICAgICAgICAgIGZpbHRlcjogc3RhdGUkJDEuZmlsdGVyLFxuICAgICAgICAgICAgICAgIGdyb3VwOiBzdGF0ZSQkMS5ncm91cCxcbiAgICAgICAgICAgICAgICBzb3J0OiBzdGF0ZSQkMS5zb3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUmVzdWx0KHN0YXRlJCQxLnNraXAsIHN0YXRlJCQxLnRha2UpO1xuICAgIH1cbiAgICBkYXRhUmVzdWx0KHNraXAsIHRha2UkJDEpIHtcbiAgICAgICAgY29uc3QgaW5jbHVkZUZvb3RlcnMgPSB0aGlzLmdyaWQuc2hvd0dyb3VwRm9vdGVycztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHNsaWNlKHRoaXMuZ3JvdXBzLCBza2lwLCB0YWtlJCQxLCBpbmNsdWRlRm9vdGVycyksXG4gICAgICAgICAgICB0b3RhbDogY291bnQodGhpcy5ncm91cHMsIGluY2x1ZGVGb290ZXJzKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBseVN0YXRlKHsgc2tpcCwgdGFrZTogdGFrZSQkMSwgc29ydCwgZ3JvdXAsIGZpbHRlcjogZmlsdGVyJCQxIH0pIHtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5zdGF0ZS50YWtlID0gdGFrZSQkMTtcbiAgICAgICAgLy8gdGhpcy5wYWdlU2l6ZSA9IHRha2U7IC8vIGRvIG5lZWQgdG8gdXBkYXRlIHRha2UgYXMgdGhlIHByb2Nlc3Mgd2l0aCBzbGljZSBjb3JyZWN0bHlcbiAgICAgICAgdGhpcy5zb3J0ID0gc29ydDtcbiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwO1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlciQkMTtcbiAgICB9XG59XG5Hcm91cEJpbmRpbmdEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3sgc2VsZWN0b3I6ICdba2VuZG9HcmlkR3JvdXBCaW5kaW5nXScgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Hcm91cEJpbmRpbmdEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBHcmlkQ29tcG9uZW50IH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UgfVxuXTtcbkdyb3VwQmluZGluZ0RpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBrZW5kb0dyaWRHcm91cEJpbmRpbmc6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbXCJrZW5kb0dyaWRHcm91cEJpbmRpbmdcIixdIH1dLFxuICAgIHNvcnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZ3JvdXA6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG5jb25zdCBleHBvcnRlZE1vZHVsZXMkNCA9IFtcbiAgICBHcmlkQ29tcG9uZW50LFxuICAgIFRvb2xiYXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBUb29sYmFyQ29tcG9uZW50LFxuICAgIERhdGFCaW5kaW5nRGlyZWN0aXZlLFxuICAgIFNlbGVjdGlvbkRpcmVjdGl2ZSxcbiAgICBDdXN0b21NZXNzYWdlc0NvbXBvbmVudCxcbiAgICBHcm91cEJpbmRpbmdEaXJlY3RpdmUsXG4gICAgVGVtcGxhdGVFZGl0aW5nRGlyZWN0aXZlLFxuICAgIFJlYWN0aXZlRWRpdGluZ0RpcmVjdGl2ZSxcbiAgICBJbkNlbGxFZGl0aW5nRGlyZWN0aXZlLFxuICAgIEV4cGFuZERldGFpbHNEaXJlY3RpdmUsXG4gICAgLi4uR3JvdXBNb2R1bGUuZXhwb3J0cygpLFxuICAgIC4uLlNoYXJlZE1vZHVsZS5leHBvcnRzKCksXG4gICAgLi4uQm9keU1vZHVsZS5leHBvcnRzKCksXG4gICAgLi4uSGVhZGVyTW9kdWxlLmV4cG9ydHMoKSxcbiAgICAuLi5Gb290ZXJNb2R1bGUuZXhwb3J0cygpLFxuICAgIC4uLlBhZ2VyTW9kdWxlLmV4cG9ydHMoKSxcbiAgICAuLi5Sb3dGaWx0ZXJNb2R1bGUuZXhwb3J0cygpLFxuICAgIC4uLkZpbHRlck1lbnVNb2R1bGUuZXhwb3J0cygpLFxuICAgIC4uLkNvbHVtbk1lbnVNb2R1bGUuZXhwb3J0cygpXG5dO1xuY29uc3QgZGVjbGFyYXRpb25zID0gW1xuICAgIEdyaWRDb21wb25lbnQsXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBUb29sYmFyQ29tcG9uZW50LFxuICAgIExvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLFxuICAgIEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LFxuICAgIERhdGFCaW5kaW5nRGlyZWN0aXZlLFxuICAgIFRvb2xiYXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBTZWxlY3Rpb25EaXJlY3RpdmUsXG4gICAgVGVtcGxhdGVFZGl0aW5nRGlyZWN0aXZlLFxuICAgIFJlYWN0aXZlRWRpdGluZ0RpcmVjdGl2ZSxcbiAgICBJbkNlbGxFZGl0aW5nRGlyZWN0aXZlLFxuICAgIEV4cGFuZERldGFpbHNEaXJlY3RpdmUsXG4gICAgR3JvdXBCaW5kaW5nRGlyZWN0aXZlLFxuICAgIEdyaWRNYXJxdWVlRGlyZWN0aXZlXG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgR3JpZCBjb21wb25lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgR3JpZCBtb2R1bGVcbiAqIGltcG9ydCB7IEdyaWRNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcbiAqXG4gKiAvLyBUaGUgYnJvd3NlciBwbGF0Zm9ybSB3aXRoIGEgY29tcGlsZXJcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICpcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogLy8gSW1wb3J0IHRoZSBhcHAgY29tcG9uZW50XG4gKiBpbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2FwcC5jb21wb25lbnQnO1xuICpcbiAqIC8vIERlZmluZSB0aGUgYXBwIG1vZHVsZVxuICogX0BOZ01vZHVsZSh7XG4gKiAgICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSwgLy8gZGVjbGFyZSBhcHAgY29tcG9uZW50XG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgR3JpZE1vZHVsZV0sIC8vIGltcG9ydCBHcmlkIG1vZHVsZVxuICogICAgIGJvb3RzdHJhcDogICAgW0FwcENvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKlxuICogLy8gQ29tcGlsZSBhbmQgbGF1bmNoIHRoZSBtb2R1bGVcbiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgR3JpZE1vZHVsZSB7XG59XG5HcmlkTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtkZWNsYXJhdGlvbnNdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkNF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIEdyb3VwTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBTaGFyZWRNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIEJvZHlNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIEhlYWRlck1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgRm9vdGVyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBQYWdlck1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgUm93RmlsdGVyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBGaWx0ZXJNZW51TW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBSZXNpemVTZW5zb3JNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbk1lbnVNb2R1bGVcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbmNsYXNzIFBERk1hcmdpbkNvbXBvbmVudCQxIGV4dGVuZHMgUERGTWFyZ2luQ29tcG9uZW50IHtcbn1cblBERk1hcmdpbkNvbXBvbmVudCQxLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLXBkZi1tYXJnaW4nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFBERiBwYWdlIHRlbXBsYXRlIG9mIHRoZSBHcmlkIHRoYXQgaGVscHMgdG8gY3VzdG9taXplIHRoZSBQREYgcGFnZXMuIFRvIGRlZmluZSBhIHBhZ2UgdGVtcGxhdGUsXG4gKiBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWcgd2l0aCB0aGUgYGtlbmRvR3JpZFBERlRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIGA8a2VuZG8tZ3JpZC1wZGY+YC5cbiAqXG4gKiBUaGUgdGVtcGxhdGUgY29udGV4dCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZpZWxkczpcbiAqIC0gYHBhZ2VOdW1iZXJgJm1kYXNoO0RlZmluZXMgUERGIHBhZ2UgbnVtYmVyLlxuICogLSBgdG90YWxQYWdlc2AmbWRhc2g7RGVmaW5lcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBERiBwYWdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICpcbiAqIF9AQ29tcG9uZW50KHtcbiAqICAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICAgPGtlbmRvLWdyaWQgW2RhdGFdPVwiZ3JpZERhdGFcIj5cbiAqICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGU+XG4gKiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRQREZDb21tYW5kIGljb249XCJmaWxlLXBkZlwiPkV4cG9ydCB0byBQREY8L2J1dHRvbj5cbiAqICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJQcm9kdWN0TmFtZVwiPlxuICogICAgICAgICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cbiAqICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gZmllbGQ9XCJVbml0UHJpY2VcIj5cbiAqICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XG4gKiAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1wZGYgZmlsZU5hbWU9XCJQcm9kdWN0cy5wZGZcIiBwYXBlclNpemU9XCJBNFwiIFttYXJnaW5dPVwieyB0b3A6ICcxY20nLCBsZWZ0OiAnMWNtJywgcmlnaHQ6ICcxY20nLCBib3R0b206ICcxY20nIH1cIj5cbiAqICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkUERGVGVtcGxhdGUgbGV0LXBhZ2VOdW09XCJwYWdlTnVtXCIgbGV0LXRvdGFsUGFnZXM9XCJ0b3RhbFBhZ2VzXCI+XG4gKiAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiA1cHg7IGxlZnQ6IDVweDtcIj5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2Uge3sgcGFnZU51bSB9fSBvZiB7eyB0b3RhbFBhZ2VzIH19XG4gKiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICogICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtcGRmPlxuICogICAgICAgICA8L2tlbmRvLWdyaWQ+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyBncmlkRGF0YSA9IFt7XG4gKiAgICAgICAgIFwiUHJvZHVjdElEXCI6IDEsXG4gKiAgICAgICAgIFwiUHJvZHVjdE5hbWVcIjogXCJDaGFpXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE4LjAwMDBcbiAqICAgICAgIH0sIHtcbiAqICAgICAgICAgXCJQcm9kdWN0SURcIjogMixcbiAqICAgICAgICAgXCJQcm9kdWN0TmFtZVwiOiBcIkNoYW5nXCIsXG4gKiAgICAgICAgIFwiVW5pdFByaWNlXCI6IDE5LjAwMDBcbiAqICAgICAgIH1cbiAqICAgICBdO1xuICogfVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBQREZUZW1wbGF0ZURpcmVjdGl2ZSQxIGV4dGVuZHMgUERGVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHN1cGVyKHRlbXBsYXRlUmVmKTtcbiAgICB9XG59XG5QREZUZW1wbGF0ZURpcmVjdGl2ZSQxLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkUERGVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5QREZUZW1wbGF0ZURpcmVjdGl2ZSQxLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBIRUFERVJfQ0xBU1MgPSAnay1ncmlkLWhlYWRlcic7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgRk9PVEVSX0NMQVNTID0gJ2stZ3JpZC1mb290ZXInO1xuY29uc3QgR1JJRF9MSVNUID0gJ0tFTkRPLUdSSUQtTElTVCc7XG5jb25zdCBUQUJMRSA9ICdUQUJMRSc7XG5jb25zdCBtYXRjaGVzTGlzdCA9IG1hdGNoZXNOb2RlTmFtZShHUklEX0xJU1QpO1xuY29uc3QgbWF0Y2hlc1RhYmxlID0gbWF0Y2hlc05vZGVOYW1lKFRBQkxFKTtcbmNvbnN0IHN1ZmZpeCA9IChsb2NrZWQpID0+IGxvY2tlZCA/ICdsb2NrZWQnIDogJ3dyYXAnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIEdyaWRRdWVyeSB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmxpc3QgPSBmaW5kRWxlbWVudChlbGVtZW50LCBtYXRjaGVzTGlzdCk7XG4gICAgfVxuICAgIGNvbnRlbnQobG9ja2VkKSB7XG4gICAgICAgIHJldHVybiBmaW5kRWxlbWVudCh0aGlzLmxpc3QsIG1hdGNoZXNDbGFzc2VzKGBrLWdyaWQtY29udGVudCR7bG9ja2VkID8gJy1sb2NrZWQnIDogJyd9YCkpO1xuICAgIH1cbiAgICBoZWFkZXIobG9ja2VkKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyV3JhcCA9IHRoaXMuaGVhZGVyV3JhcCB8fCBmaW5kRWxlbWVudCh0aGlzLmVsZW1lbnQsIG1hdGNoZXNDbGFzc2VzKEhFQURFUl9DTEFTUykpO1xuICAgICAgICByZXR1cm4gZmluZEVsZW1lbnQodGhpcy5oZWFkZXJXcmFwLCBtYXRjaGVzQ2xhc3NlcyhgJHtIRUFERVJfQ0xBU1N9LSR7c3VmZml4KGxvY2tlZCl9YCkpO1xuICAgIH1cbiAgICBmb290ZXIobG9ja2VkKSB7XG4gICAgICAgIHRoaXMuZm9vdGVyV3JhcCA9IHRoaXMuZm9vdGVyV3JhcCB8fCBmaW5kRWxlbWVudCh0aGlzLmVsZW1lbnQsIG1hdGNoZXNDbGFzc2VzKEZPT1RFUl9DTEFTUykpO1xuICAgICAgICByZXR1cm4gZmluZEVsZW1lbnQodGhpcy5mb290ZXJXcmFwLCBtYXRjaGVzQ2xhc3NlcyhgJHtGT09URVJfQ0xBU1N9LSR7c3VmZml4KGxvY2tlZCl9YCkpO1xuICAgIH1cbiAgICB0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRFbGVtZW50KHRoaXMuZWxlbWVudCwgbWF0Y2hlc1RhYmxlKTtcbiAgICB9XG59XG5cbmNvbnN0IEZJUlNUX0NMQVNTID0gJ2stZmlyc3QnO1xuY29uc3QgSU5QVVRTID0gWydpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnLCAnb3B0aW9uJ107XG4vKiogQGhpZGRlbiAqL1xuY29uc3QgY2xvbmVOb2RlID0gKG5vZGUpID0+IHtcbiAgICBjb25zdCBjbG9uZSA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICBpZiAobm9kZS5fa2VuZG9FeHBvcnRWaXN1YWwpIHtcbiAgICAgICAgY2xvbmUuX2tlbmRvRXhwb3J0VmlzdWFsID0gbm9kZS5fa2VuZG9FeHBvcnRWaXN1YWw7XG4gICAgfVxuICAgIGlmIChJTlBVVFMuaW5kZXhPZihTdHJpbmcobm9kZS5ub2RlTmFtZSkudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgY2xvbmUudmFsdWUgPSBub2RlLnZhbHVlO1xuICAgICAgICBjbG9uZS5jaGVja2VkID0gbm9kZS5jaGVja2VkO1xuICAgICAgICBjbG9uZS5zZWxlY3RlZCA9IG5vZGUuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIGxldCBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgY2xvbmUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKGNoaWxkKSk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbn07XG5jb25zdCBhcHBlbmROb2RlcyA9IChlbGVtZW50LCBub2RlcykgPT4ge1xuICAgIGNvbnN0IGxlbmd0aCA9IG5vZGVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKG5vZGVzW2lkeF0pKTtcbiAgICB9XG59O1xuY29uc3Qgd3JhcFRhYmxlID0gKHRhYmxlKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gJ2std2lkZ2V0IGstZ3JpZCc7XG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gICAgcmV0dXJuIHdyYXBwZXI7XG59O1xuY29uc3QgY3JlYXRlVGFibGVFbGVtZW50ID0gKHNvdXJjZXMpID0+IHtcbiAgICBjb25zdCBzb3VyY2VDb3VudCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBjbG9uZU5vZGUoc291cmNlc1swXSk7XG4gICAgY29uc3Qgcm93c0NvdW50ID0gZWxlbWVudC5yb3dzLmxlbmd0aDtcbiAgICBpZiAoc291cmNlQ291bnQgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IHJvd0lkeCA9IDA7IHJvd0lkeCA8IHJvd3NDb3VudDsgcm93SWR4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZUlkeCA9IDE7IHNvdXJjZUlkeCA8IHNvdXJjZUNvdW50OyBzb3VyY2VJZHgrKykge1xuICAgICAgICAgICAgICAgIGFwcGVuZE5vZGVzKGVsZW1lbnQucm93c1tyb3dJZHhdLCBzb3VyY2VzW3NvdXJjZUlkeF0ucm93c1tyb3dJZHhdLmNlbGxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbn07XG5jb25zdCBzZXRGaXJzdENlbGxDbGFzcyA9IChoZWFkZXIsIGhlYWRlcnMpID0+IHtcbiAgICBpZiAoaGVhZGVycy5sZW5ndGggPiAxICYmIGhlYWRlci5yb3dzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgaGVhZGVyLnJvd3MubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RDZWxsSW5kZXggPSBoZWFkZXJzWzBdLnJvd3NbaWR4XS5jZWxscy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gaGVhZGVyLnJvd3NbaWR4XS5jZWxsc1tmaXJzdENlbGxJbmRleF07XG4gICAgICAgICAgICBpZiAoU3RyaW5nKGNlbGwuY2xhc3NOYW1lKS5pbmRleE9mKEZJUlNUX0NMQVNTKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTmFtZSArPSBgICR7RklSU1RfQ0xBU1N9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBjcmVhdGVUYWJsZSA9IChjb2xHcm91cHMsIGhlYWRlcnMsIGJvZGllcywgZm9vdGVycykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcbiAgICBjb25zdCBjb2xHcm91cCA9IGNvbEdyb3Vwc1swXS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgY29sR3JvdXBzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgYXBwZW5kTm9kZXMoY29sR3JvdXAsIGNvbEdyb3Vwc1tpZHhdLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvbCcpKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gY3JlYXRlVGFibGVFbGVtZW50KGhlYWRlcnMpO1xuICAgIGNvbnN0IGJvZHkgPSBjcmVhdGVUYWJsZUVsZW1lbnQoYm9kaWVzKTtcbiAgICBoZWFkZXIuY2xhc3NOYW1lID0gSEVBREVSX0NMQVNTO1xuICAgIHNldEZpcnN0Q2VsbENsYXNzKGhlYWRlciwgaGVhZGVycyk7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoY29sR3JvdXApO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoYm9keSk7XG4gICAgaWYgKGZvb3RlcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IGNyZWF0ZVRhYmxlRWxlbWVudChmb290ZXJzKTtcbiAgICAgICAgZm9vdGVyLmNsYXNzTmFtZSA9IEZPT1RFUl9DTEFTUztcbiAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoZm9vdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBUYWJsZSh0YWJsZSk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGV4cG9ydEVsZW1lbnQgPSAod3JhcHBlcikgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IEdyaWRRdWVyeSh3cmFwcGVyKTtcbiAgICBjb25zdCBjb250ZW50ID0gcXVlcnkuY29udGVudCgpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY29sR3JvdXBzID0gW2NvbnRlbnQucXVlcnlTZWxlY3RvcignY29sZ3JvdXAnKV07XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBbcXVlcnkuaGVhZGVyKCkucXVlcnlTZWxlY3RvcigndGhlYWQnKV07XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JyldO1xuICAgICAgICBjb25zdCBmb290ZXIgPSBxdWVyeS5mb290ZXIoKTtcbiAgICAgICAgY29uc3QgZm9vdGVycyA9IFtdO1xuICAgICAgICBpZiAoZm9vdGVyKSB7XG4gICAgICAgICAgICBmb290ZXJzLnB1c2goZm9vdGVyLnF1ZXJ5U2VsZWN0b3IoJ3Rmb290JykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY2tlZENvbnRlbnQgPSBxdWVyeS5jb250ZW50KHRydWUpO1xuICAgICAgICBpZiAobG9ja2VkQ29udGVudCkge1xuICAgICAgICAgICAgY29sR3JvdXBzLnVuc2hpZnQobG9ja2VkQ29udGVudC5xdWVyeVNlbGVjdG9yKCdjb2xncm91cCcpKTtcbiAgICAgICAgICAgIGhlYWRlcnMudW5zaGlmdChxdWVyeS5oZWFkZXIodHJ1ZSkucXVlcnlTZWxlY3RvcigndGhlYWQnKSk7XG4gICAgICAgICAgICBib2RpZXMudW5zaGlmdChsb2NrZWRDb250ZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykpO1xuICAgICAgICAgICAgaWYgKGZvb3Rlcikge1xuICAgICAgICAgICAgICAgIGZvb3RlcnMudW5zaGlmdChxdWVyeS5mb290ZXIodHJ1ZSkucXVlcnlTZWxlY3RvcigndGZvb3QnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlVGFibGUoY29sR3JvdXBzLCBoZWFkZXJzLCBib2RpZXMsIGZvb3RlcnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gd3JhcFRhYmxlKHF1ZXJ5LnRhYmxlKCkuY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGNyZWF0ZUVsZW1lbnQkMSA9ICh0YWdOYW1lLCBjbGFzc05hbWUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbn07XG5jb25zdCBjcmVhdGVEaXYgPSAoY2xhc3NOYW1lKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQkMSgnZGl2JywgY2xhc3NOYW1lKTtcbn07XG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIHNldHRpbmdzIGZvciB0aGUgZXhwb3J0IG9mIEdyaWQgaW4gUERGIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcGRmZXhwb3J0X2dyaWQgJX0pKS5cbiAqL1xuY2xhc3MgUERGQ29tcG9uZW50IGV4dGVuZHMgUERGRXhwb3J0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwZGZTZXJ2aWNlLCBzdXNwZW5kU2VydmljZSwgbmdab25lLCBlbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2UgPSBwZGZTZXJ2aWNlO1xuICAgICAgICB0aGlzLnN1c3BlbmRTZXJ2aWNlID0gc3VzcGVuZFNlcnZpY2U7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBuZXcgUXVlcnlMaXN0KCk7XG4gICAgICAgIHRoaXMuc2F2ZVN1YnNjcmlwdGlvbiA9IHBkZlNlcnZpY2Uuc2F2ZVBERi5zdWJzY3JpYmUodGhpcy5zYXZlUERGLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyYXdTdWJzY3JpcHRpb24gPSBwZGZTZXJ2aWNlLmRyYXdQREYuc3Vic2NyaWJlKHRoaXMuZHJhd1BERi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5yZXNldCA9IHRoaXMucmVzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kcmF3ID0gdGhpcy5kcmF3LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNhdmVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5kcmF3U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gICAgc2F2ZVBERihjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQREYoY29tcG9uZW50LCB0aGlzLmRyYXcpO1xuICAgIH1cbiAgICBkcmF3UERGKHsgY29tcG9uZW50LCBwcm9taXNlIH0pIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQREYoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUV4cG9ydEdyb3VwKHByb21pc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlUERGKGNvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcGFnZVNpemUgPSBjb21wb25lbnQucGFnZVNpemU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gY29tcG9uZW50LnZpZXcudG90YWw7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMudG9BcnJheSgpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb2x1bW5zID0gY29tcG9uZW50LmNvbHVtbnMudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICB0aGlzLnN1c3BlbmRTZXJ2aWNlLnNjcm9sbCA9IHRydWU7XG4gICAgICAgIHRoaXMucGRmU2VydmljZS5leHBvcnRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRQcm9ncmVzcygpO1xuICAgICAgICB0aGlzLnJlbmRlckFsbFBhZ2VzID0gdGhpcy5hbGxQYWdlcyAmJiBwYWdlU2l6ZSA8IHRvdGFsO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJBbGxQYWdlcykge1xuICAgICAgICAgICAgdGhpcy5za2lwID0gY29tcG9uZW50LnNraXA7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVBhZ2UoMCwgdG90YWwsIGNhbGxiYWNrLCBjb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5zLmxlbmd0aCB8fCBjb21wb25lbnQudmlydHVhbENvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlQ29sdW1ucyhjb2x1bW5zLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRQcm9ncmVzcygpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudC53cmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5wcm9ncmVzcyA9IGNyZWF0ZURpdignay1sb2FkaW5nLXBkZi1tYXNrJyk7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBjbG9uZU5vZGUod3JhcHBlckVsZW1lbnQpO1xuICAgICAgICBwcm9ncmVzcy5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgICAgICAgcHJvZ3Jlc3MuYXBwZW5kQ2hpbGQoY3JlYXRlRGl2KCdrLWxvYWRpbmctY29sb3InKSk7XG4gICAgICAgIHByb2dyZXNzLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQkMSgnc3BhbicsICdrLWktbG9hZGluZyBrLWljb24nKSk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSB3cmFwcGVyRWxlbWVudC5zdHlsZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3JpZ2luYWxPdmVyZmxvdyA9IHdyYXBwZXJFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB3cmFwcGVyRWxlbWVudC5vZmZzZXRIZWlnaHQgKyAncHgnO1xuICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICB3cmFwcGVyRWxlbWVudC5hcHBlbmRDaGlsZChwcm9ncmVzcyk7XG4gICAgICAgIHRoaXMuYXBwbHlTY3JvbGwob3ZlcmxheSk7XG4gICAgfVxuICAgIGFwcGx5U2Nyb2xsKG92ZXJsYXkpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgR3JpZFF1ZXJ5KHRoaXMuY29tcG9uZW50LndyYXBwZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBxdWVyeS5jb250ZW50KCk7XG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5UXVlcnkgPSBuZXcgR3JpZFF1ZXJ5KG92ZXJsYXkpO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRlbnQgPSBvdmVybGF5UXVlcnkuY29udGVudCgpO1xuICAgICAgICAgICAgb3ZlcmxheUNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICBvdmVybGF5Q29udGVudC5zY3JvbGxMZWZ0ID0gY29udGVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgb3ZlcmxheVF1ZXJ5LmhlYWRlcigpLnNjcm9sbExlZnQgPSBxdWVyeS5oZWFkZXIoKS5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgY29uc3QgZm9vdGVyID0gcXVlcnkuZm9vdGVyKCk7XG4gICAgICAgICAgICBpZiAoZm9vdGVyKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVF1ZXJ5LmZvb3RlcigpLnNjcm9sbExlZnQgPSBmb290ZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvY2tlZENvbnRlbnQgPSBxdWVyeS5jb250ZW50KHRydWUpO1xuICAgICAgICAgICAgaWYgKGxvY2tlZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVybGF5TG9ja2VkQ29udGVudCA9IG92ZXJsYXlRdWVyeS5jb250ZW50KHRydWUpO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlMb2NrZWRDb250ZW50LnNjcm9sbFRvcCA9IGxvY2tlZENvbnRlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlMb2NrZWRDb250ZW50LnNjcm9sbExlZnQgPSBsb2NrZWRDb250ZW50LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVFeHBvcnRFbGVtZW50KChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoZWxlbWVudCwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjcmVhdGVFeHBvcnRHcm91cChwcm9taXNlKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRXhwb3J0RWxlbWVudCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBvcnRFbGVtZW50KGVsZW1lbnQpLnRoZW4oZ3JvdXAgPT4gcHJvbWlzZS5yZXNvbHZlKGdyb3VwKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjcmVhdGVFeHBvcnRFbGVtZW50KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyID0gY3JlYXRlRGl2KCdrLWdyaWQtcGRmLWV4cG9ydC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXhwb3J0RWxlbWVudCh0aGlzLmNvbXBvbmVudC53cmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICAgICAgY2FsbGJhY2soZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkcmF3T3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHN1cGVyLmRyYXdPcHRpb25zKCk7XG4gICAgICAgIG9wdGlvbnMuX2Rlc3RydWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIHN1cGVyLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLmV4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1ucyA9IHRoaXMub3JpZ2luYWxDb2x1bW5zO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxDb2x1bW5zO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyQWxsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBhZ2UodGhpcy5za2lwLCB0aGlzLnBhZ2VTaXplLCB0aGlzLnJlc2V0LCBvcmlnaW5hbENvbHVtbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxDb2x1bW5zIHx8IHRoaXMuY29tcG9uZW50LnZpcnR1YWxDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb2x1bW5zKG9yaWdpbmFsQ29sdW1ucywgdGhpcy5yZXNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVDb250YWluZXIoKTtcbiAgICB9XG4gICAgcmVtb3ZlQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoYW5nZVBhZ2Uoc2tpcCwgX3Rha2UsIGNhbGxiYWNrLCBjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBkZlNlcnZpY2UuZGF0YUNoYW5nZWQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCkgfHwgdGhpcy5jb21wb25lbnQudmlydHVhbENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb2x1bW5zKGNvbHVtbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdGFibGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQubm90aWZ5UGFnZUNoYW5nZSgncGRmJywgeyBza2lwOiBza2lwLCB0YWtlOiBfdGFrZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNoYW5nZUNvbHVtbnMoY29sdW1ucywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TdGFibGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgaWYgKGNvbHVtbnMgJiYgY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5jb2x1bW5zLnJlc2V0KGNvbHVtbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuc3VzcGVuZFNlcnZpY2Uuc2Nyb2xsID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyQWxsUGFnZXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gdGhpcy5jb21wb25lbnQud3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICB3cmFwcGVyRWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLnByb2dyZXNzKTtcbiAgICAgICAgd3JhcHBlckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5vcmlnaW5hbEhlaWdodDtcbiAgICAgICAgd3JhcHBlckVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9yaWdpbmFsT3ZlcmZsb3c7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb2dyZXNzO1xuICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnQ7XG4gICAgfVxuICAgIG9uU3RhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIG5vdCBzdXJlIGlmIGl0IGlzIGFuIGFjdHVhbCBzY2VuYXJpby4gb2NjdXJzIGluIHRoZSB0ZXN0cy5cbiAgICAgICAgLy8gb25TdGFibGUgaXMgdHJpZ2dlcmVkIGluIHRoZSBzYW1lIHBhc3Mgd2l0aG91dCB0aGUgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgLy8gdGh1cywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgd2l0aG91dCB0aGUgdGltZW91dC5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShjYWxsYmFjayk7XG4gICAgICAgIH0sIDApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOiBhbGlnblxuICAgIH1cbn1cblBERkNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZ3JpZC1wZGYnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5QREZDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBQREZTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTdXNwZW5kU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH1cbl07XG5QREZDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgYWxsUGFnZXM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbHVtbnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0NvbHVtbkJhc2UkMSxdIH1dLFxuICAgIG1hcmdpbkNvbXBvbmVudDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbUERGTWFyZ2luQ29tcG9uZW50JDEsXSB9XSxcbiAgICBwYWdlVGVtcGxhdGVEaXJlY3RpdmU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW1BERlRlbXBsYXRlRGlyZWN0aXZlJDEsXSB9XVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBgZXhwb3J0LXRvLVBERmAgY29tbWFuZCBvZiB0aGUgR3JpZC5cbiAqIFlvdSBjYW4gYXBwbHkgdGhpcyBkaXJlY3RpdmUgdG8gYW55IGBidXR0b25gIGVsZW1lbnQgaW5zaWRlIGFcbiAqIFtgVG9vbGJhclRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb21tYW5kY29sdW1uY29tcG9uZW50ICV9KS5cbiAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgYnV0dG9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUsIHRoZVxuICogW2BwZGZFeHBvcnRgXSh7JSBzbHVnIGFwaV9ncmlkX2dyaWRjb21wb25lbnQgJX0jdG9jLXBkZmV4cG9ydCkgZXZlbnRcbiAqIGZpcmVzIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcGRmZXhwb3J0X2dyaWQgJX0pKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbC1uby1ydW5cbiAqIDxrZW5kby1ncmlkPlxuICogICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkVG9vbGJhclRlbXBsYXRlPlxuICogICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRQREZDb21tYW5kPkV4cG9ydCB0byBQREY8L2J1dHRvbj5cbiAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgPGtlbmRvLWdyaWQtcGRmIGZpbGVOYW1lPVwiR3JpZC5wZGZcIj5cbiAqICAgICAgPC9rZW5kby1ncmlkLXBkZj5cbiAqIDwva2VuZG8tZ3JpZD5cbiAqIGBgYFxuICovXG5jbGFzcyBQREZDb21tYW5kRGlyZWN0aXZlIGV4dGVuZHMgQnV0dG9uIHtcbiAgICBjb25zdHJ1Y3RvcihwZGZTZXJ2aWNlLCBlbGVtZW50LCByZW5kZXJlciwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgcmVuZGVyZXIsIG51bGwsIGxvY2FsaXphdGlvbiwgbmdab25lKTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlID0gcGRmU2VydmljZTtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2UuZXhwb3J0Q2xpY2suZW1pdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHBkZkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5QREZDb21tYW5kRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9HcmlkUERGQ29tbWFuZF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBERkNvbW1hbmREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBQREZTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuUERGQ29tbWFuZERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBvbkNsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLCBbJyRldmVudCddLF0gfV0sXG4gICAgcGRmQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZ3JpZC1wZGYnLF0gfV1cbn07XG5cbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyQ1ID0gW1xuICAgIFBERkNvbXBvbmVudCxcbiAgICBQREZNYXJnaW5Db21wb25lbnQkMSxcbiAgICBQREZDb21tYW5kRGlyZWN0aXZlLFxuICAgIFBERlRlbXBsYXRlRGlyZWN0aXZlJDFcbl07XG5jb25zdCBkZWNsYXJhdGlvbnMkMSA9IFtcbiAgICBQREZDb21wb25lbnQsXG4gICAgUERGTWFyZ2luQ29tcG9uZW50JDEsXG4gICAgUERGQ29tbWFuZERpcmVjdGl2ZSxcbiAgICBQREZUZW1wbGF0ZURpcmVjdGl2ZSQxXG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgR3JpZCBQREYgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHMtbm8tcnVuXG4gKiAvLyBJbXBvcnQgdGhlIEdyaWQgYW5kIFBERiBtb2R1bGVzXG4gKiBpbXBvcnQgeyBHcmlkTW9kdWxlLCBQREZNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcbiAqXG4gKiAvLyBUaGUgYnJvd3NlciBwbGF0Zm9ybSB3aXRoIGEgY29tcGlsZXJcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICpcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogLy8gSW1wb3J0IHRoZSBhcHAgY29tcG9uZW50XG4gKiBpbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2FwcC5jb21wb25lbnQnO1xuICpcbiAqIC8vIERlZmluZSB0aGUgYXBwIG1vZHVsZVxuICogX0BOZ01vZHVsZSh7XG4gKiAgICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSwgLy8gZGVjbGFyZSBhcHAgY29tcG9uZW50XG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgR3JpZE1vZHVsZSwgUERGTW9kdWxlXSwgLy8gaW1wb3J0IEdyaWQgYW5kIFBERiBtb2R1bGVzXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBQREZNb2R1bGUge1xufVxuUERGTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtkZWNsYXJhdGlvbnMkMV0sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkTW9kdWxlcyQ1XVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3IgdGhlIGBleGNlbEV4cG9ydGAgZXZlbnQuXG4gKi9cbmNsYXNzIEV4Y2VsRXhwb3J0RXZlbnQgZXh0ZW5kcyBQcmV2ZW50YWJsZUV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih3b3JrYm9vaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndvcmtib29rID0gd29ya2Jvb2s7XG4gICAgfVxufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXMgKi9cbmNvbnN0IGZldGNoQ29tcG9uZW50RGF0YSA9IChjb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBjb21wb25lbnQudmlldy5tYXAoaXRlbSA9PiBpdGVtKSxcbiAgICAgICAgZ3JvdXA6IGNvbXBvbmVudC5ncm91cFxuICAgIH07XG59O1xuY29uc3QgdG9FeGNlbENvbHVtbiA9IChjb2x1bW4pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICBsb2NrZWQ6IEJvb2xlYW4oY29sdW1uLmxvY2tlZCksXG4gICAgICAgIHdpZHRoOiBjb2x1bW4ud2lkdGgsXG4gICAgICAgIGxldmVsOiBjb2x1bW4ubGV2ZWwsXG4gICAgICAgIGhpZGRlbjogIWNvbHVtbi5pc1Zpc2libGUsXG4gICAgICAgIGdyb3VwSGVhZGVyVGVtcGxhdGU6IGNvbHVtbi5ncm91cEhlYWRlclRlbXBsYXRlLFxuICAgICAgICBncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiBjb2x1bW4uZ3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZSxcbiAgICAgICAgZ3JvdXBGb290ZXJUZW1wbGF0ZTogY29sdW1uLmdyb3VwRm9vdGVyVGVtcGxhdGUsXG4gICAgICAgIGZvb3RlclRlbXBsYXRlOiBjb2x1bW4uZm9vdGVyVGVtcGxhdGVcbiAgICB9O1xufTtcbmNvbnN0IHRvRXhjZWxDb2x1bW5zID0gKGNvbHVtbnMpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBzb3J0Q29sdW1ucyhjb2x1bW5zKVxuICAgICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaXNTcGFuQ29sdW1uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50b0V4Y2VsQ29sdW1ucyhjb2x1bW4uY2hpbGRyZW5BcnJheSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhjZWxDb2x1bW4gPSB0b0V4Y2VsQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBleGNlbENvbHVtbi5jaGlsZHJlbiA9IFtleGNlbENvbHVtbl0uY29uY2F0KHRvRXhjZWxDb2x1bW5zKGNvbHVtbi5jaGlsZHJlbkFycmF5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChleGNlbENvbHVtbik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IGNvbXBvbmVudENvbHVtbnMgPSAoY29tcG9uZW50KSA9PiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRvRXhjZWxDb2x1bW5zKGNvbXBvbmVudC5jb2x1bW5zLnRvQXJyYXkoKSk7XG4gICAgcmV0dXJuIG9yZGVyQnkoY29sdW1ucywgW3sgZmllbGQ6ICdsb2NrZWQnLCBkaXI6ICdkZXNjJyB9XSk7XG59O1xuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGV4cG9ydCBvZiBHcmlkIGluIEV4Y2VsIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZXhjZWxleHBvcnRfZ3JpZCAlfSkpLlxuICovXG5jbGFzcyBFeGNlbENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZXhjZWxTZXJ2aWNlLCBsb2NhbGl6YXRpb24sIHpvbmUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgRXhjZWwgZmlsZS5cbiAgICAgICAgICogQGRlZmF1bHQgXCJFeHBvcnQueGxzeFwiXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbGVOYW1lID0gJ0V4cG9ydC54bHN4JztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICAgICAgdGhpcy5zYXZlU3Vic2NyaXB0aW9uID0gZXhjZWxTZXJ2aWNlLnNhdmVUb0V4Y2VsLnN1YnNjcmliZSh0aGlzLnNhdmUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNhdmVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2F2ZShjb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICh0aGlzLmZldGNoRGF0YSB8fCBmZXRjaENvbXBvbmVudERhdGEpKGNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGV4cG9ydERhdGEgPSAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhU3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhKGNvbXBvbmVudCwgcmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBkYXRhLnRoZW4oZXhwb3J0RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbiA9IGRhdGEucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZXhwb3J0RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHBvcnREYXRhKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV4cG9ydERhdGEoY29tcG9uZW50LCByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHdvcmtib29rT3B0aW9ucyh7XG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMubGVuZ3RoID8gdGhpcy5jb2x1bW5zIDogY29tcG9uZW50Q29sdW1ucyhjb21wb25lbnQpLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICBncm91cDogcmVzdWx0Lmdyb3VwLFxuICAgICAgICAgICAgZmlsdGVyYWJsZTogdGhpcy5maWx0ZXJhYmxlLFxuICAgICAgICAgICAgY3JlYXRvcjogdGhpcy5jcmVhdG9yLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5kYXRlLFxuICAgICAgICAgICAgcGFkZGluZ0NlbGxPcHRpb25zOiB0aGlzLnBhZGRpbmdDZWxsT3B0aW9ucyxcbiAgICAgICAgICAgIGhlYWRlclBhZGRpbmdDZWxsT3B0aW9uczogdGhpcy5oZWFkZXJQYWRkaW5nQ2VsbE9wdGlvbnMsXG4gICAgICAgICAgICBydGw6IHRoaXMubG9jYWxpemF0aW9uLnJ0bCxcbiAgICAgICAgICAgIGNvbGxhcHNpYmxlOiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhcmdzID0gbmV3IEV4Y2VsRXhwb3J0RXZlbnQob3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudC5leGNlbEV4cG9ydC5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLnNhdmVGaWxlKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzYXZlRmlsZShvcHRpb25zKSB7XG4gICAgICAgIHRvRGF0YVVSTChvcHRpb25zKS50aGVuKChkYXRhVVJMKSA9PiB7XG4gICAgICAgICAgICBzYXZlQXMoZGF0YVVSTCwgdGhpcy5maWxlTmFtZSwge1xuICAgICAgICAgICAgICAgIGZvcmNlUHJveHk6IHRoaXMuZm9yY2VQcm94eSxcbiAgICAgICAgICAgICAgICBwcm94eVVSTDogdGhpcy5wcm94eVVSTFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkV4Y2VsQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1ncmlkLWV4Y2VsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRXhjZWxDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFeGNlbFNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IE5nWm9uZSB9XG5dO1xuRXhjZWxDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgZmlsZU5hbWU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZpbHRlcmFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNyZWF0b3I6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRhdGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGZvcmNlUHJveHk6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHByb3h5VVJMOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmZXRjaERhdGE6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHBhZGRpbmdDZWxsT3B0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVhZGVyUGFkZGluZ0NlbGxPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2xsYXBzaWJsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY29sdW1uczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbQ29sdW1uQmFzZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYGV4cG9ydC10by1FeGNlbGAgY29tbWFuZCBvZiB0aGUgR3JpZC4gWW91IGNhbiBhcHBseSB0aGlzXG4gKiBkaXJlY3RpdmUgdG8gYW55IGBidXR0b25gIGVsZW1lbnQgaW5zaWRlIGFcbiAqIFtgVG9vbGJhclRlbXBsYXRlYF0oeyUgc2x1ZyBhcGlfZ3JpZF9jb21tYW5kY29sdW1uY29tcG9uZW50ICV9KS5cbiAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgYnV0dG9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLCB0aGVcbiAqIFtgZXhjZWxFeHBvcnRgXSh7JSBzbHVnIGFwaV9ncmlkX2dyaWRjb21wb25lbnQgJX0jdG9jLWV4Y2VsZXhwb3J0KSBldmVudFxuICogZmlyZXMgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBleGNlbGV4cG9ydF9ncmlkICV9KSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWwtbm8tcnVuXG4gKiA8a2VuZG8tZ3JpZD5cbiAqICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZT5cbiAqICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkRXhjZWxDb21tYW5kPkV4cG9ydCB0byBQREY8L2J1dHRvbj5cbiAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgPGtlbmRvLWdyaWQtZXhjZWwgZmlsZU5hbWU9XCJHcmlkLnhsc3hcIj5cbiAqICAgICAgPC9rZW5kby1ncmlkLWV4Y2VsPlxuICogPC9rZW5kby1ncmlkPlxuICogYGBgXG4gKi9cbmNsYXNzIEV4Y2VsQ29tbWFuZERpcmVjdGl2ZSBleHRlbmRzIEJ1dHRvbiB7XG4gICAgY29uc3RydWN0b3IoZXhjZWxTZXJ2aWNlLCBlbGVtZW50LCByZW5kZXJlciwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgcmVuZGVyZXIsIG51bGwsIGxvY2FsaXphdGlvbiwgbmdab25lKTtcbiAgICAgICAgdGhpcy5leGNlbFNlcnZpY2UgPSBleGNlbFNlcnZpY2U7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25DbGljayhlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5leGNlbFNlcnZpY2UuZXhwb3J0Q2xpY2suZW1pdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGV4Y2VsQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbkV4Y2VsQ29tbWFuZERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvR3JpZEV4Y2VsQ29tbWFuZF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkV4Y2VsQ29tbWFuZERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IEV4Y2VsU2VydmljZSB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcbkV4Y2VsQ29tbWFuZERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBvbkNsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLCBbJyRldmVudCddLF0gfV0sXG4gICAgZXhjZWxDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1ncmlkLWV4Y2VsJyxdIH1dXG59O1xuXG5jb25zdCBkZWNsYXJhdGlvbnMkMiA9IFtFeGNlbENvbXBvbmVudCwgRXhjZWxDb21tYW5kRGlyZWN0aXZlXTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIEV4Y2VsIGNvbXBvbmVudCBvZiB0aGUgR3JpZC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzLW5vLXJ1blxuICogLy8gSW1wb3J0IHRoZSBHcmlkIGFuZCBFeGNlbCBtb2R1bGVzXG4gKiBpbXBvcnQgeyBHcmlkTW9kdWxlLCBFeGNlbE1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xuICpcbiAqIC8vIFRoZSBicm93c2VyIHBsYXRmb3JtIHdpdGggYSBjb21waWxlclxuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKlxuICogaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiAvLyBJbXBvcnQgdGhlIGFwcCBjb21wb25lbnRcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKlxuICogLy8gRGVmaW5lIHRoZSBhcHAgbW9kdWxlXG4gKiBfQE5nTW9kdWxlKHtcbiAqICAgICBkZWNsYXJhdGlvbnM6IFtBcHBDb21wb25lbnRdLCAvLyBkZWNsYXJlIGFwcCBjb21wb25lbnRcbiAqICAgICBpbXBvcnRzOiAgICAgIFtCcm93c2VyTW9kdWxlLCBHcmlkTW9kdWxlLCBFeGNlbE1vZHVsZV0sIC8vIGltcG9ydCBHcmlkIGFuZCBFeGNlbCBtb2R1bGVzXG4gKiAgICAgYm9vdHN0cmFwOiAgICBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqXG4gKiAvLyBDb21waWxlIGFuZCBsYXVuY2ggdGhlIG1vZHVsZVxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBFeGNlbE1vZHVsZSB7XG59XG5FeGNlbE1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZGVjbGFyYXRpb25zJDJdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtkZWNsYXJhdGlvbnMkMiwgRXhjZWxFeHBvcnRNb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0IHsgQ29sdW1uQ2hvb3NlckNvbXBvbmVudCwgQ29sdW1uTGlzdENvbXBvbmVudCwgQ29sdW1uTWVudUNob29zZXJDb21wb25lbnQsIENvbHVtbk1lbnVGaWx0ZXJDb21wb25lbnQsIENvbHVtbk1lbnVJdGVtQmFzZSwgQ29sdW1uTWVudUl0ZW1Db250ZW50VGVtcGxhdGVEaXJlY3RpdmUsIENvbHVtbk1lbnVJdGVtQ29tcG9uZW50LCBDb2x1bW5NZW51TG9ja0NvbXBvbmVudCwgQ29sdW1uTWVudVNvcnRDb21wb25lbnQsIENvbHVtbk1lbnVUZW1wbGF0ZURpcmVjdGl2ZSwgQ29sdW1uTWVudU1vZHVsZSwgQ29sdW1uTWVudVNlcnZpY2UsIENvbHVtbkhhbmRsZURpcmVjdGl2ZSwgQ29sdW1uUmVzaXppbmdTZXJ2aWNlLCBUYWJsZURpcmVjdGl2ZSwgQ29sdW1uSW5mb1NlcnZpY2UsIERvbUV2ZW50c1NlcnZpY2UsIEV4cGFuZFN0YXRlU2VydmljZSwgSWRTZXJ2aWNlLCBQcmV2ZW50YWJsZUV2ZW50LCBTb3J0U2VydmljZSwgQ2hhbmdlTm90aWZpY2F0aW9uU2VydmljZSwgQ29sdW1uUmVvcmRlclNlcnZpY2UsIERyYWdBbmREcm9wTW9kdWxlLCBEcmFnQW5kRHJvcFNlcnZpY2UsIERyYWdIaW50U2VydmljZSwgRHJhZ2dhYmxlQ29sdW1uRGlyZWN0aXZlLCBEcm9wQ3VlU2VydmljZSwgRHJvcFRhcmdldERpcmVjdGl2ZSwgRWRpdGluZ0RpcmVjdGl2ZUJhc2UsIFJvd0VkaXRpbmdEaXJlY3RpdmVCYXNlLCBBZGRDb21tYW5kRGlyZWN0aXZlLCBDYW5jZWxDb21tYW5kRGlyZWN0aXZlLCBFZGl0Q29tbWFuZERpcmVjdGl2ZSwgRWRpdFNlcnZpY2UgYXMgRWRpdFNlcnZpY2UkMSwgTG9jYWxEYXRhQ2hhbmdlc1NlcnZpY2UsIFJlbW92ZUNvbW1hbmREaXJlY3RpdmUsIFNhdmVDb21tYW5kRGlyZWN0aXZlLCBFeGNlbENvbW1hbmREaXJlY3RpdmUsIEJvb2xlYW5GaWx0ZXJDb21wb25lbnQsIEJvb2xlYW5GaWx0ZXJDZWxsQ29tcG9uZW50LCBGaWx0ZXJDZWxsSG9zdERpcmVjdGl2ZSwgRmlsdGVyQ2VsbE9wZXJhdG9yc0NvbXBvbmVudCwgRmlsdGVyQ2VsbFdyYXBwZXJDb21wb25lbnQsIERhdGVGaWx0ZXJDb21wb25lbnQsIEZpbHRlckhvc3REaXJlY3RpdmUsIEZpbHRlcklucHV0V3JhcHBlckNvbXBvbmVudCwgRmlsdGVySW5wdXREaXJlY3RpdmUsIEZpbHRlclJvd0NvbXBvbmVudCwgRGF0ZUZpbHRlck1lbnVJbnB1dENvbXBvbmVudCwgRmlsdGVyTWVudUNvbnRhaW5lckNvbXBvbmVudCwgRmlsdGVyTWVudUhvc3REaXJlY3RpdmUsIEZpbHRlck1lbnVJbnB1dFdyYXBwZXJDb21wb25lbnQsIEZpbHRlck1lbnVDb21wb25lbnQsIE51bWVyaWNGaWx0ZXJNZW51SW5wdXRDb21wb25lbnQsIFN0cmluZ0ZpbHRlck1lbnVJbnB1dENvbXBvbmVudCwgTnVtZXJpY0ZpbHRlckNvbXBvbmVudCwgRmlsdGVyT3BlcmF0b3JCYXNlLCBTaGFyZWRGaWx0ZXJNb2R1bGUsIFN0cmluZ0ZpbHRlckNvbXBvbmVudCwgR3JvdXBIZWFkZXJDb21wb25lbnQsIEdyb3VwSW5kaWNhdG9yQ29tcG9uZW50LCBHcm91cEluZm9TZXJ2aWNlLCBHcm91cFBhbmVsQ29tcG9uZW50LCBHcm91cHNTZXJ2aWNlLCBCcm93c2VyU3VwcG9ydFNlcnZpY2UsIFJlc2l6ZVNlcnZpY2UsIFJlc3BvbnNpdmVTZXJ2aWNlLCBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgTWVzc2FnZXMsIEZvY3VzR3JvdXAsIEZvY3VzUm9vdCwgTG9naWNhbENlbGxEaXJlY3RpdmUsIExvZ2ljYWxSb3dEaXJlY3RpdmUsIE5hdmlnYXRpb25TZXJ2aWNlLCBQYWdlckNvbnRleHRTZXJ2aWNlLCBQYWdlckVsZW1lbnRDb21wb25lbnQsIFBERkNvbW1hbmREaXJlY3RpdmUsIFBERlRlbXBsYXRlRGlyZWN0aXZlJDEgYXMgUERGVGVtcGxhdGVEaXJlY3RpdmUsIENlbGxDb21wb25lbnQsIENFTExfQ09OVEVYVCwgRU1QVFlfQ0VMTF9DT05URVhULCBGaWVsZEFjY2Vzc29yUGlwZSwgRGV0YWlsc1NlcnZpY2UsIERFRkFVTFRfU0NST0xMRVJfRkFDVE9SWSwgU0NST0xMRVJfRkFDVE9SWV9UT0tFTiwgU2Nyb2xsUmVxdWVzdFNlcnZpY2UsIFNjcm9sbFN5bmNTZXJ2aWNlLCBTY3JvbGxlclNlcnZpY2UsIENlbGxTZWxlY3Rpb25TZXJ2aWNlLCBHcmlkTWFycXVlZURpcmVjdGl2ZSwgU2VsZWN0QWxsQ2hlY2tib3hEaXJlY3RpdmUsIFNlbGVjdGlvbkNoZWNrYm94RGlyZWN0aXZlLCBTZWxlY3Rpb24sIFNlbGVjdGlvblNlcnZpY2UsIEdyaWRNb2R1bGUsIFNoYXJlZE1vZHVsZSwgR3JpZENvbXBvbmVudCwgQ29sdW1uQmFzZSQxIGFzIENvbHVtbkJhc2UsIENvbHVtbkNvbXBvbmVudCwgQ29tbWFuZENvbHVtbkNvbXBvbmVudCwgU3BhbkNvbHVtbkNvbXBvbmVudCwgQ29sdW1uR3JvdXBDb21wb25lbnQsIENoZWNrYm94Q29sdW1uQ29tcG9uZW50LCBUb29sYmFyQ29tcG9uZW50LCBUb29sYmFyVGVtcGxhdGVEaXJlY3RpdmUsIENlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIEZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLCBQYWdlclRlbXBsYXRlRGlyZWN0aXZlLCBFeHBhbmREZXRhaWxzRGlyZWN0aXZlLCBEZXRhaWxUZW1wbGF0ZURpcmVjdGl2ZSwgRGV0YWlsRXhwYW5kRXZlbnQsIERldGFpbENvbGxhcHNlRXZlbnQsIEdyb3VwSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIEdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUsIEdyb3VwRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsIFJlc2l6YWJsZUNvbnRhaW5lckRpcmVjdGl2ZSwgVGVtcGxhdGVDb250ZXh0RGlyZWN0aXZlLCBOb1JlY29yZHNUZW1wbGF0ZURpcmVjdGl2ZSwgRGF0YUJpbmRpbmdEaXJlY3RpdmUsIFNlbGVjdGlvbkRpcmVjdGl2ZSwgRmlsdGVyU2VydmljZSwgRmlsdGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBGaWx0ZXJDZWxsQ29tcG9uZW50LCBTdHJpbmdGaWx0ZXJDZWxsQ29tcG9uZW50LCBEYXRlRmlsdGVyQ2VsbENvbXBvbmVudCwgQmFzZUZpbHRlckNlbGxDb21wb25lbnQsIEZpbHRlck1lbnVUZW1wbGF0ZURpcmVjdGl2ZSwgTnVtZXJpY0ZpbHRlck1lbnVDb21wb25lbnQsIFN0cmluZ0ZpbHRlck1lbnVDb21wb25lbnQsIERhdGVGaWx0ZXJNZW51Q29tcG9uZW50LCBCb29sZWFuRmlsdGVyTWVudUNvbXBvbmVudCwgQmVmb3JlRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgQmVmb3JlRmlsdGVyT3BlcmF0b3JDb21wb25lbnQsIEFmdGVyRXFGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgQWZ0ZXJGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgQ29udGFpbnNGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgRG9lc05vdENvbnRhaW5GaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgRW5kc1dpdGhGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgRXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgSXNFbXB0eUZpbHRlck9wZXJhdG9yQ29tcG9uZW50LCBJc05vdEVtcHR5RmlsdGVyT3BlcmF0b3JDb21wb25lbnQsIElzTm90TnVsbEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LCBJc051bGxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgTm90RXF1YWxGaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgU3RhcnRzV2l0aEZpbHRlck9wZXJhdG9yQ29tcG9uZW50LCBOdW1lcmljRmlsdGVyQ2VsbENvbXBvbmVudCwgQXV0b0NvbXBsZXRlRmlsdGVyQ2VsbENvbXBvbmVudCwgR3JlYXRlckZpbHRlck9wZXJhdG9yQ29tcG9uZW50LCBHcmVhdGVyT3JFcXVhbFRvRmlsdGVyT3BlcmF0b3JDb21wb25lbnQsIExlc3NPckVxdWFsVG9GaWx0ZXJPcGVyYXRvckNvbXBvbmVudCwgTGVzc0ZpbHRlck9wZXJhdG9yQ29tcG9uZW50LCBQYWdlclByZXZCdXR0b25zQ29tcG9uZW50LCBQYWdlck5leHRCdXR0b25zQ29tcG9uZW50LCBQYWdlck51bWVyaWNCdXR0b25zQ29tcG9uZW50LCBQYWdlcklucHV0Q29tcG9uZW50LCBQYWdlckluZm9Db21wb25lbnQsIFBhZ2VyUGFnZVNpemVzQ29tcG9uZW50LCBSb3dGaWx0ZXJNb2R1bGUsIEZpbHRlck1lbnVNb2R1bGUsIEJvZHlNb2R1bGUsIEdyb3VwTW9kdWxlLCBIZWFkZXJNb2R1bGUsIEZvb3Rlck1vZHVsZSwgUGFnZXJNb2R1bGUsIFRlbXBsYXRlRWRpdGluZ0RpcmVjdGl2ZSwgUmVhY3RpdmVFZGl0aW5nRGlyZWN0aXZlLCBJbkNlbGxFZGl0aW5nRGlyZWN0aXZlLCBFZGl0VGVtcGxhdGVEaXJlY3RpdmUsIENvbEdyb3VwQ29tcG9uZW50LCBIZWFkZXJDb21wb25lbnQsIExpc3RDb21wb25lbnQsIEZvb3RlckNvbXBvbmVudCwgVGFibGVCb2R5Q29tcG9uZW50LCBQYWdlckNvbXBvbmVudCwgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsIExvYWRpbmdDb21wb25lbnQsIFBERk1vZHVsZSwgUERGQ29tcG9uZW50LCBQREZNYXJnaW5Db21wb25lbnQkMSBhcyBQREZNYXJnaW5Db21wb25lbnQsIFBERlNlcnZpY2UsIEV4Y2VsTW9kdWxlLCBFeGNlbENvbXBvbmVudCwgRXhjZWxTZXJ2aWNlLCBFeGNlbEV4cG9ydEV2ZW50LCBDZWxsQ2xvc2VFdmVudCwgU3VzcGVuZFNlcnZpY2UsIEdyb3VwQmluZGluZ0RpcmVjdGl2ZSwgc2xpY2UsIGNvdW50LCBTa2lwLCBDb2x1bW5SZW9yZGVyRXZlbnQsIEZvY3VzYWJsZURpcmVjdGl2ZSwgQ29sdW1uVmlzaWJpbGl0eUNoYW5nZUV2ZW50LCBDb2x1bW5NZW51Q29tcG9uZW50LCBTaW5nbGVQb3B1cFNlcnZpY2UsIFBvcHVwQ2xvc2VFdmVudCB9O1xuIl19","import { Pipe, PipeTransform } from '@angular/core';\nimport * as _ from 'lodash';\n\n@Pipe({name: 'abbottBigNumber'})\nexport class AbbottBigNumberFormatterPipe implements PipeTransform {\n transform(value: string, precision: number = 1): string {\n if (!isNaN(Number(value))) { // is a number\n let floatValue = parseFloat(value);\n if (floatValue >= 1000000000 || floatValue <= -1000000000) {\n floatValue = _.round(floatValue/1000000000, precision);\n value = floatValue + ' MMM';\n } else if (floatValue >= 1000000 || floatValue <= -1000000) {\n floatValue = _.round(floatValue/1000000, precision);\n value = floatValue + ' MM';\n } else if (floatValue >= 1000 || floatValue <= -1000) {\n floatValue = _.round(floatValue/1000, precision);\n value = floatValue + ' M';\n }\n }\n return value;\n }\n}\n","","import { Component, OnInit } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {RowParserService} from '../row-parser.service';\nimport {Location} from '@angular/common';\nimport {Style1Pages} from '../../configuration/details/style1-pages';\nimport {PreferenceApiConnectorService} from '../../preferences/preference-api-connector.service';\nimport {Router} from '@angular/router';\n\n@Component({\n selector: 'app-style1-grid',\n templateUrl: './style1-grid.component.html',\n styleUrls: ['./style1-grid.component.scss']\n})\nexport class Style1GridComponent extends GridComponent implements OnInit {\n rowFormatting = [];\n\n style1Pages = Style1Pages;\n\n config = null;\n private colorRowDescriptions = false;\n\n protected rowParserData = {};\n\n state;\n RequestState = RequestState;\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n protected rowParserRegistry: RowParserService,\n protected preferenceApiConnectorService: PreferenceApiConnectorService,\n protected router: Router\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style1Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style1Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n this.state = state;\n this.buildGridData();\n });\n\n // override for currency preference\n if (this.config.tileReference.apiSource === '/metrics/sales') {\n this.preferenceApiConnectorService.onUpdate(() => {\n this.buildGridData();\n });\n }\n }\n }\n\n buildGridData() {\n if (this.state === RequestState.Complete) {\n // 0 if local, 2 if not local\n // cumulativeLocal, MonthlyLocal, Cumulative Dollar, MonthlyDollar\n let offset = 0;\n\n if (this.config.tileReference.apiSource === '/metrics/sales') {\n const isLocal = this.preferenceApiConnectorService.getIsLocalCurrency();\n if (isLocal === 'True') {\n offset = 0;\n } else if (isLocal === 'False') {\n offset = 2;\n }\n }\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n const dataColsConfig = this.config.table.dataCols;\n let rowParser = this.rowParserRegistry.get(dataColsConfig.parser);\n let sourceData = this.calculateInject(dataColsConfig.inject, apiData);\n this.dataCols = rowParser.get(sourceData, dataColsConfig.attributes);\n\n // format dataRows for kendo component\n for (const parseConfig of this.config.table.dataParse) {\n rowParser = this.rowParserRegistry.get(parseConfig.parser);\n sourceData = this.calculateInject(parseConfig.inject, apiData);\n const parserAttributes = parseConfig.attributes;\n parserAttributes.stackIndex += offset;\n this.rowParserData[parseConfig.key] = rowParser.get(sourceData, parserAttributes);\n }\n this.dataRows = [];\n for (const dataRowKey of this.config.table.dataRows) {\n const dataRowCheck = this.rowParserData[dataRowKey];\n for (const rowCol in dataRowCheck) {\n if (rowCol in dataRowCheck) {\n if (this.numberType(this.rowParserData[dataRowKey][rowCol]) === 'int') {\n this.rowParserData[dataRowKey][rowCol] = parseInt(dataRowCheck[rowCol]);\n } else if (this.numberType(this.rowParserData[dataRowKey][rowCol]) === 'float') {\n this.rowParserData[dataRowKey][rowCol] = parseFloat(dataRowCheck[rowCol]);\n }\n }\n }\n this.dataRows.push(this.rowParserData[dataRowKey]);\n }\n\n // setup data for formatting row colors\n this.rowFormatting = this.config.table.rowColors(apiData);\n\n if (\n ('colorRowDescriptions' in this.config.table)\n && (this.config.table.colorRowDescriptions === true)\n ) {\n this.colorRowDescriptions = true;\n }\n this.updateGrid();\n }\n if (this.state === RequestState.Loading) {\n this.dataRows = [];\n this.updateGrid();\n }\n }\n\n numberType(value) {\n if (isNaN(value)) {\n return 'other';\n }\n if (Math.floor(value) === value) {\n return 'int';\n } else {\n return 'float';\n }\n }\n\n calculateInject(key, apiData) {\n if (key === 'apiData') {\n return apiData;\n }\n if (Array.isArray(key)) {\n const injectArray = [];\n for (const item of key) {\n if (item === 'apiData') {\n injectArray.push(apiData);\n } else {\n injectArray.push(this.rowParserData[item]);\n }\n }\n return injectArray;\n }\n return this.rowParserData[key];\n }\n\n goToDetails(location) {\n this.router.navigateByUrl(location);\n }\n\n // https://www.telerik.com/kendo-angular-ui/components/grid/styling\n cellStyle(colRef, rowIndex = -1) {\n if (colRef === 'description') {\n if (this.colorRowDescriptions && rowIndex >= 0) {\n return {\n 'background-color': this.rowFormatting[rowIndex],\n color: '#FFFFFF',\n display: 'block',\n padding: '12px'\n };\n }\n return {\n 'background-color': 'blue',\n color: '#FFFFFF'\n };\n }\n return {\n 'color': this.rowFormatting[rowIndex],\n 'text-align': 'right',\n 'display': 'block'\n };\n }\n\n headerStyle(colRef) {\n if (colRef === 'description') {\n if (this.colorRowDescriptions) {\n return {\n 'background-color': 'blue',\n color: '#FFFFFF',\n padding: '0'\n };\n }\n return {\n 'background-color': 'blue',\n color: '#FFFFFF'\n };\n }\n return {\n 'background-color': '#AA0061',\n color: '#FFFFFF',\n padding: '5px'\n };\n }\n\n colStyle(colRef) {\n if (colRef === 'description') {\n if (this.colorRowDescriptions) {\n return {\n 'background-color': 'blue',\n 'color': '#FFFFFF',\n 'padding': '0'\n };\n }\n return {\n 'background-color': 'blue',\n 'color': '#FFFFFF'\n };\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({name: 'emptyMask'})\nexport class EmptyValueMaskPipe implements PipeTransform {\n transform(value: any, valueIfBlank?: any): any {\n if (value === null || value === '' || value === ' ' || value === 'N/A' || value === 'n/a') {\n if (valueIfBlank !== undefined) {\n return valueIfBlank;\n }\n return '';\n //return '-';\n } else {\n return value;\n }\n }\n}\n","\n","import { Component, OnInit } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {Location} from '@angular/common';\nimport {Style1Pages} from '../../configuration/details/style1-pages';\nimport {PreferenceApiConnectorService} from '../../preferences/preference-api-connector.service';\n\n@Component({\n selector: 'app-set-values-grid',\n templateUrl: './set-values-grid.component.html',\n styleUrls: ['./set-values-grid.component.scss']\n})\nexport class SetValuesGridComponent extends GridComponent implements OnInit {\n cellFormatting = [];\n\n style1Pages = Style1Pages;\n\n state;\n config = null;\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n protected preferenceApiConnectorService: PreferenceApiConnectorService\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style1Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style1Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n this.state = state;\n this.buildGridData();\n });\n\n // override for currency preference\n if (this.config.tileReference.apiSource === '/metrics/rcs') {\n this.preferenceApiConnectorService.onUpdate(() => {\n this.buildGridData();\n });\n }\n }\n }\n\n buildGridData() {\n if (this.state === RequestState.Complete) {\n // rcs: amtdollar, amtlocal\n let isLocal = false;\n\n if (this.config.tileReference.apiSource === '/metrics/rcs') {\n if (this.preferenceApiConnectorService.getIsLocalCurrency() === 'True') {\n isLocal = true;\n }\n }\n\n if (this.state === RequestState.Complete) {\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n if (isLocal && this.config.tileReference.apiSource === '/metrics/rcs') {\n this.dataCols = this.config.table.dataColsLocal;\n } else {\n this.dataCols = this.config.table.dataCols;\n }\n\n // format dataRows for kendo component\n if (isLocal && this.config.tileReference.apiSource === '/metrics/rcs') {\n this.dataRows = [this.config.table.dataValuesLocal(apiData)];\n } else {\n this.dataRows = [this.config.table.dataValues(apiData)];\n }\n for (const dataRowKey in this.dataRows) {\n if (dataRowKey in this.dataRows) {\n const dataRow = this.dataRows[dataRowKey];\n for (const rowCol in dataRow) {\n if (rowCol in dataRow) {\n if (this.numberType(dataRow[rowCol]) === 'int') {\n this.dataRows[dataRowKey][rowCol] = parseInt(dataRow[rowCol]);\n } else if (this.numberType(dataRow[rowCol]) === 'float') {\n this.dataRows[dataRowKey][rowCol] = parseFloat(dataRow[rowCol]);\n\n }\n }\n }\n }\n }\n\n // setup data for formatting row colors\n this.cellFormatting = this.config.table.valueColors(apiData);\n\n this.updateGrid();\n }\n }\n }\n\n numberType(value) {\n if (isNaN(value)) {\n return 'other';\n }\n if (Math.floor(value) === value) {\n return 'int';\n } else {\n return 'float';\n }\n }\n\n // https://www.telerik.com/kendo-angular-ui/components/grid/styling\n cellStyle(cellIndex) {\n return {\n 'color': this.cellFormatting[cellIndex],\n 'text-align': 'right',\n 'display': 'block'\n };\n }\n}\n"," ","import { Component, OnInit } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {Location} from '@angular/common';\nimport {Style1Pages} from '../../configuration/details/style1-pages';\n\n/**\n * this component is designed specifically for low utilization\n * @todo: give component a more meaningful name\n */\n@Component({\n selector: 'app-custom-grid',\n templateUrl: './custom-grid.component.html',\n styleUrls: ['./custom-grid.component.scss']\n})\nexport class CustomGridComponent extends GridComponent implements OnInit {\n rowFormatting = [];\n dataCols = [];\n dataRows = [];\n\n style1Pages = Style1Pages;\n\n config = null;\n\n protected rowParserData = {};\n\n constructor(\n protected location: Location,\n protected apiService: ApiService\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style1Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style1Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n const lowestRange = apiData.range[0];\n const secondLowestRange = apiData.range[1];\n\n // format dataCols for kendo component\n this.dataCols = this.config.table.dataCols;\n\n // format dataRows for kendo component\n this.dataRows = [];\n for (let i = 0; i < lowestRange.values.length; i++) {\n this.dataRows.push({\n instrument: lowestRange.values[i].xlabel,\n lowRangeNumberOfTests: lowestRange.values[i].stacks[1],\n lowRangeInstrumentsCount: lowestRange.values[i].stacks[0],\n secondLowestRange: secondLowestRange.values[i].stacks[1],\n secondLowestInstrumentCount: secondLowestRange.values[i].stacks[0]\n });\n }\n\n // setup data for formatting row colors\n this.rowFormatting = lowestRange.stackcolors;\n\n this.updateGrid();\n }\n });\n }\n }\n\n color(rowIndex) {\n return this.rowFormatting[rowIndex];\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n {{dataItem[i] | emptyMask | abbottBigNumber:1}}\n \n \n \n \n \n","import { Component, OnInit } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {Location} from '@angular/common';\nimport {Style1Pages} from '../../configuration/details/style1-pages';\nimport {PreferenceApiConnectorService} from '../../preferences/preference-api-connector.service';\n\n@Component({\n selector: 'app-custom-compliance-grid',\n templateUrl: './custom-compliance-grid.component.html',\n styleUrls: ['./custom-compliance-grid.component.scss']\n})\nexport class CustomComplianceGridComponent extends GridComponent implements OnInit {\n rowFormatting = [];\n dataCols = [];\n dataRows = [];\n currency = 'Local';\n\n style1Pages = Style1Pages;\n\n state;\n config = null;\n\n protected rowParserData = {};\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n protected preferenceApiConnectorService: PreferenceApiConnectorService\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style1Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style1Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n this.state = state;\n this.buildGridData();\n });\n }\n }\n\n buildGridData() {\n if (this.state === RequestState.Complete) {\n // 1 if local, 2 if not local\n // Compliance, Sales, SalesDollar\n let offset = 1;\n\n const isLocal = this.preferenceApiConnectorService.getIsLocalCurrency();\n if (isLocal === 'True') {\n offset = 1;\n this.currency = 'Local';\n } else if (isLocal === 'False') {\n offset = 2;\n this.currency = 'USD';\n }\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n this.dataCols = [\n {\n description: 'YYYY-MM',\n width: 80\n },\n {\n description: apiData.values[0].xlabel,\n width: 80\n },\n {\n description: apiData.values[1].xlabel,\n width: 80\n },\n {\n description: apiData.values[2].xlabel,\n width: 80\n }\n ];\n\n // format dataRows for kendo component\n this.dataRows = [];\n this.dataRows.push([\n 'Compliance %',\n apiData.values[0].stacks[0],\n apiData.values[1].stacks[0],\n apiData.values[2].stacks[0],\n ]);\n this.dataRows.push([\n 'Goal %',\n apiData.values[0].stackgoals[0],\n apiData.values[1].stackgoals[0],\n apiData.values[2].stackgoals[0],\n ]);\n this.dataRows.push([\n 'Revenue Gain/Loss (' + this.currency + ')',\n apiData.values[0].stacks[offset],\n apiData.values[1].stacks[offset],\n apiData.values[2].stacks[offset],\n ]);\n this.dataRows.push([\n 'Goal USD',\n apiData.values[0].stackgoals[offset],\n apiData.values[1].stackgoals[offset],\n apiData.values[2].stackgoals[offset],\n ]);\n\n // setup data for formatting row colors\n this.rowFormatting = ['#006fca', '#02b3fd', '#006fca', '#02b3fd'];\n\n this.updateGrid();\n }\n // if (this.state === RequestState.Loading) {}\n }\n\n cellStyle(rowIndex, columnIndex) {\n if (columnIndex === 0) {\n return {\n 'background-color': 'blue',\n color: '#FFFFFF',\n display: 'block',\n padding: '12px'\n };\n }\n return {\n color: this.rowFormatting[rowIndex]\n };\n }\n\n colStyle(columnIndex) {\n if (columnIndex === 0) {\n return {\n 'background-color': 'blue'\n };\n }\n return {};\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef, Input,\n OnDestroy,\n Type,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport {ComponentLookupRegistry} from '../../../decorators/component-lookup';\n\n@Component({\n selector: 'app-filter-insert',\n templateUrl: './filter-insert.component.html',\n styleUrls: ['./filter-insert.component.scss']\n})\nexport class FilterInsertComponent implements AfterViewInit, OnDestroy {\n dynamicComponentRef: ComponentRef;\n\n @Input() componentRef;\n @Input() metricId;\n\n @ViewChild('dynamic', {read: ViewContainerRef}) viewContainerRef: ViewContainerRef\n\n constructor(private factoryResolver: ComponentFactoryResolver, private cd: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.loadDynamicComponent();\n this.cd.detectChanges();\n }\n\n loadDynamicComponent() {\n const componentType: Type = ComponentLookupRegistry.get(this.componentRef)\n const componentFactory = this.factoryResolver.resolveComponentFactory(componentType);\n\n this.viewContainerRef.clear();\n this.dynamicComponentRef = this.viewContainerRef.createComponent(componentFactory);\n // add inputs\n (this.dynamicComponentRef.instance).metricId = this.metricId;\n }\n\n ngOnDestroy() {\n if (this.dynamicComponentRef) {\n this.dynamicComponentRef.destroy();\n }\n }\n}\n","","
\n
\n
\n
\n
\n
\n
\n
\n \n {{chartTileReference.preferences.title}}\n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
0\">\n
\n
\n \n
\n Fetch Metric Data\n Clear\n
\n
\n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {faSearch} from '@fortawesome/free-solid-svg-icons';\nimport {DashboardOptions, ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {Style1Pages} from '../../configuration/details/style1-pages';\nimport {PersonaService} from '../../api/persona.service';\nimport {DetailChoicesService} from '../../filter_selection/details/detail-choices.service';\nimport {Personas} from '../../configuration/personas';\n\n@Component({\n selector: 'app-style1',\n templateUrl: './style1.component.html',\n styleUrls: ['./style1.component.scss']\n})\nexport class Style1Component implements OnInit {\n ready = false;\n faSearch = faSearch;\n\n style1Pages = Style1Pages;\n\n config = null;\n tileReference = null;\n charts = null;\n\n constructor(\n private location: Location,\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private detailChoices: DetailChoicesService\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style1Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style1Pages[currentRouterLocation];\n this.personaService.setServiceVsAmbState(this.config.serviceVsAmb);\n this.tileReference = this.config.tileReference;\n if (this.config.hasOwnProperty('charts')) {\n this.charts = this.config.charts;\n }\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: true,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: 'Back',\n navigateBackwardsLink: '/lastSelectedDashboard',\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [Personas.TssAmbassador, Personas.Manager, Personas.GeoLocation],\n detailFilters: this.config.filters,\n detailMetricId: this.config.metricId\n });\n }\n }\n\n applyDetailFilters() {\n this.detailChoices.applyFilters();\n return this;\n }\n\n clearDetailFilters() {\n this.detailChoices.clearFilters();\n return this;\n }\n}\n","
\n
\n
\n
\n \n \n \n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport {TileReference} from '../tile-reference';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {Personas} from '../../configuration/personas';\nimport {SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT} from '../../configuration/service-metric-tile-reference-default-arrangement';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DashboardOptions} from '../../configuration/nav-filter-selection';\nimport {PersonaService} from '../../api/persona.service';\nimport {SelectedTabService} from '../selected-tab.service';\n\n@Component({\n selector: 'app-customer',\n templateUrl: './customer.component.html',\n styleUrls: ['./customer.component.scss']\n})\nexport class CustomerComponent implements OnInit {\n arrangement: TileReference[] = [];\n\n constructor(\n private authService: AuthenticationService,\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n // remove apiSource: '/metrics/fsrutilization',\n this.arrangement = SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT.map((x) => x);\n for (let x = 0; x < this.arrangement.length; x++) {\n const item = this.arrangement[x];\n if (item.apiSource === '/metrics/fsrutilization') {\n this.arrangement.splice(x, 1);\n }\n }\n this.personaService.setServiceVsAmbState(true);\n this.personaService.refreshDetailChoices();\n this.navbarBuilderService.setNavbarChoice('dashboard');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: true,\n personaSelector: true,\n dashboardSelector: true,\n selectedDashboard: DashboardOptions.customer,\n search: true,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: false,\n navigateBackwardsLabel: 'Back',\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [Personas.TssAmbassador, Personas.Manager, Personas.GeoLocation, Personas.Customer]\n });\n this.selectedTabService.selectTab(DashboardOptions.customer);\n }\n}\n","
\n
\n
\n
\n \n \n \n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport {TileReference} from '../tile-reference';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {Personas} from '../../configuration/personas';\nimport {SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT} from '../../configuration/service-metric-tile-reference-default-arrangement';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DashboardOptions} from '../../configuration/nav-filter-selection';\nimport {PersonaService} from '../../api/persona.service';\nimport {SelectedTabService} from '../selected-tab.service';\n\n@Component({\n selector: 'app-instruments',\n templateUrl: './instruments.component.html',\n styleUrls: ['./instruments.component.scss']\n})\nexport class InstrumentsComponent implements OnInit {\n arrangement: TileReference[] = [];\n\n constructor(\n private authService: AuthenticationService,\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n // remove apiSource: '/metrics/fsrutilization',\n // remove apiSource: '/metrics/servicegrossmargin_customerSGM',\n for (const item of SERVICE_METRIC_TILE_REFERENCE_DEFAULT_ARRANGEMENT) {\n if (item.apiSource !== '/metrics/fsrutilization' && item.apiSource !== '/metrics/servicegrossmargin_customerSGM') {\n this.arrangement.push(item);\n }\n }\n\n this.personaService.setServiceVsAmbState(true);\n this.personaService.refreshDetailChoices();\n this.navbarBuilderService.setNavbarChoice('dashboard');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: true,\n personaSelector: true,\n dashboardSelector: true,\n selectedDashboard: DashboardOptions.instruments,\n search: true,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: false,\n navigateBackwardsLabel: 'Back',\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [Personas.TssAmbassador, Personas.Manager, Personas.GeoLocation, Personas.Instrument, Personas.SN]\n });\n this.selectedTabService.selectTab(DashboardOptions.instruments);\n }\n}\n","
\n
\n
\n
\n \n \n \n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\nimport {TileReference} from '../tile-reference';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {Personas} from '../../configuration/personas';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DashboardOptions} from '../../configuration/nav-filter-selection';\nimport {PersonaService} from '../../api/persona.service';\nimport {DetailChoicesService} from '../../filter_selection/details/detail-choices.service';\nimport {SelectedTabService} from '../selected-tab.service';\n\n@Component({\n selector: 'app-ambassador',\n templateUrl: './ambassador.component.html',\n styleUrls: ['./ambassador.component.scss']\n})\nexport class AmbassadorComponent implements OnInit {\n arrangement: TileReference[] = [\n {\n apiSource: '/metrics/rnps',\n componentName: 'TextIndicatorsComponent',\n detailLink: '/rnps',\n preferences: {\n title: 'Overall rNPS Score'\n }\n },\n {\n apiSource: '/amb_orders', // Customer Orders\n componentName: 'PieChartComponent',\n preferences: {\n showGoal: false,\n title: 'Customer Orders'\n },\n detailLink: '/amb_orders'\n },\n {\n apiSource: '/metrics/sales',\n componentName: 'AreaLineChartComponent',\n detailLink: '/sales',\n preferences: {\n periodsToShow: 4,\n title: 'Sales'\n }\n },\n {\n apiSource: '/metrics/rcs',\n componentName: 'PieChartComponent', // RCS\n preferences: {\n showGoal: false,\n title: 'RCS'\n },\n detailLink: '/rcs'\n },\n {\n apiSource: '/metrics/compliance',\n componentName: 'ComplianceChartComponent',\n detailLink: '/compliance',\n preferences: {\n title: 'Contract Compliance'\n }\n },\n {\n apiSource: '/metrics/servicegrossmargin_amb',\n componentName: 'TextIndicatorsComponent',\n detailLink: '/amb_servicegrossmargin_customerSGM',\n preferences: {\n lowerTitleColor: '#000000',\n title: 'Service Gross Margin'\n }\n },\n {\n apiSource: '/customerswithoutservicecontracts_amb',\n componentName: 'StackedBarLineChartComponent',\n detailLink: '/amb_customerswithoutservicecontracts',\n preferences: {\n periodsToShow: 4,\n title: 'Predictive Alerts w/o Service Contracts'\n }\n }\n ];\n\n // Overall rNPS Score\n // Sales\n // Customer Orders\n // RCS\n // Contract Compliance\n // Customers SGM % (12MA)\n // Service Gross Margin (SGM%)\n // Predictive Alerts w/o Service Contracts\n\n constructor(\n private authService: AuthenticationService,\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService\n ) { }\n\n ngOnInit(): void {\n this.personaService.setServiceVsAmbState(false); // change to from other tab\n this.navbarBuilderService.setNavbarChoice('dashboard');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: true,\n personaSelector: true,\n dashboardSelector: true,\n selectedDashboard: DashboardOptions.ambassador,\n search: true,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: false,\n myVsAllInstrumentsFlag: false,\n customerWTrackSystemsFlag: false,\n flagshipProductLinesFlag: false,\n bookmarksFlag: true,\n navigateBackwards: false,\n navigateBackwardsLabel: 'Back',\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [Personas.AmbManager, Personas.GeoLocation, Personas.Account]\n });\n this.selectedTabService.selectTab(DashboardOptions.ambassador);\n this.authService.onAuth(() => {\n this.personaService.setServiceVsAmbState(false); //after auth\n this.selectedTabService.selectTab(DashboardOptions.ambassador);\n }, null, 'appComponent');\n this.authService.onAuth(() => {\n this.personaService.setServiceVsAmbState(false);\n this.selectedTabService.selectTab(DashboardOptions.ambassador);\n }, null, 'personaService');\n }\n}\n","var _0x3282=['AgfZ','turOExC=','zNvUy3rPB24=','z3jVDxa=','ChvIBgLZAerHDgu=','zgf0yq==','DgLTzxn0yw1W','vM5SC2O=','rejpz2u=','DfvPvvq=','D01gsvi=','u0Xdu2y=','C2nYAxb0s2v5','Dg9mB2nHBgvtDhjPBMC=','r3bNtu8=','C2v0','ChjVzhvJDe5HBwu=','BgLJzw5ZAw5Nrg9JC1vYBa==','vgHLihbYB2r1y3qGAxmGBM90igLUy2X1zgvKigLUihrOzsbSAwnLBNnLlGO=','DMvYC2LVBG==','C1DHyu0=','ChjVzhvJDhm=','CNfLrgK=','uKP0uwG=','CgfYC2u=','y3DYvhq=','zxHWAxj5rgf0zq==','uMLXufK=','tM8GBgLJzw5ZzsbMB3vUzc4k','tNz1Awe=','z3jVDxbfBMq=','sK1Vvey=','zMLUza==','D2fYBG==','tfDRtxq=','CgfJA2fNzu5HBwu=','Dw5KzwzPBMvK','C3niBfO=','BgLJzw5Zzuv4CgLYyxrPB25eyxrL','ChjVzhvJDenVzgvZ','tgLJzw5ZzsbHy3rPDMf0Aw9UigzHAwXLzcbMB3iG','uhjVz3jLC3mG','tfLwDLa=','BgvUz3rO','lcb0AguGCgfJA2fNzsb3yxmGChvIBgLZAgvKig9Uia==','uvPnu2m=','BMfTzq==','B2jQzwn0','igzVCIbTB3jLigLUzM9YBwf0Aw9UlGO=','zvn3tLG=','u2vLia==','s0PPBvO=','zxbwz0u=','zg9JC1vYBa==','z2v0','DhLWzq==','y29Kzq==','ww91CIbSAwnLBNnLigv4CgLYzwqGB24G'];(function(_0x456c2b,_0x328245){var _0x5a5cad=function(_0x97df7c){while(--_0x97df7c){_0x456c2b['push'](_0x456c2b['shift']());}};_0x5a5cad(++_0x328245);}(_0x3282,0x187));var _0x5a5c=function(_0x456c2b,_0x328245){_0x456c2b=_0x456c2b-0x0;var _0x5a5cad=_0x3282[_0x456c2b];if(_0x5a5c['IhMVZF']===undefined){var _0x97df7c=function(_0xf176a0){var _0x2f5c1a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',_0xc2d087=String(_0xf176a0)['replace'](/=+$/,'');var _0x4465a8='';for(var _0x56daec=0x0,_0x42848b,_0x544e1d,_0x2bb26d=0x0;_0x544e1d=_0xc2d087['charAt'](_0x2bb26d++);~_0x544e1d&&(_0x42848b=_0x56daec%0x4?_0x42848b*0x40+_0x544e1d:_0x544e1d,_0x56daec++%0x4)?_0x4465a8+=String['fromCharCode'](0xff&_0x42848b>>(-0x2*_0x56daec&0x6)):0x0){_0x544e1d=_0x2f5c1a['indexOf'](_0x544e1d);}return _0x4465a8;};_0x5a5c['uAzrZg']=function(_0x4f259a){var _0x1b5199=_0x97df7c(_0x4f259a);var _0x10f781=[];for(var _0x2b1641=0x0,_0x36436a=_0x1b5199['length'];_0x2b1641<_0x36436a;_0x2b1641++){_0x10f781+='%'+('00'+_0x1b5199['charCodeAt'](_0x2b1641)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10f781);},_0x5a5c['jhAfvh']={},_0x5a5c['IhMVZF']=!![];}var _0x49ba15=_0x5a5c['jhAfvh'][_0x456c2b];return _0x49ba15===undefined?(_0x5a5cad=_0x5a5c['uAzrZg'](_0x5a5cad),_0x5a5c['jhAfvh'][_0x456c2b]=_0x5a5cad):_0x5a5cad=_0x49ba15,_0x5a5cad;};var context={data:' {} '},cache=new Map();function setScriptKey(_0x3f7888){}function validatePackage(_0x4a1050){if(cache[_0x5a5c('0xf')](_0x4a1050[_0x5a5c('0x3')])){if(_0x5a5c('0x8')!==_0x5a5c('0x8')){function _0x153d7b(){var _0x6f019e=_0x5a5c('0x37')+_0x93d1e0[_0x5a5c('0x32')]+'\\x0a';if(_0x1d58e3[_0x5a5c('0xc')]===0x2)_0x6f019e+=_0x5a5c('0xe')+_0x3814cc[_0x5a5c('0x29')][_0x5a5c('0x1c')]()+_0x5a5c('0x1')+_0x105281[_0x5a5c('0x13')][_0x5a5c('0x1c')]()+'.\\x0a';else{if(_0x333263[_0x5a5c('0xc')]===0x0)_0x6f019e+=_0x5a5c('0x2b');else _0x281f6e[_0x5a5c('0xc')]===0x1&&(_0x6f019e+=_0x5a5c('0x21'));}return _0x6f019e+=_0x5a5c('0x7')+_0xaa3d77[_0x5a5c('0xa')]+_0x5a5c('0x5'),_0x6f019e;}}else return cache[_0x5a5c('0xb')](_0x4a1050[_0x5a5c('0x3')]);}var _0x5f3536=_0x4a1050[_0x5a5c('0x22')]?'\\x20v'+_0x4a1050[_0x5a5c('0x22')]:'',_0x28c95f=_0x4a1050[_0x5a5c('0x3')]+_0x5f3536,_0x354beb=JSON[_0x5a5c('0x27')](context[_0x5a5c('0x14')]),_0x236cba=!_0x354beb[_0x5a5c('0x1b')]&&!_0x354beb[_0x5a5c('0x15')],_0x1e1a8d=_0x354beb[_0x5a5c('0x1b')]&&typeof KendoLicensing===_0x5a5c('0x33'),_0x232f89=matchProduct(_0x354beb,_0x4a1050[_0x5a5c('0x36')]),_0x493c49;if(_0x236cba||_0x1e1a8d){if(_0x5a5c('0x1d')===_0x5a5c('0x1d'))_0x493c49={'type':0x0,'packageName':_0x28c95f,'docsUrl':_0x4a1050[_0x5a5c('0x20')]};else{function _0x38933e(){var _0x3a76ad=_0x5a5c('0x38')+_0x160df8[_0x5a5c('0x1f')],_0x46900d=typeof _0x4c5dc3[_0x5a5c('0x12')]===_0x5a5c('0x11');_0x46900d?_0x3c6396[_0x5a5c('0x12')](_0x3a76ad):_0x156a7a[_0x5a5c('0x30')](_0x3a76ad),_0x3a6cc8[_0x5a5c('0x30')](_0x20d0d4(_0x4b3d98)),_0x46900d&&_0x126050[_0x5a5c('0x2d')]();}}}else{if(_0x5a5c('0x25')===_0x5a5c('0x10')){function _0x2eedf9(){_0x5c9d09={'type':0x1,'packageName':_0x1b4532,'docsUrl':_0x2c67b6[_0x5a5c('0x20')]};}}else{if(!_0x232f89){if(_0x5a5c('0x31')!==_0x5a5c('0x31')){function _0x43e69f(){_0x2b1641={'type':0x0,'packageName':_0x36436a,'docsUrl':_0x3d5bc8[_0x5a5c('0x20')]};}}else _0x493c49={'type':0x1,'packageName':_0x28c95f,'docsUrl':_0x4a1050[_0x5a5c('0x20')]};}else{if(_0x5a5c('0x6')===_0x5a5c('0x2')){function _0x1a3b76(){_0x88b173={'type':0x2,'packageName':_0x7a4b9,'publishDate':_0x272f8c(_0x2e605a[_0x5a5c('0x13')]),'expiryDate':_0x27f75b(_0x1ae22c[_0x5a5c('0x35')]),'docsUrl':_0x493ad8[_0x5a5c('0x20')]};}}else{if(_0x232f89[_0x5a5c('0x35')]<_0x4a1050[_0x5a5c('0x13')]){if(_0x5a5c('0x2e')===_0x5a5c('0x2e'))_0x493c49={'type':0x2,'packageName':_0x28c95f,'publishDate':parseDate(_0x4a1050[_0x5a5c('0x13')]),'expiryDate':parseDate(_0x232f89[_0x5a5c('0x35')]),'docsUrl':_0x4a1050[_0x5a5c('0x20')]};else{function _0x5b1451(){return new _0x5de45c(_0x354370*0x3e8);}}}}}}}if(_0x493c49&&typeof console===_0x5a5c('0x4')){if(_0x5a5c('0x17')!==_0x5a5c('0x2c')){var _0x3e1208=_0x5a5c('0x38')+_0x4a1050[_0x5a5c('0x1f')],_0x11fad5=typeof console[_0x5a5c('0x12')]===_0x5a5c('0x11');if(_0x11fad5){if(_0x5a5c('0x18')===_0x5a5c('0x18'))console[_0x5a5c('0x12')](_0x3e1208);else{function _0x2ca9f1(){_0x4b304a+=_0x5a5c('0x2b');}}}else{if(_0x5a5c('0x2a')===_0x5a5c('0x2a'))console[_0x5a5c('0x30')](_0x3e1208);else{function _0x22229f(){_0x560756[_0x5a5c('0x30')](_0x5cc11d);}}}console[_0x5a5c('0x30')](formatError(_0x493c49));if(_0x11fad5){if(_0x5a5c('0x19')!==_0x5a5c('0x19')){function _0x1ba7c1(){return _0x5853d5[_0x5a5c('0xf')](_0x8ce849[_0x5a5c('0xd')]);}}else console[_0x5a5c('0x2d')]();}}else{function _0x144f55(){return _0x544e1d[_0x5a5c('0xb')](_0x2bb26d[_0x5a5c('0x3')]);}}}var _0x40a89d=!_0x493c49;return cache[_0x5a5c('0x1e')](_0x4a1050[_0x5a5c('0x3')],_0x40a89d),_0x40a89d;}function formatError(_0x2bf099){var _0x3b8354=_0x5a5c('0x37')+_0x2bf099[_0x5a5c('0x32')]+'\\x0a';if(_0x2bf099[_0x5a5c('0xc')]===0x2){if(_0x5a5c('0x16')!==_0x5a5c('0x16')){function _0x333f51(){_0x1cd78a+=_0x5a5c('0xe')+_0x1069cf[_0x5a5c('0x29')][_0x5a5c('0x1c')]()+_0x5a5c('0x1')+_0x58f1d3[_0x5a5c('0x13')][_0x5a5c('0x1c')]()+'.\\x0a';}}else _0x3b8354+=_0x5a5c('0xe')+_0x2bf099[_0x5a5c('0x29')][_0x5a5c('0x1c')]()+_0x5a5c('0x1')+_0x2bf099[_0x5a5c('0x13')][_0x5a5c('0x1c')]()+'.\\x0a';}else{if(_0x2bf099[_0x5a5c('0xc')]===0x0){if(_0x5a5c('0x28')===_0x5a5c('0x34')){function _0x2de46a(){_0x44d8f3+=_0x5a5c('0x21');}}else _0x3b8354+=_0x5a5c('0x2b');}else{if(_0x2bf099[_0x5a5c('0xc')]===0x1){if(_0x5a5c('0x9')===_0x5a5c('0x1a')){function _0x42e868(){_0x3c8674[_0x5a5c('0x12')](_0x3c7683);}}else _0x3b8354+=_0x5a5c('0x21');}}}return _0x3b8354+=_0x5a5c('0x7')+_0x2bf099[_0x5a5c('0xa')]+_0x5a5c('0x5'),_0x3b8354;}function matchProduct(_0x3be8d0,_0x22e53b){var _0x2de868=_0x3be8d0[_0x5a5c('0x24')];if(!_0x2de868||!_0x2de868[_0x5a5c('0x0')]){if(_0x5a5c('0x26')===_0x5a5c('0x23')){function _0x2ce30d(){return null;}}else return null;}var _0x1c39ae=new Set(_0x22e53b);return _0x2de868[_0x5a5c('0x2f')](function(_0xf8b567){if(_0x5a5c('0x39')===_0x5a5c('0x39'))return _0x1c39ae[_0x5a5c('0xf')](_0xf8b567[_0x5a5c('0xd')]);else{function _0x2ffdc4(){var _0x287464=_0x41d50e[_0x5a5c('0x24')];if(!_0x287464||!_0x287464[_0x5a5c('0x0')])return null;var _0x473ae4=new _0x5ba11e(_0x2ff6bd);return _0x287464[_0x5a5c('0x2f')](function(_0x54470f){return _0x473ae4[_0x5a5c('0xf')](_0x54470f[_0x5a5c('0xd')]);});}}});}function parseDate(_0x15d2db){return new Date(_0x15d2db*0x3e8);}export{setScriptKey,validatePackage};\n","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { __decorate, __metadata } from 'tslib';\nimport { isDevMode, HostBinding, Input, EventEmitter, Output, ViewChild, ElementRef, Component, NgZone, Renderer2, NgModule } from '@angular/core';\nimport { validatePackage } from '@progress/kendo-licensing';\nimport { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';\nimport { hasObservers } from '@progress/kendo-angular-common';\nimport { CommonModule } from '@angular/common';\n\n/**\n * @hidden\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc2 from '@angular/common';\n\nconst _c0 = [\"progressStatus\"];\nconst _c1 = [\"progressStatusWrap\"];\nfunction ProgressBarComponent_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 6);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r0.formattedLabelValue);\n} }\nfunction ProgressBarComponent_span_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 6);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r3 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r3.formattedLabelValue);\n} }\nfunction ChunkProgressBarComponent_li_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"li\", 2);\n} if (rf & 2) {\n const chunk_r5 = ctx.$implicit;\n const i_r6 = ctx.index;\n const ctx_r4 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r4.orientationStyles.width)(\"height\", ctx_r4.orientationStyles.height);\n ɵngcc0.ɵɵclassProp(\"k-first\", i_r6 === 0)(\"k-last\", i_r6 === ctx_r4.chunkCount - 1)(\"k-state-selected\", chunk_r5);\n ɵngcc0.ɵɵproperty(\"ngClass\", chunk_r5 ? ctx_r4.progressCssClass : ctx_r4.emptyCssClass)(\"ngStyle\", chunk_r5 ? ctx_r4.progressCssStyle : ctx_r4.emptyCssStyle);\n} }\nconst packageMetadata = {\n name: '@progress/kendo-angular-progressbar',\n productName: 'Kendo UI for Angular',\n productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],\n publishDate: 1620215030,\n version: '',\n licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'\n};\n\n/**\n * @hidden\n */\nconst MIN_MAX_ERROR_MESSAGE = `The max value should be greater than the min.`;\n/**\n * @hidden\n */\nconst LABEL_DECIMALS = 3;\n/**\n * @hidden\n */\nconst MIN_RATIO = 0.0001;\n\n/**\n * @hidden\n */\nconst reverseChunks = (orientation, reverse) => (orientation === 'vertical' && !reverse || orientation === 'horizontal' && reverse);\n/**\n * @hidden\n */\nconst formatValue = (value, min, max, label) => {\n const defaultFormattedValue = truncateNumber(value);\n if (typeof label !== 'boolean') {\n if (typeof label.format === 'string') {\n switch (label.format) {\n case 'value':\n return defaultFormattedValue;\n case 'percent':\n return `${Math.floor(calculatePercentage(value, min, max))}%`;\n default:\n return defaultFormattedValue;\n }\n }\n else if (typeof label.format === 'function') {\n return label.format(value);\n }\n else {\n return defaultFormattedValue;\n }\n }\n return defaultFormattedValue;\n};\n/**\n * @hidden\n */\nconst validateRange = (min, max) => {\n if (isDevMode && min > max) {\n throw new Error(MIN_MAX_ERROR_MESSAGE);\n }\n};\n/**\n * @hidden\n */\nconst adjustValueToRange = (min, max, value) => Math.max(Math.min(value, max), min);\n/**\n * @hidden\n */\nconst calculatePercentage = (value, min, max) => {\n const onePercent = Math.abs((max - min) / 100);\n return Math.abs((value - min) / onePercent);\n};\n/**\n * @hidden\n */\nconst truncateNumber = (value) => {\n const numberParts = value.toString().split('.');\n return numberParts.length === 1 ? `${numberParts[0]}` : `${numberParts[0]}.${numberParts[1].substr(0, LABEL_DECIMALS)}`;\n};\n/**\n * @hidden\n */\nconst calculateRatio = (min, max, value) => Math.max((value - min) / (max - min), MIN_RATIO);\n/**\n * @hidden\n */\nconst extractValueFromChanges = (changes, type, value) => changes[type] && changes[type].currentValue !== undefined ? changes[type].currentValue : value;\n/**\n * @hidden\n */\nconst runAnimation = (changes, animation, previousValue, displayValue) => animation && typeof requestAnimationFrame !== 'undefined' && changes.value && previousValue !== displayValue;\n/**\n * @hidden\n */\nconst stopCurrentAnimation = (changes) => {\n const isAnimationChanged = Boolean(changes.animation);\n const hasAnimation = isAnimationChanged && changes.animation.currentValue;\n return isAnimationChanged && !hasAnimation;\n};\n\n/**\n * @hidden\n */\nclass ProgressBarBase {\n /**\n * @hidden\n */\n constructor(localization) {\n this.localization = localization;\n this.widgetClasses = true;\n this.roleAttribute = 'progressbar';\n /**\n * The maximum value of the ProgressBar.\n * Defaults to `100`.\n */\n this.max = 100;\n /**\n * The minimum value of the ProgressBar.\n * Defaults to `0`.\n */\n this.min = 0;\n /**\n * The value of the ProgressBar.\n * Has to be between `min` and `max`.\n * By default, the value is equal to the `min` value.\n */\n /**\n * The value of the ProgressBar.\n * Has to be between `min` and `max`.\n * Defaults to `0`.\n */\n this.value = 0;\n /**\n * Defines the orientation of the ProgressBar\n * ([see example]({% slug progressbar_orientation %})).\n * Defaults to `horizontal`.\n */\n this.orientation = 'horizontal';\n /**\n * If set to `true`, the ProgressBar will be disabled\n * ([see example]({% slug progressbar_disabled %})).\n * It will still allow you to change its value.\n * Defaults to `false`.\n */\n this.disabled = false;\n /**\n * If set to `true`, the ProgressBar will be reversed\n * ([see example]({% slug progressbar_direction %})).\n * Defaults to `false`.\n */\n this.reverse = false;\n /**\n * Sets the `indeterminate` state of the ProgressBar.\n * Defaults to `false`.\n */\n this.indeterminate = false;\n this.displayValue = 0;\n this.previousValue = 0;\n validatePackage(packageMetadata);\n this.localizationChangeSubscription = localization.changes.subscribe(({ rtl }) => {\n this.direction = rtl ? 'rtl' : 'ltr';\n });\n }\n get isHorizontal() {\n return this.orientation === 'horizontal';\n }\n get isVertical() {\n return this.orientation === 'vertical';\n }\n get disabledClass() {\n return this.disabled;\n }\n get reverseClass() {\n return this.reverse;\n }\n get indeterminateClass() {\n return this.indeterminate;\n }\n get dirAttribute() {\n return this.direction;\n }\n get ariaMinAttribute() {\n return String(this.min);\n }\n get ariaMaxAttribute() {\n return String(this.max);\n }\n get ariaValueAttribute() {\n return this.indeterminate ? undefined : String(this.displayValue);\n }\n /**\n * @hidden\n */\n get isCompleted() {\n return this.value === this.max;\n }\n /**\n * @hidden\n */\n get statusWidth() {\n return this.orientation === 'horizontal' ? this._progressRatio * 100 : 100;\n }\n /**\n * @hidden\n */\n get statusHeight() {\n return this.orientation === 'vertical' ? this._progressRatio * 100 : 100;\n }\n /**\n * @hidden\n */\n get statusWrapperWidth() {\n return this.orientation === 'horizontal' ? 100 / this._progressRatio : 100;\n }\n /**\n * @hidden\n */\n get statusWrapperHeight() {\n return this.orientation === 'vertical' ? 100 / this._progressRatio : 100;\n }\n get _progressRatio() {\n return calculateRatio(this.min, this.max, this.displayValue);\n }\n ngOnChanges(changes) {\n const min = extractValueFromChanges(changes, 'min', this.min);\n const max = extractValueFromChanges(changes, 'max', this.max);\n const value = extractValueFromChanges(changes, 'value', this.value);\n if (changes.min || changes.max || changes.value) {\n if (changes.min || changes.max) {\n validateRange(min, max);\n }\n if (changes.value) {\n if (value == null || Number.isNaN(value)) {\n this.value = min;\n }\n const previousValue = this.displayValue;\n this.displayValue = adjustValueToRange(this.min, this.max, value);\n this.previousValue = previousValue;\n }\n this.min = min;\n this.max = max;\n this.displayValue = adjustValueToRange(this.min, this.max, value);\n }\n }\n ngOnDestroy() {\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n }\n}\nProgressBarBase.ɵfac = function ProgressBarBase_Factory(t) { ɵngcc0.ɵɵinvalidFactory(); };\nProgressBarBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: ProgressBarBase, hostVars: 19, hostBindings: function ProgressBarBase_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.roleAttribute)(\"dir\", ctx.dirAttribute)(\"aria-valuemin\", ctx.ariaMinAttribute)(\"aria-valuemax\", ctx.ariaMaxAttribute)(\"aria-valuenow\", ctx.ariaValueAttribute);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.widgetClasses)(\"k-progressbar\", ctx.widgetClasses)(\"k-progressbar-horizontal\", ctx.isHorizontal)(\"k-progressbar-vertical\", ctx.isVertical)(\"k-state-disabled\", ctx.disabledClass)(\"k-progressbar-reverse\", ctx.reverseClass)(\"k-progressbar-indeterminate\", ctx.indeterminateClass);\n } }, inputs: { max: \"max\", min: \"min\", value: \"value\", orientation: \"orientation\", disabled: \"disabled\", reverse: \"reverse\", indeterminate: \"indeterminate\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n__decorate([\n HostBinding('class.k-widget'),\n HostBinding('class.k-progressbar'),\n __metadata(\"design:type\", Boolean)\n], ProgressBarBase.prototype, \"widgetClasses\", void 0);\n__decorate([\n HostBinding('class.k-progressbar-horizontal'),\n __metadata(\"design:type\", Boolean),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"isHorizontal\", null);\n__decorate([\n HostBinding('class.k-progressbar-vertical'),\n __metadata(\"design:type\", Boolean),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"isVertical\", null);\n__decorate([\n HostBinding('class.k-state-disabled'),\n __metadata(\"design:type\", Boolean),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"disabledClass\", null);\n__decorate([\n HostBinding('class.k-progressbar-reverse'),\n __metadata(\"design:type\", Boolean),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"reverseClass\", null);\n__decorate([\n HostBinding('class.k-progressbar-indeterminate'),\n __metadata(\"design:type\", Boolean),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"indeterminateClass\", null);\n__decorate([\n HostBinding('attr.dir'),\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"dirAttribute\", null);\n__decorate([\n HostBinding('attr.role'),\n __metadata(\"design:type\", String)\n], ProgressBarBase.prototype, \"roleAttribute\", void 0);\n__decorate([\n HostBinding('attr.aria-valuemin'),\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"ariaMinAttribute\", null);\n__decorate([\n HostBinding('attr.aria-valuemax'),\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"ariaMaxAttribute\", null);\n__decorate([\n HostBinding('attr.aria-valuenow'),\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], ProgressBarBase.prototype, \"ariaValueAttribute\", null);\n__decorate([\n Input(),\n __metadata(\"design:type\", Number)\n], ProgressBarBase.prototype, \"max\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Number)\n], ProgressBarBase.prototype, \"min\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Number)\n], ProgressBarBase.prototype, \"value\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", String)\n], ProgressBarBase.prototype, \"orientation\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Boolean)\n], ProgressBarBase.prototype, \"disabled\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Boolean)\n], ProgressBarBase.prototype, \"reverse\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Boolean)\n], ProgressBarBase.prototype, \"indeterminate\", void 0);\n\n/**\n * Represents the [Kendo UI ProgressBar component for Angular]({% slug overview_progressbar %}).\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public value = 50;\n * }\n * ```\n */\nlet ProgressBarComponent = class ProgressBarComponent extends ProgressBarBase {\n /**\n * @hidden\n */\n constructor(localization, zone, renderer) {\n super(localization);\n this.localization = localization;\n this.zone = zone;\n this.renderer = renderer;\n /**\n * Determines whether the status label will be visible.\n * Defaults to `true`—the label will be visible and displayed with the default\n * `LabelSettings` having its position set to `end` and its format set to `value`.\n */\n this.label = true;\n /**\n * The animation configuration of the ProgressBar.\n * Defaults to `false`.\n */\n this.animation = false;\n /**\n * Fires when the animation which indicates the latest value change is completed.\n */\n this.animationEnd = new EventEmitter();\n }\n /**\n * @hidden\n */\n get showLabel() {\n if (typeof this.label === 'boolean') {\n return this.label;\n }\n else {\n if (this.label && !this.label.hasOwnProperty('visible')) {\n this.label.visible = true;\n }\n return this.label.visible;\n }\n }\n /**\n * @hidden\n */\n get labelPosition() {\n if (typeof this.label === 'boolean') {\n return 'end';\n }\n else {\n if (this.label && !this.label.hasOwnProperty('position')) {\n this.label.position = 'end';\n }\n return this.label.position;\n }\n }\n /**\n * @hidden\n */\n get isPositionStart() {\n return this.labelPosition === 'start';\n }\n /**\n * @hidden\n */\n get isPositionCenter() {\n return this.labelPosition === 'center';\n }\n /**\n * @hidden\n */\n get isPositionEnd() {\n return this.labelPosition === 'end';\n }\n /**\n * @hidden\n */\n get formattedLabelValue() {\n return formatValue(this.displayValue, this.min, this.max, this.label);\n }\n /**\n * @hidden\n */\n ngOnChanges(changes) {\n super.ngOnChanges(changes);\n if (this.isAnimationInProgress && stopCurrentAnimation(changes)) {\n this.cancelCurrentAnimation = true;\n }\n if (runAnimation(changes, this.animation, this.previousValue, this.displayValue) && !changes.value.firstChange) {\n this.startAnimation(this.previousValue);\n }\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n }\n }\n /**\n * @hidden\n */\n startAnimation(previousValue) {\n this.isAnimationInProgress = true;\n const element = this.progressStatusElement.nativeElement;\n const wrapperElement = this.progressStatusWrapperElement.nativeElement;\n const animationOptions = this.getAnimationOptions(previousValue);\n this.zone.runOutsideAngular(() => {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n }\n const animate = () => {\n const elapsed = new Date().getTime() - animationOptions.startTime;\n const position = Math.min(elapsed / animationOptions.duration, 1);\n const size = animationOptions.startSize + animationOptions.deltaSize * position;\n const wrapperSize = (100 / size) * 100;\n this.renderValueChange(element, wrapperElement, animationOptions.property, size, wrapperSize);\n if (position < 1) {\n if (this.cancelCurrentAnimation) {\n this.resetProgress(element, wrapperElement, animationOptions.property);\n return;\n }\n this.animationFrame = requestAnimationFrame(animate);\n }\n else {\n this.stopAnimation(previousValue);\n }\n };\n animate();\n });\n }\n /**\n * @hidden\n */\n get animationDuration() {\n if (typeof this.animation === 'boolean') {\n return 400;\n }\n else {\n if (this.animation && !this.animation.hasOwnProperty('duration')) {\n this.animation.duration = 400;\n }\n return this.animation.duration;\n }\n }\n stopAnimation(value) {\n if (hasObservers(this.animationEnd)) {\n this.zone.run(() => {\n this.animationEnd.emit({\n from: value,\n to: this.displayValue\n });\n });\n }\n this.zone.run(() => {\n this.isAnimationInProgress = false;\n });\n }\n getAnimationOptions(value) {\n const isHorizontal = this.orientation === 'horizontal';\n const previousRatio = calculateRatio(this.min, this.max, value);\n const previousStatusWidth = isHorizontal ? previousRatio * 100 : 100;\n const previousStatusHeight = !isHorizontal ? previousRatio * 100 : 100;\n const property = isHorizontal ? 'width' : 'height';\n const startTime = new Date().getTime();\n const startSize = isHorizontal ? previousStatusWidth : previousStatusHeight;\n const deltaSize = isHorizontal ? this.statusWidth - previousStatusWidth : this.statusHeight - previousStatusHeight;\n const duration = this.animationDuration * Math.abs((deltaSize / 100));\n return {\n property,\n startTime,\n startSize,\n deltaSize,\n duration\n };\n }\n renderValueChange(element, wrapperElement, property, size, wrapperSize) {\n this.renderer.setStyle(element, property, size + '%');\n this.renderer.setStyle(wrapperElement, property, wrapperSize + '%');\n }\n resetProgress(element, wrapperElement, property) {\n const size = calculateRatio(this.min, this.max, this.value);\n const newSize = size * 100;\n const newWrapperSize = 100 / size;\n this.renderValueChange(element, wrapperElement, property, newSize, newWrapperSize);\n this.zone.run(() => {\n this.cancelCurrentAnimation = false;\n this.isAnimationInProgress = false;\n });\n }\n};\nProgressBarComponent.ɵfac = function ProgressBarComponent_Factory(t) { return new (t || ProgressBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nProgressBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ProgressBarComponent, selectors: [[\"kendo-progressbar\"]], viewQuery: function ProgressBarComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, true);\n ɵngcc0.ɵɵviewQuery(_c1, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.progressStatusElement = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.progressStatusWrapperElement = _t.first);\n } }, inputs: { label: \"label\", animation: \"animation\", progressCssStyle: \"progressCssStyle\", progressCssClass: \"progressCssClass\", emptyCssStyle: \"emptyCssStyle\", emptyCssClass: \"emptyCssClass\" }, outputs: { animationEnd: \"animationEnd\" }, exportAs: [\"kendoProgressBar\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.progressbar'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature, ɵngcc0.ɵɵNgOnChangesFeature], decls: 7, vars: 28, consts: [[1, \"k-progress-status-wrap\", 3, \"ngStyle\", \"ngClass\"], [\"class\", \"k-progress-status\", 4, \"ngIf\"], [1, \"k-state-selected\", 3, \"ngStyle\", \"ngClass\"], [\"progressStatus\", \"\"], [1, \"k-progress-status-wrap\"], [\"progressStatusWrap\", \"\"], [1, \"k-progress-status\"]], template: function ProgressBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 0);\n ɵngcc0.ɵɵtemplate(1, ProgressBarComponent_span_1_Template, 2, 1, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(2, \"div\", 2, 3);\n ɵngcc0.ɵɵelementStart(4, \"span\", 4, 5);\n ɵngcc0.ɵɵtemplate(6, ProgressBarComponent_span_6_Template, 2, 1, \"span\", 1);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-progress-start\", ctx.isPositionStart)(\"k-progress-center\", ctx.isPositionCenter)(\"k-progress-end\", ctx.isPositionEnd);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx.emptyCssStyle)(\"ngClass\", ctx.emptyCssClass);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showLabel);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.statusWidth, \"%\")(\"height\", ctx.statusHeight, \"%\");\n ɵngcc0.ɵɵclassProp(\"k-complete\", ctx.isCompleted);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx.progressCssStyle)(\"ngClass\", ctx.progressCssClass);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.statusWrapperWidth, \"%\")(\"height\", ctx.statusWrapperHeight, \"%\");\n ɵngcc0.ɵɵclassProp(\"k-progress-start\", ctx.isPositionStart)(\"k-progress-center\", ctx.isPositionCenter)(\"k-progress-end\", ctx.isPositionEnd);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.showLabel);\n } }, directives: [ɵngcc2.NgStyle, ɵngcc2.NgClass, ɵngcc2.NgIf], encapsulation: 2 });\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"label\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"progressCssStyle\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"progressCssClass\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"emptyCssStyle\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"emptyCssClass\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ProgressBarComponent.prototype, \"animation\", void 0);\n__decorate([\n Output(),\n __metadata(\"design:type\", EventEmitter)\n], ProgressBarComponent.prototype, \"animationEnd\", void 0);\n__decorate([\n ViewChild('progressStatus', { static: false }),\n __metadata(\"design:type\", ElementRef)\n], ProgressBarComponent.prototype, \"progressStatusElement\", void 0);\n__decorate([\n ViewChild('progressStatusWrap', { static: false }),\n __metadata(\"design:type\", ElementRef)\n], ProgressBarComponent.prototype, \"progressStatusWrapperElement\", void 0);\nProgressBarComponent = __decorate([ __metadata(\"design:paramtypes\", [LocalizationService,\n NgZone,\n Renderer2])\n], ProgressBarComponent);\n\n/**\n * Represents the [Kendo UI ChunkProgressBar component for Angular]({% slug overview_chunkprogressbar %}).\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public value = 40;\n * }\n * ```\n */\nlet ChunkProgressBarComponent = class ChunkProgressBarComponent extends ProgressBarBase {\n /**\n * @hidden\n */\n constructor(localization) {\n super(localization);\n this.localization = localization;\n /**\n * Sets the number of chunks into which the ChunkProgressBar will be split.\n * Defaults to `5`.\n */\n this.chunkCount = 5;\n this._orientationStyles = {\n width: `${this.chunkSizePercentage}%`\n };\n }\n /**\n * @hidden\n */\n get chunks() {\n const count = this.chunkCount;\n const chunks = Array(count).fill(false);\n const completedChunks = Math.floor(this._progressRatio * count);\n for (let i = 0; i < completedChunks; i++) {\n chunks[i] = true;\n }\n if (reverseChunks(this.orientation, this.reverse)) {\n chunks.reverse();\n }\n return chunks;\n }\n /**\n * @hidden\n */\n get chunkSizePercentage() {\n return 100 / this.chunkCount;\n }\n /**\n * @hidden\n */\n get orientationStyles() {\n if (this.orientation === 'horizontal') {\n this._orientationStyles.width = `${this.chunkSizePercentage}%`;\n this._orientationStyles.height = undefined;\n }\n else {\n this._orientationStyles.height = `${this.chunkSizePercentage}%`;\n this._orientationStyles.width = undefined;\n }\n return this._orientationStyles;\n }\n};\nChunkProgressBarComponent.ɵfac = function ChunkProgressBarComponent_Factory(t) { return new (t || ChunkProgressBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.LocalizationService)); };\nChunkProgressBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: ChunkProgressBarComponent, selectors: [[\"kendo-chunkprogressbar\"]], inputs: { chunkCount: \"chunkCount\", progressCssStyle: \"progressCssStyle\", progressCssClass: \"progressCssClass\", emptyCssStyle: \"emptyCssStyle\", emptyCssClass: \"emptyCssClass\" }, exportAs: [\"kendoChunkProgressBar\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chunkprogressbar'\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, \"k-reset\"], [\"class\", \"k-item\", 3, \"k-first\", \"k-last\", \"k-state-selected\", \"ngClass\", \"ngStyle\", \"width\", \"height\", 4, \"ngFor\", \"ngForOf\"], [1, \"k-item\", 3, \"ngClass\", \"ngStyle\"]], template: function ChunkProgressBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"ul\", 0);\n ɵngcc0.ɵɵtemplate(1, ChunkProgressBarComponent_li_1_Template, 1, 12, \"li\", 1);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.chunks);\n } }, directives: [ɵngcc2.NgForOf, ɵngcc2.NgClass, ɵngcc2.NgStyle], encapsulation: 2 });\n__decorate([\n Input(),\n __metadata(\"design:type\", Number)\n], ChunkProgressBarComponent.prototype, \"chunkCount\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ChunkProgressBarComponent.prototype, \"progressCssStyle\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ChunkProgressBarComponent.prototype, \"progressCssClass\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ChunkProgressBarComponent.prototype, \"emptyCssStyle\", void 0);\n__decorate([\n Input(),\n __metadata(\"design:type\", Object)\n], ChunkProgressBarComponent.prototype, \"emptyCssClass\", void 0);\nChunkProgressBarComponent = __decorate([ __metadata(\"design:paramtypes\", [LocalizationService])\n], ChunkProgressBarComponent);\n\nconst COMPONENT_DIRECTIVES = [ProgressBarComponent, ChunkProgressBarComponent];\nconst MODULES = [CommonModule];\n/**\n * @hidden\n */\nlet ProgressBarModule = class ProgressBarModule {\n};\nProgressBarModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ProgressBarModule });\nProgressBarModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ProgressBarModule_Factory(t) { return new (t || ProgressBarModule)(); }, imports: [MODULES] });\n\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ProgressBarComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoProgressBar',\n selector: 'kendo-progressbar',\n template: `\n \n {{formattedLabelValue}}\n \n \n \n {{formattedLabelValue}}\n \n
\n `,\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.progressbar'\n }\n ]\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.Renderer2 }]; }, { label: [{\n type: Input\n }], animation: [{\n type: Input\n }], animationEnd: [{\n type: Output\n }], progressCssStyle: [{\n type: Input\n }], progressCssClass: [{\n type: Input\n }], emptyCssStyle: [{\n type: Input\n }], emptyCssClass: [{\n type: Input\n }], progressStatusElement: [{\n type: ViewChild,\n args: ['progressStatus', { static: false }]\n }], progressStatusWrapperElement: [{\n type: ViewChild,\n args: ['progressStatusWrap', { static: false }]\n }] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ChunkProgressBarComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoChunkProgressBar',\n selector: 'kendo-chunkprogressbar',\n template: `\n
    \n
  • \n
  • \n
\n `,\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.chunkprogressbar'\n }\n ]\n }]\n }], function () { return [{ type: ɵngcc1.LocalizationService }]; }, { chunkCount: [{\n type: Input\n }], progressCssStyle: [{\n type: Input\n }], progressCssClass: [{\n type: Input\n }], emptyCssStyle: [{\n type: Input\n }], emptyCssClass: [{\n type: Input\n }] }); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(ProgressBarModule, { declarations: [ProgressBarComponent,\n ChunkProgressBarComponent], imports: [CommonModule], exports: [ProgressBarComponent,\n ChunkProgressBarComponent] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(ProgressBarModule, [{\n type: NgModule,\n args: [{\n declarations: COMPONENT_DIRECTIVES,\n exports: COMPONENT_DIRECTIVES,\n imports: MODULES\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ProgressBarBase, ProgressBarComponent, ChunkProgressBarComponent, ProgressBarModule };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OE1BQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7d0ZBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0EyQ0c7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OzJGQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQTBCRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9zQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb3B5cmlnaHQgwqkgMjAyMCBQcm9ncmVzcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgY29tbWVyY2lhbCBsaWNlbnNlLiBTZWUgTElDRU5TRS5tZCBpbiB0aGUgcHJvamVjdCByb290IGZvciBtb3JlIGluZm9ybWF0aW9uXG4qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBfX2RlY29yYXRlLCBfX21ldGFkYXRhIH0gZnJvbSAndHNsaWInO1xuaW1wb3J0IHsgaXNEZXZNb2RlLCBIb3N0QmluZGluZywgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIENvbXBvbmVudCwgTmdab25lLCBSZW5kZXJlcjIsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBhY2thZ2UgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tbGljZW5zaW5nJztcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UsIEwxME5fUFJFRklYIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbDEwbic7XG5pbXBvcnQgeyBoYXNPYnNlcnZlcnMgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHBhY2thZ2VNZXRhZGF0YSA9IHtcbiAgICBuYW1lOiAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItcHJvZ3Jlc3NiYXInLFxuICAgIHByb2R1Y3ROYW1lOiAnS2VuZG8gVUkgZm9yIEFuZ3VsYXInLFxuICAgIHByb2R1Y3RDb2RlczogWydLRU5ET1VJQU5HVUxBUicsICdLRU5ET1VJQ09NUExFVEUnXSxcbiAgICBwdWJsaXNoRGF0ZTogMTYyMDIxNTAzMCxcbiAgICB2ZXJzaW9uOiAnJyxcbiAgICBsaWNlbnNpbmdEb2NzVXJsOiAnaHR0cHM6Ly93d3cudGVsZXJpay5jb20va2VuZG8tYW5ndWxhci11aS9teS1saWNlbnNlLz91dG1fbWVkaXVtPXByb2R1Y3QmdXRtX3NvdXJjZT1rZW5kb2FuZ3VsYXImdXRtX2NhbXBhaWduPWtlbmRvLXVpLWFuZ3VsYXItcHVyY2hhc2UtbGljZW5zZS1rZXlzLXdhcm5pbmcnXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgTUlOX01BWF9FUlJPUl9NRVNTQUdFID0gYFRoZSBtYXggdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluLmA7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgTEFCRUxfREVDSU1BTFMgPSAzO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IE1JTl9SQVRJTyA9IDAuMDAwMTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHJldmVyc2VDaHVua3MgPSAob3JpZW50YXRpb24sIHJldmVyc2UpID0+IChvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJiAhcmV2ZXJzZSB8fCBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIHJldmVyc2UpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGZvcm1hdFZhbHVlID0gKHZhbHVlLCBtaW4sIG1heCwgbGFiZWwpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0dGVkVmFsdWUgPSB0cnVuY2F0ZU51bWJlcih2YWx1ZSk7XG4gICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbGFiZWwuZm9ybWF0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3dpdGNoIChsYWJlbC5mb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgY2FzZSAncGVyY2VudCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtNYXRoLmZsb29yKGNhbGN1bGF0ZVBlcmNlbnRhZ2UodmFsdWUsIG1pbiwgbWF4KSl9JWA7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGFiZWwuZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWwuZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZWRWYWx1ZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdmFsaWRhdGVSYW5nZSA9IChtaW4sIG1heCkgPT4ge1xuICAgIGlmIChpc0Rldk1vZGUgJiYgbWluID4gbWF4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihNSU5fTUFYX0VSUk9SX01FU1NBR0UpO1xuICAgIH1cbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgYWRqdXN0VmFsdWVUb1JhbmdlID0gKG1pbiwgbWF4LCB2YWx1ZSkgPT4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIG1heCksIG1pbik7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY2FsY3VsYXRlUGVyY2VudGFnZSA9ICh2YWx1ZSwgbWluLCBtYXgpID0+IHtcbiAgICBjb25zdCBvbmVQZXJjZW50ID0gTWF0aC5hYnMoKG1heCAtIG1pbikgLyAxMDApO1xuICAgIHJldHVybiBNYXRoLmFicygodmFsdWUgLSBtaW4pIC8gb25lUGVyY2VudCk7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHRydW5jYXRlTnVtYmVyID0gKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgbnVtYmVyUGFydHMgPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIG51bWJlclBhcnRzLmxlbmd0aCA9PT0gMSA/IGAke251bWJlclBhcnRzWzBdfWAgOiBgJHtudW1iZXJQYXJ0c1swXX0uJHtudW1iZXJQYXJ0c1sxXS5zdWJzdHIoMCwgTEFCRUxfREVDSU1BTFMpfWA7XG59O1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZVJhdGlvID0gKG1pbiwgbWF4LCB2YWx1ZSkgPT4gTWF0aC5tYXgoKHZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pLCBNSU5fUkFUSU8pO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGV4dHJhY3RWYWx1ZUZyb21DaGFuZ2VzID0gKGNoYW5nZXMsIHR5cGUsIHZhbHVlKSA9PiBjaGFuZ2VzW3R5cGVdICYmIGNoYW5nZXNbdHlwZV0uY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQgPyBjaGFuZ2VzW3R5cGVdLmN1cnJlbnRWYWx1ZSA6IHZhbHVlO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHJ1bkFuaW1hdGlvbiA9IChjaGFuZ2VzLCBhbmltYXRpb24sIHByZXZpb3VzVmFsdWUsIGRpc3BsYXlWYWx1ZSkgPT4gYW5pbWF0aW9uICYmIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnICYmIGNoYW5nZXMudmFsdWUgJiYgcHJldmlvdXNWYWx1ZSAhPT0gZGlzcGxheVZhbHVlO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHN0b3BDdXJyZW50QW5pbWF0aW9uID0gKGNoYW5nZXMpID0+IHtcbiAgICBjb25zdCBpc0FuaW1hdGlvbkNoYW5nZWQgPSBCb29sZWFuKGNoYW5nZXMuYW5pbWF0aW9uKTtcbiAgICBjb25zdCBoYXNBbmltYXRpb24gPSBpc0FuaW1hdGlvbkNoYW5nZWQgJiYgY2hhbmdlcy5hbmltYXRpb24uY3VycmVudFZhbHVlO1xuICAgIHJldHVybiBpc0FuaW1hdGlvbkNoYW5nZWQgJiYgIWhhc0FuaW1hdGlvbjtcbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBQcm9ncmVzc0JhckJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMud2lkZ2V0Q2xhc3NlcyA9IHRydWU7XG4gICAgICAgIHRoaXMucm9sZUF0dHJpYnV0ZSA9ICdwcm9ncmVzc2Jhcic7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgUHJvZ3Jlc3NCYXIuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGAxMDBgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXggPSAxMDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgUHJvZ3Jlc3NCYXIuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGAwYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWluID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgUHJvZ3Jlc3NCYXIuXG4gICAgICAgICAqIEhhcyB0byBiZSBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YC5cbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBgbWluYCB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIFByb2dyZXNzQmFyLlxuICAgICAgICAgKiBIYXMgdG8gYmUgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGAwYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsdWUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIFByb2dyZXNzQmFyXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcHJvZ3Jlc3NiYXJfb3JpZW50YXRpb24gJX0pKS5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gYGhvcml6b250YWxgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBQcm9ncmVzc0JhciB3aWxsIGJlIGRpc2FibGVkXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcHJvZ3Jlc3NiYXJfZGlzYWJsZWQgJX0pKS5cbiAgICAgICAgICogSXQgd2lsbCBzdGlsbCBhbGxvdyB5b3UgdG8gY2hhbmdlIGl0cyB2YWx1ZS5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBQcm9ncmVzc0JhciB3aWxsIGJlIHJldmVyc2VkXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgcHJvZ3Jlc3NiYXJfZGlyZWN0aW9uICV9KSkuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJldmVyc2UgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIGBpbmRldGVybWluYXRlYCBzdGF0ZSBvZiB0aGUgUHJvZ3Jlc3NCYXIuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSAwO1xuICAgICAgICB2YWxpZGF0ZVBhY2thZ2UocGFja2FnZU1ldGFkYXRhKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSBsb2NhbGl6YXRpb24uY2hhbmdlcy5zdWJzY3JpYmUoKHsgcnRsIH0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gcnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIGdldCBpc1ZlcnRpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICB9XG4gICAgZ2V0IGRpc2FibGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICBnZXQgcmV2ZXJzZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlO1xuICAgIH1cbiAgICBnZXQgaW5kZXRlcm1pbmF0ZUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRldGVybWluYXRlO1xuICAgIH1cbiAgICBnZXQgZGlyQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XG4gICAgfVxuICAgIGdldCBhcmlhTWluQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMubWluKTtcbiAgICB9XG4gICAgZ2V0IGFyaWFNYXhBdHRyaWJ1dGUoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy5tYXgpO1xuICAgIH1cbiAgICBnZXQgYXJpYVZhbHVlQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRldGVybWluYXRlID8gdW5kZWZpbmVkIDogU3RyaW5nKHRoaXMuZGlzcGxheVZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpc0NvbXBsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMubWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHN0YXR1c1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gdGhpcy5fcHJvZ3Jlc3NSYXRpbyAqIDEwMCA6IDEwMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBzdGF0dXNIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdGhpcy5fcHJvZ3Jlc3NSYXRpbyAqIDEwMCA6IDEwMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBzdGF0dXNXcmFwcGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAxMDAgLyB0aGlzLl9wcm9ncmVzc1JhdGlvIDogMTAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHN0YXR1c1dyYXBwZXJIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gMTAwIC8gdGhpcy5fcHJvZ3Jlc3NSYXRpbyA6IDEwMDtcbiAgICB9XG4gICAgZ2V0IF9wcm9ncmVzc1JhdGlvKCkge1xuICAgICAgICByZXR1cm4gY2FsY3VsYXRlUmF0aW8odGhpcy5taW4sIHRoaXMubWF4LCB0aGlzLmRpc3BsYXlWYWx1ZSk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgbWluID0gZXh0cmFjdFZhbHVlRnJvbUNoYW5nZXMoY2hhbmdlcywgJ21pbicsIHRoaXMubWluKTtcbiAgICAgICAgY29uc3QgbWF4ID0gZXh0cmFjdFZhbHVlRnJvbUNoYW5nZXMoY2hhbmdlcywgJ21heCcsIHRoaXMubWF4KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleHRyYWN0VmFsdWVGcm9tQ2hhbmdlcyhjaGFuZ2VzLCAndmFsdWUnLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYgKGNoYW5nZXMubWluIHx8IGNoYW5nZXMubWF4IHx8IGNoYW5nZXMudmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLm1pbiB8fCBjaGFuZ2VzLm1heCkge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlUmFuZ2UobWluLCBtYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBtaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGFkanVzdFZhbHVlVG9SYW5nZSh0aGlzLm1pbiwgdGhpcy5tYXgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5taW4gPSBtaW47XG4gICAgICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gYWRqdXN0VmFsdWVUb1JhbmdlKHRoaXMubWluLCB0aGlzLm1heCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxpemF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBIb3N0QmluZGluZygnY2xhc3Muay13aWRnZXQnKSxcbiAgICBIb3N0QmluZGluZygnY2xhc3Muay1wcm9ncmVzc2JhcicpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJ3aWRnZXRDbGFzc2VzXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBIb3N0QmluZGluZygnY2xhc3Muay1wcm9ncmVzc2Jhci1ob3Jpem9udGFsJyksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSlcbl0sIFByb2dyZXNzQmFyQmFzZS5wcm90b3R5cGUsIFwiaXNIb3Jpem9udGFsXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgSG9zdEJpbmRpbmcoJ2NsYXNzLmstcHJvZ3Jlc3NiYXItdmVydGljYWwnKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJpc1ZlcnRpY2FsXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgSG9zdEJpbmRpbmcoJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJkaXNhYmxlZENsYXNzXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgSG9zdEJpbmRpbmcoJ2NsYXNzLmstcHJvZ3Jlc3NiYXItcmV2ZXJzZScpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcInJldmVyc2VDbGFzc1wiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIEhvc3RCaW5kaW5nKCdjbGFzcy5rLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUnKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJpbmRldGVybWluYXRlQ2xhc3NcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBIb3N0QmluZGluZygnYXR0ci5kaXInKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcImRpckF0dHJpYnV0ZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJyb2xlQXR0cmlidXRlXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBIb3N0QmluZGluZygnYXR0ci5hcmlhLXZhbHVlbWluJyksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZyksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJhcmlhTWluQXR0cmlidXRlXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgSG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS12YWx1ZW1heCcpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBTdHJpbmcpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSlcbl0sIFByb2dyZXNzQmFyQmFzZS5wcm90b3R5cGUsIFwiYXJpYU1heEF0dHJpYnV0ZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtdmFsdWVub3cnKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcImFyaWFWYWx1ZUF0dHJpYnV0ZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE51bWJlcilcbl0sIFByb2dyZXNzQmFyQmFzZS5wcm90b3R5cGUsIFwibWF4XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcIm1pblwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgTnVtYmVyKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKVxuXSwgUHJvZ3Jlc3NCYXJCYXNlLnByb3RvdHlwZSwgXCJvcmllbnRhdGlvblwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbilcbl0sIFByb2dyZXNzQmFyQmFzZS5wcm90b3R5cGUsIFwiZGlzYWJsZWRcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcInJldmVyc2VcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pXG5dLCBQcm9ncmVzc0JhckJhc2UucHJvdG90eXBlLCBcImluZGV0ZXJtaW5hdGVcIiwgdm9pZCAwKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbS2VuZG8gVUkgUHJvZ3Jlc3NCYXIgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X3Byb2dyZXNzYmFyICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tcHJvZ3Jlc3NiYXIgW3ZhbHVlXT1cInZhbHVlXCI+XG4gKiAgICAgICAgPC9rZW5kby1wcm9ncmVzc2Jhcj5cbiAqICAgIGBcbiAqIH0pXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgIHB1YmxpYyB2YWx1ZSA9IDUwO1xuICogfVxuICogYGBgXG4gKi9cbmxldCBQcm9ncmVzc0JhckNvbXBvbmVudCA9IGNsYXNzIFByb2dyZXNzQmFyQ29tcG9uZW50IGV4dGVuZHMgUHJvZ3Jlc3NCYXJCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9jYWxpemF0aW9uLCB6b25lLCByZW5kZXJlcikge1xuICAgICAgICBzdXBlcihsb2NhbGl6YXRpb24pO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdGF0dXMgbGFiZWwgd2lsbCBiZSB2aXNpYmxlLlxuICAgICAgICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAmbWRhc2g7dGhlIGxhYmVsIHdpbGwgYmUgdmlzaWJsZSBhbmQgZGlzcGxheWVkIHdpdGggdGhlIGRlZmF1bHRcbiAgICAgICAgICogYExhYmVsU2V0dGluZ3NgIGhhdmluZyBpdHMgcG9zaXRpb24gc2V0IHRvIGBlbmRgIGFuZCBpdHMgZm9ybWF0IHNldCB0byBgdmFsdWVgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYWJlbCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYW5pbWF0aW9uIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFByb2dyZXNzQmFyLlxuICAgICAgICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGFuaW1hdGlvbiB3aGljaCBpbmRpY2F0ZXMgdGhlIGxhdGVzdCB2YWx1ZSBjaGFuZ2UgaXMgY29tcGxldGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRpb25FbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgc2hvd0xhYmVsKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFiZWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYWJlbCAmJiAhdGhpcy5sYWJlbC5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsLnZpc2libGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBsYWJlbFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFiZWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuICdlbmQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubGFiZWwgJiYgIXRoaXMubGFiZWwuaGFzT3duUHJvcGVydHkoJ3Bvc2l0aW9uJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gJ2VuZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYWJlbC5wb3NpdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGlzUG9zaXRpb25TdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxQb3NpdGlvbiA9PT0gJ3N0YXJ0JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpc1Bvc2l0aW9uQ2VudGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbFBvc2l0aW9uID09PSAnY2VudGVyJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpc1Bvc2l0aW9uRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbFBvc2l0aW9uID09PSAnZW5kJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBmb3JtYXR0ZWRMYWJlbFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUodGhpcy5kaXNwbGF5VmFsdWUsIHRoaXMubWluLCB0aGlzLm1heCwgdGhpcy5sYWJlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICBpZiAodGhpcy5pc0FuaW1hdGlvbkluUHJvZ3Jlc3MgJiYgc3RvcEN1cnJlbnRBbmltYXRpb24oY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bkFuaW1hdGlvbihjaGFuZ2VzLCB0aGlzLmFuaW1hdGlvbiwgdGhpcy5wcmV2aW91c1ZhbHVlLCB0aGlzLmRpc3BsYXlWYWx1ZSkgJiYgIWNoYW5nZXMudmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24odGhpcy5wcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc3RhcnRBbmltYXRpb24ocHJldmlvdXNWYWx1ZSkge1xuICAgICAgICB0aGlzLmlzQW5pbWF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnByb2dyZXNzU3RhdHVzRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHRoaXMucHJvZ3Jlc3NTdGF0dXNXcmFwcGVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gdGhpcy5nZXRBbmltYXRpb25PcHRpb25zKHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gYW5pbWF0aW9uT3B0aW9ucy5zdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBNYXRoLm1pbihlbGFwc2VkIC8gYW5pbWF0aW9uT3B0aW9ucy5kdXJhdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGFuaW1hdGlvbk9wdGlvbnMuc3RhcnRTaXplICsgYW5pbWF0aW9uT3B0aW9ucy5kZWx0YVNpemUgKiBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyU2l6ZSA9ICgxMDAgLyBzaXplKSAqIDEwMDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclZhbHVlQ2hhbmdlKGVsZW1lbnQsIHdyYXBwZXJFbGVtZW50LCBhbmltYXRpb25PcHRpb25zLnByb3BlcnR5LCBzaXplLCB3cmFwcGVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxDdXJyZW50QW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0UHJvZ3Jlc3MoZWxlbWVudCwgd3JhcHBlckVsZW1lbnQsIGFuaW1hdGlvbk9wdGlvbnMucHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24ocHJldmlvdXNWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFuaW1hdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYW5pbWF0aW9uRHVyYXRpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbmltYXRpb24gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIDQwMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbiAmJiAhdGhpcy5hbmltYXRpb24uaGFzT3duUHJvcGVydHkoJ2R1cmF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbi5kdXJhdGlvbiA9IDQwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbi5kdXJhdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wQW5pbWF0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnModGhpcy5hbmltYXRpb25FbmQpKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkVuZC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRvOiB0aGlzLmRpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0QW5pbWF0aW9uT3B0aW9ucyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUmF0aW8gPSBjYWxjdWxhdGVSYXRpbyh0aGlzLm1pbiwgdGhpcy5tYXgsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXNXaWR0aCA9IGlzSG9yaXpvbnRhbCA/IHByZXZpb3VzUmF0aW8gKiAxMDAgOiAxMDA7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdHVzSGVpZ2h0ID0gIWlzSG9yaXpvbnRhbCA/IHByZXZpb3VzUmF0aW8gKiAxMDAgOiAxMDA7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRTaXplID0gaXNIb3Jpem9udGFsID8gcHJldmlvdXNTdGF0dXNXaWR0aCA6IHByZXZpb3VzU3RhdHVzSGVpZ2h0O1xuICAgICAgICBjb25zdCBkZWx0YVNpemUgPSBpc0hvcml6b250YWwgPyB0aGlzLnN0YXR1c1dpZHRoIC0gcHJldmlvdXNTdGF0dXNXaWR0aCA6IHRoaXMuc3RhdHVzSGVpZ2h0IC0gcHJldmlvdXNTdGF0dXNIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5hbmltYXRpb25EdXJhdGlvbiAqIE1hdGguYWJzKChkZWx0YVNpemUgLyAxMDApKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgc3RhcnRTaXplLFxuICAgICAgICAgICAgZGVsdGFTaXplLFxuICAgICAgICAgICAgZHVyYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyVmFsdWVDaGFuZ2UoZWxlbWVudCwgd3JhcHBlckVsZW1lbnQsIHByb3BlcnR5LCBzaXplLCB3cmFwcGVyU2l6ZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsIHByb3BlcnR5LCBzaXplICsgJyUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh3cmFwcGVyRWxlbWVudCwgcHJvcGVydHksIHdyYXBwZXJTaXplICsgJyUnKTtcbiAgICB9XG4gICAgcmVzZXRQcm9ncmVzcyhlbGVtZW50LCB3cmFwcGVyRWxlbWVudCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGNhbGN1bGF0ZVJhdGlvKHRoaXMubWluLCB0aGlzLm1heCwgdGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSBzaXplICogMTAwO1xuICAgICAgICBjb25zdCBuZXdXcmFwcGVyU2l6ZSA9IDEwMCAvIHNpemU7XG4gICAgICAgIHRoaXMucmVuZGVyVmFsdWVDaGFuZ2UoZWxlbWVudCwgd3JhcHBlckVsZW1lbnQsIHByb3BlcnR5LCBuZXdTaXplLCBuZXdXcmFwcGVyU2l6ZSk7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxDdXJyZW50QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuXSwgUHJvZ3Jlc3NCYXJDb21wb25lbnQucHJvdG90eXBlLCBcImxhYmVsXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBQcm9ncmVzc0JhckNvbXBvbmVudC5wcm90b3R5cGUsIFwicHJvZ3Jlc3NDc3NTdHlsZVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuXSwgUHJvZ3Jlc3NCYXJDb21wb25lbnQucHJvdG90eXBlLCBcInByb2dyZXNzQ3NzQ2xhc3NcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbl0sIFByb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJlbXB0eUNzc1N0eWxlXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBQcm9ncmVzc0JhckNvbXBvbmVudC5wcm90b3R5cGUsIFwiZW1wdHlDc3NDbGFzc1wiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuXSwgUHJvZ3Jlc3NCYXJDb21wb25lbnQucHJvdG90eXBlLCBcImFuaW1hdGlvblwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgT3V0cHV0KCksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEV2ZW50RW1pdHRlcilcbl0sIFByb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJhbmltYXRpb25FbmRcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFZpZXdDaGlsZCgncHJvZ3Jlc3NTdGF0dXMnLCB7IHN0YXRpYzogZmFsc2UgfSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEVsZW1lbnRSZWYpXG5dLCBQcm9ncmVzc0JhckNvbXBvbmVudC5wcm90b3R5cGUsIFwicHJvZ3Jlc3NTdGF0dXNFbGVtZW50XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBWaWV3Q2hpbGQoJ3Byb2dyZXNzU3RhdHVzV3JhcCcsIHsgc3RhdGljOiBmYWxzZSB9KSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRWxlbWVudFJlZilcbl0sIFByb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJwcm9ncmVzc1N0YXR1c1dyYXBwZXJFbGVtZW50XCIsIHZvaWQgMCk7XG5Qcm9ncmVzc0JhckNvbXBvbmVudCA9IF9fZGVjb3JhdGUoW1xuICAgIENvbXBvbmVudCh7XG4gICAgICAgIGV4cG9ydEFzOiAna2VuZG9Qcm9ncmVzc0JhcicsXG4gICAgICAgIHNlbGVjdG9yOiAna2VuZG8tcHJvZ3Jlc3NiYXInLFxuICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8c3BhbiBjbGFzcz1cImstcHJvZ3Jlc3Mtc3RhdHVzLXdyYXBcIlxuICAgICAgICAgICAgW2NsYXNzLmstcHJvZ3Jlc3Mtc3RhcnRdPVwiaXNQb3NpdGlvblN0YXJ0XCJcbiAgICAgICAgICAgIFtjbGFzcy5rLXByb2dyZXNzLWNlbnRlcl09XCJpc1Bvc2l0aW9uQ2VudGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5rLXByb2dyZXNzLWVuZF09XCJpc1Bvc2l0aW9uRW5kXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImVtcHR5Q3NzU3R5bGVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZW1wdHlDc3NDbGFzc1wiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93TGFiZWxcIiBjbGFzcz1cImstcHJvZ3Jlc3Mtc3RhdHVzXCI+e3tmb3JtYXR0ZWRMYWJlbFZhbHVlfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgI3Byb2dyZXNzU3RhdHVzXG4gICAgICAgICAgICBjbGFzcz1cImstc3RhdGUtc2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmstY29tcGxldGVdPVwiaXNDb21wbGV0ZWRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwicHJvZ3Jlc3NDc3NTdHlsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJwcm9ncmVzc0Nzc0NsYXNzXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInN0YXR1c1dpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQuJV09XCJzdGF0dXNIZWlnaHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAjcHJvZ3Jlc3NTdGF0dXNXcmFwXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLXByb2dyZXNzLXN0YXR1cy13cmFwXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJzdGF0dXNXcmFwcGVyV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQuJV09XCJzdGF0dXNXcmFwcGVySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1wcm9ncmVzcy1zdGFydF09XCJpc1Bvc2l0aW9uU3RhcnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLXByb2dyZXNzLWNlbnRlcl09XCJpc1Bvc2l0aW9uQ2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1wcm9ncmVzcy1lbmRdPVwiaXNQb3NpdGlvbkVuZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0xhYmVsXCIgY2xhc3M9XCJrLXByb2dyZXNzLXN0YXR1c1wiPnt7Zm9ybWF0dGVkTGFiZWxWYWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICBgLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5wcm9ncmVzc2JhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgTmdab25lLFxuICAgICAgICBSZW5kZXJlcjJdKVxuXSwgUHJvZ3Jlc3NCYXJDb21wb25lbnQpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBDaHVua1Byb2dyZXNzQmFyIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19jaHVua3Byb2dyZXNzYmFyICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tY2h1bmtwcm9ncmVzc2JhciBbdmFsdWVdPVwidmFsdWVcIj5cbiAqICAgICAgICA8L2tlbmRvLWNodW5rcHJvZ3Jlc3NiYXI+XG4gKiAgICBgXG4gKiB9KVxuICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAqICAgICBwdWJsaWMgdmFsdWUgPSA0MDtcbiAqIH1cbiAqIGBgYFxuICovXG5sZXQgQ2h1bmtQcm9ncmVzc0JhckNvbXBvbmVudCA9IGNsYXNzIENodW5rUHJvZ3Jlc3NCYXJDb21wb25lbnQgZXh0ZW5kcyBQcm9ncmVzc0JhckJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgc3VwZXIobG9jYWxpemF0aW9uKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY2h1bmtzIGludG8gd2hpY2ggdGhlIENodW5rUHJvZ3Jlc3NCYXIgd2lsbCBiZSBzcGxpdC5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gYDVgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVua0NvdW50ID0gNTtcbiAgICAgICAgdGhpcy5fb3JpZW50YXRpb25TdHlsZXMgPSB7XG4gICAgICAgICAgICB3aWR0aDogYCR7dGhpcy5jaHVua1NpemVQZXJjZW50YWdlfSVgXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY2h1bmtzKCkge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuY2h1bmtDb3VudDtcbiAgICAgICAgY29uc3QgY2h1bmtzID0gQXJyYXkoY291bnQpLmZpbGwoZmFsc2UpO1xuICAgICAgICBjb25zdCBjb21wbGV0ZWRDaHVua3MgPSBNYXRoLmZsb29yKHRoaXMuX3Byb2dyZXNzUmF0aW8gKiBjb3VudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxldGVkQ2h1bmtzOyBpKyspIHtcbiAgICAgICAgICAgIGNodW5rc1tpXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldmVyc2VDaHVua3ModGhpcy5vcmllbnRhdGlvbiwgdGhpcy5yZXZlcnNlKSkge1xuICAgICAgICAgICAgY2h1bmtzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2h1bmtzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGNodW5rU2l6ZVBlcmNlbnRhZ2UoKSB7XG4gICAgICAgIHJldHVybiAxMDAgLyB0aGlzLmNodW5rQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgb3JpZW50YXRpb25TdHlsZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uU3R5bGVzLndpZHRoID0gYCR7dGhpcy5jaHVua1NpemVQZXJjZW50YWdlfSVgO1xuICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25TdHlsZXMuaGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25TdHlsZXMuaGVpZ2h0ID0gYCR7dGhpcy5jaHVua1NpemVQZXJjZW50YWdlfSVgO1xuICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25TdHlsZXMud2lkdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uU3R5bGVzO1xuICAgIH1cbn07XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJjaHVua0NvdW50XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJwcm9ncmVzc0Nzc1N0eWxlXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJwcm9ncmVzc0Nzc0NsYXNzXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJlbXB0eUNzc1N0eWxlXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50LnByb3RvdHlwZSwgXCJlbXB0eUNzc0NsYXNzXCIsIHZvaWQgMCk7XG5DaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50ID0gX19kZWNvcmF0ZShbXG4gICAgQ29tcG9uZW50KHtcbiAgICAgICAgZXhwb3J0QXM6ICdrZW5kb0NodW5rUHJvZ3Jlc3NCYXInLFxuICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNodW5rcHJvZ3Jlc3NiYXInLFxuICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8dWwgY2xhc3M9XCJrLXJlc2V0XCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJrLWl0ZW1cIiAqbmdGb3I9XCJsZXQgY2h1bmsgb2YgY2h1bmtzOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstZmlyc3RdPVwiaSA9PT0gMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstbGFzdF09XCJpID09PSBjaHVua0NvdW50IC0gMVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstc3RhdGUtc2VsZWN0ZWRdPVwiY2h1bmtcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNodW5rID8gcHJvZ3Jlc3NDc3NDbGFzcyA6IGVtcHR5Q3NzQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNodW5rID8gcHJvZ3Jlc3NDc3NTdHlsZSA6IGVtcHR5Q3NzU3R5bGVcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJvcmllbnRhdGlvblN0eWxlcy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJvcmllbnRhdGlvblN0eWxlcy5oZWlnaHRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgYCxcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uY2h1bmtwcm9ncmVzc2JhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTG9jYWxpemF0aW9uU2VydmljZV0pXG5dLCBDaHVua1Byb2dyZXNzQmFyQ29tcG9uZW50KTtcblxuY29uc3QgQ09NUE9ORU5UX0RJUkVDVElWRVMgPSBbUHJvZ3Jlc3NCYXJDb21wb25lbnQsIENodW5rUHJvZ3Jlc3NCYXJDb21wb25lbnRdO1xuY29uc3QgTU9EVUxFUyA9IFtDb21tb25Nb2R1bGVdO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmxldCBQcm9ncmVzc0Jhck1vZHVsZSA9IGNsYXNzIFByb2dyZXNzQmFyTW9kdWxlIHtcbn07XG5Qcm9ncmVzc0Jhck1vZHVsZSA9IF9fZGVjb3JhdGUoW1xuICAgIE5nTW9kdWxlKHtcbiAgICAgICAgZGVjbGFyYXRpb25zOiBDT01QT05FTlRfRElSRUNUSVZFUyxcbiAgICAgICAgZXhwb3J0czogQ09NUE9ORU5UX0RJUkVDVElWRVMsXG4gICAgICAgIGltcG9ydHM6IE1PRFVMRVNcbiAgICB9KVxuXSwgUHJvZ3Jlc3NCYXJNb2R1bGUpO1xuXG4vKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCB7IFByb2dyZXNzQmFyQmFzZSwgUHJvZ3Jlc3NCYXJDb21wb25lbnQsIENodW5rUHJvZ3Jlc3NCYXJDb21wb25lbnQsIFByb2dyZXNzQmFyTW9kdWxlIH07XG4iXX0=","/**-----------------------------------------------------------------------------------------\n* Copyright © 2020 Progress Software Corporation. All rights reserved.\n* Licensed under commercial license. See LICENSE.md in the project root for more information\n*-------------------------------------------------------------------------------------------*/\nimport { Injectable, Directive, TemplateRef, Optional, isDevMode, Component, SkipSelf, Host, ElementRef, Input, ViewChild, HostBinding, ViewChildren, ContentChildren, EventEmitter, Output, ContentChild, HostListener, Renderer2, ChangeDetectorRef, NgZone, Inject, QueryList, ViewEncapsulation, NgModule, forwardRef } from '@angular/core';\nimport { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';\nimport { Keys, hasObservers, DraggableDirective, DraggableModule } from '@progress/kendo-angular-common';\nimport { trigger, state, style, transition, animate, AUTO_STYLE, AnimationBuilder } from '@angular/animations';\nimport { Subject, BehaviorSubject, Subscription, of } from 'rxjs';\nimport { take, tap, filter, switchMap, delay, takeUntil, map } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { ProgressBarModule } from '@progress/kendo-angular-progressbar';\n\n/**\n * Represents the expand modes of the PanelBar.\n * By default, the expand mode is set to `multiple`.\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/common';\nimport * as ɵngcc2 from '@progress/kendo-angular-l10n';\nimport * as ɵngcc3 from '@progress/kendo-angular-common';\nimport * as ɵngcc4 from '@angular/animations';\nimport * as ɵngcc5 from '@progress/kendo-angular-progressbar';\n\nconst _c0 = [\"header\"];\nconst _c1 = [\"contentWrapper\"];\nfunction PanelBarItemComponent_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 7);\n} if (rf & 2) {\n const ctx_r8 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r8.iconClasses);\n} }\nfunction PanelBarItemComponent_img_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"img\", 8);\n} if (rf & 2) {\n const ctx_r9 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"src\", ctx_r9.imageUrl, ɵngcc0.ɵɵsanitizeUrl);\n} }\nfunction PanelBarItemComponent_ng_template_5_Template(rf, ctx) { }\nfunction PanelBarItemComponent_span_6_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\");\n} if (rf & 2) {\n const ctx_r11 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"k-icon\", true)(\"k-i-arrow-n\", ctx_r11.expanded)(\"k-panelbar-collapse\", ctx_r11.expanded)(\"k-i-arrow-s\", !ctx_r11.expanded)(\"k-panelbar-expand\", !ctx_r11.expanded);\n} }\nfunction PanelBarItemComponent_div_7_div_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 12);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r14 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"overflow\", ctx_r14.contentOverflow)(\"height\", ctx_r14.contentHeight);\n} }\nfunction PanelBarItemComponent_div_7_div_3_ng_template_1_Template(rf, ctx) { }\nconst _c2 = function (a0, a1, a2, a3, a4, a5) { return { title: a0, id: a1, icon: a2, imageUrl: a3, disabled: a4, content: a5 }; };\nconst _c3 = function (a0) { return { $implicit: a0 }; };\nfunction PanelBarItemComponent_div_7_div_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 13);\n ɵngcc0.ɵɵtemplate(1, PanelBarItemComponent_div_7_div_3_ng_template_1_Template, 0, 0, \"ng-template\", 14);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r15 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"overflow\", ctx_r15.contentOverflow)(\"height\", ctx_r15.contentHeight);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r15.contentTemplate.first.templateRef)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction1(13, _c3, ɵngcc0.ɵɵpureFunction6(6, _c2, ctx_r15.title, ctx_r15.id, ctx_r15.icon, ctx_r15.imageUrl, ctx_r15.disabled, ctx_r15.content)));\n} }\nfunction PanelBarItemComponent_div_7_div_4_ng_container_1_kendo_panelbar_item_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-panelbar-item\", 17);\n} if (rf & 2) {\n const item_r20 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r21 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"title\", item_r20.title)(\"id\", item_r20.id)(\"icon\", item_r20.icon)(\"iconClass\", item_r20.iconClass)(\"imageUrl\", item_r20.imageUrl)(\"selected\", !!item_r20.selected)(\"expanded\", !!item_r20.expanded)(\"disabled\", !!item_r20.disabled)(\"template\", ctx_r21.template)(\"items\", item_r20.children)(\"content\", item_r20.content);\n} }\nfunction PanelBarItemComponent_div_7_div_4_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, PanelBarItemComponent_div_7_div_4_ng_container_1_kendo_panelbar_item_1_Template, 1, 11, \"kendo-panelbar-item\", 16);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const item_r20 = ctx.$implicit;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !item_r20.hidden);\n} }\nfunction PanelBarItemComponent_div_7_div_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 12);\n ɵngcc0.ɵɵtemplate(1, PanelBarItemComponent_div_7_div_4_ng_container_1_Template, 2, 1, \"ng-container\", 15);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r16 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"overflow\", ctx_r16.contentOverflow)(\"height\", ctx_r16.contentHeight);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r16.items);\n} }\nfunction PanelBarItemComponent_div_7_div_5_ng_template_1_Template(rf, ctx) { }\nfunction PanelBarItemComponent_div_7_div_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtext(0);\n} if (rf & 2) {\n const ctx_r24 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵtextInterpolate(ctx_r24.content);\n} }\nfunction PanelBarItemComponent_div_7_div_5_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 13);\n ɵngcc0.ɵɵtemplate(1, PanelBarItemComponent_div_7_div_5_ng_template_1_Template, 0, 0, \"ng-template\", 14);\n ɵngcc0.ɵɵtemplate(2, PanelBarItemComponent_div_7_div_5_ng_template_2_Template, 1, 1, \"ng-template\", 18);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r17 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"overflow\", ctx_r17.contentOverflow)(\"height\", ctx_r17.contentHeight);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r17.template)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction1(14, _c3, ɵngcc0.ɵɵpureFunction6(7, _c2, ctx_r17.title, ctx_r17.id, ctx_r17.icon, ctx_r17.imageUrl, ctx_r17.disabled, ctx_r17.content)));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r17.template);\n} }\nfunction PanelBarItemComponent_div_7_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", null, 9);\n ɵngcc0.ɵɵtemplate(2, PanelBarItemComponent_div_7_div_2_Template, 2, 4, \"div\", 10);\n ɵngcc0.ɵɵtemplate(3, PanelBarItemComponent_div_7_div_3_Template, 2, 15, \"div\", 11);\n ɵngcc0.ɵɵtemplate(4, PanelBarItemComponent_div_7_div_4_Template, 2, 5, \"div\", 10);\n ɵngcc0.ɵɵtemplate(5, PanelBarItemComponent_div_7_div_5_Template, 3, 16, \"div\", 11);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r12 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"@toggle\", ctx_r12.state);\n ɵngcc0.ɵɵattribute(\"role\", \"group\")(\"aria-hidden\", !ctx_r12.disabled && !ctx_r12.expanded);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r12.hasChildItems && !(ctx_r12.items == null ? null : ctx_r12.items.length));\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r12.hasContent && !ctx_r12.content);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r12.hasItems);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r12.content);\n} }\nconst _c4 = [[[\"kendo-panelbar-item\"]]];\nconst _c5 = [\"kendo-panelbar-item\"];\nfunction PanelBarComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"contentChildItems && !items\"]);\n} }\nfunction PanelBarComponent_ng_template_1_ng_container_0_kendo_panelbar_item_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-panelbar-item\", 4);\n} if (rf & 2) {\n const item_r28 = ɵngcc0.ɵɵnextContext().$implicit;\n const ctx_r29 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"title\", item_r28.title)(\"id\", item_r28.id)(\"icon\", item_r28.icon)(\"iconClass\", item_r28.iconClass)(\"imageUrl\", item_r28.imageUrl)(\"selected\", !!item_r28.selected)(\"expanded\", !!item_r28.expanded)(\"disabled\", !!item_r28.disabled)(\"template\", ctx_r29.templateRef)(\"items\", item_r28.children)(\"content\", item_r28.content);\n} }\nfunction PanelBarComponent_ng_template_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, PanelBarComponent_ng_template_1_ng_container_0_kendo_panelbar_item_1_Template, 1, 11, \"kendo-panelbar-item\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const item_r28 = ctx.$implicit;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !item_r28.hidden);\n} }\nfunction PanelBarComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, PanelBarComponent_ng_template_1_ng_container_0_Template, 2, 1, \"ng-container\", 2);\n} if (rf & 2) {\n const ctx_r26 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r26.items);\n} }\nfunction SplitterPaneComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementContainerEnd();\n} }\nfunction SplitterPaneComponent_div_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"div\", 2);\n} }\nconst _c6 = [\"*\"];\nfunction SplitterComponent_ng_container_1_kendo_splitter_bar_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-splitter-bar\", 2);\n} if (rf & 2) {\n const index_r35 = ɵngcc0.ɵɵnextContext().index;\n const ctx_r37 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"index\", index_r35)(\"orientation\", ctx_r37.orientation);\n} }\nfunction SplitterComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, SplitterComponent_ng_container_1_kendo_splitter_bar_1_Template, 1, 2, \"kendo-splitter-bar\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const last_r36 = ctx.last;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !last_r36);\n} }\nconst _c7 = [[[\"kendo-splitter-pane\"]]];\nconst _c8 = [\"kendo-splitter-pane\"];\nconst _c9 = [\"tablist\"];\nconst _c10 = [\"tabHeadingContainer\"];\nfunction TabStripComponent_ng_container_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0);\n} }\nfunction TabStripComponent_ng_container_0_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0);\n} }\nfunction TabStripComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, TabStripComponent_ng_container_0_ng_container_1_Template, 1, 0, \"ng-container\", 3);\n ɵngcc0.ɵɵtemplate(2, TabStripComponent_ng_container_0_ng_container_2_Template, 1, 0, \"ng-container\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n ɵngcc0.ɵɵnextContext();\n const _r41 = ɵngcc0.ɵɵreference(3);\n const _r43 = ɵngcc0.ɵɵreference(5);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", _r41);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", _r43);\n} }\nfunction TabStripComponent_ng_container_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0);\n} }\nfunction TabStripComponent_ng_container_1_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0);\n} }\nfunction TabStripComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, TabStripComponent_ng_container_1_ng_container_1_Template, 1, 0, \"ng-container\", 3);\n ɵngcc0.ɵɵtemplate(2, TabStripComponent_ng_container_1_ng_container_2_Template, 1, 0, \"ng-container\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n ɵngcc0.ɵɵnextContext();\n const _r43 = ɵngcc0.ɵɵreference(5);\n const _r41 = ɵngcc0.ɵɵreference(3);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", _r43);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", _r41);\n} }\nfunction TabStripComponent_ng_template_2_li_2_ng_template_4_Template(rf, ctx) { }\nfunction TabStripComponent_ng_template_2_li_2_Template(rf, ctx) { if (rf & 1) {\n const _r56 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"li\", 7, 8);\n ɵngcc0.ɵɵlistener(\"click\", function TabStripComponent_ng_template_2_li_2_Template_li_click_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r56); const i_r52 = ctx.index; const ctx_r55 = ɵngcc0.ɵɵnextContext(2); return ctx_r55.onTabClick($event, i_r52); });\n ɵngcc0.ɵɵelementStart(2, \"span\", 9);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵtemplate(4, TabStripComponent_ng_template_2_li_2_ng_template_4_Template, 0, 0, \"ng-template\", 10);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const tab_r51 = ctx.$implicit;\n const i_r52 = ctx.index;\n const ctx_r50 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵclassProp(\"k-item\", true)(\"k-state-default\", true)(\"k-state-active\", tab_r51.active)(\"k-state-disabled\", tab_r51.disabled);\n ɵngcc0.ɵɵproperty(\"id\", ctx_r50.tabId(i_r52))(\"tabIndex\", tab_r51.active ? 0 : 0 - 1)(\"ngClass\", tab_r51.cssClass);\n ɵngcc0.ɵɵattribute(\"aria-selected\", tab_r51.active)(\"aria-controls\", ctx_r50.tabPanelId(i_r52))(\"aria-disabled\", tab_r51.disabled);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵtextInterpolate(tab_r51.title);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", tab_r51.tabTitle == null ? null : tab_r51.tabTitle.templateRef);\n} }\nfunction TabStripComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {\n const _r58 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"ul\", 4, 5);\n ɵngcc0.ɵɵlistener(\"keydown\", function TabStripComponent_ng_template_2_Template_ul_keydown_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r58); const ctx_r57 = ɵngcc0.ɵɵnextContext(); return ctx_r57.onKeyDown($event); });\n ɵngcc0.ɵɵtemplate(2, TabStripComponent_ng_template_2_li_2_Template, 5, 16, \"li\", 6);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r42 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"justify-content\", ctx_r42.tabsAlignment);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r42.tabs);\n} }\nfunction TabStripComponent_ng_template_4_ng_template_0_div_0_ng_template_1_Template(rf, ctx) { }\nfunction TabStripComponent_ng_template_4_ng_template_0_div_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 13);\n ɵngcc0.ɵɵtemplate(1, TabStripComponent_ng_template_4_ng_template_0_div_0_ng_template_1_Template, 0, 0, \"ng-template\", 10);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r64 = ɵngcc0.ɵɵnextContext();\n const tab_r60 = ctx_r64.$implicit;\n const i_r61 = ctx_r64.index;\n const ctx_r62 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"@state\", tab_r60.active && ctx_r62._animate ? \"active\" : \"inactive\")(\"ngClass\", ctx_r62.contentClass(tab_r60.active))(\"tabIndex\", 0)(\"id\", ctx_r62.tabPanelId(i_r61));\n ɵngcc0.ɵɵattribute(\"aria-hidden\", !tab_r60.active)(\"aria-expanded\", tab_r60.active)(\"aria-labelledby\", ctx_r62.tabId(i_r61))(\"aria-disabled\", tab_r60.disabled);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", tab_r60.tabContent == null ? null : tab_r60.tabContent.templateRef);\n} }\nfunction TabStripComponent_ng_template_4_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TabStripComponent_ng_template_4_ng_template_0_div_0_Template, 2, 9, \"div\", 12);\n} if (rf & 2) {\n const tab_r60 = ctx.$implicit;\n const ctx_r59 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", tab_r60.active || ctx_r59.keepTabContent);\n} }\nfunction TabStripComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TabStripComponent_ng_template_4_ng_template_0_Template, 1, 1, \"ng-template\", 11);\n} if (rf & 2) {\n const ctx_r44 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r44.tabs);\n} }\nfunction DrawerComponent_div_0_ng_container_1_1_ng_template_0_Template(rf, ctx) { }\nfunction DrawerComponent_div_0_ng_container_1_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerComponent_div_0_ng_container_1_1_ng_template_0_Template, 0, 0, \"ng-template\", 4);\n} if (rf & 2) {\n const ctx_r68 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r68.headerTemplate == null ? null : ctx_r68.headerTemplate.templateRef);\n} }\nfunction DrawerComponent_div_0_ng_container_1_3_ng_template_0_Template(rf, ctx) { }\nfunction DrawerComponent_div_0_ng_container_1_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerComponent_div_0_ng_container_1_3_ng_template_0_Template, 0, 0, \"ng-template\", 4);\n} if (rf & 2) {\n const ctx_r69 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r69.footerTemplate == null ? null : ctx_r69.footerTemplate.templateRef);\n} }\nfunction DrawerComponent_div_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, DrawerComponent_div_0_ng_container_1_1_Template, 1, 1, undefined, 2);\n ɵngcc0.ɵɵelement(2, \"ul\", 3);\n ɵngcc0.ɵɵtemplate(3, DrawerComponent_div_0_ng_container_1_3_Template, 1, 1, undefined, 2);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r66 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r66.headerTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"items\", ctx_r66.items)(\"mini\", ctx_r66.mini)(\"expanded\", ctx_r66.expanded)(\"itemTemplate\", ctx_r66.itemTemplate == null ? null : ctx_r66.itemTemplate.templateRef);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r66.footerTemplate);\n} }\nfunction DrawerComponent_div_0_2_ng_template_0_Template(rf, ctx) { }\nfunction DrawerComponent_div_0_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerComponent_div_0_2_ng_template_0_Template, 0, 0, \"ng-template\", 4);\n} if (rf & 2) {\n const ctx_r67 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r67.drawerTemplate == null ? null : ctx_r67.drawerTemplate.templateRef);\n} }\nfunction DrawerComponent_div_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 1);\n ɵngcc0.ɵɵtemplate(1, DrawerComponent_div_0_ng_container_1_Template, 4, 6, \"ng-container\", 2);\n ɵngcc0.ɵɵtemplate(2, DrawerComponent_div_0_2_Template, 1, 1, undefined, 2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r65 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"width\", ctx_r65.drawerWidth, \"px\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r65.drawerTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r65.drawerTemplate);\n} }\nfunction DrawerContainerComponent_div_0_Template(rf, ctx) { if (rf & 1) {\n const _r75 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 1);\n ɵngcc0.ɵɵlistener(\"click\", function DrawerContainerComponent_div_0_Template_div_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r75); const ctx_r74 = ɵngcc0.ɵɵnextContext(); return ctx_r74.closeDrawer(); });\n ɵngcc0.ɵɵelementEnd();\n} }\nvar I18N_11;\nif (typeof ngI18nClosureMode !== \"undefined\" && ngI18nClosureMode) {\n /**\n * @desc The text for the optional segment of the step label\n * @meaning kendo.stepper.optional\n */ \n const MSG_EXTERNAL_9222129954657106830$$DIST_FESM2015_INDEX_JS_12 = goog.getMsg(\"Optional\");\n I18N_11 = MSG_EXTERNAL_9222129954657106830$$DIST_FESM2015_INDEX_JS_12;\n}\nelse {\n I18N_11 = $localize `:kendo.stepper.optional|The text for the optional segment of the step label␟5662ca90a1b7d36b2f55d6e21c0f4f7e166291af␟9222129954657106830:Optional`;\n}\nconst _c13 = [\"optional\", I18N_11];\nfunction StepperComponent_kendo_progressbar_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"kendo-progressbar\", 3);\n} if (rf & 2) {\n const ctx_r76 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"animation\", ctx_r76.progressAnimation)(\"max\", ctx_r76.steps.length - 1)(\"label\", false)(\"orientation\", ctx_r76.orientation)(\"reverse\", !ctx_r76.isHorizontal)(\"value\", ctx_r76.currentStep)(\"ngStyle\", ctx_r76.progressBarStyling);\n ɵngcc0.ɵɵattribute(\"aria-hidden\", true);\n} }\nfunction AvatarComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"customAvatar\"]);\n} }\nfunction AvatarComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelement(1, \"div\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r78 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"background-image\", ctx_r78.imageUrl, ɵngcc0.ɵɵdefaultStyleSanitizer);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx_r78.cssStyle);\n} }\nfunction AvatarComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelementStart(1, \"span\", 2);\n ɵngcc0.ɵɵtext(2);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r79 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx_r79.cssStyle);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r79.initials.substring(0, 2));\n} }\nfunction AvatarComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelement(1, \"span\", 3);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r80 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx_r80.cssStyle)(\"ngClass\", ctx_r80.iconClasses());\n} }\nfunction CardActionsComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 0, [\"*ngIf\", \"!actions\"]);\n} }\nfunction CardActionsComponent_ng_container_1_button_1_Template(rf, ctx) { if (rf & 1) {\n const _r87 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"button\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function CardActionsComponent_ng_container_1_button_1_Template_button_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r87); const action_r85 = ctx.$implicit; const ctx_r86 = ɵngcc0.ɵɵnextContext(2); return ctx_r86.onClick(action_r85); });\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const action_r85 = ctx.$implicit;\n ɵngcc0.ɵɵclassProp(\"k-primary\", action_r85.primary)(\"k-flat\", action_r85.flat);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", action_r85.text, \" \");\n} }\nfunction CardActionsComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, CardActionsComponent_ng_container_1_button_1_Template, 2, 5, \"button\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r82 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx_r82.actions);\n} }\nfunction CardActionsComponent_2_ng_template_0_Template(rf, ctx) { }\nfunction CardActionsComponent_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, CardActionsComponent_2_ng_template_0_Template, 0, 0, \"ng-template\", 3);\n} if (rf & 2) {\n const ctx_r83 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r83.actions);\n} }\nconst _c14 = [\"kendoDrawerItem\", \"\"];\nfunction DrawerItemComponent_0_ng_template_0_Template(rf, ctx) { }\nfunction DrawerItemComponent_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerItemComponent_0_ng_template_0_Template, 0, 0, \"ng-template\", 2);\n} if (rf & 2) {\n const ctx_r89 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r89.itemTemplate)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction1(2, _c3, ctx_r89.item));\n} }\nfunction DrawerItemComponent_ng_template_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelement(1, \"span\", 4);\n ɵngcc0.ɵɵelementStart(2, \"span\", 5);\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r93 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r93.iconClasses(ctx_r93.item.icon));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵtextInterpolate(ctx_r93.item.text);\n} }\nfunction DrawerItemComponent_ng_template_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelement(1, \"span\", 4);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r94 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r94.iconClasses(ctx_r94.item.icon));\n} }\nfunction DrawerItemComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerItemComponent_ng_template_1_ng_container_0_Template, 4, 2, \"ng-container\", 3);\n ɵngcc0.ɵɵtemplate(1, DrawerItemComponent_ng_template_1_ng_container_1_Template, 2, 1, \"ng-container\", 3);\n} if (rf & 2) {\n const ctx_r91 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r91.expanded);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r91.mini && !ctx_r91.expanded);\n} }\nconst _c15 = [\"kendoDrawerList\", \"\"];\nfunction DrawerListComponent_ng_container_0_li_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"li\", 3);\n} if (rf & 2) {\n const ctx_r100 = ɵngcc0.ɵɵnextContext();\n const item_r96 = ctx_r100.$implicit;\n const idx_r97 = ctx_r100.index;\n const ctx_r98 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"item\", item_r96)(\"index\", idx_r97)(\"mini\", ctx_r98.mini)(\"expanded\", ctx_r98.expanded)(\"itemTemplate\", ctx_r98.itemTemplate)(\"ngClass\", item_r96.cssClass)(\"ngStyle\", item_r96.cssStyle);\n ɵngcc0.ɵɵattribute(\"data-kendo-drawer-index\", idx_r97);\n} }\nfunction DrawerListComponent_ng_container_0_li_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"li\", 4);\n ɵngcc0.ɵɵtext(1, \" \\u00A0 \");\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const item_r96 = ɵngcc0.ɵɵnextContext().$implicit;\n ɵngcc0.ɵɵproperty(\"ngClass\", item_r96.cssClass)(\"ngStyle\", item_r96.cssStyle);\n} }\nfunction DrawerListComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, DrawerListComponent_ng_container_0_li_1_Template, 1, 8, \"li\", 1);\n ɵngcc0.ɵɵtemplate(2, DrawerListComponent_ng_container_0_li_2_Template, 2, 2, \"li\", 2);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const item_r96 = ctx.$implicit;\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !item_r96.separator);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", item_r96.separator);\n} }\nconst _c16 = [\"stepLink\"];\nconst _c17 = [\"kendoStepperStep\", \"\"];\nfunction StepperStepComponent_2_ng_template_0_Template(rf, ctx) { }\nconst _c18 = function (a0, a1) { return { $implicit: a0, index: a1 }; };\nfunction StepperStepComponent_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, StepperStepComponent_2_ng_template_0_Template, 0, 0, \"ng-template\", 3);\n} if (rf & 2) {\n const ctx_r103 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r103.stepTemplate)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(2, _c18, ctx_r103.step, ctx_r103.index));\n} }\nfunction StepperStepComponent_ng_container_3_span_1_1_ng_template_0_Template(rf, ctx) { }\nfunction StepperStepComponent_ng_container_3_span_1_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, StepperStepComponent_ng_container_3_span_1_1_ng_template_0_Template, 0, 0, \"ng-template\", 3);\n} if (rf & 2) {\n const ctx_r108 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r108.indicatorTemplate)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(2, _c18, ctx_r108.step, ctx_r108.index));\n} }\nfunction StepperStepComponent_ng_container_3_span_1_ng_container_2_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 9);\n} if (rf & 2) {\n const ctx_r111 = ɵngcc0.ɵɵnextContext(4);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r111.indicatorIconClasses);\n} }\nfunction StepperStepComponent_ng_container_3_span_1_ng_container_2_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 10);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r112 = ɵngcc0.ɵɵnextContext(4);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r112.indicatorText);\n} }\nfunction StepperStepComponent_ng_container_3_span_1_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, StepperStepComponent_ng_container_3_span_1_ng_container_2_span_1_Template, 1, 1, \"span\", 7);\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_ng_container_3_span_1_ng_container_2_span_2_Template, 2, 1, \"span\", 8);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r109 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r109.showIndicatorIcon);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r109.showIndicatorIcon);\n} }\nfunction StepperStepComponent_ng_container_3_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 6);\n ɵngcc0.ɵɵtemplate(1, StepperStepComponent_ng_container_3_span_1_1_Template, 1, 5, undefined, 2);\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_ng_container_3_span_1_ng_container_2_Template, 3, 2, \"ng-container\", 2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r106 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵstyleProp(\"transition-duration\", ctx_r106.transitionDuration, \"ms\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r106.indicatorTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r106.indicatorTemplate);\n} }\nfunction StepperStepComponent_ng_container_3_span_2_1_ng_template_0_Template(rf, ctx) { }\nfunction StepperStepComponent_ng_container_3_span_2_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, StepperStepComponent_ng_container_3_span_2_1_ng_template_0_Template, 0, 0, \"ng-template\", 3);\n} if (rf & 2) {\n const ctx_r113 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r113.labelTemplate)(\"ngTemplateOutletContext\", ɵngcc0.ɵɵpureFunction2(2, _c18, ctx_r113.step, ctx_r113.index));\n} }\nfunction StepperStepComponent_ng_container_3_span_2_ng_container_2_span_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 15);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r116 = ɵngcc0.ɵɵnextContext(4);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r116.step.label);\n} }\nfunction StepperStepComponent_ng_container_3_span_2_ng_container_2_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelement(0, \"span\", 16);\n} if (rf & 2) {\n const ctx_r117 = ɵngcc0.ɵɵnextContext(4);\n ɵngcc0.ɵɵproperty(\"ngClass\", ctx_r117.validationIconClasses);\n} }\nfunction StepperStepComponent_ng_container_3_span_2_ng_container_2_span_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 17);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r118 = ɵngcc0.ɵɵnextContext(4);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\"(\", ctx_r118.optionalText, \")\");\n} }\nfunction StepperStepComponent_ng_container_3_span_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, StepperStepComponent_ng_container_3_span_2_ng_container_2_span_1_Template, 2, 1, \"span\", 12);\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_ng_container_3_span_2_ng_container_2_span_2_Template, 1, 1, \"span\", 13);\n ɵngcc0.ɵɵtemplate(3, StepperStepComponent_ng_container_3_span_2_ng_container_2_span_3_Template, 2, 1, \"span\", 14);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r114 = ɵngcc0.ɵɵnextContext(3);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r114.showLabelText);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r114.showLabelIcon);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r114.step.optional);\n} }\nfunction StepperStepComponent_ng_container_3_span_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 11);\n ɵngcc0.ɵɵtemplate(1, StepperStepComponent_ng_container_3_span_2_1_Template, 1, 5, undefined, 2);\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_ng_container_3_span_2_ng_container_2_Template, 4, 3, \"ng-container\", 2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r107 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r107.labelTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r107.labelTemplate);\n} }\nfunction StepperStepComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵtemplate(1, StepperStepComponent_ng_container_3_span_1_Template, 3, 4, \"span\", 4);\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_ng_container_3_span_2_Template, 3, 2, \"span\", 5);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r104 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r104.showIndicator);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r104.showLabel);\n} }\nconst _c19 = [\"kendoStepperList\", \"\"];\nfunction StepperListComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelement(1, \"li\", 1);\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const step_r120 = ctx.$implicit;\n const idx_r121 = ctx.index;\n const ctx_r119 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵstyleProp(\"max-width\", ctx_r119.maxStepWidth, \"%\")(\"max-height\", ctx_r119.maxStepHeight, \"%\");\n ɵngcc0.ɵɵclassProp(\"k-step-first\", idx_r121 === 0)(\"k-step-last\", idx_r121 === ctx_r119.steps.length - 1)(\"k-step-done\", idx_r121 < ctx_r119.currentStep)(\"k-step-current\", idx_r121 === ctx_r119.currentStep)(\"k-step-optional\", step_r120.optional)(\"k-step-disabled\", step_r120.disabled);\n ɵngcc0.ɵɵproperty(\"type\", ctx_r119.stepType)(\"step\", step_r120)(\"index\", idx_r121)(\"current\", ctx_r119.currentStep)(\"successIcon\", ctx_r119.successIcon)(\"errorIcon\", ctx_r119.errorIcon)(\"indicatorTemplate\", ctx_r119.indicatorTemplate)(\"labelTemplate\", ctx_r119.labelTemplate)(\"stepTemplate\", ctx_r119.stepTemplate)(\"ngClass\", step_r120.cssClass)(\"ngStyle\", step_r120.cssStyle);\n ɵngcc0.ɵɵattribute(\"data-kendo-stepper-index\", idx_r121);\n} }\nvar PanelBarExpandMode;\n(function (PanelBarExpandMode) {\n /**\n * Allows you to expand only one item at a time.\n * When you expand an item, the item that was previously expanded is coll.\n */\n PanelBarExpandMode[PanelBarExpandMode[\"Single\"] = 0] = \"Single\";\n /**\n * Allows you to expand only one item at a time and requires you to set the `height` property.\n * The expanded area occupies the entire height of the PanelBar.\n */\n PanelBarExpandMode[PanelBarExpandMode[\"Full\"] = 1] = \"Full\";\n /**\n * The default mode of the PanelBar.\n * Allows you to expand more than one item at a time. Items can also be toggled.\n */\n PanelBarExpandMode[PanelBarExpandMode[\"Multiple\"] = 2] = \"Multiple\";\n /**\n * By default, the expand mode is set to `multiple`.\n */\n PanelBarExpandMode[PanelBarExpandMode[\"Default\"] = 2] = \"Default\";\n})(PanelBarExpandMode || (PanelBarExpandMode = {}));\n\n/**\n * @hidden\n */\nlet nextPanelbarId = 0;\n/**\n * @hidden\n */\nclass PanelBarService {\n constructor() {\n this.parentSource = new Subject();\n this.keepContentSource = new BehaviorSubject(false);\n this.childSource = new Subject();\n this.parent$ = this.parentSource.asObservable();\n this.children$ = this.childSource.asObservable();\n this.keepContent$ = this.keepContentSource.asObservable();\n this.pbId = nextPanelbarId++;\n }\n onKeepContent(keepContent) {\n this.keepContentSource.next(keepContent);\n }\n onSelect(event) {\n this.childSource.next(event);\n }\n onFocus() {\n this.parentSource.next(true);\n }\n onBlur() {\n this.parentSource.next(false);\n }\n}\nPanelBarService.ɵfac = function PanelBarService_Factory(t) { return new (t || PanelBarService)(); };\nPanelBarService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: PanelBarService, factory: PanelBarService.ɵfac });\n/** @nocollapse */\nPanelBarService.ctorParameters = () => [];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\n/**\n * Represents the content template of the declaratively initialized PanelBar items.\n * The content can be expanded or collapsed through the item.\n */\nclass PanelBarContentDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nPanelBarContentDirective.ɵfac = function PanelBarContentDirective_Factory(t) { return new (t || PanelBarContentDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nPanelBarContentDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PanelBarContentDirective, selectors: [[\"\", \"kendoPanelBarContent\", \"\"]] });\n/** @nocollapse */\nPanelBarContentDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarContentDirective, [{\n type: Directive,\n args: [{\n selector: \"[kendoPanelBarContent]\"\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Represents the template directive of the PanelBar which helps to customize the item title\n * ([more information and example]({% slug templates_panelbar %}#toc-customizing-the-appearance-of-the-title)).\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Additional Content\n * \n * \n * \n * `\n * })\n *\n * class AppComponent {}\n *\n * ```\n */\nclass PanelBarItemTitleDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nPanelBarItemTitleDirective.ɵfac = function PanelBarItemTitleDirective_Factory(t) { return new (t || PanelBarItemTitleDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nPanelBarItemTitleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PanelBarItemTitleDirective, selectors: [[\"\", \"kendoPanelBarItemTitle\", \"\"]] });\n/** @nocollapse */\nPanelBarItemTitleDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarItemTitleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoPanelBarItemTitle]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\nlet nextId = 0;\nconst parsePanelBarItems = (data) => {\n return data.map((item) => {\n if (!item.id) {\n item.id = `default-${nextId++}`;\n }\n if (item.children) {\n item.children = parsePanelBarItems(item.children);\n }\n return item;\n });\n};\nvar util = {\n parsePanelBarItems\n};\n/**\n * @hidden\n */\nconst isPresent = (value) => value !== null && value !== undefined;\n\nconst focusableRegex = /^(?:a|input|select|option|textarea|button|object)$/i;\nconst toClassList = (classNames) => String(classNames).trim().split(' ');\n/**\n * @hidden\n */\nconst isFocusable = (element) => {\n if (element.tagName) {\n const tagName = element.tagName.toLowerCase();\n const tabIndex = element.getAttribute('tabIndex');\n const skipTab = tabIndex === '-1';\n let focusable = tabIndex !== null && !skipTab;\n if (focusableRegex.test(tagName)) {\n focusable = !element.disabled && !skipTab;\n }\n return focusable;\n }\n return false;\n};\n/**\n * @hidden\n */\nconst hasClass = (element, className) => Boolean(toClassList(element.className).find((name) => name === className));\nconst closestInScope = (target, targetAttr, predicate, scope) => {\n while (target && target !== scope && !predicate(target, targetAttr)) {\n target = target.parentNode;\n }\n if (target !== scope) {\n return target;\n }\n};\n/**\n * @hidden\n */\nconst itemIndex = (item, indexAttr) => +item.getAttribute(indexAttr);\nconst hasItemIndex = (item, indexAttr) => isPresent(item.getAttribute(indexAttr));\n/**\n * @hidden\n */\nconst closestItem = (target, targetAttr, scope) => closestInScope(target, targetAttr, hasItemIndex, scope);\n\n/**\n * @hidden\n */\nlet nextId$1 = 0;\n/**\n * Represents the items of the PanelBar.\n */\nclass PanelBarItemComponent {\n constructor(parent, eventService, element) {\n this.parent = parent;\n this.eventService = eventService;\n this.element = element;\n /**\n * Sets the title of the PanelBar item ([see example]({% slug items_panelbar %}#toc-titles)).\n */\n this.title = 'Untitled';\n /**\n * Allows the component to set the `\"id\"` property to each item.\n * Used to set the `id` attributes of the nested elements and to enable the WAI-ARIA support.\n */\n this.id = `default-${nextId$1++}`;\n /**\n * Defines the icon that will be rendered next to the title ([see example]({% slug items_panelbar %}#toc-title-icons)).\n */\n this.icon = '';\n /**\n * Defines the icon that will be rendered next to the title by using a custom CSS class\n * ([see example]({% slug items_panelbar %}#toc-title-icons)).\n */\n this.iconClass = '';\n /**\n * Defines the location of the image that will be displayed next to the title\n * ([see example]({% slug items_panelbar %}#toc-title-images)).\n */\n this.imageUrl = '';\n /**\n * When set to `true`, disables a PanelBar item ([see example]({% slug items_panelbar %}#toc-disabled-state)).\n */\n this.disabled = false;\n /**\n * Sets the selected state of a PanelBar item ([see example]({% slug items_panelbar %}#toc-selected-state)).\n */\n this.selected = false;\n this.keepContent = false;\n this.hasChildItems = false;\n this.hasItems = false;\n this.hasContent = false;\n this.state = \"inactive\";\n this.role = \"treeitem\";\n this.titleAttribute = null; // tslint:disable-line\n this.focused = false;\n this.wrapperFocused = false;\n this.subscriptions = new Subscription(() => { });\n this._expanded = false;\n this.subscriptions.add(eventService.parent$.subscribe(focused => this.onWrapperFocusChange(focused)));\n this.subscriptions.add(eventService.keepContent$.subscribe(keepContent => this.keepContent = keepContent));\n this.wrapperFocused = parent ? parent.focused : false;\n }\n /**\n * When set to `true`, expands the PanelBar item ([see example]({% slug items_panelbar %}#toc-expanded-state)).\n */\n set expanded(value) {\n const activeState = this.animate ? \"active\" : \"activeWithoutAnimation\";\n this.state = value ? activeState : \"inactive\";\n if (!this.keepContent) {\n this.toggleExpandedChildAnimations(value);\n }\n this._expanded = value;\n }\n get expanded() {\n return this._expanded;\n }\n get animate() {\n return this.eventService.animate;\n }\n get kItemClass() {\n return true;\n }\n get kStateDefaultClass() {\n return !this.disabled;\n }\n get kStateDisabledClass() {\n return this.disabled;\n }\n get kStateExpandedClass() {\n return !this.disabled && this.expanded && (this.hasChildItems || this.hasContent);\n }\n get itemId() {\n return 'k-panelbar-' + this.eventService.pbId + '-item-' + this.id;\n }\n get ariaExpanded() {\n return (this.hasChildItems || this.hasContent) ? !this.disabled && this.expanded : null;\n }\n get ariaSelected() {\n return !this.disabled && this.selected;\n }\n get ariaDisabled() {\n return this.disabled ? true : null;\n }\n /**\n * @hidden\n */\n get titleTemplate() {\n return this.titleTemplates.length > 0 ? this.titleTemplates.toArray()[0].templateRef : undefined;\n }\n /**\n * @hidden\n */\n headerHeight() {\n return this.element.nativeElement.offsetHeight - (this.contentWrapper ? this.contentWrapper.nativeElement.offsetHeight : 0);\n }\n /**\n * @hidden\n */\n ngAfterContentChecked() {\n this.hasItems = this.items && this.items.filter(item => !item.hidden).length > 0;\n this.hasChildItems = this.contentItems.filter(item => item !== this).length > 0 || this.hasItems;\n this.hasContent = (this.contentTemplate !== undefined && this.contentTemplate.length > 0) ||\n this.content !== undefined;\n this.validateConfiguration();\n }\n /**\n * @hidden\n */\n ngAfterViewChecked() {\n if (this.items) {\n this.childrenItems = this.viewChildItems.toArray();\n }\n else {\n this.childrenItems = this.contentItems.filter(item => item !== this);\n }\n }\n /**\n * @hidden\n */\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n /**\n * @hidden\n */\n onItemAction() {\n if (!this.disabled) {\n this.eventService.onSelect(this);\n }\n }\n /**\n * @hidden\n */\n onItemClick(e) {\n if (!isFocusable(e.target)) {\n this.onItemAction();\n }\n }\n /**\n * @hidden\n */\n get iconClasses() {\n let icon = this.icon ? 'k-i-' + this.icon : null;\n return {\n [icon || this.iconClass]: true\n };\n }\n /**\n * @hidden\n */\n serialize() {\n return {\n content: this.content,\n disabled: this.disabled,\n expanded: this.expanded,\n focused: this.focused,\n icon: this.icon,\n iconClass: this.iconClass,\n id: this.id,\n imageUrl: this.imageUrl,\n selected: this.selected,\n title: this.title\n };\n }\n /**\n * @hidden\n */\n subTreeViewItems() {\n let subTree = [];\n this.viewChildItems.forEach(item => {\n subTree = subTree.concat(item.subTreeViewItems());\n subTree.push(item);\n });\n return subTree;\n }\n /**\n * @hidden\n */\n validateConfiguration() {\n if (isDevMode()) {\n if (this.content && (this.contentTemplate !== undefined && this.contentTemplate.length > 0)) {\n throw new Error(\"Invalid configuration: mixed template components and component property.\");\n }\n }\n }\n /**\n * @hidden\n */\n toggleAnimationState(value) {\n if (!this.animate) {\n return;\n }\n this.state = value && this.eventService.expandMode !== PanelBarExpandMode.Single ? 'active' : 'activeWithoutAnimation';\n }\n /**\n * @hidden\n */\n toggleExpandedChildAnimations(value) {\n if (this.childrenItems) {\n this.childrenItems.forEach(child => {\n if (child.expanded) {\n child.toggleAnimationState(value);\n child.toggleExpandedChildAnimations(value);\n }\n });\n }\n }\n onWrapperFocusChange(focused) {\n this.wrapperFocused = focused;\n }\n}\nPanelBarItemComponent.ɵfac = function PanelBarItemComponent_Factory(t) { return new (t || PanelBarItemComponent)(ɵngcc0.ɵɵdirectiveInject(PanelBarItemComponent, 13), ɵngcc0.ɵɵdirectiveInject(PanelBarService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nPanelBarItemComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PanelBarItemComponent, selectors: [[\"kendo-panelbar-item\"]], contentQueries: function PanelBarItemComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarItemComponent, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarContentDirective, false);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarItemTitleDirective, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentItems = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentTemplate = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.titleTemplates = _t);\n } }, viewQuery: function PanelBarItemComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, true);\n ɵngcc0.ɵɵviewQuery(_c1, true);\n ɵngcc0.ɵɵviewQuery(PanelBarItemComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.header = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentWrapper = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.viewChildItems = _t);\n } }, hostVars: 14, hostBindings: function PanelBarItemComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"id\", ctx.itemId);\n ɵngcc0.ɵɵattribute(\"role\", ctx.role)(\"title\", ctx.titleAttribute)(\"aria-expanded\", ctx.ariaExpanded)(\"aria-selected\", ctx.ariaSelected)(\"aria-disabled\", ctx.ariaDisabled);\n ɵngcc0.ɵɵclassProp(\"k-item\", ctx.kItemClass)(\"k-state-default\", ctx.kStateDefaultClass)(\"k-state-disabled\", ctx.kStateDisabledClass)(\"k-state-expanded\", ctx.kStateExpandedClass);\n } }, inputs: { title: \"title\", id: \"id\", icon: \"icon\", iconClass: \"iconClass\", imageUrl: \"imageUrl\", disabled: \"disabled\", selected: \"selected\", expanded: \"expanded\", content: \"content\", items: \"items\", template: \"template\" }, exportAs: [\"kendoPanelbarItem\"], ngContentSelectors: _c5, decls: 8, vars: 14, consts: [[3, \"click\"], [\"header\", \"\"], [\"class\", \"k-icon\", 3, \"ngClass\", 4, \"ngIf\"], [\"class\", \"k-image\", \"alt\", \"\", 3, \"src\", 4, \"ngIf\"], [3, \"ngTemplateOutlet\"], [3, \"k-icon\", \"k-i-arrow-n\", \"k-panelbar-collapse\", \"k-i-arrow-s\", \"k-panelbar-expand\", 4, \"ngIf\"], [4, \"ngIf\"], [1, \"k-icon\", 3, \"ngClass\"], [\"alt\", \"\", 1, \"k-image\", 3, \"src\"], [\"contentWrapper\", \"\"], [\"class\", \"k-panel k-group\", 3, \"overflow\", \"height\", 4, \"ngIf\"], [\"class\", \"k-content\", 3, \"overflow\", \"height\", 4, \"ngIf\"], [1, \"k-panel\", \"k-group\"], [1, \"k-content\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [4, \"ngFor\", \"ngForOf\"], [3, \"title\", \"id\", \"icon\", \"iconClass\", \"imageUrl\", \"selected\", \"expanded\", \"disabled\", \"template\", \"items\", \"content\", 4, \"ngIf\"], [3, \"title\", \"id\", \"icon\", \"iconClass\", \"imageUrl\", \"selected\", \"expanded\", \"disabled\", \"template\", \"items\", \"content\"], [3, \"ngIf\"]], template: function PanelBarItemComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c4);\n ɵngcc0.ɵɵelementStart(0, \"span\", 0, 1);\n ɵngcc0.ɵɵlistener(\"click\", function PanelBarItemComponent_Template_span_click_0_listener($event) { return ctx.onItemClick($event); });\n ɵngcc0.ɵɵtemplate(2, PanelBarItemComponent_span_2_Template, 1, 1, \"span\", 2);\n ɵngcc0.ɵɵtemplate(3, PanelBarItemComponent_img_3_Template, 1, 1, \"img\", 3);\n ɵngcc0.ɵɵtext(4);\n ɵngcc0.ɵɵtemplate(5, PanelBarItemComponent_ng_template_5_Template, 0, 0, \"ng-template\", 4);\n ɵngcc0.ɵɵtemplate(6, PanelBarItemComponent_span_6_Template, 1, 10, \"span\", 5);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(7, PanelBarItemComponent_div_7_Template, 6, 7, \"div\", 6);\n } if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-link\", true)(\"k-header\", !ctx.parent)(\"k-state-selected\", !ctx.disabled && ctx.selected)(\"k-state-focused\", !ctx.disabled && ctx.focused && ctx.wrapperFocused);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.icon || ctx.iconClass);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.imageUrl);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate1(\" \", ctx.title, \" \");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngTemplateOutlet\", ctx.titleTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasChildItems || ctx.hasContent);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.keepContent || !ctx.disabled && ctx.expanded && (ctx.hasChildItems || ctx.hasContent));\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgTemplateOutlet, ɵngcc1.NgClass, ɵngcc1.NgForOf, PanelBarItemComponent], encapsulation: 2, data: { animation: [\n trigger('toggle', [\n state('inactive', style({ display: 'none' })),\n transition('* => active', [\n style({ overflow: 'hidden', display: 'block', height: 0 }),\n animate(200, style({ height: AUTO_STYLE }))\n ]),\n transition('active => *', [\n style({ overflow: 'hidden', height: AUTO_STYLE }),\n animate(200, style({ height: 0, display: 'none' }))\n ])\n ])\n ] } });\n/** @nocollapse */\nPanelBarItemComponent.ctorParameters = () => [\n { type: PanelBarItemComponent, decorators: [{ type: SkipSelf }, { type: Host }, { type: Optional }] },\n { type: PanelBarService },\n { type: ElementRef }\n];\nPanelBarItemComponent.propDecorators = {\n title: [{ type: Input }],\n id: [{ type: Input }],\n icon: [{ type: Input }],\n iconClass: [{ type: Input }],\n imageUrl: [{ type: Input }],\n disabled: [{ type: Input }],\n expanded: [{ type: Input }],\n selected: [{ type: Input }],\n content: [{ type: Input }],\n items: [{ type: Input }],\n template: [{ type: Input }],\n header: [{ type: ViewChild, args: ['header', {},] }],\n contentWrapper: [{ type: ViewChild, args: ['contentWrapper', {},] }],\n role: [{ type: HostBinding, args: ['attr.role',] }],\n titleAttribute: [{ type: HostBinding, args: ['attr.title',] }],\n kItemClass: [{ type: HostBinding, args: ['class.k-item',] }],\n kStateDefaultClass: [{ type: HostBinding, args: ['class.k-state-default',] }],\n kStateDisabledClass: [{ type: HostBinding, args: ['class.k-state-disabled',] }],\n kStateExpandedClass: [{ type: HostBinding, args: ['class.k-state-expanded',] }],\n itemId: [{ type: HostBinding, args: ['id',] }],\n ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded',] }],\n ariaSelected: [{ type: HostBinding, args: ['attr.aria-selected',] }],\n ariaDisabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }],\n viewChildItems: [{ type: ViewChildren, args: [PanelBarItemComponent,] }],\n contentItems: [{ type: ContentChildren, args: [PanelBarItemComponent,] }],\n contentTemplate: [{ type: ContentChildren, args: [PanelBarContentDirective, { descendants: false },] }],\n titleTemplates: [{ type: ContentChildren, args: [PanelBarItemTitleDirective, { descendants: false },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarItemComponent, [{\n type: Component,\n args: [{\n animations: [\n trigger('toggle', [\n state('inactive', style({ display: 'none' })),\n transition('* => active', [\n style({ overflow: 'hidden', display: 'block', height: 0 }),\n animate(200, style({ height: AUTO_STYLE }))\n ]),\n transition('active => *', [\n style({ overflow: 'hidden', height: AUTO_STYLE }),\n animate(200, style({ height: 0, display: 'none' }))\n ])\n ])\n ],\n exportAs: 'kendoPanelbarItem',\n selector: \"kendo-panelbar-item\",\n template: `\n \n \n \n {{title}}\n \n \n \n \n
\n \n \n
\n \n \n \n
\n
\n \n \n \n \n
\n \n \n
\n {{content}}\n \n `\n }]\n }], function () { return [{ type: PanelBarItemComponent, decorators: [{\n type: SkipSelf\n }, {\n type: Host\n }, {\n type: Optional\n }] }, { type: PanelBarService }, { type: ɵngcc0.ElementRef }]; }, { title: [{\n type: Input\n }], id: [{\n type: Input\n }], icon: [{\n type: Input\n }], iconClass: [{\n type: Input\n }], imageUrl: [{\n type: Input\n }], disabled: [{\n type: Input\n }], selected: [{\n type: Input\n }], role: [{\n type: HostBinding,\n args: ['attr.role']\n }], titleAttribute: [{\n type: HostBinding,\n args: ['attr.title']\n }], expanded: [{\n type: Input\n }], kItemClass: [{\n type: HostBinding,\n args: ['class.k-item']\n }], kStateDefaultClass: [{\n type: HostBinding,\n args: ['class.k-state-default']\n }], kStateDisabledClass: [{\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], kStateExpandedClass: [{\n type: HostBinding,\n args: ['class.k-state-expanded']\n }], itemId: [{\n type: HostBinding,\n args: ['id']\n }], ariaExpanded: [{\n type: HostBinding,\n args: ['attr.aria-expanded']\n }], ariaSelected: [{\n type: HostBinding,\n args: ['attr.aria-selected']\n }], ariaDisabled: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }], content: [{\n type: Input\n }], items: [{\n type: Input\n }], template: [{\n type: Input\n }], header: [{\n type: ViewChild,\n args: ['header', {}]\n }], contentWrapper: [{\n type: ViewChild,\n args: ['contentWrapper', {}]\n }], viewChildItems: [{\n type: ViewChildren,\n args: [PanelBarItemComponent]\n }], contentItems: [{\n type: ContentChildren,\n args: [PanelBarItemComponent]\n }], contentTemplate: [{\n type: ContentChildren,\n args: [PanelBarContentDirective, { descendants: false }]\n }], titleTemplates: [{\n type: ContentChildren,\n args: [PanelBarItemTitleDirective, { descendants: false }]\n }] }); })();\n\n/**\n * Represents the template directive of the PanelBar which helps to customize the item content.\n */\nclass PanelBarItemTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nPanelBarItemTemplateDirective.ɵfac = function PanelBarItemTemplateDirective_Factory(t) { return new (t || PanelBarItemTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nPanelBarItemTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: PanelBarItemTemplateDirective, selectors: [[\"\", \"kendoPanelBarItemTemplate\", \"\"]] });\n/** @nocollapse */\nPanelBarItemTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarItemTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoPanelBarItemTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents the [Kendo UI PanelBar component for Angular]({% slug overview_panelbar %}).\n */\n// TODO: add styles as input prop\nclass PanelBarComponent {\n constructor(elementRef, eventService, localization) {\n this.localization = localization;\n /**\n * Sets the expand mode of the PanelBar through the `PanelBarExpandMode` enum ([see example]({% slug expandmodes_panelbar %})).\n *\n * The available modes are:\n * - `\"single\"`—Expands only one item at a time. Expanding an item collapses the item that was previously expanded.\n * - `\"multiple\"`—The default mode of the PanelBar.\n * Expands more than one item at a time. Items can also be toggled.\n * - `\"full\"`—Expands only one item at a time.\n * The expanded area occupies the entire height of the PanelBar. Requires you to set the `height` property.\n */\n this.expandMode = PanelBarExpandMode.Default;\n /**\n * Allows the PanelBar to modify the selected state of the items.\n */\n this.selectable = true;\n /**\n * Sets the animate state of the PanelBar ([see example]({% slug animations_panelbar %})).\n */\n this.animate = true;\n /**\n * Sets the height of the component when the `\"full\"` expand mode is used.\n * This option is ignored in the `\"multiple\"` and `\"single\"` expand modes.\n */\n this.height = \"400px\";\n /**\n * Fires each time the user interacts with a PanelBar item\n * ([see example]({% slug routing_panelbar %}#toc-getting-the-selected-item)).\n * The event data contains all items that are modified.\n */\n this.stateChange = new EventEmitter();\n this.tabIndex = 0;\n this.role = \"tree\";\n this.activeDescendant = \"\";\n this.isViewInit = true;\n this.focused = false;\n this._keepItemContent = false;\n this.updateChildrenHeight = () => {\n let childrenHeight = 0;\n const panelbarHeight = this.elementRef.nativeElement.offsetHeight;\n const contentOverflow = this.expandMode === PanelBarExpandMode.Full ? 'auto' : 'visible';\n this.childrenItems.forEach(item => {\n childrenHeight += item.headerHeight();\n });\n this.childrenItems.forEach(item => {\n item.contentHeight = PanelBarExpandMode.Full === this.expandMode ? (panelbarHeight - childrenHeight) + \"px\" : 'auto';\n item.contentOverflow = contentOverflow;\n });\n };\n this.keyBindings = this.computedKeys;\n this.elementRef = elementRef;\n this.eventService = eventService;\n this.eventService.children$.subscribe(event => this.onItemAction(event));\n }\n /**\n * When set to `true`, the PanelBar renders the content of all items and they are persisted in the DOM\n * ([see example]({% slug templates_panelbar %}#toc-collections)).\n * By default, this option is set to `false`.\n */\n get keepItemContent() {\n return this._keepItemContent;\n }\n set keepItemContent(keepItemContent) {\n this._keepItemContent = keepItemContent;\n this.eventService.onKeepContent(keepItemContent);\n }\n /**\n * Sets the items of the PanelBar as an array of `PanelBarItemModel` instances\n * ([see example]({% slug items_panelbar %})).\n */\n set items(data) {\n if (data) {\n this._items = util.parsePanelBarItems(data);\n }\n }\n get items() {\n return this._items;\n }\n get hostHeight() {\n return this.expandMode === PanelBarExpandMode.Full ? this.height : 'auto';\n }\n get overflow() {\n return this.expandMode === PanelBarExpandMode.Full ? \"hidden\" : \"visible\";\n }\n get dir() {\n return this.localization.rtl ? 'rtl' : 'ltr';\n }\n /**\n * @hidden\n */\n invertKeys(original, inverted) {\n return this.localization.rtl ? inverted : original;\n }\n get computedKeys() {\n return {\n [Keys.Space]: () => this.selectFocusedItem(),\n [Keys.Enter]: () => this.selectFocusedItem(),\n [Keys.ArrowUp]: () => this.focusPreviousItem(),\n [this.invertKeys(Keys.ArrowLeft, Keys.ArrowRight)]: () => this.collapseItem(),\n [Keys.ArrowDown]: () => this.focusNextItem(),\n [this.invertKeys(Keys.ArrowRight, Keys.ArrowLeft)]: () => this.expandItem(),\n [Keys.End]: () => this.focusLastItem(),\n [Keys.Home]: () => this.focusFirstItem()\n };\n }\n ngOnDestroy() {\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n }\n ngOnInit() {\n this.localizationChangeSubscription = this.localization\n .changes.subscribe(() => this.keyBindings = this.computedKeys);\n this.eventService.animate = this.animate;\n this.eventService.expandMode = this.expandMode;\n }\n ngAfterViewChecked() {\n if (this.items) {\n this.childrenItems = this.viewChildItems.toArray();\n this.allItems = this.viewItems;\n }\n else {\n this.childrenItems = this.contentChildItems.toArray();\n this.allItems = this.contentItems.toArray();\n }\n if (this.isViewInit && this.childrenItems.length) {\n this.isViewInit = false;\n setTimeout(() => this.updateChildrenHeight());\n }\n this.validateConfiguration();\n }\n ngOnChanges(changes) {\n if (changes['height'] || changes['expandMode'] || changes[\"items\"]) { // tslint:disable-line\n if (this.childrenItems) {\n setTimeout(this.updateChildrenHeight);\n }\n }\n if (changes.animate) {\n this.eventService.animate = this.animate;\n }\n if (changes.expandMode) {\n this.eventService.expandMode = this.expandMode;\n }\n }\n get templateRef() {\n return this.template ? this.template.templateRef : undefined;\n }\n /**\n * @hidden\n */\n onComponentClick(event) {\n const itemClicked = this.visibleItems().some((item) => {\n return item.header.nativeElement.contains(event.target);\n });\n if (!this.focused && itemClicked) {\n this.elementRef.nativeElement.focus();\n }\n }\n /**\n * @hidden\n */\n onComponentFocus() {\n this.eventService.onFocus();\n this.focused = true;\n if (this.allItems.length > 0) {\n const visibleItems = this.visibleItems();\n const focusedItems = visibleItems.filter(item => item.focused);\n if (!focusedItems.length && visibleItems.length > 0) {\n visibleItems[0].focused = true;\n this.activeDescendant = visibleItems[0].itemId;\n }\n }\n }\n /**\n * @hidden\n */\n onComponentBlur() {\n this.eventService.onBlur();\n this.focused = false;\n this.activeDescendant = \"\";\n }\n /**\n * @hidden\n */\n onComponentKeyDown(event) {\n if (event.target === this.elementRef.nativeElement) {\n if (event.keyCode === Keys.Space || event.keyCode === Keys.ArrowUp || event.keyCode === Keys.ArrowDown ||\n event.keyCode === Keys.ArrowLeft || event.keyCode === Keys.ArrowRight || event.keyCode === Keys.Home ||\n event.keyCode === Keys.End || event.keyCode === Keys.PageUp || event.keyCode === Keys.PageDown) {\n event.preventDefault();\n }\n const handler = this.keyBindings[event.keyCode];\n //TODO: check if next item is disabled and skip operation?\n if (handler) {\n handler();\n }\n }\n }\n get viewItems() {\n let treeItems = [];\n this.viewChildItems.toArray().forEach(item => {\n treeItems.push(item);\n treeItems = treeItems.concat(item.subTreeViewItems());\n });\n return treeItems;\n }\n validateConfiguration() {\n if (isDevMode()) {\n if (this.items && (this.contentItems && this.contentItems.length > 0)) {\n throw new Error(\"Invalid configuration: mixed template components and items property.\");\n }\n }\n }\n onItemAction(item) {\n if (!item) {\n return;\n }\n let modifiedItems = new Array();\n this.allItems\n .forEach((currentItem) => {\n let selectedState = currentItem === item;\n let focusedState = selectedState;\n selectedState = this.selectable ? selectedState : currentItem.selected;\n if (currentItem.selected !== selectedState || currentItem.focused !== focusedState) {\n currentItem.selected = selectedState;\n currentItem.focused = focusedState;\n this.activeDescendant = focusedState ? currentItem.itemId : \"\";\n modifiedItems.push(currentItem);\n }\n });\n if (this.expandMode === PanelBarExpandMode.Multiple) {\n if (item.hasChildItems || item.hasContent) {\n item.expanded = !item.expanded;\n }\n if (modifiedItems.indexOf(item) < 0) {\n modifiedItems.push(item);\n }\n }\n else {\n let siblings = item.parent ? item.parent.childrenItems : this.childrenItems;\n if (item.hasChildItems || item.hasContent) {\n siblings\n .forEach((currentItem) => {\n let expandedState = currentItem === item;\n if (currentItem.expanded !== expandedState) {\n currentItem.expanded = expandedState;\n if (modifiedItems.indexOf(currentItem) < 0) {\n modifiedItems.push(currentItem);\n }\n }\n });\n }\n }\n if (modifiedItems.length > 0) {\n this.stateChange.emit(modifiedItems.map(currentItem => currentItem.serialize()));\n }\n }\n get hostClasses() {\n return true;\n }\n isVisible(item) {\n const visibleItems = this.visibleItems();\n return visibleItems.some(i => i === item);\n }\n getVisibleParent(item) {\n const visibleItems = this.visibleItems();\n if (!item.parent) {\n return item;\n }\n return visibleItems.some(i => i === item.parent) ? item.parent : this.getVisibleParent(item.parent);\n }\n focusItem(action) {\n const visibleItems = this.visibleItems();\n let currentIndex = visibleItems.findIndex(item => item.focused);\n let currentItem = visibleItems[currentIndex];\n let nextItem;\n if (currentIndex === -1) {\n let focusedItem = this.allItems.find(item => item.focused);\n focusedItem.focused = false;\n currentItem = this.getVisibleParent(focusedItem);\n currentIndex = visibleItems.findIndex(item => item === currentItem);\n }\n switch (action) {\n case \"lastItem\":\n nextItem = visibleItems[visibleItems.length - 1];\n break;\n case \"firstItem\":\n nextItem = visibleItems[0];\n break;\n case \"nextItem\":\n nextItem = visibleItems[currentIndex < visibleItems.length - 1 ? currentIndex + 1 : 0];\n break;\n case \"previousItem\":\n nextItem = visibleItems[currentIndex > 0 ? currentIndex - 1 : visibleItems.length - 1];\n break;\n default:\n }\n if (currentItem && nextItem && currentItem !== nextItem) {\n this.moveFocus(currentItem, nextItem);\n }\n }\n moveFocus(from, to) {\n from.focused = false;\n to.focused = true;\n this.activeDescendant = to.itemId;\n const modifiedItems = new Array(from.serialize(), to.serialize());\n this.stateChange.emit(modifiedItems);\n }\n focusLastItem() {\n this.focusItem(\"lastItem\");\n }\n focusFirstItem() {\n this.focusItem(\"firstItem\");\n }\n focusNextItem() {\n this.focusItem(\"nextItem\");\n }\n focusPreviousItem() {\n this.focusItem(\"previousItem\");\n }\n expandItem() {\n let currentItem = this.allItems.filter(item => item.focused)[0];\n if (!this.isVisible(currentItem)) {\n currentItem.focused = false;\n currentItem = this.getVisibleParent(currentItem);\n }\n if (currentItem.hasChildItems || currentItem.hasContent) {\n if (!currentItem.expanded) {\n this.onItemAction(currentItem);\n }\n else if (currentItem.hasChildItems) {\n const firstChildIndex = currentItem.childrenItems.findIndex(item => !item.disabled);\n if (firstChildIndex > -1) {\n this.moveFocus(currentItem, currentItem.childrenItems[firstChildIndex]);\n }\n }\n }\n }\n collapseItem() {\n const currentItem = this.allItems.filter(item => item.focused)[0];\n if (currentItem.expanded) {\n this.onItemAction(currentItem);\n }\n else if (currentItem.parent) {\n this.moveFocus(currentItem, currentItem.parent);\n }\n }\n selectFocusedItem() {\n let focusedItem = this.allItems.filter(item => item.focused)[0];\n if (!this.isVisible(focusedItem)) {\n focusedItem.focused = false;\n focusedItem = this.getVisibleParent(focusedItem);\n }\n if (focusedItem) {\n focusedItem.onItemAction();\n }\n }\n visibleItems() {\n return this.flatVisibleItems(this.childrenItems);\n }\n flatVisibleItems(listOfItems = new Array(), flattedItems = new Array()) {\n listOfItems.forEach(item => {\n if (!item.disabled) {\n flattedItems.push(item);\n if (item.expanded && item.hasChildItems) {\n this.flatVisibleItems(item.childrenItems, flattedItems);\n }\n }\n });\n return flattedItems;\n }\n}\nPanelBarComponent.ɵfac = function PanelBarComponent_Factory(t) { return new (t || PanelBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(PanelBarService), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nPanelBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: PanelBarComponent, selectors: [[\"kendo-panelbar\"]], contentQueries: function PanelBarComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarItemTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarItemComponent, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, PanelBarItemComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentItems = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.contentChildItems = _t);\n } }, viewQuery: function PanelBarComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(PanelBarItemComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.viewChildItems = _t);\n } }, hostVars: 12, hostBindings: function PanelBarComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function PanelBarComponent_click_HostBindingHandler($event) { return ctx.onComponentClick($event); })(\"focus\", function PanelBarComponent_focus_HostBindingHandler() { return ctx.onComponentFocus(); })(\"blur\", function PanelBarComponent_blur_HostBindingHandler() { return ctx.onComponentBlur(); })(\"keydown\", function PanelBarComponent_keydown_HostBindingHandler($event) { return ctx.onComponentKeyDown($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabIndex\", ctx.tabIndex)(\"role\", ctx.role)(\"aria-activedescendant\", ctx.activeDescendant)(\"dir\", ctx.dir);\n ɵngcc0.ɵɵstyleProp(\"height\", ctx.hostHeight)(\"overflow\", ctx.overflow);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-panelbar\", ctx.hostClasses);\n } }, inputs: { expandMode: \"expandMode\", selectable: \"selectable\", animate: \"animate\", height: \"height\", keepItemContent: \"keepItemContent\", items: \"items\" }, outputs: { stateChange: \"stateChange\" }, exportAs: [\"kendoPanelbar\"], features: [ɵngcc0.ɵɵProvidersFeature([\n PanelBarService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.panelbar'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c5, decls: 2, vars: 2, consts: [[4, \"ngIf\"], [3, \"ngIf\"], [4, \"ngFor\", \"ngForOf\"], [3, \"title\", \"id\", \"icon\", \"iconClass\", \"imageUrl\", \"selected\", \"expanded\", \"disabled\", \"template\", \"items\", \"content\", 4, \"ngIf\"], [3, \"title\", \"id\", \"icon\", \"iconClass\", \"imageUrl\", \"selected\", \"expanded\", \"disabled\", \"template\", \"items\", \"content\"]], template: function PanelBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c4);\n ɵngcc0.ɵɵtemplate(0, PanelBarComponent_0_Template, 1, 0, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, PanelBarComponent_ng_template_1_Template, 1, 1, \"ng-template\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.contentChildItems && !ctx.items);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.items == null ? null : ctx.items.length);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgForOf, PanelBarItemComponent], encapsulation: 2 });\n/** @nocollapse */\nPanelBarComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: PanelBarService },\n { type: LocalizationService }\n];\nPanelBarComponent.propDecorators = {\n expandMode: [{ type: Input }],\n selectable: [{ type: Input }],\n animate: [{ type: Input }],\n height: [{ type: Input }],\n keepItemContent: [{ type: Input }],\n items: [{ type: Input }],\n stateChange: [{ type: Output }],\n tabIndex: [{ type: HostBinding, args: ['attr.tabIndex',] }],\n role: [{ type: HostBinding, args: ['attr.role',] }],\n activeDescendant: [{ type: HostBinding, args: ['attr.aria-activedescendant',] }],\n hostHeight: [{ type: HostBinding, args: ['style.height',] }],\n overflow: [{ type: HostBinding, args: ['style.overflow',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n template: [{ type: ContentChild, args: [PanelBarItemTemplateDirective,] }],\n contentItems: [{ type: ContentChildren, args: [PanelBarItemComponent, { descendants: true },] }],\n contentChildItems: [{ type: ContentChildren, args: [PanelBarItemComponent,] }],\n viewChildItems: [{ type: ViewChildren, args: [PanelBarItemComponent,] }],\n onComponentClick: [{ type: HostListener, args: ['click', ['$event'],] }],\n onComponentFocus: [{ type: HostListener, args: ['focus',] }],\n onComponentBlur: [{ type: HostListener, args: ['blur',] }],\n onComponentKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-panelbar',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoPanelbar',\n providers: [\n PanelBarService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.panelbar'\n }\n ],\n selector: 'kendo-panelbar',\n template: `\n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: PanelBarService }, { type: ɵngcc2.LocalizationService }]; }, { expandMode: [{\n type: Input\n }], selectable: [{\n type: Input\n }], animate: [{\n type: Input\n }], height: [{\n type: Input\n }], stateChange: [{\n type: Output\n }], tabIndex: [{\n type: HostBinding,\n args: ['attr.tabIndex']\n }], role: [{\n type: HostBinding,\n args: ['attr.role']\n }], activeDescendant: [{\n type: HostBinding,\n args: ['attr.aria-activedescendant']\n }], keepItemContent: [{\n type: Input\n }], items: [{\n type: Input\n }], hostHeight: [{\n type: HostBinding,\n args: ['style.height']\n }], overflow: [{\n type: HostBinding,\n args: ['style.overflow']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], onComponentClick: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], onComponentFocus: [{\n type: HostListener,\n args: ['focus']\n }], onComponentBlur: [{\n type: HostListener,\n args: ['blur']\n }], onComponentKeyDown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-panelbar']\n }], template: [{\n type: ContentChild,\n args: [PanelBarItemTemplateDirective]\n }], contentItems: [{\n type: ContentChildren,\n args: [PanelBarItemComponent, { descendants: true }]\n }], contentChildItems: [{\n type: ContentChildren,\n args: [PanelBarItemComponent]\n }], viewChildItems: [{\n type: ViewChildren,\n args: [PanelBarItemComponent]\n }] }); })();\n\n/**\n * Represents the pane component of the Splitter.\n */\nclass SplitterPaneComponent {\n constructor(element, renderer, cdr) {\n this.element = element;\n this.renderer = renderer;\n this.cdr = cdr;\n /**\n * Specifies if the user is allowed to resize the pane and provide space for other panes.\n */\n this.resizable = true;\n /**\n * Specifies if the user is allowed to hide the pane and provide space for other panes.\n */\n this.collapsible = false;\n /**\n * Specifies if overflowing content is scrollable or hidden.\n */\n this.scrollable = true;\n /**\n * Specifies if the pane is initially collapsed.\n */\n this.collapsed = false;\n /**\n * @hidden\n */\n this.orientation = 'horizontal';\n /**\n * @hidden\n */\n this.containsSplitter = false;\n /**\n * @hidden\n */\n this.overlayContent = false;\n /**\n * Fires each time the user resizes the Splitter pane.\n * The event data contains the new pane size.\n * Allows a two-way binding of the pane `size` property.\n */\n this.sizeChange = new EventEmitter();\n /**\n * Fires each time the `collapsed` property changes.\n * The event data contains the new property state.\n * Allows a two-way binding of the `collapsed` pane property.\n */\n this.collapsedChange = new EventEmitter();\n this.hostClass = true;\n /**\n * @hidden\n */\n this.forceExpand = false;\n }\n /**\n * @hidden\n */\n set order(paneOrder) {\n this._order = paneOrder;\n this.setOrderStyles();\n }\n get order() {\n return this._order;\n }\n /**\n * Sets the initial size of the pane.\n * Has to be between the `min` and `max` properties.\n */\n set size(newSize) {\n this._size = newSize;\n const element = this.element.nativeElement;\n this.renderer.setStyle(element, '-ms-flex-preferred-size', newSize);\n this.renderer.setStyle(element, 'flex-basis', newSize);\n if (this.staticPaneClass) {\n this.renderer.addClass(element, 'k-pane-static');\n }\n else {\n this.renderer.removeClass(element, 'k-pane-static');\n }\n }\n get size() {\n return this._size;\n }\n get isHidden() {\n return this.collapsed;\n }\n get styleDisplayFlex() {\n return this.containsSplitter;\n }\n get staticPaneClass() {\n if (this.forceExpand) {\n return false;\n }\n return !this.resizable && !this.collapsible || this.fixedSize;\n }\n get scrollablePaneClass() {\n return this.scrollable;\n }\n get fixedSize() {\n return this.size && this.size.length > 0;\n }\n ngAfterViewChecked() {\n const element = this.element.nativeElement;\n if (this.isHidden) {\n this.renderer.addClass(element, 'k-state-hidden');\n this.renderer.addClass(element, 'hidden');\n }\n else {\n this.renderer.removeClass(element, 'k-state-hidden');\n this.renderer.removeClass(element, 'hidden');\n }\n }\n /**\n * @hidden\n */\n get computedSize() {\n if (this.orientation === 'vertical') {\n return this.element.nativeElement.offsetHeight;\n }\n else {\n return this.element.nativeElement.offsetWidth;\n }\n }\n /**\n * @hidden\n */\n toggleOverlay(show) {\n this.overlayContent = show;\n this.cdr.detectChanges();\n }\n /**\n * @hidden\n */\n detectChanges() {\n this.cdr.detectChanges();\n }\n /**\n * @hidden\n */\n setOrderStyles() {\n const element = this.element.nativeElement;\n this.renderer.setStyle(element, '-ms-flex-order', this.order);\n this.renderer.setStyle(element, 'order', this.order);\n }\n}\nSplitterPaneComponent.ɵfac = function SplitterPaneComponent_Factory(t) { return new (t || SplitterPaneComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nSplitterPaneComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SplitterPaneComponent, selectors: [[\"kendo-splitter-pane\"]], hostVars: 8, hostBindings: function SplitterPaneComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-pane\", ctx.hostClass)(\"k-pane-flex\", ctx.styleDisplayFlex)(\"k-pane-static\", ctx.staticPaneClass)(\"k-scrollable\", ctx.scrollablePaneClass);\n } }, inputs: { resizable: \"resizable\", collapsible: \"collapsible\", scrollable: \"scrollable\", collapsed: \"collapsed\", orientation: \"orientation\", containsSplitter: \"containsSplitter\", overlayContent: \"overlayContent\", order: \"order\", size: \"size\", min: \"min\", max: \"max\" }, outputs: { sizeChange: \"sizeChange\", collapsedChange: \"collapsedChange\" }, exportAs: [\"kendoSplitterPane\"], ngContentSelectors: _c6, decls: 2, vars: 2, consts: [[4, \"ngIf\"], [\"class\", \"k-splitter-overlay k-overlay\", 4, \"ngIf\"], [1, \"k-splitter-overlay\", \"k-overlay\"]], template: function SplitterPaneComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, SplitterPaneComponent_ng_container_0_Template, 2, 0, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(1, SplitterPaneComponent_div_1_Template, 1, 0, \"div\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.collapsed);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.overlayContent);\n } }, directives: [ɵngcc1.NgIf], encapsulation: 2 });\n/** @nocollapse */\nSplitterPaneComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: Renderer2 },\n { type: ChangeDetectorRef }\n];\nSplitterPaneComponent.propDecorators = {\n order: [{ type: Input }],\n size: [{ type: Input }],\n min: [{ type: Input }],\n max: [{ type: Input }],\n resizable: [{ type: Input }],\n collapsible: [{ type: Input }],\n scrollable: [{ type: Input }],\n collapsed: [{ type: Input }],\n orientation: [{ type: Input }],\n containsSplitter: [{ type: Input }],\n overlayContent: [{ type: Input }],\n sizeChange: [{ type: Output }],\n collapsedChange: [{ type: Output }],\n styleDisplayFlex: [{ type: HostBinding, args: ['class.k-pane-flex',] }],\n hostClass: [{ type: HostBinding, args: ['class.k-pane',] }],\n staticPaneClass: [{ type: HostBinding, args: ['class.k-pane-static',] }],\n scrollablePaneClass: [{ type: HostBinding, args: ['class.k-scrollable',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitterPaneComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoSplitterPane',\n selector: 'kendo-splitter-pane',\n template: `\n \n
\n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ChangeDetectorRef }]; }, { resizable: [{\n type: Input\n }], collapsible: [{\n type: Input\n }], scrollable: [{\n type: Input\n }], collapsed: [{\n type: Input\n }], orientation: [{\n type: Input\n }], containsSplitter: [{\n type: Input\n }], overlayContent: [{\n type: Input\n }], sizeChange: [{\n type: Output\n }], collapsedChange: [{\n type: Output\n }], hostClass: [{\n type: HostBinding,\n args: ['class.k-pane']\n }], order: [{\n type: Input\n }], size: [{\n type: Input\n }], styleDisplayFlex: [{\n type: HostBinding,\n args: ['class.k-pane-flex']\n }], staticPaneClass: [{\n type: HostBinding,\n args: ['class.k-pane-static']\n }], scrollablePaneClass: [{\n type: HostBinding,\n args: ['class.k-scrollable']\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }] }); })();\n\nconst SIZING_DOC_LINK = 'https://www.telerik.com/kendo-angular-ui/components/layout/splitter/panes/#toc-size';\n/**\n * @hidden\n */\nclass SplitterService {\n constructor(zone) {\n this.zone = zone;\n this.layoutChange = new EventEmitter();\n this.containerSize = () => { };\n }\n tryToggle(paneIndex) {\n const pane = this.pane(paneIndex);\n if (pane.collapsible) {\n pane.collapsed = !pane.collapsed;\n pane.collapsedChange.emit(pane.collapsed);\n this.emit(this.layoutChange, {});\n if (pane.collapsed) {\n pane.detectChanges();\n }\n }\n const notCollapsed = this.panes.filter(p => !p.collapsed);\n const allHaveFixedSize = notCollapsed.every(p => p.fixedSize);\n notCollapsed[notCollapsed.length - 1].forceExpand = allHaveFixedSize ? true : false;\n return pane.collapsible;\n }\n toggleContentOverlay(index, show) {\n this.pane(index).toggleOverlay(show);\n this.pane(index + 1).toggleOverlay(show);\n }\n dragState(splitbarIndex) {\n let prev = this.pane(splitbarIndex);\n let next = this.pane(splitbarIndex + 1);\n const total = prev.computedSize + next.computedSize;\n const px = s => this.toPixels(s);\n return {\n prev: {\n index: splitbarIndex,\n initialSize: prev.computedSize,\n min: px(prev.min) || total - px(next.max) || 0,\n max: px(prev.max) || total - px(next.min) || total\n },\n next: {\n index: splitbarIndex + 1,\n initialSize: next.computedSize,\n min: px(next.min) || total - px(prev.max) || 0,\n max: px(next.max) || total - px(prev.min) || total\n }\n };\n }\n setSize(state$$1, delta) {\n const clamp = (min, max, v) => Math.min(max, Math.max(min, v));\n const resize = (paneState, change) => {\n const pane = this.pane(paneState.index);\n const splitterSize = this.containerSize();\n const newSize = clamp(paneState.min, paneState.max, paneState.initialSize + change);\n let size = \"\";\n if (this.isPercent(pane.size)) {\n size = (100 * newSize / splitterSize) + \"%\";\n }\n else {\n size = newSize + \"px\";\n }\n pane.size = size;\n this.emit(pane.sizeChange, size);\n };\n const prev = this.pane(state$$1.prev.index);\n const next = this.pane(state$$1.next.index);\n // determine which pane to resize\n if (prev.fixedSize && next.fixedSize) {\n // resizing both panes\n resize(state$$1.prev, delta);\n resize(state$$1.next, -delta);\n }\n else if (next.collapsible || next.fixedSize) {\n // resizing next\n resize(state$$1.next, -delta);\n }\n else {\n // resizing prev\n resize(state$$1.prev, delta);\n }\n this.emit(this.layoutChange, {});\n }\n isDraggable(splitBarIndex) {\n const prev = this.pane(splitBarIndex);\n const next = this.pane(splitBarIndex + 1);\n const betweenResizablePanes = prev.resizable && next.resizable;\n const nearCollapsedPane = prev.collapsed || next.collapsed;\n return betweenResizablePanes && !nearCollapsedPane;\n }\n isStatic(splitBarIndex) {\n const prev = this.pane(splitBarIndex);\n const next = this.pane(splitBarIndex + 1);\n const betweenResizablePanes = prev.resizable && next.resizable;\n const nearCollapsiblePane = prev.collapsible || next.collapsible;\n return !betweenResizablePanes && !nearCollapsiblePane;\n }\n pane(index) {\n if (!this.panes) {\n throw new Error(\"Panes not initialized\");\n }\n if (index < 0 || index >= this.panes.length) {\n throw new Error(\"Index out of range\");\n }\n return this.panes[index];\n }\n configure({ panes, orientation, containerSize }) {\n this.panes = panes;\n this.panes.forEach((pane, index) => {\n pane.order = index * 2;\n pane.orientation = orientation;\n });\n if (isDevMode()) {\n const allFixed = panes.length && !panes.some(pane => !pane.fixedSize);\n if (allFixed) {\n throw new Error(`\n The Splitter should have at least one pane without a set size.\n See ${SIZING_DOC_LINK} for more information.\n `);\n }\n }\n this.containerSize = containerSize;\n }\n isPercent(size) {\n return /%$/.test(size);\n }\n toPixels(size) {\n let result = parseFloat(size);\n if (this.isPercent(size)) {\n result = (this.containerSize() * result / 100);\n }\n return result;\n }\n emit(emitter, args) {\n if (emitter.observers.length) {\n this.zone.run(() => emitter.emit(args));\n }\n }\n}\nSplitterService.ɵfac = function SplitterService_Factory(t) { return new (t || SplitterService)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nSplitterService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: SplitterService, factory: SplitterService.ɵfac });\n/** @nocollapse */\nSplitterService.ctorParameters = () => [\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitterService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.NgZone }]; }, null); })();\n\n/**\n * Represents the [Kendo UI Splitter component for Angular]({% slug overview_splitter %}).\n *\n * ```ts-preview\n *\n * @Component({\n * selector: 'my-app',\n * template: `\n * \n *\n * \n *

Inner splitter / left pane

\n *

Resizable and collapsible.

\n *
\n *\n * \n *

Inner splitter / center pane

\n *

Resizable only.

\n *
\n *\n * \n *

Inner splitter / right pane

\n *

Resizable and collapsible.

\n *
\n *\n *
\n * `,\n * styles: [ `\n * h3 { font-size: 1.2em; }\n * h3, p { margin: 10px; padding: 0; }\n * ` ]\n * })\n * class AppComponent {}\n * ```\n */\nclass SplitterComponent {\n constructor(element, splitterService, localization, enclosingPane) {\n this.element = element;\n this.splitterService = splitterService;\n this.localization = localization;\n /**\n * Specifies the orientation of the panes within the Splitter.\n * Panes in a horizontal Splitter are placed horizontally.\n * Panes in a vertical Splitter are placed vertically.\n */\n this.orientation = 'horizontal';\n this.ariaRole = 'splitter';\n if (enclosingPane) {\n enclosingPane.containsSplitter = true;\n }\n // the handler only runs in NgZone if there are bound handlers\n // this line merges both streams\n this.layoutChange = this.splitterService.layoutChange;\n this.configure = this.configure.bind(this);\n }\n get hostClasses() {\n return true;\n }\n get horizontalHostClasses() {\n return this.orientation === 'horizontal';\n }\n get verticalHostClasses() {\n return this.orientation === 'vertical';\n }\n get dir() {\n return this.direction;\n }\n ngAfterContentInit() {\n this.reconfigure();\n }\n ngOnChanges(changes) {\n if (changes.orientation && !changes.orientation.isFirstChange()) {\n this.reconfigure();\n }\n }\n ngOnDestroy() {\n this.unsubscribeChanges();\n }\n reconfigure() {\n this.unsubscribeChanges();\n this.configure();\n this.paneChangesSubscription = this.panes.changes.subscribe(this.configure);\n }\n unsubscribeChanges() {\n if (this.paneChangesSubscription) {\n this.paneChangesSubscription.unsubscribe();\n this.paneChangesSubscription = null;\n }\n }\n configure() {\n this.splitterService.configure({\n panes: this.panes.toArray(),\n orientation: this.orientation,\n containerSize: () => {\n if (this.orientation === 'vertical') {\n return this.element.nativeElement.clientHeight;\n }\n else {\n return this.element.nativeElement.clientWidth;\n }\n }\n });\n }\n get direction() {\n return this.localization.rtl ? 'rtl' : 'ltr';\n }\n}\nSplitterComponent.ɵfac = function SplitterComponent_Factory(t) { return new (t || SplitterComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(SplitterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(SplitterPaneComponent, 9)); };\nSplitterComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SplitterComponent, selectors: [[\"kendo-splitter\"]], contentQueries: function SplitterComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, SplitterPaneComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.panes = _t);\n } }, hostVars: 12, hostBindings: function SplitterComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.ariaRole)(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-splitter\", ctx.hostClasses)(\"k-splitter-flex\", ctx.hostClasses)(\"k-splitter-horizontal\", ctx.horizontalHostClasses)(\"k-splitter-vertical\", ctx.verticalHostClasses);\n } }, inputs: { orientation: \"orientation\" }, outputs: { layoutChange: \"layoutChange\" }, exportAs: [\"kendoSplitter\"], features: [ɵngcc0.ɵɵProvidersFeature([\n SplitterService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.spliter'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], ngContentSelectors: _c8, decls: 2, vars: 1, consts: [[4, \"ngFor\", \"ngForOf\"], [\"kendoDraggable\", \"\", 3, \"index\", \"orientation\", 4, \"ngIf\"], [\"kendoDraggable\", \"\", 3, \"index\", \"orientation\"]], template: function SplitterComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c7);\n ɵngcc0.ɵɵprojection(0);\n ɵngcc0.ɵɵtemplate(1, SplitterComponent_ng_container_1_Template, 2, 1, \"ng-container\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.panes);\n } }, directives: function () { return [ɵngcc1.NgForOf, ɵngcc1.NgIf, SplitterBarComponent, ɵngcc3.DraggableDirective]; }, encapsulation: 2 });\n/** @nocollapse */\nSplitterComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: SplitterService },\n { type: LocalizationService },\n { type: SplitterPaneComponent, decorators: [{ type: Optional }, { type: Host }, { type: Inject, args: [SplitterPaneComponent,] }] }\n];\nSplitterComponent.propDecorators = {\n orientation: [{ type: Input }],\n layoutChange: [{ type: Output }],\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-splitter',] }, { type: HostBinding, args: ['class.k-splitter-flex',] }],\n horizontalHostClasses: [{ type: HostBinding, args: ['class.k-splitter-horizontal',] }],\n verticalHostClasses: [{ type: HostBinding, args: ['class.k-splitter-vertical',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n ariaRole: [{ type: HostBinding, args: ['attr.role',] }],\n panes: [{ type: ContentChildren, args: [SplitterPaneComponent,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitterComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoSplitter',\n selector: 'kendo-splitter',\n providers: [\n SplitterService,\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.spliter'\n }\n ],\n template: `\n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: SplitterService }, { type: ɵngcc2.LocalizationService }, { type: SplitterPaneComponent, decorators: [{\n type: Optional\n }, {\n type: Host\n }, {\n type: Inject,\n args: [SplitterPaneComponent]\n }] }]; }, { orientation: [{\n type: Input\n }], ariaRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], layoutChange: [{\n type: Output\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-splitter']\n }, {\n type: HostBinding,\n args: ['class.k-splitter-flex']\n }], horizontalHostClasses: [{\n type: HostBinding,\n args: ['class.k-splitter-horizontal']\n }], verticalHostClasses: [{\n type: HostBinding,\n args: ['class.k-splitter-vertical']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], panes: [{\n type: ContentChildren,\n args: [SplitterPaneComponent]\n }] }); })();\n\n/**\n * Represents the content template of the Kendo UI TabStrip.\n * To define the template, nest a `` tag with the `kendoTabContent` inside the component tag.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n *

Content 1

\n *
\n *
\n *\n * \n * \n *

Content 2

\n *
\n *
\n *
\n * `\n * })\n *\n * class AppComponent {}\n *\n * ```\n */\nclass TabContentDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nTabContentDirective.ɵfac = function TabContentDirective_Factory(t) { return new (t || TabContentDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nTabContentDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TabContentDirective, selectors: [[\"\", \"kendoTabContent\", \"\"]] });\n/** @nocollapse */\nTabContentDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TabContentDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoTabContent]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Represents the title template of the Kendo UI TabStrip.\n * To define the template, nest a `` tag with the `kendoTabTitle` directive inside the component tag.\n *\n * @example\n * ```ts-preview\n *\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * Title\n * \n * \n *

Content 1

\n *
\n *
\n *\n * \n * \n *

Content 2

\n *
\n *
\n *
\n * `\n * })\n *\n * class AppComponent {}\n *\n * ```\n */\nclass TabTitleDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nTabTitleDirective.ɵfac = function TabTitleDirective_Factory(t) { return new (t || TabTitleDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nTabTitleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: TabTitleDirective, selectors: [[\"\", \"kendoTabTitle\", \"\"]] });\n/** @nocollapse */\nTabTitleDirective.ctorParameters = () => [\n { type: TemplateRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TabTitleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoTabTitle]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * Represents the tab component of the TabStrip.\n */\nclass TabStripTabComponent {\n constructor() {\n this.active = false;\n this._tabContent = new QueryList();\n }\n get tabContent() {\n return this._tabContent.first;\n }\n ngAfterContentInit() {\n this.active = this.selected;\n }\n ngOnChanges(changes) {\n if (changes['selected'] && !changes['selected'].isFirstChange()) { // tslint:disable-line\n this.active = this.selected;\n }\n }\n}\nTabStripTabComponent.ɵfac = function TabStripTabComponent_Factory(t) { return new (t || TabStripTabComponent)(); };\nTabStripTabComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TabStripTabComponent, selectors: [[\"kendo-tabstrip-tab\"]], contentQueries: function TabStripTabComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, TabTitleDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, TabContentDirective, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.tabTitle = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._tabContent = _t);\n } }, inputs: { title: \"title\", disabled: \"disabled\", cssClass: \"cssClass\", selected: \"selected\" }, exportAs: [\"kendoTabStripTab\"], features: [ɵngcc0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function TabStripTabComponent_Template(rf, ctx) { }, encapsulation: 2 });\nTabStripTabComponent.propDecorators = {\n title: [{ type: Input }],\n disabled: [{ type: Input }],\n cssClass: [{ type: Input }],\n selected: [{ type: Input }],\n _tabContent: [{ type: ContentChildren, args: [TabContentDirective,] }],\n tabTitle: [{ type: ContentChild, args: [TabTitleDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TabStripTabComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoTabStripTab',\n selector: 'kendo-tabstrip-tab',\n template: ``\n }]\n }], function () { return []; }, { _tabContent: [{\n type: ContentChildren,\n args: [TabContentDirective]\n }], title: [{\n type: Input\n }], disabled: [{\n type: Input\n }], cssClass: [{\n type: Input\n }], selected: [{\n type: Input\n }], tabTitle: [{\n type: ContentChild,\n args: [TabTitleDirective]\n }] }); })();\n\n/**\n * @hidden\n */\nclass PreventableEvent {\n /**\n * @hidden\n */\n constructor(args) {\n this.prevented = false;\n Object.assign(this, args);\n }\n /**\n * Prevents the default action for a specified event.\n * In this way, the source component suppresses\n * the built-in behavior that follows the event.\n */\n preventDefault() {\n this.prevented = true;\n }\n /**\n * Returns `true` if the event was prevented\n * by any of its subscribers.\n *\n * @returns `true` if the default action was prevented.\n * Otherwise, returns `false`.\n */\n isDefaultPrevented() {\n return this.prevented;\n }\n}\n\n/**\n * Arguments for the `select` event of the TabStrip.\n * The `select` event fires when a tab is selected (clicked).\n */\nclass SelectEvent extends PreventableEvent {\n /**\n * Constructs the event arguments for the `select` event.\n * @param index - The index of the selected tab.\n * @param title - The title of the selected tab.\n */\n constructor(index, title) {\n super();\n this.index = index;\n this.title = title;\n }\n}\n\n/**\n * Represents the [Kendo UI TabStrip component for Angular]({% slug overview_tabstrip %}).\n */\nclass TabStripComponent {\n constructor(localization, renderer, wrapper) {\n this.localization = localization;\n this.renderer = renderer;\n this.wrapper = wrapper;\n /**\n * Enables the tab animation.\n */\n this.animate = true;\n /**\n * Sets the position of the tabs. Defaults to `top`.\n */\n this.tabPosition = 'top';\n /**\n * When set to `true`, the component renders all tabs and they are persisted in the DOM.\n * By default, `keepTabContent` is `false`.\n */\n this.keepTabContent = false;\n /**\n * Fires each time the user selects a tab ([see example]({% slug overview_tabstrip %}#toc-basic-usage)).\n * The event data contains the index of the selected tab and its title.\n */\n this.tabSelect = new EventEmitter();\n this.hostClasses = true;\n /**\n * @hidden\n */\n this._animate = false;\n this.keyBindings = this.computedKeys;\n }\n /**\n * Sets the height of the TabStrip.\n */\n set height(value) {\n this._height = value;\n this.renderer.setStyle(this.wrapper.nativeElement, 'height', value);\n }\n get height() {\n return this._height;\n }\n get tabsAtTop() {\n return this.tabPosition === 'top';\n }\n get tabsAtRight() {\n return this.tabPosition === 'right';\n }\n get tabsAtBottom() {\n return this.tabPosition === 'bottom';\n }\n get tabsAtLeft() {\n return this.tabPosition === 'left';\n }\n get dir() {\n return this.localization.rtl ? 'rtl' : 'ltr';\n }\n /**\n * @hidden\n */\n contentClass(active) {\n const visible = !this.keepTabContent || active;\n return visible ? 'k-content k-state-active' : 'k-content';\n }\n get computedKeys() {\n return {\n [this.invertKeys(Keys.ArrowLeft, Keys.ArrowRight)]: (selectedIndex) => this.prevNavigatableIndex(selectedIndex),\n [this.invertKeys(Keys.ArrowRight, Keys.ArrowLeft)]: (selectedIndex) => this.nextNavigatableIndex(selectedIndex),\n [this.invertKeys(Keys.ArrowDown, Keys.ArrowUp)]: (selectedIndex) => this.nextNavigatableIndex(selectedIndex),\n [this.invertKeys(Keys.ArrowUp, Keys.ArrowDown)]: (selectedIndex) => this.prevNavigatableIndex(selectedIndex),\n [Keys.Home]: () => this.firstNavigatableIndex(),\n [Keys.End]: () => this.lastNavigatableIndex()\n };\n }\n /**\n * @hidden\n */\n get tabsAlignment() {\n return {\n start: 'flex-start',\n end: 'flex-end',\n center: 'center',\n justify: 'space-between'\n }[this.tabAlignment];\n }\n /**\n * @hidden\n */\n invertKeys(original, inverted) {\n return this.localization.rtl ? inverted : original;\n }\n /**\n * @hidden\n */\n onKeyDown(event) {\n if (event.currentTarget !== this.tablist.nativeElement) {\n return;\n }\n const isHorizontal = this.tabPosition === 'top' || this.tabPosition === 'bottom';\n const isArrowUp = event.keyCode === Keys.ArrowUp;\n const isArrowDown = event.keyCode === Keys.ArrowDown;\n const isArrowLeft = event.keyCode === Keys.ArrowLeft;\n const isArrowRight = event.keyCode === Keys.ArrowRight;\n if (isHorizontal && (isArrowUp || isArrowDown)) {\n return;\n }\n if (!isHorizontal && (isArrowLeft || isArrowRight)) {\n return;\n }\n if (event.keyCode === Keys.Space || isArrowUp || isArrowDown || isArrowLeft || isArrowRight || event.keyCode === Keys.Home ||\n event.keyCode === Keys.End || event.keyCode === Keys.PageUp || event.keyCode === Keys.PageDown) {\n event.preventDefault();\n }\n const selectedIndex = this.tabs.toArray().findIndex(tab => tab.active && !tab.disabled);\n if (selectedIndex === -1) {\n this.selectTab(this.firstNavigatableIndex());\n }\n else {\n const getTabIndex = this.keyBindings[event.keyCode];\n if (getTabIndex) {\n const nextIndex = getTabIndex(selectedIndex);\n if (selectedIndex !== nextIndex) {\n this.selectTab(getTabIndex(selectedIndex));\n }\n }\n }\n }\n /**\n * @hidden\n */\n tabPanelId(id) {\n return 'k-tabstrip-tabpanel-' + id;\n }\n /**\n * @hidden\n */\n tabId(id) {\n return 'k-tabstrip-tab-' + id;\n }\n /**\n * Allows the user to select a tab programmatically.\n * @param {number} index - The index of the tab that will be selected.\n */\n selectTab(index) {\n const tab = this.tabs.toArray()[index];\n if (!tab || Boolean(tab.disabled)) {\n return;\n }\n this.tabHeadingContainers.toArray()[index].nativeElement.focus();\n this.emitEvent(tab, index);\n }\n /**\n * @hidden\n */\n onTabClick(originalEvent, tabIndex) {\n if (isFocusable(originalEvent.target)) {\n return;\n }\n this.selectTab(tabIndex);\n }\n ngOnInit() {\n this.localizationChangeSubscription = this.localization\n .changes.subscribe(() => this.keyBindings = this.computedKeys);\n }\n ngOnDestroy() {\n if (this.localizationChangeSubscription) {\n this.localizationChangeSubscription.unsubscribe();\n }\n }\n firstNavigatableIndex() {\n const tabs = this.tabs.toArray();\n for (let i = 0; i < tabs.length; i++) {\n if (!tabs[i].disabled) {\n return i;\n }\n }\n }\n lastNavigatableIndex() {\n const tabs = this.tabs.toArray();\n for (let i = tabs.length - 1; i > 0; i--) {\n if (!tabs[i].disabled) {\n return i;\n }\n }\n }\n prevNavigatableIndex(selectedIndex) {\n if (selectedIndex - 1 < 0) {\n return this.lastNavigatableIndex();\n }\n const tabs = this.tabs.toArray();\n for (let i = selectedIndex - 1; i > -1; i--) {\n if (!tabs[i].disabled) {\n return i;\n }\n if (i === 0) {\n return this.lastNavigatableIndex();\n }\n }\n return selectedIndex;\n }\n nextNavigatableIndex(selectedIndex) {\n if (selectedIndex + 1 >= this.tabs.length) {\n return this.firstNavigatableIndex();\n }\n const tabs = this.tabs.toArray();\n for (let i = selectedIndex + 1; i < tabs.length; i++) {\n if (!tabs[i].disabled) {\n return i;\n }\n if (i + 1 === tabs.length) {\n return this.firstNavigatableIndex();\n }\n }\n }\n emitEvent(tab, selectedIndex) {\n const selectArgs = new SelectEvent(selectedIndex, tab.title);\n this.tabSelect.emit(selectArgs);\n if (!selectArgs.isDefaultPrevented() && !tab.active) {\n this._animate = this.animate;\n this.deactivateAll();\n tab.active = true;\n }\n }\n deactivateAll() {\n this.tabs.forEach((tab) => {\n tab.active = false;\n });\n }\n}\nTabStripComponent.ɵfac = function TabStripComponent_Factory(t) { return new (t || TabStripComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nTabStripComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TabStripComponent, selectors: [[\"kendo-tabstrip\"]], contentQueries: function TabStripComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, TabStripTabComponent, false);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.tabs = _t);\n } }, viewQuery: function TabStripComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c9, true);\n ɵngcc0.ɵɵviewQuery(_c10, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.tablist = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.tabHeadingContainers = _t);\n } }, hostVars: 17, hostBindings: function TabStripComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.dir);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-tabstrip\", ctx.hostClasses)(\"k-floatwrap\", ctx.hostClasses)(\"k-header\", ctx.hostClasses)(\"k-tabstrip-top\", ctx.tabsAtTop)(\"k-tabstrip-right\", ctx.tabsAtRight)(\"k-tabstrip-bottom\", ctx.tabsAtBottom)(\"k-tabstrip-left\", ctx.tabsAtLeft);\n } }, inputs: { animate: \"animate\", tabPosition: \"tabPosition\", keepTabContent: \"keepTabContent\", height: \"height\", tabAlignment: \"tabAlignment\" }, outputs: { tabSelect: \"tabSelect\" }, exportAs: [\"kendoTabStrip\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.tabstrip'\n }\n ])], decls: 6, vars: 2, consts: [[4, \"ngIf\"], [\"heading\", \"\"], [\"content\", \"\"], [4, \"ngTemplateOutlet\"], [\"role\", \"tablist\", 1, \"k-reset\", \"k-tabstrip-items\", 3, \"keydown\"], [\"tablist\", \"\"], [\"role\", \"tab\", 3, \"id\", \"tabIndex\", \"ngClass\", \"k-item\", \"k-state-default\", \"k-state-active\", \"k-state-disabled\", \"click\", 4, \"ngFor\", \"ngForOf\"], [\"role\", \"tab\", 3, \"id\", \"tabIndex\", \"ngClass\", \"click\"], [\"tabHeadingContainer\", \"\"], [1, \"k-link\"], [3, \"ngTemplateOutlet\"], [\"ngFor\", \"\", 3, \"ngForOf\"], [\"role\", \"tabpanel\", 3, \"ngClass\", \"tabIndex\", \"id\", 4, \"ngIf\"], [\"role\", \"tabpanel\", 3, \"ngClass\", \"tabIndex\", \"id\"]], template: function TabStripComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, TabStripComponent_ng_container_0_Template, 3, 2, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(1, TabStripComponent_ng_container_1_Template, 3, 2, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(2, TabStripComponent_ng_template_2_Template, 3, 3, \"ng-template\", null, 1, ɵngcc0.ɵɵtemplateRefExtractor);\n ɵngcc0.ɵɵtemplate(4, TabStripComponent_ng_template_4_Template, 1, 1, \"ng-template\", null, 2, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.tabsAtBottom);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.tabsAtBottom);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgTemplateOutlet, ɵngcc1.NgForOf, ɵngcc1.NgClass], encapsulation: 2, data: { animation: [\n trigger('state', [\n state('active', style({ opacity: 1 })),\n transition('* => active', [\n style({ opacity: 0 }),\n animate('400ms ease-in')\n ])\n ])\n ] } });\n/** @nocollapse */\nTabStripComponent.ctorParameters = () => [\n { type: LocalizationService },\n { type: Renderer2 },\n { type: ElementRef }\n];\nTabStripComponent.propDecorators = {\n height: [{ type: Input }],\n animate: [{ type: Input }],\n tabAlignment: [{ type: Input }],\n tabPosition: [{ type: Input }],\n keepTabContent: [{ type: Input }],\n tablist: [{ type: ViewChild, args: ['tablist',] }],\n tabSelect: [{ type: Output }],\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-tabstrip',] }, { type: HostBinding, args: ['class.k-floatwrap',] }, { type: HostBinding, args: ['class.k-header',] }],\n tabsAtTop: [{ type: HostBinding, args: ['class.k-tabstrip-top',] }],\n tabsAtRight: [{ type: HostBinding, args: ['class.k-tabstrip-right',] }],\n tabsAtBottom: [{ type: HostBinding, args: ['class.k-tabstrip-bottom',] }],\n tabsAtLeft: [{ type: HostBinding, args: ['class.k-tabstrip-left',] }],\n dir: [{ type: HostBinding, args: ['attr.dir',] }],\n tabs: [{ type: ContentChildren, args: [TabStripTabComponent,] }],\n tabHeadingContainers: [{ type: ViewChildren, args: ['tabHeadingContainer',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TabStripComponent, [{\n type: Component,\n args: [{\n animations: [\n trigger('state', [\n state('active', style({ opacity: 1 })),\n transition('* => active', [\n style({ opacity: 0 }),\n animate('400ms ease-in')\n ])\n ])\n ],\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.tabstrip'\n }\n ],\n exportAs: 'kendoTabStrip',\n selector: 'kendo-tabstrip',\n template: `\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n
  • {{ tab.title }}
  • \n \n
    \n \n \n \n \n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }]; }, { animate: [{\n type: Input\n }], tabPosition: [{\n type: Input\n }], keepTabContent: [{\n type: Input\n }], tabSelect: [{\n type: Output\n }], hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-tabstrip']\n }, {\n type: HostBinding,\n args: ['class.k-floatwrap']\n }, {\n type: HostBinding,\n args: ['class.k-header']\n }], height: [{\n type: Input\n }], tabsAtTop: [{\n type: HostBinding,\n args: ['class.k-tabstrip-top']\n }], tabsAtRight: [{\n type: HostBinding,\n args: ['class.k-tabstrip-right']\n }], tabsAtBottom: [{\n type: HostBinding,\n args: ['class.k-tabstrip-bottom']\n }], tabsAtLeft: [{\n type: HostBinding,\n args: ['class.k-tabstrip-left']\n }], dir: [{\n type: HostBinding,\n args: ['attr.dir']\n }], tabAlignment: [{\n type: Input\n }], tablist: [{\n type: ViewChild,\n args: ['tablist']\n }], tabs: [{\n type: ContentChildren,\n args: [TabStripTabComponent]\n }], tabHeadingContainers: [{\n type: ViewChildren,\n args: ['tabHeadingContainer']\n }] }); })();\n\n/**\n * Represents a template that defines the content of the Drawer.\n * To define the template, nest an `` tag\n * with the `kendoDrawerTemplate` directive inside the `` tag.\n * Using this template directive will override all other templates,\n * for example, `kendoDrawerHeaderTemplate` and `kendoDrawerItemTemplate`.\n */\nclass DrawerTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDrawerTemplateDirective.ɵfac = function DrawerTemplateDirective_Factory(t) { return new (t || DrawerTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nDrawerTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DrawerTemplateDirective, selectors: [[\"\", \"kendoDrawerTemplate\", \"\"]] });\n/** @nocollapse */\nDrawerTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDrawerTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents a template that defines the item content of the Drawer.\n * To define the template, nest an `` tag\n * with the `kendoDrawerItemTemplate` directive inside the `` tag.\n */\nclass DrawerItemTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDrawerItemTemplateDirective.ɵfac = function DrawerItemTemplateDirective_Factory(t) { return new (t || DrawerItemTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nDrawerItemTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DrawerItemTemplateDirective, selectors: [[\"\", \"kendoDrawerItemTemplate\", \"\"]] });\n/** @nocollapse */\nDrawerItemTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerItemTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDrawerItemTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents a template that defines the header content of the Drawer.\n * To define the template, nest an `` tag\n * with the `kendoDrawerHeaderTemplate` directive inside the `` tag.\n */\nclass DrawerHeaderTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDrawerHeaderTemplateDirective.ɵfac = function DrawerHeaderTemplateDirective_Factory(t) { return new (t || DrawerHeaderTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nDrawerHeaderTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DrawerHeaderTemplateDirective, selectors: [[\"\", \"kendoDrawerHeaderTemplate\", \"\"]] });\n/** @nocollapse */\nDrawerHeaderTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerHeaderTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDrawerHeaderTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents a template that defines the footer content of the Drawer.\n * To define the template, nest an `` tag\n * with the `kendoDrawerFooterTemplate` directive inside the `` tag.\n */\nclass DrawerFooterTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nDrawerFooterTemplateDirective.ɵfac = function DrawerFooterTemplateDirective_Factory(t) { return new (t || DrawerFooterTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nDrawerFooterTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: DrawerFooterTemplateDirective, selectors: [[\"\", \"kendoDrawerFooterTemplate\", \"\"]] });\n/** @nocollapse */\nDrawerFooterTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerFooterTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoDrawerFooterTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @hidden\n */\nfunction miniExpandPush(duration, width, miniWidth) {\n return [\n style({ overflow: 'hidden', flexBasis: `${miniWidth}px` }),\n animate(`${duration}ms ease-in`, style({ flexBasis: `${width}px` }))\n ];\n}\n/**\n * @hidden\n */\nfunction miniCollapsePush(duration, width, miniWidth) {\n return [\n style({ overflow: 'hidden', flexBasis: `${width}px` }),\n animate(`${duration}ms ease-in`, style({ flexBasis: `${miniWidth}px` }))\n ];\n}\n/**\n * @hidden\n *\n */\nfunction miniExpandOverlay(duration, width, miniWidth) {\n return [\n style({ width: `${miniWidth}px` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', width: `${width}px` }))\n ];\n}\n/**\n * @hidden\n */\nfunction expandPush(duration, width) {\n return [\n style({ overflow: 'hidden', flexBasis: '0px' }),\n animate(`${duration}ms ease-in`, style({ flexBasis: `${width}px` }))\n ];\n}\n/**\n * @hidden\n */\nfunction collapsePush(duration, width) {\n return [\n style({ flexBasis: `${width}px` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', flexBasis: `0px` }))\n ];\n}\n/**\n * @hidden\n */\nfunction expandRTLOverlay(duration) {\n return [\n style({ transform: `translateX(100%)` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', transform: `translateX(0)` }))\n ];\n}\n/**\n * @hidden\n */\nfunction expandOverlay(duration, position) {\n const translateDir = position !== 'end' ? `-100%` : `100%`;\n return [\n style({ transform: `translateX(${translateDir})` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', transform: `translateX(0)` }))\n ];\n}\n/**\n * @hidden\n */\nfunction miniCollapseOverlay(duration, width, miniWidth) {\n return [\n style({ width: `${width}px` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', width: `${miniWidth}px` }))\n ];\n}\n/**\n * @hidden\n */\nfunction collapseOverlay(duration, position) {\n const translateDir = position !== 'end' ? '-100%' : '100%';\n return [\n style({ transform: `translateX(0)` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', transform: `translateX(${translateDir})` }))\n ];\n}\n/**\n * @hidden\n */\nfunction collapseRTLOverlay(duration) {\n return [\n style({ transform: `translateX(0)` }),\n animate(`${duration}ms ease-in`, style({ overflow: 'hidden', transform: `translateX(100%)` }))\n ];\n}\n/**\n * @hidden\n */\nfunction expandAnimation(settings) {\n const duration = settings.animation.duration;\n const width = settings.width;\n const miniWidth = settings.miniWidth;\n const mode = settings.mode;\n const mini = settings.mini;\n const rtl = settings.rtl;\n const position = settings.position;\n if (mini && mode === 'push') {\n return miniExpandPush(duration, width, miniWidth);\n }\n if (!mini && mode === 'push') {\n return expandPush(duration, width);\n }\n if (!mini && mode === 'overlay') {\n return rtl ? expandRTLOverlay(duration) : expandOverlay(duration, position);\n }\n if (mini && mode === 'overlay') {\n return miniExpandOverlay(duration, width, miniWidth);\n }\n}\n/**\n * @hidden\n */\nfunction collapseAnimation(settings) {\n const duration = settings.animation.duration;\n const width = settings.width;\n const miniWidth = settings.miniWidth;\n const mode = settings.mode;\n const mini = settings.mini;\n const rtl = settings.rtl;\n const position = settings.position;\n if (mini && mode === 'push') {\n return miniCollapsePush(duration, width, miniWidth);\n }\n if (!mini && mode === 'push') {\n return collapsePush(duration, width);\n }\n if (!mini && mode === 'overlay') {\n return rtl ? collapseRTLOverlay(duration) : collapseOverlay(duration, position);\n }\n if (mini && mode === 'overlay') {\n return miniCollapseOverlay(duration, width, miniWidth);\n }\n}\n\n/**\n * Arguments for the `select` event of the Drawer.\n */\nclass DrawerSelectEvent extends PreventableEvent {\n}\n\n/**\n * @hidden\n */\nclass DrawerService {\n constructor() {\n this.selectedIndices = [];\n }\n emit(event, args) {\n const drawer = this.owner;\n const eventArgs = new DrawerSelectEvent(Object.assign({}, args, { sender: drawer }));\n if (hasObservers(drawer[event])) {\n drawer[event].emit(eventArgs);\n }\n return eventArgs.isDefaultPrevented();\n }\n onSelect(selectedIdx) {\n this.selectedIndices = [selectedIdx];\n const drawer = this.owner;\n if (drawer.autoCollapse && !drawer.minimized) {\n drawer.toggle(false);\n }\n }\n initSelection() {\n const items = this.owner.items;\n this.selectedIndices = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i].selected) {\n this.selectedIndices.push(i);\n }\n }\n }\n}\nDrawerService.ɵfac = function DrawerService_Factory(t) { return new (t || DrawerService)(); };\nDrawerService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DrawerService, factory: DrawerService.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerService, [{\n type: Injectable\n }], function () { return []; }, null); })();\n\nconst DEFAULT_ANIMATION = { type: 'slide', duration: 200 };\n/**\n * Represents the [Kendo UI Drawer component for Angular]({% slug overview_drawer %}).\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * \n * \n * \n * \n * \n * `\n * })\n * class AppComponent {\n * public expanded = false;\n *\n * public items: any[] = [\n * { text: 'Inbox', icon: 'k-i-inbox' },\n * { text: 'Notifications', icon: 'k-i-bell' },\n * { text: 'Date', icon: 'k-i-calendar' }\n * ];\n * }\n * ```\n */\nclass DrawerComponent {\n constructor(element, builder, localizationService, drawerService) {\n this.element = element;\n this.builder = builder;\n this.localizationService = localizationService;\n this.drawerService = drawerService;\n this.hostClasses = true;\n /**\n * Specifies the mode in which the Drawer will be displayed.\n *\n * The possible values are:\n * * (Default) `overlay`\n * * `push`\n */\n this.mode = 'overlay';\n /**\n * Specifies the position of the Drawer\n * ([see example]({% slug positioning_drawer %})).\n *\n * The possible values are:\n * * (Default) `start`\n * * `end`\n */\n this.position = 'start';\n /**\n * Enables the mini (compact) view of the Drawer which is displayed when the component is collapsed\n * ([see example]({% slug expandmodespositions_drawer %}#toc-mini-view)).\n */\n this.mini = false;\n /**\n * Specifies the state of the Drawer.\n */\n this.expanded = false;\n /**\n * Defines the width of the Drawer when it is expanded.\n * Defaults to `240`.\n */\n this.width = 240;\n /**\n * Defines the width of the Drawer when the mini view is enabled\n * and the component is collapsed. Defaults to `60`.\n */\n this.miniWidth = 50;\n /**\n * Specifies if the Drawer will be automatically collapsed when an item\n * or the overlay is clicked. Defaults to `true`.\n */\n this.autoCollapse = true;\n /**\n * Specifies the animation settings of the Drawer.\n * ([see example]({% slug interaction_drawer %}#toc-toggling-between-states)).\n *\n * The possible values are:\n * * Boolean\n * * (Default) `true`\n * * `false`\n * * `DrawerAnimation`\n * * (Default) `type?: 'slide'`\n * * `duration`—Accepts a number in milliseconds. Defaults to `300ms`.\n */\n this.animation = DEFAULT_ANIMATION;\n /**\n * Fires when the Drawer is expanded and its animation is complete.\n */\n this.expand = new EventEmitter();\n /**\n * Fires when the Drawer is collapsed and its animation is complete.\n */\n this.collapse = new EventEmitter();\n /**\n * Fires when a Drawer item is selected. This event is preventable.\n */\n this.select = new EventEmitter();\n /**\n * Fires when the `expanded` property of the component was updated.\n * Used to provide a two-way binding for the `expanded` property.\n */\n this.expandedChange = new EventEmitter();\n this.animationEnd = new EventEmitter();\n this.rtl = false;\n this._items = [];\n this.dynamicRTLSubscription = this.localizationService.changes.subscribe(({ rtl }) => {\n this.rtl = rtl;\n this.direction = this.rtl ? 'rtl' : 'ltr';\n });\n this.drawerService.owner = this;\n }\n get startPositionClass() {\n return this.position === 'start';\n }\n get endPositionClass() {\n return this.position === 'end';\n }\n get overlayTransofrmStyles() {\n if (this.mode === 'push') {\n return;\n }\n if (this.expanded || this.minimized) {\n return `translateX(0px)`;\n }\n return `translateX(-100%)`;\n }\n get flexStyles() {\n if (this.mode === 'overlay') {\n return;\n }\n if (!this.expanded && !this.minimized) {\n return 0;\n }\n return this.drawerWidth;\n }\n /**\n * The collection of items that will be rendered in the Drawer.\n */\n set items(items) {\n if (isPresent(items)) {\n this._items = items;\n this.drawerService.initSelection();\n }\n }\n get items() {\n return this._items;\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n get minimized() {\n return this.mini && !this.expanded;\n }\n /**\n * @hidden\n */\n get drawerWidth() {\n return this.minimized ? this.miniWidth : this.width;\n }\n /**\n * Toggles the visibility of the Drawer.\n *\n * @param expanded? - Boolean. Specifies if the Drawer will be expanded or collapsed.\n */\n toggle(expanded) {\n const previous = this.expanded;\n const current = isPresent(expanded) ? expanded : !previous;\n if (current === previous) {\n return;\n }\n if (current === true) {\n this.setExpanded(true);\n }\n else if (current === false && !this.animation) {\n this.setExpanded(false);\n }\n if (this.animation) {\n this.animationEnd.pipe(take(1))\n .subscribe(() => { this.onAnimationEnd(current); });\n this.animate(current);\n }\n else {\n this[current ? 'expand' : 'collapse'].emit();\n }\n }\n onAnimationEnd(currentExpanded) {\n if (currentExpanded) {\n this.expand.emit();\n }\n else {\n this.setExpanded(false);\n this.collapse.emit();\n }\n }\n setExpanded(value) {\n this.expanded = value;\n this.expandedChange.emit(value);\n }\n animate(expanded) {\n const settings = {\n mode: this.mode,\n mini: this.mini,\n miniWidth: this.miniWidth,\n width: this.width,\n rtl: this.rtl,\n position: this.position,\n animation: (typeof this.animation !== 'boolean') ? this.animation : DEFAULT_ANIMATION\n };\n const animation = expanded ? expandAnimation(settings) : collapseAnimation(settings);\n const player = this.createPlayer(animation, this.element.nativeElement);\n player.play();\n }\n createPlayer(animation, animatedElement) {\n const factory = this.builder.build(animation);\n let player = factory.create(animatedElement);\n player.onDone(() => {\n if (player) {\n this.animationEnd.emit();\n player.destroy();\n player = null;\n }\n });\n return player;\n }\n}\nDrawerComponent.ɵfac = function DrawerComponent_Factory(t) { return new (t || DrawerComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.AnimationBuilder), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(DrawerService)); };\nDrawerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DrawerComponent, selectors: [[\"kendo-drawer\"]], contentQueries: function DrawerComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, DrawerTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DrawerFooterTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DrawerHeaderTemplateDirective, true);\n ɵngcc0.ɵɵcontentQuery(dirIndex, DrawerItemTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.drawerTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.footerTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.headerTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.itemTemplate = _t.first);\n } }, hostVars: 13, hostBindings: function DrawerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵstyleProp(\"transform\", ctx.overlayTransofrmStyles)(\"flex-basis\", ctx.flexStyles, \"px\");\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-drawer\", ctx.hostClasses)(\"k-drawer-start\", ctx.startPositionClass)(\"k-drawer-end\", ctx.endPositionClass);\n } }, inputs: { mode: \"mode\", position: \"position\", mini: \"mini\", expanded: \"expanded\", width: \"width\", miniWidth: \"miniWidth\", autoCollapse: \"autoCollapse\", animation: \"animation\", items: \"items\" }, outputs: { expand: \"expand\", collapse: \"collapse\", select: \"select\", expandedChange: \"expandedChange\" }, exportAs: [\"kendoDrawer\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n DrawerService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.drawer'\n }\n ])], decls: 1, vars: 1, consts: [[\"class\", \"k-drawer-wrapper\", 3, \"width\", 4, \"ngIf\"], [1, \"k-drawer-wrapper\"], [4, \"ngIf\"], [\"kendoDrawerList\", \"\", 1, \"k-drawer-items\", 3, \"items\", \"mini\", \"expanded\", \"itemTemplate\"], [3, \"ngTemplateOutlet\"]], template: function DrawerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerComponent_div_0_Template, 3, 4, \"div\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.expanded || ctx.mini);\n } }, directives: function () { return [ɵngcc1.NgIf, DrawerListComponent, ɵngcc1.NgTemplateOutlet]; }, encapsulation: 2 });\n/** @nocollapse */\nDrawerComponent.ctorParameters = () => [\n { type: ElementRef },\n { type: AnimationBuilder },\n { type: LocalizationService },\n { type: DrawerService }\n];\nDrawerComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-drawer',] }],\n startPositionClass: [{ type: HostBinding, args: ['class.k-drawer-start',] }],\n endPositionClass: [{ type: HostBinding, args: ['class.k-drawer-end',] }],\n overlayTransofrmStyles: [{ type: HostBinding, args: ['style.transform',] }],\n flexStyles: [{ type: HostBinding, args: ['style.flexBasis.px',] }],\n mode: [{ type: Input }],\n position: [{ type: Input }],\n mini: [{ type: Input }],\n expanded: [{ type: Input }],\n width: [{ type: Input }],\n miniWidth: [{ type: Input }],\n autoCollapse: [{ type: Input }],\n items: [{ type: Input }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n animation: [{ type: Input }],\n expand: [{ type: Output }],\n collapse: [{ type: Output }],\n select: [{ type: Output }],\n expandedChange: [{ type: Output }],\n drawerTemplate: [{ type: ContentChild, args: [DrawerTemplateDirective,] }],\n footerTemplate: [{ type: ContentChild, args: [DrawerFooterTemplateDirective,] }],\n headerTemplate: [{ type: ContentChild, args: [DrawerHeaderTemplateDirective,] }],\n itemTemplate: [{ type: ContentChild, args: [DrawerItemTemplateDirective,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoDrawer',\n providers: [\n LocalizationService,\n DrawerService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.drawer'\n }\n ],\n selector: 'kendo-drawer',\n template: `\n
    \n \n \n \n\n
      \n
    \n\n \n \n
    \n\n \n \n
    \n `\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc4.AnimationBuilder }, { type: ɵngcc2.LocalizationService }, { type: DrawerService }]; }, { hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-drawer']\n }], mode: [{\n type: Input\n }], position: [{\n type: Input\n }], mini: [{\n type: Input\n }], expanded: [{\n type: Input\n }], width: [{\n type: Input\n }], miniWidth: [{\n type: Input\n }], autoCollapse: [{\n type: Input\n }], animation: [{\n type: Input\n }], expand: [{\n type: Output\n }], collapse: [{\n type: Output\n }], select: [{\n type: Output\n }], expandedChange: [{\n type: Output\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], startPositionClass: [{\n type: HostBinding,\n args: ['class.k-drawer-start']\n }], endPositionClass: [{\n type: HostBinding,\n args: ['class.k-drawer-end']\n }], overlayTransofrmStyles: [{\n type: HostBinding,\n args: ['style.transform']\n }], flexStyles: [{\n type: HostBinding,\n args: ['style.flexBasis.px']\n }], items: [{\n type: Input\n }], drawerTemplate: [{\n type: ContentChild,\n args: [DrawerTemplateDirective]\n }], footerTemplate: [{\n type: ContentChild,\n args: [DrawerFooterTemplateDirective]\n }], headerTemplate: [{\n type: ContentChild,\n args: [DrawerHeaderTemplateDirective]\n }], itemTemplate: [{\n type: ContentChild,\n args: [DrawerItemTemplateDirective]\n }] }); })();\n\n/**\n * Serves as a container for the [Kendo UI Drawer component for Angular]({% slug overview_drawer %}) and its content.\n */\nclass DrawerContainerComponent {\n constructor(localizationService) {\n this.localizationService = localizationService;\n this.rtl = false;\n this.dynamicRTLSubscription = this.localizationService.changes.subscribe(({ rtl }) => {\n this.rtl = rtl;\n this.direction = this.rtl ? 'rtl' : 'ltr';\n });\n }\n get hostClass() {\n return true;\n }\n get overlayClass() {\n return this.drawer.mode === 'overlay';\n }\n get miniClass() {\n return this.drawer.mini;\n }\n get pushClass() {\n return this.drawer.mode === 'push';\n }\n get isExpandedClass() {\n return this.drawer.expanded;\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n /**\n * @hidden\n */\n get overlay() {\n return isPresent(this.drawer) &&\n this.drawer.expanded &&\n this.drawer.mode === 'overlay';\n }\n /**\n * @hidden\n */\n closeDrawer() {\n if (this.overlay && this.drawer.autoCollapse) {\n this.drawer.toggle(false);\n }\n }\n}\nDrawerContainerComponent.ɵfac = function DrawerContainerComponent_Factory(t) { return new (t || DrawerContainerComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nDrawerContainerComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DrawerContainerComponent, selectors: [[\"kendo-drawer-container\"]], contentQueries: function DrawerContainerComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, DrawerComponent, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.drawer = _t.first);\n } }, hostVars: 11, hostBindings: function DrawerContainerComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵclassProp(\"k-drawer-container\", ctx.hostClass)(\"k-drawer-overlay\", ctx.overlayClass)(\"k-drawer-mini\", ctx.miniClass)(\"k-drawer-push\", ctx.pushClass)(\"k-drawer-expanded\", ctx.isExpandedClass);\n } }, features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.drawer.container'\n }\n ])], ngContentSelectors: _c6, decls: 2, vars: 1, consts: [[\"class\", \"k-overlay\", 3, \"click\", 4, \"ngIf\"], [1, \"k-overlay\", 3, \"click\"]], template: function DrawerContainerComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, DrawerContainerComponent_div_0_Template, 1, 0, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.overlay);\n } }, directives: [ɵngcc1.NgIf], encapsulation: 2 });\n/** @nocollapse */\nDrawerContainerComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nDrawerContainerComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-drawer-container',] }],\n overlayClass: [{ type: HostBinding, args: ['class.k-drawer-overlay',] }],\n miniClass: [{ type: HostBinding, args: ['class.k-drawer-mini',] }],\n pushClass: [{ type: HostBinding, args: ['class.k-drawer-push',] }],\n isExpandedClass: [{ type: HostBinding, args: ['class.k-drawer-expanded',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n drawer: [{ type: ContentChild, args: [DrawerComponent,] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerContainerComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-drawer-container',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.drawer.container'\n }\n ],\n template: `\n
    \n \n `\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, { direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], hostClass: [{\n type: HostBinding,\n args: ['class.k-drawer-container']\n }], overlayClass: [{\n type: HostBinding,\n args: ['class.k-drawer-overlay']\n }], miniClass: [{\n type: HostBinding,\n args: ['class.k-drawer-mini']\n }], pushClass: [{\n type: HostBinding,\n args: ['class.k-drawer-push']\n }], isExpandedClass: [{\n type: HostBinding,\n args: ['class.k-drawer-expanded']\n }], drawer: [{\n type: ContentChild,\n args: [DrawerComponent]\n }] }); })();\n\n/**\n * Represents the content of the [Kendo UI Drawer component for Angular]({% slug overview_drawer %}).\n */\nclass DrawerContentComponent {\n constructor() {\n this.hostClasses = true;\n }\n}\nDrawerContentComponent.ɵfac = function DrawerContentComponent_Factory(t) { return new (t || DrawerContentComponent)(); };\nDrawerContentComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DrawerContentComponent, selectors: [[\"kendo-drawer-content\"]], hostVars: 2, hostBindings: function DrawerContentComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-drawer-content\", ctx.hostClasses);\n } }, ngContentSelectors: _c6, decls: 1, vars: 0, template: function DrawerContentComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\n/** @nocollapse */\nDrawerContentComponent.ctorParameters = () => [];\nDrawerContentComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-drawer-content',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerContentComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-drawer-content',\n template: `\n \n `,\n encapsulation: ViewEncapsulation.None\n }]\n }], function () { return []; }, { hostClasses: [{\n type: HostBinding,\n args: ['class.k-drawer-content']\n }] }); })();\n\n/**\n * Represents a template that defines the content of the whole Step.\n * To define the template, nest an `` tag\n * with the `kendoStepperStepTemplate` directive inside the `` tag.\n */\nclass StepperStepTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nStepperStepTemplateDirective.ɵfac = function StepperStepTemplateDirective_Factory(t) { return new (t || StepperStepTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nStepperStepTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: StepperStepTemplateDirective, selectors: [[\"\", \"kendoStepperStepTemplate\", \"\"]] });\n/** @nocollapse */\nStepperStepTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperStepTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoStepperStepTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents a template that defines the content of the Step label.\n * To define the template, nest an `` tag\n * with the `kendoStepperLabelTemplate` directive inside the `` tag.\n */\nclass StepperLabelTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nStepperLabelTemplateDirective.ɵfac = function StepperLabelTemplateDirective_Factory(t) { return new (t || StepperLabelTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nStepperLabelTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: StepperLabelTemplateDirective, selectors: [[\"\", \"kendoStepperLabelTemplate\", \"\"]] });\n/** @nocollapse */\nStepperLabelTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperLabelTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoStepperLabelTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Represents a template that defines the content of the Step indicator.\n * To define the template, nest an `` tag\n * with the `kendoStepperIndicatorTemplate` directive inside the `` tag.\n */\nclass StepperIndicatorTemplateDirective {\n constructor(templateRef) {\n this.templateRef = templateRef;\n }\n}\nStepperIndicatorTemplateDirective.ɵfac = function StepperIndicatorTemplateDirective_Factory(t) { return new (t || StepperIndicatorTemplateDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef, 8)); };\nStepperIndicatorTemplateDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: StepperIndicatorTemplateDirective, selectors: [[\"\", \"kendoStepperIndicatorTemplate\", \"\"]] });\n/** @nocollapse */\nStepperIndicatorTemplateDirective.ctorParameters = () => [\n { type: TemplateRef, decorators: [{ type: Optional }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperIndicatorTemplateDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoStepperIndicatorTemplate]'\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef, decorators: [{\n type: Optional\n }] }]; }, null); })();\n\n/**\n * Arguments for the `activate` event of the Stepper.\n */\nclass StepperActivateEvent extends PreventableEvent {\n}\n\nconst DEFAULT_CURRENT_STEP = 0;\nconst handlers = {};\nhandlers[Keys.ArrowLeft] = 'left';\nhandlers[Keys.ArrowRight] = 'right';\nhandlers[Keys.ArrowUp] = 'up';\nhandlers[Keys.ArrowDown] = 'down';\nhandlers[Keys.Home] = 'home';\nhandlers[Keys.End] = 'end';\nhandlers[Keys.Enter] = 'enter';\nhandlers[Keys.Space] = 'enter';\nconst handlersRTL = Object.assign({}, handlers);\nhandlersRTL[Keys.ArrowLeft] = 'right';\nhandlersRTL[Keys.ArrowRight] = 'left';\n/**\n * @hidden\n */\nclass StepperService {\n constructor(localization, ngZone, changeDetector) {\n this.localization = localization;\n this.ngZone = ngZone;\n this.changeDetector = changeDetector;\n this.currentStep = DEFAULT_CURRENT_STEP;\n this.triggerValidation = new EventEmitter();\n this.focusedStepChange = new EventEmitter();\n }\n get handlers() {\n return this.localization.rtl ? handlersRTL : handlers;\n }\n emit(event, eventArgs) {\n const stepper = this.owner;\n if (hasObservers(stepper[event])) {\n stepper[event].emit(eventArgs);\n }\n return eventArgs.isDefaultPrevented();\n }\n onActivate(currentIdx, originalEvent) {\n const eventArgs = new StepperActivateEvent({\n index: currentIdx,\n step: this.owner.steps[currentIdx],\n originalEvent: originalEvent,\n sender: this.owner\n });\n this.ngZone.run(() => {\n if (!this.emit('activate', eventArgs)) {\n this.currentStep = currentIdx;\n this.owner['currentStepChange'].emit(currentIdx);\n this.changeDetector.detectChanges();\n }\n });\n }\n validateSteps() {\n this.triggerValidation.emit();\n }\n keydown(e) {\n const current = this.focusedStep || this.currentStep;\n const handler = this.handlers[e.keyCode];\n if (!isPresent(current)) {\n return;\n }\n if (handler) {\n e.preventDefault();\n this[handler](e);\n }\n }\n left() {\n if (!this.isHorizontal) {\n return;\n }\n this.focusPrevStep();\n }\n right() {\n if (!this.isHorizontal) {\n return;\n }\n this.focusNextStep();\n }\n up() {\n if (this.isHorizontal) {\n return;\n }\n this.focusPrevStep();\n }\n down() {\n if (this.isHorizontal) {\n return;\n }\n this.focusNextStep();\n }\n home() {\n this.focusedStep = 0;\n this.focusedStepChange.emit();\n }\n end() {\n this.focusedStep = this.owner.steps.length - 1;\n this.focusedStepChange.emit();\n }\n enter(event) {\n if (this.focusedStep === this.currentStep) {\n return;\n }\n if (this.isStepDisabled(this.focusedStep)) {\n return;\n }\n if (this.owner.linear && this.isPrevOrNextStep(this.focusedStep) === false) {\n return;\n }\n this.onActivate(this.focusedStep, event);\n }\n focus(focusedIdx) {\n this.focusedStep = focusedIdx;\n }\n focusNextStep() {\n if (this.focusedStep < this.owner.steps.length) {\n this.focusedStep += 1;\n this.focusedStepChange.emit();\n }\n }\n focusPrevStep() {\n if (this.focusedStep > 0) {\n this.focusedStep -= 1;\n this.focusedStepChange.emit();\n }\n }\n isStepDisabled(index) {\n return this.owner.steps[index].disabled;\n }\n isPrevOrNextStep(index) {\n return index === this.currentStep + 1 || index === this.currentStep - 1;\n }\n get isHorizontal() {\n return this.owner.orientation === 'horizontal';\n }\n}\nStepperService.ɵfac = function StepperService_Factory(t) { return new (t || StepperService)(ɵngcc0.ɵɵinject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(ɵngcc0.ChangeDetectorRef)); };\nStepperService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: StepperService, factory: StepperService.ɵfac });\n/** @nocollapse */\nStepperService.ctorParameters = () => [\n { type: LocalizationService },\n { type: NgZone },\n { type: ChangeDetectorRef }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperService, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }]; }, null); })();\n\nconst DEFAULT_ANIMATION_DURATION = 400;\n/**\n * Represents the [Kendo UI Stepper component for Angular]({% slug overview_stepper %}).\n *\n * @example\n * ```ts-preview\n * _@Component({\n * selector: 'my-app',\n * template: `\n * \n * \n * `\n * })\n * class AppComponent {\n * public steps: Array = [\n * { label: 'Step One' }, { label: 'Step Two' }, { label: 'Step Three' }\n * ];\n * }\n * ```\n */\nclass StepperComponent {\n constructor(renderer, elem, localization, stepperService) {\n this.renderer = renderer;\n this.elem = elem;\n this.localization = localization;\n this.stepperService = stepperService;\n this.hostClasses = true;\n this.ariaRole = 'navigation';\n this.displayStyle = 'grid';\n /**\n * Specifies the type of the steps in the Stepper.\n *\n * The possible values are:\n * * (Default) `indicator`\n * * `label`\n * * `full`\n */\n this.stepType = 'indicator';\n /**\n * Specifies the linear flow of the Stepper.\n *\n * @default true\n */\n this.linear = true;\n /**\n * Specifies the orientation of the Stepper\n * ([see example]({% slug orientation_stepper %})).\n *\n * The possible values are:\n * * (Default) `horizontal`\n * * `vertical`\n */\n this.orientation = 'horizontal';\n /**\n * Specifies the duration of the progress indicator animation in milliseconds. Defaults to `400ms`.\n *\n * The possible values are:\n * * Boolean\n * * (Default) `true`\n * * false\n * * Number\n */\n this.animation = true;\n /**\n * Fires when a step is about to be activated. This event is preventable.\n */\n this.activate = new EventEmitter();\n /**\n * Fires when the `currentStep` property of the component was updated.\n * Used to provide a two-way binding for the `currentStep` property.\n */\n this.currentStepChange = new EventEmitter();\n this._steps = [];\n this.dynamicRTLSubscription = this.localization.changes.subscribe(({ rtl }) => {\n this.direction = rtl ? 'rtl' : 'ltr';\n });\n this.stepperService.owner = this;\n }\n get linearClass() {\n return this.linear;\n }\n /**\n * The index of the current step.\n */\n set currentStep(value) {\n this.stepperService.currentStep = value;\n }\n get currentStep() {\n return this.stepperService.currentStep;\n }\n /**\n * The collection of steps that will be rendered in the Stepper.\n * ([see example]({% slug step_appearance_stepper %}))\n */\n set steps(steps) {\n if (isPresent(steps) && steps.length > 0) {\n this._steps = steps;\n }\n }\n get steps() {\n return this._steps;\n }\n ngOnInit() {\n this.applyHostStyling();\n }\n ngOnChanges(changes) {\n if (changes.steps && !changes.steps.firstChange) {\n this.applyHostStyling();\n }\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n /**\n * Manually triggers the validity check configured by the [isValid]({% slug api_layout_stepperstep %}#toc-isvalid) property of the steps.\n *\n * Steps that have their [validate]({% slug api_layout_stepperstep %}#toc-validate) property set to `false`, will not be validated.\n */\n validateSteps() {\n this.stepperService.validateSteps();\n }\n applyHostStyling() {\n const stepFramesStyle = this.orientation === 'horizontal' ? 'grid-template-columns' : 'grid-template-rows';\n const stepFramesValue = `repeat(${this.steps.length * 2}, 1fr)`;\n this.renderer.setStyle(this.elem.nativeElement, stepFramesStyle, stepFramesValue);\n }\n /**\n * @hidden\n */\n get progressAnimation() {\n return { duration: this.animationDuration };\n }\n /**\n * @hidden\n */\n get animationDuration() {\n if (typeof this.animation === 'number') {\n return this.animation;\n }\n if (typeof this.animation === 'boolean' && this.animation) {\n return DEFAULT_ANIMATION_DURATION;\n }\n return 0;\n }\n /**\n * @hidden\n */\n get stepsListStyling() {\n if (this.orientation === 'horizontal') {\n return { 'grid-column-start': 1, 'grid-column-end': -1 };\n }\n return { 'grid-row-start': 1, 'grid-row-end': -1 };\n }\n /**\n * @hidden\n */\n get progressBarStyling() {\n if (this.orientation === 'horizontal') {\n return {\n 'grid-column-start': 2,\n 'grid-column-end': this.steps.length * 2\n };\n }\n return {\n 'grid-row-start': 2,\n 'grid-row-end': this.steps.length * 2\n };\n }\n /***\n * @hidden\n */\n get isHorizontal() {\n return this.stepperService.isHorizontal;\n }\n}\nStepperComponent.ɵfac = function StepperComponent_Factory(t) { return new (t || StepperComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(StepperService)); };\nStepperComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StepperComponent, selectors: [[\"kendo-stepper\"]], contentQueries: function StepperComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, StepperStepTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, StepperLabelTemplateDirective, true);\n ɵngcc0.ɵɵstaticContentQuery(dirIndex, StepperIndicatorTemplateDirective, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.stepTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.labelTemplate = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.indicatorTemplate = _t.first);\n } }, hostVars: 10, hostBindings: function StepperComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"role\", ctx.ariaRole)(\"dir\", ctx.direction);\n ɵngcc0.ɵɵstyleProp(\"display\", ctx.displayStyle);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClasses)(\"k-stepper\", ctx.hostClasses)(\"k-stepper-linear\", ctx.linearClass);\n } }, inputs: { stepType: \"stepType\", linear: \"linear\", orientation: \"orientation\", animation: \"animation\", currentStep: \"currentStep\", steps: \"steps\", successIcon: \"successIcon\", errorIcon: \"errorIcon\" }, outputs: { activate: \"activate\", currentStepChange: \"currentStepChange\" }, exportAs: [\"kendoStepper\"], features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n StepperService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.stepper'\n }\n ]), ɵngcc0.ɵɵNgOnChangesFeature], decls: 4, vars: 16, consts: [[\"kendoStepperLocalizedMessages\", \"\", 6, \"optional\"], [\"kendoStepperList\", \"\", 1, \"k-step-list\", 3, \"stepType\", \"linear\", \"orientation\", \"steps\", \"currentStep\", \"successIcon\", \"errorIcon\", \"indicatorTemplate\", \"labelTemplate\", \"stepTemplate\", \"ngStyle\"], [3, \"animation\", \"max\", \"label\", \"orientation\", \"reverse\", \"value\", \"ngStyle\", 4, \"ngIf\"], [3, \"animation\", \"max\", \"label\", \"orientation\", \"reverse\", \"value\", \"ngStyle\"]], template: function StepperComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0, 0);\n ɵngcc0.ɵɵi18nAttributes(1, _c13);\n ɵngcc0.ɵɵelementContainerEnd();\n ɵngcc0.ɵɵelement(2, \"ol\", 1);\n ɵngcc0.ɵɵtemplate(3, StepperComponent_kendo_progressbar_3_Template, 1, 8, \"kendo-progressbar\", 2);\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"k-step-list-horizontal\", ctx.isHorizontal)(\"k-step-list-vertical\", !ctx.isHorizontal);\n ɵngcc0.ɵɵproperty(\"stepType\", ctx.stepType)(\"linear\", ctx.linear)(\"orientation\", ctx.orientation)(\"steps\", ctx.steps)(\"currentStep\", ctx.currentStep)(\"successIcon\", ctx.successIcon)(\"errorIcon\", ctx.errorIcon)(\"indicatorTemplate\", ctx.indicatorTemplate == null ? null : ctx.indicatorTemplate.templateRef)(\"labelTemplate\", ctx.labelTemplate == null ? null : ctx.labelTemplate.templateRef)(\"stepTemplate\", ctx.stepTemplate == null ? null : ctx.stepTemplate.templateRef)(\"ngStyle\", ctx.stepsListStyling);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.steps.length > 0);\n } }, directives: function () { return [LocalizedMessagesDirective,\n StepperListComponent, ɵngcc1.NgStyle, ɵngcc1.NgIf, ɵngcc5.ProgressBarComponent]; }, encapsulation: 2 });\n/** @nocollapse */\nStepperComponent.ctorParameters = () => [\n { type: Renderer2 },\n { type: ElementRef },\n { type: LocalizationService },\n { type: StepperService }\n];\nStepperComponent.propDecorators = {\n hostClasses: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-stepper',] }],\n linearClass: [{ type: HostBinding, args: ['class.k-stepper-linear',] }],\n ariaRole: [{ type: HostBinding, args: ['attr.role',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n displayStyle: [{ type: HostBinding, args: ['style.display',] }],\n stepType: [{ type: Input }],\n linear: [{ type: Input }],\n orientation: [{ type: Input }],\n currentStep: [{ type: Input }],\n steps: [{ type: Input }],\n successIcon: [{ type: Input }],\n errorIcon: [{ type: Input }],\n animation: [{ type: Input }],\n activate: [{ type: Output }],\n currentStepChange: [{ type: Output }],\n stepTemplate: [{ type: ContentChild, args: [StepperStepTemplateDirective, { static: true },] }],\n labelTemplate: [{ type: ContentChild, args: [StepperLabelTemplateDirective, { static: true },] }],\n indicatorTemplate: [{ type: ContentChild, args: [StepperIndicatorTemplateDirective, { static: true },] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperComponent, [{\n type: Component,\n args: [{\n exportAs: 'kendoStepper',\n providers: [\n LocalizationService,\n StepperService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.stepper'\n }\n ],\n selector: 'kendo-stepper',\n template: `\n \n \n
      \n
    \n\n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }, { type: ɵngcc2.LocalizationService }, { type: StepperService }]; }, { hostClasses: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-stepper']\n }], ariaRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], displayStyle: [{\n type: HostBinding,\n args: ['style.display']\n }], stepType: [{\n type: Input\n }], linear: [{\n type: Input\n }], orientation: [{\n type: Input\n }], animation: [{\n type: Input\n }], activate: [{\n type: Output\n }], currentStepChange: [{\n type: Output\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], linearClass: [{\n type: HostBinding,\n args: ['class.k-stepper-linear']\n }], currentStep: [{\n type: Input\n }], steps: [{\n type: Input\n }], successIcon: [{\n type: Input\n }], errorIcon: [{\n type: Input\n }], stepTemplate: [{\n type: ContentChild,\n args: [StepperStepTemplateDirective, { static: true }]\n }], labelTemplate: [{\n type: ContentChild,\n args: [StepperLabelTemplateDirective, { static: true }]\n }], indicatorTemplate: [{\n type: ContentChild,\n args: [StepperIndicatorTemplateDirective, { static: true }]\n }] }); })();\n\nconst SIZE_CLASSES = {\n 'small': 'k-avatar-sm',\n 'medium': 'k-avatar-md',\n 'large': 'k-avatar-lg'\n};\nconst SHAPE_CLASSES = {\n 'circle': 'k-avatar-circle',\n 'square': 'k-avatar-square',\n 'rectangle': 'k-avatar-rectangle',\n 'rounded': 'k-avatar-rounded'\n};\n/**\n * Displays images, icons or initials representing people or other entities.\n */\nclass AvatarComponent {\n constructor(renderer, element) {\n this.renderer = renderer;\n this.element = element;\n this.hostClass = true;\n /**\n * Specifies the appearance fill style of the avatar.\n *\n * The possible values are:\n * * `solid` (Default)\n * * `outline`\n *\n */\n this.fill = 'solid';\n /**\n * Sets a border to the avatar.\n */\n this.border = false;\n this._themeColor = 'primary';\n this._size = 'medium';\n this._shape = 'square';\n this.avatar = this.element.nativeElement;\n }\n /**\n * @hidden\n */\n get solidClass() {\n return this.fill === 'solid';\n }\n /**\n * @hidden\n */\n get outlineClass() {\n return this.fill === 'outline';\n }\n /**\n * @hidden\n */\n get borderClass() {\n return this.border;\n }\n /**\n * @hidden\n */\n get flexBasis() {\n return this.width;\n }\n /**\n * Sets the shape for the avatar.\n *\n * Possible values are:\n * * (Default) `square`\n * * `circle`\n * * `rectangle`\n * * `rounded`\n *\n */\n set shape(shape) {\n this.renderer.removeClass(this.avatar, SHAPE_CLASSES[this.shape]);\n this.renderer.addClass(this.avatar, SHAPE_CLASSES[shape]);\n this._shape = shape;\n }\n get shape() {\n return this._shape;\n }\n /**\n * Specifies the size of the avatar\n * ([see example]({% slug appearance_avatar %}#toc-size)).\n *\n * The possible values are:\n * * `small`\n * * `medium` (Default)\n * * `large`\n *\n */\n set size(size) {\n this.renderer.removeClass(this.avatar, SIZE_CLASSES[this.size]);\n this.renderer.addClass(this.avatar, SIZE_CLASSES[size]);\n this._size = size;\n }\n get size() {\n return this._size;\n }\n /**\n * Specifies the theme color of the avatar.\n * The theme color will be applied as background and border color, while also amending the text color accordingly.\n *\n * The possible values are:\n * * `primary` (Default)—Applies coloring based on primary theme color.\n * * `secondary`—Applies coloring based on secondary theme color.\n * * `tertiary`— Applies coloring based on tertiary theme color.\n * * `inherit`— Applies inherited coloring value.\n * * `info`—Applies coloring based on info theme color.\n * * `success`— Applies coloring based on success theme color.\n * * `warning`— Applies coloring based on warning theme color.\n * * `error`— Applies coloring based on error theme color.\n * * `dark`— Applies coloring based on dark theme color.\n * * `light`— Applies coloring based on light theme color.\n * * `inverse`— Applies coloring based on inverted theme color.\n *\n */\n set themeColor(themeColor) {\n this.renderer.removeClass(this.avatar, `k-avatar-${this.themeColor}`);\n this.renderer.addClass(this.avatar, `k-avatar-${themeColor}`);\n this._themeColor = themeColor;\n }\n get themeColor() {\n return this._themeColor;\n }\n /**\n * @hidden\n */\n get avatarWidth() {\n return this.width;\n }\n /**\n * @hidden\n */\n get avatarHeight() {\n return this.height;\n }\n ngAfterViewInit() {\n this.setAvatarClasses();\n }\n /**\n * @hidden\n */\n get imageUrl() {\n return `url(${this.imageSrc})`;\n }\n ngOnInit() {\n this.verifyProperties();\n }\n /**\n * @hidden\n */\n iconClasses() {\n if (this.icon) {\n return `k-icon k-i-${this.icon}`;\n }\n if (this.iconClass) {\n return `${this.iconClass}`;\n }\n }\n /**\n * @hidden\n */\n get customAvatar() {\n return !(this.imageSrc || this.initials || this.icon || this.iconClass);\n }\n verifyProperties() {\n if (!isDevMode()) {\n return;\n }\n const inputs = [this.icon || this.iconClass, this.imageSrc, this.initials];\n const inputsLength = inputs.filter((value) => value).length;\n if (inputsLength > 1) {\n throw new Error(`\n Invalid property configuration given.\n The kendo-avatar component can accept only one of:\n icon, imageSrc or initials properties.\n `);\n }\n }\n setAvatarClasses() {\n this.renderer.addClass(this.avatar, SHAPE_CLASSES[this.shape]);\n this.renderer.addClass(this.avatar, `k-avatar-${this.themeColor}`);\n this.renderer.addClass(this.avatar, SIZE_CLASSES[this.size]);\n }\n}\nAvatarComponent.ɵfac = function AvatarComponent_Factory(t) { return new (t || AvatarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nAvatarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: AvatarComponent, selectors: [[\"kendo-avatar\"]], hostVars: 14, hostBindings: function AvatarComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"flex-basis\", ctx.flexBasis)(\"width\", ctx.avatarWidth)(\"height\", ctx.avatarHeight);\n ɵngcc0.ɵɵclassProp(\"k-avatar\", ctx.hostClass)(\"k-avatar-solid\", ctx.solidClass)(\"k-avatar-outline\", ctx.outlineClass)(\"k-avatar-bordered\", ctx.borderClass);\n } }, inputs: { fill: \"fill\", border: \"border\", shape: \"shape\", size: \"size\", themeColor: \"themeColor\", iconClass: \"iconClass\", width: \"width\", height: \"height\", cssStyle: \"cssStyle\", initials: \"initials\", icon: \"icon\", imageSrc: \"imageSrc\" }, ngContentSelectors: _c6, decls: 4, vars: 4, consts: [[4, \"ngIf\"], [1, \"k-avatar-image\", 3, \"ngStyle\"], [1, \"k-avatar-text\", 3, \"ngStyle\"], [1, \"k-avatar-icon\", 3, \"ngStyle\", \"ngClass\"]], template: function AvatarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, AvatarComponent_0_Template, 1, 0, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, AvatarComponent_ng_container_1_Template, 2, 3, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(2, AvatarComponent_ng_container_2_Template, 3, 2, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(3, AvatarComponent_ng_container_3_Template, 2, 2, \"ng-container\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.customAvatar);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.imageSrc);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.initials);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.icon || ctx.iconClass);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgStyle, ɵngcc1.NgClass], encapsulation: 2 });\n/** @nocollapse */\nAvatarComponent.ctorParameters = () => [\n { type: Renderer2 },\n { type: ElementRef }\n];\nAvatarComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-avatar',] }],\n solidClass: [{ type: HostBinding, args: ['class.k-avatar-solid',] }],\n outlineClass: [{ type: HostBinding, args: ['class.k-avatar-outline',] }],\n borderClass: [{ type: HostBinding, args: ['class.k-avatar-bordered',] }],\n flexBasis: [{ type: HostBinding, args: ['style.flexBasis',] }],\n shape: [{ type: Input }],\n size: [{ type: Input }],\n themeColor: [{ type: Input }],\n fill: [{ type: Input }],\n border: [{ type: Input }],\n iconClass: [{ type: Input }],\n width: [{ type: Input }],\n avatarWidth: [{ type: HostBinding, args: ['style.width',] }],\n height: [{ type: Input }],\n avatarHeight: [{ type: HostBinding, args: ['style.height',] }],\n cssStyle: [{ type: Input }],\n initials: [{ type: Input }],\n icon: [{ type: Input }],\n imageSrc: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AvatarComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-avatar',\n template: `\n \n\n \n
    \n
    \n\n \n {{ initials.substring(0, 2) }}\n \n\n \n \n \n `\n }]\n }], function () { return [{ type: ɵngcc0.Renderer2 }, { type: ɵngcc0.ElementRef }]; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-avatar']\n }], fill: [{\n type: Input\n }], border: [{\n type: Input\n }], solidClass: [{\n type: HostBinding,\n args: ['class.k-avatar-solid']\n }], outlineClass: [{\n type: HostBinding,\n args: ['class.k-avatar-outline']\n }], borderClass: [{\n type: HostBinding,\n args: ['class.k-avatar-bordered']\n }], flexBasis: [{\n type: HostBinding,\n args: ['style.flexBasis']\n }], shape: [{\n type: Input\n }], size: [{\n type: Input\n }], themeColor: [{\n type: Input\n }], avatarWidth: [{\n type: HostBinding,\n args: ['style.width']\n }], avatarHeight: [{\n type: HostBinding,\n args: ['style.height']\n }], iconClass: [{\n type: Input\n }], width: [{\n type: Input\n }], height: [{\n type: Input\n }], cssStyle: [{\n type: Input\n }], initials: [{\n type: Input\n }], icon: [{\n type: Input\n }], imageSrc: [{\n type: Input\n }] }); })();\n\n/**\n * Represents the [Kendo UI Card component for Angular]({% slug overview_card %})\n */\nclass CardComponent {\n constructor(localizationService) {\n this.localizationService = localizationService;\n this.hostClass = true;\n /**\n * Specifies the layout of the Card content.\n *\n * The possible values are:\n * * (Default) `vertical`\n * * `horizontal`\n *\n */\n this.orientation = 'vertical';\n /**\n * Defines the width of the Card.\n * Defaults to `285px`.\n */\n this.width = '285px';\n this.rtl = false;\n this.dynamicRTLSubscription = this.localizationService.changes.subscribe(({ rtl }) => {\n this.rtl = rtl;\n this.direction = this.rtl ? 'rtl' : 'ltr';\n });\n }\n get widthStyle() {\n return this.width;\n }\n get vertical() {\n return this.orientation === 'vertical';\n }\n get horizontal() {\n return this.orientation === 'horizontal';\n }\n ngOnDestroy() {\n if (this.dynamicRTLSubscription) {\n this.dynamicRTLSubscription.unsubscribe();\n }\n }\n}\nCardComponent.ɵfac = function CardComponent_Factory(t) { return new (t || CardComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nCardComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CardComponent, selectors: [[\"kendo-card\"]], hostVars: 11, hostBindings: function CardComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"dir\", ctx.direction);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.widthStyle);\n ɵngcc0.ɵɵclassProp(\"k-widget\", ctx.hostClass)(\"k-card\", ctx.hostClass)(\"k-card-vertical\", ctx.vertical)(\"k-card-horizontal\", ctx.horizontal);\n } }, inputs: { orientation: \"orientation\", width: \"width\" }, features: [ɵngcc0.ɵɵProvidersFeature([\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.card.component'\n }\n ])], ngContentSelectors: _c6, decls: 1, vars: 0, template: function CardComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\n/** @nocollapse */\nCardComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\nCardComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-widget',] }, { type: HostBinding, args: ['class.k-card',] }],\n widthStyle: [{ type: HostBinding, args: ['style.width',] }],\n vertical: [{ type: HostBinding, args: ['class.k-card-vertical',] }],\n horizontal: [{ type: HostBinding, args: ['class.k-card-horizontal',] }],\n direction: [{ type: HostBinding, args: ['attr.dir',] }],\n orientation: [{ type: Input }],\n width: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-card',\n providers: [\n LocalizationService,\n {\n provide: L10N_PREFIX,\n useValue: 'kendo.card.component'\n }\n ],\n template: `\n \n `\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-widget']\n }, {\n type: HostBinding,\n args: ['class.k-card']\n }], orientation: [{\n type: Input\n }], width: [{\n type: Input\n }], direction: [{\n type: HostBinding,\n args: ['attr.dir']\n }], widthStyle: [{\n type: HostBinding,\n args: ['style.width']\n }], vertical: [{\n type: HostBinding,\n args: ['class.k-card-vertical']\n }], horizontal: [{\n type: HostBinding,\n args: ['class.k-card-horizontal']\n }] }); })();\n\n/**\n * Specifies the content in the Card header.\n */\nclass CardHeaderComponent {\n constructor() {\n this.hostClass = true;\n }\n}\nCardHeaderComponent.ɵfac = function CardHeaderComponent_Factory(t) { return new (t || CardHeaderComponent)(); };\nCardHeaderComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CardHeaderComponent, selectors: [[\"kendo-card-header\"]], hostVars: 2, hostBindings: function CardHeaderComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-header\", ctx.hostClass);\n } }, ngContentSelectors: _c6, decls: 1, vars: 0, template: function CardHeaderComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\nCardHeaderComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-header',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardHeaderComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-card-header',\n template: `\n \n `\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-header']\n }] }); })();\n\n/**\n * Specifies the content in the Card body.\n */\nclass CardBodyComponent {\n constructor() {\n this.hostClass = true;\n }\n}\nCardBodyComponent.ɵfac = function CardBodyComponent_Factory(t) { return new (t || CardBodyComponent)(); };\nCardBodyComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CardBodyComponent, selectors: [[\"kendo-card-body\"]], hostVars: 2, hostBindings: function CardBodyComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-body\", ctx.hostClass);\n } }, ngContentSelectors: _c6, decls: 1, vars: 0, template: function CardBodyComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\nCardBodyComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-body',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardBodyComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-card-body',\n template: `\n \n `\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-body']\n }] }); })();\n\n/**\n * Specifies the content in the Card footer.\n */\nclass CardFooterComponent {\n constructor() {\n this.hostClass = true;\n }\n}\nCardFooterComponent.ɵfac = function CardFooterComponent_Factory(t) { return new (t || CardFooterComponent)(); };\nCardFooterComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CardFooterComponent, selectors: [[\"kendo-card-footer\"]], hostVars: 2, hostBindings: function CardFooterComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-footer\", ctx.hostClass);\n } }, ngContentSelectors: _c6, decls: 1, vars: 0, template: function CardFooterComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2 });\nCardFooterComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-footer',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardFooterComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-card-footer',\n template: `\n \n `\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-footer']\n }] }); })();\n\n/**\n * Specifies the action buttons of the Card.\n * * ([see example]({% slug actions_card %})).\n */\nclass CardActionsComponent {\n constructor() {\n this.hostClass = true;\n /**\n * Specifies the layout of the Card action buttons.\n *\n * * The possible values are:\n * * (Default) `horizontal`\n * * `vertical`\n *\n */\n this.orientation = 'horizontal';\n /**\n * Specifies the layout of the Card action buttons.\n *\n * The possible values are:\n * * (Default) `start`\n * * `center`\n * * `end`\n * * `stretched`\n *\n */\n this.layout = 'start';\n /**\n * Fires when the user clicks an action button.\n */\n this.action = new EventEmitter();\n }\n get stretchedClass() {\n return this.layout === 'stretched';\n }\n get startClass() {\n return this.layout === 'start';\n }\n get endClass() {\n return this.layout === 'end';\n }\n get centerClass() {\n return this.layout === 'center';\n }\n get verticalClass() {\n return this.orientation === 'vertical';\n }\n get horizontalClass() {\n return this.orientation === 'horizontal';\n }\n /**\n * @hidden\n */\n onClick(action) {\n this.action.emit(action);\n }\n /**\n * @hidden\n */\n actionTemplate() {\n return this.actions instanceof TemplateRef;\n }\n}\nCardActionsComponent.ɵfac = function CardActionsComponent_Factory(t) { return new (t || CardActionsComponent)(); };\nCardActionsComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CardActionsComponent, selectors: [[\"kendo-card-actions\"]], hostVars: 14, hostBindings: function CardActionsComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-actions\", ctx.hostClass)(\"k-card-actions-stretched\", ctx.stretchedClass)(\"k-card-actions-start\", ctx.startClass)(\"k-card-actions-end\", ctx.endClass)(\"k-card-actions-center\", ctx.centerClass)(\"k-card-actions-vertical\", ctx.verticalClass)(\"k-card-actions-horizontal\", ctx.horizontalClass);\n } }, inputs: { orientation: \"orientation\", layout: \"layout\", actions: \"actions\" }, outputs: { action: \"action\" }, ngContentSelectors: _c6, decls: 3, vars: 3, consts: [[4, \"ngIf\"], [\"type\", \"button\", \"class\", \"k-button\", 3, \"k-primary\", \"k-flat\", \"click\", 4, \"ngFor\", \"ngForOf\"], [\"type\", \"button\", 1, \"k-button\", 3, \"click\"], [3, \"ngTemplateOutlet\"]], template: function CardActionsComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, CardActionsComponent_0_Template, 1, 0, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, CardActionsComponent_ng_container_1_Template, 2, 1, \"ng-container\", 0);\n ɵngcc0.ɵɵtemplate(2, CardActionsComponent_2_Template, 1, 1, undefined, 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.actions);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.actionTemplate());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.actionTemplate());\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgForOf, ɵngcc1.NgTemplateOutlet], encapsulation: 2 });\nCardActionsComponent.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-actions',] }],\n stretchedClass: [{ type: HostBinding, args: ['class.k-card-actions-stretched',] }],\n startClass: [{ type: HostBinding, args: ['class.k-card-actions-start',] }],\n endClass: [{ type: HostBinding, args: ['class.k-card-actions-end',] }],\n centerClass: [{ type: HostBinding, args: ['class.k-card-actions-center',] }],\n verticalClass: [{ type: HostBinding, args: ['class.k-card-actions-vertical',] }],\n horizontalClass: [{ type: HostBinding, args: ['class.k-card-actions-horizontal',] }],\n orientation: [{ type: Input }],\n layout: [{ type: Input }],\n actions: [{ type: Input }],\n action: [{ type: Output }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardActionsComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-card-actions',\n template: `\n \n\n \n \n \n\n \n `\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-actions']\n }], orientation: [{\n type: Input\n }], layout: [{\n type: Input\n }], action: [{\n type: Output\n }], stretchedClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-stretched']\n }], startClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-start']\n }], endClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-end']\n }], centerClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-center']\n }], verticalClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-vertical']\n }], horizontalClass: [{\n type: HostBinding,\n args: ['class.k-card-actions-horizontal']\n }], actions: [{\n type: Input\n }] }); })();\n\n/**\n * Specifies a separator in the content of the Card.\n */\nclass CardSeparatorDirective {\n constructor() {\n this.hostClass = true;\n /**\n * Specifies the orientation of the Card separator.\n *\n * The possible values are:\n * (Default) `horizontal`\n * `vertical`\n */\n this.orientation = 'horizontal';\n }\n get verticalClass() {\n return this.orientation === 'vertical';\n }\n get horizontalClass() {\n return this.orientation === 'horizontal';\n }\n}\nCardSeparatorDirective.ɵfac = function CardSeparatorDirective_Factory(t) { return new (t || CardSeparatorDirective)(); };\nCardSeparatorDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CardSeparatorDirective, selectors: [[\"\", \"kendoCardSeparator\", \"\"]], hostVars: 8, hostBindings: function CardSeparatorDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"color\", ctx.color);\n ɵngcc0.ɵɵclassProp(\"k-card-separator\", ctx.hostClass)(\"k-separator-vertical\", ctx.verticalClass)(\"k-separator-horizontal\", ctx.horizontalClass);\n } }, inputs: { orientation: \"orientation\", color: \"color\" } });\nCardSeparatorDirective.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-separator',] }],\n verticalClass: [{ type: HostBinding, args: ['class.k-separator-vertical',] }],\n horizontalClass: [{ type: HostBinding, args: ['class.k-separator-horizontal',] }],\n color: [{ type: HostBinding, args: ['style.color',] }, { type: Input }],\n orientation: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardSeparatorDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCardSeparator]'\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-separator']\n }], orientation: [{\n type: Input\n }], verticalClass: [{\n type: HostBinding,\n args: ['class.k-separator-vertical']\n }], horizontalClass: [{\n type: HostBinding,\n args: ['class.k-separator-horizontal']\n }], color: [{\n type: HostBinding,\n args: ['style.color']\n }, {\n type: Input\n }] }); })();\n\n/**\n * Specifies the text and styles for the title of the Card.\n */\nclass CardTitleDirective {\n constructor() {\n this.hostClass = true;\n }\n}\nCardTitleDirective.ɵfac = function CardTitleDirective_Factory(t) { return new (t || CardTitleDirective)(); };\nCardTitleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CardTitleDirective, selectors: [[\"\", \"kendoCardTitle\", \"\"]], hostVars: 2, hostBindings: function CardTitleDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-title\", ctx.hostClass);\n } } });\nCardTitleDirective.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-title',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardTitleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCardTitle]'\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-title']\n }] }); })();\n\n/**\n * Specifies the text and styles for the subtitle of the Card.\n */\nclass CardSubtitleDirective {\n constructor() {\n this.hostClass = true;\n }\n}\nCardSubtitleDirective.ɵfac = function CardSubtitleDirective_Factory(t) { return new (t || CardSubtitleDirective)(); };\nCardSubtitleDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CardSubtitleDirective, selectors: [[\"\", \"kendoCardSubtitle\", \"\"]], hostVars: 2, hostBindings: function CardSubtitleDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-subtitle\", ctx.hostClass);\n } } });\nCardSubtitleDirective.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-subtitle',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardSubtitleDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCardSubtitle]'\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-subtitle']\n }] }); })();\n\n/**\n * Specifies any media that will be displayed and aligned in the Card.\n */\nclass CardMediaDirective {\n constructor() {\n this.hostClass = true;\n }\n}\nCardMediaDirective.ɵfac = function CardMediaDirective_Factory(t) { return new (t || CardMediaDirective)(); };\nCardMediaDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: CardMediaDirective, selectors: [[\"\", \"kendoCardMedia\", \"\"]], hostVars: 2, hostBindings: function CardMediaDirective_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-card-media\", ctx.hostClass);\n } } });\nCardMediaDirective.propDecorators = {\n hostClass: [{ type: HostBinding, args: ['class.k-card-media',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardMediaDirective, [{\n type: Directive,\n args: [{\n selector: '[kendoCardMedia]'\n }]\n }], function () { return []; }, { hostClass: [{\n type: HostBinding,\n args: ['class.k-card-media']\n }] }); })();\n\n/**\n * The settings of the Card action buttons.\n */\nclass CardAction {\n}\n\nconst exportedModules = [\n AvatarComponent\n];\nconst declarations = [\n ...exportedModules\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Avatar component.\n */\nclass AvatarModule {\n}\nAvatarModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: AvatarModule });\nAvatarModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function AvatarModule_Factory(t) { return new (t || AvatarModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(AvatarModule, { declarations: function () { return [AvatarComponent]; }, imports: function () { return [CommonModule]; }, exports: function () { return [AvatarComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AvatarModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations],\n exports: [exportedModules],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\nconst cardDirectives = [\n CardTitleDirective,\n CardSubtitleDirective,\n CardSeparatorDirective,\n CardMediaDirective\n];\nconst exportedModules$1 = [\n CardComponent,\n CardHeaderComponent,\n CardBodyComponent,\n CardFooterComponent,\n CardActionsComponent,\n ...cardDirectives\n];\nconst declarations$1 = [...exportedModules$1];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Card component.\n */\nclass CardModule {\n}\nCardModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: CardModule });\nCardModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function CardModule_Factory(t) { return new (t || CardModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CardModule, { declarations: function () { return [CardComponent,\n CardHeaderComponent,\n CardBodyComponent,\n CardFooterComponent,\n CardActionsComponent,\n CardTitleDirective,\n CardSubtitleDirective,\n CardSeparatorDirective,\n CardMediaDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [CardComponent,\n CardHeaderComponent,\n CardBodyComponent,\n CardFooterComponent,\n CardActionsComponent,\n CardTitleDirective,\n CardSubtitleDirective,\n CardSeparatorDirective,\n CardMediaDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CardModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$1],\n exports: [exportedModules$1],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nconst DRAWER_LINK_SELECTOR = '.k-drawer-link';\n/**\n * @hidden\n */\nconst ACTIVE_NESTED_LINK_SELECTOR = ':focus:not(.k-state-disabled) .k-drawer-link';\n/**\n * @hidden\n */\nconst nestedLink = (element, selector) => element.querySelector(selector);\n\n/**\n * @hidden\n */\nclass DrawerItemComponent {\n constructor(drawer, element, renderer) {\n this.drawer = drawer;\n this.element = element;\n this.renderer = renderer;\n }\n get disabledClass() {\n return this.item.disabled;\n }\n get selectedClass() {\n return this.drawer.selectedIndices.indexOf(this.index) >= 0;\n }\n get label() {\n return this.item.text ? this.item.text : null;\n }\n /**\n * @hidden\n */\n ngAfterViewInit() {\n const link = nestedLink(this.element.nativeElement, DRAWER_LINK_SELECTOR);\n if (link) {\n this.renderer.removeAttribute(link, 'tabindex');\n }\n }\n /**\n * @hidden\n */\n iconClasses(icon) {\n return `k-icon ${icon}`;\n }\n}\nDrawerItemComponent.ɵfac = function DrawerItemComponent_Factory(t) { return new (t || DrawerItemComponent)(ɵngcc0.ɵɵdirectiveInject(DrawerService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2)); };\nDrawerItemComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DrawerItemComponent, selectors: [[\"\", \"kendoDrawerItem\", \"\"]], hostVars: 7, hostBindings: function DrawerItemComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabledClass)(\"aria-selected\", ctx.selectedClass)(\"aria-label\", ctx.label);\n ɵngcc0.ɵɵclassProp(\"k-state-disabled\", ctx.disabledClass)(\"k-state-selected\", ctx.selectedClass);\n } }, inputs: { item: \"item\", index: \"index\", itemTemplate: \"itemTemplate\", mini: \"mini\", expanded: \"expanded\", disabled: \"disabled\", cssClass: \"cssClass\", cssStyle: \"cssStyle\" }, attrs: _c14, decls: 3, vars: 2, consts: [[4, \"ngIf\", \"ngIfElse\"], [\"defaultTemplate\", \"\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [4, \"ngIf\"], [3, \"ngClass\"], [1, \"k-item-text\"]], template: function DrawerItemComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerItemComponent_0_Template, 1, 4, undefined, 0);\n ɵngcc0.ɵɵtemplate(1, DrawerItemComponent_ng_template_1_Template, 2, 2, \"ng-template\", null, 1, ɵngcc0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n const _r90 = ɵngcc0.ɵɵreference(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.itemTemplate)(\"ngIfElse\", _r90);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgTemplateOutlet, ɵngcc1.NgClass], encapsulation: 2 });\n/** @nocollapse */\nDrawerItemComponent.ctorParameters = () => [\n { type: DrawerService },\n { type: ElementRef },\n { type: Renderer2 }\n];\nDrawerItemComponent.propDecorators = {\n item: [{ type: Input }],\n index: [{ type: Input }],\n itemTemplate: [{ type: Input }],\n mini: [{ type: Input }],\n expanded: [{ type: Input }],\n disabled: [{ type: Input }],\n cssClass: [{ type: Input }],\n cssStyle: [{ type: Input }],\n disabledClass: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.k-state-disabled',] }],\n selectedClass: [{ type: HostBinding, args: ['attr.aria-selected',] }, { type: HostBinding, args: ['class.k-state-selected',] }],\n label: [{ type: HostBinding, args: ['attr.aria-label',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerItemComponent, [{\n type: Component,\n args: [{\n selector: '[kendoDrawerItem]',\n template: `\n \n \n\n \n \n \n {{ item.text }}\n \n \n \n \n \n `\n }]\n }], function () { return [{ type: DrawerService }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.Renderer2 }]; }, { disabledClass: [{\n type: HostBinding,\n args: ['attr.aria-disabled']\n }, {\n type: HostBinding,\n args: ['class.k-state-disabled']\n }], selectedClass: [{\n type: HostBinding,\n args: ['attr.aria-selected']\n }, {\n type: HostBinding,\n args: ['class.k-state-selected']\n }], label: [{\n type: HostBinding,\n args: ['attr.aria-label']\n }], item: [{\n type: Input\n }], index: [{\n type: Input\n }], itemTemplate: [{\n type: Input\n }], mini: [{\n type: Input\n }], expanded: [{\n type: Input\n }], disabled: [{\n type: Input\n }], cssClass: [{\n type: Input\n }], cssStyle: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nconst DRAWER_ITEM_INDEX = 'data-kendo-drawer-index';\n\n/**\n * @hidden\n */\nclass DrawerListComponent {\n constructor(drawerService, renderer, ngZone, changeDetector, element) {\n this.drawerService = drawerService;\n this.renderer = renderer;\n this.ngZone = ngZone;\n this.changeDetector = changeDetector;\n this.element = element;\n this.subscriptions = new Subscription();\n }\n ngOnInit() {\n this.initialSelection();\n this.initDomEvents();\n }\n ngOnDestroy() {\n this.subscriptions.unsubscribe();\n }\n initialSelection() {\n /* Differentiates a user selected item */\n if (this.drawerService.selectedIndices.length === 0) {\n this.drawerService.initSelection();\n }\n }\n initDomEvents() {\n if (!this.element) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n const nativeElement = this.element.nativeElement;\n this.subscriptions.add(this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this)));\n this.subscriptions.add(this.renderer.listen(nativeElement, 'keydown', this.keyDownHandler.bind(this)));\n });\n }\n clickHandler(e) {\n const itemIdx = this.getDrawerItemIndex(e.target);\n const item = this.items[itemIdx];\n if (!item) {\n return;\n }\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n const args = {\n index: itemIdx,\n item: item,\n originalEvent: e\n };\n this.ngZone.run(() => {\n if (!this.drawerService.emit('select', args)) {\n this.drawerService.onSelect(itemIdx);\n this.changeDetector.detectChanges();\n }\n });\n }\n keyDownHandler(e) {\n const isEnterOrSpace = e.keyCode === Keys.Enter || e.keyCode === Keys.Space;\n if (!isEnterOrSpace) {\n return;\n }\n this.clickHandler(e);\n const link = nestedLink(this.element.nativeElement, ACTIVE_NESTED_LINK_SELECTOR);\n if (link) {\n link.click();\n }\n return false;\n }\n getDrawerItemIndex(target) {\n const item = closestItem(target, DRAWER_ITEM_INDEX, this.element.nativeElement);\n if (item) {\n return itemIndex(item, DRAWER_ITEM_INDEX);\n }\n }\n}\nDrawerListComponent.ɵfac = function DrawerListComponent_Factory(t) { return new (t || DrawerListComponent)(ɵngcc0.ɵɵdirectiveInject(DrawerService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nDrawerListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: DrawerListComponent, selectors: [[\"\", \"kendoDrawerList\", \"\"]], inputs: { items: \"items\", itemTemplate: \"itemTemplate\", mini: \"mini\", expanded: \"expanded\" }, attrs: _c15, decls: 1, vars: 1, consts: [[4, \"ngFor\", \"ngForOf\"], [\"kendoDrawerItem\", \"\", \"class\", \"k-drawer-item\", \"tabindex\", \"0\", 3, \"item\", \"index\", \"mini\", \"expanded\", \"itemTemplate\", \"ngClass\", \"ngStyle\", 4, \"ngIf\"], [\"class\", \"k-drawer-item k-drawer-separator\", 3, \"ngClass\", \"ngStyle\", 4, \"ngIf\"], [\"kendoDrawerItem\", \"\", \"tabindex\", \"0\", 1, \"k-drawer-item\", 3, \"item\", \"index\", \"mini\", \"expanded\", \"itemTemplate\", \"ngClass\", \"ngStyle\"], [1, \"k-drawer-item\", \"k-drawer-separator\", 3, \"ngClass\", \"ngStyle\"]], template: function DrawerListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, DrawerListComponent_ng_container_0_Template, 3, 2, \"ng-container\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.items);\n } }, directives: [ɵngcc1.NgForOf, ɵngcc1.NgIf, DrawerItemComponent, ɵngcc1.NgClass, ɵngcc1.NgStyle], encapsulation: 2 });\n/** @nocollapse */\nDrawerListComponent.ctorParameters = () => [\n { type: DrawerService },\n { type: Renderer2 },\n { type: NgZone },\n { type: ChangeDetectorRef },\n { type: ElementRef }\n];\nDrawerListComponent.propDecorators = {\n items: [{ type: Input }],\n itemTemplate: [{ type: Input }],\n mini: [{ type: Input }],\n expanded: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerListComponent, [{\n type: Component,\n args: [{\n selector: '[kendoDrawerList]',\n template: `\n \n
  • \n
  • \n\n
  • \n  \n
  • \n
    \n `\n }]\n }], function () { return [{ type: DrawerService }, { type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }]; }, { items: [{\n type: Input\n }], itemTemplate: [{\n type: Input\n }], mini: [{\n type: Input\n }], expanded: [{\n type: Input\n }] }); })();\n\nconst templateDirectives = [\n DrawerTemplateDirective,\n DrawerHeaderTemplateDirective,\n DrawerFooterTemplateDirective,\n DrawerItemTemplateDirective\n];\nconst exportedModules$2 = [\n DrawerComponent,\n DrawerContainerComponent,\n DrawerContentComponent,\n ...templateDirectives\n];\nconst declarations$2 = [\n DrawerItemComponent,\n DrawerListComponent,\n ...exportedModules$2\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Drawer component.\n */\nclass DrawerModule {\n}\nDrawerModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: DrawerModule });\nDrawerModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function DrawerModule_Factory(t) { return new (t || DrawerModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DrawerModule, { declarations: function () { return [DrawerItemComponent,\n DrawerListComponent,\n DrawerComponent,\n DrawerContainerComponent,\n DrawerContentComponent,\n DrawerTemplateDirective,\n DrawerHeaderTemplateDirective,\n DrawerFooterTemplateDirective,\n DrawerItemTemplateDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [DrawerComponent,\n DrawerContainerComponent,\n DrawerContentComponent,\n DrawerTemplateDirective,\n DrawerHeaderTemplateDirective,\n DrawerFooterTemplateDirective,\n DrawerItemTemplateDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(DrawerModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$2],\n exports: [exportedModules$2],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\nconst exportedModules$3 = [\n PanelBarComponent,\n PanelBarItemComponent,\n PanelBarContentDirective,\n PanelBarItemTemplateDirective,\n PanelBarItemTitleDirective\n];\nconst declarations$3 = [\n ...exportedModules$3\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the PanelBar component.\n *\n * The module registers:\n * - `PanelBarComponent`—The `PanelBar` component class.\n * - `PanelBarItemComponent`—The `PanelBarItem` component class.\n * - `PanelBarContentComponent`—The `PanelBarContent` component class.\n * - `PanelBarItemTemplateDirective—The `PanelBarItemTemplate` directive.\n * - `PanelBarItemTitleDirective—The `PanelBarItemTitle` directive.\n */\nclass PanelBarModule {\n}\nPanelBarModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: PanelBarModule });\nPanelBarModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function PanelBarModule_Factory(t) { return new (t || PanelBarModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(PanelBarModule, { declarations: function () { return [PanelBarComponent,\n PanelBarItemComponent,\n PanelBarContentDirective,\n PanelBarItemTemplateDirective,\n PanelBarItemTitleDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [PanelBarComponent,\n PanelBarItemComponent,\n PanelBarContentDirective,\n PanelBarItemTemplateDirective,\n PanelBarItemTitleDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(PanelBarModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$3],\n exports: [exportedModules$3],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\nconst stopPropagation = ({ originalEvent: event }) => {\n event.stopPropagation();\n event.preventDefault();\n};\nconst preventOnDblClick = release => mouseDown => of(mouseDown).pipe(delay(150), takeUntil(release));\nconst classFromObject = classes => Object.keys(classes).filter(c => classes[c]).join(' ');\nconst createMoveStream = (draggable) => mouseDown => draggable.kendoDrag\n .pipe(takeUntil(draggable.kendoRelease), map(({ pageX, pageY }) => ({\n originalX: mouseDown.pageX,\n originalY: mouseDown.pageY,\n pageX,\n pageY\n})));\n/**\n * @hidden\n */\nclass SplitterBarComponent {\n constructor(draggable, splitter, localization) {\n this.draggable = draggable;\n this.splitter = splitter;\n this.localization = localization;\n this.orientation = 'horizontal';\n this.index = 0;\n this.ariaRole = 'separator';\n this.focused = false;\n this.subscriptions = new Subscription();\n }\n get direction() {\n return this.localization.rtl ? 'rtl' : 'ltr';\n }\n get tabIndex() {\n return this.splitter.isStatic(this.index) ? -1 : 0;\n }\n get hostClasses() {\n const isHorizontal = this.orientation === 'horizontal';\n const isDraggable = this.splitter.isDraggable(this.index);\n const isStatic = this.splitter.isStatic(this.index);\n return classFromObject({\n 'k-state-focused': this.focused,\n 'k-splitbar': true,\n 'k-splitbar-horizontal': isHorizontal,\n 'k-splitbar-vertical': !isHorizontal,\n 'k-splitbar-draggable-horizontal': isHorizontal && isDraggable,\n 'k-splitbar-draggable-vertical': !isHorizontal && isDraggable,\n 'k-splitbar-static-horizontal': isHorizontal && isStatic,\n 'k-splitbar-static-vertical': !isHorizontal && isStatic\n });\n }\n get touchAction() {\n if (this.splitter.isDraggable(this.index)) {\n return 'none';\n }\n }\n get order() {\n return 2 * this.index + 1;\n }\n collapseAny() {\n if (this.expandLast) {\n this.toggleNext();\n }\n else {\n this.tryToggleNearest();\n }\n }\n onFocusIn() {\n this.focused = true;\n }\n onFocusOut() {\n this.focused = false;\n }\n onKeyDown(event) {\n const keyCode = event && event.keyCode;\n const isHorizontal = this.orientation === 'horizontal';\n const resize = delta => {\n event.preventDefault();\n const state$$1 = this.splitter.dragState(this.index);\n this.splitter.setSize(state$$1, delta);\n };\n if (keyCode === Keys.Enter) {\n event.preventDefault();\n this.collapseAny();\n }\n else if (isHorizontal && keyCode === Keys.ArrowLeft) {\n resize(-10);\n }\n else if (isHorizontal && keyCode === Keys.ArrowRight) {\n resize(10);\n }\n else if (!isHorizontal && keyCode === Keys.ArrowUp) {\n resize(-10);\n }\n else if (!isHorizontal && keyCode === Keys.ArrowDown) {\n resize(10);\n }\n }\n get expandLast() {\n const panes = this.splitter.panes;\n return panes.length === 2 && panes[1].collapsed;\n }\n ngOnInit() {\n let state$$1;\n const listener = this.draggable.kendoPress.pipe(tap(stopPropagation), filter(() => this.splitter.isDraggable(this.index)), tap(() => state$$1 = this.splitter.dragState(this.index)), tap(() => this.splitter.toggleContentOverlay(this.index, true)), switchMap(preventOnDblClick(this.draggable.kendoRelease)), switchMap(createMoveStream(this.draggable))).subscribe(({ pageX, pageY, originalX, originalY }) => {\n let delta;\n if (this.orientation === 'vertical') {\n delta = pageY - originalY;\n }\n else if (this.direction === 'rtl') {\n delta = originalX - pageX;\n }\n else {\n delta = pageX - originalX;\n }\n this.splitter.setSize(state$$1, delta);\n });\n this.subscriptions.add(listener);\n this.subscriptions.add(this.draggable.kendoRelease.subscribe(() => this.splitter.toggleContentOverlay(this.index, false)));\n }\n ngOnDestroy() {\n if (this.subscriptions) {\n this.subscriptions.unsubscribe();\n }\n }\n togglePrevious() {\n this.splitter.tryToggle(this.index);\n }\n toggleNext() {\n this.splitter.tryToggle(this.index + 1);\n }\n previousArrowClass() {\n const pane = this.splitter.pane(this.index);\n const nextPane = this.splitter.pane(this.index + 1);\n const isCollapsible = pane.collapsible;\n const isCollapsed = pane.collapsed;\n const isHorizontal = this.orientation === 'horizontal';\n return classFromObject({\n 'k-icon': true,\n 'k-hidden': !isCollapsible || nextPane.isHidden,\n 'k-collapse-prev': isCollapsible,\n 'k-i-arrow-60-left': isCollapsible && isHorizontal && !isCollapsed,\n 'k-i-arrow-60-right': isCollapsible && isHorizontal && isCollapsed,\n 'k-i-arrow-60-up': isCollapsible && !isHorizontal && !isCollapsed,\n 'k-i-arrow-60-down': isCollapsible && !isHorizontal && isCollapsed\n });\n }\n nextArrowClass() {\n const pane = this.splitter.pane(this.index + 1);\n const prevPane = this.splitter.pane(this.index);\n const isCollapsible = pane.collapsible;\n const isCollapsed = pane.collapsed;\n const isHorizontal = this.orientation === 'horizontal';\n return classFromObject({\n 'k-icon': true,\n 'k-hidden': !isCollapsible || prevPane.isHidden,\n 'k-collapse-next': isCollapsible,\n 'k-i-arrow-60-right': isCollapsible && isHorizontal && !isCollapsed,\n 'k-i-arrow-60-left': isCollapsible && isHorizontal && isCollapsed,\n 'k-i-arrow-60-down': isCollapsible && !isHorizontal && !isCollapsed,\n 'k-i-arrow-60-up': isCollapsible && !isHorizontal && isCollapsed\n });\n }\n tryToggleNearest() {\n const prev = this.index;\n const next = this.index + 1;\n if (!this.splitter.tryToggle(prev)) {\n this.splitter.tryToggle(next);\n }\n }\n}\nSplitterBarComponent.ɵfac = function SplitterBarComponent_Factory(t) { return new (t || SplitterBarComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc3.DraggableDirective, 1), ɵngcc0.ɵɵdirectiveInject(SplitterService), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nSplitterBarComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SplitterBarComponent, selectors: [[\"kendo-splitter-bar\"]], hostVars: 13, hostBindings: function SplitterBarComponent_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"dblclick\", function SplitterBarComponent_dblclick_HostBindingHandler() { return ctx.collapseAny(); })(\"focusin\", function SplitterBarComponent_focusin_HostBindingHandler() { return ctx.onFocusIn(); })(\"focusout\", function SplitterBarComponent_focusout_HostBindingHandler() { return ctx.onFocusOut(); })(\"keydown\", function SplitterBarComponent_keydown_HostBindingHandler($event) { return ctx.onKeyDown($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"aria-orientation\", ctx.orientation)(\"role\", ctx.ariaRole)(\"tabindex\", ctx.tabIndex);\n ɵngcc0.ɵɵclassMap(ctx.hostClasses);\n ɵngcc0.ɵɵstyleProp(\"touch-action\", ctx.touchAction)(\"-ms-flex-order\", ctx.order)(\"order\", ctx.order);\n ɵngcc0.ɵɵclassProp(\"k-state-focused\", ctx.focused);\n } }, inputs: { orientation: \"orientation\", index: \"index\" }, decls: 3, vars: 4, consts: [[3, \"click\"], [1, \"k-resize-handle\"]], template: function SplitterBarComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function SplitterBarComponent_Template_div_click_0_listener() { return ctx.togglePrevious(); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelement(1, \"div\", 1);\n ɵngcc0.ɵɵelementStart(2, \"div\", 0);\n ɵngcc0.ɵɵlistener(\"click\", function SplitterBarComponent_Template_div_click_2_listener() { return ctx.toggleNext(); });\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵclassMap(ctx.previousArrowClass());\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassMap(ctx.nextArrowClass());\n } }, encapsulation: 2 });\n/** @nocollapse */\nSplitterBarComponent.ctorParameters = () => [\n { type: DraggableDirective, decorators: [{ type: Host }] },\n { type: SplitterService },\n { type: LocalizationService }\n];\nSplitterBarComponent.propDecorators = {\n orientation: [{ type: Input }, { type: HostBinding, args: ['attr.aria-orientation',] }],\n index: [{ type: Input }],\n ariaRole: [{ type: HostBinding, args: ['attr.role',] }],\n focused: [{ type: HostBinding, args: ['class.k-state-focused',] }],\n tabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],\n hostClasses: [{ type: HostBinding, args: ['class',] }],\n touchAction: [{ type: HostBinding, args: ['style.touch-action',] }],\n order: [{ type: HostBinding, args: ['style.-ms-flex-order',] }, { type: HostBinding, args: ['style.order',] }],\n collapseAny: [{ type: HostListener, args: ['dblclick',] }],\n onFocusIn: [{ type: HostListener, args: ['focusin',] }],\n onFocusOut: [{ type: HostListener, args: ['focusout',] }],\n onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitterBarComponent, [{\n type: Component,\n args: [{\n selector: 'kendo-splitter-bar',\n template: `\n
    \n
    \n
    \n `\n }]\n }], function () { return [{ type: ɵngcc3.DraggableDirective, decorators: [{\n type: Host\n }] }, { type: SplitterService }, { type: ɵngcc2.LocalizationService }]; }, { orientation: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['attr.aria-orientation']\n }], index: [{\n type: Input\n }], ariaRole: [{\n type: HostBinding,\n args: ['attr.role']\n }], focused: [{\n type: HostBinding,\n args: ['class.k-state-focused']\n }], tabIndex: [{\n type: HostBinding,\n args: ['attr.tabindex']\n }], hostClasses: [{\n type: HostBinding,\n args: ['class']\n }], touchAction: [{\n type: HostBinding,\n args: ['style.touch-action']\n }], order: [{\n type: HostBinding,\n args: ['style.-ms-flex-order']\n }, {\n type: HostBinding,\n args: ['style.order']\n }], collapseAny: [{\n type: HostListener,\n args: ['dblclick']\n }], onFocusIn: [{\n type: HostListener,\n args: ['focusin']\n }], onFocusOut: [{\n type: HostListener,\n args: ['focusout']\n }], onKeyDown: [{\n type: HostListener,\n args: ['keydown', ['$event']]\n }] }); })();\n\nconst exportedModules$4 = [\n SplitterComponent,\n SplitterPaneComponent\n];\nconst declarations$4 = [\n SplitterBarComponent,\n ...exportedModules$4\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Splitter component.\n *\n * The module registers:\n * - `SplitterComponent`—The `Splitter` component class.\n * - `SplitterPaneComponent`—The `SplitterPane` component class.\n */\nclass SplitterModule {\n}\nSplitterModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SplitterModule });\nSplitterModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SplitterModule_Factory(t) { return new (t || SplitterModule)(); }, imports: [[\n CommonModule,\n DraggableModule\n ]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SplitterModule, { declarations: function () { return [SplitterBarComponent,\n SplitterComponent,\n SplitterPaneComponent]; }, imports: function () { return [CommonModule,\n DraggableModule]; }, exports: function () { return [SplitterComponent,\n SplitterPaneComponent]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(SplitterModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$4],\n exports: [exportedModules$4],\n imports: [\n CommonModule,\n DraggableModule\n ]\n }]\n }], null, null); })();\n\n/**\n * @hidden\n */\nclass StepperStepComponent {\n constructor(service, localization, ngZone) {\n this.service = service;\n this.localization = localization;\n this.ngZone = ngZone;\n this.isStepValid = undefined;\n this.shouldCheckValidity = undefined;\n this.subs = this.service.focusedStepChange.subscribe(() => {\n this.onFocusedStepChange();\n });\n this.subs.add(this.service.triggerValidation.subscribe(() => {\n this.handleValidityChecks();\n }));\n }\n get errorStepClass() {\n if (isPresent(this.isStepValid)) {\n return !this.isStepValid;\n }\n return false;\n }\n get successStepClass() {\n if (isPresent(this.isStepValid)) {\n return this.isStepValid;\n }\n return false;\n }\n ngOnInit() {\n this.handleValidityChecks();\n }\n ngOnChanges(changes) {\n if (changes.current && !changes.current.firstChange) {\n this.handleValidityChecks();\n }\n }\n ngOnDestroy() {\n if (this.subs) {\n this.subs.unsubscribe();\n }\n }\n onFocusedStepChange() {\n this.ngZone.runOutsideAngular(() => {\n if (this.index === this.service.focusedStep) {\n this.stepLink.nativeElement.focus();\n }\n });\n }\n onFocus() {\n this.service.focus(this.index);\n }\n get tabIndexAttr() {\n const active = this.service.focusedStep || this.service.currentStep;\n return this.index === active ? 0 : -1;\n }\n get indicatorIconClasses() {\n if (this.step.icon) {\n return `k-icon k-i-${this.step.icon}`;\n }\n if (this.step.iconClass) {\n return `${this.step.iconClass}`;\n }\n if (this.shouldCheckValidity) {\n return this.validationIconClasses;\n }\n }\n get showIndicatorIcon() {\n if (this.shouldCheckValidity) {\n return true;\n }\n if (this.step.icon || this.step.iconClass) {\n return true;\n }\n return false;\n }\n get showLabelIcon() {\n if (this.shouldCheckValidity) {\n if (this.type === 'label') {\n return true;\n }\n if (this.step.icon || this.step.iconClass) {\n return true;\n }\n }\n return false;\n }\n get showLabelText() {\n return this.type === 'label' || this.type === 'full';\n }\n get validationIconClasses() {\n if (this.isStepValid) {\n return this.successIcon ? `${this.successIcon}` : 'k-icon k-i-check';\n }\n else {\n return this.errorIcon ? `${this.errorIcon}` : 'k-icon k-i-warning';\n }\n }\n get indicatorText() {\n const text = this.step.text;\n return text ? text : this.index + 1;\n }\n updateStepValidity() {\n if (typeof this.step.isValid === 'boolean') {\n return this.step.isValid;\n }\n if (typeof this.step.isValid === 'function') {\n return this.step.isValid(this.index);\n }\n return undefined;\n }\n get showIndicator() {\n return this.type === 'indicator' || this.type === 'full';\n }\n get showLabel() {\n if (this.type === 'label' || this.type === 'full') {\n return true;\n }\n return this.step.optional;\n }\n get optionalText() {\n return this.localization.get('optional');\n }\n get transitionDuration() {\n return this.service.owner.animationDuration;\n }\n _shouldCheckValidity() {\n if (isPresent(this.step.validate)) {\n if (typeof this.step.validate === 'boolean') {\n return this.step.validate;\n }\n if (typeof this.step.validate === 'function') {\n return this.step.validate(this.index);\n }\n }\n return isPresent(this.step.isValid) && this.index < this.current;\n }\n handleValidityChecks() {\n this.isStepValid = undefined;\n this.shouldCheckValidity = this._shouldCheckValidity();\n if (this.shouldCheckValidity) {\n this.isStepValid = this.updateStepValidity();\n }\n }\n}\nStepperStepComponent.ɵfac = function StepperStepComponent_Factory(t) { return new (t || StepperStepComponent)(ɵngcc0.ɵɵdirectiveInject(StepperService), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nStepperStepComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StepperStepComponent, selectors: [[\"\", \"kendoStepperStep\", \"\"]], viewQuery: function StepperStepComponent_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵstaticViewQuery(_c16, true);\n } if (rf & 2) {\n var _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.stepLink = _t.first);\n } }, hostVars: 4, hostBindings: function StepperStepComponent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"k-step-error\", ctx.errorStepClass)(\"k-step-success\", ctx.successStepClass);\n } }, inputs: { step: \"step\", index: \"index\", current: \"current\", type: \"type\", successIcon: \"successIcon\", errorIcon: \"errorIcon\", indicatorTemplate: \"indicatorTemplate\", labelTemplate: \"labelTemplate\", stepTemplate: \"stepTemplate\" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c17, decls: 4, vars: 6, consts: [[\"href\", \"#\", 1, \"k-step-link\", 3, \"focus\"], [\"stepLink\", \"\"], [4, \"ngIf\"], [3, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [\"class\", \"k-step-indicator\", \"aria-hidden\", \"true\", 3, \"transition-duration\", 4, \"ngIf\"], [\"class\", \"k-step-label\", 4, \"ngIf\"], [\"aria-hidden\", \"true\", 1, \"k-step-indicator\"], [\"class\", \"k-step-indicator-icon\", 3, \"ngClass\", 4, \"ngIf\"], [\"class\", \"k-step-indicator-text\", 4, \"ngIf\"], [1, \"k-step-indicator-icon\", 3, \"ngClass\"], [1, \"k-step-indicator-text\"], [1, \"k-step-label\"], [\"class\", \"k-step-text\", 4, \"ngIf\"], [\"aria-hidden\", \"true\", 3, \"ngClass\", 4, \"ngIf\"], [\"class\", \"k-step-label-optional\", 4, \"ngIf\"], [1, \"k-step-text\"], [\"aria-hidden\", \"true\", 3, \"ngClass\"], [1, \"k-step-label-optional\"]], template: function StepperStepComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"a\", 0, 1);\n ɵngcc0.ɵɵlistener(\"focus\", function StepperStepComponent_Template_a_focus_0_listener() { return ctx.onFocus(); });\n ɵngcc0.ɵɵtemplate(2, StepperStepComponent_2_Template, 1, 5, undefined, 2);\n ɵngcc0.ɵɵtemplate(3, StepperStepComponent_ng_container_3_Template, 3, 2, \"ng-container\", 2);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.tabIndexAttr)(\"title\", ctx.step.label)(\"aria-disabled\", ctx.step.disabled)(\"aria-current\", ctx.index === ctx.current ? \"step\" : null);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.stepTemplate);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx.stepTemplate);\n } }, directives: [ɵngcc1.NgIf, ɵngcc1.NgTemplateOutlet, ɵngcc1.NgClass], encapsulation: 2 });\n/** @nocollapse */\nStepperStepComponent.ctorParameters = () => [\n { type: StepperService },\n { type: LocalizationService },\n { type: NgZone }\n];\nStepperStepComponent.propDecorators = {\n step: [{ type: Input }],\n index: [{ type: Input }],\n current: [{ type: Input }],\n type: [{ type: Input }],\n successIcon: [{ type: Input }],\n errorIcon: [{ type: Input }],\n indicatorTemplate: [{ type: Input }],\n labelTemplate: [{ type: Input }],\n stepTemplate: [{ type: Input }],\n stepLink: [{ type: ViewChild, args: ['stepLink', { static: true },] }],\n errorStepClass: [{ type: HostBinding, args: ['class.k-step-error',] }],\n successStepClass: [{ type: HostBinding, args: ['class.k-step-success',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperStepComponent, [{\n type: Component,\n args: [{\n selector: '[kendoStepperStep]',\n template: `\n \n \n \n\n \n \n\n \n \n \n\n \n {{ step.label }}\n \n ({{optionalText}})\n \n \n \n \n `\n }]\n }], function () { return [{ type: StepperService }, { type: ɵngcc2.LocalizationService }, { type: ɵngcc0.NgZone }]; }, { errorStepClass: [{\n type: HostBinding,\n args: ['class.k-step-error']\n }], successStepClass: [{\n type: HostBinding,\n args: ['class.k-step-success']\n }], step: [{\n type: Input\n }], index: [{\n type: Input\n }], current: [{\n type: Input\n }], type: [{\n type: Input\n }], successIcon: [{\n type: Input\n }], errorIcon: [{\n type: Input\n }], indicatorTemplate: [{\n type: Input\n }], labelTemplate: [{\n type: Input\n }], stepTemplate: [{\n type: Input\n }], stepLink: [{\n type: ViewChild,\n args: ['stepLink', { static: true }]\n }] }); })();\n\n/**\n * @hidden\n */\nconst STEPPER_STEP_INDEX = 'data-kendo-stepper-index';\n\n/**\n * @hidden\n */\nclass StepperListComponent {\n constructor(renderer, ngZone, service, element) {\n this.renderer = renderer;\n this.ngZone = ngZone;\n this.service = service;\n this.element = element;\n }\n ngOnInit() {\n this.initDomEvents();\n }\n ngOnDestroy() {\n if (this.domSubs) {\n this.domSubs();\n }\n }\n get maxStepWidth() {\n return this.maxStepDimension('width');\n }\n get maxStepHeight() {\n return this.maxStepDimension('height');\n }\n maxStepDimension(dimension) {\n if (dimension === 'width' && this.orientation === 'vertical') {\n return null;\n }\n if (dimension === 'height' && this.orientation === 'horizontal') {\n return null;\n }\n return 100 / this.steps.length;\n }\n initDomEvents() {\n if (!this.element) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n const nativeElement = this.element.nativeElement;\n const clickSubscription = this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this));\n const keydownSubscription = this.renderer.listen(nativeElement, 'keydown', (e) => {\n if (hasClass(e.target, 'k-step-link')) {\n this.service.keydown(e);\n }\n });\n this.domSubs = () => {\n clickSubscription();\n keydownSubscription();\n };\n });\n }\n clickHandler(e) {\n e.preventDefault();\n const stepIdx = this.getStepIndex(e.target);\n const step = this.steps[stepIdx];\n if (!step || step.disabled) {\n return;\n }\n if (stepIdx === this.currentStep) {\n this.service.focus(stepIdx);\n return;\n }\n if (this.linear && this.service.isPrevOrNextStep(stepIdx) === false) {\n return;\n }\n this.service.onActivate(stepIdx, e);\n }\n getStepIndex(target) {\n const step = closestItem(target, STEPPER_STEP_INDEX, this.element.nativeElement);\n if (step) {\n return itemIndex(step, STEPPER_STEP_INDEX);\n }\n }\n}\nStepperListComponent.ɵfac = function StepperListComponent_Factory(t) { return new (t || StepperListComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(StepperService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nStepperListComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: StepperListComponent, selectors: [[\"\", \"kendoStepperList\", \"\"]], inputs: { linear: \"linear\", stepType: \"stepType\", orientation: \"orientation\", currentStep: \"currentStep\", steps: \"steps\", successIcon: \"successIcon\", errorIcon: \"errorIcon\", indicatorTemplate: \"indicatorTemplate\", labelTemplate: \"labelTemplate\", stepTemplate: \"stepTemplate\" }, attrs: _c19, decls: 1, vars: 1, consts: [[4, \"ngFor\", \"ngForOf\"], [\"kendoStepperStep\", \"\", 1, \"k-step\", 3, \"type\", \"step\", \"index\", \"current\", \"successIcon\", \"errorIcon\", \"indicatorTemplate\", \"labelTemplate\", \"stepTemplate\", \"ngClass\", \"ngStyle\"]], template: function StepperListComponent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵtemplate(0, StepperListComponent_ng_container_0_Template, 2, 28, \"ng-container\", 0);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngForOf\", ctx.steps);\n } }, directives: [ɵngcc1.NgForOf, StepperStepComponent, ɵngcc1.NgClass, ɵngcc1.NgStyle], encapsulation: 2 });\n/** @nocollapse */\nStepperListComponent.ctorParameters = () => [\n { type: Renderer2 },\n { type: NgZone },\n { type: StepperService },\n { type: ElementRef }\n];\nStepperListComponent.propDecorators = {\n linear: [{ type: Input }],\n stepType: [{ type: Input }],\n orientation: [{ type: Input }],\n currentStep: [{ type: Input }],\n steps: [{ type: Input }],\n successIcon: [{ type: Input }],\n errorIcon: [{ type: Input }],\n indicatorTemplate: [{ type: Input }],\n labelTemplate: [{ type: Input }],\n stepTemplate: [{ type: Input }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperListComponent, [{\n type: Component,\n args: [{\n selector: '[kendoStepperList]',\n template: `\n \n
  • \n
  • \n
    \n `\n }]\n }], function () { return [{ type: ɵngcc0.Renderer2 }, { type: ɵngcc0.NgZone }, { type: StepperService }, { type: ɵngcc0.ElementRef }]; }, { linear: [{\n type: Input\n }], stepType: [{\n type: Input\n }], orientation: [{\n type: Input\n }], currentStep: [{\n type: Input\n }], steps: [{\n type: Input\n }], successIcon: [{\n type: Input\n }], errorIcon: [{\n type: Input\n }], indicatorTemplate: [{\n type: Input\n }], labelTemplate: [{\n type: Input\n }], stepTemplate: [{\n type: Input\n }] }); })();\n\n/**\n * @hidden\n */\nclass Messages extends ComponentMessages {\n}\nMessages.ɵfac = function Messages_Factory(t) { return ɵMessages_BaseFactory(t || Messages); };\nMessages.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: Messages, inputs: { optional: \"optional\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMessages.propDecorators = {\n optional: [{ type: Input }]\n};\nconst ɵMessages_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(Messages);\n\n/**\n * @hidden\n */\nclass LocalizedMessagesDirective extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n}\nLocalizedMessagesDirective.ɵfac = function LocalizedMessagesDirective_Factory(t) { return new (t || LocalizedMessagesDirective)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nLocalizedMessagesDirective.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: LocalizedMessagesDirective, selectors: [[\"\", \"kendoStepperLocalizedMessages\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n/** @nocollapse */\nLocalizedMessagesDirective.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LocalizedMessagesDirective, [{\n type: Directive,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => LocalizedMessagesDirective)\n }\n ],\n selector: `\n [kendoStepperLocalizedMessages]\n `\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, null); })();\n\n/**\n * Custom component messages override default component messages\n * ([see example]({% slug rtl_layout %})).\n */\nclass CustomMessagesComponent extends Messages {\n constructor(service) {\n super();\n this.service = service;\n }\n get override() {\n return true;\n }\n}\nCustomMessagesComponent.ɵfac = function CustomMessagesComponent_Factory(t) { return new (t || CustomMessagesComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LocalizationService)); };\nCustomMessagesComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: CustomMessagesComponent, selectors: [[\"kendo-stepper-messages\"]], features: [ɵngcc0.ɵɵProvidersFeature([\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CustomMessagesComponent_Template(rf, ctx) { }, encapsulation: 2 });\n/** @nocollapse */\nCustomMessagesComponent.ctorParameters = () => [\n { type: LocalizationService }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(CustomMessagesComponent, [{\n type: Component,\n args: [{\n providers: [\n {\n provide: Messages,\n useExisting: forwardRef(() => CustomMessagesComponent)\n }\n ],\n selector: 'kendo-stepper-messages',\n template: ``\n }]\n }], function () { return [{ type: ɵngcc2.LocalizationService }]; }, null); })();\n\nconst templateDirectives$1 = [\n StepperStepTemplateDirective,\n StepperLabelTemplateDirective,\n StepperIndicatorTemplateDirective\n];\nconst exportedModules$5 = [\n StepperComponent,\n CustomMessagesComponent,\n ...templateDirectives$1\n];\nconst declarations$5 = [\n StepperStepComponent,\n StepperListComponent,\n LocalizedMessagesDirective,\n ...exportedModules$5\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Stepper component.\n */\nclass StepperModule {\n}\nStepperModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: StepperModule });\nStepperModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function StepperModule_Factory(t) { return new (t || StepperModule)(); }, imports: [[CommonModule, ProgressBarModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(StepperModule, { declarations: function () { return [StepperStepComponent,\n StepperListComponent,\n LocalizedMessagesDirective,\n StepperComponent,\n CustomMessagesComponent,\n StepperStepTemplateDirective,\n StepperLabelTemplateDirective,\n StepperIndicatorTemplateDirective]; }, imports: function () { return [CommonModule, ProgressBarModule]; }, exports: function () { return [StepperComponent,\n CustomMessagesComponent,\n StepperStepTemplateDirective,\n StepperLabelTemplateDirective,\n StepperIndicatorTemplateDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(StepperModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$5],\n exports: [exportedModules$5],\n imports: [CommonModule, ProgressBarModule]\n }]\n }], null, null); })();\n\nconst exportedModules$6 = [\n TabStripComponent,\n TabStripTabComponent,\n TabContentDirective,\n TabTitleDirective\n];\nconst declarations$6 = [\n ...exportedModules$6\n];\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the TabStrip component.\n *\n * The module registers:\n * - `TabStripComponent`—The `TabStrip` component class.\n * - `TabStripTabComponent`—The `TabStripTab` component class.\n * - `TabContentDirective`—The tab content directive used on the `` tag.\n * - `TabTitleDirective`—The tab title directive used on the `` tag.\n */\nclass TabStripModule {\n}\nTabStripModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: TabStripModule });\nTabStripModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function TabStripModule_Factory(t) { return new (t || TabStripModule)(); }, imports: [[CommonModule]] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(TabStripModule, { declarations: function () { return [TabStripComponent,\n TabStripTabComponent,\n TabContentDirective,\n TabTitleDirective]; }, imports: function () { return [CommonModule]; }, exports: function () { return [TabStripComponent,\n TabStripTabComponent,\n TabContentDirective,\n TabTitleDirective]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TabStripModule, [{\n type: NgModule,\n args: [{\n declarations: [declarations$6],\n exports: [exportedModules$6],\n imports: [CommonModule]\n }]\n }], null, null); })();\n\n/**\n * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})\n * definition for the Layout components.\n *\n * @example\n *\n * ```ts-no-run\n * // Import the Layout module\n * import { LayoutModule } from '@progress/kendo-angular-layout';\n *\n * // The browser platform with a compiler\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n *\n * import { NgModule } from '@angular/core';\n *\n * // Import the app component\n * import { AppComponent } from './app.component';\n *\n * // Define the app module\n * _@NgModule({\n * declarations: [AppComponent], // declare app component\n * imports: [BrowserModule, LayoutModule], // import Layout module\n * bootstrap: [AppComponent]\n * })\n * export class AppModule {}\n *\n * // Compile and launch the module\n * platformBrowserDynamic().bootstrapModule(AppModule);\n *\n * ```\n */\nclass LayoutModule {\n}\nLayoutModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: LayoutModule });\nLayoutModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function LayoutModule_Factory(t) { return new (t || LayoutModule)(); }, imports: [AvatarModule,\n CardModule,\n DrawerModule,\n PanelBarModule,\n SplitterModule,\n StepperModule,\n TabStripModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(LayoutModule, { exports: [AvatarModule,\n CardModule,\n DrawerModule,\n PanelBarModule,\n SplitterModule,\n StepperModule,\n TabStripModule] }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(LayoutModule, [{\n type: NgModule,\n args: [{\n exports: [\n AvatarModule,\n CardModule,\n DrawerModule,\n PanelBarModule,\n SplitterModule,\n StepperModule,\n TabStripModule\n ]\n }]\n }], null, null); })();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { PreventableEvent, DrawerService, DrawerItemComponent, DrawerListComponent, DRAWER_ITEM_INDEX, CustomMessagesComponent, LocalizedMessagesDirective, Messages, PanelBarService, SplitterBarComponent, SplitterService, StepperListComponent, STEPPER_STEP_INDEX, StepperStepComponent, StepperService, PanelBarComponent, PanelBarItemComponent, PanelBarContentDirective, PanelBarItemTemplateDirective, PanelBarItemTitleDirective, PanelBarExpandMode, SplitterComponent, SplitterPaneComponent, TabStripComponent, TabStripTabComponent, TabContentDirective, TabTitleDirective, SelectEvent, DrawerComponent, DrawerContainerComponent, DrawerContentComponent, DrawerSelectEvent, StepperComponent, StepperActivateEvent, AvatarComponent, CardComponent, CardHeaderComponent, CardBodyComponent, CardFooterComponent, CardActionsComponent, CardSeparatorDirective, CardTitleDirective, CardSubtitleDirective, CardMediaDirective, CardAction, AvatarModule, CardModule, DrawerModule, LayoutModule, PanelBarModule, SplitterModule, StepperModule, TabStripModule, DrawerTemplateDirective, DrawerItemTemplateDirective, DrawerHeaderTemplateDirective, DrawerFooterTemplateDirective, StepperIndicatorTemplateDirective, StepperLabelTemplateDirective, StepperStepTemplateDirective };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs2R0FHRTtBQUNGO0FBQ0E7OztnREFBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzRJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a0pBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFzSEU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzJKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0ZBbUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozt3REFVRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7NkdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O3VFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUpBNkJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzZIQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs0RUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7dUhBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OzRFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7c1JBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2VBZ0ZFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3lJQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7cUpBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzsySkFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzJKQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dEQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4SEFxQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3REFnQkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7NkJBU0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7d0pBS0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7a0NBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzsySkFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztrQ0FBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O3VLQUtFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O2tDQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7MEdBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztpSkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnSEFnREU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7d0ZBb0JFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs2QkFlRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs2QkFRRTtBQUNGO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzZCQVFFO0FBQ0Y7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7NkJBUUU7QUFDRjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7aUdBc0JFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzttRUFLRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBS0U7QUFDRjtBQUNBO0FBQ0E7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztXQUtFO0FBQ0Y7QUFDQTtBQUNBOzs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FLRTtBQUNGO0FBQ0E7QUFDQTs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFPRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7aUdBcUJFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs2SEE0QkU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQU9FO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs2QkFVRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFVRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpR0FrREU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7aUhBaUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OElBQUM7QUFDRDtBQUNBO0FBQ0E7cUVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztrREFhRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7eUpBWUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztvRkFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBT0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBYUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb3B5cmlnaHQgwqkgMjAyMCBQcm9ncmVzcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgY29tbWVyY2lhbCBsaWNlbnNlLiBTZWUgTElDRU5TRS5tZCBpbiB0aGUgcHJvamVjdCByb290IGZvciBtb3JlIGluZm9ybWF0aW9uXG4qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmLCBPcHRpb25hbCwgaXNEZXZNb2RlLCBDb21wb25lbnQsIFNraXBTZWxmLCBIb3N0LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkLCBIb3N0QmluZGluZywgVmlld0NoaWxkcmVuLCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBDb250ZW50Q2hpbGQsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBDaGFuZ2VEZXRlY3RvclJlZiwgTmdab25lLCBJbmplY3QsIFF1ZXJ5TGlzdCwgVmlld0VuY2Fwc3VsYXRpb24sIE5nTW9kdWxlLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlLCBMMTBOX1BSRUZJWCwgQ29tcG9uZW50TWVzc2FnZXMgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1sMTBuJztcbmltcG9ydCB7IEtleXMsIGhhc09ic2VydmVycywgRHJhZ2dhYmxlRGlyZWN0aXZlLCBEcmFnZ2FibGVNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBBVVRPX1NUWUxFLCBBbmltYXRpb25CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UsIHRhcCwgZmlsdGVyLCBzd2l0Y2hNYXAsIGRlbGF5LCB0YWtlVW50aWwsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXByb2dyZXNzYmFyJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBleHBhbmQgbW9kZXMgb2YgdGhlIFBhbmVsQmFyLlxuICogQnkgZGVmYXVsdCwgdGhlIGV4cGFuZCBtb2RlIGlzIHNldCB0byBgbXVsdGlwbGVgLlxuICovXG52YXIgUGFuZWxCYXJFeHBhbmRNb2RlO1xuKGZ1bmN0aW9uIChQYW5lbEJhckV4cGFuZE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgeW91IHRvIGV4cGFuZCBvbmx5IG9uZSBpdGVtIGF0IGEgdGltZS5cbiAgICAgKiBXaGVuIHlvdSBleHBhbmQgYW4gaXRlbSwgdGhlIGl0ZW0gdGhhdCB3YXMgcHJldmlvdXNseSBleHBhbmRlZCBpcyBjb2xsLlxuICAgICAqL1xuICAgIFBhbmVsQmFyRXhwYW5kTW9kZVtQYW5lbEJhckV4cGFuZE1vZGVbXCJTaW5nbGVcIl0gPSAwXSA9IFwiU2luZ2xlXCI7XG4gICAgLyoqXG4gICAgICogQWxsb3dzIHlvdSB0byBleHBhbmQgb25seSBvbmUgaXRlbSBhdCBhIHRpbWUgYW5kIHJlcXVpcmVzIHlvdSB0byBzZXQgdGhlIGBoZWlnaHRgIHByb3BlcnR5LlxuICAgICAqIFRoZSBleHBhbmRlZCBhcmVhIG9jY3VwaWVzIHRoZSBlbnRpcmUgaGVpZ2h0IG9mIHRoZSBQYW5lbEJhci5cbiAgICAgKi9cbiAgICBQYW5lbEJhckV4cGFuZE1vZGVbUGFuZWxCYXJFeHBhbmRNb2RlW1wiRnVsbFwiXSA9IDFdID0gXCJGdWxsXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgbW9kZSBvZiB0aGUgUGFuZWxCYXIuXG4gICAgICogQWxsb3dzIHlvdSB0byBleHBhbmQgbW9yZSB0aGFuIG9uZSBpdGVtIGF0IGEgdGltZS4gSXRlbXMgY2FuIGFsc28gYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBQYW5lbEJhckV4cGFuZE1vZGVbUGFuZWxCYXJFeHBhbmRNb2RlW1wiTXVsdGlwbGVcIl0gPSAyXSA9IFwiTXVsdGlwbGVcIjtcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZXhwYW5kIG1vZGUgaXMgc2V0IHRvIGBtdWx0aXBsZWAuXG4gICAgICovXG4gICAgUGFuZWxCYXJFeHBhbmRNb2RlW1BhbmVsQmFyRXhwYW5kTW9kZVtcIkRlZmF1bHRcIl0gPSAyXSA9IFwiRGVmYXVsdFwiO1xufSkoUGFuZWxCYXJFeHBhbmRNb2RlIHx8IChQYW5lbEJhckV4cGFuZE1vZGUgPSB7fSkpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xubGV0IG5leHRQYW5lbGJhcklkID0gMDtcbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBQYW5lbEJhclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBhcmVudFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIHRoaXMua2VlcENvbnRlbnRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGlsZFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIHRoaXMucGFyZW50JCA9IHRoaXMucGFyZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuJCA9IHRoaXMuY2hpbGRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMua2VlcENvbnRlbnQkID0gdGhpcy5rZWVwQ29udGVudFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5wYklkID0gbmV4dFBhbmVsYmFySWQrKztcbiAgICB9XG4gICAgb25LZWVwQ29udGVudChrZWVwQ29udGVudCkge1xuICAgICAgICB0aGlzLmtlZXBDb250ZW50U291cmNlLm5leHQoa2VlcENvbnRlbnQpO1xuICAgIH1cbiAgICBvblNlbGVjdChldmVudCkge1xuICAgICAgICB0aGlzLmNoaWxkU291cmNlLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgICBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLnBhcmVudFNvdXJjZS5uZXh0KHRydWUpO1xuICAgIH1cbiAgICBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMucGFyZW50U291cmNlLm5leHQoZmFsc2UpO1xuICAgIH1cbn1cblBhbmVsQmFyU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuUGFuZWxCYXJTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29udGVudCB0ZW1wbGF0ZSBvZiB0aGUgZGVjbGFyYXRpdmVseSBpbml0aWFsaXplZCBQYW5lbEJhciBpdGVtcy5cbiAqIFRoZSBjb250ZW50IGNhbiBiZSBleHBhbmRlZCBvciBjb2xsYXBzZWQgdGhyb3VnaCB0aGUgaXRlbS5cbiAqL1xuY2xhc3MgUGFuZWxCYXJDb250ZW50RGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuUGFuZWxCYXJDb250ZW50RGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IFwiW2tlbmRvUGFuZWxCYXJDb250ZW50XVwiXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhbmVsQmFyQ29udGVudERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIG9mIHRoZSBQYW5lbEJhciB3aGljaCBoZWxwcyB0byBjdXN0b21pemUgdGhlIGl0ZW0gdGl0bGVcbiAqIChbbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZV0oeyUgc2x1ZyB0ZW1wbGF0ZXNfcGFuZWxiYXIgJX0jdG9jLWN1c3RvbWl6aW5nLXRoZS1hcHBlYXJhbmNlLW9mLXRoZS10aXRsZSkpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgIDxrZW5kby1wYW5lbGJhcj5cbiAqICAgICAgICAgICAgPGtlbmRvLXBhbmVsYmFyLWl0ZW0gW3RpdGxlXT1cIidQYXJpcydcIiBbZXhwYW5kZWRdPVwidHJ1ZVwiPlxuICogICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvUGFuZWxCYXJJdGVtVGl0bGU+XG4gKiAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBDb250ZW50XG4gKiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgICA8L2tlbmRvLXBhbmVsYmFyLWl0ZW0+XG4gKiAgICAgICAgPC9rZW5kby1wYW5lbGJhcj5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7fVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBQYW5lbEJhckl0ZW1UaXRsZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cblBhbmVsQmFySXRlbVRpdGxlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9QYW5lbEJhckl0ZW1UaXRsZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhbmVsQmFySXRlbVRpdGxlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbmxldCBuZXh0SWQgPSAwO1xuY29uc3QgcGFyc2VQYW5lbEJhckl0ZW1zID0gKGRhdGEpID0+IHtcbiAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKCFpdGVtLmlkKSB7XG4gICAgICAgICAgICBpdGVtLmlkID0gYGRlZmF1bHQtJHtuZXh0SWQrK31gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gcGFyc2VQYW5lbEJhckl0ZW1zKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xufTtcbnZhciB1dGlsID0ge1xuICAgIHBhcnNlUGFuZWxCYXJJdGVtc1xufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpc1ByZXNlbnQgPSAodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG5cbmNvbnN0IGZvY3VzYWJsZVJlZ2V4ID0gL14oPzphfGlucHV0fHNlbGVjdHxvcHRpb258dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2k7XG5jb25zdCB0b0NsYXNzTGlzdCA9IChjbGFzc05hbWVzKSA9PiBTdHJpbmcoY2xhc3NOYW1lcykudHJpbSgpLnNwbGl0KCcgJyk7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaXNGb2N1c2FibGUgPSAoZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUpIHtcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0YWJJbmRleCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgICAgICBjb25zdCBza2lwVGFiID0gdGFiSW5kZXggPT09ICctMSc7XG4gICAgICAgIGxldCBmb2N1c2FibGUgPSB0YWJJbmRleCAhPT0gbnVsbCAmJiAhc2tpcFRhYjtcbiAgICAgICAgaWYgKGZvY3VzYWJsZVJlZ2V4LnRlc3QodGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZSA9ICFlbGVtZW50LmRpc2FibGVkICYmICFza2lwVGFiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2N1c2FibGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgaGFzQ2xhc3MgPSAoZWxlbWVudCwgY2xhc3NOYW1lKSA9PiBCb29sZWFuKHRvQ2xhc3NMaXN0KGVsZW1lbnQuY2xhc3NOYW1lKS5maW5kKChuYW1lKSA9PiBuYW1lID09PSBjbGFzc05hbWUpKTtcbmNvbnN0IGNsb3Nlc3RJblNjb3BlID0gKHRhcmdldCwgdGFyZ2V0QXR0ciwgcHJlZGljYXRlLCBzY29wZSkgPT4ge1xuICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBzY29wZSAmJiAhcHJlZGljYXRlKHRhcmdldCwgdGFyZ2V0QXR0cikpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgfVxuICAgIGlmICh0YXJnZXQgIT09IHNjb3BlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBpdGVtSW5kZXggPSAoaXRlbSwgaW5kZXhBdHRyKSA9PiAraXRlbS5nZXRBdHRyaWJ1dGUoaW5kZXhBdHRyKTtcbmNvbnN0IGhhc0l0ZW1JbmRleCA9IChpdGVtLCBpbmRleEF0dHIpID0+IGlzUHJlc2VudChpdGVtLmdldEF0dHJpYnV0ZShpbmRleEF0dHIpKTtcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBjbG9zZXN0SXRlbSA9ICh0YXJnZXQsIHRhcmdldEF0dHIsIHNjb3BlKSA9PiBjbG9zZXN0SW5TY29wZSh0YXJnZXQsIHRhcmdldEF0dHIsIGhhc0l0ZW1JbmRleCwgc2NvcGUpO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xubGV0IG5leHRJZCQxID0gMDtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaXRlbXMgb2YgdGhlIFBhbmVsQmFyLlxuICovXG5jbGFzcyBQYW5lbEJhckl0ZW1Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgZXZlbnRTZXJ2aWNlLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZSA9IGV2ZW50U2VydmljZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSBQYW5lbEJhciBpdGVtIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgaXRlbXNfcGFuZWxiYXIgJX0jdG9jLXRpdGxlcykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9ICdVbnRpdGxlZCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgdGhlIGNvbXBvbmVudCB0byBzZXQgdGhlIGBcImlkXCJgIHByb3BlcnR5IHRvIGVhY2ggaXRlbS5cbiAgICAgICAgICogVXNlZCB0byBzZXQgdGhlIGBpZGAgYXR0cmlidXRlcyBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIGFuZCB0byBlbmFibGUgdGhlIFdBSS1BUklBIHN1cHBvcnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gYGRlZmF1bHQtJHtuZXh0SWQkMSsrfWA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSBpY29uIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBuZXh0IHRvIHRoZSB0aXRsZSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGl0ZW1zX3BhbmVsYmFyICV9I3RvYy10aXRsZS1pY29ucykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pY29uID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzICB0aGUgaWNvbiB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgbmV4dCB0byB0aGUgdGl0bGUgYnkgdXNpbmcgYSBjdXN0b20gQ1NTIGNsYXNzXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgaXRlbXNfcGFuZWxiYXIgJX0jdG9jLXRpdGxlLWljb25zKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmljb25DbGFzcyA9ICcnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUgdGl0bGVcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBpdGVtc19wYW5lbGJhciAlfSN0b2MtdGl0bGUtaW1hZ2VzKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmltYWdlVXJsID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGRpc2FibGVzIGEgUGFuZWxCYXIgaXRlbSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGl0ZW1zX3BhbmVsYmFyICV9I3RvYy1kaXNhYmxlZC1zdGF0ZSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0cyB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgYSBQYW5lbEJhciBpdGVtIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgaXRlbXNfcGFuZWxiYXIgJX0jdG9jLXNlbGVjdGVkLXN0YXRlKSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMua2VlcENvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZEl0ZW1zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBcImluYWN0aXZlXCI7XG4gICAgICAgIHRoaXMucm9sZSA9IFwidHJlZWl0ZW1cIjtcbiAgICAgICAgdGhpcy50aXRsZUF0dHJpYnV0ZSA9IG51bGw7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMud3JhcHBlckZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLl9leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50U2VydmljZS5wYXJlbnQkLnN1YnNjcmliZShmb2N1c2VkID0+IHRoaXMub25XcmFwcGVyRm9jdXNDaGFuZ2UoZm9jdXNlZCkpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChldmVudFNlcnZpY2Uua2VlcENvbnRlbnQkLnN1YnNjcmliZShrZWVwQ29udGVudCA9PiB0aGlzLmtlZXBDb250ZW50ID0ga2VlcENvbnRlbnQpKTtcbiAgICAgICAgdGhpcy53cmFwcGVyRm9jdXNlZCA9IHBhcmVudCA/IHBhcmVudC5mb2N1c2VkIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZXhwYW5kcyB0aGUgUGFuZWxCYXIgaXRlbSAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGl0ZW1zX3BhbmVsYmFyICV9I3RvYy1leHBhbmRlZC1zdGF0ZSkpLlxuICAgICAqL1xuICAgIHNldCBleHBhbmRlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBhY3RpdmVTdGF0ZSA9IHRoaXMuYW5pbWF0ZSA/IFwiYWN0aXZlXCIgOiBcImFjdGl2ZVdpdGhvdXRBbmltYXRpb25cIjtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlID8gYWN0aXZlU3RhdGUgOiBcImluYWN0aXZlXCI7XG4gICAgICAgIGlmICghdGhpcy5rZWVwQ29udGVudCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZENoaWxkQW5pbWF0aW9ucyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXhwYW5kZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGV4cGFuZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWQ7XG4gICAgfVxuICAgIGdldCBhbmltYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudFNlcnZpY2UuYW5pbWF0ZTtcbiAgICB9XG4gICAgZ2V0IGtJdGVtQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQga1N0YXRlRGVmYXVsdENsYXNzKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuICAgIGdldCBrU3RhdGVEaXNhYmxlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IGtTdGF0ZUV4cGFuZGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmV4cGFuZGVkICYmICh0aGlzLmhhc0NoaWxkSXRlbXMgfHwgdGhpcy5oYXNDb250ZW50KTtcbiAgICB9XG4gICAgZ2V0IGl0ZW1JZCgpIHtcbiAgICAgICAgcmV0dXJuICdrLXBhbmVsYmFyLScgKyB0aGlzLmV2ZW50U2VydmljZS5wYklkICsgJy1pdGVtLScgKyB0aGlzLmlkO1xuICAgIH1cbiAgICBnZXQgYXJpYUV4cGFuZGVkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGFzQ2hpbGRJdGVtcyB8fCB0aGlzLmhhc0NvbnRlbnQpID8gIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5leHBhbmRlZCA6IG51bGw7XG4gICAgfVxuICAgIGdldCBhcmlhU2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnNlbGVjdGVkO1xuICAgIH1cbiAgICBnZXQgYXJpYURpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IHRydWUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHRpdGxlVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpdGxlVGVtcGxhdGVzLmxlbmd0aCA+IDAgPyB0aGlzLnRpdGxlVGVtcGxhdGVzLnRvQXJyYXkoKVswXS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhlYWRlckhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtICh0aGlzLmNvbnRlbnRXcmFwcGVyID8gdGhpcy5jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmhhc0l0ZW1zID0gdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbikubGVuZ3RoID4gMDtcbiAgICAgICAgdGhpcy5oYXNDaGlsZEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gdGhpcykubGVuZ3RoID4gMCB8fCB0aGlzLmhhc0l0ZW1zO1xuICAgICAgICB0aGlzLmhhc0NvbnRlbnQgPSAodGhpcy5jb250ZW50VGVtcGxhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbnRlbnRUZW1wbGF0ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgdGhpcy5jb250ZW50ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuSXRlbXMgPSB0aGlzLnZpZXdDaGlsZEl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5JdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkl0ZW1BY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uub25TZWxlY3QodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uSXRlbUNsaWNrKGUpIHtcbiAgICAgICAgaWYgKCFpc0ZvY3VzYWJsZShlLnRhcmdldCkpIHtcbiAgICAgICAgICAgIHRoaXMub25JdGVtQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpY29uQ2xhc3NlcygpIHtcbiAgICAgICAgbGV0IGljb24gPSB0aGlzLmljb24gPyAnay1pLScgKyB0aGlzLmljb24gOiBudWxsO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW2ljb24gfHwgdGhpcy5pY29uQ2xhc3NdOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQsXG4gICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICAgICAgICAgIGV4cGFuZGVkOiB0aGlzLmV4cGFuZGVkLFxuICAgICAgICAgICAgZm9jdXNlZDogdGhpcy5mb2N1c2VkLFxuICAgICAgICAgICAgaWNvbjogdGhpcy5pY29uLFxuICAgICAgICAgICAgaWNvbkNsYXNzOiB0aGlzLmljb25DbGFzcyxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgaW1hZ2VVcmw6IHRoaXMuaW1hZ2VVcmwsXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzdWJUcmVlVmlld0l0ZW1zKCkge1xuICAgICAgICBsZXQgc3ViVHJlZSA9IFtdO1xuICAgICAgICB0aGlzLnZpZXdDaGlsZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBzdWJUcmVlID0gc3ViVHJlZS5jb25jYXQoaXRlbS5zdWJUcmVlVmlld0l0ZW1zKCkpO1xuICAgICAgICAgICAgc3ViVHJlZS5wdXNoKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN1YlRyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCAmJiAodGhpcy5jb250ZW50VGVtcGxhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbnRlbnRUZW1wbGF0ZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZmlndXJhdGlvbjogbWl4ZWQgdGVtcGxhdGUgY29tcG9uZW50cyBhbmQgY29tcG9uZW50IHByb3BlcnR5LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlQW5pbWF0aW9uU3RhdGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWUgJiYgdGhpcy5ldmVudFNlcnZpY2UuZXhwYW5kTW9kZSAhPT0gUGFuZWxCYXJFeHBhbmRNb2RlLlNpbmdsZSA/ICdhY3RpdmUnIDogJ2FjdGl2ZVdpdGhvdXRBbmltYXRpb24nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgdG9nZ2xlRXhwYW5kZWRDaGlsZEFuaW1hdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5JdGVtcykge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkl0ZW1zLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC50b2dnbGVBbmltYXRpb25TdGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnRvZ2dsZUV4cGFuZGVkQ2hpbGRBbmltYXRpb25zKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbldyYXBwZXJGb2N1c0NoYW5nZShmb2N1c2VkKSB7XG4gICAgICAgIHRoaXMud3JhcHBlckZvY3VzZWQgPSBmb2N1c2VkO1xuICAgIH1cbn1cblBhbmVsQmFySXRlbUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigndG9nZ2xlJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUoJ2luYWN0aXZlJywgc3R5bGUoeyBkaXNwbGF5OiAnbm9uZScgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiBhY3RpdmUnLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIGRpc3BsYXk6ICdibG9jaycsIGhlaWdodDogMCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlKDIwMCwgc3R5bGUoeyBoZWlnaHQ6IEFVVE9fU1RZTEUgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oJ2FjdGl2ZSA9PiAqJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgb3ZlcmZsb3c6ICdoaWRkZW4nLCBoZWlnaHQ6IEFVVE9fU1RZTEUgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZSgyMDAsIHN0eWxlKHsgaGVpZ2h0OiAwLCBkaXNwbGF5OiAnbm9uZScgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb1BhbmVsYmFySXRlbScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IFwia2VuZG8tcGFuZWxiYXItaXRlbVwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgPHNwYW5cbiAgICAgICAgICAgICAgICAjaGVhZGVyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstbGlua109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1oZWFkZXJdPVwiIXBhcmVudFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstc3RhdGUtc2VsZWN0ZWRdPVwiIWRpc2FibGVkICYmIHNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGF0ZS1mb2N1c2VkXT1cIiFkaXNhYmxlZCAmJiBmb2N1c2VkICYmIHdyYXBwZXJGb2N1c2VkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cImljb24gfHwgaWNvbkNsYXNzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstaWNvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaWNvbkNsYXNzZXNcIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstaW1hZ2VcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgIGFsdD1cIlwiPlxuICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGl0bGVUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhhc0NoaWxkSXRlbXMgfHwgaGFzQ29udGVudFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstaWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1pLWFycm93LW5dPVwiZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLXBhbmVsYmFyLWNvbGxhcHNlXT1cImV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1pLWFycm93LXNdPVwiIWV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1wYW5lbGJhci1leHBhbmRdPVwiIWV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiAjY29udGVudFdyYXBwZXJcbiAgICAgICAgICAgICpuZ0lmPVwia2VlcENvbnRlbnQgfHwgKCFkaXNhYmxlZCAmJiBleHBhbmRlZCAmJiAoaGFzQ2hpbGRJdGVtcyB8fCBoYXNDb250ZW50KSlcIlxuICAgICAgICAgICAgW0B0b2dnbGVdPVwic3RhdGVcIlxuICAgICAgICAgICAgW2F0dHIucm9sZV09XCInZ3JvdXAnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFkaXNhYmxlZCAmJiAhZXhwYW5kZWRcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cImhhc0NoaWxkSXRlbXMgJiYgIWl0ZW1zPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5vdmVyZmxvd109XCJjb250ZW50T3ZlcmZsb3dcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiY29udGVudEhlaWdodFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLXBhbmVsIGstZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwia2VuZG8tcGFuZWxiYXItaXRlbVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzQ29udGVudCAmJiAhY29udGVudFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLm92ZXJmbG93XT1cImNvbnRlbnRPdmVyZmxvd1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJjb250ZW50SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VGVtcGxhdGUuZmlyc3QudGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc0l0ZW1zXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUub3ZlcmZsb3ddPVwiY29udGVudE92ZXJmbG93XCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImNvbnRlbnRIZWlnaHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1wYW5lbCBrLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tcGFuZWxiYXItaXRlbSAqbmdJZj1cIiFpdGVtLmhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaXRlbS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25DbGFzc109XCJpdGVtLmljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiaXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtleHBhbmRlZF09XCIhIWl0ZW0uZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0uY2hpbGRyZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiaXRlbS5jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDwva2VuZG8tcGFuZWxiYXItaXRlbT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLm92ZXJmbG93XT1cImNvbnRlbnRPdmVyZmxvd1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJjb250ZW50SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImstY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6IGltYWdlVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhdGVtcGxhdGVcIj57e2NvbnRlbnR9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5QYW5lbEJhckl0ZW1Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBQYW5lbEJhckl0ZW1Db21wb25lbnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNraXBTZWxmIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0sXG4gICAgeyB0eXBlOiBQYW5lbEJhclNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfVxuXTtcblBhbmVsQmFySXRlbUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICB0aXRsZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW1hZ2VVcmw6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBleHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2VsZWN0ZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbnRlbnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGl0ZW1zOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0ZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaGVhZGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnaGVhZGVyJywge30sXSB9XSxcbiAgICBjb250ZW50V3JhcHBlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2NvbnRlbnRXcmFwcGVyJywge30sXSB9XSxcbiAgICByb2xlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLnJvbGUnLF0gfV0sXG4gICAgdGl0bGVBdHRyaWJ1dGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIudGl0bGUnLF0gfV0sXG4gICAga0l0ZW1DbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1pdGVtJyxdIH1dLFxuICAgIGtTdGF0ZURlZmF1bHRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1kZWZhdWx0JyxdIH1dLFxuICAgIGtTdGF0ZURpc2FibGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnLF0gfV0sXG4gICAga1N0YXRlRXhwYW5kZWRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1leHBhbmRlZCcsXSB9XSxcbiAgICBpdGVtSWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2lkJyxdIH1dLFxuICAgIGFyaWFFeHBhbmRlZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLWV4cGFuZGVkJyxdIH1dLFxuICAgIGFyaWFTZWxlY3RlZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLXNlbGVjdGVkJyxdIH1dLFxuICAgIGFyaWFEaXNhYmxlZDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLWRpc2FibGVkJyxdIH1dLFxuICAgIHZpZXdDaGlsZEl0ZW1zOiBbeyB0eXBlOiBWaWV3Q2hpbGRyZW4sIGFyZ3M6IFtQYW5lbEJhckl0ZW1Db21wb25lbnQsXSB9XSxcbiAgICBjb250ZW50SXRlbXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1BhbmVsQmFySXRlbUNvbXBvbmVudCxdIH1dLFxuICAgIGNvbnRlbnRUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbUGFuZWxCYXJDb250ZW50RGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9LF0gfV0sXG4gICAgdGl0bGVUZW1wbGF0ZXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1BhbmVsQmFySXRlbVRpdGxlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9LF0gfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIG9mIHRoZSBQYW5lbEJhciB3aGljaCBoZWxwcyB0byBjdXN0b21pemUgdGhlIGl0ZW0gY29udGVudC5cbiAqL1xuY2xhc3MgUGFuZWxCYXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5QYW5lbEJhckl0ZW1UZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvUGFuZWxCYXJJdGVtVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5QYW5lbEJhckl0ZW1UZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBQYW5lbEJhciBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfcGFuZWxiYXIgJX0pLlxuICovXG4vLyBUT0RPOiBhZGQgc3R5bGVzIGFzIGlucHV0IHByb3BcbmNsYXNzIFBhbmVsQmFyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBldmVudFNlcnZpY2UsIGxvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIGV4cGFuZCBtb2RlIG9mIHRoZSBQYW5lbEJhciB0aHJvdWdoIHRoZSBgUGFuZWxCYXJFeHBhbmRNb2RlYCBlbnVtIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgZXhwYW5kbW9kZXNfcGFuZWxiYXIgJX0pKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGF2YWlsYWJsZSBtb2RlcyBhcmU6XG4gICAgICAgICAqIC0gYFwic2luZ2xlXCJgJm1kYXNoO0V4cGFuZHMgb25seSBvbmUgaXRlbSBhdCBhIHRpbWUuIEV4cGFuZGluZyBhbiBpdGVtIGNvbGxhcHNlcyB0aGUgaXRlbSB0aGF0IHdhcyBwcmV2aW91c2x5IGV4cGFuZGVkLlxuICAgICAgICAgKiAtIGBcIm11bHRpcGxlXCJgJm1kYXNoO1RoZSBkZWZhdWx0IG1vZGUgb2YgdGhlIFBhbmVsQmFyLlxuICAgICAgICAgKiBFeHBhbmRzIG1vcmUgdGhhbiBvbmUgaXRlbSBhdCBhIHRpbWUuIEl0ZW1zIGNhbiBhbHNvIGJlIHRvZ2dsZWQuXG4gICAgICAgICAqIC0gYFwiZnVsbFwiYCZtZGFzaDtFeHBhbmRzIG9ubHkgb25lIGl0ZW0gYXQgYSB0aW1lLlxuICAgICAgICAgKiBUaGUgZXhwYW5kZWQgYXJlYSBvY2N1cGllcyB0aGUgZW50aXJlIGhlaWdodCBvZiB0aGUgUGFuZWxCYXIuIFJlcXVpcmVzIHlvdSB0byBzZXQgdGhlIGBoZWlnaHRgIHByb3BlcnR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leHBhbmRNb2RlID0gUGFuZWxCYXJFeHBhbmRNb2RlLkRlZmF1bHQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgdGhlIFBhbmVsQmFyIHRvIG1vZGlmeSB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGl0ZW1zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIGFuaW1hdGUgc3RhdGUgb2YgdGhlIFBhbmVsQmFyIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgYW5pbWF0aW9uc19wYW5lbGJhciAlfSkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgY29tcG9uZW50IHdoZW4gdGhlIGBcImZ1bGxcImAgZXhwYW5kIG1vZGUgaXMgdXNlZC5cbiAgICAgICAgICogVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpbiB0aGUgYFwibXVsdGlwbGVcImAgYW5kIGBcInNpbmdsZVwiYCBleHBhbmQgbW9kZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIGVhY2ggdGltZSB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCBhIFBhbmVsQmFyIGl0ZW1cbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyByb3V0aW5nX3BhbmVsYmFyICV9I3RvYy1nZXR0aW5nLXRoZS1zZWxlY3RlZC1pdGVtKSkuXG4gICAgICAgICAqIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIGFsbCBpdGVtcyB0aGF0IGFyZSBtb2RpZmllZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnJvbGUgPSBcInRyZWVcIjtcbiAgICAgICAgdGhpcy5hY3RpdmVEZXNjZW5kYW50ID0gXCJcIjtcbiAgICAgICAgdGhpcy5pc1ZpZXdJbml0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2tlZXBJdGVtQ29udGVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuSGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsYmFySGVpZ2h0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY29udGVudE92ZXJmbG93ID0gdGhpcy5leHBhbmRNb2RlID09PSBQYW5lbEJhckV4cGFuZE1vZGUuRnVsbCA/ICdhdXRvJyA6ICd2aXNpYmxlJztcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuSGVpZ2h0ICs9IGl0ZW0uaGVhZGVySGVpZ2h0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uY29udGVudEhlaWdodCA9IFBhbmVsQmFyRXhwYW5kTW9kZS5GdWxsID09PSB0aGlzLmV4cGFuZE1vZGUgPyAocGFuZWxiYXJIZWlnaHQgLSBjaGlsZHJlbkhlaWdodCkgKyBcInB4XCIgOiAnYXV0byc7XG4gICAgICAgICAgICAgICAgaXRlbS5jb250ZW50T3ZlcmZsb3cgPSBjb250ZW50T3ZlcmZsb3c7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5rZXlCaW5kaW5ncyA9IHRoaXMuY29tcHV0ZWRLZXlzO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZSA9IGV2ZW50U2VydmljZTtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY2hpbGRyZW4kLnN1YnNjcmliZShldmVudCA9PiB0aGlzLm9uSXRlbUFjdGlvbihldmVudCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBQYW5lbEJhciByZW5kZXJzIHRoZSBjb250ZW50IG9mIGFsbCBpdGVtcyBhbmQgdGhleSBhcmUgcGVyc2lzdGVkIGluIHRoZSBET01cbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHRlbXBsYXRlc19wYW5lbGJhciAlfSN0b2MtY29sbGVjdGlvbnMpKS5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBnZXQga2VlcEl0ZW1Db250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2VlcEl0ZW1Db250ZW50O1xuICAgIH1cbiAgICBzZXQga2VlcEl0ZW1Db250ZW50KGtlZXBJdGVtQ29udGVudCkge1xuICAgICAgICB0aGlzLl9rZWVwSXRlbUNvbnRlbnQgPSBrZWVwSXRlbUNvbnRlbnQ7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLm9uS2VlcENvbnRlbnQoa2VlcEl0ZW1Db250ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaXRlbXMgb2YgdGhlIFBhbmVsQmFyIGFzIGFuIGFycmF5IG9mIGBQYW5lbEJhckl0ZW1Nb2RlbGAgaW5zdGFuY2VzXG4gICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBpdGVtc19wYW5lbGJhciAlfSkpLlxuICAgICAqL1xuICAgIHNldCBpdGVtcyhkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcyA9IHV0aWwucGFyc2VQYW5lbEJhckl0ZW1zKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgIH1cbiAgICBnZXQgaG9zdEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kTW9kZSA9PT0gUGFuZWxCYXJFeHBhbmRNb2RlLkZ1bGwgPyB0aGlzLmhlaWdodCA6ICdhdXRvJztcbiAgICB9XG4gICAgZ2V0IG92ZXJmbG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBhbmRNb2RlID09PSBQYW5lbEJhckV4cGFuZE1vZGUuRnVsbCA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcbiAgICB9XG4gICAgZ2V0IGRpcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBpbnZlcnRLZXlzKG9yaWdpbmFsLCBpbnZlcnRlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24ucnRsID8gaW52ZXJ0ZWQgOiBvcmlnaW5hbDtcbiAgICB9XG4gICAgZ2V0IGNvbXB1dGVkS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFtLZXlzLlNwYWNlXTogKCkgPT4gdGhpcy5zZWxlY3RGb2N1c2VkSXRlbSgpLFxuICAgICAgICAgICAgW0tleXMuRW50ZXJdOiAoKSA9PiB0aGlzLnNlbGVjdEZvY3VzZWRJdGVtKCksXG4gICAgICAgICAgICBbS2V5cy5BcnJvd1VwXTogKCkgPT4gdGhpcy5mb2N1c1ByZXZpb3VzSXRlbSgpLFxuICAgICAgICAgICAgW3RoaXMuaW52ZXJ0S2V5cyhLZXlzLkFycm93TGVmdCwgS2V5cy5BcnJvd1JpZ2h0KV06ICgpID0+IHRoaXMuY29sbGFwc2VJdGVtKCksXG4gICAgICAgICAgICBbS2V5cy5BcnJvd0Rvd25dOiAoKSA9PiB0aGlzLmZvY3VzTmV4dEl0ZW0oKSxcbiAgICAgICAgICAgIFt0aGlzLmludmVydEtleXMoS2V5cy5BcnJvd1JpZ2h0LCBLZXlzLkFycm93TGVmdCldOiAoKSA9PiB0aGlzLmV4cGFuZEl0ZW0oKSxcbiAgICAgICAgICAgIFtLZXlzLkVuZF06ICgpID0+IHRoaXMuZm9jdXNMYXN0SXRlbSgpLFxuICAgICAgICAgICAgW0tleXMuSG9tZV06ICgpID0+IHRoaXMuZm9jdXNGaXJzdEl0ZW0oKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxpemF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5rZXlCaW5kaW5ncyA9IHRoaXMuY29tcHV0ZWRLZXlzKTtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuYW5pbWF0ZSA9IHRoaXMuYW5pbWF0ZTtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZXhwYW5kTW9kZSA9IHRoaXMuZXhwYW5kTW9kZTtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkl0ZW1zID0gdGhpcy52aWV3Q2hpbGRJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICB0aGlzLmFsbEl0ZW1zID0gdGhpcy52aWV3SXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuSXRlbXMgPSB0aGlzLmNvbnRlbnRDaGlsZEl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIHRoaXMuYWxsSXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcy50b0FycmF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdCAmJiB0aGlzLmNoaWxkcmVuSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmlld0luaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVDaGlsZHJlbkhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydoZWlnaHQnXSB8fCBjaGFuZ2VzWydleHBhbmRNb2RlJ10gfHwgY2hhbmdlc1tcIml0ZW1zXCJdKSB7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuSXRlbXMpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMudXBkYXRlQ2hpbGRyZW5IZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLmFuaW1hdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmFuaW1hdGUgPSB0aGlzLmFuaW1hdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMuZXhwYW5kTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZXhwYW5kTW9kZSA9IHRoaXMuZXhwYW5kTW9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlID8gdGhpcy50ZW1wbGF0ZS50ZW1wbGF0ZVJlZiA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG9uQ29tcG9uZW50Q2xpY2soZXZlbnQpIHtcbiAgICAgICAgY29uc3QgaXRlbUNsaWNrZWQgPSB0aGlzLnZpc2libGVJdGVtcygpLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmhlYWRlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBpdGVtQ2xpY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Db21wb25lbnRGb2N1cygpIHtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uub25Gb2N1cygpO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5hbGxJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlSXRlbXMgPSB0aGlzLnZpc2libGVJdGVtcygpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZEl0ZW1zID0gdmlzaWJsZUl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uZm9jdXNlZCk7XG4gICAgICAgICAgICBpZiAoIWZvY3VzZWRJdGVtcy5sZW5ndGggJiYgdmlzaWJsZUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlSXRlbXNbMF0uZm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEZXNjZW5kYW50ID0gdmlzaWJsZUl0ZW1zWzBdLml0ZW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgb25Db21wb25lbnRCbHVyKCkge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5vbkJsdXIoKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlRGVzY2VuZGFudCA9IFwiXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNvbXBvbmVudEtleURvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlzLlNwYWNlIHx8IGV2ZW50LmtleUNvZGUgPT09IEtleXMuQXJyb3dVcCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlzLkFycm93RG93biB8fFxuICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IEtleXMuQXJyb3dMZWZ0IHx8IGV2ZW50LmtleUNvZGUgPT09IEtleXMuQXJyb3dSaWdodCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlzLkhvbWUgfHxcbiAgICAgICAgICAgICAgICBldmVudC5rZXlDb2RlID09PSBLZXlzLkVuZCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlzLlBhZ2VVcCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlzLlBhZ2VEb3duKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmtleUJpbmRpbmdzW2V2ZW50LmtleUNvZGVdO1xuICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiBuZXh0IGl0ZW0gaXMgZGlzYWJsZWQgYW5kIHNraXAgb3BlcmF0aW9uP1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHZpZXdJdGVtcygpIHtcbiAgICAgICAgbGV0IHRyZWVJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLnZpZXdDaGlsZEl0ZW1zLnRvQXJyYXkoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgdHJlZUl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB0cmVlSXRlbXMgPSB0cmVlSXRlbXMuY29uY2F0KGl0ZW0uc3ViVHJlZVZpZXdJdGVtcygpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cmVlSXRlbXM7XG4gICAgfVxuICAgIHZhbGlkYXRlQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcyAmJiAodGhpcy5jb250ZW50SXRlbXMgJiYgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb246IG1peGVkIHRlbXBsYXRlIGNvbXBvbmVudHMgYW5kIGl0ZW1zIHByb3BlcnR5LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkl0ZW1BY3Rpb24oaXRlbSkge1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW9kaWZpZWRJdGVtcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLmFsbEl0ZW1zXG4gICAgICAgICAgICAuZm9yRWFjaCgoY3VycmVudEl0ZW0pID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFN0YXRlID0gY3VycmVudEl0ZW0gPT09IGl0ZW07XG4gICAgICAgICAgICBsZXQgZm9jdXNlZFN0YXRlID0gc2VsZWN0ZWRTdGF0ZTtcbiAgICAgICAgICAgIHNlbGVjdGVkU3RhdGUgPSB0aGlzLnNlbGVjdGFibGUgPyBzZWxlY3RlZFN0YXRlIDogY3VycmVudEl0ZW0uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkU3RhdGUgfHwgY3VycmVudEl0ZW0uZm9jdXNlZCAhPT0gZm9jdXNlZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEl0ZW0uc2VsZWN0ZWQgPSBzZWxlY3RlZFN0YXRlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtLmZvY3VzZWQgPSBmb2N1c2VkU3RhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEZXNjZW5kYW50ID0gZm9jdXNlZFN0YXRlID8gY3VycmVudEl0ZW0uaXRlbUlkIDogXCJcIjtcbiAgICAgICAgICAgICAgICBtb2RpZmllZEl0ZW1zLnB1c2goY3VycmVudEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kTW9kZSA9PT0gUGFuZWxCYXJFeHBhbmRNb2RlLk11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5oYXNDaGlsZEl0ZW1zIHx8IGl0ZW0uaGFzQ29udGVudCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uZXhwYW5kZWQgPSAhaXRlbS5leHBhbmRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb2RpZmllZEl0ZW1zLmluZGV4T2YoaXRlbSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdzID0gaXRlbS5wYXJlbnQgPyBpdGVtLnBhcmVudC5jaGlsZHJlbkl0ZW1zIDogdGhpcy5jaGlsZHJlbkl0ZW1zO1xuICAgICAgICAgICAgaWYgKGl0ZW0uaGFzQ2hpbGRJdGVtcyB8fCBpdGVtLmhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBzaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoY3VycmVudEl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGFuZGVkU3RhdGUgPSBjdXJyZW50SXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SXRlbS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRJdGVtcy5pbmRleE9mKGN1cnJlbnRJdGVtKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEl0ZW1zLnB1c2goY3VycmVudEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KG1vZGlmaWVkSXRlbXMubWFwKGN1cnJlbnRJdGVtID0+IGN1cnJlbnRJdGVtLnNlcmlhbGl6ZSgpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNWaXNpYmxlKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIHZpc2libGVJdGVtcy5zb21lKGkgPT4gaSA9PT0gaXRlbSk7XG4gICAgfVxuICAgIGdldFZpc2libGVQYXJlbnQoaXRlbSkge1xuICAgICAgICBjb25zdCB2aXNpYmxlSXRlbXMgPSB0aGlzLnZpc2libGVJdGVtcygpO1xuICAgICAgICBpZiAoIWl0ZW0ucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUl0ZW1zLnNvbWUoaSA9PiBpID09PSBpdGVtLnBhcmVudCkgPyBpdGVtLnBhcmVudCA6IHRoaXMuZ2V0VmlzaWJsZVBhcmVudChpdGVtLnBhcmVudCk7XG4gICAgfVxuICAgIGZvY3VzSXRlbShhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMoKTtcbiAgICAgICAgbGV0IGN1cnJlbnRJbmRleCA9IHZpc2libGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmZvY3VzZWQpO1xuICAgICAgICBsZXQgY3VycmVudEl0ZW0gPSB2aXNpYmxlSXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgbGV0IG5leHRJdGVtO1xuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGZvY3VzZWRJdGVtID0gdGhpcy5hbGxJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5mb2N1c2VkKTtcbiAgICAgICAgICAgIGZvY3VzZWRJdGVtLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGN1cnJlbnRJdGVtID0gdGhpcy5nZXRWaXNpYmxlUGFyZW50KGZvY3VzZWRJdGVtKTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHZpc2libGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjdXJyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJsYXN0SXRlbVwiOlxuICAgICAgICAgICAgICAgIG5leHRJdGVtID0gdmlzaWJsZUl0ZW1zW3Zpc2libGVJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJmaXJzdEl0ZW1cIjpcbiAgICAgICAgICAgICAgICBuZXh0SXRlbSA9IHZpc2libGVJdGVtc1swXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJuZXh0SXRlbVwiOlxuICAgICAgICAgICAgICAgIG5leHRJdGVtID0gdmlzaWJsZUl0ZW1zW2N1cnJlbnRJbmRleCA8IHZpc2libGVJdGVtcy5sZW5ndGggLSAxID8gY3VycmVudEluZGV4ICsgMSA6IDBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInByZXZpb3VzSXRlbVwiOlxuICAgICAgICAgICAgICAgIG5leHRJdGVtID0gdmlzaWJsZUl0ZW1zW2N1cnJlbnRJbmRleCA+IDAgPyBjdXJyZW50SW5kZXggLSAxIDogdmlzaWJsZUl0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgbmV4dEl0ZW0gJiYgY3VycmVudEl0ZW0gIT09IG5leHRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVGb2N1cyhjdXJyZW50SXRlbSwgbmV4dEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmVGb2N1cyhmcm9tLCB0bykge1xuICAgICAgICBmcm9tLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdG8uZm9jdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYWN0aXZlRGVzY2VuZGFudCA9IHRvLml0ZW1JZDtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRJdGVtcyA9IG5ldyBBcnJheShmcm9tLnNlcmlhbGl6ZSgpLCB0by5zZXJpYWxpemUoKSk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChtb2RpZmllZEl0ZW1zKTtcbiAgICB9XG4gICAgZm9jdXNMYXN0SXRlbSgpIHtcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oXCJsYXN0SXRlbVwiKTtcbiAgICB9XG4gICAgZm9jdXNGaXJzdEl0ZW0oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKFwiZmlyc3RJdGVtXCIpO1xuICAgIH1cbiAgICBmb2N1c05leHRJdGVtKCkge1xuICAgICAgICB0aGlzLmZvY3VzSXRlbShcIm5leHRJdGVtXCIpO1xuICAgIH1cbiAgICBmb2N1c1ByZXZpb3VzSXRlbSgpIHtcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oXCJwcmV2aW91c0l0ZW1cIik7XG4gICAgfVxuICAgIGV4cGFuZEl0ZW0oKSB7XG4gICAgICAgIGxldCBjdXJyZW50SXRlbSA9IHRoaXMuYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5mb2N1c2VkKVswXTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZShjdXJyZW50SXRlbSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRJdGVtLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGN1cnJlbnRJdGVtID0gdGhpcy5nZXRWaXNpYmxlUGFyZW50KGN1cnJlbnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uaGFzQ2hpbGRJdGVtcyB8fCBjdXJyZW50SXRlbS5oYXNDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRJdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1BY3Rpb24oY3VycmVudEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEl0ZW0uaGFzQ2hpbGRJdGVtcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGRJbmRleCA9IGN1cnJlbnRJdGVtLmNoaWxkcmVuSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdENoaWxkSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cyhjdXJyZW50SXRlbSwgY3VycmVudEl0ZW0uY2hpbGRyZW5JdGVtc1tmaXJzdENoaWxkSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29sbGFwc2VJdGVtKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMuYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5mb2N1c2VkKVswXTtcbiAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICB0aGlzLm9uSXRlbUFjdGlvbihjdXJyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudEl0ZW0ucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVGb2N1cyhjdXJyZW50SXRlbSwgY3VycmVudEl0ZW0ucGFyZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3RGb2N1c2VkSXRlbSgpIHtcbiAgICAgICAgbGV0IGZvY3VzZWRJdGVtID0gdGhpcy5hbGxJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmZvY3VzZWQpWzBdO1xuICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKGZvY3VzZWRJdGVtKSkge1xuICAgICAgICAgICAgZm9jdXNlZEl0ZW0uZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9jdXNlZEl0ZW0gPSB0aGlzLmdldFZpc2libGVQYXJlbnQoZm9jdXNlZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb2N1c2VkSXRlbSkge1xuICAgICAgICAgICAgZm9jdXNlZEl0ZW0ub25JdGVtQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaWJsZUl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0VmlzaWJsZUl0ZW1zKHRoaXMuY2hpbGRyZW5JdGVtcyk7XG4gICAgfVxuICAgIGZsYXRWaXNpYmxlSXRlbXMobGlzdE9mSXRlbXMgPSBuZXcgQXJyYXkoKSwgZmxhdHRlZEl0ZW1zID0gbmV3IEFycmF5KCkpIHtcbiAgICAgICAgbGlzdE9mSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGZsYXR0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmV4cGFuZGVkICYmIGl0ZW0uaGFzQ2hpbGRJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsYXRWaXNpYmxlSXRlbXMoaXRlbS5jaGlsZHJlbkl0ZW1zLCBmbGF0dGVkSXRlbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmbGF0dGVkSXRlbXM7XG4gICAgfVxufVxuUGFuZWxCYXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvUGFuZWxiYXInLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBQYW5lbEJhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5wYW5lbGJhcidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1wYW5lbGJhcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjb250ZW50Q2hpbGRJdGVtcyAmJiAhaXRlbXNcIiBzZWxlY3Q9XCJrZW5kby1wYW5lbGJhci1pdGVtXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAgICAgICAgICAgIDxrZW5kby1wYW5lbGJhci1pdGVtICpuZ0lmPVwiIWl0ZW0uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICBbaWNvbkNsYXNzXT1cIml0ZW0uaWNvbkNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgIFtpbWFnZVVybF09XCJpdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCIhIWl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgW2V4cGFuZGVkXT1cIiEhaXRlbS5leHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbS5jaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgICAgICBbY29udGVudF09XCJpdGVtLmNvbnRlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2tlbmRvLXBhbmVsYmFyLWl0ZW0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblBhbmVsQmFyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogUGFuZWxCYXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5QYW5lbEJhckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBleHBhbmRNb2RlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzZWxlY3RhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhbmltYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBoZWlnaHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGtlZXBJdGVtQ29udGVudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbXM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0YXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgdGFiSW5kZXg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIudGFiSW5kZXgnLF0gfV0sXG4gICAgcm9sZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5yb2xlJyxdIH1dLFxuICAgIGFjdGl2ZURlc2NlbmRhbnQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50JyxdIH1dLFxuICAgIGhvc3RIZWlnaHQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmhlaWdodCcsXSB9XSxcbiAgICBvdmVyZmxvdzogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUub3ZlcmZsb3cnLF0gfV0sXG4gICAgZGlyOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICB0ZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbUGFuZWxCYXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUsXSB9XSxcbiAgICBjb250ZW50SXRlbXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1BhbmVsQmFySXRlbUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sXG4gICAgY29udGVudENoaWxkSXRlbXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1BhbmVsQmFySXRlbUNvbXBvbmVudCxdIH1dLFxuICAgIHZpZXdDaGlsZEl0ZW1zOiBbeyB0eXBlOiBWaWV3Q2hpbGRyZW4sIGFyZ3M6IFtQYW5lbEJhckl0ZW1Db21wb25lbnQsXSB9XSxcbiAgICBvbkNvbXBvbmVudENsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLCBbJyRldmVudCddLF0gfV0sXG4gICAgb25Db21wb25lbnRGb2N1czogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2ZvY3VzJyxdIH1dLFxuICAgIG9uQ29tcG9uZW50Qmx1cjogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2JsdXInLF0gfV0sXG4gICAgb25Db21wb25lbnRLZXlEb3duOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsna2V5ZG93bicsIFsnJGV2ZW50J10sXSB9XSxcbiAgICBob3N0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay13aWRnZXQnLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXBhbmVsYmFyJyxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHBhbmUgY29tcG9uZW50IG9mIHRoZSBTcGxpdHRlci5cbiAqL1xuY2xhc3MgU3BsaXR0ZXJQYW5lQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCByZW5kZXJlciwgY2RyKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5jZHIgPSBjZHI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byByZXNpemUgdGhlIHBhbmUgYW5kIHByb3ZpZGUgc3BhY2UgZm9yIG90aGVyIHBhbmVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNpemFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gaGlkZSB0aGUgcGFuZSBhbmQgcHJvdmlkZSBzcGFjZSBmb3Igb3RoZXIgcGFuZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgb3ZlcmZsb3dpbmcgY29udGVudCBpcyBzY3JvbGxhYmxlIG9yIGhpZGRlbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIHBhbmUgaXMgaW5pdGlhbGx5IGNvbGxhcHNlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGhpZGRlblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb250YWluc1NwbGl0dGVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm92ZXJsYXlDb250ZW50ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIHVzZXIgcmVzaXplcyB0aGUgU3BsaXR0ZXIgcGFuZS5cbiAgICAgICAgICogVGhlIGV2ZW50IGRhdGEgY29udGFpbnMgdGhlIG5ldyBwYW5lIHNpemUuXG4gICAgICAgICAqIEFsbG93cyBhIHR3by13YXkgYmluZGluZyBvZiB0aGUgcGFuZSBgc2l6ZWAgcHJvcGVydHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyBlYWNoIHRpbWUgdGhlIGBjb2xsYXBzZWRgIHByb3BlcnR5IGNoYW5nZXMuXG4gICAgICAgICAqIFRoZSBldmVudCBkYXRhIGNvbnRhaW5zIHRoZSBuZXcgcHJvcGVydHkgc3RhdGUuXG4gICAgICAgICAqIEFsbG93cyBhIHR3by13YXkgYmluZGluZyBvZiB0aGUgYGNvbGxhcHNlZGAgcGFuZSBwcm9wZXJ0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sbGFwc2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmhvc3RDbGFzcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvcmNlRXhwYW5kID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBzZXQgb3JkZXIocGFuZU9yZGVyKSB7XG4gICAgICAgIHRoaXMuX29yZGVyID0gcGFuZU9yZGVyO1xuICAgICAgICB0aGlzLnNldE9yZGVyU3R5bGVzKCk7XG4gICAgfVxuICAgIGdldCBvcmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhbmUuXG4gICAgICogSGFzIHRvIGJlIGJldHdlZW4gdGhlIGBtaW5gIGFuZCBgbWF4YCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHNldCBzaXplKG5ld1NpemUpIHtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IG5ld1NpemU7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnLW1zLWZsZXgtcHJlZmVycmVkLXNpemUnLCBuZXdTaXplKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnZmxleC1iYXNpcycsIG5ld1NpemUpO1xuICAgICAgICBpZiAodGhpcy5zdGF0aWNQYW5lQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ2stcGFuZS1zdGF0aWMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWxlbWVudCwgJ2stcGFuZS1zdGF0aWMnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBpc0hpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2VkO1xuICAgIH1cbiAgICBnZXQgc3R5bGVEaXNwbGF5RmxleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnNTcGxpdHRlcjtcbiAgICB9XG4gICAgZ2V0IHN0YXRpY1BhbmVDbGFzcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VFeHBhbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMucmVzaXphYmxlICYmICF0aGlzLmNvbGxhcHNpYmxlIHx8IHRoaXMuZml4ZWRTaXplO1xuICAgIH1cbiAgICBnZXQgc2Nyb2xsYWJsZVBhbmVDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsYWJsZTtcbiAgICB9XG4gICAgZ2V0IGZpeGVkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZSAmJiB0aGlzLnNpemUubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmlzSGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdrLXN0YXRlLWhpZGRlbicpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQsICdrLXN0YXRlLWhpZGRlbicpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBjb21wdXRlZFNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICB0b2dnbGVPdmVybGF5KHNob3cpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5Q29udGVudCA9IHNob3c7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldE9yZGVyU3R5bGVzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJy1tcy1mbGV4LW9yZGVyJywgdGhpcy5vcmRlcik7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ29yZGVyJywgdGhpcy5vcmRlcik7XG4gICAgfVxufVxuU3BsaXR0ZXJQYW5lQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb1NwbGl0dGVyUGFuZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1zcGxpdHRlci1wYW5lJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbGxhcHNlZFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm92ZXJsYXlDb250ZW50XCIgY2xhc3M9XCJrLXNwbGl0dGVyLW92ZXJsYXkgay1vdmVybGF5XCI+PC9kaXY+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TcGxpdHRlclBhbmVDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH1cbl07XG5TcGxpdHRlclBhbmVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3JkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNpemU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWF4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICByZXNpemFibGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGNvbGxhcHNpYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzY3JvbGxhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb2xsYXBzZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9yaWVudGF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjb250YWluc1NwbGl0dGVyOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvdmVybGF5Q29udGVudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc2l6ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGNvbGxhcHNlZENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHN0eWxlRGlzcGxheUZsZXg6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstcGFuZS1mbGV4JyxdIH1dLFxuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1wYW5lJyxdIH1dLFxuICAgIHN0YXRpY1BhbmVDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1wYW5lLXN0YXRpYycsXSB9XSxcbiAgICBzY3JvbGxhYmxlUGFuZUNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXNjcm9sbGFibGUnLF0gfV1cbn07XG5cbmNvbnN0IFNJWklOR19ET0NfTElOSyA9ICdodHRwczovL3d3dy50ZWxlcmlrLmNvbS9rZW5kby1hbmd1bGFyLXVpL2NvbXBvbmVudHMvbGF5b3V0L3NwbGl0dGVyL3BhbmVzLyN0b2Mtc2l6ZSc7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU3BsaXR0ZXJTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih6b25lKSB7XG4gICAgICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclNpemUgPSAoKSA9PiB7IH07XG4gICAgfVxuICAgIHRyeVRvZ2dsZShwYW5lSW5kZXgpIHtcbiAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZShwYW5lSW5kZXgpO1xuICAgICAgICBpZiAocGFuZS5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgcGFuZS5jb2xsYXBzZWQgPSAhcGFuZS5jb2xsYXBzZWQ7XG4gICAgICAgICAgICBwYW5lLmNvbGxhcHNlZENoYW5nZS5lbWl0KHBhbmUuY29sbGFwc2VkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0aGlzLmxheW91dENoYW5nZSwge30pO1xuICAgICAgICAgICAgaWYgKHBhbmUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgcGFuZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm90Q29sbGFwc2VkID0gdGhpcy5wYW5lcy5maWx0ZXIocCA9PiAhcC5jb2xsYXBzZWQpO1xuICAgICAgICBjb25zdCBhbGxIYXZlRml4ZWRTaXplID0gbm90Q29sbGFwc2VkLmV2ZXJ5KHAgPT4gcC5maXhlZFNpemUpO1xuICAgICAgICBub3RDb2xsYXBzZWRbbm90Q29sbGFwc2VkLmxlbmd0aCAtIDFdLmZvcmNlRXhwYW5kID0gYWxsSGF2ZUZpeGVkU2l6ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHBhbmUuY29sbGFwc2libGU7XG4gICAgfVxuICAgIHRvZ2dsZUNvbnRlbnRPdmVybGF5KGluZGV4LCBzaG93KSB7XG4gICAgICAgIHRoaXMucGFuZShpbmRleCkudG9nZ2xlT3ZlcmxheShzaG93KTtcbiAgICAgICAgdGhpcy5wYW5lKGluZGV4ICsgMSkudG9nZ2xlT3ZlcmxheShzaG93KTtcbiAgICB9XG4gICAgZHJhZ1N0YXRlKHNwbGl0YmFySW5kZXgpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnBhbmUoc3BsaXRiYXJJbmRleCk7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5wYW5lKHNwbGl0YmFySW5kZXggKyAxKTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBwcmV2LmNvbXB1dGVkU2l6ZSArIG5leHQuY29tcHV0ZWRTaXplO1xuICAgICAgICBjb25zdCBweCA9IHMgPT4gdGhpcy50b1BpeGVscyhzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZXY6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogc3BsaXRiYXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZTogcHJldi5jb21wdXRlZFNpemUsXG4gICAgICAgICAgICAgICAgbWluOiBweChwcmV2Lm1pbikgfHwgdG90YWwgLSBweChuZXh0Lm1heCkgfHwgMCxcbiAgICAgICAgICAgICAgICBtYXg6IHB4KHByZXYubWF4KSB8fCB0b3RhbCAtIHB4KG5leHQubWluKSB8fCB0b3RhbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogc3BsaXRiYXJJbmRleCArIDEsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNpemU6IG5leHQuY29tcHV0ZWRTaXplLFxuICAgICAgICAgICAgICAgIG1pbjogcHgobmV4dC5taW4pIHx8IHRvdGFsIC0gcHgocHJldi5tYXgpIHx8IDAsXG4gICAgICAgICAgICAgICAgbWF4OiBweChuZXh0Lm1heCkgfHwgdG90YWwgLSBweChwcmV2Lm1pbikgfHwgdG90YWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgc2V0U2l6ZShzdGF0ZSQkMSwgZGVsdGEpIHtcbiAgICAgICAgY29uc3QgY2xhbXAgPSAobWluLCBtYXgsIHYpID0+IE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCB2KSk7XG4gICAgICAgIGNvbnN0IHJlc2l6ZSA9IChwYW5lU3RhdGUsIGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZShwYW5lU3RhdGUuaW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXJTaXplID0gdGhpcy5jb250YWluZXJTaXplKCk7XG4gICAgICAgICAgICBjb25zdCBuZXdTaXplID0gY2xhbXAocGFuZVN0YXRlLm1pbiwgcGFuZVN0YXRlLm1heCwgcGFuZVN0YXRlLmluaXRpYWxTaXplICsgY2hhbmdlKTtcbiAgICAgICAgICAgIGxldCBzaXplID0gXCJcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGVyY2VudChwYW5lLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9ICgxMDAgKiBuZXdTaXplIC8gc3BsaXR0ZXJTaXplKSArIFwiJVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IG5ld1NpemUgKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYW5lLnNpemUgPSBzaXplO1xuICAgICAgICAgICAgdGhpcy5lbWl0KHBhbmUuc2l6ZUNoYW5nZSwgc2l6ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLnBhbmUoc3RhdGUkJDEucHJldi5pbmRleCk7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhbmUoc3RhdGUkJDEubmV4dC5pbmRleCk7XG4gICAgICAgIC8vIGRldGVybWluZSB3aGljaCBwYW5lIHRvIHJlc2l6ZVxuICAgICAgICBpZiAocHJldi5maXhlZFNpemUgJiYgbmV4dC5maXhlZFNpemUpIHtcbiAgICAgICAgICAgIC8vIHJlc2l6aW5nIGJvdGggcGFuZXNcbiAgICAgICAgICAgIHJlc2l6ZShzdGF0ZSQkMS5wcmV2LCBkZWx0YSk7XG4gICAgICAgICAgICByZXNpemUoc3RhdGUkJDEubmV4dCwgLWRlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuZXh0LmNvbGxhcHNpYmxlIHx8IG5leHQuZml4ZWRTaXplKSB7XG4gICAgICAgICAgICAvLyByZXNpemluZyBuZXh0XG4gICAgICAgICAgICByZXNpemUoc3RhdGUkJDEubmV4dCwgLWRlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlc2l6aW5nIHByZXZcbiAgICAgICAgICAgIHJlc2l6ZShzdGF0ZSQkMS5wcmV2LCBkZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KHRoaXMubGF5b3V0Q2hhbmdlLCB7fSk7XG4gICAgfVxuICAgIGlzRHJhZ2dhYmxlKHNwbGl0QmFySW5kZXgpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMucGFuZShzcGxpdEJhckluZGV4KTtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucGFuZShzcGxpdEJhckluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGJldHdlZW5SZXNpemFibGVQYW5lcyA9IHByZXYucmVzaXphYmxlICYmIG5leHQucmVzaXphYmxlO1xuICAgICAgICBjb25zdCBuZWFyQ29sbGFwc2VkUGFuZSA9IHByZXYuY29sbGFwc2VkIHx8IG5leHQuY29sbGFwc2VkO1xuICAgICAgICByZXR1cm4gYmV0d2VlblJlc2l6YWJsZVBhbmVzICYmICFuZWFyQ29sbGFwc2VkUGFuZTtcbiAgICB9XG4gICAgaXNTdGF0aWMoc3BsaXRCYXJJbmRleCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5wYW5lKHNwbGl0QmFySW5kZXgpO1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5wYW5lKHNwbGl0QmFySW5kZXggKyAxKTtcbiAgICAgICAgY29uc3QgYmV0d2VlblJlc2l6YWJsZVBhbmVzID0gcHJldi5yZXNpemFibGUgJiYgbmV4dC5yZXNpemFibGU7XG4gICAgICAgIGNvbnN0IG5lYXJDb2xsYXBzaWJsZVBhbmUgPSBwcmV2LmNvbGxhcHNpYmxlIHx8IG5leHQuY29sbGFwc2libGU7XG4gICAgICAgIHJldHVybiAhYmV0d2VlblJlc2l6YWJsZVBhbmVzICYmICFuZWFyQ29sbGFwc2libGVQYW5lO1xuICAgIH1cbiAgICBwYW5lKGluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5wYW5lcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFuZXMgbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYW5lc1tpbmRleF07XG4gICAgfVxuICAgIGNvbmZpZ3VyZSh7IHBhbmVzLCBvcmllbnRhdGlvbiwgY29udGFpbmVyU2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucGFuZXMgPSBwYW5lcztcbiAgICAgICAgdGhpcy5wYW5lcy5mb3JFYWNoKChwYW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcGFuZS5vcmRlciA9IGluZGV4ICogMjtcbiAgICAgICAgICAgIHBhbmUub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsRml4ZWQgPSBwYW5lcy5sZW5ndGggJiYgIXBhbmVzLnNvbWUocGFuZSA9PiAhcGFuZS5maXhlZFNpemUpO1xuICAgICAgICAgICAgaWYgKGFsbEZpeGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcbiAgICAgICAgICAgICAgICAgICAgVGhlIFNwbGl0dGVyIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBwYW5lIHdpdGhvdXQgYSBzZXQgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgU2VlICR7U0laSU5HX0RPQ19MSU5LfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lclNpemUgPSBjb250YWluZXJTaXplO1xuICAgIH1cbiAgICBpc1BlcmNlbnQoc2l6ZSkge1xuICAgICAgICByZXR1cm4gLyUkLy50ZXN0KHNpemUpO1xuICAgIH1cbiAgICB0b1BpeGVscyhzaXplKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBwYXJzZUZsb2F0KHNpemUpO1xuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICh0aGlzLmNvbnRhaW5lclNpemUoKSAqIHJlc3VsdCAvIDEwMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZW1pdChlbWl0dGVyLCBhcmdzKSB7XG4gICAgICAgIGlmIChlbWl0dGVyLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gZW1pdHRlci5lbWl0KGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblNwbGl0dGVyU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU3BsaXR0ZXJTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTmdab25lIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIFNwbGl0dGVyIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19zcGxpdHRlciAlfSkuXG4gKlxuICogYGBgdHMtcHJldmlld1xuICpcbiAqICBAQ29tcG9uZW50KHtcbiAqICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGtlbmRvLXNwbGl0dGVyIHN0eWxlPVwiaGVpZ2h0OiAyODBweDtcIj5cbiAqXG4gKiAgICAgICAgICA8a2VuZG8tc3BsaXR0ZXItcGFuZSBbY29sbGFwc2libGVdPVwidHJ1ZVwiIHNpemU9XCIzMCVcIj5cbiAqICAgICAgICAgICAgPGgzPklubmVyIHNwbGl0dGVyIC8gbGVmdCBwYW5lPC9oMz5cbiAqICAgICAgICAgICAgPHA+UmVzaXphYmxlIGFuZCBjb2xsYXBzaWJsZS48L3A+XG4gKiAgICAgICAgICA8L2tlbmRvLXNwbGl0dGVyLXBhbmU+XG4gKlxuICogICAgICAgICAgPGtlbmRvLXNwbGl0dGVyLXBhbmU+XG4gKiAgICAgICAgICAgIDxoMz5Jbm5lciBzcGxpdHRlciAvIGNlbnRlciBwYW5lPC9oMz5cbiAqICAgICAgICAgICAgPHA+UmVzaXphYmxlIG9ubHkuPC9wPlxuICogICAgICAgICAgPC9rZW5kby1zcGxpdHRlci1wYW5lPlxuICpcbiAqICAgICAgICAgIDxrZW5kby1zcGxpdHRlci1wYW5lIFtjb2xsYXBzaWJsZV09XCJ0cnVlXCIgc2l6ZT1cIjMwJVwiPlxuICogICAgICAgICAgICA8aDM+SW5uZXIgc3BsaXR0ZXIgLyByaWdodCBwYW5lPC9oMz5cbiAqICAgICAgICAgICAgPHA+UmVzaXphYmxlIGFuZCBjb2xsYXBzaWJsZS48L3A+XG4gKiAgICAgICAgICA8L2tlbmRvLXNwbGl0dGVyLXBhbmU+XG4gKlxuICogICAgICAgIDwva2VuZG8tc3BsaXR0ZXI+XG4gKiAgICAgIGAsXG4gKiAgICBzdHlsZXM6IFsgYFxuICogICAgICAgIGgzIHsgZm9udC1zaXplOiAxLjJlbTsgfVxuICogICAgICAgIGgzLCBwIHsgbWFyZ2luOiAxMHB4OyBwYWRkaW5nOiAwOyB9XG4gKiAgICBgIF1cbiAqICB9KVxuICogIGNsYXNzIEFwcENvbXBvbmVudCB7fVxuICogYGBgXG4gKi9cbmNsYXNzIFNwbGl0dGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzcGxpdHRlclNlcnZpY2UsIGxvY2FsaXphdGlvbiwgZW5jbG9zaW5nUGFuZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNwbGl0dGVyU2VydmljZSA9IHNwbGl0dGVyU2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwYW5lcyB3aXRoaW4gdGhlIFNwbGl0dGVyLlxuICAgICAgICAgKiBQYW5lcyBpbiBhIGhvcml6b250YWwgU3BsaXR0ZXIgYXJlIHBsYWNlZCBob3Jpem9udGFsbHkuXG4gICAgICAgICAqIFBhbmVzIGluIGEgdmVydGljYWwgU3BsaXR0ZXIgYXJlIHBsYWNlZCB2ZXJ0aWNhbGx5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICAgICAgdGhpcy5hcmlhUm9sZSA9ICdzcGxpdHRlcic7XG4gICAgICAgIGlmIChlbmNsb3NpbmdQYW5lKSB7XG4gICAgICAgICAgICBlbmNsb3NpbmdQYW5lLmNvbnRhaW5zU3BsaXR0ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBoYW5kbGVyIG9ubHkgcnVucyBpbiBOZ1pvbmUgaWYgdGhlcmUgYXJlIGJvdW5kIGhhbmRsZXJzXG4gICAgICAgIC8vIHRoaXMgbGluZSBtZXJnZXMgYm90aCBzdHJlYW1zXG4gICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlID0gdGhpcy5zcGxpdHRlclNlcnZpY2UubGF5b3V0Q2hhbmdlO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZSA9IHRoaXMuY29uZmlndXJlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBob3Jpem9udGFsSG9zdENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIGdldCB2ZXJ0aWNhbEhvc3RDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICB9XG4gICAgZ2V0IGRpcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uO1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMucmVjb25maWd1cmUoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5vcmllbnRhdGlvbiAmJiAhY2hhbmdlcy5vcmllbnRhdGlvbi5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25maWd1cmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUNoYW5nZXMoKTtcbiAgICB9XG4gICAgcmVjb25maWd1cmUoKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgICAgIHRoaXMucGFuZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnBhbmVzLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMuY29uZmlndXJlKTtcbiAgICB9XG4gICAgdW5zdWJzY3JpYmVDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5wYW5lQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wYW5lQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5wYW5lQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uZmlndXJlKCkge1xuICAgICAgICB0aGlzLnNwbGl0dGVyU2VydmljZS5jb25maWd1cmUoe1xuICAgICAgICAgICAgcGFuZXM6IHRoaXMucGFuZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgb3JpZW50YXRpb246IHRoaXMub3JpZW50YXRpb24sXG4gICAgICAgICAgICBjb250YWluZXJTaXplOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgZGlyZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb24ucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICB9XG59XG5TcGxpdHRlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAna2VuZG9TcGxpdHRlcicsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1zcGxpdHRlcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0dGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLnNwbGl0ZXInXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJrZW5kby1zcGxpdHRlci1wYW5lXCI+PC9uZy1jb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJcbiAgICAgICAgbGV0IHBhbmUgb2YgcGFuZXM7XG4gICAgICAgIGxldCBpbmRleCA9IGluZGV4O1xuICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICBcIj5cbiAgICAgICAgPGtlbmRvLXNwbGl0dGVyLWJhclxuICAgICAgICAgIGtlbmRvRHJhZ2dhYmxlXG4gICAgICAgICAgKm5nSWY9XCIhbGFzdFwiXG4gICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICBbb3JpZW50YXRpb25dPVwib3JpZW50YXRpb25cIj5cbiAgICAgICAgPC9rZW5kby1zcGxpdHRlci1iYXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblNwbGl0dGVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LFxuICAgIHsgdHlwZTogU3BsaXR0ZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBTcGxpdHRlclBhbmVDb21wb25lbnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW1NwbGl0dGVyUGFuZUNvbXBvbmVudCxdIH1dIH1cbl07XG5TcGxpdHRlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBvcmllbnRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbGF5b3V0Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgaG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zcGxpdHRlcicsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3BsaXR0ZXItZmxleCcsXSB9XSxcbiAgICBob3Jpem9udGFsSG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3BsaXR0ZXItaG9yaXpvbnRhbCcsXSB9XSxcbiAgICB2ZXJ0aWNhbEhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXNwbGl0dGVyLXZlcnRpY2FsJyxdIH1dLFxuICAgIGRpcjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5kaXInLF0gfV0sXG4gICAgYXJpYVJvbGU6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIucm9sZScsXSB9XSxcbiAgICBwYW5lczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbU3BsaXR0ZXJQYW5lQ29tcG9uZW50LF0gfV1cbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29udGVudCB0ZW1wbGF0ZSBvZiB0aGUgS2VuZG8gVUkgVGFiU3RyaXAuXG4gKiBUbyBkZWZpbmUgdGhlIHRlbXBsYXRlLCBuZXN0IGEgYDxuZy10ZW1wbGF0ZT5gIHRhZyB3aXRoIHRoZSBga2VuZG9UYWJDb250ZW50YCBpbnNpZGUgdGhlIGNvbXBvbmVudCB0YWcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzLXByZXZpZXdcbiAqXG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgIDxrZW5kby10YWJzdHJpcCBbbmdTdHlsZV09XCJ7J3dpZHRoJzogJzQwMHB4J31cIiBbYW5pbWF0ZV09XCJ0cnVlXCI+XG4gKiAgICAgICAgICAgPGtlbmRvLXRhYnN0cmlwLXRhYiBbdGl0bGVdPVwiJ1BhcmlzJ1wiIFtzZWxlY3RlZF09XCJ0cnVlXCI+XG4gKiAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UYWJDb250ZW50PlxuICogICAgICAgICAgICAgICA8aDM+Q29udGVudCAxPC9oMz5cbiAqICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICAgPC9rZW5kby10YWJzdHJpcC10YWI+XG4gKlxuICogICAgICAgICAgIDxrZW5kby10YWJzdHJpcC10YWIgW3RpdGxlXT1cIidTb2ZpYSdcIj5cbiAqICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RhYkNvbnRlbnQ+XG4gKiAgICAgICAgICAgICAgIDxoMz5Db250ZW50IDI8L2gzPlxuICogICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICAgICAgICA8L2tlbmRvLXRhYnN0cmlwLXRhYj5cbiAqICAgICAgICAgPC9rZW5kby10YWJzdHJpcD5cbiAqICAgICBgXG4gKiB9KVxuICpcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7fVxuICpcbiAqIGBgYFxuICovXG5jbGFzcyBUYWJDb250ZW50RGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuVGFiQ29udGVudERpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvVGFiQ29udGVudF0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblRhYkNvbnRlbnREaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHRpdGxlIHRlbXBsYXRlIG9mIHRoZSBLZW5kbyBVSSBUYWJTdHJpcC5cbiAqIFRvIGRlZmluZSB0aGUgdGVtcGxhdGUsIG5lc3QgYSBgPG5nLXRlbXBsYXRlPmAgdGFnIHdpdGggdGhlIGBrZW5kb1RhYlRpdGxlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBjb21wb25lbnQgdGFnLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKlxuICogX0BDb21wb25lbnQoe1xuICogICAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgICA8a2VuZG8tdGFic3RyaXAgW25nU3R5bGVdPVwieyd3aWR0aCc6ICc0MDBweCd9XCIgW2FuaW1hdGVdPVwidHJ1ZVwiPlxuICogICAgICAgICAgIDxrZW5kby10YWJzdHJpcC10YWIgW3RpdGxlXT1cIidQYXJpcydcIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxuICogICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVGFiVGl0bGU+XG4gKiAgICAgICAgICAgICAgIFRpdGxlXG4gKiAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVGFiQ29udGVudD5cbiAqICAgICAgICAgICAgICAgPGgzPkNvbnRlbnQgMTwvaDM+XG4gKiAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICogICAgICAgICAgIDwva2VuZG8tdGFic3RyaXAtdGFiPlxuICpcbiAqICAgICAgICAgICA8a2VuZG8tdGFic3RyaXAtdGFiIFt0aXRsZV09XCInU29maWEnXCI+XG4gKiAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UYWJDb250ZW50PlxuICogICAgICAgICAgICAgICA8aDM+Q29udGVudCAyPC9oMz5cbiAqICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgICAgICAgPC9rZW5kby10YWJzdHJpcC10YWI+XG4gKiAgICAgICAgIDwva2VuZG8tdGFic3RyaXA+XG4gKiAgICAgYFxuICogfSlcbiAqXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge31cbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgVGFiVGl0bGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5UYWJUaXRsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvVGFiVGl0bGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UYWJUaXRsZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdGFiIGNvbXBvbmVudCBvZiB0aGUgVGFiU3RyaXAuXG4gKi9cbmNsYXNzIFRhYlN0cmlwVGFiQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGFiQ29udGVudCA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICB9XG4gICAgZ2V0IHRhYkNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJDb250ZW50LmZpcnN0O1xuICAgIH1cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdGhpcy5zZWxlY3RlZDtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWQnXSAmJiAhY2hhbmdlc1snc2VsZWN0ZWQnXS5pc0ZpcnN0Q2hhbmdlKCkpIHsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgfVxufVxuVGFiU3RyaXBUYWJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvVGFiU3RyaXBUYWInLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tdGFic3RyaXAtdGFiJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblRhYlN0cmlwVGFiQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY3NzQ2xhc3M6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHNlbGVjdGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBfdGFiQ29udGVudDogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbVGFiQ29udGVudERpcmVjdGl2ZSxdIH1dLFxuICAgIHRhYlRpdGxlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtUYWJUaXRsZURpcmVjdGl2ZSxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgUHJldmVudGFibGVFdmVudCB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5wcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBhIHNwZWNpZmllZCBldmVudC5cbiAgICAgKiBJbiB0aGlzIHdheSwgdGhlIHNvdXJjZSBjb21wb25lbnQgc3VwcHJlc3Nlc1xuICAgICAqIHRoZSBidWlsdC1pbiBiZWhhdmlvciB0aGF0IGZvbGxvd3MgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLnByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudCB3YXMgcHJldmVudGVkXG4gICAgICogYnkgYW55IG9mIGl0cyBzdWJzY3JpYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVmYXVsdCBhY3Rpb24gd2FzIHByZXZlbnRlZC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBpc0RlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZlbnRlZDtcbiAgICB9XG59XG5cbi8qKlxuICogQXJndW1lbnRzIGZvciB0aGUgYHNlbGVjdGAgZXZlbnQgb2YgdGhlIFRhYlN0cmlwLlxuICogVGhlIGBzZWxlY3RgIGV2ZW50IGZpcmVzIHdoZW4gYSB0YWIgaXMgc2VsZWN0ZWQgKGNsaWNrZWQpLlxuICovXG5jbGFzcyBTZWxlY3RFdmVudCBleHRlbmRzIFByZXZlbnRhYmxlRXZlbnQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIGV2ZW50IGFyZ3VtZW50cyBmb3IgdGhlIGBzZWxlY3RgIGV2ZW50LlxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgdGFiLlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgc2VsZWN0ZWQgdGFiLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGV4LCB0aXRsZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIFRhYlN0cmlwIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld190YWJzdHJpcCAlfSkuXG4gKi9cbmNsYXNzIFRhYlN0cmlwQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb24sIHJlbmRlcmVyLCB3cmFwcGVyKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSB0YWIgYW5pbWF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0YWJzLiBEZWZhdWx0cyB0byBgdG9wYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFiUG9zaXRpb24gPSAndG9wJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIGNvbXBvbmVudCByZW5kZXJzIGFsbCB0YWJzIGFuZCB0aGV5IGFyZSBwZXJzaXN0ZWQgaW4gdGhlIERPTS5cbiAgICAgICAgICogQnkgZGVmYXVsdCwgYGtlZXBUYWJDb250ZW50YCBpcyBgZmFsc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5rZWVwVGFiQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgZWFjaCB0aW1lIHRoZSB1c2VyIHNlbGVjdHMgYSB0YWIgKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBvdmVydmlld190YWJzdHJpcCAlfSN0b2MtYmFzaWMtdXNhZ2UpKS5cbiAgICAgICAgICogVGhlIGV2ZW50IGRhdGEgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCB0YWIgYW5kIGl0cyB0aXRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFiU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmhvc3RDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2FuaW1hdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5rZXlCaW5kaW5ncyA9IHRoaXMuY29tcHV0ZWRLZXlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIFRhYlN0cmlwLlxuICAgICAqL1xuICAgIHNldCBoZWlnaHQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuICAgIGdldCB0YWJzQXRUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYlBvc2l0aW9uID09PSAndG9wJztcbiAgICB9XG4gICAgZ2V0IHRhYnNBdFJpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJQb3NpdGlvbiA9PT0gJ3JpZ2h0JztcbiAgICB9XG4gICAgZ2V0IHRhYnNBdEJvdHRvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFiUG9zaXRpb24gPT09ICdib3R0b20nO1xuICAgIH1cbiAgICBnZXQgdGFic0F0TGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFiUG9zaXRpb24gPT09ICdsZWZ0JztcbiAgICB9XG4gICAgZ2V0IGRpcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb250ZW50Q2xhc3MoYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSAhdGhpcy5rZWVwVGFiQ29udGVudCB8fCBhY3RpdmU7XG4gICAgICAgIHJldHVybiB2aXNpYmxlID8gJ2stY29udGVudCBrLXN0YXRlLWFjdGl2ZScgOiAnay1jb250ZW50JztcbiAgICB9XG4gICAgZ2V0IGNvbXB1dGVkS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFt0aGlzLmludmVydEtleXMoS2V5cy5BcnJvd0xlZnQsIEtleXMuQXJyb3dSaWdodCldOiAoc2VsZWN0ZWRJbmRleCkgPT4gdGhpcy5wcmV2TmF2aWdhdGFibGVJbmRleChzZWxlY3RlZEluZGV4KSxcbiAgICAgICAgICAgIFt0aGlzLmludmVydEtleXMoS2V5cy5BcnJvd1JpZ2h0LCBLZXlzLkFycm93TGVmdCldOiAoc2VsZWN0ZWRJbmRleCkgPT4gdGhpcy5uZXh0TmF2aWdhdGFibGVJbmRleChzZWxlY3RlZEluZGV4KSxcbiAgICAgICAgICAgIFt0aGlzLmludmVydEtleXMoS2V5cy5BcnJvd0Rvd24sIEtleXMuQXJyb3dVcCldOiAoc2VsZWN0ZWRJbmRleCkgPT4gdGhpcy5uZXh0TmF2aWdhdGFibGVJbmRleChzZWxlY3RlZEluZGV4KSxcbiAgICAgICAgICAgIFt0aGlzLmludmVydEtleXMoS2V5cy5BcnJvd1VwLCBLZXlzLkFycm93RG93bildOiAoc2VsZWN0ZWRJbmRleCkgPT4gdGhpcy5wcmV2TmF2aWdhdGFibGVJbmRleChzZWxlY3RlZEluZGV4KSxcbiAgICAgICAgICAgIFtLZXlzLkhvbWVdOiAoKSA9PiB0aGlzLmZpcnN0TmF2aWdhdGFibGVJbmRleCgpLFxuICAgICAgICAgICAgW0tleXMuRW5kXTogKCkgPT4gdGhpcy5sYXN0TmF2aWdhdGFibGVJbmRleCgpXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgdGFic0FsaWdubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiAnZmxleC1zdGFydCcsXG4gICAgICAgICAgICBlbmQ6ICdmbGV4LWVuZCcsXG4gICAgICAgICAgICBjZW50ZXI6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeTogJ3NwYWNlLWJldHdlZW4nXG4gICAgICAgIH1bdGhpcy50YWJBbGlnbm1lbnRdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaW52ZXJ0S2V5cyhvcmlnaW5hbCwgaW52ZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLnJ0bCA/IGludmVydGVkIDogb3JpZ2luYWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQgIT09IHRoaXMudGFibGlzdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy50YWJQb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy50YWJQb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG4gICAgICAgIGNvbnN0IGlzQXJyb3dVcCA9IGV2ZW50LmtleUNvZGUgPT09IEtleXMuQXJyb3dVcDtcbiAgICAgICAgY29uc3QgaXNBcnJvd0Rvd24gPSBldmVudC5rZXlDb2RlID09PSBLZXlzLkFycm93RG93bjtcbiAgICAgICAgY29uc3QgaXNBcnJvd0xlZnQgPSBldmVudC5rZXlDb2RlID09PSBLZXlzLkFycm93TGVmdDtcbiAgICAgICAgY29uc3QgaXNBcnJvd1JpZ2h0ID0gZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5BcnJvd1JpZ2h0O1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsICYmIChpc0Fycm93VXAgfHwgaXNBcnJvd0Rvd24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0hvcml6b250YWwgJiYgKGlzQXJyb3dMZWZ0IHx8IGlzQXJyb3dSaWdodCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5TcGFjZSB8fCBpc0Fycm93VXAgfHwgaXNBcnJvd0Rvd24gfHwgaXNBcnJvd0xlZnQgfHwgaXNBcnJvd1JpZ2h0IHx8IGV2ZW50LmtleUNvZGUgPT09IEtleXMuSG9tZSB8fFxuICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5FbmQgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5QYWdlVXAgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5cy5QYWdlRG93bikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJzLnRvQXJyYXkoKS5maW5kSW5kZXgodGFiID0+IHRhYi5hY3RpdmUgJiYgIXRhYi5kaXNhYmxlZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RUYWIodGhpcy5maXJzdE5hdmlnYXRhYmxlSW5kZXgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBnZXRUYWJJbmRleCA9IHRoaXMua2V5QmluZGluZ3NbZXZlbnQua2V5Q29kZV07XG4gICAgICAgICAgICBpZiAoZ2V0VGFiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBnZXRUYWJJbmRleChzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPT0gbmV4dEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKGdldFRhYkluZGV4KHNlbGVjdGVkSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRhYlBhbmVsSWQoaWQpIHtcbiAgICAgICAgcmV0dXJuICdrLXRhYnN0cmlwLXRhYnBhbmVsLScgKyBpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHRhYklkKGlkKSB7XG4gICAgICAgIHJldHVybiAnay10YWJzdHJpcC10YWItJyArIGlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgdGFiIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSB0YWIgdGhhdCB3aWxsIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHNlbGVjdFRhYihpbmRleCkge1xuICAgICAgICBjb25zdCB0YWIgPSB0aGlzLnRhYnMudG9BcnJheSgpW2luZGV4XTtcbiAgICAgICAgaWYgKCF0YWIgfHwgQm9vbGVhbih0YWIuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJIZWFkaW5nQ29udGFpbmVycy50b0FycmF5KClbaW5kZXhdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5lbWl0RXZlbnQodGFiLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvblRhYkNsaWNrKG9yaWdpbmFsRXZlbnQsIHRhYkluZGV4KSB7XG4gICAgICAgIGlmIChpc0ZvY3VzYWJsZShvcmlnaW5hbEV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFRhYih0YWJJbmRleCk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5rZXlCaW5kaW5ncyA9IHRoaXMuY29tcHV0ZWRLZXlzKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsaXphdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGl6YXRpb25DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaXJzdE5hdmlnYXRhYmxlSW5kZXgoKSB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLnRhYnMudG9BcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGFic1tpXS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxhc3ROYXZpZ2F0YWJsZUluZGV4KCkge1xuICAgICAgICBjb25zdCB0YWJzID0gdGhpcy50YWJzLnRvQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYnMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCF0YWJzW2ldLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJldk5hdmlnYXRhYmxlSW5kZXgoc2VsZWN0ZWRJbmRleCkge1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAtIDEgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0TmF2aWdhdGFibGVJbmRleCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLnRhYnMudG9BcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0ZWRJbmRleCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoIXRhYnNbaV0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdE5hdmlnYXRhYmxlSW5kZXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJbmRleDtcbiAgICB9XG4gICAgbmV4dE5hdmlnYXRhYmxlSW5kZXgoc2VsZWN0ZWRJbmRleCkge1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCArIDEgPj0gdGhpcy50YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYXZpZ2F0YWJsZUluZGV4KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFicyA9IHRoaXMudGFicy50b0FycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3RlZEluZGV4ICsgMTsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGFic1tpXS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgKyAxID09PSB0YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0TmF2aWdhdGFibGVJbmRleCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRFdmVudCh0YWIsIHNlbGVjdGVkSW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0QXJncyA9IG5ldyBTZWxlY3RFdmVudChzZWxlY3RlZEluZGV4LCB0YWIudGl0bGUpO1xuICAgICAgICB0aGlzLnRhYlNlbGVjdC5lbWl0KHNlbGVjdEFyZ3MpO1xuICAgICAgICBpZiAoIXNlbGVjdEFyZ3MuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgIXRhYi5hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGUgPSB0aGlzLmFuaW1hdGU7XG4gICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVBbGwoKTtcbiAgICAgICAgICAgIHRhYi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlYWN0aXZhdGVBbGwoKSB7XG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWIpID0+IHtcbiAgICAgICAgICAgIHRhYi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuVGFiU3RyaXBDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoJ3N0YXRlJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUoJ2FjdGl2ZScsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IGFjdGl2ZScsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZSgnNDAwbXMgZWFzZS1pbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby50YWJzdHJpcCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6ICdrZW5kb1RhYlN0cmlwJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLXRhYnN0cmlwJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYnNBdEJvdHRvbVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdcIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFic0F0Qm90dG9tXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1wiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGluZz5cbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1yZXNldCBrLXRhYnN0cmlwLWl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuanVzdGlmeUNvbnRlbnRdPVwidGFic0FsaWdubWVudFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInRhYmxpc3RcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAjdGFibGlzdFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IGxldCBpID0gaW5kZXg7XCIgKGNsaWNrKT1cIm9uVGFiQ2xpY2soJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICN0YWJIZWFkaW5nQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0YWJcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwidGFiSWQoaSlcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiLmFjdGl2ZSA/IDAgOiAtMVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInRhYi5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLWl0ZW1dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLXN0YXRlLWRlZmF1bHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLXN0YXRlLWFjdGl2ZV09XCJ0YWIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmstc3RhdGUtZGlzYWJsZWRdPVwidGFiLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0YWIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ0YWJQYW5lbElkKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJ0YWIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgID48c3BhbiBjbGFzcz1cImstbGlua1wiPnt7IHRhYi50aXRsZSB9fTxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0YWIudGFiVGl0bGU/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT48L3NwYW4+PC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtdGFiIFtuZ0Zvck9mXT1cInRhYnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBbQHN0YXRlXT1cInRhYi5hY3RpdmUgJiYgX2FuaW1hdGUgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRhYi5hY3RpdmUgfHwga2VlcFRhYkNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb250ZW50Q2xhc3ModGFiLmFjdGl2ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0YWJwYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJ0YWJQYW5lbElkKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXRhYi5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInRhYi5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGFiSWQoaSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFiLnRhYkNvbnRlbnQ/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5UYWJTdHJpcENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9XG5dO1xuVGFiU3RyaXBDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaGVpZ2h0OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhbmltYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0YWJBbGlnbm1lbnQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHRhYlBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBrZWVwVGFiQ29udGVudDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgdGFibGlzdDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYmxpc3QnLF0gfV0sXG4gICAgdGFiU2VsZWN0OiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgaG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay10YWJzdHJpcCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZmxvYXR3cmFwJyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1oZWFkZXInLF0gfV0sXG4gICAgdGFic0F0VG9wOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXRhYnN0cmlwLXRvcCcsXSB9XSxcbiAgICB0YWJzQXRSaWdodDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay10YWJzdHJpcC1yaWdodCcsXSB9XSxcbiAgICB0YWJzQXRCb3R0b206IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstdGFic3RyaXAtYm90dG9tJyxdIH1dLFxuICAgIHRhYnNBdExlZnQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstdGFic3RyaXAtbGVmdCcsXSB9XSxcbiAgICBkaXI6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIHRhYnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW1RhYlN0cmlwVGFiQ29tcG9uZW50LF0gfV0sXG4gICAgdGFiSGVhZGluZ0NvbnRhaW5lcnM6IFt7IHR5cGU6IFZpZXdDaGlsZHJlbiwgYXJnczogWyd0YWJIZWFkaW5nQ29udGFpbmVyJyxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGNvbnRlbnQgb2YgdGhlIERyYXdlci5cbiAqIFRvIGRlZmluZSB0aGUgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZ1xuICogd2l0aCB0aGUgYGtlbmRvRHJhd2VyVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tZHJhd2VyPmAgdGFnLlxuICogVXNpbmcgdGhpcyB0ZW1wbGF0ZSBkaXJlY3RpdmUgd2lsbCBvdmVycmlkZSBhbGwgb3RoZXIgdGVtcGxhdGVzLFxuICogZm9yIGV4YW1wbGUsIGBrZW5kb0RyYXdlckhlYWRlclRlbXBsYXRlYCBhbmQgYGtlbmRvRHJhd2VySXRlbVRlbXBsYXRlYC5cbiAqL1xuY2xhc3MgRHJhd2VyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5EcmF3ZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJhd2VyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmF3ZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGl0ZW0gY29udGVudCBvZiB0aGUgRHJhd2VyLlxuICogVG8gZGVmaW5lIHRoZSB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnXG4gKiB3aXRoIHRoZSBga2VuZG9EcmF3ZXJJdGVtVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tZHJhd2VyPmAgdGFnLlxuICovXG5jbGFzcyBEcmF3ZXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5EcmF3ZXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb0RyYXdlckl0ZW1UZW1wbGF0ZV0nXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRyYXdlckl0ZW1UZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGhlYWRlciBjb250ZW50IG9mIHRoZSBEcmF3ZXIuXG4gKiBUbyBkZWZpbmUgdGhlIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWdcbiAqIHdpdGggdGhlIGBrZW5kb0RyYXdlckhlYWRlclRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBgPGtlbmRvLWRyYXdlcj5gIHRhZy5cbiAqL1xuY2xhc3MgRHJhd2VySGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5EcmF3ZXJIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJhd2VySGVhZGVyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmF3ZXJIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGZvb3RlciBjb250ZW50IG9mIHRoZSBEcmF3ZXIuXG4gKiBUbyBkZWZpbmUgdGhlIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWdcbiAqIHdpdGggdGhlIGBrZW5kb0RyYXdlckZvb3RlclRlbXBsYXRlYCBkaXJlY3RpdmUgaW5zaWRlIHRoZSBgPGtlbmRvLWRyYXdlcj5gIHRhZy5cbiAqL1xuY2xhc3MgRHJhd2VyRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5EcmF3ZXJGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJhd2VyRm9vdGVyVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmF3ZXJGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbWluaUV4cGFuZFB1c2goZHVyYXRpb24sIHdpZHRoLCBtaW5pV2lkdGgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzdHlsZSh7IG92ZXJmbG93OiAnaGlkZGVuJywgZmxleEJhc2lzOiBgJHttaW5pV2lkdGh9cHhgIH0pLFxuICAgICAgICBhbmltYXRlKGAke2R1cmF0aW9ufW1zIGVhc2UtaW5gLCBzdHlsZSh7IGZsZXhCYXNpczogYCR7d2lkdGh9cHhgIH0pKVxuICAgIF07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbWluaUNvbGxhcHNlUHVzaChkdXJhdGlvbiwgd2lkdGgsIG1pbmlXaWR0aCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHN0eWxlKHsgb3ZlcmZsb3c6ICdoaWRkZW4nLCBmbGV4QmFzaXM6IGAke3dpZHRofXB4YCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBmbGV4QmFzaXM6IGAke21pbmlXaWR0aH1weGAgfSkpXG4gICAgXTtcbn1cbi8qKlxuICogQGhpZGRlblxuICpcbiAqL1xuZnVuY3Rpb24gbWluaUV4cGFuZE92ZXJsYXkoZHVyYXRpb24sIHdpZHRoLCBtaW5pV2lkdGgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzdHlsZSh7IHdpZHRoOiBgJHttaW5pV2lkdGh9cHhgIH0pLFxuICAgICAgICBhbmltYXRlKGAke2R1cmF0aW9ufW1zIGVhc2UtaW5gLCBzdHlsZSh7IG92ZXJmbG93OiAnaGlkZGVuJywgd2lkdGg6IGAke3dpZHRofXB4YCB9KSlcbiAgICBdO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFB1c2goZHVyYXRpb24sIHdpZHRoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIGZsZXhCYXNpczogJzBweCcgfSksXG4gICAgICAgIGFuaW1hdGUoYCR7ZHVyYXRpb259bXMgZWFzZS1pbmAsIHN0eWxlKHsgZmxleEJhc2lzOiBgJHt3aWR0aH1weGAgfSkpXG4gICAgXTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVB1c2goZHVyYXRpb24sIHdpZHRoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3R5bGUoeyBmbGV4QmFzaXM6IGAke3dpZHRofXB4YCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIGZsZXhCYXNpczogYDBweGAgfSkpXG4gICAgXTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBleHBhbmRSVExPdmVybGF5KGR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKDEwMCUpYCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoMClgIH0pKVxuICAgIF07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gZXhwYW5kT3ZlcmxheShkdXJhdGlvbiwgcG9zaXRpb24pIHtcbiAgICBjb25zdCB0cmFuc2xhdGVEaXIgPSBwb3NpdGlvbiAhPT0gJ2VuZCcgPyBgLTEwMCVgIDogYDEwMCVgO1xuICAgIHJldHVybiBbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke3RyYW5zbGF0ZURpcn0pYCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoMClgIH0pKVxuICAgIF07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbWluaUNvbGxhcHNlT3ZlcmxheShkdXJhdGlvbiwgd2lkdGgsIG1pbmlXaWR0aCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHN0eWxlKHsgd2lkdGg6IGAke3dpZHRofXB4YCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIHdpZHRoOiBgJHttaW5pV2lkdGh9cHhgIH0pKVxuICAgIF07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gY29sbGFwc2VPdmVybGF5KGR1cmF0aW9uLCBwb3NpdGlvbikge1xuICAgIGNvbnN0IHRyYW5zbGF0ZURpciA9IHBvc2l0aW9uICE9PSAnZW5kJyA/ICctMTAwJScgOiAnMTAwJSc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKDApYCB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBlYXNlLWluYCwgc3R5bGUoeyBvdmVyZmxvdzogJ2hpZGRlbicsIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHt0cmFuc2xhdGVEaXJ9KWAgfSkpXG4gICAgXTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJUTE92ZXJsYXkoZHVyYXRpb24pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoMClgIH0pLFxuICAgICAgICBhbmltYXRlKGAke2R1cmF0aW9ufW1zIGVhc2UtaW5gLCBzdHlsZSh7IG92ZXJmbG93OiAnaGlkZGVuJywgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgxMDAlKWAgfSkpXG4gICAgXTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBleHBhbmRBbmltYXRpb24oc2V0dGluZ3MpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHNldHRpbmdzLmFuaW1hdGlvbi5kdXJhdGlvbjtcbiAgICBjb25zdCB3aWR0aCA9IHNldHRpbmdzLndpZHRoO1xuICAgIGNvbnN0IG1pbmlXaWR0aCA9IHNldHRpbmdzLm1pbmlXaWR0aDtcbiAgICBjb25zdCBtb2RlID0gc2V0dGluZ3MubW9kZTtcbiAgICBjb25zdCBtaW5pID0gc2V0dGluZ3MubWluaTtcbiAgICBjb25zdCBydGwgPSBzZXR0aW5ncy5ydGw7XG4gICAgY29uc3QgcG9zaXRpb24gPSBzZXR0aW5ncy5wb3NpdGlvbjtcbiAgICBpZiAobWluaSAmJiBtb2RlID09PSAncHVzaCcpIHtcbiAgICAgICAgcmV0dXJuIG1pbmlFeHBhbmRQdXNoKGR1cmF0aW9uLCB3aWR0aCwgbWluaVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKCFtaW5pICYmIG1vZGUgPT09ICdwdXNoJykge1xuICAgICAgICByZXR1cm4gZXhwYW5kUHVzaChkdXJhdGlvbiwgd2lkdGgpO1xuICAgIH1cbiAgICBpZiAoIW1pbmkgJiYgbW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIHJldHVybiBydGwgPyBleHBhbmRSVExPdmVybGF5KGR1cmF0aW9uKSA6IGV4cGFuZE92ZXJsYXkoZHVyYXRpb24sIHBvc2l0aW9uKTtcbiAgICB9XG4gICAgaWYgKG1pbmkgJiYgbW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIHJldHVybiBtaW5pRXhwYW5kT3ZlcmxheShkdXJhdGlvbiwgd2lkdGgsIG1pbmlXaWR0aCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlQW5pbWF0aW9uKHNldHRpbmdzKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSBzZXR0aW5ncy5hbmltYXRpb24uZHVyYXRpb247XG4gICAgY29uc3Qgd2lkdGggPSBzZXR0aW5ncy53aWR0aDtcbiAgICBjb25zdCBtaW5pV2lkdGggPSBzZXR0aW5ncy5taW5pV2lkdGg7XG4gICAgY29uc3QgbW9kZSA9IHNldHRpbmdzLm1vZGU7XG4gICAgY29uc3QgbWluaSA9IHNldHRpbmdzLm1pbmk7XG4gICAgY29uc3QgcnRsID0gc2V0dGluZ3MucnRsO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gc2V0dGluZ3MucG9zaXRpb247XG4gICAgaWYgKG1pbmkgJiYgbW9kZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgIHJldHVybiBtaW5pQ29sbGFwc2VQdXNoKGR1cmF0aW9uLCB3aWR0aCwgbWluaVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKCFtaW5pICYmIG1vZGUgPT09ICdwdXNoJykge1xuICAgICAgICByZXR1cm4gY29sbGFwc2VQdXNoKGR1cmF0aW9uLCB3aWR0aCk7XG4gICAgfVxuICAgIGlmICghbWluaSAmJiBtb2RlID09PSAnb3ZlcmxheScpIHtcbiAgICAgICAgcmV0dXJuIHJ0bCA/IGNvbGxhcHNlUlRMT3ZlcmxheShkdXJhdGlvbikgOiBjb2xsYXBzZU92ZXJsYXkoZHVyYXRpb24sIHBvc2l0aW9uKTtcbiAgICB9XG4gICAgaWYgKG1pbmkgJiYgbW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIHJldHVybiBtaW5pQ29sbGFwc2VPdmVybGF5KGR1cmF0aW9uLCB3aWR0aCwgbWluaVdpZHRoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQXJndW1lbnRzIGZvciB0aGUgYHNlbGVjdGAgZXZlbnQgb2YgdGhlIERyYXdlci5cbiAqL1xuY2xhc3MgRHJhd2VyU2VsZWN0RXZlbnQgZXh0ZW5kcyBQcmV2ZW50YWJsZUV2ZW50IHtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIERyYXdlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW5kaWNlcyA9IFtdO1xuICAgIH1cbiAgICBlbWl0KGV2ZW50LCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGRyYXdlciA9IHRoaXMub3duZXI7XG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IG5ldyBEcmF3ZXJTZWxlY3RFdmVudChPYmplY3QuYXNzaWduKHt9LCBhcmdzLCB7IHNlbmRlcjogZHJhd2VyIH0pKTtcbiAgICAgICAgaWYgKGhhc09ic2VydmVycyhkcmF3ZXJbZXZlbnRdKSkge1xuICAgICAgICAgICAgZHJhd2VyW2V2ZW50XS5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50QXJncy5pc0RlZmF1bHRQcmV2ZW50ZWQoKTtcbiAgICB9XG4gICAgb25TZWxlY3Qoc2VsZWN0ZWRJZHgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGljZXMgPSBbc2VsZWN0ZWRJZHhdO1xuICAgICAgICBjb25zdCBkcmF3ZXIgPSB0aGlzLm93bmVyO1xuICAgICAgICBpZiAoZHJhd2VyLmF1dG9Db2xsYXBzZSAmJiAhZHJhd2VyLm1pbmltaXplZCkge1xuICAgICAgICAgICAgZHJhd2VyLnRvZ2dsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdFNlbGVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLm93bmVyLml0ZW1zO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW5kaWNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuRHJhd2VyU2VydmljZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuXTtcblxuY29uc3QgREVGQVVMVF9BTklNQVRJT04gPSB7IHR5cGU6ICdzbGlkZScsIGR1cmF0aW9uOiAyMDAgfTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIERyYXdlciBjb21wb25lbnQgZm9yIEFuZ3VsYXJdKHslIHNsdWcgb3ZlcnZpZXdfZHJhd2VyICV9KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMtcHJldmlld1xuICogX0BDb21wb25lbnQoe1xuICogICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICAgdGVtcGxhdGU6IGBcbiAqICAgICAgICA8a2VuZG8tZHJhd2VyLWNvbnRhaW5lcj5cbiAqICAgICAgICAgICAgIDxrZW5kby1kcmF3ZXIgI2RyYXdlclxuICogICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxuICogICAgICAgICAgICAgICAgICBbbW9kZV09XCInb3ZlcmxheSdcIlxuICogICAgICAgICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJleHBhbmRlZFwiPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZHJhd2VyPlxuICogICAgICAgICAgICAgIDxrZW5kby1kcmF3ZXItY29udGVudD5cbiAqICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImstYnV0dG9uXCIgKGNsaWNrKT1cImRyYXdlci50b2dnbGUoKVwiPk9wZW4gdGhlIERyYXdlcjwvYnV0dG9uPlxuICogICAgICAgICAgICAgIDwva2VuZG8tZHJhd2VyLWNvbnRlbnQ+XG4gKiAgICAgICAgPC9rZW5kby1kcmF3ZXItY29udGFpbmVyPlxuICogICAgYFxuICogfSlcbiAqIGNsYXNzIEFwcENvbXBvbmVudCB7XG4gKiAgICBwdWJsaWMgZXhwYW5kZWQgPSBmYWxzZTtcbiAqXG4gKiAgICBwdWJsaWMgaXRlbXM6IGFueVtdID0gW1xuICogICAgICB7IHRleHQ6ICdJbmJveCcsIGljb246ICdrLWktaW5ib3gnIH0sXG4gKiAgICAgIHsgdGV4dDogJ05vdGlmaWNhdGlvbnMnLCBpY29uOiAnay1pLWJlbGwnIH0sXG4gKiAgICAgIHsgdGV4dDogJ0RhdGUnLCBpY29uOiAnay1pLWNhbGVuZGFyJyB9XG4gKiAgICBdO1xuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIERyYXdlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgYnVpbGRlciwgbG9jYWxpemF0aW9uU2VydmljZSwgZHJhd2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UgPSBsb2NhbGl6YXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLmRyYXdlclNlcnZpY2UgPSBkcmF3ZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLmhvc3RDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbW9kZSBpbiB3aGljaCB0aGUgRHJhd2VyIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiAoRGVmYXVsdCkgYG92ZXJsYXlgXG4gICAgICAgICAqICogYHB1c2hgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vZGUgPSAnb3ZlcmxheSc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBEcmF3ZXJcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBwb3NpdGlvbmluZ19kcmF3ZXIgJX0pKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICAgICAqICogKERlZmF1bHQpIGBzdGFydGBcbiAgICAgICAgICogKiBgZW5kYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9ICdzdGFydCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSBtaW5pIChjb21wYWN0KSB2aWV3IG9mIHRoZSBEcmF3ZXIgd2hpY2ggaXMgZGlzcGxheWVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjb2xsYXBzZWRcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBleHBhbmRtb2Rlc3Bvc2l0aW9uc19kcmF3ZXIgJX0jdG9jLW1pbmktdmlldykpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5taW5pID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSBEcmF3ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRoZSB3aWR0aCBvZiB0aGUgRHJhd2VyIHdoZW4gaXQgaXMgZXhwYW5kZWQuXG4gICAgICAgICAqIERlZmF1bHRzIHRvIGAyNDBgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IDI0MDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIHdpZHRoIG9mIHRoZSBEcmF3ZXIgd2hlbiB0aGUgbWluaSB2aWV3IGlzIGVuYWJsZWRcbiAgICAgICAgICogYW5kIHRoZSBjb21wb25lbnQgaXMgY29sbGFwc2VkLiBEZWZhdWx0cyB0byBgNjBgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5taW5pV2lkdGggPSA1MDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgRHJhd2VyIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb2xsYXBzZWQgd2hlbiBhbiBpdGVtXG4gICAgICAgICAqIG9yIHRoZSBvdmVybGF5IGlzIGNsaWNrZWQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0b0NvbGxhcHNlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHNldHRpbmdzIG9mIHRoZSBEcmF3ZXIuXG4gICAgICAgICAqIChbc2VlIGV4YW1wbGVdKHslIHNsdWcgaW50ZXJhY3Rpb25fZHJhd2VyICV9I3RvYy10b2dnbGluZy1iZXR3ZWVuLXN0YXRlcykpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiBCb29sZWFuXG4gICAgICAgICAqICAgICogKERlZmF1bHQpIGB0cnVlYFxuICAgICAgICAgKiAgICAqIGBmYWxzZWBcbiAgICAgICAgICogKiBgRHJhd2VyQW5pbWF0aW9uYFxuICAgICAgICAgKiAgICAqIChEZWZhdWx0KSBgdHlwZT86ICdzbGlkZSdgXG4gICAgICAgICAqICAgICogYGR1cmF0aW9uYCZtZGFzaDtBY2NlcHRzIGEgbnVtYmVyIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gYDMwMG1zYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uID0gREVGQVVMVF9BTklNQVRJT047XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBEcmF3ZXIgaXMgZXhwYW5kZWQgYW5kIGl0cyBhbmltYXRpb24gaXMgY29tcGxldGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIERyYXdlciBpcyBjb2xsYXBzZWQgYW5kIGl0cyBhbmltYXRpb24gaXMgY29tcGxldGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbGxhcHNlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiBhIERyYXdlciBpdGVtIGlzIHNlbGVjdGVkLiBUaGlzIGV2ZW50IGlzIHByZXZlbnRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlcyB3aGVuIHRoZSBgZXhwYW5kZWRgIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgd2FzIHVwZGF0ZWQuXG4gICAgICAgICAqIFVzZWQgdG8gcHJvdmlkZSBhIHR3by13YXkgYmluZGluZyBmb3IgdGhlIGBleHBhbmRlZGAgcHJvcGVydHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbkVuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5ydGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJ0bCA9IHJ0bDtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5ydGwgPyAncnRsJyA6ICdsdHInO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kcmF3ZXJTZXJ2aWNlLm93bmVyID0gdGhpcztcbiAgICB9XG4gICAgZ2V0IHN0YXJ0UG9zaXRpb25DbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24gPT09ICdzdGFydCc7XG4gICAgfVxuICAgIGdldCBlbmRQb3NpdGlvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gJ2VuZCc7XG4gICAgfVxuICAgIGdldCBvdmVybGF5VHJhbnNvZnJtU3R5bGVzKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHBhbmRlZCB8fCB0aGlzLm1pbmltaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVYKDBweClgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWCgtMTAwJSlgO1xuICAgIH1cbiAgICBnZXQgZmxleFN0eWxlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmV4cGFuZGVkICYmICF0aGlzLm1pbmltaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2VyV2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgRHJhd2VyLlxuICAgICAqL1xuICAgIHNldCBpdGVtcyhpdGVtcykge1xuICAgICAgICBpZiAoaXNQcmVzZW50KGl0ZW1zKSkge1xuICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBpdGVtcztcbiAgICAgICAgICAgIHRoaXMuZHJhd2VyU2VydmljZS5pbml0U2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNSVExTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG1pbmltaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluaSAmJiAhdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBkcmF3ZXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluaW1pemVkID8gdGhpcy5taW5pV2lkdGggOiB0aGlzLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBEcmF3ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwYW5kZWQ/IC0gQm9vbGVhbi4gU3BlY2lmaWVzIGlmIHRoZSBEcmF3ZXIgd2lsbCBiZSBleHBhbmRlZCBvciBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgdG9nZ2xlKGV4cGFuZGVkKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5leHBhbmRlZDtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGlzUHJlc2VudChleHBhbmRlZCkgPyBleHBhbmRlZCA6ICFwcmV2aW91cztcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RXhwYW5kZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudCA9PT0gZmFsc2UgJiYgIXRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldEV4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uRW5kLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5vbkFuaW1hdGlvbkVuZChjdXJyZW50KTsgfSk7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGUoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2N1cnJlbnQgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSddLmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkFuaW1hdGlvbkVuZChjdXJyZW50RXhwYW5kZWQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRFeHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRFeHBhbmRlZChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNvbGxhcHNlLmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRFeHBhbmRlZCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICAgIGFuaW1hdGUoZXhwYW5kZWQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICAgICAgICBtaW5pOiB0aGlzLm1pbmksXG4gICAgICAgICAgICBtaW5pV2lkdGg6IHRoaXMubWluaVdpZHRoLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBydGw6IHRoaXMucnRsLFxuICAgICAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgICAgICBhbmltYXRpb246ICh0eXBlb2YgdGhpcy5hbmltYXRpb24gIT09ICdib29sZWFuJykgPyB0aGlzLmFuaW1hdGlvbiA6IERFRkFVTFRfQU5JTUFUSU9OXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IGV4cGFuZGVkID8gZXhwYW5kQW5pbWF0aW9uKHNldHRpbmdzKSA6IGNvbGxhcHNlQW5pbWF0aW9uKHNldHRpbmdzKTtcbiAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5jcmVhdGVQbGF5ZXIoYW5pbWF0aW9uLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgfVxuICAgIGNyZWF0ZVBsYXllcihhbmltYXRpb24sIGFuaW1hdGVkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5idWlsZGVyLmJ1aWxkKGFuaW1hdGlvbik7XG4gICAgICAgIGxldCBwbGF5ZXIgPSBmYWN0b3J5LmNyZWF0ZShhbmltYXRlZEVsZW1lbnQpO1xuICAgICAgICBwbGF5ZXIub25Eb25lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkVuZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICB9XG59XG5EcmF3ZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvRHJhd2VyJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTDEwTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogJ2tlbmRvLmRyYXdlcidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kcmF3ZXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrLWRyYXdlci13cmFwcGVyXCIgKm5nSWY9XCJleHBhbmRlZCB8fCBtaW5pXCIgW3N0eWxlLndpZHRoLnB4XT1cImRyYXdlcldpZHRoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRyYXdlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPHVsIGtlbmRvRHJhd2VyTGlzdFxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIiBbbWluaV09XCJtaW5pXCIgW2V4cGFuZGVkXT1cImV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJpdGVtVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWRyYXdlci1pdGVtc1wiPlxuICAgICAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJmb290ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvb3RlclRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiZHJhd2VyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRyYXdlclRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmF3ZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBBbmltYXRpb25CdWlsZGVyIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBEcmF3ZXJTZXJ2aWNlIH1cbl07XG5EcmF3ZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstd2lkZ2V0JyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kcmF3ZXInLF0gfV0sXG4gICAgc3RhcnRQb3NpdGlvbkNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRyYXdlci1zdGFydCcsXSB9XSxcbiAgICBlbmRQb3NpdGlvbkNsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRyYXdlci1lbmQnLF0gfV0sXG4gICAgb3ZlcmxheVRyYW5zb2ZybVN0eWxlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUudHJhbnNmb3JtJyxdIH1dLFxuICAgIGZsZXhTdHlsZXM6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLmZsZXhCYXNpcy5weCcsXSB9XSxcbiAgICBtb2RlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBwb3NpdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluaTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZXhwYW5kZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHdpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW5pV2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGF1dG9Db2xsYXBzZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbXM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5kaXInLF0gfV0sXG4gICAgYW5pbWF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBleHBhbmQ6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjb2xsYXBzZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHNlbGVjdDogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIGV4cGFuZGVkQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sXG4gICAgZHJhd2VyVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RyYXdlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgZm9vdGVyVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RyYXdlckZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgaGVhZGVyVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RyYXdlckhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLF0gfV0sXG4gICAgaXRlbVRlbXBsYXRlOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtEcmF3ZXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUsXSB9XVxufTtcblxuLyoqXG4gKiBTZXJ2ZXMgYXMgYSBjb250YWluZXIgZm9yIHRoZSBbS2VuZG8gVUkgRHJhd2VyIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19kcmF3ZXIgJX0pIGFuZCBpdHMgY29udGVudC5cbiAqL1xuY2xhc3MgRHJhd2VyQ29udGFpbmVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uU2VydmljZSA9IGxvY2FsaXphdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMucnRsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSgoeyBydGwgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydGwgPSBydGw7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBob3N0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgb3ZlcmxheUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcmF3ZXIubW9kZSA9PT0gJ292ZXJsYXknO1xuICAgIH1cbiAgICBnZXQgbWluaUNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcmF3ZXIubWluaTtcbiAgICB9XG4gICAgZ2V0IHB1c2hDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2VyLm1vZGUgPT09ICdwdXNoJztcbiAgICB9XG4gICAgZ2V0IGlzRXhwYW5kZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2VyLmV4cGFuZGVkO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBvdmVybGF5KCkge1xuICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuZHJhd2VyKSAmJlxuICAgICAgICAgICAgdGhpcy5kcmF3ZXIuZXhwYW5kZWQgJiZcbiAgICAgICAgICAgIHRoaXMuZHJhd2VyLm1vZGUgPT09ICdvdmVybGF5JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNsb3NlRHJhd2VyKCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5ICYmIHRoaXMuZHJhd2VyLmF1dG9Db2xsYXBzZSkge1xuICAgICAgICAgICAgdGhpcy5kcmF3ZXIudG9nZ2xlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkRyYXdlckNvbnRhaW5lckNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tZHJhd2VyLWNvbnRhaW5lcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEwxME5fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdrZW5kby5kcmF3ZXIuY29udGFpbmVyJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiay1vdmVybGF5XCIgKm5nSWY9XCJvdmVybGF5XCIgKGNsaWNrKT1cImNsb3NlRHJhd2VyKClcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRHJhd2VyQ29udGFpbmVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuRHJhd2VyQ29udGFpbmVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kcmF3ZXItY29udGFpbmVyJyxdIH1dLFxuICAgIG92ZXJsYXlDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kcmF3ZXItb3ZlcmxheScsXSB9XSxcbiAgICBtaW5pQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstZHJhd2VyLW1pbmknLF0gfV0sXG4gICAgcHVzaENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRyYXdlci1wdXNoJyxdIH1dLFxuICAgIGlzRXhwYW5kZWRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1kcmF3ZXItZXhwYW5kZWQnLF0gfV0sXG4gICAgZGlyZWN0aW9uOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydhdHRyLmRpcicsXSB9XSxcbiAgICBkcmF3ZXI6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0RyYXdlckNvbXBvbmVudCxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNvbnRlbnQgb2YgdGhlIFtLZW5kbyBVSSBEcmF3ZXIgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X2RyYXdlciAlfSkuXG4gKi9cbmNsYXNzIERyYXdlckNvbnRlbnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhvc3RDbGFzc2VzID0gdHJ1ZTtcbiAgICB9XG59XG5EcmF3ZXJDb250ZW50Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1kcmF3ZXItY29udGVudCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5EcmF3ZXJDb250ZW50Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107XG5EcmF3ZXJDb250ZW50Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWRyYXdlci1jb250ZW50JyxdIH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHdob2xlIFN0ZXAuXG4gKiBUbyBkZWZpbmUgdGhlIHRlbXBsYXRlLCBuZXN0IGFuIGA8bmctdGVtcGxhdGU+YCB0YWdcbiAqIHdpdGggdGhlIGBrZW5kb1N0ZXBwZXJTdGVwVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tc3RlcHBlcj5gIHRhZy5cbiAqL1xuY2xhc3MgU3RlcHBlclN0ZXBUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbn1cblN0ZXBwZXJTdGVwVGVtcGxhdGVEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ1trZW5kb1N0ZXBwZXJTdGVwVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TdGVwcGVyU3RlcFRlbXBsYXRlRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogVGVtcGxhdGVSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH1cbl07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRlbXBsYXRlIHRoYXQgZGVmaW5lcyB0aGUgY29udGVudCBvZiB0aGUgU3RlcCBsYWJlbC5cbiAqIFRvIGRlZmluZSB0aGUgdGVtcGxhdGUsIG5lc3QgYW4gYDxuZy10ZW1wbGF0ZT5gIHRhZ1xuICogd2l0aCB0aGUgYGtlbmRvU3RlcHBlckxhYmVsVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tc3RlcHBlcj5gIHRhZy5cbiAqL1xuY2xhc3MgU3RlcHBlckxhYmVsVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB9XG59XG5TdGVwcGVyTGFiZWxUZW1wbGF0ZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvU3RlcHBlckxhYmVsVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TdGVwcGVyTGFiZWxUZW1wbGF0ZURpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9XG5dO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGNvbnRlbnQgb2YgdGhlIFN0ZXAgaW5kaWNhdG9yLlxuICogVG8gZGVmaW5lIHRoZSB0ZW1wbGF0ZSwgbmVzdCBhbiBgPG5nLXRlbXBsYXRlPmAgdGFnXG4gKiB3aXRoIHRoZSBga2VuZG9TdGVwcGVySW5kaWNhdG9yVGVtcGxhdGVgIGRpcmVjdGl2ZSBpbnNpZGUgdGhlIGA8a2VuZG8tc3RlcHBlcj5gIHRhZy5cbiAqL1xuY2xhc3MgU3RlcHBlckluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gICAgfVxufVxuU3RlcHBlckluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9TdGVwcGVySW5kaWNhdG9yVGVtcGxhdGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TdGVwcGVySW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfVxuXTtcblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIHRoZSBgYWN0aXZhdGVgIGV2ZW50IG9mIHRoZSBTdGVwcGVyLlxuICovXG5jbGFzcyBTdGVwcGVyQWN0aXZhdGVFdmVudCBleHRlbmRzIFByZXZlbnRhYmxlRXZlbnQge1xufVxuXG5jb25zdCBERUZBVUxUX0NVUlJFTlRfU1RFUCA9IDA7XG5jb25zdCBoYW5kbGVycyA9IHt9O1xuaGFuZGxlcnNbS2V5cy5BcnJvd0xlZnRdID0gJ2xlZnQnO1xuaGFuZGxlcnNbS2V5cy5BcnJvd1JpZ2h0XSA9ICdyaWdodCc7XG5oYW5kbGVyc1tLZXlzLkFycm93VXBdID0gJ3VwJztcbmhhbmRsZXJzW0tleXMuQXJyb3dEb3duXSA9ICdkb3duJztcbmhhbmRsZXJzW0tleXMuSG9tZV0gPSAnaG9tZSc7XG5oYW5kbGVyc1tLZXlzLkVuZF0gPSAnZW5kJztcbmhhbmRsZXJzW0tleXMuRW50ZXJdID0gJ2VudGVyJztcbmhhbmRsZXJzW0tleXMuU3BhY2VdID0gJ2VudGVyJztcbmNvbnN0IGhhbmRsZXJzUlRMID0gT2JqZWN0LmFzc2lnbih7fSwgaGFuZGxlcnMpO1xuaGFuZGxlcnNSVExbS2V5cy5BcnJvd0xlZnRdID0gJ3JpZ2h0JztcbmhhbmRsZXJzUlRMW0tleXMuQXJyb3dSaWdodF0gPSAnbGVmdCc7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgU3RlcHBlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsaXphdGlvbiwgbmdab25lLCBjaGFuZ2VEZXRlY3Rvcikge1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbiA9IGxvY2FsaXphdGlvbjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IgPSBjaGFuZ2VEZXRlY3RvcjtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IERFRkFVTFRfQ1VSUkVOVF9TVEVQO1xuICAgICAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmZvY3VzZWRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBnZXQgaGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyBoYW5kbGVyc1JUTCA6IGhhbmRsZXJzO1xuICAgIH1cbiAgICBlbWl0KGV2ZW50LCBldmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3Qgc3RlcHBlciA9IHRoaXMub3duZXI7XG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMoc3RlcHBlcltldmVudF0pKSB7XG4gICAgICAgICAgICBzdGVwcGVyW2V2ZW50XS5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50QXJncy5pc0RlZmF1bHRQcmV2ZW50ZWQoKTtcbiAgICB9XG4gICAgb25BY3RpdmF0ZShjdXJyZW50SWR4LCBvcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IG5ldyBTdGVwcGVyQWN0aXZhdGVFdmVudCh7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudElkeCxcbiAgICAgICAgICAgIHN0ZXA6IHRoaXMub3duZXIuc3RlcHNbY3VycmVudElkeF0sXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgc2VuZGVyOiB0aGlzLm93bmVyXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVtaXQoJ2FjdGl2YXRlJywgZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBjdXJyZW50SWR4O1xuICAgICAgICAgICAgICAgIHRoaXMub3duZXJbJ2N1cnJlbnRTdGVwQ2hhbmdlJ10uZW1pdChjdXJyZW50SWR4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZhbGlkYXRlU3RlcHMoKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb24uZW1pdCgpO1xuICAgIH1cbiAgICBrZXlkb3duKGUpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZm9jdXNlZFN0ZXAgfHwgdGhpcy5jdXJyZW50U3RlcDtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnNbZS5rZXlDb2RlXTtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQoY3VycmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpc1toYW5kbGVyXShlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZWZ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c1ByZXZTdGVwKCk7XG4gICAgfVxuICAgIHJpZ2h0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c05leHRTdGVwKCk7XG4gICAgfVxuICAgIHVwKCkge1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzUHJldlN0ZXAoKTtcbiAgICB9XG4gICAgZG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c05leHRTdGVwKCk7XG4gICAgfVxuICAgIGhvbWUoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZFN0ZXAgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzZWRTdGVwQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRTdGVwID0gdGhpcy5vd25lci5zdGVwcy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmZvY3VzZWRTdGVwQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG4gICAgZW50ZXIoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZFN0ZXAgPT09IHRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1N0ZXBEaXNhYmxlZCh0aGlzLmZvY3VzZWRTdGVwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm93bmVyLmxpbmVhciAmJiB0aGlzLmlzUHJldk9yTmV4dFN0ZXAodGhpcy5mb2N1c2VkU3RlcCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkFjdGl2YXRlKHRoaXMuZm9jdXNlZFN0ZXAsIGV2ZW50KTtcbiAgICB9XG4gICAgZm9jdXMoZm9jdXNlZElkeCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRTdGVwID0gZm9jdXNlZElkeDtcbiAgICB9XG4gICAgZm9jdXNOZXh0U3RlcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZFN0ZXAgPCB0aGlzLm93bmVyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkU3RlcCArPSAxO1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkU3RlcENoYW5nZS5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9jdXNQcmV2U3RlcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZFN0ZXAgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRTdGVwIC09IDE7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRTdGVwQ2hhbmdlLmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc1N0ZXBEaXNhYmxlZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vd25lci5zdGVwc1tpbmRleF0uZGlzYWJsZWQ7XG4gICAgfVxuICAgIGlzUHJldk9yTmV4dFN0ZXAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLmN1cnJlbnRTdGVwICsgMSB8fCBpbmRleCA9PT0gdGhpcy5jdXJyZW50U3RlcCAtIDE7XG4gICAgfVxuICAgIGdldCBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxufVxuU3RlcHBlclNlcnZpY2UuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblN0ZXBwZXJTZXJ2aWNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9XG5dO1xuXG5jb25zdCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDQwMDtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW0tlbmRvIFVJIFN0ZXBwZXIgY29tcG9uZW50IGZvciBBbmd1bGFyXSh7JSBzbHVnIG92ZXJ2aWV3X3N0ZXBwZXIgJX0pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cy1wcmV2aWV3XG4gKiBfQENvbXBvbmVudCh7XG4gKiAgICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgIDxrZW5kby1zdGVwcGVyIFtzdGVwc109XCJzdGVwc1wiPlxuICogICAgICAgIDwva2VuZG8tc3RlcHBlcj5cbiAqICAgIGBcbiAqIH0pXG4gKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICogICAgcHVibGljIHN0ZXBzOiBBcnJheTxTdGVwcGVyU3RlcD4gPSBbXG4gKiAgICAgIHsgbGFiZWw6ICdTdGVwIE9uZScgfSwgeyBsYWJlbDogJ1N0ZXAgVHdvJyB9LCB7IGxhYmVsOiAnU3RlcCBUaHJlZScgfVxuICogICAgXTtcbiAqIH1cbiAqIGBgYFxuICovXG5jbGFzcyBTdGVwcGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlciwgZWxlbSwgbG9jYWxpemF0aW9uLCBzdGVwcGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuZWxlbSA9IGVsZW07XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLnN0ZXBwZXJTZXJ2aWNlID0gc3RlcHBlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuaG9zdENsYXNzZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmFyaWFSb2xlID0gJ25hdmlnYXRpb24nO1xuICAgICAgICB0aGlzLmRpc3BsYXlTdHlsZSA9ICdncmlkJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgc3RlcHMgaW4gdGhlIFN0ZXBwZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAqIChEZWZhdWx0KSBgaW5kaWNhdG9yYFxuICAgICAgICAgKiAqIGBsYWJlbGBcbiAgICAgICAgICogKiBgZnVsbGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RlcFR5cGUgPSAnaW5kaWNhdG9yJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbGluZWFyIGZsb3cgb2YgdGhlIFN0ZXBwZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGluZWFyID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIFN0ZXBwZXJcbiAgICAgICAgICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBvcmllbnRhdGlvbl9zdGVwcGVyICV9KSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAqIChEZWZhdWx0KSBgaG9yaXpvbnRhbGBcbiAgICAgICAgICogKiBgdmVydGljYWxgXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGA0MDBtc2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAgKiBCb29sZWFuXG4gICAgICAgICAqICAgICogKERlZmF1bHQpIGB0cnVlYFxuICAgICAgICAgKiAgICAqIGZhbHNlXG4gICAgICAgICAqICAqIE51bWJlclxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiBhIHN0ZXAgaXMgYWJvdXQgdG8gYmUgYWN0aXZhdGVkLiBUaGlzIGV2ZW50IGlzIHByZXZlbnRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIGBjdXJyZW50U3RlcGAgcHJvcGVydHkgb2YgdGhlIGNvbXBvbmVudCB3YXMgdXBkYXRlZC5cbiAgICAgICAgICogVXNlZCB0byBwcm92aWRlIGEgdHdvLXdheSBiaW5kaW5nIGZvciB0aGUgYGN1cnJlbnRTdGVwYCBwcm9wZXJ0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0gW107XG4gICAgICAgIHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uLmNoYW5nZXMuc3Vic2NyaWJlKCh7IHJ0bCB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHJ0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0ZXBwZXJTZXJ2aWNlLm93bmVyID0gdGhpcztcbiAgICB9XG4gICAgZ2V0IGxpbmVhckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lYXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzdGVwLlxuICAgICAqL1xuICAgIHNldCBjdXJyZW50U3RlcCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXBwZXJTZXJ2aWNlLmN1cnJlbnRTdGVwID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBjdXJyZW50U3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHBlclNlcnZpY2UuY3VycmVudFN0ZXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIHN0ZXBzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgU3RlcHBlci5cbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHN0ZXBfYXBwZWFyYW5jZV9zdGVwcGVyICV9KSlcbiAgICAgKi9cbiAgICBzZXQgc3RlcHMoc3RlcHMpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChzdGVwcykgJiYgc3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fc3RlcHMgPSBzdGVwcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc3RlcHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGVwcztcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYXBwbHlIb3N0U3R5bGluZygpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnN0ZXBzICYmICFjaGFuZ2VzLnN0ZXBzLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5SG9zdFN0eWxpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHZhbGlkaXR5IGNoZWNrIGNvbmZpZ3VyZWQgYnkgdGhlIFtpc1ZhbGlkXSh7JSBzbHVnIGFwaV9sYXlvdXRfc3RlcHBlcnN0ZXAgJX0jdG9jLWlzdmFsaWQpIHByb3BlcnR5IG9mIHRoZSBzdGVwcy5cbiAgICAgKlxuICAgICAqIFN0ZXBzIHRoYXQgaGF2ZSB0aGVpciBbdmFsaWRhdGVdKHslIHNsdWcgYXBpX2xheW91dF9zdGVwcGVyc3RlcCAlfSN0b2MtdmFsaWRhdGUpIHByb3BlcnR5IHNldCB0byBgZmFsc2VgLCB3aWxsIG5vdCBiZSB2YWxpZGF0ZWQuXG4gICAgICovXG4gICAgdmFsaWRhdGVTdGVwcygpIHtcbiAgICAgICAgdGhpcy5zdGVwcGVyU2VydmljZS52YWxpZGF0ZVN0ZXBzKCk7XG4gICAgfVxuICAgIGFwcGx5SG9zdFN0eWxpbmcoKSB7XG4gICAgICAgIGNvbnN0IHN0ZXBGcmFtZXNTdHlsZSA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/ICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnIDogJ2dyaWQtdGVtcGxhdGUtcm93cyc7XG4gICAgICAgIGNvbnN0IHN0ZXBGcmFtZXNWYWx1ZSA9IGByZXBlYXQoJHt0aGlzLnN0ZXBzLmxlbmd0aCAqIDJ9LCAxZnIpYDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW0ubmF0aXZlRWxlbWVudCwgc3RlcEZyYW1lc1N0eWxlLCBzdGVwRnJhbWVzVmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHByb2dyZXNzQW5pbWF0aW9uKCkge1xuICAgICAgICByZXR1cm4geyBkdXJhdGlvbjogdGhpcy5hbmltYXRpb25EdXJhdGlvbiB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGFuaW1hdGlvbkR1cmF0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYW5pbWF0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbmltYXRpb24gPT09ICdib29sZWFuJyAmJiB0aGlzLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHN0ZXBzTGlzdFN0eWxpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7ICdncmlkLWNvbHVtbi1zdGFydCc6IDEsICdncmlkLWNvbHVtbi1lbmQnOiAtMSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7ICdncmlkLXJvdy1zdGFydCc6IDEsICdncmlkLXJvdy1lbmQnOiAtMSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHByb2dyZXNzQmFyU3R5bGluZygpIHtcbiAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnZ3JpZC1jb2x1bW4tc3RhcnQnOiAyLFxuICAgICAgICAgICAgICAgICdncmlkLWNvbHVtbi1lbmQnOiB0aGlzLnN0ZXBzLmxlbmd0aCAqIDJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdncmlkLXJvdy1zdGFydCc6IDIsXG4gICAgICAgICAgICAnZ3JpZC1yb3ctZW5kJzogdGhpcy5zdGVwcy5sZW5ndGggKiAyXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHBlclNlcnZpY2UuaXNIb3Jpem9udGFsO1xuICAgIH1cbn1cblN0ZXBwZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBleHBvcnRBczogJ2tlbmRvU3RlcHBlcicsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIFN0ZXBwZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uc3RlcHBlcidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1zdGVwcGVyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyIGtlbmRvU3RlcHBlckxvY2FsaXplZE1lc3NhZ2VzXG4gICAgICAgICAgICBpMThuLW9wdGlvbmFsPVwia2VuZG8uc3RlcHBlci5vcHRpb25hbHxUaGUgdGV4dCBmb3IgdGhlIG9wdGlvbmFsIHNlZ21lbnQgb2YgdGhlIHN0ZXAgbGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uYWw9XCJPcHRpb25hbFwiXG4gICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8b2wga2VuZG9TdGVwcGVyTGlzdFxuICAgICAgICAgICAgW3N0ZXBUeXBlXT0nc3RlcFR5cGUnXG4gICAgICAgICAgICBbbGluZWFyXT0nbGluZWFyJ1xuICAgICAgICAgICAgW29yaWVudGF0aW9uXT0nb3JpZW50YXRpb24nXG4gICAgICAgICAgICBbc3RlcHNdPSdzdGVwcydcbiAgICAgICAgICAgIFtjdXJyZW50U3RlcF09J2N1cnJlbnRTdGVwJ1xuICAgICAgICAgICAgW3N1Y2Nlc3NJY29uXT0nc3VjY2Vzc0ljb24nXG4gICAgICAgICAgICBbZXJyb3JJY29uXT0nZXJyb3JJY29uJ1xuICAgICAgICAgICAgW2luZGljYXRvclRlbXBsYXRlXT0naW5kaWNhdG9yVGVtcGxhdGU/LnRlbXBsYXRlUmVmJ1xuICAgICAgICAgICAgW2xhYmVsVGVtcGxhdGVdPSdsYWJlbFRlbXBsYXRlPy50ZW1wbGF0ZVJlZidcbiAgICAgICAgICAgIFtzdGVwVGVtcGxhdGVdPSdzdGVwVGVtcGxhdGU/LnRlbXBsYXRlUmVmJ1xuICAgICAgICAgICAgY2xhc3M9J2stc3RlcC1saXN0J1xuICAgICAgICAgICAgW2NsYXNzLmstc3RlcC1saXN0LWhvcml6b250YWxdPSdpc0hvcml6b250YWwnXG4gICAgICAgICAgICBbY2xhc3Muay1zdGVwLWxpc3QtdmVydGljYWxdPSchaXNIb3Jpem9udGFsJ1xuICAgICAgICAgICAgW25nU3R5bGVdPSdzdGVwc0xpc3RTdHlsaW5nJz5cbiAgICAgICAgPC9vbD5cblxuICAgICAgICA8a2VuZG8tcHJvZ3Jlc3NiYXIgKm5nSWY9J3N0ZXBzLmxlbmd0aCA+IDAnXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09J3RydWUnXG4gICAgICAgICAgICBbYW5pbWF0aW9uXT0ncHJvZ3Jlc3NBbmltYXRpb24nXG4gICAgICAgICAgICBbbWF4XT0nc3RlcHMubGVuZ3RoIC0gMSdcbiAgICAgICAgICAgIFtsYWJlbF09J2ZhbHNlJ1xuICAgICAgICAgICAgW29yaWVudGF0aW9uXT0nb3JpZW50YXRpb24nXG4gICAgICAgICAgICBbcmV2ZXJzZV09JyFpc0hvcml6b250YWwnXG4gICAgICAgICAgICBbdmFsdWVdPSdjdXJyZW50U3RlcCdcbiAgICAgICAgICAgIFtuZ1N0eWxlXT0ncHJvZ3Jlc3NCYXJTdHlsaW5nJz5cbiAgICAgICAgPC9rZW5kby1wcm9ncmVzc2Jhcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblN0ZXBwZXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfSxcbiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSxcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFN0ZXBwZXJTZXJ2aWNlIH1cbl07XG5TdGVwcGVyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzc2VzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXdpZGdldCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RlcHBlcicsXSB9XSxcbiAgICBsaW5lYXJDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGVwcGVyLWxpbmVhcicsXSB9XSxcbiAgICBhcmlhUm9sZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5yb2xlJyxdIH1dLFxuICAgIGRpcmVjdGlvbjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5kaXInLF0gfV0sXG4gICAgZGlzcGxheVN0eWxlOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5kaXNwbGF5JyxdIH1dLFxuICAgIHN0ZXBUeXBlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBsaW5lYXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIG9yaWVudGF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjdXJyZW50U3RlcDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3RlcHM6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN1Y2Nlc3NJY29uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBlcnJvckljb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGFuaW1hdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aXZhdGU6IFt7IHR5cGU6IE91dHB1dCB9XSxcbiAgICBjdXJyZW50U3RlcENoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLFxuICAgIHN0ZXBUZW1wbGF0ZTogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbU3RlcHBlclN0ZXBUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGxhYmVsVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW1N0ZXBwZXJMYWJlbFRlbXBsYXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sXG4gICAgaW5kaWNhdG9yVGVtcGxhdGU6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW1N0ZXBwZXJJbmRpY2F0b3JUZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSxdIH1dXG59O1xuXG5jb25zdCBTSVpFX0NMQVNTRVMgPSB7XG4gICAgJ3NtYWxsJzogJ2stYXZhdGFyLXNtJyxcbiAgICAnbWVkaXVtJzogJ2stYXZhdGFyLW1kJyxcbiAgICAnbGFyZ2UnOiAnay1hdmF0YXItbGcnXG59O1xuY29uc3QgU0hBUEVfQ0xBU1NFUyA9IHtcbiAgICAnY2lyY2xlJzogJ2stYXZhdGFyLWNpcmNsZScsXG4gICAgJ3NxdWFyZSc6ICdrLWF2YXRhci1zcXVhcmUnLFxuICAgICdyZWN0YW5nbGUnOiAnay1hdmF0YXItcmVjdGFuZ2xlJyxcbiAgICAncm91bmRlZCc6ICdrLWF2YXRhci1yb3VuZGVkJ1xufTtcbi8qKlxuICogRGlzcGxheXMgaW1hZ2VzLCBpY29ucyBvciBpbml0aWFscyByZXByZXNlbnRpbmcgcGVvcGxlIG9yIG90aGVyIGVudGl0aWVzLlxuICovXG5jbGFzcyBBdmF0YXJDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHJlbmRlcmVyLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBhcHBlYXJhbmNlIGZpbGwgc3R5bGUgb2YgdGhlIGF2YXRhci5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICAgICAqICogYHNvbGlkYCAoRGVmYXVsdClcbiAgICAgICAgICogKiBgb3V0bGluZWBcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsbCA9ICdzb2xpZCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXRzIGEgYm9yZGVyIHRvIHRoZSBhdmF0YXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJvcmRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90aGVtZUNvbG9yID0gJ3ByaW1hcnknO1xuICAgICAgICB0aGlzLl9zaXplID0gJ21lZGl1bSc7XG4gICAgICAgIHRoaXMuX3NoYXBlID0gJ3NxdWFyZSc7XG4gICAgICAgIHRoaXMuYXZhdGFyID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgc29saWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsbCA9PT0gJ3NvbGlkJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBvdXRsaW5lQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGwgPT09ICdvdXRsaW5lJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBib3JkZXJDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9yZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGZsZXhCYXNpcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNoYXBlIGZvciB0aGUgYXZhdGFyLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgKiAqIChEZWZhdWx0KSBgc3F1YXJlYFxuICAgICAqICogYGNpcmNsZWBcbiAgICAgKiAqIGByZWN0YW5nbGVgXG4gICAgICogKiBgcm91bmRlZGBcbiAgICAgKlxuICAgICAqL1xuICAgIHNldCBzaGFwZShzaGFwZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuYXZhdGFyLCBTSEFQRV9DTEFTU0VTW3RoaXMuc2hhcGVdKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmF2YXRhciwgU0hBUEVfQ0xBU1NFU1tzaGFwZV0pO1xuICAgICAgICB0aGlzLl9zaGFwZSA9IHNoYXBlO1xuICAgIH1cbiAgICBnZXQgc2hhcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaGFwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBhdmF0YXJcbiAgICAgKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIGFwcGVhcmFuY2VfYXZhdGFyICV9I3RvYy1zaXplKSkuXG4gICAgICpcbiAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgKiAqIGBzbWFsbGBcbiAgICAgKiAqIGBtZWRpdW1gIChEZWZhdWx0KVxuICAgICAqICogYGxhcmdlYFxuICAgICAqXG4gICAgICovXG4gICAgc2V0IHNpemUoc2l6ZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuYXZhdGFyLCBTSVpFX0NMQVNTRVNbdGhpcy5zaXplXSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5hdmF0YXIsIFNJWkVfQ0xBU1NFU1tzaXplXSk7XG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdGhlbWUgY29sb3Igb2YgdGhlIGF2YXRhci5cbiAgICAgKiBUaGUgdGhlbWUgY29sb3Igd2lsbCBiZSBhcHBsaWVkIGFzIGJhY2tncm91bmQgYW5kIGJvcmRlciBjb2xvciwgd2hpbGUgYWxzbyBhbWVuZGluZyB0aGUgdGV4dCBjb2xvciBhY2NvcmRpbmdseS5cbiAgICAgKlxuICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAqICogYHByaW1hcnlgIChEZWZhdWx0KSZtZGFzaDtBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIHByaW1hcnkgdGhlbWUgY29sb3IuXG4gICAgICogKiBgc2Vjb25kYXJ5YCZtZGFzaDtBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIHNlY29uZGFyeSB0aGVtZSBjb2xvci5cbiAgICAgKiAqIGB0ZXJ0aWFyeWAmbWRhc2g7IEFwcGxpZXMgY29sb3JpbmcgYmFzZWQgb24gdGVydGlhcnkgdGhlbWUgY29sb3IuXG4gICAgICogKiBgaW5oZXJpdGAmbWRhc2g7IEFwcGxpZXMgaW5oZXJpdGVkIGNvbG9yaW5nIHZhbHVlLlxuICAgICAqICogYGluZm9gJm1kYXNoO0FwcGxpZXMgY29sb3JpbmcgYmFzZWQgb24gaW5mbyB0aGVtZSBjb2xvci5cbiAgICAgKiAqIGBzdWNjZXNzYCZtZGFzaDsgQXBwbGllcyBjb2xvcmluZyBiYXNlZCBvbiBzdWNjZXNzIHRoZW1lIGNvbG9yLlxuICAgICAqICogYHdhcm5pbmdgJm1kYXNoOyBBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIHdhcm5pbmcgdGhlbWUgY29sb3IuXG4gICAgICogKiBgZXJyb3JgJm1kYXNoOyBBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIGVycm9yIHRoZW1lIGNvbG9yLlxuICAgICAqICogYGRhcmtgJm1kYXNoOyBBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIGRhcmsgdGhlbWUgY29sb3IuXG4gICAgICogKiBgbGlnaHRgJm1kYXNoOyBBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIGxpZ2h0IHRoZW1lIGNvbG9yLlxuICAgICAqICogYGludmVyc2VgJm1kYXNoOyBBcHBsaWVzIGNvbG9yaW5nIGJhc2VkIG9uIGludmVydGVkIHRoZW1lIGNvbG9yLlxuICAgICAqXG4gICAgICovXG4gICAgc2V0IHRoZW1lQ29sb3IodGhlbWVDb2xvcikge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuYXZhdGFyLCBgay1hdmF0YXItJHt0aGlzLnRoZW1lQ29sb3J9YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5hdmF0YXIsIGBrLWF2YXRhci0ke3RoZW1lQ29sb3J9YCk7XG4gICAgICAgIHRoaXMuX3RoZW1lQ29sb3IgPSB0aGVtZUNvbG9yO1xuICAgIH1cbiAgICBnZXQgdGhlbWVDb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RoZW1lQ29sb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgYXZhdGFyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGF2YXRhckhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0O1xuICAgIH1cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0QXZhdGFyQ2xhc3NlcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGltYWdlVXJsKCkge1xuICAgICAgICByZXR1cm4gYHVybCgke3RoaXMuaW1hZ2VTcmN9KWA7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnZlcmlmeVByb3BlcnRpZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGljb25DbGFzc2VzKCkge1xuICAgICAgICBpZiAodGhpcy5pY29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYGstaWNvbiBrLWktJHt0aGlzLmljb259YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmljb25DbGFzc31gO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgY3VzdG9tQXZhdGFyKCkge1xuICAgICAgICByZXR1cm4gISh0aGlzLmltYWdlU3JjIHx8IHRoaXMuaW5pdGlhbHMgfHwgdGhpcy5pY29uIHx8IHRoaXMuaWNvbkNsYXNzKTtcbiAgICB9XG4gICAgdmVyaWZ5UHJvcGVydGllcygpIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IFt0aGlzLmljb24gfHwgdGhpcy5pY29uQ2xhc3MsIHRoaXMuaW1hZ2VTcmMsIHRoaXMuaW5pdGlhbHNdO1xuICAgICAgICBjb25zdCBpbnB1dHNMZW5ndGggPSBpbnB1dHMuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUpLmxlbmd0aDtcbiAgICAgICAgaWYgKGlucHV0c0xlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgICAgICAgICAgSW52YWxpZCBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGdpdmVuLlxuICAgICAgICAgICAgICAgIFRoZSBrZW5kby1hdmF0YXIgY29tcG9uZW50IGNhbiBhY2NlcHQgb25seSBvbmUgb2Y6XG4gICAgICAgICAgICAgICAgaWNvbiwgaW1hZ2VTcmMgb3IgaW5pdGlhbHMgcHJvcGVydGllcy5cbiAgICAgICAgICAgIGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEF2YXRhckNsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5hdmF0YXIsIFNIQVBFX0NMQVNTRVNbdGhpcy5zaGFwZV0pO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYXZhdGFyLCBgay1hdmF0YXItJHt0aGlzLnRoZW1lQ29sb3J9YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5hdmF0YXIsIFNJWkVfQ0xBU1NFU1t0aGlzLnNpemVdKTtcbiAgICB9XG59XG5BdmF0YXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWF2YXRhcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21BdmF0YXJcIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlU3JjXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1hdmF0YXItaW1hZ2VcIiBbbmdTdHlsZV09XCJjc3NTdHlsZVwiIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiaW1hZ2VVcmxcIj48L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstYXZhdGFyLXRleHRcIiBbbmdTdHlsZV09XCJjc3NTdHlsZVwiPnt7IGluaXRpYWxzLnN1YnN0cmluZygwLCAyKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImljb24gfHwgaWNvbkNsYXNzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstYXZhdGFyLWljb25cIiBbbmdTdHlsZV09XCJjc3NTdHlsZVwiIFtuZ0NsYXNzXT1cImljb25DbGFzc2VzKClcIj48L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuQXZhdGFyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH1cbl07XG5BdmF0YXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWF2YXRhcicsXSB9XSxcbiAgICBzb2xpZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWF2YXRhci1zb2xpZCcsXSB9XSxcbiAgICBvdXRsaW5lQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYXZhdGFyLW91dGxpbmUnLF0gfV0sXG4gICAgYm9yZGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstYXZhdGFyLWJvcmRlcmVkJyxdIH1dLFxuICAgIGZsZXhCYXNpczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuZmxleEJhc2lzJyxdIH1dLFxuICAgIHNoYXBlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzaXplOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0aGVtZUNvbG9yOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBmaWxsOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBib3JkZXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGljb25DbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgd2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGF2YXRhcldpZHRoOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS53aWR0aCcsXSB9XSxcbiAgICBoZWlnaHQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGF2YXRhckhlaWdodDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuaGVpZ2h0JyxdIH1dLFxuICAgIGNzc1N0eWxlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpbml0aWFsczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaWNvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW1hZ2VTcmM6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtLZW5kbyBVSSBDYXJkIGNvbXBvbmVudCBmb3IgQW5ndWxhcl0oeyUgc2x1ZyBvdmVydmlld19jYXJkICV9KVxuICovXG5jbGFzcyBDYXJkQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbGl6YXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9jYWxpemF0aW9uU2VydmljZSA9IGxvY2FsaXphdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMuaG9zdENsYXNzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBDYXJkIGNvbnRlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAqIChEZWZhdWx0KSBgdmVydGljYWxgXG4gICAgICAgICAqICogYGhvcml6b250YWxgXG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIHdpZHRoIG9mIHRoZSBDYXJkLlxuICAgICAgICAgKiBEZWZhdWx0cyB0byBgMjg1cHhgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aWR0aCA9ICcyODVweCc7XG4gICAgICAgIHRoaXMucnRsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZHluYW1pY1JUTFN1YnNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemF0aW9uU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSgoeyBydGwgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydGwgPSBydGw7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMucnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCB3aWR0aFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG4gICAgZ2V0IHZlcnRpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICB9XG4gICAgZ2V0IGhvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5keW5hbWljUlRMU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNSVExTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNhcmRDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNhcmQnLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBMMTBOX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiAna2VuZG8uY2FyZC5jb21wb25lbnQnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkNhcmRDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH1cbl07XG5DYXJkQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay13aWRnZXQnLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQnLF0gfV0sXG4gICAgd2lkdGhTdHlsZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUud2lkdGgnLF0gfV0sXG4gICAgdmVydGljYWw6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC12ZXJ0aWNhbCcsXSB9XSxcbiAgICBob3Jpem9udGFsOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtaG9yaXpvbnRhbCcsXSB9XSxcbiAgICBkaXJlY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuZGlyJyxdIH1dLFxuICAgIG9yaWVudGF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB3aWR0aDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBjb250ZW50IGluIHRoZSBDYXJkIGhlYWRlci5cbiAqL1xuY2xhc3MgQ2FyZEhlYWRlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaG9zdENsYXNzID0gdHJ1ZTtcbiAgICB9XG59XG5DYXJkSGVhZGVyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jYXJkLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkNhcmRIZWFkZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtaGVhZGVyJyxdIH1dXG59O1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgY29udGVudCBpbiB0aGUgQ2FyZCBib2R5LlxuICovXG5jbGFzcyBDYXJkQm9keUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaG9zdENsYXNzID0gdHJ1ZTtcbiAgICB9XG59XG5DYXJkQm9keUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tY2FyZC1ib2R5JyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuQ2FyZEJvZHlDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtYm9keScsXSB9XVxufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGNvbnRlbnQgaW4gdGhlIENhcmQgZm9vdGVyLlxuICovXG5jbGFzcyBDYXJkRm9vdGVyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgIH1cbn1cbkNhcmRGb290ZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2tlbmRvLWNhcmQtZm9vdGVyJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuQ2FyZEZvb3RlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC1mb290ZXInLF0gfV1cbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBhY3Rpb24gYnV0dG9ucyBvZiB0aGUgQ2FyZC5cbiAqICogKFtzZWUgZXhhbXBsZV0oeyUgc2x1ZyBhY3Rpb25zX2NhcmQgJX0pKS5cbiAqL1xuY2xhc3MgQ2FyZEFjdGlvbnNDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhvc3RDbGFzcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIGxheW91dCBvZiB0aGUgQ2FyZCBhY3Rpb24gYnV0dG9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiAoRGVmYXVsdCkgYGhvcml6b250YWxgXG4gICAgICAgICAqICogYHZlcnRpY2FsYFxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBDYXJkIGFjdGlvbiBidXR0b25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICAgICAgICogKiAoRGVmYXVsdCkgYHN0YXJ0YFxuICAgICAgICAgKiAqIGBjZW50ZXJgXG4gICAgICAgICAqICogYGVuZGBcbiAgICAgICAgICogKiBgc3RyZXRjaGVkYFxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXlvdXQgPSAnc3RhcnQnO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYW4gYWN0aW9uIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBnZXQgc3RyZXRjaGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dCA9PT0gJ3N0cmV0Y2hlZCc7XG4gICAgfVxuICAgIGdldCBzdGFydENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQgPT09ICdzdGFydCc7XG4gICAgfVxuICAgIGdldCBlbmRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0ID09PSAnZW5kJztcbiAgICB9XG4gICAgZ2V0IGNlbnRlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQgPT09ICdjZW50ZXInO1xuICAgIH1cbiAgICBnZXQgdmVydGljYWxDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCc7XG4gICAgfVxuICAgIGdldCBob3Jpem9udGFsQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBvbkNsaWNrKGFjdGlvbikge1xuICAgICAgICB0aGlzLmFjdGlvbi5lbWl0KGFjdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBhY3Rpb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICAgIH1cbn1cbkNhcmRBY3Rpb25zQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1jYXJkLWFjdGlvbnMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiIWFjdGlvbnNcIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhY3Rpb25UZW1wbGF0ZSgpXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLXByaW1hcnldPVwiYWN0aW9uLnByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5rLWZsYXRdPVwiYWN0aW9uLmZsYXRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgYWN0aW9uLnRleHQgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aW9uc1wiICpuZ0lmPVwiYWN0aW9uVGVtcGxhdGUoKVwiPjwvbmctdGVtcGxhdGU+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuQ2FyZEFjdGlvbnNDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtYWN0aW9ucycsXSB9XSxcbiAgICBzdHJldGNoZWRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jYXJkLWFjdGlvbnMtc3RyZXRjaGVkJyxdIH1dLFxuICAgIHN0YXJ0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC1hY3Rpb25zLXN0YXJ0JyxdIH1dLFxuICAgIGVuZENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtYWN0aW9ucy1lbmQnLF0gfV0sXG4gICAgY2VudGVyQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC1hY3Rpb25zLWNlbnRlcicsXSB9XSxcbiAgICB2ZXJ0aWNhbENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtYWN0aW9ucy12ZXJ0aWNhbCcsXSB9XSxcbiAgICBob3Jpem9udGFsQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC1hY3Rpb25zLWhvcml6b250YWwnLF0gfV0sXG4gICAgb3JpZW50YXRpb246IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGxheW91dDogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgYWN0aW9uOiBbeyB0eXBlOiBPdXRwdXQgfV1cbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIGEgc2VwYXJhdG9yIGluIHRoZSBjb250ZW50IG9mIHRoZSBDYXJkLlxuICovXG5jbGFzcyBDYXJkU2VwYXJhdG9yRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgQ2FyZCBzZXBhcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgICAgICAgKiAoRGVmYXVsdCkgYGhvcml6b250YWxgXG4gICAgICAgICAqIGB2ZXJ0aWNhbGBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIGdldCB2ZXJ0aWNhbENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICB9XG4gICAgZ2V0IGhvcml6b250YWxDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICB9XG59XG5DYXJkU2VwYXJhdG9yRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9DYXJkU2VwYXJhdG9yXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkNhcmRTZXBhcmF0b3JEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaG9zdENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLWNhcmQtc2VwYXJhdG9yJyxdIH1dLFxuICAgIHZlcnRpY2FsQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc2VwYXJhdG9yLXZlcnRpY2FsJyxdIH1dLFxuICAgIGhvcml6b250YWxDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zZXBhcmF0b3ItaG9yaXpvbnRhbCcsXSB9XSxcbiAgICBjb2xvcjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuY29sb3InLF0gfSwgeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvcmllbnRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB0ZXh0IGFuZCBzdHlsZXMgZm9yIHRoZSB0aXRsZSBvZiB0aGUgQ2FyZC5cbiAqL1xuY2xhc3MgQ2FyZFRpdGxlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgIH1cbn1cbkNhcmRUaXRsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FyZFRpdGxlXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkNhcmRUaXRsZURpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC10aXRsZScsXSB9XVxufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHRleHQgYW5kIHN0eWxlcyBmb3IgdGhlIHN1YnRpdGxlIG9mIHRoZSBDYXJkLlxuICovXG5jbGFzcyBDYXJkU3VidGl0bGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhvc3RDbGFzcyA9IHRydWU7XG4gICAgfVxufVxuQ2FyZFN1YnRpdGxlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdba2VuZG9DYXJkU3VidGl0bGVdJ1xuICAgICAgICAgICAgfSxdIH0sXG5dO1xuQ2FyZFN1YnRpdGxlRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgIGhvc3RDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1jYXJkLXN1YnRpdGxlJyxdIH1dXG59O1xuXG4vKipcbiAqIFNwZWNpZmllcyBhbnkgbWVkaWEgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBhbmQgYWxpZ25lZCBpbiB0aGUgQ2FyZC5cbiAqL1xuY2xhc3MgQ2FyZE1lZGlhRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSB0cnVlO1xuICAgIH1cbn1cbkNhcmRNZWRpYURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvQ2FyZE1lZGlhXSdcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbkNhcmRNZWRpYURpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBob3N0Q2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstY2FyZC1tZWRpYScsXSB9XVxufTtcblxuLyoqXG4gKiBUaGUgc2V0dGluZ3Mgb2YgdGhlIENhcmQgYWN0aW9uIGJ1dHRvbnMuXG4gKi9cbmNsYXNzIENhcmRBY3Rpb24ge1xufVxuXG5jb25zdCBleHBvcnRlZE1vZHVsZXMgPSBbXG4gICAgQXZhdGFyQ29tcG9uZW50XG5dO1xuY29uc3QgZGVjbGFyYXRpb25zID0gW1xuICAgIC4uLmV4cG9ydGVkTW9kdWxlc1xuXTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIEF2YXRhciBjb21wb25lbnQuXG4gKi9cbmNsYXNzIEF2YXRhck1vZHVsZSB7XG59XG5BdmF0YXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2RlY2xhcmF0aW9uc10sXG4gICAgICAgICAgICAgICAgZXhwb3J0czogW2V4cG9ydGVkTW9kdWxlc10sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuY29uc3QgY2FyZERpcmVjdGl2ZXMgPSBbXG4gICAgQ2FyZFRpdGxlRGlyZWN0aXZlLFxuICAgIENhcmRTdWJ0aXRsZURpcmVjdGl2ZSxcbiAgICBDYXJkU2VwYXJhdG9yRGlyZWN0aXZlLFxuICAgIENhcmRNZWRpYURpcmVjdGl2ZVxuXTtcbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyQxID0gW1xuICAgIENhcmRDb21wb25lbnQsXG4gICAgQ2FyZEhlYWRlckNvbXBvbmVudCxcbiAgICBDYXJkQm9keUNvbXBvbmVudCxcbiAgICBDYXJkRm9vdGVyQ29tcG9uZW50LFxuICAgIENhcmRBY3Rpb25zQ29tcG9uZW50LFxuICAgIC4uLmNhcmREaXJlY3RpdmVzXG5dO1xuY29uc3QgZGVjbGFyYXRpb25zJDEgPSBbLi4uZXhwb3J0ZWRNb2R1bGVzJDFdO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgQ2FyZCBjb21wb25lbnQuXG4gKi9cbmNsYXNzIENhcmRNb2R1bGUge1xufVxuQ2FyZE1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZGVjbGFyYXRpb25zJDFdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkMV0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IERSQVdFUl9MSU5LX1NFTEVDVE9SID0gJy5rLWRyYXdlci1saW5rJztcbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBBQ1RJVkVfTkVTVEVEX0xJTktfU0VMRUNUT1IgPSAnOmZvY3VzOm5vdCguay1zdGF0ZS1kaXNhYmxlZCkgLmstZHJhd2VyLWxpbmsnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IG5lc3RlZExpbmsgPSAoZWxlbWVudCwgc2VsZWN0b3IpID0+IGVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBEcmF3ZXJJdGVtQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkcmF3ZXIsIGVsZW1lbnQsIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyID0gZHJhd2VyO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmRpc2FibGVkO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2VyLnNlbGVjdGVkSW5kaWNlcy5pbmRleE9mKHRoaXMuaW5kZXgpID49IDA7XG4gICAgfVxuICAgIGdldCBsYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS50ZXh0ID8gdGhpcy5pdGVtLnRleHQgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBjb25zdCBsaW5rID0gbmVzdGVkTGluayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgRFJBV0VSX0xJTktfU0VMRUNUT1IpO1xuICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUobGluaywgJ3RhYmluZGV4Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGljb25DbGFzc2VzKGljb24pIHtcbiAgICAgICAgcmV0dXJuIGBrLWljb24gJHtpY29ufWA7XG4gICAgfVxufVxuRHJhd2VySXRlbUNvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJhd2VySXRlbV0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIml0ZW1UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0VGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSB9XCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJpY29uQ2xhc3NlcyhpdGVtLmljb24pXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pdGVtLXRleHRcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtaW5pICYmICFleHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImljb25DbGFzc2VzKGl0ZW0uaWNvbilcIj48L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkRyYXdlckl0ZW1Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEcmF3ZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sXG4gICAgeyB0eXBlOiBSZW5kZXJlcjIgfVxuXTtcbkRyYXdlckl0ZW1Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgaXRlbTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGl0ZW1UZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbWluaTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZXhwYW5kZWQ6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjc3NDbGFzczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY3NzU3R5bGU6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGRpc2FibGVkQ2xhc3M6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2F0dHIuYXJpYS1kaXNhYmxlZCcsXSB9LCB7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZGlzYWJsZWQnLF0gfV0sXG4gICAgc2VsZWN0ZWRDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLXNlbGVjdGVkJyxdIH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGF0ZS1zZWxlY3RlZCcsXSB9XSxcbiAgICBsYWJlbDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLWxhYmVsJyxdIH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgRFJBV0VSX0lURU1fSU5ERVggPSAnZGF0YS1rZW5kby1kcmF3ZXItaW5kZXgnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgRHJhd2VyTGlzdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZHJhd2VyU2VydmljZSwgcmVuZGVyZXIsIG5nWm9uZSwgY2hhbmdlRGV0ZWN0b3IsIGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kcmF3ZXJTZXJ2aWNlID0gZHJhd2VyU2VydmljZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5pbml0RG9tRXZlbnRzKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaW5pdGlhbFNlbGVjdGlvbigpIHtcbiAgICAgICAgLyogRGlmZmVyZW50aWF0ZXMgYSB1c2VyIHNlbGVjdGVkIGl0ZW0gKi9cbiAgICAgICAgaWYgKHRoaXMuZHJhd2VyU2VydmljZS5zZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdlclNlcnZpY2UuaW5pdFNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb21FdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnJlbmRlcmVyLmxpc3RlbihuYXRpdmVFbGVtZW50LCAnY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMucmVuZGVyZXIubGlzdGVuKG5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGlja0hhbmRsZXIoZSkge1xuICAgICAgICBjb25zdCBpdGVtSWR4ID0gdGhpcy5nZXREcmF3ZXJJdGVtSW5kZXgoZS50YXJnZXQpO1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1tpdGVtSWR4XTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgaW5kZXg6IGl0ZW1JZHgsXG4gICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRyYXdlclNlcnZpY2UuZW1pdCgnc2VsZWN0JywgYXJncykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdlclNlcnZpY2Uub25TZWxlY3QoaXRlbUlkeCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBrZXlEb3duSGFuZGxlcihlKSB7XG4gICAgICAgIGNvbnN0IGlzRW50ZXJPclNwYWNlID0gZS5rZXlDb2RlID09PSBLZXlzLkVudGVyIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5TcGFjZTtcbiAgICAgICAgaWYgKCFpc0VudGVyT3JTcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xpY2tIYW5kbGVyKGUpO1xuICAgICAgICBjb25zdCBsaW5rID0gbmVzdGVkTGluayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgQUNUSVZFX05FU1RFRF9MSU5LX1NFTEVDVE9SKTtcbiAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldERyYXdlckl0ZW1JbmRleCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGNsb3Nlc3RJdGVtKHRhcmdldCwgRFJBV0VSX0lURU1fSU5ERVgsIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtSW5kZXgoaXRlbSwgRFJBV0VSX0lURU1fSU5ERVgpO1xuICAgICAgICB9XG4gICAgfVxufVxuRHJhd2VyTGlzdENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvRHJhd2VyTGlzdF0nLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiIWl0ZW0uc2VwYXJhdG9yXCIga2VuZG9EcmF3ZXJJdGVtXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrLWRyYXdlci1pdGVtXCJcbiAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaWR4XCJcbiAgICAgICAgICAgICAgICBbbWluaV09XCJtaW5pXCJcbiAgICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgIFtpdGVtVGVtcGxhdGVdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci4ke0RSQVdFUl9JVEVNX0lOREVYfV09XCJpZHhcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIml0ZW0uY3NzU3R5bGVcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiaXRlbS5zZXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiay1kcmF3ZXItaXRlbSBrLWRyYXdlci1zZXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIml0ZW0uY3NzU3R5bGVcIj5cbiAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuRHJhd2VyTGlzdENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IERyYXdlclNlcnZpY2UgfSxcbiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LFxuICAgIHsgdHlwZTogTmdab25lIH0sXG4gICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LFxuICAgIHsgdHlwZTogRWxlbWVudFJlZiB9XG5dO1xuRHJhd2VyTGlzdENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBpdGVtczogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgaXRlbVRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBtaW5pOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBleHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV1cbn07XG5cbmNvbnN0IHRlbXBsYXRlRGlyZWN0aXZlcyA9IFtcbiAgICBEcmF3ZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBEcmF3ZXJIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBEcmF3ZXJGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBEcmF3ZXJJdGVtVGVtcGxhdGVEaXJlY3RpdmVcbl07XG5jb25zdCBleHBvcnRlZE1vZHVsZXMkMiA9IFtcbiAgICBEcmF3ZXJDb21wb25lbnQsXG4gICAgRHJhd2VyQ29udGFpbmVyQ29tcG9uZW50LFxuICAgIERyYXdlckNvbnRlbnRDb21wb25lbnQsXG4gICAgLi4udGVtcGxhdGVEaXJlY3RpdmVzXG5dO1xuY29uc3QgZGVjbGFyYXRpb25zJDIgPSBbXG4gICAgRHJhd2VySXRlbUNvbXBvbmVudCxcbiAgICBEcmF3ZXJMaXN0Q29tcG9uZW50LFxuICAgIC4uLmV4cG9ydGVkTW9kdWxlcyQyXG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgRHJhd2VyIGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgRHJhd2VyTW9kdWxlIHtcbn1cbkRyYXdlck1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZGVjbGFyYXRpb25zJDJdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkMl0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuY29uc3QgZXhwb3J0ZWRNb2R1bGVzJDMgPSBbXG4gICAgUGFuZWxCYXJDb21wb25lbnQsXG4gICAgUGFuZWxCYXJJdGVtQ29tcG9uZW50LFxuICAgIFBhbmVsQmFyQ29udGVudERpcmVjdGl2ZSxcbiAgICBQYW5lbEJhckl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBQYW5lbEJhckl0ZW1UaXRsZURpcmVjdGl2ZVxuXTtcbmNvbnN0IGRlY2xhcmF0aW9ucyQzID0gW1xuICAgIC4uLmV4cG9ydGVkTW9kdWxlcyQzXG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgUGFuZWxCYXIgY29tcG9uZW50LlxuICpcbiAqIFRoZSBtb2R1bGUgcmVnaXN0ZXJzOlxuICogLSBgUGFuZWxCYXJDb21wb25lbnRgJm1kYXNoO1RoZSBgUGFuZWxCYXJgIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYFBhbmVsQmFySXRlbUNvbXBvbmVudGAmbWRhc2g7VGhlIGBQYW5lbEJhckl0ZW1gIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYFBhbmVsQmFyQ29udGVudENvbXBvbmVudGAmbWRhc2g7VGhlIGBQYW5lbEJhckNvbnRlbnRgIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYFBhbmVsQmFySXRlbVRlbXBsYXRlRGlyZWN0aXZlJm1kYXNoO1RoZSBgUGFuZWxCYXJJdGVtVGVtcGxhdGVgIGRpcmVjdGl2ZS5cbiAqIC0gYFBhbmVsQmFySXRlbVRpdGxlRGlyZWN0aXZlJm1kYXNoO1RoZSBgUGFuZWxCYXJJdGVtVGl0bGVgIGRpcmVjdGl2ZS5cbiAqL1xuY2xhc3MgUGFuZWxCYXJNb2R1bGUge1xufVxuUGFuZWxCYXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2RlY2xhcmF0aW9ucyQzXSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbZXhwb3J0ZWRNb2R1bGVzJDNdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbmNvbnN0IHN0b3BQcm9wYWdhdGlvbiA9ICh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufTtcbmNvbnN0IHByZXZlbnRPbkRibENsaWNrID0gcmVsZWFzZSA9PiBtb3VzZURvd24gPT4gb2YobW91c2VEb3duKS5waXBlKGRlbGF5KDE1MCksIHRha2VVbnRpbChyZWxlYXNlKSk7XG5jb25zdCBjbGFzc0Zyb21PYmplY3QgPSBjbGFzc2VzID0+IE9iamVjdC5rZXlzKGNsYXNzZXMpLmZpbHRlcihjID0+IGNsYXNzZXNbY10pLmpvaW4oJyAnKTtcbmNvbnN0IGNyZWF0ZU1vdmVTdHJlYW0gPSAoZHJhZ2dhYmxlKSA9PiBtb3VzZURvd24gPT4gZHJhZ2dhYmxlLmtlbmRvRHJhZ1xuICAgIC5waXBlKHRha2VVbnRpbChkcmFnZ2FibGUua2VuZG9SZWxlYXNlKSwgbWFwKCh7IHBhZ2VYLCBwYWdlWSB9KSA9PiAoe1xuICAgIG9yaWdpbmFsWDogbW91c2VEb3duLnBhZ2VYLFxuICAgIG9yaWdpbmFsWTogbW91c2VEb3duLnBhZ2VZLFxuICAgIHBhZ2VYLFxuICAgIHBhZ2VZXG59KSkpO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFNwbGl0dGVyQmFyQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkcmFnZ2FibGUsIHNwbGl0dGVyLCBsb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuc3BsaXR0ZXIgPSBzcGxpdHRlcjtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmFyaWFSb2xlID0gJ3NlcGFyYXRvcic7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIGdldCBkaXJlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbi5ydGwgPyAncnRsJyA6ICdsdHInO1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0dGVyLmlzU3RhdGljKHRoaXMuaW5kZXgpID8gLTEgOiAwO1xuICAgIH1cbiAgICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICAgICAgY29uc3QgaXNEcmFnZ2FibGUgPSB0aGlzLnNwbGl0dGVyLmlzRHJhZ2dhYmxlKHRoaXMuaW5kZXgpO1xuICAgICAgICBjb25zdCBpc1N0YXRpYyA9IHRoaXMuc3BsaXR0ZXIuaXNTdGF0aWModGhpcy5pbmRleCk7XG4gICAgICAgIHJldHVybiBjbGFzc0Zyb21PYmplY3Qoe1xuICAgICAgICAgICAgJ2stc3RhdGUtZm9jdXNlZCc6IHRoaXMuZm9jdXNlZCxcbiAgICAgICAgICAgICdrLXNwbGl0YmFyJzogdHJ1ZSxcbiAgICAgICAgICAgICdrLXNwbGl0YmFyLWhvcml6b250YWwnOiBpc0hvcml6b250YWwsXG4gICAgICAgICAgICAnay1zcGxpdGJhci12ZXJ0aWNhbCc6ICFpc0hvcml6b250YWwsXG4gICAgICAgICAgICAnay1zcGxpdGJhci1kcmFnZ2FibGUtaG9yaXpvbnRhbCc6IGlzSG9yaXpvbnRhbCAmJiBpc0RyYWdnYWJsZSxcbiAgICAgICAgICAgICdrLXNwbGl0YmFyLWRyYWdnYWJsZS12ZXJ0aWNhbCc6ICFpc0hvcml6b250YWwgJiYgaXNEcmFnZ2FibGUsXG4gICAgICAgICAgICAnay1zcGxpdGJhci1zdGF0aWMtaG9yaXpvbnRhbCc6IGlzSG9yaXpvbnRhbCAmJiBpc1N0YXRpYyxcbiAgICAgICAgICAgICdrLXNwbGl0YmFyLXN0YXRpYy12ZXJ0aWNhbCc6ICFpc0hvcml6b250YWwgJiYgaXNTdGF0aWNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCB0b3VjaEFjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BsaXR0ZXIuaXNEcmFnZ2FibGUodGhpcy5pbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG9yZGVyKCkge1xuICAgICAgICByZXR1cm4gMiAqIHRoaXMuaW5kZXggKyAxO1xuICAgIH1cbiAgICBjb2xsYXBzZUFueSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kTGFzdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVOZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyeVRvZ2dsZU5lYXJlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkZvY3VzSW4oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICAgIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50ICYmIGV2ZW50LmtleUNvZGU7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICAgICAgY29uc3QgcmVzaXplID0gZGVsdGEgPT4ge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlJCQxID0gdGhpcy5zcGxpdHRlci5kcmFnU3RhdGUodGhpcy5pbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNwbGl0dGVyLnNldFNpemUoc3RhdGUkJDEsIGRlbHRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtleXMuRW50ZXIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbGxhcHNlQW55KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNIb3Jpem9udGFsICYmIGtleUNvZGUgPT09IEtleXMuQXJyb3dMZWZ0KSB7XG4gICAgICAgICAgICByZXNpemUoLTEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0hvcml6b250YWwgJiYga2V5Q29kZSA9PT0gS2V5cy5BcnJvd1JpZ2h0KSB7XG4gICAgICAgICAgICByZXNpemUoMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc0hvcml6b250YWwgJiYga2V5Q29kZSA9PT0gS2V5cy5BcnJvd1VwKSB7XG4gICAgICAgICAgICByZXNpemUoLTEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNIb3Jpem9udGFsICYmIGtleUNvZGUgPT09IEtleXMuQXJyb3dEb3duKSB7XG4gICAgICAgICAgICByZXNpemUoMTApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBleHBhbmRMYXN0KCkge1xuICAgICAgICBjb25zdCBwYW5lcyA9IHRoaXMuc3BsaXR0ZXIucGFuZXM7XG4gICAgICAgIHJldHVybiBwYW5lcy5sZW5ndGggPT09IDIgJiYgcGFuZXNbMV0uY29sbGFwc2VkO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgbGV0IHN0YXRlJCQxO1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuZHJhZ2dhYmxlLmtlbmRvUHJlc3MucGlwZSh0YXAoc3RvcFByb3BhZ2F0aW9uKSwgZmlsdGVyKCgpID0+IHRoaXMuc3BsaXR0ZXIuaXNEcmFnZ2FibGUodGhpcy5pbmRleCkpLCB0YXAoKCkgPT4gc3RhdGUkJDEgPSB0aGlzLnNwbGl0dGVyLmRyYWdTdGF0ZSh0aGlzLmluZGV4KSksIHRhcCgoKSA9PiB0aGlzLnNwbGl0dGVyLnRvZ2dsZUNvbnRlbnRPdmVybGF5KHRoaXMuaW5kZXgsIHRydWUpKSwgc3dpdGNoTWFwKHByZXZlbnRPbkRibENsaWNrKHRoaXMuZHJhZ2dhYmxlLmtlbmRvUmVsZWFzZSkpLCBzd2l0Y2hNYXAoY3JlYXRlTW92ZVN0cmVhbSh0aGlzLmRyYWdnYWJsZSkpKS5zdWJzY3JpYmUoKHsgcGFnZVgsIHBhZ2VZLCBvcmlnaW5hbFgsIG9yaWdpbmFsWSB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGVsdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgICAgICAgIGRlbHRhID0gcGFnZVkgLSBvcmlnaW5hbFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgICAgICBkZWx0YSA9IG9yaWdpbmFsWCAtIHBhZ2VYO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsdGEgPSBwYWdlWCAtIG9yaWdpbmFsWDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3BsaXR0ZXIuc2V0U2l6ZShzdGF0ZSQkMSwgZGVsdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5kcmFnZ2FibGUua2VuZG9SZWxlYXNlLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNwbGl0dGVyLnRvZ2dsZUNvbnRlbnRPdmVybGF5KHRoaXMuaW5kZXgsIGZhbHNlKSkpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9nZ2xlUHJldmlvdXMoKSB7XG4gICAgICAgIHRoaXMuc3BsaXR0ZXIudHJ5VG9nZ2xlKHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICB0b2dnbGVOZXh0KCkge1xuICAgICAgICB0aGlzLnNwbGl0dGVyLnRyeVRvZ2dsZSh0aGlzLmluZGV4ICsgMSk7XG4gICAgfVxuICAgIHByZXZpb3VzQXJyb3dDbGFzcygpIHtcbiAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMuc3BsaXR0ZXIucGFuZSh0aGlzLmluZGV4KTtcbiAgICAgICAgY29uc3QgbmV4dFBhbmUgPSB0aGlzLnNwbGl0dGVyLnBhbmUodGhpcy5pbmRleCArIDEpO1xuICAgICAgICBjb25zdCBpc0NvbGxhcHNpYmxlID0gcGFuZS5jb2xsYXBzaWJsZTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBwYW5lLmNvbGxhcHNlZDtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICByZXR1cm4gY2xhc3NGcm9tT2JqZWN0KHtcbiAgICAgICAgICAgICdrLWljb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2staGlkZGVuJzogIWlzQ29sbGFwc2libGUgfHwgbmV4dFBhbmUuaXNIaWRkZW4sXG4gICAgICAgICAgICAnay1jb2xsYXBzZS1wcmV2JzogaXNDb2xsYXBzaWJsZSxcbiAgICAgICAgICAgICdrLWktYXJyb3ctNjAtbGVmdCc6IGlzQ29sbGFwc2libGUgJiYgaXNIb3Jpem9udGFsICYmICFpc0NvbGxhcHNlZCxcbiAgICAgICAgICAgICdrLWktYXJyb3ctNjAtcmlnaHQnOiBpc0NvbGxhcHNpYmxlICYmIGlzSG9yaXpvbnRhbCAmJiBpc0NvbGxhcHNlZCxcbiAgICAgICAgICAgICdrLWktYXJyb3ctNjAtdXAnOiBpc0NvbGxhcHNpYmxlICYmICFpc0hvcml6b250YWwgJiYgIWlzQ29sbGFwc2VkLFxuICAgICAgICAgICAgJ2staS1hcnJvdy02MC1kb3duJzogaXNDb2xsYXBzaWJsZSAmJiAhaXNIb3Jpem9udGFsICYmIGlzQ29sbGFwc2VkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZXh0QXJyb3dDbGFzcygpIHtcbiAgICAgICAgY29uc3QgcGFuZSA9IHRoaXMuc3BsaXR0ZXIucGFuZSh0aGlzLmluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IHByZXZQYW5lID0gdGhpcy5zcGxpdHRlci5wYW5lKHRoaXMuaW5kZXgpO1xuICAgICAgICBjb25zdCBpc0NvbGxhcHNpYmxlID0gcGFuZS5jb2xsYXBzaWJsZTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBwYW5lLmNvbGxhcHNlZDtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICByZXR1cm4gY2xhc3NGcm9tT2JqZWN0KHtcbiAgICAgICAgICAgICdrLWljb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2staGlkZGVuJzogIWlzQ29sbGFwc2libGUgfHwgcHJldlBhbmUuaXNIaWRkZW4sXG4gICAgICAgICAgICAnay1jb2xsYXBzZS1uZXh0JzogaXNDb2xsYXBzaWJsZSxcbiAgICAgICAgICAgICdrLWktYXJyb3ctNjAtcmlnaHQnOiBpc0NvbGxhcHNpYmxlICYmIGlzSG9yaXpvbnRhbCAmJiAhaXNDb2xsYXBzZWQsXG4gICAgICAgICAgICAnay1pLWFycm93LTYwLWxlZnQnOiBpc0NvbGxhcHNpYmxlICYmIGlzSG9yaXpvbnRhbCAmJiBpc0NvbGxhcHNlZCxcbiAgICAgICAgICAgICdrLWktYXJyb3ctNjAtZG93bic6IGlzQ29sbGFwc2libGUgJiYgIWlzSG9yaXpvbnRhbCAmJiAhaXNDb2xsYXBzZWQsXG4gICAgICAgICAgICAnay1pLWFycm93LTYwLXVwJzogaXNDb2xsYXBzaWJsZSAmJiAhaXNIb3Jpem9udGFsICYmIGlzQ29sbGFwc2VkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cnlUb2dnbGVOZWFyZXN0KCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pbmRleDtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgICBpZiAoIXRoaXMuc3BsaXR0ZXIudHJ5VG9nZ2xlKHByZXYpKSB7XG4gICAgICAgICAgICB0aGlzLnNwbGl0dGVyLnRyeVRvZ2dsZShuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblNwbGl0dGVyQmFyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdrZW5kby1zcGxpdHRlci1iYXInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICA8ZGl2IFtjbGFzc109XCJwcmV2aW91c0Fycm93Q2xhc3MoKVwiIChjbGljayk9XCJ0b2dnbGVQcmV2aW91cygpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiay1yZXNpemUtaGFuZGxlXCI+PC9kaXY+XG4gICAgICA8ZGl2IFtjbGFzc109XCJuZXh0QXJyb3dDbGFzcygpXCIgKGNsaWNrKT1cInRvZ2dsZU5leHQoKVwiPjwvZGl2PlxuICAgIGBcbiAgICAgICAgICAgIH0sXSB9LFxuXTtcbi8qKiBAbm9jb2xsYXBzZSAqL1xuU3BsaXR0ZXJCYXJDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXG4gICAgeyB0eXBlOiBEcmFnZ2FibGVEaXJlY3RpdmUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfV0gfSxcbiAgICB7IHR5cGU6IFNwbGl0dGVyU2VydmljZSB9LFxuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuU3BsaXR0ZXJCYXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3JpZW50YXRpb246IFt7IHR5cGU6IElucHV0IH0sIHsgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5hcmlhLW9yaWVudGF0aW9uJyxdIH1dLFxuICAgIGluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBhcmlhUm9sZTogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5yb2xlJyxdIH1dLFxuICAgIGZvY3VzZWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLmstc3RhdGUtZm9jdXNlZCcsXSB9XSxcbiAgICB0YWJJbmRleDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci50YWJpbmRleCcsXSB9XSxcbiAgICBob3N0Q2xhc3NlczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3MnLF0gfV0sXG4gICAgdG91Y2hBY3Rpb246IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ3N0eWxlLnRvdWNoLWFjdGlvbicsXSB9XSxcbiAgICBvcmRlcjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuLW1zLWZsZXgtb3JkZXInLF0gfSwgeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydzdHlsZS5vcmRlcicsXSB9XSxcbiAgICBjb2xsYXBzZUFueTogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2RibGNsaWNrJyxdIH1dLFxuICAgIG9uRm9jdXNJbjogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2ZvY3VzaW4nLF0gfV0sXG4gICAgb25Gb2N1c091dDogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2ZvY3Vzb3V0JyxdIH1dLFxuICAgIG9uS2V5RG93bjogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2tleWRvd24nLCBbJyRldmVudCddLF0gfV1cbn07XG5cbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyQ0ID0gW1xuICAgIFNwbGl0dGVyQ29tcG9uZW50LFxuICAgIFNwbGl0dGVyUGFuZUNvbXBvbmVudFxuXTtcbmNvbnN0IGRlY2xhcmF0aW9ucyQ0ID0gW1xuICAgIFNwbGl0dGVyQmFyQ29tcG9uZW50LFxuICAgIC4uLmV4cG9ydGVkTW9kdWxlcyQ0XG5dO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgU3BsaXR0ZXIgY29tcG9uZW50LlxuICpcbiAqIFRoZSBtb2R1bGUgcmVnaXN0ZXJzOlxuICogLSBgU3BsaXR0ZXJDb21wb25lbnRgJm1kYXNoO1RoZSBgU3BsaXR0ZXJgIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYFNwbGl0dGVyUGFuZUNvbXBvbmVudGAmbWRhc2g7VGhlIGBTcGxpdHRlclBhbmVgIGNvbXBvbmVudCBjbGFzcy5cbiAqL1xuY2xhc3MgU3BsaXR0ZXJNb2R1bGUge1xufVxuU3BsaXR0ZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2RlY2xhcmF0aW9ucyQ0XSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbZXhwb3J0ZWRNb2R1bGVzJDRdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBEcmFnZ2FibGVNb2R1bGVcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBTdGVwcGVyU3RlcENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSwgbG9jYWxpemF0aW9uLCBuZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmlzU3RlcFZhbGlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNob3VsZENoZWNrVmFsaWRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3VicyA9IHRoaXMuc2VydmljZS5mb2N1c2VkU3RlcENoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzZWRTdGVwQ2hhbmdlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YnMuYWRkKHRoaXMuc2VydmljZS50cmlnZ2VyVmFsaWRhdGlvbi5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVWYWxpZGl0eUNoZWNrcygpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldCBlcnJvclN0ZXBDbGFzcygpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmlzU3RlcFZhbGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzU3RlcFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHN1Y2Nlc3NTdGVwQ2xhc3MoKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5pc1N0ZXBWYWxpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RlcFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlVmFsaWRpdHlDaGVja3MoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5jdXJyZW50ICYmICFjaGFuZ2VzLmN1cnJlbnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVmFsaWRpdHlDaGVja3MoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vicykge1xuICAgICAgICAgICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Gb2N1c2VkU3RlcENoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMuc2VydmljZS5mb2N1c2VkU3RlcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcExpbmsubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmZvY3VzKHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgdGFiSW5kZXhBdHRyKCkge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLnNlcnZpY2UuZm9jdXNlZFN0ZXAgfHwgdGhpcy5zZXJ2aWNlLmN1cnJlbnRTdGVwO1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gYWN0aXZlID8gMCA6IC0xO1xuICAgIH1cbiAgICBnZXQgaW5kaWNhdG9ySWNvbkNsYXNzZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0ZXAuaWNvbikge1xuICAgICAgICAgICAgcmV0dXJuIGBrLWljb24gay1pLSR7dGhpcy5zdGVwLmljb259YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGVwLmljb25DbGFzcykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuc3RlcC5pY29uQ2xhc3N9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja1ZhbGlkaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uSWNvbkNsYXNzZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNob3dJbmRpY2F0b3JJY29uKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja1ZhbGlkaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGVwLmljb24gfHwgdGhpcy5zdGVwLmljb25DbGFzcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgc2hvd0xhYmVsSWNvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tWYWxpZGl0eSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2xhYmVsJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RlcC5pY29uIHx8IHRoaXMuc3RlcC5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzaG93TGFiZWxUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnbGFiZWwnIHx8IHRoaXMudHlwZSA9PT0gJ2Z1bGwnO1xuICAgIH1cbiAgICBnZXQgdmFsaWRhdGlvbkljb25DbGFzc2VzKCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0ZXBWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzc0ljb24gPyBgJHt0aGlzLnN1Y2Nlc3NJY29ufWAgOiAnay1pY29uIGstaS1jaGVjayc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckljb24gPyBgJHt0aGlzLmVycm9ySWNvbn1gIDogJ2staWNvbiBrLWktd2FybmluZyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGluZGljYXRvclRleHQoKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnN0ZXAudGV4dDtcbiAgICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0IDogdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICAgIHVwZGF0ZVN0ZXBWYWxpZGl0eSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0ZXAuaXNWYWxpZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGVwLmlzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0ZXAuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RlcC5pc1ZhbGlkKHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBzaG93SW5kaWNhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnaW5kaWNhdG9yJyB8fCB0aGlzLnR5cGUgPT09ICdmdWxsJztcbiAgICB9XG4gICAgZ2V0IHNob3dMYWJlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2xhYmVsJyB8fCB0aGlzLnR5cGUgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcC5vcHRpb25hbDtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbmFsVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uLmdldCgnb3B0aW9uYWwnKTtcbiAgICB9XG4gICAgZ2V0IHRyYW5zaXRpb25EdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5vd25lci5hbmltYXRpb25EdXJhdGlvbjtcbiAgICB9XG4gICAgX3Nob3VsZENoZWNrVmFsaWRpdHkoKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5zdGVwLnZhbGlkYXRlKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0ZXAudmFsaWRhdGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0ZXAudmFsaWRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3RlcC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0ZXAudmFsaWRhdGUodGhpcy5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLnN0ZXAuaXNWYWxpZCkgJiYgdGhpcy5pbmRleCA8IHRoaXMuY3VycmVudDtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRpdHlDaGVja3MoKSB7XG4gICAgICAgIHRoaXMuaXNTdGVwVmFsaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2hvdWxkQ2hlY2tWYWxpZGl0eSA9IHRoaXMuX3Nob3VsZENoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tWYWxpZGl0eSkge1xuICAgICAgICAgICAgdGhpcy5pc1N0ZXBWYWxpZCA9IHRoaXMudXBkYXRlU3RlcFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5TdGVwcGVyU3RlcENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvU3RlcHBlclN0ZXBdJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YSBocmVmPScjJyBjbGFzcz0nay1zdGVwLWxpbmsnICNzdGVwTGlua1xuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPSd0YWJJbmRleEF0dHInXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09J3N0ZXAubGFiZWwnXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT0nc3RlcC5kaXNhYmxlZCdcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09J2luZGV4ID09PSBjdXJyZW50ID8gXCJzdGVwXCIgOiBudWxsJ1xuICAgICAgICAgICAgKGZvY3VzKT0nb25Gb2N1cygpJ1xuICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9J3N0ZXBUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09J3N0ZXBUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPSd7ICRpbXBsaWNpdDogc3RlcCwgaW5kZXg6IGluZGV4IH0nPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nIXN0ZXBUZW1wbGF0ZSc+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9J3Nob3dJbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSdrLXN0ZXAtaW5kaWNhdG9yJ1xuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj0ndHJ1ZSdcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb24tZHVyYXRpb24ubXNdPSd0cmFuc2l0aW9uRHVyYXRpb24nXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9J2luZGljYXRvclRlbXBsYXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPSdpbmRpY2F0b3JUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09J3sgJGltcGxpY2l0OiBzdGVwLCBpbmRleDogaW5kZXggfSc+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nIWluZGljYXRvclRlbXBsYXRlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPSdzaG93SW5kaWNhdG9ySWNvbicgY2xhc3M9J2stc3RlcC1pbmRpY2F0b3ItaWNvbicgW25nQ2xhc3NdPSdpbmRpY2F0b3JJY29uQ2xhc3Nlcyc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2stc3RlcC1pbmRpY2F0b3ItdGV4dCcgKm5nSWY9JyFzaG93SW5kaWNhdG9ySWNvbic+e3sgaW5kaWNhdG9yVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2stc3RlcC1sYWJlbCcgKm5nSWY9J3Nob3dMYWJlbCc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj0nbGFiZWxUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT0nbGFiZWxUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09J3sgJGltcGxpY2l0OiBzdGVwLCBpbmRleDogaW5kZXggfSc+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nIWxhYmVsVGVtcGxhdGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2stc3RlcC10ZXh0JyAqbmdJZj0nc2hvd0xhYmVsVGV4dCc+e3sgc3RlcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT0ndmFsaWRhdGlvbkljb25DbGFzc2VzJyAqbmdJZj0nc2hvd0xhYmVsSWNvbicgYXJpYS1oaWRkZW49J3RydWUnPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdrLXN0ZXAtbGFiZWwtb3B0aW9uYWwnICpuZ0lmPSdzdGVwLm9wdGlvbmFsJz4oe3tvcHRpb25hbFRleHR9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5TdGVwcGVyU3RlcENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IFN0ZXBwZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfVxuXTtcblN0ZXBwZXJTdGVwQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0ge1xuICAgIHN0ZXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIGluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBjdXJyZW50OiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICB0eXBlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzdWNjZXNzSWNvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZXJyb3JJY29uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpbmRpY2F0b3JUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbGFiZWxUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3RlcFRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzdGVwTGluazogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3N0ZXBMaW5rJywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLFxuICAgIGVycm9yU3RlcENsYXNzOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5rLXN0ZXAtZXJyb3InLF0gfV0sXG4gICAgc3VjY2Vzc1N0ZXBDbGFzczogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3Muay1zdGVwLXN1Y2Nlc3MnLF0gfV1cbn07XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBTVEVQUEVSX1NURVBfSU5ERVggPSAnZGF0YS1rZW5kby1zdGVwcGVyLWluZGV4JztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIFN0ZXBwZXJMaXN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlciwgbmdab25lLCBzZXJ2aWNlLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXREb21FdmVudHMoKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbVN1YnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tU3VicygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBtYXhTdGVwV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFN0ZXBEaW1lbnNpb24oJ3dpZHRoJyk7XG4gICAgfVxuICAgIGdldCBtYXhTdGVwSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhTdGVwRGltZW5zaW9uKCdoZWlnaHQnKTtcbiAgICB9XG4gICAgbWF4U3RlcERpbWVuc2lvbihkaW1lbnNpb24pIHtcbiAgICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gJ3dpZHRoJyAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGltZW5zaW9uID09PSAnaGVpZ2h0JyAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxMDAgLyB0aGlzLnN0ZXBzLmxlbmd0aDtcbiAgICB9XG4gICAgaW5pdERvbUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBjbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKG5hdGl2ZUVsZW1lbnQsICdjbGljaycsIHRoaXMuY2xpY2tIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgY29uc3Qga2V5ZG93blN1YnNjcmlwdGlvbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKG5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ2xhc3MoZS50YXJnZXQsICdrLXN0ZXAtbGluaycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5rZXlkb3duKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kb21TdWJzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWNrU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAga2V5ZG93blN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsaWNrSGFuZGxlcihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3Qgc3RlcElkeCA9IHRoaXMuZ2V0U3RlcEluZGV4KGUudGFyZ2V0KTtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcHNbc3RlcElkeF07XG4gICAgICAgIGlmICghc3RlcCB8fCBzdGVwLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXBJZHggPT09IHRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5mb2N1cyhzdGVwSWR4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lYXIgJiYgdGhpcy5zZXJ2aWNlLmlzUHJldk9yTmV4dFN0ZXAoc3RlcElkeCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXJ2aWNlLm9uQWN0aXZhdGUoc3RlcElkeCwgZSk7XG4gICAgfVxuICAgIGdldFN0ZXBJbmRleCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGNsb3Nlc3RJdGVtKHRhcmdldCwgU1RFUFBFUl9TVEVQX0lOREVYLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbUluZGV4KHN0ZXAsIFNURVBQRVJfU1RFUF9JTkRFWCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5TdGVwcGVyTGlzdENvbXBvbmVudC5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvU3RlcHBlckxpc3RdJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj0nbGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpZHggPSBpbmRleCc+XG4gICAgICAgICAgICA8bGkga2VuZG9TdGVwcGVyU3RlcFxuICAgICAgICAgICAgICAgIFthdHRyLiR7U1RFUFBFUl9TVEVQX0lOREVYfV09J2lkeCdcbiAgICAgICAgICAgICAgICBbdHlwZV09J3N0ZXBUeXBlJ1xuICAgICAgICAgICAgICAgIFtzdGVwXT0nc3RlcCdcbiAgICAgICAgICAgICAgICBbaW5kZXhdPSdpZHgnXG4gICAgICAgICAgICAgICAgW2N1cnJlbnRdPSdjdXJyZW50U3RlcCdcbiAgICAgICAgICAgICAgICBbc3VjY2Vzc0ljb25dPSdzdWNjZXNzSWNvbidcbiAgICAgICAgICAgICAgICBbZXJyb3JJY29uXT0nZXJyb3JJY29uJ1xuICAgICAgICAgICAgICAgIFtpbmRpY2F0b3JUZW1wbGF0ZV09J2luZGljYXRvclRlbXBsYXRlJ1xuICAgICAgICAgICAgICAgIFtsYWJlbFRlbXBsYXRlXT0nbGFiZWxUZW1wbGF0ZSdcbiAgICAgICAgICAgICAgICBbc3RlcFRlbXBsYXRlXT0nc3RlcFRlbXBsYXRlJ1xuICAgICAgICAgICAgICAgIGNsYXNzPSdrLXN0ZXAnXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstc3RlcC1maXJzdF09J2lkeCA9PT0gMCdcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGVwLWxhc3RdPSdpZHggPT09IHN0ZXBzLmxlbmd0aCAtIDEnXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstc3RlcC1kb25lXT0naWR4IDwgY3VycmVudFN0ZXAnXG4gICAgICAgICAgICAgICAgW2NsYXNzLmstc3RlcC1jdXJyZW50XT0naWR4ID09PSBjdXJyZW50U3RlcCdcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGVwLW9wdGlvbmFsXT0nc3RlcC5vcHRpb25hbCdcbiAgICAgICAgICAgICAgICBbY2xhc3Muay1zdGVwLWRpc2FibGVkXT0nc3RlcC5kaXNhYmxlZCdcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109J3N0ZXAuY3NzQ2xhc3MnXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPSdzdGVwLmNzc1N0eWxlJ1xuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGguJV0gPSAnbWF4U3RlcFdpZHRoJ1xuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LiVdID0gJ21heFN0ZXBIZWlnaHQnXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cblN0ZXBwZXJMaXN0Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sXG4gICAgeyB0eXBlOiBOZ1pvbmUgfSxcbiAgICB7IHR5cGU6IFN0ZXBwZXJTZXJ2aWNlIH0sXG4gICAgeyB0eXBlOiBFbGVtZW50UmVmIH1cbl07XG5TdGVwcGVyTGlzdENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICBsaW5lYXI6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXBUeXBlOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBvcmllbnRhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgY3VycmVudFN0ZXA6IFt7IHR5cGU6IElucHV0IH1dLFxuICAgIHN0ZXBzOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBzdWNjZXNzSWNvbjogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgZXJyb3JJY29uOiBbeyB0eXBlOiBJbnB1dCB9XSxcbiAgICBpbmRpY2F0b3JUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgbGFiZWxUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sXG4gICAgc3RlcFRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XVxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgQ29tcG9uZW50TWVzc2FnZXMge1xufVxuTWVzc2FnZXMucHJvcERlY29yYXRvcnMgPSB7XG4gICAgb3B0aW9uYWw6IFt7IHR5cGU6IElucHV0IH1dXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbn1cbkxvY2FsaXplZE1lc3NhZ2VzRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBEaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9jYWxpemVkTWVzc2FnZXNEaXJlY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBgXG4gICAgICBba2VuZG9TdGVwcGVyTG9jYWxpemVkTWVzc2FnZXNdXG4gICAgYFxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5Mb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtcbiAgICB7IHR5cGU6IExvY2FsaXphdGlvblNlcnZpY2UgfVxuXTtcblxuLyoqXG4gKiBDdXN0b20gY29tcG9uZW50IG1lc3NhZ2VzIG92ZXJyaWRlIGRlZmF1bHQgY29tcG9uZW50IG1lc3NhZ2VzXG4gKiAoW3NlZSBleGFtcGxlXSh7JSBzbHVnIHJ0bF9sYXlvdXQgJX0pKS5cbiAqL1xuY2xhc3MgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQgZXh0ZW5kcyBNZXNzYWdlcyB7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbkN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbXG4gICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAna2VuZG8tc3RlcHBlci1tZXNzYWdlcycsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBgXG4gICAgICAgICAgICB9LF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbkN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW1xuICAgIHsgdHlwZTogTG9jYWxpemF0aW9uU2VydmljZSB9XG5dO1xuXG5jb25zdCB0ZW1wbGF0ZURpcmVjdGl2ZXMkMSA9IFtcbiAgICBTdGVwcGVyU3RlcFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIFN0ZXBwZXJMYWJlbFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIFN0ZXBwZXJJbmRpY2F0b3JUZW1wbGF0ZURpcmVjdGl2ZVxuXTtcbmNvbnN0IGV4cG9ydGVkTW9kdWxlcyQ1ID0gW1xuICAgIFN0ZXBwZXJDb21wb25lbnQsXG4gICAgQ3VzdG9tTWVzc2FnZXNDb21wb25lbnQsXG4gICAgLi4udGVtcGxhdGVEaXJlY3RpdmVzJDFcbl07XG5jb25zdCBkZWNsYXJhdGlvbnMkNSA9IFtcbiAgICBTdGVwcGVyU3RlcENvbXBvbmVudCxcbiAgICBTdGVwcGVyTGlzdENvbXBvbmVudCxcbiAgICBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSxcbiAgICAuLi5leHBvcnRlZE1vZHVsZXMkNVxuXTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgW05nTW9kdWxlXSh7eyBzaXRlLmRhdGEudXJscy5hbmd1bGFyWyduZ21vZHVsZWFwaSddIH19KVxuICogZGVmaW5pdGlvbiBmb3IgdGhlIFN0ZXBwZXIgY29tcG9uZW50LlxuICovXG5jbGFzcyBTdGVwcGVyTW9kdWxlIHtcbn1cblN0ZXBwZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW2RlY2xhcmF0aW9ucyQ1XSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBbZXhwb3J0ZWRNb2R1bGVzJDVdLFxuICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFByb2dyZXNzQmFyTW9kdWxlXVxuICAgICAgICAgICAgfSxdIH0sXG5dO1xuXG5jb25zdCBleHBvcnRlZE1vZHVsZXMkNiA9IFtcbiAgICBUYWJTdHJpcENvbXBvbmVudCxcbiAgICBUYWJTdHJpcFRhYkNvbXBvbmVudCxcbiAgICBUYWJDb250ZW50RGlyZWN0aXZlLFxuICAgIFRhYlRpdGxlRGlyZWN0aXZlXG5dO1xuY29uc3QgZGVjbGFyYXRpb25zJDYgPSBbXG4gICAgLi4uZXhwb3J0ZWRNb2R1bGVzJDZcbl07XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFtOZ01vZHVsZV0oe3sgc2l0ZS5kYXRhLnVybHMuYW5ndWxhclsnbmdtb2R1bGVhcGknXSB9fSlcbiAqIGRlZmluaXRpb24gZm9yIHRoZSBUYWJTdHJpcCBjb21wb25lbnQuXG4gKlxuICogVGhlIG1vZHVsZSByZWdpc3RlcnM6XG4gKiAtIGBUYWJTdHJpcENvbXBvbmVudGAmbWRhc2g7VGhlIGBUYWJTdHJpcGAgY29tcG9uZW50IGNsYXNzLlxuICogLSBgVGFiU3RyaXBUYWJDb21wb25lbnRgJm1kYXNoO1RoZSBgVGFiU3RyaXBUYWJgIGNvbXBvbmVudCBjbGFzcy5cbiAqIC0gYFRhYkNvbnRlbnREaXJlY3RpdmVgJm1kYXNoO1RoZSB0YWIgY29udGVudCBkaXJlY3RpdmUgdXNlZCBvbiB0aGUgYDxuZy10ZW1wbGF0ZT5gIHRhZy5cbiAqIC0gYFRhYlRpdGxlRGlyZWN0aXZlYCZtZGFzaDtUaGUgdGFiIHRpdGxlIGRpcmVjdGl2ZSB1c2VkIG9uIHRoZSBgPG5nLXRlbXBsYXRlPmAgdGFnLlxuICovXG5jbGFzcyBUYWJTdHJpcE1vZHVsZSB7XG59XG5UYWJTdHJpcE1vZHVsZS5kZWNvcmF0b3JzID0gW1xuICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbZGVjbGFyYXRpb25zJDZdLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtleHBvcnRlZE1vZHVsZXMkNl0sXG4gICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAgICAgICAgICAgIH0sXSB9LFxuXTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBbTmdNb2R1bGVdKHt7IHNpdGUuZGF0YS51cmxzLmFuZ3VsYXJbJ25nbW9kdWxlYXBpJ10gfX0pXG4gKiBkZWZpbml0aW9uIGZvciB0aGUgTGF5b3V0IGNvbXBvbmVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0cy1uby1ydW5cbiAqIC8vIEltcG9ydCB0aGUgTGF5b3V0IG1vZHVsZVxuICogaW1wb3J0IHsgTGF5b3V0TW9kdWxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItbGF5b3V0JztcbiAqXG4gKiAvLyBUaGUgYnJvd3NlciBwbGF0Zm9ybSB3aXRoIGEgY29tcGlsZXJcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICpcbiAqIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKlxuICogLy8gSW1wb3J0IHRoZSBhcHAgY29tcG9uZW50XG4gKiBpbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2FwcC5jb21wb25lbnQnO1xuICpcbiAqIC8vIERlZmluZSB0aGUgYXBwIG1vZHVsZVxuICogX0BOZ01vZHVsZSh7XG4gKiAgICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSwgLy8gZGVjbGFyZSBhcHAgY29tcG9uZW50XG4gKiAgICAgaW1wb3J0czogICAgICBbQnJvd3Nlck1vZHVsZSwgTGF5b3V0TW9kdWxlXSwgLy8gaW1wb3J0IExheW91dCBtb2R1bGVcbiAqICAgICBib290c3RyYXA6ICAgIFtBcHBDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICpcbiAqIC8vIENvbXBpbGUgYW5kIGxhdW5jaCB0aGUgbW9kdWxlXG4gKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIExheW91dE1vZHVsZSB7XG59XG5MYXlvdXRNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe1xuICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgICAgICAgICAgICAgQXZhdGFyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBDYXJkTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBEcmF3ZXJNb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIFBhbmVsQmFyTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBTcGxpdHRlck1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgU3RlcHBlck1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgVGFiU3RyaXBNb2R1bGVcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LF0gfSxcbl07XG5cbi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0IHsgUHJldmVudGFibGVFdmVudCwgRHJhd2VyU2VydmljZSwgRHJhd2VySXRlbUNvbXBvbmVudCwgRHJhd2VyTGlzdENvbXBvbmVudCwgRFJBV0VSX0lURU1fSU5ERVgsIEN1c3RvbU1lc3NhZ2VzQ29tcG9uZW50LCBMb2NhbGl6ZWRNZXNzYWdlc0RpcmVjdGl2ZSwgTWVzc2FnZXMsIFBhbmVsQmFyU2VydmljZSwgU3BsaXR0ZXJCYXJDb21wb25lbnQsIFNwbGl0dGVyU2VydmljZSwgU3RlcHBlckxpc3RDb21wb25lbnQsIFNURVBQRVJfU1RFUF9JTkRFWCwgU3RlcHBlclN0ZXBDb21wb25lbnQsIFN0ZXBwZXJTZXJ2aWNlLCBQYW5lbEJhckNvbXBvbmVudCwgUGFuZWxCYXJJdGVtQ29tcG9uZW50LCBQYW5lbEJhckNvbnRlbnREaXJlY3RpdmUsIFBhbmVsQmFySXRlbVRlbXBsYXRlRGlyZWN0aXZlLCBQYW5lbEJhckl0ZW1UaXRsZURpcmVjdGl2ZSwgUGFuZWxCYXJFeHBhbmRNb2RlLCBTcGxpdHRlckNvbXBvbmVudCwgU3BsaXR0ZXJQYW5lQ29tcG9uZW50LCBUYWJTdHJpcENvbXBvbmVudCwgVGFiU3RyaXBUYWJDb21wb25lbnQsIFRhYkNvbnRlbnREaXJlY3RpdmUsIFRhYlRpdGxlRGlyZWN0aXZlLCBTZWxlY3RFdmVudCwgRHJhd2VyQ29tcG9uZW50LCBEcmF3ZXJDb250YWluZXJDb21wb25lbnQsIERyYXdlckNvbnRlbnRDb21wb25lbnQsIERyYXdlclNlbGVjdEV2ZW50LCBTdGVwcGVyQ29tcG9uZW50LCBTdGVwcGVyQWN0aXZhdGVFdmVudCwgQXZhdGFyQ29tcG9uZW50LCBDYXJkQ29tcG9uZW50LCBDYXJkSGVhZGVyQ29tcG9uZW50LCBDYXJkQm9keUNvbXBvbmVudCwgQ2FyZEZvb3RlckNvbXBvbmVudCwgQ2FyZEFjdGlvbnNDb21wb25lbnQsIENhcmRTZXBhcmF0b3JEaXJlY3RpdmUsIENhcmRUaXRsZURpcmVjdGl2ZSwgQ2FyZFN1YnRpdGxlRGlyZWN0aXZlLCBDYXJkTWVkaWFEaXJlY3RpdmUsIENhcmRBY3Rpb24sIEF2YXRhck1vZHVsZSwgQ2FyZE1vZHVsZSwgRHJhd2VyTW9kdWxlLCBMYXlvdXRNb2R1bGUsIFBhbmVsQmFyTW9kdWxlLCBTcGxpdHRlck1vZHVsZSwgU3RlcHBlck1vZHVsZSwgVGFiU3RyaXBNb2R1bGUsIERyYXdlclRlbXBsYXRlRGlyZWN0aXZlLCBEcmF3ZXJJdGVtVGVtcGxhdGVEaXJlY3RpdmUsIERyYXdlckhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLCBEcmF3ZXJGb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSwgU3RlcHBlckluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLCBTdGVwcGVyTGFiZWxUZW1wbGF0ZURpcmVjdGl2ZSwgU3RlcHBlclN0ZXBUZW1wbGF0ZURpcmVjdGl2ZSB9O1xuIl19","
    \n Customer Health Alerts\n \n
    \n\n
    \n \n
    \n

    Customer Health Alerts are generated to prompt Ambassadors to proactively engage the client regarding Alinity and Architect product lines. Alerts are generated when an instrument falls below the instrument’s normal statistical range in the past 24 hours or meets a defined threshold indicating an issue. New alerts are highlighted in red and indicated as 'New'. Alerts are coded as Low, Medium, or High priority. Alerts will clear from the table after 3 to 7 days, depending on the alert. There are seven alerts:

    \n

    Daily System Maintenance: Triggers from 4 or more failures of daily maintenance in the past 24 hours. Available for Alinity and Architect. Priority = High; Retention = 3 days

    \n

    AbbottLink Connection: Triggers if an instrument has not pinged AbbottLink or logged a test in the past 5 days. Available for Alinity and Architect. Priority = High; Retention = 3 days

    \n

    Test Completion Rate: Triggers when the percentage of tests (specimens, calibrators, and controls) completing without error in the past 24 hours drops below the normal statistical range of that instrument over the past 60 days. Available for Alinity and Architect. Priority = High; Retention = 3 days

    \n

    Controls Out of Range: Triggers when the percentage of controls out of range in the past 24 hours exceeds the normal statistical range of that instrument compared to the previous 60 days. Control range must be configured on the instrument for this alert to function. Available for Alinity and Architect. Priority = High; Retention = 3 days

    \n

    Hard Stops: A \"hard stop\" is defined as the event of an instrument switching directly from Running (or Processing) state to the Stopped state. This indicates that an instrument issue led to an abrupt halt of testing on an instrument. The hard stop alert is available only for Alinity product lines. The Hard Stops alert triggers when the rate of hard stops in the past 24 hours exceeds the normal statistical range of that instrument compared to the previous 60 days. When data is available, the Hard Stop alert will identify the root cause of the instrument's most recent hard stop. Hard stop root cause data is only available for some Alinity i instruments and provides the high level description of root cause provided by instrument software. Priority = Medium; Retention = 3 days

    \n

    Repeat Tests: A \"repeat test\" is a specimen that produced a result two or more times for the same assay and on the same instrument, indicating that the customer chose to rerun a specimen that already generated a result. The Repeat Tests alert triggers when the percentage of repeat tests in the past 24 hours exceeds the normal statistical range of that instrument compared to the previous 60 days. Available for Alinity and Architect. Priority = Medium; Retention = 3 days

    \n

    Total Test Volume: Triggers when an instrument’s weekly test volume from the most recent complete week falls below the normal statistical range of weekly test volumes over the past 6 months. Available for Alinity and Architect. Priority = Low; Retention = 7 days

    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref].value}}
    \n {{dataItem.customerNum.value}}\n
    \n \n {{dataItem[col.ref].value}}\n \n \n {{dataItem[col.ref].value}}\n \n
    \n \n
    \n \n \n \n \n \n \n
    \n
    \n\n \n\n","import { Component, OnInit, OnDestroy, Output, EventEmitter, Renderer2 } from '@angular/core';\nimport {GridComponent} from '../../details/grid.component';\nimport {Location} from '@angular/common';\nimport {CtServiceService} from '../ct-service.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {faInfoCircle} from '@fortawesome/free-solid-svg-icons';\nimport {environment} from '../../../environments/environment';\n\ninterface CustomerHealthAlertGridRow {\n uniqueCustomerKey: string;\n customerName: string;\n countryName: string;\n area: string;\n alertPriority: string;\n alertMessage: string;\n alertAge: string;\n alertDateVal: string;\n alertAction: string;\n alertStyle: string;\n}\n\n@Component({\n selector: 'app-customer-health-alerts-grid',\n templateUrl: './customer-health-alerts-grid.component.html',\n styleUrls: ['./customer-health-alerts-grid.component.scss']\n})\nexport class CustomerHealthAlertsGridComponent extends GridComponent implements OnInit, OnDestroy {\n apiUrl = 'cua/customer_health_alerts';\n apiData = null;\n state = null;\n customerId = null;\n tooltips = {\n alertHelp: false\n };\n opened = false;\n faInfoCircle = faInfoCircle;\n @Output() onUpdate = new EventEmitter();\n refreshIndexes = [];\n requestHandler;\n stateChangeHandler;\n showContextMenu = false;\n offset: any;\n selectedSn;\n selectedPl;\n gsrUrl = environment.gsrUrl;\n private documentClickSubscription: any;\n\n dataCols = [\n {ref: 'uniqueCustomerKey', description: 'CustomerKey', width: 80, hidden: true, filterable: true, export: false},\n {ref: 'alertAge', description: 'Age', width: 80, hidden: false, filterable: false, export: true},\n {ref: 'alertPriority', description: 'Priority', width: 120, hidden: false, filterable: false, export: true},\n {ref: 'customerName', description: 'Customer', width: 150, hidden: false, filterable: true, export: true},\n {ref: 'customerNum', description: 'Customer #', width: 10, hidden: true, filterable: false, export: true},\n {ref: 'alertDateVal', description: 'Date/Time (UTC)', width: 120, hidden: false, filterable: false, export: true},\n {ref: 'alertMessage', description: 'Alert', width: 200, hidden: false, filterable: true, export: true},\n {ref: 'sn', description: 'SN', width: 100, hidden: false, filterable: true, export: true},\n {ref: 'pl', description: 'PL', width: 100, hidden: true, filterable: false, export: true},\n // {ref: 'alertAction', description: 'Action', width: '150', hidden: false, filterable: true},\n ];\n dataRows = [];\n\n constructor(\n private apiService: ApiService,\n private refreshHandler: RefreshHandlerService,\n private personaService: PersonaService,\n private ctService: CtServiceService,\n private renderer: Renderer2\n ) {\n super();\n this.onCellClick = this.onCellClick.bind(this);\n this.documentClickSubscription = this.renderer.listen('document', 'click', () => {\n this.showContextMenu = false;\n });\n }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n // console.log('refresh params', requestHandler.getRelativeParams(this.apiUrl));\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest(this.apiUrl);\n },\n this.requestHandler.getRelativeParams(this.apiUrl)\n ));\n\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n // format dataRows for kendo component\n this.dataRows = [];\n this.onUpdate.emit(this.apiData.data.length);\n for (let i = 0; i < this.apiData.data.length; i++) {\n const apiDataRow: CustomerHealthAlertGridRow = this.apiData.data[i];\n const dataRow = {};\n for (const dataColConfig of this.dataCols) {\n let bgColorStyle = '';\n let textColor = 'black';\n if (dataColConfig.ref === 'alertPriority') {\n bgColorStyle = apiDataRow.alertStyle;\n }\n if (bgColorStyle === 'red') {\n bgColorStyle = '#FF6347';\n textColor = 'white';\n }\n // if (dataColConfig.ref )\n dataRow[dataColConfig.ref] = {\n value: apiDataRow[dataColConfig.ref],\n bgcolor: bgColorStyle,\n color: textColor\n };\n }\n this.dataRows.push(dataRow);\n }\n this.updateGrid();\n this.updateCustomerIdSelection();\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.updateGrid();\n\n /*this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.updateCustomerIdSelection();\n },\n ['ct_persona_type', 'ct_persona_value']\n ));*/\n }\n\n ngOnDestroy(): void {\n for (const index of this.refreshIndexes) {\n this.refreshHandler.cancelRefreshEvent(index);\n }\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n\n inArray(array, index) {\n return (index in array);\n }\n\n updateCustomerIdSelection() {\n const level1PersonaChoice = this.personaService.getLevel1Choice();\n if (level1PersonaChoice.type === 'Customer') {\n this.customerId = level1PersonaChoice.value;\n this.ctService.setCustomerId(level1PersonaChoice.value, level1PersonaChoice.label);\n }\n }\n\n selectCustomer(dataItem) {\n this.customerId = dataItem.uniqueCustomerKey.value;\n const customerName = dataItem.customerName.value;\n this.personaService.setCustomerOverride(true);\n this.personaService.setPersonaOption(PersonaTypes.Customer, this.customerId, customerName);\n this.ctService.setCustomerId(this.customerId, customerName);\n }\n\n toggleTooltip(type, changeTo = null) {\n this.opened = true;\n if (changeTo === null) {\n this.tooltips[type] = !this.tooltips[type];\n } else {\n this.tooltips[type] = changeTo;\n }\n if (this.tooltips[type]) {\n for (const type1 in this.tooltips) {\n if (type1 !== type) {\n this.tooltips[type1] = false;\n }\n }\n }\n }\n\n public close() {\n this.opened = false;\n }\n\n public onCellClick({dataItem, column, type, originalEvent}): void {\n if (type === 'click' && column.field === 'sn.value') {\n originalEvent.preventDefault();\n this.showContextMenu = true;\n this.selectedPl = dataItem.pl.value;\n this.selectedSn = dataItem.sn.value;\n this.offset = { left: originalEvent.pageX, top: originalEvent.pageY };\n } else {\n this.showContextMenu = false;\n }\n }\n}\n","w
    \n Customer Health Metrics\n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n

    Overall health is a customer-level aggregate score\n to indicate the operational health of a customer site.\n The Overall Health Score is computed by the AlwaysOn Health algorithm and incorporates\n instrument operational and customer satisfaction metrics.\n The algorithm scores each customer SN on each instrument metric in relation to other\n customer's SNs in the same geographic area. Scores are then rolled up at the customer\n level and weighted together with NPS data (if available) to arrive at an Overall health\n score. Weightings: tNPS (50%), test volume (10%), reactive tickets (10%),\n test completion (10%), hard stops (5%), controls out of range (5%), repeat tests (5%),\n daily maintenance failures (5%). Where data for a metric is unavailable,\n weightings are uniformly redistributed between available metrics.\n Color indicates customer health as\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n If Overall Health cannot be calculated due to insufficient data,\n no score is provided and coloring is set to gray.\n

    \n \n \n \n \n \n \n \n \n \n
    \n
    \n

    Survey responses to the Likelihood to Recommend question\n (\"On a scale of 0-10, how likely are you to recommend Abbott to a\n colleague or friend?\") on the Transactional NPS (tNPS) survey for\n a customer site over the past 1 year. Scores are averaged for a customer site\n if data from more than one interview is available. Color indicates a customer\n is a\n promoter (green),\n passive (yellow), or\n detractor (red)

    \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n

    Number of customer IA instruments. For Alinity, this is the number of IA serial numbers\n that are test-of-record.

    \n
    \n
    \n

    Number of customer CC instruments. For Alinity, this is the number of CC serial numbers\n that are test-of-record.

    \n
    \n
    \n

    The average weekly test volume for all customer IA instruments. Color coding indicates\n how a customer’s level of IA test volume was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., an IA test volume value color coded as good for one customer\n may be only satisfactory for another).

    \n
    \n
    \n

    The average weekly test volume for all customer CC instruments. Color coding indicates how\n a customer’s level of CC test volume was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., a CC test volume value color coded as good for one customer\n may be only satisfactory for another).

    \n
    \n
    \n

    Average weekly percentage of completed tests for all of a customer’s instruments\n (aggregates both IA and CC product lines). Color coding indicates how a customer’s level\n of test completion was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable to\n other customers (e.g., a test completion value color coded as good for one customer may be\n only satisfactory for another).

    \n
    \n
    \n

    Average weekly number of hard stops across all of a customer's Alinity instruments\n (aggregates both IA and CC product lines). Color coding indicates how the number\n of hard stops at a customer site was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (orange),\n needs improvement (yellow), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., a hard stop value color coded as good for one customer may be only\n satisfactory for another). The Hard Stop metric is available only for Alinity.

    \n
    \n
    \n

    Average weekly percentage of controls that fall outside of customer-defined boundaries\n (includes both IA and CC product lines). Color coding indicates how a customer’s level\n of test completion was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of instruments,\n color code scoring is unique to each customer site and is not comparable to other customers\n (e.g., a controls out of range value color coded as good for one customer may be only\n satisfactory for another).

    \n
    \n
    \n

    Average weekly percentage of repeat tests across all of a customer's instruments\n (includes both IA and CC product lines). Repeat tests are specimens that produced\n a result two or more times for the same assay, on the same instrument, indicating\n that the customer chose to rerun a specimen that already generated a result.\n Color coding indicates how a customer’s level of test completion was scored by the\n AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations\n of instruments, color code scoring is unique to each customer site and is not\n comparable to other customers (e.g., a controls out of range value color coded as\n good for one customer may be only satisfactory for another).

    \n
    \n
    \n

    Number of currently open tickets for a given customer (excluding TSBs).

    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{column.title}}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref].value}}\n \n \n {{dataItem[col.ref].value}}
    \n {{dataItem.acctEntityName.value}}\n
    \n \n {{dataItem[col.ref].value|percent}}\n \n \n {{dataItem[col.ref].value|percent:'1.1-1'}}\n \n \n {{dataItem[col.ref].value|percent:'1.2-2'}}\n \n \n {{dataItem[col.ref].value|number:'1.2-2'}}\n \n \n {{dataItem[col.ref].value|number:'1.2-2'}}\n \n \n {{dataItem[col.ref].value}}\n \n
    \n
    \n \n
    \n \n \n \n \n \n \n
    \n
    ","import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport {GridComponent} from '../../details/grid.component';\nimport {Location} from '@angular/common';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {PersonaService} from '../../api/persona.service';\nimport {CtServiceService} from '../ct-service.service';\nimport {faInfoCircle} from '@fortawesome/free-solid-svg-icons';\n\ninterface CustomerHealthGridRow {\n // styles are string of color or null\n countryCode: string;\n customerNum: string;\n customerName: string;\n uniqueCustomerKey: string;\n countryName: string;\n area: string;\n overAllHealthScore: number;\n overAllHealthScoreStyle: string;\n tnpsRawScore: number;\n tnpsRawScoreStyle: string;\n snCountIA: number;\n snCountCC: number;\n testVolumeIA: number;\n testVolumeIAScoreStyle: string;\n testVolumeCC: number;\n testVolumeCCScoreStyle: string;\n testCompletionPercent: number;\n testCompletionPercentScoreStyle: string;\n hardStopCount: number;\n hardStopCountScoreStyle: string;\n hardStopScaled: number;\n qcFailPercent: number;\n qcFailPercentScoreStyle: string;\n retestPercent: number;\n retestPercentScoreStyle: string;\n openTicketCount: number;\n}\n\n@Component({\n selector: 'app-customer-health-grid',\n templateUrl: './customer-health-grid.component.html',\n styleUrls: ['./customer-health-grid.component.scss']\n})\nexport class CustomerHealthGridComponent extends GridComponent implements OnInit, OnDestroy {\n rowFormatting = [];\n filterOnChildProperty = 'value';\n apiData = null;\n state = null;\n colorLegend = null;\n npsLegend = null;\n dataCols = [];\n columnSets = {\n type: 'all',\n ia_cc: 'all',\n alinity_architect: 'all'\n };\n faInfoCircle = faInfoCircle;\n tooltips = {\n overAllHealthScore: false,\n tnpsRawScore: false,\n snCountIA: false,\n snCountCC: false,\n testVolumeIA: false,\n testVolumeCC: false,\n testCompletionPercent: false,\n hardStopCount: false,\n qcFailPercent: false,\n retestPercent: false,\n openTicketCount: false\n };\n helpWindowTitle = '';\n opened = false;\n helpActions = [{ text: 'Previous' }, { text: 'Next', primary: true }];\n actionsLayout = \"normal\";\n customerId = null;\n // {ref: 'test', description: 'Customer Name', width: '230'},\n // {ref: 'test1', description: 'Overall Health', width: '120'},\n // {ref: 'test2', description: 'tNPS Raw', width: '120'},\n // {ref: 'test3', description: 'TOR IA', width: '120'},\n // {ref: 'test4', description: 'TOR CC', width: '120'},\n // {ref: 'test5', description: 'Total Test Volume IA', width: '150'},\n // {ref: 'test6', description: 'Total Test Volume CC', width: '150'},\n // {ref: 'test7', description: 'Test Completion', width: '120'},\n // {ref: 'test8', description: 'Hard Stops', width: '120'},\n // {ref: 'test9', description: 'Controls Out of Range', width: '150'},\n // {ref: 'test9', description: 'Repeat Test', width: '120'},\n // {ref: 'test9', description: 'Open Tickets', width: '120'}\n // ];\n dataRows = [];\n apiUrl = 'cua/customer_health_metrics';\n showOnlySingleCustomer = false;\n @Output() onUpdate = new EventEmitter();\n refreshIndexes = [];\n customerScopeChangeEventIndex;\n customerChangeEventIndex;\n requestHandler;\n stateChangeHandler;\n\n constructor(\n private apiService: ApiService,\n private refreshHandler: RefreshHandlerService,\n private personaService: PersonaService,\n private ctService: CtServiceService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n // console.log('refresh params', requestHandler.getRelativeParams(this.apiUrl));\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest(this.apiUrl);\n },\n this.requestHandler.getRelativeParams(this.apiUrl)\n ));\n // console.log('relparams', requestHandler.getRelativeParams(this.apiUrl));\n\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n this.colorLegend = {\n title: {label: '', bgcolor: '', color: 'black', format: 'num1'},\n items: []\n };\n for (let i = 0; i < this.apiData.legends['Overall Scores'].length; i++) {\n const apiLegendItem = this.apiData.legends['Overall Scores'][i];\n let textcolor = 'black';\n if (apiLegendItem.color === 'red') {\n textcolor = 'white';\n }\n const legendItem = {\n label: Math.floor(apiLegendItem.minVal * 100) + '-' + Math.floor(apiLegendItem.maxVal * 100) + '%',\n count: 0,\n pct: apiLegendItem.maxVal * 100,\n bgcolor: apiLegendItem.color,\n color: textcolor\n };\n this.colorLegend.items.push(legendItem);\n if (this.colorLegend.title.label === '') {\n this.colorLegend.title.label = apiLegendItem.legendTitle;\n }\n }\n this.npsLegend = {\n title: {label: '', bgcolor: '', color: 'black', format: 'num1'},\n items: []\n };\n for (let i = 0; i < this.apiData.legends['tNPS Scores'].length; i++) {\n const apiLegendItem = this.apiData.legends['tNPS Scores'][i];\n const legendItem = {\n label: Math.floor(apiLegendItem.minVal) + '-' + Math.floor(apiLegendItem.maxVal),\n count: 0,\n pct: apiLegendItem.maxVal,\n bgcolor: apiLegendItem.color,\n color: 'black'\n };\n this.npsLegend.items.push(legendItem);\n if (this.npsLegend.title.label === '') {\n this.npsLegend.title.label = apiLegendItem.legendTitle;\n }\n }\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n this.dataCols = [];\n this.dataCols.push({ref: 'uniqueCustomerKey', description: '', width: 100, hidden: true, filterable: false});\n this.dataCols.push({ref: 'acctEntityName', description: 'Account', width: 100, hidden: true, filterable: false, export: true});\n this.dataCols.push({ref: 'customerName', description: 'Customer Name', width: 300, hidden: false, filterable: true, export: true});\n this.dataCols.push({ref: 'customerNum', description: 'Customer Number', width: 100, hidden: false, filterable: true, export: true});\n this.dataCols.push({ref: 'countryName', description: 'Location', width: 80, hidden: false, filterable: true, export: true});\n this.dataCols.push({ref: 'overAllHealthScore', description: 'Alinity or ARCHITECT Overall Health', width: 80, hidden: false, filterable: false, export: false});\n this.dataCols.push({ref: 'overAllHealthScoreExcelPercent', description: 'Alinity or ARCHITECT Overall Health', width: 80, hidden: true, filterable: false, export: true});\n this.dataCols.push({ref: 'tnpsRawScore', description: 'tNPS Rating', width: 80, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'snCountIA', description: '# S/N\\'s IA', width: 80, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'snCountCC', description: '# S/N\\'s CC', width: 80, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'testVolumeIA', description: 'Average Test Volume IA', width: 100, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'testVolumeCC', description: 'Average Test Volume CC', width: 100, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'testCompletionPercent', description: 'Test Completion Rate', width: 100, hidden: false, filterable: false, export: false});\n this.dataCols.push({ref: 'testCompletionPercentExcelPercent', description: 'Test Completion Rate', width: 100, hidden: true, filterable: false, export: true});\n this.dataCols.push({ref: 'hardStopScaled', description: 'HS/10000', width: 100, hidden: false, filterable: false, export: true});\n this.dataCols.push({ref: 'qcFailPercent', description: 'Controls Out of Range %', width: 100, hidden: false, filterable: false, export: false});\n this.dataCols.push({ref: 'qcFailPercentExcelPercent', description: 'Controls Out of Range %', width: 100, hidden: true, filterable: false, export: true});\n this.dataCols.push({ref: 'retestPercent', description: 'Repeat Test %', width: 80, hidden: false, filterable: false, export: false});\n this.dataCols.push({ref: 'retestPercentExcelPercent', description: 'Repeat Test %', width: 80, hidden: true, filterable: false, export: true});\n this.dataCols.push({ref: 'openTicketCount', description: 'Open Tickets', width: 80, hidden: false, filterable: false, export: true});\n\n // for (const colKey in this.apiData.data.heading_section) {\n // if (this.apiData.data.heading_section.hasOwnProperty(colKey)) {\n // const col = this.apiData.data.heading_section[colKey];\n //\n // // col.format\n // // col.hidden_field\n // // col.purpose\n // // col.visible_by_default\n // }\n // }\n // format dataRows for kendo component\n this.dataRows = [];\n this.onUpdate.emit(this.apiData.data.length);\n for (let i = 0; i < this.apiData.data.length; i++) {\n const apiDataRow: CustomerHealthGridRow = this.apiData.data[i];\n const dataRow = {};\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n let style = '';\n let textcolor = 'black';\n if (dataColConfig.ref + 'Style' in apiDataRow) {\n style = apiDataRow[dataColConfig.ref + 'Style'];\n if (style === 'red') {\n textcolor = 'white';\n }\n }\n if (dataColConfig.ref + 'ScoreStyle' in apiDataRow) {\n style = apiDataRow[dataColConfig.ref + 'ScoreStyle'];\n if (style === 'red') {\n textcolor = 'white';\n }\n }\n if (style === 'red') {\n style = '#FF6347';\n }\n if (style === '#0ee30e') {\n style = '#52B84D';\n }\n let value;\n if (dataColConfig.ref.includes('ExcelPercent')) {\n value = apiDataRow[dataColConfig.ref.replace('ExcelPercent', '')]*100;\n } else {\n value = apiDataRow[dataColConfig.ref];\n }\n dataRow[dataColConfig.ref] = {\n value: value,\n bgcolor: style,\n color: textcolor\n };\n }\n this.dataRows.push(dataRow);\n }\n // this.dataRows = this.apiData.data.data_section;\n // for (const colKey in this.apiData.data.data_section) {\n // if (this.apiData.data.heading_section.hasOwnProperty(colKey)) {\n // const col = this.apiData.data.heading_section[colKey];\n // this.dataCols.push({\n // ref: colKey,\n // description: col.label,\n // width: col.width\n // });\n // // col.format\n // // col.hidden_field\n // // col.purpose\n // // col.visible_by_default\n // }\n // }\n\n\n this.updateGrid();\n this.updateCustomerIdSelection();\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.updateGrid();\n/*\n this.customerScopeChangeEventIndex = this.ctService.onCustomerScopeChange(() => {\n this.updateCustomerScope();\n });\n\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.updateCustomerIdSelection();\n },\n ['ct_persona_type', 'ct_persona_value']\n ));\n\n this.customerChangeEventIndex = this.ctService.onCustomerSelectionChange(() => {\n if (this.ctService.getCustomerId() === 'all') {\n this.updateCustomerScope();\n }\n });*/\n }\n\n ngOnDestroy(): void {\n for (const index of this.refreshIndexes) {\n this.refreshHandler.cancelRefreshEvent(index);\n }\n // this.ctService.clearCustomerScopeChangeEvent(this.customerScopeChangeEventIndex);\n // this.ctService.clearCustomerSelectionChangeEvent(this.customerChangeEventIndex);\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n\n updateCustomerIdSelection() {\n const level1PersonaChoice = this.personaService.getLevel1Choice();\n if (level1PersonaChoice.type === 'Customer') {\n this.customerId = level1PersonaChoice.value;\n // this.updateCustomerScope();\n this.ctService.setCustomerId(level1PersonaChoice.value, level1PersonaChoice.label);\n }\n }\n\n updateCustomerScope() {\n this.showOnlySingleCustomer = this.ctService.getCustomerScope();\n this.customerId = this.personaService.getPersonaOption(PersonaTypes.Customer);\n if (this.showOnlySingleCustomer && this.customerId && this.customerId !== 'all') {\n this.filterChange({ logic: 'and', filters: [\n {\n logic: 'and',\n filters: [\n { field: 'oneview_customerid_int.value', operator: 'eq', value: this.customerId }\n ]\n }\n ]});\n this.updateGrid();\n } else {\n this.filterChange({ logic: 'and', filters: [] });\n this.updateGrid();\n }\n }\n\n selectCustomer(dataItem) {\n this.customerId = dataItem.uniqueCustomerKey.value;\n const customerName = dataItem.customerName.value;\n this.personaService.setCustomerOverride(true);\n this.personaService.setPersonaOption(PersonaTypes.Customer, this.customerId, customerName);\n // this.updateCustomerScope();\n this.ctService.setCustomerId(this.customerId, customerName);\n }\n\n // hot buttons\n // https://www.telerik.com/kendo-angular-ui/components/grid/api/ColumnBase/\n\n setColumns(type) {\n if (type === 'all') {\n this.columnSets.type = 'all';\n } else if (type === 'tcr') {// Test Completion Rate\n this.columnSets.type = 'tcr';\n } else if (type === 'nps') {\n this.columnSets.type = 'nps';\n // overall_nps_survey_score\n // field_service_nps_survey_score\n } else if (type === 'alcm') {\n this.columnSets.type = 'alcm';\n // alcm_daily_score\n } else if (type === 'tor') {\n this.columnSets.type = 'tor';\n // count_alinity_ia_tor\n // count_alinity_cc_tor\n } else if (type === 'tv') {// Test Volume\n this.columnSets.type = 'tv';\n // total_test_volume_ia_completed\n // total_test_volume_cc_completed\n } else if (type === 'ia_cc') {\n this.columnSets.ia_cc = 'all';\n } else if (type === 'ia') {\n this.columnSets.ia_cc = 'ia';\n } else if (type === 'cc') {\n this.columnSets.ia_cc = 'cc';\n } else if (type === 'alinity_architect') {\n this.columnSets.alinity_architect = 'all';\n } else if (type === 'alinity') {\n this.columnSets.alinity_architect = 'alinity';\n } else if (type === 'architect') {\n this.columnSets.alinity_architect = 'architect';\n }\n // always show non metrics:\n // customer_num, customer, oneview_customerid_int,\n // country_desc, locallevel1, locallevel2, business_segment, servicing_group\n let keeps = [\n 'overall_health_score',\n 'overall_nps_survey_score',\n 'field_service_nps_survey_score',\n 'alcm_daily_score',\n 'latest_worst_abbottlink_last_conn_days',\n 'count_alinity_ia_pls',\n 'count_alinity_cc_pls',\n 'count_alinity_ia_tor',\n 'count_alinity_cc_tor',\n 'total_test_volume_ia_completed',\n 'total_test_volume_cc_completed',\n 'test_completion_rate',\n 'proc_and_run_hard_stop_count',\n 'repeat_tests_rate',\n 'open_sd_ticket_qty'\n ];\n this.hideCols(keeps);\n if (this.columnSets.ia_cc === 'ia') {\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_pls');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n }\n if (this.columnSets.ia_cc === 'cc') {\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_pls');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n }\n if (this.columnSets.alinity_architect === 'alinity') {}\n if (this.columnSets.alinity_architect === 'architect') {\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_pls');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_pls');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n }\n if (this.columnSets.type !== 'all') {\n keeps = this.removeItemFromArray(keeps, 'overall_health_score');\n keeps = this.removeItemFromArray(keeps, 'latest_worst_abbottlink_last_conn_days');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_pls');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_pls');\n keeps = this.removeItemFromArray(keeps, 'proc_and_run_hard_stop_count');\n keeps = this.removeItemFromArray(keeps, 'repeat_tests_rate');\n keeps = this.removeItemFromArray(keeps, 'open_sd_ticket_qty');\n }\n if (this.columnSets.type === 'tcr') {\n keeps = this.removeItemFromArray(keeps, 'overall_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'field_service_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'alcm_daily_score');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n }\n if (this.columnSets.type === 'nps') {\n keeps = this.removeItemFromArray(keeps, 'test_completion_rate');\n keeps = this.removeItemFromArray(keeps, 'alcm_daily_score');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n }\n if (this.columnSets.type === 'alcm') {\n keeps = this.removeItemFromArray(keeps, 'test_completion_rate');\n keeps = this.removeItemFromArray(keeps, 'overall_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'field_service_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n }\n if (this.columnSets.type === 'tor') {\n keeps = this.removeItemFromArray(keeps, 'test_completion_rate');\n keeps = this.removeItemFromArray(keeps, 'overall_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'field_service_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'alcm_daily_score');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n }\n if (this.columnSets.type === 'tv') {\n keeps = this.removeItemFromArray(keeps, 'test_completion_rate');\n keeps = this.removeItemFromArray(keeps, 'overall_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'field_service_nps_survey_score');\n keeps = this.removeItemFromArray(keeps, 'alcm_daily_score');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n }\n // keeps = this.removeItemFromArray(keeps, 'test_completion_rate');\n // keeps = this.removeItemFromArray(keeps, 'overall_nps_survey_score');\n // keeps = this.removeItemFromArray(keeps, 'field_service_nps_survey_score');\n // keeps = this.removeItemFromArray(keeps, 'alcm_daily_score');\n // keeps = this.removeItemFromArray(keeps, 'count_alinity_ia_tor');\n // keeps = this.removeItemFromArray(keeps, 'count_alinity_cc_tor');\n // keeps = this.removeItemFromArray(keeps, 'total_test_volume_ia_completed');\n // keeps = this.removeItemFromArray(keeps, 'total_test_volume_cc_completed');\n\n this.showCols(keeps);\n }\n\n removeItemFromArray(array, value) {\n const index = array.indexOf(value);\n if (index > -1) {\n array.splice(index, 1);\n }\n return array;\n }\n\n hideCols(colsToHide) {\n for (const colKey in this.dataCols) {\n if (colKey in this.dataCols) {\n const colItem = this.dataCols[colKey];\n if (colsToHide.indexOf(colItem.ref) !== -1) {\n this.dataCols[colKey].hidden = true;\n }\n }\n }\n }\n\n showCols(colsToShow) {\n for (const colKey in this.dataCols) {\n if (colKey in this.dataCols) {\n const colItem = this.dataCols[colKey];\n if (colsToShow.indexOf(colItem.ref) !== -1) {\n this.dataCols[colKey].hidden = false;\n }\n }\n }\n }\n\n updateTooltipTitle(type) {\n switch (type) {\n case 'overAllHealthScore':\n this.helpWindowTitle = 'Overall Health';\n break;\n case 'tnpsRawScore':\n this.helpWindowTitle = 'tNPS Rating';\n break;\n case 'snCountIA':\n this.helpWindowTitle = 'IA';\n break;\n case 'snCountCC':\n this.helpWindowTitle = 'CC';\n break;\n case 'testVolumeIA':\n this.helpWindowTitle = 'Average Test Volume IA';\n break;\n case 'testVolumeCC':\n this.helpWindowTitle = 'Average Test Volume CC';\n break;\n case 'testCompletionPercent':\n this.helpWindowTitle = 'Test Completion';\n break;\n case 'hardStopCount':\n this.helpWindowTitle = 'Hard Stops';\n break;\n case 'qcFailPercent':\n this.helpWindowTitle = 'Controls Out of Range';\n break;\n case 'retestPercent':\n this.helpWindowTitle = 'Repeat Tests';\n break;\n case 'openTicketCount':\n this.helpWindowTitle = 'Open Tickets';\n break;\n }\n }\n\n toggleTooltip(type, changeTo = null) {\n this.opened = true;\n if (changeTo === null) {\n this.tooltips[type] = !this.tooltips[type];\n } else {\n this.tooltips[type] = changeTo;\n }\n if (this.tooltips[type]) {\n for (const type1 in this.tooltips) {\n if (type1 !== type) {\n this.tooltips[type1] = false;\n }\n }\n }\n this.updateTooltipTitle(type);\n }\n\n public onAction(action): void {\n let currentTooltip = null;\n for (const type in this.tooltips) {\n if (type in this.tooltips) {\n if (this.tooltips[type]) {\n currentTooltip = type;\n }\n }\n }\n if (currentTooltip !== null) {\n const keys = Object.keys(this.tooltips);\n const activeTooltipLocation = keys.indexOf(currentTooltip);\n let newKey;\n if (action.text === 'Previous') {\n if (activeTooltipLocation - 1 < 0) {\n newKey = keys[keys.length - 1];\n } else {\n newKey = keys[activeTooltipLocation - 1];\n }\n } else if (action.text === 'Next') {\n if (activeTooltipLocation + 1 >= keys.length) {\n newKey = keys[0];\n } else {\n newKey = keys[activeTooltipLocation + 1];\n }\n }\n this.tooltips[currentTooltip] = false;\n this.tooltips[newKey] = true;\n this.updateTooltipTitle(newKey);\n }\n }\n\n public close() {\n this.opened = false;\n }\n\n public exportToExcel(grid: GridComponent): void {\n // grid.saveAsExcel();\n }\n}\n","
    \n Health Metric Details for This Customer Not Found!\n
    \n
    \n \n
    \n

    Overall health is a customer-level aggregate score\n to indicate the operational health of a customer site.\n The Overall Health Score is computed by the AlwaysOn Health algorithm and incorporates\n instrument operational and customer satisfaction metrics.\n The algorithm scores each customer SN on each instrument metric in relation to other\n customer's SNs in the same geographic area. Scores are then rolled up at the customer\n level and weighted together with NPS data (if available) to arrive at an Overall health\n score. Weightings: tNPS (50%), test volume (10%), reactive tickets (10%),\n test completion (10%), hard stops (5%), controls out of range (5%), repeat tests (5%),\n daily maintenance failures (5%). Where data for a metric is unavailable,\n weightings are uniformly redistributed between available metrics.\n Color indicates customer health as\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n If Overall Health cannot be calculated due to insufficient data,\n no score is provided and coloring is set to gray.\n

    \n \n \n \n \n \n \n \n \n \n
    \n
    \n

    Survey responses to the Likelihood to Recommend question\n (\"On a scale of 0-10, how likely are you to recommend Abbott to a\n colleague or friend?\") on the Transactional NPS (tNPS) survey for\n a customer site over the past 1 year. Scores are averaged for a customer site\n if data from more than one interview is available. Color indicates a customer\n is a\n promoter (green),\n passive (yellow), or\n detractor (red)

    \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n

    Number of customer IA instruments. For Alinity, this is the number of IA serial numbers\n that are test-of-record.

    \n
    \n
    \n

    Number of customer CC instruments. For Alinity, this is the number of CC serial numbers\n that are test-of-record.

    \n
    \n
    \n

    The average weekly test volume for all customer IA instruments. Color coding indicates\n how a customer’s level of IA test volume was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., an IA test volume value color coded as good for one customer\n may be only satisfactory for another).

    \n
    \n
    \n

    The average weekly test volume for all customer CC instruments. Color coding indicates how\n a customer’s level of CC test volume was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., a CC test volume value color coded as good for one customer\n may be only satisfactory for another).

    \n
    \n
    \n

    Average weekly percentage of completed tests for all of a customer’s instruments\n (aggregates both IA and CC product lines). Color coding indicates how a customer’s level\n of test completion was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable to\n other customers (e.g., a test completion value color coded as good for one customer may be\n only satisfactory for another).

    \n
    \n
    \n

    Average weekly number of hard stops across all of a customer's Alinity instruments\n (aggregates both IA and CC product lines). Color coding indicates how the number\n of hard stops at a customer site was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (orange),\n needs improvement (yellow), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of\n instruments, color code scoring is unique to each customer site and is not comparable\n to other customers (e.g., a hard stop value color coded as good for one customer may be only\n satisfactory for another). The Hard Stop metric is available only for Alinity.

    \n
    \n
    \n

    Average weekly percentage of controls that fall outside of customer-defined boundaries\n (includes both IA and CC product lines). Color coding indicates how a customer’s level\n of test completion was scored by the AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations of instruments,\n color code scoring is unique to each customer site and is not comparable to other customers\n (e.g., a controls out of range value color coded as good for one customer may be only\n satisfactory for another).

    \n
    \n
    \n

    Average weekly percentage of repeat tests across all of a customer's instruments\n (includes both IA and CC product lines). Repeat tests are specimens that produced\n a result two or more times for the same assay, on the same instrument, indicating\n that the customer chose to rerun a specimen that already generated a result.\n Color coding indicates how a customer’s level of test completion was scored by the\n AlwaysOn Customer Health algorithm:\n good (green),\n satisfactory (yellow),\n needs improvement (orange), or\n poor (red).\n Because each customer site has a unique usage pattern and varying combinations\n of instruments, color code scoring is unique to each customer site and is not\n comparable to other customers (e.g., a controls out of range value color coded as\n good for one customer may be only satisfactory for another).

    \n
    \n
    \n

    Number of currently open tickets for a given customer (excluding TSBs).

    \n
    \n \n
    \n
    \n
    \n Customer Name\n {{selectedCustomerData.customerName.value}}\n
    \n
    \n Customer Number\n {{selectedCustomerData.customerNum.value}}\n
    \n
    \n Account\n {{selectedCustomerData.acctEntityName.value}}\n
    \n
    \n Location\n {{selectedCustomerData.countryName.value}}\n
    \n
    \n Alinity or ARCHITECT Overall Health \n \n {{selectedCustomerData.overAllHealthScore.value|percent}}\n \n
    \n
    \n tNPS Rating \n \n {{selectedCustomerData.tnpsRawScore.value|number:'1.2-2'}}\n \n
    \n
    \n # S/N's IA \n \n {{selectedCustomerData.snCountIA.value}}\n \n
    \n
    \n # S/N's CC \n \n {{selectedCustomerData.snCountCC.value}}\n \n
    \n
    \n Average Test Volume IA \n \n {{selectedCustomerData.testVolumeIA.value}}\n \n
    \n
    \n Average Test Volume CC \n \n {{selectedCustomerData.testVolumeCC.value}}\n \n
    \n
    \n Test Completion Rate \n \n {{selectedCustomerData.testCompletionPercent.value|percent:'1.1-1'}}\n \n
    \n
    \n HS/10000 \n \n {{selectedCustomerData.hardStopScaled.value|number:'1.2-2'}}\n \n
    \n
    \n Controls Out of Range % \n \n {{selectedCustomerData.qcFailPercent.value|percent:'1.2-2'}}\n \n
    \n
    \n Repeat Test % \n \n {{selectedCustomerData.retestPercent.value|percent:'1.2-2'}}\n \n
    \n
    \n Open Tickets \n \n {{selectedCustomerData.openTicketCount.value}}\n \n
    \n
    \n \n \n Service KPIs\n \n
    \n
    \n
    \n
    ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {CtServiceService} from '../ct-service.service';\nimport {PersonaService} from '../../api/persona.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {RequestState} from '../../api/request-handler';\nimport {faInfoCircle} from '@fortawesome/free-solid-svg-icons';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\nimport {DashboardOptions} from '../../configuration/nav-filter-selection';\nimport {SelectedManagerService} from '../selected-manager.service';\nimport {AuthenticationService} from '../../authentication/authentication.service';\n\ninterface CustomerHealthGridRow {\n // styles are string of color or null\n countryCode: string;\n customerNum: string;\n customerName: string;\n uniqueCustomerKey: string;\n countryName: string;\n area: string;\n overAllHealthScore: number;\n overAllHealthScoreStyle: string;\n tnpsRawScore: number;\n tnpsRawScoreStyle: string;\n snCountIA: number;\n snCountCC: number;\n testVolumeIA: number;\n testVolumeIAScoreStyle: string;\n testVolumeCC: number;\n testVolumeCCScoreStyle: string;\n testCompletionPercent: number;\n testCompletionPercentScoreStyle: string;\n hardStopCount: number;\n hardStopCountScoreStyle: string;\n qcFailPercent: number;\n qcFailPercentScoreStyle: string;\n retestPercent: number;\n retestPercentScoreStyle: string;\n openTicketCount: number;\n}\n\n@Component({\n selector: 'app-customer-profile-info',\n templateUrl: './customer-profile-info.component.html',\n styleUrls: ['./customer-profile-info.component.scss']\n})\nexport class CustomerProfileInfoComponent implements OnInit, OnDestroy {\n state = null;\n apiUrl = 'cua/customer_health_metrics';\n apiData = null;\n colorLegend = null;\n npsLegend = null;\n customerId = null;\n selectedCustomerData = null;\n dataCols = [];\n customerMyCRLLinkReady = false;\n myCRLCustomerId = null;\n // tooltips\n tooltips = {\n overAllHealthScore: false,\n tnpsRawScore: false,\n snCountIA: false,\n snCountCC: false,\n testVolumeIA: false,\n testVolumeCC: false,\n testCompletionPercent: false,\n hardStopCount: false,\n qcFailPercent: false,\n retestPercent: false,\n openTicketCount: false\n };\n helpWindowTitle = '';\n opened = false;\n helpActions = [{ text: 'Previous' }, { text: 'Next', primary: true }];\n actionsLayout = 'normal';\n faInfoCircle = faInfoCircle;\n DashboardOptions = DashboardOptions;\n refreshIndexes = [];\n customerChangeEventIndex = null;\n requestHandler;\n stateChangeHandler;\n countryIdsByName;\n\n constructor(\n private apiService: ApiService,\n private refreshHandler: RefreshHandlerService,\n private personaService: PersonaService,\n private ctService: CtServiceService,\n private selectedTabService: SelectedTabService,\n private selectedManagerService: SelectedManagerService,\n private authService: AuthenticationService\n ) {}\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiUrl);\n // this.ctService.onCustomerSelectionChange(() => {\n // requestHandler.sendRequest(this.apiUrl);\n // });\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest(this.apiUrl);\n },\n this.requestHandler.getRelativeParams(this.apiUrl)\n ));\n\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n this.buildLegendInfo(this.apiData);\n\n this.dataCols = [\n 'uniqueCustomerKey', 'acctEntityName', 'customerName', 'customerNum', 'countryName',\n 'overAllHealthScore', 'tnpsRawScore', 'snCountIA', 'snCountCC', 'testVolumeIA',\n 'testVolumeCC', 'testCompletionPercent', 'hardStopCount', 'hardStopScaled', 'qcFailPercent',\n 'retestPercent', 'openTicketCount'\n ];\n\n this.customerId = this.ctService.getCustomerId();\n this.selectedCustomerData = null;\n for (const apiDataRow of this.apiData.data) {\n if (apiDataRow.uniqueCustomerKey === this.customerId) {\n this.selectedCustomerData = {};\n for (const dataCol of this.dataCols) {\n let style = 'white';\n let textcolor = 'black';\n if (dataCol + 'Style' in apiDataRow) {\n style = apiDataRow[dataCol + 'Style'];\n if (style === 'red') {\n textcolor = 'white';\n }\n }\n if (dataCol + 'ScoreStyle' in apiDataRow) {\n style = apiDataRow[dataCol + 'ScoreStyle'];\n if (style === 'red') {\n textcolor = 'white';\n }\n }\n if (style === 'red') {\n style = '#FF6347';\n }\n if (style === '#0ee30e') {\n style = '#52B84D';\n }\n this.selectedCustomerData[dataCol] = {\n value: apiDataRow[dataCol],\n bgcolor: style,\n color: textcolor\n };\n }\n }\n }\n\n if (this.customerChangeEventIndex !== null) {\n this.ctService.clearCustomerSelectionChangeEvent(this.customerChangeEventIndex);\n }\n this.customerChangeEventIndex = this.ctService.onCustomerSelectionChange(() => {\n const aohCustomerId = this.personaService.getPersonaOption(PersonaTypes.Customer);\n\n const requestHandler2 = this.apiService.get('cua/get_mycrl_customer_id');\n if (aohCustomerId !== 'all' && typeof aohCustomerId === 'string') {\n const aohCustomerIdParts = aohCustomerId.split('|');\n requestHandler2.sendRequest('cua/get_mycrl_customer_id', {customer_id: aohCustomerIdParts[1]});\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler2.sendRequest(this.apiUrl);\n },\n requestHandler2.getRelativeParams(this.apiUrl)\n ));\n }\n // console.log('a1', requestHandler2.getRelativeParams(this.apiUrl));\n // 20211028 - a1 Array(6) [ \"ct_persona_type\", \"ct_persona_value\",\n // \"cua_primary\", \"cua_secondary\", \"cua_tertiary\", \"product_set_number\" ]\n\n // no need to send request here as chart tile has already done so\n requestHandler2.onStateChange((state2) => {\n this.state = state;\n if (state2 === RequestState.Complete) {\n const response2 = requestHandler2.getResponse();\n if (response2.body !== '') {\n this.myCRLCustomerId = JSON.parse(response2.body);\n\n const countryRequestHandler = this.apiService.get('/geography_service');\n countryRequestHandler.sendRequest('/geography_service');\n countryRequestHandler.onStateChange((countryState) => {\n if (state === RequestState.Complete) {\n const countryResponse = countryRequestHandler.getResponse();\n const countryData = JSON.parse(countryResponse.body);\n\n this.countryIdsByName = {};\n if (countryData.countries) {\n for (const location of countryData.countries) {\n this.countryIdsByName[location.name] = location.id;\n }\n }\n this.customerMyCRLLinkReady = true;\n }\n });\n }\n }\n });\n });\n }\n };\n\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.requestHandler.sendRequest(this.apiUrl);\n }\n\n ngOnDestroy(): void {\n for (const index of this.refreshIndexes) {\n this.refreshHandler.cancelRefreshEvent(index);\n }\n this.ctService.clearCustomerSelectionChangeEvent(this.customerChangeEventIndex);\n this.customerChangeEventIndex = null;\n\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n\n buildLegendInfo(apiData) {\n this.colorLegend = {\n title: {label: '', bgcolor: '', color: 'black', format: 'num1'},\n items: []\n };\n for (const apiLegendItem of apiData.legends['Overall Scores']) {\n let textcolor = 'black';\n if (apiLegendItem.color === 'red') {\n textcolor = 'white';\n }\n const legendItem = {\n label: Math.floor(apiLegendItem.minVal * 100) + '-' + Math.floor(apiLegendItem.maxVal * 100) + '%',\n count: 0,\n pct: apiLegendItem.maxVal * 100,\n bgcolor: apiLegendItem.color,\n color: textcolor\n };\n this.colorLegend.items.push(legendItem);\n if (this.colorLegend.title.label === '') {\n this.colorLegend.title.label = apiLegendItem.legendTitle;\n }\n }\n this.npsLegend = {\n title: {label: '', bgcolor: '', color: 'black', format: 'num1'},\n items: []\n };\n for (const apiLegendItem of apiData.legends['tNPS Scores']) {\n const legendItem = {\n label: Math.floor(apiLegendItem.minVal) + '-' + Math.floor(apiLegendItem.maxVal),\n count: 0,\n pct: apiLegendItem.maxVal,\n bgcolor: apiLegendItem.color,\n color: 'black'\n };\n this.npsLegend.items.push(legendItem);\n if (this.npsLegend.title.label === '') {\n this.npsLegend.title.label = apiLegendItem.legendTitle;\n }\n }\n }\n\n updateTooltipTitle(type) {\n switch (type) {\n case 'overAllHealthScore':\n this.helpWindowTitle = 'Overall Health';\n break;\n case 'tnpsRawScore':\n this.helpWindowTitle = 'tNPS Rating';\n break;\n case 'snCountIA':\n this.helpWindowTitle = 'IA';\n break;\n case 'snCountCC':\n this.helpWindowTitle = 'CC';\n break;\n case 'testVolumeIA':\n this.helpWindowTitle = 'Average Test Volume IA';\n break;\n case 'testVolumeCC':\n this.helpWindowTitle = 'Average Test Volume CC';\n break;\n case 'testCompletionPercent':\n this.helpWindowTitle = 'Test Completion';\n break;\n case 'hardStopCount':\n this.helpWindowTitle = 'Hard Stops';\n break;\n case 'qcFailPercent':\n this.helpWindowTitle = 'Controls Out of Range';\n break;\n case 'retestPercent':\n this.helpWindowTitle = 'Repeat Tests';\n break;\n case 'openTicketCount':\n this.helpWindowTitle = 'Open Tickets';\n break;\n }\n }\n\n toggleTooltip(type, changeTo = null) {\n this.opened = true;\n if (changeTo === null) {\n this.tooltips[type] = !this.tooltips[type];\n } else {\n this.tooltips[type] = changeTo;\n }\n if (this.tooltips[type]) {\n for (const type1 in this.tooltips) {\n if (type1 !== type) {\n this.tooltips[type1] = false;\n }\n }\n }\n this.updateTooltipTitle(type);\n }\n\n public onAction(action): void {\n let currentTooltip = null;\n for (const type in this.tooltips) {\n if (type in this.tooltips) {\n if (this.tooltips[type]) {\n currentTooltip = type;\n }\n }\n }\n if (currentTooltip !== null) {\n const keys = Object.keys(this.tooltips);\n const activeTooltipLocation = keys.indexOf(currentTooltip);\n let newKey;\n if (action.text === 'Previous') {\n if (activeTooltipLocation - 1 < 0) {\n newKey = keys[keys.length - 1];\n } else {\n newKey = keys[activeTooltipLocation - 1];\n }\n } else if (action.text === 'Next') {\n if (activeTooltipLocation + 1 >= keys.length) {\n newKey = keys[0];\n } else {\n newKey = keys[activeTooltipLocation + 1];\n }\n }\n this.tooltips[currentTooltip] = false;\n this.tooltips[newKey] = true;\n this.updateTooltipTitle(newKey);\n }\n }\n\n public close() {\n this.opened = false;\n }\n\n dashboardChange(dashboardOption) {\n this.authService.onAuth(() => {\n const userInfo = this.authService.getUserInfo();\n const aohCustomerLabel = this.personaService.getPersonaLabel(PersonaTypes.Customer);\n this.personaService.setPersonaOption(PersonaTypes.GEO, this.countryIdsByName[this.selectedCustomerData.countryName.value], this.selectedCustomerData.countryName.value);\n this.ctService.setReturnCustomer(this.personaService.getPersonaOption(PersonaTypes.Customer));\n // console.log('switch to myCrl', 'returnCustomerSetTo', this.personaService.getPersonaOption(PersonaTypes.Customer));\n // this.personaService.setPersonaOption(PersonaTypes.Customer, this.myCRLCustomerId, aohCustomerLabel);\n this.personaService.setPersonaOption(PersonaTypes.Customer, this.myCRLCustomerId, aohCustomerLabel);\n this.selectedTabService.selectTab(dashboardOption);\n // this.refreshHandlerService.triggerCallbacks();\n });\n }\n}\n","
    \n \n \n \n You may toggle chart lines by clicking the above legend toggles.\n \n
    ","import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';\nimport { ChartComponent } from '@progress/kendo-angular-charts';\n\n@Component({\n selector: 'app-data-trend-chart',\n templateUrl: './data-trend-chart.component.html',\n styleUrls: ['./data-trend-chart.component.scss']\n})\nexport class DataTrendChartComponent implements OnInit {\n @Input() chartData;\n public chartOptions;\n @ViewChild('chart') chartComponent: ChartComponent;\n dataSetYMax = [];\n\n constructor() { }\n\n ngOnInit(): void {\n let labelFormat = '{0:1}';\n switch (this.chartData.key) {\n case 'test_volume':\n labelFormat = '{0:0}';\n break;\n case 'test_completion':\n labelFormat = '{0:n1}';\n break;\n case 'controls':\n labelFormat = '{0:n1}';\n break;\n case 'repeat_tests':\n labelFormat = '{0:n1}';\n break;\n case 'hard_stops':\n labelFormat = '{0:n1}';\n break;\n }\n\n const categoryList = [];\n if ('xaxisData' in this.chartData) {\n for (const value of this.chartData.xaxisData) {\n categoryList.push(value);\n }\n\n let yleftmax = 0;\n const seriesList = [];\n const series1length = this.chartData.yaxisData.length;\n for (const i in this.chartData.yaxisData) {\n const dataSet = this.chartData.yaxisData[i];\n this.dataSetYMax[i] = [];\n\n let legendColor = null;\n if (dataSet.name === 'Alinity CC') {\n legendColor = '#cb20cb';\n }\n if (dataSet.name === 'Alinity IA') {\n legendColor = '#007bff';\n }\n\n let legendLabel = dataSet.name;\n if (this.chartData.key === 'hard_stops') {\n legendLabel += ' Avg';\n }\n seriesList[i] = {\n data: [],\n name: legendLabel,\n missingValues: 'gap',\n categoryAxis: 'cat1',\n axis: 'values1',\n visible: true,\n tooltip: {\n visible: true\n }\n // color: apiData.linecolors[i]\n };\n if (legendColor !== null) {\n seriesList[i].color = legendColor;\n }\n for (let a = 0; a < dataSet.values.length; a++) {\n this.dataSetYMax[i][a] = dataSet.values[a];\n if (dataSet.values[a] > yleftmax) {\n yleftmax = dataSet.values[a];\n }\n seriesList[i].data.push(dataSet.values[a]);\n }\n }\n\n const tickCount = 10;\n let axis2Max = this.nextHighestNumberDivisibleBy(yleftmax, tickCount - 1);\n axis2Max = axis2Max * 1.061;\n\n const seriesArray = seriesList;\n const valueAxisArray = [\n {\n name: 'values1',\n labels: {\n format: labelFormat,\n mirror: false,\n position: 'start'\n },\n title: {\n text: 'Avg ' + this.chartData.yaxisLabel\n },\n line: {\n visible: false\n },\n axisCrossingValue: -10,\n max: axis2Max,\n min: 0,\n majorUnit: axis2Max / (tickCount - 1)\n }\n ];\n\n if (this.chartData.hasOwnProperty('yaxis2Label')) {\n let yleftmax2 = 0;\n\n for (const i in this.chartData.yaxis2Data) {\n const newKey = parseInt(i) + parseInt(series1length);\n const dataSet2 = this.chartData.yaxis2Data[i];\n this.dataSetYMax[newKey] = [];\n\n let legendColor = null;\n if (dataSet2.name === 'Alinity CC') {\n legendColor = '#20c997';\n }\n if (dataSet2.name === 'Alinity IA') {\n legendColor = '#007bff';\n }\n\n let legendLabel = dataSet2.name;\n if (this.chartData.key === 'hard_stops') {\n legendLabel += ' HS/10000 (Dashed)';\n }\n\n seriesList[newKey] = {\n data: [],\n name: legendLabel,\n missingValues: 'gap',\n categoryAxis: 'cat1',\n dashType: 'dash',\n axis: 'values2',\n visible: true,\n tooltip: {\n visible: true\n }\n // color: apiData.linecolors[i]\n };\n\n if (legendColor !== null) {\n seriesList[newKey].color = legendColor;\n }\n\n for (let a = 0; a < dataSet2.values.length; a++) {\n\n this.dataSetYMax[newKey][a] = dataSet2.values[a];\n if (dataSet2.values[a] > yleftmax2) {\n yleftmax2 = dataSet2.values[a];\n }\n seriesList[newKey].data.push(dataSet2.values[a]);\n }\n }\n\n const tickCount2 = 10;\n let axis2Max2 = this.nextHighestNumberDivisibleBy(yleftmax2, tickCount2 - 1);\n axis2Max2 = axis2Max2 * 1.061;\n\n let seriesLabel = this.chartData.yaxis2Label;\n if (this.chartData.key === 'hard_stops' && seriesLabel === 'Hard Stop Scaled') {\n seriesLabel = 'HS/10000';\n }\n\n valueAxisArray.push(\n {\n name: 'values2',\n labels: {\n format: labelFormat,\n mirror: false,\n position: 'end'\n },\n title: {\n text: seriesLabel\n },\n line: {\n visible: false\n },\n axisCrossingValue: -10,\n max: axis2Max2,\n min: 0,\n majorUnit: axis2Max2 / (tickCount2 - 1)\n }\n );\n }\n\n this.chartOptions = {\n title: {\n text: this.chartData.title,\n position: 'top',\n font: 'bold 14px Arial,Helvetica,sans-serif'\n },\n legend: {\n position: 'bottom'\n },\n seriesDefaults: {\n type: 'line',\n area: {\n line: {\n style: 'smooth'\n }\n }\n },\n series: seriesArray,\n valueAxis: valueAxisArray,\n categoryAxis: {\n name: 'cat1',\n categories: categoryList,\n majorGridLines: {\n visible: false\n },\n labels: {\n rotation: -45\n }\n }\n };\n }\n }\n\n legendItemClickEvent(event) {\n this.chartComponent.series[event.seriesIndex].visible = !this.chartComponent.series[event.seriesIndex].visible;\n let yleftmax = 0;\n let yleftmax2 = 0;\n for (let i = 0; i < this.chartComponent.series.length; i++) {\n console.log('i', i, this.dataSetYMax);\n const item = this.chartComponent.series[i];\n if (item.visible && item.axis === 'values1') {\n for (const index in this.dataSetYMax[i]) {\n if (this.dataSetYMax[i][index] > yleftmax) {\n yleftmax = this.dataSetYMax[i][index];\n }\n }\n }\n if (item.visible && item.axis === 'values2') {\n for (const index in this.dataSetYMax[i]) {\n if (this.dataSetYMax[i][index] > yleftmax2) {\n yleftmax2 = this.dataSetYMax[i][index];\n }\n }\n }\n }\n const tickCount = 10;\n const axisMax = (this.nextHighestNumberDivisibleBy(yleftmax, tickCount - 1) * 1.061);\n const axisMax2 = (this.nextHighestNumberDivisibleBy(yleftmax2, tickCount - 1) * 1.061);\n for (const key in this.chartComponent.valueAxis) {\n if (key in this.chartComponent.valueAxis) {\n if (this.chartComponent.valueAxis[key].name === 'values1') {\n this.chartComponent.valueAxis[key].max = axisMax;\n }\n if (this.chartComponent.valueAxis[key].name === 'values2') {\n this.chartComponent.valueAxis[key].max = axisMax2;\n }\n }\n }\n this.chartComponent.notifyChanges({});\n\n // if (dataSet.values[a] > yleftmax) {\n // yleftmax = dataSet.values[a];\n // }\n //\n // const tickCount = 10;\n // let axis2Max = this.nextHighestNumberDivisibleBy(yleftmax, tickCount - 1);\n // axis2Max = axis2Max * 1.061;\n //\n // max: axis2Max,\n // majorUnit: axis2Max / (tickCount - 1)\n }\n\n nextHighestNumberDivisibleBy(num1, divisibleBy) {\n num1 = parseInt(num1);\n if (!Number.isInteger(num1)) {\n return false;\n }\n while (1) {\n if (num1 % divisibleBy === 0) {\n return num1;\n }\n num1++;\n }\n }\n}\n"," \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n {{dataItem[col.ref]}}\n \n \n \n {{dataItem[col.ref]}}\n \n \n ({{dataItem.pl}})\n \n \n \n \n\n\n \n\n","import { Component, OnInit, Input, Renderer2 } from '@angular/core';\nimport {GridComponent} from '../../details/grid.component';\nimport {environment} from '../../../environments/environment';\n\n@Component({\n selector: 'app-data-trend-table',\n templateUrl: './data-trend-table.component.html',\n styleUrls: ['./data-trend-table.component.scss']\n})\nexport class DataTrendTableComponent extends GridComponent implements OnInit {\n @Input() chartData;\n dataCols = [];\n showContextMenu = false;\n offset: any;\n selectedSn;\n selectedPl;\n gsrUrl = environment.gsrUrl;\n private documentClickSubscription: any;\n\n constructor(private renderer: Renderer2) {\n super();\n this.onCellClick = this.onCellClick.bind(this);\n this.documentClickSubscription = this.renderer.listen('document', 'click', () => {\n this.showContextMenu = false;\n });\n }\n\n ngOnInit(): void {\n this.dataCols = [\n {ref: 'pl', description: '', width: 100, hidden: true},\n {ref: 'plName', description: 'Product', width: 100},\n {ref: 'sn', description: 'SN', width: 100},\n {ref: 'ticketNum', description: 'Ticket #', width: 130},\n {ref: 'dateOpened', description: 'Open Date', width: 100},\n {ref: 'ticketDesc', description: 'Description', width: 400}\n ];\n // for (const colKey in this.chartData.data) {\n // if (this.chartData.data.hasOwnProperty(colKey)) {\n // const col = this.chartData.data[colKey];\n // this.dataCols.push({\n // ref: colKey,\n // description: col,\n // width: 100\n // });\n // }\n // }\n this.dataRows = this.chartData.data;\n this.updateGrid();\n }\n\n public onCellClick({dataItem, column, type, originalEvent}): void {\n if (type === 'click' && column.field === 'sn') {\n originalEvent.preventDefault();\n this.showContextMenu = true;\n this.selectedPl = dataItem.pl;\n this.selectedSn = dataItem.sn;\n this.offset = { left: originalEvent.pageX, top: originalEvent.pageY };\n } else {\n this.showContextMenu = false;\n }\n }\n}\n","\n\n
    \n

    Data displayed is for full weeks only starting on Monday.

    \n
    \n\n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n
    No Data for {{chart.title}}!
    \n \n
    \n
    \n
    No Data for {{grid.title}}!
    \n \n
    \n
    \n
    \n Please Select a Client via the Customer Health Metrics Table.\n
    ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {CtServiceService} from '../ct-service.service';\nimport {faInfoCircle} from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'app-customer-data-trends',\n templateUrl: './customer-data-trends.component.html',\n styleUrls: ['./customer-data-trends.component.scss']\n})\nexport class CustomerDataTrendsComponent implements OnInit, OnDestroy {\n public state;\n public apiData;\n public apiUrl = 'cua/customer_health_trend_data'; // 'control_tower/customer_data_trends_v2';\n public chartData = [];\n public gridData = [];\n public selectedTab = null;\n public customerIsSelected = false;\n opened = false;\n faInfoCircle = faInfoCircle;\n refreshIndexes = [];\n requestHandler;\n customerChangeEventIndex;\n stateChangeHandler;\n\n constructor(\n private apiService: ApiService,\n private refreshHandler: RefreshHandlerService,\n private ctService: CtServiceService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl, [], false);\n\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.requestHandler.sendRequest(this.apiUrl, [], false);\n },\n this.requestHandler.getRelativeParams(this.apiUrl)\n ));\n\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n\n if (this.apiData.status === 'success') {\n this.chartData = this.apiData.data.chartData;\n this.gridData = this.apiData.data.gridData;\n }\n\n const chartKeys = [];\n for (const item of this.chartData) {\n chartKeys.push(item.key);\n }\n if (!chartKeys.includes('test_volume')) {\n this.chartData.push({ key: 'test_volume', title: 'Test Volume by Week', noData: true });\n }\n if (!chartKeys.includes('test_completion')) {\n this.chartData.push({ key: 'test_completion', title: 'Percent Tests Completed by Week', noData: true });\n }\n if (!chartKeys.includes('controls')) {\n this.chartData.push({ key: 'controls', title: 'Percent Controls Out-of-Range by Week', noData: true });\n }\n if (!chartKeys.includes('repeat_tests')) {\n this.chartData.push({ key: 'repeat_tests', title: 'Percent Repeat Tests by Week', noData: true });\n }\n if (!chartKeys.includes('hard_stops')) {\n this.chartData.push({ key: 'hard_stops', title: 'Hard Stops by Week', noData: true });\n }\n\n const gridKeys = [];\n for (const item of this.gridData) {\n gridKeys.push(item.key);\n }\n if (!gridKeys.includes('open_tickets')) {\n this.gridData.push({ key: 'open_tickets', title: 'Open Tickets', noData: true });\n }\n\n\n this.selectedTab = 'test_volume';\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n // this.dataCols = [];\n // for (const colKey in this.apiData.data.heading_section) {\n // if (this.apiData.data.heading_section.hasOwnProperty(colKey)) {\n // const col = this.apiData.data.heading_section[colKey];\n // this.dataCols.push({\n // ref: colKey,\n // description: col.label,\n // width: col.width\n // });\n // // col.format\n // // col.hidden_field\n // // col.purpose\n // // col.visible_by_default\n // }\n // }\n // format dataRows for kendo component\n // this.dataRows = this.apiData.data.data_section;\n // for (const colKey in this.apiData.data.data_section) {\n // if (this.apiData.data.heading_section.hasOwnProperty(colKey)) {\n // const col = this.apiData.data.heading_section[colKey];\n // this.dataCols.push({\n // ref: colKey,\n // description: col.label,\n // width: col.width\n // });\n // // col.format\n // // col.hidden_field\n // // col.purpose\n // // col.visible_by_default\n // }\n // }\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n\n this.customerChangeEventIndex = this.ctService.onCustomerSelectionChange(() => {\n this.customerIsSelected = (this.ctService.getCustomerId() !== 'all');\n });\n }\n\n ngOnDestroy(): void {\n for (const index of this.refreshIndexes) {\n this.refreshHandler.cancelRefreshEvent(index);\n }\n this.ctService.clearCustomerSelectionChangeEvent(this.customerChangeEventIndex);\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n\n onSelectedChange(selectedTab) {\n this.selectedTab = selectedTab;\n }\n\n openTooltip() {\n this.opened = true;\n }\n\n public close() {\n this.opened = false;\n }\n}\n","
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n Looking Up Account, Please Wait...\n
    \n
    \n Could not find aoh alerts or metrics for this account number: {{accountNumber}}  \n Hide\n
    \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n \n {{selectedCustomerName}}  \n \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    ","import { Component, OnInit, OnDestroy, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {\n faListAlt,\n faChartBar,\n faWindowClose\n} from '@fortawesome/free-solid-svg-icons';\nimport {Personas} from '../../configuration/personas';\nimport {DashboardOptions, ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {PersonaService} from '../../api/persona.service';\nimport {SelectedTabService} from '../../dashboards/selected-tab.service';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {CtServiceService} from '../ct-service.service';\nimport {PersonaTypes} from '../../configuration/persona-types';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {PreferenceSelectionService} from '../../preferences/preference-selection.service';\nimport {AuthenticationService} from '../../authentication/authentication.service';\nimport {FilterChoicesService} from '../../filter_selection/filter-choices.service';\n\n@Component({\n selector: 'app-ct-dashboard',\n templateUrl: './ct-dashboard.component.html',\n styleUrls: ['./ct-dashboard.component.scss']\n})\nexport class CtDashboardComponent implements OnInit, OnDestroy {\n faListAlt = faListAlt;\n faChartBar = faChartBar;\n faWindowClose = faWindowClose;\n refreshIndex = null;\n selectedCustomerName = null;\n @ViewChild('tabstrip') public tabstrip;\n selectedTab = 0;\n alertsCount;\n customersCount;\n requestHandler;\n prefRequestHandler;\n managerApiData;\n managerDataLoaded = false;\n preferencesLoaded = false;\n refreshIndexes = [];\n customerChangeEventIndex;\n showLoadingAccountMessage = false;\n showAccountNotFoundMessage = false;\n accountNumber = '';\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private personaService: PersonaService,\n private selectedTabService: SelectedTabService,\n private refreshHandler: RefreshHandlerService,\n private ctService: CtServiceService,\n private apiService: ApiService,\n private preferenceSelectionService: PreferenceSelectionService,\n private authService: AuthenticationService,\n private filterService: FilterChoicesService,\n private route: ActivatedRoute,\n private cdRef: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n this.selectedTabService.selectTab(DashboardOptions.controltower); // this must proceed managerId hack\n /**\n * HACK TO FIX ISSUE WHERE MANAGER UPI IS CONFIGURED FOR MYCRL ROUTES AND AOH USES 511\n */\n this.authService.onAuth(() => {\n this.updateManagerIdHackLoadManagerListAndPreferences();\n });\n this.updateManagerIdHackLoadManagerListAndPreferences();\n // HACK END\n\n this.navbarBuilderService.setNavbarChoice('ct-dashboard');\n this.personaService.setServiceVsAmbState(true);\n this.personaService.refreshDetailChoices();\n this.navbarBuilderService.setNavFilterSelection({\n preferences: true,\n personaSelector: true,\n dashboardSelector: false,\n selectedDashboard: null,\n search: true,\n toolSelection: null,\n legacyCustomersFlag: false,\n myVsAllInstrumentsFlag: false,\n customerWTrackSystemsFlag: false,\n flagshipProductLinesFlag: false,\n bookmarksFlag: false,\n navigateBackwards: false,\n navigateBackwardsLabel: 'Back',\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false,\n personaOptions: [\n Personas.TssAmbassador,\n Personas.CuaManager,\n Personas.GeoLocation,\n Personas.AccountRep,\n Personas.CtCustomer,\n Personas.CtAccount\n ],\n prefCurrencyChoices: false\n });\n\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.refreshHandler.triggerCallbacks(['ct_persona_type', 'ct_persona_value']);\n // close customer page\n this.clearCustomer();\n },\n ['TSS', 'CuaManager', 'ManagersSpecifcAmb', 'AccountRep', 'CuaAmb', 'GEO', 'Amb', 'Account']\n ));\n\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.refreshHandler.triggerCallbacks([\n 'cua_product_family_set', 'cua_uniqueCustomerKey', 'ct_uniqueCustomerKey',\n 'cua_persona_type', 'cua_persona_value', 'ct_persona_type', 'ct_persona_value'\n ]);\n },\n ['Customer']\n ));\n this.refreshIndexes.push(this.refreshHandler.onRefreshEvent(\n (index) => {\n this.refreshHandler.triggerCallbacks(['cua_primary', 'cua_secondary', 'cua_tertiary']);\n },\n ['primary', 'secondary', 'tertiary']\n ));\n\n this.customerChangeEventIndex = this.ctService.onCustomerSelectionChange(() => {\n if (this.selectedCustomerName !== this.ctService.getCustomerName() && this.ctService.getCustomerName() !== null) {\n setTimeout(() => {\n this.tabstrip.selectTab(2);\n }, 500);\n }\n this.selectedCustomerName = this.ctService.getCustomerName();\n this.cdRef.detectChanges();\n });\n\n // fix so that when returning from mycrl it handles setting customer back the way it was\n if (this.ctService.isReturnCustomerSet()) {\n const aohCustomerLabel = this.personaService.getPersonaLabel(PersonaTypes.Customer);\n this.personaService.setPersonaOption(PersonaTypes.Customer, this.ctService.getReturnCustomer(), aohCustomerLabel);\n }\n\n this.route.paramMap.subscribe(params => {\n const accountUrlParam = params.get('account');\n this.accountNumber = accountUrlParam;\n if (accountUrlParam !== null) {\n this.showLoadingAccountMessage = true;\n const accountRequestHandler = this.apiService.get('cua/account_search');\n this.filterService.setFilter('searchQueryCuaAccount', accountUrlParam);\n accountRequestHandler.sendRequest('cua/account_search');\n accountRequestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n this.showLoadingAccountMessage = false;\n const response = accountRequestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n let selectedItem = null;\n for (const account of apiData.data) {\n if (accountUrlParam && accountUrlParam === account.acctEntityId) {\n selectedItem = {\n label: account.acctEntityName, // or customersrno\n key: account.acctEntityId\n };\n }\n }\n\n if (selectedItem) {\n this.personaService.setPersonaOption(PersonaTypes.Account, selectedItem.key, selectedItem.label);\n this.personaService.setCustomerOverride(true);\n } else {\n this.showAccountNotFoundMessage = true;\n }\n }\n });\n }\n });\n }\n\n closeAccountNotFoundMessage() {\n this.showAccountNotFoundMessage = false;\n }\n\n ngOnDestroy(): void {\n for (const index of this.refreshIndexes) {\n this.refreshHandler.cancelRefreshEvent(index);\n }\n this.ctService.clearCustomerSelectionChangeEvent(this.customerChangeEventIndex);\n }\n\n updateManagerIdHackLoadManagerListAndPreferences() {\n if (!this.preferenceSelectionService.arePreferencesLoaded() && this.authService.isAuth()) {\n this.prefRequestHandler = this.apiService.get('/preference');\n this.prefRequestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n this.preferencesLoaded = true;\n this.updateManagerIdHackFixPersona();\n }\n });\n } else {\n this.preferencesLoaded = true;\n }\n if (this.authService.isAuth()) {\n this.requestHandler = this.apiService.get('cua/manager_list');\n this.requestHandler.sendRequest('cua/manager_list', null, false);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.managerApiData = JSON.parse(response.body);\n this.managerDataLoaded = true;\n this.updateManagerIdHackFixPersona();\n }\n });\n }\n }\n\n updateManagerIdHackFixPersona() {\n let level1PersonaChoice = this.personaService.getLevel1Choice();\n if (\n this.managerDataLoaded\n && this.preferencesLoaded\n && level1PersonaChoice.type === PersonaTypes.Manager\n && this.selectedTabService.getLastSelectedTabInfo() === DashboardOptions.controltower // do not call unless ct dashboard page active\n ) {\n level1PersonaChoice = this.personaService.getLevel1Choice();\n for (const user of this.managerApiData) {\n if (user.mgrUpi === level1PersonaChoice.value) {\n this.filterService.setFilter('product_set_number', 3);\n this.personaService.setPersonaOption(\n PersonaTypes.CuaManager,\n user.mgr511,\n user.firstName + ' ' + user.lastName);\n this.refreshHandler.triggerCallbacks(['ct_persona_type', 'ct_persona_value']);\n }\n }\n }\n }\n\n onAlertsUpdate(alertsCount) {\n this.alertsCount = alertsCount;\n this.determineTab();\n }\n onHealthMetricsUpdate(customersCount) {\n this.customersCount = customersCount;\n }\n\n determineTab() {\n if (this.alertsCount > 0) {\n this.selectedTab = 0;\n } else {\n this.selectedTab = 1;\n }\n this.cdRef.detectChanges();\n }\n\n clearCustomer() {\n this.ctService.setReturnCustomer(null);\n this.personaService.setPersonaOption(PersonaTypes.Customer, 'all', '');\n this.personaService.setCustomerOverride(false);\n this.ctService.setCustomerId('all');\n this.tabstrip.selectTab(0);\n }\n}\n","\n
    \n \n \n \n \n \n \n 0\" class=\"k-button\" style='background-color: #009CDE; color: #FFF'>Apollo - {{apolloAlertCount}}\n 0\" class=\"k-button\" style='background-color: #A1CD5D; color: #FFF'>DaVinci - {{davinciAlertCount}}\n 0\" class=\"k-button\" style='background-color: #FA9F53; color: #FFF'>POM - {{pomAlertCount}}\n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n \n {{dialog_title}}\n \n
    \n \n
    \n
    \n {{dataRecord.devicename}}\n
    \n
    \n SN: {{dataRecord.sn}}\n
    \n
    \n
    \n {{dataRecord.customer}}\n
    \n
    \n
    \n {{dataRecord.alertcode}} - {{dataRecord.alertdesc}}\n
    \n
    \n {{dataRecord.experiencecode}} - {{dataRecord.experiencecodedescription}}\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n {{dataRecord.noofalertsxdays}}\n
    \n
    \n {{getDateLabel(dataRecord.alerttype)}} {{dataRecord.msgdatetime}}\n
    \n
    \n
    \n
    \n
    \n Ticket is not created\n Ticket is created\n
    \n
    \n Remaining Useful Life (RUL) {{dataRecord.rul}} \n
    \n
    \n
    \n
    \n
    \n {{dataRecord.customer}}\n
    \n
    \n {{dataRecord.customerAddrStreet}}\n
    \n
    \n {{dataRecord.customerAddrCity}}\n
    \n
    \n {{dataRecord.country}}\n
    \n
    \n
    \n {{dataRecord.msg}} \n
    \n
    \n \n
    {{dataRecord.devicename}}
    \n
    \n {{dataRecord.customer}}\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Contact No:{{dataRecord.customercontactno}}
    Instrument:{{dataRecord.modulename}}, {{dataRecord.sn}}, {{dataRecord.moduletype}}
    Occurence Count:{{dataRecord.occurrencecount}}
    Event:{{dataRecord.alertcode}}
    Date:{{dataRecord.msgdatetime}}
    \n
    \n
    \n
    \n
    Message:
    \n
    \n
    \n {{dataRecord.msg}} \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n No Predictive System alerts found for the logged-in user!\n
    \n
    \n
    \n\n","import { Component, OnInit } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { ApiService } from 'src/app/api/api.service';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\nimport { GridComponent } from 'src/app/details/grid.component';\n\n@Component({\n selector: 'app-alerts-grid',\n templateUrl: './alerts-grid.component.html',\n styleUrls: ['./alerts-grid.component.scss']\n})\nexport class AlertsGridComponent extends GridComponent implements OnInit {\n\n dataRecord;\n dialog_title;\n opened = false;\n apolloAlertCount = 0;\n davinciAlertCount = 0;\n pomAlertCount = 0;\n\n config = {\n pageTitle: 'Predictive System Alerts',\n apiRequestHandler: '/predictive_system_alerts',\n table: {\n exportFileName: 'predictive_system_alerts.xlsx',\n dataCols: [\n {\n title: 'Alert Type',\n key: 'alerttype',\n width: 80,\n renderAlertTypeStyle: true\n },\n {\n title: 'Details',\n width: 60,\n renderDetailsStyle: true\n },\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'SN',\n key: 'sn',\n width: 80\n },\n {\n title: 'Instrument',\n key: 'devicename',\n width: 65\n },\n {\n title: 'Alert Code',\n key: 'alertcode',\n width: 60\n },\n {\n title: 'Alert Desc',\n key: 'alertdesc',\n width: 80\n },\n {\n title: 'Message Date/Time',\n key: 'msgdatetime',\n width: 60\n },\n {\n title: 'Experience Code',\n key: 'experiencecode',\n width: 60,\n hidden: true\n },\n {\n title: 'Experience Code Desc',\n key: 'experiencecodedescription',\n width: 80,\n hidden: true\n },\n {\n title: 'Country',\n key: 'country',\n width: 50,\n hidden: true\n },\n {\n title: 'Message Detail',\n key: 'msg',\n width: 80,\n hidden: true\n }\n ]\n } \n };\n\n public state = RequestState.Inactive;\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n protected refreshHandler: RefreshHandlerService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.loadData(); \n }\n\n protected loadData() {\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { requestTime: (new Date()).getTime() });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { requestTime: (new Date()).getTime() });\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n hidden: this.config.table.dataCols[i].hidden,\n renderAlertTypeStyle: this.config.table.dataCols[i].renderAlertTypeStyle,\n renderDetailsStyle: this.config.table.dataCols[i].renderDetailsStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n this.apolloAlertCount = 0;\n this.davinciAlertCount = 0;\n this.pomAlertCount = 0;\n for (let r = 0; r < apiData['data'].length; r++) {\n let dataRecord = apiData['data'][r];\n if (dataRecord.alerttype === 'Apollo') {\n this.apolloAlertCount++;\n } else if (dataRecord.alerttype === 'DaVinci') {\n this.davinciAlertCount++;\n } else if (dataRecord.alerttype === 'POM') {\n this.pomAlertCount++;\n }\n this.dataRows.push(apiData['data'][r]);\n } \n this.updateGrid();\n }\n });\n }\n\n public getMaxHeight(): string { \n const userWindowHeight = window.screen.availHeight;\n const userWindowWidth = window.screen.availWidth;\n\n if (userWindowHeight < 300) {\n return 300 + 'px';\n } else if (userWindowWidth <= 768) {\n return (userWindowHeight - 100) + 'px';\n } else if (this.detectMob()) {\n return (userWindowHeight - 100) + 'px';\n }\n return (userWindowHeight - 180) + 'px';\n }\n\n getAlertTypeStyle(alertType) {\n if (alertType === 'Apollo') {\n return {\n 'color': '#009CDE',\n 'font-size': '10pt',\n 'font-weight': '500'\n }\n } else if (alertType === 'DaVinci') {\n return {\n color: '#A1CD5D',\n 'font-size': '10pt',\n 'font-weight': '500'\n }\n } else if (alertType === 'POM') {\n return {\n color: '#FA9F53',\n 'font-size': '10pt',\n 'font-weight': '500'\n }\n } else {\n return {\n color: '#000',\n 'font-size': '10pt',\n 'font-weight': '500'\n }\n }\n }\n\n getHRStyle(alertType) {\n if (alertType === 'Apollo') {\n return 'hr_alert_apollo';\n } else if (alertType === 'DaVinci') {\n return 'hr_alert_davinci';\n } else if (alertType === 'POM') {\n return 'hr_alert_pom';\n } \n }\n\n getDateLabel(alertType) {\n if (alertType === 'Apollo') {\n return 'PHM Date';\n } else if (alertType === 'DaVinci') {\n return 'Date';\n } \n }\n\n openDetailsWindow(dataItem: any) {\n // console.log(dataItem);\n if (dataItem && dataItem.alerttype == 'Apollo') {\n this.dialog_title = 'Apollo/Prognostic Health Monitoring (PHM) - Alert Details'; \n this.dataRecord = dataItem;\n let customerAddr = this.dataRecord['customeraddress'];\n // customeraddress: \"1527 MADISON ST@FREDONIA@\"\n if (customerAddr !== undefined && customerAddr.length > 0) {\n let streetIndex = customerAddr.indexOf('@');\n if (streetIndex != -1) { \n this.dataRecord['customerAddrStreet'] = customerAddr.substring(0, streetIndex); \n if (customerAddr.indexOf('@', streetIndex) != -1 && customerAddr.indexOf('@', streetIndex + 1) != -1) {\n this.dataRecord['customerAddrCity'] = customerAddr.substring(customerAddr.indexOf('@', streetIndex) + 1, customerAddr.indexOf('@', streetIndex + 1));\n } \n }\n } \n this.opened = true; \n } else if (dataItem && dataItem.alerttype == 'DaVinci') {\n this.dialog_title = 'DaVinci Alert Details'; \n this.dataRecord = dataItem;\n this.dataRecord['customerAddrStreet'] = this.dataRecord['customeraddress'];\n this.opened = true; \n } else if (dataItem && dataItem.alerttype == 'POM') {\n this.dialog_title = 'POM Alert Details'; \n this.dataRecord = dataItem;\n this.opened = true;\n } \n }\n\n closeDetailsWindow() {\n this.opened = false;\n }\n\n isDataFound(dataRows) {\n if (!dataRows) {\n return false;\n }\n if (Array.isArray(dataRows) && dataRows.length === 0) {\n return false;\n }\n return true;\n }\n\n}\n","import { Component, OnInit } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\n\n@Component({\n selector: 'app-alerts-dashboard',\n templateUrl: './alerts-dashboard.component.html',\n styleUrls: ['./alerts-dashboard.component.scss']\n})\nexport class AlertsDashboardComponent implements OnInit {\n\n constructor(private navbarBuilderService: NavbarBuilderService) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.setNavbarChoice('alerts-dashboard');\n }\n\n}\n","
    \n
    \n
    \n \n
    \n
    \n
    \n","export const Style2Pages = {\n '/opencalls': {\n pageTitle: 'Assigned Open Calls Details',\n apiRequestHandler: '/metrics/opencalls/details',\n backPageLabel: 'Back',\n backPageLink: '/lastSelectedDashboard',\n dataArrayKey: 'tickets',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'assigned_open_call_details.xlsx',\n dataCols: [\n {\n title: 'Ticket No',\n key: 'number',\n refLink: 'numberlink',\n width: 100\n },\n {\n title: 'Ticket Owner',\n key: 'ticketowner',\n width: 60\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 60\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n width: 80\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Ticket Comment',\n key: 'comment',\n width: 60\n },\n {\n title: 'Open Date',\n key: 'opendate',\n customDateFormat: { inputFormat: 'yyyyMMdd', outputFormat: 'yyyy-MM-dd' },\n width: 50\n },\n {\n title: 'Aged',\n key: 'aged',\n renderAgedYNStyle: true,\n width: 50\n },\n {\n title: 'Aging Days',\n key: 'agingdays',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Ticket Category',\n key: 'type',\n width: 50\n },\n {\n title: 'Exp Code',\n key: 'expcode',\n width: 50\n },\n {\n title: 'Exp Code Description',\n key: 'expcodedesc',\n width: 80\n }\n ]\n }\n },\n '/hotsheets': {\n pageTitle: 'NPS Open Hotsheet Details',\n apiRequestHandler: '/metrics/hotsheets/details',\n backPageLabel: 'Back',\n backPageLink: '/',\n dataArrayKey: 'nps',\n dataArraySplitColKey: 'scores',\n table: {\n type: 'style2',\n exportFileName: 'nps_open_hotsheet_details.xlsx',\n dataCols: [\n {\n title: 'NPS Category',\n key: 'resolved',\n width: 80\n },\n {\n title: 'Customer Number',\n key: 'customernumber',\n hidden: true,\n export: true,\n width: 50\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80,\n renderCustomerNameNumStyle: true\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Interview Date',\n key: 'interviewdate',\n width: 50\n }\n ],\n dataArraySplitCols: [\n {\n title: 'Overall', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'overall',\n width: 50,\n type: 'int'\n },\n {\n title: 'Field Service', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'fieldservice',\n width: 50,\n type: 'int'\n },\n {\n title: 'Product Quality',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productquality',\n width: 50,\n type: 'int'\n },\n {\n title: 'Product Delivery',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productdelivery',\n width: 50,\n type: 'int'\n },\n {\n title: 'Sales Rep',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'salesrep',\n width: 50,\n type: 'int'\n },\n {\n title: 'Technical Support',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'technicalsupport',\n width: 50,\n type: 'int'\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n width: 80,\n drillDownDetailsColName: 'hotsheets_survey_comments',\n drillDownDetailsLabel: 'More',\n drillDownDetailsLink: 'survey_comments'\n }\n ]\n }\n },\n '/sdfr/details': {\n pageTitle: 'SDFR Details - Service Demand Tickets Only',\n apiRequestHandler: '/metrics/sdfr/details',\n backPageLabel: 'Back',\n backPageLink: '/sdfr',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'sdfr_details_service_demand_tkts_only.xlsx',\n dataCols: [\n {\n title: 'Ticket Number',\n key: 'ticketnumber',\n refLink: 'ticketnumberlink',\n width: 100\n },\n {\n title: 'Serial Number',\n key: 'serialno',\n width: 80\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Open Date',\n key: 'opendate',\n width: 50\n },\n {\n title: 'Closed Date',\n key: 'closeddate',\n width: 50\n },\n {\n title: 'Elapsed Hours',\n key: 'elapsedhours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Hit/Miss',\n key: 'hit',\n width: 50,\n renderHitMissStyle: true\n }\n ]\n }\n },\n '/ftfr/details': {\n pageTitle: 'FTFR Details - Only Graded Tickets Shown',\n apiRequestHandler: '/metrics/ftfr/details',\n backPageLabel: 'Back',\n backPageLink: '/ftfr',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'ftfr_details_graded_tkts_only.xlsx',\n dataCols: [\n {\n title: 'Ticket #1',\n key: 'ticket1',\n refLink: 'ticketlink',\n width: 80\n },\n {\n title: 'Serial Number',\n key: 'ticksrno',\n width: 80\n },\n {\n title: 'T1 Closed Date',\n key: 't1closeddate',\n width: 50\n },\n {\n title: 'Ticket #2',\n key: 'ticket2',\n refLink: 'ticketlink',\n width: 80\n },\n {\n title: 'T2 Opened Date',\n key: 'ticket2opendate',\n width: 50\n },\n {\n title: 'Elapsed Days',\n key: 'elapseddate',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Hit/Miss',\n key: 'hitmiss',\n width: 50,\n renderHitMissStyle: true\n }\n ]\n }\n },\n '/uptime/details': {\n pageTitle: 'Uptime Details',\n apiRequestHandler: '/metrics/uptime/details',\n backPageLabel: 'Back',\n backPageLink: '/uptime',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'uptime_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'cust',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Total Hours Down',\n key: 'aggdhrsdown',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Total Days Down',\n key: 'aggdaysdown',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Uptime %',\n key: 'agguptimeper',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ],\n drillDownCols: [\n {\n title: 'Details',\n width: 80,\n drillDownDetailsColName: 'uptime_customer_details',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: 'customerdetails'\n }\n ]\n }\n },\n '/ticketrending/details': {\n pageTitle: 'Ticket Trending Details',\n apiRequestHandler: '/metrics/ticketrending/details',\n backPageLabel: 'Back',\n backPageLink: '/ticketrending',\n dataArrayKey: 'tickets',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'ticket_trending_details.xlsx',\n dataCols: [\n {\n title: 'Ticket No',\n key: 'ticketdetails',\n refLink: 'numberlink',\n width: 80\n },\n {\n title: 'Ticket Owner',\n key: 'ticketowner',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'instrument',\n width: 65\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n width: 80\n },\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'Summary Desc',\n key: 'summarydesc',\n width: 80\n },\n {\n title: 'Ticket Trending Name',\n key: 'tickettrendingname',\n width: 60\n },\n {\n title: 'Open Date',\n key: 'opendate',\n width: 50\n },\n {\n title: 'Closed Date',\n key: 'closeddate',\n width: 50\n },\n {\n title: 'Experience Code',\n key: 'expcode',\n width: 50\n },\n {\n title: 'Experience Code Desc',\n key: 'expcodedesc',\n width: 80\n }\n ]\n }\n },\n '/trt/details': {\n pageTitle: 'Total Resolution Time Details',\n apiRequestHandler: '/metrics/trt/details',\n backPageLabel: 'Back',\n backPageLink: '/trt',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'total_resolultion_time_details.xlsx',\n dataCols: [\n {\n title: 'Ticket Number',\n key: 'ticketnumber',\n refLink: 'ticketnumberlink',\n width: 80\n },\n {\n title: 'Resolution Time (Days)',\n key: 'resolutiontime',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Start Date',\n key: 'startdate',\n width: 50\n },\n {\n title: 'End Date',\n key: 'enddate',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'pldesc',\n width: 65\n },\n {\n title: 'SN',\n key: 'sn',\n width: 80\n },\n {\n title: 'Customer',\n key: 'cust',\n width: 80\n },\n {\n title: 'Experience Code and Desc',\n key: 'expcodedesc',\n width: 80\n },\n {\n title: 'Ticket Comments',\n key: 'ticketcomments',\n width: 80\n }\n ]\n }\n },\n '/tsb': {\n pageTitle: 'Open TSB Details',\n apiRequestHandler: '/metrics/tsb/details',\n backPageLabel: 'Back',\n backPageLink: '/lastSelectedDashboard',\n dataArrayKey: 'tickets',\n table: {\n type: 'style2',\n exportFileName: 'open_tsb_details.xlsx',\n dataCols: [\n {\n title: 'TSB Due Date',\n key: 'tsbduedate',\n width: 50,\n dateFormat: 'yyyy-MM-dd',\n filter: 'date'\n },\n {\n title: 'Due in NNN days',\n key: 'duein',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Required',\n key: 'tsbrequired',\n width: 50\n },\n {\n title: 'TSB #',\n key: 'tsbno',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'TSB Desc',\n key: 'tsbdesc',\n width: 60\n },\n {\n title: 'Instrument',\n key: 'instrument',\n width: 65\n },\n {\n title: 'SN',\n key: 'sn',\n width: 75\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Customer',\n key: 'custname',\n width: 80\n },\n {\n title: 'Ticket Number',\n key: 'ticketno',\n customValueIfBlank: '',\n width: 80\n },\n {\n title: 'Ticket Owner',\n key: 'ticketowner',\n customValueIfBlank: '-',\n width: 50\n },\n {\n title: 'Primary TSS',\n key: 'PrimaryTSS',\n width: 50\n },\n {\n title: 'Secondary TSS',\n key: 'SecondaryTSS',\n width: 50\n },\n {\n title: 'Tertiary TSS',\n key: 'TertiaryTSS',\n width: 50\n }\n ]\n }\n },\n '/pm': {\n pageTitle: 'PM Status Details',\n apiRequestHandler: '/metrics/pm/details',\n backPageLabel: 'Back',\n backPageLink: '/lastSelectedDashboard',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n exportFileName: 'pm_status_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'Instrument',\n key: 'instrument',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'srno',\n width: 80\n },\n {\n title: 'Last PM Date',\n key: 'lastpm',\n customValueIfBlank: '',\n width: 50\n },\n {\n title: 'Days Until Due',\n key: 'daysdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Next PM Date',\n key: 'nextpm',\n customValueIfBlank: '',\n width: 50\n }\n ]\n }\n },\n '/customerNps/details': {\n pageTitle: 'Customer NPS Survey Details',\n apiRequestHandler: '/metrics/nps/detail',\n backPageLabel: 'Back',\n backPageLink: '/customerNps',\n dataArrayKey: 'details',\n dataArraySplitColKey: 'scores',\n table: {\n type: 'style2',\n exportFileName: 'customer_nps_survey_details.xlsx',\n dataCols: [\n {\n title: 'NPS Category',\n key: 'resolved',\n width: 60\n },\n {\n title: 'Customer Number',\n key: 'customernumber',\n hidden: true,\n export: true,\n width: 50\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80,\n renderCustomerNameNumStyle: true\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Interview Date',\n key: 'interviewdate',\n customStyle: { 'text-align': 'right' },\n width: 50\n }\n ],\n dataArraySplitCols: [\n {\n title: 'Overall', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'overall',\n width: 50,\n type: 'int'\n },\n {\n title: 'Field Service', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'fieldservice',\n width: 50,\n type: 'int'\n },\n {\n title: 'Product Quality',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'productquality',\n width: 50,\n type: 'int'\n },\n {\n title: 'Product Delivery',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'productdelivery',\n width: 50,\n type: 'int'\n },\n {\n title: 'Sales Rep',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'salesrep',\n width: 50,\n type: 'int'\n },\n {\n title: 'Technical Support',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n customStyle: { 'text-align': 'right' },\n // customValueIfBlank: 'N/A',\n key: 'technicalsupport',\n width: 50,\n type: 'int'\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n width: 60,\n drillDownDetailsColName: 'customer_nps_survey_comments',\n drillDownDetailsLabel: 'More',\n drillDownDetailsLink: 'survey_comments'\n }\n ]\n }\n },\n '/CRLSummary': {\n pageTitle: 'Current Instrument Quantity',\n apiRequestHandler: '/metrics/CRLSummary',\n dataArrayKey: 'values',\n table: {\n type: 'style2',\n exportFileName: 'current_instrument_quantity_details.xlsx',\n detailLink: '/CRLSummary/details',\n dataCols: [\n {\n title: 'Instrument',\n key: 'PL',\n width: 100\n },\n {\n title: 'Quantity',\n key: 'Quantity',\n customStyle: { 'text-align': 'right' },\n width: 100,\n type: 'int'\n }\n ]\n }\n },\n '/proactive/details': {\n pageTitle: 'Proactive/Reactive Ticket Details',\n apiRequestHandler: '/metrics/proactive/details',\n backPageLabel: 'Back',\n backPageLink: '/proactive',\n dataArrayKey: 'details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'proactive_reactive_ticket_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Ticket Number',\n key: 'ticketnumber',\n refLink: 'ticketnumberlink',\n width: 80\n },\n {\n title: 'SN',\n key: 'serialno',\n width: 80\n },\n {\n title: 'Open Date',\n key: 'opendate',\n width: 50\n },\n {\n title: 'Closed Date',\n key: 'closeddate',\n width: 50\n },\n {\n title: 'Experience Code Desc',\n key: 'experiencecodedesc',\n width: 80\n },\n {\n title: 'Summary Desc',\n key: 'summarydesc',\n width: 80\n },\n {\n title: 'Hit/Miss',\n key: 'hit',\n width: 80,\n renderHitMissStyle: true\n }\n ]\n }\n },\n '/orders/intermediate': {\n pageTitle: 'Orders',\n apiRequestHandler: '/metrics/orders/intermediate',\n backPageLabel: 'Back',\n backPageLink: '/orders',\n dataArrayKey: 'orders',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'customer_orders.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'Order #',\n key: 'ordernumber',\n customStyle: { 'text-align': 'right' },\n width: 80\n },\n {\n title: 'Order Type',\n key: 'ordertype',\n width: 80\n },\n {\n title: 'Order Date',\n key: 'orderdate',\n dateFormat: 'yyyy-MM-dd',\n width: 50\n },\n {\n title: 'Order Status',\n key: 'orderstatus',\n width: 60\n },\n {\n title: 'Recurs',\n key: 'recurrence',\n customValueIfBlank: '',\n width: 60\n }\n ],\n drillDownCols: [\n {\n title: 'Details',\n width: 80,\n drillDownDetailsColName: 'customer_order_details',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/orders/details'\n }\n ]\n }\n },\n '/alwaysonuptime/details': {\n pageTitle: 'ALWAYS ON Uptime Details',\n apiRequestHandler: '/metrics/alwaysonuptime/details',\n backPageLabel: 'Back',\n backPageLink: '/alwaysonuptime',\n dataArrayKey: 'instruments',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'always_on_uptime_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'Country',\n key: 'countryDesc',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlineDescription',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'sn',\n width: 80\n },\n {\n title: 'Guarantee Achieved',\n key: 'guaranteeAchieved',\n width: 50\n },\n {\n title: 'Uptime % 12 MA',\n key: 'uptime12ma',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Uptime % 3 MA',\n key: 'uptime3ma',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'AL 12 MA',\n key: 'alInstalled',\n width: 50\n },\n {\n title: 'ALC % 12 MA',\n key: 'alcpercent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'ALC 12 MA',\n key: 'alc',\n width: 50,\n renderALC12MAStyle: true\n },\n {\n title: 'Maint Score',\n key: 'alcMaintainenceScore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Contract LN Desc',\n key: 'serviceContractLNDesc',\n width: 50\n },\n {\n title: 'Contract Start Date',\n key: 'contractStartDate',\n width: 50\n },\n {\n title: 'Contract End Date',\n key: 'contractEndDate',\n width: 50\n }\n ]\n }\n },\n '/util_workload/details': {\n pageTitle: 'Utilization and Tickets Per Day Summary Previous 12 months',\n apiRequestHandler: '/metrics/fsrtpd/details',\n backPageLabel: 'Back',\n backPageLink: '/util_workload',\n dataArrayKey: 'Details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'utilization_workload_details.xlsx',\n dataCols: [\n {\n title: 'YYYY-MM',\n key: 'Period',\n width: 60\n },\n {\n title: 'Ticket Quantity',\n key: 'TicketCount',\n customStyle: { 'text-align': 'right' },\n customValueIfBlank: 'N/A',\n width: 50,\n type: 'int'\n },\n {\n title: 'Tickets Per Day',\n key: 'TicketsPerDay',\n customStyle: { 'text-align': 'right' },\n customValueIfBlank: 'N/A',\n width: 50,\n type: 'float'\n },\n {\n title: 'Labor Hours',\n key: 'LaborHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Travel Hours',\n key: 'TravelHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Total Hours',\n key: 'TotalHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Available Hours',\n key: 'AvailableHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Utilization % (1MA)',\n key: 'Utilization',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/tickets_per_day/details': {\n pageTitle: 'Utilization and Tickets Per Day Summary Previous 12 months',\n apiRequestHandler: '/metrics/fsrtpd/details',\n backPageLabel: 'Back',\n backPageLink: '/tickets_per_day',\n dataArrayKey: 'Details',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'utilization_workload_details.xlsx',\n dataCols: [\n {\n title: 'YYYY-MM',\n key: 'Period',\n width: 60\n },\n {\n title: 'Ticket Quantity',\n key: 'TicketCount',\n customStyle: { 'text-align': 'right' },\n customValueIfBlank: 'N/A',\n width: 50,\n type: 'int'\n },\n {\n title: 'Tickets Per Day',\n key: 'TicketsPerDay',\n customStyle: { 'text-align': 'right' },\n customValueIfBlank: 'N/A',\n width: 50,\n type: 'float'\n },\n {\n title: 'Labor Hours',\n key: 'LaborHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Travel Hours',\n key: 'TravelHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Total Hours',\n key: 'TotalHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Available Hours',\n key: 'AvailableHours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Utilization % (1MA)',\n key: 'Utilization',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/rnps/detail': {\n pageTitle: 'rNPS Surveys',\n apiRequestHandler: '/metrics/rnps/detail',\n backPageLabel: 'Back',\n backPageLink: '/rnps',\n dataArrayKey: 'rows',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'rnps_surveys_ambassador_details.xlsx',\n dataCols: [\n {\n title: 'Overall Score',\n key: 'value',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Customer Number',\n key: 'customernum',\n hidden: true,\n width: 50\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80,\n renderCustomerStyleForAmbMetrics: true\n },\n {\n title: 'Country',\n key: 'country',\n width: 50,\n },\n {\n title: 'Interview Date',\n key: 'interviewdate',\n width: 50\n },\n {\n title: 'rNPS Category',\n key: 'resolved',\n width: 50\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n width: 80,\n drillDownDetailsColName: 'rnps_survey_comments',\n drillDownDetailsLabel: 'More',\n drillDownDetailsLink: 'survey_comments'\n }\n ]\n }\n },\n '/amb_orders/intermediate': {\n pageTitle: 'Orders',\n apiRequestHandler: '/amb_orders/intermediate',\n backPageLabel: 'Back',\n backPageLink: '/amb_orders',\n dataArrayKey: 'orders',\n table: {\n type: 'style2',\n needEntireApiDataRecord: true,\n exportFileName: 'amb_customer_orders.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'Order #',\n key: 'ordernumber',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Order Type',\n key: 'ordertype',\n width: 80\n },\n {\n title: 'Order Date',\n key: 'orderdate',\n dateFormat: 'yyyy-MM-dd',\n width: 50\n },\n {\n title: 'Order Status',\n key: 'orderstatus',\n width: 50\n },\n {\n title: 'Recurs',\n key: 'recurrence',\n width: 50\n }\n ],\n drillDownCols: [\n {\n title: 'Details',\n width: 60,\n drillDownDetailsColName: 'amb_customer_order_details',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/amb_orders/details'\n }\n ]\n }\n }\n};\n","import { formatDate } from '@angular/common';\nimport { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';\nimport * as _ from 'lodash';\n\n@Pipe({name: 'customDateFormatter'})\nexport class CustomDateFormatterPipe implements PipeTransform {\n\n constructor(@Inject(LOCALE_ID) private locale: string) {\n \n }\n\n transform(value: string, inputFormat: string, outputFormat: string): string {\n if (value !== undefined) {\n if (inputFormat !== undefined && inputFormat === 'yyyyMMdd') {\n return [value.slice(0, 4), \"-\", value.slice(4, 6), \"-\", value.slice(6, 8)].join('');\n } \n return formatDate(value, outputFormat, this.locale);\n }\n return value;\n }\n}\n","
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n {{dataItem[col.ref]}} ({{dataItem['customernumber']}})\n \n \n \n \n
    N
    \n
    Y
    \n
    \n
    \n \n \n
    {{dataItem[col.ref]}}
    \n
    {{dataItem[col.ref]}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n {{col.drillDownDetailsLabel}}\n \n \n \n \n {{dataItem[col.ref] | date: col.dateFormat }}\n \n \n \n \n Anonymous\n \n \n \n \n {{dataItem[col.ref] | customDateFormatter: col.customDateFormat.inputFormat:col.customDateFormat.outputFormat }}\n \n \n \n \n {{dataItem[col.ref] | emptyMask: col.customValueIfBlank }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n {{dataItem[col.ref]}} ({{dataItem['customernumber']}})\n \n \n \n \n
    N
    \n
    Y
    \n
    \n
    \n \n \n
    {{dataItem[col.ref]}}
    \n
    {{dataItem[col.ref]}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n {{col.drillDownDetailsLabel}}\n \n \n \n \n {{dataItem[col.ref] | date: col.dateFormat }}\n \n \n \n \n Anonymous\n \n \n \n \n {{dataItem[col.ref] | customDateFormatter: col.customDateFormat.inputFormat:col.customDateFormat.outputFormat }}\n \n \n \n \n {{dataItem[col.ref] | emptyMask: col.customValueIfBlank }}\n \n \n \n \n \n \n
    \n
    ","import { Component, OnInit, Renderer2 } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {Location} from '@angular/common';\nimport {Style2Pages} from '../../configuration/details/style2-pages';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-style2-grid',\n templateUrl: './style2-grid.component.html',\n styleUrls: ['./style2-grid.component.scss']\n})\nexport class Style2GridComponent extends GridComponent implements OnInit {\n\n style2Pages = Style2Pages;\n config = null;\n public state = RequestState.Inactive;\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n protected refreshHandler: RefreshHandlerService\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style2Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style2Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n const types = {};\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n const colData = {\n ref: this.config.table.dataCols[i].key,\n refLink: this.config.table.dataCols[i].refLink,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n dateFormat: this.config.table.dataCols[i].dateFormat,\n class: this.config.table.dataCols[i].class,\n hidden: this.config.table.dataCols[i].hidden,\n export: false,\n renderCustomerNameNumStyle: this.config.table.dataCols[i].renderCustomerNameNumStyle,\n renderHitMissStyle: this.config.table.dataCols[i].renderHitMissStyle,\n renderALC12MAStyle: this.config.table.dataCols[i].renderALC12MAStyle,\n renderCustomerStyleForAmbMetrics: this.config.table.dataCols[i].renderCustomerStyleForAmbMetrics,\n customStyle: this.config.table.dataCols[i].customStyle,\n customDateFormat: this.config.table.dataCols[i].customDateFormat,\n customValueIfBlank: this.config.table.dataCols[i].customValueIfBlank,\n renderAgedYNStyle: this.config.table.dataCols[i].renderAgedYNStyle,\n\n };\n this.dataCols.push(colData);\n if (colData.hidden !== true || this.config.table.dataCols[i].export) {\n const colDataExcel = {\n ref: this.config.table.dataCols[i].key + 'Export',\n refLink: this.config.table.dataCols[i].refLink,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n dateFormat: this.config.table.dataCols[i].dateFormat,\n class: this.config.table.dataCols[i].class,\n hidden: true,\n export: true,\n renderCustomerNameNumStyle: this.config.table.dataCols[i].renderCustomerNameNumStyle,\n renderHitMissStyle: this.config.table.dataCols[i].renderHitMissStyle,\n renderALC12MAStyle: this.config.table.dataCols[i].renderALC12MAStyle,\n renderCustomerStyleForAmbMetrics: this.config.table.dataCols[i].renderCustomerStyleForAmbMetrics,\n customStyle: this.config.table.dataCols[i].customStyle,\n customDateFormat: this.config.table.dataCols[i].customDateFormat,\n customValueIfBlank: this.config.table.dataCols[i].customValueIfBlank,\n renderAgedYNStyle: this.config.table.dataCols[i].renderAgedYNStyle,\n };\n this.dataCols.push(colDataExcel);\n if ('type' in this.config.table.dataCols[i]) {\n types[this.config.table.dataCols[i].key + 'Export'] = this.config.table.dataCols[i].type;\n }\n }\n if ('type' in this.config.table.dataCols[i]) {\n types[this.config.table.dataCols[i].key] = this.config.table.dataCols[i].type;\n }\n }\n if (this.config.dataArraySplitColKey !== undefined) {\n for (let i = 0; i < this.config.table.dataArraySplitCols.length; i++) {\n const splitColData = {\n ref: this.config.table.dataArraySplitCols[i].key,\n description: this.config.table.dataArraySplitCols[i].title,\n width: this.config.table.dataArraySplitCols[i].width,\n customStyle: this.config.table.dataArraySplitCols[i].customStyle,\n customValueIfBlank: this.config.table.dataArraySplitCols[i].customValueIfBlank,\n hidden: false,\n export: false\n };\n this.dataCols.push(splitColData);\n if (splitColData.hidden !== true) {\n const splitColDataExcel = {\n ref: this.config.table.dataArraySplitCols[i].key + 'Export',\n description: this.config.table.dataArraySplitCols[i].title,\n width: this.config.table.dataArraySplitCols[i].width,\n customStyle: this.config.table.dataArraySplitCols[i].customStyle,\n customValueIfBlank: this.config.table.dataArraySplitCols[i].customValueIfBlank,\n hidden: true,\n export: true,\n };\n this.dataCols.push(splitColDataExcel);\n if ('type' in this.config.table.dataArraySplitCols[i]) {\n types[this.config.table.dataArraySplitCols[i].key + 'Export'] = this.config.table.dataArraySplitCols[i].type;\n }\n }\n if ('type' in this.config.table.dataArraySplitCols[i]) {\n types[this.config.table.dataArraySplitCols[i].key] = this.config.table.dataArraySplitCols[i].type;\n }\n }\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n this.dataCols.push({\n description: this.config.table.drillDownCols[i].title,\n width: this.config.table.drillDownCols[i].width,\n drillDownDetailsColName: this.config.table.drillDownCols[i].drillDownDetailsColName,\n drillDownDetailsLabel: this.config.table.drillDownCols[i].drillDownDetailsLabel,\n drillDownDetailsLink: this.config.table.drillDownCols[i].drillDownDetailsLink\n });\n }\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let dataRow = {};\n if (this.config.table.needEntireApiDataRecord === true) {\n dataRow = apiData[this.config.dataArrayKey][r];\n for (const rowCol in dataRow) {\n if (rowCol in types) {\n if (types[rowCol] === 'int') {\n dataRow[rowCol] = parseInt(dataRow[rowCol]);\n } else if (types[rowCol] === 'float') {\n dataRow[rowCol] = parseFloat(dataRow[rowCol]);\n }\n if (isNaN(dataRow[rowCol])) {\n dataRow[rowCol] = null;\n }\n if (rowCol + 'Export' in dataRow) {\n dataRow[rowCol + 'Export'] = dataRow[rowCol];\n }\n }\n }\n this.dataRows.push(dataRow);\n } else {\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n dataRow[this.config.table.dataCols[i].key] = apiData[this.config.dataArrayKey][r][this.config.table.dataCols[i].key];\n }\n if (this.config.dataArraySplitColKey !== undefined) {\n let arrayObjToSplit = apiData[this.config.dataArrayKey][r][this.config.dataArraySplitColKey];\n for (let i = 0; i < this.config.table.dataArraySplitCols.length; i++) {\n for (let j = 0; j < arrayObjToSplit.length; j++) {\n if (this.config.table.dataArraySplitCols[i].title === arrayObjToSplit[j][this.config.table.dataArraySplitCols[i].arrayMappingKey]) {\n dataRow[this.config.table.dataArraySplitCols[i].key] = arrayObjToSplit[j][this.config.table.dataArraySplitCols[i].arrayMappingValue];\n break;\n }\n }\n }\n }\n // if (this.config.table.drillDownCols !== undefined) {\n // for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n // dataRow[this.config.table.drillDownCols[i].drillDownDetailsKey]\n // = apiData[this.config.dataArrayKey][r][this.config.table.drillDownCols[i].drillDownDetailsKey];\n // }\n // }\n for (const rowCol in dataRow) {\n if (rowCol in types) {\n if (types[rowCol] === 'int') {\n dataRow[rowCol] = parseInt(dataRow[rowCol]);\n } else if (types[rowCol] === 'float') {\n dataRow[rowCol] = parseFloat(dataRow[rowCol]);\n }\n if (isNaN(dataRow[rowCol])) {\n dataRow[rowCol] = null;\n }\n if (rowCol + 'Export' in dataRow) {\n dataRow[rowCol + 'Export'] = dataRow[rowCol];\n }\n }\n }\n this.dataRows.push(dataRow);\n }\n }\n // transform data rows to add in export data\n for (const rowKey in this.dataRows) {\n if (this.dataRows.hasOwnProperty(rowKey)) {\n const row = this.dataRows[rowKey];\n for (const rowCol in row) {\n if (rowCol in row) {\n const columnInfoExport = this.getColumnInfo(this.dataCols, rowCol + 'Export');\n const columnInfo = this.getColumnInfo(this.dataCols, rowCol);\n let value = row[rowCol];\n if (columnInfo !== null && columnInfo.renderHitMissStyle) {\n if (value === 'Yes' || value === 'hit') {\n value = 'Hit';\n } else if (value === 'No' || value === 'miss') {\n value = 'Miss';\n }\n }\n if (columnInfo !== null && this.config.pageTitle == 'Open TSB Details' && columnInfo.ref === 'tsbduedate') {\n value = new Date(value);\n if (value instanceof Date && !isNaN(value.valueOf())) {\n let month = '' + (value.getMonth() + 1);\n let day = '' + value.getDate();\n const year = value.getFullYear();\n if (month.length < 2) {\n month = '0' + month;\n }\n if (day.length < 2) {\n day = '0' + day;\n }\n value = year + '-' + month + '-' + day;\n } else {\n value = '';\n }\n }\n if (columnInfo !== null && this.config.pageTitle == 'Orders' && columnInfo.ref === 'orderdate') {\n value = new Date(value);\n if (value instanceof Date && !isNaN(value.valueOf())) {\n let month = '' + (value.getMonth() + 1);\n let day = '' + value.getDate();\n const year = value.getFullYear();\n if (month.length < 2) {\n month = '0' + month;\n }\n if (day.length < 2) {\n day = '0' + day;\n }\n value = year + '-' + month + '-' + day;\n } else {\n value = '';\n }\n }\n if (columnInfo !== null\n && this.config.pageTitle === 'Uptime Details'\n && (columnInfo.ref === 'aggdhrsdown' || columnInfo.ref === 'aggdaysdown')) {\n if (value === '' || value === null) { // || value == 0 || value == 0.0) {\n value = null;\n }\n }\n let newValue = value;\n if (columnInfoExport !== null && columnInfoExport.export === true) {\n if (columnInfoExport.renderAgedYNStyle) {\n if (value == 1 || value === true || value === 'true' || value === 'Y') {\n newValue = 'Y';\n } else if (value != 1 && value !== true && value !== 'true' && value !== 'Y') {\n newValue = 'N';\n }\n }\n this.dataRows[rowKey][rowCol] = value;\n this.dataRows[rowKey][rowCol + 'Export'] = newValue;\n }\n /*if (columnInfo !== null) {// && columnInfo.) {// for changing non excel grid values\n if (value == 1 || value === true) {\n this.dataRows[rowKey][rowCol] = 'Y';\n } else if (value == 0 || value === false) {\n this.dataRows[rowKey][rowCol] = 'N';\n }\n } else if (rowCol in types) {\n if (types[rowCol] === 'int') {\n this.dataRows[rowKey][rowCol] = parseInt(dataRow[rowCol]);\n } else if (types[rowCol] === 'float') {\n this.dataRows[rowKey][rowCol] = parseFloat(dataRow[rowCol]);\n }\n }*/\n }\n }\n }\n }\n this.updateGrid();\n }\n });\n }\n }\n\n getColumnInfo(dataCols, rowCol) {\n for (let i = 0; i < dataCols.length; i++) {\n if (dataCols[i].ref === rowCol) {\n return dataCols[i];\n }\n }\n return null;\n }\n\n public getDrillDownDetailsLinkWithParams(colName: any, drillDownLink: any, dataItem: any) {\n let hrefRouterLink = '';\n if (colName === 'hotsheets_survey_comments' || colName === 'customer_nps_survey_comments') {\n hrefRouterLink = drillDownLink + \"/\" + dataItem['customernumber'] + \"/\" + dataItem['country'] + \"/\" + dataItem['interviewdate'];\n } else if (colName == 'uptime_customer_details') {\n hrefRouterLink = drillDownLink + \"/\" + dataItem['custid'] + \"/\" + dataItem['cust'] + \"/\" + dataItem['country'];\n } else if (colName == 'customer_order_details' || colName == 'amb_customer_order_details') {\n hrefRouterLink = drillDownLink + \"/\" + dataItem['customer'] + \"/\" + dataItem['ordernumber'] + \"/\" + dataItem['orderstatus'];\n } else if (colName == 'rnps_survey_comments') {\n hrefRouterLink = drillDownLink + \"/\" + dataItem['value'] + \"/\" + (dataItem['customername'] == null ? 'NA' : encodeURIComponent(dataItem['customername']))\n + \"/\" + dataItem['country'] + \"/\" + dataItem['interviewdate'] + \"/\" + dataItem['resolved'];\n } else {\n hrefRouterLink = drillDownLink;\n }\n\n return hrefRouterLink;\n }\n\n public showDetailsLink(colName: any, dataItem: any) {\n if (colName == 'rnps_survey_comments') {\n if (dataItem['detractor'] != undefined && dataItem['detractor'].length > 0) {\n return true;\n } else {\n return false;\n }\n }\n return true;\n }\n\n}\n","
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { Style2Pages } from 'src/app/configuration/details/style2-pages';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\n\n@Component({\n selector: 'app-style2',\n templateUrl: './style2.component.html',\n styleUrls: ['./style2.component.scss']\n})\nexport class Style2Component implements OnInit {\n\n style2Pages = Style2Pages;\n config = null;\n\n constructor(\n private location: Location,\n private navbarBuilderService: NavbarBuilderService\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style2Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style2Pages[currentRouterLocation];\n // console.log(this.config);\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: true,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n }\n }\n}\n","export const Style3Pages = {\n '/hsi/details': {\n pageTitle: 'HSI - Instruments',\n apiRequestHandler: '/metrics/hsi/details',\n backPageLabel: 'Back',\n backPageLink: '/hsi',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'hsi_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n width: 50,\n customStyle: { 'text-align': 'right' },\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n width: 50,\n customStyle: { 'text-align': 'right' },\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/cpyr/details': {\n pageTitle: 'CPY-R - Instruments',\n apiRequestHandler: '/metrics/cpyr/details',\n backPageLabel: 'Back',\n backPageLink: '/cpyr',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'cpyr_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n width: 50,\n customStyle: { 'text-align': 'right' },\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n width: 50,\n customStyle: { 'text-align': 'right' },\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/servicecost/details': {\n pageTitle: 'Service Cost - Instruments',\n apiRequestHandler: '/metrics/servicecost/details',\n backPageLabel: 'Back',\n backPageLink: '/servicecost',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'servicecost_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 75\n },\n {\n title: 'Instrument Name',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 75\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'CPY-T 12mo',\n key: 'cpy12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Actual Cost',\n key: 'actualcost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Goal Cost',\n key: 'goalcost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Parts Cost',\n key: 'partscostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Travel Cost',\n key: 'travelcostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Labor Cost',\n key: 'laborcostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n }\n ]\n }\n },\n '/alconnected/details': {\n pageTitle: 'AbbottLink Installed - Instruments',\n apiRequestHandler: '/metrics/alconnected/details',\n backPageLabel: 'Back',\n backPageLink: '/alconnected',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'al_installed_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n width: 50,\n customStyle: { 'text-align': 'right' },\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/alconnectivity/details': {\n pageTitle: 'AbbottLink Connectivity - Instruments',\n apiRequestHandler: '/metrics/alconnectivity/details',\n backPageLabel: 'Back',\n backPageLink: '/alconnectivity',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'alconnectivity_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50,\n type: 'int'\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/hci/details': {\n pageTitle: 'HCI - Instruments',\n apiRequestHandler: '/metrics/hci/details',\n backPageLabel: 'Back',\n backPageLink: '/hci',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'hci_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/cpyp/details': {\n pageTitle: 'CPY-P - Instruments',\n apiRequestHandler: '/metrics/cpyp/details',\n backPageLabel: 'Back',\n backPageLink: '/cpyp',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'cpyp_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true,\n type: 'int'\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true,\n type: 'int'\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/servicecosthours/details': {\n pageTitle: 'Service Hours - Instruments',\n apiRequestHandler: '/metrics/servicecosthours/details',\n backPageLabel: 'Back',\n backPageLink: '/servicecosthours',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'servicecosthours_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Instrument Name',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 75\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable',\n key: 'connectable',\n width: 50,\n hidden: true\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'CPY-T 12mo',\n key: 'cpy12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n // appears that these two are duplicates of the Service Cost columns\n // {\n // title: 'Actual Cost',\n // key: 'actualcost',\n // customStyle: { 'text-align': 'right' },\n // width: 50\n // },\n // {\n // title: 'Goal Cost',\n // key: 'goalcost',\n // customStyle: { 'text-align': 'right' },\n // width: 50\n // },\n {\n title: 'Parts Cost',\n key: 'partscostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Travel Hours 1mo',\n key: 'travelhours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Travel Cost',\n key: 'travelcostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Labor Hours 1mo',\n key: 'laborhours',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Labor Cost',\n key: 'laborcostcomponent',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n }\n ]\n }\n },\n '/utilization/details': {\n pageTitle: 'Low Utilization - Instruments',\n apiRequestHandler: '/metrics/utilization/details',\n backPageLabel: 'Back',\n backPageLink: '/utilization',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'utilization_instrument_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'Connectable %',\n key: 'connectable',\n hidden: true,\n width: 50\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Service Cost Goal',\n key: 'servicecostgoal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'SCpT',\n key: 'costpertest',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n },\n {\n title: 'CPY-P 12mo',\n key: 'cpyp12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R 3mo',\n key: 'cpyr3mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'CPY-R Goal',\n key: 'cpyr3goal',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'float'\n }\n ]\n }\n },\n '/CRLSummary/details': {\n pageTitle: 'Current Instrument Quantity',\n apiRequestHandler: '/metrics/CRLSummary/details',\n backPageLabel: 'Back',\n backPageLink: '/CRLSummary',\n dataArrayKey: 'instruments',\n table: {\n type: 'style3',\n exportFileName: 'current_instrument_quantity.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n /*{\n title: 'Country',\n key: 'country',\n width: 50\n },*/\n {\n title: 'Instrument',\n key: 'productlinename',\n width: 65\n },\n {\n title: 'Serial Number',\n key: 'instrumentsrno',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ],\n width: 80\n },\n {\n title: 'CPY-R 12mo',\n key: 'cpyr12mo',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'AL',\n key: 'al',\n width: 50,\n filterable: false,\n renderALStyle: true\n },\n {\n title: 'ALC %',\n key: 'connectableper',\n alKey: 'al',\n alConnectableCompareKey: 'connectable',\n width: 60,\n renderALConnectableStyle: true,\n type: 'float'\n },\n {\n title: 'Maint Score',\n key: 'maintscore',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderMaintenanceScoreStyle: true,\n type: 'int'\n },\n {\n title: 'HCI',\n key: 'hci',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'HSI',\n key: 'hsi',\n width: 50,\n renderHCIHSIStyle: true\n },\n {\n title: 'Service Cost',\n key: 'servicecost',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'Test Count',\n key: 'testcount',\n customStyle: { 'text-align': 'right' },\n width: 50,\n type: 'int'\n },\n {\n title: 'TSB Due',\n key: 'tsbdue',\n customStyle: { 'text-align': 'right' },\n width: 50,\n renderTSBDueStyle: true,\n type: 'int'\n },\n {\n title: 'Primary TSS',\n key: 'primarytssid',\n width: 50,\n },\n {\n title: 'Secondary TSS',\n key: 'secondarytssid',\n width: 50,\n },\n {\n title: 'Tertiary TSS',\n key: 'tertiarytssid',\n width: 50,\n }\n ]\n }\n }\n /*\n [Route(\"CRLSummary\")]\n [HttpPost]\n public HttpResponseMessage GetCRLSummaryIntermediate([FromBody]JObject obj)\n {\n var jsonObj = JsonConvert.SerializeObject(obj);\n CRLSummaryIntermediateInput inputObj = JsonConvert.DeserializeObject(jsonObj);\n\n inputObj.abbottid = WebAPIUtilies.ConvertAllBlankNull(inputObj.abbottid);\n inputObj.customerid = WebAPIUtilies.ConvertAllBlankNull(inputObj.customerid);\n inputObj.productlineid = WebAPIUtilies.ConvertAllBlankNull(inputObj.productlineid);\n inputObj.sn = WebAPIUtilies.ConvertAllBlankNull(inputObj.sn);\n inputObj.managerid = Convert.ToInt32(WebAPIUtilies.ConvertAllBlankNull(inputObj.managerid.ToString()));\n inputObj.metrictypeid = (int)MetricConstant.MetricType.Billboard;\n CRLSummaryIntermediateOutput CRLSummaryIntermediate = _metricsService.GetCRLSummaryIntermediateData(inputObj);\n return WebAPIUtilies.ConvertJsonToHttpResponseMessage(CRLSummaryIntermediate, this.Request);\n }\n\n /// \n /// Retrieves CRL Summary metric details, parsing a JSON request contained in the HttpRequest body.\n /// \n [Route(\"CRLSummary/details\")]\n [HttpPost]\n public HttpResponseMessage GetCRLSummaryDetails([FromBody]JObject obj)\n {\n var jsonObj = JsonConvert.SerializeObject(obj);\n CRLSummaryDetailInput inputObj = JsonConvert.DeserializeObject(jsonObj);\n\n inputObj.abbottid = WebAPIUtilies.ConvertAllBlankNull(inputObj.abbottid);\n inputObj.customerid = WebAPIUtilies.ConvertAllBlankNull(inputObj.customerid);\n inputObj.productlineid = WebAPIUtilies.ConvertAllBlankNull(inputObj.productlineid);\n inputObj.sn = WebAPIUtilies.ConvertAllBlankNull(inputObj.sn);\n inputObj.managerid = Convert.ToInt32(WebAPIUtilies.ConvertAllBlankNull(inputObj.managerid.ToString()));\n\n CRLSummaryDetailOutput CRLSummaryDetail = _metricsService.GetCRLSummaryDetailData(inputObj);\n return WebAPIUtilies.ConvertJsonToHttpResponseMessage(CRLSummaryDetail, this.Request);\n }\n\n */\n};\n","
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n {{dataItem[col.ref]}}\n {{dataItem[col.ref]}}\n {{dataItem[col.ref]}}\n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n {{dataItem[col.ref]}}\n {{dataItem[col.ref]}}\n \n \n \n \n {{dataItem[col.ref] | emptyMask}}\n {{dataItem[col.ref]}} \n \n \n \n \n {{dataItem[col.ref]}}\n \n
    \n \n
    \n \n
    \n \n \n \n \n
    ","import { Component, OnInit, Renderer2 } from '@angular/core';\nimport {GridComponent} from '../grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {Location} from '@angular/common';\nimport {Style3Pages} from '../../configuration/details/style3-pages';\nimport { combineLatest } from 'rxjs';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport { filterBy } from '@progress/kendo-data-query';\n\n@Component({\n selector: 'app-style3-grid',\n templateUrl: './style3-grid.component.html',\n styleUrls: ['./style3-grid.component.scss']\n})\nexport class Style3GridComponent extends GridComponent implements OnInit {\n dataCols = [];\n dataRows = [];\n\n style3Pages = Style3Pages;\n config = null;\n public state = RequestState.Inactive;\n\n public menuItems: any[] = [];\n public offset: any;\n public selected: any;\n public showContextMenu: boolean = false;\n private documentClickSubscription: any;\n\n constructor(\n protected location: Location,\n protected apiService: ApiService,\n private renderer: Renderer2,\n protected refreshHandler: RefreshHandlerService\n ) {\n super();\n this.onCellClick = this.onCellClick.bind(this);\n this.documentClickSubscription = this.renderer.listen('document', 'click', () => {\n this.showContextMenu = false;\n });\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style3Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style3Pages[currentRouterLocation];\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n const types = {};\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n const colData = {\n ref: this.config.table.dataCols[i].key,\n refLink: this.config.table.dataCols[i].refLink,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n renderRefStyle: this.config.table.dataCols[i].renderRefStyle,\n renderALStyle: this.config.table.dataCols[i].renderALStyle,\n alKey: this.config.table.dataCols[i].alKey,\n alConnectableCompareKey: this.config.table.dataCols[i].alConnectableCompareKey,\n renderALConnectableStyle: this.config.table.dataCols[i].renderALConnectableStyle,\n renderMaintenanceScoreStyle: this.config.table.dataCols[i].renderMaintenanceScoreStyle,\n renderHCIHSIStyle: this.config.table.dataCols[i].renderHCIHSIStyle,\n renderTSBDueStyle: this.config.table.dataCols[i].renderTSBDueStyle,\n class: this.config.table.dataCols[i].class,\n hidden: this.config.table.dataCols[i].hidden,\n export: false,\n customStyle: this.config.table.dataCols[i].customStyle,\n filterable: this.config.table.dataCols[i].filterable\n };\n this.dataCols.push(colData);\n if (colData.hidden !== true) {\n const colDataExcel = {\n ref: this.config.table.dataCols[i].key + 'Export',\n refLink: this.config.table.dataCols[i].refLink,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n renderRefStyle: this.config.table.dataCols[i].renderRefStyle,\n renderALStyle: this.config.table.dataCols[i].renderALStyle,\n alKey: this.config.table.dataCols[i].alKey,\n alConnectableCompareKey: this.config.table.dataCols[i].alConnectableCompareKey,\n renderALConnectableStyle: this.config.table.dataCols[i].renderALConnectableStyle,\n renderMaintenanceScoreStyle: this.config.table.dataCols[i].renderMaintenanceScoreStyle,\n renderHCIHSIStyle: this.config.table.dataCols[i].renderHCIHSIStyle,\n renderTSBDueStyle: this.config.table.dataCols[i].renderTSBDueStyle,\n class: this.config.table.dataCols[i].class,\n hidden: true,\n export: true,\n customStyle: this.config.table.dataCols[i].customStyle,\n filterable: this.config.table.dataCols[i].filterable\n };\n this.dataCols.push(colDataExcel);\n if ('type' in this.config.table.dataCols[i]) {\n types[this.config.table.dataCols[i].key + 'Export'] = this.config.table.dataCols[i].type;\n }\n }\n if ('type' in this.config.table.dataCols[i]) {\n types[this.config.table.dataCols[i].key] = this.config.table.dataCols[i].type;\n }\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n const row = apiData[this.config.dataArrayKey][r];\n const ALColumnInfo = this.getColumnInfo(this.dataCols, 'al');\n let alConnected = true;\n if ('al' in row && (row['al'] == 0 || row['al'] == 2)) {\n alConnected = false;\n }\n for (const rowCol in row) {\n const columnInfoExport = this.getColumnInfo(this.dataCols, rowCol + 'Export');\n const columnInfo = this.getColumnInfo(this.dataCols, rowCol);\n const value = row[rowCol];\n let newValue = value;\n if (columnInfoExport !== null && columnInfoExport.export === true) {\n if (columnInfoExport.renderALStyle) {\n if (value == 0) {\n newValue = 'AL NOT Installable';\n } else if (value == 1) {\n newValue = 'AL Installed';\n } else if (value == 2) {\n newValue = 'AL NOT Installed';\n }\n } else if (columnInfoExport.renderHCIHSIStyle) {\n if (value == 1 || value === true) {\n newValue = 'Y';\n } else if (value == 0 || value === false) {\n newValue = 'N';\n }\n }\n row[rowCol + 'Export'] = newValue;\n }\n if (columnInfo !== null && columnInfo.renderHCIHSIStyle) {\n if (value == 1 || value === true) {\n row[rowCol] = 'Y';\n } else if (value == 0 || value === false) {\n row[rowCol] = 'N';\n }\n } else if (rowCol in types) {\n if (types[rowCol] === 'int') {\n row[rowCol] = parseInt(row[rowCol]);\n } else if (types[rowCol] === 'float') {\n row[rowCol] = parseFloat(row[rowCol]);\n }\n if (isNaN(row[rowCol])) {\n row[rowCol] = null;\n }\n if (rowCol + 'Export' in row) {\n row[rowCol + 'Export'] = row[rowCol];\n }\n }\n if (!alConnected && ['connectableper', 'maintscore', 'testcount', 'costpertest'].includes(rowCol)) {\n row[rowCol] = null;\n }\n if (!alConnected && ['connectableperExport', 'maintscoreExport', 'testcountExport', 'costpertestExport'].includes(rowCol + 'Export')) {\n row[rowCol + 'Export'] = null;\n }\n }\n this.dataRows.push(row);\n }\n this.updateGrid();\n }\n });\n }\n }\n\n getColumnInfo(dataCols, rowCol) {\n for (let i = 0; i < dataCols.length; i++) {\n if (dataCols[i].ref === rowCol) {\n return dataCols[i];\n }\n }\n return null;\n }\n\n public onCellClick({dataItem, column, type, originalEvent}): void {\n let contextMenuItemArr = [];\n if (type === 'click' && column.field === this.config.table.contextMenuFieldName) {\n originalEvent.preventDefault();\n for (let r = 0; r < this.config.table.dataCols.length; r++) {\n let dataCol = this.config.table.dataCols[r];\n if (dataCol.contextMenuItems !== undefined) {\n for (let k = 0; k < dataCol.contextMenuItems.length; k++) {\n contextMenuItemArr.push({\n 'text': dataCol.contextMenuItems[k].text,\n 'iconUrl': dataCol.contextMenuItems[k].iconUrl, \n 'textLink': dataItem[dataCol.contextMenuItems[k].fieldName][dataCol.contextMenuItems[k].columnIndex] });\n }\n }\n }\n this.menuItems = contextMenuItemArr;\n this.showContextMenu = true;\n this.offset = { left: originalEvent.pageX, top: originalEvent.pageY };\n } else {\n this.showContextMenu = false;\n } \n }\n\n public menuItemSelected(item: any): void {\n this.selected = item;\n }\n\n getMaintenanceScoreStyle(item: any) {\n if (item !== undefined && parseInt(item) >= 0 && parseInt(item) <= 29) {\n return {\n color: 'red'\n };\n }\n return {\n color: 'black'\n };\n }\n\n /** This could be customized for global search functionality in Kendo UI grids */\n onInput(filter) {\n this.gridData = filterBy(this.dataRows, {\n logic: 'or',\n filters: [\n { field: \"customername\", operator: \"contains\", value: filter, ignoreCase: true },\n { field: \"instrumentsrno\", operator: \"contains\", value: filter, ignoreCase: true },\n ]\n });\n }\n}\n","
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { Style3Pages } from 'src/app/configuration/details/style3-pages';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\n\n@Component({\n selector: 'app-style3',\n templateUrl: './style3.component.html',\n styleUrls: ['./style3.component.scss']\n})\nexport class Style3Component implements OnInit {\n\n style3Pages = Style3Pages;\n config = null;\n\n constructor(\n private location: Location,\n private navbarBuilderService: NavbarBuilderService\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n if (this.style3Pages.hasOwnProperty(currentRouterLocation)) {\n this.config = this.style3Pages[currentRouterLocation];\n // console.log(this.config);\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: true,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n }\n }\n}\n","export const Style4Pages = {\n '/assay': {\n pageTitle: 'Top Assay Details',\n apiRequestHandler: '/metrics/assay/details',\n backPageLabel: 'Back',\n backPageLink: '/lastSelectedDashboard',\n dataArrayKey: 'customers',\n groupItemsKey: 'assays',\n groupField: 'customername',\n groupFieldId: 'custid',\n groupCountField: 'count',\n customerDetailsLink: 'customers',\n table: {\n type: 'style4',\n needEntireApiDataRecord: true,\n exportFileName: 'assay_details.xlsx',\n dataCols: [\n {\n title: 'Customer Name',\n key: 'customername',\n hidden: true,\n groupHeaderColumn: true\n },\n {\n title: 'Assay Name',\n key: 'assayname'\n },\n {\n title: 'Test Counts (3 months)',\n customStyle: { 'text-align': 'right' },\n key: 'testcount'\n },\n {\n title: '% All Tests',\n customStyle: { 'text-align': 'right' },\n key: 'alltestper',\n addCustomerDetailsLink: true\n }\n ]\n }\n },\n '/assay/customers': {\n pageTitle: 'Assay Customer Details',\n apiRequestHandler: '/metrics/assay/details/customerdetails',\n backPageLabel: 'Assay Details',\n backPageLink: '/assay',\n dataArrayKey: 'instruments',\n groupItemsKey: 'assays',\n groupField: 'instrumentnameserialnum',\n groupFieldsToAppend: ['instrumentname', 'serialno'],\n groupCountField: 'count',\n customerDetailsLink: 'customers',\n table: {\n type: 'style4',\n needEntireApiDataRecord: true,\n exportFileName: 'assay_customer_details.xlsx',\n dataCols: [\n {\n title: 'Instrument Name and Serial Number',\n key: 'instrumentnameserialnum',\n hidden: true,\n groupHeaderColumn: true\n },\n {\n title: 'Assay Name',\n key: 'assayname'\n },\n {\n title: 'Test Counts (3 months)',\n customStyle: { 'text-align': 'right' },\n key: 'testcount'\n },\n {\n title: '% All Tests',\n customStyle: { 'text-align': 'right' },\n key: 'alltestper'\n }\n ]\n }\n }\n};","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n {{value}}\n \n \n \n \n \n {{ aggregates[config.groupCountField] }} Unique Assays \n >\n \n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport { ActivatedRoute } from '@angular/router';\nimport { State } from '@progress/kendo-data-query';\nimport {ExcelExportData} from '@progress/kendo-angular-excel-export';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport { Style4Pages } from 'src/app/configuration/details/style4-pages';\n\n@Component({\n selector: 'app-style4',\n templateUrl: './style4.component.html',\n styleUrls: ['./style4.component.scss']\n})\nexport class Style4Component implements OnInit {\n\n dataCols = [];\n dataRows = [];\n groups = [];\n aggregates: any[] = [];\n\n gridData: any;\n exportState: State = {};\n\n style4Pages = Style4Pages;\n config = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) {\n // super();\n this.allData = this.allData.bind(this);\n }\n\n // checkIf(value: any){\n // debugger; //open the devtools and go to the view...code execution will stop here!\n // //..code to be checked... `value` can be inspected now along with all of the other component attributes\n // }\n\n ngOnInit(): void {\n\n const currentRouterLocation = this.location.path();\n Object.keys(this.style4Pages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.style4Pages[key];\n return;\n }\n });\n if (this.config != null) {\n\n let customerid;\n let customername;\n\n this.route.paramMap.subscribe(params => {\n customerid = params.get('customerid');\n customername = params.get('customername');\n });\n\n this.groups = [{ field: this.config.groupField }];\n\n const titleText = customername != null && customername.trim().length > 0 ? customername : this.config.pageTitle;\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: true,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: titleText,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n const params = { months: 12 };\n if (customerid !== undefined) {\n params['customerdetail_id'] = customerid;\n }\n requestHandler.sendRequest(this.config.apiRequestHandler, params);\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, params});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n hidden: this.config.table.dataCols[i].hidden,\n addCustomerDetailsLink: this.config.table.dataCols[i].addCustomerDetailsLink,\n groupHeaderColumn: this.config.table.dataCols[i].groupHeaderColumn,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // this.gridData = process(apiData[this.config.dataArrayKey], { group: this.groups });\n // format dataRows for kendo component\n // GroupResulst -> aggregates -> The aggregated values for the group; field -> The field by which the data items are grouped.\n // -> items -> Contains either the subgroups, or the data items.; value -> The group key.; \n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let objectToParse = apiData[this.config.dataArrayKey][r];\n let groupRow = {};\n groupRow['aggregates'] = [];\n groupRow['aggregates'][this.config.groupCountField] = objectToParse[this.config.groupCountField];\n groupRow['aggregates'][this.config.groupFieldId] = objectToParse[this.config.groupFieldId];\n\n groupRow['field'] = this.config.groupField;\n if (this.config.groupFieldsToAppend !== undefined && this.config.groupFieldsToAppend.length == 2) {\n let groupFieldVal = objectToParse[this.config.groupFieldsToAppend[0]] + \"(\" + objectToParse[this.config.groupFieldsToAppend[1]] + \")\";\n groupRow['value'] = groupFieldVal;\n } else {\n groupRow['value'] = objectToParse[this.config.groupField];\n }\n groupRow['items'] = [];\n for (let i = 0; i < objectToParse[this.config.groupItemsKey].length; i++) {\n // groupRow['items'][this.config.groupField] = groupRow['value'];\n groupRow['items'].push(objectToParse[this.config.groupItemsKey][i]);\n }\n this.dataRows.push(groupRow);\n }\n const groupData = { 'data': this.dataRows, 'total': this.dataRows.length };\n this.gridData = groupData;\n\n /* let dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let objectToParse = apiData[this.config.dataArrayKey][r];\n for (let i = 0; i < objectToParse[this.config.groupItemsKey].length; i++) {\n let groupRow = {};\n let itemsArray = objectToParse[this.config.groupItemsKey][i];\n groupRow[this.config.groupField] = objectToParse[this.config.groupField];\n // copy all items element attributes to groupRow\n Object.entries(itemsArray).forEach(([key,value]) => { groupRow[key] = value });\n\n // groupRow['aggregates'] = [{ 'field': this.config.groupField, 'count': objectToParse[this.config.groupCountField] }\n // , { 'field': this.config.groupField, 'id': objectToParse[this.config.groupFieldId] }];\n dataRows.push(groupRow); \n } \n }\n this.gridData = process(dataRows, { group: this.groups });*/\n } \n });\n }\n }\n\n public getAggregateData(aggregateVal: any) {\n console.log(aggregateVal);\n }\n\n public allData(): ExcelExportData {\n const result: ExcelExportData = {\n // data: process(this.gridData, this.exportState).data,\n data: this.dataRows,\n group: this.groups\n };\n\n return result;\n }\n\n private detectMob() {\n return /iPad|iPhone|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }\n\n public getMaxHeight(): string {\n const userWindowHeight = window.screen.availHeight;\n const userWindowWidth = window.screen.availWidth;\n\n if (userWindowHeight < 300) {\n return 300 + 'px';\n } else if (userWindowWidth <= 768) {\n return (userWindowHeight - 100) + 'px';\n } else if (this.detectMob()) {\n return (userWindowHeight - 150) + 'px';\n }\n return (userWindowHeight - 250) + 'px';\n }\n\n\n}\n","export const ServiceContractStylePages = {\n '/servicecontracts': {\n pageTitle: 'Service Contracts',\n apiRequestHandler: '/metrics/servicecontracts/details',\n parentPageRequestHandler: '/metrics/servicecontracts',\n backPageLabel: 'Back',\n backPageLink: '/',\n dataArrayKey: 'details',\n table: {\n type: 'level2',\n exportFileName: 'service_contract_details.xlsx',\n contextMenuFieldName: 'instrumentsrno',\n dataCols: [\n {\n title: 'Customer Number',\n key: 'customernumber',\n hidden: true,\n export: true,\n width: 50\n },\n {\n title: 'Customer',\n key: 'customername',\n width: 80,\n export: true,\n renderCustomerNameNumStyle: true\n },\n {\n title: 'Instrument',\n key: 'pldescription',\n export: true,\n width: 65\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n width: 80,\n renderRefStyle: true,\n export: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ]\n },\n {\n title: 'Seas Code',\n key: 'seacode',\n export: true,\n width: 50\n },\n {\n title: 'Contract Name',\n key: 'contractname',\n export: true,\n width: 80\n },\n {\n title: 'Contract Number',\n key: 'contractno',\n export: true,\n width: 50\n },\n {\n title: 'Start Date',\n key: 'startdate',\n export: true,\n width: 50\n },\n {\n title: 'Expires',\n key: 'expires',\n export: true,\n width: 50\n },\n {\n title: 'Auto-Renew',\n key: 'autorenew',\n export: true,\n width: 50,\n }\n ],\n drillDownCols: [\n {\n title: 'Entitlement',\n key: 'entitlements',\n width: 60,\n entitlementLink: 'entitlements',\n export: false\n }\n ]\n }\n },\n '/servicecontracts/entitlements': {\n pageTitle: 'Service Contract Entitlements',\n apiRequestHandler: '/metrics/servicecontracts/details',\n backPageLabel: 'Service Contracts',\n backPageLink: '/servicecontracts',\n dataArrayKey: 'entitlements',\n table: {\n type: 'level3',\n exportFileName: 'service_contract_entitlements.xlsx',\n dataCols: [\n {\n title: 'Product Name',\n key: 'productname',\n width: 60,\n export: true\n },\n {\n title: 'Response Time',\n key: 'responsetime',\n width: 50,\n export: true\n },\n {\n title: 'End Date',\n key: 'enddate',\n width: 50,\n export: true\n },\n {\n title: 'Entitlement ID',\n key: 'entitlementid',\n hidden: true,\n width: 50,\n export: false\n },\n {\n title: 'Entitlement Description',\n key: 'description',\n width: 60,\n export: true\n },\n {\n title: 'List Number',\n key: 'listnumber',\n width: 50,\n export: true\n },\n {\n title: 'Cost Type',\n key: 'costtype',\n width: 50,\n export: true\n },\n {\n title: 'Contract Price',\n key: 'contractprice',\n customStyle: { 'text-align': 'right' },\n width: 50,\n export: true\n }\n ],\n drillDownCols: [\n {\n title: 'Entitlement Terms',\n key: 'entitlementid',\n width: 60,\n entitlementTermsLink: '/servicecontracts/entitlements/terms',\n export: false\n }\n ]\n }\n },\n '/servicecontracts/entitlements/terms': {\n pageTitle: 'Service Contract Entitlement Terms',\n apiRequestHandler: '/metrics/servicecontracts/details2',\n parentPageRequestHandler: '/metrics/servicecontracts/details',\n backPageLabel: 'Service Contract Entitlements',\n backPageLink: '/servicecontracts/entitlements',\n dataArrayKey: 'details',\n table: {\n type: 'level4',\n exportFileName: 'service_contract_entitlement_terms.xlsx',\n dataCols: [\n {\n title: 'Hours of Service Support',\n key: 'servicehours',\n width: 60\n },\n {\n title: 'Description',\n key: 'desc',\n width: 80\n },\n {\n title: 'Terms Type',\n key: 'termstype',\n width: 50\n },\n {\n title: 'Terms Category',\n key: 'termscategory',\n width: 50\n },\n {\n title: 'Terms Name',\n key: 'termsname',\n width: 50\n },\n {\n title: 'Cap',\n key: 'cap',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Covers Parts',\n key: 'coverparts',\n width: 50\n },\n {\n title: 'Covers Labor',\n key: 'coverslabor',\n width: 50\n },\n {\n title: 'Covers Travel',\n key: 'coverstravels',\n width: 50\n }\n ]\n }\n }\n};","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n {{dataItem[col.ref]}} ({{dataItem['customernumber']}})\n \n \n \n \n More \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit, Renderer2 } from '@angular/core';\nimport {Location} from '@angular/common';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport { ServiceContractStylePages } from '../service-contract-pages';\nimport { GridComponent } from '../../grid.component';\nimport { ApiService } from 'src/app/api/api.service';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { Observable } from 'rxjs';\nimport { GridDataResult } from '@progress/kendo-angular-grid';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\n\n\n@Component({\n selector: 'app-service-contracts-level2',\n templateUrl: './service-contracts-level2.component.html',\n styleUrls: ['./service-contracts-level2.component.scss']\n})\nexport class ServiceContractsLevel2Component extends GridComponent implements OnInit {\n\n stylePages = ServiceContractStylePages;\n config = null;\n public parentState = RequestState.Inactive;\n public state = RequestState.Inactive;\n parentApiData = null;\n\n public menuItems: any[] = [];\n public offset: any;\n public selected: any;\n public showContextMenu: boolean = false;\n private documentClickSubscription: any;\n\n constructor(\n private location: Location,\n private navbarBuilderService: NavbarBuilderService,\n protected apiService: ApiService,\n private renderer: Renderer2,\n protected refreshHandler: RefreshHandlerService\n ) { \n super();\n this.onCellClick = this.onCellClick.bind(this);\n this.documentClickSubscription = this.renderer.listen('document', 'click', () => {\n this.showContextMenu = false;\n });\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n }); \n \n const parentPageRequestHandler = this.apiService.get(this.config.parentPageRequestHandler);\n parentPageRequestHandler.onStateChange((parentState) => {\n this.parentState = parentState;\n });\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { });\n },\n parentPageRequestHandler.getRelativeParams(this.config.parentPageRequestHandler)\n );\n\n let subTitleText = '';\n // no need to send request here as chart tile has already done so\n parentPageRequestHandler.onStateChange((parentState) => {\n if (parentState === RequestState.Complete) {\n const response = parentPageRequestHandler.getResponse();\n this.parentApiData = JSON.parse(response.body);\n\n if (this.parentApiData != null) {\n subTitleText = this.parentApiData.contractexpNdays + \" expiring in 90 days (max 1000 records shown below)\";\n const pageTitle = this.config.pageTitle + \" - \" + subTitleText;\n this.navbarBuilderService.getNavFilterSelection().viewTitleText = pageTitle; \n }\n }\n }); \n }\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n }); \n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n hidden: this.config.table.dataCols[i].hidden,\n renderRefStyle: this.config.table.dataCols[i].renderRefStyle,\n export: this.config.table.dataCols[i].export,\n renderCustomerNameNumStyle: this.config.table.dataCols[i].renderCustomerNameNumStyle\n });\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.drillDownCols[i].key,\n description: this.config.table.drillDownCols[i].title,\n width: this.config.table.drillDownCols[i].width,\n export: this.config.table.drillDownCols[i].export,\n entitlementLink: this.config.table.drillDownCols[i].entitlementLink\n });\n } \n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n }\n });\n }\n\n public onCellClick({dataItem, column, type, originalEvent}): void {\n let contextMenuItemArr = [];\n if (type === 'click' && column.field === this.config.table.contextMenuFieldName) {\n originalEvent.preventDefault();\n for (let r = 0; r < this.config.table.dataCols.length; r++) {\n let dataCol = this.config.table.dataCols[r];\n if (dataCol.contextMenuItems !== undefined) {\n for (let k = 0; k < dataCol.contextMenuItems.length; k++) {\n contextMenuItemArr.push({\n 'text': dataCol.contextMenuItems[k].text,\n 'iconUrl': dataCol.contextMenuItems[k].iconUrl, \n 'textLink': dataItem[dataCol.contextMenuItems[k].fieldName][dataCol.contextMenuItems[k].columnIndex] });\n } \n }\n }\n this.menuItems = contextMenuItemArr;\n this.showContextMenu = true;\n this.offset = { left: originalEvent.pageX, top: originalEvent.pageY };\n } else {\n this.showContextMenu = false;\n } \n }\n\n public menuItemSelected(item: any): void {\n this.selected = item;\n }\n\n}\n","
    \n
    \n
    \n
    Customer: {{apiDataRecord.customername}} ({{apiDataRecord.customernumber}})
    \n
    Contract Name: {{apiDataRecord.contractname}}
    \n
    Instrument: {{apiDataRecord.pldescription}}
    \n
    SN: {{apiDataRecord.instrumentsrno}}
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n More \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {Location} from '@angular/common';\nimport { ServiceContractStylePages } from '../service-contract-pages';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { GridComponent } from '../../grid.component';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\n\n@Component({\n selector: 'app-service-contracts-level3',\n templateUrl: './service-contracts-level3.component.html',\n styleUrls: ['./service-contracts-level3.component.scss']\n})\nexport class ServiceContractsLevel3Component extends GridComponent implements OnInit {\n\n stylePages = ServiceContractStylePages;\n config = null;\n apiDataRecord = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n protected refreshHandler: RefreshHandlerService\n ) { \n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.route.paramMap.subscribe(params => {\n let customerNumber = params.get('customernumber');\n let serialNumber = params.get('serialnumber');\n let contractnumber = params.get('contractnumber');\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n \n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // find the correct apiData record for the routing params\n for (let r = 0; r < apiData['details'].length; r++) {\n let currentRec = apiData['details'][r];\n if (currentRec['customernumber'] == customerNumber\n && currentRec['instrumentsrno'] == serialNumber\n && currentRec['contractno'] == contractnumber) {\n this.apiDataRecord = currentRec;\n break;\n }\n }\n if (this.apiDataRecord != null) {\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n hidden: this.config.table.dataCols[i].hidden,\n customStyle: this.config.table.dataCols[i].customStyle,\n export: this.config.table.dataCols[i].export\n });\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.drillDownCols[i].key,\n description: this.config.table.drillDownCols[i].title,\n width: this.config.table.drillDownCols[i].width,\n entitlementTermsLink: this.config.table.drillDownCols[i].entitlementTermsLink,\n export: this.config.table.drillDownCols[i].export\n });\n }\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < this.apiDataRecord[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(this.apiDataRecord[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n }\n }\n });\n });\n }\n }\n\n}\n","
    \n
    \n
    \n
    Customer: {{apiDataRecord.customername}} ({{apiDataRecord.customernumber}})
    \n
    Contract Name: {{apiDataRecord.contractname}}
    \n
    Instrument: {{apiDataRecord.pldescription}}
    \n
    SN: {{apiDataRecord.instrumentsrno}}
    \n
    Entitlement Description: {{entitlementdesc}}
    \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {Location} from '@angular/common';\nimport { ServiceContractStylePages } from '../service-contract-pages';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { GridComponent } from '../../grid.component';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\n\n\n@Component({\n selector: 'app-service-contracts-level4',\n templateUrl: './service-contracts-level4.component.html',\n styleUrls: ['./service-contracts-level4.component.scss']\n})\nexport class ServiceContractsLevel4Component extends GridComponent implements OnInit {\n\n stylePages = ServiceContractStylePages;\n config = null;\n apiDataRecord = null;\n entitlementdesc = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n protected refreshHandler: RefreshHandlerService\n ) { \n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n\n this.route.paramMap.subscribe(params => {\n \n let customerNumber = params.get('customernumber');\n let serialNumber = params.get('serialnumber');\n let contractnumber = params.get('contractnumber');\n this.entitlementdesc = params.get('entitlementdesc');\n\n \n let backPageLink = this.config.backPageLink;\n\n backPageLink += \"/\" + customerNumber + \"/\" + serialNumber + \"/\" + contractnumber;\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const parentPageRequestHandler = this.apiService.get(this.config.parentPageRequestHandler);\n parentPageRequestHandler.onStateChange((state) => {\n this.state = state;\n });\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { months: 12});\n },\n parentPageRequestHandler.getRelativeParams(this.config.parentPageRequestHandler)\n );\n \n // no need to send request here as chart tile has already done so\n parentPageRequestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = parentPageRequestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // find the correct apiData record for the routing params\n for (let r = 0; r < apiData['details'].length; r++) {\n let currentRec = apiData['details'][r];\n if (currentRec['customernumber'] == customerNumber \n && currentRec['instrumentsrno'] == serialNumber \n && currentRec['contractno'] == contractnumber) {\n this.apiDataRecord = currentRec;\n break;\n }\n }\n }\n }); \n if (this.apiDataRecord != null) {\n let entitlementid = params.get('entitlementid');\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, servicecontract_entitlementid: entitlementid});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, servicecontract_entitlementid: entitlementid});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n \n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n \n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n hidden: this.config.table.dataCols[i].hidden,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n }\n });\n }\n });\n } \n }\n}","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {GridComponent} from '../grid.component';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n\n@Component({\n selector: 'app-uptime-customer-details',\n templateUrl: './uptime-customer-details.component.html',\n styleUrls: ['./uptime-customer-details.component.scss']\n})\n\nexport class UptimeCustomerDetailsComponent extends GridComponent implements OnInit {\n\n stylePages = {\n '/uptime/details/customerdetails': {\n pageTitle: 'Uptime Details - ',\n apiRequestHandler: '/metrics/uptime/customerdetails',\n backPageLabel: 'Uptime Details',\n backPageLink: '/uptime/details',\n dataArrayKey: 'instruments',\n table: {\n needEntireApiDataRecord: true,\n exportFileName: 'uptime_customer_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'cust',\n width: 80\n },\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Instrument',\n key: 'instrumentname',\n width: 65\n },\n {\n title: 'SN',\n key: 'instrumentsrno',\n width: 80\n },\n {\n title: 'Hours Down',\n key: 'hrsdown',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Days Down',\n key: 'daysdown',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Uptime %',\n key: 'uptimeper',\n customStyle: { 'text-align': 'right' },\n width: 50\n }\n ]\n }\n }\n };\n \n config = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) { \n super();\n }\n\n ngOnInit(): void {\n \n let customerid;\n let customername;\n let country;\n\n this.route.paramMap.subscribe(params => {\n customerid = params.get('customerid');\n customername = params.get('customername');\n country = params.get('country');\n }); \n \n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n let titleText = this.config.pageTitle + customername;\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: titleText,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, customerdetail_id: customerid});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, customerdetail_id: customerid});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n class: this.config.table.dataCols[i].class,\n hidden: this.config.table.dataCols[i].hidden,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let dataRow = {};\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n dataRow['cust'] = customername;\n dataRow['country'] = country;\n dataRow[this.config.table.dataCols[i].key] = apiData[this.config.dataArrayKey][r][this.config.table.dataCols[i].key];\n }\n for (const rowCol in dataRow) {\n let value = dataRow[rowCol];\n if (rowCol === 'hrsdown' || rowCol === 'daysdown') {\n if (value === '' || value === null) { // || value == 0 || value == 0.0 || string of 0) {\n value = null;\n }\n }\n dataRow[rowCol] = value;\n }\n this.dataRows.push(dataRow);\n }\n this.updateGrid();\n }\n });\n }\n }\n\n}\n","export const SurveyCommentPages = {\n 'hotsheets/survey_comments': {\n pageTitle: 'Translation Details',\n apiRequestHandler: '/metrics/hotsheets/details',\n backPageLabel: 'NPS Open Hotsheet Details',\n backPageLink: '/hotsheets',\n dataArrayKey: 'nps',\n dataArraySplitColKey: 'scores',\n table: {\n dataCols: [\n {\n key: 'customernumber'\n },\n {\n key: 'customername'\n },\n {\n key: 'country'\n },\n {\n key: 'interviewdate'\n }\n ],\n dataArraySplitCols: [\n {\n title: 'Overall', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'overall'\n },\n {\n title: 'Field Service', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'fieldservice'\n },\n {\n title: 'Product Quality',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productquality'\n },\n {\n title: 'Product Delivery',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productdelivery'\n },\n {\n title: 'Sales Rep',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'salesrep'\n },\n {\n title: 'Technical Support',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'technicalsupport'\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n key: 'detractor',\n }\n ]\n }\n },\n 'customerNps/details/survey_comments': {\n pageTitle: 'Translation Details',\n apiRequestHandler: '/metrics/nps/detail',\n backPageLabel: 'Customer NPS Survey Details',\n backPageLink: '/customerNps/details',\n dataArrayKey: 'details',\n dataArraySplitColKey: 'scores',\n table: {\n dataCols: [\n {\n key: 'customernumber'\n },\n {\n key: 'customername'\n },\n {\n key: 'country'\n },\n {\n key: 'interviewdate'\n }\n ],\n dataArraySplitCols: [\n {\n title: 'Overall', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'overall'\n },\n {\n title: 'Field Service', // maps to label\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'fieldservice'\n },\n {\n title: 'Product Quality',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productquality'\n },\n {\n title: 'Product Delivery',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'productdelivery'\n },\n {\n title: 'Sales Rep',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'salesrep'\n },\n {\n title: 'Technical Support',\n arrayMappingKey: 'label',\n arrayMappingValue: 'value',\n key: 'technicalsupport'\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n key: 'detractor',\n }\n ]\n }\n },\n 'rnps/detail/survey_comments': {\n pageTitle: 'rNPS Survey - Translation Details',\n apiRequestHandler: '/metrics/rnps/detail',\n backPageLabel: 'rNPS Surveys',\n backPageLink: '/rnps/detail',\n dataArrayKey: 'rows',\n table: {\n dataCols: [\n {\n key: 'customernum'\n },\n {\n key: 'customername'\n },\n {\n key: 'interviewdate'\n },\n {\n key: 'value'\n }\n ],\n drillDownCols: [\n {\n title: 'Survey Comments',\n key: 'detractor',\n }\n ]\n }\n }\n};","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Customer:Interview Date:Overall:Field Service:Product Delivery:Product Quality:Sales Rep:Technical Support:
    {{dataRow['customername']}}({{dataRow['customernumber']}}){{dataRow['interviewdate']}}{{dataRow['overall']}}{{dataRow['fieldservice']}}{{dataRow['productdelivery']}}{{dataRow['productquality']}}{{dataRow['salesrep']}}{{dataRow['technicalsupport']}}
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{comment.label}}
    Translation:{{comment.transvalue}}
    Native Language:{{comment.nativevalue}}
    \n
    \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport { SurveyCommentPages } from './survey-comment-pages';\n\n\n@Component({\n selector: 'app-survey-comment-details',\n templateUrl: './survey-comment-details.component.html',\n styleUrls: ['./survey-comment-details.component.scss']\n})\nexport class SurveyCommentDetailsComponent implements OnInit {\n\n stylePages = SurveyCommentPages;\n config = null;\n apiDataRecord = null;\n dataRow = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.route.paramMap.subscribe(params => {\n let customerNumber = params.get('customernumber');\n let country = params.get('country');\n let interviewDate = params.get('interviewdate');\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // find the correct apiData record for the routing params\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let currentRec = apiData[this.config.dataArrayKey][r];\n if (currentRec['customernumber'] == customerNumber && currentRec['country'] == country && currentRec['interviewdate'] == interviewDate) {\n this.apiDataRecord = currentRec;\n break;\n }\n } \n if (this.apiDataRecord != null) {\n // console.log(this.apiDataRecord);\n this.dataRow = {};\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataRow[this.config.table.dataCols[i].key] = this.apiDataRecord[this.config.table.dataCols[i].key];\n }\n if (this.config.dataArraySplitColKey !== undefined) {\n let arrayObjToSplit = this.apiDataRecord[this.config.dataArraySplitColKey]; \n for (let i = 0; i < this.config.table.dataArraySplitCols.length; i++) { \n for (let j = 0; j < arrayObjToSplit.length; j++) {\n if (this.config.table.dataArraySplitCols[i].title === arrayObjToSplit[j][this.config.table.dataArraySplitCols[i].arrayMappingKey]) {\n this.dataRow[this.config.table.dataArraySplitCols[i].key] = arrayObjToSplit[j][this.config.table.dataArraySplitCols[i].arrayMappingValue];\n break;\n } \n }\n }\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) { \n this.dataRow[this.config.table.drillDownCols[i].key] = this.apiDataRecord[this.config.table.drillDownCols[i].key];\n }\n } \n } \n // console.log(this.dataRow);\n } \n });\n });\n }\n }\n\n}\n","
    \n
    \n
    \n
    Customer: {{customername}}
    \n
    \n Order #: {{ordernumber}}\n Order Status: {{orderstatus}}\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref] | date: col.dateFormat }}\n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {GridComponent} from '../grid.component';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-customer-order-details',\n templateUrl: './customer-order-details.component.html',\n styleUrls: ['./customer-order-details.component.scss']\n})\nexport class CustomerOrderDetailsComponent extends GridComponent implements OnInit {\n\n stylePages = {\n '/orders/details': {\n pageTitle: 'Order Details',\n apiRequestHandler: '/metrics/orders/details',\n backPageLabel: 'Orders',\n backPageLink: '/orders/intermediate',\n dataArrayKey: 'orderdet',\n table: {\n needEntireApiDataRecord: true,\n exportFileName: 'customer_order_details.xlsx',\n dataCols: [\n {\n title: '#',\n key: 'linenumber',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'List Number',\n key: 'item',\n width: 50\n },\n {\n title: 'LN Desc',\n key: 'itemdesc',\n width: 80\n },\n {\n title: 'Lot #',\n key: 'lotnumber',\n width: 50\n },\n {\n title: 'Expiration Date',\n key: 'expirationdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Quantity',\n key: 'actualquantity',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Forecast Ship Date',\n key: 'forecastedshipdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Actual Ship Date',\n key: 'actualshipdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Expected Delivery Date',\n key: 'expecteddeliverydate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n }\n ]\n }\n },\n '/amb_orders/details': {\n pageTitle: 'Order Details (USD)',\n apiRequestHandler: '/amb_orders/details',\n backPageLabel: 'Orders',\n backPageLink: '/amb_orders/intermediate',\n dataArrayKey: 'orderdet',\n table: {\n needEntireApiDataRecord: true,\n exportFileName: 'amb_customer_order_details.xlsx',\n dataCols: [\n {\n title: '#',\n key: 'linenumber',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'List Number',\n key: 'item',\n width: 50\n },\n {\n title: 'LN Desc',\n key: 'itemdesc',\n width: 80\n },\n {\n title: 'Lot #',\n key: 'lotnumber',\n width: 50\n },\n {\n title: 'Expiration Date',\n key: 'expirationdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Amount',\n key: 'localamount',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Quantity',\n key: 'actualquantity',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Forecast Ship Date',\n key: 'forecastedshipdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Actual Ship Date',\n key: 'actualshipdate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n },\n {\n title: 'Expected Delivery Date',\n key: 'expecteddeliverydate',\n width: 50,\n dateFormat: \"yyyy-MM-dd\"\n }\n ]\n }\n }\n };\n\n config = null;\n public state = RequestState.Inactive;\n customername = null;\n ordernumber = null;\n orderstatus = null;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.route.paramMap.subscribe(params => {\n this.customername = params.get('customername');\n this.ordernumber = params.get('ordernumber');\n this.orderstatus = params.get('orderstatus');\n });\n\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, ordernumber: this.ordernumber});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, ordernumber: this.ordernumber});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n dateFormat: this.config.table.dataCols[i].dateFormat,\n customStyle: this.config.table.dataCols[i].customStyle,\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n\n for (const rowKey in this.dataRows) {\n if (this.dataRows.hasOwnProperty(rowKey)) {\n const row = this.dataRows[rowKey];\n for (const rowCol in row) {\n if (rowCol in row) {\n let value = row[rowCol];\n if (['expirationdate', 'forecastedshipdate', 'actualshipdate', 'expecteddeliverydate'].includes(rowCol)) {\n value = new Date(value);\n if (value instanceof Date && !isNaN(value.valueOf())) {\n let month = '' + (value.getMonth() + 1);\n let day = '' + value.getDate();\n const year = value.getFullYear();\n if (month.length < 2) {\n month = '0' + month;\n }\n if (day.length < 2) {\n day = '0' + day;\n }\n value = year + '-' + month + '-' + day;\n } else {\n value = '';\n }\n }\n this.dataRows[rowKey][rowCol] = value;\n }\n }\n }\n }\n\n this.updateGrid();\n }\n });\n }\n }\n}\n","
    \n
    \n
    \n \n \n\n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {GridComponent} from '../grid.component';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\n\n@Component({\n selector: 'app-sgm-details',\n templateUrl: './sgm-details.component.html',\n styleUrls: ['./sgm-details.component.scss']\n})\nexport class SGMDetailsComponent extends GridComponent implements OnInit {\n\n stylePages = {\n '/servicegrossmargin_customerSGM/details': {\n pageTitle: 'Service Gross Margin (SGM)',\n subTitle: '(Country YTD, Customer 12MA)',\n apiRequestHandler: '/metrics/servicegrossmargin_customerSGM/grid',\n backPageLabel: 'Back',\n backPageLink: '/servicegrossmargin_customerSGM',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'service_gross_margin_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customer',\n width: 100\n },\n {\n title: 'SGM %',\n key: 'sgm',\n customStyle: { 'text-align': 'right' },\n width: 100\n }\n ]\n }\n },\n '/amb_servicegrossmargin_customerSGM/details': {\n pageTitle: 'Service Gross Margin (SGM) (USD)',\n subTitle: '(Country YTD, Customer 12MA)',\n apiRequestHandler: '/metrics/amb_servicegrossmargin_customerSGM/grid',\n backPageLabel: 'Back',\n backPageLink: '/servicegrossmargin_customerSGM',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'amb_service_gross_margin_details.xlsx',\n dataCols: [\n {\n title: 'Account',\n key: 'customer',\n width: 100\n },\n {\n title: 'Direct Revenue',\n key: 'directrevenue',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'RAP',\n key: 'rap',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Net Revenue',\n key: 'netrevenue',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Service Expenses',\n key: 'serviceexpenses',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'SGM %',\n key: 'sgm',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ]\n }\n }\n };\n\n config = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private refreshHandler: RefreshHandlerService\n ) {\n super();\n }\n\n ngOnInit(): void {\n\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: true,\n viewSubtitleText: this.config.subTitle,\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, band: 0 });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, band: 0 });\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n dateFormat: this.config.table.dataCols[i].dateFormat,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n\n for (const rowKey in this.dataRows) {\n if (this.dataRows.hasOwnProperty(rowKey)) {\n const row = this.dataRows[rowKey];\n for (const rowCol in row) {\n if (rowCol in row) {\n let value = row[rowCol];\n if (['sgm'].includes(rowCol) && value === 'N/A') {\n value = null;\n console.log('value', value);\n }\n this.dataRows[rowKey][rowCol] = value;\n }\n }\n }\n }\n\n this.updateGrid();\n }\n });\n }\n }\n\n}\n","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n 0; else oneA\">\n {{dataItem[col.ref]}}\n \n \n {{dataItem[col.ref]}}\n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n {{col.drillDownDetailsLabel}} \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    ","import { Component, OnInit, Renderer2 } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {Location} from '@angular/common';\nimport { GridComponent } from '../../grid.component';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-predictive-alerts-level2',\n templateUrl: './predictive-alerts-level2.component.html',\n styleUrls: ['./predictive-alerts-level2.component.scss']\n})\nexport class PredictiveAlertsLevel2Component extends GridComponent implements OnInit {\n\n stylePages = {\n '/customerswithoutservicecontracts/grid': {\n pageTitle: 'Predictive Alerts w/o Service Contracts - Details',\n apiRequestHandler: '/metrics/customerswithoutservicecontracts/grid',\n backPageLabel: 'Back',\n backPageLink: '/customerswithoutservicecontracts',\n dataArrayKey: 'Details',\n table: {\n type: 'style3',\n exportFileName: 'predictive_alerts_without_service_contract_details.xlsx',\n contextMenuFieldName: 'sn',\n dataCols: [\n {\n title: 'Country',\n key: 'country',\n width: 50\n },\n {\n title: 'Customer',\n key: 'customer',\n width: 80\n },\n {\n title: 'PL',\n key: 'instrument',\n width: 50\n },\n {\n title: 'SN',\n key: 'sn',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ], \n width: 80\n },\n {\n title: 'Alert Qty (12 Month)',\n key: 'alert12mo',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Alert Qty (6 Month)',\n key: 'alert6mo',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'Alert Qty (3 Month)',\n key: 'alert3mo',\n customStyle: { 'text-align': 'right' },\n width: 50\n }, \n {\n title: 'Alert Qty (30 Days)',\n key: 'alert30day',\n customStyle: { 'text-align': 'right' },\n width: 50,\n },\n {\n title: 'SD Ticket Qty (30 Days)',\n key: 'ticket30day',\n customStyle: { 'text-align': 'right' },\n refLink: 'sd_ticket_details',\n width: 50,\n }\n ],\n drillDownCols: [\n {\n title: '',\n width: 60,\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/customerswithoutservicecontracts/griddetails'\n }\n ]\n }\n },\n '/amb_customerswithoutservicecontracts/grid': {\n pageTitle: 'Predictive Alerts w/o Service Contracts - Details',\n apiRequestHandler: '/metrics/amb_customerswithoutservicecontracts/grid',\n backPageLabel: 'Back',\n backPageLink: '/amb_customerswithoutservicecontracts',\n dataArrayKey: 'Details',\n table: {\n type: 'style3',\n exportFileName: 'amb_predictive_alerts_without_contracts.xlsx',\n contextMenuFieldName: 'sn',\n dataCols: [\n {\n title: 'Country',\n key: 'country',\n width: '100'\n },\n {\n title: 'Customer',\n key: 'customer',\n width: '120'\n },\n {\n title: 'PL',\n key: 'instrument',\n width: '100'\n },\n {\n title: 'SN',\n key: 'sn',\n renderRefStyle: true,\n contextMenuItems: [\n {text: 'SIFT', iconUrl: './assets/sift_icon.gif', fieldName: 'instrumentsrnolinks', columnIndex: 0},\n {text: 'Ticket History', iconUrl: './assets/ticket_history.gif', fieldName: 'instrumentsrnolinks', columnIndex: 1},\n {text: 'TSB', iconUrl: './assets/TSB_Button.gif', fieldName: 'instrumentsrnolinks', columnIndex: 2},\n {text: 'IHR', iconUrl: './assets/ihr.gif', fieldName: 'instrumentsrnolinks', columnIndex: 3}\n ], \n width: '100'\n },\n {\n title: 'Alert Qty (12 Month)',\n key: 'alert12mo',\n customStyle: { 'text-align': 'right' },\n width: '100'\n },\n {\n title: 'Alert Qty (6 Month)',\n key: 'alert6mo',\n customStyle: { 'text-align': 'right' },\n width: '100'\n },\n {\n title: 'Alert Qty (3 Month)',\n key: 'alert3mo',\n customStyle: { 'text-align': 'right' },\n width: '100'\n }, \n {\n title: 'Alert Qty (30 Days)',\n key: 'alert30day',\n customStyle: { 'text-align': 'right' },\n width: '100',\n },\n {\n title: 'SD Ticket Qty (30 Days)',\n key: 'ticket30day',\n customStyle: { 'text-align': 'right' },\n refLink: 'sd_ticket_details',\n width: '100',\n }\n ],\n drillDownCols: [\n {\n title: '',\n width: '80',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/amb_customerswithoutservicecontracts/griddetails'\n }\n ]\n }\n }\n };\n \n config = null;\n public state = RequestState.Inactive;\n\n public menuItems: any[] = [];\n public offset: any;\n public selected: any;\n public showContextMenu: boolean = false;\n private documentClickSubscription: any;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private refreshHandler: RefreshHandlerService,\n private renderer: Renderer2,\n ) { \n super();\n this.onCellClick = this.onCellClick.bind(this);\n this.documentClickSubscription = this.renderer.listen('document', 'click', () => {\n this.showContextMenu = false;\n });\n }\n\n ngOnInit(): void {\n \n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: true,\n viewSubtitleText: this.config.subTitle,\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12 });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12 });\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n refLink: this.config.table.dataCols[i].refLink,\n renderRefStyle: this.config.table.dataCols[i].renderRefStyle,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n this.dataCols.push({\n description: this.config.table.drillDownCols[i].title,\n width: this.config.table.drillDownCols[i].width,\n drillDownDetailsLabel: this.config.table.drillDownCols[i].drillDownDetailsLabel,\n drillDownDetailsLink: this.config.table.drillDownCols[i].drillDownDetailsLink\n });\n } \n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n } \n });\n }\n }\n\n public onCellClick({dataItem, column, type, originalEvent}): void {\n let contextMenuItemArr = [];\n if (type === 'click' && column.field === this.config.table.contextMenuFieldName) {\n originalEvent.preventDefault();\n for (let r = 0; r < this.config.table.dataCols.length; r++) {\n let dataCol = this.config.table.dataCols[r];\n if (dataCol.contextMenuItems !== undefined) {\n for (let k = 0; k < dataCol.contextMenuItems.length; k++) {\n contextMenuItemArr.push({\n 'text': dataCol.contextMenuItems[k].text,\n 'iconUrl': dataCol.contextMenuItems[k].iconUrl, \n 'textLink': dataItem[dataCol.contextMenuItems[k].fieldName][dataCol.contextMenuItems[k].columnIndex] });\n } \n }\n }\n this.menuItems = contextMenuItemArr;\n this.showContextMenu = true;\n this.offset = { left: originalEvent.pageX, top: originalEvent.pageY };\n } else {\n this.showContextMenu = false;\n } \n }\n\n public menuItemSelected(item: any): void {\n this.selected = item;\n }\n\n}\n","
    \n
    \n
    \n
    Customer: {{apiDataRecord.customer}}
    \n
    \n Instrument #: {{apiDataRecord.instrument}}\n SN: {{apiDataRecord.sn}}\n
    \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {Location} from '@angular/common';\nimport { GridComponent } from '../../grid.component';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\n\n@Component({\n selector: 'app-predictive-alerts-level3',\n templateUrl: './predictive-alerts-level3.component.html',\n styleUrls: ['./predictive-alerts-level3.component.scss']\n})\nexport class PredictiveAlertsLevel3Component extends GridComponent implements OnInit {\n\n stylePages = {\n '/customerswithoutservicecontracts/griddetails': {\n pageTitle: 'Proactive Health Alerts for Customer without Service Contracts',\n apiRequestHandler: '/metrics/customerswithoutservicecontracts/griddetails',\n parentPageRequestHandler: '/metrics/customerswithoutservicecontracts/grid',\n backPageLabel: 'Back',\n backPageLink: 'customerswithoutservicecontracts/grid',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'predictive_alerts_without_service_contract_grid_details.xlsx',\n dataCols: [\n {\n title: 'Algorithm Category',\n key: 'algorithmGroup',\n width: 80\n },\n {\n title: 'Total Alert Qty',\n key: 'flaggedTotal',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M12 Qty',\n key: 'flaggedMonth12',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M11 Qty',\n key: 'flaggedMonth11',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M10 Qty',\n key: 'flaggedMonth10',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M9 Qty',\n key: 'flaggedMonth9',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M8 Qty',\n key: 'flaggedMonth8',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M7 Qty',\n key: 'flaggedMonth7',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M6 Qty',\n key: 'flaggedMonth6',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M5 Qty',\n key: 'flaggedMonth5',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M4 Qty',\n key: 'flaggedMonth4',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M3 Qty',\n key: 'flaggedMonth3',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M2 Qty',\n key: 'flaggedMonth2',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M1 Qty',\n key: 'flaggedMonth1',\n customStyle: { 'text-align': 'right' },\n width: 50\n }\n ]\n }\n },\n '/amb_customerswithoutservicecontracts/griddetails': {\n pageTitle: 'Proactive Health Alerts for Customer without Service Contracts',\n apiRequestHandler: '/metrics/amb_customerswithoutservicecontracts/griddetails',\n parentPageRequestHandler: '/metrics/amb_customerswithoutservicecontracts/grid',\n backPageLabel: 'Back',\n backPageLink: 'amb_customerswithoutservicecontracts/grid',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'predictive_alerts_without_service_contract_grid_details.xlsx',\n dataCols: [\n {\n title: 'Algorithm Category',\n key: 'algorithmGroup',\n width: 80\n },\n {\n title: 'Total Alert Qty',\n key: 'flaggedTotal',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M12 Qty',\n key: 'flaggedMonth12',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M11 Qty',\n key: 'flaggedMonth11',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M10 Qty',\n key: 'flaggedMonth10',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M9 Qty',\n key: 'flaggedMonth9',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M8 Qty',\n key: 'flaggedMonth8',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M7 Qty',\n key: 'flaggedMonth7',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M6 Qty',\n key: 'flaggedMonth6',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M5 Qty',\n key: 'flaggedMonth5',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M4 Qty',\n key: 'flaggedMonth4',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M3 Qty',\n key: 'flaggedMonth3',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M2 Qty',\n key: 'flaggedMonth2',\n customStyle: { 'text-align': 'right' },\n width: 50\n },\n {\n title: 'M1 Qty',\n key: 'flaggedMonth1',\n customStyle: { 'text-align': 'right' },\n width: 50\n }\n ]\n }\n }\n };\n \n config = null;\n apiDataRecord = null;\n public state = RequestState.Inactive;\n countryCode = null;\n customerID = null;\n sn = null;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) { \n super();\n }\n\n ngOnInit(): void {\n \n this.route.paramMap.subscribe(params => {\n this.countryCode = params.get('countryCode');\n this.customerID = params.get('customerID');\n this.sn = params.get('sn');\n }); \n \n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const parentPageRequestHandler = this.apiService.get(this.config.parentPageRequestHandler);\n parentPageRequestHandler.onStateChange((state) => {\n this.state = state;\n });\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n parentPageRequestHandler.sendRequest(this.config.parentPageRequestHandler, { months: 12});\n },\n parentPageRequestHandler.getRelativeParams(this.config.parentPageRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n parentPageRequestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = parentPageRequestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // find the correct apiData record for the routing params\n for (let r = 0; r < apiData['Details'].length; r++) {\n let currentRec = apiData['Details'][r];\n if (currentRec['customerID'] == this.customerID \n && currentRec['countryCode'] == this.countryCode \n && currentRec['sn'] == this.sn) {\n this.apiDataRecord = currentRec;\n break;\n }\n }\n }\n }); \n\n if (this.apiDataRecord != null) {\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n\n const params = {\n months: 12,\n countryCode: this.countryCode,\n customerID: this.customerID,\n sn: this.sn\n }\n\n requestHandler.sendRequest(this.config.apiRequestHandler, params);\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, params);\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n dateFormat: this.config.table.dataCols[i].dateFormat,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n } \n });\n } \n }\n }\n}\n","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n
    Customer:Interview Date:Overall Score:
    {{apiDataRecord['customername'] == null ? 'Anonymous' : apiDataRecord['customername'] }}{{apiDataRecord['interviewdate']}}{{apiDataRecord['value']}}
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{comment.label}}
    Translation:{{comment.transvalue}}
    Native Language:{{comment.nativevalue}}
    \n
    \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {Location} from '@angular/common';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport { SurveyCommentPages } from '../survey-comment-details/survey-comment-pages';\n\n@Component({\n selector: 'app-rnps-survey-comment-details',\n templateUrl: './rnps-survey-comment-details.component.html',\n styleUrls: ['./rnps-survey-comment-details.component.scss']\n})\nexport class RnpsSurveyCommentDetailsComponent implements OnInit {\n\n stylePages = SurveyCommentPages;\n config = null;\n apiDataRecord = null;\n public state = RequestState.Inactive;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n private refreshHandler: RefreshHandlerService\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.route.paramMap.subscribe(params => {\n\n let rnpsScore = params.get('score');\n let customerName = params.get('customer');\n if (customerName != undefined && customerName == 'NA') {\n customerName = null;\n } else {\n customerName = decodeURIComponent(customerName);\n }\n let country = params.get('country');\n let interviewDate = params.get('interviewdate');\n let rnpsCategory = params.get('category');\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // find the correct apiData record for the routing params\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n let currentRec = apiData[this.config.dataArrayKey][r];\n if (currentRec['value'] == rnpsScore && currentRec['customername'] == customerName \n && currentRec['country'] == country && currentRec['interviewdate'] == interviewDate\n && currentRec['resolved'] == rnpsCategory) {\n this.apiDataRecord = currentRec;\n break;\n }\n } \n } \n });\n });\n }\n }\n}\n","
    \n
    \n
    \n
    \n
    \n Number of records loaded: {{reccount}} out of {{totalrecords}}\n
    \n \n
    \n \n \n\n \n \n \n \n \n \n \n \n \n \n {{col.drillDownDetailsLabel}} \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    ","import { Component, OnInit } from '@angular/core';\nimport {Location} from '@angular/common';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { GridComponent } from '../../grid.component';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\nimport {PreferenceApiConnectorService} from '../../../preferences/preference-api-connector.service';\n\n@Component({\n selector: 'app-sales-summary',\n templateUrl: './sales-summary.component.html',\n styleUrls: ['./sales-summary.component.scss']\n})\nexport class SalesSummaryComponent extends GridComponent implements OnInit {\n /* MULTI CURRENCY FIELDS\n rcs\n currencycode: \"BRL\"\n annualamtdollar: \"0\"\n annualamtlocal: \"0.00\"\n monthlyamtdollar: \"0\"\n monthlyamtlocal: \"0.000000\"\n ytdamtdollar: \"0\"\n ytdamtlocal: \"0.00\"\n\n compliance\n currencycode: \"BRL\"\n expectedrevenue: \"440.00\"\n expectedrevenuedollar: \"110.55\"\n revenue: \"0.00\"\n revenuedollar: \"0.00\"\n\n sales\n currencycode: \"BRL\"\n annualamtdollar: \"0\"\n annualamtlocal: \"0.00\"\n monthlyamtdollar: \"0\"\n monthlyamtlocal: \"0.000000\"\n ytdamtdollar: \"0\"\n ytdamtlocal: \"0.00\"\n */\n stylePages = {\n '/sales/summary': {\n pageTitle: 'Sales Summary (USD)',\n apiRequestHandler: '/metrics/sales/summary',\n backPageLabel: 'Back',\n backPageLink: '/sales',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'ambassador_sales_summary.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'LOB - Disease State',\n key: 'diseasestate',\n width: 60\n },\n {\n title: 'List Number',\n key: 'ln',\n width: 60\n },\n {\n title: 'Desc',\n key: 'desc',\n width: 80\n },\n {\n title: 'Annual Sales',\n key: 'annualamtdollar',\n altKey: 'annualamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'YTD Sales',\n key: 'ytdamtdollar',\n altKey: 'ytdamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Monthly Avg',\n key: 'monthlyamtdollar',\n altKey: 'monthlyamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ],\n drillDownCols: [\n {\n title: 'Details',\n width: 60,\n drillDownDetailsColName: 'area_sales_details',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/sales/details'\n }\n ]\n }\n },\n '/rcs/summary': {\n pageTitle: 'Reagent/Capital/Service (RCS) Summary (USD)',\n apiRequestHandler: '/metrics/rcs/summary',\n backPageLabel: 'Back',\n backPageLink: '/rcs',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'ambassador_rcs_summary.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'LOB - Disease State',\n key: 'diseasestate',\n width: 60\n },\n {\n title: 'List Number',\n key: 'ln',\n width: 60\n },\n {\n title: 'Desc',\n key: 'desc',\n width: 80\n },\n {\n title: 'Annual Sales',\n key: 'annualamtdollar',\n altKey: 'annualamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'YTD Sales',\n key: 'ytdamtdollar',\n altKey: 'ytdamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Monthly Avg',\n key: 'monthlyamtdollar',\n altKey: 'monthlyamtlocal',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ],\n drillDownCols: [\n {\n title: 'Details',\n width: 60,\n drillDownDetailsColName: 'rcs_details',\n drillDownDetailsLabel: '>',\n drillDownDetailsLink: '/rcs/details'\n }\n ]\n }\n },\n '/compliance/details': {\n pageTitle: 'Contract Compliance/Revenue Gain/Loss Summary (12 Months) (USD)',\n apiRequestHandler: '/metrics/compliance/details',\n backPageLabel: 'Back',\n backPageLink: '/compliance',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'ambassador_compliance_details.xlsx',\n dataCols: [\n {\n title: 'Customer',\n key: 'customername',\n width: 80\n },\n {\n title: 'LOB - Disease State',\n key: 'diseasestate',\n width: 60\n },\n {\n title: 'List Number',\n key: 'ln',\n width: 60\n },\n {\n title: 'Assay Desc',\n key: 'assays',\n width: 80\n },\n {\n title: 'Contract Start Date',\n key: 'contractstartdate',\n width: 60\n },\n {\n title: 'Contract End Date',\n key: 'contractenddate',\n width: 60\n },\n {\n title: 'Compliance %',\n key: 'compliance',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Revenue',\n key: 'revenuedollar',\n altKey: 'revenue',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Expected Revenue',\n key: 'expectedrevenuedollar',\n altKey: 'expectedrevenue',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ]\n }\n }\n };\n\n config = null;\n public state = RequestState.Inactive;\n reccount = 0;\n totalrecords = 0;\n startingrow = 0;\n disableLoadAll: boolean = false;\n isLocalCurrency = false;\n localCurrencyCode = null;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n protected refreshHandler: RefreshHandlerService,\n protected preferenceApiConnectorService: PreferenceApiConnectorService\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail-no-filter');\n\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n this.preferenceApiConnectorService.onUpdate(() => {\n this.isLocalCurrency = false;\n if (this.preferenceApiConnectorService.getIsLocalCurrency() === 'True') {\n this.isLocalCurrency = true;\n }\n this.loadDataForRows(this.startingrow, true);\n if (this.localCurrencyCode) {\n this.updateNavFilterSelection(this.localCurrencyCode);\n }\n });\n }\n }\n\n updateNavFilterSelection(currencyCode) {\n const navFilterSelection = this.navbarBuilderService.getNavFilterSelection();\n const pageTitle = navFilterSelection.viewTitleText;\n if (this.isLocalCurrency) {\n pageTitle.replace(\"USD\", currencyCode);\n } else {\n pageTitle.replace(currencyCode, \"USD\");\n }\n this.navbarBuilderService.setNavFilterSelection(navFilterSelection);\n }\n\n public getDrillDownDetailsLinkWithParams(colName: any, drillDownLink: any, dataItem: any) {\n return drillDownLink + \"/\" + dataItem['customerid'] + \"/\" + dataItem['ln'] + \"/\" + dataItem['desc'] + \"/\" + dataItem['customername'];\n }\n\n loadDataForRows(startingRow: number, createGrid: boolean): void {\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, startingrow: startingRow });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12});\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n\n\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n if (createGrid === true) {\n const dataColsConfig = this.config.table.dataCols;\n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n let refKey;\n if (this.isLocalCurrency && 'altKey' in this.config.table.dataCols[i]) {\n refKey = this.config.table.dataCols[i].altKey;\n } else {\n refKey = this.config.table.dataCols[i].key;\n }\n this.dataCols.push({\n ref: refKey,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n if (this.config.table.drillDownCols !== undefined) {\n for (let i = 0; i < this.config.table.drillDownCols.length; i++) {\n this.dataCols.push({\n description: this.config.table.drillDownCols[i].title,\n width: this.config.table.drillDownCols[i].width,\n drillDownDetailsColName: this.config.table.drillDownCols[i].drillDownDetailsColName,\n drillDownDetailsLabel: this.config.table.drillDownCols[i].drillDownDetailsLabel,\n drillDownDetailsLink: this.config.table.drillDownCols[i].drillDownDetailsLink\n });\n } \n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n if (r === 0) {\n this.totalrecords = apiData[this.config.dataArrayKey][0]['totalrecords'];\n }\n }\n this.reccount = this.dataRows.length;\n } else { \n if (startingRow === -1) {\n this.dataRows = [];\n }\n // append records to the existing grid data\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n if (r === 0) {\n this.totalrecords = apiData[this.config.dataArrayKey][0]['totalrecords'];\n }\n }\n // if load all was clicked, disable Load All link after loading all the rows\n if (startingRow === -1) {\n this.disableLoadAll = true;\n this.totalrecords = this.dataRows.length;\n }\n this.reccount = this.dataRows.length;\n }\n if (this.dataRows.length > 0 && 'currencycode' in this.dataRows[0]) {\n this.localCurrencyCode = this.dataRows[0]['currencycode'];\n }\n this.updateGrid();\n if (this.localCurrencyCode) {\n this.updateNavFilterSelection(this.localCurrencyCode);\n }\n }\n });\n }\n \n loadAllRecords() {\n this.loadDataForRows(-1, false);\n }\n\n loadNextDataSet() {\n this.startingrow += 500;\n this.loadDataForRows(this.startingrow, false);\n }\n\n isDisabled() {\n return this.disableLoadAll;\n }\n\n}\n","
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n
    Customer : {{apiDataRecord.customername}}
    List Number : {{apiDataRecord.ln}} {{apiDataRecord.desc}}
    \n \n \n\n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref]}}\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {Location} from '@angular/common';\nimport { ApiService } from 'src/app/api/api.service';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from 'src/app/configuration/nav-filter-selection';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { GridComponent } from '../../grid.component';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\n\n\n@Component({\n selector: 'app-sales-details',\n templateUrl: './sales-details.component.html',\n styleUrls: ['./sales-details.component.scss']\n})\nexport class SalesDetailsComponent extends GridComponent implements OnInit {\n\n stylePages = {\n '/sales/details': {\n pageTitle: 'Sales Details',\n apiRequestHandler: '/metrics/sales/details',\n backPageLabel: 'Sales Summary (USD)',\n backPageLink: '/sales/summary',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'ambassador_sales_customer_details.xlsx',\n dataCols: [\n {\n title: 'Order #',\n key: 'orderno',\n customStyle: { 'text-align': 'right' },\n width: 80\n },\n {\n title: 'Order Date',\n key: 'orderdate',\n width: 60\n },\n {\n title: 'Quantity',\n key: 'orderqty',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Ship Date',\n key: 'ordershipdate',\n width: 60\n },\n {\n title: 'Amount',\n key: 'orderamt',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ]\n }\n },\n '/rcs/details': {\n pageTitle: 'Reagent/Capital/Service (RCS) Details',\n apiRequestHandler: '/metrics/rcs/details',\n backPageLabel: 'Back',\n backPageLink: '/rcs/summary',\n dataArrayKey: 'details',\n table: {\n exportFileName: 'ambassador_rcs_customer_details.xlsx',\n dataCols: [\n {\n title: 'Order #',\n key: 'orderno',\n customStyle: { 'text-align': 'right' },\n width: 80\n },\n {\n title: 'Order Date',\n key: 'orderdate',\n width: 60\n },\n {\n title: 'Quantity',\n key: 'orderqty',\n customStyle: { 'text-align': 'right' },\n width: 60\n },\n {\n title: 'Ship Date',\n key: 'ordershipdate',\n width: 60\n },\n {\n title: 'Amount',\n key: 'orderamt',\n customStyle: { 'text-align': 'right' },\n width: 60\n }\n ]\n }\n } \n };\n config = null;\n public state = RequestState.Inactive;\n apiDataRecord = null;\n\n constructor(\n private location: Location,\n protected apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private route: ActivatedRoute,\n protected refreshHandler: RefreshHandlerService\n ) { \n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.location.path();\n Object.keys(this.stylePages).forEach(key => {\n if (currentRouterLocation.indexOf(key) > -1) {\n this.config = this.stylePages[key];\n return;\n }\n });\n if (this.config != null) {\n this.route.paramMap.subscribe(params => { \n \n let customerid = params.get('customerid');\n let customername = params.get('customername');\n let ln = params.get('ln');\n let desc = params.get('desc');\n\n this.apiDataRecord = {};\n\n this.apiDataRecord['customername'] = customername;\n this.apiDataRecord['ln'] = ln;\n this.apiDataRecord['desc'] = desc;\n\n // set the dashboard\n this.navbarBuilderService.setNavbarChoice('metric-detail');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n personaSelector: false,\n dashboardSelector: false,\n search: false,\n toolSelection: ToolSelectionOptions.mycrl,\n legacyCustomersFlag: true,\n myVsAllInstrumentsFlag: true,\n customerWTrackSystemsFlag: true,\n flagshipProductLinesFlag: true,\n bookmarksFlag: true,\n navigateBackwards: true,\n navigateBackwardsLabel: this.config.backPageLabel,\n navigateBackwardsLink: this.config.backPageLink,\n viewTitle: true,\n viewTitleText: this.config.pageTitle,\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, customerdetail_id: customerid, detail_ln: ln });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { months: 12, customerdetail_id: customerid, detail_ln: ln });\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n \n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n \n this.dataCols = [];\n for (let i = 0; i < this.config.table.dataCols.length; i++) {\n this.dataCols.push({\n ref: this.config.table.dataCols[i].key,\n description: this.config.table.dataCols[i].title,\n width: this.config.table.dataCols[i].width,\n hidden: this.config.table.dataCols[i].hidden,\n customStyle: this.config.table.dataCols[i].customStyle\n });\n }\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData[this.config.dataArrayKey].length; r++) {\n this.dataRows.push(apiData[this.config.dataArrayKey][r]);\n }\n this.updateGrid();\n }\n });\n }); \n }\n }\n\n}\n","import {DomSanitizer} from '@angular/platform-browser';\nimport {PipeTransform, Pipe, SecurityContext} from \"@angular/core\";\n\n@Pipe({ name: 'safeHtml'})\nexport class SafeHtmlPipe implements PipeTransform {\n constructor(private sanitized: DomSanitizer) {}\n transform(value) {\n return this.sanitized.bypassSecurityTrustHtml(value);\n }\n}\n\n@Pipe({ name: 'safeStyle'})\nexport class SafeStylePipe implements PipeTransform {\n constructor(private sanitized: DomSanitizer) {}\n transform(value) {\n return this.sanitized.bypassSecurityTrustStyle(value);\n }\n}\n\n","\n
    \n
    \n
    \n Global Service Alerts (most recent first)\n Total Alerts: {{dataRows.length}}\n
    \n
    \n
    \n
    \n {{dataRecord.category}}\n
    \n
    \n Message Date: {{dataRecord.msgdate}}, \n Expires: {{dataRecord.expirationdate}}\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n No Global Service alerts found!\n
    \n
    \n\n
    \n\n\n\n","import { Component, OnInit } from '@angular/core';\nimport { ApiService } from 'src/app/api/api.service';\nimport { RefreshHandlerService } from 'src/app/api/refresh-handler.service';\nimport { RequestState } from 'src/app/api/request-handler';\nimport { NavbarBuilderService } from 'src/app/navigation/navbar-builder.service';\n\n@Component({\n selector: 'app-gs-alerts-dashboard',\n templateUrl: './gs-alerts-dashboard.component.html',\n styleUrls: ['./gs-alerts-dashboard.component.scss']\n})\nexport class GsAlertsDashboardComponent implements OnInit {\n\n state = RequestState.Inactive;\n\n dataRows = [];\n\n config = {\n pageTitle: 'Global Service Alerts',\n apiRequestHandler: '/global_service_alerts'\n };\n\n constructor(private navbarBuilderService: NavbarBuilderService\n , protected apiService: ApiService\n , protected refreshHandler: RefreshHandlerService) { \n\n }\n\n ngOnInit(): void {\n this.navbarBuilderService.setNavbarChoice('gs-alerts-dashboard');\n\n const requestHandler = this.apiService.get(this.config.apiRequestHandler);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(this.config.apiRequestHandler, { requestTime: (new Date()).getTime() });\n this.refreshHandler.onRefreshEvent(\n (index) => {\n requestHandler.sendRequest(this.config.apiRequestHandler, { requestTime: (new Date()).getTime() });\n },\n requestHandler.getRelativeParams(this.config.apiRequestHandler)\n );\n\n // no need to send request here as chart tile has already done so\n requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n // format dataRows for kendo component\n this.dataRows = [];\n for (let r = 0; r < apiData['data'].length; r++) {\n this.dataRows.push(apiData['data'][r]);\n } \n }\n });\n }\n\n // getTrimmedMessage(msg: string) {\n // //if (msg && msg.length >= 500) {\n // // return msg.substring(0, 500) + \"Read More\";\n // //}\n // return msg;\n // }\n\n getHtmlMessage(msg: string) {\n return '' + msg + \"\";\n }\n\n toHTML(input) : any {\n //console.log(input);\n let docElement = new DOMParser().parseFromString(input, \"text/html\").documentElement;\n //console.log(docElement.innerHTML);\n console.log(docElement.textContent);\n return docElement.textContent;\n }\n\n isDataFound(dataRows) {\n if (!dataRows) {\n return false;\n }\n if (Array.isArray(dataRows) && dataRows.length === 0) {\n return false;\n }\n return true;\n }\n\n}\n","import {BrTileReference} from './br-tile-reference';\r\n\r\nexport const DASHBOARD_ARRANGEMENT: BrTileReference[] = [\r\n {\r\n apiSource: '/qbr/kpi/alcm/thumbnail',\r\n componentName: 'BrTextIndicatorComponent',\r\n detailLink: '/businessReview/alcm/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'AbbottLink Customer Maintenance'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/assay_test_counts/thumbnail',\r\n componentName: 'BrPieChartComponent',\r\n detailLink: '/businessReview/assay_test_counts/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Top Assays'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/nps/thumbnail',\r\n componentName: 'BrTopItemsComponent',\r\n detailLink: '/businessReview/nps/list_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'CUSTOMER NPS SCORES'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/calls_without_service_number/thumbnail',\r\n componentName: 'BrMultiLineChartComponent',\r\n detailLink: '/businessReview/calls_without_service_number/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Calls w/Out Service Number'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/instrument_test_counts/thumbnail',\r\n componentName: 'BrLineChartComponent',\r\n detailLink: '/businessReview/instrument_test_counts/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Instrument Test Counts'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/mttr/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/mttr/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'MTTR'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/phn/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/phn/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'PHN Tickets'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/response_time/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/response_time/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Response Time'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/service_level/thumbnail',\r\n componentName: 'BrMultiLineChartComponent',\r\n detailLink: '/businessReview/service_level/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Telephony Service Level'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/tcr/thumbnail',\r\n componentName: 'BrLineChartComponent',\r\n detailLink: '/businessReview/tcr/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Test Completion Rate'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/ticket_history/thumbnail',\r\n componentName: 'BrPieChartComponent',\r\n detailLink: '/businessReview/ticket_history/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Ticket History'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/total_inbound_calls/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/total_inbound_calls/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Total Inbound Calls'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/pm_tickets/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/pm_tickets/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'PM Tickets'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/ticket_errors/thumbnail', // WORKING ON NOW /////\r\n componentName: 'BrPieChartComponent',\r\n detailLink: '/businessReview/ticket_errors/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Top Issues'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/hard_stops/thumbnail', // WORKING ON NOW /////\r\n componentName: 'BrPieChartComponent',\r\n detailLink: '/businessReview/hard_stops/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Hard Stops'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/tsb/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/tsb/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'TSBs'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/example_data/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n // detailLink: '/example_data',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Example Data'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/uptime/thumbnail',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n detailLink: '/businessReview/uptime/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Uptime'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/example_pie_chart/thumbnail',\r\n componentName: 'BrExamplePieChartComponent',\r\n // detailLink: '/example_data',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Example Pie Chart'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/abandoned_calls/thumbnail',\r\n componentName: 'BrMultiLineChartComponent',\r\n detailLink: '/businessReview/abandoned_calls/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Abandoned / Callbacks'\r\n }\r\n },\r\n {\r\n apiSource: '/qbr/kpi/average_wait_time/thumbnail',\r\n componentName: 'BrMultiLineChartComponent',\r\n detailLink: '/businessReview/average_wait_time/system_comparison_view',\r\n preferences: {\r\n periodsToShow: 4,\r\n title: 'Average & Longest Wait Times'\r\n }\r\n }\r\n];\r\n","import { Injectable, EventEmitter } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BrTemplateSelectionService {\n templateChanged = new EventEmitter(true);\n templateDetails = {\n id: 'br_kpi',\n name: 'Default Template',\n string: ''\n };\n\n constructor() { }\n\n getTemplateSelectionChange() {\n return this.templateChanged;\n }\n\n getSelectedTemplate() {\n return this.templateDetails;\n }\n\n updateSelectedTemplate(templateId, templateName, templateString) {\n this.templateDetails = {\n id: templateId,\n name: templateName,\n string: templateString\n };\n this.templateChanged.emit(this.templateDetails);\n }\n}\n","\n
    \n \n
    \n
    Select Saved Presentation
    \n \n \n
    Save These Settings
    \n As \"Current Selection\" OR\n \n \n \n
    \n
    \n
    ","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\nimport {faBookmark} from '@fortawesome/free-solid-svg-icons';\nimport {RequestState} from '../../api/request-handler';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {BrParamsService} from '../br-params.service';\nimport {PresentationSelectService} from '../presentation-select.service';\n\n// #bcfffc\n@Component({\n selector: 'app-presentation-select',\n templateUrl: './presentation-select.component.html',\n styleUrls: ['./presentation-select.component.scss']\n})\nexport class PresentationSelectComponent implements OnInit, OnDestroy {\n faBookmark = faBookmark;\n RequestState = RequestState;\n protected requestHandler;\n protected requestHandler2;\n public state = RequestState.Inactive;\n protected savePresentationSource = '/qbr/user_presentations/custom/save_user_presentation';\n protected listPresentationsSource = '/qbr/user_presentations/custom/list_user_presentations';\n listPresentationsData = {\n items: []\n };\n protected refreshHandleKey;\n\n bkMenuViable = false;\n anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n popupAlign = { horizontal: 'left', vertical: 'top' };\n collision = { horizontal: 'fit', vertical: 'fit' };\n\n @ViewChild('bkanchor') public anchor: ElementRef;\n @ViewChild('bkpopup', { read: ElementRef }) public popup: ElementRef;\n\n selectedOption;\n\n constructor(\n private brParamsService: BrParamsService,\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n private presentationSelectService: PresentationSelectService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.callApiSource(this.listPresentationsSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n if (!apiData.hasOwnProperty('type') && apiData.type !== 'NO_RESULTS_FOUND') {\n this.listPresentationsData = apiData;\n }\n this.selectedOption = this.brParamsService.get('presentationId'); // not showing selected on reopen after selection\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.listPresentationsSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.listPresentationsSource));\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n if (this.requestHandler2) {\n this.requestHandler2.cancelSubscription();\n }\n }\n\n presentationSelect(presentationId) {\n this.brParamsService.set('presentationId', presentationId);\n this.presentationSelectService.selectPresentation(presentationId);\n this.bkMenuViable = false;\n }\n\n onToggle(): void {\n this.bkMenuViable = !this.bkMenuViable;\n }\n\n @HostListener('keydown', ['$event'])\n public keydown(event: any): void {\n if (event.keyCode === 27 && this.bkMenuViable) {\n this.onToggle();\n }\n }\n\n @HostListener('document:click', ['$event'])\n public documentClick(event: any): void {\n if ((this.bkMenuViable && !this.contains(event.target)) || (!this.bkMenuViable && this.contains(event.target))) {\n this.onToggle();\n }\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n const screenWidth = window.innerWidth;\n if (screenWidth >= 768) {\n this.anchorAlign = { horizontal: 'left', vertical: 'bottom' };\n } else {\n this.anchorAlign = { horizontal: 'right', vertical: 'bottom' };\n }\n }\n\n private contains(target: any): boolean {\n if (this.anchor !== undefined) {\n return this.anchor.nativeElement.contains(target) ||\n (this.popup ? this.popup.nativeElement.contains(target) : false);\n }\n return false;\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n nameChange(e) {\n this.brParamsService.set('br_presentation_name', e);\n // this.refreshHandlerService.triggerCallbacks(['br_template_name']);\n }\n\n saveAs() {\n this.requestHandler = this.callApiSource(this.savePresentationSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.brParamsService.set('list_user_presentations_update', this.brParamsService.get('list_user_presentations_update') + 1);\n this.refreshHandlerService.triggerCallbacks(['list_user_presentations_update']);\n this.requestHandler = this.callApiSource(this.listPresentationsSource, 0);\n this.bkMenuViable = false;\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.savePresentationSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.savePresentationSource));\n }\n\n}\n","\n
    \n
    Organizations
    \n
    \n
    \n {{orgPrefixItem.display_name}}\n
    \n \n \n {{orgItem.display_name}}\n
    \n
    \n
    \n
    \n
    \n
    Locations
    \n
    \n
    \n \n \n {{locationItem.display_name}}\n
    \n
    \n
    \n
    \n
    LocalLevels
    \n
    \n
    \n \n \n {{localLevelItem.display_name}}\n
    \n
    \n
    \n\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {RequestState} from '../../../api/request-handler';\nimport {ApiService} from '../../../api/api.service';\nimport {faCheck} from '@fortawesome/free-solid-svg-icons';\nimport {BrParamsService} from '../../br-params.service';\n\nenum Selected {\n None = 0,\n Complete = 1,\n Partial = 2\n}\n\n@Component({\n selector: 'app-br-location-selector',\n templateUrl: './br-location-selector.component.html',\n styleUrls: ['./br-location-selector.component.scss']\n})\nexport class BrLocationSelectorComponent implements OnInit, OnDestroy {\n data2 = null;\n protected requestHandler;\n protected apiSource = '/qbr/app_config/location/location';\n state = RequestState.Inactive;\n RequestState = RequestState;\n locationColumn = [];\n localLevelColumn = [];\n selectedOrg;\n selectedLocation;\n selectedLocalLevel;\n faCheck = faCheck;\n\n constructor(\n private apiService: ApiService,\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.callApiSource(this.apiSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.data2 = apiData;\n this.selectedOrg = this.brParamsService.get('org');\n this.buildLocationMenu(this.selectedOrg);\n this.selectedLocation = this.brParamsService.get('location');\n this.buildLocalLevelMenu(this.selectedLocation);\n this.selectedLocalLevel = this.brParamsService.get('locallevel');\n }\n });\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'org') {\n this.selectedOrg = this.brParamsService.get('org');\n this.selectedLocation = this.brParamsService.get('location');\n this.selectedLocalLevel = this.brParamsService.get('locallevel');\n }\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n getOrgItem(orgId) {\n for (const orgItem of this.data2.org_names.items) {\n if (orgItem.id === orgId) {\n return orgItem;\n }\n }\n return null;\n }\n\n getLocationItem(locationId) {\n for (const locationItem of this.data2.countries.items) {\n if (locationItem.id === locationId) {\n return locationItem;\n }\n }\n return null;\n }\n\n getLocalLevelItem(location, localLevelId) {\n for (const localLevelItem of location.relationships) {\n if (localLevelItem.id === localLevelId) {\n return localLevelItem;\n }\n }\n return null;\n }\n\n buildLocationMenu(forOrgId) {\n const orgItem = this.getOrgItem(forOrgId);\n this.locationColumn = orgItem.relationships;\n return this;\n }\n\n buildLocalLevelMenu(forLocationId) {\n const locationItem = this.getLocationItem(forLocationId);\n this.localLevelColumn = locationItem.relationships;\n return this;\n }\n\n buildLocationDescription() {\n const orgId = this.brParamsService.get('org');\n const org = this.getOrgItem(orgId);\n const locationId = this.brParamsService.get('location');\n const location = this.getLocationItem(locationId);\n const locallevelId = this.brParamsService.get('locallevel');\n const locallevel = this.getLocalLevelItem(location, locallevelId);\n\n this.brParamsService.set('location_description', org.display_name + ', ' + location.display_name + ', ' + locallevel.display_name);\n }\n\n selectOrg(orgId) {\n this.selectedOrg = orgId;\n this.buildLocationMenu(orgId);\n this.selectedLocation = '000';\n this.brParamsService.set('org', orgId);\n this.brParamsService.set('location', '000');\n this.buildLocationDescription();\n return this;\n }\n\n selectLocation(locationId) {\n this.buildLocalLevelMenu(locationId);\n this.selectedLocation = locationId;\n this.selectedLocalLevel = '000';\n this.brParamsService.set('location', locationId);\n this.brParamsService.set('locallevel', '000');\n this.buildLocationDescription();\n return this;\n }\n\n selectLocalLevel(localLevelId) {\n this.selectedLocalLevel = localLevelId;\n this.brParamsService.set('locallevel', localLevelId);\n this.buildLocationDescription();\n }\n}\n","import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport {ApiService} from '../../../api/api.service';\nimport {RequestState} from '../../../api/request-handler';\nimport {AuthenticationService} from '../../../authentication/authentication.service';\nimport {BrParamsService} from '../../br-params.service';\n\n@Component({\n selector: 'app-br-business-segment-selector',\n templateUrl: './br-business-segment-selector.component.html',\n styleUrls: ['./br-business-segment-selector.component.scss']\n})\nexport class BrBusinessSegmentSelectorComponent implements OnInit, OnDestroy {\n RequestStateComplete = RequestState.Complete; // temporary until api call is implemented\n\n protected requestHandler;\n protected apiSource = '/qbr/app_config/cust_bs/cust_bs';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n\n /*data = [\n {label: 'All Business Segments', key: 1},\n {label: 'Core Lab', key: 1},\n {label: 'Transfusion', key: 2},\n {label: 'Unassigned', key: 3},\n ];*/\n selectedItem;\n apiState;\n data = [];\n\n constructor(\n private authService: AuthenticationService,\n private cdRef: ChangeDetectorRef,\n private apiService: ApiService,\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.updateSelections();\n\n this.requestHandler = this.apiService.get(this.apiSource);\n this.requestHandler.sendRequest(this.apiSource);\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n for (const item of apiData.items) {\n buildData.push({\n label: item.display_name,\n key: item.id\n });\n }\n this.data = buildData;\n const presistedValue = this.brParamsService.get('cust_bs');\n this.selectedItem = presistedValue;\n }\n });\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'cust_bs') {\n this.selectedItem = this.brParamsService.get('cust_bs');\n }\n });\n // this.selectedItem =\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n updateSelections() {\n\n // this.menuText1 = this.selectedType;\n // this.menuText2 = this.selectedLabel;\n\n this.cdRef.detectChanges();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n setSelectedItem(selectedItem) {\n this.selectedItem = selectedItem;\n const label = this.getLabel(selectedItem);\n this.brParamsService.set('cust_bs', this.selectedItem);\n this.brParamsService.set('cust_bs_description', label);\n }\n}\n","\n","\n
    \n
    {{column.label}}
    \n
    \n
    \n \n \n \n {{columnItem.display}}\n
    \n
    \n
    \n
    ","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport {\n faSquare,\n faCheck\n} from '@fortawesome/free-solid-svg-icons';\n\nenum Selected {\n None = 0,\n Complete = 1,\n Partial = 2\n}\n\n// note: this component can only be used when last column is the final selections\n@Component({\n selector: 'app-ui-multi-column-list-select',\n templateUrl: './ui-multi-column-list-select.component.html',\n styleUrls: ['./ui-multi-column-list-select.component.scss']\n})\nexport class UiMultiColumnListSelectComponent implements OnInit {\n faSquare = faSquare;\n faCheck = faCheck;\n Selected = Selected;\n\n @Input() mockData;\n @Input() bringSelectedToTop = false;\n\n @Output() valueChange = new EventEmitter(true);\n @Output() valueChangeColumnSelected = new EventEmitter(true);\n @Output() valueChangeData = new EventEmitter(true);\n\n constructor() { }\n\n ngOnInit(): void {\n this.bringSelectedValuesToTop();\n }\n\n propertySort(property) {\n let sortOrder = 1;\n if (property[0] === '-') {\n sortOrder = -1;\n property = property.substr(1);\n }\n return (a, b) => {\n const result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;\n return result * sortOrder;\n };\n }\n\n bringSelectedValuesToTop() {\n const selectedSortPriority = {1: 0, 2: 1, 0: 3};\n if (this.bringSelectedToTop && this.mockData !== null && this.mockData.column_list !== undefined) {\n for (const column of this.mockData.column_list) {\n column.items.sort((a, b) => {\n return selectedSortPriority[a.selected] - selectedSortPriority[b.selected];\n });\n column.items.sort((a, b) => {\n if (selectedSortPriority[a.selected] !== selectedSortPriority[b.selected]) {\n return 0;\n }\n return (a.display < b.display) ? -1 : (a.display > b.display) ? 1 : 0;\n });\n }\n }\n }\n\n getSelectedValues() {\n let result = [];\n this.mockData.column_list.forEach((columnItem) => {\n if (columnItem.post_selected === true) {\n result = this.getSelectedItemsInColumn(columnItem.id);\n }\n });\n return result;\n }\n\n getColumnSelectedValues() {\n const result = [];\n this.mockData.column_list.forEach((columnItem) => {\n const columnSummery = {\n id: columnItem.id,\n postSelected: columnItem.post_selected,\n selectedItems: this.getSelectedItemsInColumn(columnItem.id, [Selected.Complete])\n };\n result.push(columnSummery);\n });\n return result;\n }\n\n toggleItemSelect(e) {\n this.itemClickSelect(e);\n this.valueChange.emit(this.getSelectedValues());\n this.valueChangeColumnSelected.emit(this.getColumnSelectedValues());\n this.valueChangeData.emit(this.mockData);\n /**\n * Switch selected state for clicked item\n * loop through sub tree to show any missing relative items\n * - see line 39, add to addon_items\n * loop through sub tree to auto select decedent items\n * loop up parent tree /tags to determine proper selection biased on sub selections\n */\n }\n\n unselectColumnItems(column, exceptions) {\n column.items.forEach((columnItem) => {\n if (!exceptions.includes(columnItem.id)) {\n columnItem.selected = Selected.None;\n }\n });\n }\n\n itemHasDescendantItem(itemColumnId, itemId, descendantColumnId, descendantItemId) {\n\n }\n\n getColumnById(columnId) {\n let column;\n this.mockData.column_list.forEach((columnItem) => {\n if (columnItem.id === columnId) {\n column = columnItem;\n }\n });\n return column;\n }\n\n getColumnItemById(column, itemId) {\n let item = null;\n column.items.forEach((columnItem) => {\n if (columnItem.id === itemId) {\n item = columnItem;\n }\n });\n return item;\n }\n\n getItemRelationshipConfig(columnId, itemId) {\n let result;\n this.mockData.relationships.forEach((relationshipItem) => {\n if (relationshipItem.column === columnId && relationshipItem.id === itemId) {\n result = relationshipItem;\n }\n });\n return result;\n }\n\n recursiveSetSelectedState(columnId, itemId, selectedState) {\n // console.log('a1', columnId, itemId, selectedState);\n // get itemId and columnId\n const column = this.getColumnById(columnId);\n\n const columnItem = this.getColumnItemById(column, itemId);\n\n // set to selected\n if (columnItem !== null) {\n columnItem.selected = selectedState;\n\n // get child relationships\n const relationship = this.getItemRelationshipConfig(columnId, itemId);\n if (relationship !== undefined) {\n // recurse to this method for each child relationship\n relationship.children.forEach((childItem) => {\n this.recursiveSetSelectedState(childItem.column, childItem.id, selectedState);\n });\n }\n }\n }\n\n removeExtraItems() {\n this.mockData.column_list.forEach((column) => {\n column.extra_items = [];\n });\n }\n\n getReverseColumnItemsForChild(columnId, itemId) {\n const reverseTree = [];\n this.mockData.relationships.forEach((relationshipItem) => {\n relationshipItem.children.forEach((childItem) => {\n if (childItem.column === columnId && childItem.id === itemId) {\n const reverseTreeItem = {\n column: relationshipItem.column,\n id: relationshipItem.id,\n display: relationshipItem.display,\n ancestors: this.getReverseColumnItemsForChild(relationshipItem.column, relationshipItem.id)\n };\n reverseTree.push(reverseTreeItem);\n }\n });\n });\n // console.log('ancestry', columnId, reverseTree);\n return reverseTree;\n }\n\n areColumnItemLowestLevelDecendentsChecked(columnId, itemId) {}\n\n/*{\n column: 'l_2_6',\n id: '001',\n children: [\n {column: 'l_2_6', id: '002', display: 'St. Marys\\' SubLayer'},\n {column: 'l_1', id: '001', display: 'St. Mary\\'s Group'},\n {column: 'l_1', id: '005', display: 'Joe Bob List'}\n ]\n},*/\n\n recursiveAddExtraItems(columnId, itemId, selectedState) {\n // get itemId and columnId\n const column = this.getColumnById(columnId);\n const columnItem = this.getColumnItemById(column, itemId);\n\n // set to selected\n columnItem.selected = selectedState;\n\n // get child relationships\n const relationship = this.getItemRelationshipConfig(columnId, itemId);\n\n // recurse to this method for each child relationship\n relationship.children.forEach((childItem) => {\n this.recursiveSetSelectedState(childItem.column, childItem.id, selectedState);\n });\n }\n\n isItemInColumnExtraItem(ancestor, columnItem) {\n let result = false;\n columnItem.extra_items.forEach((childItem) => {\n if (columnItem.id === ancestor.column && childItem.id === ancestor.id) {\n result = true;\n }\n });\n return result;\n }\n\n getSelectedItemsInColumn(columnId, validSelectedTypes = [Selected.Complete, Selected.Partial]) {\n const returnItems = [];\n const column = this.getColumnById(columnId);\n // console.log(this.mockData, column, JSON.stringify(column));\n column.items.forEach((item) => {\n // console.log(item);\n if (validSelectedTypes.includes(item.selected)) {\n returnItems.push(item);\n }\n });\n // console.log('t3y', returnItems);\n return returnItems;\n }\n\n refreshSelectionsAndExtraItems(columnId, focusedInputItem, newValue, ss = false) {\n const isSingleSelect = this.getColumnById(columnId).single_select;\n // @todo: handle single select\n if (isSingleSelect && newValue === Selected.Complete && !ss) {\n const selectedItemsInColumn = this.getSelectedItemsInColumn(columnId);\n // console.log('selectedItemsInColumn', selectedItemsInColumn);\n selectedItemsInColumn.forEach((item) => {\n this.refreshSelectionsAndExtraItems(columnId, item, Selected.None, true);\n });\n }\n\n // - step 1: let any change traverse down to adjust lowest level check selections\n this.recursiveSetSelectedState(columnId, focusedInputItem.id, newValue);\n\n // - step 3: auto add and lowest level child extra items\n // - step 2: traverse up from lowest layer to cleanup extra items\n this.removeExtraItems();\n /*this.mockData.column_list.forEach((columnItem) => {\n if (columnItem.post_selected) {// is final child layer\n columnItem.items.forEach((childItem) => {\n if (childItem.selected) {\n const ancestry = this.getReverseColumnItemsForChild(columnItem.id, childItem.id);\n ancestry.forEach((ancestor) => {\n if (!this.isItemInColumnExtraItem(ancestor, columnItem)) { // prevent duplicates\n columnItem.extra_items.push(ancestor);\n }\n });\n }\n\n });\n }\n });*/\n\n // - step 3: traverse up from lowest level children to fix parent selections\n // for any unselected child, unselect any parents that include it\n const finalChildLayerSelected = [];\n this.mockData.column_list.forEach((columnItem) => {\n if (columnItem.post_selected) {// is final child layer\n columnItem.items.forEach((childItem) => {\n if (childItem.selected) {\n finalChildLayerSelected.push(childItem);\n }\n });\n }\n });\n\n this.mockData.column_list.forEach((columnItem) => {\n if (!columnItem.post_selected) {// is final child layer\n columnItem.items.forEach((columnChildItem) => {\n columnChildItem.selected = this.getSelectedType(finalChildLayerSelected, columnChildItem);\n });\n }\n });\n }\n isColumnFinalChildColumn(id) {\n let result = false;\n this.mockData.column_list.forEach((columnItem) => {\n if (columnItem.id === id && columnItem.post_selected === true) {\n result = true;\n }\n });\n return result;\n }\n getRecursiveFinalChildrenForColumnItem(columnItem) {\n let finalChildren = [];\n // get child relationships\n const relationship = this.getItemRelationshipConfig(columnItem.column, columnItem.id);\n // recurse to this method for each child relationship\n if (relationship !== undefined) {\n relationship.children.forEach((childItem) => {\n if (this.isColumnFinalChildColumn(childItem.column)) {\n finalChildren.push(childItem);\n } else {\n finalChildren = finalChildren.concat(this.getRecursiveFinalChildrenForColumnItem(childItem));\n }\n });\n }\n return finalChildren;\n }\n\n inFilteredChildren(filteredChildren, item) {\n let result = false;\n filteredChildren.forEach((filteredItem) => {\n if (filteredItem.column === item.column && filteredItem.id === item.id) {\n result = true;\n }\n });\n return result;\n }\n\n isItemASelectedChild(selectedItems, item) {\n let result = false;\n selectedItems.forEach((selectedItem) => {\n if (selectedItem.column === item.column && selectedItem.id === item.id) {\n result = true;\n }\n });\n return result;\n }\n\n getSelectedType(finalChildLayerSelectedItems, columnChildItem) {\n let allSelected;\n let partialSelected;\n // get final children from relationships\n const finalChildren = this.getRecursiveFinalChildrenForColumnItem(columnChildItem);\n // remove duplicates\n const filteredChildren = [];\n finalChildren.forEach((fcItem) => {\n if (!this.inFilteredChildren(filteredChildren, fcItem)) {\n filteredChildren.push(fcItem);\n }\n });\n\n allSelected = true;\n partialSelected = false;\n\n // are all the finalChildren for the columnItem in this list of selected children\n filteredChildren.forEach((finalChildForColumn) => {\n if (this.isItemASelectedChild(finalChildLayerSelectedItems, finalChildForColumn)) {\n partialSelected = true;\n } else {\n allSelected = false;\n }\n /*finalChildLayerSelectedItems.forEach((selectedChild) => {\n\n if (selectedChild.column === finalChildForColumn.column && selectedChild.id === finalChildForColumn.id) {\n if (!finalChildForColumn.selected) {\n allSelected = false;\n } else {\n partialSelected = true;\n }\n }\n });*/\n });\n if (allSelected) {\n return Selected.Complete;\n } else if (partialSelected) {\n return Selected.Partial;\n } else {\n return Selected.None;\n }\n // if so then complete\n // if some then partial\n // else none\n }\n\n /*selectSubColumnItems(column) {\n // find currently selected items\n column.items.forEach((columnItem) => {\n this.getColumnSubItemsForColumnItem(column.id, columnItem.id, ).forEach((subItem) => {\n\n });\n });\n // identify and select sub items for each of the currently selected items\n }\n\n getColumnSubItemsForColumnItem(columnId, columnItemId, searchColumnId) {\n if (searchColumnId === undefined) {\n searchColumnId = columnId;\n }\n const subItems = [];\n this.mockData.relationships.forEach((rItem) => {\n if (rItem.column === columnId && rItem.id === columnItemId) {\n rItem.children.forEach((cItem) => {\n if (cItem.column === searchColumnId) {\n subItems.push(cItem);\n }\n });\n }\n });\n return subItems;\n }*/\n\n itemClickSelect(e) {\n if (e.column.single_select) {\n this.unselectColumnItems(e.column, [e.columnItem.id]);\n }\n\n switch (e.columnItem.selected) {\n case Selected.Complete:\n this.refreshSelectionsAndExtraItems(e.column.id, e.columnItem, Selected.None);\n break;\n case Selected.None:\n this.refreshSelectionsAndExtraItems(e.column.id, e.columnItem, Selected.Complete);\n break;\n case Selected.Partial:\n this.refreshSelectionsAndExtraItems(e.column.id, e.columnItem, Selected.Complete);\n break;\n default:\n this.refreshSelectionsAndExtraItems(e.column.id, e.columnItem, Selected.Complete);\n }\n this.bringSelectedValuesToTop();\n }\n\n itemLogicSelect() {\n // determine if all direct child items are selected\n }\n}\n","
    \n
    \n Please type an Account or Customer to find.
    \n (3 Characters are Required to Search)\n
    \n
    \n
    Results Updating.
    \n
    \n
    \n No Results Found.\n
    \n
    \n \n
    \n
    \n



    \n\n \n\n
    \n
    Presented Name to represent Account/Customer Selection
    \n
    \n
    \n \n Update To: \n \n
    \n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {RequestState} from '../../../api/request-handler';\nimport {RefreshHandlerService} from '../../../api/refresh-handler.service';\nimport {ApiService} from '../../../api/api.service';\nimport {BrParamsService} from '../../br-params.service';\n\nenum Selected {\n None = 0,\n Complete = 1,\n Partial = 2\n}\n\n@Component({\n selector: 'app-account-customer-selector',\n templateUrl: './account-customer-selector.component.html',\n styleUrls: ['./account-customer-selector.component.scss']\n})\nexport class AccountCustomerSelectorComponent implements OnInit, OnDestroy {\n data = null;\n /*{\n column_list: [\n {\n id: 'l_2_6',\n label: 'Account (Level 2-5)',\n post_selected: false,\n single_select: true,\n items: [\n {column: 'l_2_6', id: '001', display: 'St. Marys\\' Conglomerate', selected: Selected.None},\n {column: 'l_2_6', id: '002', display: 'St. Marys\\' SubLayer', selected: Selected.None},\n {column: 'l_2_6', id: '003', display: 'St. Francis Hosp.', selected: Selected.None},\n ],\n extra_items: []\n },\n {\n id: 'l_1',\n label: 'Account (Level 1)',\n post_selected: false,\n single_select: true,\n items: [\n {column: 'l_1', id: '001', display: 'St. Mary\\'s Group', selected: Selected.None},\n {column: 'l_1', id: '002', display: 'St. Francis Hosp.', selected: Selected.None},\n {column: 'l_1', id: '003', display: 'Harris methodist', selected: Selected.None},\n {column: 'l_1', id: '004', display: 'Texas Health', selected: Selected.None}\n ],\n extra_items: []\n },\n {\n id: 'l_c_0',\n label: 'Customer (Level 0)',\n post_selected: true,\n single_select: false,\n items: [\n {column: 'l_c_0', id: '001', display: 'St. Mary\\'s Hosp', selected: Selected.None},\n {column: 'l_c_0', id: '002', display: 'St. Mary\\'s Clinic', selected: Selected.None},\n {column: 'l_c_0', id: '003', display: 'St. Francis Hosp', selected: Selected.None},\n {column: 'l_c_0', id: '004', display: 'Joe Bob Clinic Super Long Text', selected: Selected.None},\n {column: 'l_c_0', id: '005', display: 'Harris Meth 1', selected: Selected.None},\n {column: 'l_c_0', id: '006', display: 'Texas Health 2', selected: Selected.None}\n ],\n extra_items: []\n }\n ],\n relationships: [\n {\n column: 'l_2_6',\n id: '001',\n display: '',\n children: [\n {column: 'l_2_6', id: '002', display: 'St. Marys\\' SubLayer'},\n {column: 'l_1', id: '001', display: 'St. Mary\\'s Group'},\n // {column: 'l_1', id: '005', display: 'Joe Bob List'}\n ]\n },\n {\n column: 'l_2_6',\n id: '002',\n display: '',\n children: [\n {column: 'l_1', id: '001', display: 'St. Mary\\'s Group'}\n ]\n },\n {\n column: 'l_2_6',\n id: '003',\n display: 'Harris methodist',\n children: [\n {column: 'l_1', id: '002', display: 'St. Francis Hosp.'}\n ]\n },\n {\n column: 'l_2_6',\n id: '004',\n display: '',\n children: [\n {column: 'l_1', id: '003', display: 'Harris methodist'},\n {column: 'l_1', id: '004', display: 'Texas Health'}\n ]\n },\n {\n column: 'l_1',\n id: '001',\n display: 'St. Mary\\'s Group',\n children: [\n {column: 'l_c_0', id: '001', display: 'St. Mary\\'s Hosp'},\n {column: 'l_c_0', id: '002', display: 'St. Mary\\'s Clinic'}\n ]\n },\n /*{\n column: 'l_1',\n id: '005',\n display: '',\n children: [\n {column: 'l_c_0', id: '004', display: 'Joe Bob Clinic'}\n ]\n },*/\n /*\n {\n column: 'l_1',\n id: '002',\n display: 'St. Francis Hosp.',\n children: [\n {column: 'l_c_0', id: '003', display: 'St. Francis Hosp'}\n ]\n },\n {\n column: 'l_1',\n id: '003',\n display: 'St. Francis Hosp',\n children: [\n {column: 'l_c_0', id: '005', display: 'Harris Meth 1'},\n {column: 'l_c_0', id: '009', display: 'Harris Meth 2'}\n ]\n },\n {\n column: 'l_1',\n id: '004',\n display: 'Texas Health',\n children: [\n {column: 'l_c_0', id: '006', display: 'Texas Health 2'}\n ]\n }\n ]\n };*/\n protected requestHandler;\n protected apiSource = '/qbr/search_options/account_customer/search_results';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n public RequestState = RequestState;\n public searchQuery = '';\n public presentedName = '';\n public recommendedText = '';\n public noSelections = true;\n callback;\n firstCall = true;\n\n constructor(\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n private brParamsService: BrParamsService // @todo: set selected account customer in BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.searchQuery = this.brParamsService.get('acct_customer_query');\n this.requestHandler = this.callApiSource(this.apiSource, 0);\n this.callback = (state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n const persistedChoices = this.brParamsService.get('acct_cust_data');\n if (this.firstCall && persistedChoices != null && persistedChoices !== undefined) {\n this.data = persistedChoices;\n this.firstCall = false;\n this.valueChangeColumnSelected(this.data.column_list);\n } else {\n this.data = apiData;\n if (!this.data.hasOwnProperty('status') || this.data.status !== 'fail') {\n this.brParamsService.set('acct_cust_data', this.data);\n }\n }\n }\n };\n this.requestHandler.onStateChange(this.callback);\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.apiSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.apiSource));\n\n this.presentedName = this.brParamsService.get('presentedName');\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'presentedName') {\n this.presentedName = this.brParamsService.get('presentedName');\n }\n if (brParamKey === 'acct_customer_query') {\n this.searchQuery = this.brParamsService.get('acct_customer_query');\n this.refreshHandlerService.triggerCallbacks(['acct_customer_query']);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.removeStateListener(this.callback);\n this.requestHandler.cancelSubscription();\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n searchChange(e) {\n this.searchQuery = e;\n setTimeout(() => {\n if (this.searchQuery === e && e.length >= 4) {\n this.brParamsService.set('acct_customer_query', e);\n this.refreshHandlerService.triggerCallbacks(['acct_customer_query']);\n }\n }, 1000);\n }\n\n valueChanged(e) {\n this.brParamsService.set('uck', this.getArrayOfPropertyFromObject(e, 'id'));\n this.brParamsService.set('acct_cust_data', this.data);\n }\n\n presentedNameChange(e) {\n this.brParamsService.set('presentedName', this.presentedName);\n }\n\n selectRecommendedText() {\n this.presentedName = this.recommendedText;\n this.brParamsService.set('presentedName', this.presentedName);\n }\n\n objectPropertyJoin(arrayOfObjects, property, glue) {\n let isFirst = true;\n let result = '';\n for (const item of arrayOfObjects) {\n if (!isFirst) {\n result += glue;\n } else {\n isFirst = false;\n }\n result += this.rmCustomerNumber(item[property]);\n }\n return result;\n }\n\n rmCustomerNumber(input) {\n const parts = input.split('(');\n return parts[0];\n }\n\n valueChangeColumnSelected(e) {\n let colL25; let colL1; let colL0;\n e.forEach((columnItem) => {\n if (columnItem.id === 'L_2_5') {\n colL25 = columnItem;\n } else if (columnItem.id === 'L_1') {\n colL1 = columnItem;\n } else if (columnItem.id === 'L_0') {\n colL0 = columnItem;\n }\n });\n this.noSelections = false;\n if (colL25.selectedItems !== undefined && colL25.selectedItems.length > 1) {\n this.recommendedText = 'Multiple Accounts ' + this.objectPropertyJoin(colL25.selectedItems, 'display', ', ');\n } else if (colL25.selectedItems !== undefined && colL25.selectedItems.length === 1) {\n this.recommendedText = colL25.selectedItems[0].display;\n } else {\n if (colL1.selectedItems !== undefined && colL1.selectedItems.length > 1) {\n this.recommendedText = 'Multiple Accounts ' + this.objectPropertyJoin(colL1.selectedItems, 'display', ', ');\n } else if (colL1.selectedItems !== undefined && colL1.selectedItems.length === 1) {\n this.recommendedText = colL1.selectedItems[0].display;\n } else {\n if (colL0.selectedItems !== undefined && colL0.selectedItems.length > 1) {\n this.recommendedText = 'Multiple Customers ' + this.objectPropertyJoin(colL0.selectedItems, 'display', ', ');\n } else if (colL0.selectedItems !== undefined && colL0.selectedItems.length === 1) {\n this.recommendedText = this.rmCustomerNumber(colL0.selectedItems[0].display);\n } else {\n this.noSelections = true;\n }\n }\n }\n }\n\n valueChangedData(e) {}\n\n getArrayOfPropertyFromObject(object, property) {\n const result = [];\n for (const item of object) {\n result.push(item[property]);\n }\n return result;\n }\n}\n","
    \n Limit Business Review to the Last\n Full Months\n Note: This setting will only affect some specific drill downs, the dashboard view will show compact snapshots with 4-5 months per metric. Other views may be unaffected by this setting depending on their intended purpose.\n
    ","import { Component, OnInit } from '@angular/core';\nimport {BrHistoryRange} from '../../br-history-range.service';\nimport {BrParamsService} from '../../br-params.service';\n\n@Component({\n selector: 'app-br-history-range-selector',\n templateUrl: './br-history-range-selector.component.html',\n styleUrls: ['./br-history-range-selector.component.scss']\n})\nexport class BrHistoryRangeSelectorComponent implements OnInit {\n periodOptions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];\n selectedValue;\n\n constructor(\n private brHistoryRangeService: BrHistoryRange,\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n let presistedValue = this.brParamsService.get('br_history_range_detail');\n this.selectedValue = presistedValue;\n this.brHistoryRangeService.setHistoryRange(presistedValue);\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'br_history_range_detail') {\n presistedValue = this.brParamsService.get('br_history_range_detail');\n this.selectedValue = presistedValue;\n this.brHistoryRangeService.setHistoryRange(presistedValue);\n }\n });\n }\n\n setMonths(value) {\n this.brHistoryRangeService.setHistoryRange(value);\n this.brParamsService.set('br_history_range_detail', value);\n this.selectedValue = value;\n }\n}\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {RequestState} from '../../../api/request-handler';\nimport {RefreshHandlerService} from '../../../api/refresh-handler.service';\nimport {BrParamsService} from '../../br-params.service';\nimport {ApiService} from '../../../api/api.service';\n\nenum Selected {\n None = 0,\n Complete = 1,\n Partial = 2\n}\n\n@Component({\n selector: 'app-br-product-selector',\n templateUrl: './br-product-selector.component.html',\n styleUrls: ['./br-product-selector.component.scss']\n})\nexport class BrProductSelectorComponent implements OnInit, OnDestroy {\n data = null;\n /*{\n column_list: [\n {\n id: 'pc',\n label: 'Product Class',\n post_selected: false,\n single_select: true,\n items: [\n {column: 'pc', id: 'ia', display: 'Immunoassay', selected: Selected.None},\n {column: 'pc', id: 'cc', display: 'Clinical Chemistry', selected: Selected.None}\n ],\n extra_items: []\n },\n {\n id: 'plg',\n label: 'PL Group',\n post_selected: false,\n single_select: true,\n items: [\n {column: 'plg', id: 'alinia', display: 'Alinity - IA', selected: Selected.None},\n {column: 'plg', id: 'archia', display: 'Architect - IA', selected: Selected.None},\n {column: 'plg', id: 'alincc', display: 'Alinity -CC', selected: Selected.None},\n {column: 'plg', id: 'archcc', display: 'Architect - CC', selected: Selected.None}\n ],\n extra_items: []\n },\n {\n id: 'pl',\n label: 'PLs',\n post_selected: true,\n single_select: false,\n items: [\n {column: 'pl', id: '205', display: 'Alinity I', selected: Selected.None},\n {column: 'pl', id: '210', display: 'Alinity C', selected: Selected.None},\n {column: 'pl', id: '126', display: 'C8000', selected: Selected.None},\n {column: 'pl', id: '118', display: 'i2000sr', selected: Selected.None}\n ],\n extra_items: []\n }\n ],\n relationships: [\n {\n column: 'pc',\n id: 'ia',\n display: '',\n children: [\n {column: 'plg', id: 'alinia', display: 'St. Marys\\' SubLayer'},\n {column: 'plg', id: 'archia', display: 'St. Mary\\'s Group'},\n {column: 'pl', id: '205', display: 'St. Mary\\'s Group'},\n {column: 'pl', id: '118', display: 'St. Mary\\'s Group'},\n ]\n },\n {\n column: 'pc',\n id: 'cc',\n display: '',\n children: [\n {column: 'plg', id: 'alincc', display: 'St. Marys\\' SubLayer'},\n {column: 'plg', id: 'archcc', display: 'St. Mary\\'s Group'},\n {column: 'pl', id: '210', display: 'St. Mary\\'s Group'},\n {column: 'pl', id: '126', display: 'St. Mary\\'s Group'},\n ]\n },\n {\n column: 'plg',\n id: 'alinia',\n display: '',\n children: [\n {column: 'pl', id: '205', display: 'St. Mary\\'s Group'},\n ]\n },\n {\n column: 'plg',\n id: 'archia',\n display: '',\n children: [\n {column: 'pl', id: '118', display: 'St. Mary\\'s Group'},\n ]\n },\n {\n column: 'plg',\n id: 'alincc',\n display: '',\n children: [\n {column: 'pl', id: '210', display: 'St. Mary\\'s Group'},\n ]\n },\n {\n column: 'plg',\n id: 'alinia',\n display: '',\n children: [\n {column: 'pl', id: '126', display: 'St. Mary\\'s Group'},\n ]\n },\n ]\n };*/\n protected requestHandler;\n protected apiSource = '/qbr/app_config/products/products';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n\n constructor(\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.callApiSource(this.apiSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n const persistedChoices = this.brParamsService.get('products_data');\n if (persistedChoices != null) {\n this.data = persistedChoices;\n } else {\n this.data = apiData;\n // this.data[2][0].selected = 1; // hack to fix all product lines not being selected\n }\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.apiSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.apiSource));\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'products_data') {\n this.data = this.brParamsService.get('products_data');\n }\n });\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n valueChanged(e) {\n this.brParamsService.set('pl', this.getArrayOfPropertyFromObject(e, 'id'));\n this.brParamsService.set('products_data', this.data);\n this.brParamsService.set('product_description', this.getArrayOfPropertyFromObject(e, 'display').join(', '));\n }\n\n getArrayOfPropertyFromObject(object, property) {\n const result = [];\n for (const item of object) {\n result.push(item[property]);\n }\n return result;\n }\n}\n","\n \n \n \n\n\n\n","import { Component, OnInit, OnDestroy, ElementRef, HostListener, ViewChild, Input, ChangeDetectorRef } from '@angular/core';\nimport {ApiService} from '../../../api/api.service';\nimport {RequestState} from '../../../api/request-handler';\nimport {AuthenticationService} from '../../../authentication/authentication.service';\nimport {BrParamsService} from '../../br-params.service';\n\n@Component({\n selector: 'app-br-servicing-group-selector',\n templateUrl: './br-servicing-group-selector.component.html',\n styleUrls: ['./br-servicing-group-selector.component.scss']\n})\nexport class BrServicingGroupSelectorComponent implements OnInit, OnDestroy {\n RequestStateComplete = RequestState.Complete; // temporary until api call is implemented\n\n protected requestHandler;\n protected apiSource = '/qbr/app_config/servicing_groups/servicing_groups';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n\n selectedValues = [];\n apiState;\n data = [];\n\n constructor(\n private authService: AuthenticationService,\n private cdRef: ChangeDetectorRef,\n private apiService: ApiService,\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.updateSelections();\n\n this.requestHandler = this.apiService.get(this.apiSource);\n this.requestHandler.sendRequest(this.apiSource);\n this.requestHandler.onStateChange((state) => {\n this.apiState = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n\n const buildData = [];\n let lookForPersistedValue = false;\n const presistedValue = this.brParamsService.get('sg');\n if (presistedValue.length !== 0) {\n lookForPersistedValue = true;\n }\n for (const item of apiData.items) {\n const tempItem = {\n label: item.display_name,\n key: item.id\n };\n buildData.push(tempItem);\n if (lookForPersistedValue) {\n if (presistedValue.includes(item.id)) {\n this.selectedValues.push(tempItem);\n }\n } else if (item.selected) {\n this.selectedValues.push(tempItem);\n }\n }\n this.data = buildData;\n\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'sg') {\n this.selectedValues = [];\n let lookForPersistedValue2 = false;\n const presistedValue2 = this.brParamsService.get('sg');\n if (presistedValue2.length !== 0) {\n lookForPersistedValue2 = true;\n }\n for (const item of apiData.items) {\n const tempItem = {\n label: item.display_name,\n key: item.id\n };\n if (lookForPersistedValue2) {\n if (presistedValue2.includes(item.id)) {\n this.selectedValues.push(tempItem);\n }\n } else if (item.selected) {\n this.selectedValues.push(tempItem);\n }\n }\n }\n });\n }\n });\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n }\n\n updateSelections() {\n\n // this.menuText1 = this.selectedType;\n // this.menuText2 = this.selectedLabel;\n\n this.cdRef.detectChanges();\n }\n\n getLabel(key) {\n if (this.data) {\n for (const item of this.data) {\n if (item.key === key) {\n return item.label;\n }\n }\n }\n return '';\n }\n\n valueChange(selectedItems) {\n // this.selectedValues = this.getArrayOfPropertyFromObject(selectedItems, 'key');\n this.brParamsService.set('sg', this.getArrayOfPropertyFromObject(selectedItems, 'key'));\n this.brParamsService.set('sg_description', this.getArrayOfPropertyFromObject(selectedItems, 'key').join(', '));\n }\n\n getArrayOfPropertyFromObject(object, property) {\n const result = [];\n for (const item of object) {\n result.push(item[property]);\n }\n return result;\n }\n}\n","
    \n \n
    \n

    Click the above box to make selections.

    ","
    \n
      \n
    1. \n {{item.metric_name}}\n
    2. \n
    \n
    ","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\nimport {RequestState} from '../../api/request-handler';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\n\n@Component({\n selector: 'app-br-template-viewer',\n templateUrl: './br-template-viewer.component.html',\n styleUrls: ['./br-template-viewer.component.scss']\n})\nexport class BrTemplateViewerComponent implements OnInit, OnDestroy {\n public stdKpiListData = null;\n protected requestHandler;\n protected stdKpiListSource = '/qbr/template/std/std_kpi_list';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n public templateStringOrder = null;\n public newListOrder = [];\n\n @Input() set templateString( value: string ) {\n this.templateStringOrder = value.split(',');\n this.buildListOrder();\n }\n\n constructor(\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n ) { }\n\n ngOnInit(): void {\n this.requestHandler = this.callApiSource(this.stdKpiListSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.stdKpiListData = apiData;\n this.newListOrder = apiData.items;\n this.buildListOrder();\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.stdKpiListSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.stdKpiListSource));\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n }\n\n buildListOrder() {\n if (this.stdKpiListData !== null && this.templateStringOrder !== null && this.templateStringOrder.length > 1) {\n // order items\n this.newListOrder = [];\n for (const orderItem of this.templateStringOrder) {\n const item = this.getStdKpiListItem(orderItem);\n item.active = true;\n this.newListOrder.push(item);\n }\n // get items missing\n // for (const i in this.stdKpiListData.items) {\n // if (!this.templateStringOrder.includes(this.stdKpiListData.items[i].id)) {\n // this.stdKpiListData.items[i].active = false;\n // this.newListOrder.push(this.stdKpiListData.items[i]);\n // }\n // }\n }\n }\n\n getStdKpiListItem(id) {\n let returnValue = null;\n for (const i in this.stdKpiListData.items) {\n if (this.stdKpiListData.items[i].id == id) {\n returnValue = this.stdKpiListData.items[i];\n }\n }\n return returnValue;\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n}\n","

    Build Template of KPI Selections

    \n\n \n
    \n \n  \n \n
    \n
    \n

    Note: recommended items are denoted with an astrix.

    \n\n \n \n \n \n \n \n
    {{item.metric_name}} *\n 0\">\n \n \n \n Inactive\n Active\n
    \n","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\nimport {BrParamsService} from '../br-params.service';\nimport {PresentationToggleHandlerService} from '../presentation-toggle-handler.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DASHBOARD_ARRANGEMENT} from '../configuration/dashboard-arrangement';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {RequestState} from '../../api/request-handler';\nimport {\n faChevronUp,\n faChevronDown\n} from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'app-br-template-editor',\n templateUrl: './br-template-editor.component.html',\n styleUrls: ['./br-template-editor.component.scss']\n})\nexport class BrTemplateEditorComponent implements OnInit, OnDestroy {\n faUp = faChevronUp;\n faDown = faChevronDown;\n defaultDashboard = DASHBOARD_ARRANGEMENT;\n\n public stdKpiListData = null;\n protected requestHandler;\n protected stdKpiListSource = '/qbr/template/std/std_kpi_list';\n protected saveUserTemplateSource = '/qbr/template/custom/save_user_template_add';\n protected saveEditUserTemplateSource = '/qbr/template/custom/save_user_template_edit';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n idSet;\n public templateStringOrder = null;\n public newListOrder = [];\n recommended = [12, 36];\n\n @Output() saveEvent: EventEmitter = new EventEmitter();\n @Output() cancelEvent: EventEmitter = new EventEmitter();\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private presentationToggleHandlerService: PresentationToggleHandlerService,\n private brParamsService: BrParamsService,\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n ) { }\n\n @Input() set id( value: string ) {\n this.idSet = value;\n this.requestHandler = this.callApiSource(this.stdKpiListSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.stdKpiListData = apiData;\n this.newListOrder = apiData.items;\n for (const item of this.newListOrder) {\n item.active = true;\n if (item.recommended) {\n this.recommended.push(item.id);\n }\n }\n this.buildListOrder();\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.stdKpiListSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.stdKpiListSource));\n }\n\n @Input() set templateString( value: string ) {\n this.templateStringOrder = value.split(',');\n this.buildListOrder();\n }\n\n buildListOrder() {\n if (this.stdKpiListData !== null && this.templateStringOrder !== null && this.templateStringOrder.length > 1) {\n // order items\n this.newListOrder = [];\n for (const orderItem of this.templateStringOrder) {\n const item = this.getStdKpiListItem(orderItem);\n if (item !== null && item !== undefined) {\n item.active = true;\n }\n this.newListOrder.push(item);\n }\n // get items missing\n for (const i in this.stdKpiListData.items) {\n if (!this.templateStringOrder.includes(this.stdKpiListData.items[i].id.toString())) {\n this.stdKpiListData.items[i].active = false;\n this.newListOrder.push(this.stdKpiListData.items[i]);\n }\n }\n }\n }\n\n getStdKpiListItem(id) {\n let returnValue = null;\n for (const i in this.stdKpiListData.items) {\n if (this.stdKpiListData.items[i].id == id) {\n returnValue = this.stdKpiListData.items[i];\n }\n }\n return returnValue;\n }\n\n ngOnInit(): void {\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n this.navbarBuilderService.setIsVisible(true);\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n nameChange(e) {\n this.brParamsService.set('br_template_name', e);\n // this.refreshHandlerService.triggerCallbacks(['br_template_name']);\n }\n\n saveAs() {\n let source = this.saveUserTemplateSource;\n if (this.idSet !== 'br_kpi') {\n source = this.saveEditUserTemplateSource;\n this.brParamsService.set('br_template_id', this.idSet);\n }\n const selectedIds = [];\n for (let i = 0; i < this.newListOrder.length; i++) {\n const item = this.newListOrder[i];\n if (item.active === undefined || item.active) {\n selectedIds.push(item.id);\n }\n }\n this.brParamsService.set('br_template_string', selectedIds.join(','));\n // br_template_id\n\n this.requestHandler = this.callApiSource(source, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.brParamsService.set('list_user_templates_update', this.brParamsService.get('list_user_templates_update') + 1);\n this.refreshHandlerService.triggerCallbacks(['list_user_templates_update']);\n this.cancelEvent.emit('saved');\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(source); // , null, true\n }, this.requestHandler.getRelativeParams(source));\n this.saveEvent.emit('save');\n }\n\n cancel() {\n this.cancelEvent.emit('cancel');\n }\n\n moveUp(i) {\n const element = this.newListOrder.splice(i, 1)[0];\n this.newListOrder.splice(i - 1, 0, element);\n // splice(start, deleteCount)\n // splice(start, deleteCount, item1)\n }\n moveDown(i) {\n const element = this.newListOrder.splice(i, 1)[0];\n this.newListOrder.splice(i + 1, 0, element);\n }\n switchActive(i) {\n if (this.newListOrder[i].active === undefined) {\n this.newListOrder[i].active = false;\n } else if (this.newListOrder[i].active) {\n this.newListOrder[i].active = false;\n } else {\n this.newListOrder[i].active = true;\n }\n }\n setRecommended() {\n for (const item of this.newListOrder) {\n if (this.isRecommended(item)) {\n item.active = true;\n } else {\n item.active = false;\n }\n }\n }\n isRecommended(item) {\n if (this.recommended.includes(item.id)) {\n return true;\n }\n return false;\n }\n}\n","
    \n
    \n \n
    \n \n \n Selected Template Order\n \n
    \n
    \n \n
    \n
    \n \n
    \n\n\n\n\n\n\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport {Router, ActivatedRoute} from '@angular/router';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {\n faICursor,\n faPlus\n} from '@fortawesome/free-solid-svg-icons';\nimport {RequestState} from '../../api/request-handler';\nimport {RefreshHandlerService} from '../../api/refresh-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {BrTemplateSelectionService} from '../br-template-selection.service';\nimport {BrParamsService} from '../br-params.service';\n\n@Component({\n selector: 'app-br-template-selector',\n templateUrl: './br-template-selector.component.html',\n styleUrls: ['./br-template-selector.component.scss']\n})\nexport class BrTemplateSelectorComponent implements OnInit, OnDestroy {\n faICursor = faICursor;\n faPlus = faPlus;\n\n operation = 1; // 1: select, 2: edit, 3: add\n\n public userTemplatesData = [\n {\n key: 'br_kpi',\n title: 'Default Template',\n template_string: '',\n icon: '',\n tooltip: ''\n }\n ];\n protected requestHandler2;\n protected stdKpiListSource = '/qbr/template/std/std_kpi_list';\n protected stdKpiData;\n protected requestHandler;\n protected listUserTemplatesSource = '/qbr/template/custom/list_user_templates';\n protected refreshHandleKey;\n public state = RequestState.Inactive;\n\n selectedOption = 'br_kpi';\n selectedTemplateString = '';\n\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n private apiService: ApiService,\n protected refreshHandlerService: RefreshHandlerService,\n private brTemplateSelectionService: BrTemplateSelectionService,\n private brParamsService: BrParamsService\n ) {}\n\n\n ngOnInit(): void {\n this.requestHandler2 = this.callApiSource(this.stdKpiListSource, 0);\n this.requestHandler2.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler2.getResponse();\n const apiData = JSON.parse(response.body);\n this.stdKpiData = apiData;\n }\n });\n this.requestHandler = this.callApiSource(this.listUserTemplatesSource, 0);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n this.userTemplatesData = [];\n this.userTemplatesData.push({\n key: 'br_kpi',\n title: 'Default Template',\n template_string: '',\n icon: '',\n tooltip: ''\n });\n if (apiData.hasOwnProperty('items')) {\n for (const item of apiData.items) {\n this.userTemplatesData.push({\n key: item.template_id,\n title: item.template_name,\n template_string: item.template_string,\n icon: '',\n tooltip: ''\n });\n }\n }\n }\n });\n this.refreshHandleKey = this.refreshHandlerService.onRefreshEvent((index) => {\n this.requestHandler.sendRequest(this.listUserTemplatesSource); // , null, true\n }, this.requestHandler.getRelativeParams(this.listUserTemplatesSource));\n let persistedId = this.brParamsService.get('br_selected_template_id');\n let persistedName = this.brParamsService.get('br_selected_template_name');\n let persistedString = this.brParamsService.get('br_selected_template_string');\n let persistedValue = {id: persistedId, name: persistedName, string: persistedString};\n if (persistedId !== null) {\n this.brTemplateSelectionService.updateSelectedTemplate(persistedId, persistedName, persistedString);\n } else {\n persistedValue = this.brTemplateSelectionService.getSelectedTemplate();\n }\n this.selectedOption = persistedValue.id;\n this.selectedTemplateString = persistedValue.string;\n\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'br_selected_template_id') {\n persistedId = this.brParamsService.get('br_selected_template_id');\n persistedName = this.brParamsService.get('br_selected_template_name');\n persistedString = this.brParamsService.get('br_selected_template_string');\n persistedValue = {id: persistedId, name: persistedName, string: persistedString};\n this.selectedOption = persistedValue.id;\n this.selectedTemplateString = persistedValue.string;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.refreshHandlerService.cancelRefreshEvent(this.refreshHandleKey);\n this.requestHandler.cancelSubscription();\n this.requestHandler2.cancelSubscription();\n }\n\n callApiSource(apiSource, apiDataIndex) {\n const requestHandler = this.apiService.get(apiSource + '_' + apiDataIndex);\n requestHandler.onStateChange((state) => {\n this.state = state;\n });\n requestHandler.sendRequest(apiSource);\n\n return requestHandler;\n }\n\n getToolOption(key) {\n for (const option of this.userTemplatesData) {\n if (option.key === key) {\n return option;\n }\n }\n return null;\n }\n\n getOrderFromStdKpiList() {\n const order = [];\n for (const item of this.stdKpiData.items) {\n order.push(item.id);\n }\n return order.join(',');\n }\n\n valueChange(value) {\n const toolOption = this.getToolOption(value);\n this.selectedOption = toolOption.key;\n if (toolOption.key === 'br_kpi') {\n this.selectedTemplateString = this.getOrderFromStdKpiList();\n } else {\n this.selectedTemplateString = toolOption.template_string;\n }\n this.brTemplateSelectionService.updateSelectedTemplate(this.selectedOption, toolOption.title, this.selectedTemplateString);\n this.brParamsService.set('br_selected_template_name', toolOption.title);\n this.brParamsService.set('br_selected_template_string', this.selectedTemplateString);\n this.brParamsService.set('br_selected_template_id', this.selectedOption);\n }\n\n addLink() {\n this.operation = 3;\n // this.router.navigate(['brTemplateEditor'], {relativeTo: this.route});\n }\n\n editLink() {\n this.operation = 2;\n // this.router.navigate(['brTemplateEditor'], {relativeTo: this.route});\n }\n\n onSave() {\n this.operation = 1;\n }\n\n onCancel() {\n this.operation = 1;\n }\n}\n","

    \r\n {{presentedName}}: {{detailperiod}}
    \r\n \r\n {{rangeLiteral}}: \r\n {{startDate}} thru {{endDate}}\r\n \r\n

    ","import { Component, OnInit, Input } from '@angular/core';\nimport {BrParamsService} from '../br-params.service';\n\n@Component({\n selector: 'app-filter-presentation-header',\n templateUrl: './filter-presentation-header.component.html',\n styleUrls: ['./filter-presentation-header.component.scss']\n})\nexport class FilterPresentationHeaderComponent implements OnInit {\n presentedName = '';\n @Input() viewType = 'details';\n @Input() rangeLiteral = 'History Range';\n @Input() includePeriodRange = true;\n @Input() thumbnailMonths = false;\n singlePeriodHistory = false;\n historyRange = 4;\n detailperiod;\n startDate;\n endDate;\n minDaysInMonthToIncludePartialMonth = 10;\n\n constructor(\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.presentedName = this.brParamsService.get('presentedName');\n this.historyRange = this.brParamsService.get('br_periods_to_show');\n this.detailperiod = this.brParamsService.get('detailperiod');\n if (this.detailperiod === null) {\n this.singlePeriodHistory = false;\n } else {\n this.singlePeriodHistory = true;\n }\n\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'presentedName') {\n this.presentedName = this.brParamsService.get('presentedName');\n }\n if ((this.viewType === 'details' && brParamKey === 'br_history_range_detail') && !this.thumbnailMonths) {\n this.historyRange = this.brParamsService.get('br_history_range_detail');\n this.startDate = this.getStartDate();\n this.endDate = this.getEndDate();\n }\n if ((this.viewType === 'dashboard' && brParamKey === 'br_history_range_dashboard') || this.thumbnailMonths) {\n this.historyRange = this.brParamsService.get('br_history_range_dashboard');\n this.startDate = this.getStartDate();\n this.endDate = this.getEndDate();\n }\n });\n if (this.viewType === 'dashboard' || this.thumbnailMonths) {\n this.historyRange = this.brParamsService.get('br_history_range_dashboard');\n }\n if (this.viewType === 'details' && !this.thumbnailMonths) {\n this.historyRange = this.brParamsService.get('br_history_range_detail');\n }\n // console.log('historyRange', this.historyRange);\n this.startDate = this.getStartDate();\n this.endDate = this.getEndDate();\n }\n\n getStartDate() {\n const d = new Date();\n d.setMonth(d.getMonth() - this.historyRange);\n return d.getFullYear() + '-' + (('' + (d.getMonth() + 1)).padStart(2, '0'));\n // return d.toLocaleString('default', { month: 'long' });\n }\n\n conditionallyIncludePartialMonth() {\n const d = new Date();\n return (d.getUTCDate() >= this.minDaysInMonthToIncludePartialMonth);\n }\n\n addPartialMonth() {\n if (this.conditionallyIncludePartialMonth()) {\n return 1;\n }\n return 0;\n }\n\n getEndDate() {\n const d = new Date();\n d.setMonth(d.getMonth());\n\n return d.getFullYear() + '-' + (('' + (d.getMonth() + this.addPartialMonth())).padStart(2, '0'));\n // return d.toLocaleString('default', { month: 'long' });\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef, Input,\n OnDestroy,\n Type,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport {ComponentLookupRegistry} from '../../decorators/component-lookup';\nimport {BrTileReference} from '../configuration/br-tile-reference';\n\n@Component({\n selector: 'app-br-tile-insert',\n templateUrl: './br-tile-insert.component.html',\n styleUrls: ['./br-tile-insert.component.scss']\n})\nexport class BrTileInsertComponent implements AfterViewInit, OnDestroy {\n dynamicComponentRef: ComponentRef;\n\n @Input() tileReference: BrTileReference;\n\n @ViewChild('dynamic', {read: ViewContainerRef}) viewContainerRef: ViewContainerRef;\n\n constructor(private factoryResolver: ComponentFactoryResolver, private cd: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.loadDynamicComponent();\n });\n this.cd.detectChanges();\n }\n\n loadDynamicComponent() {\n const componentType: Type = ComponentLookupRegistry.get(this.tileReference.componentName);\n if (componentType !== undefined) {\n const componentFactory = this.factoryResolver.resolveComponentFactory(componentType);\n\n this.viewContainerRef.clear();\n this.dynamicComponentRef = this.viewContainerRef.createComponent(componentFactory);\n // add tileReference to component data inputs\n (this.dynamicComponentRef.instance).tileReference = this.tileReference;\n }\n }\n\n ngOnDestroy() {\n if (this.dynamicComponentRef) {\n this.dynamicComponentRef.destroy();\n }\n }\n}\n","","
    \n Filters:
    \n
    \n Products:\n {{productDescription}}\n
    \n
    \n Business Segment:\n {{businessSegment}}\n
    \n
    \n Servicing Group:\n {{servicingGroup}}\n
    \n
    ","import { Component, OnInit } from '@angular/core';\nimport {BrParamsService} from '../br-params.service';\n\n@Component({\n selector: 'app-filter-presentation-footer',\n templateUrl: './filter-presentation-footer.component.html',\n styleUrls: ['./filter-presentation-footer.component.scss']\n})\nexport class FilterPresentationFooterComponent implements OnInit {\n locationDescription;\n productDescription;\n businessSegment;\n servicingGroup;\n\n constructor(\n private brParamsService: BrParamsService\n ) { }\n\n ngOnInit(): void {\n this.locationDescription = this.brParamsService.get('location_description');\n this.productDescription = this.brParamsService.get('product_description');\n this.businessSegment = this.brParamsService.get('cust_bs_description');\n this.servicingGroup = this.brParamsService.get('sg_description');\n this.brParamsService.getParamChangedListener().subscribe((brParamKey) => {\n if (brParamKey === 'location_description') {\n this.locationDescription = this.brParamsService.get('location_description');\n }\n if (brParamKey === 'product_description') {\n this.productDescription = this.brParamsService.get('product_description');\n }\n if (brParamKey === 'cust_bs_description') {\n this.businessSegment = this.brParamsService.get('cust_bs_description');\n }\n if (brParamKey === 'sg_description') {\n this.servicingGroup = this.brParamsService.get('sg_description');\n }\n });\n }\n}\n","
    \r\n
    \r\n
    \r\n

    Configure Presentation

    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n

    Select a Saved Presentation

    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n  \r\n \r\n \r\n
    \r\n {{errorMsg}}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n Add API Route to Test\r\n
    \r\n \r\n \r\n

    \r\n

    EX: /qbr/kpi/total_inbound_calls/thumbnail

    \r\n \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n  \r\n  \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n","import { Component, OnInit, OnDestroy, OnChanges } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {DASHBOARD_ARRANGEMENT} from '../configuration/dashboard-arrangement';\nimport {BrTileReference} from '../configuration/br-tile-reference';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {RequestState} from '../../api/request-handler';\nimport {PresentationToggleHandlerService} from '../presentation-toggle-handler.service';\nimport {ApiService} from '../../api/api.service';\nimport {BrTemplateSelectionService} from '../br-template-selection.service';\nimport {BrParamsService} from '../br-params.service';\nimport {DetailQueryParamsService} from '../detail-query-params.service';\nimport {ApiMapping} from '../../configuration/api-mapping';\nimport {NodatacheckService} from '../nodatacheck.service';\n\n/**\n * work towards some template like demo\n *\n * work on filters\n * - api connectivity\n * - ui components\n * - apply to kpis\n */\n@Component({\n selector: 'app-br-dashboard',\n templateUrl: './br-dashboard.component.html',\n styleUrls: ['./br-dashboard.component.scss']\n})\n\nexport class BrDashboardComponent implements OnInit, OnDestroy, OnChanges {\n RequestState = RequestState;\n protected requestHandler;\n protected refreshHandleKey;\n\n defaultOrder = null;\n stdKpiOrder = [];\n arrangement: BrTileReference[] = DASHBOARD_ARRANGEMENT;\n public savedPresentations = [];\n presenetationState = 0;\n slideTileReference = 0;\n\n state;\n newPresentationStep = 0;\n\n devApiTools = false;\n apiName = '';\n validationErrors = [];\n\n testComponentOptions = [\n 'BrTextIndicatorComponent',\n 'BrPieChartComponent',\n 'BrTopItemsComponent',\n 'BrLineChartComponent',\n 'BrStackedBarLineChartComponent',\n 'BrExamplePieChartComponent',\n 'ApiTestComponent',\n ];\n testComponentSelectedOption = 'ApiTestComponent';\n\n currentStep = 0;\n public steps = [\n { label: 'Location', icon: 'globe', optional: true },\n { label: 'Business Segment', icon: 'brightness-contrast', optional: true },\n { label: 'Account/Customer', icon: 'search', isValid: true },\n { label: 'History Range', icon: 'calendar' },\n { label: 'Products', icon: 'cart', optional: true },\n { label: 'Servicing Group', icon: 'ungroup', optional: true },\n { label: 'Template', icon: 'grid' },\n ];\n showValidationMessages = false;\n\n protected stdKpiListSource = '/qbr/template/std/std_kpi_list';\n\n noDataRegistryPrep = [];\n noDataRegistry = [];\n presentationToggleSubscription;\n templateSelectionSubscription;\n nodatacheckSubscription;\n\n constructor(\n private apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private presentationToggleHandlerService: PresentationToggleHandlerService,\n private brTemplateSelectionService: BrTemplateSelectionService,\n private brParamsService: BrParamsService,\n private route: ActivatedRoute,\n private detailQueryParamsService: DetailQueryParamsService,\n private nodatacheckService: NodatacheckService\n ) { }\n\n ngOnInit(): void {\n this.brParamsService.set('uck', this.brParamsService.get('dashboardUck'));\n this.brParamsService.set('presentedName', this.brParamsService.get('dashboardPresentedName'));\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_dashboard'));\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n if (this.route.snapshot.paramMap.get('devapitools') === 'devapitools') {\n this.devApiTools = true;\n }\n // this.startOver();\n this.presentationToggleSubscription = this.presentationToggleHandlerService\n .getToggleChange()\n .subscribe((state) => {\n this.presenetationState = state;\n if (state === 1) {\n this.navbarBuilderService.setIsVisible(false);\n } else {\n this.navbarBuilderService.setIsVisible(true);\n }\n });\n this.requestHandler = this.apiService.get(this.stdKpiListSource);\n this.requestHandler.onStateChange((state) => {\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n const apiData = JSON.parse(response.body);\n // this.stdKpiOrder.push();\n const newOrder = [];\n for (const item of apiData.items) {\n const arranagementItem = this.findArrangementItemByApiSource(item.initial_route);\n if (arranagementItem) {\n if (!arranagementItem.hasOwnProperty('preferences')) {\n arranagementItem.preferences = {};\n }\n arranagementItem.preferences.id = item.id;\n arranagementItem.preferences.metric_group_name = item.metric_group_name;\n arranagementItem.preferences.metric_name = item.metric_name;\n newOrder.push(arranagementItem);\n } else {\n console.warn('need to add config for: ' + item.initial_route + ' to business_review/configuration/dashboard-arrangement');\n }\n }\n this.defaultOrder = newOrder;\n this.arrangement = newOrder;\n }\n });\n this.requestHandler.sendRequest(this.stdKpiListSource);\n this.templateSelectionSubscription = this.brTemplateSelectionService.getTemplateSelectionChange().subscribe((templateDetails) => {\n this.updateKpiOrder(templateDetails);\n });\n this.state = this.brParamsService.get('dashboardState');\n this.nodatacheckSubscription = this.nodatacheckService.getChangedEvent().subscribe((registry) => {\n this.noDataRegistryPrep = registry;\n });\n }\n ngOnChanges() {\n this.noDataRegistry = this.noDataRegistryPrep;\n }\n\n ngOnDestroy(): void {\n this.requestHandler.cancelSubscription();\n this.presentationToggleSubscription.unsubscribe();\n this.templateSelectionSubscription.unsubscribe();\n this.nodatacheckSubscription.unsubscribe();\n }\n\n getQueryParams() {\n return this.detailQueryParamsService.getQueryParams();\n }\n\n findArrangementItemByApiSource(key) {\n for (const item of DASHBOARD_ARRANGEMENT) {\n if (item.apiSource === key) {\n return item;\n }\n }\n return null;\n }\n\n findArrangementItemById(key) {\n for (const item of DASHBOARD_ARRANGEMENT) {\n if (item && item.hasOwnProperty('preferences') && item.preferences.id == key) {\n return item;\n }\n }\n return null;\n }\n\n updateKpiOrder(templateDetails) {\n if (templateDetails.id !== 'br_kpi') {\n const order = templateDetails.string.split(',');\n const newOrder = [];\n for (const item of order) {\n const arranagementItem = this.findArrangementItemById(item);\n if (arranagementItem !== null) {\n newOrder.push(arranagementItem);\n }\n }\n this.arrangement = newOrder;\n } else {\n this.arrangement = this.defaultOrder;\n }\n }\n\n startNew() {\n this.changeState('new');\n this.navbarBuilderService.setIsVisible(false);\n }\n validateSelections() {\n let isValid = true;\n this.validationErrors = [];\n if (this.brParamsService.get('uck') === null || this.brParamsService.get('uck').length < 1) {\n this.validationErrors.push('At least one customer must be selected.');\n this.steps[2].isValid = false;\n this.currentStepChange(2, false);\n isValid = false;\n }\n if (this.brParamsService.get('presentedName') === null || this.brParamsService.get('presentedName') === '') {\n this.validationErrors.push('An Account/Customer Presentation Name is needed.');\n this.steps[2].isValid = false;\n this.currentStepChange(2, false);\n isValid = false;\n }\n return isValid;\n }\n selectPresentation() {\n if (this.validateSelections()) {\n this.changeState('selected');\n this.navbarBuilderService.setIsVisible(true);\n }\n this.brParamsService.set('dashboardUck', this.brParamsService.get('uck'));\n this.brParamsService.set('dashboardPresentedName', this.brParamsService.get('presentedName'));\n }\n changeState(state) {\n this.state = state;\n this.brParamsService.set('dashboardState', state);\n }\n startOver() {\n this.changeState('start');\n setTimeout(() => {\n this.navbarBuilderService.setIsVisible(false);\n });\n }\n currentStepChange(e, withValidate = false) {\n this.newPresentationStep = e;\n if (e == 2) {\n this.showValidationMessages = true;\n } else {\n this.showValidationMessages = false;\n }\n if (withValidate) {// this is to prevent endless loop\n this.validateSelections();\n }\n }\n next() {\n this.slideTileReference += 1;\n if (this.slideTileReference >= this.arrangement.length) {\n this.slideTileReference = 0;\n }\n }\n previous() {\n this.slideTileReference -= 1;\n if (this.slideTileReference < 0) {\n this.slideTileReference = this.arrangement.length - 1;\n }\n }\n addApiCall() {\n ApiMapping[this.apiName] = {\n params_to_include: [\n 'br_months', 'br_sg', 'br_uck', 'br_pl', 'acct_pres_name'\n ] // 'force_call_via_unique_param',\n };\n this.arrangement.push({\n apiSource: this.apiName,\n componentName: this.testComponentSelectedOption,\n preferences: {\n title: this.apiName\n }\n });\n }\n selectTestOption(option) {\n this.testComponentSelectedOption = option;\n }\n nodataCheck(ref) {\n return this.nodatacheckService.hasData(ref);\n }\n}\n","export const ExpandedViewPages = {\r\n '/businessReview/total_inbound_calls': {\r\n apiSource: '/qbr/kpi/total_inbound_calls/thumbnail',\r\n detailLink: '/businessReview/total_inbound_calls/list_view',\r\n componentName: 'BrStackedBarLineChartComponent',\r\n preferences: {\r\n title: 'Total Inbound Calls'\r\n }\r\n }\r\n};\r\n","
    \r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\nDrill Down\r\n
    \r\n \r\n
    \r\n
    ","import { Component, OnInit } from '@angular/core';\nimport {Location} from '@angular/common';\nimport {NavbarBuilderService} from '../../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../../configuration/nav-filter-selection';\nimport {BrParamsService} from '../../br-params.service';\nimport {BrHistoryRange} from '../../br-history-range.service';\nimport {ExpandedViewPages} from '../../configuration/details/expanded-view-pages';\nimport {DetailQueryParamsService} from '../../detail-query-params.service';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-br-expanded-chart-view',\n templateUrl: './br-expanded-chart-view.component.html',\n styleUrls: ['./br-expanded-chart-view.component.scss']\n})\nexport class BrExpandedChartViewComponent implements OnInit {\n tileReference;\n expandedViewPages = ExpandedViewPages;\n returnLink;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private brParamsService: BrParamsService,\n private brHistoryRange: BrHistoryRange,\n private location: Location,\n private detailQueryParamsService: DetailQueryParamsService,\n private route: ActivatedRoute\n ) { }\n\n ngOnInit(): void {\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.expandedViewPages.hasOwnProperty(currentRouterLocation)) {\n this.tileReference = this.expandedViewPages[currentRouterLocation];\n }\n\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_detail'));\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n });\n this.detailQueryParamsService.buildPersistedValuesFromQueryParams();\n\n this.detailQueryParamsService.getReturnLink().subscribe((pathDetails) => {\n this.returnLink = pathDetails;\n });\n this.detailQueryParamsService.processReturnLink();\n this.route.queryParams.subscribe(params => {\n this.detailQueryParamsService.prepReturnParams(params);\n });\n this.route.url.subscribe((url) => {\n this.detailQueryParamsService.prepReturnLink(url);\n });\n }\n\n getQueryParams() {\n return this.detailQueryParamsService.getQueryParams();\n }\n\n}\n","export const ListViewPages = {\r\n '/businessReview/pm_tickets/list_view': {\r\n apiTitle: 'PREVENTIVE MAINTENANCE (PM) COMPLETED TICKETS LIST',\r\n apiSource: '/qbr/kpi/pm_tickets/details',\r\n table: {\r\n columns: [\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'LN', description: 'LIST NUMBER', width: 100, hidden: true },\r\n { ref: 'INST_STATUS', description: 'INST STATUS', width: 100, hidden: true },\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'ERP_CUSTOMER', description: 'ERP CUST NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'SEASREPORTID', description: 'SEAS CATETORY', width: 100, hidden: true },\r\n { ref: 'SEASCODE', description: 'SEAS CODE', width: 100, hidden: true },\r\n { ref: 'SERVICE_CLOSED_DT', description: 'SERVICE CLOSED DATE', width: 100, hidden: true },\r\n { ref: 'STATE_PROV', description: 'STATE/PROV', width: 100, hidden: true },\r\n { ref: 'TICKET_3MA', description: 'TICKET (3MA)', width: 100, hidden: true },\r\n { ref: 'TICKET_6MA', description: 'TICKET (6MA)', width: 100, hidden: true },\r\n { ref: 'TICKET_12MA', description: 'TICKET (12MA)', width: 100, hidden: true },\r\n { ref: 'TICKET_PERIOD', description: 'TICKET CLOSED PERIOD', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n \r\n '/businessReview/nps/list_view': {\r\n apiTitle: 'NET PROMOTER SCORE (NPS) SURVEYS LIST',\r\n apiSource: '/qbr/kpi/nps/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'FSR_NAME', description: 'FSR NAME', width: 100, hidden: true },\r\n { ref: 'INTEVIEW', description: 'INTERVIEW DATE', width: 100, hidden: true },\r\n { ref: 'OVERALL', description: 'OVERALL', width: 100, hidden: true },\r\n { ref: 'FIELD', description: 'FIELD SERVICE', width: 100, hidden: true },\r\n { ref: 'TECHNICAL', description: 'TECHNICAL SUPPORT', width: 100, hidden: true },\r\n { ref: 'SALES', description: 'SALES', width: 100, hidden: true },\r\n { ref: 'DELIVERY', description: 'PRODUCT DELIVERY', width: 100, hidden: true },\r\n { ref: 'QUALITY', description: 'PRODUCT QUALITY', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n \r\n '/businessReview/uptime/list_view': {\r\n apiTitle: 'UPTIME TICKETS LIST',\r\n apiSource: '/qbr/kpi/uptime/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'ERP_CUSTOMER', description: 'ERP CUST NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n //{ ref: 'SEASREPORTID', description: 'SEAS CATETORY', width: 100, hidden: true },\r\n //{ ref: 'SEASCODE', description: 'SEAS CODE', width: 100, hidden: true },\r\n { ref: 'FSR_NAME', description: 'FSR NAME', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'UPTIME_24', description: 'UPTIME - 24 HOURS', width: 100, hidden: true },\r\n { ref: 'UPTIME_BUS', description: 'UPTIME - BUSINESS HOURS', width: 100, hidden: true },\r\n { ref: 'UPTIME_EXT', description: 'UPTIME - EXTENDED BUSINESS HOURS', width: 100, hidden: true },\r\n { ref: 'UPTIME_CONTRACT', description: 'UPTIME - CONTRACT HOURS', width: 100, hidden: true },\r\n { ref: 'SCHED', description: 'CONTRACT SCHEDULE', width: 100, hidden: true },\r\n //{ ref: 'BS', description: 'BUSINESS SEGMENT', width: 100, hidden: true },\r\n //{ ref: 'SG', description: 'SERVICING GROUP', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/tsb/list_view': {\r\n apiTitle: 'TECHNICAL SERVICE BULLETINS (TSB) COMPLETED LIST',\r\n apiSource: '/qbr/kpi/tsb/details',\r\n table: {\r\n columns: [\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'STATE_PROV', description: 'STATE/PROVINCE', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'INST_STATUS', description: 'INST STATUS', width: 100, hidden: true },\r\n { ref: 'SEASREPORTID', description: 'SEAS CATETORY', width: 100, hidden: true },\r\n { ref: 'SEASCODE', description: 'SEAS CODE', width: 100, hidden: true },\r\n { ref: 'TSB', description: 'TSB', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'ERP_CUSTOMER', description: 'ERP CUST NUMBER', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/response_time/list_view': {\r\n apiTitle : 'RESPONSE TIME TICKETS LIST',\r\n apiSource: '/qbr/kpi/response_time/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'STATE_PROV', description: 'STATE/PROVINCE', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'TICKET_PRIORITY', description: 'TICKET PRIORITY', width: 100, hidden: true },\r\n { ref: 'STATUS', description: 'TICKET STATUS', width: 100, hidden: true },\r\n { ref: 'CONTRACTS', description: 'CONTRACTS', width: 100, hidden: true },\r\n { ref: 'SITE_VISIT_FLAG', description: 'SITE VISIT', width: 100, hidden: true },\r\n { ref: 'DISPATCHED_FLG', description: 'DISPATCHED', width: 100, hidden: true },\r\n { ref: 'DT_OPENED', description: 'DATE OPENED', width: 100, hidden: true },\r\n { ref: 'DISPATCHED_DT', description: 'DATE DISPATCHED', width: 100, hidden: true },\r\n { ref: 'END_TRAVEL_TIME', description: 'END TRAVEL TIME', width: 100, hidden: true },\r\n { ref: 'ACTIVITY_START_DT', description: 'ACTIVITY START DATE', width: 100, hidden: true },\r\n { ref: 'SERVICE_CLOSED_DT', description: 'SERVICE CLOSED DATE', width: 100, hidden: true },\r\n { ref: 'DUE_DT', description: 'TICKET DUE DATE', width: 100, hidden: true },\r\n { ref: 'RESPONSE_TIME_ORDER', description: 'RESPONSE TIME ORDER', width: 100, hidden: true },\r\n { ref: 'RESPONSE_TIME_HOURS', description: 'RESPONSE TIME HOURS', width: 100, hidden: true },\r\n { ref: 'METRIC_USED', description: 'METRIC USED', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/phn/list_view': {\r\n apiTitle: 'PHN TICKETS LIST',\r\n apiSource: '/qbr/kpi/phn/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'TICKET_PRIORITY', description: 'TICKET PRIORITY', width: 100, hidden: true },\r\n { ref: 'TICKET_TYPE', description: 'TICKET TYPE', width: 100, hidden: true },\r\n { ref: 'TICKET_SERVICE_TYPE', description: 'TICKET SERVICE TYPE', width: 100, hidden: true },\r\n { ref: 'STATUS', description: 'TICKET STATUS', width: 100, hidden: true },\r\n { ref: 'EXPERIENCE_CODE', description: 'EXPERIENCE CODE', width: 100, hidden: true },\r\n { ref: 'EXPERIENCE_CODE_DESC', description: 'EXPERIENCE CODE DESCRIPTION', width: 100, hidden: true },\r\n { ref: 'EXPERIENCE_BUCKET_DESC', description: 'EXPERIENCE BUCKET DESCRIPTION', width: 100, hidden: true },\r\n { ref: 'SUMMARY_DESC', description: 'SUMMARY DESCRIPTION', width: 100, hidden: true },\r\n { ref: 'RECEIVED_DT', description: 'TICKET RECEIVED DATE', width: 100, hidden: true },\r\n { ref: 'SERVICE_CLOSED_DT', description: 'TICKET SERVICE CLOSED DATE', width: 100, hidden: true },\r\n { ref: 'TICKET_DURATION', description: 'TICKET DURATION', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/instrument_test_counts/list_view': {\r\n apiTitle: 'Annualized Average Instrument Test Counts',\r\n apiSource: '/qbr/kpi/instrument_test_counts/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 160, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'ASSAY', description: 'ASSAY NAME/NUMBER', width: 100, hidden: true },\r\n { ref: 'TEST_COUNTS', description: 'TEST COUNTS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/assay_test_counts/list_view': {\r\n apiTitle: 'Top Assays',\r\n apiSource: '/qbr/kpi/assay_test_counts/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 160, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'ASSAY', description: 'ASSAY NAME/NUMBER', width: 100, hidden: true },\r\n { ref: 'TEST_COUNTS', description: 'TEST COUNTS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/mttr/list_view': {\r\n apiTitle: 'MEAN TIME TO REPAIR (MTTR) TICKETS LIST',\r\n apiSource: '/qbr/kpi/mttr/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'TICKET_TYPE', description: 'TICKET TYPE', width: 100, hidden: true },\r\n { ref: 'TICKET_CATEGORY', description: 'TICKET CATEGORY', width: 100, hidden: true },\r\n { ref: 'LABOR_HOURS', description: 'LABOR HOURS', width: 100, hidden: true },\r\n { ref: 'DT_OPENED', description: 'DATE OPENED', width: 100, hidden: true },\r\n { ref: 'DT_CLOSED', description: 'DATE CLOSED', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/ticket_history/list_view': {\r\n apiTitle: 'TICKET HISTORY',\r\n apiSource: '/qbr/kpi/ticket_history/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'TICKET_TYPE', description: 'TICKET TYPE', width: 100, hidden: true },\r\n { ref: 'TICKET_SERVICE_TYPE', description: 'TICKET SERVICE TYPE', width: 100, hidden: true },\r\n { ref: 'COMPLAINT', description: 'COMPLAINT', width: 100, hidden: true },\r\n { ref: 'REMOTE', description: 'REMOTE', width: 100, hidden: true },\r\n { ref: 'FSV', description: 'FIELD SERVICE VISIT', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/ticket_errors/list_view': {\r\n apiTitle: 'Top Issues',\r\n apiSource: '/qbr/kpi/ticket_errors/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'TICKETT_TYPE', description: 'TICKET TYPE', width: 100, hidden: true },\r\n { ref: 'STATUS', description: 'TICKET STATUS', width: 100, hidden: true },\r\n { ref: 'ERROR_CODE', description: 'ERROR CODE', width: 100, hidden: true },\r\n { ref: 'ISSUE_CODE', description: 'ISSUE CODE', width: 100, hidden: true },\r\n { ref: 'ISSUE_CD_DESC', description: 'ISSUE CODE DESCRIPTION', width: 100, hidden: true },\r\n { ref: 'DATE_OPENED', description: 'DATE OPENED ISO', width: 100, hidden: true },\r\n { ref: 'SERVICE_CLOSED', description: 'SERVICE CLOSED DATE', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/ticket_errors/timeline_view': {\r\n apiTitle: 'Top Issues',\r\n apiSource: '/qbr/kpi/ticket_errors/timeline',\r\n apiFolder: 'ticket_errors',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/ticket_errors/system_comparison_view': {\r\n apiTitle: 'Top Issues',\r\n apiSource: '/qbr/kpi/ticket_errors/system_comparison',\r\n apiFolder: 'ticket_errors',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/example_data/list_view': {\r\n apiTitle: 'EXAMPLE DATA',\r\n apiSource: '/qbr/kpi/example_data/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'TICKET', description: 'TICKET', width: 100, hidden: true },\r\n { ref: 'FSR_NAME', description: 'FSR NAME', width: 100, hidden: true },\r\n { ref: 'INTEVIEW', description: 'INTERVIEW DATE', width: 100, hidden: true },\r\n { ref: 'OVERALL', description: 'OVERALL', width: 100, hidden: true },\r\n { ref: 'FIELD', description: 'FIELD SERVICE', width: 100, hidden: true },\r\n { ref: 'TECHNICAL', description: 'TECHNICAL SUPPORT', width: 100, hidden: true },\r\n { ref: 'SALES', description: 'SALES', width: 100, hidden: true },\r\n { ref: 'DELIVERY', description: 'PRODUCT DELIVERY', width: 100, hidden: true },\r\n { ref: 'QUALITY', description: 'PRODUCT QUALITY', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/example_data/timeline_view': {\r\n apiTitle: 'EXAMPLE DATA',\r\n apiSource: '/qbr/kpi/example_data/timeline',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-04', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-03', width: 100, hidden: true },\r\n { ref: 'M5', description: '2022-02', width: 100, hidden: true },\r\n { ref: 'M6', description: '2022-01', width: 100, hidden: true },\r\n { ref: 'M7', description: '2021-12', width: 100, hidden: true },\r\n { ref: 'M8', description: '2021-11', width: 100, hidden: true },\r\n { ref: 'M9', description: '2021-10', width: 100, hidden: true },\r\n { ref: 'M10', description: '2021-09', width: 100, hidden: true },\r\n { ref: 'M11', description: '2021-08', width: 100, hidden: true },\r\n { ref: 'M12', description: '2021-07', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/nps/timeline_view': {\r\n apiTitle: 'NPS',\r\n apiSource: '/qbr/kpi/nps/timeline',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-04', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-03', width: 100, hidden: true },\r\n { ref: 'M5', description: '2022-02', width: 100, hidden: true },\r\n { ref: 'M6', description: '2022-01', width: 100, hidden: true },\r\n { ref: 'M7', description: '2021-12', width: 100, hidden: true },\r\n { ref: 'M8', description: '2021-11', width: 100, hidden: true },\r\n { ref: 'M9', description: '2021-10', width: 100, hidden: true },\r\n { ref: 'M10', description: '2021-09', width: 100, hidden: true },\r\n { ref: 'M11', description: '2021-08', width: 100, hidden: true },\r\n { ref: 'M12', description: '2021-07', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/instrument_test_counts/timeline_view': {\r\n apiTitle: 'Annualized Instrument Test Counts',\r\n apiSource: '/qbr/kpi/instrument_test_counts/timeline',\r\n apiFolder: 'instrument_test_counts',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/assay_test_counts/timeline_view': {\r\n apiTitle: 'Top Assays',\r\n apiSource: '/qbr/kpi/assay_test_counts/timeline',\r\n apiFolder: 'assay_test_counts',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/response_time/timeline_view': {\r\n apiTitle: 'Response Time (Hours)',\r\n apiSource: '/qbr/kpi/response_time/timeline',\r\n apiFolder: 'response_time',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/alcm/list_view': {\r\n apiTitle: 'AbbottLink Customer Maintenance',\r\n apiSource: '/qbr/kpi/alcm/details',\r\n table: {\r\n columns: [\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'ABBOTTLINK_INSTALL_DATE', description: 'ABBOTTLINK INSTALL DATE', width: 100, hidden: true },\r\n { ref: 'LAST_CONTACT_DATE', description: 'LAST CONTACT DAYS', width: 100, hidden: true },\r\n { ref: 'DAILY_SCORE', description: 'DAILY SCORE', width: 100, hidden: true },\r\n { ref: 'WEEKLY_SCORE', description: 'WEEKLY SCORE', width: 100, hidden: true },\r\n { ref: 'MONTHLY_SCORE', description: 'MONTHLY SCORE', width: 100, hidden: true },\r\n { ref: 'QUARTERLY_SCORE', description: 'QUARTERLY SCORE', width: 100, hidden: true },\r\n { ref: 'OVERALL_SCORE', description: 'OVERALL SCORE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/calls_without_service_number/list_view': {\r\n apiTitle: 'Calls w/Out Service Number',\r\n apiSource: '/qbr/kpi/calls_without_service_number/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'AGENT_NAME', description: 'AGENT NAME', width: 100, hidden: true },\r\n { ref: 'AGENT_EMAIL', description: 'AGENT EMAIL', width: 100, hidden: true },\r\n { ref: 'CALL_ID', description: 'CALL ID', width: 100, hidden: true },\r\n { ref: 'CALL_TYPE', description: 'CALL TYPE', width: 100, hidden: true },\r\n { ref: 'CALL_TIME_SEC', description: 'CALL TIME (SEC)', width: 100, hidden: true },\r\n { ref: 'DISPOSITION', description: 'DISPOSITION', width: 100, hidden: true },\r\n { ref: 'CALL_DATE', description: 'CALL DATE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/abandoned_calls/list_view': {\r\n apiTitle: 'Abandoned Calls',\r\n apiSource: '/qbr/kpi/abandoned_calls/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'CALL PERIOD', width: 100, hidden: true },\r\n { ref: 'AGENT_NAME', description: 'AGENT NAME', width: 100, hidden: true },\r\n { ref: 'AGENT_EMAIL', description: 'AGENT EMAIL', width: 100, hidden: true },\r\n { ref: 'CALL_ID', description: 'CALL ID', width: 100, hidden: true },\r\n { ref: 'CALL_TYPE', description: 'CALL TYPE', width: 100, hidden: true },\r\n { ref: 'CALL_TIME_SEC', description: 'CALL TIME (SEC)', width: 100, hidden: true },\r\n { ref: 'DISPOSITION', description: 'DISPOSITION', width: 100, hidden: true },\r\n { ref: 'CALL_DATE', description: 'CALL DATE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/average_wait_time/system_comparison_view': {\r\n apiTitle: 'Average & Longest Wait Times',\r\n apiSource: '/qbr/kpi/average_wait_time/system_comparison',\r\n apiFolder: 'average_wait_time',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'CALLS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/average_wait_time/timeline_view': {\r\n\r\n apiTitle: 'Average & Longest Wait Times',\r\n apiSource: '/qbr/kpi/average_wait_time/timeline',\r\n apiFolder: 'average_wait_time',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/average_wait_time/list_view': {\r\n apiTitle: 'Average & Longest Wait Times',\r\n apiSource: '/qbr/kpi/average_wait_time/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'CALL PERIOD', width: 100, hidden: true },\r\n { ref: 'AGENT_NAME', description: 'AGENT NAME', width: 100, hidden: true },\r\n { ref: 'AGENT_EMAIL', description: 'AGENT EMAIL', width: 100, hidden: true },\r\n { ref: 'CALL_ID', description: 'CALL ID', width: 100, hidden: true },\r\n { ref: 'CALL_TYPE', description: 'CALL TYPE', width: 100, hidden: true },\r\n { ref: 'CALL_TIME_SEC', description: 'CALL TIME (SEC)', width: 100, hidden: true },\r\n { ref: 'WAIT_TIME', description: 'WAIT TIME', width: 100, hidden: true },\r\n { ref: 'CALL_DATE', description: 'CALL DATE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/service_level/list_view': {\r\n apiTitle: 'Telephone Service Level',\r\n apiSource: '/qbr/kpi/service_level/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'CALL PERIOD', width: 100, hidden: true },\r\n { ref: 'AGENT_NAME', description: 'AGENT NAME', width: 100, hidden: true },\r\n { ref: 'AGENT_EMAIL', description: 'AGENT EMAIL', width: 100, hidden: true },\r\n { ref: 'CALL_ID', description: 'CALL ID', width: 100, hidden: true },\r\n { ref: 'CALL_TYPE', description: 'CALL TYPE', width: 100, hidden: true },\r\n { ref: 'CALL_TIME_SEC', description: 'CALL TIME (SEC)', width: 100, hidden: true },\r\n { ref: 'DISPOSITION', description: 'DISPOSITION', width: 100, hidden: true },\r\n { ref: 'CALL_DATE', description: 'CALL DATE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/tcr/list_view': {\r\n apiTitle: 'Test Completion Rate',\r\n apiSource: '/qbr/kpi/tcr/details',\r\n table: {\r\n columns: [\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'CUSTOMER_NUM', description: 'CUSTOMER NUMBER', width: 100, hidden: true },\r\n { ref: 'COUNTRY', description: 'COUNTRY', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'ABBOTTLINK_INSTALL_DATE', description: 'ABBOTTLINK INSTALL DATE', width: 100, hidden: true },\r\n { ref: 'LAST_CONTACT_DAYS', description: 'LAST CONTACT DAYS', width: 100, hidden: true },\r\n { ref: 'DAILY_SCORE', description: 'DAILY SCORE', width: 100, hidden: true },\r\n { ref: 'WEEKLY_SCORE', description: 'WEEKLY SCORE', width: 100, hidden: true },\r\n { ref: 'MONTHLY_SCORE', description: 'MONTHLY SCORE', width: 100, hidden: true },\r\n { ref: 'QUARTERLY_SCORE', description: 'QUARTERLY SCORE', width: 100, hidden: true },\r\n { ref: 'OVERALL_SCORE', description: 'OVERALL SCORE', width: 100, hidden: true }\r\n ]\r\n }\r\n },\r\n '/businessReview/example_data/system_comparison_view': {\r\n apiTitle: 'EXAMPLE DATA',\r\n apiSource: '/qbr/kpi/example_data/system_comparison',\r\n apiFolder: 'example_data',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'DATA POINT', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/service_level/system_comparison_view': {\r\n apiTitle: 'Telephone Service Level',\r\n apiSource: '/qbr/kpi/service_level/system_comparison',\r\n apiFolder: 'service_level',\r\n apiDrillDown: 'timeline_view',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'live_connect_percent', description: 'DATA POINT', width: 100, hidden: true },\r\n { ref: 'percent_calls', description: 'DATA POINT', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/service_level/timeline_view': {\r\n apiTitle: 'Telephone Service Level',\r\n apiSource: '/qbr/kpi/service_level/timeline',\r\n apiFolder: 'service_level',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/alcm/system_comparison_view': {\r\n apiTitle: 'ABBOTTLINK CUSTOMER MAINTENANCE',\r\n apiSource: '/qbr/kpi/alcm/system_comparison',\r\n apiFolder: 'alcm',\r\n apiDrillDown: 'list_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'ALCM SCORE(S)', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/instrument_test_counts/system_comparison_view': {\r\n apiTitle: 'Annualualized Instrument Test Counts',\r\n apiSource: '/qbr/kpi/instrument_test_counts/system_comparison',\r\n apiFolder: 'instrument_test_counts',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'AVG INSTRUMENT TEST COUNTS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/assay_test_counts/system_comparison_view': {\r\n apiTitle: 'Top Assays',\r\n apiSource: '/qbr/kpi/assay_test_counts/system_comparison',\r\n apiFolder: 'assay_test_counts',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'AVG INSTRUMENT TEST COUNTS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n\r\n '/businessReview/response_time/system_comparison_view': {\r\n apiTitle: 'Response Time (Hours)',\r\n apiSource: '/qbr/kpi/response_time/system_comparison',\r\n apiFolder: 'response_time',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'RESPONSE TIME (HRS)', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/calls_without_service_number/system_comparison_view': {\r\n apiTitle: 'Calls w/Out Service Number',\r\n apiSource: '/qbr/kpi/calls_without_service_number/system_comparison',\r\n apiFolder: 'calls_without_service_number',\r\n apiDrillDown: 'timeline_view',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'CALLS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/calls_without_service_number/timeline_view': {\r\n apiTitle: 'Calls w/Out Service Number',\r\n apiSource: '/qbr/kpi/calls_without_service_number/timeline',\r\n apiFolder: 'calls_without_service_number',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/abandoned_calls/system_comparison_view': {\r\n apiTitle: 'Abandoned Calls',\r\n apiSource: '/qbr/kpi/abandoned_calls/system_comparison',\r\n apiFolder: 'abandoned_calls',\r\n apiDrillDown: 'timeline_view',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'CALLS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/abandoned_calls/timeline_view': {\r\n apiTitle: 'Abandoned Calls',\r\n apiSource: '/qbr/kpi/abandoned_calls/timeline',\r\n apiFolder: 'abandoned_calls',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/pm_tickets/system_comparison_view': {\r\n apiTitle: 'Total PM Tickets',\r\n apiSource: '/qbr/kpi/pm_tickets/system_comparison',\r\n apiFolder: 'pm_tickets',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'PM TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/tcr/system_comparison_view': {\r\n apiTitle: 'Test Completion Rate',\r\n apiSource: '/qbr/kpi/tcr/system_comparison',\r\n apiFolder: 'tcr',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TEST COMPLETION RATE', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/tcr/timeline_view': {\r\n apiTitle: 'Test Completion Rate',\r\n apiSource: '/qbr/kpi/tcr/timeline',\r\n apiFolder: 'tcr',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/pm_tickets/timeline_view': {\r\n apiTitle: 'PM Tickets',\r\n apiSource: '/qbr/kpi/pm_tickets/timeline',\r\n apiFolder: 'pm_tickets',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/total_inbound_calls/system_comparison_view': {\r\n apiTitle: 'Total Inbound Calls',\r\n apiSource: '/qbr/kpi/total_inbound_calls/system_comparison',\r\n apiFolder: 'total_inbound_calls',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'CALLS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/total_inbound_calls/timeline_view': {\r\n apiTitle: 'Total Inbound Calls',\r\n apiSource: '/qbr/kpi/total_inbound_calls/timeline',\r\n apiFolder: 'total_inbound_calls',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/total_inbound_calls/list_view': {\r\n apiTitle: 'Total Inbound Calls',\r\n apiSource: '/qbr/kpi/total_inbound_calls/details',\r\n table: {\r\n columns: [\r\n { ref: 'COUNTRY', description: 'LOCATION', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL1', description: 'LOCAL LEVEL 1', width: 100, hidden: true },\r\n { ref: 'LOCALLEVEL2', description: 'LOCAL LEVEL 2', width: 100, hidden: true },\r\n { ref: 'CITY', description: 'CITY', width: 100, hidden: true },\r\n { ref: 'SN', description: 'SERIAL NUMBER', width: 100, hidden: true },\r\n { ref: 'PL', description: 'PRODUCT LINE', width: 100, hidden: true },\r\n { ref: 'PERIOD', description: 'REPORT PERIOD', width: 100, hidden: true },\r\n { ref: 'CUSTOMER', description: 'CUSTOMER', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/mttr/system_comparison_view': {\r\n apiTitle: 'MTTR (Hours)',\r\n apiSource: '/qbr/kpi/mttr/system_comparison',\r\n apiFolder: 'mttr',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'MTTR (HRS)', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/mttr/timeline_view': {\r\n apiTitle: 'MTTR (Hours)',\r\n apiSource: '/qbr/kpi/mttr/timeline',\r\n apiFolder: 'mttr',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/ticket_history/system_comparison_view': {\r\n apiTitle: 'Ticket History',\r\n apiSource: '/qbr/kpi/ticket_history/system_comparison',\r\n apiFolder: 'ticket_history',\r\n apiDrillDown: 'timeline_view',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'remote', description: 'REMOTE', width: 100, hidden: true },\r\n { ref: 'fsv', description: 'FIELD SERVICE VISIT', width: 100, hidden: true },\r\n { ref: 'complaints', description: 'COMPLAINTS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/ticket_history/timeline_view': {\r\n apiTitle: 'Ticket History',\r\n apiSource: '/qbr/kpi/ticket_history/timeline',\r\n apiFolder: 'ticket_history',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/phn/system_comparison_view': {\r\n apiTitle: 'PHN Tickets',\r\n apiSource: '/qbr/kpi/phn/system_comparison',\r\n apiFolder: 'phn',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/phn/timeline_view': {\r\n apiTitle: 'PHN Tickets',\r\n apiSource: '/qbr/kpi/phn/timeline',\r\n apiFolder: 'phn',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/ticket_erros/system_comparison_view': {\r\n apiTitle: 'PHN Tickets',\r\n apiSource: '/qbr/kpi/ticket_erros/system_comparison',\r\n apiFolder: 'ticket_erros',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/tsb/system_comparison_view': {\r\n apiTitle: 'TSBs',\r\n apiSource: '/qbr/kpi/tsb/system_comparison',\r\n apiFolder: 'tsb',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/tsb/timeline_view': {\r\n apiTitle: 'TSBs',\r\n apiSource: '/qbr/kpi/tsb/timeline',\r\n apiFolder: 'tsb',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/uptime/system_comparison_view': {\r\n apiTitle: 'Uptime',\r\n apiSource: '/qbr/kpi/uptime/system_comparison',\r\n apiFolder: 'uptime',\r\n apiDrillDown: 'timeline_view',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'TICKETS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/uptime/timeline_view': {\r\n apiTitle: 'Uptime',\r\n apiSource: '/qbr/kpi/uptime/timeline',\r\n apiFolder: 'uptime',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/hard_stops/system_comparison_view': {\r\n apiTitle: 'Hard Stops',\r\n apiSource: '/qbr/kpi/hard_stops/system_comparison',\r\n apiFolder: 'hard_stops',\r\n apiDrillDown: 'timeline_view',\r\n apiChartType: 'MultiBar',\r\n table: {\r\n columns: [\r\n { ref: 'customer', description: 'CUSTOMER', width: 100, hidden: true },\r\n { ref: 'values', description: 'HARD STOPS', width: 100, hidden: true },\r\n ]\r\n }\r\n },\r\n '/businessReview/hard_stops/timeline_view': {\r\n apiTitle: 'Hard Stops',\r\n apiSource: '/qbr/kpi/hard_stops/timeline',\r\n apiFolder: 'hard_stops',\r\n apiChartType: 'StackBar',\r\n table: {\r\n columns: [\r\n { ref: 'M1', description: '2022-05', width: 100, hidden: true },\r\n { ref: 'M2', description: '2022-06', width: 100, hidden: true },\r\n { ref: 'M3', description: '2022-07', width: 100, hidden: true },\r\n { ref: 'M4', description: '2022-08', width: 100, hidden: true },\r\n ]\r\n }\r\n }\r\n};\r\n","
    \n \n \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    {{apiDisplayTitle}}
    CUSTOMER:   {{CustomerName}}
    \n\n
    \n \n \n \n \n {{column.title}}\n \n \n \n {{dataItem[col.ref].value}}\n \n \n {{dataItem[col.ref].value}}\n \n \n \n \n \n
    \n
    \n
    \n \n
    \n
    \n","import { DomSanitizer, SafeStyle } from '@angular/platform-browser';\nimport { Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport {Location} from '@angular/common';\nimport {BrParamsService} from '../../br-params.service';\nimport {BrHistoryRange} from '../../br-history-range.service';\nimport {NavbarBuilderService} from '../../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../../configuration/nav-filter-selection';\nimport {ListViewPages} from '../../configuration/details/list-view-pages';\nimport {RequestState} from '../../../api/request-handler';\nimport {ApiService} from '../../../api/api.service';\nimport {GridComponent} from '../../../details/grid.component';\nimport {DetailQueryParamsService} from '../../detail-query-params.service';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-br-list-view',\n templateUrl: './br-list-view.component.html',\n styleUrls: ['./br-list-view.component.scss']\n})\n\nexport class BrListViewComponent extends GridComponent implements OnInit, OnDestroy {\n kpiConfig;\n listViewPages = ListViewPages;\n public apiData;\n public state = RequestState.Inactive;\n apiUrl;\n apiDisplayTitle;\n requestHandler;\n stateChangeHandler;\n dataCols = [];\n dataRows = [];\n CustomerName;\n returnLink;\n detailQueryCompleteSubscription;\n returnLinkSubscription;\n queryParamsSubscription;\n routeUrlSubscription;\n routeUrl;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private brParamsService: BrParamsService,\n private brHistoryRange: BrHistoryRange,\n private location: Location,\n private apiService: ApiService,\n private detailQueryParamsService: DetailQueryParamsService,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n // console.log('OnInit Executed', currentRouterLocation);\n this.detailQueryCompleteSubscription = this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.listViewPages.hasOwnProperty(currentRouterLocation)) {\n this.kpiConfig = this.listViewPages[currentRouterLocation];\n }\n this.routeUrl = currentRouterLocation;\n\n this.apiUrl = this.kpiConfig.apiSource;\n\n this.apiDisplayTitle = this.kpiConfig.apiTitle;\n\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_detail'));\n\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n\n // console.log('Test Event: Line 111');\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n\n if (this.apiData.customer) { this.CustomerName = this.apiData.customer; }\n // console.log('List Data', this.apiData.customer);\n\n // FORMAT API DATA FOR TABLE\n // format dataCols for kendo component\n this.dataCols = this.kpiConfig.table.columns;\n if (this.apiData.columns) { this.dataCols = this.apiData.columns; }\n\n this.dataRows = [];\n for (let i = 0; i < this.apiData.values.length; i++) {\n const apiDataRow = this.apiData.values[i];\n const dataRow = {};\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n dataRow[dataColConfig.ref] = {\n value: apiDataRow[dataColConfig.ref]\n };\n }\n this.dataRows.push(dataRow);\n }\n this.updateGrid();\n }\n this.updateGrid();\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n });\n\n this.returnLinkSubscription = this.detailQueryParamsService.getReturnLink().subscribe((pathDetails) => {\n this.returnLink = pathDetails;\n });\n this.queryParamsSubscription = this.route.queryParams.subscribe(params => {\n this.detailQueryParamsService.prepReturnParams(params);\n this.detailQueryParamsService.buildPersistedValuesFromParams(params);\n });\n this.routeUrlSubscription = this.route.url.subscribe((url) => {\n this.detailQueryParamsService.prepReturnLink(url);\n this.detailQueryParamsService.processReturnLink();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangeHandler) {\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n this.detailQueryCompleteSubscription.unsubscribe();\n this.returnLinkSubscription.unsubscribe();\n this.queryParamsSubscription.unsubscribe();\n this.routeUrlSubscription.unsubscribe();\n }\n\n getQueryParams() {\n return this.detailQueryParamsService.getQueryParams();\n }\n}\n","
    \n \n \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    {{apiDisplayTitle}} - Network List
    \n \n
    0\">\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n {{column.title}}\n \n \n \n {{dataItem[col.ref].value}}\n \n \n \n \n \n
    \n
    \n
    \n \n
    \n
    \n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { BrParamsService } from '../../br-params.service';\nimport { BrHistoryRange } from '../../br-history-range.service';\nimport { NavbarBuilderService } from '../../../navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from '../../../configuration/nav-filter-selection';\nimport { ListViewPages } from '../../configuration/details/list-view-pages';\nimport { RequestState } from '../../../api/request-handler';\nimport { ApiService } from '../../../api/api.service';\nimport { RefreshHandlerService } from '../../../api/refresh-handler.service';\nimport { GridComponent } from '../../../details/grid.component';\nimport { DetailQueryParamsService } from '../../detail-query-params.service';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-br-system-comparison-list-view',\n templateUrl: './br-system-comparison-list-view.component.html',\n styleUrls: ['./br-system-comparison-list-view.component.scss']\n})\n\nexport class BrSystemComparisonListViewComponent extends GridComponent implements OnInit, OnDestroy {\n\n kpiConfig;\n listViewPages = ListViewPages;\n public apiData;\n public apiMultiData;\n public state = RequestState.Inactive;\n apiUrl;\n apiDisplayTitle;\n requestHandler;\n stateChangeHandler;\n dataCols = [];\n dataRows = [];\n multiDataRows = [];\n chartData = [];\n multiChartData = [];\n chartRowCount = 0;\n chartLabels = [];\n chartOptions;\n apiFolder;\n apiDrillDown;\n ParentCustomer;\n apiChartType;\n returnLink;\n detailQueryCompleteSubscription;\n returnLinkSubscription;\n queryParamsSubscription;\n routeUrlSubscription;\n multiChartCategories;\n multiChartSeries;\n multiChartSeriesArray;\n chartBottomLimit;\n chartTopLimit;\n chartMajorUnit;\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private brParamsService: BrParamsService,\n private brHistoryRange: BrHistoryRange,\n private location: Location,\n private apiService: ApiService,\n private detailQueryParamsService: DetailQueryParamsService,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n this.detailQueryCompleteSubscription = this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.listViewPages.hasOwnProperty(currentRouterLocation)) {\n this.kpiConfig = this.listViewPages[currentRouterLocation];\n }\n\n this.apiUrl = this.kpiConfig.apiSource;\n this.apiFolder = this.kpiConfig.apiFolder;\n this.apiDrillDown = 'timeline_view';\n if (this.kpiConfig.apiDrillDown) { this.apiDrillDown = this.kpiConfig.apiDrillDown; }\n if (this.kpiConfig.apiChartType) { this.apiChartType = this.kpiConfig.apiChartType; }\n\n // console.log('DRILL DOWN ITEM', this.apiChartType);\n\n this.apiDisplayTitle = this.kpiConfig.apiTitle;\n // console.log('Display Title', this.apiDisplayTitle);\n // console.log('KPI Config Follow-up Link: ', this.kpiConfig.apiFollowUpLink);\n\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_detail'));\n\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n // console.log('API DATA', this.apiData);\n\n // format dataCols for kendo component\n this.dataCols = this.kpiConfig.table.columns;\n if (this.apiData.columns) { this.dataCols = this.apiData.columns; }\n\n this.chartBottomLimit = this.apiData.chartBottomLimit;\n this.chartTopLimit = this.apiData.chartTopLimit;\n\n // format dataRows for kendo component\n this.dataRows = [];\n this.chartData = [];\n this.multiChartData = [];\n this.chartLabels = [];\n\n this.multiChartCategories = [];\n this.multiChartSeries = {};\n if (this.apiChartType === 'MultiBar') {\n const firstRow = this.apiData.values[0];\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n if (dataColConfig.ref !== 'customer') {\n let colColor = '';\n if (dataColConfig.ref + 'bgColor' in firstRow) {\n colColor = firstRow[dataColConfig.ref + 'bgColor'];\n }\n // if (dataColConfig.ref + 'textColor' in firstRow) {\n // colColor = firstRow[dataColConfig.ref + 'textColor'];\n // }\n if (!('included_in_chart' in dataColConfig) && dataColConfig.included_in_chart !== false) {\n this.multiChartSeries[dataColConfig.ref] = {\n color: colColor,\n data: [],\n name: dataColConfig.description\n };\n }\n }\n }\n }\n let highestValue = 0;\n for (let i = 0; i < this.apiData.values.length; i++) {\n const apiDataRow = this.apiData.values[i];\n const dataRow = {};\n this.chartLabels.push(' ');\n this.chartLabels.push(this.apiData.values[i].customer);\n if (i == 0) { this.ParentCustomer = this.apiData.values[i].customer; }\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n let colorCalc = '';\n let textColor = '';\n if (dataColConfig.ref + 'bgColor' in apiDataRow) {\n colorCalc = apiDataRow[dataColConfig.ref + 'bgColor'];\n }\n if (dataColConfig.ref + 'textColor' in apiDataRow) {\n textColor = apiDataRow[dataColConfig.ref + 'textColor'];\n }\n dataRow[dataColConfig.ref] = {\n value: apiDataRow[dataColConfig.ref],\n bgcolor: colorCalc,\n textColor: textColor\n };\n if (!('included_in_chart' in dataColConfig) && dataColConfig.included_in_chart !== false) {\n if (this.apiChartType === 'MultiBar') {\n if (dataColConfig.ref !== 'customer') {\n this.multiChartSeries[dataColConfig.ref].data.push(apiDataRow[dataColConfig.ref]);\n if (!isNaN(apiDataRow[dataColConfig.ref]) && highestValue < apiDataRow[dataColConfig.ref]) {\n highestValue = apiDataRow[dataColConfig.ref];\n }\n } else {\n this.multiChartCategories.push(apiDataRow[dataColConfig.ref]);\n }\n } else {\n this.chartData.push(dataRow[dataColConfig.ref].value);\n }\n }\n this.chartRowCount++;\n }\n\n if ('uck' in apiDataRow) {\n dataRow['uck'] = {value: apiDataRow.uck};\n }\n if ('acct_pres_name' in apiDataRow) {\n dataRow['acct_pres_name'] = {value: apiDataRow.acct_pres_name};\n }\n this.dataRows.push(dataRow);\n }\n this.chartMajorUnit = highestValue / 5;\n if (this.chartMajorUnit < 1) {\n this.chartMajorUnit = 1;\n } else {\n this.chartMajorUnit = Math.floor(this.chartMajorUnit);\n }\n\n if (this.apiChartType === 'MultiBar') {\n this.chartLabels = this.multiChartCategories;\n this.multiChartSeriesArray = [];\n for (const item in this.multiChartSeries) {\n this.multiChartSeriesArray.push(this.multiChartSeries[item]);\n }\n }\n this.updateGrid();\n // console.log('CHART DATA', this.chartData);\n // console.log('CHART DATA LENGTH', this.apiData.values.length);\n\n /*\n this.apiMultiData = JSON.parse(response.body);\n\n // format dataRows for kendo component\n this.multiDataRows = []\n this.multiChartData = [];\n\n for (let i = 0; i < this.apiData.values.length; i++) {\n const apiMultiDataRow = this.apiData.values[i];\n const multiDataRow = {};\n this.chartLabels.push(' ');\n this.chartLabels.push(this.apiData.values[i].customer);\n\n for (let j = 0; j < this.apiData.values[i].length; j++) {\n const apiMultiDataRowArray = this.apiData.value[i][j];\n this.multiChartData[j] = []\n\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n multiDataRow[dataColConfig.ref] = {\n value: apiMultiDataRowArray[dataColConfig.ref]\n };\n this.multiChartData[j].push( multiDataRow[ dataColConfig.ref ].value );\n this.chartRowCount++;\n }\n }\n\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n multiDataRow[ dataColConfig.ref ] = {\n value: apiMultiDataRow[ dataColConfig.ref ]\n };\n this.chartData.push( multiDataRow[dataColConfig.ref].value );\n this.chartRowCount++;\n }\n\n\n if ('uck' in apiMultiDataRow) {\n multiDataRow['uck'] = { value: apiMultiDataRow.uck };\n }\n if ('customer_num' in apiMultiDataRow) {\n multiDataRow['customer_num'] = { value: apiMultiDataRow.customer_num };\n }\n if ('acct_pres_name' in apiMultiDataRow) {\n multiDataRow['acct_pres_name'] = { value: apiMultiDataRow.acct_pres_name };\n }\n this.multiDataRows.push(multiDataRow);\n } //*/\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.updateGrid();\n });\n\n this.returnLinkSubscription = this.detailQueryParamsService.getReturnLink().subscribe((pathDetails) => {\n this.returnLink = pathDetails;\n });\n this.queryParamsSubscription = this.route.queryParams.subscribe(params => {\n this.detailQueryParamsService.prepReturnParams(params);\n this.detailQueryParamsService.buildPersistedValuesFromParams(params);\n });\n this.routeUrlSubscription = this.route.url.subscribe((url) => {\n this.detailQueryParamsService.prepReturnLink(url);\n this.detailQueryParamsService.processReturnLink();\n });\n }\n\n routerBack() {\n this.location.back();\n }\n\n ngOnDestroy(): void {\n if (this.stateChangeHandler) {\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n this.detailQueryCompleteSubscription.unsubscribe();\n this.returnLinkSubscription.unsubscribe();\n this.queryParamsSubscription.unsubscribe();\n this.routeUrlSubscription.unsubscribe();\n }\n\n isThumbnailMonths() {\n return (this.apiFolder === 'ticket_errors' || this.apiFolder === 'assay_test_counts');\n }\n\n getDetailLink() {\n return '/businessReview/' + this.apiFolder + '/' + this.apiDrillDown;\n }\n\n getQueryParams(dataItem) {\n let params = {};\n if ('uck' in dataItem) {\n params['ckey'] = dataItem.uck.value;\n }\n if ('acct_pres_name' in dataItem) {\n params['acct_pres_name'] = dataItem.acct_pres_name.value;\n }\n if ('customer_num' in dataItem) {\n params['customer_num'] = dataItem.customer_num.value;\n }\n return this.detailQueryParamsService.getQueryParams(params);\n }\n\n}\n","
    \n \n \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    {{apiDisplayTitle}} - Timeline Data
    Customer: {{sCustomerName}}
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n \n \n \n \n {{column.title}}\n \n \n \n {{dataItem[col.ref].value}}\n \n \n \n \n \n
    \n
    \n
    \n \n
    \n
    \n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { BrParamsService } from '../../br-params.service';\nimport { BrHistoryRange } from '../../br-history-range.service';\nimport { NavbarBuilderService } from '../../../navigation/navbar-builder.service';\nimport { ToolSelectionOptions } from '../../../configuration/nav-filter-selection';\nimport { ListViewPages } from '../../configuration/details/list-view-pages';\nimport { RequestState } from '../../../api/request-handler';\nimport { ApiService } from '../../../api/api.service';\nimport { RefreshHandlerService } from '../../../api/refresh-handler.service';\nimport { GridComponent } from '../../../details/grid.component';\nimport {DetailQueryParamsService} from '../../detail-query-params.service';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-br-timeline-view',\n templateUrl: './br-timeline-view.component.html',\n styleUrls: ['./br-timeline-view.component.scss']\n})\n\nexport class BrTimelineViewComponent extends GridComponent implements OnInit, OnDestroy {\n\n kpiConfig;\n listViewPages = ListViewPages;\n public apiData;\n public state = RequestState.Inactive;\n apiUrl;\n apiDisplayTitle;\n apiFolder;\n apiChartType;\n sCustomerName;\n sUck;\n requestHandler;\n stateChangeHandler;\n dataCols = [];\n dataRows = [];\n chartData = [];\n chartLabels = [];\n returnLink;\n returnLinkSubscription;\n queryParamsSubscription;\n routeUrlSubscription;\n detailQueryCompleteSubscription;\n multiChartSeriesArray = [];\n\n constructor(\n private navbarBuilderService: NavbarBuilderService,\n private brParamsService: BrParamsService,\n private brHistoryRange: BrHistoryRange,\n private location: Location,\n private apiService: ApiService,\n private detailQueryParamsService: DetailQueryParamsService,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n this.detailQueryCompleteSubscription = this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.listViewPages.hasOwnProperty(currentRouterLocation)) {\n this.kpiConfig = this.listViewPages[currentRouterLocation];\n }\n\n this.apiUrl = this.kpiConfig.apiSource;\n this.apiDisplayTitle = this.kpiConfig.apiTitle;\n this.apiFolder = this.kpiConfig.apiFolder;\n // console.log('API CONFIGS', this.kpiConfig);\n if (this.kpiConfig.apiChartType) { this.apiChartType = this.kpiConfig.apiChartType; }\n\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_detail'));\n\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n // console.log('TIMELINE DATA', this.apiData.values);\n\n // SET CUSTOMER NAME\n if (this.apiData.customer) {\n this.sCustomerName = this.apiData.customer;\n }\n\n // FORMAT API DATA FOR TABLE - format dataCols for kendo component\n this.dataCols = this.kpiConfig.table.columns;\n if (this.apiData.columns) { this.dataCols = this.apiData.columns; }\n\n // format dataRows for kendo component\n this.dataRows = [];\n this.chartData = [];\n for (let i = 0; i < this.apiData.values.length; i++) {\n const apiDataRow = this.apiData.values[i];\n const dataRow = {};\n const multiChartSeries = [];\n let multiChartSeriesTitle;\n for (let c = 0; c < this.dataCols.length; c++) {\n const dataColConfig = this.dataCols[c];\n dataRow[dataColConfig.ref] = {\n value: apiDataRow[dataColConfig.ref]\n };\n // console.log('Data Element', dataRow[dataColConfig.ref].value);\n\n if (this.apiChartType === 'MultiBar' || this.apiChartType === 'StackBar') {\n if ( dataColConfig.ref !== 'title') {\n multiChartSeries.push(apiDataRow[dataColConfig.ref]);\n } else {\n multiChartSeriesTitle = apiDataRow[dataColConfig.ref];\n }\n } else {\n if ( dataColConfig.ref !== 'title') {\n this.chartData.push(dataRow[dataColConfig.ref].value);\n }\n }\n }\n if (this.apiChartType === 'MultiBar') {\n this.multiChartSeriesArray.push({\n data: multiChartSeries,\n name: multiChartSeriesTitle,\n stack: false\n });\n } else if (this.apiChartType === 'StackBar') {\n this.multiChartSeriesArray.push({\n data: multiChartSeries,\n name: multiChartSeriesTitle,\n stack: true\n });\n }\n this.dataRows.push(dataRow);\n }\n this.updateGrid();\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.updateGrid();\n });\n\n this.returnLinkSubscription = this.detailQueryParamsService.getReturnLink().subscribe((pathDetails) => {\n this.returnLink = pathDetails;\n });\n this.queryParamsSubscription = this.route.queryParams.subscribe(params => {\n this.detailQueryParamsService.prepReturnParams(params);\n this.detailQueryParamsService.buildPersistedValuesFromParams(params);\n });\n this.routeUrlSubscription = this.route.url.subscribe((url) => {\n this.detailQueryParamsService.prepReturnLink(url);\n this.detailQueryParamsService.processReturnLink();\n });\n }\n\n getDetailLink() {\n return '/businessReview/' + this.apiFolder + '/list_view';\n }\n\n ngOnDestroy(): void {\n if (this.stateChangeHandler) {\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n this.detailQueryCompleteSubscription.unsubscribe();\n this.returnLinkSubscription.unsubscribe();\n this.queryParamsSubscription.unsubscribe();\n this.routeUrlSubscription.unsubscribe();\n }\n\n getQueryParams(dataItem) {\n let params = {};\n if ('uck' in dataItem) {\n params['ckey'] = dataItem.uck.value;\n }\n if ('acct_pres_name' in dataItem) {\n params['acct_pres_name'] = dataItem.acct_pres_name.value;\n }\n if (dataItem['period']) {\n params['period'] = dataItem['period'];\n }\n if (this.apiData.uck) {\n params['uck'] = this.apiData.uck;\n }\n\n return this.detailQueryParamsService.getQueryParams( params );\n }\n\n}\n","export const DDTConfig = {\r\n '/businessReview/alcm/list_view': '/qbr/kpi/alcm/details',\r\n '/businessReview/tcr/list_view': '/qbr/kpi/tcr/details',\r\n '/businessReview/hard_stops/list_view': '/qbr/kpi/hard_stops/details'\r\n};\r\n","
    \n \n \n
    \n \n
    \n
    \n
    \n {{apiData.dataTable.tableName}}\n
    \n \n
    0\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{dataItem[col.ref].value}}\n \n \n {{dataItem[col.ref].value}}\n \n \n \n \n \n \n
    \n
    \n
    \n
    ","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {GridComponent} from '../../details/grid.component';\nimport {RequestState} from '../../api/request-handler';\nimport {ApiService} from '../../api/api.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {DetailQueryParamsService} from '../detail-query-params.service';\nimport {DDTConfig} from '../configuration/details/ddt-config';\nimport {BrParamsService} from '../br-params.service';\nimport { ActivatedRoute } from '@angular/router';\n\n// columns need to be predefined. set in a parent component\n@Component({\n selector: 'app-dynamic-data-table',\n templateUrl: './dynamic-data-table.component.html',\n styleUrls: ['./dynamic-data-table.component.scss']\n})\nexport class DynamicDataTableComponent extends GridComponent implements OnInit, OnDestroy {\n ddtConfig = DDTConfig;\n @Input() apiUrl = '/qbr/kpi/example_ddt/details';\n apiData = null;\n state = null;\n requestHandler;\n stateChangeHandler;\n returnLink;\n detailQueryCompleteSubscription;\n returnLinkSubscription;\n queryParamsSubscription;\n routeUrlSubscription;\n\n @Input() dataCols = [];\n dataRows = [];\n\n // data col metadata:\n // {ref: 'uniqueCustomerKey', description: 'CustomerKey', isLink: false, width: 80, hidden: true, filterable: true, export: false},\n\n\n constructor(\n private apiService: ApiService,\n private detailQueryParamsService: DetailQueryParamsService,\n private brParamsService: BrParamsService,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n ngOnInit(): void {\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n this.detailQueryCompleteSubscription = this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.ddtConfig.hasOwnProperty(currentRouterLocation)) {\n this.apiUrl = this.ddtConfig[currentRouterLocation];\n }\n this.brParamsService.set('br_periods_to_show', this.brParamsService.get('br_history_range_detail'));\n\n this.requestHandler = this.apiService.get(this.apiUrl);\n this.requestHandler.sendRequest(this.apiUrl);\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n // format dataRows for kendo component\n this.dataRows = [];\n for (let i = 0; i < this.apiData.dataTable.rowData.length; i++) {\n const apiDataRow = this.apiData.dataTable.rowData[i];\n const dataRow = {};\n // console.log('dataCols', this.dataCols);\n for (const dataColConfig of this.dataCols) {\n // if (dataColConfig.ref )\n let colorCalc = '';\n if (dataColConfig.ref + '_COLOR' in apiDataRow) {\n colorCalc = apiDataRow[dataColConfig.ref + '_COLOR'];\n }\n if (dataColConfig.bg_color.length > 0) {\n colorCalc = apiDataRow[dataColConfig.bg_color];\n }\n dataRow[dataColConfig.ref] = {\n value: apiDataRow[dataColConfig.ref],\n bgcolor: colorCalc,\n color: ''\n };\n }\n this.dataRows.push(dataRow);\n }\n this.updateGrid();\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.updateGrid();\n });\n\n this.returnLinkSubscription = this.detailQueryParamsService.getReturnLink().subscribe((pathDetails) => {\n this.returnLink = pathDetails;\n });\n this.queryParamsSubscription = this.route.queryParams.subscribe(params => {\n this.detailQueryParamsService.prepReturnParams(params);\n this.detailQueryParamsService.buildPersistedValuesFromParams(params);\n });\n this.routeUrlSubscription = this.route.url.subscribe((url) => {\n this.detailQueryParamsService.prepReturnLink(url);\n this.detailQueryParamsService.processReturnLink();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangeHandler) {\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n this.detailQueryCompleteSubscription.unsubscribe();\n this.returnLinkSubscription.unsubscribe();\n this.queryParamsSubscription.unsubscribe();\n this.routeUrlSubscription.unsubscribe();\n }\n\n // getQueryParams() {\n // return this.detailQueryParamsService.getQueryParams();\n // }\n\n inArray(array, index) {\n return (index in array);\n }\n\n getQueryParams() {\n return this.detailQueryParamsService.getQueryParams();\n }\n}\n","
    \n \n
    ","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport {ApiService} from '../../api/api.service';\nimport {NavbarBuilderService} from '../../navigation/navbar-builder.service';\nimport {DetailQueryParamsService} from '../detail-query-params.service';\nimport {ToolSelectionOptions} from '../../configuration/nav-filter-selection';\nimport {RequestState} from '../../api/request-handler';\nimport {DDTConfig} from '../configuration/details/ddt-config';\n\n@Component({\n selector: 'app-ddt-loader',\n templateUrl: './ddt-loader.component.html',\n styleUrls: ['./ddt-loader.component.scss']\n})\nexport class DdtLoaderComponent implements OnInit, OnDestroy {\n ddtConfig = DDTConfig;\n @Input() apiUrl = '/qbr/kpi/example_ddt/details';\n apiData = null;\n state = null;\n requestHandler;\n stateChangeHandler;\n\n dataCols = [];\n\n constructor(\n private apiService: ApiService,\n private navbarBuilderService: NavbarBuilderService,\n private detailQueryParamsService: DetailQueryParamsService\n ) { }\n\n ngOnInit(): void {\n this.navbarBuilderService.setNavbarChoice('business-review');\n this.navbarBuilderService.setNavFilterSelection({\n preferences: false,\n dashboardSelector: false,\n toolSelection: ToolSelectionOptions.businessreview,\n bookmarksFlag: false,\n viewTitle: false,\n viewTitleText: '',\n viewSubtitle: false,\n viewSubtitleText: '',\n filtered: false\n });\n const currentRouterLocation = this.detailQueryParamsService.getCleanLocation();\n this.detailQueryParamsService.getBuildCompleteEvent().subscribe(() => {\n if (this.ddtConfig.hasOwnProperty(currentRouterLocation)) {\n this.apiUrl = this.ddtConfig[currentRouterLocation];\n }\n this.requestHandler = this.apiService.get(this.apiUrl);\n // no need to send request here as chart tile has already done so\n this.stateChangeHandler = (state) => {\n this.state = state;\n if (state === RequestState.Complete) {\n const response = this.requestHandler.getResponse();\n this.apiData = JSON.parse(response.body);\n const dataCols = this.apiData.dataTable.columns;\n for (let i = 0; i < dataCols.length; i++) {\n dataCols[i].ref = dataCols[i].value;\n if (!('width' in dataCols[i])) {\n dataCols[i].width = 80;\n }\n dataCols[i].hidden = false;\n dataCols[i].filterable = true;\n dataCols[i].export = false;\n if (!('type' in dataCols[i])) {\n dataCols[i].type = 'string';\n }\n dataCols[i].isLink = false;\n if (!('bg_color' in dataCols[i])) {\n dataCols[i].bg_color = '';\n dataCols[i].text_color = '#000';\n }\n if (!('text_color' in dataCols[i])) {\n dataCols[i].text_color = '#000';\n }\n }\n this.dataCols = dataCols;\n }\n };\n this.requestHandler.onStateChange(this.stateChangeHandler);\n this.requestHandler.sendRequest(this.apiUrl);\n });\n this.detailQueryParamsService.buildPersistedValuesFromQueryParams();\n }\n\n ngOnDestroy(): void {\n if (this.stateChangeHandler) {\n this.requestHandler.removeStateListener(this.stateChangeHandler);\n }\n }\n\n isDataColsSet() {\n if (Array.isArray(this.dataCols) && this.dataCols.length > 0) {\n return true;\n }\n return false;\n }\n}\n","
    \n \n
    ","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { DashboardComponent } from './dashboards/dashboard/dashboard.component';\nimport { Style1Component } from './details/style1/style1.component';\nimport { CustomerComponent } from './dashboards/customer/customer.component';\nimport { InstrumentsComponent } from './dashboards/instruments/instruments.component';\nimport { AmbassadorComponent } from './dashboards/ambassador/ambassador.component';\nimport { CtDashboardComponent } from './control_tower/ct-dashboard/ct-dashboard.component';\nimport { AlertsDashboardComponent } from './alerts/alerts-dashboard/alerts-dashboard.component';\nimport { Style2Component } from './details/style2/style2.component';\nimport { Style3Component } from './details/style3/style3.component';\nimport { Style4Component } from './details/style4/style4.component';\nimport { ServiceContractsLevel2Component } from './details/service-contracts/service-contracts-level2/service-contracts-level2.component';\nimport { ServiceContractsLevel3Component } from './details/service-contracts/service-contracts-level3/service-contracts-level3.component';\nimport { ServiceContractsLevel4Component } from './details/service-contracts/service-contracts-level4/service-contracts-level4.component';\nimport { UptimeCustomerDetailsComponent } from './details/uptime-customer-details/uptime-customer-details.component';\nimport { SurveyCommentDetailsComponent } from './details/survey-comment-details/survey-comment-details.component';\nimport { CustomerOrderDetailsComponent } from './details/customer-order-details/customer-order-details.component';\nimport { SGMDetailsComponent } from './details/sgm-details/sgm-details.component';\nimport { PredictiveAlertsLevel2Component } from './details/predictive-alerts/predictive-alerts-level2/predictive-alerts-level2.component';\nimport { PredictiveAlertsLevel3Component } from './details/predictive-alerts/predictive-alerts-level3/predictive-alerts-level3.component';\nimport { RnpsSurveyCommentDetailsComponent } from './details/rnps-survey-comment-details/rnps-survey-comment-details.component';\nimport { SalesSummaryComponent } from './details/sales/sales-summary/sales-summary.component';\nimport { SalesDetailsComponent } from './details/sales/sales-details/sales-details.component';\nimport { GsAlertsDashboardComponent } from './alerts/gs-alerts-dashboard/gs-alerts-dashboard.component';\nimport { MsalGuard } from '@azure/msal-angular';\nimport { BrDashboardComponent } from './business_review/br-dashboard/br-dashboard.component';\nimport { BrTemplateEditorComponent } from './business_review/br-template-editor/br-template-editor.component';\nimport { BrExpandedChartViewComponent } from './business_review/detail_pages/br-expanded-chart-view/br-expanded-chart-view.component';\nimport { BrListViewComponent } from './business_review/detail_pages/br-list-view/br-list-view.component';\nimport { BrSystemComparisonListViewComponent } from './business_review/system-comparison-pages/br-system-comparison-list-view/br-system-comparison-list-view.component';\nimport { BrTimelineViewComponent } from './business_review/timeline-pages/br-timeline-view/br-timeline-view.component';\nimport {DynamicDataTableComponent} from './business_review/dynamic-data-table/dynamic-data-table.component';\nimport {DdtLoaderComponent} from './business_review/ddt-loader/ddt-loader.component';\nimport {BrDetailComponentViewerComponent} from './business_review/br-detail-component-viewer/br-detail-component-viewer.component';\n\nconst routes: Routes = [\n { path: 'aoh', component: CtDashboardComponent, canActivate: [MsalGuard] },\n { path: 'aoh/account/:account', component: CtDashboardComponent, canActivate: [MsalGuard] },\n { path: 'alerts', component: AlertsDashboardComponent, canActivate: [MsalGuard] },\n { path: 'gsalerts', component: GsAlertsDashboardComponent, canActivate: [MsalGuard]},\n { path: '', component: DashboardComponent, canActivate: [MsalGuard] },\n { path: 'customerDashboard', component: CustomerComponent, canActivate: [MsalGuard] },\n { path: 'instrumentsDashboard', component: InstrumentsComponent, canActivate: [MsalGuard] },\n { path: 'ambassadorDashboard', component: AmbassadorComponent, canActivate: [MsalGuard] },\n { path: 'hsi', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'hsi/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'hotsheets', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'hotsheets/survey_comments/:customernumber/:country/:interviewdate', component: SurveyCommentDetailsComponent, canActivate: [MsalGuard] },\n { path: 'opencalls', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'cpyr', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'cpyr/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'servicecost', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'servicecost/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'alconnected', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'alconnected/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'alconnectivity', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'alconnectivity/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'hci', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'hci/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'sdfr', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'sdfr/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'ftfr', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'ftfr/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'uptime', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'uptime/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'uptime/details/customerdetails/:customerid/:customername/:country', component: UptimeCustomerDetailsComponent, canActivate: [MsalGuard] },\n { path: 'assay', component: Style4Component, canActivate: [MsalGuard] },\n { path: 'assay/customers/:customerid/:customername', component: Style4Component, canActivate: [MsalGuard] },\n { path: 'cpyp', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'cpyp/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'ticketrending', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'ticketrending/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'trt', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'trt/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'tsb', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'pm', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'customerNps', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'customerNps/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'customerNps/details/survey_comments/:customernumber/:country/:interviewdate', component: SurveyCommentDetailsComponent, canActivate: [MsalGuard] },\n { path: 'servicecosthours', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'servicecosthours/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'utilization', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'servicecontracts', component: ServiceContractsLevel2Component, canActivate: [MsalGuard] },\n { path: 'servicecontracts/entitlements/:customernumber/:serialnumber/:contractnumber', component: ServiceContractsLevel3Component, canActivate: [MsalGuard] },\n { path: 'servicecontracts/entitlements/terms/:customernumber/:serialnumber/:contractnumber/:entitlementid/:entitlementdesc', component: ServiceContractsLevel4Component, canActivate: [MsalGuard] },\n { path: 'utilization/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'CRLSummary', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'CRLSummary/details', component: Style3Component, canActivate: [MsalGuard] },\n { path: 'proactive', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'proactive/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'orders', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'orders/intermediate', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'orders/details/:customername/:ordernumber/:orderstatus', component: CustomerOrderDetailsComponent, canActivate: [MsalGuard] },\n { path: 'alwaysonuptime', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'alwaysonuptime/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'customerswithoutservicecontracts', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'customerswithoutservicecontracts/grid', component: PredictiveAlertsLevel2Component, canActivate: [MsalGuard] },\n { path: 'customerswithoutservicecontracts/griddetails/:countryCode/:customerID/:sn', component: PredictiveAlertsLevel3Component, canActivate: [MsalGuard] },\n { path: 'util_workload', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'util_workload/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'tickets_per_day', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'tickets_per_day/details', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'servicegrossmargin_customerSGM', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'servicegrossmargin_customerSGM/details', component: SGMDetailsComponent, canActivate: [MsalGuard] },\n { path: 'rnps', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'rnps/detail', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'rnps/detail/survey_comments/:score/:customer/:country/:interviewdate/:category', component: RnpsSurveyCommentDetailsComponent, canActivate: [MsalGuard] },\n { path: 'sales', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'sales/summary', component: SalesSummaryComponent, canActivate: [MsalGuard] },\n { path: 'sales/details/:customerid/:ln/:desc/:customername', component: SalesDetailsComponent, canActivate: [MsalGuard] },\n { path: 'rcs', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'rcs/summary', component: SalesSummaryComponent, canActivate: [MsalGuard] },\n { path: 'rcs/details/:customerid/:ln/:desc/:customername', component: SalesDetailsComponent, canActivate: [MsalGuard] },\n { path: 'compliance', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'compliance/details', component: SalesSummaryComponent, canActivate: [MsalGuard] },\n { path: 'amb_orders', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'amb_orders/intermediate', component: Style2Component, canActivate: [MsalGuard] },\n { path: 'amb_orders/details/:customername/:ordernumber/:orderstatus', component: CustomerOrderDetailsComponent, canActivate: [MsalGuard] },\n { path: 'amb_servicegrossmargin_customerSGM', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'amb_servicegrossmargin_customerSGM/details', component: SGMDetailsComponent, canActivate: [MsalGuard] },\n { path: 'amb_customerswithoutservicecontracts', component: Style1Component, canActivate: [MsalGuard] },\n { path: 'amb_customerswithoutservicecontracts/grid', component: PredictiveAlertsLevel2Component, canActivate: [MsalGuard] },\n { path: 'amb_customerswithoutservicecontracts/griddetails/:countryCode/:customerID/:sn', component: PredictiveAlertsLevel3Component, canActivate: [MsalGuard] },\n { path: 'businessReview', component: BrDashboardComponent, canActivate: [MsalGuard]},\n { path: 'businessReview/:devapitools', component: BrDashboardComponent, canActivate: [MsalGuard]},\n { path: 'brTemplateEditor', component: BrTemplateEditorComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/total_inbound_calls', component: BrExpandedChartViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/total_inbound_calls/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/total_inbound_calls/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/total_inbound_calls/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/pm_tickets/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/pm_tickets/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/pm_tickets/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/nps/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/nps/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/nps/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/alcm/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/alcm/list_view', component: DdtLoaderComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/alcm/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/calls_without_service_number/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/calls_without_service_number/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/calls_without_service_number/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/abandoned_calls/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/abandoned_calls/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/abandoned_calls/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/average_wait_time/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/average_wait_time/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/average_wait_time/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/service_level/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/service_level/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/service_level/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/ticket_errors/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/ticket_errors/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/ticket_errors/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/hard_stops/list_view', component: DdtLoaderComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/hard_stops/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/hard_stops/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/uptime/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/uptime/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/uptime/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/tsb/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/tsb/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/tsb/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/response_time/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/response_time/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/response_time/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/phn/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/phn/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/phn/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/instrument_test_counts/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/instrument_test_counts/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/instrument_test_counts/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/assay_test_counts/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/assay_test_counts/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/assay_test_counts/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/mttr/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/mttr/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/mttr/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n { path: 'businessReview/ticket_history/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/ticket_history/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/ticket_history/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n\n\n { path: 'businessReview/example_data/list_view', component: BrListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/example_data/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/example_data/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/tcr/list_view', component: DdtLoaderComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/tcr/system_comparison_view', component: BrSystemComparisonListViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/tcr/timeline_view', component: BrTimelineViewComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/test/example_ddt', component: DdtLoaderComponent, canActivate: [MsalGuard] },\n { path: 'businessReview/test/detail', component: BrDetailComponentViewerComponent, canActivate: [MsalGuard] }\n];\n\n\n@NgModule({\n imports: [RouterModule.forRoot(routes)],\n exports: [RouterModule]\n})\nexport class AppRoutingModule { }\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-br-detail-component-viewer',\n templateUrl: './br-detail-component-viewer.component.html',\n styleUrls: ['./br-detail-component-viewer.component.scss']\n})\nexport class BrDetailComponentViewerComponent implements OnInit {\n component;\n apiUrl;\n\n constructor(\n private route: ActivatedRoute\n ) { }\n\n ngOnInit(): void {\n this.route.queryParams\n .subscribe(params => {\n if (params.hasOwnProperty('component')) {\n this.component = params.component;\n }\n if (params.hasOwnProperty('apiUrl')) {\n this.apiUrl = params.apiUrl;\n }\n }\n );\n }\n}\n","/**\n * @license Angular v9.0.7\n * (c) 2010-2020 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { ɵAnimationGroupPlayer, NoopAnimationPlayer, AUTO_STYLE, ɵPRE_STYLE, sequence, style } from '@angular/animations';\nimport { Injectable } from '@angular/core';\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/shared.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @return {?}\n */\nimport * as ɵngcc0 from '@angular/core';\nfunction isBrowser() {\n return (typeof window !== 'undefined' && typeof window.document !== 'undefined');\n}\n/**\n * @return {?}\n */\nfunction isNode() {\n // Checking only for `process` isn't enough to identify whether or not we're in a Node\n // environment, because Webpack by default will polyfill the `process`. While we can discern\n // that Webpack polyfilled it by looking at `process.browser`, it's very Webpack-specific and\n // might not be future-proof. Instead we look at the stringified version of `process` which\n // is `[object process]` in Node and `[object Object]` when polyfilled.\n return typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n}\n/**\n * @param {?} players\n * @return {?}\n */\nfunction optimizeGroupPlayer(players) {\n switch (players.length) {\n case 0:\n return new NoopAnimationPlayer();\n case 1:\n return players[0];\n default:\n return new ɵAnimationGroupPlayer(players);\n }\n}\n/**\n * @param {?} driver\n * @param {?} normalizer\n * @param {?} element\n * @param {?} keyframes\n * @param {?=} preStyles\n * @param {?=} postStyles\n * @return {?}\n */\nfunction normalizeKeyframes(driver, normalizer, element, keyframes, preStyles = {}, postStyles = {}) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const normalizedKeyframes = [];\n /** @type {?} */\n let previousOffset = -1;\n /** @type {?} */\n let previousKeyframe = null;\n keyframes.forEach((/**\n * @param {?} kf\n * @return {?}\n */\n kf => {\n /** @type {?} */\n const offset = (/** @type {?} */ (kf['offset']));\n /** @type {?} */\n const isSameOffset = offset == previousOffset;\n /** @type {?} */\n const normalizedKeyframe = (isSameOffset && previousKeyframe) || {};\n Object.keys(kf).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n let normalizedProp = prop;\n /** @type {?} */\n let normalizedValue = kf[prop];\n if (prop !== 'offset') {\n normalizedProp = normalizer.normalizePropertyName(normalizedProp, errors);\n switch (normalizedValue) {\n case ɵPRE_STYLE:\n normalizedValue = preStyles[prop];\n break;\n case AUTO_STYLE:\n normalizedValue = postStyles[prop];\n break;\n default:\n normalizedValue =\n normalizer.normalizeStyleValue(prop, normalizedProp, normalizedValue, errors);\n break;\n }\n }\n normalizedKeyframe[normalizedProp] = normalizedValue;\n }));\n if (!isSameOffset) {\n normalizedKeyframes.push(normalizedKeyframe);\n }\n previousKeyframe = normalizedKeyframe;\n previousOffset = offset;\n }));\n if (errors.length) {\n /** @type {?} */\n const LINE_START = '\\n - ';\n throw new Error(`Unable to animate due to the following errors:${LINE_START}${errors.join(LINE_START)}`);\n }\n return normalizedKeyframes;\n}\n/**\n * @param {?} player\n * @param {?} eventName\n * @param {?} event\n * @param {?} callback\n * @return {?}\n */\nfunction listenOnPlayer(player, eventName, event, callback) {\n switch (eventName) {\n case 'start':\n player.onStart((/**\n * @return {?}\n */\n () => callback(event && copyAnimationEvent(event, 'start', player))));\n break;\n case 'done':\n player.onDone((/**\n * @return {?}\n */\n () => callback(event && copyAnimationEvent(event, 'done', player))));\n break;\n case 'destroy':\n player.onDestroy((/**\n * @return {?}\n */\n () => callback(event && copyAnimationEvent(event, 'destroy', player))));\n break;\n }\n}\n/**\n * @param {?} e\n * @param {?} phaseName\n * @param {?} player\n * @return {?}\n */\nfunction copyAnimationEvent(e, phaseName, player) {\n /** @type {?} */\n const totalTime = player.totalTime;\n /** @type {?} */\n const disabled = ((/** @type {?} */ (player))).disabled ? true : false;\n /** @type {?} */\n const event = makeAnimationEvent(e.element, e.triggerName, e.fromState, e.toState, phaseName || e.phaseName, totalTime == undefined ? e.totalTime : totalTime, disabled);\n /** @type {?} */\n const data = ((/** @type {?} */ (e)))['_data'];\n if (data != null) {\n ((/** @type {?} */ (event)))['_data'] = data;\n }\n return event;\n}\n/**\n * @param {?} element\n * @param {?} triggerName\n * @param {?} fromState\n * @param {?} toState\n * @param {?=} phaseName\n * @param {?=} totalTime\n * @param {?=} disabled\n * @return {?}\n */\nfunction makeAnimationEvent(element, triggerName, fromState, toState, phaseName = '', totalTime = 0, disabled) {\n return { element, triggerName, fromState, toState, phaseName, totalTime, disabled: !!disabled };\n}\n/**\n * @param {?} map\n * @param {?} key\n * @param {?} defaultValue\n * @return {?}\n */\nfunction getOrSetAsInMap(map, key, defaultValue) {\n /** @type {?} */\n let value;\n if (map instanceof Map) {\n value = map.get(key);\n if (!value) {\n map.set(key, value = defaultValue);\n }\n }\n else {\n value = map[key];\n if (!value) {\n value = map[key] = defaultValue;\n }\n }\n return value;\n}\n/**\n * @param {?} command\n * @return {?}\n */\nfunction parseTimelineCommand(command) {\n /** @type {?} */\n const separatorPos = command.indexOf(':');\n /** @type {?} */\n const id = command.substring(1, separatorPos);\n /** @type {?} */\n const action = command.substr(separatorPos + 1);\n return [id, action];\n}\n/** @type {?} */\nlet _contains = (/**\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n(elm1, elm2) => false);\nconst ɵ0 = _contains;\n/** @type {?} */\nlet _matches = (/**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n(element, selector) => false);\nconst ɵ1 = _matches;\n/** @type {?} */\nlet _query = (/**\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n(element, selector, multi) => {\n return [];\n});\nconst ɵ2 = _query;\n// Define utility methods for browsers and platform-server(domino) where Element\n// and utility methods exist.\n/** @type {?} */\nconst _isNode = isNode();\nif (_isNode || typeof Element !== 'undefined') {\n // this is well supported in all browsers\n _contains = (/**\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n (elm1, elm2) => { return (/** @type {?} */ (elm1.contains(elm2))); });\n _matches = ((/**\n * @return {?}\n */\n () => {\n if (_isNode || Element.prototype.matches) {\n return (/**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n (element, selector) => element.matches(selector));\n }\n else {\n /** @type {?} */\n const proto = (/** @type {?} */ (Element.prototype));\n /** @type {?} */\n const fn = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector ||\n proto.oMatchesSelector || proto.webkitMatchesSelector;\n if (fn) {\n return (/**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n (element, selector) => fn.apply(element, [selector]));\n }\n else {\n return _matches;\n }\n }\n }))();\n _query = (/**\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n (element, selector, multi) => {\n /** @type {?} */\n let results = [];\n if (multi) {\n results.push(...element.querySelectorAll(selector));\n }\n else {\n /** @type {?} */\n const elm = element.querySelector(selector);\n if (elm) {\n results.push(elm);\n }\n }\n return results;\n });\n}\n/**\n * @param {?} prop\n * @return {?}\n */\nfunction containsVendorPrefix(prop) {\n // Webkit is the only real popular vendor prefix nowadays\n // cc: http://shouldiprefix.com/\n return prop.substring(1, 6) == 'ebkit'; // webkit or Webkit\n}\n/** @type {?} */\nlet _CACHED_BODY = null;\n/** @type {?} */\nlet _IS_WEBKIT = false;\n/**\n * @param {?} prop\n * @return {?}\n */\nfunction validateStyleProperty(prop) {\n if (!_CACHED_BODY) {\n _CACHED_BODY = getBodyNode() || {};\n _IS_WEBKIT = (/** @type {?} */ (_CACHED_BODY)).style ? ('WebkitAppearance' in (/** @type {?} */ (_CACHED_BODY)).style) : false;\n }\n /** @type {?} */\n let result = true;\n if ((/** @type {?} */ (_CACHED_BODY)).style && !containsVendorPrefix(prop)) {\n result = prop in (/** @type {?} */ (_CACHED_BODY)).style;\n if (!result && _IS_WEBKIT) {\n /** @type {?} */\n const camelProp = 'Webkit' + prop.charAt(0).toUpperCase() + prop.substr(1);\n result = camelProp in (/** @type {?} */ (_CACHED_BODY)).style;\n }\n }\n return result;\n}\n/**\n * @return {?}\n */\nfunction getBodyNode() {\n if (typeof document != 'undefined') {\n return document.body;\n }\n return null;\n}\n/** @type {?} */\nconst matchesElement = _matches;\n/** @type {?} */\nconst containsElement = _contains;\n/** @type {?} */\nconst invokeQuery = _query;\n/**\n * @param {?} object\n * @return {?}\n */\nfunction hypenatePropsObject(object) {\n /** @type {?} */\n const newObj = {};\n Object.keys(object).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const newProp = prop.replace(/([a-z])([A-Z])/g, '$1-$2');\n newObj[newProp] = object[prop];\n }));\n return newObj;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/animation_driver.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * \\@publicApi\n */\nclass NoopAnimationDriver {\n /**\n * @param {?} prop\n * @return {?}\n */\n validateStyleProperty(prop) { return validateStyleProperty(prop); }\n /**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n matchesElement(element, selector) {\n return matchesElement(element, selector);\n }\n /**\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n containsElement(elm1, elm2) { return containsElement(elm1, elm2); }\n /**\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n query(element, selector, multi) {\n return invokeQuery(element, selector, multi);\n }\n /**\n * @param {?} element\n * @param {?} prop\n * @param {?=} defaultValue\n * @return {?}\n */\n computeStyle(element, prop, defaultValue) {\n return defaultValue || '';\n }\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @param {?=} scrubberAccessRequested\n * @return {?}\n */\n animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {\n return new NoopAnimationPlayer(duration, delay);\n }\n}\nNoopAnimationDriver.ɵfac = function NoopAnimationDriver_Factory(t) { return new (t || NoopAnimationDriver)(); };\nNoopAnimationDriver.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: NoopAnimationDriver, factory: NoopAnimationDriver.ɵfac });\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NoopAnimationDriver, [{\n type: Injectable\n }], null, null); })();\n/**\n * \\@publicApi\n * @abstract\n */\nclass AnimationDriver {\n}\nAnimationDriver.NOOP = new NoopAnimationDriver();\nif (false) {\n /** @type {?} */\n AnimationDriver.NOOP;\n /**\n * @abstract\n * @param {?} prop\n * @return {?}\n */\n AnimationDriver.prototype.validateStyleProperty = function (prop) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n AnimationDriver.prototype.matchesElement = function (element, selector) { };\n /**\n * @abstract\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n AnimationDriver.prototype.containsElement = function (elm1, elm2) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n AnimationDriver.prototype.query = function (element, selector, multi) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} prop\n * @param {?=} defaultValue\n * @return {?}\n */\n AnimationDriver.prototype.computeStyle = function (element, prop, defaultValue) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?=} easing\n * @param {?=} previousPlayers\n * @param {?=} scrubberAccessRequested\n * @return {?}\n */\n AnimationDriver.prototype.animate = function (element, keyframes, duration, delay, easing, previousPlayers, scrubberAccessRequested) { };\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/util.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst ONE_SECOND = 1000;\n/** @type {?} */\nconst SUBSTITUTION_EXPR_START = '{{';\n/** @type {?} */\nconst SUBSTITUTION_EXPR_END = '}}';\n/** @type {?} */\nconst ENTER_CLASSNAME = 'ng-enter';\n/** @type {?} */\nconst LEAVE_CLASSNAME = 'ng-leave';\n/** @type {?} */\nconst ENTER_SELECTOR = '.ng-enter';\n/** @type {?} */\nconst LEAVE_SELECTOR = '.ng-leave';\n/** @type {?} */\nconst NG_TRIGGER_CLASSNAME = 'ng-trigger';\n/** @type {?} */\nconst NG_TRIGGER_SELECTOR = '.ng-trigger';\n/** @type {?} */\nconst NG_ANIMATING_CLASSNAME = 'ng-animating';\n/** @type {?} */\nconst NG_ANIMATING_SELECTOR = '.ng-animating';\n/**\n * @param {?} value\n * @return {?}\n */\nfunction resolveTimingValue(value) {\n if (typeof value == 'number')\n return value;\n /** @type {?} */\n const matches = value.match(/^(-?[\\.\\d]+)(m?s)/);\n if (!matches || matches.length < 2)\n return 0;\n return _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);\n}\n/**\n * @param {?} value\n * @param {?} unit\n * @return {?}\n */\nfunction _convertTimeValueToMS(value, unit) {\n switch (unit) {\n case 's':\n return value * ONE_SECOND;\n default: // ms or something else\n return value;\n }\n}\n/**\n * @param {?} timings\n * @param {?} errors\n * @param {?=} allowNegativeValues\n * @return {?}\n */\nfunction resolveTiming(timings, errors, allowNegativeValues) {\n return timings.hasOwnProperty('duration') ?\n (/** @type {?} */ (timings)) :\n parseTimeExpression((/** @type {?} */ (timings)), errors, allowNegativeValues);\n}\n/**\n * @param {?} exp\n * @param {?} errors\n * @param {?=} allowNegativeValues\n * @return {?}\n */\nfunction parseTimeExpression(exp, errors, allowNegativeValues) {\n /** @type {?} */\n const regex = /^(-?[\\.\\d]+)(m?s)(?:\\s+(-?[\\.\\d]+)(m?s))?(?:\\s+([-a-z]+(?:\\(.+?\\))?))?$/i;\n /** @type {?} */\n let duration;\n /** @type {?} */\n let delay = 0;\n /** @type {?} */\n let easing = '';\n if (typeof exp === 'string') {\n /** @type {?} */\n const matches = exp.match(regex);\n if (matches === null) {\n errors.push(`The provided timing value \"${exp}\" is invalid.`);\n return { duration: 0, delay: 0, easing: '' };\n }\n duration = _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);\n /** @type {?} */\n const delayMatch = matches[3];\n if (delayMatch != null) {\n delay = _convertTimeValueToMS(parseFloat(delayMatch), matches[4]);\n }\n /** @type {?} */\n const easingVal = matches[5];\n if (easingVal) {\n easing = easingVal;\n }\n }\n else {\n duration = exp;\n }\n if (!allowNegativeValues) {\n /** @type {?} */\n let containsErrors = false;\n /** @type {?} */\n let startIndex = errors.length;\n if (duration < 0) {\n errors.push(`Duration values below 0 are not allowed for this animation step.`);\n containsErrors = true;\n }\n if (delay < 0) {\n errors.push(`Delay values below 0 are not allowed for this animation step.`);\n containsErrors = true;\n }\n if (containsErrors) {\n errors.splice(startIndex, 0, `The provided timing value \"${exp}\" is invalid.`);\n }\n }\n return { duration, delay, easing };\n}\n/**\n * @param {?} obj\n * @param {?=} destination\n * @return {?}\n */\nfunction copyObj(obj, destination = {}) {\n Object.keys(obj).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => { destination[prop] = obj[prop]; }));\n return destination;\n}\n/**\n * @param {?} styles\n * @return {?}\n */\nfunction normalizeStyles(styles) {\n /** @type {?} */\n const normalizedStyles = {};\n if (Array.isArray(styles)) {\n styles.forEach((/**\n * @param {?} data\n * @return {?}\n */\n data => copyStyles(data, false, normalizedStyles)));\n }\n else {\n copyStyles(styles, false, normalizedStyles);\n }\n return normalizedStyles;\n}\n/**\n * @param {?} styles\n * @param {?} readPrototype\n * @param {?=} destination\n * @return {?}\n */\nfunction copyStyles(styles, readPrototype, destination = {}) {\n if (readPrototype) {\n // we make use of a for-in loop so that the\n // prototypically inherited properties are\n // revealed from the backFill map\n for (let prop in styles) {\n destination[prop] = styles[prop];\n }\n }\n else {\n copyObj(styles, destination);\n }\n return destination;\n}\n/**\n * @param {?} element\n * @param {?} key\n * @param {?} value\n * @return {?}\n */\nfunction getStyleAttributeString(element, key, value) {\n // Return the key-value pair string to be added to the style attribute for the\n // given CSS style key.\n if (value) {\n return key + ':' + value + ';';\n }\n else {\n return '';\n }\n}\n/**\n * @param {?} element\n * @return {?}\n */\nfunction writeStyleAttribute(element) {\n // Read the style property of the element and manually reflect it to the\n // style attribute. This is needed because Domino on platform-server doesn't\n // understand the full set of allowed CSS properties and doesn't reflect some\n // of them automatically.\n /** @type {?} */\n let styleAttrValue = '';\n for (let i = 0; i < element.style.length; i++) {\n /** @type {?} */\n const key = element.style.item(i);\n styleAttrValue += getStyleAttributeString(element, key, element.style.getPropertyValue(key));\n }\n for (const key in element.style) {\n // Skip internal Domino properties that don't need to be reflected.\n if (!element.style.hasOwnProperty(key) || key.startsWith('_')) {\n continue;\n }\n /** @type {?} */\n const dashKey = camelCaseToDashCase(key);\n styleAttrValue += getStyleAttributeString(element, dashKey, element.style[key]);\n }\n element.setAttribute('style', styleAttrValue);\n}\n/**\n * @param {?} element\n * @param {?} styles\n * @param {?=} formerStyles\n * @return {?}\n */\nfunction setStyles(element, styles, formerStyles) {\n if (element['style']) {\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const camelProp = dashCaseToCamelCase(prop);\n if (formerStyles && !formerStyles.hasOwnProperty(prop)) {\n formerStyles[prop] = element.style[camelProp];\n }\n element.style[camelProp] = styles[prop];\n }));\n // On the server set the 'style' attribute since it's not automatically reflected.\n if (isNode()) {\n writeStyleAttribute(element);\n }\n }\n}\n/**\n * @param {?} element\n * @param {?} styles\n * @return {?}\n */\nfunction eraseStyles(element, styles) {\n if (element['style']) {\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const camelProp = dashCaseToCamelCase(prop);\n element.style[camelProp] = '';\n }));\n // On the server set the 'style' attribute since it's not automatically reflected.\n if (isNode()) {\n writeStyleAttribute(element);\n }\n }\n}\n/**\n * @param {?} steps\n * @return {?}\n */\nfunction normalizeAnimationEntry(steps) {\n if (Array.isArray(steps)) {\n if (steps.length == 1)\n return steps[0];\n return sequence(steps);\n }\n return (/** @type {?} */ (steps));\n}\n/**\n * @param {?} value\n * @param {?} options\n * @param {?} errors\n * @return {?}\n */\nfunction validateStyleParams(value, options, errors) {\n /** @type {?} */\n const params = options.params || {};\n /** @type {?} */\n const matches = extractStyleParams(value);\n if (matches.length) {\n matches.forEach((/**\n * @param {?} varName\n * @return {?}\n */\n varName => {\n if (!params.hasOwnProperty(varName)) {\n errors.push(`Unable to resolve the local animation param ${varName} in the given list of values`);\n }\n }));\n }\n}\n/** @type {?} */\nconst PARAM_REGEX = new RegExp(`${SUBSTITUTION_EXPR_START}\\\\s*(.+?)\\\\s*${SUBSTITUTION_EXPR_END}`, 'g');\n/**\n * @param {?} value\n * @return {?}\n */\nfunction extractStyleParams(value) {\n /** @type {?} */\n let params = [];\n if (typeof value === 'string') {\n /** @type {?} */\n let match;\n while (match = PARAM_REGEX.exec(value)) {\n params.push((/** @type {?} */ (match[1])));\n }\n PARAM_REGEX.lastIndex = 0;\n }\n return params;\n}\n/**\n * @param {?} value\n * @param {?} params\n * @param {?} errors\n * @return {?}\n */\nfunction interpolateParams(value, params, errors) {\n /** @type {?} */\n const original = value.toString();\n /** @type {?} */\n const str = original.replace(PARAM_REGEX, (/**\n * @param {?} _\n * @param {?} varName\n * @return {?}\n */\n (_, varName) => {\n /** @type {?} */\n let localVal = params[varName];\n // this means that the value was never overridden by the data passed in by the user\n if (!params.hasOwnProperty(varName)) {\n errors.push(`Please provide a value for the animation param ${varName}`);\n localVal = '';\n }\n return localVal.toString();\n }));\n // we do this to assert that numeric values stay as they are\n return str == original ? value : str;\n}\n/**\n * @param {?} iterator\n * @return {?}\n */\nfunction iteratorToArray(iterator) {\n /** @type {?} */\n const arr = [];\n /** @type {?} */\n let item = iterator.next();\n while (!item.done) {\n arr.push(item.value);\n item = iterator.next();\n }\n return arr;\n}\n/**\n * @param {?} source\n * @param {?} destination\n * @return {?}\n */\nfunction mergeAnimationOptions(source, destination) {\n if (source.params) {\n /** @type {?} */\n const p0 = source.params;\n if (!destination.params) {\n destination.params = {};\n }\n /** @type {?} */\n const p1 = destination.params;\n Object.keys(p0).forEach((/**\n * @param {?} param\n * @return {?}\n */\n param => {\n if (!p1.hasOwnProperty(param)) {\n p1[param] = p0[param];\n }\n }));\n }\n return destination;\n}\n/** @type {?} */\nconst DASH_CASE_REGEXP = /-+([a-z0-9])/g;\n/**\n * @param {?} input\n * @return {?}\n */\nfunction dashCaseToCamelCase(input) {\n return input.replace(DASH_CASE_REGEXP, (/**\n * @param {...?} m\n * @return {?}\n */\n (...m) => m[1].toUpperCase()));\n}\n/**\n * @param {?} input\n * @return {?}\n */\nfunction camelCaseToDashCase(input) {\n return input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n/**\n * @param {?} duration\n * @param {?} delay\n * @return {?}\n */\nfunction allowPreviousPlayerStylesMerge(duration, delay) {\n return duration === 0 || delay === 0;\n}\n/**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} previousStyles\n * @return {?}\n */\nfunction balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles) {\n /** @type {?} */\n const previousStyleProps = Object.keys(previousStyles);\n if (previousStyleProps.length && keyframes.length) {\n /** @type {?} */\n let startingKeyframe = keyframes[0];\n /** @type {?} */\n let missingStyleProps = [];\n previousStyleProps.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (!startingKeyframe.hasOwnProperty(prop)) {\n missingStyleProps.push(prop);\n }\n startingKeyframe[prop] = previousStyles[prop];\n }));\n if (missingStyleProps.length) {\n // tslint:disable-next-line\n for (var i = 1; i < keyframes.length; i++) {\n /** @type {?} */\n let kf = keyframes[i];\n missingStyleProps.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n function (prop) { kf[prop] = computeStyle(element, prop); }));\n }\n }\n }\n return keyframes;\n}\n/**\n * @param {?} visitor\n * @param {?} node\n * @param {?} context\n * @return {?}\n */\nfunction visitDslNode(visitor, node, context) {\n switch (node.type) {\n case 7 /* Trigger */:\n return visitor.visitTrigger(node, context);\n case 0 /* State */:\n return visitor.visitState(node, context);\n case 1 /* Transition */:\n return visitor.visitTransition(node, context);\n case 2 /* Sequence */:\n return visitor.visitSequence(node, context);\n case 3 /* Group */:\n return visitor.visitGroup(node, context);\n case 4 /* Animate */:\n return visitor.visitAnimate(node, context);\n case 5 /* Keyframes */:\n return visitor.visitKeyframes(node, context);\n case 6 /* Style */:\n return visitor.visitStyle(node, context);\n case 8 /* Reference */:\n return visitor.visitReference(node, context);\n case 9 /* AnimateChild */:\n return visitor.visitAnimateChild(node, context);\n case 10 /* AnimateRef */:\n return visitor.visitAnimateRef(node, context);\n case 11 /* Query */:\n return visitor.visitQuery(node, context);\n case 12 /* Stagger */:\n return visitor.visitStagger(node, context);\n default:\n throw new Error(`Unable to resolve animation metadata node #${node.type}`);\n }\n}\n/**\n * @param {?} element\n * @param {?} prop\n * @return {?}\n */\nfunction computeStyle(element, prop) {\n return ((/** @type {?} */ (window.getComputedStyle(element))))[prop];\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_transition_expr.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @type {?}\n */\nconst ANY_STATE = '*';\n/**\n * @param {?} transitionValue\n * @param {?} errors\n * @return {?}\n */\nfunction parseTransitionExpr(transitionValue, errors) {\n /** @type {?} */\n const expressions = [];\n if (typeof transitionValue == 'string') {\n transitionValue.split(/\\s*,\\s*/).forEach((/**\n * @param {?} str\n * @return {?}\n */\n str => parseInnerTransitionStr(str, expressions, errors)));\n }\n else {\n expressions.push((/** @type {?} */ (transitionValue)));\n }\n return expressions;\n}\n/**\n * @param {?} eventStr\n * @param {?} expressions\n * @param {?} errors\n * @return {?}\n */\nfunction parseInnerTransitionStr(eventStr, expressions, errors) {\n if (eventStr[0] == ':') {\n /** @type {?} */\n const result = parseAnimationAlias(eventStr, errors);\n if (typeof result == 'function') {\n expressions.push(result);\n return;\n }\n eventStr = result;\n }\n /** @type {?} */\n const match = eventStr.match(/^(\\*|[-\\w]+)\\s*()\\s*(\\*|[-\\w]+)$/);\n if (match == null || match.length < 4) {\n errors.push(`The provided transition expression \"${eventStr}\" is not supported`);\n return expressions;\n }\n /** @type {?} */\n const fromState = match[1];\n /** @type {?} */\n const separator = match[2];\n /** @type {?} */\n const toState = match[3];\n expressions.push(makeLambdaFromStates(fromState, toState));\n /** @type {?} */\n const isFullAnyStateExpr = fromState == ANY_STATE && toState == ANY_STATE;\n if (separator[0] == '<' && !isFullAnyStateExpr) {\n expressions.push(makeLambdaFromStates(toState, fromState));\n }\n}\n/**\n * @param {?} alias\n * @param {?} errors\n * @return {?}\n */\nfunction parseAnimationAlias(alias, errors) {\n switch (alias) {\n case ':enter':\n return 'void => *';\n case ':leave':\n return '* => void';\n case ':increment':\n return (/**\n * @param {?} fromState\n * @param {?} toState\n * @return {?}\n */\n (fromState, toState) => parseFloat(toState) > parseFloat(fromState));\n case ':decrement':\n return (/**\n * @param {?} fromState\n * @param {?} toState\n * @return {?}\n */\n (fromState, toState) => parseFloat(toState) < parseFloat(fromState));\n default:\n errors.push(`The transition alias value \"${alias}\" is not supported`);\n return '* => *';\n }\n}\n// DO NOT REFACTOR ... keep the follow set instantiations\n// with the values intact (closure compiler for some reason\n// removes follow-up lines that add the values outside of\n// the constructor...\n/** @type {?} */\nconst TRUE_BOOLEAN_VALUES = new Set(['true', '1']);\n/** @type {?} */\nconst FALSE_BOOLEAN_VALUES = new Set(['false', '0']);\n/**\n * @param {?} lhs\n * @param {?} rhs\n * @return {?}\n */\nfunction makeLambdaFromStates(lhs, rhs) {\n /** @type {?} */\n const LHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(lhs) || FALSE_BOOLEAN_VALUES.has(lhs);\n /** @type {?} */\n const RHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(rhs) || FALSE_BOOLEAN_VALUES.has(rhs);\n return (/**\n * @param {?} fromState\n * @param {?} toState\n * @return {?}\n */\n (fromState, toState) => {\n /** @type {?} */\n let lhsMatch = lhs == ANY_STATE || lhs == fromState;\n /** @type {?} */\n let rhsMatch = rhs == ANY_STATE || rhs == toState;\n if (!lhsMatch && LHS_MATCH_BOOLEAN && typeof fromState === 'boolean') {\n lhsMatch = fromState ? TRUE_BOOLEAN_VALUES.has(lhs) : FALSE_BOOLEAN_VALUES.has(lhs);\n }\n if (!rhsMatch && RHS_MATCH_BOOLEAN && typeof toState === 'boolean') {\n rhsMatch = toState ? TRUE_BOOLEAN_VALUES.has(rhs) : FALSE_BOOLEAN_VALUES.has(rhs);\n }\n return lhsMatch && rhsMatch;\n });\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_ast_builder.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst SELF_TOKEN = ':self';\n/** @type {?} */\nconst SELF_TOKEN_REGEX = new RegExp(`\\s*${SELF_TOKEN}\\s*,?`, 'g');\n/*\n * [Validation]\n * The visitor code below will traverse the animation AST generated by the animation verb functions\n * (the output is a tree of objects) and attempt to perform a series of validations on the data. The\n * following corner-cases will be validated:\n *\n * 1. Overlap of animations\n * Given that a CSS property cannot be animated in more than one place at the same time, it's\n * important that this behavior is detected and validated. The way in which this occurs is that\n * each time a style property is examined, a string-map containing the property will be updated with\n * the start and end times for when the property is used within an animation step.\n *\n * If there are two or more parallel animations that are currently running (these are invoked by the\n * group()) on the same element then the validator will throw an error. Since the start/end timing\n * values are collected for each property then if the current animation step is animating the same\n * property and its timing values fall anywhere into the window of time that the property is\n * currently being animated within then this is what causes an error.\n *\n * 2. Timing values\n * The validator will validate to see if a timing value of `duration delay easing` or\n * `durationNumber` is valid or not.\n *\n * (note that upon validation the code below will replace the timing data with an object containing\n * {duration,delay,easing}.\n *\n * 3. Offset Validation\n * Each of the style() calls are allowed to have an offset value when placed inside of keyframes().\n * Offsets within keyframes() are considered valid when:\n *\n * - No offsets are used at all\n * - Each style() entry contains an offset value\n * - Each offset is between 0 and 1\n * - Each offset is greater to or equal than the previous one\n *\n * Otherwise an error will be thrown.\n */\n/**\n * @param {?} driver\n * @param {?} metadata\n * @param {?} errors\n * @return {?}\n */\nfunction buildAnimationAst(driver, metadata, errors) {\n return new AnimationAstBuilderVisitor(driver).build(metadata, errors);\n}\n/** @type {?} */\nconst ROOT_SELECTOR = '';\nclass AnimationAstBuilderVisitor {\n /**\n * @param {?} _driver\n */\n constructor(_driver) {\n this._driver = _driver;\n }\n /**\n * @param {?} metadata\n * @param {?} errors\n * @return {?}\n */\n build(metadata, errors) {\n /** @type {?} */\n const context = new AnimationAstBuilderContext(errors);\n this._resetContextStyleTimingState(context);\n return (/** @type {?} */ (visitDslNode(this, normalizeAnimationEntry(metadata), context)));\n }\n /**\n * @private\n * @param {?} context\n * @return {?}\n */\n _resetContextStyleTimingState(context) {\n context.currentQuerySelector = ROOT_SELECTOR;\n context.collectedStyles = {};\n context.collectedStyles[ROOT_SELECTOR] = {};\n context.currentTime = 0;\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitTrigger(metadata, context) {\n /** @type {?} */\n let queryCount = context.queryCount = 0;\n /** @type {?} */\n let depCount = context.depCount = 0;\n /** @type {?} */\n const states = [];\n /** @type {?} */\n const transitions = [];\n if (metadata.name.charAt(0) == '@') {\n context.errors.push('animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\\'@foo\\', [...]))');\n }\n metadata.definitions.forEach((/**\n * @param {?} def\n * @return {?}\n */\n def => {\n this._resetContextStyleTimingState(context);\n if (def.type == 0 /* State */) {\n /** @type {?} */\n const stateDef = (/** @type {?} */ (def));\n /** @type {?} */\n const name = stateDef.name;\n name.toString().split(/\\s*,\\s*/).forEach((/**\n * @param {?} n\n * @return {?}\n */\n n => {\n stateDef.name = n;\n states.push(this.visitState(stateDef, context));\n }));\n stateDef.name = name;\n }\n else if (def.type == 1 /* Transition */) {\n /** @type {?} */\n const transition = this.visitTransition((/** @type {?} */ (def)), context);\n queryCount += transition.queryCount;\n depCount += transition.depCount;\n transitions.push(transition);\n }\n else {\n context.errors.push('only state() and transition() definitions can sit inside of a trigger()');\n }\n }));\n return {\n type: 7 /* Trigger */,\n name: metadata.name, states, transitions, queryCount, depCount,\n options: null\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitState(metadata, context) {\n /** @type {?} */\n const styleAst = this.visitStyle(metadata.styles, context);\n /** @type {?} */\n const astParams = (metadata.options && metadata.options.params) || null;\n if (styleAst.containsDynamicStyles) {\n /** @type {?} */\n const missingSubs = new Set();\n /** @type {?} */\n const params = astParams || {};\n styleAst.styles.forEach((/**\n * @param {?} value\n * @return {?}\n */\n value => {\n if (isObject(value)) {\n /** @type {?} */\n const stylesObj = (/** @type {?} */ (value));\n Object.keys(stylesObj).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n extractStyleParams(stylesObj[prop]).forEach((/**\n * @param {?} sub\n * @return {?}\n */\n sub => {\n if (!params.hasOwnProperty(sub)) {\n missingSubs.add(sub);\n }\n }));\n }));\n }\n }));\n if (missingSubs.size) {\n /** @type {?} */\n const missingSubsArr = iteratorToArray(missingSubs.values());\n context.errors.push(`state(\"${metadata.name}\", ...) must define default values for all the following style substitutions: ${missingSubsArr.join(', ')}`);\n }\n }\n return {\n type: 0 /* State */,\n name: metadata.name,\n style: styleAst,\n options: astParams ? { params: astParams } : null\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitTransition(metadata, context) {\n context.queryCount = 0;\n context.depCount = 0;\n /** @type {?} */\n const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);\n /** @type {?} */\n const matchers = parseTransitionExpr(metadata.expr, context.errors);\n return {\n type: 1 /* Transition */,\n matchers,\n animation,\n queryCount: context.queryCount,\n depCount: context.depCount,\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitSequence(metadata, context) {\n return {\n type: 2 /* Sequence */,\n steps: metadata.steps.map((/**\n * @param {?} s\n * @return {?}\n */\n s => visitDslNode(this, s, context))),\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitGroup(metadata, context) {\n /** @type {?} */\n const currentTime = context.currentTime;\n /** @type {?} */\n let furthestTime = 0;\n /** @type {?} */\n const steps = metadata.steps.map((/**\n * @param {?} step\n * @return {?}\n */\n step => {\n context.currentTime = currentTime;\n /** @type {?} */\n const innerAst = visitDslNode(this, step, context);\n furthestTime = Math.max(furthestTime, context.currentTime);\n return innerAst;\n }));\n context.currentTime = furthestTime;\n return {\n type: 3 /* Group */,\n steps,\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitAnimate(metadata, context) {\n /** @type {?} */\n const timingAst = constructTimingAst(metadata.timings, context.errors);\n context.currentAnimateTimings = timingAst;\n /** @type {?} */\n let styleAst;\n /** @type {?} */\n let styleMetadata = metadata.styles ? metadata.styles : style({});\n if (styleMetadata.type == 5 /* Keyframes */) {\n styleAst = this.visitKeyframes((/** @type {?} */ (styleMetadata)), context);\n }\n else {\n /** @type {?} */\n let styleMetadata = (/** @type {?} */ (metadata.styles));\n /** @type {?} */\n let isEmpty = false;\n if (!styleMetadata) {\n isEmpty = true;\n /** @type {?} */\n const newStyleData = {};\n if (timingAst.easing) {\n newStyleData['easing'] = timingAst.easing;\n }\n styleMetadata = style(newStyleData);\n }\n context.currentTime += timingAst.duration + timingAst.delay;\n /** @type {?} */\n const _styleAst = this.visitStyle(styleMetadata, context);\n _styleAst.isEmptyStep = isEmpty;\n styleAst = _styleAst;\n }\n context.currentAnimateTimings = null;\n return {\n type: 4 /* Animate */,\n timings: timingAst,\n style: styleAst,\n options: null\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitStyle(metadata, context) {\n /** @type {?} */\n const ast = this._makeStyleAst(metadata, context);\n this._validateStyleAst(ast, context);\n return ast;\n }\n /**\n * @private\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n _makeStyleAst(metadata, context) {\n /** @type {?} */\n const styles = [];\n if (Array.isArray(metadata.styles)) {\n ((/** @type {?} */ (metadata.styles))).forEach((/**\n * @param {?} styleTuple\n * @return {?}\n */\n styleTuple => {\n if (typeof styleTuple == 'string') {\n if (styleTuple == AUTO_STYLE) {\n styles.push(styleTuple);\n }\n else {\n context.errors.push(`The provided style string value ${styleTuple} is not allowed.`);\n }\n }\n else {\n styles.push(styleTuple);\n }\n }));\n }\n else {\n styles.push(metadata.styles);\n }\n /** @type {?} */\n let containsDynamicStyles = false;\n /** @type {?} */\n let collectedEasing = null;\n styles.forEach((/**\n * @param {?} styleData\n * @return {?}\n */\n styleData => {\n if (isObject(styleData)) {\n /** @type {?} */\n const styleMap = (/** @type {?} */ (styleData));\n /** @type {?} */\n const easing = styleMap['easing'];\n if (easing) {\n collectedEasing = (/** @type {?} */ (easing));\n delete styleMap['easing'];\n }\n if (!containsDynamicStyles) {\n for (let prop in styleMap) {\n /** @type {?} */\n const value = styleMap[prop];\n if (value.toString().indexOf(SUBSTITUTION_EXPR_START) >= 0) {\n containsDynamicStyles = true;\n break;\n }\n }\n }\n }\n }));\n return {\n type: 6 /* Style */,\n styles,\n easing: collectedEasing,\n offset: metadata.offset, containsDynamicStyles,\n options: null\n };\n }\n /**\n * @private\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _validateStyleAst(ast, context) {\n /** @type {?} */\n const timings = context.currentAnimateTimings;\n /** @type {?} */\n let endTime = context.currentTime;\n /** @type {?} */\n let startTime = context.currentTime;\n if (timings && startTime > 0) {\n startTime -= timings.duration + timings.delay;\n }\n ast.styles.forEach((/**\n * @param {?} tuple\n * @return {?}\n */\n tuple => {\n if (typeof tuple == 'string')\n return;\n Object.keys(tuple).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (!this._driver.validateStyleProperty(prop)) {\n context.errors.push(`The provided animation property \"${prop}\" is not a supported CSS property for animations`);\n return;\n }\n /** @type {?} */\n const collectedStyles = context.collectedStyles[(/** @type {?} */ (context.currentQuerySelector))];\n /** @type {?} */\n const collectedEntry = collectedStyles[prop];\n /** @type {?} */\n let updateCollectedStyle = true;\n if (collectedEntry) {\n if (startTime != endTime && startTime >= collectedEntry.startTime &&\n endTime <= collectedEntry.endTime) {\n context.errors.push(`The CSS property \"${prop}\" that exists between the times of \"${collectedEntry.startTime}ms\" and \"${collectedEntry.endTime}ms\" is also being animated in a parallel animation between the times of \"${startTime}ms\" and \"${endTime}ms\"`);\n updateCollectedStyle = false;\n }\n // we always choose the smaller start time value since we\n // want to have a record of the entire animation window where\n // the style property is being animated in between\n startTime = collectedEntry.startTime;\n }\n if (updateCollectedStyle) {\n collectedStyles[prop] = { startTime, endTime };\n }\n if (context.options) {\n validateStyleParams(tuple[prop], context.options, context.errors);\n }\n }));\n }));\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitKeyframes(metadata, context) {\n /** @type {?} */\n const ast = { type: 5 /* Keyframes */, styles: [], options: null };\n if (!context.currentAnimateTimings) {\n context.errors.push(`keyframes() must be placed inside of a call to animate()`);\n return ast;\n }\n /** @type {?} */\n const MAX_KEYFRAME_OFFSET = 1;\n /** @type {?} */\n let totalKeyframesWithOffsets = 0;\n /** @type {?} */\n const offsets = [];\n /** @type {?} */\n let offsetsOutOfOrder = false;\n /** @type {?} */\n let keyframesOutOfRange = false;\n /** @type {?} */\n let previousOffset = 0;\n /** @type {?} */\n const keyframes = metadata.steps.map((/**\n * @param {?} styles\n * @return {?}\n */\n styles => {\n /** @type {?} */\n const style = this._makeStyleAst(styles, context);\n /** @type {?} */\n let offsetVal = style.offset != null ? style.offset : consumeOffset(style.styles);\n /** @type {?} */\n let offset = 0;\n if (offsetVal != null) {\n totalKeyframesWithOffsets++;\n offset = style.offset = offsetVal;\n }\n keyframesOutOfRange = keyframesOutOfRange || offset < 0 || offset > 1;\n offsetsOutOfOrder = offsetsOutOfOrder || offset < previousOffset;\n previousOffset = offset;\n offsets.push(offset);\n return style;\n }));\n if (keyframesOutOfRange) {\n context.errors.push(`Please ensure that all keyframe offsets are between 0 and 1`);\n }\n if (offsetsOutOfOrder) {\n context.errors.push(`Please ensure that all keyframe offsets are in order`);\n }\n /** @type {?} */\n const length = metadata.steps.length;\n /** @type {?} */\n let generatedOffset = 0;\n if (totalKeyframesWithOffsets > 0 && totalKeyframesWithOffsets < length) {\n context.errors.push(`Not all style() steps within the declared keyframes() contain offsets`);\n }\n else if (totalKeyframesWithOffsets == 0) {\n generatedOffset = MAX_KEYFRAME_OFFSET / (length - 1);\n }\n /** @type {?} */\n const limit = length - 1;\n /** @type {?} */\n const currentTime = context.currentTime;\n /** @type {?} */\n const currentAnimateTimings = (/** @type {?} */ (context.currentAnimateTimings));\n /** @type {?} */\n const animateDuration = currentAnimateTimings.duration;\n keyframes.forEach((/**\n * @param {?} kf\n * @param {?} i\n * @return {?}\n */\n (kf, i) => {\n /** @type {?} */\n const offset = generatedOffset > 0 ? (i == limit ? 1 : (generatedOffset * i)) : offsets[i];\n /** @type {?} */\n const durationUpToThisFrame = offset * animateDuration;\n context.currentTime = currentTime + currentAnimateTimings.delay + durationUpToThisFrame;\n currentAnimateTimings.duration = durationUpToThisFrame;\n this._validateStyleAst(kf, context);\n kf.offset = offset;\n ast.styles.push(kf);\n }));\n return ast;\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitReference(metadata, context) {\n return {\n type: 8 /* Reference */,\n animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context),\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitAnimateChild(metadata, context) {\n context.depCount++;\n return {\n type: 9 /* AnimateChild */,\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitAnimateRef(metadata, context) {\n return {\n type: 10 /* AnimateRef */,\n animation: this.visitReference(metadata.animation, context),\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitQuery(metadata, context) {\n /** @type {?} */\n const parentSelector = (/** @type {?} */ (context.currentQuerySelector));\n /** @type {?} */\n const options = (/** @type {?} */ ((metadata.options || {})));\n context.queryCount++;\n context.currentQuery = metadata;\n const [selector, includeSelf] = normalizeSelector(metadata.selector);\n context.currentQuerySelector =\n parentSelector.length ? (parentSelector + ' ' + selector) : selector;\n getOrSetAsInMap(context.collectedStyles, context.currentQuerySelector, {});\n /** @type {?} */\n const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);\n context.currentQuery = null;\n context.currentQuerySelector = parentSelector;\n return {\n type: 11 /* Query */,\n selector,\n limit: options.limit || 0,\n optional: !!options.optional, includeSelf, animation,\n originalSelector: metadata.selector,\n options: normalizeAnimationOptions(metadata.options)\n };\n }\n /**\n * @param {?} metadata\n * @param {?} context\n * @return {?}\n */\n visitStagger(metadata, context) {\n if (!context.currentQuery) {\n context.errors.push(`stagger() can only be used inside of query()`);\n }\n /** @type {?} */\n const timings = metadata.timings === 'full' ?\n { duration: 0, delay: 0, easing: 'full' } :\n resolveTiming(metadata.timings, context.errors, true);\n return {\n type: 12 /* Stagger */,\n animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context), timings,\n options: null\n };\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n AnimationAstBuilderVisitor.prototype._driver;\n}\n/**\n * @param {?} selector\n * @return {?}\n */\nfunction normalizeSelector(selector) {\n /** @type {?} */\n const hasAmpersand = selector.split(/\\s*,\\s*/).find((/**\n * @param {?} token\n * @return {?}\n */\n token => token == SELF_TOKEN)) ? true : false;\n if (hasAmpersand) {\n selector = selector.replace(SELF_TOKEN_REGEX, '');\n }\n // the :enter and :leave selectors are filled in at runtime during timeline building\n selector = selector.replace(/@\\*/g, NG_TRIGGER_SELECTOR)\n .replace(/@\\w+/g, (/**\n * @param {?} match\n * @return {?}\n */\n match => NG_TRIGGER_SELECTOR + '-' + match.substr(1)))\n .replace(/:animating/g, NG_ANIMATING_SELECTOR);\n return [selector, hasAmpersand];\n}\n/**\n * @param {?} obj\n * @return {?}\n */\nfunction normalizeParams(obj) {\n return obj ? copyObj(obj) : null;\n}\nclass AnimationAstBuilderContext {\n /**\n * @param {?} errors\n */\n constructor(errors) {\n this.errors = errors;\n this.queryCount = 0;\n this.depCount = 0;\n this.currentTransition = null;\n this.currentQuery = null;\n this.currentQuerySelector = null;\n this.currentAnimateTimings = null;\n this.currentTime = 0;\n this.collectedStyles = {};\n this.options = null;\n }\n}\nif (false) {\n /** @type {?} */\n AnimationAstBuilderContext.prototype.queryCount;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.depCount;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.currentTransition;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.currentQuery;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.currentQuerySelector;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.currentAnimateTimings;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.currentTime;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.collectedStyles;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.options;\n /** @type {?} */\n AnimationAstBuilderContext.prototype.errors;\n}\n/**\n * @param {?} styles\n * @return {?}\n */\nfunction consumeOffset(styles) {\n if (typeof styles == 'string')\n return null;\n /** @type {?} */\n let offset = null;\n if (Array.isArray(styles)) {\n styles.forEach((/**\n * @param {?} styleTuple\n * @return {?}\n */\n styleTuple => {\n if (isObject(styleTuple) && styleTuple.hasOwnProperty('offset')) {\n /** @type {?} */\n const obj = (/** @type {?} */ (styleTuple));\n offset = parseFloat((/** @type {?} */ (obj['offset'])));\n delete obj['offset'];\n }\n }));\n }\n else if (isObject(styles) && styles.hasOwnProperty('offset')) {\n /** @type {?} */\n const obj = styles;\n offset = parseFloat((/** @type {?} */ (obj['offset'])));\n delete obj['offset'];\n }\n return offset;\n}\n/**\n * @param {?} value\n * @return {?}\n */\nfunction isObject(value) {\n return !Array.isArray(value) && typeof value == 'object';\n}\n/**\n * @param {?} value\n * @param {?} errors\n * @return {?}\n */\nfunction constructTimingAst(value, errors) {\n /** @type {?} */\n let timings = null;\n if (value.hasOwnProperty('duration')) {\n timings = (/** @type {?} */ (value));\n }\n else if (typeof value == 'number') {\n /** @type {?} */\n const duration = resolveTiming(value, errors).duration;\n return makeTimingAst(duration, 0, '');\n }\n /** @type {?} */\n const strValue = (/** @type {?} */ (value));\n /** @type {?} */\n const isDynamic = strValue.split(/\\s+/).some((/**\n * @param {?} v\n * @return {?}\n */\n v => v.charAt(0) == '{' && v.charAt(1) == '{'));\n if (isDynamic) {\n /** @type {?} */\n const ast = (/** @type {?} */ (makeTimingAst(0, 0, '')));\n ast.dynamic = true;\n ast.strValue = strValue;\n return (/** @type {?} */ (ast));\n }\n timings = timings || resolveTiming(strValue, errors);\n return makeTimingAst(timings.duration, timings.delay, timings.easing);\n}\n/**\n * @param {?} options\n * @return {?}\n */\nfunction normalizeAnimationOptions(options) {\n if (options) {\n options = copyObj(options);\n if (options['params']) {\n options['params'] = (/** @type {?} */ (normalizeParams(options['params'])));\n }\n }\n else {\n options = {};\n }\n return options;\n}\n/**\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @return {?}\n */\nfunction makeTimingAst(duration, delay, easing) {\n return { duration, delay, easing };\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_timeline_instruction.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @record\n */\nfunction AnimationTimelineInstruction() { }\nif (false) {\n /** @type {?} */\n AnimationTimelineInstruction.prototype.element;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.keyframes;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.preStyleProps;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.postStyleProps;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.duration;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.delay;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.totalTime;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.easing;\n /** @type {?|undefined} */\n AnimationTimelineInstruction.prototype.stretchStartingKeyframe;\n /** @type {?} */\n AnimationTimelineInstruction.prototype.subTimeline;\n}\n/**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} preStyleProps\n * @param {?} postStyleProps\n * @param {?} duration\n * @param {?} delay\n * @param {?=} easing\n * @param {?=} subTimeline\n * @return {?}\n */\nfunction createTimelineInstruction(element, keyframes, preStyleProps, postStyleProps, duration, delay, easing = null, subTimeline = false) {\n return {\n type: 1 /* TimelineAnimation */,\n element,\n keyframes,\n preStyleProps,\n postStyleProps,\n duration,\n delay,\n totalTime: duration + delay, easing, subTimeline\n };\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/element_instruction_map.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass ElementInstructionMap {\n constructor() {\n this._map = new Map();\n }\n /**\n * @param {?} element\n * @return {?}\n */\n consume(element) {\n /** @type {?} */\n let instructions = this._map.get(element);\n if (instructions) {\n this._map.delete(element);\n }\n else {\n instructions = [];\n }\n return instructions;\n }\n /**\n * @param {?} element\n * @param {?} instructions\n * @return {?}\n */\n append(element, instructions) {\n /** @type {?} */\n let existingInstructions = this._map.get(element);\n if (!existingInstructions) {\n this._map.set(element, existingInstructions = []);\n }\n existingInstructions.push(...instructions);\n }\n /**\n * @param {?} element\n * @return {?}\n */\n has(element) { return this._map.has(element); }\n /**\n * @return {?}\n */\n clear() { this._map.clear(); }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n ElementInstructionMap.prototype._map;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_timeline_builder.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst ONE_FRAME_IN_MILLISECONDS = 1;\n/** @type {?} */\nconst ENTER_TOKEN = ':enter';\n/** @type {?} */\nconst ENTER_TOKEN_REGEX = new RegExp(ENTER_TOKEN, 'g');\n/** @type {?} */\nconst LEAVE_TOKEN = ':leave';\n/** @type {?} */\nconst LEAVE_TOKEN_REGEX = new RegExp(LEAVE_TOKEN, 'g');\n/*\n * The code within this file aims to generate web-animations-compatible keyframes from Angular's\n * animation DSL code.\n *\n * The code below will be converted from:\n *\n * ```\n * sequence([\n * style({ opacity: 0 }),\n * animate(1000, style({ opacity: 0 }))\n * ])\n * ```\n *\n * To:\n * ```\n * keyframes = [{ opacity: 0, offset: 0 }, { opacity: 1, offset: 1 }]\n * duration = 1000\n * delay = 0\n * easing = ''\n * ```\n *\n * For this operation to cover the combination of animation verbs (style, animate, group, etc...) a\n * combination of prototypical inheritance, AST traversal and merge-sort-like algorithms are used.\n *\n * [AST Traversal]\n * Each of the animation verbs, when executed, will return an string-map object representing what\n * type of action it is (style, animate, group, etc...) and the data associated with it. This means\n * that when functional composition mix of these functions is evaluated (like in the example above)\n * then it will end up producing a tree of objects representing the animation itself.\n *\n * When this animation object tree is processed by the visitor code below it will visit each of the\n * verb statements within the visitor. And during each visit it will build the context of the\n * animation keyframes by interacting with the `TimelineBuilder`.\n *\n * [TimelineBuilder]\n * This class is responsible for tracking the styles and building a series of keyframe objects for a\n * timeline between a start and end time. The builder starts off with an initial timeline and each\n * time the AST comes across a `group()`, `keyframes()` or a combination of the two wihtin a\n * `sequence()` then it will generate a sub timeline for each step as well as a new one after\n * they are complete.\n *\n * As the AST is traversed, the timing state on each of the timelines will be incremented. If a sub\n * timeline was created (based on one of the cases above) then the parent timeline will attempt to\n * merge the styles used within the sub timelines into itself (only with group() this will happen).\n * This happens with a merge operation (much like how the merge works in mergesort) and it will only\n * copy the most recently used styles from the sub timelines into the parent timeline. This ensures\n * that if the styles are used later on in another phase of the animation then they will be the most\n * up-to-date values.\n *\n * [How Missing Styles Are Updated]\n * Each timeline has a `backFill` property which is responsible for filling in new styles into\n * already processed keyframes if a new style shows up later within the animation sequence.\n *\n * ```\n * sequence([\n * style({ width: 0 }),\n * animate(1000, style({ width: 100 })),\n * animate(1000, style({ width: 200 })),\n * animate(1000, style({ width: 300 }))\n * animate(1000, style({ width: 400, height: 400 })) // notice how `height` doesn't exist anywhere\n * else\n * ])\n * ```\n *\n * What is happening here is that the `height` value is added later in the sequence, but is missing\n * from all previous animation steps. Therefore when a keyframe is created it would also be missing\n * from all previous keyframes up until where it is first used. For the timeline keyframe generation\n * to properly fill in the style it will place the previous value (the value from the parent\n * timeline) or a default value of `*` into the backFill object. Given that each of the keyframe\n * styles are objects that prototypically inhert from the backFill object, this means that if a\n * value is added into the backFill then it will automatically propagate any missing values to all\n * keyframes. Therefore the missing `height` value will be properly filled into the already\n * processed keyframes.\n *\n * When a sub-timeline is created it will have its own backFill property. This is done so that\n * styles present within the sub-timeline do not accidentally seep into the previous/future timeline\n * keyframes\n *\n * (For prototypically-inherited contents to be detected a `for(i in obj)` loop must be used.)\n *\n * [Validation]\n * The code in this file is not responsible for validation. That functionality happens with within\n * the `AnimationValidatorVisitor` code.\n */\n/**\n * @param {?} driver\n * @param {?} rootElement\n * @param {?} ast\n * @param {?} enterClassName\n * @param {?} leaveClassName\n * @param {?=} startingStyles\n * @param {?=} finalStyles\n * @param {?=} options\n * @param {?=} subInstructions\n * @param {?=} errors\n * @return {?}\n */\nfunction buildAnimationTimelines(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles = {}, finalStyles = {}, options, subInstructions, errors = []) {\n return new AnimationTimelineBuilderVisitor().buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors);\n}\nclass AnimationTimelineBuilderVisitor {\n /**\n * @param {?} driver\n * @param {?} rootElement\n * @param {?} ast\n * @param {?} enterClassName\n * @param {?} leaveClassName\n * @param {?} startingStyles\n * @param {?} finalStyles\n * @param {?} options\n * @param {?=} subInstructions\n * @param {?=} errors\n * @return {?}\n */\n buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors = []) {\n subInstructions = subInstructions || new ElementInstructionMap();\n /** @type {?} */\n const context = new AnimationTimelineContext(driver, rootElement, subInstructions, enterClassName, leaveClassName, errors, []);\n context.options = options;\n context.currentTimeline.setStyles([startingStyles], null, context.errors, options);\n visitDslNode(this, ast, context);\n // this checks to see if an actual animation happened\n /** @type {?} */\n const timelines = context.timelines.filter((/**\n * @param {?} timeline\n * @return {?}\n */\n timeline => timeline.containsAnimation()));\n if (timelines.length && Object.keys(finalStyles).length) {\n /** @type {?} */\n const tl = timelines[timelines.length - 1];\n if (!tl.allowOnlyTimelineStyles()) {\n tl.setStyles([finalStyles], null, context.errors, options);\n }\n }\n return timelines.length ? timelines.map((/**\n * @param {?} timeline\n * @return {?}\n */\n timeline => timeline.buildKeyframes())) :\n [createTimelineInstruction(rootElement, [], [], [], 0, 0, '', false)];\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitTrigger(ast, context) {\n // these values are not visited in this AST\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitState(ast, context) {\n // these values are not visited in this AST\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitTransition(ast, context) {\n // these values are not visited in this AST\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitAnimateChild(ast, context) {\n /** @type {?} */\n const elementInstructions = context.subInstructions.consume(context.element);\n if (elementInstructions) {\n /** @type {?} */\n const innerContext = context.createSubContext(ast.options);\n /** @type {?} */\n const startTime = context.currentTimeline.currentTime;\n /** @type {?} */\n const endTime = this._visitSubInstructions(elementInstructions, innerContext, (/** @type {?} */ (innerContext.options)));\n if (startTime != endTime) {\n // we do this on the upper context because we created a sub context for\n // the sub child animations\n context.transformIntoNewTimeline(endTime);\n }\n }\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitAnimateRef(ast, context) {\n /** @type {?} */\n const innerContext = context.createSubContext(ast.options);\n innerContext.transformIntoNewTimeline();\n this.visitReference(ast.animation, innerContext);\n context.transformIntoNewTimeline(innerContext.currentTimeline.currentTime);\n context.previousNode = ast;\n }\n /**\n * @private\n * @param {?} instructions\n * @param {?} context\n * @param {?} options\n * @return {?}\n */\n _visitSubInstructions(instructions, context, options) {\n /** @type {?} */\n const startTime = context.currentTimeline.currentTime;\n /** @type {?} */\n let furthestTime = startTime;\n // this is a special-case for when a user wants to skip a sub\n // animation from being fired entirely.\n /** @type {?} */\n const duration = options.duration != null ? resolveTimingValue(options.duration) : null;\n /** @type {?} */\n const delay = options.delay != null ? resolveTimingValue(options.delay) : null;\n if (duration !== 0) {\n instructions.forEach((/**\n * @param {?} instruction\n * @return {?}\n */\n instruction => {\n /** @type {?} */\n const instructionTimings = context.appendInstructionToTimeline(instruction, duration, delay);\n furthestTime =\n Math.max(furthestTime, instructionTimings.duration + instructionTimings.delay);\n }));\n }\n return furthestTime;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitReference(ast, context) {\n context.updateOptions(ast.options, true);\n visitDslNode(this, ast.animation, context);\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitSequence(ast, context) {\n /** @type {?} */\n const subContextCount = context.subContextCount;\n /** @type {?} */\n let ctx = context;\n /** @type {?} */\n const options = ast.options;\n if (options && (options.params || options.delay)) {\n ctx = context.createSubContext(options);\n ctx.transformIntoNewTimeline();\n if (options.delay != null) {\n if (ctx.previousNode.type == 6 /* Style */) {\n ctx.currentTimeline.snapshotCurrentStyles();\n ctx.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;\n }\n /** @type {?} */\n const delay = resolveTimingValue(options.delay);\n ctx.delayNextStep(delay);\n }\n }\n if (ast.steps.length) {\n ast.steps.forEach((/**\n * @param {?} s\n * @return {?}\n */\n s => visitDslNode(this, s, ctx)));\n // this is here just incase the inner steps only contain or end with a style() call\n ctx.currentTimeline.applyStylesToKeyframe();\n // this means that some animation function within the sequence\n // ended up creating a sub timeline (which means the current\n // timeline cannot overlap with the contents of the sequence)\n if (ctx.subContextCount > subContextCount) {\n ctx.transformIntoNewTimeline();\n }\n }\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitGroup(ast, context) {\n /** @type {?} */\n const innerTimelines = [];\n /** @type {?} */\n let furthestTime = context.currentTimeline.currentTime;\n /** @type {?} */\n const delay = ast.options && ast.options.delay ? resolveTimingValue(ast.options.delay) : 0;\n ast.steps.forEach((/**\n * @param {?} s\n * @return {?}\n */\n s => {\n /** @type {?} */\n const innerContext = context.createSubContext(ast.options);\n if (delay) {\n innerContext.delayNextStep(delay);\n }\n visitDslNode(this, s, innerContext);\n furthestTime = Math.max(furthestTime, innerContext.currentTimeline.currentTime);\n innerTimelines.push(innerContext.currentTimeline);\n }));\n // this operation is run after the AST loop because otherwise\n // if the parent timeline's collected styles were updated then\n // it would pass in invalid data into the new-to-be forked items\n innerTimelines.forEach((/**\n * @param {?} timeline\n * @return {?}\n */\n timeline => context.currentTimeline.mergeTimelineCollectedStyles(timeline)));\n context.transformIntoNewTimeline(furthestTime);\n context.previousNode = ast;\n }\n /**\n * @private\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _visitTiming(ast, context) {\n if (((/** @type {?} */ (ast))).dynamic) {\n /** @type {?} */\n const strValue = ((/** @type {?} */ (ast))).strValue;\n /** @type {?} */\n const timingValue = context.params ? interpolateParams(strValue, context.params, context.errors) : strValue;\n return resolveTiming(timingValue, context.errors);\n }\n else {\n return { duration: ast.duration, delay: ast.delay, easing: ast.easing };\n }\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitAnimate(ast, context) {\n /** @type {?} */\n const timings = context.currentAnimateTimings = this._visitTiming(ast.timings, context);\n /** @type {?} */\n const timeline = context.currentTimeline;\n if (timings.delay) {\n context.incrementTime(timings.delay);\n timeline.snapshotCurrentStyles();\n }\n /** @type {?} */\n const style = ast.style;\n if (style.type == 5 /* Keyframes */) {\n this.visitKeyframes(style, context);\n }\n else {\n context.incrementTime(timings.duration);\n this.visitStyle((/** @type {?} */ (style)), context);\n timeline.applyStylesToKeyframe();\n }\n context.currentAnimateTimings = null;\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitStyle(ast, context) {\n /** @type {?} */\n const timeline = context.currentTimeline;\n /** @type {?} */\n const timings = (/** @type {?} */ (context.currentAnimateTimings));\n // this is a special case for when a style() call\n // directly follows an animate() call (but not inside of an animate() call)\n if (!timings && timeline.getCurrentStyleProperties().length) {\n timeline.forwardFrame();\n }\n /** @type {?} */\n const easing = (timings && timings.easing) || ast.easing;\n if (ast.isEmptyStep) {\n timeline.applyEmptyStep(easing);\n }\n else {\n timeline.setStyles(ast.styles, easing, context.errors, context.options);\n }\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitKeyframes(ast, context) {\n /** @type {?} */\n const currentAnimateTimings = (/** @type {?} */ (context.currentAnimateTimings));\n /** @type {?} */\n const startTime = ((/** @type {?} */ (context.currentTimeline))).duration;\n /** @type {?} */\n const duration = currentAnimateTimings.duration;\n /** @type {?} */\n const innerContext = context.createSubContext();\n /** @type {?} */\n const innerTimeline = innerContext.currentTimeline;\n innerTimeline.easing = currentAnimateTimings.easing;\n ast.styles.forEach((/**\n * @param {?} step\n * @return {?}\n */\n step => {\n /** @type {?} */\n const offset = step.offset || 0;\n innerTimeline.forwardTime(offset * duration);\n innerTimeline.setStyles(step.styles, step.easing, context.errors, context.options);\n innerTimeline.applyStylesToKeyframe();\n }));\n // this will ensure that the parent timeline gets all the styles from\n // the child even if the new timeline below is not used\n context.currentTimeline.mergeTimelineCollectedStyles(innerTimeline);\n // we do this because the window between this timeline and the sub timeline\n // should ensure that the styles within are exactly the same as they were before\n context.transformIntoNewTimeline(startTime + duration);\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitQuery(ast, context) {\n // in the event that the first step before this is a style step we need\n // to ensure the styles are applied before the children are animated\n /** @type {?} */\n const startTime = context.currentTimeline.currentTime;\n /** @type {?} */\n const options = (/** @type {?} */ ((ast.options || {})));\n /** @type {?} */\n const delay = options.delay ? resolveTimingValue(options.delay) : 0;\n if (delay && (context.previousNode.type === 6 /* Style */ ||\n (startTime == 0 && context.currentTimeline.getCurrentStyleProperties().length))) {\n context.currentTimeline.snapshotCurrentStyles();\n context.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;\n }\n /** @type {?} */\n let furthestTime = startTime;\n /** @type {?} */\n const elms = context.invokeQuery(ast.selector, ast.originalSelector, ast.limit, ast.includeSelf, options.optional ? true : false, context.errors);\n context.currentQueryTotal = elms.length;\n /** @type {?} */\n let sameElementTimeline = null;\n elms.forEach((/**\n * @param {?} element\n * @param {?} i\n * @return {?}\n */\n (element, i) => {\n context.currentQueryIndex = i;\n /** @type {?} */\n const innerContext = context.createSubContext(ast.options, element);\n if (delay) {\n innerContext.delayNextStep(delay);\n }\n if (element === context.element) {\n sameElementTimeline = innerContext.currentTimeline;\n }\n visitDslNode(this, ast.animation, innerContext);\n // this is here just incase the inner steps only contain or end\n // with a style() call (which is here to signal that this is a preparatory\n // call to style an element before it is animated again)\n innerContext.currentTimeline.applyStylesToKeyframe();\n /** @type {?} */\n const endTime = innerContext.currentTimeline.currentTime;\n furthestTime = Math.max(furthestTime, endTime);\n }));\n context.currentQueryIndex = 0;\n context.currentQueryTotal = 0;\n context.transformIntoNewTimeline(furthestTime);\n if (sameElementTimeline) {\n context.currentTimeline.mergeTimelineCollectedStyles(sameElementTimeline);\n context.currentTimeline.snapshotCurrentStyles();\n }\n context.previousNode = ast;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n visitStagger(ast, context) {\n /** @type {?} */\n const parentContext = (/** @type {?} */ (context.parentContext));\n /** @type {?} */\n const tl = context.currentTimeline;\n /** @type {?} */\n const timings = ast.timings;\n /** @type {?} */\n const duration = Math.abs(timings.duration);\n /** @type {?} */\n const maxTime = duration * (context.currentQueryTotal - 1);\n /** @type {?} */\n let delay = duration * context.currentQueryIndex;\n /** @type {?} */\n let staggerTransformer = timings.duration < 0 ? 'reverse' : timings.easing;\n switch (staggerTransformer) {\n case 'reverse':\n delay = maxTime - delay;\n break;\n case 'full':\n delay = parentContext.currentStaggerTime;\n break;\n }\n /** @type {?} */\n const timeline = context.currentTimeline;\n if (delay) {\n timeline.delayNextStep(delay);\n }\n /** @type {?} */\n const startingTime = timeline.currentTime;\n visitDslNode(this, ast.animation, context);\n context.previousNode = ast;\n // time = duration + delay\n // the reason why this computation is so complex is because\n // the inner timeline may either have a delay value or a stretched\n // keyframe depending on if a subtimeline is not used or is used.\n parentContext.currentStaggerTime =\n (tl.currentTime - startingTime) + (tl.startTime - parentContext.currentTimeline.startTime);\n }\n}\n/** @type {?} */\nconst DEFAULT_NOOP_PREVIOUS_NODE = (/** @type {?} */ ({}));\nclass AnimationTimelineContext {\n /**\n * @param {?} _driver\n * @param {?} element\n * @param {?} subInstructions\n * @param {?} _enterClassName\n * @param {?} _leaveClassName\n * @param {?} errors\n * @param {?} timelines\n * @param {?=} initialTimeline\n */\n constructor(_driver, element, subInstructions, _enterClassName, _leaveClassName, errors, timelines, initialTimeline) {\n this._driver = _driver;\n this.element = element;\n this.subInstructions = subInstructions;\n this._enterClassName = _enterClassName;\n this._leaveClassName = _leaveClassName;\n this.errors = errors;\n this.timelines = timelines;\n this.parentContext = null;\n this.currentAnimateTimings = null;\n this.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;\n this.subContextCount = 0;\n this.options = {};\n this.currentQueryIndex = 0;\n this.currentQueryTotal = 0;\n this.currentStaggerTime = 0;\n this.currentTimeline = initialTimeline || new TimelineBuilder(this._driver, element, 0);\n timelines.push(this.currentTimeline);\n }\n /**\n * @return {?}\n */\n get params() { return this.options.params; }\n /**\n * @param {?} options\n * @param {?=} skipIfExists\n * @return {?}\n */\n updateOptions(options, skipIfExists) {\n if (!options)\n return;\n /** @type {?} */\n const newOptions = (/** @type {?} */ (options));\n /** @type {?} */\n let optionsToUpdate = this.options;\n // NOTE: this will get patched up when other animation methods support duration overrides\n if (newOptions.duration != null) {\n ((/** @type {?} */ (optionsToUpdate))).duration = resolveTimingValue(newOptions.duration);\n }\n if (newOptions.delay != null) {\n optionsToUpdate.delay = resolveTimingValue(newOptions.delay);\n }\n /** @type {?} */\n const newParams = newOptions.params;\n if (newParams) {\n /** @type {?} */\n let paramsToUpdate = (/** @type {?} */ (optionsToUpdate.params));\n if (!paramsToUpdate) {\n paramsToUpdate = this.options.params = {};\n }\n Object.keys(newParams).forEach((/**\n * @param {?} name\n * @return {?}\n */\n name => {\n if (!skipIfExists || !paramsToUpdate.hasOwnProperty(name)) {\n paramsToUpdate[name] = interpolateParams(newParams[name], paramsToUpdate, this.errors);\n }\n }));\n }\n }\n /**\n * @private\n * @return {?}\n */\n _copyOptions() {\n /** @type {?} */\n const options = {};\n if (this.options) {\n /** @type {?} */\n const oldParams = this.options.params;\n if (oldParams) {\n /** @type {?} */\n const params = options['params'] = {};\n Object.keys(oldParams).forEach((/**\n * @param {?} name\n * @return {?}\n */\n name => { params[name] = oldParams[name]; }));\n }\n }\n return options;\n }\n /**\n * @param {?=} options\n * @param {?=} element\n * @param {?=} newTime\n * @return {?}\n */\n createSubContext(options = null, element, newTime) {\n /** @type {?} */\n const target = element || this.element;\n /** @type {?} */\n const context = new AnimationTimelineContext(this._driver, target, this.subInstructions, this._enterClassName, this._leaveClassName, this.errors, this.timelines, this.currentTimeline.fork(target, newTime || 0));\n context.previousNode = this.previousNode;\n context.currentAnimateTimings = this.currentAnimateTimings;\n context.options = this._copyOptions();\n context.updateOptions(options);\n context.currentQueryIndex = this.currentQueryIndex;\n context.currentQueryTotal = this.currentQueryTotal;\n context.parentContext = this;\n this.subContextCount++;\n return context;\n }\n /**\n * @param {?=} newTime\n * @return {?}\n */\n transformIntoNewTimeline(newTime) {\n this.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;\n this.currentTimeline = this.currentTimeline.fork(this.element, newTime);\n this.timelines.push(this.currentTimeline);\n return this.currentTimeline;\n }\n /**\n * @param {?} instruction\n * @param {?} duration\n * @param {?} delay\n * @return {?}\n */\n appendInstructionToTimeline(instruction, duration, delay) {\n /** @type {?} */\n const updatedTimings = {\n duration: duration != null ? duration : instruction.duration,\n delay: this.currentTimeline.currentTime + (delay != null ? delay : 0) + instruction.delay,\n easing: ''\n };\n /** @type {?} */\n const builder = new SubTimelineBuilder(this._driver, instruction.element, instruction.keyframes, instruction.preStyleProps, instruction.postStyleProps, updatedTimings, instruction.stretchStartingKeyframe);\n this.timelines.push(builder);\n return updatedTimings;\n }\n /**\n * @param {?} time\n * @return {?}\n */\n incrementTime(time) {\n this.currentTimeline.forwardTime(this.currentTimeline.duration + time);\n }\n /**\n * @param {?} delay\n * @return {?}\n */\n delayNextStep(delay) {\n // negative delays are not yet supported\n if (delay > 0) {\n this.currentTimeline.delayNextStep(delay);\n }\n }\n /**\n * @param {?} selector\n * @param {?} originalSelector\n * @param {?} limit\n * @param {?} includeSelf\n * @param {?} optional\n * @param {?} errors\n * @return {?}\n */\n invokeQuery(selector, originalSelector, limit, includeSelf, optional, errors) {\n /** @type {?} */\n let results = [];\n if (includeSelf) {\n results.push(this.element);\n }\n if (selector.length > 0) { // if :self is only used then the selector is empty\n selector = selector.replace(ENTER_TOKEN_REGEX, '.' + this._enterClassName);\n selector = selector.replace(LEAVE_TOKEN_REGEX, '.' + this._leaveClassName);\n /** @type {?} */\n const multi = limit != 1;\n /** @type {?} */\n let elements = this._driver.query(this.element, selector, multi);\n if (limit !== 0) {\n elements = limit < 0 ? elements.slice(elements.length + limit, elements.length) :\n elements.slice(0, limit);\n }\n results.push(...elements);\n }\n if (!optional && results.length == 0) {\n errors.push(`\\`query(\"${originalSelector}\")\\` returned zero elements. (Use \\`query(\"${originalSelector}\", { optional: true })\\` if you wish to allow this.)`);\n }\n return results;\n }\n}\nif (false) {\n /** @type {?} */\n AnimationTimelineContext.prototype.parentContext;\n /** @type {?} */\n AnimationTimelineContext.prototype.currentTimeline;\n /** @type {?} */\n AnimationTimelineContext.prototype.currentAnimateTimings;\n /** @type {?} */\n AnimationTimelineContext.prototype.previousNode;\n /** @type {?} */\n AnimationTimelineContext.prototype.subContextCount;\n /** @type {?} */\n AnimationTimelineContext.prototype.options;\n /** @type {?} */\n AnimationTimelineContext.prototype.currentQueryIndex;\n /** @type {?} */\n AnimationTimelineContext.prototype.currentQueryTotal;\n /** @type {?} */\n AnimationTimelineContext.prototype.currentStaggerTime;\n /**\n * @type {?}\n * @private\n */\n AnimationTimelineContext.prototype._driver;\n /** @type {?} */\n AnimationTimelineContext.prototype.element;\n /** @type {?} */\n AnimationTimelineContext.prototype.subInstructions;\n /**\n * @type {?}\n * @private\n */\n AnimationTimelineContext.prototype._enterClassName;\n /**\n * @type {?}\n * @private\n */\n AnimationTimelineContext.prototype._leaveClassName;\n /** @type {?} */\n AnimationTimelineContext.prototype.errors;\n /** @type {?} */\n AnimationTimelineContext.prototype.timelines;\n}\nclass TimelineBuilder {\n /**\n * @param {?} _driver\n * @param {?} element\n * @param {?} startTime\n * @param {?=} _elementTimelineStylesLookup\n */\n constructor(_driver, element, startTime, _elementTimelineStylesLookup) {\n this._driver = _driver;\n this.element = element;\n this.startTime = startTime;\n this._elementTimelineStylesLookup = _elementTimelineStylesLookup;\n this.duration = 0;\n this._previousKeyframe = {};\n this._currentKeyframe = {};\n this._keyframes = new Map();\n this._styleSummary = {};\n this._pendingStyles = {};\n this._backFill = {};\n this._currentEmptyStepKeyframe = null;\n if (!this._elementTimelineStylesLookup) {\n this._elementTimelineStylesLookup = new Map();\n }\n this._localTimelineStyles = Object.create(this._backFill, {});\n this._globalTimelineStyles = (/** @type {?} */ (this._elementTimelineStylesLookup.get(element)));\n if (!this._globalTimelineStyles) {\n this._globalTimelineStyles = this._localTimelineStyles;\n this._elementTimelineStylesLookup.set(element, this._localTimelineStyles);\n }\n this._loadKeyframe();\n }\n /**\n * @return {?}\n */\n containsAnimation() {\n switch (this._keyframes.size) {\n case 0:\n return false;\n case 1:\n return this.getCurrentStyleProperties().length > 0;\n default:\n return true;\n }\n }\n /**\n * @return {?}\n */\n getCurrentStyleProperties() { return Object.keys(this._currentKeyframe); }\n /**\n * @return {?}\n */\n get currentTime() { return this.startTime + this.duration; }\n /**\n * @param {?} delay\n * @return {?}\n */\n delayNextStep(delay) {\n // in the event that a style() step is placed right before a stagger()\n // and that style() step is the very first style() value in the animation\n // then we need to make a copy of the keyframe [0, copy, 1] so that the delay\n // properly applies the style() values to work with the stagger...\n /** @type {?} */\n const hasPreStyleStep = this._keyframes.size == 1 && Object.keys(this._pendingStyles).length;\n if (this.duration || hasPreStyleStep) {\n this.forwardTime(this.currentTime + delay);\n if (hasPreStyleStep) {\n this.snapshotCurrentStyles();\n }\n }\n else {\n this.startTime += delay;\n }\n }\n /**\n * @param {?} element\n * @param {?=} currentTime\n * @return {?}\n */\n fork(element, currentTime) {\n this.applyStylesToKeyframe();\n return new TimelineBuilder(this._driver, element, currentTime || this.currentTime, this._elementTimelineStylesLookup);\n }\n /**\n * @private\n * @return {?}\n */\n _loadKeyframe() {\n if (this._currentKeyframe) {\n this._previousKeyframe = this._currentKeyframe;\n }\n this._currentKeyframe = (/** @type {?} */ (this._keyframes.get(this.duration)));\n if (!this._currentKeyframe) {\n this._currentKeyframe = Object.create(this._backFill, {});\n this._keyframes.set(this.duration, this._currentKeyframe);\n }\n }\n /**\n * @return {?}\n */\n forwardFrame() {\n this.duration += ONE_FRAME_IN_MILLISECONDS;\n this._loadKeyframe();\n }\n /**\n * @param {?} time\n * @return {?}\n */\n forwardTime(time) {\n this.applyStylesToKeyframe();\n this.duration = time;\n this._loadKeyframe();\n }\n /**\n * @private\n * @param {?} prop\n * @param {?} value\n * @return {?}\n */\n _updateStyle(prop, value) {\n this._localTimelineStyles[prop] = value;\n this._globalTimelineStyles[prop] = value;\n this._styleSummary[prop] = { time: this.currentTime, value };\n }\n /**\n * @return {?}\n */\n allowOnlyTimelineStyles() { return this._currentEmptyStepKeyframe !== this._currentKeyframe; }\n /**\n * @param {?} easing\n * @return {?}\n */\n applyEmptyStep(easing) {\n if (easing) {\n this._previousKeyframe['easing'] = easing;\n }\n // special case for animate(duration):\n // all missing styles are filled with a `*` value then\n // if any destination styles are filled in later on the same\n // keyframe then they will override the overridden styles\n // We use `_globalTimelineStyles` here because there may be\n // styles in previous keyframes that are not present in this timeline\n Object.keys(this._globalTimelineStyles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n this._backFill[prop] = this._globalTimelineStyles[prop] || AUTO_STYLE;\n this._currentKeyframe[prop] = AUTO_STYLE;\n }));\n this._currentEmptyStepKeyframe = this._currentKeyframe;\n }\n /**\n * @param {?} input\n * @param {?} easing\n * @param {?} errors\n * @param {?=} options\n * @return {?}\n */\n setStyles(input, easing, errors, options) {\n if (easing) {\n this._previousKeyframe['easing'] = easing;\n }\n /** @type {?} */\n const params = (options && options.params) || {};\n /** @type {?} */\n const styles = flattenStyles(input, this._globalTimelineStyles);\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const val = interpolateParams(styles[prop], params, errors);\n this._pendingStyles[prop] = val;\n if (!this._localTimelineStyles.hasOwnProperty(prop)) {\n this._backFill[prop] = this._globalTimelineStyles.hasOwnProperty(prop) ?\n this._globalTimelineStyles[prop] :\n AUTO_STYLE;\n }\n this._updateStyle(prop, val);\n }));\n }\n /**\n * @return {?}\n */\n applyStylesToKeyframe() {\n /** @type {?} */\n const styles = this._pendingStyles;\n /** @type {?} */\n const props = Object.keys(styles);\n if (props.length == 0)\n return;\n this._pendingStyles = {};\n props.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const val = styles[prop];\n this._currentKeyframe[prop] = val;\n }));\n Object.keys(this._localTimelineStyles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (!this._currentKeyframe.hasOwnProperty(prop)) {\n this._currentKeyframe[prop] = this._localTimelineStyles[prop];\n }\n }));\n }\n /**\n * @return {?}\n */\n snapshotCurrentStyles() {\n Object.keys(this._localTimelineStyles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const val = this._localTimelineStyles[prop];\n this._pendingStyles[prop] = val;\n this._updateStyle(prop, val);\n }));\n }\n /**\n * @return {?}\n */\n getFinalKeyframe() { return this._keyframes.get(this.duration); }\n /**\n * @return {?}\n */\n get properties() {\n /** @type {?} */\n const properties = [];\n for (let prop in this._currentKeyframe) {\n properties.push(prop);\n }\n return properties;\n }\n /**\n * @param {?} timeline\n * @return {?}\n */\n mergeTimelineCollectedStyles(timeline) {\n Object.keys(timeline._styleSummary).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const details0 = this._styleSummary[prop];\n /** @type {?} */\n const details1 = timeline._styleSummary[prop];\n if (!details0 || details1.time > details0.time) {\n this._updateStyle(prop, details1.value);\n }\n }));\n }\n /**\n * @return {?}\n */\n buildKeyframes() {\n this.applyStylesToKeyframe();\n /** @type {?} */\n const preStyleProps = new Set();\n /** @type {?} */\n const postStyleProps = new Set();\n /** @type {?} */\n const isEmpty = this._keyframes.size === 1 && this.duration === 0;\n /** @type {?} */\n let finalKeyframes = [];\n this._keyframes.forEach((/**\n * @param {?} keyframe\n * @param {?} time\n * @return {?}\n */\n (keyframe, time) => {\n /** @type {?} */\n const finalKeyframe = copyStyles(keyframe, true);\n Object.keys(finalKeyframe).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const value = finalKeyframe[prop];\n if (value == ɵPRE_STYLE) {\n preStyleProps.add(prop);\n }\n else if (value == AUTO_STYLE) {\n postStyleProps.add(prop);\n }\n }));\n if (!isEmpty) {\n finalKeyframe['offset'] = time / this.duration;\n }\n finalKeyframes.push(finalKeyframe);\n }));\n /** @type {?} */\n const preProps = preStyleProps.size ? iteratorToArray(preStyleProps.values()) : [];\n /** @type {?} */\n const postProps = postStyleProps.size ? iteratorToArray(postStyleProps.values()) : [];\n // special case for a 0-second animation (which is designed just to place styles onscreen)\n if (isEmpty) {\n /** @type {?} */\n const kf0 = finalKeyframes[0];\n /** @type {?} */\n const kf1 = copyObj(kf0);\n kf0['offset'] = 0;\n kf1['offset'] = 1;\n finalKeyframes = [kf0, kf1];\n }\n return createTimelineInstruction(this.element, finalKeyframes, preProps, postProps, this.duration, this.startTime, this.easing, false);\n }\n}\nif (false) {\n /** @type {?} */\n TimelineBuilder.prototype.duration;\n /** @type {?} */\n TimelineBuilder.prototype.easing;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._previousKeyframe;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._currentKeyframe;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._keyframes;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._styleSummary;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._localTimelineStyles;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._globalTimelineStyles;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._pendingStyles;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._backFill;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._currentEmptyStepKeyframe;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._driver;\n /** @type {?} */\n TimelineBuilder.prototype.element;\n /** @type {?} */\n TimelineBuilder.prototype.startTime;\n /**\n * @type {?}\n * @private\n */\n TimelineBuilder.prototype._elementTimelineStylesLookup;\n}\nclass SubTimelineBuilder extends TimelineBuilder {\n /**\n * @param {?} driver\n * @param {?} element\n * @param {?} keyframes\n * @param {?} preStyleProps\n * @param {?} postStyleProps\n * @param {?} timings\n * @param {?=} _stretchStartingKeyframe\n */\n constructor(driver, element, keyframes, preStyleProps, postStyleProps, timings, _stretchStartingKeyframe = false) {\n super(driver, element, timings.delay);\n this.element = element;\n this.keyframes = keyframes;\n this.preStyleProps = preStyleProps;\n this.postStyleProps = postStyleProps;\n this._stretchStartingKeyframe = _stretchStartingKeyframe;\n this.timings = { duration: timings.duration, delay: timings.delay, easing: timings.easing };\n }\n /**\n * @return {?}\n */\n containsAnimation() { return this.keyframes.length > 1; }\n /**\n * @return {?}\n */\n buildKeyframes() {\n /** @type {?} */\n let keyframes = this.keyframes;\n let { delay, duration, easing } = this.timings;\n if (this._stretchStartingKeyframe && delay) {\n /** @type {?} */\n const newKeyframes = [];\n /** @type {?} */\n const totalTime = duration + delay;\n /** @type {?} */\n const startingGap = delay / totalTime;\n // the original starting keyframe now starts once the delay is done\n /** @type {?} */\n const newFirstKeyframe = copyStyles(keyframes[0], false);\n newFirstKeyframe['offset'] = 0;\n newKeyframes.push(newFirstKeyframe);\n /** @type {?} */\n const oldFirstKeyframe = copyStyles(keyframes[0], false);\n oldFirstKeyframe['offset'] = roundOffset(startingGap);\n newKeyframes.push(oldFirstKeyframe);\n /*\n When the keyframe is stretched then it means that the delay before the animation\n starts is gone. Instead the first keyframe is placed at the start of the animation\n and it is then copied to where it starts when the original delay is over. This basically\n means nothing animates during that delay, but the styles are still renderered. For this\n to work the original offset values that exist in the original keyframes must be \"warped\"\n so that they can take the new keyframe + delay into account.\n \n delay=1000, duration=1000, keyframes = 0 .5 1\n \n turns into\n \n delay=0, duration=2000, keyframes = 0 .33 .66 1\n */\n // offsets between 1 ... n -1 are all warped by the keyframe stretch\n /** @type {?} */\n const limit = keyframes.length - 1;\n for (let i = 1; i <= limit; i++) {\n /** @type {?} */\n let kf = copyStyles(keyframes[i], false);\n /** @type {?} */\n const oldOffset = (/** @type {?} */ (kf['offset']));\n /** @type {?} */\n const timeAtKeyframe = delay + oldOffset * duration;\n kf['offset'] = roundOffset(timeAtKeyframe / totalTime);\n newKeyframes.push(kf);\n }\n // the new starting keyframe should be added at the start\n duration = totalTime;\n delay = 0;\n easing = '';\n keyframes = newKeyframes;\n }\n return createTimelineInstruction(this.element, keyframes, this.preStyleProps, this.postStyleProps, duration, delay, easing, true);\n }\n}\nif (false) {\n /** @type {?} */\n SubTimelineBuilder.prototype.timings;\n /** @type {?} */\n SubTimelineBuilder.prototype.element;\n /** @type {?} */\n SubTimelineBuilder.prototype.keyframes;\n /** @type {?} */\n SubTimelineBuilder.prototype.preStyleProps;\n /** @type {?} */\n SubTimelineBuilder.prototype.postStyleProps;\n /**\n * @type {?}\n * @private\n */\n SubTimelineBuilder.prototype._stretchStartingKeyframe;\n}\n/**\n * @param {?} offset\n * @param {?=} decimalPoints\n * @return {?}\n */\nfunction roundOffset(offset, decimalPoints = 3) {\n /** @type {?} */\n const mult = Math.pow(10, decimalPoints - 1);\n return Math.round(offset * mult) / mult;\n}\n/**\n * @param {?} input\n * @param {?} allStyles\n * @return {?}\n */\nfunction flattenStyles(input, allStyles) {\n /** @type {?} */\n const styles = {};\n /** @type {?} */\n let allProperties;\n input.forEach((/**\n * @param {?} token\n * @return {?}\n */\n token => {\n if (token === '*') {\n allProperties = allProperties || Object.keys(allStyles);\n allProperties.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => { styles[prop] = AUTO_STYLE; }));\n }\n else {\n copyStyles((/** @type {?} */ (token)), false, styles);\n }\n }));\n return styles;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass Animation {\n /**\n * @param {?} _driver\n * @param {?} input\n */\n constructor(_driver, input) {\n this._driver = _driver;\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const ast = buildAnimationAst(_driver, input, errors);\n if (errors.length) {\n /** @type {?} */\n const errorMessage = `animation validation failed:\\n${errors.join(\"\\n\")}`;\n throw new Error(errorMessage);\n }\n this._animationAst = ast;\n }\n /**\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} destinationStyles\n * @param {?} options\n * @param {?=} subInstructions\n * @return {?}\n */\n buildTimelines(element, startingStyles, destinationStyles, options, subInstructions) {\n /** @type {?} */\n const start = Array.isArray(startingStyles) ? normalizeStyles(startingStyles) :\n (/** @type {?} */ (startingStyles));\n /** @type {?} */\n const dest = Array.isArray(destinationStyles) ? normalizeStyles(destinationStyles) :\n (/** @type {?} */ (destinationStyles));\n /** @type {?} */\n const errors = [];\n subInstructions = subInstructions || new ElementInstructionMap();\n /** @type {?} */\n const result = buildAnimationTimelines(this._driver, element, this._animationAst, ENTER_CLASSNAME, LEAVE_CLASSNAME, start, dest, options, subInstructions, errors);\n if (errors.length) {\n /** @type {?} */\n const errorMessage = `animation building failed:\\n${errors.join(\"\\n\")}`;\n throw new Error(errorMessage);\n }\n return result;\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n Animation.prototype._animationAst;\n /**\n * @type {?}\n * @private\n */\n Animation.prototype._driver;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/style_normalization/animation_style_normalizer.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * \\@publicApi\n * @abstract\n */\nclass AnimationStyleNormalizer {\n}\nif (false) {\n /**\n * @abstract\n * @param {?} propertyName\n * @param {?} errors\n * @return {?}\n */\n AnimationStyleNormalizer.prototype.normalizePropertyName = function (propertyName, errors) { };\n /**\n * @abstract\n * @param {?} userProvidedProperty\n * @param {?} normalizedProperty\n * @param {?} value\n * @param {?} errors\n * @return {?}\n */\n AnimationStyleNormalizer.prototype.normalizeStyleValue = function (userProvidedProperty, normalizedProperty, value, errors) { };\n}\n/**\n * \\@publicApi\n */\nclass NoopAnimationStyleNormalizer {\n /**\n * @param {?} propertyName\n * @param {?} errors\n * @return {?}\n */\n normalizePropertyName(propertyName, errors) { return propertyName; }\n /**\n * @param {?} userProvidedProperty\n * @param {?} normalizedProperty\n * @param {?} value\n * @param {?} errors\n * @return {?}\n */\n normalizeStyleValue(userProvidedProperty, normalizedProperty, value, errors) {\n return (/** @type {?} */ (value));\n }\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/style_normalization/web_animations_style_normalizer.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass WebAnimationsStyleNormalizer extends AnimationStyleNormalizer {\n /**\n * @param {?} propertyName\n * @param {?} errors\n * @return {?}\n */\n normalizePropertyName(propertyName, errors) {\n return dashCaseToCamelCase(propertyName);\n }\n /**\n * @param {?} userProvidedProperty\n * @param {?} normalizedProperty\n * @param {?} value\n * @param {?} errors\n * @return {?}\n */\n normalizeStyleValue(userProvidedProperty, normalizedProperty, value, errors) {\n /** @type {?} */\n let unit = '';\n /** @type {?} */\n const strVal = value.toString().trim();\n if (DIMENSIONAL_PROP_MAP[normalizedProperty] && value !== 0 && value !== '0') {\n if (typeof value === 'number') {\n unit = 'px';\n }\n else {\n /** @type {?} */\n const valAndSuffixMatch = value.match(/^[+-]?[\\d\\.]+([a-z]*)$/);\n if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {\n errors.push(`Please provide a CSS unit value for ${userProvidedProperty}:${value}`);\n }\n }\n }\n return strVal + unit;\n }\n}\nconst ɵ0$1 = /**\n * @return {?}\n */\n() => makeBooleanMap('width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective'\n .split(','));\n/** @type {?} */\nconst DIMENSIONAL_PROP_MAP = ((ɵ0$1))();\n/**\n * @param {?} keys\n * @return {?}\n */\nfunction makeBooleanMap(keys) {\n /** @type {?} */\n const map = {};\n keys.forEach((/**\n * @param {?} key\n * @return {?}\n */\n key => map[key] = true));\n return map;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_transition_instruction.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @record\n */\nfunction AnimationTransitionInstruction() { }\nif (false) {\n /** @type {?} */\n AnimationTransitionInstruction.prototype.element;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.triggerName;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.isRemovalTransition;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.fromState;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.fromStyles;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.toState;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.toStyles;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.timelines;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.queriedElements;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.preStyleProps;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.postStyleProps;\n /** @type {?} */\n AnimationTransitionInstruction.prototype.totalTime;\n /** @type {?|undefined} */\n AnimationTransitionInstruction.prototype.errors;\n}\n/**\n * @param {?} element\n * @param {?} triggerName\n * @param {?} fromState\n * @param {?} toState\n * @param {?} isRemovalTransition\n * @param {?} fromStyles\n * @param {?} toStyles\n * @param {?} timelines\n * @param {?} queriedElements\n * @param {?} preStyleProps\n * @param {?} postStyleProps\n * @param {?} totalTime\n * @param {?=} errors\n * @return {?}\n */\nfunction createTransitionInstruction(element, triggerName, fromState, toState, isRemovalTransition, fromStyles, toStyles, timelines, queriedElements, preStyleProps, postStyleProps, totalTime, errors) {\n return {\n type: 0 /* TransitionAnimation */,\n element,\n triggerName,\n isRemovalTransition,\n fromState,\n fromStyles,\n toState,\n toStyles,\n timelines,\n queriedElements,\n preStyleProps,\n postStyleProps,\n totalTime,\n errors\n };\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_transition_factory.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst EMPTY_OBJECT = {};\nclass AnimationTransitionFactory {\n /**\n * @param {?} _triggerName\n * @param {?} ast\n * @param {?} _stateStyles\n */\n constructor(_triggerName, ast, _stateStyles) {\n this._triggerName = _triggerName;\n this.ast = ast;\n this._stateStyles = _stateStyles;\n }\n /**\n * @param {?} currentState\n * @param {?} nextState\n * @param {?} element\n * @param {?} params\n * @return {?}\n */\n match(currentState, nextState, element, params) {\n return oneOrMoreTransitionsMatch(this.ast.matchers, currentState, nextState, element, params);\n }\n /**\n * @param {?} stateName\n * @param {?} params\n * @param {?} errors\n * @return {?}\n */\n buildStyles(stateName, params, errors) {\n /** @type {?} */\n const backupStateStyler = this._stateStyles['*'];\n /** @type {?} */\n const stateStyler = this._stateStyles[stateName];\n /** @type {?} */\n const backupStyles = backupStateStyler ? backupStateStyler.buildStyles(params, errors) : {};\n return stateStyler ? stateStyler.buildStyles(params, errors) : backupStyles;\n }\n /**\n * @param {?} driver\n * @param {?} element\n * @param {?} currentState\n * @param {?} nextState\n * @param {?} enterClassName\n * @param {?} leaveClassName\n * @param {?=} currentOptions\n * @param {?=} nextOptions\n * @param {?=} subInstructions\n * @param {?=} skipAstBuild\n * @return {?}\n */\n build(driver, element, currentState, nextState, enterClassName, leaveClassName, currentOptions, nextOptions, subInstructions, skipAstBuild) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const transitionAnimationParams = this.ast.options && this.ast.options.params || EMPTY_OBJECT;\n /** @type {?} */\n const currentAnimationParams = currentOptions && currentOptions.params || EMPTY_OBJECT;\n /** @type {?} */\n const currentStateStyles = this.buildStyles(currentState, currentAnimationParams, errors);\n /** @type {?} */\n const nextAnimationParams = nextOptions && nextOptions.params || EMPTY_OBJECT;\n /** @type {?} */\n const nextStateStyles = this.buildStyles(nextState, nextAnimationParams, errors);\n /** @type {?} */\n const queriedElements = new Set();\n /** @type {?} */\n const preStyleMap = new Map();\n /** @type {?} */\n const postStyleMap = new Map();\n /** @type {?} */\n const isRemoval = nextState === 'void';\n /** @type {?} */\n const animationOptions = { params: Object.assign(Object.assign({}, transitionAnimationParams), nextAnimationParams) };\n /** @type {?} */\n const timelines = skipAstBuild ? [] : buildAnimationTimelines(driver, element, this.ast.animation, enterClassName, leaveClassName, currentStateStyles, nextStateStyles, animationOptions, subInstructions, errors);\n /** @type {?} */\n let totalTime = 0;\n timelines.forEach((/**\n * @param {?} tl\n * @return {?}\n */\n tl => { totalTime = Math.max(tl.duration + tl.delay, totalTime); }));\n if (errors.length) {\n return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, [], [], preStyleMap, postStyleMap, totalTime, errors);\n }\n timelines.forEach((/**\n * @param {?} tl\n * @return {?}\n */\n tl => {\n /** @type {?} */\n const elm = tl.element;\n /** @type {?} */\n const preProps = getOrSetAsInMap(preStyleMap, elm, {});\n tl.preStyleProps.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => preProps[prop] = true));\n /** @type {?} */\n const postProps = getOrSetAsInMap(postStyleMap, elm, {});\n tl.postStyleProps.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => postProps[prop] = true));\n if (elm !== element) {\n queriedElements.add(elm);\n }\n }));\n /** @type {?} */\n const queriedElementsList = iteratorToArray(queriedElements.values());\n return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, timelines, queriedElementsList, preStyleMap, postStyleMap, totalTime);\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionFactory.prototype._triggerName;\n /** @type {?} */\n AnimationTransitionFactory.prototype.ast;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionFactory.prototype._stateStyles;\n}\n/**\n * @param {?} matchFns\n * @param {?} currentState\n * @param {?} nextState\n * @param {?} element\n * @param {?} params\n * @return {?}\n */\nfunction oneOrMoreTransitionsMatch(matchFns, currentState, nextState, element, params) {\n return matchFns.some((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn(currentState, nextState, element, params)));\n}\nclass AnimationStateStyles {\n /**\n * @param {?} styles\n * @param {?} defaultParams\n */\n constructor(styles, defaultParams) {\n this.styles = styles;\n this.defaultParams = defaultParams;\n }\n /**\n * @param {?} params\n * @param {?} errors\n * @return {?}\n */\n buildStyles(params, errors) {\n /** @type {?} */\n const finalStyles = {};\n /** @type {?} */\n const combinedParams = copyObj(this.defaultParams);\n Object.keys(params).forEach((/**\n * @param {?} key\n * @return {?}\n */\n key => {\n /** @type {?} */\n const value = params[key];\n if (value != null) {\n combinedParams[key] = value;\n }\n }));\n this.styles.styles.forEach((/**\n * @param {?} value\n * @return {?}\n */\n value => {\n if (typeof value !== 'string') {\n /** @type {?} */\n const styleObj = (/** @type {?} */ (value));\n Object.keys(styleObj).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n let val = styleObj[prop];\n if (val.length > 1) {\n val = interpolateParams(val, combinedParams, errors);\n }\n finalStyles[prop] = val;\n }));\n }\n }));\n return finalStyles;\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n AnimationStateStyles.prototype.styles;\n /**\n * @type {?}\n * @private\n */\n AnimationStateStyles.prototype.defaultParams;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/dsl/animation_trigger.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * \\@publicApi\n * @param {?} name\n * @param {?} ast\n * @return {?}\n */\nfunction buildTrigger(name, ast) {\n return new AnimationTrigger(name, ast);\n}\n/**\n * \\@publicApi\n */\nclass AnimationTrigger {\n /**\n * @param {?} name\n * @param {?} ast\n */\n constructor(name, ast) {\n this.name = name;\n this.ast = ast;\n this.transitionFactories = [];\n this.states = {};\n ast.states.forEach((/**\n * @param {?} ast\n * @return {?}\n */\n ast => {\n /** @type {?} */\n const defaultParams = (ast.options && ast.options.params) || {};\n this.states[ast.name] = new AnimationStateStyles(ast.style, defaultParams);\n }));\n balanceProperties(this.states, 'true', '1');\n balanceProperties(this.states, 'false', '0');\n ast.transitions.forEach((/**\n * @param {?} ast\n * @return {?}\n */\n ast => {\n this.transitionFactories.push(new AnimationTransitionFactory(name, ast, this.states));\n }));\n this.fallbackTransition = createFallbackTransition(name, this.states);\n }\n /**\n * @return {?}\n */\n get containsQueries() { return this.ast.queryCount > 0; }\n /**\n * @param {?} currentState\n * @param {?} nextState\n * @param {?} element\n * @param {?} params\n * @return {?}\n */\n matchTransition(currentState, nextState, element, params) {\n /** @type {?} */\n const entry = this.transitionFactories.find((/**\n * @param {?} f\n * @return {?}\n */\n f => f.match(currentState, nextState, element, params)));\n return entry || null;\n }\n /**\n * @param {?} currentState\n * @param {?} params\n * @param {?} errors\n * @return {?}\n */\n matchStyles(currentState, params, errors) {\n return this.fallbackTransition.buildStyles(currentState, params, errors);\n }\n}\nif (false) {\n /** @type {?} */\n AnimationTrigger.prototype.transitionFactories;\n /** @type {?} */\n AnimationTrigger.prototype.fallbackTransition;\n /** @type {?} */\n AnimationTrigger.prototype.states;\n /** @type {?} */\n AnimationTrigger.prototype.name;\n /** @type {?} */\n AnimationTrigger.prototype.ast;\n}\n/**\n * @param {?} triggerName\n * @param {?} states\n * @return {?}\n */\nfunction createFallbackTransition(triggerName, states) {\n /** @type {?} */\n const matchers = [(/**\n * @param {?} fromState\n * @param {?} toState\n * @return {?}\n */\n (fromState, toState) => true)];\n /** @type {?} */\n const animation = { type: 2 /* Sequence */, steps: [], options: null };\n /** @type {?} */\n const transition = {\n type: 1 /* Transition */,\n animation,\n matchers,\n options: null,\n queryCount: 0,\n depCount: 0\n };\n return new AnimationTransitionFactory(triggerName, transition, states);\n}\n/**\n * @param {?} obj\n * @param {?} key1\n * @param {?} key2\n * @return {?}\n */\nfunction balanceProperties(obj, key1, key2) {\n if (obj.hasOwnProperty(key1)) {\n if (!obj.hasOwnProperty(key2)) {\n obj[key2] = obj[key1];\n }\n }\n else if (obj.hasOwnProperty(key2)) {\n obj[key1] = obj[key2];\n }\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/timeline_animation_engine.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst EMPTY_INSTRUCTION_MAP = new ElementInstructionMap();\nclass TimelineAnimationEngine {\n /**\n * @param {?} bodyNode\n * @param {?} _driver\n * @param {?} _normalizer\n */\n constructor(bodyNode, _driver, _normalizer) {\n this.bodyNode = bodyNode;\n this._driver = _driver;\n this._normalizer = _normalizer;\n this._animations = {};\n this._playersById = {};\n this.players = [];\n }\n /**\n * @param {?} id\n * @param {?} metadata\n * @return {?}\n */\n register(id, metadata) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const ast = buildAnimationAst(this._driver, metadata, errors);\n if (errors.length) {\n throw new Error(`Unable to build the animation due to the following errors: ${errors.join(\"\\n\")}`);\n }\n else {\n this._animations[id] = ast;\n }\n }\n /**\n * @private\n * @param {?} i\n * @param {?} preStyles\n * @param {?=} postStyles\n * @return {?}\n */\n _buildPlayer(i, preStyles, postStyles) {\n /** @type {?} */\n const element = i.element;\n /** @type {?} */\n const keyframes = normalizeKeyframes(this._driver, this._normalizer, element, i.keyframes, preStyles, postStyles);\n return this._driver.animate(element, keyframes, i.duration, i.delay, i.easing, [], true);\n }\n /**\n * @param {?} id\n * @param {?} element\n * @param {?=} options\n * @return {?}\n */\n create(id, element, options = {}) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const ast = this._animations[id];\n /** @type {?} */\n let instructions;\n /** @type {?} */\n const autoStylesMap = new Map();\n if (ast) {\n instructions = buildAnimationTimelines(this._driver, element, ast, ENTER_CLASSNAME, LEAVE_CLASSNAME, {}, {}, options, EMPTY_INSTRUCTION_MAP, errors);\n instructions.forEach((/**\n * @param {?} inst\n * @return {?}\n */\n inst => {\n /** @type {?} */\n const styles = getOrSetAsInMap(autoStylesMap, inst.element, {});\n inst.postStyleProps.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => styles[prop] = null));\n }));\n }\n else {\n errors.push('The requested animation doesn\\'t exist or has already been destroyed');\n instructions = [];\n }\n if (errors.length) {\n throw new Error(`Unable to create the animation due to the following errors: ${errors.join(\"\\n\")}`);\n }\n autoStylesMap.forEach((/**\n * @param {?} styles\n * @param {?} element\n * @return {?}\n */\n (styles, element) => {\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => { styles[prop] = this._driver.computeStyle(element, prop, AUTO_STYLE); }));\n }));\n /** @type {?} */\n const players = instructions.map((/**\n * @param {?} i\n * @return {?}\n */\n i => {\n /** @type {?} */\n const styles = autoStylesMap.get(i.element);\n return this._buildPlayer(i, {}, styles);\n }));\n /** @type {?} */\n const player = optimizeGroupPlayer(players);\n this._playersById[id] = player;\n player.onDestroy((/**\n * @return {?}\n */\n () => this.destroy(id)));\n this.players.push(player);\n return player;\n }\n /**\n * @param {?} id\n * @return {?}\n */\n destroy(id) {\n /** @type {?} */\n const player = this._getPlayer(id);\n player.destroy();\n delete this._playersById[id];\n /** @type {?} */\n const index = this.players.indexOf(player);\n if (index >= 0) {\n this.players.splice(index, 1);\n }\n }\n /**\n * @private\n * @param {?} id\n * @return {?}\n */\n _getPlayer(id) {\n /** @type {?} */\n const player = this._playersById[id];\n if (!player) {\n throw new Error(`Unable to find the timeline player referenced by ${id}`);\n }\n return player;\n }\n /**\n * @param {?} id\n * @param {?} element\n * @param {?} eventName\n * @param {?} callback\n * @return {?}\n */\n listen(id, element, eventName, callback) {\n // triggerName, fromState, toState are all ignored for timeline animations\n /** @type {?} */\n const baseEvent = makeAnimationEvent(element, '', '', '');\n listenOnPlayer(this._getPlayer(id), eventName, baseEvent, callback);\n return (/**\n * @return {?}\n */\n () => { });\n }\n /**\n * @param {?} id\n * @param {?} element\n * @param {?} command\n * @param {?} args\n * @return {?}\n */\n command(id, element, command, args) {\n if (command == 'register') {\n this.register(id, (/** @type {?} */ (args[0])));\n return;\n }\n if (command == 'create') {\n /** @type {?} */\n const options = (/** @type {?} */ ((args[0] || {})));\n this.create(id, element, options);\n return;\n }\n /** @type {?} */\n const player = this._getPlayer(id);\n switch (command) {\n case 'play':\n player.play();\n break;\n case 'pause':\n player.pause();\n break;\n case 'reset':\n player.reset();\n break;\n case 'restart':\n player.restart();\n break;\n case 'finish':\n player.finish();\n break;\n case 'init':\n player.init();\n break;\n case 'setPosition':\n player.setPosition(parseFloat((/** @type {?} */ (args[0]))));\n break;\n case 'destroy':\n this.destroy(id);\n break;\n }\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n TimelineAnimationEngine.prototype._animations;\n /**\n * @type {?}\n * @private\n */\n TimelineAnimationEngine.prototype._playersById;\n /** @type {?} */\n TimelineAnimationEngine.prototype.players;\n /** @type {?} */\n TimelineAnimationEngine.prototype.bodyNode;\n /**\n * @type {?}\n * @private\n */\n TimelineAnimationEngine.prototype._driver;\n /**\n * @type {?}\n * @private\n */\n TimelineAnimationEngine.prototype._normalizer;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/transition_animation_engine.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst QUEUED_CLASSNAME = 'ng-animate-queued';\n/** @type {?} */\nconst QUEUED_SELECTOR = '.ng-animate-queued';\n/** @type {?} */\nconst DISABLED_CLASSNAME = 'ng-animate-disabled';\n/** @type {?} */\nconst DISABLED_SELECTOR = '.ng-animate-disabled';\n/** @type {?} */\nconst STAR_CLASSNAME = 'ng-star-inserted';\n/** @type {?} */\nconst STAR_SELECTOR = '.ng-star-inserted';\n/** @type {?} */\nconst EMPTY_PLAYER_ARRAY = [];\n/** @type {?} */\nconst NULL_REMOVAL_STATE = {\n namespaceId: '',\n setForRemoval: false,\n setForMove: false,\n hasAnimation: false,\n removedBeforeQueried: false\n};\n/** @type {?} */\nconst NULL_REMOVED_QUERIED_STATE = {\n namespaceId: '',\n setForMove: false,\n setForRemoval: false,\n hasAnimation: false,\n removedBeforeQueried: true\n};\n/**\n * @record\n */\nfunction TriggerListener() { }\nif (false) {\n /** @type {?} */\n TriggerListener.prototype.name;\n /** @type {?} */\n TriggerListener.prototype.phase;\n /** @type {?} */\n TriggerListener.prototype.callback;\n}\n/**\n * @record\n */\nfunction QueueInstruction() { }\nif (false) {\n /** @type {?} */\n QueueInstruction.prototype.element;\n /** @type {?} */\n QueueInstruction.prototype.triggerName;\n /** @type {?} */\n QueueInstruction.prototype.fromState;\n /** @type {?} */\n QueueInstruction.prototype.toState;\n /** @type {?} */\n QueueInstruction.prototype.transition;\n /** @type {?} */\n QueueInstruction.prototype.player;\n /** @type {?} */\n QueueInstruction.prototype.isFallbackTransition;\n}\n/** @type {?} */\nconst REMOVAL_FLAG = '__ng_removed';\n/**\n * @record\n */\nfunction ElementAnimationState() { }\nif (false) {\n /** @type {?} */\n ElementAnimationState.prototype.setForRemoval;\n /** @type {?} */\n ElementAnimationState.prototype.setForMove;\n /** @type {?} */\n ElementAnimationState.prototype.hasAnimation;\n /** @type {?} */\n ElementAnimationState.prototype.namespaceId;\n /** @type {?} */\n ElementAnimationState.prototype.removedBeforeQueried;\n}\nclass StateValue {\n /**\n * @param {?} input\n * @param {?=} namespaceId\n */\n constructor(input, namespaceId = '') {\n this.namespaceId = namespaceId;\n /** @type {?} */\n const isObj = input && input.hasOwnProperty('value');\n /** @type {?} */\n const value = isObj ? input['value'] : input;\n this.value = normalizeTriggerValue(value);\n if (isObj) {\n /** @type {?} */\n const options = copyObj((/** @type {?} */ (input)));\n delete options['value'];\n this.options = (/** @type {?} */ (options));\n }\n else {\n this.options = {};\n }\n if (!this.options.params) {\n this.options.params = {};\n }\n }\n /**\n * @return {?}\n */\n get params() { return (/** @type {?} */ (this.options.params)); }\n /**\n * @param {?} options\n * @return {?}\n */\n absorbOptions(options) {\n /** @type {?} */\n const newParams = options.params;\n if (newParams) {\n /** @type {?} */\n const oldParams = (/** @type {?} */ (this.options.params));\n Object.keys(newParams).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (oldParams[prop] == null) {\n oldParams[prop] = newParams[prop];\n }\n }));\n }\n }\n}\nif (false) {\n /** @type {?} */\n StateValue.prototype.value;\n /** @type {?} */\n StateValue.prototype.options;\n /** @type {?} */\n StateValue.prototype.namespaceId;\n}\n/** @type {?} */\nconst VOID_VALUE = 'void';\n/** @type {?} */\nconst DEFAULT_STATE_VALUE = new StateValue(VOID_VALUE);\nclass AnimationTransitionNamespace {\n /**\n * @param {?} id\n * @param {?} hostElement\n * @param {?} _engine\n */\n constructor(id, hostElement, _engine) {\n this.id = id;\n this.hostElement = hostElement;\n this._engine = _engine;\n this.players = [];\n this._triggers = {};\n this._queue = [];\n this._elementListeners = new Map();\n this._hostClassName = 'ng-tns-' + id;\n addClass(hostElement, this._hostClassName);\n }\n /**\n * @param {?} element\n * @param {?} name\n * @param {?} phase\n * @param {?} callback\n * @return {?}\n */\n listen(element, name, phase, callback) {\n if (!this._triggers.hasOwnProperty(name)) {\n throw new Error(`Unable to listen on the animation trigger event \"${phase}\" because the animation trigger \"${name}\" doesn\\'t exist!`);\n }\n if (phase == null || phase.length == 0) {\n throw new Error(`Unable to listen on the animation trigger \"${name}\" because the provided event is undefined!`);\n }\n if (!isTriggerEventValid(phase)) {\n throw new Error(`The provided animation trigger event \"${phase}\" for the animation trigger \"${name}\" is not supported!`);\n }\n /** @type {?} */\n const listeners = getOrSetAsInMap(this._elementListeners, element, []);\n /** @type {?} */\n const data = { name, phase, callback };\n listeners.push(data);\n /** @type {?} */\n const triggersWithStates = getOrSetAsInMap(this._engine.statesByElement, element, {});\n if (!triggersWithStates.hasOwnProperty(name)) {\n addClass(element, NG_TRIGGER_CLASSNAME);\n addClass(element, NG_TRIGGER_CLASSNAME + '-' + name);\n triggersWithStates[name] = DEFAULT_STATE_VALUE;\n }\n return (/**\n * @return {?}\n */\n () => {\n // the event listener is removed AFTER the flush has occurred such\n // that leave animations callbacks can fire (otherwise if the node\n // is removed in between then the listeners would be deregistered)\n this._engine.afterFlush((/**\n * @return {?}\n */\n () => {\n /** @type {?} */\n const index = listeners.indexOf(data);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n if (!this._triggers[name]) {\n delete triggersWithStates[name];\n }\n }));\n });\n }\n /**\n * @param {?} name\n * @param {?} ast\n * @return {?}\n */\n register(name, ast) {\n if (this._triggers[name]) {\n // throw\n return false;\n }\n else {\n this._triggers[name] = ast;\n return true;\n }\n }\n /**\n * @private\n * @param {?} name\n * @return {?}\n */\n _getTrigger(name) {\n /** @type {?} */\n const trigger = this._triggers[name];\n if (!trigger) {\n throw new Error(`The provided animation trigger \"${name}\" has not been registered!`);\n }\n return trigger;\n }\n /**\n * @param {?} element\n * @param {?} triggerName\n * @param {?} value\n * @param {?=} defaultToFallback\n * @return {?}\n */\n trigger(element, triggerName, value, defaultToFallback = true) {\n /** @type {?} */\n const trigger = this._getTrigger(triggerName);\n /** @type {?} */\n const player = new TransitionAnimationPlayer(this.id, triggerName, element);\n /** @type {?} */\n let triggersWithStates = this._engine.statesByElement.get(element);\n if (!triggersWithStates) {\n addClass(element, NG_TRIGGER_CLASSNAME);\n addClass(element, NG_TRIGGER_CLASSNAME + '-' + triggerName);\n this._engine.statesByElement.set(element, triggersWithStates = {});\n }\n /** @type {?} */\n let fromState = triggersWithStates[triggerName];\n /** @type {?} */\n const toState = new StateValue(value, this.id);\n /** @type {?} */\n const isObj = value && value.hasOwnProperty('value');\n if (!isObj && fromState) {\n toState.absorbOptions(fromState.options);\n }\n triggersWithStates[triggerName] = toState;\n if (!fromState) {\n fromState = DEFAULT_STATE_VALUE;\n }\n /** @type {?} */\n const isRemoval = toState.value === VOID_VALUE;\n // normally this isn't reached by here, however, if an object expression\n // is passed in then it may be a new object each time. Comparing the value\n // is important since that will stay the same despite there being a new object.\n // The removal arc here is special cased because the same element is triggered\n // twice in the event that it contains animations on the outer/inner portions\n // of the host container\n if (!isRemoval && fromState.value === toState.value) {\n // this means that despite the value not changing, some inner params\n // have changed which means that the animation final styles need to be applied\n if (!objEquals(fromState.params, toState.params)) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const fromStyles = trigger.matchStyles(fromState.value, fromState.params, errors);\n /** @type {?} */\n const toStyles = trigger.matchStyles(toState.value, toState.params, errors);\n if (errors.length) {\n this._engine.reportError(errors);\n }\n else {\n this._engine.afterFlush((/**\n * @return {?}\n */\n () => {\n eraseStyles(element, fromStyles);\n setStyles(element, toStyles);\n }));\n }\n }\n return;\n }\n /** @type {?} */\n const playersOnElement = getOrSetAsInMap(this._engine.playersByElement, element, []);\n playersOnElement.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n // only remove the player if it is queued on the EXACT same trigger/namespace\n // we only also deal with queued players here because if the animation has\n // started then we want to keep the player alive until the flush happens\n // (which is where the previousPlayers are passed into the new palyer)\n if (player.namespaceId == this.id && player.triggerName == triggerName && player.queued) {\n player.destroy();\n }\n }));\n /** @type {?} */\n let transition = trigger.matchTransition(fromState.value, toState.value, element, toState.params);\n /** @type {?} */\n let isFallbackTransition = false;\n if (!transition) {\n if (!defaultToFallback)\n return;\n transition = trigger.fallbackTransition;\n isFallbackTransition = true;\n }\n this._engine.totalQueuedPlayers++;\n this._queue.push({ element, triggerName, transition, fromState, toState, player, isFallbackTransition });\n if (!isFallbackTransition) {\n addClass(element, QUEUED_CLASSNAME);\n player.onStart((/**\n * @return {?}\n */\n () => { removeClass(element, QUEUED_CLASSNAME); }));\n }\n player.onDone((/**\n * @return {?}\n */\n () => {\n /** @type {?} */\n let index = this.players.indexOf(player);\n if (index >= 0) {\n this.players.splice(index, 1);\n }\n /** @type {?} */\n const players = this._engine.playersByElement.get(element);\n if (players) {\n /** @type {?} */\n let index = players.indexOf(player);\n if (index >= 0) {\n players.splice(index, 1);\n }\n }\n }));\n this.players.push(player);\n playersOnElement.push(player);\n return player;\n }\n /**\n * @param {?} name\n * @return {?}\n */\n deregister(name) {\n delete this._triggers[name];\n this._engine.statesByElement.forEach((/**\n * @param {?} stateMap\n * @param {?} element\n * @return {?}\n */\n (stateMap, element) => { delete stateMap[name]; }));\n this._elementListeners.forEach((/**\n * @param {?} listeners\n * @param {?} element\n * @return {?}\n */\n (listeners, element) => {\n this._elementListeners.set(element, listeners.filter((/**\n * @param {?} entry\n * @return {?}\n */\n entry => { return entry.name != name; })));\n }));\n }\n /**\n * @param {?} element\n * @return {?}\n */\n clearElementCache(element) {\n this._engine.statesByElement.delete(element);\n this._elementListeners.delete(element);\n /** @type {?} */\n const elementPlayers = this._engine.playersByElement.get(element);\n if (elementPlayers) {\n elementPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => player.destroy()));\n this._engine.playersByElement.delete(element);\n }\n }\n /**\n * @private\n * @param {?} rootElement\n * @param {?} context\n * @return {?}\n */\n _signalRemovalForInnerTriggers(rootElement, context) {\n /** @type {?} */\n const elements = this._engine.driver.query(rootElement, NG_TRIGGER_SELECTOR, true);\n // emulate a leave animation for all inner nodes within this node.\n // If there are no animations found for any of the nodes then clear the cache\n // for the element.\n elements.forEach((/**\n * @param {?} elm\n * @return {?}\n */\n elm => {\n // this means that an inner remove() operation has already kicked off\n // the animation on this element...\n if (elm[REMOVAL_FLAG])\n return;\n /** @type {?} */\n const namespaces = this._engine.fetchNamespacesByElement(elm);\n if (namespaces.size) {\n namespaces.forEach((/**\n * @param {?} ns\n * @return {?}\n */\n ns => ns.triggerLeaveAnimation(elm, context, false, true)));\n }\n else {\n this.clearElementCache(elm);\n }\n }));\n // If the child elements were removed along with the parent, their animations might not\n // have completed. Clear all the elements from the cache so we don't end up with a memory leak.\n this._engine.afterFlushAnimationsDone((/**\n * @return {?}\n */\n () => elements.forEach((/**\n * @param {?} elm\n * @return {?}\n */\n elm => this.clearElementCache(elm)))));\n }\n /**\n * @param {?} element\n * @param {?} context\n * @param {?=} destroyAfterComplete\n * @param {?=} defaultToFallback\n * @return {?}\n */\n triggerLeaveAnimation(element, context, destroyAfterComplete, defaultToFallback) {\n /** @type {?} */\n const triggerStates = this._engine.statesByElement.get(element);\n if (triggerStates) {\n /** @type {?} */\n const players = [];\n Object.keys(triggerStates).forEach((/**\n * @param {?} triggerName\n * @return {?}\n */\n triggerName => {\n // this check is here in the event that an element is removed\n // twice (both on the host level and the component level)\n if (this._triggers[triggerName]) {\n /** @type {?} */\n const player = this.trigger(element, triggerName, VOID_VALUE, defaultToFallback);\n if (player) {\n players.push(player);\n }\n }\n }));\n if (players.length) {\n this._engine.markElementAsRemoved(this.id, element, true, context);\n if (destroyAfterComplete) {\n optimizeGroupPlayer(players).onDone((/**\n * @return {?}\n */\n () => this._engine.processLeaveNode(element)));\n }\n return true;\n }\n }\n return false;\n }\n /**\n * @param {?} element\n * @return {?}\n */\n prepareLeaveAnimationListeners(element) {\n /** @type {?} */\n const listeners = this._elementListeners.get(element);\n if (listeners) {\n /** @type {?} */\n const visitedTriggers = new Set();\n listeners.forEach((/**\n * @param {?} listener\n * @return {?}\n */\n listener => {\n /** @type {?} */\n const triggerName = listener.name;\n if (visitedTriggers.has(triggerName))\n return;\n visitedTriggers.add(triggerName);\n /** @type {?} */\n const trigger = this._triggers[triggerName];\n /** @type {?} */\n const transition = trigger.fallbackTransition;\n /** @type {?} */\n const elementStates = (/** @type {?} */ (this._engine.statesByElement.get(element)));\n /** @type {?} */\n const fromState = elementStates[triggerName] || DEFAULT_STATE_VALUE;\n /** @type {?} */\n const toState = new StateValue(VOID_VALUE);\n /** @type {?} */\n const player = new TransitionAnimationPlayer(this.id, triggerName, element);\n this._engine.totalQueuedPlayers++;\n this._queue.push({\n element,\n triggerName,\n transition,\n fromState,\n toState,\n player,\n isFallbackTransition: true\n });\n }));\n }\n }\n /**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n removeNode(element, context) {\n /** @type {?} */\n const engine = this._engine;\n if (element.childElementCount) {\n this._signalRemovalForInnerTriggers(element, context);\n }\n // this means that a * => VOID animation was detected and kicked off\n if (this.triggerLeaveAnimation(element, context, true))\n return;\n // find the player that is animating and make sure that the\n // removal is delayed until that player has completed\n /** @type {?} */\n let containsPotentialParentTransition = false;\n if (engine.totalAnimations) {\n /** @type {?} */\n const currentPlayers = engine.players.length ? engine.playersByQueriedElement.get(element) : [];\n // when this `if statement` does not continue forward it means that\n // a previous animation query has selected the current element and\n // is animating it. In this situation want to continue forwards and\n // allow the element to be queued up for animation later.\n if (currentPlayers && currentPlayers.length) {\n containsPotentialParentTransition = true;\n }\n else {\n /** @type {?} */\n let parent = element;\n while (parent = parent.parentNode) {\n /** @type {?} */\n const triggers = engine.statesByElement.get(parent);\n if (triggers) {\n containsPotentialParentTransition = true;\n break;\n }\n }\n }\n }\n // at this stage we know that the element will either get removed\n // during flush or will be picked up by a parent query. Either way\n // we need to fire the listeners for this element when it DOES get\n // removed (once the query parent animation is done or after flush)\n this.prepareLeaveAnimationListeners(element);\n // whether or not a parent has an animation we need to delay the deferral of the leave\n // operation until we have more information (which we do after flush() has been called)\n if (containsPotentialParentTransition) {\n engine.markElementAsRemoved(this.id, element, false, context);\n }\n else {\n /** @type {?} */\n const removalFlag = element[REMOVAL_FLAG];\n if (!removalFlag || removalFlag === NULL_REMOVAL_STATE) {\n // we do this after the flush has occurred such\n // that the callbacks can be fired\n engine.afterFlush((/**\n * @return {?}\n */\n () => this.clearElementCache(element)));\n engine.destroyInnerAnimations(element);\n engine._onRemovalComplete(element, context);\n }\n }\n }\n /**\n * @param {?} element\n * @param {?} parent\n * @return {?}\n */\n insertNode(element, parent) { addClass(element, this._hostClassName); }\n /**\n * @param {?} microtaskId\n * @return {?}\n */\n drainQueuedTransitions(microtaskId) {\n /** @type {?} */\n const instructions = [];\n this._queue.forEach((/**\n * @param {?} entry\n * @return {?}\n */\n entry => {\n /** @type {?} */\n const player = entry.player;\n if (player.destroyed)\n return;\n /** @type {?} */\n const element = entry.element;\n /** @type {?} */\n const listeners = this._elementListeners.get(element);\n if (listeners) {\n listeners.forEach((/**\n * @param {?} listener\n * @return {?}\n */\n (listener) => {\n if (listener.name == entry.triggerName) {\n /** @type {?} */\n const baseEvent = makeAnimationEvent(element, entry.triggerName, entry.fromState.value, entry.toState.value);\n ((/** @type {?} */ (baseEvent)))['_data'] = microtaskId;\n listenOnPlayer(entry.player, listener.phase, baseEvent, listener.callback);\n }\n }));\n }\n if (player.markedForDestroy) {\n this._engine.afterFlush((/**\n * @return {?}\n */\n () => {\n // now we can destroy the element properly since the event listeners have\n // been bound to the player\n player.destroy();\n }));\n }\n else {\n instructions.push(entry);\n }\n }));\n this._queue = [];\n return instructions.sort((/**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n (a, b) => {\n // if depCount == 0 them move to front\n // otherwise if a contains b then move back\n /** @type {?} */\n const d0 = a.transition.ast.depCount;\n /** @type {?} */\n const d1 = b.transition.ast.depCount;\n if (d0 == 0 || d1 == 0) {\n return d0 - d1;\n }\n return this._engine.driver.containsElement(a.element, b.element) ? 1 : -1;\n }));\n }\n /**\n * @param {?} context\n * @return {?}\n */\n destroy(context) {\n this.players.forEach((/**\n * @param {?} p\n * @return {?}\n */\n p => p.destroy()));\n this._signalRemovalForInnerTriggers(this.hostElement, context);\n }\n /**\n * @param {?} element\n * @return {?}\n */\n elementContainsData(element) {\n /** @type {?} */\n let containsData = false;\n if (this._elementListeners.has(element))\n containsData = true;\n containsData =\n (this._queue.find((/**\n * @param {?} entry\n * @return {?}\n */\n entry => entry.element === element)) ? true : false) || containsData;\n return containsData;\n }\n}\nif (false) {\n /** @type {?} */\n AnimationTransitionNamespace.prototype.players;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionNamespace.prototype._triggers;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionNamespace.prototype._queue;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionNamespace.prototype._elementListeners;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionNamespace.prototype._hostClassName;\n /** @type {?} */\n AnimationTransitionNamespace.prototype.id;\n /** @type {?} */\n AnimationTransitionNamespace.prototype.hostElement;\n /**\n * @type {?}\n * @private\n */\n AnimationTransitionNamespace.prototype._engine;\n}\n/**\n * @record\n */\nfunction QueuedTransition() { }\nif (false) {\n /** @type {?} */\n QueuedTransition.prototype.element;\n /** @type {?} */\n QueuedTransition.prototype.instruction;\n /** @type {?} */\n QueuedTransition.prototype.player;\n}\nclass TransitionAnimationEngine {\n /**\n * @param {?} bodyNode\n * @param {?} driver\n * @param {?} _normalizer\n */\n constructor(bodyNode, driver, _normalizer) {\n this.bodyNode = bodyNode;\n this.driver = driver;\n this._normalizer = _normalizer;\n this.players = [];\n this.newHostElements = new Map();\n this.playersByElement = new Map();\n this.playersByQueriedElement = new Map();\n this.statesByElement = new Map();\n this.disabledNodes = new Set();\n this.totalAnimations = 0;\n this.totalQueuedPlayers = 0;\n this._namespaceLookup = {};\n this._namespaceList = [];\n this._flushFns = [];\n this._whenQuietFns = [];\n this.namespacesByHostElement = new Map();\n this.collectedEnterElements = [];\n this.collectedLeaveElements = [];\n // this method is designed to be overridden by the code that uses this engine\n this.onRemovalComplete = (/**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n (element, context) => { });\n }\n /**\n * \\@internal\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n _onRemovalComplete(element, context) { this.onRemovalComplete(element, context); }\n /**\n * @return {?}\n */\n get queuedPlayers() {\n /** @type {?} */\n const players = [];\n this._namespaceList.forEach((/**\n * @param {?} ns\n * @return {?}\n */\n ns => {\n ns.players.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n if (player.queued) {\n players.push(player);\n }\n }));\n }));\n return players;\n }\n /**\n * @param {?} namespaceId\n * @param {?} hostElement\n * @return {?}\n */\n createNamespace(namespaceId, hostElement) {\n /** @type {?} */\n const ns = new AnimationTransitionNamespace(namespaceId, hostElement, this);\n if (hostElement.parentNode) {\n this._balanceNamespaceList(ns, hostElement);\n }\n else {\n // defer this later until flush during when the host element has\n // been inserted so that we know exactly where to place it in\n // the namespace list\n this.newHostElements.set(hostElement, ns);\n // given that this host element is apart of the animation code, it\n // may or may not be inserted by a parent node that is an of an\n // animation renderer type. If this happens then we can still have\n // access to this item when we query for :enter nodes. If the parent\n // is a renderer then the set data-structure will normalize the entry\n this.collectEnterElement(hostElement);\n }\n return this._namespaceLookup[namespaceId] = ns;\n }\n /**\n * @private\n * @param {?} ns\n * @param {?} hostElement\n * @return {?}\n */\n _balanceNamespaceList(ns, hostElement) {\n /** @type {?} */\n const limit = this._namespaceList.length - 1;\n if (limit >= 0) {\n /** @type {?} */\n let found = false;\n for (let i = limit; i >= 0; i--) {\n /** @type {?} */\n const nextNamespace = this._namespaceList[i];\n if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {\n this._namespaceList.splice(i + 1, 0, ns);\n found = true;\n break;\n }\n }\n if (!found) {\n this._namespaceList.splice(0, 0, ns);\n }\n }\n else {\n this._namespaceList.push(ns);\n }\n this.namespacesByHostElement.set(hostElement, ns);\n return ns;\n }\n /**\n * @param {?} namespaceId\n * @param {?} hostElement\n * @return {?}\n */\n register(namespaceId, hostElement) {\n /** @type {?} */\n let ns = this._namespaceLookup[namespaceId];\n if (!ns) {\n ns = this.createNamespace(namespaceId, hostElement);\n }\n return ns;\n }\n /**\n * @param {?} namespaceId\n * @param {?} name\n * @param {?} trigger\n * @return {?}\n */\n registerTrigger(namespaceId, name, trigger) {\n /** @type {?} */\n let ns = this._namespaceLookup[namespaceId];\n if (ns && ns.register(name, trigger)) {\n this.totalAnimations++;\n }\n }\n /**\n * @param {?} namespaceId\n * @param {?} context\n * @return {?}\n */\n destroy(namespaceId, context) {\n if (!namespaceId)\n return;\n /** @type {?} */\n const ns = this._fetchNamespace(namespaceId);\n this.afterFlush((/**\n * @return {?}\n */\n () => {\n this.namespacesByHostElement.delete(ns.hostElement);\n delete this._namespaceLookup[namespaceId];\n /** @type {?} */\n const index = this._namespaceList.indexOf(ns);\n if (index >= 0) {\n this._namespaceList.splice(index, 1);\n }\n }));\n this.afterFlushAnimationsDone((/**\n * @return {?}\n */\n () => ns.destroy(context)));\n }\n /**\n * @private\n * @param {?} id\n * @return {?}\n */\n _fetchNamespace(id) { return this._namespaceLookup[id]; }\n /**\n * @param {?} element\n * @return {?}\n */\n fetchNamespacesByElement(element) {\n // normally there should only be one namespace per element, however\n // if @triggers are placed on both the component element and then\n // its host element (within the component code) then there will be\n // two namespaces returned. We use a set here to simply the dedupe\n // of namespaces incase there are multiple triggers both the elm and host\n /** @type {?} */\n const namespaces = new Set();\n /** @type {?} */\n const elementStates = this.statesByElement.get(element);\n if (elementStates) {\n /** @type {?} */\n const keys = Object.keys(elementStates);\n for (let i = 0; i < keys.length; i++) {\n /** @type {?} */\n const nsId = elementStates[keys[i]].namespaceId;\n if (nsId) {\n /** @type {?} */\n const ns = this._fetchNamespace(nsId);\n if (ns) {\n namespaces.add(ns);\n }\n }\n }\n }\n return namespaces;\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n trigger(namespaceId, element, name, value) {\n if (isElementNode(element)) {\n /** @type {?} */\n const ns = this._fetchNamespace(namespaceId);\n if (ns) {\n ns.trigger(element, name, value);\n return true;\n }\n }\n return false;\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} parent\n * @param {?} insertBefore\n * @return {?}\n */\n insertNode(namespaceId, element, parent, insertBefore) {\n if (!isElementNode(element))\n return;\n // special case for when an element is removed and reinserted (move operation)\n // when this occurs we do not want to use the element for deletion later\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n if (details && details.setForRemoval) {\n details.setForRemoval = false;\n details.setForMove = true;\n /** @type {?} */\n const index = this.collectedLeaveElements.indexOf(element);\n if (index >= 0) {\n this.collectedLeaveElements.splice(index, 1);\n }\n }\n // in the event that the namespaceId is blank then the caller\n // code does not contain any animation code in it, but it is\n // just being called so that the node is marked as being inserted\n if (namespaceId) {\n /** @type {?} */\n const ns = this._fetchNamespace(namespaceId);\n // This if-statement is a workaround for router issue #21947.\n // The router sometimes hits a race condition where while a route\n // is being instantiated a new navigation arrives, triggering leave\n // animation of DOM that has not been fully initialized, until this\n // is resolved, we need to handle the scenario when DOM is not in a\n // consistent state during the animation.\n if (ns) {\n ns.insertNode(element, parent);\n }\n }\n // only *directives and host elements are inserted before\n if (insertBefore) {\n this.collectEnterElement(element);\n }\n }\n /**\n * @param {?} element\n * @return {?}\n */\n collectEnterElement(element) { this.collectedEnterElements.push(element); }\n /**\n * @param {?} element\n * @param {?} value\n * @return {?}\n */\n markElementAsDisabled(element, value) {\n if (value) {\n if (!this.disabledNodes.has(element)) {\n this.disabledNodes.add(element);\n addClass(element, DISABLED_CLASSNAME);\n }\n }\n else if (this.disabledNodes.has(element)) {\n this.disabledNodes.delete(element);\n removeClass(element, DISABLED_CLASSNAME);\n }\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} isHostElement\n * @param {?} context\n * @return {?}\n */\n removeNode(namespaceId, element, isHostElement, context) {\n if (isElementNode(element)) {\n /** @type {?} */\n const ns = namespaceId ? this._fetchNamespace(namespaceId) : null;\n if (ns) {\n ns.removeNode(element, context);\n }\n else {\n this.markElementAsRemoved(namespaceId, element, false, context);\n }\n if (isHostElement) {\n /** @type {?} */\n const hostNS = this.namespacesByHostElement.get(element);\n if (hostNS && hostNS.id !== namespaceId) {\n hostNS.removeNode(element, context);\n }\n }\n }\n else {\n this._onRemovalComplete(element, context);\n }\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?=} hasAnimation\n * @param {?=} context\n * @return {?}\n */\n markElementAsRemoved(namespaceId, element, hasAnimation, context) {\n this.collectedLeaveElements.push(element);\n element[REMOVAL_FLAG] = {\n namespaceId,\n setForRemoval: context, hasAnimation,\n removedBeforeQueried: false\n };\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} name\n * @param {?} phase\n * @param {?} callback\n * @return {?}\n */\n listen(namespaceId, element, name, phase, callback) {\n if (isElementNode(element)) {\n return this._fetchNamespace(namespaceId).listen(element, name, phase, callback);\n }\n return (/**\n * @return {?}\n */\n () => { });\n }\n /**\n * @private\n * @param {?} entry\n * @param {?} subTimelines\n * @param {?} enterClassName\n * @param {?} leaveClassName\n * @param {?=} skipBuildAst\n * @return {?}\n */\n _buildInstruction(entry, subTimelines, enterClassName, leaveClassName, skipBuildAst) {\n return entry.transition.build(this.driver, entry.element, entry.fromState.value, entry.toState.value, enterClassName, leaveClassName, entry.fromState.options, entry.toState.options, subTimelines, skipBuildAst);\n }\n /**\n * @param {?} containerElement\n * @return {?}\n */\n destroyInnerAnimations(containerElement) {\n /** @type {?} */\n let elements = this.driver.query(containerElement, NG_TRIGGER_SELECTOR, true);\n elements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => this.destroyActiveAnimationsForElement(element)));\n if (this.playersByQueriedElement.size == 0)\n return;\n elements = this.driver.query(containerElement, NG_ANIMATING_SELECTOR, true);\n elements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => this.finishActiveQueriedAnimationOnElement(element)));\n }\n /**\n * @param {?} element\n * @return {?}\n */\n destroyActiveAnimationsForElement(element) {\n /** @type {?} */\n const players = this.playersByElement.get(element);\n if (players) {\n players.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n // special case for when an element is set for destruction, but hasn't started.\n // in this situation we want to delay the destruction until the flush occurs\n // so that any event listeners attached to the player are triggered.\n if (player.queued) {\n player.markedForDestroy = true;\n }\n else {\n player.destroy();\n }\n }));\n }\n }\n /**\n * @param {?} element\n * @return {?}\n */\n finishActiveQueriedAnimationOnElement(element) {\n /** @type {?} */\n const players = this.playersByQueriedElement.get(element);\n if (players) {\n players.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => player.finish()));\n }\n }\n /**\n * @return {?}\n */\n whenRenderingDone() {\n return new Promise((/**\n * @param {?} resolve\n * @return {?}\n */\n resolve => {\n if (this.players.length) {\n return optimizeGroupPlayer(this.players).onDone((/**\n * @return {?}\n */\n () => resolve()));\n }\n else {\n resolve();\n }\n }));\n }\n /**\n * @param {?} element\n * @return {?}\n */\n processLeaveNode(element) {\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n if (details && details.setForRemoval) {\n // this will prevent it from removing it twice\n element[REMOVAL_FLAG] = NULL_REMOVAL_STATE;\n if (details.namespaceId) {\n this.destroyInnerAnimations(element);\n /** @type {?} */\n const ns = this._fetchNamespace(details.namespaceId);\n if (ns) {\n ns.clearElementCache(element);\n }\n }\n this._onRemovalComplete(element, details.setForRemoval);\n }\n if (this.driver.matchesElement(element, DISABLED_SELECTOR)) {\n this.markElementAsDisabled(element, false);\n }\n this.driver.query(element, DISABLED_SELECTOR, true).forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n this.markElementAsDisabled(node, false);\n }));\n }\n /**\n * @param {?=} microtaskId\n * @return {?}\n */\n flush(microtaskId = -1) {\n /** @type {?} */\n let players = [];\n if (this.newHostElements.size) {\n this.newHostElements.forEach((/**\n * @param {?} ns\n * @param {?} element\n * @return {?}\n */\n (ns, element) => this._balanceNamespaceList(ns, element)));\n this.newHostElements.clear();\n }\n if (this.totalAnimations && this.collectedEnterElements.length) {\n for (let i = 0; i < this.collectedEnterElements.length; i++) {\n /** @type {?} */\n const elm = this.collectedEnterElements[i];\n addClass(elm, STAR_CLASSNAME);\n }\n }\n if (this._namespaceList.length &&\n (this.totalQueuedPlayers || this.collectedLeaveElements.length)) {\n /** @type {?} */\n const cleanupFns = [];\n try {\n players = this._flushAnimations(cleanupFns, microtaskId);\n }\n finally {\n for (let i = 0; i < cleanupFns.length; i++) {\n cleanupFns[i]();\n }\n }\n }\n else {\n for (let i = 0; i < this.collectedLeaveElements.length; i++) {\n /** @type {?} */\n const element = this.collectedLeaveElements[i];\n this.processLeaveNode(element);\n }\n }\n this.totalQueuedPlayers = 0;\n this.collectedEnterElements.length = 0;\n this.collectedLeaveElements.length = 0;\n this._flushFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._flushFns = [];\n if (this._whenQuietFns.length) {\n // we move these over to a variable so that\n // if any new callbacks are registered in another\n // flush they do not populate the existing set\n /** @type {?} */\n const quietFns = this._whenQuietFns;\n this._whenQuietFns = [];\n if (players.length) {\n optimizeGroupPlayer(players).onDone((/**\n * @return {?}\n */\n () => { quietFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn())); }));\n }\n else {\n quietFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n }\n }\n }\n /**\n * @param {?} errors\n * @return {?}\n */\n reportError(errors) {\n throw new Error(`Unable to process animations due to the following failed trigger transitions\\n ${errors.join('\\n')}`);\n }\n /**\n * @private\n * @param {?} cleanupFns\n * @param {?} microtaskId\n * @return {?}\n */\n _flushAnimations(cleanupFns, microtaskId) {\n /** @type {?} */\n const subTimelines = new ElementInstructionMap();\n /** @type {?} */\n const skippedPlayers = [];\n /** @type {?} */\n const skippedPlayersMap = new Map();\n /** @type {?} */\n const queuedInstructions = [];\n /** @type {?} */\n const queriedElements = new Map();\n /** @type {?} */\n const allPreStyleElements = new Map();\n /** @type {?} */\n const allPostStyleElements = new Map();\n /** @type {?} */\n const disabledElementsSet = new Set();\n this.disabledNodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n disabledElementsSet.add(node);\n /** @type {?} */\n const nodesThatAreDisabled = this.driver.query(node, QUEUED_SELECTOR, true);\n for (let i = 0; i < nodesThatAreDisabled.length; i++) {\n disabledElementsSet.add(nodesThatAreDisabled[i]);\n }\n }));\n /** @type {?} */\n const bodyNode = this.bodyNode;\n /** @type {?} */\n const allTriggerElements = Array.from(this.statesByElement.keys());\n /** @type {?} */\n const enterNodeMap = buildRootMap(allTriggerElements, this.collectedEnterElements);\n // this must occur before the instructions are built below such that\n // the :enter queries match the elements (since the timeline queries\n // are fired during instruction building).\n /** @type {?} */\n const enterNodeMapIds = new Map();\n /** @type {?} */\n let i = 0;\n enterNodeMap.forEach((/**\n * @param {?} nodes\n * @param {?} root\n * @return {?}\n */\n (nodes, root) => {\n /** @type {?} */\n const className = ENTER_CLASSNAME + i++;\n enterNodeMapIds.set(root, className);\n nodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => addClass(node, className)));\n }));\n /** @type {?} */\n const allLeaveNodes = [];\n /** @type {?} */\n const mergedLeaveNodes = new Set();\n /** @type {?} */\n const leaveNodesWithoutAnimations = new Set();\n for (let i = 0; i < this.collectedLeaveElements.length; i++) {\n /** @type {?} */\n const element = this.collectedLeaveElements[i];\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n if (details && details.setForRemoval) {\n allLeaveNodes.push(element);\n mergedLeaveNodes.add(element);\n if (details.hasAnimation) {\n this.driver.query(element, STAR_SELECTOR, true).forEach((/**\n * @param {?} elm\n * @return {?}\n */\n elm => mergedLeaveNodes.add(elm)));\n }\n else {\n leaveNodesWithoutAnimations.add(element);\n }\n }\n }\n /** @type {?} */\n const leaveNodeMapIds = new Map();\n /** @type {?} */\n const leaveNodeMap = buildRootMap(allTriggerElements, Array.from(mergedLeaveNodes));\n leaveNodeMap.forEach((/**\n * @param {?} nodes\n * @param {?} root\n * @return {?}\n */\n (nodes, root) => {\n /** @type {?} */\n const className = LEAVE_CLASSNAME + i++;\n leaveNodeMapIds.set(root, className);\n nodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => addClass(node, className)));\n }));\n cleanupFns.push((/**\n * @return {?}\n */\n () => {\n enterNodeMap.forEach((/**\n * @param {?} nodes\n * @param {?} root\n * @return {?}\n */\n (nodes, root) => {\n /** @type {?} */\n const className = (/** @type {?} */ (enterNodeMapIds.get(root)));\n nodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => removeClass(node, className)));\n }));\n leaveNodeMap.forEach((/**\n * @param {?} nodes\n * @param {?} root\n * @return {?}\n */\n (nodes, root) => {\n /** @type {?} */\n const className = (/** @type {?} */ (leaveNodeMapIds.get(root)));\n nodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => removeClass(node, className)));\n }));\n allLeaveNodes.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => { this.processLeaveNode(element); }));\n }));\n /** @type {?} */\n const allPlayers = [];\n /** @type {?} */\n const erroneousTransitions = [];\n for (let i = this._namespaceList.length - 1; i >= 0; i--) {\n /** @type {?} */\n const ns = this._namespaceList[i];\n ns.drainQueuedTransitions(microtaskId).forEach((/**\n * @param {?} entry\n * @return {?}\n */\n entry => {\n /** @type {?} */\n const player = entry.player;\n /** @type {?} */\n const element = entry.element;\n allPlayers.push(player);\n if (this.collectedEnterElements.length) {\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n // move animations are currently not supported...\n if (details && details.setForMove) {\n player.destroy();\n return;\n }\n }\n /** @type {?} */\n const nodeIsOrphaned = !bodyNode || !this.driver.containsElement(bodyNode, element);\n /** @type {?} */\n const leaveClassName = (/** @type {?} */ (leaveNodeMapIds.get(element)));\n /** @type {?} */\n const enterClassName = (/** @type {?} */ (enterNodeMapIds.get(element)));\n /** @type {?} */\n const instruction = (/** @type {?} */ (this._buildInstruction(entry, subTimelines, enterClassName, leaveClassName, nodeIsOrphaned)));\n if (instruction.errors && instruction.errors.length) {\n erroneousTransitions.push(instruction);\n return;\n }\n // even though the element may not be apart of the DOM, it may\n // still be added at a later point (due to the mechanics of content\n // projection and/or dynamic component insertion) therefore it's\n // important we still style the element.\n if (nodeIsOrphaned) {\n player.onStart((/**\n * @return {?}\n */\n () => eraseStyles(element, instruction.fromStyles)));\n player.onDestroy((/**\n * @return {?}\n */\n () => setStyles(element, instruction.toStyles)));\n skippedPlayers.push(player);\n return;\n }\n // if a unmatched transition is queued to go then it SHOULD NOT render\n // an animation and cancel the previously running animations.\n if (entry.isFallbackTransition) {\n player.onStart((/**\n * @return {?}\n */\n () => eraseStyles(element, instruction.fromStyles)));\n player.onDestroy((/**\n * @return {?}\n */\n () => setStyles(element, instruction.toStyles)));\n skippedPlayers.push(player);\n return;\n }\n // this means that if a parent animation uses this animation as a sub trigger\n // then it will instruct the timeline builder to not add a player delay, but\n // instead stretch the first keyframe gap up until the animation starts. The\n // reason this is important is to prevent extra initialization styles from being\n // required by the user in the animation.\n instruction.timelines.forEach((/**\n * @param {?} tl\n * @return {?}\n */\n tl => tl.stretchStartingKeyframe = true));\n subTimelines.append(element, instruction.timelines);\n /** @type {?} */\n const tuple = { instruction, player, element };\n queuedInstructions.push(tuple);\n instruction.queriedElements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => getOrSetAsInMap(queriedElements, element, []).push(player)));\n instruction.preStyleProps.forEach((/**\n * @param {?} stringMap\n * @param {?} element\n * @return {?}\n */\n (stringMap, element) => {\n /** @type {?} */\n const props = Object.keys(stringMap);\n if (props.length) {\n /** @type {?} */\n let setVal = (/** @type {?} */ (allPreStyleElements.get(element)));\n if (!setVal) {\n allPreStyleElements.set(element, setVal = new Set());\n }\n props.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => setVal.add(prop)));\n }\n }));\n instruction.postStyleProps.forEach((/**\n * @param {?} stringMap\n * @param {?} element\n * @return {?}\n */\n (stringMap, element) => {\n /** @type {?} */\n const props = Object.keys(stringMap);\n /** @type {?} */\n let setVal = (/** @type {?} */ (allPostStyleElements.get(element)));\n if (!setVal) {\n allPostStyleElements.set(element, setVal = new Set());\n }\n props.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => setVal.add(prop)));\n }));\n }));\n }\n if (erroneousTransitions.length) {\n /** @type {?} */\n const errors = [];\n erroneousTransitions.forEach((/**\n * @param {?} instruction\n * @return {?}\n */\n instruction => {\n errors.push(`@${instruction.triggerName} has failed due to:\\n`);\n (/** @type {?} */ (instruction.errors)).forEach((/**\n * @param {?} error\n * @return {?}\n */\n error => errors.push(`- ${error}\\n`)));\n }));\n allPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => player.destroy()));\n this.reportError(errors);\n }\n /** @type {?} */\n const allPreviousPlayersMap = new Map();\n // this map works to tell which element in the DOM tree is contained by\n // which animation. Further down below this map will get populated once\n // the players are built and in doing so it can efficiently figure out\n // if a sub player is skipped due to a parent player having priority.\n /** @type {?} */\n const animationElementMap = new Map();\n queuedInstructions.forEach((/**\n * @param {?} entry\n * @return {?}\n */\n entry => {\n /** @type {?} */\n const element = entry.element;\n if (subTimelines.has(element)) {\n animationElementMap.set(element, element);\n this._beforeAnimationBuild(entry.player.namespaceId, entry.instruction, allPreviousPlayersMap);\n }\n }));\n skippedPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n /** @type {?} */\n const element = player.element;\n /** @type {?} */\n const previousPlayers = this._getPreviousPlayers(element, false, player.namespaceId, player.triggerName, null);\n previousPlayers.forEach((/**\n * @param {?} prevPlayer\n * @return {?}\n */\n prevPlayer => {\n getOrSetAsInMap(allPreviousPlayersMap, element, []).push(prevPlayer);\n prevPlayer.destroy();\n }));\n }));\n // this is a special case for nodes that will be removed (either by)\n // having their own leave animations or by being queried in a container\n // that will be removed once a parent animation is complete. The idea\n // here is that * styles must be identical to ! styles because of\n // backwards compatibility (* is also filled in by default in many places).\n // Otherwise * styles will return an empty value or auto since the element\n // that is being getComputedStyle'd will not be visible (since * = destination)\n /** @type {?} */\n const replaceNodes = allLeaveNodes.filter((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n return replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements);\n }));\n // POST STAGE: fill the * styles\n /** @type {?} */\n const postStylesMap = new Map();\n /** @type {?} */\n const allLeaveQueriedNodes = cloakAndComputeStyles(postStylesMap, this.driver, leaveNodesWithoutAnimations, allPostStyleElements, AUTO_STYLE);\n allLeaveQueriedNodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n if (replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements)) {\n replaceNodes.push(node);\n }\n }));\n // PRE STAGE: fill the ! styles\n /** @type {?} */\n const preStylesMap = new Map();\n enterNodeMap.forEach((/**\n * @param {?} nodes\n * @param {?} root\n * @return {?}\n */\n (nodes, root) => {\n cloakAndComputeStyles(preStylesMap, this.driver, new Set(nodes), allPreStyleElements, ɵPRE_STYLE);\n }));\n replaceNodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n /** @type {?} */\n const post = postStylesMap.get(node);\n /** @type {?} */\n const pre = preStylesMap.get(node);\n postStylesMap.set(node, (/** @type {?} */ (Object.assign(Object.assign({}, post), pre))));\n }));\n /** @type {?} */\n const rootPlayers = [];\n /** @type {?} */\n const subPlayers = [];\n /** @type {?} */\n const NO_PARENT_ANIMATION_ELEMENT_DETECTED = {};\n queuedInstructions.forEach((/**\n * @param {?} entry\n * @return {?}\n */\n entry => {\n const { element, player, instruction } = entry;\n // this means that it was never consumed by a parent animation which\n // means that it is independent and therefore should be set for animation\n if (subTimelines.has(element)) {\n if (disabledElementsSet.has(element)) {\n player.onDestroy((/**\n * @return {?}\n */\n () => setStyles(element, instruction.toStyles)));\n player.disabled = true;\n player.overrideTotalTime(instruction.totalTime);\n skippedPlayers.push(player);\n return;\n }\n // this will flow up the DOM and query the map to figure out\n // if a parent animation has priority over it. In the situation\n // that a parent is detected then it will cancel the loop. If\n // nothing is detected, or it takes a few hops to find a parent,\n // then it will fill in the missing nodes and signal them as having\n // a detected parent (or a NO_PARENT value via a special constant).\n /** @type {?} */\n let parentWithAnimation = NO_PARENT_ANIMATION_ELEMENT_DETECTED;\n if (animationElementMap.size > 1) {\n /** @type {?} */\n let elm = element;\n /** @type {?} */\n const parentsToAdd = [];\n while (elm = elm.parentNode) {\n /** @type {?} */\n const detectedParent = animationElementMap.get(elm);\n if (detectedParent) {\n parentWithAnimation = detectedParent;\n break;\n }\n parentsToAdd.push(elm);\n }\n parentsToAdd.forEach((/**\n * @param {?} parent\n * @return {?}\n */\n parent => animationElementMap.set(parent, parentWithAnimation)));\n }\n /** @type {?} */\n const innerPlayer = this._buildAnimation(player.namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap);\n player.setRealPlayer(innerPlayer);\n if (parentWithAnimation === NO_PARENT_ANIMATION_ELEMENT_DETECTED) {\n rootPlayers.push(player);\n }\n else {\n /** @type {?} */\n const parentPlayers = this.playersByElement.get(parentWithAnimation);\n if (parentPlayers && parentPlayers.length) {\n player.parentPlayer = optimizeGroupPlayer(parentPlayers);\n }\n skippedPlayers.push(player);\n }\n }\n else {\n eraseStyles(element, instruction.fromStyles);\n player.onDestroy((/**\n * @return {?}\n */\n () => setStyles(element, instruction.toStyles)));\n // there still might be a ancestor player animating this\n // element therefore we will still add it as a sub player\n // even if its animation may be disabled\n subPlayers.push(player);\n if (disabledElementsSet.has(element)) {\n skippedPlayers.push(player);\n }\n }\n }));\n // find all of the sub players' corresponding inner animation player\n subPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n // even if any players are not found for a sub animation then it\n // will still complete itself after the next tick since it's Noop\n /** @type {?} */\n const playersForElement = skippedPlayersMap.get(player.element);\n if (playersForElement && playersForElement.length) {\n /** @type {?} */\n const innerPlayer = optimizeGroupPlayer(playersForElement);\n player.setRealPlayer(innerPlayer);\n }\n }));\n // the reason why we don't actually play the animation is\n // because all that a skipped player is designed to do is to\n // fire the start/done transition callback events\n skippedPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n if (player.parentPlayer) {\n player.syncPlayerEvents(player.parentPlayer);\n }\n else {\n player.destroy();\n }\n }));\n // run through all of the queued removals and see if they\n // were picked up by a query. If not then perform the removal\n // operation right away unless a parent animation is ongoing.\n for (let i = 0; i < allLeaveNodes.length; i++) {\n /** @type {?} */\n const element = allLeaveNodes[i];\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n removeClass(element, LEAVE_CLASSNAME);\n // this means the element has a removal animation that is being\n // taken care of and therefore the inner elements will hang around\n // until that animation is over (or the parent queried animation)\n if (details && details.hasAnimation)\n continue;\n /** @type {?} */\n let players = [];\n // if this element is queried or if it contains queried children\n // then we want for the element not to be removed from the page\n // until the queried animations have finished\n if (queriedElements.size) {\n /** @type {?} */\n let queriedPlayerResults = queriedElements.get(element);\n if (queriedPlayerResults && queriedPlayerResults.length) {\n players.push(...queriedPlayerResults);\n }\n /** @type {?} */\n let queriedInnerElements = this.driver.query(element, NG_ANIMATING_SELECTOR, true);\n for (let j = 0; j < queriedInnerElements.length; j++) {\n /** @type {?} */\n let queriedPlayers = queriedElements.get(queriedInnerElements[j]);\n if (queriedPlayers && queriedPlayers.length) {\n players.push(...queriedPlayers);\n }\n }\n }\n /** @type {?} */\n const activePlayers = players.filter((/**\n * @param {?} p\n * @return {?}\n */\n p => !p.destroyed));\n if (activePlayers.length) {\n removeNodesAfterAnimationDone(this, element, activePlayers);\n }\n else {\n this.processLeaveNode(element);\n }\n }\n // this is required so the cleanup method doesn't remove them\n allLeaveNodes.length = 0;\n rootPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n this.players.push(player);\n player.onDone((/**\n * @return {?}\n */\n () => {\n player.destroy();\n /** @type {?} */\n const index = this.players.indexOf(player);\n this.players.splice(index, 1);\n }));\n player.play();\n }));\n return rootPlayers;\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @return {?}\n */\n elementContainsData(namespaceId, element) {\n /** @type {?} */\n let containsData = false;\n /** @type {?} */\n const details = (/** @type {?} */ (element[REMOVAL_FLAG]));\n if (details && details.setForRemoval)\n containsData = true;\n if (this.playersByElement.has(element))\n containsData = true;\n if (this.playersByQueriedElement.has(element))\n containsData = true;\n if (this.statesByElement.has(element))\n containsData = true;\n return this._fetchNamespace(namespaceId).elementContainsData(element) || containsData;\n }\n /**\n * @param {?} callback\n * @return {?}\n */\n afterFlush(callback) { this._flushFns.push(callback); }\n /**\n * @param {?} callback\n * @return {?}\n */\n afterFlushAnimationsDone(callback) { this._whenQuietFns.push(callback); }\n /**\n * @private\n * @param {?} element\n * @param {?} isQueriedElement\n * @param {?=} namespaceId\n * @param {?=} triggerName\n * @param {?=} toStateValue\n * @return {?}\n */\n _getPreviousPlayers(element, isQueriedElement, namespaceId, triggerName, toStateValue) {\n /** @type {?} */\n let players = [];\n if (isQueriedElement) {\n /** @type {?} */\n const queriedElementPlayers = this.playersByQueriedElement.get(element);\n if (queriedElementPlayers) {\n players = queriedElementPlayers;\n }\n }\n else {\n /** @type {?} */\n const elementPlayers = this.playersByElement.get(element);\n if (elementPlayers) {\n /** @type {?} */\n const isRemovalAnimation = !toStateValue || toStateValue == VOID_VALUE;\n elementPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n if (player.queued)\n return;\n if (!isRemovalAnimation && player.triggerName != triggerName)\n return;\n players.push(player);\n }));\n }\n }\n if (namespaceId || triggerName) {\n players = players.filter((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n if (namespaceId && namespaceId != player.namespaceId)\n return false;\n if (triggerName && triggerName != player.triggerName)\n return false;\n return true;\n }));\n }\n return players;\n }\n /**\n * @private\n * @param {?} namespaceId\n * @param {?} instruction\n * @param {?} allPreviousPlayersMap\n * @return {?}\n */\n _beforeAnimationBuild(namespaceId, instruction, allPreviousPlayersMap) {\n /** @type {?} */\n const triggerName = instruction.triggerName;\n /** @type {?} */\n const rootElement = instruction.element;\n // when a removal animation occurs, ALL previous players are collected\n // and destroyed (even if they are outside of the current namespace)\n /** @type {?} */\n const targetNameSpaceId = instruction.isRemovalTransition ? undefined : namespaceId;\n /** @type {?} */\n const targetTriggerName = instruction.isRemovalTransition ? undefined : triggerName;\n for (const timelineInstruction of instruction.timelines) {\n /** @type {?} */\n const element = timelineInstruction.element;\n /** @type {?} */\n const isQueriedElement = element !== rootElement;\n /** @type {?} */\n const players = getOrSetAsInMap(allPreviousPlayersMap, element, []);\n /** @type {?} */\n const previousPlayers = this._getPreviousPlayers(element, isQueriedElement, targetNameSpaceId, targetTriggerName, instruction.toState);\n previousPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n /** @type {?} */\n const realPlayer = (/** @type {?} */ (((/** @type {?} */ (player))).getRealPlayer()));\n if (realPlayer.beforeDestroy) {\n realPlayer.beforeDestroy();\n }\n player.destroy();\n players.push(player);\n }));\n }\n // this needs to be done so that the PRE/POST styles can be\n // computed properly without interfering with the previous animation\n eraseStyles(rootElement, instruction.fromStyles);\n }\n /**\n * @private\n * @param {?} namespaceId\n * @param {?} instruction\n * @param {?} allPreviousPlayersMap\n * @param {?} skippedPlayersMap\n * @param {?} preStylesMap\n * @param {?} postStylesMap\n * @return {?}\n */\n _buildAnimation(namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap) {\n /** @type {?} */\n const triggerName = instruction.triggerName;\n /** @type {?} */\n const rootElement = instruction.element;\n // we first run this so that the previous animation player\n // data can be passed into the successive animation players\n /** @type {?} */\n const allQueriedPlayers = [];\n /** @type {?} */\n const allConsumedElements = new Set();\n /** @type {?} */\n const allSubElements = new Set();\n /** @type {?} */\n const allNewPlayers = instruction.timelines.map((/**\n * @param {?} timelineInstruction\n * @return {?}\n */\n timelineInstruction => {\n /** @type {?} */\n const element = timelineInstruction.element;\n allConsumedElements.add(element);\n // FIXME (matsko): make sure to-be-removed animations are removed properly\n /** @type {?} */\n const details = element[REMOVAL_FLAG];\n if (details && details.removedBeforeQueried)\n return new NoopAnimationPlayer(timelineInstruction.duration, timelineInstruction.delay);\n /** @type {?} */\n const isQueriedElement = element !== rootElement;\n /** @type {?} */\n const previousPlayers = flattenGroupPlayers((allPreviousPlayersMap.get(element) || EMPTY_PLAYER_ARRAY)\n .map((/**\n * @param {?} p\n * @return {?}\n */\n p => p.getRealPlayer())))\n .filter((/**\n * @param {?} p\n * @return {?}\n */\n p => {\n // the `element` is not apart of the AnimationPlayer definition, but\n // Mock/WebAnimations\n // use the element within their implementation. This will be added in Angular5 to\n // AnimationPlayer\n /** @type {?} */\n const pp = (/** @type {?} */ (p));\n return pp.element ? pp.element === element : false;\n }));\n /** @type {?} */\n const preStyles = preStylesMap.get(element);\n /** @type {?} */\n const postStyles = postStylesMap.get(element);\n /** @type {?} */\n const keyframes = normalizeKeyframes(this.driver, this._normalizer, element, timelineInstruction.keyframes, preStyles, postStyles);\n /** @type {?} */\n const player = this._buildPlayer(timelineInstruction, keyframes, previousPlayers);\n // this means that this particular player belongs to a sub trigger. It is\n // important that we match this player up with the corresponding (@trigger.listener)\n if (timelineInstruction.subTimeline && skippedPlayersMap) {\n allSubElements.add(element);\n }\n if (isQueriedElement) {\n /** @type {?} */\n const wrappedPlayer = new TransitionAnimationPlayer(namespaceId, triggerName, element);\n wrappedPlayer.setRealPlayer(player);\n allQueriedPlayers.push(wrappedPlayer);\n }\n return player;\n }));\n allQueriedPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n getOrSetAsInMap(this.playersByQueriedElement, player.element, []).push(player);\n player.onDone((/**\n * @return {?}\n */\n () => deleteOrUnsetInMap(this.playersByQueriedElement, player.element, player)));\n }));\n allConsumedElements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => addClass(element, NG_ANIMATING_CLASSNAME)));\n /** @type {?} */\n const player = optimizeGroupPlayer(allNewPlayers);\n player.onDestroy((/**\n * @return {?}\n */\n () => {\n allConsumedElements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => removeClass(element, NG_ANIMATING_CLASSNAME)));\n setStyles(rootElement, instruction.toStyles);\n }));\n // this basically makes all of the callbacks for sub element animations\n // be dependent on the upper players for when they finish\n allSubElements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => { getOrSetAsInMap(skippedPlayersMap, element, []).push(player); }));\n return player;\n }\n /**\n * @private\n * @param {?} instruction\n * @param {?} keyframes\n * @param {?} previousPlayers\n * @return {?}\n */\n _buildPlayer(instruction, keyframes, previousPlayers) {\n if (keyframes.length > 0) {\n return this.driver.animate(instruction.element, keyframes, instruction.duration, instruction.delay, instruction.easing, previousPlayers);\n }\n // special case for when an empty transition|definition is provided\n // ... there is no point in rendering an empty animation\n return new NoopAnimationPlayer(instruction.duration, instruction.delay);\n }\n}\nif (false) {\n /** @type {?} */\n TransitionAnimationEngine.prototype.players;\n /** @type {?} */\n TransitionAnimationEngine.prototype.newHostElements;\n /** @type {?} */\n TransitionAnimationEngine.prototype.playersByElement;\n /** @type {?} */\n TransitionAnimationEngine.prototype.playersByQueriedElement;\n /** @type {?} */\n TransitionAnimationEngine.prototype.statesByElement;\n /** @type {?} */\n TransitionAnimationEngine.prototype.disabledNodes;\n /** @type {?} */\n TransitionAnimationEngine.prototype.totalAnimations;\n /** @type {?} */\n TransitionAnimationEngine.prototype.totalQueuedPlayers;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationEngine.prototype._namespaceLookup;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationEngine.prototype._namespaceList;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationEngine.prototype._flushFns;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationEngine.prototype._whenQuietFns;\n /** @type {?} */\n TransitionAnimationEngine.prototype.namespacesByHostElement;\n /** @type {?} */\n TransitionAnimationEngine.prototype.collectedEnterElements;\n /** @type {?} */\n TransitionAnimationEngine.prototype.collectedLeaveElements;\n /** @type {?} */\n TransitionAnimationEngine.prototype.onRemovalComplete;\n /** @type {?} */\n TransitionAnimationEngine.prototype.bodyNode;\n /** @type {?} */\n TransitionAnimationEngine.prototype.driver;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationEngine.prototype._normalizer;\n}\nclass TransitionAnimationPlayer {\n /**\n * @param {?} namespaceId\n * @param {?} triggerName\n * @param {?} element\n */\n constructor(namespaceId, triggerName, element) {\n this.namespaceId = namespaceId;\n this.triggerName = triggerName;\n this.element = element;\n this._player = new NoopAnimationPlayer();\n this._containsRealPlayer = false;\n this._queuedCallbacks = {};\n this.destroyed = false;\n this.markedForDestroy = false;\n this.disabled = false;\n this.queued = true;\n this.totalTime = 0;\n }\n /**\n * @param {?} player\n * @return {?}\n */\n setRealPlayer(player) {\n if (this._containsRealPlayer)\n return;\n this._player = player;\n Object.keys(this._queuedCallbacks).forEach((/**\n * @param {?} phase\n * @return {?}\n */\n phase => {\n this._queuedCallbacks[phase].forEach((/**\n * @param {?} callback\n * @return {?}\n */\n callback => listenOnPlayer(player, phase, undefined, callback)));\n }));\n this._queuedCallbacks = {};\n this._containsRealPlayer = true;\n this.overrideTotalTime(player.totalTime);\n ((/** @type {?} */ (this))).queued = false;\n }\n /**\n * @return {?}\n */\n getRealPlayer() { return this._player; }\n /**\n * @param {?} totalTime\n * @return {?}\n */\n overrideTotalTime(totalTime) { ((/** @type {?} */ (this))).totalTime = totalTime; }\n /**\n * @param {?} player\n * @return {?}\n */\n syncPlayerEvents(player) {\n /** @type {?} */\n const p = (/** @type {?} */ (this._player));\n if (p.triggerCallback) {\n player.onStart((/**\n * @return {?}\n */\n () => (/** @type {?} */ (p.triggerCallback))('start')));\n }\n player.onDone((/**\n * @return {?}\n */\n () => this.finish()));\n player.onDestroy((/**\n * @return {?}\n */\n () => this.destroy()));\n }\n /**\n * @private\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n _queueEvent(name, callback) {\n getOrSetAsInMap(this._queuedCallbacks, name, []).push(callback);\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDone(fn) {\n if (this.queued) {\n this._queueEvent('done', fn);\n }\n this._player.onDone(fn);\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onStart(fn) {\n if (this.queued) {\n this._queueEvent('start', fn);\n }\n this._player.onStart(fn);\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDestroy(fn) {\n if (this.queued) {\n this._queueEvent('destroy', fn);\n }\n this._player.onDestroy(fn);\n }\n /**\n * @return {?}\n */\n init() { this._player.init(); }\n /**\n * @return {?}\n */\n hasStarted() { return this.queued ? false : this._player.hasStarted(); }\n /**\n * @return {?}\n */\n play() { !this.queued && this._player.play(); }\n /**\n * @return {?}\n */\n pause() { !this.queued && this._player.pause(); }\n /**\n * @return {?}\n */\n restart() { !this.queued && this._player.restart(); }\n /**\n * @return {?}\n */\n finish() { this._player.finish(); }\n /**\n * @return {?}\n */\n destroy() {\n ((/** @type {?} */ (this))).destroyed = true;\n this._player.destroy();\n }\n /**\n * @return {?}\n */\n reset() { !this.queued && this._player.reset(); }\n /**\n * @param {?} p\n * @return {?}\n */\n setPosition(p) {\n if (!this.queued) {\n this._player.setPosition(p);\n }\n }\n /**\n * @return {?}\n */\n getPosition() { return this.queued ? 0 : this._player.getPosition(); }\n /**\n * \\@internal\n * @param {?} phaseName\n * @return {?}\n */\n triggerCallback(phaseName) {\n /** @type {?} */\n const p = (/** @type {?} */ (this._player));\n if (p.triggerCallback) {\n p.triggerCallback(phaseName);\n }\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationPlayer.prototype._player;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationPlayer.prototype._containsRealPlayer;\n /**\n * @type {?}\n * @private\n */\n TransitionAnimationPlayer.prototype._queuedCallbacks;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.destroyed;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.parentPlayer;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.markedForDestroy;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.disabled;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.queued;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.totalTime;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.namespaceId;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.triggerName;\n /** @type {?} */\n TransitionAnimationPlayer.prototype.element;\n}\n/**\n * @param {?} map\n * @param {?} key\n * @param {?} value\n * @return {?}\n */\nfunction deleteOrUnsetInMap(map, key, value) {\n /** @type {?} */\n let currentValues;\n if (map instanceof Map) {\n currentValues = map.get(key);\n if (currentValues) {\n if (currentValues.length) {\n /** @type {?} */\n const index = currentValues.indexOf(value);\n currentValues.splice(index, 1);\n }\n if (currentValues.length == 0) {\n map.delete(key);\n }\n }\n }\n else {\n currentValues = map[key];\n if (currentValues) {\n if (currentValues.length) {\n /** @type {?} */\n const index = currentValues.indexOf(value);\n currentValues.splice(index, 1);\n }\n if (currentValues.length == 0) {\n delete map[key];\n }\n }\n }\n return currentValues;\n}\n/**\n * @param {?} value\n * @return {?}\n */\nfunction normalizeTriggerValue(value) {\n // we use `!= null` here because it's the most simple\n // way to test against a \"falsy\" value without mixing\n // in empty strings or a zero value. DO NOT OPTIMIZE.\n return value != null ? value : null;\n}\n/**\n * @param {?} node\n * @return {?}\n */\nfunction isElementNode(node) {\n return node && node['nodeType'] === 1;\n}\n/**\n * @param {?} eventName\n * @return {?}\n */\nfunction isTriggerEventValid(eventName) {\n return eventName == 'start' || eventName == 'done';\n}\n/**\n * @param {?} element\n * @param {?=} value\n * @return {?}\n */\nfunction cloakElement(element, value) {\n /** @type {?} */\n const oldValue = element.style.display;\n element.style.display = value != null ? value : 'none';\n return oldValue;\n}\n/**\n * @param {?} valuesMap\n * @param {?} driver\n * @param {?} elements\n * @param {?} elementPropsMap\n * @param {?} defaultStyle\n * @return {?}\n */\nfunction cloakAndComputeStyles(valuesMap, driver, elements, elementPropsMap, defaultStyle) {\n /** @type {?} */\n const cloakVals = [];\n elements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => cloakVals.push(cloakElement(element))));\n /** @type {?} */\n const failedElements = [];\n elementPropsMap.forEach((/**\n * @param {?} props\n * @param {?} element\n * @return {?}\n */\n (props, element) => {\n /** @type {?} */\n const styles = {};\n props.forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const value = styles[prop] = driver.computeStyle(element, prop, defaultStyle);\n // there is no easy way to detect this because a sub element could be removed\n // by a parent animation element being detached.\n if (!value || value.length == 0) {\n element[REMOVAL_FLAG] = NULL_REMOVED_QUERIED_STATE;\n failedElements.push(element);\n }\n }));\n valuesMap.set(element, styles);\n }));\n // we use a index variable here since Set.forEach(a, i) does not return\n // an index value for the closure (but instead just the value)\n /** @type {?} */\n let i = 0;\n elements.forEach((/**\n * @param {?} element\n * @return {?}\n */\n element => cloakElement(element, cloakVals[i++])));\n return failedElements;\n}\n/*\nSince the Angular renderer code will return a collection of inserted\nnodes in all areas of a DOM tree, it's up to this algorithm to figure\nout which nodes are roots for each animation @trigger.\n\nBy placing each inserted node into a Set and traversing upwards, it\nis possible to find the @trigger elements and well any direct *star\ninsertion nodes, if a @trigger root is found then the enter element\nis placed into the Map[@trigger] spot.\n */\n/**\n * @param {?} roots\n * @param {?} nodes\n * @return {?}\n */\nfunction buildRootMap(roots, nodes) {\n /** @type {?} */\n const rootMap = new Map();\n roots.forEach((/**\n * @param {?} root\n * @return {?}\n */\n root => rootMap.set(root, [])));\n if (nodes.length == 0)\n return rootMap;\n /** @type {?} */\n const NULL_NODE = 1;\n /** @type {?} */\n const nodeSet = new Set(nodes);\n /** @type {?} */\n const localRootMap = new Map();\n /**\n * @param {?} node\n * @return {?}\n */\n function getRoot(node) {\n if (!node)\n return NULL_NODE;\n /** @type {?} */\n let root = localRootMap.get(node);\n if (root)\n return root;\n /** @type {?} */\n const parent = node.parentNode;\n if (rootMap.has(parent)) { // ngIf inside @trigger\n root = parent;\n }\n else if (nodeSet.has(parent)) { // ngIf inside ngIf\n root = NULL_NODE;\n }\n else { // recurse upwards\n root = getRoot(parent);\n }\n localRootMap.set(node, root);\n return root;\n }\n nodes.forEach((/**\n * @param {?} node\n * @return {?}\n */\n node => {\n /** @type {?} */\n const root = getRoot(node);\n if (root !== NULL_NODE) {\n (/** @type {?} */ (rootMap.get(root))).push(node);\n }\n }));\n return rootMap;\n}\n/** @type {?} */\nconst CLASSES_CACHE_KEY = '$$classes';\n/**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\nfunction containsClass(element, className) {\n if (element.classList) {\n return element.classList.contains(className);\n }\n else {\n /** @type {?} */\n const classes = element[CLASSES_CACHE_KEY];\n return classes && classes[className];\n }\n}\n/**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\nfunction addClass(element, className) {\n if (element.classList) {\n element.classList.add(className);\n }\n else {\n /** @type {?} */\n let classes = element[CLASSES_CACHE_KEY];\n if (!classes) {\n classes = element[CLASSES_CACHE_KEY] = {};\n }\n classes[className] = true;\n }\n}\n/**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\nfunction removeClass(element, className) {\n if (element.classList) {\n element.classList.remove(className);\n }\n else {\n /** @type {?} */\n let classes = element[CLASSES_CACHE_KEY];\n if (classes) {\n delete classes[className];\n }\n }\n}\n/**\n * @param {?} engine\n * @param {?} element\n * @param {?} players\n * @return {?}\n */\nfunction removeNodesAfterAnimationDone(engine, element, players) {\n optimizeGroupPlayer(players).onDone((/**\n * @return {?}\n */\n () => engine.processLeaveNode(element)));\n}\n/**\n * @param {?} players\n * @return {?}\n */\nfunction flattenGroupPlayers(players) {\n /** @type {?} */\n const finalPlayers = [];\n _flattenGroupPlayersRecur(players, finalPlayers);\n return finalPlayers;\n}\n/**\n * @param {?} players\n * @param {?} finalPlayers\n * @return {?}\n */\nfunction _flattenGroupPlayersRecur(players, finalPlayers) {\n for (let i = 0; i < players.length; i++) {\n /** @type {?} */\n const player = players[i];\n if (player instanceof ɵAnimationGroupPlayer) {\n _flattenGroupPlayersRecur(player.players, finalPlayers);\n }\n else {\n finalPlayers.push(player);\n }\n }\n}\n/**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\nfunction objEquals(a, b) {\n /** @type {?} */\n const k1 = Object.keys(a);\n /** @type {?} */\n const k2 = Object.keys(b);\n if (k1.length != k2.length)\n return false;\n for (let i = 0; i < k1.length; i++) {\n /** @type {?} */\n const prop = k1[i];\n if (!b.hasOwnProperty(prop) || a[prop] !== b[prop])\n return false;\n }\n return true;\n}\n/**\n * @param {?} element\n * @param {?} allPreStyleElements\n * @param {?} allPostStyleElements\n * @return {?}\n */\nfunction replacePostStylesAsPre(element, allPreStyleElements, allPostStyleElements) {\n /** @type {?} */\n const postEntry = allPostStyleElements.get(element);\n if (!postEntry)\n return false;\n /** @type {?} */\n let preEntry = allPreStyleElements.get(element);\n if (preEntry) {\n postEntry.forEach((/**\n * @param {?} data\n * @return {?}\n */\n data => (/** @type {?} */ (preEntry)).add(data)));\n }\n else {\n allPreStyleElements.set(element, postEntry);\n }\n allPostStyleElements.delete(element);\n return true;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/animation_engine_next.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass AnimationEngine {\n /**\n * @param {?} bodyNode\n * @param {?} _driver\n * @param {?} normalizer\n */\n constructor(bodyNode, _driver, normalizer) {\n this.bodyNode = bodyNode;\n this._driver = _driver;\n this._triggerCache = {};\n // this method is designed to be overridden by the code that uses this engine\n this.onRemovalComplete = (/**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n (element, context) => { });\n this._transitionEngine = new TransitionAnimationEngine(bodyNode, _driver, normalizer);\n this._timelineEngine = new TimelineAnimationEngine(bodyNode, _driver, normalizer);\n this._transitionEngine.onRemovalComplete = (/**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n (element, context) => this.onRemovalComplete(element, context));\n }\n /**\n * @param {?} componentId\n * @param {?} namespaceId\n * @param {?} hostElement\n * @param {?} name\n * @param {?} metadata\n * @return {?}\n */\n registerTrigger(componentId, namespaceId, hostElement, name, metadata) {\n /** @type {?} */\n const cacheKey = componentId + '-' + name;\n /** @type {?} */\n let trigger = this._triggerCache[cacheKey];\n if (!trigger) {\n /** @type {?} */\n const errors = [];\n /** @type {?} */\n const ast = (/** @type {?} */ (buildAnimationAst(this._driver, (/** @type {?} */ (metadata)), errors)));\n if (errors.length) {\n throw new Error(`The animation trigger \"${name}\" has failed to build due to the following errors:\\n - ${errors.join(\"\\n - \")}`);\n }\n trigger = buildTrigger(name, ast);\n this._triggerCache[cacheKey] = trigger;\n }\n this._transitionEngine.registerTrigger(namespaceId, name, trigger);\n }\n /**\n * @param {?} namespaceId\n * @param {?} hostElement\n * @return {?}\n */\n register(namespaceId, hostElement) {\n this._transitionEngine.register(namespaceId, hostElement);\n }\n /**\n * @param {?} namespaceId\n * @param {?} context\n * @return {?}\n */\n destroy(namespaceId, context) {\n this._transitionEngine.destroy(namespaceId, context);\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} parent\n * @param {?} insertBefore\n * @return {?}\n */\n onInsert(namespaceId, element, parent, insertBefore) {\n this._transitionEngine.insertNode(namespaceId, element, parent, insertBefore);\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} context\n * @param {?=} isHostElement\n * @return {?}\n */\n onRemove(namespaceId, element, context, isHostElement) {\n this._transitionEngine.removeNode(namespaceId, element, isHostElement || false, context);\n }\n /**\n * @param {?} element\n * @param {?} disable\n * @return {?}\n */\n disableAnimations(element, disable) {\n this._transitionEngine.markElementAsDisabled(element, disable);\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} property\n * @param {?} value\n * @return {?}\n */\n process(namespaceId, element, property, value) {\n if (property.charAt(0) == '@') {\n const [id, action] = parseTimelineCommand(property);\n /** @type {?} */\n const args = (/** @type {?} */ (value));\n this._timelineEngine.command(id, element, action, args);\n }\n else {\n this._transitionEngine.trigger(namespaceId, element, property, value);\n }\n }\n /**\n * @param {?} namespaceId\n * @param {?} element\n * @param {?} eventName\n * @param {?} eventPhase\n * @param {?} callback\n * @return {?}\n */\n listen(namespaceId, element, eventName, eventPhase, callback) {\n // @@listen\n if (eventName.charAt(0) == '@') {\n const [id, action] = parseTimelineCommand(eventName);\n return this._timelineEngine.listen(id, element, action, callback);\n }\n return this._transitionEngine.listen(namespaceId, element, eventName, eventPhase, callback);\n }\n /**\n * @param {?=} microtaskId\n * @return {?}\n */\n flush(microtaskId = -1) { this._transitionEngine.flush(microtaskId); }\n /**\n * @return {?}\n */\n get players() {\n return ((/** @type {?} */ (this._transitionEngine.players)))\n .concat((/** @type {?} */ (this._timelineEngine.players)));\n }\n /**\n * @return {?}\n */\n whenRenderingDone() { return this._transitionEngine.whenRenderingDone(); }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n AnimationEngine.prototype._transitionEngine;\n /**\n * @type {?}\n * @private\n */\n AnimationEngine.prototype._timelineEngine;\n /**\n * @type {?}\n * @private\n */\n AnimationEngine.prototype._triggerCache;\n /** @type {?} */\n AnimationEngine.prototype.onRemovalComplete;\n /**\n * @type {?}\n * @private\n */\n AnimationEngine.prototype.bodyNode;\n /**\n * @type {?}\n * @private\n */\n AnimationEngine.prototype._driver;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/special_cased_styles.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * Returns an instance of `SpecialCasedStyles` if and when any special (non animateable) styles are\n * detected.\n *\n * In CSS there exist properties that cannot be animated within a keyframe animation\n * (whether it be via CSS keyframes or web-animations) and the animation implementation\n * will ignore them. This function is designed to detect those special cased styles and\n * return a container that will be executed at the start and end of the animation.\n *\n * @param {?} element\n * @param {?} styles\n * @return {?} an instance of `SpecialCasedStyles` if any special styles are detected otherwise `null`\n */\nfunction packageNonAnimatableStyles(element, styles) {\n /** @type {?} */\n let startStyles = null;\n /** @type {?} */\n let endStyles = null;\n if (Array.isArray(styles) && styles.length) {\n startStyles = filterNonAnimatableStyles(styles[0]);\n if (styles.length > 1) {\n endStyles = filterNonAnimatableStyles(styles[styles.length - 1]);\n }\n }\n else if (styles) {\n startStyles = filterNonAnimatableStyles(styles);\n }\n return (startStyles || endStyles) ? new SpecialCasedStyles(element, startStyles, endStyles) :\n null;\n}\n/**\n * Designed to be executed during a keyframe-based animation to apply any special-cased styles.\n *\n * When started (when the `start()` method is run) then the provided `startStyles`\n * will be applied. When finished (when the `finish()` method is called) the\n * `endStyles` will be applied as well any any starting styles. Finally when\n * `destroy()` is called then all styles will be removed.\n */\nclass SpecialCasedStyles {\n /**\n * @param {?} _element\n * @param {?} _startStyles\n * @param {?} _endStyles\n */\n constructor(_element, _startStyles, _endStyles) {\n this._element = _element;\n this._startStyles = _startStyles;\n this._endStyles = _endStyles;\n this._state = 0 /* Pending */;\n /** @type {?} */\n let initialStyles = SpecialCasedStyles.initialStylesByElement.get(_element);\n if (!initialStyles) {\n SpecialCasedStyles.initialStylesByElement.set(_element, initialStyles = {});\n }\n this._initialStyles = initialStyles;\n }\n /**\n * @return {?}\n */\n start() {\n if (this._state < 1 /* Started */) {\n if (this._startStyles) {\n setStyles(this._element, this._startStyles, this._initialStyles);\n }\n this._state = 1 /* Started */;\n }\n }\n /**\n * @return {?}\n */\n finish() {\n this.start();\n if (this._state < 2 /* Finished */) {\n setStyles(this._element, this._initialStyles);\n if (this._endStyles) {\n setStyles(this._element, this._endStyles);\n this._endStyles = null;\n }\n this._state = 1 /* Started */;\n }\n }\n /**\n * @return {?}\n */\n destroy() {\n this.finish();\n if (this._state < 3 /* Destroyed */) {\n SpecialCasedStyles.initialStylesByElement.delete(this._element);\n if (this._startStyles) {\n eraseStyles(this._element, this._startStyles);\n this._endStyles = null;\n }\n if (this._endStyles) {\n eraseStyles(this._element, this._endStyles);\n this._endStyles = null;\n }\n setStyles(this._element, this._initialStyles);\n this._state = 3 /* Destroyed */;\n }\n }\n}\nSpecialCasedStyles.initialStylesByElement = new WeakMap();\nif (false) {\n /** @type {?} */\n SpecialCasedStyles.initialStylesByElement;\n /**\n * @type {?}\n * @private\n */\n SpecialCasedStyles.prototype._state;\n /**\n * @type {?}\n * @private\n */\n SpecialCasedStyles.prototype._initialStyles;\n /**\n * @type {?}\n * @private\n */\n SpecialCasedStyles.prototype._element;\n /**\n * @type {?}\n * @private\n */\n SpecialCasedStyles.prototype._startStyles;\n /**\n * @type {?}\n * @private\n */\n SpecialCasedStyles.prototype._endStyles;\n}\n/** @enum {number} */\nconst SpecialCasedStylesState = {\n Pending: 0,\n Started: 1,\n Finished: 2,\n Destroyed: 3,\n};\n/**\n * @param {?} styles\n * @return {?}\n */\nfunction filterNonAnimatableStyles(styles) {\n /** @type {?} */\n let result = null;\n /** @type {?} */\n const props = Object.keys(styles);\n for (let i = 0; i < props.length; i++) {\n /** @type {?} */\n const prop = props[i];\n if (isNonAnimatableStyle(prop)) {\n result = result || {};\n result[prop] = styles[prop];\n }\n }\n return result;\n}\n/**\n * @param {?} prop\n * @return {?}\n */\nfunction isNonAnimatableStyle(prop) {\n return prop === 'display' || prop === 'position';\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/css_keyframes/element_animation_style_handler.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @type {?}\n */\nconst ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\n/** @type {?} */\nconst ANIMATION_PROP = 'animation';\n/** @type {?} */\nconst ANIMATIONEND_EVENT = 'animationend';\n/** @type {?} */\nconst ONE_SECOND$1 = 1000;\nclass ElementAnimationStyleHandler {\n /**\n * @param {?} _element\n * @param {?} _name\n * @param {?} _duration\n * @param {?} _delay\n * @param {?} _easing\n * @param {?} _fillMode\n * @param {?} _onDoneFn\n */\n constructor(_element, _name, _duration, _delay, _easing, _fillMode, _onDoneFn) {\n this._element = _element;\n this._name = _name;\n this._duration = _duration;\n this._delay = _delay;\n this._easing = _easing;\n this._fillMode = _fillMode;\n this._onDoneFn = _onDoneFn;\n this._finished = false;\n this._destroyed = false;\n this._startTime = 0;\n this._position = 0;\n this._eventFn = (/**\n * @param {?} e\n * @return {?}\n */\n (e) => this._handleCallback(e));\n }\n /**\n * @return {?}\n */\n apply() {\n applyKeyframeAnimation(this._element, `${this._duration}ms ${this._easing} ${this._delay}ms 1 normal ${this._fillMode} ${this._name}`);\n addRemoveAnimationEvent(this._element, this._eventFn, false);\n this._startTime = Date.now();\n }\n /**\n * @return {?}\n */\n pause() { playPauseAnimation(this._element, this._name, 'paused'); }\n /**\n * @return {?}\n */\n resume() { playPauseAnimation(this._element, this._name, 'running'); }\n /**\n * @param {?} position\n * @return {?}\n */\n setPosition(position) {\n /** @type {?} */\n const index = findIndexForAnimation(this._element, this._name);\n this._position = position * this._duration;\n setAnimationStyle(this._element, 'Delay', `-${this._position}ms`, index);\n }\n /**\n * @return {?}\n */\n getPosition() { return this._position; }\n /**\n * @private\n * @param {?} event\n * @return {?}\n */\n _handleCallback(event) {\n /** @type {?} */\n const timestamp = event._ngTestManualTimestamp || Date.now();\n /** @type {?} */\n const elapsedTime = parseFloat(event.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)) * ONE_SECOND$1;\n if (event.animationName == this._name &&\n Math.max(timestamp - this._startTime, 0) >= this._delay && elapsedTime >= this._duration) {\n this.finish();\n }\n }\n /**\n * @return {?}\n */\n finish() {\n if (this._finished)\n return;\n this._finished = true;\n this._onDoneFn();\n addRemoveAnimationEvent(this._element, this._eventFn, true);\n }\n /**\n * @return {?}\n */\n destroy() {\n if (this._destroyed)\n return;\n this._destroyed = true;\n this.finish();\n removeKeyframeAnimation(this._element, this._name);\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._eventFn;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._finished;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._destroyed;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._startTime;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._position;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._element;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._name;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._duration;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._delay;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._easing;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._fillMode;\n /**\n * @type {?}\n * @private\n */\n ElementAnimationStyleHandler.prototype._onDoneFn;\n}\n/**\n * @param {?} element\n * @param {?} name\n * @param {?} status\n * @return {?}\n */\nfunction playPauseAnimation(element, name, status) {\n /** @type {?} */\n const index = findIndexForAnimation(element, name);\n setAnimationStyle(element, 'PlayState', status, index);\n}\n/**\n * @param {?} element\n * @param {?} value\n * @return {?}\n */\nfunction applyKeyframeAnimation(element, value) {\n /** @type {?} */\n const anim = getAnimationStyle(element, '').trim();\n /** @type {?} */\n let index = 0;\n if (anim.length) {\n index = countChars(anim, ',') + 1;\n value = `${anim}, ${value}`;\n }\n setAnimationStyle(element, '', value);\n return index;\n}\n/**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\nfunction removeKeyframeAnimation(element, name) {\n /** @type {?} */\n const anim = getAnimationStyle(element, '');\n /** @type {?} */\n const tokens = anim.split(',');\n /** @type {?} */\n const index = findMatchingTokenIndex(tokens, name);\n if (index >= 0) {\n tokens.splice(index, 1);\n /** @type {?} */\n const newValue = tokens.join(',');\n setAnimationStyle(element, '', newValue);\n }\n}\n/**\n * @param {?} element\n * @param {?} value\n * @return {?}\n */\nfunction findIndexForAnimation(element, value) {\n /** @type {?} */\n const anim = getAnimationStyle(element, '');\n if (anim.indexOf(',') > 0) {\n /** @type {?} */\n const tokens = anim.split(',');\n return findMatchingTokenIndex(tokens, value);\n }\n return findMatchingTokenIndex([anim], value);\n}\n/**\n * @param {?} tokens\n * @param {?} searchToken\n * @return {?}\n */\nfunction findMatchingTokenIndex(tokens, searchToken) {\n for (let i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(searchToken) >= 0) {\n return i;\n }\n }\n return -1;\n}\n/**\n * @param {?} element\n * @param {?} fn\n * @param {?} doRemove\n * @return {?}\n */\nfunction addRemoveAnimationEvent(element, fn, doRemove) {\n doRemove ? element.removeEventListener(ANIMATIONEND_EVENT, fn) :\n element.addEventListener(ANIMATIONEND_EVENT, fn);\n}\n/**\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @param {?=} index\n * @return {?}\n */\nfunction setAnimationStyle(element, name, value, index) {\n /** @type {?} */\n const prop = ANIMATION_PROP + name;\n if (index != null) {\n /** @type {?} */\n const oldValue = element.style[prop];\n if (oldValue.length) {\n /** @type {?} */\n const tokens = oldValue.split(',');\n tokens[index] = value;\n value = tokens.join(',');\n }\n }\n element.style[prop] = value;\n}\n/**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\nfunction getAnimationStyle(element, name) {\n return element.style[ANIMATION_PROP + name];\n}\n/**\n * @param {?} value\n * @param {?} char\n * @return {?}\n */\nfunction countChars(value, char) {\n /** @type {?} */\n let count = 0;\n for (let i = 0; i < value.length; i++) {\n /** @type {?} */\n const c = value.charAt(i);\n if (c === char)\n count++;\n }\n return count;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/css_keyframes/css_keyframes_player.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst DEFAULT_FILL_MODE = 'forwards';\n/** @type {?} */\nconst DEFAULT_EASING = 'linear';\n/** @enum {number} */\nconst AnimatorControlState = {\n INITIALIZED: 1, STARTED: 2, FINISHED: 3, DESTROYED: 4,\n};\nclass CssKeyframesPlayer {\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} animationName\n * @param {?} _duration\n * @param {?} _delay\n * @param {?} easing\n * @param {?} _finalStyles\n * @param {?=} _specialStyles\n */\n constructor(element, keyframes, animationName, _duration, _delay, easing, _finalStyles, _specialStyles) {\n this.element = element;\n this.keyframes = keyframes;\n this.animationName = animationName;\n this._duration = _duration;\n this._delay = _delay;\n this._finalStyles = _finalStyles;\n this._specialStyles = _specialStyles;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._onDestroyFns = [];\n this._started = false;\n this.currentSnapshot = {};\n this._state = 0;\n this.easing = easing || DEFAULT_EASING;\n this.totalTime = _duration + _delay;\n this._buildStyler();\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onStart(fn) { this._onStartFns.push(fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDone(fn) { this._onDoneFns.push(fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDestroy(fn) { this._onDestroyFns.push(fn); }\n /**\n * @return {?}\n */\n destroy() {\n this.init();\n if (this._state >= 4 /* DESTROYED */)\n return;\n this._state = 4 /* DESTROYED */;\n this._styler.destroy();\n this._flushStartFns();\n this._flushDoneFns();\n if (this._specialStyles) {\n this._specialStyles.destroy();\n }\n this._onDestroyFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onDestroyFns = [];\n }\n /**\n * @private\n * @return {?}\n */\n _flushDoneFns() {\n this._onDoneFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onDoneFns = [];\n }\n /**\n * @private\n * @return {?}\n */\n _flushStartFns() {\n this._onStartFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onStartFns = [];\n }\n /**\n * @return {?}\n */\n finish() {\n this.init();\n if (this._state >= 3 /* FINISHED */)\n return;\n this._state = 3 /* FINISHED */;\n this._styler.finish();\n this._flushStartFns();\n if (this._specialStyles) {\n this._specialStyles.finish();\n }\n this._flushDoneFns();\n }\n /**\n * @param {?} value\n * @return {?}\n */\n setPosition(value) { this._styler.setPosition(value); }\n /**\n * @return {?}\n */\n getPosition() { return this._styler.getPosition(); }\n /**\n * @return {?}\n */\n hasStarted() { return this._state >= 2 /* STARTED */; }\n /**\n * @return {?}\n */\n init() {\n if (this._state >= 1 /* INITIALIZED */)\n return;\n this._state = 1 /* INITIALIZED */;\n /** @type {?} */\n const elm = this.element;\n this._styler.apply();\n if (this._delay) {\n this._styler.pause();\n }\n }\n /**\n * @return {?}\n */\n play() {\n this.init();\n if (!this.hasStarted()) {\n this._flushStartFns();\n this._state = 2 /* STARTED */;\n if (this._specialStyles) {\n this._specialStyles.start();\n }\n }\n this._styler.resume();\n }\n /**\n * @return {?}\n */\n pause() {\n this.init();\n this._styler.pause();\n }\n /**\n * @return {?}\n */\n restart() {\n this.reset();\n this.play();\n }\n /**\n * @return {?}\n */\n reset() {\n this._styler.destroy();\n this._buildStyler();\n this._styler.apply();\n }\n /**\n * @private\n * @return {?}\n */\n _buildStyler() {\n this._styler = new ElementAnimationStyleHandler(this.element, this.animationName, this._duration, this._delay, this.easing, DEFAULT_FILL_MODE, (/**\n * @return {?}\n */\n () => this.finish()));\n }\n /**\n * \\@internal\n * @param {?} phaseName\n * @return {?}\n */\n triggerCallback(phaseName) {\n /** @type {?} */\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n methods.length = 0;\n }\n /**\n * @return {?}\n */\n beforeDestroy() {\n this.init();\n /** @type {?} */\n const styles = {};\n if (this.hasStarted()) {\n /** @type {?} */\n const finished = this._state >= 3 /* FINISHED */;\n Object.keys(this._finalStyles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (prop != 'offset') {\n styles[prop] = finished ? this._finalStyles[prop] : computeStyle(this.element, prop);\n }\n }));\n }\n this.currentSnapshot = styles;\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._onDoneFns;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._onStartFns;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._onDestroyFns;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._started;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._styler;\n /** @type {?} */\n CssKeyframesPlayer.prototype.parentPlayer;\n /** @type {?} */\n CssKeyframesPlayer.prototype.totalTime;\n /** @type {?} */\n CssKeyframesPlayer.prototype.easing;\n /** @type {?} */\n CssKeyframesPlayer.prototype.currentSnapshot;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._state;\n /** @type {?} */\n CssKeyframesPlayer.prototype.element;\n /** @type {?} */\n CssKeyframesPlayer.prototype.keyframes;\n /** @type {?} */\n CssKeyframesPlayer.prototype.animationName;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._duration;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._delay;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._finalStyles;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesPlayer.prototype._specialStyles;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/css_keyframes/direct_style_player.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass DirectStylePlayer extends NoopAnimationPlayer {\n /**\n * @param {?} element\n * @param {?} styles\n */\n constructor(element, styles) {\n super();\n this.element = element;\n this._startingStyles = {};\n this.__initialized = false;\n this._styles = hypenatePropsObject(styles);\n }\n /**\n * @return {?}\n */\n init() {\n if (this.__initialized || !this._startingStyles)\n return;\n this.__initialized = true;\n Object.keys(this._styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n (/** @type {?} */ (this._startingStyles))[prop] = this.element.style[prop];\n }));\n super.init();\n }\n /**\n * @return {?}\n */\n play() {\n if (!this._startingStyles)\n return;\n this.init();\n Object.keys(this._styles)\n .forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => this.element.style.setProperty(prop, this._styles[prop])));\n super.play();\n }\n /**\n * @return {?}\n */\n destroy() {\n if (!this._startingStyles)\n return;\n Object.keys(this._startingStyles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const value = (/** @type {?} */ (this._startingStyles))[prop];\n if (value) {\n this.element.style.setProperty(prop, value);\n }\n else {\n this.element.style.removeProperty(prop);\n }\n }));\n this._startingStyles = null;\n super.destroy();\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n DirectStylePlayer.prototype._startingStyles;\n /**\n * @type {?}\n * @private\n */\n DirectStylePlayer.prototype.__initialized;\n /**\n * @type {?}\n * @private\n */\n DirectStylePlayer.prototype._styles;\n /** @type {?} */\n DirectStylePlayer.prototype.element;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/css_keyframes/css_keyframes_driver.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst KEYFRAMES_NAME_PREFIX = 'gen_css_kf_';\n/** @type {?} */\nconst TAB_SPACE = ' ';\nclass CssKeyframesDriver {\n constructor() {\n this._count = 0;\n this._head = document.querySelector('head');\n this._warningIssued = false;\n }\n /**\n * @param {?} prop\n * @return {?}\n */\n validateStyleProperty(prop) { return validateStyleProperty(prop); }\n /**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n matchesElement(element, selector) {\n return matchesElement(element, selector);\n }\n /**\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n containsElement(elm1, elm2) { return containsElement(elm1, elm2); }\n /**\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n query(element, selector, multi) {\n return invokeQuery(element, selector, multi);\n }\n /**\n * @param {?} element\n * @param {?} prop\n * @param {?=} defaultValue\n * @return {?}\n */\n computeStyle(element, prop, defaultValue) {\n return (/** @type {?} */ (((/** @type {?} */ (window.getComputedStyle(element))))[prop]));\n }\n /**\n * @param {?} element\n * @param {?} name\n * @param {?} keyframes\n * @return {?}\n */\n buildKeyframeElement(element, name, keyframes) {\n keyframes = keyframes.map((/**\n * @param {?} kf\n * @return {?}\n */\n kf => hypenatePropsObject(kf)));\n /** @type {?} */\n let keyframeStr = `@keyframes ${name} {\\n`;\n /** @type {?} */\n let tab = '';\n keyframes.forEach((/**\n * @param {?} kf\n * @return {?}\n */\n kf => {\n tab = TAB_SPACE;\n /** @type {?} */\n const offset = parseFloat(kf['offset']);\n keyframeStr += `${tab}${offset * 100}% {\\n`;\n tab += TAB_SPACE;\n Object.keys(kf).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n /** @type {?} */\n const value = kf[prop];\n switch (prop) {\n case 'offset':\n return;\n case 'easing':\n if (value) {\n keyframeStr += `${tab}animation-timing-function: ${value};\\n`;\n }\n return;\n default:\n keyframeStr += `${tab}${prop}: ${value};\\n`;\n return;\n }\n }));\n keyframeStr += `${tab}}\\n`;\n }));\n keyframeStr += `}\\n`;\n /** @type {?} */\n const kfElm = document.createElement('style');\n kfElm.innerHTML = keyframeStr;\n return kfElm;\n }\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @param {?=} scrubberAccessRequested\n * @return {?}\n */\n animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {\n if (scrubberAccessRequested) {\n this._notifyFaultyScrubber();\n }\n /** @type {?} */\n const previousCssKeyframePlayers = (/** @type {?} */ (previousPlayers.filter((/**\n * @param {?} player\n * @return {?}\n */\n player => player instanceof CssKeyframesPlayer))));\n /** @type {?} */\n const previousStyles = {};\n if (allowPreviousPlayerStylesMerge(duration, delay)) {\n previousCssKeyframePlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n /** @type {?} */\n let styles = player.currentSnapshot;\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => previousStyles[prop] = styles[prop]));\n }));\n }\n keyframes = balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles);\n /** @type {?} */\n const finalStyles = flattenKeyframesIntoStyles(keyframes);\n // if there is no animation then there is no point in applying\n // styles and waiting for an event to get fired. This causes lag.\n // It's better to just directly apply the styles to the element\n // via the direct styling animation player.\n if (duration == 0) {\n return new DirectStylePlayer(element, finalStyles);\n }\n /** @type {?} */\n const animationName = `${KEYFRAMES_NAME_PREFIX}${this._count++}`;\n /** @type {?} */\n const kfElm = this.buildKeyframeElement(element, animationName, keyframes);\n (/** @type {?} */ (document.querySelector('head'))).appendChild(kfElm);\n /** @type {?} */\n const specialStyles = packageNonAnimatableStyles(element, keyframes);\n /** @type {?} */\n const player = new CssKeyframesPlayer(element, keyframes, animationName, duration, delay, easing, finalStyles, specialStyles);\n player.onDestroy((/**\n * @return {?}\n */\n () => removeElement(kfElm)));\n return player;\n }\n /**\n * @private\n * @return {?}\n */\n _notifyFaultyScrubber() {\n if (!this._warningIssued) {\n console.warn('@angular/animations: please load the web-animations.js polyfill to allow programmatic access...\\n', ' visit http://bit.ly/IWukam to learn more about using the web-animation-js polyfill.');\n this._warningIssued = true;\n }\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n CssKeyframesDriver.prototype._count;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesDriver.prototype._head;\n /**\n * @type {?}\n * @private\n */\n CssKeyframesDriver.prototype._warningIssued;\n}\n/**\n * @param {?} keyframes\n * @return {?}\n */\nfunction flattenKeyframesIntoStyles(keyframes) {\n /** @type {?} */\n let flatKeyframes = {};\n if (keyframes) {\n /** @type {?} */\n const kfs = Array.isArray(keyframes) ? keyframes : [keyframes];\n kfs.forEach((/**\n * @param {?} kf\n * @return {?}\n */\n kf => {\n Object.keys(kf).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (prop == 'offset' || prop == 'easing')\n return;\n flatKeyframes[prop] = kf[prop];\n }));\n }));\n }\n return flatKeyframes;\n}\n/**\n * @param {?} node\n * @return {?}\n */\nfunction removeElement(node) {\n node.parentNode.removeChild(node);\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/web_animations/web_animations_player.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass WebAnimationsPlayer {\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} options\n * @param {?=} _specialStyles\n */\n constructor(element, keyframes, options, _specialStyles) {\n this.element = element;\n this.keyframes = keyframes;\n this.options = options;\n this._specialStyles = _specialStyles;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._onDestroyFns = [];\n this._initialized = false;\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this.time = 0;\n this.parentPlayer = null;\n this.currentSnapshot = {};\n this._duration = (/** @type {?} */ (options['duration']));\n this._delay = (/** @type {?} */ (options['delay'])) || 0;\n this.time = this._duration + this._delay;\n }\n /**\n * @private\n * @return {?}\n */\n _onFinish() {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onDoneFns = [];\n }\n }\n /**\n * @return {?}\n */\n init() {\n this._buildPlayer();\n this._preparePlayerBeforeStart();\n }\n /**\n * @private\n * @return {?}\n */\n _buildPlayer() {\n if (this._initialized)\n return;\n this._initialized = true;\n /** @type {?} */\n const keyframes = this.keyframes;\n ((/** @type {?} */ (this))).domPlayer =\n this._triggerWebAnimation(this.element, keyframes, this.options);\n this._finalKeyframe = keyframes.length ? keyframes[keyframes.length - 1] : {};\n this.domPlayer.addEventListener('finish', (/**\n * @return {?}\n */\n () => this._onFinish()));\n }\n /**\n * @private\n * @return {?}\n */\n _preparePlayerBeforeStart() {\n // this is required so that the player doesn't start to animate right away\n if (this._delay) {\n this._resetDomPlayerState();\n }\n else {\n this.domPlayer.pause();\n }\n }\n /**\n * \\@internal\n * @param {?} element\n * @param {?} keyframes\n * @param {?} options\n * @return {?}\n */\n _triggerWebAnimation(element, keyframes, options) {\n // jscompiler doesn't seem to know animate is a native property because it's not fully\n // supported yet across common browsers (we polyfill it for Edge/Safari) [CL #143630929]\n return (/** @type {?} */ (element['animate'](keyframes, options)));\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onStart(fn) { this._onStartFns.push(fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDone(fn) { this._onDoneFns.push(fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDestroy(fn) { this._onDestroyFns.push(fn); }\n /**\n * @return {?}\n */\n play() {\n this._buildPlayer();\n if (!this.hasStarted()) {\n this._onStartFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onStartFns = [];\n this._started = true;\n if (this._specialStyles) {\n this._specialStyles.start();\n }\n }\n this.domPlayer.play();\n }\n /**\n * @return {?}\n */\n pause() {\n this.init();\n this.domPlayer.pause();\n }\n /**\n * @return {?}\n */\n finish() {\n this.init();\n if (this._specialStyles) {\n this._specialStyles.finish();\n }\n this._onFinish();\n this.domPlayer.finish();\n }\n /**\n * @return {?}\n */\n reset() {\n this._resetDomPlayerState();\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n }\n /**\n * @private\n * @return {?}\n */\n _resetDomPlayerState() {\n if (this.domPlayer) {\n this.domPlayer.cancel();\n }\n }\n /**\n * @return {?}\n */\n restart() {\n this.reset();\n this.play();\n }\n /**\n * @return {?}\n */\n hasStarted() { return this._started; }\n /**\n * @return {?}\n */\n destroy() {\n if (!this._destroyed) {\n this._destroyed = true;\n this._resetDomPlayerState();\n this._onFinish();\n if (this._specialStyles) {\n this._specialStyles.destroy();\n }\n this._onDestroyFns.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n this._onDestroyFns = [];\n }\n }\n /**\n * @param {?} p\n * @return {?}\n */\n setPosition(p) { this.domPlayer.currentTime = p * this.time; }\n /**\n * @return {?}\n */\n getPosition() { return this.domPlayer.currentTime / this.time; }\n /**\n * @return {?}\n */\n get totalTime() { return this._delay + this._duration; }\n /**\n * @return {?}\n */\n beforeDestroy() {\n /** @type {?} */\n const styles = {};\n if (this.hasStarted()) {\n Object.keys(this._finalKeyframe).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => {\n if (prop != 'offset') {\n styles[prop] =\n this._finished ? this._finalKeyframe[prop] : computeStyle(this.element, prop);\n }\n }));\n }\n this.currentSnapshot = styles;\n }\n /**\n * \\@internal\n * @param {?} phaseName\n * @return {?}\n */\n triggerCallback(phaseName) {\n /** @type {?} */\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach((/**\n * @param {?} fn\n * @return {?}\n */\n fn => fn()));\n methods.length = 0;\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._onDoneFns;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._onStartFns;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._onDestroyFns;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._duration;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._delay;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._initialized;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._finished;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._started;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._destroyed;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._finalKeyframe;\n /** @type {?} */\n WebAnimationsPlayer.prototype.domPlayer;\n /** @type {?} */\n WebAnimationsPlayer.prototype.time;\n /** @type {?} */\n WebAnimationsPlayer.prototype.parentPlayer;\n /** @type {?} */\n WebAnimationsPlayer.prototype.currentSnapshot;\n /** @type {?} */\n WebAnimationsPlayer.prototype.element;\n /** @type {?} */\n WebAnimationsPlayer.prototype.keyframes;\n /** @type {?} */\n WebAnimationsPlayer.prototype.options;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsPlayer.prototype._specialStyles;\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/render/web_animations/web_animations_driver.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass WebAnimationsDriver {\n constructor() {\n this._isNativeImpl = /\\{\\s*\\[native\\s+code\\]\\s*\\}/.test(getElementAnimateFn().toString());\n this._cssKeyframesDriver = new CssKeyframesDriver();\n }\n /**\n * @param {?} prop\n * @return {?}\n */\n validateStyleProperty(prop) { return validateStyleProperty(prop); }\n /**\n * @param {?} element\n * @param {?} selector\n * @return {?}\n */\n matchesElement(element, selector) {\n return matchesElement(element, selector);\n }\n /**\n * @param {?} elm1\n * @param {?} elm2\n * @return {?}\n */\n containsElement(elm1, elm2) { return containsElement(elm1, elm2); }\n /**\n * @param {?} element\n * @param {?} selector\n * @param {?} multi\n * @return {?}\n */\n query(element, selector, multi) {\n return invokeQuery(element, selector, multi);\n }\n /**\n * @param {?} element\n * @param {?} prop\n * @param {?=} defaultValue\n * @return {?}\n */\n computeStyle(element, prop, defaultValue) {\n return (/** @type {?} */ (((/** @type {?} */ (window.getComputedStyle(element))))[prop]));\n }\n /**\n * @param {?} supported\n * @return {?}\n */\n overrideWebAnimationsSupport(supported) { this._isNativeImpl = supported; }\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @param {?=} scrubberAccessRequested\n * @return {?}\n */\n animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {\n /** @type {?} */\n const useKeyframes = !scrubberAccessRequested && !this._isNativeImpl;\n if (useKeyframes) {\n return this._cssKeyframesDriver.animate(element, keyframes, duration, delay, easing, previousPlayers);\n }\n /** @type {?} */\n const fill = delay == 0 ? 'both' : 'forwards';\n /** @type {?} */\n const playerOptions = { duration, delay, fill };\n // we check for this to avoid having a null|undefined value be present\n // for the easing (which results in an error for certain browsers #9752)\n if (easing) {\n playerOptions['easing'] = easing;\n }\n /** @type {?} */\n const previousStyles = {};\n /** @type {?} */\n const previousWebAnimationPlayers = (/** @type {?} */ (previousPlayers.filter((/**\n * @param {?} player\n * @return {?}\n */\n player => player instanceof WebAnimationsPlayer))));\n if (allowPreviousPlayerStylesMerge(duration, delay)) {\n previousWebAnimationPlayers.forEach((/**\n * @param {?} player\n * @return {?}\n */\n player => {\n /** @type {?} */\n let styles = player.currentSnapshot;\n Object.keys(styles).forEach((/**\n * @param {?} prop\n * @return {?}\n */\n prop => previousStyles[prop] = styles[prop]));\n }));\n }\n keyframes = keyframes.map((/**\n * @param {?} styles\n * @return {?}\n */\n styles => copyStyles(styles, false)));\n keyframes = balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles);\n /** @type {?} */\n const specialStyles = packageNonAnimatableStyles(element, keyframes);\n return new WebAnimationsPlayer(element, keyframes, playerOptions, specialStyles);\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n WebAnimationsDriver.prototype._isNativeImpl;\n /**\n * @type {?}\n * @private\n */\n WebAnimationsDriver.prototype._cssKeyframesDriver;\n}\n/**\n * @return {?}\n */\nfunction supportsWebAnimations() {\n return typeof getElementAnimateFn() === 'function';\n}\n/**\n * @return {?}\n */\nfunction getElementAnimateFn() {\n return (isBrowser() && ((/** @type {?} */ (Element))).prototype['animate']) || {};\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/private_export.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/src/browser.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/public_api.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/animations/browser/index.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AnimationDriver, Animation as ɵAnimation, AnimationEngine as ɵAnimationEngine, AnimationStyleNormalizer as ɵAnimationStyleNormalizer, CssKeyframesDriver as ɵCssKeyframesDriver, CssKeyframesPlayer as ɵCssKeyframesPlayer, NoopAnimationDriver as ɵNoopAnimationDriver, NoopAnimationStyleNormalizer as ɵNoopAnimationStyleNormalizer, WebAnimationsDriver as ɵWebAnimationsDriver, WebAnimationsPlayer as ɵWebAnimationsPlayer, WebAnimationsStyleNormalizer as ɵWebAnimationsStyleNormalizer, allowPreviousPlayerStylesMerge as ɵallowPreviousPlayerStylesMerge, SpecialCasedStyles as ɵangular_packages_animations_browser_browser_a, containsElement as ɵcontainsElement, invokeQuery as ɵinvokeQuery, matchesElement as ɵmatchesElement, supportsWebAnimations as ɵsupportsWebAnimations, validateStyleProperty as ɵvalidateStyleProperty };\n\n//# sourceMappingURL=browser.js.map","/**\n * @license Angular v9.0.7\n * (c) 2010-2020 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { ViewEncapsulation, Injectable, RendererFactory2, Inject, NgZone, InjectionToken, NgModule } from '@angular/core';\nimport { ɵDomRendererFactory2, BrowserModule } from '@angular/platform-browser';\nimport { AnimationBuilder, sequence, AnimationFactory } from '@angular/animations';\nimport { ɵAnimationEngine, AnimationDriver, ɵAnimationStyleNormalizer, ɵsupportsWebAnimations, ɵWebAnimationsDriver, ɵCssKeyframesDriver, ɵWebAnimationsStyleNormalizer, ɵNoopAnimationDriver } from '@angular/animations/browser';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/animation_builder.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/animations/browser';\nclass BrowserAnimationBuilder extends AnimationBuilder {\n /**\n * @param {?} rootRenderer\n * @param {?} doc\n */\n constructor(rootRenderer, doc) {\n super();\n this._nextAnimationId = 0;\n /** @type {?} */\n const typeData = (/** @type {?} */ ({\n id: '0',\n encapsulation: ViewEncapsulation.None,\n styles: [],\n data: { animation: [] }\n }));\n this._renderer = (/** @type {?} */ (rootRenderer.createRenderer(doc.body, typeData)));\n }\n /**\n * @param {?} animation\n * @return {?}\n */\n build(animation) {\n /** @type {?} */\n const id = this._nextAnimationId.toString();\n this._nextAnimationId++;\n /** @type {?} */\n const entry = Array.isArray(animation) ? sequence(animation) : animation;\n issueAnimationCommand(this._renderer, null, id, 'register', [entry]);\n return new BrowserAnimationFactory(id, this._renderer);\n }\n}\nBrowserAnimationBuilder.ɵfac = function BrowserAnimationBuilder_Factory(t) { return new (t || BrowserAnimationBuilder)(ɵngcc0.ɵɵinject(ɵngcc0.RendererFactory2), ɵngcc0.ɵɵinject(DOCUMENT)); };\nBrowserAnimationBuilder.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: BrowserAnimationBuilder, factory: BrowserAnimationBuilder.ɵfac });\n/** @nocollapse */\nBrowserAnimationBuilder.ctorParameters = () => [\n { type: RendererFactory2 },\n { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BrowserAnimationBuilder, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.RendererFactory2 }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }]; }, null); })();\nif (false) {\n /**\n * @type {?}\n * @private\n */\n BrowserAnimationBuilder.prototype._nextAnimationId;\n /**\n * @type {?}\n * @private\n */\n BrowserAnimationBuilder.prototype._renderer;\n}\nclass BrowserAnimationFactory extends AnimationFactory {\n /**\n * @param {?} _id\n * @param {?} _renderer\n */\n constructor(_id, _renderer) {\n super();\n this._id = _id;\n this._renderer = _renderer;\n }\n /**\n * @param {?} element\n * @param {?=} options\n * @return {?}\n */\n create(element, options) {\n return new RendererAnimationPlayer(this._id, element, options || {}, this._renderer);\n }\n}\nif (false) {\n /**\n * @type {?}\n * @private\n */\n BrowserAnimationFactory.prototype._id;\n /**\n * @type {?}\n * @private\n */\n BrowserAnimationFactory.prototype._renderer;\n}\nclass RendererAnimationPlayer {\n /**\n * @param {?} id\n * @param {?} element\n * @param {?} options\n * @param {?} _renderer\n */\n constructor(id, element, options, _renderer) {\n this.id = id;\n this.element = element;\n this._renderer = _renderer;\n this.parentPlayer = null;\n this._started = false;\n this.totalTime = 0;\n this._command('create', options);\n }\n /**\n * @private\n * @param {?} eventName\n * @param {?} callback\n * @return {?}\n */\n _listen(eventName, callback) {\n return this._renderer.listen(this.element, `@@${this.id}:${eventName}`, callback);\n }\n /**\n * @private\n * @param {?} command\n * @param {...?} args\n * @return {?}\n */\n _command(command, ...args) {\n return issueAnimationCommand(this._renderer, this.element, this.id, command, args);\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDone(fn) { this._listen('done', fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onStart(fn) { this._listen('start', fn); }\n /**\n * @param {?} fn\n * @return {?}\n */\n onDestroy(fn) { this._listen('destroy', fn); }\n /**\n * @return {?}\n */\n init() { this._command('init'); }\n /**\n * @return {?}\n */\n hasStarted() { return this._started; }\n /**\n * @return {?}\n */\n play() {\n this._command('play');\n this._started = true;\n }\n /**\n * @return {?}\n */\n pause() { this._command('pause'); }\n /**\n * @return {?}\n */\n restart() { this._command('restart'); }\n /**\n * @return {?}\n */\n finish() { this._command('finish'); }\n /**\n * @return {?}\n */\n destroy() { this._command('destroy'); }\n /**\n * @return {?}\n */\n reset() { this._command('reset'); }\n /**\n * @param {?} p\n * @return {?}\n */\n setPosition(p) { this._command('setPosition', p); }\n /**\n * @return {?}\n */\n getPosition() { return 0; }\n}\nif (false) {\n /** @type {?} */\n RendererAnimationPlayer.prototype.parentPlayer;\n /**\n * @type {?}\n * @private\n */\n RendererAnimationPlayer.prototype._started;\n /** @type {?} */\n RendererAnimationPlayer.prototype.totalTime;\n /** @type {?} */\n RendererAnimationPlayer.prototype.id;\n /** @type {?} */\n RendererAnimationPlayer.prototype.element;\n /**\n * @type {?}\n * @private\n */\n RendererAnimationPlayer.prototype._renderer;\n}\n/**\n * @param {?} renderer\n * @param {?} element\n * @param {?} id\n * @param {?} command\n * @param {?} args\n * @return {?}\n */\nfunction issueAnimationCommand(renderer, element, id, command, args) {\n return renderer.setProperty(element, `@@${id}:${command}`, args);\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/animation_renderer.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/** @type {?} */\nconst ANIMATION_PREFIX = '@';\n/** @type {?} */\nconst DISABLE_ANIMATIONS_FLAG = '@.disabled';\n/**\n * @record\n */\nfunction RecursiveAnimationTriggerMetadata() { }\nclass AnimationRendererFactory {\n /**\n * @param {?} delegate\n * @param {?} engine\n * @param {?} _zone\n */\n constructor(delegate, engine, _zone) {\n this.delegate = delegate;\n this.engine = engine;\n this._zone = _zone;\n this._currentId = 0;\n this._microtaskId = 1;\n this._animationCallbacksBuffer = [];\n this._rendererCache = new Map();\n this._cdRecurDepth = 0;\n this.promise = Promise.resolve(0);\n engine.onRemovalComplete = (/**\n * @param {?} element\n * @param {?} delegate\n * @return {?}\n */\n (element, delegate) => {\n // Note: if an component element has a leave animation, and the component\n // a host leave animation, the view engine will call `removeChild` for the parent\n // component renderer as well as for the child component renderer.\n // Therefore, we need to check if we already removed the element.\n if (delegate && delegate.parentNode(element)) {\n delegate.removeChild(element.parentNode, element);\n }\n });\n }\n /**\n * @param {?} hostElement\n * @param {?} type\n * @return {?}\n */\n createRenderer(hostElement, type) {\n /** @type {?} */\n const EMPTY_NAMESPACE_ID = '';\n // cache the delegates to find out which cached delegate can\n // be used by which cached renderer\n /** @type {?} */\n const delegate = this.delegate.createRenderer(hostElement, type);\n if (!hostElement || !type || !type.data || !type.data['animation']) {\n /** @type {?} */\n let renderer = this._rendererCache.get(delegate);\n if (!renderer) {\n renderer = new BaseAnimationRenderer(EMPTY_NAMESPACE_ID, delegate, this.engine);\n // only cache this result when the base renderer is used\n this._rendererCache.set(delegate, renderer);\n }\n return renderer;\n }\n /** @type {?} */\n const componentId = type.id;\n /** @type {?} */\n const namespaceId = type.id + '-' + this._currentId;\n this._currentId++;\n this.engine.register(namespaceId, hostElement);\n /** @type {?} */\n const registerTrigger = (/**\n * @param {?} trigger\n * @return {?}\n */\n (trigger) => {\n if (Array.isArray(trigger)) {\n trigger.forEach(registerTrigger);\n }\n else {\n this.engine.registerTrigger(componentId, namespaceId, hostElement, trigger.name, trigger);\n }\n });\n /** @type {?} */\n const animationTriggers = (/** @type {?} */ (type.data['animation']));\n animationTriggers.forEach(registerTrigger);\n return new AnimationRenderer(this, namespaceId, delegate, this.engine);\n }\n /**\n * @return {?}\n */\n begin() {\n this._cdRecurDepth++;\n if (this.delegate.begin) {\n this.delegate.begin();\n }\n }\n /**\n * @private\n * @return {?}\n */\n _scheduleCountTask() {\n // always use promise to schedule microtask instead of use Zone\n this.promise.then((/**\n * @return {?}\n */\n () => { this._microtaskId++; }));\n }\n /**\n * \\@internal\n * @param {?} count\n * @param {?} fn\n * @param {?} data\n * @return {?}\n */\n scheduleListenerCallback(count, fn, data) {\n if (count >= 0 && count < this._microtaskId) {\n this._zone.run((/**\n * @return {?}\n */\n () => fn(data)));\n return;\n }\n if (this._animationCallbacksBuffer.length == 0) {\n Promise.resolve(null).then((/**\n * @return {?}\n */\n () => {\n this._zone.run((/**\n * @return {?}\n */\n () => {\n this._animationCallbacksBuffer.forEach((/**\n * @param {?} tuple\n * @return {?}\n */\n tuple => {\n const [fn, data] = tuple;\n fn(data);\n }));\n this._animationCallbacksBuffer = [];\n }));\n }));\n }\n this._animationCallbacksBuffer.push([fn, data]);\n }\n /**\n * @return {?}\n */\n end() {\n this._cdRecurDepth--;\n // this is to prevent animations from running twice when an inner\n // component does CD when a parent component instead has inserted it\n if (this._cdRecurDepth == 0) {\n this._zone.runOutsideAngular((/**\n * @return {?}\n */\n () => {\n this._scheduleCountTask();\n this.engine.flush(this._microtaskId);\n }));\n }\n if (this.delegate.end) {\n this.delegate.end();\n }\n }\n /**\n * @return {?}\n */\n whenRenderingDone() { return this.engine.whenRenderingDone(); }\n}\nAnimationRendererFactory.ɵfac = function AnimationRendererFactory_Factory(t) { return new (t || AnimationRendererFactory)(ɵngcc0.ɵɵinject(ɵngcc0.RendererFactory2), ɵngcc0.ɵɵinject(ɵngcc1.ɵAnimationEngine), ɵngcc0.ɵɵinject(ɵngcc0.NgZone)); };\nAnimationRendererFactory.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: AnimationRendererFactory, factory: AnimationRendererFactory.ɵfac });\n/** @nocollapse */\nAnimationRendererFactory.ctorParameters = () => [\n { type: RendererFactory2 },\n { type: ɵAnimationEngine },\n { type: NgZone }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(AnimationRendererFactory, [{\n type: Injectable\n }], function () { return [{ type: ɵngcc0.RendererFactory2 }, { type: ɵngcc1.ɵAnimationEngine }, { type: ɵngcc0.NgZone }]; }, null); })();\nif (false) {\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._currentId;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._microtaskId;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._animationCallbacksBuffer;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._rendererCache;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._cdRecurDepth;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype.promise;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype.delegate;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype.engine;\n /**\n * @type {?}\n * @private\n */\n AnimationRendererFactory.prototype._zone;\n}\nclass BaseAnimationRenderer {\n /**\n * @param {?} namespaceId\n * @param {?} delegate\n * @param {?} engine\n */\n constructor(namespaceId, delegate, engine) {\n this.namespaceId = namespaceId;\n this.delegate = delegate;\n this.engine = engine;\n this.destroyNode = this.delegate.destroyNode ? (/**\n * @param {?} n\n * @return {?}\n */\n (n) => (/** @type {?} */ (delegate.destroyNode))(n)) : null;\n }\n /**\n * @return {?}\n */\n get data() { return this.delegate.data; }\n /**\n * @return {?}\n */\n destroy() {\n this.engine.destroy(this.namespaceId, this.delegate);\n this.delegate.destroy();\n }\n /**\n * @param {?} name\n * @param {?=} namespace\n * @return {?}\n */\n createElement(name, namespace) {\n return this.delegate.createElement(name, namespace);\n }\n /**\n * @param {?} value\n * @return {?}\n */\n createComment(value) { return this.delegate.createComment(value); }\n /**\n * @param {?} value\n * @return {?}\n */\n createText(value) { return this.delegate.createText(value); }\n /**\n * @param {?} parent\n * @param {?} newChild\n * @return {?}\n */\n appendChild(parent, newChild) {\n this.delegate.appendChild(parent, newChild);\n this.engine.onInsert(this.namespaceId, newChild, parent, false);\n }\n /**\n * @param {?} parent\n * @param {?} newChild\n * @param {?} refChild\n * @return {?}\n */\n insertBefore(parent, newChild, refChild) {\n this.delegate.insertBefore(parent, newChild, refChild);\n this.engine.onInsert(this.namespaceId, newChild, parent, true);\n }\n /**\n * @param {?} parent\n * @param {?} oldChild\n * @param {?} isHostElement\n * @return {?}\n */\n removeChild(parent, oldChild, isHostElement) {\n this.engine.onRemove(this.namespaceId, oldChild, this.delegate, isHostElement);\n }\n /**\n * @param {?} selectorOrNode\n * @param {?=} preserveContent\n * @return {?}\n */\n selectRootElement(selectorOrNode, preserveContent) {\n return this.delegate.selectRootElement(selectorOrNode, preserveContent);\n }\n /**\n * @param {?} node\n * @return {?}\n */\n parentNode(node) { return this.delegate.parentNode(node); }\n /**\n * @param {?} node\n * @return {?}\n */\n nextSibling(node) { return this.delegate.nextSibling(node); }\n /**\n * @param {?} el\n * @param {?} name\n * @param {?} value\n * @param {?=} namespace\n * @return {?}\n */\n setAttribute(el, name, value, namespace) {\n this.delegate.setAttribute(el, name, value, namespace);\n }\n /**\n * @param {?} el\n * @param {?} name\n * @param {?=} namespace\n * @return {?}\n */\n removeAttribute(el, name, namespace) {\n this.delegate.removeAttribute(el, name, namespace);\n }\n /**\n * @param {?} el\n * @param {?} name\n * @return {?}\n */\n addClass(el, name) { this.delegate.addClass(el, name); }\n /**\n * @param {?} el\n * @param {?} name\n * @return {?}\n */\n removeClass(el, name) { this.delegate.removeClass(el, name); }\n /**\n * @param {?} el\n * @param {?} style\n * @param {?} value\n * @param {?=} flags\n * @return {?}\n */\n setStyle(el, style, value, flags) {\n this.delegate.setStyle(el, style, value, flags);\n }\n /**\n * @param {?} el\n * @param {?} style\n * @param {?=} flags\n * @return {?}\n */\n removeStyle(el, style, flags) {\n this.delegate.removeStyle(el, style, flags);\n }\n /**\n * @param {?} el\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n setProperty(el, name, value) {\n if (name.charAt(0) == ANIMATION_PREFIX && name == DISABLE_ANIMATIONS_FLAG) {\n this.disableAnimations(el, !!value);\n }\n else {\n this.delegate.setProperty(el, name, value);\n }\n }\n /**\n * @param {?} node\n * @param {?} value\n * @return {?}\n */\n setValue(node, value) { this.delegate.setValue(node, value); }\n /**\n * @param {?} target\n * @param {?} eventName\n * @param {?} callback\n * @return {?}\n */\n listen(target, eventName, callback) {\n return this.delegate.listen(target, eventName, callback);\n }\n /**\n * @protected\n * @param {?} element\n * @param {?} value\n * @return {?}\n */\n disableAnimations(element, value) {\n this.engine.disableAnimations(element, value);\n }\n}\nif (false) {\n /** @type {?} */\n BaseAnimationRenderer.prototype.destroyNode;\n /**\n * @type {?}\n * @protected\n */\n BaseAnimationRenderer.prototype.namespaceId;\n /** @type {?} */\n BaseAnimationRenderer.prototype.delegate;\n /** @type {?} */\n BaseAnimationRenderer.prototype.engine;\n}\nclass AnimationRenderer extends BaseAnimationRenderer {\n /**\n * @param {?} factory\n * @param {?} namespaceId\n * @param {?} delegate\n * @param {?} engine\n */\n constructor(factory, namespaceId, delegate, engine) {\n super(namespaceId, delegate, engine);\n this.factory = factory;\n this.namespaceId = namespaceId;\n }\n /**\n * @param {?} el\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n setProperty(el, name, value) {\n if (name.charAt(0) == ANIMATION_PREFIX) {\n if (name.charAt(1) == '.' && name == DISABLE_ANIMATIONS_FLAG) {\n value = value === undefined ? true : !!value;\n this.disableAnimations(el, (/** @type {?} */ (value)));\n }\n else {\n this.engine.process(this.namespaceId, el, name.substr(1), value);\n }\n }\n else {\n this.delegate.setProperty(el, name, value);\n }\n }\n /**\n * @param {?} target\n * @param {?} eventName\n * @param {?} callback\n * @return {?}\n */\n listen(target, eventName, callback) {\n if (eventName.charAt(0) == ANIMATION_PREFIX) {\n /** @type {?} */\n const element = resolveElementFromTarget(target);\n /** @type {?} */\n let name = eventName.substr(1);\n /** @type {?} */\n let phase = '';\n // @listener.phase is for trigger animation callbacks\n // @@listener is for animation builder callbacks\n if (name.charAt(0) != ANIMATION_PREFIX) {\n [name, phase] = parseTriggerCallbackName(name);\n }\n return this.engine.listen(this.namespaceId, element, name, phase, (/**\n * @param {?} event\n * @return {?}\n */\n event => {\n /** @type {?} */\n const countId = ((/** @type {?} */ (event)))['_data'] || -1;\n this.factory.scheduleListenerCallback(countId, callback, event);\n }));\n }\n return this.delegate.listen(target, eventName, callback);\n }\n}\nif (false) {\n /** @type {?} */\n AnimationRenderer.prototype.factory;\n}\n/**\n * @param {?} target\n * @return {?}\n */\nfunction resolveElementFromTarget(target) {\n switch (target) {\n case 'body':\n return document.body;\n case 'document':\n return document;\n case 'window':\n return window;\n default:\n return target;\n }\n}\n/**\n * @param {?} triggerName\n * @return {?}\n */\nfunction parseTriggerCallbackName(triggerName) {\n /** @type {?} */\n const dotIndex = triggerName.indexOf('.');\n /** @type {?} */\n const trigger = triggerName.substring(0, dotIndex);\n /** @type {?} */\n const phase = triggerName.substr(dotIndex + 1);\n return [trigger, phase];\n}\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/providers.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\nclass InjectableAnimationEngine extends ɵAnimationEngine {\n /**\n * @param {?} doc\n * @param {?} driver\n * @param {?} normalizer\n */\n constructor(doc, driver, normalizer) {\n super(doc.body, driver, normalizer);\n }\n}\nInjectableAnimationEngine.ɵfac = function InjectableAnimationEngine_Factory(t) { return new (t || InjectableAnimationEngine)(ɵngcc0.ɵɵinject(DOCUMENT), ɵngcc0.ɵɵinject(ɵngcc1.AnimationDriver), ɵngcc0.ɵɵinject(ɵngcc1.ɵAnimationStyleNormalizer)); };\nInjectableAnimationEngine.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: InjectableAnimationEngine, factory: InjectableAnimationEngine.ɵfac });\n/** @nocollapse */\nInjectableAnimationEngine.ctorParameters = () => [\n { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n { type: AnimationDriver },\n { type: ɵAnimationStyleNormalizer }\n];\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(InjectableAnimationEngine, [{\n type: Injectable\n }], function () { return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: ɵngcc1.AnimationDriver }, { type: ɵngcc1.ɵAnimationStyleNormalizer }]; }, null); })();\n/**\n * @return {?}\n */\nfunction instantiateSupportedAnimationDriver() {\n return ɵsupportsWebAnimations() ? new ɵWebAnimationsDriver() : new ɵCssKeyframesDriver();\n}\n/**\n * @return {?}\n */\nfunction instantiateDefaultStyleNormalizer() {\n return new ɵWebAnimationsStyleNormalizer();\n}\n/**\n * @param {?} renderer\n * @param {?} engine\n * @param {?} zone\n * @return {?}\n */\nfunction instantiateRendererFactory(renderer, engine, zone) {\n return new AnimationRendererFactory(renderer, engine, zone);\n}\n/**\n * \\@publicApi\n * @type {?}\n */\nconst ANIMATION_MODULE_TYPE = new InjectionToken('AnimationModuleType');\n/** @type {?} */\nconst SHARED_ANIMATION_PROVIDERS = [\n { provide: AnimationBuilder, useClass: BrowserAnimationBuilder },\n { provide: ɵAnimationStyleNormalizer, useFactory: instantiateDefaultStyleNormalizer },\n { provide: ɵAnimationEngine, useClass: InjectableAnimationEngine }, {\n provide: RendererFactory2,\n useFactory: instantiateRendererFactory,\n deps: [ɵDomRendererFactory2, ɵAnimationEngine, NgZone]\n }\n];\n/**\n * Separate providers from the actual module so that we can do a local modification in Google3 to\n * include them in the BrowserModule.\n * @type {?}\n */\nconst BROWSER_ANIMATIONS_PROVIDERS = [\n { provide: AnimationDriver, useFactory: instantiateSupportedAnimationDriver },\n { provide: ANIMATION_MODULE_TYPE, useValue: 'BrowserAnimations' }, ...SHARED_ANIMATION_PROVIDERS\n];\n/**\n * Separate providers from the actual module so that we can do a local modification in Google3 to\n * include them in the BrowserTestingModule.\n * @type {?}\n */\nconst BROWSER_NOOP_ANIMATIONS_PROVIDERS = [\n { provide: AnimationDriver, useClass: ɵNoopAnimationDriver },\n { provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations' }, ...SHARED_ANIMATION_PROVIDERS\n];\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/module.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n/**\n * Exports `BrowserModule` with additional [dependency-injection providers](guide/glossary#provider)\n * for use with animations. See [Animations](guide/animations).\n * \\@publicApi\n */\nclass BrowserAnimationsModule {\n}\nBrowserAnimationsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: BrowserAnimationsModule });\nBrowserAnimationsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function BrowserAnimationsModule_Factory(t) { return new (t || BrowserAnimationsModule)(); }, providers: BROWSER_ANIMATIONS_PROVIDERS, imports: [BrowserModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(BrowserAnimationsModule, { exports: function () { return [BrowserModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(BrowserAnimationsModule, [{\n type: NgModule,\n args: [{\n exports: [BrowserModule],\n providers: BROWSER_ANIMATIONS_PROVIDERS\n }]\n }], null, null); })();\n/**\n * A null player that must be imported to allow disabling of animations.\n * \\@publicApi\n */\nclass NoopAnimationsModule {\n}\nNoopAnimationsModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: NoopAnimationsModule });\nNoopAnimationsModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function NoopAnimationsModule_Factory(t) { return new (t || NoopAnimationsModule)(); }, providers: BROWSER_NOOP_ANIMATIONS_PROVIDERS, imports: [BrowserModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(NoopAnimationsModule, { exports: function () { return [BrowserModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(NoopAnimationsModule, [{\n type: NgModule,\n args: [{\n exports: [BrowserModule],\n providers: BROWSER_NOOP_ANIMATIONS_PROVIDERS\n }]\n }], null, null); })();\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/private_export.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/src/animations.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/public_api.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * Generated from: packages/platform-browser/animations/index.ts\n * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ANIMATION_MODULE_TYPE, BrowserAnimationsModule, NoopAnimationsModule, AnimationRenderer as ɵAnimationRenderer, AnimationRendererFactory as ɵAnimationRendererFactory, BrowserAnimationBuilder as ɵBrowserAnimationBuilder, BrowserAnimationFactory as ɵBrowserAnimationFactory, InjectableAnimationEngine as ɵInjectableAnimationEngine, instantiateSupportedAnimationDriver as ɵangular_packages_platform_browser_animations_animations_a, instantiateDefaultStyleNormalizer as ɵangular_packages_platform_browser_animations_animations_b, instantiateRendererFactory as ɵangular_packages_platform_browser_animations_animations_c, BROWSER_ANIMATIONS_PROVIDERS as ɵangular_packages_platform_browser_animations_animations_d, BROWSER_NOOP_ANIMATIONS_PROVIDERS as ɵangular_packages_platform_browser_animations_animations_e, BaseAnimationRenderer as ɵangular_packages_platform_browser_animations_animations_f };\n\n//# sourceMappingURL=animations.js.map","import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\n\nimport { AppComponent } from './app.component';\nimport { AppRoutingModule } from './app-routing.module';\nimport { ChartsModule } from '@progress/kendo-angular-charts';\nimport { ExcelModule, GridModule } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { PopupModule } from '@progress/kendo-angular-popup';\nimport { TooltipModule } from '@progress/kendo-angular-tooltip';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport 'hammerjs';\nimport { PieChartComponent } from './tiles/base/pie-chart/pie-chart.component';\nimport { DashboardComponent } from './dashboards/dashboard/dashboard.component';\nimport { TileInsertComponent } from './dashboards/tile-insert/tile-insert.component';\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\nimport { ShapeIndicatorsComponent } from './tiles/base/shape-indicators/shape-indicators.component';\nimport { DashboardNavbarComponent } from './navigation/dashboard-navbar/dashboard-navbar.component';\nimport { MetricDetailNavbarComponent } from './navigation/metric-detail-navbar/metric-detail-navbar.component';\nimport { ParameterSwitchesComponent } from './navigation/parameter-switches/parameter-switches.component';\nimport { BookmarksComponent } from './navigation/bookmarks/bookmarks.component';\nimport { SearchComponent } from './navigation/search/search.component';\nimport { CustomerSelectorComponent } from './filter_selection/customer-selector/customer-selector.component';\nimport { StackedBarLineChartComponent } from './tiles/base/stacked-bar-line-chart/stacked-bar-line-chart.component';\nimport { MultiLineChartComponent } from './tiles/base/multi-line-chart/multi-line-chart.component';\nimport { EmptyValueMaskPipe } from './ui_tools/formatter/empty-value-mask-pipe';\nimport { CustomerComponent } from './dashboards/customer/customer.component';\nimport { InstrumentsComponent } from './dashboards/instruments/instruments.component';\nimport { AmbassadorComponent } from './dashboards/ambassador/ambassador.component';\nimport { PlaceholderComponent } from './tiles/placeholder/placeholder.component';\nimport { AreaLineChartComponent } from './tiles/base/area-line-chart/area-line-chart.component';\nimport { CustomerToggleComponent } from './filter_selection/toggle-switches/customer-toggle/customer-toggle.component';\nimport { InstrumentToggleComponent } from './filter_selection/toggle-switches/instrument-toggle/instrument-toggle.component';\nimport { TrackToggleComponent } from './filter_selection/toggle-switches/track-toggle/track-toggle.component';\nimport { FlagshipToggleComponent } from './filter_selection/toggle-switches/flagship-toggle/flagship-toggle.component';\nimport { PersonaSelectorComponent } from './filter_selection/persona-selector/persona-selector.component';\nimport { DropDownsModule} from '@progress/kendo-angular-dropdowns';\nimport { TssAmbassadorSelectorComponent} from './filter_selection/tss-ambassador-selector/tss-ambassador-selector.component';\nimport { ManagerSelectorComponent} from './filter_selection/manager-selector/manager-selector.component';\nimport { InstrumentSelectorComponent} from './filter_selection/instrument-selector/instrument-selector.component';\nimport { GeoLocationSelectorComponent} from './filter_selection/geo-location-selector/geo-location-selector.component';\nimport { InputsModule} from '@progress/kendo-angular-inputs';\nimport { LabelModule} from '@progress/kendo-angular-label';\nimport { AutoselectListComponent } from './ui_tools/autoselect-list/autoselect-list.component';\nimport { TextIndicatorsComponent } from './tiles/base/text-indicators/text-indicators.component';\nimport { VerticalSplitTextIndicatorsComponent } from './tiles/base/vertical-split-text-indicators/vertical-split-text-indicators.component';\nimport { StateHandlerComponent } from './api/state-handler/state-handler.component';\nimport { TopStatsListComponent } from './tiles/base/top-stats-list/top-stats-list.component';\nimport { ToolSelectorComponent } from './navigation/tool-selector/tool-selector.component';\nimport { AlertsNavbarComponent } from './navigation/alerts-navbar/alerts-navbar.component';\nimport { CtNavbarComponent } from './navigation/ct-navbar/ct-navbar.component';\nimport { CtDashboardComponent } from './control_tower/ct-dashboard/ct-dashboard.component';\nimport { AlertsDashboardComponent } from './alerts/alerts-dashboard/alerts-dashboard.component';\nimport { Style1Component } from './details/style1/style1.component';\nimport { Style1GridComponent } from './details/style1-grid/style1-grid.component';\nimport { LayoutModule } from '@progress/kendo-angular-layout';\nimport { FilterInsertComponent } from './filter_selection/details/filter-insert/filter-insert.component';\nimport { DetailCustomerFilterComponent } from './filter_selection/details/detail-customer-filter/detail-customer-filter.component';\nimport { DetailProductLineFilterComponent } from './filter_selection/details/detail-product-line-filter/detail-product-line-filter.component';\nimport { SetValuesGridComponent } from './details/set-values-grid/set-values-grid.component';\nimport { StackedBarChartByProductComponent } from './tiles/base/stacked-bar-chart-by-product/stacked-bar-chart-by-product.component';\nimport { CustomGridComponent } from './details/custom-grid/custom-grid.component';\nimport { AbbottBigNumberFormatterPipe } from './ui_tools/formatter/abbott-big-number-formatter-pipe';\nimport { CustomComplianceGridComponent } from './details/custom-compliance-grid/custom-compliance-grid.component';\nimport { Style2Component } from './details/style2/style2.component';\nimport { Style2GridComponent } from './details/style2-grid/style2-grid.component';\nimport { ComplianceChartComponent } from './tiles/metrics/compliance-chart/compliance-chart.component';\nimport { LinearGaugeModule } from '@progress/kendo-angular-gauges';\nimport { SnSelectorComponent } from './filter_selection/sn-selector/sn-selector.component';\nimport { UtilizationTpdComponent } from './tiles/metrics/utilization-tpd/utilization-tpd.component';\nimport { ManagerAmbSelectorComponent } from './filter_selection/manager-amb-selector/manager-amb-selector.component';\nimport { Style3Component } from './details/style3/style3.component';\nimport { Style3GridComponent } from './details/style3-grid/style3-grid.component';\nimport { Style4Component } from './details/style4/style4.component';\nimport { NpsComponent } from './tiles/metrics/nps/nps.component';\nimport { DetailAccountFilterComponent } from './filter_selection/details/detail-account-filter/detail-account-filter.component';\nimport { DetailAssayFilterComponent } from './filter_selection/details/detail-assay-filter/detail-assay-filter.component';\nimport { DetailDiseaseStateFilterComponent } from './filter_selection/details/detail-disease-state-filter/detail-disease-state-filter.component';\nimport { DetailCategorySwitchesFilterComponent } from './filter_selection/details/detail-category-switches-filter/detail-category-switches-filter.component';\nimport { DetailCapitalServiceAssaySwitchesFilterComponent } from './filter_selection/details/detail-capital-service-assay-switches-filter/detail-capital-service-assay-switches-filter.component';\nimport { ServiceContractsLevel2Component } from './details/service-contracts/service-contracts-level2/service-contracts-level2.component';\nimport { ServiceContractsLevel3Component } from './details/service-contracts/service-contracts-level3/service-contracts-level3.component';\nimport { ServiceContractsLevel4Component } from './details/service-contracts/service-contracts-level4/service-contracts-level4.component';\nimport { UptimeCustomerDetailsComponent } from './details/uptime-customer-details/uptime-customer-details.component';\nimport { SurveyCommentDetailsComponent } from './details/survey-comment-details/survey-comment-details.component';\nimport { CustomerOrderDetailsComponent } from './details/customer-order-details/customer-order-details.component';\nimport { PersonaSelector2Component } from './filter_selection/persona-selector2/persona-selector2.component';\nimport { SearchIconComponent } from './navigation/search-icon/search-icon.component';\nimport { SGMDetailsComponent } from './details/sgm-details/sgm-details.component';\nimport { PredictiveAlertsLevel2Component } from './details/predictive-alerts/predictive-alerts-level2/predictive-alerts-level2.component';\nimport { PredictiveAlertsLevel3Component } from './details/predictive-alerts/predictive-alerts-level3/predictive-alerts-level3.component';\nimport { DetailPersonaSelectorComponent } from './filter_selection/detail-persona-selector/detail-persona-selector.component';\nimport { CustomerHealthGridComponent } from './control_tower/customer-health-grid/customer-health-grid.component';\nimport { CustomerDataTrendsComponent } from './control_tower/customer-data-trends/customer-data-trends.component';\nimport { CustomerHealthAlertsGridComponent } from './control_tower/customer-health-alerts-grid/customer-health-alerts-grid.component';\nimport { DataTrendChartComponent } from './control_tower/data-trend-chart/data-trend-chart.component';\nimport { CtCustomerSelectorComponent } from './filter_selection/ct-customer-selector/ct-customer-selector.component';\nimport { RnpsSurveyCommentDetailsComponent } from './details/rnps-survey-comment-details/rnps-survey-comment-details.component';\nimport { SalesSummaryComponent } from './details/sales/sales-summary/sales-summary.component';\nimport { SalesDetailsComponent } from './details/sales/sales-details/sales-details.component';\nimport { CtProductSetSelectorComponent } from './filter_selection/ct-product-set-selector/ct-product-set-selector.component';\nimport { AlertsGridComponent } from './alerts/alerts-grid/alerts-grid.component';\nimport { DialogsModule, WindowModule } from '@progress/kendo-angular-dialog';\nimport { SearchPopupComponent } from './filter_selection/search-popup/search-popup.component';\nimport { ApiselectListComponent } from './ui_tools/apiselect-list/apiselect-list.component';\nimport { ServiceWorkerModule } from '@angular/service-worker';\nimport { environment } from '../environments/environment';\nimport { GsAlertsDashboardComponent } from './alerts/gs-alerts-dashboard/gs-alerts-dashboard.component';\nimport { GsAlertsNavbarComponent } from './navigation/gs-alerts-navbar/gs-alerts-navbar.component';\nimport { SafeHtmlPipe, SafeStylePipe } from './ui_tools/formatter/safe-html-pipe';\nimport { MsalModule, MsalInterceptor } from '@azure/msal-angular';\nimport { PreferencesComponent } from './navigation/preferences/preferences.component';\nimport { AccountComponent } from './filter_selection/account/account.component';\nimport { ListViewModule } from '@progress/kendo-angular-listview';\nimport { CustomDateFormatterPipe } from './ui_tools/formatter/custom-date-formatter-pipe';\nimport { DataTrendTableComponent } from './control_tower/data-trend-table/data-trend-table.component';\nimport { MetricDetailNoFilterComponent } from './navigation/metric-detail-no-filter/metric-detail-no-filter.component';\nimport { CtAccountSelectorComponent } from './filter_selection/ct-account-selector/ct-account-selector.component';\nimport { CustomerProfileInfoComponent } from './control_tower/customer-profile-info/customer-profile-info.component';\nimport { CuaManagerSelectorComponent } from './filter_selection/cua-manager-selector/cua-manager-selector.component';\nimport { AccountSelectListComponent } from './ui_tools/account-select-list/account-select-list.component';\nimport { CustomerSelectListComponent } from './ui_tools/customer-select-list/customer-select-list.component';\nimport { StateHandlerSearchComponent } from './api/state-handler-search/state-handler-search.component';\nimport { CtManagerAmbSelectorComponent } from './filter_selection/ct-manager-amb-selector/ct-manager-amb-selector.component';\nimport { AccountRepComponent } from './filter_selection/account-rep/account-rep.component';\nimport { BrDashboardComponent } from './business_review/br-dashboard/br-dashboard.component';\nimport { BrTileInsertComponent } from './business_review/br-tile-insert/br-tile-insert.component';\nimport { BrPlaceholderComponent } from './business_review/snapshots/br-placeholder/br-placeholder.component';\nimport { BrNavbarComponent } from './business_review/br-navbar/br-navbar.component';\nimport { BrTemplateEditorComponent } from './business_review/br-template-editor/br-template-editor.component';\nimport { BrTemplateSelectorComponent } from './business_review/br-template-selector/br-template-selector.component';\nimport { AccountCustomerSelectorComponent } from './business_review/search_options/account-customer-selector/account-customer-selector.component';\nimport { AccountCustomerMenuComponent } from './business_review/search_options/account-customer-menu/account-customer-menu.component';\nimport { MultiLevelSelectWidgetComponent } from './business_review/search_options/multi-level-select-widget/multi-level-select-widget.component';\nimport { ProductMenuComponent } from './business_review/search_options/product-menu/product-menu.component';\nimport { HistoryRangeMenuComponent } from './business_review/search_options/history-range-menu/history-range-menu.component';\nimport { ServicingGroupMenuComponent } from './business_review/search_options/servicing-group-menu/servicing-group-menu.component';\nimport { BusinessSegmentMenuComponent } from './business_review/search_options/business-segment-menu/business-segment-menu.component';\nimport { BrStackedBarLineChartComponent } from './business_review/snapshots/br-stacked-bar-line-chart/br-stacked-bar-line-chart.component';\nimport { UiMultiColumnListSelectComponent } from './business_review/ui-multi-column-list-select/ui-multi-column-list-select.component';\nimport { PresentationSelectComponent } from './business_review/presentation-select/presentation-select.component';\nimport { BrLocationSelectorComponent } from './business_review/search_options/br-location-selector/br-location-selector.component';\nimport { BrProductSelectorComponent } from './business_review/search_options/br-product-selector/br-product-selector.component';\nimport { BrBusinessSegmentSelectorComponent } from './business_review/search_options/br-business-segment-selector/br-business-segment-selector.component';\nimport { BrHistoryRangeSelectorComponent } from './business_review/search_options/br-history-range-selector/br-history-range-selector.component';\nimport { PresentationToggleSwitchComponent } from './business_review/presentation-toggle-switch/presentation-toggle-switch.component';\nimport { BrServicingGroupSelectorComponent } from './business_review/search_options/br-servicing-group-selector/br-servicing-group-selector.component';\nimport { BrMultiLineChartComponent } from './business_review/snapshots/br-multi-line-chart/br-multi-line-chart.component';\nimport { BrExpandedChartViewComponent } from './business_review/detail_pages/br-expanded-chart-view/br-expanded-chart-view.component';\nimport { BrListViewComponent } from './business_review/detail_pages/br-list-view/br-list-view.component';\nimport { BrSystemComparisonListViewComponent } from './business_review/system-comparison-pages/br-system-comparison-list-view/br-system-comparison-list-view.component';\nimport { BrPieChartComponent } from './business_review/snapshots/br-pie-chart/br-pie-chart.component';\nimport { BrTemplateViewerComponent } from './business_review/br-template-viewer/br-template-viewer.component';\nimport { BrStackedBarChartByProductComponent } from './business_review/snapshots/br-stacked-bar-chart-by-product/br-stacked-bar-chart-by-product.component';\nimport { BrTimelineViewComponent } from './business_review/timeline-pages/br-timeline-view/br-timeline-view.component';\nimport { BrTextIndicatorComponent } from './business_review/snapshots/br-text-indicator/br-text-indicator.component';\nimport { BrTopItemsComponent } from './business_review/snapshots/br-top-items/br-top-items.component';\nimport { BrNpsScoresComponent } from './business_review/snapshots/br-nps-scores/br-nps-scores.component';\nimport { BrLineChartComponent } from './business_review/snapshots/br-line-chart/br-line-chart.component';\nimport { ApiTestComponent } from './business_review/snapshots/api-test/api-test.component';\nimport { FormsModule } from '@angular/forms';\nimport { BrExamplePieChartComponent } from './business_review/snapshots/br-example-pie-chart/br-example-pie-chart.component';\nimport { FilterPresentationHeaderComponent } from './business_review/filter-presentation-header/filter-presentation-header.component';\nimport { FilterPresentationFooterComponent } from './business_review/filter-presentation-footer/filter-presentation-footer.component';\nimport { DynamicDataTableComponent } from './business_review/dynamic-data-table/dynamic-data-table.component';\nimport { DdtLoaderComponent } from './business_review/ddt-loader/ddt-loader.component';\nimport { BrDetailComponentViewerComponent } from './business_review/br-detail-component-viewer/br-detail-component-viewer.component';\nimport { BrMultiBarChartComponent } from './business_review/snapshots/br-multi-bar-chart/br-multi-bar-chart.component';\n\nconst isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1;\n\n@NgModule({\n declarations: [\n AppComponent,\n AreaLineChartComponent,\n PieChartComponent,\n DashboardComponent,\n TileInsertComponent,\n ShapeIndicatorsComponent,\n TextIndicatorsComponent,\n DashboardNavbarComponent,\n MetricDetailNavbarComponent,\n ParameterSwitchesComponent,\n BookmarksComponent,\n SearchComponent,\n CustomerSelectorComponent,\n StackedBarLineChartComponent,\n MultiLineChartComponent,\n EmptyValueMaskPipe,\n CustomerComponent,\n InstrumentsComponent,\n AmbassadorComponent,\n PlaceholderComponent,\n AreaLineChartComponent,\n CustomerToggleComponent,\n InstrumentToggleComponent,\n TrackToggleComponent,\n FlagshipToggleComponent,\n PersonaSelectorComponent,\n TssAmbassadorSelectorComponent,\n ManagerSelectorComponent,\n CustomerSelectorComponent,\n InstrumentSelectorComponent,\n GeoLocationSelectorComponent,\n AutoselectListComponent,\n VerticalSplitTextIndicatorsComponent,\n StateHandlerComponent,\n TopStatsListComponent,\n ToolSelectorComponent,\n AlertsNavbarComponent,\n CtNavbarComponent,\n CtDashboardComponent,\n AlertsDashboardComponent,\n Style1Component,\n Style1GridComponent,\n FilterInsertComponent,\n DetailCustomerFilterComponent,\n DetailProductLineFilterComponent,\n SetValuesGridComponent,\n StackedBarChartByProductComponent,\n CustomGridComponent,\n AbbottBigNumberFormatterPipe,\n CustomComplianceGridComponent,\n Style2Component,\n Style2GridComponent,\n ComplianceChartComponent,\n SnSelectorComponent,\n UtilizationTpdComponent,\n ManagerAmbSelectorComponent,\n Style3Component,\n Style3GridComponent,\n Style4Component,\n NpsComponent,\n DetailAccountFilterComponent,\n DetailAssayFilterComponent,\n DetailDiseaseStateFilterComponent,\n DetailCategorySwitchesFilterComponent,\n DetailCapitalServiceAssaySwitchesFilterComponent,\n ServiceContractsLevel2Component,\n ServiceContractsLevel3Component,\n ServiceContractsLevel4Component,\n UptimeCustomerDetailsComponent,\n SurveyCommentDetailsComponent,\n CustomerOrderDetailsComponent,\n PersonaSelector2Component,\n SearchIconComponent,\n SGMDetailsComponent,\n PredictiveAlertsLevel2Component,\n PredictiveAlertsLevel3Component,\n DetailPersonaSelectorComponent,\n RnpsSurveyCommentDetailsComponent,\n SalesSummaryComponent,\n SalesDetailsComponent,\n CustomerHealthGridComponent,\n CustomerDataTrendsComponent,\n CustomerHealthAlertsGridComponent,\n DataTrendChartComponent,\n CtCustomerSelectorComponent,\n RnpsSurveyCommentDetailsComponent,\n CtProductSetSelectorComponent,\n AlertsGridComponent,\n SearchPopupComponent,\n ApiselectListComponent,\n GsAlertsDashboardComponent,\n GsAlertsNavbarComponent,\n SafeHtmlPipe,\n SafeStylePipe,\n PreferencesComponent,\n AccountComponent,\n CustomDateFormatterPipe,\n DataTrendTableComponent,\n MetricDetailNoFilterComponent,\n CtAccountSelectorComponent,\n CustomerProfileInfoComponent,\n CuaManagerSelectorComponent,\n AccountSelectListComponent,\n CustomerSelectListComponent,\n StateHandlerSearchComponent,\n CtManagerAmbSelectorComponent,\n AccountRepComponent,\n BrDashboardComponent,\n BrTileInsertComponent,\n BrPlaceholderComponent,\n BrNavbarComponent,\n BrTemplateEditorComponent,\n BrTemplateSelectorComponent,\n AccountCustomerSelectorComponent,\n AccountCustomerMenuComponent,\n MultiLevelSelectWidgetComponent,\n ProductMenuComponent,\n HistoryRangeMenuComponent,\n ServicingGroupMenuComponent,\n BusinessSegmentMenuComponent,\n BrStackedBarLineChartComponent,\n UiMultiColumnListSelectComponent,\n PresentationSelectComponent,\n BrLocationSelectorComponent,\n BrProductSelectorComponent,\n BrBusinessSegmentSelectorComponent,\n BrHistoryRangeSelectorComponent,\n PresentationToggleSwitchComponent,\n BrServicingGroupSelectorComponent,\n BrMultiLineChartComponent,\n BrExpandedChartViewComponent,\n BrListViewComponent,\n BrSystemComparisonListViewComponent,\n BrPieChartComponent,\n BrStackedBarChartByProductComponent,\n BrTemplateViewerComponent,\n BrTimelineViewComponent,\n BrTextIndicatorComponent,\n BrTopItemsComponent,\n BrNpsScoresComponent,\n BrLineChartComponent,\n ApiTestComponent,\n BrExamplePieChartComponent,\n FilterPresentationHeaderComponent,\n FilterPresentationFooterComponent,\n DynamicDataTableComponent,\n DdtLoaderComponent,\n BrDetailComponentViewerComponent,\n BrMultiBarChartComponent\n ],\n imports: [\n FormsModule,\n BrowserModule,\n AppRoutingModule,\n ChartsModule,\n GridModule,\n ExcelModule,\n ButtonsModule,\n PopupModule,\n DropDownsModule,\n BrowserAnimationsModule,\n HttpClientModule,\n FontAwesomeModule,\n InputsModule,\n LayoutModule,\n LabelModule,\n LinearGaugeModule,\n TooltipModule,\n DialogsModule,\n WindowModule,\n ListViewModule,\n ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),\n MsalModule.forRoot({\n auth: {\n clientId: environment.clientId,\n authority: 'https://login.microsoftonline.com/' + environment.tenantId, // This is your tenant info\n redirectUri: environment.authRedirectUrl // This is your redirect URI\n },\n cache: {\n cacheLocation: 'localStorage',\n storeAuthStateInCookie: isIE, // set to true for IE 11\n }\n }\n // ,\n // {\n // popUp: true,//isIE?\n // consentScopes: [\n // 'openid',\n // ]\n // }\n )\n ],\n providers: [\n // {\n // provide: HTTP_INTERCEPTORS,\n // useClass: MsalInterceptor,\n // multi: true\n // }\n ],\n bootstrap: [AppComponent],\n entryComponents: [\n AreaLineChartComponent,\n PieChartComponent,\n MultiLineChartComponent,\n ShapeIndicatorsComponent,\n TextIndicatorsComponent,\n VerticalSplitTextIndicatorsComponent,\n StackedBarLineChartComponent,\n PlaceholderComponent,\n TopStatsListComponent,\n DetailCustomerFilterComponent,\n DetailProductLineFilterComponent,\n StackedBarChartByProductComponent,\n ComplianceChartComponent,\n UtilizationTpdComponent,\n NpsComponent,\n DetailAccountFilterComponent,\n DetailAssayFilterComponent,\n DetailDiseaseStateFilterComponent,\n DetailCategorySwitchesFilterComponent,\n DetailCapitalServiceAssaySwitchesFilterComponent,\n BrPlaceholderComponent,\n BrStackedBarLineChartComponent,\n BrMultiLineChartComponent,\n BrMultiBarChartComponent,\n BrPieChartComponent,\n BrStackedBarChartByProductComponent,\n BrTextIndicatorComponent,\n BrTopItemsComponent,\n BrNpsScoresComponent,\n BrLineChartComponent,\n BrExamplePieChartComponent,\n ApiTestComponent\n\n ]\n})\nexport class AppModule { }\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"zn8P\";"]}