@sapui5/sap.fe.base 1.129.1 → 1.130.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,6 @@ import { hookable } from "sap/fe/base/HookSupport";
6
6
  import type { Ref } from "sap/fe/base/jsx-runtime/jsx";
7
7
  import type UI5Event from "sap/ui/base/Event";
8
8
  import type ManagedObject from "sap/ui/base/ManagedObject";
9
- import type { AggregationBindingInfo } from "sap/ui/base/ManagedObject";
10
9
  import Metadata from "sap/ui/base/Metadata";
11
10
  import BaseObject from "sap/ui/base/Object";
12
11
  import type Control from "sap/ui/core/Control";
@@ -37,6 +36,7 @@ type UI5PropertyMetadata = {
37
36
  expectedAnnotations?: string[];
38
37
  expectedTypes?: string[];
39
38
  allowedValues?: string[];
39
+ visibility?: string;
40
40
  };
41
41
  export type UI5AggregationMetadata = {
42
42
  type: string;
@@ -216,30 +216,19 @@ const ensureGetAPI = function (target: UI5APIControl): void {
216
216
  }
217
217
  };
218
218
 
219
+ type ExtendWithObject<T, K> = T extends object ? K & { [TKey in keyof T]?: BindingInfoHolder<T[TKey]> } : K;
220
+
219
221
  export type StateOf<T> = {
220
- [K in keyof T]: T[K] extends Array<infer U> ? ReadonlyArray<U> & Partial<U> : T[K];
222
+ [K in keyof T]: T[K] extends Array<infer U> | ReadonlyArray<infer U> ? ExtendWithObject<U, ReadonlyArray<U>> : T[K];
221
223
  };
222
- export type BindingInfoHolder = {
224
+ export type BindingInfoHolder<T> = T & {
223
225
  __bindingInfo: {
224
226
  path: string;
225
227
  model: string;
228
+ type: T;
226
229
  };
227
230
  };
228
231
 
229
- /**
230
- * Creates the binding info for an array property coming from the state.
231
- * @param stateProperty
232
- * @returns The aggregation binding info
233
- */
234
- export function bindStateArray(stateProperty: readonly object[]): AggregationBindingInfo | undefined {
235
- if ((stateProperty as unknown as BindingInfoHolder).__bindingInfo !== undefined) {
236
- return {
237
- path: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.path,
238
- model: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.model
239
- };
240
- }
241
- }
242
-
243
232
  /**
244
233
  * Allows to define a property that will hold the control state.
245
234
  *
@@ -553,23 +542,77 @@ export function defineReference(): PropertyDecorator {
553
542
  } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
554
543
  }
555
544
 
545
+ function _getHandlerForStateProperty(jsonModel: JSONModel, prop: string): unknown {
546
+ const pathInModel = `/${prop.toString()}`;
547
+ const oObj = deepClone(jsonModel.getObject(pathInModel));
548
+ let oTarget;
549
+ if (typeof oObj === "string") {
550
+ oTarget = { value: oObj };
551
+ oTarget.toString = function (): string {
552
+ return this.value;
553
+ };
554
+ } else if (typeof oObj === "number") {
555
+ oTarget = { value: oObj };
556
+ oTarget.toString = function (): string {
557
+ return this.value.toString();
558
+ };
559
+ } else if (typeof oObj === "boolean") {
560
+ oTarget = new Boolean(oObj);
561
+ } else if (Array.isArray(oObj)) {
562
+ oTarget = new Proxy(oObj, {
563
+ get(target: unknown[], p: string | symbol, receiver: unknown[]): unknown {
564
+ const ref = Reflect.get(target, p, receiver);
565
+ if (typeof ref === "function") {
566
+ return ref.bind(target);
567
+ } else if (ref === undefined && isNaN(Number(p.toString()))) {
568
+ return {
569
+ __bindingInfo: {
570
+ model: "$componentState",
571
+ path: p
572
+ }
573
+ };
574
+ }
575
+ return ref;
576
+ }
577
+ });
578
+ } else {
579
+ oTarget = { ...oObj };
580
+ }
581
+ oTarget.__bindingInfo = {
582
+ model: "$componentState",
583
+ path: pathInModel
584
+ };
585
+ return oTarget;
586
+ }
587
+
556
588
  function _createStateProperty(
557
589
  obj: UI5ControlDefinition,
558
- targetControl: Control & { _updateState: Function; _updateStateDebounced: Function; _updateStateTimer: unknown }
590
+ targetControl: Control & {
591
+ _updateState: Function;
592
+ _updateStateDebounced: Function;
593
+ _updateStateTimer: unknown;
594
+ _changedProps?: string[];
595
+ }
559
596
  ): void {
560
597
  if (obj.metadata?.stateProperty) {
561
598
  const stateModel = new JSONModel({});
562
599
  targetControl.setModel(stateModel, "$componentState");
563
600
  let updatingState = false;
564
- targetControl._updateState = function (): void {
601
+ // This method can be used to force the state to be applied and wait for it to be applied in tests
602
+ targetControl._updateState = async function (): Promise<void> {
565
603
  delete this._updateStateTimer;
566
604
  if (!updatingState) {
567
605
  updatingState = true;
568
- (this as { onStateChange?: Function }).onStateChange?.();
606
+ await (this as { onStateChange?: Function }).onStateChange?.(this._changedProps);
607
+ this._changedProps = [];
569
608
  updatingState = false;
570
609
  }
571
610
  };
572
- targetControl._updateStateDebounced = function (): void {
611
+ targetControl._updateStateDebounced = function (changedProp: string): void {
612
+ this._changedProps ??= [];
613
+ if (!this._changedProps.includes(changedProp)) {
614
+ this._changedProps.push(changedProp);
615
+ }
573
616
  if (!this._updateStateTimer && !updatingState) {
574
617
  this._updateStateTimer = setTimeout(() => {
575
618
  this._updateState();
@@ -580,51 +623,12 @@ function _createStateProperty(
580
623
  configurable: true,
581
624
  get: () => {
582
625
  return new Proxy(stateModel, {
583
- get: function (jsonModel, prop): unknown {
584
- const pathInModel = `/${prop.toString()}`;
585
- const oObj = deepClone(jsonModel.getObject(pathInModel));
586
- let oTarget;
587
- if (typeof oObj === "string") {
588
- oTarget = { value: oObj };
589
- oTarget.toString = function (): string {
590
- return this.value;
591
- };
592
- } else if (typeof oObj === "number") {
593
- oTarget = { value: oObj };
594
- oTarget.toString = function (): string {
595
- return this.value.toString();
596
- };
597
- } else if (typeof oObj === "boolean") {
598
- oTarget = new Boolean(oObj);
599
- } else if (Array.isArray(oObj)) {
600
- oTarget = new Proxy(oObj.concat(), {
601
- get(target: unknown[], p: string | symbol, receiver: unknown[]): unknown {
602
- const ref = Reflect.get(target, p, receiver);
603
- if (typeof ref === "function") {
604
- return ref.bind(target);
605
- } else if (ref === undefined && isNaN(Number(p.toString()))) {
606
- return {
607
- __bindingInfo: {
608
- model: "$componentState",
609
- path: p
610
- }
611
- };
612
- }
613
- return ref;
614
- }
615
- });
616
- } else {
617
- oTarget = { ...oObj };
618
- }
619
- oTarget.__bindingInfo = {
620
- model: "$componentState",
621
- path: pathInModel
622
- };
623
- return oTarget;
626
+ get: (target: JSONModel, prop: string): unknown => {
627
+ return _getHandlerForStateProperty(target, prop);
624
628
  },
625
629
  set: (setStateModel: JSONModel, prop, value): boolean => {
626
630
  const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
627
- targetControl._updateStateDebounced();
631
+ targetControl._updateStateDebounced(prop.toString());
628
632
  return setResult;
629
633
  }
630
634
  });
@@ -635,7 +639,7 @@ function _createStateProperty(
635
639
  }
636
640
  });
637
641
  if (obj.metadata.statePropertyDefaultValue) {
638
- targetControl[obj.metadata.stateProperty as keyof Control] = obj.metadata.statePropertyDefaultValue as never;
642
+ targetControl[obj.metadata.stateProperty as keyof Control] = { ...obj.metadata.statePropertyDefaultValue } as never;
639
643
  }
640
644
  }
641
645
  }
@@ -690,6 +694,7 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
690
694
  }
691
695
  const output = clazz.extend(name, obj) as typeof Control & Function;
692
696
  const fnInit = output.prototype.init;
697
+ const fnAfterInit = output.prototype.afterInit;
693
698
  output.prototype.init = function (...args: unknown[]): void {
694
699
  if (fnInit) {
695
700
  fnInit.apply(this, args);
@@ -831,6 +836,9 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
831
836
  }
832
837
  }
833
838
  _createStateProperty(obj, this);
839
+ if (fnAfterInit) {
840
+ fnAfterInit.apply(this, args);
841
+ }
834
842
  };
835
843
 
836
844
  clazz.override = function (oExtension: unknown): Function {
@@ -0,0 +1,68 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (ClassSupport, Element) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
9
+ var _exports = {};
10
+ var property = ClassSupport.property;
11
+ var event = ClassSupport.event;
12
+ var defineUI5Class = ClassSupport.defineUI5Class;
13
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
14
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
15
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
16
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
17
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
18
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
19
+ /**
20
+ * Create an event delegate hook on the parent of this control to deal with event propagation.
21
+ *
22
+ * This is a specific solution for the Avatar control case where the press cannot be interrupted and which then ends up interacting with control behind it.
23
+ *
24
+ */
25
+ let EventDelegateHook = (_dec = defineUI5Class("sap.fe.base.EventDelegateHook"), _dec2 = property({
26
+ type: "boolean"
27
+ }), _dec3 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_Element) {
28
+ _inheritsLoose(EventDelegateHook, _Element);
29
+ function EventDelegateHook(idOrSettings, settings) {
30
+ var _this;
31
+ _this = _Element.call(this, idOrSettings, settings) || this;
32
+ _initializerDefineProperty(_this, "stopTapPropagation", _descriptor, _assertThisInitialized(_this));
33
+ _initializerDefineProperty(_this, "tap", _descriptor2, _assertThisInitialized(_this));
34
+ return _this;
35
+ }
36
+ _exports = EventDelegateHook;
37
+ var _proto = EventDelegateHook.prototype;
38
+ _proto.setParent = function setParent(parentObject) {
39
+ if (this.getParent()) {
40
+ this.getParent().removeEventDelegate(this);
41
+ }
42
+ parentObject.addEventDelegate(this);
43
+ _Element.prototype.setParent.call(this, parentObject);
44
+ };
45
+ _proto.ontap = function ontap(tapEvent) {
46
+ if (this.stopTapPropagation) {
47
+ tapEvent.stopPropagation();
48
+ }
49
+ this.fireEvent("tap");
50
+ };
51
+ return EventDelegateHook;
52
+ }(Element), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "stopTapPropagation", [_dec2], {
53
+ configurable: true,
54
+ enumerable: true,
55
+ writable: true,
56
+ initializer: function () {
57
+ return false;
58
+ }
59
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "tap", [_dec3], {
60
+ configurable: true,
61
+ enumerable: true,
62
+ writable: true,
63
+ initializer: null
64
+ })), _class2)) || _class);
65
+ _exports = EventDelegateHook;
66
+ return _exports;
67
+ }, false);
68
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudERlbGVnYXRlSG9vayIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwicHJvcGVydHkiLCJ0eXBlIiwiX2RlYzMiLCJldmVudCIsIl9jbGFzcyIsIl9jbGFzczIiLCJfRWxlbWVudCIsIl9pbmhlcml0c0xvb3NlIiwiaWRPclNldHRpbmdzIiwic2V0dGluZ3MiLCJfdGhpcyIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIl9kZXNjcmlwdG9yMiIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwic2V0UGFyZW50IiwicGFyZW50T2JqZWN0IiwiZ2V0UGFyZW50IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJvbnRhcCIsInRhcEV2ZW50Iiwic3RvcFRhcFByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiZmlyZUV2ZW50IiwiRWxlbWVudCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRXZlbnREZWxlZ2F0ZUhvb2sudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXZlbnQsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyAkRWxlbWVudFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50SGFuZGxlciB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYW4gZXZlbnQgZGVsZWdhdGUgaG9vayBvbiB0aGUgcGFyZW50IG9mIHRoaXMgY29udHJvbCB0byBkZWFsIHdpdGggZXZlbnQgcHJvcGFnYXRpb24uXG4gKlxuICogVGhpcyBpcyBhIHNwZWNpZmljIHNvbHV0aW9uIGZvciB0aGUgQXZhdGFyIGNvbnRyb2wgY2FzZSB3aGVyZSB0aGUgcHJlc3MgY2Fubm90IGJlIGludGVycnVwdGVkIGFuZCB3aGljaCB0aGVuIGVuZHMgdXAgaW50ZXJhY3Rpbmcgd2l0aCBjb250cm9sIGJlaGluZCBpdC5cbiAqXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkV2ZW50RGVsZWdhdGVIb29rXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERlbGVnYXRlSG9vayBleHRlbmRzIEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBcImJvb2xlYW5cIiB9KVxuXHRzdG9wVGFwUHJvcGFnYXRpb24gPSBmYWxzZTtcblxuXHRAZXZlbnQoKVxuXHR0YXA/OiBFdmVudEhhbmRsZXI7XG5cblx0Y29uc3RydWN0b3IoaWRPclNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKTtcblxuXHRjb25zdHJ1Y3RvcihpZE9yU2V0dGluZ3M6IHN0cmluZywgc2V0dGluZ3M/OiBFdmVudERlbGVnYXRlU2V0dGluZ3MpO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JTZXR0aW5ncz86IHN0cmluZyB8IFByb3BlcnRpZXNPZjxFdmVudERlbGVnYXRlSG9vaz4sIHNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKSB7XG5cdFx0c3VwZXIoaWRPclNldHRpbmdzIGFzIHN0cmluZywgc2V0dGluZ3MpO1xuXHR9XG5cblx0c2V0UGFyZW50KHBhcmVudE9iamVjdDogRWxlbWVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmdldFBhcmVudCgpKSB7XG5cdFx0XHQodGhpcy5nZXRQYXJlbnQoKSBhcyBFbGVtZW50KS5yZW1vdmVFdmVudERlbGVnYXRlKHRoaXMpO1xuXHRcdH1cblx0XHRwYXJlbnRPYmplY3QuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzKTtcblx0XHRzdXBlci5zZXRQYXJlbnQocGFyZW50T2JqZWN0KTtcblx0fVxuXG5cdG9udGFwKHRhcEV2ZW50OiBKUXVlcnkuRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5zdG9wVGFwUHJvcGFnYXRpb24pIHtcblx0XHRcdHRhcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0XHR0aGlzLmZpcmVFdmVudChcInRhcFwiKTtcblx0fVxufVxuXG50eXBlIEV2ZW50RGVsZWdhdGVTZXR0aW5ncyA9ICRFbGVtZW50U2V0dGluZ3MgJiBQcm9wZXJ0aWVzT2Y8RXZlbnREZWxlZ2F0ZUhvb2s+O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9xQkEsaUJBQWlCLElBQUFDLElBQUEsR0FEckNDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFBQyxLQUFBLEdBRTlDQyxRQUFRLENBQUM7SUFBRUMsSUFBSSxFQUFFO0VBQVUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHN0JDLEtBQUssQ0FBQyxDQUFDLEVBQUFOLElBQUEsQ0FBQU8sTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxRQUFBO0lBQUFDLGNBQUEsQ0FBQVgsaUJBQUEsRUFBQVUsUUFBQTtJQU9SLFNBQUFWLGtCQUFZWSxZQUF1RCxFQUFFQyxRQUFnQyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUN0R0EsS0FBQSxHQUFBSixRQUFBLENBQUFLLElBQUEsT0FBTUgsWUFBWSxFQUFZQyxRQUFRLENBQUM7TUFBQ0csMEJBQUEsQ0FBQUYsS0FBQSx3QkFBQUcsV0FBQSxFQUFBQyxzQkFBQSxDQUFBSixLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsU0FBQUssWUFBQSxFQUFBRCxzQkFBQSxDQUFBSixLQUFBO01BQUEsT0FBQUEsS0FBQTtJQUN6QztJQUFDTSxRQUFBLEdBQUFwQixpQkFBQTtJQUFBLElBQUFxQixNQUFBLEdBQUFyQixpQkFBQSxDQUFBc0IsU0FBQTtJQUFBRCxNQUFBLENBRURFLFNBQVMsR0FBVCxTQUFBQSxVQUFVQyxZQUFxQixFQUFRO01BQ3RDLElBQUksSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLElBQUksQ0FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBYUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO01BQ3hEO01BQ0FGLFlBQVksQ0FBQ0csZ0JBQWdCLENBQUMsSUFBSSxDQUFDO01BQ25DakIsUUFBQSxDQUFBWSxTQUFBLENBQU1DLFNBQVMsQ0FBQVIsSUFBQSxPQUFDUyxZQUFZO0lBQzdCLENBQUM7SUFBQUgsTUFBQSxDQUVETyxLQUFLLEdBQUwsU0FBQUEsTUFBTUMsUUFBc0IsRUFBUTtNQUNuQyxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7UUFDNUJELFFBQVEsQ0FBQ0UsZUFBZSxDQUFDLENBQUM7TUFDM0I7TUFDQSxJQUFJLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUFBLE9BQUFoQyxpQkFBQTtFQUFBLEVBNUI2Q2lDLE9BQU8sSUFBQWhCLFdBQUEsR0FBQWlCLHlCQUFBLENBQUF6QixPQUFBLENBQUFhLFNBQUEseUJBQUFuQixLQUFBO0lBQUFnQyxZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBLFdBQUFBLENBQUE7TUFBQSxPQUVoQyxLQUFLO0lBQUE7RUFBQSxJQUFBbkIsWUFBQSxHQUFBZSx5QkFBQSxDQUFBekIsT0FBQSxDQUFBYSxTQUFBLFVBQUFoQixLQUFBO0lBQUE2QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsS0FBQTdCLE9BQUEsTUFBQUQsTUFBQTtFQUFBWSxRQUFBLEdBQUFwQixpQkFBQTtFQUFBLE9BQUFvQixRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,45 @@
1
+ import type { PropertiesOf } from "sap/fe/base/ClassSupport";
2
+ import { defineUI5Class, event, property } from "sap/fe/base/ClassSupport";
3
+ import type { $ElementSettings } from "sap/ui/core/Element";
4
+ import Element from "sap/ui/core/Element";
5
+ import type { EventHandler } from "types/extension_types";
6
+
7
+ /**
8
+ * Create an event delegate hook on the parent of this control to deal with event propagation.
9
+ *
10
+ * This is a specific solution for the Avatar control case where the press cannot be interrupted and which then ends up interacting with control behind it.
11
+ *
12
+ */
13
+ @defineUI5Class("sap.fe.base.EventDelegateHook")
14
+ export default class EventDelegateHook extends Element {
15
+ @property({ type: "boolean" })
16
+ stopTapPropagation = false;
17
+
18
+ @event()
19
+ tap?: EventHandler;
20
+
21
+ constructor(idOrSettings?: EventDelegateSettings);
22
+
23
+ constructor(idOrSettings: string, settings?: EventDelegateSettings);
24
+
25
+ constructor(idOrSettings?: string | PropertiesOf<EventDelegateHook>, settings?: EventDelegateSettings) {
26
+ super(idOrSettings as string, settings);
27
+ }
28
+
29
+ setParent(parentObject: Element): void {
30
+ if (this.getParent()) {
31
+ (this.getParent() as Element).removeEventDelegate(this);
32
+ }
33
+ parentObject.addEventDelegate(this);
34
+ super.setParent(parentObject);
35
+ }
36
+
37
+ ontap(tapEvent: JQuery.Event): void {
38
+ if (this.stopTapPropagation) {
39
+ tapEvent.stopPropagation();
40
+ }
41
+ this.fireEvent("tap");
42
+ }
43
+ }
44
+
45
+ type EventDelegateSettings = $ElementSettings & PropertiesOf<EventDelegateHook>;
@@ -6,6 +6,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
6
6
  "use strict";
7
7
 
8
8
  var bindingParser = ManagedObject.bindingParser;
9
+ var isPathInModelExpression = BindingToolkit.isPathInModelExpression;
9
10
  var isConstant = BindingToolkit.isConstant;
10
11
  var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
11
12
  var compileExpression = BindingToolkit.compileExpression;
@@ -80,12 +81,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
80
81
  function processProperties(metadata, settings) {
81
82
  let settingsKey;
82
83
  const lateProperties = {};
84
+ const allEvents = metadata.getAllEvents();
85
+ const allProperties = metadata.getAllProperties();
83
86
  for (settingsKey in settings) {
84
87
  const value = settings[settingsKey];
85
88
  if (isBindingToolkitExpression(value)) {
86
89
  const bindingToolkitExpression = value;
87
90
  if (isConstant(bindingToolkitExpression)) {
88
91
  settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
92
+ } else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
93
+ // Aggregation case - we need to compile the expression but as an object
94
+ if (isPathInModelExpression(bindingToolkitExpression)) {
95
+ settings[settingsKey] = {
96
+ path: bindingToolkitExpression.path,
97
+ model: bindingToolkitExpression.modelName
98
+ };
99
+ }
89
100
  } else {
90
101
  settings[settingsKey] = compileExpression(bindingToolkitExpression);
91
102
  }
@@ -93,13 +104,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
93
104
  lateProperties[settingsKey] = value;
94
105
  delete settings[settingsKey];
95
106
  } else if (typeof value === "string" && !value.startsWith("{")) {
96
- var _metadata$getAllPrope, _metadata$getAllPrope2, _metadata$getAllPrope3;
97
- const propertyType = (_metadata$getAllPrope = metadata.getAllProperties()[settingsKey]) === null || _metadata$getAllPrope === void 0 ? void 0 : (_metadata$getAllPrope2 = (_metadata$getAllPrope3 = _metadata$getAllPrope).getType) === null || _metadata$getAllPrope2 === void 0 ? void 0 : _metadata$getAllPrope2.call(_metadata$getAllPrope3);
107
+ var _allProperties$settin, _allProperties$settin2, _allProperties$settin3;
108
+ const propertyType = (_allProperties$settin = allProperties[settingsKey]) === null || _allProperties$settin === void 0 ? void 0 : (_allProperties$settin2 = (_allProperties$settin3 = _allProperties$settin).getType) === null || _allProperties$settin2 === void 0 ? void 0 : _allProperties$settin2.call(_allProperties$settin3);
98
109
  if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
99
110
  settings[settingsKey] = propertyType.parseValue(value);
100
111
  }
101
112
  } else if (typeof value === "object" && value.__bindingInfo) {
102
113
  settings[settingsKey] = value.__bindingInfo;
114
+ } else if (value === undefined) {
115
+ if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
116
+ delete settings[settingsKey];
117
+ }
103
118
  }
104
119
  }
105
120
  return lateProperties;
@@ -137,6 +152,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
137
152
  if (key !== undefined) {
138
153
  settings["key"] = key;
139
154
  }
155
+ const lateProperties = processProperties(metadata, settings);
140
156
  processCommand(metadata, settings);
141
157
  processAggregations(metadata, settings);
142
158
  const classDef = settings.class;
@@ -149,7 +165,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
149
165
  delete settings.binding;
150
166
  delete settings[FL_DELEGATE];
151
167
  delete settings[DT_DESIGNTIME];
152
- const lateProperties = processProperties(metadata, settings);
153
168
  const targetControlInstance = new ControlType(settings);
154
169
  if (classDef) {
155
170
  targetControlInstance.addStyleClass(classDef);
@@ -209,4 +224,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
209
224
  };
210
225
  return jsxControl;
211
226
  }, false);
212
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsInZhbHVlIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9tZXRhZGF0YSRnZXRBbGxQcm9wZSIsIl9tZXRhZGF0YSRnZXRBbGxQcm9wZTIiLCJfbWV0YWRhdGEkZ2V0QWxsUHJvcGUzIiwicHJvcGVydHlUeXBlIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldFR5cGUiLCJEYXRhVHlwZSIsImluY2x1ZGVzIiwiZ2V0TmFtZSIsInBhcnNlVmFsdWUiLCJfX2JpbmRpbmdJbmZvIiwicHJvY2Vzc0NvbW1hbmQiLCJjb21tYW5kUHJvcGVydHkiLCJjb21tYW5kIiwiZXZlbnROYW1lIiwic3BsaXQiLCJldmVudCIsImdldEFsbEV2ZW50cyIsIm5hbWUiLCJFdmVudEhhbmRsZXJSZXNvbHZlciIsInJlc29sdmVFdmVudEhhbmRsZXIiLCJqc3hDb250cm9sIiwiQ29udHJvbFR5cGUiLCJrZXkiLCJqc3hDb250ZXh0IiwidGFyZ2V0Q29udHJvbCIsImlzRnJhZ21lbnQiLCJpc1J1bnRpbWUiLCJfcnVudGltZUJ1aWxkaW5nQmxvY2siLCJydW50aW1lQnVpbGRpbmdCbG9jayIsImdldENvbnRlbnQiLCJ2aWV3IiwiYXBwQ29tcG9uZW50IiwiY2xhc3NEZWYiLCJjbGFzcyIsInJlZkRlZiIsInJlZiIsImJpbmRpbmdEZWYiLCJiaW5kaW5nIiwiZmxEZWxlZ2F0ZSIsImR0RGVzaWdudGltZSIsInRhcmdldENvbnRyb2xJbnN0YW5jZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRDdXJyZW50IiwiY3VzdG9tU2V0dGluZ3MiLCJkYXRhIiwiZGVsZWdhdGUiLCJkZXNpZ250aW1lIiwibGVuZ3RoIiwiYmluZGluZ0luZm8iLCJiaW5kaW5nUGFyc2VyIiwiYmluZEVsZW1lbnQiLCJtb2RlbCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUNvbnN0YW50LCBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzQ29uc3RhbnQgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ0luZm9Ib2xkZXIsIE5vbkFic3RyYWN0Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBKU1hDb250ZXh0LCBOb25Db250cm9sUHJvcGVydGllcywgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZVwiO1xuaW1wb3J0IHR5cGUgUnVudGltZUJ1aWxkaW5nQmxvY2sgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvUnVudGltZUJ1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgRGF0YVR5cGUgZnJvbSBcInNhcC91aS9iYXNlL0RhdGFUeXBlXCI7XG5pbXBvcnQgeyBiaW5kaW5nUGFyc2VyIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3RNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdE1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEVsZW1lbnQsIGRlZmF1bHQgYXMgVUk1RWxlbWVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRXZlbnRIYW5kbGVyUmVzb2x2ZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9FdmVudEhhbmRsZXJSZXNvbHZlclwiO1xuXG5jb25zdCBGTF9ERUxFR0FURSA9IFwiZmw6ZGVsZWdhdGVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgZmFjdG9yeTogRnVuY3Rpb24gfSkuZmFjdG9yeSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbk5hbWVcblx0XHRcdFx0XHRdIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgdGVtcGxhdGU6IHN0cmluZyB8IFVJNUVsZW1lbnQgfSkudGVtcGxhdGUgPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV1bMF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBwcm9wZXJ0aWVzLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb24gd2UgbmVlZCB0byBjb21waWxlIGl0LlxuICogRWxzZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzIHN0cmluZyAoY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nIGJ5IGRlZmF1bHQgZXZlbiBpZiBpdCdzIGEgYm9vbGVhbiwgaW50LCBldGMuKSBhbmQgaXQgZG9lc24ndCBtYXRjaCB3aXRoIGV4cGVjdGVkXG4gKiBmb3JtYXQgdGhlIHZhbHVlIGlzIHBhcnNlZCB0byBwcm92aWRlIGV4cGVjdGVkIGZvcm1hdC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcmV0dXJucyBBIG1hcCBvZiBsYXRlIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIGF3YWl0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiB7XG5cdGxldCBzZXR0aW5nc0tleToga2V5b2YgdHlwZW9mIHNldHRpbmdzO1xuXHRjb25zdCBsYXRlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4gPSB7fTtcblx0Zm9yIChzZXR0aW5nc0tleSBpbiBzZXR0aW5ncykge1xuXHRcdGNvbnN0IHZhbHVlID0gc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+ID0gdmFsdWU7XG5cdFx0XHRpZiAoaXNDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGZhbHNlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVFeHByZXNzaW9uKGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj4pLnRoZW4pIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSA9IHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj47XG5cdFx0XHRkZWxldGUgc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gKG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKVtzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdFx0aWYgKHByb3BlcnR5VHlwZSAmJiBwcm9wZXJ0eVR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSAmJiBbXCJib29sZWFuXCIsIFwiaW50XCIsIFwiZmxvYXRcIl0uaW5jbHVkZXMocHJvcGVydHlUeXBlLmdldE5hbWUoKSkpIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gcHJvcGVydHlUeXBlLnBhcnNlVmFsdWUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBCaW5kaW5nSW5mb0hvbGRlcikuX19iaW5kaW5nSW5mbykge1xuXHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyKS5fX2JpbmRpbmdJbmZvO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbGF0ZVByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbW1hbmQobWV0YWRhdGE6IE1hbmFnZWRPYmplY3RNZXRhZGF0YSwgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IGNvbW1hbmRQcm9wZXJ0eSA9IHNldHRpbmdzW1wianN4OmNvbW1hbmRcIl07XG5cdGlmIChjb21tYW5kUHJvcGVydHkpIHtcblx0XHRjb25zdCBbY29tbWFuZCwgZXZlbnROYW1lXSA9IChjb21tYW5kUHJvcGVydHkgYXMgc3RyaW5nKS5zcGxpdChcInxcIik7XG5cdFx0Y29uc3QgZXZlbnQgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKVtldmVudE5hbWVdO1xuXHRcdGlmIChldmVudCAmJiBjb21tYW5kLnN0YXJ0c1dpdGgoXCJjbWQ6XCIpKSB7XG5cdFx0XHRzZXR0aW5nc1tldmVudC5uYW1lXSA9IEV2ZW50SGFuZGxlclJlc29sdmVyLnJlc29sdmVFdmVudEhhbmRsZXIoY29tbWFuZCk7XG5cdFx0fVxuXHR9XG5cdGRlbGV0ZSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xufVxuXG5jb25zdCBqc3hDb250cm9sID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBFbGVtZW50Pihcblx0Q29udHJvbFR5cGU6IE5vbkFic3RyYWN0Q2xhc3M8Q29udHJvbD4gfCBGdW5jdGlvbixcblx0c2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYge1xuXHRcdGtleTogc3RyaW5nO1xuXHRcdGNoaWxkcmVuPzogRWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+O1xuXHRcdHJlZj86IFJlZjxUPjtcblx0XHRiaW5kaW5nPzogc3RyaW5nO1xuXHRcdGNsYXNzPzogc3RyaW5nO1xuXHRcdFtGTF9ERUxFR0FURV0/OiBzdHJpbmc7XG5cdFx0W0RUX0RFU0lHTlRJTUVdPzogc3RyaW5nO1xuXHR9LFxuXHRrZXk6IHN0cmluZyxcblx0anN4Q29udGV4dDogSlNYQ29udGV4dFxuKTogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCB0YXJnZXRDb250cm9sOiBDb250cm9sIHwgQ29udHJvbFtdIHwgdW5kZWZpbmVkO1xuXG5cdGlmICgoQ29udHJvbFR5cGUgYXMgeyBpc0ZyYWdtZW50PzogYm9vbGVhbiB9KT8uaXNGcmFnbWVudCkge1xuXHRcdHRhcmdldENvbnRyb2wgPSBzZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sIHwgQ29udHJvbFtdO1xuXHR9IGVsc2UgaWYgKChDb250cm9sVHlwZSBhcyB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKT8uaXNSdW50aW1lKSB7XG5cdFx0Y29uc3QgcnVudGltZUJ1aWxkaW5nQmxvY2sgPSBuZXcgKENvbnRyb2xUeXBlIGFzIHR5cGVvZiBSdW50aW1lQnVpbGRpbmdCbG9jaykoc2V0dGluZ3MgYXMgdW5rbm93biBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHR0YXJnZXRDb250cm9sID0gcnVudGltZUJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudD8uKGpzeENvbnRleHQudmlldyEsIGpzeENvbnRleHQuYXBwQ29tcG9uZW50ISk7XG5cdH0gZWxzZSBpZiAoaXNBQ29udHJvbChDb250cm9sVHlwZSkpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IENvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCk7XG5cdFx0aWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZXR0aW5nc1tcImtleVwiXSA9IGtleTtcblx0XHR9XG5cdFx0cHJvY2Vzc0NvbW1hbmQobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgY2xhc3NEZWYgPSBzZXR0aW5ncy5jbGFzcztcblx0XHRjb25zdCByZWZEZWYgPSBzZXR0aW5ncy5yZWY7XG5cdFx0Y29uc3QgYmluZGluZ0RlZiA9IHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0Y29uc3QgZmxEZWxlZ2F0ZSA9IHNldHRpbmdzW0ZMX0RFTEVHQVRFXTtcblx0XHRjb25zdCBkdERlc2lnbnRpbWUgPSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3MucmVmO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5jbGFzcztcblx0XHRkZWxldGUgc2V0dGluZ3MuYmluZGluZztcblx0XHRkZWxldGUgc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRjb25zdCBsYXRlUHJvcGVydGllcyA9IHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbEluc3RhbmNlID0gbmV3IENvbnRyb2xUeXBlKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdGlmIChjbGFzc0RlZikge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmFkZFN0eWxlQ2xhc3MoY2xhc3NEZWYpO1xuXHRcdH1cblx0XHRpZiAocmVmRGVmKSB7XG5cdFx0XHRyZWZEZWYuc2V0Q3VycmVudCh0YXJnZXRDb250cm9sSW5zdGFuY2UgYXMgdW5rbm93biBhcyBUKTtcblx0XHR9XG5cdFx0Y29uc3QgY3VzdG9tU2V0dGluZ3MgPSB0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIikgPz8ge307XG5cdFx0aWYgKGZsRGVsZWdhdGUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdLmRlbGVnYXRlID0gZmxEZWxlZ2F0ZTtcblx0XHR9XG5cdFx0aWYgKGR0RGVzaWdudGltZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0uZGVzaWdudGltZSA9IGR0RGVzaWdudGltZTtcblx0XHR9XG5cdFx0aWYgKE9iamVjdC5rZXlzKGN1c3RvbVNldHRpbmdzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIiwgY3VzdG9tU2V0dGluZ3MpO1xuXHRcdH1cblxuXHRcdGlmIChiaW5kaW5nRGVmKSB7XG5cdFx0XHRpZiAodHlwZW9mIGJpbmRpbmdEZWYgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0luZm8gPSBiaW5kaW5nUGFyc2VyKGJpbmRpbmdEZWYpO1xuXHRcdFx0XHRpZiAoYmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLCBwYXRoOiBiaW5kaW5nSW5mby5wYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudChiaW5kaW5nRGVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGNvbnNpZGVyIGl0J3MgYW4gb2JqZWN0XG5cdFx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdEZWYpLmZvckVhY2goKGJpbmRpbmdEZWZLZXkpID0+IHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0RlZktleSwgcGF0aDogYmluZGluZ0RlZltiaW5kaW5nRGVmS2V5XSB9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGF0ZVByb3BlcnRpZXNLZXkgaW4gbGF0ZVByb3BlcnRpZXMpIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW2xhdGVQcm9wZXJ0aWVzS2V5XVxuXHRcdFx0XHQudGhlbigodmFsdWUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbEluc3RhbmNlLnNldFByb3BlcnR5KGxhdGVQcm9wZXJ0aWVzS2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENvdWxkbid0IHNldCBwcm9wZXJ0eSAke2xhdGVQcm9wZXJ0aWVzS2V5fSBvbiAke0NvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWAsIGVycm9yLCBcImpzeENvbnRyb2xcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBDb250cm9sVHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Y29uc3QgY29udHJvbFR5cGVGbiA9IENvbnRyb2xUeXBlO1xuXHRcdHRhcmdldENvbnRyb2wgPSBjb250cm9sVHlwZUZuKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldENvbnRyb2wgPSBuZXcgVGV4dCh7IHRleHQ6IFwiTWlzc2luZyBjb21wb25lbnQgXCIgKyAoQ29udHJvbFR5cGUgYXMgc3RyaW5nKSB9KTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRDb250cm9sO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganN4Q29udHJvbDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBZ0JBLE1BQU1BLFdBQVcsR0FBRyxhQUFhO0VBQ2pDLE1BQU1DLGFBQWEsR0FBRyxlQUFlO0VBQ3JDLE1BQU1DLG1CQUFtQixHQUFHLFNBQUFBLENBQzNCQyxtQkFBNEQsRUFDNURDLGVBQXVCLEVBQ3ZCQyxLQUEwQyxFQUNuQztJQUNQLElBQUlBLEtBQUssS0FBSyxJQUFJLElBQUlBLEtBQUssS0FBS0MsU0FBUyxJQUFJLE9BQU9ELEtBQUssS0FBSyxRQUFRLEVBQUU7TUFDdkU7SUFDRDtJQUNBLElBQUksQ0FBQ0YsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxFQUFFO01BQzFDRCxtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEdBQUcsRUFBRTtJQUMxQztJQUNBLElBQUlHLGdCQUFnQixDQUFDRixLQUFLLENBQUMsRUFBRTtNQUM1QkYsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxDQUFDSSxJQUFJLENBQUNILEtBQUssQ0FBQztJQUNqRCxDQUFDLE1BQU0sSUFBSUksS0FBSyxDQUFDQyxPQUFPLENBQUNMLEtBQUssQ0FBQyxFQUFFO01BQ2hDQSxLQUFLLENBQUNNLE9BQU8sQ0FBRUMsUUFBUSxJQUFLO1FBQzNCVixtQkFBbUIsQ0FBQ0MsbUJBQW1CLEVBQUVDLGVBQWUsRUFBRVEsUUFBUSxDQUFDO01BQ3BFLENB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
227
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsImFsbEV2ZW50cyIsImdldEFsbEV2ZW50cyIsImFsbFByb3BlcnRpZXMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwidmFsdWUiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJjb21waWxlQ29uc3RhbnQiLCJpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiIsIm1vZGVsIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbiIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbjIiLCJfYWxsUHJvcGVydGllcyRzZXR0aW4zIiwicHJvcGVydHlUeXBlIiwiZ2V0VHlwZSIsIkRhdGFUeXBlIiwiaW5jbHVkZXMiLCJnZXROYW1lIiwicGFyc2VWYWx1ZSIsIl9fYmluZGluZ0luZm8iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsIl9ydW50aW1lQnVpbGRpbmdCbG9jayIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0Y29tcGlsZUNvbnN0YW50LFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0aXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdGlzQ29uc3RhbnQsXG5cdGlzUGF0aEluTW9kZWxFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nSW5mb0hvbGRlciwgTm9uQWJzdHJhY3RDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIEpTWENvbnRleHQsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgRFRfREVTSUdOVElNRSA9IFwiZHQ6ZGVzaWdudGltZVwiO1xuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKHN0cmluZyB8IFVJNUVsZW1lbnQpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ/OiBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdXG4pOiB2b2lkIHtcblx0aWYgKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmICghYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gW107XG5cdH1cblx0aWYgKGlzQ2hpbGRBbkVsZW1lbnQoY2hpbGQpKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLnB1c2goY2hpbGQpO1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG5cdFx0Y2hpbGQuZm9yRWFjaCgoc3ViQ2hpbGQpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgYWdncmVnYXRpb25OYW1lLCBzdWJDaGlsZCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBjaGlsZDtcblx0fSBlbHNlIHtcblx0XHRPYmplY3Qua2V5cyhjaGlsZCkuZm9yRWFjaCgoY2hpbGRLZXkpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgY2hpbGRLZXksIGNoaWxkW2NoaWxkS2V5XSk7XG5cdFx0fSk7XG5cdH1cbn07XG5jb25zdCBpc0NoaWxkQW5FbGVtZW50ID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdW5rbm93bik6IGNoaWxkcmVuIGlzIEVsZW1lbnQge1xuXHRyZXR1cm4gKGNoaWxkcmVuIGFzIEVsZW1lbnQpPy5pc0E/LihcInNhcC51aS5jb3JlLkVsZW1lbnRcIik7XG59O1xuY29uc3QgaXNBQ29udHJvbCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHR5cGVvZiBDb250cm9sIHwgRnVuY3Rpb24pOiBjaGlsZHJlbiBpcyBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgbWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0Y29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKHN0cmluZyB8IFVJNUVsZW1lbnQpW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIHN0cmluZyB8IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10pO1xuXHRkZWxldGUgbVNldHRpbmdzLmNoaWxkcmVuO1xuXHQvLyBmaW5kIG91dCB3aGljaCBhZ2dyZWdhdGlvbiBhcmUgYm91bmQgKGJvdGggaW4gY2hpbGRyZW4gYW5kIGRpcmVjdGx5IHVuZGVyIGl0KVxuXHRPYmplY3Qua2V5cyhtZXRhZGF0YUFnZ3JlZ2F0aW9ucykuZm9yRWFjaCgoYWdncmVnYXRpb25OYW1lKSA9PiB7XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyBmYWN0b3J5OiBGdW5jdGlvbiB9KS5mYWN0b3J5ID0gYWdncmVnYXRpb25DaGlsZHJlbltcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uTmFtZVxuXHRcdFx0XHRcdF0gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyB0ZW1wbGF0ZTogc3RyaW5nIHwgVUk1RWxlbWVudCB9KS50ZW1wbGF0ZSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHByb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIGNvbXBpbGUgaXQuXG4gKiBFbHNlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgYXMgc3RyaW5nIChjb21waWxlZCBiaW5kaW5nIGV4cHJlc3Npb24gcmV0dXJucyBzdHJpbmcgYnkgZGVmYXVsdCBldmVuIGlmIGl0J3MgYSBib29sZWFuLCBpbnQsIGV0Yy4pIGFuZCBpdCBkb2Vzbid0IG1hdGNoIHdpdGggZXhwZWN0ZWRcbiAqIGZvcm1hdCB0aGUgdmFsdWUgaXMgcGFyc2VkIHRvIHByb3ZpZGUgZXhwZWN0ZWQgZm9ybWF0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqIEByZXR1cm5zIEEgbWFwIG9mIGxhdGUgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgYXdhaXRlZCBhZnRlciB0aGUgY29udHJvbCBpcyBjcmVhdGVkXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+IHtcblx0bGV0IHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3M7XG5cdGNvbnN0IGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiA9IHt9O1xuXHRjb25zdCBhbGxFdmVudHMgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKTtcblx0Y29uc3QgYWxsUHJvcGVydGllcyA9IG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKTtcblx0Zm9yIChzZXR0aW5nc0tleSBpbiBzZXR0aW5ncykge1xuXHRcdGNvbnN0IHZhbHVlID0gc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+ID0gdmFsdWU7XG5cdFx0XHRpZiAoaXNDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGZhbHNlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbFByb3BlcnRpZXMsIHNldHRpbmdzS2V5KSkge1xuXHRcdFx0XHQvLyBBZ2dyZWdhdGlvbiBjYXNlIC0gd2UgbmVlZCB0byBjb21waWxlIHRoZSBleHByZXNzaW9uIGJ1dCBhcyBhbiBvYmplY3Rcblx0XHRcdFx0aWYgKGlzUGF0aEluTW9kZWxFeHByZXNzaW9uKGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSB7IHBhdGg6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5wYXRoLCBtb2RlbDogYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLm1vZGVsTmFtZSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+KS50aGVuKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tzZXR0aW5nc0tleV0gPSB2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+O1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZSA9IChhbGxQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSBhcyB7IGdldFR5cGU/OiBGdW5jdGlvbiB9KT8uZ2V0VHlwZT8uKCk7XG5cdFx0XHRpZiAocHJvcGVydHlUeXBlICYmIHByb3BlcnR5VHlwZSBpbnN0YW5jZW9mIERhdGFUeXBlICYmIFtcImJvb2xlYW5cIiwgXCJpbnRcIiwgXCJmbG9hdFwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUuZ2V0TmFtZSgpKSkge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBwcm9wZXJ0eVR5cGUucGFyc2VWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyPHVua25vd24+KS5fX2JpbmRpbmdJbmZvKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSAodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm87XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYWxsRXZlbnRzLCBzZXR0aW5nc0tleSkpIHtcblx0XHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGxhdGVQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCBzZXQgb24gdGhlIGNvbnRyb2wgdmlhIHRoZSBpbnRyaW5zaWMgY2xhc3MgYXR0cmlidXRlIFwianN4OmNvbW1hbmRcIi5cbiAqIElmIG5vIGNvbW1hbmQgaGFzIGJlZW4gc2V0IG9yIHRoZSB0YXJnZXRlZCBldmVudCBkb2Vzbid0IGV4aXN0LCBubyBjb25maWd1cmF0aW9uIGlzIHNldC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKClbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBFdmVudEhhbmRsZXJSZXNvbHZlci5yZXNvbHZlRXZlbnRIYW5kbGVyKGNvbW1hbmQpO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuY29uc3QganN4Q29udHJvbCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgRWxlbWVudD4oXG5cdENvbnRyb2xUeXBlOiBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHwgRnVuY3Rpb24sXG5cdHNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHtcblx0XHRrZXk6IHN0cmluZztcblx0XHRjaGlsZHJlbj86IEVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPjtcblx0XHRyZWY/OiBSZWY8VD47XG5cdFx0YmluZGluZz86IHN0cmluZztcblx0XHRjbGFzcz86IHN0cmluZztcblx0XHRbRkxfREVMRUdBVEVdPzogc3RyaW5nO1xuXHRcdFtEVF9ERVNJR05USU1FXT86IHN0cmluZztcblx0fSxcblx0a2V5OiBzdHJpbmcsXG5cdGpzeENvbnRleHQ6IEpTWENvbnRleHRcbik6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQge1xuXHRsZXQgdGFyZ2V0Q29udHJvbDogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoKENvbnRyb2xUeXBlIGFzIHsgaXNGcmFnbWVudD86IGJvb2xlYW4gfSk/LmlzRnJhZ21lbnQpIHtcblx0XHR0YXJnZXRDb250cm9sID0gc2V0dGluZ3MuY2hpbGRyZW4gYXMgQ29udHJvbCB8IENvbnRyb2xbXTtcblx0fSBlbHNlIGlmICgoQ29udHJvbFR5cGUgYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk/LmlzUnVudGltZSkge1xuXHRcdGNvbnN0IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrID0gbmV3IChDb250cm9sVHlwZSBhcyB0eXBlb2YgUnVudGltZUJ1aWxkaW5nQmxvY2spKHNldHRpbmdzIGFzIHVua25vd24gYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrLmdldENvbnRlbnQ/Lihqc3hDb250ZXh0LnZpZXchLCBqc3hDb250ZXh0LmFwcENvbXBvbmVudCEpO1xuXHR9IGVsc2UgaWYgKGlzQUNvbnRyb2woQ29udHJvbFR5cGUpKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpO1xuXHRcdGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdFx0fVxuXHRcdGNvbnN0IGxhdGVQcm9wZXJ0aWVzID0gcHJvY2Vzc1Byb3BlcnRpZXMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQ29tbWFuZChtZXRhZGF0YSwgc2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NBZ2dyZWdhdGlvbnMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRjb25zdCBjbGFzc0RlZiA9IHNldHRpbmdzLmNsYXNzO1xuXHRcdGNvbnN0IHJlZkRlZiA9IHNldHRpbmdzLnJlZjtcblx0XHRjb25zdCBiaW5kaW5nRGVmID0gc2V0dGluZ3MuYmluZGluZztcblx0XHRjb25zdCBmbERlbGVnYXRlID0gc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGNvbnN0IGR0RGVzaWdudGltZSA9IHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5yZWY7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLmNsYXNzO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5iaW5kaW5nO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tGTF9ERUxFR0FURV07XG5cdFx0ZGVsZXRlIHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGNvbnN0IHRhcmdldENvbnRyb2xJbnN0YW5jZSA9IG5ldyBDb250cm9sVHlwZShzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHRpZiAoY2xhc3NEZWYpIHtcblx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5hZGRTdHlsZUNsYXNzKGNsYXNzRGVmKTtcblx0XHR9XG5cdFx0aWYgKHJlZkRlZikge1xuXHRcdFx0cmVmRGVmLnNldEN1cnJlbnQodGFyZ2V0Q29udHJvbEluc3RhbmNlIGFzIHVua25vd24gYXMgVCk7XG5cdFx0fVxuXHRcdGNvbnN0IGN1c3RvbVNldHRpbmdzID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlLmRhdGEoXCJzYXAtdWktY3VzdG9tLXNldHRpbmdzXCIpID8/IHt9O1xuXHRcdGlmIChmbERlbGVnYXRlKSB7XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5mbFwiXSA/Pz0ge307XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5mbFwiXS5kZWxlZ2F0ZSA9IGZsRGVsZWdhdGU7XG5cdFx0fVxuXHRcdGlmIChkdERlc2lnbnRpbWUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmR0XCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmR0XCJdLmRlc2lnbnRpbWUgPSBkdERlc2lnbnRpbWU7XG5cdFx0fVxuXHRcdGlmIChPYmplY3Qua2V5cyhjdXN0b21TZXR0aW5ncykubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmRhdGEoXCJzYXAtdWktY3VzdG9tLXNldHRpbmdzXCIsIGN1c3RvbVNldHRpbmdzKTtcblx0XHR9XG5cblx0XHRpZiAoYmluZGluZ0RlZikge1xuXHRcdFx0aWYgKHR5cGVvZiBiaW5kaW5nRGVmID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdJbmZvID0gYmluZGluZ1BhcnNlcihiaW5kaW5nRGVmKTtcblx0XHRcdFx0aWYgKGJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdJbmZvLm1vZGVsID8/IHVuZGVmaW5lZCwgcGF0aDogYmluZGluZ0luZm8ucGF0aCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoYmluZGluZ0RlZik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBjb25zaWRlciBpdCdzIGFuIG9iamVjdFxuXHRcdFx0XHRPYmplY3Qua2V5cyhiaW5kaW5nRGVmKS5mb3JFYWNoKChiaW5kaW5nRGVmS2V5KSA9PiB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdEZWZLZXksIHBhdGg6IGJpbmRpbmdEZWZbYmluZGluZ0RlZktleV0gfSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGxhdGVQcm9wZXJ0aWVzS2V5IGluIGxhdGVQcm9wZXJ0aWVzKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tsYXRlUHJvcGVydGllc0tleV1cblx0XHRcdFx0LnRoZW4oKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRhcmdldENvbnRyb2xJbnN0YW5jZS5zZXRQcm9wZXJ0eShsYXRlUHJvcGVydGllc0tleSwgdmFsdWUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDb3VsZG4ndCBzZXQgcHJvcGVydHkgJHtsYXRlUHJvcGVydGllc0tleX0gb24gJHtDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gLCBlcnJvciwgXCJqc3hDb250cm9sXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHRhcmdldENvbnRyb2xJbnN0YW5jZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgQ29udHJvbFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGNvbnN0IGNvbnRyb2xUeXBlRm4gPSBDb250cm9sVHlwZTtcblx0XHR0YXJnZXRDb250cm9sID0gY29udHJvbFR5cGVGbihzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRDb250cm9sID0gbmV3IFRleHQoeyB0ZXh0OiBcIk1pc3NpbmcgY29tcG9uZW50IFwiICsgKENvbnRyb2xUeXBlIGFzIHN0cmluZykgfSk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGpzeENvbnRyb2w7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7RUFzQkEsTUFBTUEsV0FBVyxHQUFHLGFBQWE7RUFDakMsTUFBTUMsYUFBYSxHQUFHLGVBQWU7RUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0JDLG1CQUE0RCxFQUM1REMsZUFBdUIsRUFDdkJDLEtBQTBDLEVBQ25DO0lBQ1AsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLQyxTQUFTLElBQUksT0FBT0QsS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUN2RTtJQUNEO0lBQ0EsSUFBSSxDQUFDRixtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEVBQUU7TUFDMUNELG1CQUFtQixDQUFDQyxlQUFlLENBQUMsR0FBRyxFQUFFO0lBQzFDO0lBQ0EsSUFBSUcsZ0JBQWdCLENBQUNGLEtBQUssQ0FBQyxFQUFFO01BQzVCRixtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLENBQUNJLElBQUksQ0FBQ0gsS0FBSyxDQUFDO0lBQ2pELENBQUMsTUFBTSxJQUFJSSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0wsS0FBSyxDQUFDLEVBQUU7TUFDaENBLEtBQUssQ0FBQ00sT0FBTyxDQUFFQyxRQUFRLElBQUs7UUFDM0JWLG1CQUFtQixDQUFDQyxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFUSxRQUFRLENBQUM7TUFDcEUsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNLElBQUksT0FBT1AsS0FBSyxLQUFLLFVBQVUsRUFBRTtNQUN2Q0YsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxHQUFHQyxLQUFLO0lBQzdDLENBQUMsTUFBTTtNQUNOUSxNQUFNLENBQUNDLElBQUksQ0FBQ1QsS0FBSyxDQUFDLENBQUNNLE9BQU8sQ0FBRUksUUFBUSxJQUFLO1FBQ3hD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
@@ -1,6 +1,12 @@
1
1
  import Log from "sap/base/Log";
2
2
  import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
3
- import { compileConstant, compileExpression, isBindingToolkitExpression, isConstant } from "sap/fe/base/BindingToolkit";
3
+ import {
4
+ compileConstant,
5
+ compileExpression,
6
+ isBindingToolkitExpression,
7
+ isConstant,
8
+ isPathInModelExpression
9
+ } from "sap/fe/base/BindingToolkit";
4
10
  import type { BindingInfoHolder, NonAbstractClass } from "sap/fe/base/ClassSupport";
5
11
  import type { ControlProperties, JSXContext, NonControlProperties, Ref } from "sap/fe/base/jsx-runtime/jsx";
6
12
  import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
@@ -90,12 +96,19 @@ function processAggregations(metadata: ManagedObjectMetadata, mSettings: Record<
90
96
  function processProperties(metadata: ManagedObjectMetadata, settings: Record<string, unknown>): Record<string, Promise<unknown>> {
91
97
  let settingsKey: keyof typeof settings;
92
98
  const lateProperties: Record<string, Promise<unknown>> = {};
99
+ const allEvents = metadata.getAllEvents();
100
+ const allProperties = metadata.getAllProperties();
93
101
  for (settingsKey in settings) {
94
102
  const value = settings[settingsKey];
95
103
  if (isBindingToolkitExpression(value)) {
96
104
  const bindingToolkitExpression: BindingToolkitExpression<unknown> = value;
97
105
  if (isConstant(bindingToolkitExpression)) {
98
106
  settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
107
+ } else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
108
+ // Aggregation case - we need to compile the expression but as an object
109
+ if (isPathInModelExpression(bindingToolkitExpression)) {
110
+ settings[settingsKey] = { path: bindingToolkitExpression.path, model: bindingToolkitExpression.modelName };
111
+ }
99
112
  } else {
100
113
  settings[settingsKey] = compileExpression(bindingToolkitExpression);
101
114
  }
@@ -103,12 +116,16 @@ function processProperties(metadata: ManagedObjectMetadata, settings: Record<str
103
116
  lateProperties[settingsKey] = value as Promise<unknown>;
104
117
  delete settings[settingsKey];
105
118
  } else if (typeof value === "string" && !value.startsWith("{")) {
106
- const propertyType = (metadata.getAllProperties()[settingsKey] as { getType?: Function })?.getType?.();
119
+ const propertyType = (allProperties[settingsKey] as { getType?: Function })?.getType?.();
107
120
  if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
108
121
  settings[settingsKey] = propertyType.parseValue(value);
109
122
  }
110
- } else if (typeof value === "object" && (value as BindingInfoHolder).__bindingInfo) {
111
- settings[settingsKey] = (value as BindingInfoHolder).__bindingInfo;
123
+ } else if (typeof value === "object" && (value as BindingInfoHolder<unknown>).__bindingInfo) {
124
+ settings[settingsKey] = (value as BindingInfoHolder<unknown>).__bindingInfo;
125
+ } else if (value === undefined) {
126
+ if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
127
+ delete settings[settingsKey];
128
+ }
112
129
  }
113
130
  }
114
131
  return lateProperties;
@@ -160,6 +177,7 @@ const jsxControl = function <T extends Element>(
160
177
  if (key !== undefined) {
161
178
  settings["key"] = key;
162
179
  }
180
+ const lateProperties = processProperties(metadata, settings);
163
181
  processCommand(metadata, settings);
164
182
  processAggregations(metadata, settings);
165
183
  const classDef = settings.class;
@@ -172,7 +190,6 @@ const jsxControl = function <T extends Element>(
172
190
  delete settings.binding;
173
191
  delete settings[FL_DELEGATE];
174
192
  delete settings[DT_DESIGNTIME];
175
- const lateProperties = processProperties(metadata, settings);
176
193
  const targetControlInstance = new ControlType(settings as $ControlSettings);
177
194
  if (classDef) {
178
195
  targetControlInstance.addStyleClass(classDef);
@@ -14,10 +14,15 @@ sap.ui.define([], function () {
14
14
  renderManager.openStart(type);
15
15
  }
16
16
  for (const mSetting in mSettings) {
17
- if (mSetting !== "children" && mSetting !== "ref") {
17
+ if (mSetting !== "children" && mSetting !== "ref" && mSetting !== "class") {
18
18
  renderManager.attr(mSetting, mSettings[mSetting]);
19
19
  }
20
20
  }
21
+ if (mSettings.class) {
22
+ mSettings.class.split(" ").forEach(className => {
23
+ renderManager.class(className);
24
+ });
25
+ }
21
26
  renderManager.openEnd();
22
27
  }
23
28
  const children = mSettings.children;
@@ -45,4 +50,4 @@ sap.ui.define([], function () {
45
50
  };
46
51
  return jsxRenderManager;
47
52
  }, false);
48
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqc3hSZW5kZXJNYW5hZ2VyIiwidHlwZSIsIm1TZXR0aW5ncyIsImtleSIsInJlbmRlck1hbmFnZXIiLCJyZWYiLCJvcGVuU3RhcnQiLCJtU2V0dGluZyIsImF0dHIiLCJvcGVuRW5kIiwiY2hpbGRyZW4iLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiY2hpbGQiLCJ0ZXh0IiwidG9TdHJpbmciLCJ1bmRlZmluZWQiLCJyZW5kZXJDb250cm9sIiwiY2xvc2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImpzeC1yZW5kZXJNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFJlbmRlck1hbmFnZXIgZnJvbSBcInNhcC91aS9jb3JlL1JlbmRlck1hbmFnZXJcIjtcblxuY29uc3QganN4UmVuZGVyTWFuYWdlciA9IGZ1bmN0aW9uIChcblx0dHlwZTogc3RyaW5nIHwgRnVuY3Rpb24sXG5cdG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0a2V5OiBzdHJpbmcsXG5cdHJlbmRlck1hbmFnZXI6IFJlbmRlck1hbmFnZXJcbik6IEZ1bmN0aW9uIHtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGlmIChtU2V0dGluZ3MucmVmKSB7XG5cdFx0XHRcdHJlbmRlck1hbmFnZXIub3BlblN0YXJ0KHR5cGUsIG1TZXR0aW5ncy5yZWYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVuZGVyTWFuYWdlci5vcGVuU3RhcnQodHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG1TZXR0aW5nIGluIG1TZXR0aW5ncykge1xuXHRcdFx0XHRpZiAobVNldHRpbmcgIT09IFwiY2hpbGRyZW5cIiAmJiBtU2V0dGluZyAhPT0gXCJyZWZcIikge1xuXHRcdFx0XHRcdHJlbmRlck1hbmFnZXIuYXR0cihtU2V0dGluZywgbVNldHRpbmdzW21TZXR0aW5nXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJlbmRlck1hbmFnZXIub3BlbkVuZCgpO1xuXHRcdH1cblx0XHRjb25zdCBjaGlsZHJlbiA9IG1TZXR0aW5ncy5jaGlsZHJlbiBhcyAoc3RyaW5nIHwgRnVuY3Rpb24gfCBDb250cm9sKSB8IChzdHJpbmcgfCBGdW5jdGlvbiB8IENvbnRyb2wpW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0XHRjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY2hpbGQgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdFx0cmVuZGVyTWFuYWdlci50ZXh0KGNoaWxkLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0Y2hpbGQoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVuZGVyTWFuYWdlci5yZW5kZXJDb250cm9sKGNoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNoaWxkcmVuID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdHJlbmRlck1hbmFnZXIudGV4dChjaGlsZHJlbi50b1N0cmluZygpKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRjaGlsZHJlbigpO1xuXHRcdH0gZWxzZSBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVuZGVyTWFuYWdlci5yZW5kZXJDb250cm9sKGNoaWxkcmVuKTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJlbmRlck1hbmFnZXIuY2xvc2UodHlwZSk7XG5cdFx0fVxuXHR9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGpzeFJlbmRlck1hbmFnZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7RUFHQSxNQUFNQSxnQkFBZ0IsR0FBRyxTQUFBQSxDQUN4QkMsSUFBdUIsRUFDdkJDLFNBQWlDLEVBQ2pDQyxHQUFXLEVBQ1hDLGFBQTRCLEVBQ2pCO0lBQ1gsT0FBTyxNQUFNO01BQ1osSUFBSSxPQUFPSCxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzdCLElBQUlDLFNBQVMsQ0FBQ0csR0FBRyxFQUFFO1VBQ2xCRCxhQUFhLENBQUNFLFNBQVMsQ0FBQ0wsSUFBSSxFQUFFQyxTQUFTLENBQUNHLEdBQUcsQ0FBQztRQUM3QyxDQUFDLE1BQU07VUFDTkQsYUFBYSxDQUFDRSxTQUFTLENBQUNMLElBQUksQ0FBQztRQUM5QjtRQUNBLEtBQUssTUFBTU0sUUFBUSxJQUFJTCxTQUFTLEVBQUU7VUFDakMsSUFBSUssUUFBUSxLQUFLLFVBQVUsSUFBSUEsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUNsREgsYUFBYSxDQUFDSSxJQUFJLENBQUNELFFBQVEsRUFBRUwsU0FBUyxDQUFDSyxRQUFRLENBQUMsQ0FBQztVQUNsRDtRQUNEO1FBQ0FILGFBQWEsQ0FBQ0ssT0FBTyxDQUFDLENBQUM7TUFDeEI7TUFDQSxNQUFNQyxRQUFRLEdBQUdSLFNBQVMsQ0FBQ1EsUUFBMkU7TUFDdEcsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLFFBQVEsQ0FBQyxFQUFFO1FBQzVCQSxRQUFRLENBQUNHLE9BQU8sQ0FBRUMsS0FBSyxJQUFLO1VBQzNCLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU9BLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDekZWLGFBQWEsQ0FBQ1csSUFBSSxDQUFDRCxLQUFLLENBQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUM7VUFDckMsQ0FBQyxNQUFNLElBQUksT0FBT0YsS0FBSyxLQUFLLFVBQVUsRUFBRTtZQUN2Q0EsS0FBSyxDQUFDLENBQUM7VUFDUixDQUFDLE1BQU0sSUFBSUEsS0FBSyxLQUFLRyxTQUFTLEVBQUU7WUFDL0JiLGFBQWEsQ0FBQ2MsYUFBYSxDQUFDSixLQUFLLENBQUM7VUFDbkM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDLE1BQU0sSUFBSSxPQUFPSixRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU9BLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBT0EsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUN6R04sYUFBYSxDQUFDVyxJQUFJLENBQUNMLFFBQVEsQ0FBQ00sUUFBUSxDQUFDLENBQUMsQ0FBQztNQUN4QyxDQUFDLE1BQU0sSUFBSSxPQUFPTixRQUFRLEtBQUssVUFBVSxFQUFFO1FBQzFDQSxRQUFRLENBQUMsQ0FBQztNQUNYLENBQUMsTUFBTSxJQUFJQSxRQUFRLEtBQUtPLFNBQVMsRUFBRTtRQUNsQ2IsYUFBYSxDQUFDYyxhQUFhLENBQUNSLFFBQVEsQ0FBQztNQUN0QztNQUVBLElBQUksT0FBT1QsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QkcsYUFBYSxDQUFDZSxLQUFLLENBQUNsQixJQUFJLENBQUM7TUFDMUI7SUFDRCxDQUFDO0VBQ0YsQ0FBQztFQUFDLE9BQ2FELGdCQUFnQjtBQUFBIiwiaWdub3JlTGlzdCI6W119
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqc3hSZW5kZXJNYW5hZ2VyIiwidHlwZSIsIm1TZXR0aW5ncyIsImtleSIsInJlbmRlck1hbmFnZXIiLCJyZWYiLCJvcGVuU3RhcnQiLCJtU2V0dGluZyIsImF0dHIiLCJjbGFzcyIsInNwbGl0IiwiZm9yRWFjaCIsImNsYXNzTmFtZSIsIm9wZW5FbmQiLCJjaGlsZHJlbiIsIkFycmF5IiwiaXNBcnJheSIsImNoaWxkIiwidGV4dCIsInRvU3RyaW5nIiwidW5kZWZpbmVkIiwicmVuZGVyQ29udHJvbCIsImNsb3NlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtcmVuZGVyTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBSZW5kZXJNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9SZW5kZXJNYW5hZ2VyXCI7XG5cbmNvbnN0IGpzeFJlbmRlck1hbmFnZXIgPSBmdW5jdGlvbiAoXG5cdHR5cGU6IHN0cmluZyB8IEZ1bmN0aW9uLFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdGtleTogc3RyaW5nLFxuXHRyZW5kZXJNYW5hZ2VyOiBSZW5kZXJNYW5hZ2VyXG4pOiBGdW5jdGlvbiB7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLnJlZikge1xuXHRcdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5TdGFydCh0eXBlLCBtU2V0dGluZ3MucmVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlck1hbmFnZXIub3BlblN0YXJ0KHR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBtU2V0dGluZyBpbiBtU2V0dGluZ3MpIHtcblx0XHRcdFx0aWYgKG1TZXR0aW5nICE9PSBcImNoaWxkcmVuXCIgJiYgbVNldHRpbmcgIT09IFwicmVmXCIgJiYgbVNldHRpbmcgIT09IFwiY2xhc3NcIikge1xuXHRcdFx0XHRcdHJlbmRlck1hbmFnZXIuYXR0cihtU2V0dGluZywgbVNldHRpbmdzW21TZXR0aW5nXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChtU2V0dGluZ3MuY2xhc3MpIHtcblx0XHRcdFx0bVNldHRpbmdzLmNsYXNzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLmNsYXNzKGNsYXNzTmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmVuZGVyTWFuYWdlci5vcGVuRW5kKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkcmVuID0gbVNldHRpbmdzLmNoaWxkcmVuIGFzIChzdHJpbmcgfCBGdW5jdGlvbiB8IENvbnRyb2wpIHwgKHN0cmluZyB8IEZ1bmN0aW9uIHwgQ29udHJvbClbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRcdGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNoaWxkID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLnRleHQoY2hpbGQudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjaGlsZCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNoaWxkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLnJlbmRlckNvbnRyb2woY2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY2hpbGRyZW4gPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNoaWxkcmVuID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci50ZXh0KGNoaWxkcmVuLnRvU3RyaW5nKCkpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdGNoaWxkcmVuKCk7XG5cdFx0fSBlbHNlIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLnJlbmRlckNvbnRyb2woY2hpbGRyZW4pO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci5jbG9zZSh0eXBlKTtcblx0XHR9XG5cdH07XG59O1xuZXhwb3J0IGRlZmF1bHQganN4UmVuZGVyTWFuYWdlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQUdBLE1BQU1BLGdCQUFnQixHQUFHLFNBQUFBLENBQ3hCQyxJQUF1QixFQUN2QkMsU0FBaUMsRUFDakNDLEdBQVcsRUFDWEMsYUFBNEIsRUFDakI7SUFDWCxPQUFPLE1BQU07TUFDWixJQUFJLE9BQU9ILElBQUksS0FBSyxRQUFRLEVBQUU7UUFDN0IsSUFBSUMsU0FBUyxDQUFDRyxHQUFHLEVBQUU7VUFDbEJELGFBQWEsQ0FBQ0UsU0FBUyxDQUFDTCxJQUFJLEVBQUVDLFNBQVMsQ0FBQ0csR0FBRyxDQUFDO1FBQzdDLENBQUMsTUFBTTtVQUNORCxhQUFhLENBQUNFLFNBQVMsQ0FBQ0wsSUFBSSxDQUFDO1FBQzlCO1FBQ0EsS0FBSyxNQUFNTSxRQUFRLElBQUlMLFNBQVMsRUFBRTtVQUNqQyxJQUFJSyxRQUFRLEtBQUssVUFBVSxJQUFJQSxRQUFRLEtBQUssS0FBSyxJQUFJQSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzFFSCxhQUFhLENBQUNJLElBQUksQ0FBQ0QsUUFBUSxFQUFFTCxTQUFTLENBQUNLLFFBQVEsQ0FBQyxDQUFDO1VBQ2xEO1FBQ0Q7UUFDQSxJQUFJTCxTQUFTLENBQUNPLEtBQUssRUFBRTtVQUNwQlAsU0FBUyxDQUFDTyxLQUFLLENBQUNDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsT0FBTyxDQUFFQyxTQUFTLElBQUs7WUFDakRSLGFBQWEsQ0FBQ0ssS0FBSyxDQUFDRyxTQUFTLENBQUM7VUFDL0IsQ0FBQyxDQUFDO1FBQ0g7UUFDQVIsYUFBYSxDQUFDUyxPQUFPLENBQUMsQ0FBQztNQUN4QjtNQUNBLE1BQU1DLFFBQVEsR0FBR1osU0FBUyxDQUFDWSxRQUEyRTtNQUN0RyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsUUFBUSxDQUFDLEVBQUU7UUFDNUJBLFFBQVEsQ0FBQ0gsT0FBTyxDQUFFTSxLQUFLLElBQUs7VUFDM0IsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksT0FBT0EsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6RmIsYUFBYSxDQUFDYyxJQUFJLENBQUNELEtBQUssQ0FBQ0UsUUFBUSxDQUFDLENBQUMsQ0FBQztVQUNyQyxDQUFDLE1BQU0sSUFBSSxPQUFPRixLQUFLLEtBQUssVUFBVSxFQUFFO1lBQ3ZDQSxLQUFLLENBQUMsQ0FBQztVQUNSLENBQUMsTUFBTSxJQUFJQSxLQUFLLEtBQUtHLFNBQVMsRUFBRTtZQUMvQmhCLGFBQWEsQ0FBQ2lCLGFBQWEsQ0FBQ0osS0FBSyxDQUFDO1VBQ25DO1FBQ0QsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxNQUFNLElBQUksT0FBT0gsUUFBUSxLQUFLLFFBQVEsSUFBSSxPQUFPQSxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU9BLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDekdWLGFBQWEsQ0FBQ2MsSUFBSSxDQUFDSixRQUFRLENBQUNLLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDeEMsQ0FBQyxNQUFNLElBQUksT0FBT0wsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUMxQ0EsUUFBUSxDQUFDLENBQUM7TUFDWCxDQUFDLE1BQU0sSUFBSUEsUUFBUSxLQUFLTSxTQUFTLEVBQUU7UUFDbENoQixhQUFhLENBQUNpQixhQUFhLENBQUNQLFFBQVEsQ0FBQztNQUN0QztNQUVBLElBQUksT0FBT2IsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QkcsYUFBYSxDQUFDa0IsS0FBSyxDQUFDckIsSUFBSSxDQUFDO01BQzFCO0lBQ0QsQ0FBQztFQUNGLENBQUM7RUFBQyxPQUNhRCxnQkFBZ0I7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==